Mercurial > pidgin.yaz
diff gtk/win32/MinimizeToTray.c @ 14681:2c1781ea074c
[gaim-migrate @ 17433]
Depluginize the docklet.
committer: Tailor Script <tailor@pidgin.im>
author | Sean Egan <seanegan@gmail.com> |
---|---|
date | Thu, 05 Oct 2006 23:24:00 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gtk/win32/MinimizeToTray.c Thu Oct 05 23:24:00 2006 +0000 @@ -0,0 +1,119 @@ +/* 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); +} +