From f4331caf8345fbdae729bc124ae5174a08e57aec Mon Sep 17 00:00:00 2001 From: Cody Russell Date: Sun, 1 Mar 2009 08:55:50 -0500 Subject: [PATCH] grabs --- gdk/win32/gdkdrawable-win32.c | 56 ++++- gdk/win32/gdkevents-win32.c | 457 ++++++++++++++++------------------ gdk/win32/gdkgeometry-win32.c | 52 +++- gdk/win32/gdkwindow-win32.c | 83 +++--- 4 files changed, 360 insertions(+), 288 deletions(-) diff --git a/gdk/win32/gdkdrawable-win32.c b/gdk/win32/gdkdrawable-win32.c index b9fe1f9959..4ccf0b3b60 100644 --- a/gdk/win32/gdkdrawable-win32.c +++ b/gdk/win32/gdkdrawable-win32.c @@ -1657,6 +1657,31 @@ _gdk_win32_blit (gboolean use_fg_bg, else g_assert_not_reached (); + if (GDK_IS_WINDOW_IMPL_WIN32 (draw_impl) && + GDK_IS_PIXMAP_IMPL_WIN32 (src_impl)) + { + GdkPixmapImplWin32 *src_pixmap = GDK_PIXMAP_IMPL_WIN32 (src_impl); + + if (xsrc < 0) + { + width += xsrc; + xdest -= xsrc; + xsrc = 0; + } + + if (ysrc < 0) + { + height += ysrc; + ydest -= ysrc; + ysrc = 0; + } + + if (xsrc + width > src_pixmap->width) + width = src_pixmap->width - xsrc; + if (ysrc + height > src_pixmap->height) + height = src_pixmap->height - ysrc; + } + hdc = gdk_win32_hdc_get (&draw_impl->parent_instance, gc, GDK_GC_FOREGROUND); gdk_drawable_get_size (src, &src_width, &src_height); @@ -1812,7 +1837,9 @@ _gdk_win32_drawable_acquire_dc (GdkDrawable *drawable) return impl->hdc; } else - return NULL; + { + return NULL; + } } /** @@ -1854,13 +1881,20 @@ _gdk_windowing_create_cairo_surface (GdkDrawable *drawable, gint width, gint height) { - GdkDrawableImplWin32 *impl = GDK_DRAWABLE_IMPL_WIN32 (drawable); + GdkDrawableImplWin32 *impl = GDK_DRAWABLE_IMPL_WIN32 (drawable); + RECT rect; - HDC hdc = _gdk_win32_drawable_acquire_dc (drawable); - if (!hdc) - return NULL; + HDC hdc = _gdk_win32_drawable_acquire_dc (drawable); + if (!hdc) + { + return NULL; + } - return cairo_win32_surface_create (hdc); + GetClipBox (hdc, &rect); + g_print ("create_cairo_surface(): [%d %d %d %d]\n", + rect.left, rect.top, rect.right, rect.bottom); + + return cairo_win32_surface_create (hdc); } static void @@ -1890,7 +1924,9 @@ gdk_win32_ref_cairo_surface (GdkDrawable *drawable) drawable, gdk_win32_cairo_surface_destroy); } else - cairo_surface_reference (impl->cairo_surface); + { + cairo_surface_reference (impl->cairo_surface); + } return impl->cairo_surface; } @@ -1901,6 +1937,7 @@ _gdk_windowing_set_cairo_surface_size (cairo_surface_t *surface, gint height) { // Do nothing. The surface size is determined by the DC + g_print ("*** set_cairo_surface_size()\n"); } static gint @@ -1946,9 +1983,10 @@ _gdk_win32_drawable_finish (GdkDrawable *drawable) if (impl->cairo_surface) { cairo_surface_finish (impl->cairo_surface); - cairo_surface_set_user_data (impl->cairo_surface, &gdk_win32_cairo_key, - NULL, NULL); + cairo_surface_set_user_data (impl->cairo_surface, &gdk_win32_cairo_key, NULL, NULL); } + + g_print ("hdc_count == %d\n", impl->hdc_count); //g_assert (impl->hdc_count == 0); } diff --git a/gdk/win32/gdkevents-win32.c b/gdk/win32/gdkevents-win32.c index ec0b06690b..38651c8c57 100644 --- a/gdk/win32/gdkevents-win32.c +++ b/gdk/win32/gdkevents-win32.c @@ -1,7 +1,7 @@ /* GDK - The GIMP Drawing Kit * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald * Copyright (C) 1998-2002 Tor Lillqvist - * Copyright (C) 2007-2008 Cody Russell + * Copyright (C) 2007-2009 Cody Russell * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -99,6 +99,7 @@ static gboolean is_modally_blocked (GdkWindow *window); /* Private variable declarations */ +#if 0 static GdkWindow *p_grab_window = NULL; /* Window that currently holds * the pointer grab */ @@ -108,6 +109,7 @@ static GdkWindow *p_grab_confine_to = NULL; static GdkWindow *k_grab_window = NULL; /* Window the holds the * keyboard grab */ +#endif static GList *client_filters; /* Filters for client messages */ @@ -482,131 +484,43 @@ gdk_pointer_grab (GdkWindow *window, GdkCursor *cursor, guint32 time) { - HCURSOR hcursor; - GdkCursorPrivate *cursor_private; - gint return_val = GDK_GRAB_SUCCESS; + GdkWindow *native; - g_return_val_if_fail (window != NULL, 0); g_return_val_if_fail (GDK_IS_WINDOW (window), 0); g_return_val_if_fail (confine_to == NULL || GDK_IS_WINDOW (confine_to), 0); - - cursor_private = (GdkCursorPrivate*) cursor; - - if (!cursor) - hcursor = NULL; - else if ((hcursor = CopyCursor (cursor_private->hcursor)) == NULL) - WIN32_API_FAILED ("CopyCursor"); - return_val = _gdk_input_grab_pointer (window, - owner_events, - event_mask, - confine_to, - time); + native = gdk_window_get_toplevel (window); - if (return_val == GDK_GRAB_SUCCESS) - { - if (!GDK_WINDOW_DESTROYED (window)) - { - GDK_NOTE (EVENTS, g_print ("%sgdk_pointer_grab: %p %s %p %s%s", - (debug_indent > 0 ? "\n" : ""), - GDK_WINDOW_HWND (window), - (owner_events ? "TRUE" : "FALSE"), - hcursor, - event_mask_string (event_mask), - (debug_indent == 0 ? "\n" : ""))); + if (!GDK_IS_WINDOW_IMPL_WIN32 (GDK_WINDOW_OBJECT (native)->impl)) + return GDK_GRAB_SUCCESS; - p_grab_mask = event_mask; - p_grab_owner_events = owner_events; - p_grab_automatic = FALSE; - - SetCapture (GDK_WINDOW_HWND (window)); - return_val = GDK_GRAB_SUCCESS; - } - else - return_val = GDK_GRAB_ALREADY_GRABBED; - } - - if (return_val == GDK_GRAB_SUCCESS) - { - GdkWindowImplWin32 *impl = GDK_WINDOW_IMPL_WIN32 (((GdkWindowObject *) window)->impl); + if (!_gdk_window_has_impl (window) && + !gdk_window_is_viewable (window)) + return GDK_GRAB_NOT_VIEWABLE; - if (p_grab_window != NULL && p_grab_window != window) - generate_grab_broken_event (p_grab_window, FALSE, window); - - assign_object (&p_grab_window, window); + _gdk_display_add_pointer_grab (_gdk_display, + window, + native, + owner_events, + event_mask, + 0, + time, + FALSE); - if (p_grab_cursor != NULL) - { - if (GetCursor () == p_grab_cursor) - SetCursor (NULL); - DestroyCursor (p_grab_cursor); - } - - p_grab_cursor = hcursor; - - if (p_grab_cursor != NULL) - SetCursor (p_grab_cursor); - else if (impl->hcursor != NULL) - SetCursor (impl->hcursor); - else - SetCursor (LoadCursor (NULL, IDC_ARROW)); - - if (confine_to != NULL) - { - gint x, y, width, height; - RECT rect; - - gdk_window_get_origin (confine_to, &x, &y); - gdk_drawable_get_size (confine_to, &width, &height); - - x -= _gdk_offset_x; - y -= _gdk_offset_y; - - rect.left = x; - rect.top = y; - rect.right = x + width; - rect.bottom = y + height; - API_CALL (ClipCursor, (&rect)); - p_grab_confine_to = confine_to; - } - - /* FIXME: Generate GDK_CROSSING_GRAB events */ - } - - return return_val; + return GDK_GRAB_SUCCESS; } void gdk_display_pointer_ungrab (GdkDisplay *display, guint32 time) { - g_return_if_fail (display == _gdk_display); + GdkPointerGrabInfo *info; - GDK_NOTE (EVENTS, g_print ("%sgdk_display_pointer_ungrab%s", - (debug_indent > 0 ? "\n" : ""), - (debug_indent == 0 ? "\n" : ""))); + info = _gdk_display_get_last_pointer_grab (display); + if (info) + info->serial_end = 0; - _gdk_input_ungrab_pointer (time); - - if (GetCapture () != NULL) - ReleaseCapture (); - - /* FIXME: Generate GDK_CROSSING_UNGRAB events */ - - assign_object (&p_grab_window, NULL); - if (p_grab_cursor != NULL) - { - if (GetCursor () == p_grab_cursor) - SetCursor (NULL); - DestroyCursor (p_grab_cursor); - p_grab_cursor = NULL; - } - - if (p_grab_confine_to != NULL) - { - API_CALL (ClipCursor, (NULL)); - p_grab_confine_to = NULL; - } + _gdk_display_pointer_grab_update (display, 0); } static GdkWindow * @@ -632,13 +546,19 @@ find_real_window_for_grabbed_mouse_event (GdkWindow* reported_window, GetClientRect (hwnd, &rect); ScreenToClient (hwnd, &pt); if (!PtInRect (&rect, pt)) - return _gdk_root; + { + g_print ("find_real_window_for_grabbed_mouse_event(), PtInRect() failed\n"); + return _gdk_root; + } other_window = gdk_win32_handle_table_lookup ((GdkNativeWindow) hwnd); } if (other_window == NULL) - return _gdk_root; + { + g_print ("find_real_window_for_grabbed_mouse_event(), other_window == NULL\n"); + return _gdk_root; + } return other_window; } @@ -647,139 +567,54 @@ static GdkWindow* find_window_for_mouse_event (GdkWindow* reported_window, MSG* msg) { + GdkPointerGrabInfo *info = _gdk_display_get_last_pointer_grab (_gdk_display); + + if (!info || !info->window || !info->owner_events) + return reported_window; + else + return find_real_window_for_grabbed_mouse_event (reported_window, msg); + +#if 0 if (p_grab_window == NULL || !p_grab_owner_events) return reported_window; else return find_real_window_for_grabbed_mouse_event (reported_window, msg); -} - -#if 0 -gboolean -gdk_display_pointer_is_grabbed (GdkDisplay *display) -{ - g_return_val_if_fail (display == _gdk_display, FALSE); - GDK_NOTE (EVENTS, g_print ("gdk_pointer_is_grabbed: %s\n", - p_grab_window != NULL ? "TRUE" : "FALSE")); - return p_grab_window != NULL; -} #endif - -#if 0 -gboolean -gdk_pointer_grab_info_libgtk_only (GdkDisplay *display, - GdkWindow **grab_window, - gboolean *owner_events) -{ - g_return_val_if_fail (display == _gdk_display, FALSE); - - if (p_grab_window != NULL) - { - if (grab_window) - *grab_window = p_grab_window; - if (owner_events) - *owner_events = p_grab_owner_events; - - return TRUE; - } - else - return FALSE; } -#endif GdkGrabStatus gdk_keyboard_grab (GdkWindow *window, gboolean owner_events, guint32 time) { - GdkWindow *real_focus_window, *grab_focus_window; + GdkDisplay *display; + GdkWindow *toplevel; - gint return_val; - g_return_val_if_fail (window != NULL, 0); g_return_val_if_fail (GDK_IS_WINDOW (window), 0); GDK_NOTE (EVENTS, g_print ("gdk_keyboard_grab %p%s\n", GDK_WINDOW_HWND (window), owner_events ? " OWNER_EVENTS" : "")); - if (!GDK_WINDOW_DESTROYED (window)) - { - k_grab_owner_events = owner_events; - return_val = GDK_GRAB_SUCCESS; - } - else - return_val = GDK_GRAB_ALREADY_GRABBED; + display = gdk_drawable_get_display (window); + toplevel = gdk_window_get_toplevel (window); - if (return_val == GDK_GRAB_SUCCESS) - { - if (k_grab_window != NULL && k_grab_window != window) - generate_grab_broken_event (k_grab_window, TRUE, window); + _gdk_display_set_has_keyboard_grab (display, + window, + toplevel, + owner_events, + 0, + time); - assign_object (&k_grab_window, window); - - if (!k_grab_owner_events) - { - real_focus_window = gdk_win32_handle_table_lookup ((GdkNativeWindow) GetFocus ()); - if (real_focus_window) - real_focus_window = gdk_window_get_toplevel (real_focus_window); - grab_focus_window = gdk_window_get_toplevel (k_grab_window); - if (real_focus_window != grab_focus_window) - { - /* Generate events for focus change from the window that really - * has focus to the grabber. - */ - if (real_focus_window && !GDK_WINDOW_DESTROYED (real_focus_window) - && (((GdkWindowObject *) real_focus_window)->event_mask - & GDK_FOCUS_CHANGE_MASK)) - generate_focus_event (real_focus_window, FALSE); - - if (((GdkWindowObject *) grab_focus_window)->event_mask - & GDK_FOCUS_CHANGE_MASK) - generate_focus_event (grab_focus_window, TRUE); - } - } - } - - return return_val; + return GDK_GRAB_SUCCESS; } void gdk_display_keyboard_ungrab (GdkDisplay *display, guint32 time) { - GdkWindow *real_focus_window, *grab_focus_window; - - g_return_if_fail (display == _gdk_display); - GDK_NOTE (EVENTS, g_print ("gdk_display_keyboard_ungrab\n")); - - if (k_grab_window && !k_grab_owner_events) - { - real_focus_window = gdk_win32_handle_table_lookup ((GdkNativeWindow) GetFocus ()); - if (real_focus_window) - real_focus_window = gdk_window_get_toplevel (real_focus_window); - if (!GDK_WINDOW_DESTROYED (k_grab_window)) - grab_focus_window = gdk_window_get_toplevel (k_grab_window); - else - grab_focus_window = NULL; - if (real_focus_window != grab_focus_window) - { - /* Generate events for focus change from grabber to the window that - * really has focus. Important for example if a new window is created - * while focus is grabbed. - */ - if (grab_focus_window - && (((GdkWindowObject *) grab_focus_window)->event_mask - & GDK_FOCUS_CHANGE_MASK)) - generate_focus_event (grab_focus_window, FALSE); - - if (real_focus_window && !GDK_WINDOW_DESTROYED (real_focus_window) - && (((GdkWindowObject *) real_focus_window)->event_mask - & GDK_FOCUS_CHANGE_MASK)) - generate_focus_event (real_focus_window, TRUE); - } - } - - assign_object (&k_grab_window, NULL); + _gdk_display_unset_has_keyboard_grab (display, FALSE); } void @@ -792,7 +627,7 @@ gdk_display_add_client_message_filter (GdkDisplay *display, gdk_add_client_message_filter (message_type, func, data); } -void +void gdk_add_client_message_filter (GdkAtom message_type, GdkFilterFunc func, gpointer data) @@ -1390,7 +1225,7 @@ synthesize_enter_or_leave_event (GdkWindow *window, event->crossing.detail = detail; event->crossing.focus = TRUE; /* FIXME: Set correctly */ event->crossing.state = 0; /* FIXME: Set correctly */ - + append_event (event); if (type == GDK_ENTER_NOTIFY && @@ -1405,8 +1240,11 @@ synthesize_leave_event (GdkWindow *window, GdkNotifyType detail) { POINT pt; + GdkPointerGrabInfo *grab; - if (p_grab_window != NULL && !p_grab_owner_events && !(p_grab_mask & GDK_LEAVE_NOTIFY_MASK)) + grab = _gdk_display_get_last_pointer_grab (_gdk_display); + + if (grab && grab->window != NULL && !grab->owner_events && !(grab->event_mask & GDK_LEAVE_NOTIFY_MASK)) return; if (!(((GdkWindowObject *) window)->event_mask & GDK_LEAVE_NOTIFY_MASK)) @@ -1439,8 +1277,11 @@ synthesize_enter_event (GdkWindow *window, GdkNotifyType detail) { POINT pt; + GdkPointerGrabInfo *grab; - if (p_grab_window != NULL && !p_grab_owner_events && !(p_grab_mask & GDK_ENTER_NOTIFY_MASK)) + grab = _gdk_display_get_last_pointer_grab (_gdk_display); + + if (grab && grab->window != NULL && !grab->owner_events && !(grab->event_mask & GDK_ENTER_NOTIFY_MASK)) return; if (!(((GdkWindowObject *) window)->event_mask & GDK_ENTER_NOTIFY_MASK)) @@ -1473,6 +1314,7 @@ synthesize_enter_events (GdkWindow *from, if (prev != from) synthesize_enter_events (from, prev, msg, mode, detail); + synthesize_enter_event (to, msg, mode, detail); } @@ -1486,6 +1328,7 @@ synthesize_leave_events (GdkWindow *from, GdkWindow *next = gdk_window_get_parent (from); synthesize_leave_event (from, msg, mode, detail); + if (next != to) synthesize_leave_events (next, to, msg, mode, detail); } @@ -1842,6 +1685,7 @@ handle_configure_event (MSG *msg, GetClientRect (msg->hwnd, &client_rect); point.x = client_rect.left; /* always 0 */ point.y = client_rect.top; + /* top level windows need screen coords */ if (gdk_window_get_parent (window) == _gdk_root) { @@ -1857,6 +1701,8 @@ handle_configure_event (MSG *msg, window_object->x = point.x; window_object->y = point.y; + + _gdk_window_update_size (window); if (window_object->event_mask & GDK_STRUCTURE_MASK) { @@ -2021,13 +1867,10 @@ handle_wm_paint (MSG *msg, update_region = _gdk_win32_hrgn_to_region (hrgn); + //_gdk_win32_windowing_window_get_offsets (window, &xoffset, &yoffset); //gdk_region_offset (update_region, xoffset, yoffset); - // g_print ("handle_wm_paint: rect [%d %d %d %d]\n", - // update_region->x, update_region->y, - // update_region->width, update_region->height); - _gdk_window_process_expose (window, update_region); gdk_region_destroy (update_region); @@ -2268,6 +2111,11 @@ gdk_event_translate (MSG *msg, GdkWindow *orig_window, *new_window; + GdkPointerGrabInfo *grab = NULL; + GdkWindow *grab_window = NULL; + guint grab_mask = 0; + gboolean grab_owner_events = FALSE; + static gint update_colors_counter = 0; gint button; GdkAtom target; @@ -2444,11 +2292,19 @@ gdk_event_translate (MSG *msg, /* Let the system handle Alt-Tab, Alt-Space and Alt-F4 unless * the keyboard is grabbed. */ +#if 0 if (k_grab_window == NULL && (msg->wParam == VK_TAB || msg->wParam == VK_SPACE || msg->wParam == VK_F4)) break; +#else + if (_gdk_display->keyboard_grab.window == NULL && + (msg->wParam == VK_TAB || + msg->wParam == VK_SPACE || + msg->wParam == VK_F4)) + break; +#endif /* Jump to code in common with WM_KEYUP and WM_KEYDOWN */ goto keyup_or_down; @@ -2469,7 +2325,9 @@ gdk_event_translate (MSG *msg, break; if (!propagate (&window, msg, - k_grab_window, k_grab_owner_events, GDK_ALL_EVENTS_MASK, + _gdk_display->keyboard_grab.window, + _gdk_display->keyboard_grab.owner_events, + GDK_ALL_EVENTS_MASK, doesnt_want_key, FALSE)) break; @@ -2571,7 +2429,9 @@ gdk_event_translate (MSG *msg, break; if (!propagate (&window, msg, - k_grab_window, k_grab_owner_events, GDK_ALL_EVENTS_MASK, + _gdk_display->keyboard_grab.window, + _gdk_display->keyboard_grab.owner_events, + GDK_ALL_EVENTS_MASK, doesnt_want_char, FALSE)) break; @@ -2637,6 +2497,36 @@ gdk_event_translate (MSG *msg, assign_object (&window, find_window_for_mouse_event (window, msg)); + grab = _gdk_display_get_last_pointer_grab (_gdk_display); + if (grab) + { + grab_window = grab->window; + grab_mask = grab->event_mask; + grab_owner_events = grab->owner_events; + } + + if (grab_window != NULL) + { + GdkWindow *real_window = find_real_window_for_grabbed_mouse_event (window, msg); + + if (real_window != current_window) + { + synthesize_crossing_events (real_window, GDK_CROSSING_NORMAL, msg); + } + } + else + { + if (window != current_window) + { + synthesize_crossing_events (window, GDK_CROSSING_NORMAL, msg); + } + } + + if (!propagate (&window, msg, grab_window, grab_owner_events, grab_mask, + doesnt_want_button_press, TRUE)) + break; + +#if 0 if (p_grab_window != NULL) { GdkWindow *real_window = find_real_window_for_grabbed_mouse_event (window, msg); @@ -2654,10 +2544,12 @@ gdk_event_translate (MSG *msg, p_grab_window, p_grab_owner_events, p_grab_mask, doesnt_want_button_press, TRUE)) break; +#endif if (GDK_WINDOW_DESTROYED (window)) break; +#if 0 /* Emulate X11's automatic active grab */ if (!p_grab_window) { @@ -2669,6 +2561,9 @@ gdk_event_translate (MSG *msg, NULL, NULL, 0); p_grab_automatic = TRUE; } +#endif + + g_print ("generate_button_event()\n"); generate_button_event (GDK_BUTTON_PRESS, button, window, orig_window, msg); @@ -2701,6 +2596,7 @@ gdk_event_translate (MSG *msg, assign_object (&window, find_window_for_mouse_event (window, msg)); +#if 0 if (p_grab_window != NULL) { GdkWindow *real_window = find_real_window_for_grabbed_mouse_event (window, msg); @@ -2713,6 +2609,10 @@ gdk_event_translate (MSG *msg, if (window != current_window) synthesize_crossing_events (window, GDK_CROSSING_NORMAL, msg); } +#else + if (window != current_window) + synthesize_crossing_events (window, GDK_CROSSING_NORMAL, msg); +#endif #if 0 if (((GdkWindowObject *) window)->extension_events != 0 && @@ -2723,6 +2623,7 @@ gdk_event_translate (MSG *msg, } #endif +#if 0 if (!propagate (&window, msg, p_grab_window, p_grab_owner_events, p_grab_mask, doesnt_want_button_release, TRUE)) @@ -2733,7 +2634,15 @@ gdk_event_translate (MSG *msg, generate_button_event (GDK_BUTTON_RELEASE, button, window, orig_window, msg); } +#else + if (!GDK_WINDOW_DESTROYED (window)) + { + generate_button_event (GDK_BUTTON_RELEASE, button, + window, orig_window, msg); + } +#endif +#if 0 if (p_grab_window != NULL && p_grab_automatic && (msg->wParam & (MK_LBUTTON | MK_MBUTTON | MK_RBUTTON)) == 0) @@ -2741,6 +2650,7 @@ gdk_event_translate (MSG *msg, /* Terminate automatic grab */ gdk_pointer_ungrab (0); } +#endif return_val = TRUE; break; @@ -2764,6 +2674,52 @@ gdk_event_translate (MSG *msg, assign_object (&window, find_window_for_mouse_event (window, msg)); + if (window != current_window) + synthesize_crossing_events (window, GDK_CROSSING_NORMAL, msg); + + GdkPointerGrabInfo *grab = _gdk_display_get_last_pointer_grab (_gdk_display); + if (grab != NULL) + { + grab_window = grab->window; + grab_owner_events = grab->owner_events; + grab_mask = grab->event_mask; + } + + if (grab_window != NULL) + { + GdkWindow *real_window = find_real_window_for_grabbed_mouse_event (window, msg); + + if (real_window != current_window) + { + if (grab_owner_events) + { + synthesize_crossing_events (real_window, GDK_CROSSING_NORMAL, msg); + } + else if (current_window == grab_window) + { + synthesize_leave_event (grab_window, msg, GDK_CROSSING_NORMAL, GDK_NOTIFY_ANCESTOR); + assign_object (¤t_window, _gdk_root); + } + else if (real_window == grab_window) + { + synthesize_enter_event (grab_window, msg, GDK_CROSSING_NORMAL, GDK_NOTIFY_ANCESTOR); + assign_object (¤t_window, grab_window); + } + } + } + else + { + if (window != current_window) + { + synthesize_crossing_events (window, GDK_CROSSING_NORMAL, msg); + } + } + + if (!propagate (&window, msg, grab_window, grab_owner_events, grab_mask, + doesnt_want_button_motion, TRUE)) + break; + +#if 0 if (p_grab_window != NULL) { GdkWindow *real_window = find_real_window_for_grabbed_mouse_event (window, msg); @@ -2789,19 +2745,28 @@ gdk_event_translate (MSG *msg, else { if (window != current_window) - synthesize_crossing_events (window, GDK_CROSSING_NORMAL, msg); + { + synthesize_crossing_events (window, GDK_CROSSING_NORMAL, msg); + } } if (!propagate (&window, msg, p_grab_window, p_grab_owner_events, p_grab_mask, doesnt_want_button_motion, TRUE)) - break; + { + g_print ("!propagate\n"); + break; + } +#endif if (GDK_WINDOW_DESTROYED (window)) break; if (window != orig_window) - translate_mouse_coords (orig_window, window, msg); + { + g_print ("translate_mouse_coords()\n"); + translate_mouse_coords (orig_window, window, msg); + } event = gdk_event_new (GDK_MOTION_NOTIFY); event->motion.window = window; @@ -2881,10 +2846,12 @@ gdk_event_translate (MSG *msg, assign_object (&window, new_window); } +#if 0 if (!propagate (&window, msg, p_grab_window, p_grab_owner_events, p_grab_mask, doesnt_want_scroll, TRUE)) break; +#endif if (GDK_WINDOW_DESTROYED (window)) break; @@ -3001,16 +2968,16 @@ gdk_event_translate (MSG *msg, break; case WM_KILLFOCUS: - if (p_grab_window != NULL && !GDK_WINDOW_DESTROYED (p_grab_window)) - generate_grab_broken_event (p_grab_window, FALSE, NULL); - - if (k_grab_window != NULL && !GDK_WINDOW_DESTROYED (k_grab_window) - && k_grab_window != p_grab_window) - generate_grab_broken_event (k_grab_window, TRUE, NULL); + if (_gdk_display->keyboard_grab.window != NULL && + !GDK_WINDOW_DESTROYED (_gdk_display->keyboard_grab.window)) + { + generate_grab_broken_event (_gdk_display->keyboard_grab.window, FALSE, NULL); + } /* fallthrough */ case WM_SETFOCUS: - if (k_grab_window != NULL && !k_grab_owner_events) + if (_gdk_display->keyboard_grab.window != NULL && + !_gdk_display->keyboard_grab.owner_events) break; if (!(((GdkWindowObject *) window)->event_mask & GDK_FOCUS_CHANGE_MASK)) @@ -3047,10 +3014,16 @@ gdk_event_translate (MSG *msg, GDK_NOTE (EVENTS, g_print (" %#x %#x", LOWORD (msg->lParam), HIWORD (msg->lParam))); - if (p_grab_window == NULL && LOWORD (msg->lParam) != HTCLIENT) + grab = _gdk_display_get_last_pointer_grab (_gdk_display); + if (grab != NULL) + { + grab_window = grab->window; + } + + if (grab_window == NULL && LOWORD (msg->lParam) != HTCLIENT) break; - if (p_grab_window != NULL && p_grab_cursor != NULL) + if (grab_window != NULL && p_grab_cursor != NULL) hcursor = p_grab_cursor; else if (!GDK_WINDOW_DESTROYED (window)) hcursor = GDK_WINDOW_IMPL_WIN32 (((GdkWindowObject *) window)->impl)->hcursor; @@ -3100,6 +3073,7 @@ gdk_event_translate (MSG *msg, SetForegroundWindow (GDK_WINDOW_HWND (impl->transient_owner)); } +#if 0 if (p_grab_window == window) { gdk_pointer_ungrab (msg->time); @@ -3109,6 +3083,7 @@ gdk_event_translate (MSG *msg, { gdk_keyboard_ungrab (msg->time); } +#endif } return_val = TRUE; @@ -3139,11 +3114,13 @@ gdk_event_translate (MSG *msg, { /* Don't generate any GDK event. This is *not* an UNMAP. */ +#if 0 if (p_grab_window == window) gdk_pointer_ungrab (msg->time); if (k_grab_window == window) gdk_keyboard_ungrab (msg->time); +#endif gdk_synthesize_window_state (window, GDK_WINDOW_STATE_WITHDRAWN, @@ -3583,11 +3560,13 @@ gdk_event_translate (MSG *msg, if (window == current_window) assign_object (¤t_window, _gdk_root); +#if 0 if (p_grab_window == window) gdk_pointer_ungrab (msg->time); if (k_grab_window == window) gdk_keyboard_ungrab (msg->time); +#endif if ((window != NULL) && (msg->hwnd != GetDesktopWindow ())) gdk_window_destroy_notify (window); diff --git a/gdk/win32/gdkgeometry-win32.c b/gdk/win32/gdkgeometry-win32.c index ec89cec9e8..833fc5b625 100644 --- a/gdk/win32/gdkgeometry-win32.c +++ b/gdk/win32/gdkgeometry-win32.c @@ -49,6 +49,9 @@ typedef struct _GdkWindowParentPos GdkWindowParentPos; +static void tmp_unset_bg (GdkWindow *window); +static void tmp_reset_bg (GdkWindow *window); + void _gdk_window_move_resize_child (GdkWindow *window, gint x, @@ -67,8 +70,8 @@ _gdk_window_move_resize_child (GdkWindow *window, obj = GDK_WINDOW_OBJECT (window); impl = GDK_WINDOW_IMPL_WIN32 (obj->impl); - is_move = 0; // (x - obj->x != 0) && (y - obj->y != 0); - is_resize = 0; // obj->width != width && obj->height != height; + is_move = (x - obj->x != 0) && (y - obj->y != 0); + is_resize = obj->width != width && obj->height != height; GDK_NOTE (MISC, g_print ("_gdk_window_move_resize_child: %s@%+d%+d %dx%d@%+d%+d\n", _gdk_win32_drawable_description (window), @@ -108,7 +111,7 @@ _gdk_window_move_resize_child (GdkWindow *window, (is_resize ? 0 : SWP_NOSIZE))); //_gdk_win32_window_tmp_reset_parent_bg (window); - //_gdk_win32_window_tmp_reset_bg (window, TRUE); + _gdk_win32_window_tmp_reset_bg (window, TRUE); } void @@ -185,6 +188,18 @@ tmp_unset_bg (GdkWindow *window) } } +static void +tmp_reset_bg (GdkWindow *window) +{ + GdkWindowObject *obj; + GdkWindowImplWin32 *impl; + + obj = GDK_WINDOW_OBJECT (window); + impl = GDK_WINDOW_IMPL_WIN32 (obj->impl); + + impl->no_bg = FALSE; +} + void _gdk_win32_window_tmp_unset_parent_bg (GdkWindow *window) { @@ -197,6 +212,36 @@ _gdk_win32_window_tmp_unset_parent_bg (GdkWindow *window) _gdk_win32_window_tmp_unset_bg (window, FALSE); } +void +_gdk_win32_window_tmp_reset_bg (GdkWindow *window, + gboolean recurse) +{ + GdkWindowObject *private; + + g_return_if_fail (GDK_IS_WINDOW (window)); + + if (private->input_only || private->destroyed || + (private->window_type != GDK_WINDOW_ROOT && !GDK_WINDOW_IS_MAPPED (window))) + return; + + if (_gdk_window_has_impl (window) && + GDK_WINDOW_IS_WIN32 (window) && + private->window_type != GDK_WINDOW_ROOT && + private->window_type != GDK_WINDOW_FOREIGN) + { + tmp_reset_bg (window); + } + + if (recurse) + { + GList *l; + + for (l = private->children; l != NULL; l = l->next) + _gdk_win32_window_tmp_reset_bg (l->data, TRUE); + } +} + +/* void _gdk_win32_window_tmp_reset_bg (GdkWindow *window) { @@ -208,6 +253,7 @@ _gdk_win32_window_tmp_reset_bg (GdkWindow *window) impl->no_bg = FALSE; } +*/ #if 0 static GdkRegion * diff --git a/gdk/win32/gdkwindow-win32.c b/gdk/win32/gdkwindow-win32.c index c0f18b0248..d220da1878 100644 --- a/gdk/win32/gdkwindow-win32.c +++ b/gdk/win32/gdkwindow-win32.c @@ -2,7 +2,7 @@ * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald * Copyright (C) 1998-2004 Tor Lillqvist * Copyright (C) 2001-2004 Hans Breuer - * Copyright (C) 2007 Cody Russell + * Copyright (C) 2007-2009 Cody Russell * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -235,15 +235,19 @@ gdk_window_impl_win32_set_colormap (GdkDrawable *drawable, void _gdk_root_window_size_init (void) { - GdkWindowImplWin32 *impl; + GdkWindowObject *window_object; + //GdkWindowImplWin32 *impl; GdkRectangle rect; int i; - impl = GDK_WINDOW_IMPL_WIN32 (((GdkWindowObject *) _gdk_root)->impl); + window_object = GDK_WINDOW_OBJECT (_gdk_root); + //impl = GDK_WINDOW_IMPL_WIN32 (((GdkWindowObject *) _gdk_root)->impl); rect = _gdk_monitors[0].rect; for (i = 1; i < _gdk_num_monitors; i++) gdk_rectangle_union (&rect, &_gdk_monitors[i].rect, &rect); + window_object->width = rect.width; + window_object->height = rect.height; //impl->width = rect.width; //impl->height = rect.height; } @@ -526,15 +530,15 @@ _gdk_window_impl_new (GdkWindow *window, private->depth = visual->depth; if (attributes_mask & GDK_WA_COLORMAP) - { - draw_impl->colormap = attributes->colormap; - g_object_ref (attributes->colormap); - } - else - { - draw_impl->colormap = gdk_screen_get_system_colormap (_gdk_screen); - g_object_ref (draw_impl->colormap); - } + { + draw_impl->colormap = attributes->colormap; + g_object_ref (attributes->colormap); + } + else + { + draw_impl->colormap = gdk_screen_get_system_colormap (_gdk_screen); + g_object_ref (draw_impl->colormap); + } } else { @@ -555,25 +559,25 @@ _gdk_window_impl_new (GdkWindow *window, case GDK_WINDOW_TOPLEVEL: case GDK_WINDOW_DIALOG: if (GDK_WINDOW_TYPE (private->parent) != GDK_WINDOW_ROOT) - { - /* The common code warns for this case. */ - hparent = GetDesktopWindow (); - } + { + /* The common code warns for this case. */ + hparent = GetDesktopWindow (); + } /* Children of foreign windows aren't toplevel windows */ if (GDK_WINDOW_TYPE (orig_parent) == GDK_WINDOW_FOREIGN) - { - dwStyle = WS_CHILDWINDOW | WS_CLIPCHILDREN; - } + { + dwStyle = WS_CHILDWINDOW | WS_CLIPCHILDREN; + } else - { - if (private->window_type == GDK_WINDOW_TOPLEVEL) - dwStyle = WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN; - else - dwStyle = WS_OVERLAPPED | WS_MINIMIZEBOX | WS_SYSMENU | WS_CAPTION | WS_THICKFRAME | WS_CLIPCHILDREN; + { + if (private->window_type == GDK_WINDOW_TOPLEVEL) + dwStyle = WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN; + else + dwStyle = WS_OVERLAPPED | WS_MINIMIZEBOX | WS_SYSMENU | WS_CAPTION | WS_THICKFRAME | WS_CLIPCHILDREN; - offset_x = _gdk_offset_x; - offset_y = _gdk_offset_y; - } + offset_x = _gdk_offset_x; + offset_y = _gdk_offset_y; + } break; /* @@ -2073,14 +2077,19 @@ gdk_win32_window_set_background (GdkWindow *window, static void gdk_win32_window_set_back_pixmap (GdkWindow *window, - GdkPixmap *pixmap) + GdkPixmap *pixmap) { GdkWindowObject *private = (GdkWindowObject *)window; + if (private->bg_pixmap && + private->bg_pixmap != GDK_PARENT_RELATIVE_BG && + private->bg_pixmap != GDK_NO_BG) + g_object_unref (private->bg_pixmap); + if (pixmap == GDK_PARENT_RELATIVE_BG || pixmap == GDK_NO_BG) - { - private->bg_pixmap = pixmap; - } + { + private->bg_pixmap = pixmap; + } } static void @@ -2289,15 +2298,15 @@ gdk_win32_window_get_origin (GdkWindow *window, static gboolean gdk_win32_window_get_deskrelative_origin (GdkWindow *window, - gint *x, - gint *y) + gint *x, + gint *y) { return gdk_window_get_origin (window, x, y); } static void gdk_win32_window_restack_under (GdkWindow *window, - GList *native_siblings) + GList *native_siblings) { // ### TODO } @@ -2462,9 +2471,9 @@ gdk_display_warp_pointer (GdkDisplay *display, GdkWindow* _gdk_windowing_window_at_pointer (GdkDisplay *display, - gint *win_x, - gint *win_y, - GdkModifierType *mask) + gint *win_x, + gint *win_y, + GdkModifierType *mask) { GdkWindow *window; POINT point, pointc;