[gtk+/wip/matthiasc/kill-event-signals: 44/126] window: Add a hide-on-close property



commit b2291a859fd0c5d95120304ef8996a81db936a52
Author: Matthias Clasen <mclasen redhat com>
Date:   Sun Dec 31 10:42:10 2017 -0500

    window: Add a hide-on-close property
    
    This lets us avoid ::delete-event signal handlers for just
    this purpose.

 docs/reference/gtk/gtk4-sections.txt |    2 +
 gtk/gtkwindow.c                      |   79 ++++++++++++++++++++++++++++++++++
 gtk/gtkwindow.h                      |    5 ++
 3 files changed, 86 insertions(+), 0 deletions(-)
---
diff --git a/docs/reference/gtk/gtk4-sections.txt b/docs/reference/gtk/gtk4-sections.txt
index c418f1a..efa3d4f 100644
--- a/docs/reference/gtk/gtk4-sections.txt
+++ b/docs/reference/gtk/gtk4-sections.txt
@@ -4660,6 +4660,8 @@ gtk_window_set_modal
 gtk_window_set_default_size
 gtk_window_set_gravity
 gtk_window_get_gravity
+gtk_window_set_hide_on_close
+gtk_window_get_hide_on_close
 GtkWindowPosition
 gtk_window_set_position
 gtk_window_set_transient_for
diff --git a/gtk/gtkwindow.c b/gtk/gtkwindow.c
index 527b6fc..41aba20 100644
--- a/gtk/gtkwindow.c
+++ b/gtk/gtkwindow.c
@@ -264,6 +264,7 @@ struct _GtkWindowPrivate
   guint    tiled                     : 1;
 
   guint    use_subsurface            : 1;
+  guint    hide_on_close             : 1;
 
   GdkWindowTypeHint type_hint;
 
@@ -309,6 +310,7 @@ enum {
   PROP_DEFAULT_WIDTH,
   PROP_DEFAULT_HEIGHT,
   PROP_DESTROY_WITH_PARENT,
+  PROP_HIDE_ON_CLOSE,
   PROP_ICON,
   PROP_ICON_NAME,
   PROP_DISPLAY,
@@ -415,6 +417,8 @@ static void gtk_window_size_allocate      (GtkWidget           *widget,
                                            const GtkAllocation *allocation,
                                            int                  baseline,
                                            GtkAllocation       *out_clip);
+static gboolean gtk_window_delete_event   (GtkWidget         *widget,
+                                           GdkEventAny       *event);
 static gboolean gtk_window_map_event      (GtkWidget         *widget,
                                            GdkEventAny       *event);
 static gint gtk_window_configure_event    (GtkWidget         *widget,
@@ -798,6 +802,7 @@ gtk_window_class_init (GtkWindowClass *klass)
   widget_class->realize = gtk_window_realize;
   widget_class->unrealize = gtk_window_unrealize;
   widget_class->size_allocate = gtk_window_size_allocate;
+  widget_class->delete_event = gtk_window_delete_event;
   widget_class->configure_event = gtk_window_configure_event;
   widget_class->event = gtk_window_event;
   widget_class->key_press_event = gtk_window_key_press_event;
@@ -907,6 +912,14 @@ gtk_window_class_init (GtkWindowClass *klass)
                             FALSE,
                             GTK_PARAM_READWRITE|G_PARAM_EXPLICIT_NOTIFY);
 
+  window_props[PROP_HIDE_ON_CLOSE] =
+      g_param_spec_boolean ("hide-on-close",
+                            P_("Hide on close"),
+                            P_("If this window should be hidden when the user clicks the close button"),
+                            FALSE,
+                            GTK_PARAM_READWRITE|G_PARAM_EXPLICIT_NOTIFY);
+
+
   window_props[PROP_ICON] =
       g_param_spec_object ("icon",
                            P_("Icon"),
@@ -2042,6 +2055,9 @@ gtk_window_set_property (GObject      *object,
     case PROP_DESTROY_WITH_PARENT:
       gtk_window_set_destroy_with_parent (window, g_value_get_boolean (value));
       break;
+    case PROP_HIDE_ON_CLOSE:
+      gtk_window_set_hide_on_close (window, g_value_get_boolean (value));
+      break;
     case PROP_ICON:
       gtk_window_set_icon (window,
                            g_value_get_object (value));
@@ -2153,6 +2169,9 @@ gtk_window_get_property (GObject      *object,
     case PROP_DESTROY_WITH_PARENT:
       g_value_set_boolean (value, priv->destroy_with_parent);
       break;
+    case PROP_HIDE_ON_CLOSE:
+      g_value_set_boolean (value, priv->hide_on_close);
+      break;
     case PROP_ICON:
       g_value_set_object (value, gtk_window_get_icon (window));
       break;
@@ -4055,6 +4074,50 @@ gtk_window_get_destroy_with_parent (GtkWindow *window)
   return window->priv->destroy_with_parent;
 }
 
+/**
+ * gtk_window_set_hide_on_close:
+ * @window: a #GtkWindow
+ * @setting: whether to hide the window when it is closed
+ *
+ * If @setting is %TRUE, then clicking the close button on the window
+ * will not destroy it, but only hide it.
+ *
+ * Since: 3.94
+ */
+void
+gtk_window_set_hide_on_close (GtkWindow *window,
+                              gboolean   setting)
+{
+  GtkWindowPrivate *priv = window->priv;
+
+  g_return_if_fail (GTK_IS_WINDOW (window));
+
+  if (priv->hide_on_close == setting)
+    return;
+
+  priv->hide_on_close = setting;
+
+  g_object_notify_by_pspec (G_OBJECT (window), window_props[PROP_HIDE_ON_CLOSE]);
+}
+
+/**
+ * gtk_window_get_hide_on_close:
+ * @window: a #GtkWindow
+ *
+ * Returns whether the window will be hidden when the close button is clicked.
+ *
+ * Returns: %TRUE if the window will be hidden
+ *
+ * Since: 3.94
+ */
+gboolean
+gtk_window_get_hide_on_close (GtkWindow *window)
+{
+  g_return_val_if_fail (GTK_IS_WINDOW (window), FALSE);
+
+  return window->priv->hide_on_close;
+}
+
 static GtkWindowGeometryInfo*
 gtk_window_get_geometry_info (GtkWindow *window,
                              gboolean   create)
@@ -5907,6 +5970,22 @@ gtk_window_destroy (GtkWidget *widget)
   GTK_WIDGET_CLASS (gtk_window_parent_class)->destroy (widget);
 }
 
+static gboolean
+gtk_window_delete_event (GtkWidget   *widget,
+                         GdkEventAny *event)
+{
+  GtkWindow *window = GTK_WINDOW (widget);
+  GtkWindowPrivate *priv = window->priv;
+
+  if (priv->hide_on_close)
+    {
+      gtk_widget_hide (widget);
+      return GDK_EVENT_STOP;
+    }
+
+  return GDK_EVENT_PROPAGATE;
+}
+
 static void
 gtk_window_finalize (GObject *object)
 {
diff --git a/gtk/gtkwindow.h b/gtk/gtkwindow.h
index dc23b54..859191f 100644
--- a/gtk/gtkwindow.h
+++ b/gtk/gtkwindow.h
@@ -227,6 +227,11 @@ void       gtk_window_set_destroy_with_parent  (GtkWindow           *window,
                                                 gboolean             setting);
 GDK_AVAILABLE_IN_ALL
 gboolean   gtk_window_get_destroy_with_parent  (GtkWindow           *window);
+GDK_AVAILABLE_IN_3_94
+void       gtk_window_set_hide_on_close        (GtkWindow           *window,
+                                                gboolean             setting);
+GDK_AVAILABLE_IN_3_94
+gboolean   gtk_window_get_hide_on_close        (GtkWindow           *window);
 GDK_AVAILABLE_IN_ALL
 void       gtk_window_set_mnemonics_visible    (GtkWindow           *window,
                                                 gboolean             setting);


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]