[gnome-control-center/wip/carlosg/calibrator-fixes: 2/7] wacom: Turn CcCalibArea into a window subclass




commit 20d232b5fd81b40c6a556ad660dee101d74d0526
Author: Carlos Garnacho <carlosg gnome org>
Date:   Sat Feb 12 13:09:03 2022 +0100

    wacom: Turn CcCalibArea into a window subclass
    
    Modernize a bit the code, since it will be easier to do some things
    as a window subclass.

 panels/wacom/calibrator/calibrator-gui.c | 182 ++++++++++++++++++-------------
 panels/wacom/calibrator/calibrator-gui.h |   4 +-
 panels/wacom/calibrator/calibrator.ui    |   7 +-
 3 files changed, 112 insertions(+), 81 deletions(-)
---
diff --git a/panels/wacom/calibrator/calibrator-gui.c b/panels/wacom/calibrator/calibrator-gui.c
index 88176e25e..31926c5e4 100644
--- a/panels/wacom/calibrator/calibrator-gui.c
+++ b/panels/wacom/calibrator/calibrator-gui.c
@@ -31,24 +31,31 @@
 #include "calibrator-gui.h"
 #include "cc-clock.h"
 
-struct CcCalibArea
+struct _CcCalibArea
 {
+  GtkWindow parent_instance;
+
   struct Calib calibrator;
   XYinfo       axis;
   gboolean     swap;
   gboolean     success;
   GdkDevice   *device;
 
-  GtkWidget  *window;
-  GtkBuilder *builder;
   GtkWidget  *error_revealer;
+  GtkWidget  *title_revealer;
+  GtkWidget  *subtitle_revealer;
   GtkWidget  *clock;
+  GtkWidget  *target1, *target2, *target3, *target4;
+  GtkWidget  *stack;
+  GtkWidget  *success_page;
   GtkCssProvider *style_provider;
 
   FinishCallback callback;
   gpointer       user_data;
 };
 
+G_DEFINE_TYPE (CcCalibArea, cc_calib_area, GTK_TYPE_WINDOW)
+
 /* Timeout parameters */
 #define MAX_TIME                15000 /* 15000 = 15 sec */
 #define END_TIME                750   /*  750 = 0.75 sec */
@@ -56,7 +63,7 @@ struct CcCalibArea
 static void
 cc_calib_area_notify_finish (CcCalibArea *area)
 {
-  gtk_widget_hide (area->window);
+  gtk_widget_hide (GTK_WIDGET (area));
 
   (*area->callback) (area, area->user_data);
 }
@@ -79,11 +86,7 @@ cc_calib_area_finish_idle_cb (CcCalibArea *area)
 static void
 set_success (CcCalibArea *area)
 {
-  GtkWidget *stack, *image;
-
-  stack = GTK_WIDGET (gtk_builder_get_object (area->builder, "stack"));
-  image = GTK_WIDGET (gtk_builder_get_object (area->builder, "success"));
-  gtk_stack_set_visible_child (GTK_STACK (stack), image);
+  gtk_stack_set_visible_child (GTK_STACK (area->stack), area->success_page);
 }
 
 static void
@@ -121,10 +124,10 @@ set_active_target (CcCalibArea *area,
                    int          n_target)
 {
   GtkWidget *targets[] = {
-    GTK_WIDGET (gtk_builder_get_object (area->builder, "target1")),
-    GTK_WIDGET (gtk_builder_get_object (area->builder, "target2")),
-    GTK_WIDGET (gtk_builder_get_object (area->builder, "target3")),
-    GTK_WIDGET (gtk_builder_get_object (area->builder, "target4")),
+    area->target1,
+    area->target2,
+    area->target3,
+    area->target4,
   };
   int i;
 
@@ -203,10 +206,7 @@ on_clock_finished (CcClock     *clock,
 static void
 on_title_revealed (CcCalibArea *area)
 {
-  GtkWidget *revealer;
-
-  revealer = GTK_WIDGET (gtk_builder_get_object (area->builder, "subtitle_revealer"));
-  gtk_revealer_set_reveal_child (GTK_REVEALER (revealer), TRUE);
+  gtk_revealer_set_reveal_child (GTK_REVEALER (area->subtitle_revealer), TRUE);
 }
 
 static void
@@ -214,59 +214,64 @@ on_fullscreen (GtkWindow    *window,
                GParamSpec   *pspec,
                CcCalibArea  *area)
 {
-  GtkWidget *revealer;
-
   if (!gtk_window_is_fullscreen (window))
     return;
 
-  revealer = GTK_WIDGET (gtk_builder_get_object (area->builder, "title_revealer"));
-  g_signal_connect_swapped (revealer, "notify::child-revealed",
+  g_signal_connect_swapped (area->title_revealer,
+                            "notify::child-revealed",
                             G_CALLBACK (on_title_revealed),
                             area);
-  gtk_revealer_set_reveal_child (GTK_REVEALER (revealer), TRUE);
+  gtk_revealer_set_reveal_child (GTK_REVEALER (area->title_revealer), TRUE);
 
   set_active_target (area, 0);
 }
 
-/**
- * Creates the windows and other objects required to do calibration
- * under GTK. When the window is closed (timed out, calibration finished
- * or user cancellation), callback will be called, where you should call
- * cc_calib_area_finish().
- */
-CcCalibArea *
-cc_calib_area_new (GdkDisplay     *display,
-                   int             n_monitor,
-                   GdkDevice      *device,
-                   FinishCallback  callback,
-                   gpointer        user_data,
-                   int             threshold_doubleclick,
-                   int             threshold_misclick)
+static void
+cc_calib_area_finalize (GObject *object)
 {
-  g_autoptr(GdkMonitor) monitor = NULL;
-  CcCalibArea *calib_area;
-  GdkRectangle rect;
-  GtkGesture *click;
-  GtkEventController *key;
+  CcCalibArea *area = CC_CALIB_AREA (object);
 
-  g_return_val_if_fail (callback, NULL);
+  gtk_style_context_remove_provider_for_display (gtk_widget_get_display (GTK_WIDGET (area)),
+                                                 GTK_STYLE_PROVIDER (area->style_provider));
+
+  G_OBJECT_CLASS (cc_calib_area_parent_class)->finalize (object);
+}
+
+static void
+cc_calib_area_class_init (CcCalibAreaClass *klass)
+{
+  GObjectClass *object_class = G_OBJECT_CLASS (klass);
+  GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
+
+  object_class->finalize = cc_calib_area_finalize;
 
   g_type_ensure (CC_TYPE_CLOCK);
 
-  calib_area = g_new0 (CcCalibArea, 1);
-  calib_area->callback = callback;
-  calib_area->user_data = user_data;
-  calib_area->device = device;
-  calib_area->calibrator.threshold_doubleclick = threshold_doubleclick;
-  calib_area->calibrator.threshold_misclick = threshold_misclick;
+  gtk_widget_class_set_template_from_resource (widget_class, 
"/org/gnome/control-center/wacom/calibrator/calibrator.ui");
+
+  gtk_widget_class_bind_template_child (widget_class, CcCalibArea, error_revealer);
+  gtk_widget_class_bind_template_child (widget_class, CcCalibArea, title_revealer);
+  gtk_widget_class_bind_template_child (widget_class, CcCalibArea, subtitle_revealer);
+  gtk_widget_class_bind_template_child (widget_class, CcCalibArea, clock);
+  gtk_widget_class_bind_template_child (widget_class, CcCalibArea, target1);
+  gtk_widget_class_bind_template_child (widget_class, CcCalibArea, target2);
+  gtk_widget_class_bind_template_child (widget_class, CcCalibArea, target3);
+  gtk_widget_class_bind_template_child (widget_class, CcCalibArea, target4);
+  gtk_widget_class_bind_template_child (widget_class, CcCalibArea, stack);
+  gtk_widget_class_bind_template_child (widget_class, CcCalibArea, success_page);
+}
+
+static void
+cc_calib_area_init (CcCalibArea *calib_area)
+{
+  GtkGesture *click;
+  GtkEventController *key;
+
+  gtk_widget_init_template (GTK_WIDGET (calib_area));
 
-  calib_area->builder = gtk_builder_new_from_resource 
("/org/gnome/control-center/wacom/calibrator/calibrator.ui");
-  calib_area->window = GTK_WIDGET (gtk_builder_get_object (calib_area->builder, "window"));
-  calib_area->error_revealer = GTK_WIDGET (gtk_builder_get_object (calib_area->builder, "error_revealer"));
-  calib_area->clock = GTK_WIDGET (gtk_builder_get_object (calib_area->builder, "clock"));
   calib_area->style_provider = gtk_css_provider_new ();
   gtk_css_provider_load_from_resource (calib_area->style_provider, 
"/org/gnome/control-center/wacom/calibrator/calibrator.css");
-  gtk_style_context_add_provider_for_display (gtk_widget_get_display (calib_area->window),
+  gtk_style_context_add_provider_for_display (gtk_widget_get_display (GTK_WIDGET (calib_area)),
                                               GTK_STYLE_PROVIDER (calib_area->style_provider),
                                               GTK_STYLE_PROVIDER_PRIORITY_USER);
 
@@ -276,25 +281,17 @@ cc_calib_area_new (GdkDisplay     *display,
 
 #ifndef FAKE_AREA
   /* No cursor */
-  gtk_widget_realize (calib_area->window);
-  gtk_widget_set_cursor_from_name (calib_area->window, "blank");
+  gtk_widget_realize (GTK_WIDGET (calib_area));
+  gtk_widget_set_cursor_from_name (GTK_WIDGET (calib_area), "blank");
 
-  gtk_widget_set_can_focus (calib_area->window, TRUE);
+  gtk_widget_set_can_focus (GTK_WIDGET (calib_area), TRUE);
 #endif /* FAKE_AREA */
 
-  /* Move to correct screen */
-  if (display == NULL)
-    display = gdk_display_get_default ();
-  monitor = g_list_model_get_item (gdk_display_get_monitors (display), n_monitor);
-  gdk_monitor_get_geometry (monitor, &rect);
-
-  calib_area->calibrator.geometry = rect;
-
-  g_signal_connect (calib_area->window,
+  g_signal_connect (calib_area,
                     "close-request",
                     G_CALLBACK (on_close_request),
                     calib_area);
-  g_signal_connect (calib_area->window,
+  g_signal_connect (calib_area,
                     "notify::fullscreened",
                     G_CALLBACK (on_fullscreen),
                     calib_area);
@@ -303,15 +300,53 @@ cc_calib_area_new (GdkDisplay     *display,
   gtk_gesture_single_set_button (GTK_GESTURE_SINGLE (click), GDK_BUTTON_PRIMARY);
   g_signal_connect (click, "pressed",
                     G_CALLBACK (on_gesture_press), calib_area);
-  gtk_widget_add_controller (calib_area->window, GTK_EVENT_CONTROLLER (click));
+  gtk_widget_add_controller (GTK_WIDGET (calib_area),
+                             GTK_EVENT_CONTROLLER (click));
 
   key = gtk_event_controller_key_new ();
   g_signal_connect (key, "key-released",
                     G_CALLBACK (on_key_release), calib_area);
-  gtk_widget_add_controller (calib_area->window, key);
+  gtk_widget_add_controller (GTK_WIDGET (calib_area), key);
+}
+
+/**
+ * Creates the windows and other objects required to do calibration
+ * under GTK. When the window is closed (timed out, calibration finished
+ * or user cancellation), callback will be called, where you should call
+ * cc_calib_area_finish().
+ */
+CcCalibArea *
+cc_calib_area_new (GdkDisplay     *display,
+                   int             n_monitor,
+                   GdkDevice      *device,
+                   FinishCallback  callback,
+                   gpointer        user_data,
+                   int             threshold_doubleclick,
+                   int             threshold_misclick)
+{
+  CcCalibArea *calib_area;
+  g_autoptr(GdkMonitor) monitor = NULL;
+  GdkRectangle rect;
+
+  g_return_val_if_fail (callback, NULL);
 
-  gtk_window_fullscreen_on_monitor (GTK_WINDOW (calib_area->window), monitor);
-  gtk_widget_show (calib_area->window);
+  calib_area = g_object_new (CC_TYPE_CALIB_AREA, NULL);
+  calib_area->callback = callback;
+  calib_area->user_data = user_data;
+  calib_area->device = device;
+  calib_area->calibrator.threshold_doubleclick = threshold_doubleclick;
+  calib_area->calibrator.threshold_misclick = threshold_misclick;
+
+  /* Move to correct screen */
+  if (display == NULL)
+    display = gdk_display_get_default ();
+  monitor = g_list_model_get_item (gdk_display_get_monitors (display), n_monitor);
+  gdk_monitor_get_geometry (monitor, &rect);
+
+  calib_area->calibrator.geometry = rect;
+
+  gtk_window_fullscreen_on_monitor (GTK_WINDOW (calib_area), monitor);
+  gtk_widget_show (GTK_WIDGET (calib_area));
 
   return calib_area;
 }
@@ -338,12 +373,7 @@ cc_calib_area_finish (CcCalibArea *area)
 void
 cc_calib_area_free (CcCalibArea *area)
 {
-  g_return_if_fail (area != NULL);
-
-  gtk_style_context_remove_provider_for_display (gtk_widget_get_display (area->window),
-                                                 GTK_STYLE_PROVIDER (area->style_provider));
-  gtk_window_destroy (GTK_WINDOW (area->window));
-  g_free (area);
+  gtk_window_destroy (GTK_WINDOW (area));
 }
 
 void
diff --git a/panels/wacom/calibrator/calibrator-gui.h b/panels/wacom/calibrator/calibrator-gui.h
index 099ffd707..4c102785d 100644
--- a/panels/wacom/calibrator/calibrator-gui.h
+++ b/panels/wacom/calibrator/calibrator-gui.h
@@ -36,7 +36,9 @@ typedef struct
        gdouble y_max;
 } XYinfo;
 
-typedef struct CcCalibArea CcCalibArea;
+#define CC_TYPE_CALIB_AREA cc_calib_area_get_type ()
+G_DECLARE_FINAL_TYPE (CcCalibArea, cc_calib_area, CC, CALIB_AREA, GtkWindow)
+
 typedef void (*FinishCallback) (CcCalibArea *area, gpointer user_data);
 
 CcCalibArea * cc_calib_area_new (GdkDisplay      *display,
diff --git a/panels/wacom/calibrator/calibrator.ui b/panels/wacom/calibrator/calibrator.ui
index f2fc2c564..89d4865ab 100644
--- a/panels/wacom/calibrator/calibrator.ui
+++ b/panels/wacom/calibrator/calibrator.ui
@@ -1,7 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <interface>
-  <requires lib="gtk" version="4.0"/>
-  <object class="GtkWindow" id="window">
+  <template class="CcCalibArea" parent="GtkWindow">
     <property name="name">calibrator</property>
     <property name="child">
       <object class="GtkStack" id="stack">
@@ -129,14 +128,14 @@
           </object>
         </child>
         <child>
-          <object class="GtkImage" id="success">
+          <object class="GtkImage" id="success_page">
             <property name="pixel_size">300</property>
             <property name="icon_name">emblem-ok-symbolic</property>
           </object>
         </child>
       </object>
     </property>
-  </object>
+  </template>
   <object class="GtkSizeGroup">
     <property name="mode">vertical</property>
     <widgets>


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