device: remove get_toplevel from surface_at_position vfunc

This is not used anymore now that surfaces are always toplevel in the
semantics of GdkWindow where child windows were available. We can drop
that and simplify the vfunc just a bit more.

Fixes #2765
This commit is contained in:
Christian Hergert 2020-05-19 12:00:32 -07:00
parent 841e9b3f0e
commit fa08d848ca
9 changed files with 55 additions and 94 deletions

View File

@ -54,8 +54,7 @@ static void gdk_broadway_device_ungrab (GdkDevice *device,
static GdkSurface * gdk_broadway_device_surface_at_position (GdkDevice *device,
gdouble *win_x,
gdouble *win_y,
GdkModifierType *mask,
gboolean get_toplevel);
GdkModifierType *mask);
G_DEFINE_TYPE (GdkBroadwayDevice, gdk_broadway_device, GDK_TYPE_DEVICE)
@ -292,8 +291,7 @@ static GdkSurface *
gdk_broadway_device_surface_at_position (GdkDevice *device,
gdouble *win_x,
gdouble *win_y,
GdkModifierType *mask,
gboolean get_toplevel)
GdkModifierType *mask)
{
GdkSurface *surface = NULL;

View File

@ -628,7 +628,7 @@ gdk_device_get_surface_at_position (GdkDevice *device,
g_return_val_if_fail (gdk_device_get_device_type (device) != GDK_DEVICE_TYPE_SLAVE ||
gdk_display_device_is_grabbed (gdk_device_get_display (device), device), NULL);
surface = _gdk_device_surface_at_position (device, &tmp_x, &tmp_y, NULL, FALSE);
surface = _gdk_device_surface_at_position (device, &tmp_x, &tmp_y, NULL);
if (win_x)
*win_x = tmp_x;
@ -1588,17 +1588,15 @@ _gdk_device_query_state (GdkDevice *device,
}
GdkSurface *
_gdk_device_surface_at_position (GdkDevice *device,
gdouble *win_x,
gdouble *win_y,
GdkModifierType *mask,
gboolean get_toplevel)
_gdk_device_surface_at_position (GdkDevice *device,
gdouble *win_x,
gdouble *win_y,
GdkModifierType *mask)
{
return GDK_DEVICE_GET_CLASS (device)->surface_at_position (device,
win_x,
win_y,
mask,
get_toplevel);
win_x,
win_y,
mask);
}
/**

View File

@ -105,8 +105,7 @@ struct _GdkDeviceClass
GdkSurface * (* surface_at_position) (GdkDevice *device,
double *win_x,
double *win_y,
GdkModifierType *mask,
gboolean get_toplevel);
GdkModifierType *mask);
};
void _gdk_device_set_associated_device (GdkDevice *device,
@ -167,8 +166,7 @@ void _gdk_device_query_state (GdkDevice *device,
GdkSurface * _gdk_device_surface_at_position (GdkDevice *device,
gdouble *win_x,
gdouble *win_y,
GdkModifierType *mask,
gboolean get_toplevel);
GdkModifierType *mask);
void gdk_device_set_seat (GdkDevice *device,
GdkSeat *seat);

View File

@ -589,7 +589,7 @@ get_current_toplevel (GdkDisplay *display,
gdouble x, y;
GdkModifierType state;
pointer_surface = _gdk_device_surface_at_position (device, &x, &y, &state, TRUE);
pointer_surface = _gdk_device_surface_at_position (device, &x, &y, &state);
if (pointer_surface != NULL &&
GDK_SURFACE_DESTROYED (pointer_surface))

View File

@ -802,10 +802,9 @@ gdk_wayland_device_ungrab (GdkDevice *device,
static GdkSurface *
gdk_wayland_device_surface_at_position (GdkDevice *device,
gdouble *win_x,
gdouble *win_y,
GdkModifierType *mask,
gboolean get_toplevel)
gdouble *win_x,
gdouble *win_y,
GdkModifierType *mask)
{
GdkWaylandPointerData *pointer;

View File

@ -177,10 +177,9 @@ screen_to_client (HWND hwnd, POINT screen_pt, POINT *client_pt)
GdkSurface *
_gdk_device_win32_surface_at_position (GdkDevice *device,
gdouble *win_x,
gdouble *win_y,
GdkModifierType *mask,
gboolean get_toplevel)
gdouble *win_x,
gdouble *win_y,
GdkModifierType *mask)
{
GdkSurface *window = NULL;
GdkWin32Surface *impl = NULL;
@ -190,60 +189,33 @@ _gdk_device_win32_surface_at_position (GdkDevice *device,
GetCursorPos (&screen_pt);
if (get_toplevel)
{
/* Only consider visible children of the desktop to avoid the various
* non-visible windows you often find on a running Windows box. These
* might overlap our windows and cause our walk to fail. As we assume
* WindowFromPoint() can find our windows, we follow similar logic
* here, and ignore invisible and disabled windows.
*/
hwnd = GetDesktopWindow ();
do {
window = gdk_win32_handle_table_lookup (hwnd);
/* Only consider visible children of the desktop to avoid the various
* non-visible windows you often find on a running Windows box. These
* might overlap our windows and cause our walk to fail. As we assume
* WindowFromPoint() can find our windows, we follow similar logic
* here, and ignore invisible and disabled windows.
*/
hwnd = GetDesktopWindow ();
do {
window = gdk_win32_handle_table_lookup (hwnd);
if (window != NULL)
break;
if (window != NULL)
break;
screen_to_client (hwnd, screen_pt, &client_pt);
hwndc = ChildWindowFromPointEx (hwnd, client_pt, CWP_SKIPDISABLED |
CWP_SKIPINVISIBLE);
screen_to_client (hwnd, screen_pt, &client_pt);
hwndc = ChildWindowFromPointEx (hwnd, client_pt, CWP_SKIPDISABLED |
CWP_SKIPINVISIBLE);
/* Verify that we're really inside the client area of the window */
if (hwndc != hwnd)
{
GetClientRect (hwndc, &rect);
screen_to_client (hwndc, screen_pt, &client_pt);
if (!PtInRect (&rect, client_pt))
hwndc = hwnd;
}
/* Verify that we're really inside the client area of the window */
if (hwndc != hwnd)
{
GetClientRect (hwndc, &rect);
screen_to_client (hwndc, screen_pt, &client_pt);
if (!PtInRect (&rect, client_pt))
hwndc = hwnd;
}
} while (hwndc != hwnd && (hwnd = hwndc, 1));
}
else
{
hwnd = WindowFromPoint (screen_pt);
/* Verify that we're really inside the client area of the window */
GetClientRect (hwnd, &rect);
screen_to_client (hwnd, screen_pt, &client_pt);
if (!PtInRect (&rect, client_pt))
hwnd = NULL;
/* If we didn't hit any window at that point, return the desktop */
if (hwnd == NULL)
{
if (win_x)
*win_x = screen_pt.x + _gdk_offset_x;
if (win_y)
*win_y = screen_pt.y + _gdk_offset_y;
return NULL;
}
window = gdk_win32_handle_table_lookup (hwnd);
}
} while (hwndc != hwnd && (hwnd = hwndc, 1));
if (window && (win_x || win_y))
{

View File

@ -45,10 +45,9 @@ struct _GdkDeviceWin32Class
GType gdk_device_win32_get_type (void) G_GNUC_CONST;
GdkSurface *_gdk_device_win32_surface_at_position (GdkDevice *device,
gdouble *win_x,
gdouble *win_y,
GdkModifierType *mask,
gboolean get_toplevel);
gdouble *win_x,
gdouble *win_y,
GdkModifierType *mask);
G_END_DECLS

View File

@ -188,10 +188,9 @@ gdk_device_wintab_ungrab (GdkDevice *device,
static GdkSurface *
gdk_device_wintab_surface_at_position (GdkDevice *device,
gdouble *win_x,
gdouble *win_y,
GdkModifierType *mask,
gboolean get_toplevel)
gdouble *win_x,
gdouble *win_y,
GdkModifierType *mask)
{
return NULL;
}

View File

@ -95,10 +95,9 @@ static void gdk_x11_device_xi2_ungrab (GdkDevice *device,
guint32 time_);
static GdkSurface * gdk_x11_device_xi2_surface_at_position (GdkDevice *device,
gdouble *win_x,
gdouble *win_y,
GdkModifierType *mask,
gboolean get_toplevel);
gdouble *win_x,
gdouble *win_y,
GdkModifierType *mask);
enum {
@ -448,10 +447,9 @@ gdk_x11_device_xi2_ungrab (GdkDevice *device,
static GdkSurface *
gdk_x11_device_xi2_surface_at_position (GdkDevice *device,
gdouble *win_x,
gdouble *win_y,
GdkModifierType *mask,
gboolean get_toplevel)
gdouble *win_x,
gdouble *win_y,
GdkModifierType *mask)
{
GdkX11Surface *impl;
GdkX11DeviceXI2 *device_xi2 = GDK_X11_DEVICE_XI2 (device);
@ -587,7 +585,7 @@ gdk_x11_device_xi2_surface_at_position (GdkDevice *device,
if (!retval)
break;
if (get_toplevel && last != root &&
if (last != root &&
(surface = gdk_x11_surface_lookup_for_display (display, last)) != NULL)
{
xwindow = last;