⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gtkappbar.c

📁 Linux下的多协议即时通讯程序源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
        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 + -