plugins/docklet/MinimizeToTray.c

Mon, 12 Dec 2005 20:38:10 +0000

author
Casey Harkins <charkins@pidgin.im>
date
Mon, 12 Dec 2005 20:38:10 +0000
changeset 12472
1a11e00f8c88
parent 11845
7dc7b5b05a9a
child 13433
1baadf9fa403
permissions
-rw-r--r--

[gaim-migrate @ 14782]
SF Patch #1373967 from charkins

"This patch requires #1372898 to be applied first. It
adds two 3-way preferences to the docklet plugin to
determine when the tray icon should blink. One pref is
for unread IM messages, the other for unread chat
messages. The options for each:

im: never, when hidden, always
chat: never, when nick said, always

I've set the defaults to match the 1.x behavior (when
hidden for im, never for chat)."

This patch provided a function used by a previous patch. I undid my (now incorrect) changes there. I modified this to have a limit to the number of tooltips to display. I also tweaked the preference strings a bit. So, blame me if those things are wrong. ;)

committer: Richard Laager <rlaager@pidgin.im>

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

mercurial