📄 gtkappbar.c
字号:
return GDK_FILTER_CONTINUE;}static GdkFilterReturn wnd_sizing(GtkAppBar *ab, GdkXEvent *xevent) { MSG *msg = (MSG*)xevent; purple_debug(PURPLE_DEBUG_INFO, "gtkappbar", "wnd_sizing\n"); if(ab->docked) { RECT *rc = (RECT*)msg->lParam; if(ab->side == ABE_LEFT && msg->wParam == WMSZ_RIGHT) { ab->docked_rect.right = rc->right; gtk_appbar_setpos(ab, msg->hwnd); } else if(ab->side == ABE_RIGHT && msg->wParam == WMSZ_LEFT) { ab->docked_rect.left = rc->left; gtk_appbar_setpos(ab, msg->hwnd); } return GDK_FILTER_REMOVE; } return GDK_FILTER_CONTINUE;}/** Notify the system that the appbar has been activated */static GdkFilterReturn wnd_activate(GtkAppBar *ab, GdkXEvent *xevent) { if (ab->registered) { APPBARDATA abd; MSG *msg = (MSG*)xevent; purple_debug(PURPLE_DEBUG_INFO, "gtkappbar", "wnd_activate\n"); abd.hWnd = msg->hwnd; abd.cbSize = sizeof(APPBARDATA); SHAppBarMessage(ABM_ACTIVATE, &abd); } return GDK_FILTER_CONTINUE;}/** Notify the system that the appbar's position has changed */static GdkFilterReturn wnd_poschanged(GtkAppBar *ab, GdkXEvent *xevent) { if (ab->registered) { APPBARDATA abd; MSG *msg = (MSG*)xevent; purple_debug(PURPLE_DEBUG_INFO, "gtkappbar", "wnd_poschanged\n"); abd.hWnd = msg->hwnd; abd.cbSize = sizeof(APPBARDATA); SHAppBarMessage(ABM_WINDOWPOSCHANGED, &abd); } return GDK_FILTER_CONTINUE;}/** The window is about to change */static GdkFilterReturn wnd_poschanging(GtkAppBar *ab, GdkXEvent *xevent) { MSG *msg = (MSG*)xevent; WINDOWPOS *wpos = (WINDOWPOS*)msg->lParam; purple_debug(PURPLE_DEBUG_INFO, "gtkappbar", "wnd_poschanging\n"); if(ab->docked || ab->docking) { wpos->x = ab->docked_rect.left; wpos->y = ab->docked_rect.top; wpos->cx = ab->docked_rect.right - ab->docked_rect.left; wpos->cy = ab->docked_rect.bottom - ab->docked_rect.top; if(IsIconic(msg->hwnd)) set_toolbar(msg->hwnd, FALSE); /*return GDK_FILTER_REMOVE;*/ } return GDK_FILTER_CONTINUE;}static GdkFilterReturn wnd_exitsizemove(GtkAppBar *ab, GdkXEvent *xevent) { MSG *msg = (MSG*)xevent; purple_debug(PURPLE_DEBUG_INFO, "gtkappbar", "wnd_exitsizemove\n"); if(ab->docking) { gtk_appbar_setpos(ab, msg->hwnd); ab->docking = FALSE; ab->docked = TRUE; gtk_appbar_dispatch_dock_cbs(ab, TRUE); } else if(!ab->docked) { gtk_appbar_unregister(ab, msg->hwnd); gtk_appbar_dispatch_dock_cbs(ab, FALSE); } return GDK_FILTER_CONTINUE;}static GdkFilterReturn wnd_showwindow(GtkAppBar *ab, GdkXEvent *xevent) { MSG *msg = (MSG*)xevent; purple_debug(PURPLE_DEBUG_INFO, "gtkappbar", "wnd_showwindow\n"); if(msg->wParam && ab->docked) { ab->iconized = FALSE; purple_debug(PURPLE_DEBUG_INFO, "gtkappbar", "shown\n"); ab->docked = FALSE; gtk_appbar_dock(ab, ab->side); } else if(!msg->wParam && ab->docked) { purple_debug(PURPLE_DEBUG_INFO, "gtkappbar", "hidden\n"); gtk_appbar_unregister(ab, GDK_WINDOW_HWND(ab->win->window)); set_toolbar(GDK_WINDOW_HWND(ab->win->window), FALSE); ab->docked = TRUE; ab->iconized = TRUE; } return GDK_FILTER_CONTINUE;}/** The window's size has changed */static GdkFilterReturn wnd_size(GtkAppBar *ab, GdkXEvent *xevent) { MSG *msg = (MSG*)xevent; purple_debug(PURPLE_DEBUG_INFO, "gtkappbar", "wnd_size\n"); if(msg->wParam == SIZE_MINIMIZED) { purple_debug(PURPLE_DEBUG_INFO, "gtkappbar", "Minimize\n"); if(ab->docked) { gtk_appbar_unregister(ab, GDK_WINDOW_HWND(ab->win->window)); ab->docked = TRUE; } } else if(msg->wParam == SIZE_RESTORED) { purple_debug(PURPLE_DEBUG_INFO, "gtkappbar", "Restore\n"); if (!ab->iconized && ab->docked) { gtk_appbar_dock(ab, ab->side); } } return GDK_FILTER_CONTINUE;}static GdkFilterReturn wnd_nchittest(GtkAppBar *ab, GdkXEvent *xevent) { MSG *msg = (MSG*)xevent; if(ab->docked) { UINT ret = DefWindowProc(msg->hwnd, msg->message, msg->wParam, msg->lParam); switch(ret) { case HTBOTTOM: case HTBOTTOMLEFT: case HTBOTTOMRIGHT: case HTTOP: case HTTOPLEFT: case HTTOPRIGHT: return GDK_FILTER_REMOVE; case HTLEFT: if(ab->side == ABE_LEFT) return GDK_FILTER_REMOVE; break; case HTRIGHT: if(ab->side == ABE_RIGHT) return GDK_FILTER_REMOVE; break; } } return GDK_FILTER_CONTINUE;}#if 0static GdkFilterReturn wnd_initmenupopup(GtkAppBar *ab, GdkXEvent *xevent) { MSG *msg = (MSG*)xevent; if(ab->docked && HIWORD(msg->lParam)) { HMENU sysmenu = GetSystemMenu(msg->hwnd, FALSE); purple_debug(PURPLE_DEBUG_INFO, "gtkappbar", "wnd_initpopupmenu: docked: %d ismenu: %d\n", ab->docked, IsMenu(sysmenu)); if(EnableMenuItem(sysmenu, SC_MAXIMIZE, MF_BYCOMMAND|MF_GRAYED)<0) purple_debug(PURPLE_DEBUG_INFO, "gtkappbar", "SC_MAXIMIZE Menu item does not exist\n"); if(EnableMenuItem(sysmenu, SC_MOVE, MF_BYCOMMAND|MF_GRAYED)<0) purple_debug(PURPLE_DEBUG_INFO, "gtkappbar", "SC_MOVE Menu item does not exist\n"); return GDK_FILTER_CONTINUE; } else GetSystemMenu(msg->hwnd, TRUE); return GDK_FILTER_CONTINUE;}#endifstatic GdkFilterReturn gtk_appbar_callback(GtkAppBar *ab, GdkXEvent *xevent) { MSG *msg = (MSG*)xevent; RECT orig, windowRect; switch (msg->wParam) { case ABN_STATECHANGE: purple_debug(PURPLE_DEBUG_INFO, "gtkappbar", "gtk_appbar_callback: ABN_STATECHANGE\n"); break; case ABN_FULLSCREENAPP: purple_debug(PURPLE_DEBUG_INFO, "gtkappbar", "gtk_appbar_callback: ABN_FULLSCREENAPP: %d\n", (BOOL)msg->lParam); if (!ab->iconized && ab->docked) { if ((BOOL)msg->lParam) { SetWindowPos(msg->hwnd, HWND_BOTTOM, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE); } else { SetWindowPos(msg->hwnd, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE | SWP_FRAMECHANGED); } } break; case ABN_POSCHANGED: purple_debug(PURPLE_DEBUG_INFO, "gtkappbar", "gtk_appbar_callback: ABN_POSCHANGED\n"); CopyRect(&orig, &(ab->docked_rect)); get_rect_of_window(msg->hwnd, &windowRect); gtk_appbar_querypos(ab, msg->hwnd, windowRect); if (EqualRect(&orig, &(ab->docked_rect)) == 0) { MoveWindow(msg->hwnd, ab->docked_rect.left, ab->docked_rect.top, ab->docked_rect.right - ab->docked_rect.left, ab->docked_rect.bottom - ab->docked_rect.top, TRUE); } gtk_appbar_setpos(ab, msg->hwnd); break;#if 0 default: purple_debug(PURPLE_DEBUG_INFO, "gtkappbar", "gtk_appbar_callback: %d\n", msg->wParam);#endif } return GDK_FILTER_CONTINUE;}static GdkFilterReturn gtk_appbar_event_filter(GdkXEvent *xevent, GdkEvent *event, gpointer data) { MSG *msg = (MSG*)xevent; /*printf("MSG: %s\n", message_to_string (msg->message));*/ switch(msg->message) { case WM_EXITSIZEMOVE: return wnd_exitsizemove(data, xevent); case WM_WINDOWPOSCHANGING: return wnd_poschanging(data, xevent); case WM_WINDOWPOSCHANGED: return wnd_poschanged(data, xevent); case WM_ACTIVATE: return wnd_activate(data, xevent); case WM_SIZING: return wnd_sizing(data, xevent); case WM_MOVING: return wnd_moving(data, xevent); case WM_SHOWWINDOW: return wnd_showwindow(data, xevent); case WM_NCHITTEST: return wnd_nchittest(data, xevent);#if 0 case WM_INITMENUPOPUP: return wnd_initmenupopup(data, xevent);#endif case WM_SIZE: return wnd_size(data, xevent); case APPBAR_CALLBACK: return gtk_appbar_callback(data, xevent);#if 0 default: purple_debug_info("gtkappbar", "gtk_appbar_event_filter %d\n", msg->message);#endif } return GDK_FILTER_CONTINUE;}void gtk_appbar_dock(GtkAppBar *ab, UINT side) { RECT orig, windowRect; purple_debug(PURPLE_DEBUG_INFO, "gtkappbar", "gtk_appbar_dock\n"); if(!ab || !IsWindow(GDK_WINDOW_HWND(ab->win->window))) return; ab->side = side; get_window_normal_rc(GDK_WINDOW_HWND(ab->win->window), &(ab->docked_rect)); CopyRect(&orig, &(ab->docked_rect)); get_rect_of_window(GDK_WINDOW_HWND(ab->win->window), &windowRect); gtk_appbar_querypos(ab, GDK_WINDOW_HWND(ab->win->window), windowRect); if(EqualRect(&orig, &(ab->docked_rect)) == 0) MoveWindow(GDK_WINDOW_HWND(ab->win->window), ab->docked_rect.left, ab->docked_rect.top, ab->docked_rect.right - ab->docked_rect.left, ab->docked_rect.bottom - ab->docked_rect.top, TRUE); gtk_appbar_setpos(ab, GDK_WINDOW_HWND(ab->win->window)); set_toolbar(GDK_WINDOW_HWND(ab->win->window), TRUE); ab->docked = TRUE;}void gtk_appbar_add_dock_cb(GtkAppBar *ab, GtkAppBarDockCB dock_cb) { if(!ab) return; ab->dock_cbs = g_list_append(ab->dock_cbs, dock_cb);}GtkAppBar *gtk_appbar_add(GtkWidget *win) { GtkAppBar *ab; purple_debug(PURPLE_DEBUG_INFO, "gtkappbar", "gtk_appbar_add\n"); if(!win) return NULL; ab = g_new0(GtkAppBar, 1); ab->win = win; /* init docking coords */ get_window_normal_rc(GDK_WINDOW_HWND(win->window), &(ab->docked_rect)); /* Add main window filter */ gdk_window_add_filter(win->window, gtk_appbar_event_filter, ab); return ab;}void gtk_appbar_remove(GtkAppBar *ab) { purple_debug(PURPLE_DEBUG_INFO, "gtkappbar", "gtk_appbar_remove\n"); if(!ab) return; gdk_window_remove_filter(ab->win->window, gtk_appbar_event_filter, ab); if(ab->docked) { gtk_window_resize(GTK_WINDOW(ab->win), ab->docked_rect.right - ab->docked_rect.left, ab->undocked_height); set_toolbar(GDK_WINDOW_HWND(ab->win->window), FALSE); } gtk_appbar_unregister(ab, GDK_WINDOW_HWND(ab->win->window)); g_free(ab);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -