Mercurial > pidgin.yaz
diff plugins/docklet/MinimizeToTray.c @ 11709:cae2fb7e8594
[gaim-migrate @ 14000]
This is a patch from Casey Harkins to significantly overhaul the docklet plugin. I'm pretty happy about this because it enables us to remove a win32 GTK+ dependency on the core and all the prpls.
committer: Tailor Script <tailor@pidgin.im>
author | Daniel Atallah <daniel.atallah@gmail.com> |
---|---|
date | Sat, 22 Oct 2005 01:18:08 +0000 |
parents | |
children | 9beb663a6fb5 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/plugins/docklet/MinimizeToTray.c Sat Oct 22 01:18:08 2005 +0000 @@ -0,0 +1,135 @@ +/* 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> + */ +#include "stdafx.h" + +#ifndef IDANI_OPEN +#define IDANI_OPEN 1 +#endif +#ifndef IDANI_CLOSE +#define IDANI_CLOSE 2 +#endif +#ifndef IDANI_CAPTION +#define IDANI_CAPTION 3 +#endif + +#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 int 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); +} + + +