[gnome-flashback] desktop: add ready signals



commit a3d90c0e82d253e7fe6464ad219cc94b93d41c8b
Author: Alberts Muktupāvels <alberts muktupavels gmail com>
Date:   Tue Oct 29 00:55:12 2019 +0200

    desktop: add ready signals
    
    Signals will be used to show desktop window when background is
    ready to avoid visual problems.

 gnome-flashback/libdesktop/gf-background.c     | 18 +++++++++++
 gnome-flashback/libdesktop/gf-desktop-window.c | 45 ++++++++++++++++++++++++++
 gnome-flashback/libdesktop/gf-desktop-window.h |  6 ++--
 gnome-flashback/libdesktop/gf-desktop.c        | 12 +++++++
 4 files changed, 79 insertions(+), 2 deletions(-)
---
diff --git a/gnome-flashback/libdesktop/gf-background.c b/gnome-flashback/libdesktop/gf-background.c
index 4e19853..6494814 100644
--- a/gnome-flashback/libdesktop/gf-background.c
+++ b/gnome-flashback/libdesktop/gf-background.c
@@ -36,6 +36,15 @@ enum
 
 static GParamSpec *background_properties[LAST_PROP] = { NULL };
 
+enum
+{
+  READY,
+
+  LAST_SIGNAL
+};
+
+static guint background_signals[LAST_SIGNAL] = { 0 };
+
 G_DEFINE_TYPE (GfBackground, gf_background, G_TYPE_OBJECT)
 
 static void
@@ -76,6 +85,14 @@ install_properties (GObjectClass *object_class)
                                      background_properties);
 }
 
+static void
+install_signals (void)
+{
+  background_signals[READY] =
+    g_signal_new ("ready", GF_TYPE_BACKGROUND, G_SIGNAL_RUN_LAST,
+                  0, NULL, NULL, NULL, G_TYPE_NONE, 0);
+}
+
 static void
 gf_background_class_init (GfBackgroundClass *self_class)
 {
@@ -86,6 +103,7 @@ gf_background_class_init (GfBackgroundClass *self_class)
   object_class->set_property = gf_background_set_property;
 
   install_properties (object_class);
+  install_signals ();
 }
 
 static void
diff --git a/gnome-flashback/libdesktop/gf-desktop-window.c b/gnome-flashback/libdesktop/gf-desktop-window.c
index 1bd2e40..5dc0c89 100644
--- a/gnome-flashback/libdesktop/gf-desktop-window.c
+++ b/gnome-flashback/libdesktop/gf-desktop-window.c
@@ -30,6 +30,8 @@ struct _GfDesktopWindow
 
   gboolean      show_icons;
   GtkWidget    *icon_view;
+
+  gboolean      ready;
 };
 
 enum
@@ -44,8 +46,34 @@ enum
 
 static GParamSpec *window_properties[LAST_PROP] = { NULL };
 
+enum
+{
+  READY,
+
+  LAST_SIGNAL
+};
+
+static guint window_signals[LAST_SIGNAL] = { 0 };
+
 G_DEFINE_TYPE (GfDesktopWindow, gf_desktop_window, GTK_TYPE_WINDOW)
 
+static void
+emit_ready (GfDesktopWindow *self)
+{
+  if (self->ready)
+    return;
+
+  g_signal_emit (self, window_signals[READY], 0);
+  self->ready = TRUE;
+}
+
+static void
+ready_cb (GfBackground    *background,
+          GfDesktopWindow *self)
+{
+  emit_ready (self);
+}
+
 static void
 draw_background_changed (GfDesktopWindow *self)
 {
@@ -53,6 +81,8 @@ draw_background_changed (GfDesktopWindow *self)
     {
       g_assert (self->background == NULL);
       self->background = gf_background_new (GTK_WIDGET (self));
+
+      g_signal_connect (self->background, "ready", G_CALLBACK (ready_cb), self);
     }
   else
     {
@@ -181,6 +211,14 @@ install_properties (GObjectClass *object_class)
   g_object_class_install_properties (object_class, LAST_PROP, window_properties);
 }
 
+static void
+install_signals (void)
+{
+  window_signals[READY] =
+    g_signal_new ("ready", GF_TYPE_DESKTOP_WINDOW, G_SIGNAL_RUN_LAST,
+                  0, NULL, NULL, NULL, G_TYPE_NONE, 0);
+}
+
 static void
 gf_desktop_window_class_init (GfDesktopWindowClass *self_class)
 {
@@ -193,6 +231,7 @@ gf_desktop_window_class_init (GfDesktopWindowClass *self_class)
   object_class->set_property = gf_desktop_window_set_property;
 
   install_properties (object_class);
+  install_signals ();
 }
 
 static void
@@ -218,3 +257,9 @@ gf_desktop_window_new (gboolean draw_background,
                        "show-icons", show_icons,
                        NULL);
 }
+
+gboolean
+gf_desktop_window_is_ready (GfDesktopWindow *self)
+{
+  return self->ready;
+}
diff --git a/gnome-flashback/libdesktop/gf-desktop-window.h b/gnome-flashback/libdesktop/gf-desktop-window.h
index d302152..51fda3f 100644
--- a/gnome-flashback/libdesktop/gf-desktop-window.h
+++ b/gnome-flashback/libdesktop/gf-desktop-window.h
@@ -26,8 +26,10 @@ G_BEGIN_DECLS
 G_DECLARE_FINAL_TYPE (GfDesktopWindow, gf_desktop_window,
                       GF, DESKTOP_WINDOW, GtkWindow)
 
-GtkWidget *gf_desktop_window_new (gboolean draw_background,
-                                  gboolean show_icons);
+GtkWidget *gf_desktop_window_new      (gboolean         draw_background,
+                                       gboolean         show_icons);
+
+gboolean   gf_desktop_window_is_ready (GfDesktopWindow *self);
 
 G_END_DECLS
 
diff --git a/gnome-flashback/libdesktop/gf-desktop.c b/gnome-flashback/libdesktop/gf-desktop.c
index 03b9ae1..014d094 100644
--- a/gnome-flashback/libdesktop/gf-desktop.c
+++ b/gnome-flashback/libdesktop/gf-desktop.c
@@ -33,6 +33,13 @@ struct _GfDesktop
 
 G_DEFINE_TYPE (GfDesktop, gf_desktop, G_TYPE_OBJECT)
 
+static void
+ready_cb (GfDesktopWindow *window,
+          GfDesktop       *self)
+{
+  gtk_widget_show (self->window);
+}
+
 static void
 gf_desktop_dispose (GObject *object)
 {
@@ -76,6 +83,11 @@ gf_desktop_init (GfDesktop *self)
   g_settings_bind (self->settings, "show-icons",
                    self->window, "show-icons",
                    G_SETTINGS_BIND_GET);
+
+  if (!gf_desktop_window_is_ready (GF_DESKTOP_WINDOW (self->window)))
+    g_signal_connect (self->window, "ready", G_CALLBACK (ready_cb), self);
+  else
+    gtk_widget_show (self->window);
 }
 
 GfDesktop *


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