[Spice-devel] [PATCH spice-gtk 1/3] SpiceDisplay: Pass on notify signal from GtkSession for GtkSession properties

Hans de Goede hdegoede at redhat.com
Fri Oct 7 05:24:54 PDT 2011


Since some SpiceDisplay properties are now just a pass through to the
equivalent SpiceGtkSession property, we also need to pass on the notify
signal for these, so interested users can get notified of them changing.

Use this in spicy to ensure that changes to SpiceGtkSession (and thus per
session rather then per window) properties get reflected in all windows for
a multimonitor guest.

Signed-off-by: Hans de Goede <hdegoede at redhat.com>
---
 gtk/spice-widget.c |   12 ++++++++++++
 gtk/spicy.c        |   20 ++++++++++++++++++++
 2 files changed, 32 insertions(+), 0 deletions(-)

diff --git a/gtk/spice-widget.c b/gtk/spice-widget.c
index 5b53caf..06e5113 100644
--- a/gtk/spice-widget.c
+++ b/gtk/spice-widget.c
@@ -226,6 +226,15 @@ static void spice_display_set_property(GObject      *object,
     }
 }
 
+static void gtk_session_property_changed(GObject    *gobject,
+                                         GParamSpec *pspec,
+                                         gpointer    user_data)
+{
+    SpiceDisplay *display = user_data;
+
+    g_object_notify(G_OBJECT(display), g_param_spec_get_name(pspec));
+}
+
 static void spice_display_dispose(GObject *obj)
 {
     SpiceDisplay *display = SPICE_DISPLAY(obj);
@@ -329,6 +338,9 @@ spice_display_constructor(GType                  gtype,
     }
     g_list_free(list);
 
+    g_signal_connect(d->gtk_session, "notify::auto-clipboard",
+                     G_CALLBACK(gtk_session_property_changed), display);
+
     return obj;
 }
 
diff --git a/gtk/spicy.c b/gtk/spicy.c
index 77f339c..533d7f7 100644
--- a/gtk/spicy.c
+++ b/gtk/spicy.c
@@ -427,6 +427,20 @@ static void menu_cb_bool_prop(GtkToggleAction *action, gpointer data)
     g_object_set(G_OBJECT(win->spice), name, state, NULL);
 }
 
+static void menu_cb_bool_prop_changed(GObject    *gobject,
+                                      GParamSpec *pspec,
+                                      gpointer    user_data)
+{
+    struct spice_window *win = user_data;
+    const gchar *property = g_param_spec_get_name(pspec);
+    GtkAction *toggle;
+    gboolean state;
+
+    toggle = gtk_action_group_get_action(win->ag, property);
+    g_object_get(win->spice, property, &state, NULL);
+    gtk_toggle_action_set_active(GTK_TOGGLE_ACTION(toggle), state);
+}
+
 static void menu_cb_toolbar(GtkToggleAction *action, gpointer data)
 {
     struct spice_window *win = data;
@@ -1133,9 +1147,15 @@ static spice_window *create_spice_window(spice_connection *conn, int id, SpiceCh
 
     /* init toggle actions */
     for (i = 0; i < G_N_ELEMENTS(spice_properties); i++) {
+        char notify[64];
+
         toggle = gtk_action_group_get_action(win->ag, spice_properties[i]);
         g_object_get(win->spice, spice_properties[i], &state, NULL);
         gtk_toggle_action_set_active(GTK_TOGGLE_ACTION(toggle), state);
+
+        snprintf(notify, sizeof(notify), "notify::%s", spice_properties[i]);
+        g_signal_connect(win->spice, notify,
+                         G_CALLBACK(menu_cb_bool_prop_changed), win);
     }
 
     toggle = gtk_action_group_get_action(win->ag, "Toolbar");
-- 
1.7.6.4



More information about the Spice-devel mailing list