📄 gdkgeometry-x11.c
字号:
parent = (GdkWindowObject *)wrapper->parent; while (parent && parent->window_type == GDK_WINDOW_CHILD) { GdkWindowImplX11 *impl = GDK_WINDOW_IMPL_X11 (parent->impl); tmp_clip.x = - clip_xoffset; tmp_clip.y = - clip_yoffset; tmp_clip.width = impl->width; tmp_clip.height = impl->height; gdk_rectangle_intersect (&parent_pos->clip_rect, &tmp_clip, &parent_pos->clip_rect); parent_pos->x += parent->x; parent_pos->y += parent->y; parent_pos->x11_x += impl->position_info.x; parent_pos->x11_y += impl->position_info.y; clip_xoffset += parent->x; clip_yoffset += parent->y; parent = (GdkWindowObject *)parent->parent; }}static voidgdk_window_premove (GdkWindow *window, GdkWindowParentPos *parent_pos){ GdkWindowImplX11 *impl; GdkWindowObject *obj; GdkXPositionInfo new_info; GList *tmp_list; gint d_xoffset, d_yoffset; GdkWindowParentPos this_pos; obj = (GdkWindowObject *) window; impl = GDK_WINDOW_IMPL_X11 (obj->impl); gdk_window_compute_position (impl, parent_pos, &new_info); gdk_window_clip_changed (window, &impl->position_info.clip_rect, &new_info.clip_rect); this_pos.x = parent_pos->x + obj->x; this_pos.y = parent_pos->y + obj->y; this_pos.x11_x = parent_pos->x11_x + new_info.x; this_pos.x11_y = parent_pos->x11_y + new_info.y; this_pos.clip_rect = new_info.clip_rect; if (impl->position_info.mapped && !new_info.mapped) XUnmapWindow (GDK_DRAWABLE_XDISPLAY (window), GDK_DRAWABLE_XID (window)); d_xoffset = new_info.x_offset - impl->position_info.x_offset; d_yoffset = new_info.y_offset - impl->position_info.y_offset; if (d_xoffset != 0 || d_yoffset != 0) { GdkRectangle new_position; if (d_xoffset < 0 || d_yoffset < 0) gdk_window_queue_translation (window, MIN (d_xoffset, 0), MIN (d_yoffset, 0)); compute_intermediate_position (&impl->position_info, &new_info, d_xoffset, d_yoffset, &new_position); XMoveResizeWindow (GDK_DRAWABLE_XDISPLAY (window), GDK_DRAWABLE_XID (window), new_position.x, new_position.y, new_position.width, new_position.height); } tmp_list = obj->children; while (tmp_list) { gdk_window_premove (tmp_list->data, &this_pos); tmp_list = tmp_list->next; }}static voidgdk_window_postmove (GdkWindow *window, GdkWindowParentPos *parent_pos){ GdkWindowImplX11 *impl; GdkWindowObject *obj; GdkXPositionInfo new_info; GList *tmp_list; gint d_xoffset, d_yoffset; GdkWindowParentPos this_pos; obj = (GdkWindowObject *) window; impl = GDK_WINDOW_IMPL_X11 (obj->impl); gdk_window_compute_position (impl, parent_pos, &new_info); this_pos.x = parent_pos->x + obj->x; this_pos.y = parent_pos->y + obj->y; this_pos.x11_x = parent_pos->x11_x + new_info.x; this_pos.x11_y = parent_pos->x11_y + new_info.y; this_pos.clip_rect = new_info.clip_rect; d_xoffset = new_info.x_offset - impl->position_info.x_offset; d_yoffset = new_info.y_offset - impl->position_info.y_offset; if (d_xoffset != 0 || d_yoffset != 0) { if (d_xoffset > 0 || d_yoffset > 0) gdk_window_queue_translation (window, MAX (d_xoffset, 0), MAX (d_yoffset, 0)); XMoveResizeWindow (GDK_DRAWABLE_XDISPLAY (window), GDK_DRAWABLE_XID (window), new_info.x, new_info.y, new_info.width, new_info.height); } if (!impl->position_info.mapped && new_info.mapped && GDK_WINDOW_IS_MAPPED (obj)) XMapWindow (GDK_DRAWABLE_XDISPLAY (window), GDK_DRAWABLE_XID (window)); if (impl->position_info.no_bg) _gdk_x11_window_tmp_reset_bg (window, FALSE); impl->position_info = new_info; tmp_list = obj->children; while (tmp_list) { gdk_window_postmove (tmp_list->data, &this_pos); tmp_list = tmp_list->next; }}static Boolexpose_serial_predicate (Display *xdisplay, XEvent *xev, XPointer arg){ gulong *serial = (gulong *)arg; if (xev->xany.type == Expose) *serial = MIN (*serial, xev->xany.serial); return False;}/* Find oldest possible serial for an outstanding expose event */static gulongfind_current_serial (Display *xdisplay){ XEvent xev; gulong serial = NextRequest (xdisplay); XSync (xdisplay, False); XCheckIfEvent (xdisplay, &xev, expose_serial_predicate, (XPointer)&serial); return serial;}static voidqueue_delete_link (GQueue *queue, GList *link){ if (queue->tail == link) queue->tail = link->prev; queue->head = g_list_remove_link (queue->head, link); g_list_free_1 (link); queue->length--;}static voidqueue_item_free (GdkWindowQueueItem *item){ if (item->window) { g_object_remove_weak_pointer (G_OBJECT (item->window), (gpointer *)&(item->window)); } if (item->type == GDK_WINDOW_QUEUE_ANTIEXPOSE) gdk_region_destroy (item->u.antiexpose.area); g_free (item);}static voidgdk_window_queue (GdkWindow *window, GdkWindowQueueItem *item){ GdkDisplayX11 *display_x11 = GDK_DISPLAY_X11 (GDK_WINDOW_DISPLAY (window)); if (!display_x11->translate_queue) display_x11->translate_queue = g_queue_new (); /* Keep length of queue finite by, if it grows too long, * figuring out the latest relevant serial and discarding * irrelevant queue items. */ if (display_x11->translate_queue->length >= 64) { gulong serial = find_current_serial (GDK_WINDOW_XDISPLAY (window)); GList *tmp_list = display_x11->translate_queue->head; while (tmp_list) { GdkWindowQueueItem *item = tmp_list->data; GList *next = tmp_list->next; if (serial > item->serial) { queue_delete_link (display_x11->translate_queue, tmp_list); queue_item_free (item); } tmp_list = next; } } /* Catch the case where someone isn't processing events and there * is an event stuck in the event queue with an old serial: * If we can't reduce the queue length by the above method, * discard anti-expose items. (We can't discard translate * items */ if (display_x11->translate_queue->length >= 64) { GList *tmp_list = display_x11->translate_queue->head; while (tmp_list) { GdkWindowQueueItem *item = tmp_list->data; GList *next = tmp_list->next; if (item->type == GDK_WINDOW_QUEUE_ANTIEXPOSE) { queue_delete_link (display_x11->translate_queue, tmp_list); queue_item_free (item); } tmp_list = next; } } item->window = window; item->serial = NextRequest (GDK_WINDOW_XDISPLAY (window)); g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&(item->window)); g_queue_push_tail (display_x11->translate_queue, item);}static voidgdk_window_queue_translation (GdkWindow *window, gint dx, gint dy){ GdkWindowQueueItem *item = g_new (GdkWindowQueueItem, 1); item->type = GDK_WINDOW_QUEUE_TRANSLATE; item->u.translate.dx = dx; item->u.translate.dy = dy; gdk_window_queue (window, item);}gboolean_gdk_windowing_window_queue_antiexpose (GdkWindow *window, GdkRegion *area){ GdkWindowQueueItem *item = g_new (GdkWindowQueueItem, 1); item->type = GDK_WINDOW_QUEUE_ANTIEXPOSE; item->u.antiexpose.area = area; gdk_window_queue (window, item); return TRUE;}void_gdk_window_process_expose (GdkWindow *window, gulong serial, GdkRectangle *area){ GdkWindowImplX11 *impl; GdkRegion *invalidate_region = gdk_region_rectangle (area); GdkRegion *clip_region; GdkDisplayX11 *display_x11 = GDK_DISPLAY_X11 (GDK_WINDOW_DISPLAY (window)); impl = GDK_WINDOW_IMPL_X11 (GDK_WINDOW_OBJECT (window)->impl); if (display_x11->translate_queue) { GList *tmp_list = display_x11->translate_queue->head; while (tmp_list) { GdkWindowQueueItem *item = tmp_list->data; tmp_list = tmp_list->next; if (serial < item->serial) { if (item->window == window) { if (item->type == GDK_WINDOW_QUEUE_TRANSLATE) gdk_region_offset (invalidate_region, item->u.translate.dx, item->u.translate.dy); else /* anti-expose */ gdk_region_subtract (invalidate_region, item->u.antiexpose.area); } } else { queue_delete_link (display_x11->translate_queue, display_x11->translate_queue->head); queue_item_free (item); } } } clip_region = gdk_region_rectangle (&impl->position_info.clip_rect); gdk_region_intersect (invalidate_region, clip_region); if (!gdk_region_empty (invalidate_region)) gdk_window_invalidate_region (window, invalidate_region, FALSE); gdk_region_destroy (invalidate_region); gdk_region_destroy (clip_region);}static voidgdk_window_clip_changed (GdkWindow *window, GdkRectangle *old_clip, GdkRectangle *new_clip){ GdkWindowImplX11 *impl; GdkWindowObject *obj; GdkRegion *old_clip_region; GdkRegion *new_clip_region; if (((GdkWindowObject *)window)->input_only) return; obj = (GdkWindowObject *) window; impl = GDK_WINDOW_IMPL_X11 (obj->impl); old_clip_region = gdk_region_rectangle (old_clip); new_clip_region = gdk_region_rectangle (new_clip); /* We need to update this here because gdk_window_invalidate_region makes * use if it (through gdk_drawable_get_visible_region */ impl->position_info.clip_rect = *new_clip; /* Trim invalid region of window to new clip rectangle */ if (obj->update_area) gdk_region_intersect (obj->update_area, new_clip_region); /* Invalidate newly exposed portion of window */ gdk_region_subtract (new_clip_region, old_clip_region); if (!gdk_region_empty (new_clip_region)) { _gdk_x11_window_tmp_unset_bg (window, FALSE);; gdk_window_invalidate_region (window, new_clip_region, FALSE); } gdk_region_destroy (new_clip_region); gdk_region_destroy (old_clip_region);}#define __GDK_GEOMETRY_X11_C__#include "gdkaliasdef.c"
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -