summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristian Hergert <christian@hergert.me>2022-03-11 17:53:42 -0800
committerChristian Hergert <christian@hergert.me>2022-03-11 17:53:42 -0800
commit25624083ddddc469ef657672d71a43fbc635c82f (patch)
treedf5f1a446594bdc33119ef003471e39b67672fad
parent407b5246a6121406f661daef95ac64c674e440bd (diff)
downloadgtk+-25624083ddddc469ef657672d71a43fbc635c82f.tar.gz
macos: fix attachment of popups to parents
We had code to do it and it never actually got used correctly. This ensures that the popup services are attached to the parents so that they get proper stacking orders when displayed. Additionally, it fixes popups from being shown as their own windows in Exposé.
-rw-r--r--gdk/macos/gdkmacospopupsurface.c24
1 files changed, 24 insertions, 0 deletions
diff --git a/gdk/macos/gdkmacospopupsurface.c b/gdk/macos/gdkmacospopupsurface.c
index dc6610b398..d489c671ed 100644
--- a/gdk/macos/gdkmacospopupsurface.c
+++ b/gdk/macos/gdkmacospopupsurface.c
@@ -34,6 +34,7 @@ struct _GdkMacosPopupSurface
{
GdkMacosSurface parent_instance;
GdkPopupLayout *layout;
+ guint attached : 1;
};
struct _GdkMacosPopupSurfaceClass
@@ -138,6 +139,9 @@ gdk_macos_popup_surface_present (GdkPopup *popup,
if (GDK_SURFACE_IS_MAPPED (GDK_SURFACE (self)))
return TRUE;
+ if (!self->attached && GDK_SURFACE (self)->parent != NULL)
+ _gdk_macos_popup_surface_attach_to_parent (self);
+
if (GDK_SURFACE (self)->autohide)
{
GdkDisplay *display = gdk_surface_get_display (GDK_SURFACE (popup));
@@ -204,6 +208,19 @@ enum {
};
static void
+_gdk_macos_popup_surface_hide (GdkSurface *surface)
+{
+ GdkMacosPopupSurface *self = (GdkMacosPopupSurface *)surface;
+
+ g_assert (GDK_IS_MACOS_POPUP_SURFACE (self));
+
+ if (self->attached)
+ _gdk_macos_popup_surface_detach_from_parent (self);
+
+ GDK_SURFACE_CLASS (_gdk_macos_popup_surface_parent_class)->hide (surface);
+}
+
+static void
_gdk_macos_popup_surface_finalize (GObject *object)
{
GdkMacosPopupSurface *self = (GdkMacosPopupSurface *)object;
@@ -270,11 +287,14 @@ static void
_gdk_macos_popup_surface_class_init (GdkMacosPopupSurfaceClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (klass);
+ GdkSurfaceClass *surface_class = GDK_SURFACE_CLASS (klass);
object_class->finalize = _gdk_macos_popup_surface_finalize;
object_class->get_property = _gdk_macos_popup_surface_get_property;
object_class->set_property = _gdk_macos_popup_surface_set_property;
+ surface_class->hide = _gdk_macos_popup_surface_hide;
+
gdk_popup_install_properties (object_class, LAST_PROP);
}
@@ -364,6 +384,8 @@ _gdk_macos_popup_surface_attach_to_parent (GdkMacosPopupSurface *self)
[parent addChildWindow:window ordered:NSWindowAbove];
+ self->attached = TRUE;
+
_gdk_macos_display_clear_sorting (GDK_MACOS_DISPLAY (surface->display));
}
}
@@ -385,6 +407,8 @@ _gdk_macos_popup_surface_detach_from_parent (GdkMacosPopupSurface *self)
[parent removeChildWindow:window];
+ self->attached = FALSE;
+
_gdk_macos_display_clear_sorting (GDK_MACOS_DISPLAY (surface->display));
}
}