diff options
author | Matthias Clasen <mclasen@redhat.com> | 2019-03-16 14:39:45 -0400 |
---|---|---|
committer | Matthias Clasen <mclasen@redhat.com> | 2019-03-26 19:18:39 -0400 |
commit | a72c6249d3334b15aa279d72fad91ccbbb4d4eec (patch) | |
tree | f3e439c8b5186372d65f2f3c7d35f6dc13132376 /gtk | |
parent | 37d23c0f96f5f6bc15b37a9a9c51220fd30d672e (diff) | |
download | gtk+-a72c6249d3334b15aa279d72fad91ccbbb4d4eec.tar.gz |
popup: Add backdrop
Diffstat (limited to 'gtk')
-rw-r--r-- | gtk/gtkpopup.c | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/gtk/gtkpopup.c b/gtk/gtkpopup.c index 33df24f531..9406bb8a39 100644 --- a/gtk/gtkpopup.c +++ b/gtk/gtkpopup.c @@ -38,6 +38,7 @@ typedef struct { GdkDisplay *display; GskRenderer *renderer; GdkSurface *surface; + GdkSurfaceState state; GtkWidget *relative_to; GtkWidget *focus_widget; gboolean active; @@ -174,6 +175,41 @@ gtk_popup_focus_out (GtkWidget *widget) gtk_popup_set_is_active (GTK_POPUP (widget), FALSE); } +static void +ensure_state_flag_backdrop (GtkWidget *widget) +{ + GtkPopup *popup = GTK_POPUP (widget); + GtkPopupPrivate *priv = gtk_popup_get_instance_private (popup); + + if ((priv->state & GDK_SURFACE_STATE_FOCUSED) != 0) + gtk_widget_unset_state_flags (widget, GTK_STATE_FLAG_BACKDROP); + else + gtk_widget_set_state_flags (widget, GTK_STATE_FLAG_BACKDROP, FALSE); +} + +static void +surface_state_changed (GtkWidget *widget) +{ + GtkPopup *popup = GTK_POPUP (widget); + GtkPopupPrivate *priv = gtk_popup_get_instance_private (popup); + GdkSurfaceState new_surface_state; + GdkSurfaceState changed_mask; + + new_surface_state = gdk_surface_get_state (_gtk_widget_get_surface (widget)); + changed_mask = new_surface_state ^ priv->state; + priv->state = new_surface_state; + + if (changed_mask & GDK_SURFACE_STATE_FOCUSED) + ensure_state_flag_backdrop (widget); +} + +static void +surface_size_changed (GtkWindow *window, + guint width, + guint height) +{ + g_print ("new surface size %d %d\n", width, height); +} static void gtk_popup_init (GtkPopup *popup) @@ -223,6 +259,9 @@ gtk_popup_realize (GtkWidget *widget) #endif gtk_widget_set_surface (widget, priv->surface); + g_signal_connect_swapped (priv->surface, "notify::state", G_CALLBACK (surface_state_changed), widget); + g_signal_connect_swapped (priv->surface, "size-changed", G_CALLBACK (surface_size_changed), widget); + gtk_widget_register_surface (widget, priv->surface); GTK_WIDGET_CLASS (gtk_popup_parent_class)->realize (widget); @@ -241,6 +280,9 @@ gtk_popup_unrealize (GtkWidget *widget) gsk_renderer_unrealize (priv->renderer); g_clear_object (&priv->renderer); + g_signal_handlers_disconnect_by_func (priv->surface, surface_state_changed, widget); + g_signal_handlers_disconnect_by_func (priv->surface, surface_size_changed, widget); + g_clear_object (&priv->surface); } |