static void gdk_broadway_device_ungrab (GdkDevice *device, guint32 time_) { GdkDisplay *display; GdkBroadwayDisplay *broadway_display; GdkDeviceGrabInfo *grab; guint32 serial; display = gdk_device_get_display (device); broadway_display = GDK_BROADWAY_DISPLAY (display); if (gdk_device_get_source (device) == GDK_SOURCE_KEYBOARD) { /* Device is a keyboard */ } else { /* Device is a pointer */ if (broadway_display->output) { serial = broadway_output_ungrab_pointer (broadway_display->output, time_); gdk_display_flush (display); grab = _gdk_display_get_last_device_grab (display, device); if (grab && (time_ == GDK_CURRENT_TIME || grab->time == GDK_CURRENT_TIME || !TIME_IS_LATER (grab->time, time_))) grab->serial_end = serial; } } }
static GdkGrabStatus gdk_broadway_device_grab (GdkDevice *device, GdkWindow *window, gboolean owner_events, GdkEventMask event_mask, GdkWindow *confine_to, GdkCursor *cursor, guint32 time_) { GdkDisplay *display; GdkBroadwayDisplay *broadway_display; display = gdk_device_get_display (device); broadway_display = GDK_BROADWAY_DISPLAY (display); if (gdk_device_get_source (device) == GDK_SOURCE_KEYBOARD) { /* Device is a keyboard */ return GDK_GRAB_SUCCESS; } else { /* Device is a pointer */ return _gdk_broadway_server_grab_pointer (broadway_display->server, GDK_WINDOW_IMPL_BROADWAY (window->impl)->id, owner_events, event_mask, time_); } }
static GdkGrabStatus gdk_broadway_device_grab (GdkDevice *device, GdkWindow *window, gboolean owner_events, GdkEventMask event_mask, GdkWindow *confine_to, GdkCursor *cursor, guint32 time_) { GdkDisplay *display; GdkBroadwayDisplay *broadway_display; GdkWindowImplBroadway *impl; guint32 serial; char *reply; display = gdk_device_get_display (device); broadway_display = GDK_BROADWAY_DISPLAY (display); if (gdk_device_get_source (device) == GDK_SOURCE_KEYBOARD) { /* Device is a keyboard */ return GDK_GRAB_SUCCESS; } else { /* Device is a pointer */ if (broadway_display->output) { impl = GDK_WINDOW_IMPL_BROADWAY (window->impl); serial = broadway_output_grab_pointer (broadway_display->output, impl->id, owner_events, time_); reply = _gdk_broadway_display_block_for_input (display, 'g', serial, FALSE); if (reply != NULL) { char *p; char cmd; guint32 reply_serial; int res; p = reply; cmd = *p++; reply_serial = (guint32)strtol(p, &p, 10); p++; /* Skip , */ res = strtol(p, &p, 10); return res; } } return GDK_GRAB_NOT_VIEWABLE; } }
static void gdk_device_win32_ungrab (GdkDevice *device, guint32 time_) { GdkDeviceGrabInfo *info; GdkDisplay *display; display = gdk_device_get_display (device); info = _gdk_display_get_last_device_grab (display, device); if (info) info->serial_end = 0; if (gdk_device_get_source (device) != GDK_SOURCE_KEYBOARD) ReleaseCapture (); _gdk_display_device_grab_update (display, device, NULL, 0); }
static GdkWindow * gdk_broadway_device_window_at_position (GdkDevice *device, gdouble *win_x, gdouble *win_y, GdkModifierType *mask, gboolean get_toplevel) { GdkScreen *screen; GdkWindow *root_window; GdkWindow *window; screen = gdk_display_get_default_screen (gdk_device_get_display (device)); root_window = gdk_screen_get_root_window (screen); gdk_broadway_device_query_state (device, root_window, NULL, &window, NULL, NULL, win_x, win_y, mask); return window; }
static gboolean gdk_broadway_device_query_state (GdkDevice *device, GdkWindow *window, GdkWindow **root_window, GdkWindow **child_window, gint *root_x, gint *root_y, gint *win_x, gint *win_y, GdkModifierType *mask) { GdkDisplay *display; GdkBroadwayDisplay *broadway_display; GdkWindowImplBroadway *impl; guint32 serial; GdkScreen *screen; char *reply; gint device_root_x, device_root_y, device_win_x, device_win_y, id; if (gdk_device_get_source (device) != GDK_SOURCE_MOUSE) return FALSE; display = gdk_device_get_display (device); broadway_display = GDK_BROADWAY_DISPLAY (display); if (root_window) { screen = gdk_window_get_screen (window); *root_window = gdk_screen_get_root_window (screen); } if (mask) *mask = 0; /* TODO */ if (broadway_display->output) { impl = GDK_WINDOW_IMPL_BROADWAY (window->impl); serial = broadway_output_query_pointer (broadway_display->output, impl->id); reply = _gdk_broadway_display_block_for_input (display, 'q', serial, TRUE); if (reply != NULL) { char *p; char cmd; guint32 reply_serial; p = reply; cmd = *p++; reply_serial = (guint32)strtol(p, &p, 10); p++; /* Skip , */ device_root_x = strtol(p, &p, 10); p++; /* Skip , */ device_root_y = strtol(p, &p, 10); p++; /* Skip , */ device_win_x = strtol(p, &p, 10); p++; /* Skip , */ device_win_y = strtol(p, &p, 10); p++; /* Skip , */ id = strtol(p, &p, 10); if (root_x) *root_x = device_root_x; if (root_y) *root_y = device_root_y; if (win_x) *win_x = device_win_x; if (win_y) *win_y = device_win_y; if (child_window) { if (gdk_window_get_window_type (window) == GDK_WINDOW_ROOT) *child_window = g_hash_table_lookup (broadway_display->id_ht, GINT_TO_POINTER (id)); else *child_window = window; /* No native children */ } g_free (reply); return TRUE; } } /* Fallback when unconnected */ device_root_x = broadway_display->last_x; device_root_y = broadway_display->last_y; if (root_x) *root_x = device_root_x; if (root_y) *root_y = device_root_y; if (win_x) *win_x = device_root_y - window->x; if (win_y) *win_y = device_root_y - window->y; if (child_window) { if (gdk_window_get_window_type (window) == GDK_WINDOW_ROOT) { *child_window = broadway_display->mouse_in_toplevel; if (*child_window == NULL) *child_window = window; } else { /* No native children */ *child_window = window; } } return TRUE; }
static void gdk_device_wintab_query_state (GdkDevice *device, GdkSurface *window, GdkSurface **child_window, gdouble *root_x, gdouble *root_y, gdouble *win_x, gdouble *win_y, GdkModifierType *mask) { GdkDeviceWintab *device_wintab; POINT point; HWND hwnd, hwndc; int scale; device_wintab = GDK_DEVICE_WINTAB (device); if (window) { scale = GDK_SURFACE_IMPL_WIN32 (window->impl)->surface_scale; hwnd = GDK_SURFACE_HWND (window); } else { GdkDisplay *display = gdk_device_get_display (device); scale = GDK_WIN32_DISPLAY (display)->surface_scale; hwnd = NULL; } GetCursorPos (&point); if (root_x) *root_x = point.x / scale; if (root_y) *root_y = point.y / scale; if (hwnd) ScreenToClient (hwnd, &point); if (win_x) *win_x = point.x / scale; if (win_y) *win_y = point.y / scale; if (!window) { if (win_x) *win_x += _gdk_offset_x; if (win_y) *win_y += _gdk_offset_y; } if (hwnd && child_window) { hwndc = ChildWindowFromPoint (hwnd, point); if (hwndc && hwndc != hwnd) *child_window = gdk_win32_handle_table_lookup (hwndc); else *child_window = NULL; /* Direct child unknown to gdk */ } if (mask) { *mask = get_current_mask (); *mask &= 0xFF; /* Mask away core pointer buttons */ *mask |= ((device_wintab->button_state << 8) & (GDK_BUTTON1_MASK | GDK_BUTTON2_MASK | GDK_BUTTON3_MASK | GDK_BUTTON4_MASK | GDK_BUTTON5_MASK)); } }
static void gdk_broadway_device_query_state (GdkDevice *device, GdkWindow *window, GdkWindow **root_window, GdkWindow **child_window, gdouble *root_x, gdouble *root_y, gdouble *win_x, gdouble *win_y, GdkModifierType *mask) { GdkWindow *toplevel; GdkWindowImplBroadway *impl; GdkDisplay *display; GdkBroadwayDisplay *broadway_display; GdkScreen *screen; gint32 device_root_x, device_root_y; guint32 mouse_toplevel_id; GdkWindow *mouse_toplevel; guint32 mask32; if (gdk_device_get_source (device) != GDK_SOURCE_MOUSE) return; display = gdk_device_get_display (device); broadway_display = GDK_BROADWAY_DISPLAY (display); impl = GDK_WINDOW_IMPL_BROADWAY (window->impl); toplevel = impl->wrapper; if (root_window) { screen = gdk_window_get_screen (window); *root_window = gdk_screen_get_root_window (screen); } _gdk_broadway_server_query_mouse (broadway_display->server, &mouse_toplevel_id, &device_root_x, &device_root_y, &mask32); mouse_toplevel = g_hash_table_lookup (broadway_display->id_ht, GUINT_TO_POINTER (mouse_toplevel_id)); if (root_x) *root_x = device_root_x; if (root_y) *root_y = device_root_y; if (win_x) *win_x = device_root_x - toplevel->x; if (win_y) *win_y = device_root_y - toplevel->y; if (mask) *mask = mask32; if (child_window) { if (gdk_window_get_window_type (toplevel) == GDK_WINDOW_ROOT) { *child_window = mouse_toplevel; if (*child_window == NULL) *child_window = toplevel; } else { /* No native children */ *child_window = toplevel; } } return; }