[bijiben] window: don't be aggressive in saving geometry



commit 61111aa67160aa8965376e74c87bf26786c717c1
Author: Mohammed Sadiq <sadiq sadiqpk org>
Date:   Wed Aug 23 09:33:56 2017 +0530

    window: don't be aggressive in saving geometry
    
    window geometry was been saved to gsettings for every minor change.
    This was causing too much I/O.
    
    So, save the geometry only after the change is complete (100 ms  is
    taken as the threshold for this).
    
    Also, since configure-event signal is emitted on window maximized/minimize
    events, avoid using window-state-event handlers.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=786664
    
    Signed-off-by: Isaque Galdino <igaldino gmail com>

 src/bjb-window-base.c |   69 ++++++++++++++++++++++--------------------------
 1 files changed, 32 insertions(+), 37 deletions(-)
---
diff --git a/src/bjb-window-base.c b/src/bjb-window-base.c
index 0c50a03..8b26c16 100644
--- a/src/bjb-window-base.c
+++ b/src/bjb-window-base.c
@@ -16,6 +16,7 @@
 
 
 #define BIJIBEN_MAIN_WIN_TITLE N_("Notes")
+#define SAVE_GEOMETRY_ID_TIMEOUT 100 /* ms */
 
 enum {
   PROP_0,
@@ -54,6 +55,7 @@ struct _BjbWindowBasePriv
   GtkWidget            *spinner;
   GtkWidget            *no_note;
 
+  guint                save_geometry_id;
 
   /* when a note is opened */
   BijiNoteObj          *note;
@@ -185,42 +187,25 @@ bjb_window_base_destroy (gpointer a, BjbWindowBase * self)
   bjb_controller_disconnect (self->priv->controller);
 }
 
-
 static gboolean
-bjb_application_window_state_changed (GtkWidget *widget,
-                                      GdkEvent  *event,
-                                      gpointer   user_data)
-{
-  GSettings *settings;
-  GdkWindowState state;
-  gboolean maximized;
-
-  settings = user_data;
-  state = gdk_window_get_state (gtk_widget_get_window (widget));
-  maximized = state & GDK_WINDOW_STATE_MAXIMIZED;
-
-  g_settings_set_boolean (settings, "window-maximized", maximized);
-
-  return FALSE;
-}
-
-
-static gboolean
-bjb_application_window_configured (GtkWidget *widget,
-                                   GdkEvent  *event,
-                                   gpointer   user_data)
+bjb_application_window_configured (gpointer   user_data)
 {
   BjbWindowBase *win;
   GSettings *settings;
   GVariant *variant;
-  GdkWindowState state;
   gint32 size[2];
   gint32 position[2];
+  gboolean maximized;
 
   win = BJB_WINDOW_BASE (user_data);
   settings = G_SETTINGS (win->priv->settings);
-  state = gdk_window_get_state (gtk_widget_get_window (widget));
-  if (state & GDK_WINDOW_STATE_MAXIMIZED)
+
+  win->priv->save_geometry_id = 0;
+
+  maximized = gtk_window_is_maximized (GTK_WINDOW (win));
+  g_settings_set_boolean (settings, "window-maximized", maximized);
+
+  if (maximized)
     return FALSE;
 
   gtk_window_get_size (GTK_WINDOW (win),
@@ -242,7 +227,25 @@ bjb_application_window_configured (GtkWidget *widget,
   return FALSE;
 }
 
+static gboolean
+bjb_window_base_configure_event (GtkWidget         *widget,
+                                 GdkEventConfigure *event)
+{
+  BjbWindowBase *self;
+  gboolean   retval;
+
+  self = BJB_WINDOW_BASE (widget);
 
+  if (self->priv->save_geometry_id != 0)
+    g_source_remove (self->priv->save_geometry_id);
+
+  self->priv->save_geometry_id = g_timeout_add (SAVE_GEOMETRY_ID_TIMEOUT,
+                                                bjb_application_window_configured,
+                                                self);
+  retval = GTK_WIDGET_CLASS (bjb_window_base_parent_class)->configure_event (widget,
+                                                                             event);
+  return retval;
+}
 
 
 /* Gobj */
@@ -324,16 +327,6 @@ bjb_window_base_constructed (GObject *obj)
                     G_CALLBACK (bjb_window_base_destroy),
                     self);
 
-  g_signal_connect (self,
-                    "window-state-event",
-                    G_CALLBACK (bjb_application_window_state_changed),
-                    priv->settings);
-
-  g_signal_connect (self,
-                    "configure-event",
-                    G_CALLBACK (bjb_application_window_configured),
-                    self);
-
   /* Keys */
 
   g_signal_connect (GTK_WIDGET (self),
@@ -389,13 +382,15 @@ static void
 bjb_window_base_class_init (BjbWindowBaseClass *klass)
 {
   GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
-
+  GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
 
   gobject_class->constructed = bjb_window_base_constructed;
   gobject_class->finalize = bjb_window_base_finalize ;
   gobject_class->get_property = bjb_window_base_get_property;
   gobject_class->set_property = bjb_window_base_set_property;
 
+  widget_class->configure_event = bjb_window_base_configure_event;
+
   g_type_class_add_private (klass, sizeof (BjbWindowBasePriv));
 
   bjb_win_base_signals[BJB_WIN_BASE_VIEW_CHANGED] = g_signal_new ("view-changed" ,


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