📄 gdkwindow-fb.c
字号:
gdk_fb_window_containing_pointer = gdk_window_ref (_gdk_parent_root); if (src) a = src; else a = gdk_fb_window_containing_pointer; b = dest; if (a==b) return; /* gdk_fb_window_containing_pointer might have been destroyed. * The refcount we hold on it should keep it, but it's parents * might have died. */ if (GDK_WINDOW_DESTROYED (a)) a = _gdk_parent_root; gdk_fb_mouse_get_info (&x, &y, &my_mask); c = gdk_fb_find_common_ancestor (a, b); non_linear = (c != a) && (c != b); event_win = gdk_fb_pointer_event_window (a, GDK_LEAVE_NOTIFY); if (event_win) { event = gdk_event_make (event_win, GDK_LEAVE_NOTIFY, TRUE); event->crossing.subwindow = NULL; gdk_window_get_root_origin (a, &x_int, &y_int); event->crossing.x = x - x_int; event->crossing.y = y - y_int; event->crossing.x_root = x; event->crossing.y_root = y; event->crossing.mode = mode; if (non_linear) event->crossing.detail = GDK_NOTIFY_NONLINEAR; else if (c==a) event->crossing.detail = GDK_NOTIFY_INFERIOR; else event->crossing.detail = GDK_NOTIFY_ANCESTOR; event->crossing.focus = FALSE; event->crossing.state = my_mask; } /* Traverse up from a to (excluding) c */ if (c != a) { last = a; win = GDK_WINDOW (GDK_WINDOW_OBJECT (a)->parent); while (win != c) { event_win = gdk_fb_pointer_event_window (win, GDK_LEAVE_NOTIFY); if (event_win) { event = gdk_event_make (event_win, GDK_LEAVE_NOTIFY, TRUE); event->crossing.subwindow = gdk_window_ref (last); gdk_window_get_root_origin (win, &x_int, &y_int); event->crossing.x = x - x_int; event->crossing.y = y - y_int; event->crossing.x_root = x; event->crossing.y_root = y; event->crossing.mode = mode; if (non_linear) event->crossing.detail = GDK_NOTIFY_NONLINEAR_VIRTUAL; else event->crossing.detail = GDK_NOTIFY_VIRTUAL; event->crossing.focus = FALSE; event->crossing.state = my_mask; } last = win; win = GDK_WINDOW (GDK_WINDOW_OBJECT (win)->parent); } } /* Traverse down from c to b */ if (c != b) { path = NULL; win = GDK_WINDOW( GDK_WINDOW_OBJECT (b)->parent); while (win != c) { path = g_list_prepend (path, win); win = GDK_WINDOW( GDK_WINDOW_OBJECT (win)->parent); } list = path; while (list) { win = (GdkWindow *)list->data; list = g_list_next (list); if (list) next = (GdkWindow *)list->data; else next = b; event_win = gdk_fb_pointer_event_window (win, GDK_ENTER_NOTIFY); if (event_win) { event = gdk_event_make (event_win, GDK_ENTER_NOTIFY, TRUE); event->crossing.subwindow = gdk_window_ref (next); gdk_window_get_root_origin (win, &x_int, &y_int); event->crossing.x = x - x_int; event->crossing.y = y - y_int; event->crossing.x_root = x; event->crossing.y_root = y; event->crossing.mode = mode; if (non_linear) event->crossing.detail = GDK_NOTIFY_NONLINEAR_VIRTUAL; else event->crossing.detail = GDK_NOTIFY_VIRTUAL; event->crossing.focus = FALSE; event->crossing.state = my_mask; } } g_list_free (path); } event_win = gdk_fb_pointer_event_window (b, GDK_ENTER_NOTIFY); if (event_win) { event = gdk_event_make (event_win, GDK_ENTER_NOTIFY, TRUE); event->crossing.subwindow = NULL; gdk_window_get_root_origin (b, &x_int, &y_int); event->crossing.x = x - x_int; event->crossing.y = y - y_int; event->crossing.x_root = x; event->crossing.y_root = y; event->crossing.mode = mode; if (non_linear) event->crossing.detail = GDK_NOTIFY_NONLINEAR; else if (c==a) event->crossing.detail = GDK_NOTIFY_ANCESTOR; else event->crossing.detail = GDK_NOTIFY_INFERIOR; event->crossing.focus = FALSE; event->crossing.state = my_mask; } if (mode != GDK_CROSSING_GRAB) { gdk_fb_change_focus (b); if (b != gdk_fb_window_containing_pointer) { gdk_window_unref (gdk_fb_window_containing_pointer); gdk_fb_window_containing_pointer = gdk_window_ref (b); } }}static voidshow_window_internal (GdkWindow *window, gboolean raise){ GdkWindowObject *private; GdkWindow *mousewin; g_return_if_fail (window != NULL); private = (GdkWindowObject*) window; if (!private->destroyed && !GDK_WINDOW_IS_MAPPED (private)) { private->state = 0; if (raise) gdk_fb_window_raise (window); if (all_parents_shown ((GdkWindowObject *)private->parent)) { GdkRectangle rect; recompute_drawable ((GdkDrawable *)window); send_map_events (private, TRUE); mousewin = gdk_window_at_pointer (NULL, NULL); gdk_fb_window_send_crossing_events (NULL, mousewin, GDK_CROSSING_NORMAL); if (private->input_only) return; rect.x = GDK_DRAWABLE_IMPL_FBDATA (window)->llim_x; rect.y = GDK_DRAWABLE_IMPL_FBDATA (window)->llim_y; rect.width = GDK_DRAWABLE_IMPL_FBDATA (window)->lim_x - rect.x; rect.height = GDK_DRAWABLE_IMPL_FBDATA (window)->lim_y - rect.y; gdk_window_invalidate_rect (_gdk_parent_root, &rect, TRUE); } }}voidgdk_window_show_unraised (GdkWindow *window){ g_return_if_fail (window != NULL); show_window_internal (window, FALSE);}voidgdk_window_show (GdkWindow *window){ g_return_if_fail (window != NULL); show_window_internal (window, TRUE);}voidgdk_window_hide (GdkWindow *window){ GdkWindowObject *private; GdkWindow *mousewin; GdkWindow *event_win; g_return_if_fail (window != NULL); private = (GdkWindowObject*) window; if (!private->destroyed && GDK_WINDOW_IS_MAPPED (private)) { GdkEvent *event; GdkRectangle r; gboolean do_hide; event_win = gdk_fb_other_event_window (window, GDK_UNMAP); if (event_win) event = gdk_event_make (event_win, GDK_UNMAP, TRUE); r.x = GDK_DRAWABLE_IMPL_FBDATA (window)->llim_x; r.y = GDK_DRAWABLE_IMPL_FBDATA (window)->llim_y; r.width = GDK_DRAWABLE_IMPL_FBDATA (window)->lim_x - r.x; r.height = GDK_DRAWABLE_IMPL_FBDATA (window)->lim_y - r.y; private->state = GDK_WINDOW_STATE_WITHDRAWN; mousewin = gdk_window_at_pointer (NULL, NULL); gdk_fb_window_send_crossing_events (NULL, mousewin, GDK_CROSSING_NORMAL); do_hide = gdk_fb_cursor_need_hide (&r); if (do_hide) gdk_fb_cursor_hide (); if (window == _gdk_fb_pointer_grab_window) gdk_pointer_ungrab (GDK_CURRENT_TIME); if (window == _gdk_fb_keyboard_grab_window) gdk_keyboard_ungrab (GDK_CURRENT_TIME); /* Clear the root window, as it might be visible under the hidden window*/ gdk_window_clear_area (_gdk_parent_root, r.x, r.y, r.width, r.height); /* Invalidate the rect */ gdk_window_invalidate_rect (_gdk_parent_root, &r, TRUE); if (do_hide) gdk_fb_cursor_unhide (); }}voidgdk_window_withdraw (GdkWindow *window){ gdk_window_hide (window);}voidgdk_window_move (GdkWindow *window, gint x, gint y){ GdkWindowObject *private = (GdkWindowObject *)window; g_return_if_fail (window != NULL); g_return_if_fail (GDK_IS_WINDOW (window)); gdk_window_move_resize (window, x, y, GDK_DRAWABLE_IMPL_FBDATA (private)->width, GDK_DRAWABLE_IMPL_FBDATA (private)->height);}voidgdk_window_resize (GdkWindow *window, gint width, gint height){ GdkWindowObject *private; gint x, y; g_return_if_fail (window != NULL); g_return_if_fail (GDK_IS_WINDOW (window)); private = (GdkWindowObject*) window; if (width < 1) width = 1; if (height < 1) height = 1; x = private->x; y = private->y; if (private->parent && (private->parent->window_type != GDK_WINDOW_CHILD)) { GdkWindowChildHandlerData *data; data = g_object_get_data (G_OBJECT (private->parent), "gdk-window-child-handler"); if (data) (*data->get_pos) (window, &x, &y, data->user_data); } gdk_window_move_resize (window, x, y, width, height);}static voidrecompute_abs_positions(GdkDrawable *drawable, gint parent_x, gint parent_y, gint parent_llim_x, gint parent_llim_y, gint parent_lim_x, gint parent_lim_y){ GList *l; if (GDK_IS_WINDOW (drawable)) { GdkWindowObject *private = GDK_WINDOW_P (drawable); int x, y; if (!GDK_WINDOW_IS_MAPPED (private)) return; GDK_DRAWABLE_IMPL_FBDATA (private)->abs_x = parent_x + private->x; GDK_DRAWABLE_IMPL_FBDATA (private)->abs_y = parent_y + private->y; x = MAX (parent_llim_x, GDK_DRAWABLE_IMPL_FBDATA (private)->abs_x); x = MIN (x, parent_lim_x); GDK_DRAWABLE_IMPL_FBDATA (private)->llim_x = x; y = MAX (parent_llim_y, GDK_DRAWABLE_IMPL_FBDATA (private)->abs_y); y = MIN (y, parent_lim_y); GDK_DRAWABLE_IMPL_FBDATA (private)->llim_y = y; x = MIN (parent_lim_x, GDK_DRAWABLE_IMPL_FBDATA (private)->abs_x + GDK_DRAWABLE_IMPL_FBDATA (private)->width); x = MAX (x, GDK_DRAWABLE_IMPL_FBDATA (private)->llim_x); GDK_DRAWABLE_IMPL_FBDATA (private)->lim_x = x; y = MIN (parent_lim_y, GDK_DRAWABLE_IMPL_FBDATA (private)->abs_y + GDK_DRAWABLE_IMPL_FBDATA (private)->height); y = MAX (y, GDK_DRAWABLE_IMPL_FBDATA (private)->llim_y); GDK_DRAWABLE_IMPL_FBDATA (private)->lim_y = y; g_assert (GDK_DRAWABLE_IMPL_FBDATA (private)->llim_x <= GDK_DRAWABLE_IMPL_FBDATA (private)->lim_x); g_assert (GDK_DRAWABLE_IMPL_FBDATA (private)->llim_y <= GDK_DRAWABLE_IMPL_FBDATA (private)->lim_y); for (l = private->children; l; l = l->next) recompute_abs_positions (l->data, GDK_DRAWABLE_IMPL_FBDATA (private)->abs_x, GDK_DRAWABLE_IMPL_FBDATA (private)->abs_y, GDK_DRAWABLE_IMPL_FBDATA (private)->llim_x, GDK_DRAWABLE_IMPL_FBDATA (private)->llim_y, GDK_DRAWABLE_IMPL_FBDATA (private)->lim_x, GDK_DRAWABLE_IMPL_FBDATA (private)->lim_y); } else { GDK_DRAWABLE_IMPL_FBDATA (drawable)->abs_x = 0; GDK_DRAWABLE_IMPL_FBDATA (drawable)->abs_y = 0; GDK_DRAWABLE_IMPL_FBDATA (drawable)->llim_x = 0; GDK_DRAWABLE_IMPL_FBDATA (drawable)->llim_y = 0; GDK_DRAWABLE_IMPL_FBDATA (drawable)->lim_x = GDK_DRAWABLE_IMPL_FBDATA (drawable)->width; GDK_DRAWABLE_IMPL_FBDATA (drawable)->lim_y = GDK_DRAWABLE_IMPL_FBDATA (drawable)->height; }}static voidrecompute_rowstride(GdkDrawable *drawable){ GList *l; GdkWindowObject *private; g_return_if_fail (GDK_IS_WINDOW (drawable)); private = GDK_WINDOW_P (drawable); GDK_DRAWABLE_IMPL_FBDATA (private)->rowstride = gdk_display->fb_stride; for (l = private->children; l; l = l->next) recompute_rowstride (l->data);}voidgdk_fb_recompute_all (void){ GDK_DRAWABLE_IMPL_FBDATA (_gdk_parent_root)->width = gdk_display->fb_width; GDK_DRAWABLE_IMPL_FBDATA (_gdk_parent_root)->height = gdk_display->fb_height; recompute_abs_positions (_gdk_parent_root, 0, 0, 0, 0, gdk_display->fb_width, gdk_display->fb_height); recompute_rowstride (_gdk_parent_root);}static voidrecompute_drawable (GdkDrawable *drawable){ if (GDK_IS_WINDOW (drawable)) { GdkWindowObject *private = GDK_WINDOW_P (drawable); GdkWindow *parent; parent = (GdkWindow *)private->parent; if (!parent) parent = _gdk_parent_root; recompute_abs_positions (drawable, GDK_DRAWABLE_IMPL_FBDATA (parent)->abs_x, GDK_DRAWABLE_IMPL_FBDATA (parent)->abs_y, GDK_DRAWABLE_IMPL_FBDATA (parent)->llim_x, GDK_DRAWABLE_IMPL_FBDATA (parent)->llim_y, GDK_DRAWABLE_IMPL_FBDATA (parent)->lim_x, GDK_DRAWABLE_IMPL_FBDATA (parent)->lim_y); } else recompute_abs_positions (drawable, 0, 0, 0, 0, INT_MAX, INT_MAX);}voidgdk_fb_window_move_resize (GdkWindow *window, gint x, gint y, gint width, gint height, gboolean send_expose_events){ GdkWindowObject *private; gint dx, dy, dw, dh; gint i, draw_dir; GdkEvent *event; GdkWindow *mousewin; GdkRectangle root_rect; GdkRectangle update_rect; g_return_if_fail (window != NULL); g_return_if_fail (GDK_IS_WINDOW (window)); if (width < 1) width = 1; if (height < 1) height = 1; private = (GdkWindowObject*) window; if (private->parent && (private->parent->window_type != GDK_WINDOW_CHILD)) { GdkWindowChildHandlerData *data; data = g_object_get_data (G_OBJECT (private->parent), "gdk-window-child-handler"); if (data && (*data->changed) (window, x, y, width, height, data->user_data)) return; } if (!private->destroyed) { GdkRegion *old_region = NULL; if (private->input_only) send_expose_events = FALSE; if (GDK_WINDOW_IS_MAPPED (private) && send_expose_events) old_region = gdk_fb_clip_region (GDK_DRAWABLE_IMPL(window), NULL, TRUE, FALSE, FALSE); dx = x - private->x; dy = y - private->y; dw = width - GDK_DRAWABLE_IMPL_FBDATA (private)->width; dh = height - GDK_DRAWABLE_IMPL_FBDATA (private)->height; private->x = x; private->y = y; GDK_DRAWABLE_IMPL_FBDATA (private)->width = width; GDK_DRAWABLE_IMPL_FBDATA (private)->height = height; if (GDK_WINDOW_IS_MAPPED (private)) { recompute_drawable ((GdkDrawable *)window); if (send_expose_events) { GdkRegion *new_region, *region; gboolean handle_cursor = FALSE; new_region = gdk_fb_clip_region (GDK_DRAWABLE_IMPL (window), NULL, TRUE, FALSE, TRUE); region = gdk_region_copy (old_region); gdk_region_offset (region, dx, dy); gdk_region_intersect (region, new_region); if (region->numRects && ((dx != 0) || (dy != 0))) { GdkFBDrawingContext fbdc; if (gdk_fb_cursor_region_need_hide (old_region) || gdk_fb_cursor_region_need_hide (new_region)) { gdk_fb_cursor_hide (); handle_cursor = TRUE; } gdk_fb_drawing_context_init (&fbdc, GDK_DRAWABLE_IMPL (_gdk_parent_root), NULL, FALSE, FALSE); draw_dir = 1; if ((dy>0) || ((dy==0) && (dx>0))) draw_dir = -1; for (i=(draw_dir>0)?0:region->numRects-1;i >= 0 && i < region->numRects; i+=draw_dir) { GdkRegionBox *reg = ®ion->rects[i]; gdk_fb_draw_drawable_3 (GDK_DRAWABLE_IMPL(_gdk_parent_root), _gdk_fb_screen_gc, GDK_DRAWABLE_IMPL(_gdk_parent_root), &fbdc, (reg->x1 - dx), (reg->y1 - dy), (reg->x1), (reg->y1), (reg->x2 - reg->x1), (reg->y2 - reg->y1)); } gdk_fb_drawing_context_finalize (&fbdc); } gdk_shadow_fb_update (region->extents.x1, region->extents.y1, region->extents.x2, region->extents.y2); gdk_region_union (new_region, old_region); gdk_region_subtract (new_region, region); gdk_region_destroy (region); /* Clear the root window in new_region */ root_rect.x = 0; root_rect.y = 0; root_rect.width = gdk_screen_width(); root_rect.height = gdk_screen_height(); gdk_region_get_clipbox (new_region, &update_rect); if (gdk_rectangle_intersect (&update_rect, &root_rect, &update_rect)) gdk_window_clear_area (_gdk_parent_root, update_rect.x, update_rect.y, update_rect.width, update_rect.height); /* Invalidate regions in new_region */ gdk_window_invalidate_region (_gdk_parent_root, new_region, TRUE); if (handle_cursor) gdk_fb_cursor_unhide (); gdk_region_destroy (old_region); gdk_region_destroy (new_region); } /* Send GdkEventConfigure for toplevel windows */ if (private->window_type != GDK_WINDOW_CHILD) { GdkWindow *event_win; event_win = gdk_fb_other_event_window (window, GDK_CONFIGURE); if (event_win) { event = gdk_event_make (event_win, GDK_CONFIGURE, TRUE); event->configure.x = private->x; event->configure.y = private->y; event->configure.width = GDK_DRAWABLE_IMPL_FBDATA (private)->width; event->configure.height = GDK_DRAWABLE_IMPL_FBDATA (private)->height; } } /* The window the pointer is in might have changed */ mousewin = gdk_window_at_pointer (NULL, NULL); gdk_fb_window_send_crossing_events (NULL, mousewin, GDK_CROSSING_NORMAL); } }}voidgdk_window_move_resize (GdkWindow *window, gint x, gint y, gint width, gint height)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -