[console/zbrown/quick-ci-check: 4/4] terminal: bind to a settings object




commit 6ac3b779a45dfc085bb8b80843eaf0ef69fb630c
Author: Zander Brown <zbrown gnome org>
Date:   Wed Aug 24 15:22:25 2022 +0100

    terminal: bind to a settings object
    
    Rather than expecting a host to set our properties correctly, bind
    directly to KgxSettings

 src/kgx-simple-tab.ui |  3 ++
 src/kgx-tab.c         | 14 --------
 src/kgx-tab.ui        |  3 --
 src/kgx-terminal.c    | 99 ++++++++++++++++++++++++++++-----------------------
 4 files changed, 58 insertions(+), 61 deletions(-)
---
diff --git a/src/kgx-simple-tab.ui b/src/kgx-simple-tab.ui
index aeb38d0..4d109f3 100644
--- a/src/kgx-simple-tab.ui
+++ b/src/kgx-simple-tab.ui
@@ -16,6 +16,9 @@
           <object class="KgxTerminal" id="terminal">
             <property name="vexpand">True</property>
             <property name="allow-hyperlink">True</property>
+            <binding name="settings">
+              <lookup name="settings">KgxSimpleTab</lookup>
+            </binding>
             <signal name="notify::path" handler="path_changed" swapped="no"/>
           </object>
         </property>
diff --git a/src/kgx-tab.c b/src/kgx-tab.c
index 84caceb..ea06d80 100644
--- a/src/kgx-tab.c
+++ b/src/kgx-tab.c
@@ -57,7 +57,6 @@ struct _KgxTabPrivate {
   KgxTerminal          *terminal;
   GSignalGroup         *terminal_signals;
   GBindingGroup        *terminal_binds;
-  GBindingGroup        *settings_binds;
 
   GtkWidget            *stack;
   GtkWidget            *spinner_revealer;
@@ -369,18 +368,6 @@ kgx_tab_set_property (GObject      *object,
       break;
     case PROP_TERMINAL:
       g_set_object (&priv->terminal, g_value_get_object (value));
-      g_binding_group_bind (priv->settings_binds, "font",
-                            priv->terminal, "font-desc",
-                            G_BINDING_SYNC_CREATE);
-      g_binding_group_bind (priv->settings_binds, "font-scale",
-                            priv->terminal, "font-scale",
-                            G_BINDING_SYNC_CREATE);
-      g_binding_group_bind (priv->settings_binds, "theme",
-                            priv->terminal, "theme",
-                            G_BINDING_SYNC_CREATE);
-      g_binding_group_bind (priv->settings_binds, "scrollback-lines",
-                            priv->terminal, "scrollback-lines",
-                            G_BINDING_SYNC_CREATE);
       break;
     case PROP_TAB_TITLE:
       g_clear_pointer (&priv->title, g_free);
@@ -639,7 +626,6 @@ kgx_tab_class_init (KgxTabClass *klass)
   gtk_widget_class_bind_template_child_private (widget_class, KgxTab, search_bar);
   gtk_widget_class_bind_template_child_private (widget_class, KgxTab, terminal_signals);
   gtk_widget_class_bind_template_child_private (widget_class, KgxTab, terminal_binds);
-  gtk_widget_class_bind_template_child_private (widget_class, KgxTab, settings_binds);
 
   gtk_widget_class_bind_template_callback (widget_class, search_enabled);
   gtk_widget_class_bind_template_callback (widget_class, search_changed);
diff --git a/src/kgx-tab.ui b/src/kgx-tab.ui
index 2252002..76bb39f 100644
--- a/src/kgx-tab.ui
+++ b/src/kgx-tab.ui
@@ -101,7 +101,4 @@
   <object class="GBindingGroup" id="terminal_binds">
     <property name="source" bind-source="KgxTab" bind-property="terminal" bind-flags="sync-create"/>
   </object>
-  <object class="GBindingGroup" id="settings_binds">
-    <property name="source" bind-source="KgxTab" bind-property="settings" bind-flags="sync-create"/>
-  </object>
 </interface>
diff --git a/src/kgx-terminal.c b/src/kgx-terminal.c
index 7fa18b7..b9ff115 100644
--- a/src/kgx-terminal.c
+++ b/src/kgx-terminal.c
@@ -80,11 +80,11 @@ static const char *links[KGX_TERMINAL_N_LINK_REGEX] = {
  * Stability: Private
  */
 struct _KgxTerminal {
-  /*< private >*/
   VteTerminal parent_instance;
 
-  /*< public >*/
-  KgxTheme    theme;
+  KgxSettings   *settings;
+  GSignalGroup  *settings_signals;
+  GBindingGroup *settings_binds;
   GtkWidget  *popup_menu;
 
   /* Hyperlinks */
@@ -99,7 +99,7 @@ G_DEFINE_TYPE (KgxTerminal, kgx_terminal, VTE_TYPE_TERMINAL)
 
 enum {
   PROP_0,
-  PROP_THEME,
+  PROP_SETTINGS,
   PROP_PATH,
   LAST_PROP
 };
@@ -121,13 +121,18 @@ kgx_terminal_dispose (GObject *object)
   g_clear_pointer (&self->current_url, g_free);
   g_clear_pointer (&self->popup_menu, gtk_widget_unparent);
 
+  g_clear_object (&self->settings);
+  g_clear_object (&self->settings_signals);
+  g_clear_object (&self->settings_binds);
+
   G_OBJECT_CLASS (kgx_terminal_parent_class)->dispose (object);
 }
 
 
 static void
-update_terminal_colors (KgxTerminal *self)
+update_terminal_colours (KgxTerminal *self)
 {
+  KgxTheme current_theme;
   KgxTheme resolved_theme;
   GdkRGBA fg;
   GdkRGBA bg;
@@ -152,7 +157,13 @@ update_terminal_colors (KgxTerminal *self)
     GDK_RGBA ("f6f5f4"), // Bright White
   };
 
-  if (self->theme == KGX_THEME_AUTO) {
+  if (!self->settings) {
+    return;
+  }
+
+  g_object_get (self->settings, "theme", &current_theme, NULL);
+
+  if (current_theme == KGX_THEME_AUTO) {
     AdwStyleManager *manager = adw_style_manager_get_default ();
 
     if (adw_style_manager_get_dark (manager)) {
@@ -161,7 +172,7 @@ update_terminal_colors (KgxTerminal *self)
       resolved_theme = KGX_THEME_DAY;
     }
   } else {
-    resolved_theme = self->theme;
+    resolved_theme = current_theme;
   }
 
   switch (resolved_theme) {
@@ -185,21 +196,6 @@ update_terminal_colors (KgxTerminal *self)
 }
 
 
-static void
-kgx_terminal_set_theme (KgxTerminal *self,
-                        KgxTheme     theme)
-{
-  if (self->theme == theme) {
-    return;
-  }
-
-  self->theme = theme;
-  update_terminal_colors (self);
-
-  g_object_notify_by_pspec (G_OBJECT (self), pspecs[PROP_THEME]);
-}
-
-
 static void
 kgx_terminal_set_property (GObject      *object,
                            guint         property_id,
@@ -209,8 +205,9 @@ kgx_terminal_set_property (GObject      *object,
   KgxTerminal *self = KGX_TERMINAL (object);
 
   switch (property_id) {
-    case PROP_THEME:
-      kgx_terminal_set_theme (self, g_value_get_enum (value));
+    case PROP_SETTINGS:
+      g_set_object (&self->settings, g_value_get_object (value));
+      update_terminal_colours (self);
       break;
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
@@ -218,6 +215,7 @@ kgx_terminal_set_property (GObject      *object,
   }
 }
 
+
 static void
 kgx_terminal_get_property (GObject    *object,
                            guint       property_id,
@@ -229,8 +227,8 @@ kgx_terminal_get_property (GObject    *object,
   g_autoptr (GFile) path = NULL;
 
   switch (property_id) {
-    case PROP_THEME:
-      g_value_set_enum (value, self->theme);
+    case PROP_SETTINGS:
+      g_value_set_object (value, self->settings);
       break;
     case PROP_PATH:
       if ((uri = vte_terminal_get_current_file_uri (VTE_TERMINAL (self)))) {
@@ -569,21 +567,10 @@ kgx_terminal_class_init (KgxTerminalClass *klass)
   widget_class->size_allocate = kgx_terminal_size_allocate;
   widget_class->direction_changed = kgx_terminal_direction_changed;
 
-  /**
-   * KgxTerminal:theme:
-   *
-   * The palette to use, one of the values of #KgxTheme
-   *
-   * Officially only "night" exists, "hacker" is just a little fun
-   *
-   * Bound to #KgxApplication:theme on the #KgxApplication
-   *
-   * Stability: Private
-   */
-  pspecs[PROP_THEME] =
-    g_param_spec_enum ("theme", "Theme", "Terminal theme",
-                       KGX_TYPE_THEME, KGX_THEME_NIGHT,
-                       G_PARAM_READWRITE);
+  pspecs[PROP_SETTINGS] =
+    g_param_spec_object ("settings", NULL, NULL,
+                         KGX_TYPE_SETTINGS,
+                         G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS);
 
   /**
    * KgxTerminal:path:
@@ -755,8 +742,12 @@ location_changed (KgxTerminal *self)
 static void
 dark_changed (KgxTerminal *self)
 {
-  if (self->theme == KGX_THEME_AUTO) {
-    update_terminal_colors (self);
+  KgxTheme theme;
+
+  g_object_get (self->settings, "theme", &theme, NULL);
+
+  if (theme == KGX_THEME_AUTO) {
+    update_terminal_colours (self);
   }
 }
 
@@ -832,7 +823,27 @@ kgx_terminal_init (KgxTerminal *self)
                            "notify::dark", G_CALLBACK (dark_changed),
                            self, G_CONNECT_SWAPPED);
 
-  update_terminal_colors (self);
+  self->settings_signals = g_signal_group_new (KGX_TYPE_SETTINGS);
+  g_object_bind_property (self, "settings",
+                          self->settings_signals, "target",
+                          G_BINDING_DEFAULT);
+  g_signal_group_connect_swapped (self->settings_signals,
+                                  "notify::theme", G_CALLBACK (update_terminal_colours),
+                                  self);
+
+  self->settings_binds = g_binding_group_new ();
+  g_object_bind_property (self, "settings",
+                          self->settings_binds, "source",
+                          G_BINDING_DEFAULT);
+  g_binding_group_bind (self->settings_binds, "font",
+                        self, "font-desc",
+                        G_BINDING_SYNC_CREATE);
+  g_binding_group_bind (self->settings_binds, "font-scale",
+                        self, "font-scale",
+                        G_BINDING_SYNC_CREATE);
+  g_binding_group_bind (self->settings_binds, "scrollback-lines",
+                        self, "scrollback-lines",
+                        G_BINDING_SYNC_CREATE);
 }
 
 


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