[gtk/wip/matthiasc/popup4: 94/94] root: Drop default handling



commit 002d41b0eec96aa0347e5a1d79d3f787cee490fc
Author: Matthias Clasen <mclasen redhat com>
Date:   Sat Apr 27 04:06:17 2019 +0000

    root: Drop default handling
    
    We no longer treat the default as generic thing.
    Instead, GtkWindow and GtkPopover have their own
    ways to set defaults.

 docs/reference/gtk/gtk4-sections.txt |  3 --
 gtk/gtkpopover.c                     | 55 +++++++++++++++++++++-
 gtk/gtkpopover.h                     |  6 ++-
 gtk/gtkroot.c                        | 90 ------------------------------------
 gtk/gtkroot.h                        |  8 ----
 gtk/gtkwindow.c                      | 22 ++++++---
 6 files changed, 74 insertions(+), 110 deletions(-)
---
diff --git a/docs/reference/gtk/gtk4-sections.txt b/docs/reference/gtk/gtk4-sections.txt
index 156abe8739..8ee5751c6c 100644
--- a/docs/reference/gtk/gtk4-sections.txt
+++ b/docs/reference/gtk/gtk4-sections.txt
@@ -6452,9 +6452,6 @@ gtk_popover_set_pointing_to
 gtk_popover_get_pointing_to
 gtk_popover_set_position
 gtk_popover_get_position
-GtkPopoverConstraint
-gtk_popover_set_constrain_to
-gtk_popover_get_constrain_to
 gtk_popover_set_modal
 gtk_popover_get_modal
 gtk_popover_set_default_widget
diff --git a/gtk/gtkpopover.c b/gtk/gtkpopover.c
index 4c222e87f0..177ff35088 100644
--- a/gtk/gtkpopover.c
+++ b/gtk/gtkpopover.c
@@ -159,6 +159,7 @@ enum {
   PROP_POINTING_TO,
   PROP_POSITION,
   PROP_MODAL,
+  PROP_DEFAULT_WIDGET,
   NUM_PROPERTIES
 };
 
@@ -680,6 +681,10 @@ gtk_popover_set_property (GObject      *object,
       gtk_popover_set_modal (popover, g_value_get_boolean (value));
       break;
 
+    case PROP_DEFAULT_WIDGET:
+      gtk_popover_set_default_widget (popover, g_value_get_object (value));
+      break;
+
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
       break;
@@ -804,6 +809,12 @@ gtk_popover_class_init (GtkPopoverClass *klass)
                             P_("Whether the popover is modal"),
                             TRUE,
                             GTK_PARAM_READWRITE|G_PARAM_EXPLICIT_NOTIFY);
+  properties[PROP_DEFAULT_WIDGET] =
+      g_param_spec_object ("default-widget",
+                           P_("Default widget"),
+                           P_("The default widget"),
+                           GTK_TYPE_WIDGET,
+                           GTK_PARAM_READWRITE|G_PARAM_EXPLICIT_NOTIFY);
 
   g_object_class_install_properties (object_class, NUM_PROPERTIES, properties);
 
@@ -1246,5 +1257,47 @@ gtk_popover_set_default_widget (GtkPopover *popover,
 {
   GtkPopoverPrivate *priv = gtk_popover_get_instance_private (popover);
 
-  priv->default_widget = widget;
+  g_return_if_fail (GTK_IS_POPOVER (popover));
+
+  if (widget)
+    g_return_if_fail (gtk_widget_get_can_default (widget));
+
+  if (priv->default_widget != widget)
+    {
+      GtkWidget *old_default_widget = NULL;
+
+      if (priv->default_widget)
+        {
+          old_default_widget = priv->default_widget;
+          _gtk_widget_set_has_default (priv->default_widget, FALSE);
+          gtk_widget_queue_draw (priv->default_widget);
+        }
+
+      priv->default_widget = widget;
+
+      if (priv->default_widget)
+        {
+          _gtk_widget_set_has_default (priv->default_widget, TRUE);
+          gtk_widget_queue_draw (priv->default_widget);
+        }
+
+      if (old_default_widget)
+        g_object_notify (G_OBJECT (old_default_widget), "has-default");
+
+      if (widget)
+        g_object_notify (G_OBJECT (widget), "has-default");
+
+      g_object_notify (G_OBJECT (popover), "default-widget");
+    }
 }
+
+GtkWidget *
+gtk_popover_get_default_widget (GtkPopover *popover)
+{
+  GtkPopoverPrivate *priv = gtk_popover_get_instance_private (popover);
+
+  g_return_val_if_fail (GTK_IS_POPOVER (popover), NULL);
+
+  return priv->default_widget;
+}
+
diff --git a/gtk/gtkpopover.h b/gtk/gtkpopover.h
index e9456bd7cb..73d7997fa1 100644
--- a/gtk/gtkpopover.h
+++ b/gtk/gtkpopover.h
@@ -102,8 +102,10 @@ GDK_AVAILABLE_IN_ALL
 void            gtk_popover_popdown (GtkPopover *popover);
 
 GDK_AVAILABLE_IN_ALL
-void gtk_popover_set_default_widget (GtkPopover *popover,
-                                     GtkWidget  *widget);
+void            gtk_popover_set_default_widget (GtkPopover *popover,
+                                                GtkWidget  *widget);
+GDK_AVAILABLE_IN_ALL
+GtkWidget     * gtk_popover_get_default_widget (GtkPopover *popover);
 
 GDK_AVAILABLE_IN_ALL
 GListModel *    gtk_popover_get_popovers (void);
diff --git a/gtk/gtkroot.c b/gtk/gtkroot.c
index b9f5858cef..ad89b09517 100644
--- a/gtk/gtkroot.c
+++ b/gtk/gtkroot.c
@@ -135,13 +135,6 @@ gtk_root_default_init (GtkRootInterface *iface)
                            P_("The focus widget"),
                            GTK_TYPE_WIDGET,
                            GTK_PARAM_READWRITE|G_PARAM_EXPLICIT_NOTIFY));
-
-  g_object_interface_install_property (iface,
-      g_param_spec_object ("default-widget",
-                           P_("Default widget"),
-                           P_("The default widget"),
-                           GTK_TYPE_WIDGET,
-                           GTK_PARAM_READWRITE|G_PARAM_EXPLICIT_NOTIFY));
 }
 
 GdkDisplay *
@@ -277,94 +270,11 @@ gtk_root_activate_focus (GtkRoot *self)
   return FALSE;
 }
 
-/**
- * gtk_root_set_default:
- * @self: a #GtkRoot
- * @widget: (allow-none): widget to be the default, or %NULL
- *     to unset the default widget
- *
- * The default widget is the widget that’s activated when the user
- * presses Enter in a dialog (for example). This function sets or
- * unsets the default widget for a #GtkRoot.
- *
- * When setting (rather than unsetting) the default widget it is
- * generally easier to call gtk_widget_grab_default() on the widget.
- * Before making a widget the default widget, you must call
- * gtk_widget_set_can_default() on the widget you’d like to make
- * the default.
- */
-void
-gtk_root_set_default (GtkRoot   *self,
-                      GtkWidget *widget)
-{
-  g_return_if_fail (GTK_IS_ROOT (self));
-  g_return_if_fail (widget == NULL || GTK_IS_WIDGET (widget));
-
-  g_object_set (self, "default-widget", widget, NULL);
-}
-
-/**
- * gtk_root_get_default:
- * @self: a #GtkRoot
- *
- * Returns the default widget for @root. See
- * gtk_root_set_default() for more details.
- *
- * Returns: (nullable) (transfer none): the default widget, or %NULL
- *     if there is none
- */
-GtkWidget *
-gtk_root_get_default (GtkRoot *self)
-{
-  GtkWidget *widget;
-
-  g_return_val_if_fail (GTK_IS_ROOT (self), NULL);
-
-  g_object_get (self, "default-widget", &widget, NULL);
-
-  if (widget)
-    g_object_unref (widget);
-
-  return widget;
-}
-
-/**
- * gtk_root_activate_default:
- * @self: a #GtkRoot
- *
- * Activates the default widget for the window, unless the current
- * focused widget has been configured to receive the default action
- * (see gtk_widget_set_receives_default()), in which case the
- * focused widget is activated.
- *
- * Returns: %TRUE if a widget got activated
- */
-gboolean
-gtk_root_activate_default (GtkRoot *self)
-{
-  GtkWidget *default_widget;
-  GtkWidget *focus_widget;
-
-  g_return_val_if_fail (GTK_IS_ROOT (self), FALSE);
-
-  default_widget = gtk_root_get_default (self);
-  focus_widget = gtk_root_get_focus (self);
-
-  if (default_widget && gtk_widget_is_sensitive (default_widget) &&
-      (!focus_widget || !gtk_widget_get_receives_default (focus_widget)))
-    return gtk_widget_activate (default_widget);
-  else if (focus_widget && gtk_widget_is_sensitive (focus_widget))
-    return gtk_widget_activate (focus_widget);
-
-  return FALSE;
-}
-
 guint
 gtk_root_install_properties (GObjectClass *object_class,
                              guint         first_prop)
 {
   g_object_class_override_property (object_class, first_prop + GTK_ROOT_PROP_FOCUS_WIDGET, "focus-widget");
-  g_object_class_override_property (object_class, first_prop + GTK_ROOT_PROP_DEFAULT_WIDGET, 
"default-widget");
   return GTK_ROOT_NUM_PROPERTIES;
 }
 
diff --git a/gtk/gtkroot.h b/gtk/gtkroot.h
index b045005eea..81439e5b9a 100644
--- a/gtk/gtkroot.h
+++ b/gtk/gtkroot.h
@@ -103,14 +103,6 @@ GtkWidget * gtk_root_get_focus (GtkRoot   *self);
 GDK_AVAILABLE_IN_ALL
 gboolean    gtk_root_activate_focus (GtkRoot *self);
 
-GDK_AVAILABLE_IN_ALL
-void        gtk_root_set_default (GtkRoot   *self,
-                                  GtkWidget *widget);
-GDK_AVAILABLE_IN_ALL
-GtkWidget * gtk_root_get_default (GtkRoot   *self);
-GDK_AVAILABLE_IN_ALL
-gboolean    gtk_root_activate_default (GtkRoot *self);
-
 GDK_AVAILABLE_IN_ALL
 void        gtk_root_add_mnemonic      (GtkRoot   *root,
                                         guint      keyval,
diff --git a/gtk/gtkwindow.c b/gtk/gtkwindow.c
index 032cdfffa0..b9eb9ab968 100644
--- a/gtk/gtkwindow.c
+++ b/gtk/gtkwindow.c
@@ -336,6 +336,7 @@ enum {
   PROP_FOCUS_VISIBLE,
 
   PROP_IS_MAXIMIZED,
+  PROP_DEFAULT_WIDGET,
 
   LAST_ARG
 };
@@ -1072,6 +1073,13 @@ gtk_window_class_init (GtkWindowClass *klass)
                            GTK_TYPE_APPLICATION,
                            GTK_PARAM_READWRITE|G_PARAM_STATIC_STRINGS|G_PARAM_EXPLICIT_NOTIFY);
 
+  window_props[PROP_DEFAULT_WIDGET] =
+      g_param_spec_object ("default-widget",
+                           P_("Default widget"),
+                           P_("The default widget"),
+                           GTK_TYPE_WIDGET,
+                           GTK_PARAM_READWRITE|G_PARAM_EXPLICIT_NOTIFY);
+
   g_object_class_install_properties (gobject_class, LAST_ARG, window_props);
   gtk_root_install_properties (gobject_class, LAST_ARG);
 
@@ -2040,12 +2048,14 @@ gtk_window_set_property (GObject      *object,
     case PROP_FOCUS_VISIBLE:
       gtk_window_set_focus_visible (window, g_value_get_boolean (value));
       break;
+    case PROP_DEFAULT_WIDGET:
+      gtk_window_set_default (window, g_value_get_object (value));
+      break;
+
     case LAST_ARG + GTK_ROOT_PROP_FOCUS_WIDGET:
       gtk_window_set_focus (window, g_value_get_object (value));
       break;
-    case LAST_ARG + GTK_ROOT_PROP_DEFAULT_WIDGET:
-      gtk_window_set_default (window, g_value_get_object (value));
-      break;
+
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
       break;
@@ -2143,12 +2153,12 @@ gtk_window_get_property (GObject      *object,
     case PROP_IS_MAXIMIZED:
       g_value_set_boolean (value, gtk_window_is_maximized (window));
       break;
+    case PROP_DEFAULT_WIDGET:
+      g_value_set_object (value, gtk_window_get_default_widget (window));
+      break;
     case LAST_ARG + GTK_ROOT_PROP_FOCUS_WIDGET:
       g_value_set_object (value, gtk_window_get_focus (window));
       break;
-    case LAST_ARG + GTK_ROOT_PROP_DEFAULT_WIDGET:
-      g_value_set_object (value, gtk_window_get_default_widget (window));
-      break;
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
       break;


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