diff options
Diffstat (limited to 'gdk/win32/gdkevents-win32.c')
-rw-r--r-- | gdk/win32/gdkevents-win32.c | 266 |
1 files changed, 132 insertions, 134 deletions
diff --git a/gdk/win32/gdkevents-win32.c b/gdk/win32/gdkevents-win32.c index 219da60b03..b5c6174473 100644 --- a/gdk/win32/gdkevents-win32.c +++ b/gdk/win32/gdkevents-win32.c @@ -47,8 +47,10 @@ #include "gdk.h" #include "gdkprivate-win32.h" -#include "gdkinput-win32.h" #include "gdkkeysyms.h" +#include "gdkdevicemanager-win32.h" +#include "gdkdeviceprivate.h" +#include "gdkdevice-wintab.h" #include <windowsx.h> @@ -101,6 +103,7 @@ static gboolean is_modally_blocked (GdkWindow *window); */ static GList *client_filters; /* Filters for client messages */ +extern gint _gdk_input_ignore_core; static HCURSOR p_grab_cursor; @@ -199,31 +202,44 @@ _gdk_win32_get_next_tick (gulong suggested_tick) } static void -generate_focus_event (GdkWindow *window, - gboolean in) +generate_focus_event (GdkDeviceManager *device_manager, + GdkWindow *window, + gboolean in) { + GdkDevice *device; GdkEvent *event; + device = GDK_DEVICE_MANAGER_WIN32 (device_manager)->core_keyboard; + event = gdk_event_new (GDK_FOCUS_CHANGE); event->focus_change.window = window; event->focus_change.in = in; + gdk_event_set_device (event, device); append_event (event); } static void -generate_grab_broken_event (GdkWindow *window, - gboolean keyboard, - GdkWindow *grab_window) +generate_grab_broken_event (GdkDeviceManager *device_manager, + GdkWindow *window, + gboolean keyboard, + GdkWindow *grab_window) { GdkEvent *event = gdk_event_new (GDK_GRAB_BROKEN); + GdkDevice *device; + + if (keyboard) + device = GDK_DEVICE_MANAGER_WIN32 (device_manager)->core_keyboard; + else + device = GDK_DEVICE_MANAGER_WIN32 (device_manager)->core_pointer; event->grab_broken.window = window; event->grab_broken.send_event = 0; event->grab_broken.keyboard = keyboard; event->grab_broken.implicit = FALSE; event->grab_broken.grab_window = grab_window; - + gdk_event_set_device (event, device); + append_event (event); } @@ -443,17 +459,19 @@ event_mask_string (GdkEventMask mask) #endif GdkGrabStatus -_gdk_windowing_pointer_grab (GdkWindow *window, - GdkWindow *native_window, - gboolean owner_events, - GdkEventMask event_mask, - GdkWindow *confine_to, - GdkCursor *cursor, - guint32 time) +_gdk_windowing_device_grab (GdkDevice *device, + GdkWindow *window, + GdkWindow *native_window, + gboolean owner_events, + GdkEventMask event_mask, + GdkWindow *confine_to, + GdkCursor *cursor, + guint32 time) { HCURSOR hcursor; GdkCursorPrivate *cursor_private; gint return_val; + GdkWindowImplWin32 *impl = GDK_WINDOW_IMPL_WIN32 (((GdkWindowObject *) native_window)->impl); g_return_val_if_fail (window != NULL, 0); g_return_val_if_fail (GDK_IS_WINDOW (window), 0); @@ -466,54 +484,53 @@ _gdk_windowing_pointer_grab (GdkWindow *window, else if ((hcursor = CopyCursor (cursor_private->hcursor)) == NULL) WIN32_API_FAILED ("CopyCursor"); - return_val = _gdk_input_grab_pointer (native_window, - owner_events, - event_mask, - confine_to, - time); + return_val = GDK_DEVICE_GET_CLASS (device)->grab (device, + native_window, + owner_events, + event_mask, + confine_to, + cursor, + time); - if (return_val == GDK_GRAB_SUCCESS) + /* TODO_CSW: grab brokens, confine window, input_grab */ + if (p_grab_cursor != NULL) { - GdkWindowImplWin32 *impl = GDK_WINDOW_IMPL_WIN32 (((GdkWindowObject *) native_window)->impl); - - SetCapture (GDK_WINDOW_HWND (native_window)); - /* TODO_CSW: grab brokens, confine window, input_grab */ - if (p_grab_cursor != NULL) - { - if (GetCursor () == p_grab_cursor) - SetCursor (NULL); - DestroyCursor (p_grab_cursor); - } - - p_grab_cursor = hcursor; + if (GetCursor () == p_grab_cursor) + SetCursor (NULL); + DestroyCursor (p_grab_cursor); + } - if (p_grab_cursor != NULL) - SetCursor (p_grab_cursor); - else if (impl->hcursor != NULL) - SetCursor (impl->hcursor); - else - SetCursor (LoadCursor (NULL, IDC_ARROW)); + 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)); return return_val; } void -gdk_display_pointer_ungrab (GdkDisplay *display, - guint32 time) +gdk_device_ungrab (GdkDevice *device, + guint32 time) { - GdkPointerGrabInfo *info; + GdkDeviceGrabInfo *info; + GdkDisplay *display; + + g_return_if_fail (GDK_IS_DEVICE (device)); + + display = gdk_device_get_display (device); + info = _gdk_display_get_last_device_grab (display, device); - info = _gdk_display_get_last_pointer_grab (display); if (info) { info->serial_end = 0; - ReleaseCapture (); + GDK_DEVICE_GET_CLASS (device)->ungrab (device, time); } - /* TODO_CSW: cursor, confines, etc */ - _gdk_display_pointer_grab_update (display, 0); + _gdk_display_device_grab_update (display, device, 0); } @@ -525,8 +542,11 @@ find_window_for_mouse_event (GdkWindow* reported_window, POINTS points; POINT pt; GdkWindow* other_window = NULL; + GdkDeviceManagerWin32 *device_manager; + + device_manager = GDK_DEVICE_MANAGER_WIN32 (gdk_display_get_device_manager (_gdk_display)); - if (!_gdk_display_get_last_pointer_grab (_gdk_display)) + if (!_gdk_display_get_last_device_grab (_gdk_display, device_manager->core_pointer)) return reported_window; points = MAKEPOINTS (msg->lParam); @@ -562,41 +582,6 @@ find_window_for_mouse_event (GdkWindow* reported_window, return other_window; } -GdkGrabStatus -gdk_keyboard_grab (GdkWindow *window, - gboolean owner_events, - guint32 time) -{ - GdkDisplay *display; - GdkWindow *toplevel; - - 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" : "")); - - display = gdk_drawable_get_display (window); - toplevel = gdk_window_get_toplevel (window); - - _gdk_display_set_has_keyboard_grab (display, - window, - toplevel, - owner_events, - 0, - time); - - return GDK_GRAB_SUCCESS; -} - -void -gdk_display_keyboard_ungrab (GdkDisplay *display, - guint32 time) -{ - GDK_NOTE (EVENTS, g_print ("gdk_display_keyboard_ungrab\n")); - _gdk_display_unset_has_keyboard_grab (display, FALSE); -} - void gdk_display_add_client_message_filter (GdkDisplay *display, GdkAtom message_type, @@ -1195,11 +1180,11 @@ do_show_window (GdkWindow *window, gboolean hide_window) } static void -synthesize_enter_or_leave_event (GdkWindow *window, - MSG *msg, - GdkEventType type, - GdkCrossingMode mode, - GdkNotifyType detail) +synthesize_enter_or_leave_event (GdkWindow *window, + MSG *msg, + GdkEventType type, + GdkCrossingMode mode, + GdkNotifyType detail) { GdkEvent *event; POINT pt; @@ -1219,12 +1204,13 @@ 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 */ + gdk_event_set_device (event, _gdk_display->core_pointer); append_event (event); if (type == GDK_ENTER_NOTIFY && ((GdkWindowObject *) window)->extension_events != 0) - _gdk_input_enter_event (window); + _gdk_device_wintab_update_window_coords (window); } static void @@ -1684,10 +1670,10 @@ handle_display_change (void) } static void -generate_button_event (GdkEventType type, - gint button, - GdkWindow *window, - MSG *msg) +generate_button_event (GdkEventType type, + gint button, + GdkWindow *window, + MSG *msg) { GdkEvent *event = gdk_event_new (type); @@ -1700,7 +1686,7 @@ generate_button_event (GdkEventType type, event->button.axes = NULL; event->button.state = build_pointer_event_state (msg); event->button.button = button; - event->button.device = _gdk_display->core_pointer; + gdk_event_set_device (event, _gdk_display->core_pointer); append_event (event); } @@ -1868,7 +1854,10 @@ gdk_event_translate (MSG *msg, GdkWindow *orig_window, *new_window, *toplevel; - GdkPointerGrabInfo *grab = NULL; + GdkDeviceManager *device_manager; + + GdkDeviceGrabInfo *keyboard_grab = NULL; + GdkDeviceGrabInfo *pointer_grab = NULL; GdkWindow *grab_window = NULL; static gint update_colors_counter = 0; @@ -1929,7 +1918,14 @@ gdk_event_translate (MSG *msg, } return FALSE; } - + + device_manager = gdk_display_get_device_manager (_gdk_display); + + keyboard_grab = _gdk_display_get_last_device_grab (_gdk_display, + GDK_DEVICE_MANAGER_WIN32 (device_manager)->core_keyboard); + pointer_grab = _gdk_display_get_last_device_grab (_gdk_display, + GDK_DEVICE_MANAGER_WIN32 (device_manager)->core_pointer); + g_object_ref (window); /* window's refcount has now been increased, so code below should @@ -2047,7 +2043,7 @@ gdk_event_translate (MSG *msg, /* Let the system handle Alt-Tab, Alt-Space and Alt-F4 unless * the keyboard is grabbed. */ - if (_gdk_display->keyboard_grab.window == NULL && + if (!keyboard_grab && (msg->wParam == VK_TAB || msg->wParam == VK_SPACE || msg->wParam == VK_F4)) @@ -2071,9 +2067,10 @@ gdk_event_translate (MSG *msg, in_ime_composition) break; - if (!propagate (&window, msg, - _gdk_display->keyboard_grab.window, - _gdk_display->keyboard_grab.owner_events, + if (keyboard_grab && + !propagate (&window, msg, + keyboard_grab->window, + keyboard_grab->owner_events, GDK_ALL_EVENTS_MASK, doesnt_want_key, FALSE)) break; @@ -2090,6 +2087,7 @@ gdk_event_translate (MSG *msg, event->key.string = NULL; event->key.length = 0; event->key.hardware_keycode = msg->wParam; + gdk_event_set_device (event, GDK_DEVICE_MANAGER_WIN32 (device_manager)->core_keyboard); if (HIWORD (msg->lParam) & KF_EXTENDED) { switch (msg->wParam) @@ -2175,9 +2173,10 @@ gdk_event_translate (MSG *msg, if (!(msg->lParam & GCS_RESULTSTR)) break; - if (!propagate (&window, msg, - _gdk_display->keyboard_grab.window, - _gdk_display->keyboard_grab.owner_events, + if (keyboard_grab && + !propagate (&window, msg, + keyboard_grab->window, + keyboard_grab->owner_events, GDK_ALL_EVENTS_MASK, doesnt_want_char, FALSE)) break; @@ -2201,6 +2200,7 @@ gdk_event_translate (MSG *msg, /* Build a key press event */ event = gdk_event_new (GDK_KEY_PRESS); event->key.window = window; + gdk_event_set_device (event, GDK_DEVICE_MANAGER_WIN32 (device_manager)->core_keyboard); build_wm_ime_composition_event (event, msg, wbuf[i], key_state); append_event (event); @@ -2211,6 +2211,7 @@ gdk_event_translate (MSG *msg, /* Build a key release event. */ event = gdk_event_new (GDK_KEY_RELEASE); event->key.window = window; + gdk_event_set_device (event, GDK_DEVICE_MANAGER_WIN32 (device_manager)->core_keyboard); build_wm_ime_composition_event (event, msg, wbuf[i], key_state); append_event (event); @@ -2307,10 +2308,10 @@ gdk_event_translate (MSG *msg, current_toplevel ? GDK_WINDOW_HWND (current_toplevel) : NULL, toplevel ? GDK_WINDOW_HWND (toplevel) : NULL)); if (current_toplevel) - synthesize_enter_or_leave_event (current_toplevel, msg, - GDK_LEAVE_NOTIFY, GDK_CROSSING_NORMAL, GDK_NOTIFY_ANCESTOR); - synthesize_enter_or_leave_event (toplevel, msg, - GDK_ENTER_NOTIFY, GDK_CROSSING_NORMAL, GDK_NOTIFY_ANCESTOR); + synthesize_enter_or_leave_event (current_toplevel, msg, + GDK_LEAVE_NOTIFY, GDK_CROSSING_NORMAL, GDK_NOTIFY_ANCESTOR); + synthesize_enter_or_leave_event (toplevel, msg, + GDK_ENTER_NOTIFY, GDK_CROSSING_NORMAL, GDK_NOTIFY_ANCESTOR); assign_object (¤t_toplevel, toplevel); track_mouse_event (TME_LEAVE, GDK_WINDOW_HWND (toplevel)); } @@ -2336,7 +2337,7 @@ gdk_event_translate (MSG *msg, event->motion.axes = NULL; event->motion.state = build_pointer_event_state (msg); event->motion.is_hint = FALSE; - event->motion.device = _gdk_display->core_pointer; + gdk_event_set_device (event, _gdk_display->core_pointer); append_event (event); @@ -2365,8 +2366,8 @@ gdk_event_translate (MSG *msg, { /* we are only interested if we don't know the new window */ if (current_toplevel) - synthesize_enter_or_leave_event (current_toplevel, msg, - GDK_LEAVE_NOTIFY, GDK_CROSSING_NORMAL, GDK_NOTIFY_ANCESTOR); + synthesize_enter_or_leave_event (current_toplevel, msg, + GDK_LEAVE_NOTIFY, GDK_CROSSING_NORMAL, GDK_NOTIFY_ANCESTOR); assign_object (¤t_toplevel, NULL); } else @@ -2412,7 +2413,7 @@ gdk_event_translate (MSG *msg, event->scroll.x_root = (gint16) GET_X_LPARAM (msg->lParam) + _gdk_offset_x; event->scroll.y_root = (gint16) GET_Y_LPARAM (msg->lParam) + _gdk_offset_y; event->scroll.state = build_pointer_event_state (msg); - event->scroll.device = _gdk_display->core_pointer; + gdk_event_set_device (event, _gdk_display->core_pointer); append_event (event); @@ -2512,16 +2513,16 @@ gdk_event_translate (MSG *msg, break; case WM_KILLFOCUS: - if (_gdk_display->keyboard_grab.window != NULL && - !GDK_WINDOW_DESTROYED (_gdk_display->keyboard_grab.window)) + if (keyboard_grab != NULL && + !GDK_WINDOW_DESTROYED (keyboard_grab->window)) { - generate_grab_broken_event (_gdk_display->keyboard_grab.window, FALSE, NULL); + generate_grab_broken_event (device_manager, keyboard_grab->window, FALSE, NULL); } /* fallthrough */ case WM_SETFOCUS: - if (_gdk_display->keyboard_grab.window != NULL && - !_gdk_display->keyboard_grab.owner_events) + if (keyboard_grab != NULL && + !keyboard_grab->owner_events) break; if (!(((GdkWindowObject *) window)->event_mask & GDK_FOCUS_CHANGE_MASK)) @@ -2530,7 +2531,7 @@ gdk_event_translate (MSG *msg, if (GDK_WINDOW_DESTROYED (window)) break; - generate_focus_event (window, (msg->message == WM_SETFOCUS)); + generate_focus_event (device_manager, window, (msg->message == WM_SETFOCUS)); return_val = TRUE; break; @@ -2558,11 +2559,8 @@ gdk_event_translate (MSG *msg, GDK_NOTE (EVENTS, g_print (" %#x %#x", LOWORD (msg->lParam), HIWORD (msg->lParam))); - grab = _gdk_display_get_last_pointer_grab (_gdk_display); - if (grab != NULL) - { - grab_window = grab->window; - } + if (pointer_grab != NULL) + grab_window = pointer_grab->window; if (grab_window == NULL && LOWORD (msg->lParam) != HTCLIENT) break; @@ -2617,14 +2615,14 @@ gdk_event_translate (MSG *msg, SetForegroundWindow (GDK_WINDOW_HWND (impl->transient_owner)); } - grab = _gdk_display_get_last_pointer_grab (_gdk_display); - if (grab != NULL) + if (pointer_grab != NULL) { - if (grab->window == window) + if (pointer_grab->window == window) gdk_pointer_ungrab (msg->time); } - if (_gdk_display->keyboard_grab.window == window) + if (keyboard_grab && + keyboard_grab->window == window) gdk_keyboard_ungrab (msg->time); } @@ -2655,13 +2653,13 @@ gdk_event_translate (MSG *msg, if (msg->wParam == SIZE_MINIMIZED) { /* Don't generate any GDK event. This is *not* an UNMAP. */ - grab = _gdk_display_get_last_pointer_grab (_gdk_display); - if (grab != NULL) + if (pointer_grab != NULL) { - if (grab->window == window) + if (pointer_grab->window == window) gdk_pointer_ungrab (msg->time); } - if (_gdk_display->keyboard_grab.window == window) + if (keyboard_grab && + keyboard_grab->window == window) gdk_keyboard_ungrab (msg->time); gdk_synthesize_window_state (window, @@ -2707,7 +2705,7 @@ gdk_event_translate (MSG *msg, ((GdkWindowObject *) window)->resize_count -= 1; if (((GdkWindowObject *) window)->extension_events != 0) - _gdk_input_configure_event (window); + _gdk_device_wintab_update_window_coords (window); return_val = TRUE; } @@ -3089,14 +3087,14 @@ gdk_event_translate (MSG *msg, break; case WM_DESTROY: - grab = _gdk_display_get_last_pointer_grab (_gdk_display); - if (grab != NULL) + if (pointer_grab != NULL) { - if (grab->window == window) + if (pointer_grab->window == window) gdk_pointer_ungrab (msg->time); } - if (_gdk_display->keyboard_grab.window == window) + if (keyboard_grab && + keyboard_grab->window == window) gdk_keyboard_ungrab (msg->time); if ((window != NULL) && (msg->hwnd != GetDesktopWindow ())) |