| 41 typedef HMONITOR WINAPI purple_MonitorFromWindow(HWND, DWORD); |
41 typedef HMONITOR WINAPI purple_MonitorFromWindow(HWND, DWORD); |
| 42 typedef BOOL WINAPI purple_GetMonitorInfo(HMONITOR, LPMONITORINFO); |
42 typedef BOOL WINAPI purple_GetMonitorInfo(HMONITOR, LPMONITORINFO); |
| 43 |
43 |
| 44 static void gtk_appbar_do_dock(GtkAppBar *ab, UINT side); |
44 static void gtk_appbar_do_dock(GtkAppBar *ab, UINT side); |
| 45 |
45 |
| |
46 static inline HWND |
| |
47 appbar_get_handle(GtkAppBar *ab) |
| |
48 { |
| |
49 return GDK_WINDOW_HWND(gtk_widget_get_window(ab->win)); |
| |
50 } |
| |
51 |
| 46 /* Retrieve the rectangular display area from the specified monitor |
52 /* Retrieve the rectangular display area from the specified monitor |
| 47 * Return TRUE if successful, otherwise FALSE |
53 * Return TRUE if successful, otherwise FALSE |
| 48 */ |
54 */ |
| 49 static gboolean |
55 static gboolean |
| 50 get_rect_from_monitor(HMODULE hmod, HMONITOR monitor, RECT *rect) { |
56 get_rect_from_monitor(HMODULE hmod, HMONITOR monitor, RECT *rect) { |
| 356 static void show_hide(GtkAppBar *ab, gboolean hide) { |
362 static void show_hide(GtkAppBar *ab, gboolean hide) { |
| 357 purple_debug_info("gtkappbar", "show_hide(%d)\n", hide); |
363 purple_debug_info("gtkappbar", "show_hide(%d)\n", hide); |
| 358 |
364 |
| 359 if (hide) { |
365 if (hide) { |
| 360 purple_debug_info("gtkappbar", "hidden\n"); |
366 purple_debug_info("gtkappbar", "hidden\n"); |
| 361 gtk_appbar_unregister(ab, GDK_WINDOW_HWND(ab->win->window)); |
367 gtk_appbar_unregister(ab, appbar_get_handle(ab)); |
| 362 ab->docked = TRUE; |
368 ab->docked = TRUE; |
| 363 ab->iconized = TRUE; |
369 ab->iconized = TRUE; |
| 364 } else { |
370 } else { |
| 365 ab->iconized = FALSE; |
371 ab->iconized = FALSE; |
| 366 purple_debug_info("gtkappbar", "shown\n"); |
372 purple_debug_info("gtkappbar", "shown\n"); |
| 455 purple_debug(PURPLE_DEBUG_INFO, "gtkappbar", "wnd_size\n"); |
461 purple_debug(PURPLE_DEBUG_INFO, "gtkappbar", "wnd_size\n"); |
| 456 |
462 |
| 457 if(msg->wParam == SIZE_MINIMIZED) { |
463 if(msg->wParam == SIZE_MINIMIZED) { |
| 458 purple_debug(PURPLE_DEBUG_INFO, "gtkappbar", "Minimize\n"); |
464 purple_debug(PURPLE_DEBUG_INFO, "gtkappbar", "Minimize\n"); |
| 459 if(ab->docked) { |
465 if(ab->docked) { |
| 460 gtk_appbar_unregister(ab, GDK_WINDOW_HWND(ab->win->window)); |
466 gtk_appbar_unregister(ab, appbar_get_handle(ab)); |
| 461 ab->docked = TRUE; |
467 ab->docked = TRUE; |
| 462 } |
468 } |
| 463 } |
469 } |
| 464 else if(msg->wParam == SIZE_RESTORED) { |
470 else if(msg->wParam == SIZE_RESTORED) { |
| 465 purple_debug(PURPLE_DEBUG_INFO, "gtkappbar", "Restore\n"); |
471 purple_debug(PURPLE_DEBUG_INFO, "gtkappbar", "Restore\n"); |
| 598 static void gtk_appbar_do_dock(GtkAppBar *ab, UINT side) { |
604 static void gtk_appbar_do_dock(GtkAppBar *ab, UINT side) { |
| 599 RECT orig, windowRect; |
605 RECT orig, windowRect; |
| 600 |
606 |
| 601 purple_debug(PURPLE_DEBUG_INFO, "gtkappbar", "gtk_appbar_do_dock\n"); |
607 purple_debug(PURPLE_DEBUG_INFO, "gtkappbar", "gtk_appbar_do_dock\n"); |
| 602 |
608 |
| 603 if(!ab || !IsWindow(GDK_WINDOW_HWND(ab->win->window))) |
609 if (!ab || !IsWindow(appbar_get_handle(ab))) |
| 604 return; |
610 return; |
| 605 |
611 |
| 606 ab->side = side; |
612 ab->side = side; |
| 607 get_window_normal_rc(GDK_WINDOW_HWND(ab->win->window), &(ab->docked_rect)); |
613 get_window_normal_rc(appbar_get_handle(ab), &(ab->docked_rect)); |
| 608 CopyRect(&orig, &(ab->docked_rect)); |
614 CopyRect(&orig, &(ab->docked_rect)); |
| 609 get_rect_of_window(GDK_WINDOW_HWND(ab->win->window), &windowRect); |
615 get_rect_of_window(appbar_get_handle(ab), &windowRect); |
| 610 gtk_appbar_querypos(ab, GDK_WINDOW_HWND(ab->win->window), windowRect); |
616 gtk_appbar_querypos(ab, appbar_get_handle(ab), windowRect); |
| 611 if(EqualRect(&orig, &(ab->docked_rect)) == 0) |
617 if(EqualRect(&orig, &(ab->docked_rect)) == 0) |
| 612 MoveWindow(GDK_WINDOW_HWND(ab->win->window), |
618 MoveWindow(appbar_get_handle(ab), |
| 613 ab->docked_rect.left, |
619 ab->docked_rect.left, |
| 614 ab->docked_rect.top, |
620 ab->docked_rect.top, |
| 615 ab->docked_rect.right - ab->docked_rect.left, |
621 ab->docked_rect.right - ab->docked_rect.left, |
| 616 ab->docked_rect.bottom - ab->docked_rect.top, TRUE); |
622 ab->docked_rect.bottom - ab->docked_rect.top, TRUE); |
| 617 gtk_appbar_setpos(ab, GDK_WINDOW_HWND(ab->win->window)); |
623 gtk_appbar_setpos(ab, appbar_get_handle(ab)); |
| 618 ab->docked = TRUE; |
624 ab->docked = TRUE; |
| 619 } |
625 } |
| 620 |
626 |
| 621 void gtk_appbar_dock(GtkAppBar *ab, UINT side) { |
627 void gtk_appbar_dock(GtkAppBar *ab, UINT side) { |
| 622 HWND hwnd; |
628 HWND hwnd; |
| 623 |
629 |
| 624 g_return_if_fail(ab != NULL); |
630 g_return_if_fail(ab != NULL); |
| 625 |
631 |
| 626 hwnd = GDK_WINDOW_HWND(ab->win->window); |
632 hwnd = appbar_get_handle(ab); |
| 627 |
633 |
| 628 g_return_if_fail(IsWindow(hwnd)); |
634 g_return_if_fail(IsWindow(hwnd)); |
| 629 |
635 |
| 630 ab->iconized = IsIconic(hwnd); |
636 ab->iconized = IsIconic(hwnd); |
| 631 |
637 |
| 652 return NULL; |
658 return NULL; |
| 653 ab = g_new0(GtkAppBar, 1); |
659 ab = g_new0(GtkAppBar, 1); |
| 654 ab->win = win; |
660 ab->win = win; |
| 655 |
661 |
| 656 /* init docking coords */ |
662 /* init docking coords */ |
| 657 get_window_normal_rc(GDK_WINDOW_HWND(win->window), &(ab->docked_rect)); |
663 get_window_normal_rc(appbar_get_handle(ab), &(ab->docked_rect)); |
| 658 |
664 |
| 659 /* Add main window filter */ |
665 /* Add main window filter */ |
| 660 gdk_window_add_filter(win->window, |
666 gdk_window_add_filter(gtk_widget_get_window(win), |
| 661 gtk_appbar_event_filter, |
667 gtk_appbar_event_filter, |
| 662 ab); |
668 ab); |
| 663 return ab; |
669 return ab; |
| 664 } |
670 } |
| 665 |
671 |
| 668 purple_debug(PURPLE_DEBUG_INFO, "gtkappbar", "gtk_appbar_remove\n"); |
674 purple_debug(PURPLE_DEBUG_INFO, "gtkappbar", "gtk_appbar_remove\n"); |
| 669 |
675 |
| 670 if(!ab) |
676 if(!ab) |
| 671 return; |
677 return; |
| 672 |
678 |
| 673 hwnd = GDK_WINDOW_HWND(ab->win->window); |
679 hwnd = appbar_get_handle(ab); |
| 674 gdk_window_remove_filter(ab->win->window, |
680 gdk_window_remove_filter(gtk_widget_get_window(ab->win), |
| 675 gtk_appbar_event_filter, |
681 gtk_appbar_event_filter, |
| 676 ab); |
682 ab); |
| 677 if(ab->docked) { |
683 if(ab->docked) { |
| 678 gtk_window_resize(GTK_WINDOW(ab->win), |
684 gtk_window_resize(GTK_WINDOW(ab->win), |
| 679 ab->docked_rect.right - ab->docked_rect.left, |
685 ab->docked_rect.right - ab->docked_rect.left, |