📄 gdkwindow.c
字号:
if (x) *x = winx; if (y) *y = winy; if (mask) *mask = xmask; return return_val;}GdkWindow*gdk_window_at_pointer (gint *win_x, gint *win_y){ GdkWindowPrivate *private; GdkWindow *window; Window root; Window xwindow; Window xwindow_last = 0; int rootx = -1, rooty = -1; int winx, winy; unsigned int xmask; private = &gdk_root_parent; xwindow = private->xwindow; XGrabServer (private->xdisplay); while (xwindow) { xwindow_last = xwindow; XQueryPointer (private->xdisplay, xwindow, &root, &xwindow, &rootx, &rooty, &winx, &winy, &xmask); } XUngrabServer (private->xdisplay); window = gdk_window_lookup (xwindow_last); if (win_x) *win_x = window ? winx : -1; if (win_y) *win_y = window ? winy : -1; return window;}GdkWindow*gdk_window_get_parent (GdkWindow *window){ g_return_val_if_fail (window != NULL, NULL); return ((GdkWindowPrivate*) window)->parent;}GdkWindow*gdk_window_get_toplevel (GdkWindow *window){ GdkWindowPrivate *private; g_return_val_if_fail (window != NULL, NULL); private = (GdkWindowPrivate*) window; while (private->window_type == GDK_WINDOW_CHILD) { window = ((GdkWindowPrivate*) window)->parent; private = (GdkWindowPrivate*) window; } return window;}GList*gdk_window_get_children (GdkWindow *window){ GdkWindowPrivate *private; GdkWindow *child; GList *children; Window root; Window parent; Window *xchildren; unsigned int nchildren; unsigned int i; g_return_val_if_fail (window != NULL, NULL); private = (GdkWindowPrivate*) window; if (private->destroyed) return NULL; XQueryTree (private->xdisplay, private->xwindow, &root, &parent, &xchildren, &nchildren); children = NULL; if (nchildren > 0) { for (i = 0; i < nchildren; i++) { child = gdk_window_lookup (xchildren[i]); if (child) children = g_list_prepend (children, child); } if (xchildren) XFree (xchildren); } return children;}GdkEventMask gdk_window_get_events (GdkWindow *window){ GdkWindowPrivate *private; XWindowAttributes attrs; GdkEventMask event_mask; int i; g_return_val_if_fail (window != NULL, 0); private = (GdkWindowPrivate*) window; if (private->destroyed) return 0; XGetWindowAttributes (gdk_display, private->xwindow, &attrs); event_mask = 0; for (i = 0; i < gdk_nevent_masks; i++) { if (attrs.your_event_mask & gdk_event_mask_table[i]) event_mask |= 1 << (i + 1); } return event_mask;}void gdk_window_set_events (GdkWindow *window, GdkEventMask event_mask){ GdkWindowPrivate *private; long xevent_mask; int i; g_return_if_fail (window != NULL); private = (GdkWindowPrivate*) window; if (private->destroyed) return; xevent_mask = StructureNotifyMask; for (i = 0; i < gdk_nevent_masks; i++) { if (event_mask & (1 << (i + 1))) xevent_mask |= gdk_event_mask_table[i]; } XSelectInput (gdk_display, private->xwindow, xevent_mask);}voidgdk_window_add_colormap_windows (GdkWindow *window){ GdkWindow *toplevel; GdkWindowPrivate *toplevel_private; GdkWindowPrivate *window_private; Window *old_windows; Window *new_windows; int i, count; g_return_if_fail (window != NULL); toplevel = gdk_window_get_toplevel (window); toplevel_private = (GdkWindowPrivate*) toplevel; window_private = (GdkWindowPrivate*) window; if (window_private->destroyed) return; old_windows = NULL; if (!XGetWMColormapWindows (toplevel_private->xdisplay, toplevel_private->xwindow, &old_windows, &count)) { count = 0; } for (i = 0; i < count; i++) if (old_windows[i] == window_private->xwindow) { XFree (old_windows); return; } new_windows = g_new (Window, count + 1); for (i = 0; i < count; i++) new_windows[i] = old_windows[i]; new_windows[count] = window_private->xwindow; XSetWMColormapWindows (toplevel_private->xdisplay, toplevel_private->xwindow, new_windows, count + 1); g_free (new_windows); if (old_windows) XFree (old_windows);}static gbooleangdk_window_have_shape_ext (void){ enum { UNKNOWN, NO, YES }; static gint have_shape = UNKNOWN; if (have_shape == UNKNOWN) { int ignore; if (XQueryExtension (gdk_display, "SHAPE", &ignore, &ignore, &ignore)) have_shape = YES; else have_shape = NO; } return (have_shape == YES);}/* * This needs the X11 shape extension. * If not available, shaped windows will look * ugly, but programs still work. Stefan Wille */voidgdk_window_shape_combine_mask (GdkWindow *window, GdkBitmap *mask, gint x, gint y){ GdkWindowPrivate *window_private; Pixmap pixmap; g_return_if_fail (window != NULL); #ifdef HAVE_SHAPE_EXT window_private = (GdkWindowPrivate*) window; if (window_private->destroyed) return; if (gdk_window_have_shape_ext ()) { if (mask) { GdkWindowPrivate *pixmap_private; pixmap_private = (GdkWindowPrivate*) mask; pixmap = (Pixmap) pixmap_private->xwindow; } else { x = 0; y = 0; pixmap = None; } XShapeCombineMask (window_private->xdisplay, window_private->xwindow, ShapeBounding, x, y, pixmap, ShapeSet); }#endif /* HAVE_SHAPE_EXT */}void gdk_window_add_filter (GdkWindow *window, GdkFilterFunc function, gpointer data){ GdkWindowPrivate *private; GList *tmp_list; GdkEventFilter *filter; private = (GdkWindowPrivate*) window; if (private && private->destroyed) return; if (private) tmp_list = private->filters; else tmp_list = gdk_default_filters; while (tmp_list) { filter = (GdkEventFilter *)tmp_list->data; if ((filter->function == function) && (filter->data == data)) return; tmp_list = tmp_list->next; } filter = g_new (GdkEventFilter, 1); filter->function = function; filter->data = data; if (private) private->filters = g_list_append (private->filters, filter); else gdk_default_filters = g_list_append (gdk_default_filters, filter);}voidgdk_window_remove_filter (GdkWindow *window, GdkFilterFunc function, gpointer data){ GdkWindowPrivate *private; GList *tmp_list, *node; GdkEventFilter *filter; private = (GdkWindowPrivate*) window; if (private) tmp_list = private->filters; else tmp_list = gdk_default_filters; while (tmp_list) { filter = (GdkEventFilter *)tmp_list->data; node = tmp_list; tmp_list = tmp_list->next; if ((filter->function == function) && (filter->data == data)) { if (private) private->filters = g_list_remove_link (private->filters, node); else gdk_default_filters = g_list_remove_link (gdk_default_filters, node); g_list_free_1 (node); g_free (filter); return; } }}voidgdk_window_set_override_redirect (GdkWindow *window, gboolean override_redirect){ GdkWindowPrivate *private; XSetWindowAttributes attr; g_return_if_fail (window != NULL); private = (GdkWindowPrivate*) window; if (private->destroyed) return; attr.override_redirect = (override_redirect == FALSE)?False:True; XChangeWindowAttributes (gdk_display, ((GdkWindowPrivate *)window)->xwindow, CWOverrideRedirect, &attr);}void gdk_window_set_icon (GdkWindow *window, GdkWindow *icon_window, GdkPixmap *pixmap, GdkBitmap *mask){ XWMHints *wm_hints; GdkWindowPrivate *window_private; GdkWindowPrivate *private; g_return_if_fail (window != NULL); window_private = (GdkWindowPrivate*) window; if (window_private->destroyed) return; wm_hints = XGetWMHints (window_private->xdisplay, window_private->xwindow); if (!wm_hints) wm_hints = XAllocWMHints (); if (icon_window != NULL) { private = (GdkWindowPrivate *)icon_window; wm_hints->flags |= IconWindowHint; wm_hints->icon_window = private->xwindow; } if (pixmap != NULL) { private = (GdkWindowPrivate *)pixmap; wm_hints->flags |= IconPixmapHint; wm_hints->icon_pixmap = private->xwindow; } if (mask != NULL) { private = (GdkWindowPrivate *)mask; wm_hints->flags |= IconMaskHint; wm_hints->icon_mask = private->xwindow; } XSetWMHints (window_private->xdisplay, window_private->xwindow, wm_hints); XFree (wm_hints);}void gdk_window_set_icon_name (GdkWindow *window, gchar * name){ GdkWindowPrivate *window_private; XTextProperty property; gint res; g_return_if_fail (window != NULL); window_private = (GdkWindowPrivate*) window; if (window_private->destroyed) return; res = XmbTextListToTextProperty (window_private->xdisplay, &name, 1, XStdICCTextStyle, &property); if (res < 0) { g_warning ("Error converting icon name to text property: %d\n", res); return; } XSetWMIconName (window_private->xdisplay, window_private->xwindow, &property); if (property.value) XFree (property.value);}void gdk_window_set_group (GdkWindow *window, GdkWindow *leader){ XWMHints *wm_hints; GdkWindowPrivate *window_private; GdkWindowPrivate *private; g_return_if_fail (window != NULL); g_return_if_fail (leader != NULL); window_private = (GdkWindowPrivate*) window; if (window_private->destroyed) return; private = (GdkWindowPrivate *)leader; wm_hints = XGetWMHints (window_private->xdisplay, window_private->xwindow); if (!wm_hints) wm_hints = XAllocWMHints (); wm_hints->flags |= WindowGroupHint; wm_hints->window_group = private->xwindow; XSetWMHints (window_private->xdisplay, window_private->xwindow, wm_hints); XFree (wm_hints);}static voidgdk_window_set_mwm_hints (GdkWindow *window, MotifWmHints *new_hints){ static Atom hints_atom = None; MotifWmHints *hints; Atom type; gint format; gulong nitems; gulong bytes_after; GdkWindowPrivate *window_private; g_return_if_fail (window != NULL); window_private = (GdkWindowPrivate*) window; if (window_private->destroyed) return; if (!hints_atom) hints_atom = XInternAtom (window_private->xdisplay, _XA_MOTIF_WM_HINTS, FALSE); XGetWindowProperty (window_private->xdisplay, window_private->xwindow, hints_atom, 0, sizeof (MotifWmHints)/sizeof (long), False, AnyPropertyType, &type, &format, &nitems, &bytes_after, (guchar **)&hints); if (type == None) hints = new_hints; else { if (new_hints->flags & MWM_HINTS_FUNCTIONS) { hints->flags |= MWM_HINTS_FUNCTIONS; hints->functions = new_hints->functions; } if (new_hints->flags & MWM_HINTS_DECORATIONS) { hints->flags |= MWM_HINTS_DECORATIONS; hints->decorations = new_hints->decorations; } } XChangeProperty (window_private->xdisplay, window_private->xwindow, hints_atom, hints_atom, 32, PropModeReplace, (guchar *)hints, sizeof (MotifWmHints)/sizeof (long)); if (hints != new_hints) XFree (hints);}voidgdk_window_set_decorations (GdkWindow *window, GdkWMDecoration decorations){ MotifWmHints hints; hints.flags = MWM_HINTS_DECORATIONS; hints.decorations = decorations; gdk_window_set_mwm_hints (window, &hints);}voidgdk_window_set_functions (GdkWindow *window, GdkWMFunction functions){ MotifWmHints hints; hints.flags = MWM_HINTS_FUNCTIONS; hints.functions = functions; gdk_window_set_mwm_hints (window, &hints);}GList *gdk_window_get_toplevels (void){ GList *new_list = NULL; GList *tmp_list; tmp_list = gdk_root_parent.children;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -