Tue, 17 Oct 2006 08:13:41 +0000
[gaim-migrate @ 17495]
This should fix the statusbox issues that were keeping us from releasing beta
4 (and which were just really annoying). Thakn sadrul for most of this, I just
added the if (index == -1) bit. Anyway, the way this works now is that for
saved/popular statuses the primitive underlying that status is where the
dropdown for the statusbox starts. If we don't like that we can change it but
I'm not sure we'll find something better.
Also, this might plug a couple leaks, I'm not really sure but it certainly
looks right.
Up next, the patch to make the docklet use the per-protocol statuses in the
top section.
/* MinimizeToTray * * A couple of routines to show how to make it produce a custom caption * animation to make it look like we are minimizing to and maximizing * from the system tray * * These routines are public domain, but it would be nice if you dropped * me a line if you use them! * * 1.0 29.06.2000 Initial version * 1.1 01.07.2000 The window retains it's place in the Z-order of windows * when minimized/hidden. This means that when restored/shown, it doesn't * always appear as the foreground window unless we call SetForegroundWindow * * Copyright 2000 Matthew Ellis <m.t.ellis@bigfoot.com> */ #define _WIN32_WINNT 0x0500 #include <windows.h> #include "MinimizeToTray.h" #define DEFAULT_RECT_WIDTH 150 #define DEFAULT_RECT_HEIGHT 30 static void GetTrayWndRect(LPRECT lpTrayRect) { APPBARDATA appBarData; HWND hShellTrayWnd = FindWindowEx(NULL, NULL, TEXT("Shell_TrayWnd"), NULL); if(hShellTrayWnd) { HWND hTrayNotifyWnd = FindWindowEx(hShellTrayWnd, NULL, TEXT("TrayNotifyWnd"), NULL); if(hTrayNotifyWnd) { GetWindowRect(hTrayNotifyWnd,lpTrayRect); return; } } appBarData.cbSize = sizeof(appBarData); if(SHAppBarMessage(ABM_GETTASKBARPOS, &appBarData)) { switch(appBarData.uEdge) { case ABE_LEFT: case ABE_RIGHT: lpTrayRect->top = appBarData.rc.bottom - 100; lpTrayRect->bottom = appBarData.rc.bottom - 16; lpTrayRect->left = appBarData.rc.left; lpTrayRect->right = appBarData.rc.right; break; case ABE_TOP: case ABE_BOTTOM: lpTrayRect->top = appBarData.rc.top; lpTrayRect->bottom = appBarData.rc.bottom; lpTrayRect->left = appBarData.rc.right - 100; lpTrayRect->right = appBarData.rc.right - 16; break; } return; } hShellTrayWnd = FindWindowEx(NULL, NULL, TEXT("Shell_TrayWnd"), NULL); if(hShellTrayWnd) { GetWindowRect(hShellTrayWnd, lpTrayRect); if(lpTrayRect->right-lpTrayRect->left > DEFAULT_RECT_WIDTH) lpTrayRect->left = lpTrayRect->right - DEFAULT_RECT_WIDTH; if(lpTrayRect->bottom-lpTrayRect->top > DEFAULT_RECT_HEIGHT) lpTrayRect->top=lpTrayRect->bottom - DEFAULT_RECT_HEIGHT; return; } SystemParametersInfo(SPI_GETWORKAREA, 0, lpTrayRect, 0); lpTrayRect->left = lpTrayRect->right - DEFAULT_RECT_WIDTH; lpTrayRect->top = lpTrayRect->bottom - DEFAULT_RECT_HEIGHT; } static BOOL GetDoAnimateMinimize(void) { ANIMATIONINFO ai; ai.cbSize = sizeof(ai); SystemParametersInfo(SPI_GETANIMATION, sizeof(ai), &ai, 0); return ai.iMinAnimate ? TRUE : FALSE; } void MinimizeWndToTray(HWND hWnd) { if(!IsWindowVisible(hWnd)) return; if(GetDoAnimateMinimize()) { RECT rcFrom, rcTo; GetWindowRect(hWnd, &rcFrom); GetTrayWndRect(&rcTo); DrawAnimatedRects(hWnd, IDANI_CAPTION, &rcFrom, &rcTo); } ShowWindow(hWnd, SW_HIDE); } void RestoreWndFromTray(HWND hWnd) { if(IsWindowVisible(hWnd)) return; if(GetDoAnimateMinimize()) { RECT rcFrom, rcTo; GetTrayWndRect(&rcFrom); GetWindowRect(hWnd, &rcTo); DrawAnimatedRects(hWnd, IDANI_CAPTION, &rcFrom, &rcTo); } ShowWindow(hWnd, SW_SHOW); SetActiveWindow(hWnd); SetForegroundWindow(hWnd); }