rtoss - Blame information for rev 151

Subversion Repositories:
Rev:
Rev Author Line No. Line
149 roytam 1 /*-------------------------------------------
2   taskswitch.c
3     Customize Task Switcher
4     Kazubon 1999
5 ---------------------------------------------*/
6 #include "tcdll.h"
7 #include <commctrl.h>
8  
9 #ifndef TCS_FLATBUTTONS
10 #define TCS_FLATBUTTONS         0x0008
11 #endif
12 #ifndef TCS_HOTTRACK
13 #define TCS_HOTTRACK            0x0040
14 #endif
15  
16 #ifndef TCS_EX_FLATSEPARATORS
17 #define TCS_EX_FLATSEPARATORS   0x0001
18 #endif
19  
20 #ifndef TCM_SETEXTENDEDSTYLE
21 #define TCM_SETEXTENDEDSTYLE    (4916)
22 #define TabCtrl_SetExtendedStyle(hwnd, dw)      \
23 SendMessage((hwnd), TCM_SETEXTENDEDSTYLE, 0, dw)
24 #endif
25  
26 #ifndef TCM_GETEXTENDEDSTYLE
27 #define TCM_GETEXTENDEDSTYLE    (4917)
28 #define TabCtrl_GetExtendedStyle(hwnd)          \
29 SendMessage((hwnd), TCM_GETEXTENDEDSTYLE, 0, 0)
30 #endif
31  
32 #ifndef TCM_SETITEMSIZE
33 #define TCM_SETITEMSIZE         (TCM_FIRST + 41)
34 #endif
35  
36 #ifndef TB_SETBUTTONSIZE
37 #define TB_SETBUTTONSIZE        (WM_USER + 31)
38 #endif
39  
40 #define TB_SETEXTENDEDSTYLE     (WM_USER + 84)  // For TBSTYLE_EX_*
41 #define TB_GETEXTENDEDSTYLE     (WM_USER + 85)  // For TBSTYLE_EX_*
42 #define BTNS_SHOWTEXT   0x0040              // ignored unless TBSTYLE_EX_MIXEDBUTTONS is set
43 #define TBSTYLE_EX_MIXEDBUTTONS             0x00000008
44  
45  
46 extern HANDLE hmod;
47  
48 LRESULT CALLBACK WndProcTab(HWND, UINT, WPARAM, LPARAM);
49 void EndTaskSwitch(void);
50 void EndTaskBarBorder(void);
51 static WNDPROC oldWndProcTab = NULL;
52 static HWND hwndTab = NULL;
53 static HWND hwndBar = NULL;
54 static HWND hwndTabTaskSwitch = NULL;
150 roytam 55 static LONG_PTR oldstyle;
56 static LONG_PTR oldBarStyle;
149 roytam 57 static DWORD oldExstyle;
58 static DWORD oldBarBtnSize = 0;
59 static DWORD oldTBStyle;
60 static BOOL bTaskSwitchFlat = FALSE;
61 static BOOL bTaskSwitchIcons = FALSE;
62 static BOOL bTBBorder = FALSE;
150 roytam 63 static WORD OldTaskWidth;
149 roytam 64  
65 /*--------------------------------------------------
66    initialize
67 ----------------------------------------------------*/
68 void InitTaskSwitch(HWND hwndClock)
69 {
70         HANDLE hwnd, hwndTaskSwitch;
71         char classname[80];
72  
73         EndTaskSwitch();
74  
75         bTaskSwitchFlat = GetMyRegLong(NULL, "TaskSwitchFlat", FALSE);
76         bTaskSwitchIcons = GetMyRegLong(NULL, "TaskSwitchIconsOnly", FALSE);
77  
78         if(!bTaskSwitchFlat && !bTaskSwitchIcons)
79                 return;
80  
81         // get window handle of MSTaskSwWClass
82         hwndTaskSwitch = NULL;
83         hwnd = GetParent(hwndClock);  // TrayNotifyWnd
84         hwnd = GetParent(hwnd);       // Shell_TrayWnd
85         if(hwnd == NULL) return;
86         hwnd = GetWindow(hwnd, GW_CHILD);
87         while(hwnd)
88         {
89                 GetClassName(hwnd, classname, 80);
90                 if(lstrcmpi(classname, "ReBarWindow32") == 0)
91                 {
92                         hwnd = GetWindow(hwnd, GW_CHILD);
93                         while(hwnd)
94                         {
95                                 GetClassName(hwnd, classname, 80);
96                                 if(lstrcmpi(classname, "MSTaskSwWClass") == 0)
97                                 {
98                                         hwndTaskSwitch = hwnd;
99                                         break;
100                                 }
151 roytam 101                                 if(lstrcmpi(classname, "ToolbarWindow32") == 0)
102                                 {
103                                         hwndTaskSwitch = hwnd;
104                                         break;
105                                 }
149 roytam 106                                 hwnd = GetWindow(hwnd, GW_HWNDNEXT);
107                         }
108                 }
109                 else if(lstrcmpi(classname, "MSTaskSwWClass") == 0)
110                 {
111                         hwndTaskSwitch = hwnd;
112                         break;
113                 }
114                 hwnd = GetWindow(hwnd, GW_HWNDNEXT);
115         }
116         if(hwndTaskSwitch == NULL)
117                 return;
118         hwndTab = GetWindow(hwndTaskSwitch, GW_CHILD);
119         if(hwndTab == NULL)
120                 return;
150 roytam 121         oldstyle = GetWindowLongPtr(hwndTab, GWL_STYLE);
149 roytam 122         if (bTaskSwitchFlat)
123         {
124                 if (bWinXP)
125                 {
126                         // WinXPはタブではなくツ[ルバ[
150 roytam 127                         SetWindowLongPtr(hwndTab, GWL_STYLE, oldstyle|TBSTYLE_FLAT);
149 roytam 128                 }
129                 else
130                 {
150 roytam 131                         SetWindowLongPtr(hwndTab, GWL_STYLE, oldstyle|TCS_FLATBUTTONS|TCS_HOTTRACK);
132 //                      SetWindowLongPtr(hwndTab, GWL_STYLE, (oldstyle&(~TCS_BUTTONS))|TCS_BOTTOM|TCS_HOTTRACK);
149 roytam 133                 }
134         }
135         oldExstyle = TabCtrl_GetExtendedStyle(hwndTab);
136         if(GetMyRegLong(NULL, "TaskSwitchSeparators", FALSE))
137         {
138                 TabCtrl_SetExtendedStyle(hwndTab, oldExstyle|TCS_EX_FLATSEPARATORS);
139         }
140         if(bTaskSwitchIcons)
141         {
142                 if(!bWinXP)
143                 {
150 roytam 144                         OldTaskWidth = LOWORD(SendMessage(hwndTab, TCM_SETITEMSIZE, 0, MAKELPARAM(23, 23)));
149 roytam 145                 }else
146                 {
150 roytam 147                         oldTBStyle = (DWORD)SendMessage(hwndTab, TB_GETEXTENDEDSTYLE, 0, 0);
149 roytam 148                         SendMessage(hwndTab, TB_SETEXTENDEDSTYLE, 0, oldTBStyle|TBSTYLE_EX_MIXEDBUTTONS);
149                 }
150         }
151  
150 roytam 152         oldWndProcTab = (WNDPROC)GetWindowLongPtr(hwndTab, GWLP_WNDPROC);
153         SubclassWindow(hwndTab, WndProcTab);
149 roytam 154 }
155  
156 /*--------------------------------------------------
157     undo
158 ----------------------------------------------------*/
159 void EndTaskSwitch(void)
160 {
161         if(hwndTab && IsWindow(hwndTab))
162         {
163 #if ENABLE_CHECK_SUBCLASS_NESTING
150 roytam 164                 if(oldWndProcTab && (WNDPROC)WndProcTab == (WNDPROC)GetWindowLongPtr(hwndTab, GWLP_WNDPROC))
149 roytam 165 #else
166                 if(oldWndProcTab)
167 #endif
150 roytam 168                         SubclassWindow(hwndTab, oldWndProcTab);
149 roytam 169                 oldWndProcTab = NULL;
150 roytam 170                 SetWindowLongPtr(hwndTab, GWL_STYLE, oldstyle);
149 roytam 171                 TabCtrl_SetExtendedStyle(hwndTab, oldExstyle);
172                 if(bTaskSwitchIcons)
173                 {
174                         if(!bWinXP)
175                                 SendMessage(hwndTab, TCM_SETITEMSIZE, 0, MAKELPARAM(OldTaskWidth, 23));
176                         else
177                                 SendMessage(hwndTab, TB_SETEXTENDEDSTYLE, 0, oldTBStyle);
178                 }
179         }
180         hwndTab = NULL;
181 }
182  
183 /*------------------------------------------------
184    subclass procedure of SysTabControl32
185 --------------------------------------------------*/
186 LRESULT CALLBACK WndProcTab(HWND hwnd, UINT message,
187         WPARAM wParam, LPARAM lParam)
188 {
189         switch(message)
190         {
191                 case TCM_SETITEMSIZE:
192                         if(bTaskSwitchIcons)
193                         {
194                                 lParam = MAKELPARAM(23, HIWORD(lParam));
195                         }else
196                         {
197                                 if(LOWORD(lParam)-8 >= 22)
198                                         lParam = MAKELPARAM(LOWORD(lParam)-8, HIWORD(lParam));
199                         }
200                         break;
201                 case TCM_INSERTITEM:
202                         PostMessage(GetParent(hwnd), WM_SIZE, SIZE_RESTORED, 0);
203                         break;
204                 case TCM_DELETEITEM:
205                         PostMessage(GetParent(hwnd), WM_SIZE, SIZE_RESTORED, 0);
206                         break;
207                 case TB_SETBUTTONSIZE:
208                         if(bTaskSwitchIcons)
209                         {
210                                 lParam = MAKELPARAM(23, HIWORD(lParam));
211                         }else
212                         {
213                                 if(LOWORD(lParam)-8 >= 22)
214                                         lParam = MAKELPARAM(LOWORD(lParam)-8, HIWORD(lParam));
215                         }
216                         break;
217                 case TB_INSERTBUTTON:
218                         PostMessage(GetParent(hwnd), WM_SIZE, SIZE_RESTORED, 0);
219                         break;
220                 case TB_DELETEBUTTON:
221                         PostMessage(GetParent(hwnd), WM_SIZE, SIZE_RESTORED, 0);
222                         break;
223         }
224         return CallWindowProc(oldWndProcTab, hwnd, message, wParam, lParam);
225 }
226  
227 /*----------------------------------------------------
228    Taskbar を薄く。
229 ------------------------------------------------------*/
230 void InitTaskBarBorder(HWND hwndClock)
231 {
232         HANDLE hwnd, hwndTaskSwitch;
233         char classname[80];
234         //HWND hwnd;
235         STYLESTRUCT ss;
236  
237         EndTaskBarBorder();
238  
239         if(!GetMyRegLong(NULL, "TaskBarBorder", FALSE))
240                 return;
241         bTBBorder = GetMyRegLong(NULL, "TaskBarBorderEx", FALSE);
242  
243         hwndTaskSwitch = NULL;
244         hwnd = GetParent(hwndClock);  // TrayNotifyWnd
245         hwndBar = GetParent(hwnd);       // Shell_TrayWnd
246         if(hwndBar == NULL) return;
247         hwnd = GetWindow(hwndBar, GW_CHILD);
248         while(hwnd)
249         {
250                 GetClassName(hwnd, classname, 80);
251                 if(lstrcmpi(classname, "ReBarWindow32") == 0)
252                 {
253                         hwnd = GetWindow(hwnd, GW_CHILD);
254                         while(hwnd)
255                         {
256                                 GetClassName(hwnd, classname, 80);
257                                 if(lstrcmpi(classname, "MSTaskSwWClass") == 0)
258                                 {
259                                         hwndTaskSwitch = hwnd;
260                                         break;
261                                 }
262                                 hwnd = GetWindow(hwnd, GW_HWNDNEXT);
263                         }
264                 }
265                 else if(lstrcmpi(classname, "MSTaskSwWClass") == 0)
266                 {
267                         hwndTaskSwitch = hwnd;
268                         break;
269                 }
270                 hwnd = GetWindow(hwnd, GW_HWNDNEXT);
271         }
272         if(hwndTaskSwitch == NULL)
273                 return;
274         hwndTabTaskSwitch = GetWindow(hwndTaskSwitch, GW_CHILD);
275         if(hwndTabTaskSwitch == NULL)
276                 return;
150 roytam 277         oldBarStyle = GetWindowLongPtr(hwndBar, GWL_STYLE);
278         SetWindowLongPtr(hwndBar, GWL_STYLE, oldBarStyle&(~WS_THICKFRAME)&(~WS_BORDER));
149 roytam 279         if(bTBBorder)
280         {
281                 if(oldBarBtnSize == 0)
282                 {
283                         if (bWinXP)
150 roytam 284                                 oldBarBtnSize = (DWORD)SendMessage(hwndTabTaskSwitch, TB_GETPADDING, 0, 0);
149 roytam 285                         else
286                                 oldBarBtnSize = MAKELONG(3,8);
287                 }
288                 if (bWinXP)
289                         SendMessage(hwndTabTaskSwitch, TB_SETPADDING, 0, MAKELPARAM(LOWORD(oldBarBtnSize),0));
290                 else
291                         SendMessage(hwndTabTaskSwitch, TCM_SETPADDING, 0, MAKELPARAM(LOWORD(oldBarBtnSize),0));
292         }
150 roytam 293         ss.styleOld = (DWORD)oldBarStyle;
294         ss.styleNew = (DWORD)oldBarStyle&(~WS_THICKFRAME)&(~WS_BORDER);
149 roytam 295         SendMessage(hwndBar, WM_STYLECHANGED, (WPARAM)(GWL_STYLE|GWL_EXSTYLE), (LPARAM)&ss);
296         SendMessage(hwndBar, WM_SYSCOLORCHANGE, 0, 0);
297         SendMessage(hwndBar, WM_SIZE, SIZE_RESTORED, 0);
298         SetWindowPos(hwndBar, NULL, 0, 0, 0, 0, SWP_DRAWFRAME | SWP_FRAMECHANGED | SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER);
299 }
300  
301 void EndTaskBarBorder(void)
302 {
303         if(hwndTabTaskSwitch && IsWindow(hwndTabTaskSwitch) && oldBarBtnSize && bTBBorder)
304         {
305                 if (bWinXP)
306                         SendMessage(hwndTabTaskSwitch, TB_SETPADDING, 0, MAKELPARAM(LOWORD(oldBarBtnSize),HIWORD(oldBarBtnSize)));
307                 else
308                         SendMessage(hwndTabTaskSwitch, TCM_SETPADDING, 0, MAKELPARAM(LOWORD(oldBarBtnSize),HIWORD(oldBarBtnSize)));
309         }
310         if(hwndBar && IsWindow(hwndBar))
311         {
312                 STYLESTRUCT ss;
150 roytam 313                 SetWindowLongPtr(hwndBar, GWL_STYLE, oldBarStyle);
314                 ss.styleOld = (DWORD)oldBarStyle&(~WS_THICKFRAME)&(~WS_BORDER);
315                 ss.styleNew = (DWORD)oldBarStyle;
149 roytam 316                 SendMessage(hwndBar, WM_STYLECHANGED, (WPARAM)(GWL_STYLE|GWL_EXSTYLE), (LPARAM)&ss);
317                 SendMessage(hwndBar, WM_SYSCOLORCHANGE, 0, 0);
318                 SendMessage(hwndBar, WM_SIZE, SIZE_RESTORED, 0);
319                 SetWindowPos(hwndBar, NULL, 0, 0, 0, 0, SWP_DRAWFRAME | SWP_FRAMECHANGED | SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER);
320         }
321         hwndBar = NULL; hwndTabTaskSwitch = NULL;
322 }