comparison plugins/win32/winprefs/gtkappbar.c @ 10550:522cd02f235f

[gaim-migrate @ 11924] This should fix the annoying problem of the docked buddy list stealing screen real estate when it is hidden. Turns out it was actually using the section of the screen, you just couldn't see it. I think this is the last of the bugs that I introduced into the docking stuff. committer: Tailor Script <tailor@pidgin.im>
author Daniel Atallah <daniel.atallah@gmail.com>
date Fri, 28 Jan 2005 05:01:24 +0000
parents f348b3439ce4
children 12f6164ee2c6
comparison
equal deleted inserted replaced
10549:8bc7ba019e96 10550:522cd02f235f
152 static void print_rect(RECT *rc) { 152 static void print_rect(RECT *rc) {
153 gaim_debug(GAIM_DEBUG_INFO, "gtkappbar", "RECT: L:%ld R:%ld T:%ld B:%ld\n", 153 gaim_debug(GAIM_DEBUG_INFO, "gtkappbar", "RECT: L:%ld R:%ld T:%ld B:%ld\n",
154 rc->left, rc->right, rc->top, rc->bottom); 154 rc->left, rc->right, rc->top, rc->bottom);
155 } 155 }
156 #endif 156 #endif
157 /** Set the window style to be the "Tool Window" style - small header, no min/max buttons */
157 static void set_toolbar(HWND hwnd, gboolean val) { 158 static void set_toolbar(HWND hwnd, gboolean val) {
158 LONG style=0; 159 LONG style=0;
159 160
160 style = GetWindowLong(hwnd, GWL_EXSTYLE); 161 style = GetWindowLong(hwnd, GWL_EXSTYLE);
161 if(val && !(style & WS_EX_TOOLWINDOW)) 162 if(val && !(style & WS_EX_TOOLWINDOW))
171 /* This really should be the following, but SWP_FRAMECHANGED strangely causes initermittent problems "Show Desktop" done more than once. 172 /* This really should be the following, but SWP_FRAMECHANGED strangely causes initermittent problems "Show Desktop" done more than once.
172 * Not having SWP_FRAMECHANGED *should* cause the Style not to be applied, but i haven't noticed any problems 173 * Not having SWP_FRAMECHANGED *should* cause the Style not to be applied, but i haven't noticed any problems
173 * SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED); 174 * SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED);
174 */ 175 */
175 } 176 }
176 177 /** Register the window as an appbar */
177 static gboolean gtk_appbar_register(GtkAppBar *ab, HWND hwnd) { 178 static gboolean gtk_appbar_register(GtkAppBar *ab, HWND hwnd) {
178 APPBARDATA abd; 179 APPBARDATA abd;
179 180
180 abd.cbSize = sizeof(APPBARDATA); 181 abd.cbSize = sizeof(APPBARDATA);
181 abd.hWnd = hwnd; 182 abd.hWnd = hwnd;
183 184
184 ab->registered = SHAppBarMessage(ABM_NEW, &abd); 185 ab->registered = SHAppBarMessage(ABM_NEW, &abd);
185 186
186 return ab->registered; 187 return ab->registered;
187 } 188 }
188 189 /** Unregister the window as an appbar */
189 static gboolean gtk_appbar_unregister(GtkAppBar *ab, HWND hwnd) { 190 static gboolean gtk_appbar_unregister(GtkAppBar *ab, HWND hwnd) {
190 APPBARDATA abd; 191 APPBARDATA abd;
191 192
192 if(!ab->registered) 193 if(!ab->registered)
193 return TRUE; 194 return TRUE;
194 195
195 abd.cbSize = sizeof(APPBARDATA); 196 abd.cbSize = sizeof(APPBARDATA);
196 abd.hWnd = hwnd; 197 abd.hWnd = hwnd;
197 198
198 ab->registered = !SHAppBarMessage(ABM_REMOVE, &abd); 199 SHAppBarMessage(ABM_REMOVE, &abd); /** This always returns TRUE */
199 200
200 if(!ab->registered) { 201 ab->registered = FALSE;
201 ab->docked = FALSE; 202
202 ab->docking = FALSE; 203 ab->docked = FALSE;
203 } 204 ab->docking = FALSE;
204 return !ab->registered; 205
206 return TRUE;
205 } 207 }
206 208
207 static void gtk_appbar_querypos(GtkAppBar *ab, HWND hwnd, RECT rcWorkspace) { 209 static void gtk_appbar_querypos(GtkAppBar *ab, HWND hwnd, RECT rcWorkspace) {
208 APPBARDATA abd; 210 APPBARDATA abd;
209 guint iWidth = 0; 211 guint iWidth = 0;
246 break; 248 break;
247 } 249 }
248 250
249 CopyRect(&(ab->docked_rect), &abd.rc); 251 CopyRect(&(ab->docked_rect), &abd.rc);
250 } 252 }
251 253 /* Actually set the size and screen location of the appbar */
252 static void gtk_appbar_setpos(GtkAppBar *ab, HWND hwnd) { 254 static void gtk_appbar_setpos(GtkAppBar *ab, HWND hwnd) {
253 APPBARDATA abd; 255 APPBARDATA abd;
254 256
255 if(!ab->registered) 257 if(!ab->registered)
256 gtk_appbar_register(ab, hwnd); 258 gtk_appbar_register(ab, hwnd);
260 CopyRect(&abd.rc, &(ab->docked_rect)); 262 CopyRect(&abd.rc, &(ab->docked_rect));
261 abd.uEdge = ab->side; 263 abd.uEdge = ab->side;
262 264
263 SHAppBarMessage(ABM_SETPOS, &abd); 265 SHAppBarMessage(ABM_SETPOS, &abd);
264 } 266 }
265 267 /** Let any callbacks know that we have docked or undocked */
266 static void gtk_appbar_dispatch_dock_cbs(GtkAppBar *ab, gboolean val) { 268 static void gtk_appbar_dispatch_dock_cbs(GtkAppBar *ab, gboolean val) {
267 GList *lst = ab->dock_cbs; 269 GList *lst = ab->dock_cbs;
268 270
269 while(lst) { 271 while(lst) {
270 GtkAppBarDockCB dock_cb = lst->data; 272 GtkAppBarDockCB dock_cb = lst->data;
339 } 341 }
340 return GDK_FILTER_REMOVE; 342 return GDK_FILTER_REMOVE;
341 } 343 }
342 return GDK_FILTER_CONTINUE; 344 return GDK_FILTER_CONTINUE;
343 } 345 }
344 346 /** Notify the system that the appbar has been activated */
345 static GdkFilterReturn wnd_activate(GdkXEvent *xevent) { 347 static GdkFilterReturn wnd_activate(GtkAppBar *ab, GdkXEvent *xevent) {
346 APPBARDATA abd; 348 if (ab->registered) {
347 MSG *msg = (MSG*)xevent; 349 APPBARDATA abd;
348 gaim_debug(GAIM_DEBUG_INFO, "gtkappbar", "wnd_activate\n"); 350 MSG *msg = (MSG*)xevent;
349 351 gaim_debug(GAIM_DEBUG_INFO, "gtkappbar", "wnd_activate\n");
350 abd.hWnd = msg->hwnd; 352
351 abd.cbSize = sizeof(APPBARDATA); 353 abd.hWnd = msg->hwnd;
352 354 abd.cbSize = sizeof(APPBARDATA);
353 SHAppBarMessage(ABM_ACTIVATE, &abd); 355
356 SHAppBarMessage(ABM_ACTIVATE, &abd);
357 }
354 return GDK_FILTER_CONTINUE; 358 return GDK_FILTER_CONTINUE;
355 } 359 }
356 360 /** Notify the system that the appbar's position has changed */
357 static GdkFilterReturn wnd_poschanged(GdkXEvent *xevent) { 361 static GdkFilterReturn wnd_poschanged(GtkAppBar *ab, GdkXEvent *xevent) {
358 APPBARDATA abd; 362 if (ab->registered) {
359 MSG *msg = (MSG*)xevent; 363 APPBARDATA abd;
360 gaim_debug(GAIM_DEBUG_INFO, "gtkappbar", "wnd_poschanged\n"); 364 MSG *msg = (MSG*)xevent;
361 365 gaim_debug(GAIM_DEBUG_INFO, "gtkappbar", "wnd_poschanged\n");
362 abd.hWnd = msg->hwnd; 366
363 abd.cbSize = sizeof(APPBARDATA); 367 abd.hWnd = msg->hwnd;
364 368 abd.cbSize = sizeof(APPBARDATA);
365 SHAppBarMessage(ABM_WINDOWPOSCHANGED, &abd); 369
370 SHAppBarMessage(ABM_WINDOWPOSCHANGED, &abd);
371 }
366 return GDK_FILTER_CONTINUE; 372 return GDK_FILTER_CONTINUE;
367 } 373 }
368 374 /** The window is about to change */
369 static GdkFilterReturn wnd_poschanging(GtkAppBar *ab, GdkXEvent *xevent) { 375 static GdkFilterReturn wnd_poschanging(GtkAppBar *ab, GdkXEvent *xevent) {
370 MSG *msg = (MSG*)xevent; 376 MSG *msg = (MSG*)xevent;
371 WINDOWPOS *wpos = (WINDOWPOS*)msg->lParam; 377 WINDOWPOS *wpos = (WINDOWPOS*)msg->lParam;
372 378
373 gaim_debug(GAIM_DEBUG_INFO, "gtkappbar", "wnd_poschanging\n"); 379 gaim_debug(GAIM_DEBUG_INFO, "gtkappbar", "wnd_poschanging\n");
385 } 391 }
386 392
387 static GdkFilterReturn wnd_exitsizemove(GtkAppBar *ab, GdkXEvent *xevent) { 393 static GdkFilterReturn wnd_exitsizemove(GtkAppBar *ab, GdkXEvent *xevent) {
388 MSG *msg = (MSG*)xevent; 394 MSG *msg = (MSG*)xevent;
389 395
396 gaim_debug(GAIM_DEBUG_INFO, "gtkappbar", "wnd_exitsizemove\n");
390 if(ab->docking) { 397 if(ab->docking) {
391 gtk_appbar_setpos(ab, msg->hwnd); 398 gtk_appbar_setpos(ab, msg->hwnd);
392 ab->docking = FALSE; 399 ab->docking = FALSE;
393 ab->docked = TRUE; 400 ab->docked = TRUE;
394 gtk_appbar_dispatch_dock_cbs(ab, TRUE); 401 gtk_appbar_dispatch_dock_cbs(ab, TRUE);
404 static GdkFilterReturn wnd_showwindow(GtkAppBar *ab, GdkXEvent *xevent) { 411 static GdkFilterReturn wnd_showwindow(GtkAppBar *ab, GdkXEvent *xevent) {
405 MSG *msg = (MSG*)xevent; 412 MSG *msg = (MSG*)xevent;
406 413
407 gaim_debug(GAIM_DEBUG_INFO, "gtkappbar", "wnd_showwindow\n"); 414 gaim_debug(GAIM_DEBUG_INFO, "gtkappbar", "wnd_showwindow\n");
408 if(msg->wParam && ab->docked) { 415 if(msg->wParam && ab->docked) {
416 ab->iconized = FALSE;
409 gaim_debug(GAIM_DEBUG_INFO, "gtkappbar", "shown\n"); 417 gaim_debug(GAIM_DEBUG_INFO, "gtkappbar", "shown\n");
410 ab->docked = FALSE; 418 ab->docked = FALSE;
411 gtk_appbar_dock(ab, ab->side); 419 gtk_appbar_dock(ab, ab->side);
412
413 } 420 }
414 else if(!msg->wParam && ab->docked) { 421 else if(!msg->wParam && ab->docked) {
415 gaim_debug(GAIM_DEBUG_INFO, "gtkappbar", "hidden\n"); 422 gaim_debug(GAIM_DEBUG_INFO, "gtkappbar", "hidden\n");
416 gtk_appbar_unregister(ab, GDK_WINDOW_HWND(ab->win->window)); 423 gtk_appbar_unregister(ab, GDK_WINDOW_HWND(ab->win->window));
417 set_toolbar(GDK_WINDOW_HWND(ab->win->window), FALSE); 424 set_toolbar(GDK_WINDOW_HWND(ab->win->window), FALSE);
418 ab->docked = TRUE; 425 ab->docked = TRUE;
419 } 426 ab->iconized = TRUE;
420 return GDK_FILTER_CONTINUE; 427 }
421 } 428 return GDK_FILTER_CONTINUE;
422 429 }
430 /** The window's size has changed */
423 static GdkFilterReturn wnd_size(GtkAppBar *ab, GdkXEvent *xevent) { 431 static GdkFilterReturn wnd_size(GtkAppBar *ab, GdkXEvent *xevent) {
424 MSG *msg = (MSG*)xevent; 432 MSG *msg = (MSG*)xevent;
425 433
426 gaim_debug(GAIM_DEBUG_INFO, "gtkappbar", "wnd_size\n"); 434 gaim_debug(GAIM_DEBUG_INFO, "gtkappbar", "wnd_size\n");
427 435
432 ab->docked = TRUE; 440 ab->docked = TRUE;
433 } 441 }
434 } 442 }
435 else if(msg->wParam == SIZE_RESTORED) { 443 else if(msg->wParam == SIZE_RESTORED) {
436 gaim_debug(GAIM_DEBUG_INFO, "gtkappbar", "Restore\n"); 444 gaim_debug(GAIM_DEBUG_INFO, "gtkappbar", "Restore\n");
437 if(ab->docked) { 445 if (!ab->iconized && ab->docked) {
438 gtk_appbar_dock(ab, ab->side); 446 gtk_appbar_dock(ab, ab->side);
439 } 447 }
440 } 448 }
441 return GDK_FILTER_CONTINUE; 449 return GDK_FILTER_CONTINUE;
442 } 450 }
496 gaim_debug(GAIM_DEBUG_INFO, "gtkappbar", "gtk_appbar_callback: ABN_STATECHANGE\n"); 504 gaim_debug(GAIM_DEBUG_INFO, "gtkappbar", "gtk_appbar_callback: ABN_STATECHANGE\n");
497 break; 505 break;
498 506
499 case ABN_FULLSCREENAPP: 507 case ABN_FULLSCREENAPP:
500 gaim_debug(GAIM_DEBUG_INFO, "gtkappbar", "gtk_appbar_callback: ABN_FULLSCREENAPP: %d\n", (BOOL)msg->lParam); 508 gaim_debug(GAIM_DEBUG_INFO, "gtkappbar", "gtk_appbar_callback: ABN_FULLSCREENAPP: %d\n", (BOOL)msg->lParam);
509 if (!ab->iconized && ab->docked) {
501 if ((BOOL)msg->lParam) { 510 if ((BOOL)msg->lParam) {
502 SetWindowPos(msg->hwnd, HWND_BOTTOM, 0, 0, 0, 0, 511 SetWindowPos(msg->hwnd, HWND_BOTTOM, 0, 0, 0, 0,
503 SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE); 512 SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE);
504 } else { 513 } else {
505 SetWindowPos(msg->hwnd, HWND_NOTOPMOST, 0, 0, 0, 0, 514 SetWindowPos(msg->hwnd, HWND_NOTOPMOST, 0, 0, 0, 0,
506 SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE | SWP_FRAMECHANGED); 515 SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE | SWP_FRAMECHANGED);
516 }
507 } 517 }
508 518
509 break; 519 break;
510 520
511 case ABN_POSCHANGED: 521 case ABN_POSCHANGED:
535 case WM_EXITSIZEMOVE: 545 case WM_EXITSIZEMOVE:
536 return wnd_exitsizemove(data, xevent); 546 return wnd_exitsizemove(data, xevent);
537 case WM_WINDOWPOSCHANGING: 547 case WM_WINDOWPOSCHANGING:
538 return wnd_poschanging(data, xevent); 548 return wnd_poschanging(data, xevent);
539 case WM_WINDOWPOSCHANGED: 549 case WM_WINDOWPOSCHANGED:
540 return wnd_poschanged(xevent); 550 return wnd_poschanged(data, xevent);
541 case WM_ACTIVATE: 551 case WM_ACTIVATE:
542 return wnd_activate(xevent); 552 return wnd_activate(data, xevent);
543 case WM_SIZING: 553 case WM_SIZING:
544 return wnd_sizing(data, xevent); 554 return wnd_sizing(data, xevent);
545 case WM_MOVING: 555 case WM_MOVING:
546 return wnd_moving(data, xevent); 556 return wnd_moving(data, xevent);
547 case WM_SHOWWINDOW: 557 case WM_SHOWWINDOW: