[gtk/wip/chergert/gdk-macos-gdkdrag: 4/8] macos: check for GdkMacosBaseView before using as such
- From: Christian Hergert <chergert src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk/wip/chergert/gdk-macos-gdkdrag: 4/8] macos: check for GdkMacosBaseView before using as such
- Date: Sat, 19 Jun 2021 02:29:04 +0000 (UTC)
commit f8cab8440619ea0b10d332571ae98d1ac169bc23
Author: Christian Hergert <chergert redhat com>
Date: Thu Jun 17 17:18:19 2021 -0700
macos: check for GdkMacosBaseView before using as such
We can get events for external windows such as those from native
file chooser dialogs.
gdk/macos/gdkmacosdisplay-translate.c | 33 +++++++++++++++++++++++----------
1 file changed, 23 insertions(+), 10 deletions(-)
---
diff --git a/gdk/macos/gdkmacosdisplay-translate.c b/gdk/macos/gdkmacosdisplay-translate.c
index 2a825879a5..d64dd79e5b 100644
--- a/gdk/macos/gdkmacosdisplay-translate.c
+++ b/gdk/macos/gdkmacosdisplay-translate.c
@@ -788,6 +788,9 @@ get_surface_from_ns_event (GdkMacosDisplay *self,
NSRect view_frame;
view = (GdkMacosBaseView *)[nswindow contentView];
+ if (!GDK_IS_MACOS_BASE_VIEW (view))
+ goto find_under_pointer;
+
surface = GDK_SURFACE ([view gdkSurface]);
point = [nsevent locationInWindow];
@@ -846,6 +849,8 @@ get_surface_from_ns_event (GdkMacosDisplay *self,
}
}
+find_under_pointer:
+
if (!surface)
{
/* Fallback used when no NSSurface set. This happens e.g. when
@@ -864,17 +869,24 @@ get_surface_from_ns_event (GdkMacosDisplay *self,
static GdkMacosSurface *
find_surface_for_keyboard_event (NSEvent *nsevent)
{
- GdkMacosBaseView *view = (GdkMacosBaseView *)[[nsevent window] contentView];
- GdkSurface *surface = GDK_SURFACE ([view gdkSurface]);
- GdkDisplay *display = gdk_surface_get_display (surface);
- GdkSeat *seat = gdk_display_get_default_seat (display);
- GdkDevice *device = gdk_seat_get_keyboard (seat);
- GdkDeviceGrabInfo *grab = _gdk_display_get_last_device_grab (display, device);
+ NSView *nsview = [[nsevent window] contentView];
+
+ if (GDK_IS_MACOS_BASE_VIEW (nsview))
+ {
+ GdkMacosBaseView *view = (GdkMacosBaseView *)nsview;
+ GdkSurface *surface = GDK_SURFACE ([view gdkSurface]);
+ GdkDisplay *display = gdk_surface_get_display (surface);
+ GdkSeat *seat = gdk_display_get_default_seat (display);
+ GdkDevice *device = gdk_seat_get_keyboard (seat);
+ GdkDeviceGrabInfo *grab = _gdk_display_get_last_device_grab (display, device);
- if (grab && grab->surface && !grab->owner_events)
- return GDK_MACOS_SURFACE (grab->surface);
+ if (grab && grab->surface && !grab->owner_events)
+ return GDK_MACOS_SURFACE (grab->surface);
- return GDK_MACOS_SURFACE (surface);
+ return GDK_MACOS_SURFACE (surface);
+ }
+
+ return NULL;
}
static GdkMacosSurface *
@@ -1090,7 +1102,8 @@ _gdk_macos_display_translate (GdkMacosDisplay *self,
if (!(surface = find_surface_for_ns_event (self, nsevent, &x, &y)))
return NULL;
- if (!(window = (GdkMacosWindow *)_gdk_macos_surface_get_native (surface)))
+ if (!(window = (GdkMacosWindow *)_gdk_macos_surface_get_native (surface)) ||
+ !GDK_IS_MACOS_WINDOW (window))
return NULL;
/* Ignore events and break grabs while the window is being
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]