comparison pidgin/win32/MinimizeToTray.c @ 15374:5fe8042783c1

Rename gtk/ and libgaim/ to pidgin/ and libpurple/
author Sean Egan <seanegan@gmail.com>
date Sat, 20 Jan 2007 02:32:10 +0000
parents
children
comparison
equal deleted inserted replaced
15373:f79e0f4df793 15374:5fe8042783c1
1 /* MinimizeToTray
2 *
3 * A couple of routines to show how to make it produce a custom caption
4 * animation to make it look like we are minimizing to and maximizing
5 * from the system tray
6 *
7 * These routines are public domain, but it would be nice if you dropped
8 * me a line if you use them!
9 *
10 * 1.0 29.06.2000 Initial version
11 * 1.1 01.07.2000 The window retains it's place in the Z-order of windows
12 * when minimized/hidden. This means that when restored/shown, it doesn't
13 * always appear as the foreground window unless we call SetForegroundWindow
14 *
15 * Copyright 2000 Matthew Ellis <m.t.ellis@bigfoot.com>
16 */
17 #define _WIN32_WINNT 0x0500
18 #include <windows.h>
19 #include "MinimizeToTray.h"
20
21 #define DEFAULT_RECT_WIDTH 150
22 #define DEFAULT_RECT_HEIGHT 30
23
24 static void GetTrayWndRect(LPRECT lpTrayRect) {
25 APPBARDATA appBarData;
26 HWND hShellTrayWnd = FindWindowEx(NULL, NULL, TEXT("Shell_TrayWnd"),
27 NULL);
28
29 if(hShellTrayWnd) {
30 HWND hTrayNotifyWnd = FindWindowEx(hShellTrayWnd, NULL,
31 TEXT("TrayNotifyWnd"), NULL);
32
33 if(hTrayNotifyWnd) {
34 GetWindowRect(hTrayNotifyWnd,lpTrayRect);
35 return;
36 }
37 }
38
39 appBarData.cbSize = sizeof(appBarData);
40 if(SHAppBarMessage(ABM_GETTASKBARPOS, &appBarData)) {
41 switch(appBarData.uEdge) {
42 case ABE_LEFT:
43 case ABE_RIGHT:
44 lpTrayRect->top = appBarData.rc.bottom - 100;
45 lpTrayRect->bottom = appBarData.rc.bottom - 16;
46 lpTrayRect->left = appBarData.rc.left;
47 lpTrayRect->right = appBarData.rc.right;
48 break;
49 case ABE_TOP:
50 case ABE_BOTTOM:
51 lpTrayRect->top = appBarData.rc.top;
52 lpTrayRect->bottom = appBarData.rc.bottom;
53 lpTrayRect->left = appBarData.rc.right - 100;
54 lpTrayRect->right = appBarData.rc.right - 16;
55 break;
56 }
57 return;
58 }
59
60 hShellTrayWnd = FindWindowEx(NULL, NULL, TEXT("Shell_TrayWnd"), NULL);
61 if(hShellTrayWnd) {
62 GetWindowRect(hShellTrayWnd, lpTrayRect);
63 if(lpTrayRect->right-lpTrayRect->left > DEFAULT_RECT_WIDTH)
64 lpTrayRect->left = lpTrayRect->right - DEFAULT_RECT_WIDTH;
65 if(lpTrayRect->bottom-lpTrayRect->top > DEFAULT_RECT_HEIGHT)
66 lpTrayRect->top=lpTrayRect->bottom - DEFAULT_RECT_HEIGHT;
67
68 return;
69 }
70
71 SystemParametersInfo(SPI_GETWORKAREA, 0, lpTrayRect, 0);
72 lpTrayRect->left = lpTrayRect->right - DEFAULT_RECT_WIDTH;
73 lpTrayRect->top = lpTrayRect->bottom - DEFAULT_RECT_HEIGHT;
74 }
75
76 static BOOL GetDoAnimateMinimize(void) {
77 ANIMATIONINFO ai;
78
79 ai.cbSize = sizeof(ai);
80 SystemParametersInfo(SPI_GETANIMATION, sizeof(ai), &ai, 0);
81
82 return ai.iMinAnimate ? TRUE : FALSE;
83 }
84
85 void MinimizeWndToTray(HWND hWnd) {
86
87 if(!IsWindowVisible(hWnd))
88 return;
89
90 if(GetDoAnimateMinimize()) {
91 RECT rcFrom, rcTo;
92
93 GetWindowRect(hWnd, &rcFrom);
94 GetTrayWndRect(&rcTo);
95
96 DrawAnimatedRects(hWnd, IDANI_CAPTION, &rcFrom, &rcTo);
97 }
98
99 ShowWindow(hWnd, SW_HIDE);
100 }
101
102 void RestoreWndFromTray(HWND hWnd) {
103
104 if(IsWindowVisible(hWnd))
105 return;
106
107 if(GetDoAnimateMinimize()) {
108 RECT rcFrom, rcTo;
109 GetTrayWndRect(&rcFrom);
110 GetWindowRect(hWnd, &rcTo);
111
112 DrawAnimatedRects(hWnd, IDANI_CAPTION, &rcFrom, &rcTo);
113 }
114
115 ShowWindow(hWnd, SW_SHOW);
116 SetActiveWindow(hWnd);
117 SetForegroundWindow(hWnd);
118 }
119