[virt-tools-list] [PATCH 05/12] Add window-added & window-removed signals

Marc-André Lureau marcandre.lureau at gmail.com
Tue Dec 13 19:35:03 UTC 2011


---
 src/virt-viewer-app.c |   44 +++++++++++++++++++++++++++++++++++++++++++-
 src/virt-viewer-app.h |    5 +++++
 2 files changed, 48 insertions(+), 1 deletions(-)

diff --git a/src/virt-viewer-app.c b/src/virt-viewer-app.c
index a7867ba..3bc69f7 100644
--- a/src/virt-viewer-app.c
+++ b/src/virt-viewer-app.c
@@ -143,6 +143,14 @@ enum {
 	PROP_TITLE,
 };
 
+enum {
+	SIGNAL_WINDOW_ADDED,
+	SIGNAL_WINDOW_REMOVED,
+	SIGNAL_LAST,
+};
+
+static guint signals[SIGNAL_LAST];
+
 void
 virt_viewer_app_set_debug(gboolean debug)
 {
@@ -442,12 +450,22 @@ virt_viewer_app_get_nth_window(VirtViewerApp *self, gint nth)
 static gboolean
 virt_viewer_app_remove_nth_window(VirtViewerApp *self, gint nth)
 {
+	VirtViewerWindow *win;
 	gboolean removed;
 
 	g_return_val_if_fail(nth != 0, FALSE);
-	removed = g_hash_table_remove(self->priv->windows, &nth);
+
+	win = virt_viewer_app_get_nth_window(self, nth);
+	g_return_val_if_fail(win != NULL, FALSE);
+
+	removed = g_hash_table_steal(self->priv->windows, &nth);
 	g_warn_if_fail(removed);
 
+	if (removed)
+		g_signal_emit(self, signals[SIGNAL_WINDOW_REMOVED], 0, win);
+
+	g_object_unref(win);
+
 	return removed;
 }
 
@@ -461,6 +479,8 @@ virt_viewer_app_set_nth_window(VirtViewerApp *self, gint nth, VirtViewerWindow *
 	*key = nth;
 	g_hash_table_insert(self->priv->windows, key, win);
 	virt_viewer_app_set_window_subtitle(self, win, nth);
+
+	g_signal_emit(self, signals[SIGNAL_WINDOW_ADDED], 0, win);
 }
 
 static void
@@ -1218,6 +1238,27 @@ virt_viewer_app_class_init (VirtViewerAppClass *klass)
 							    G_PARAM_WRITABLE |
 							    G_PARAM_STATIC_STRINGS));
 
+	signals[SIGNAL_WINDOW_ADDED] =
+		g_signal_new("window-added",
+			     G_OBJECT_CLASS_TYPE(object_class),
+			     G_SIGNAL_RUN_LAST,
+			     G_STRUCT_OFFSET(VirtViewerAppClass, window_added),
+			     NULL, NULL,
+			     g_cclosure_marshal_VOID__OBJECT,
+			     G_TYPE_NONE,
+			     1,
+			     G_TYPE_OBJECT);
+
+	signals[SIGNAL_WINDOW_REMOVED] =
+		g_signal_new("window-removed",
+			     G_OBJECT_CLASS_TYPE(object_class),
+			     G_SIGNAL_RUN_LAST,
+			     G_STRUCT_OFFSET(VirtViewerAppClass, window_removed),
+			     NULL, NULL,
+			     g_cclosure_marshal_VOID__OBJECT,
+			     G_TYPE_NONE,
+			     1,
+			     G_TYPE_OBJECT);
 }
 
 void
@@ -1447,6 +1488,7 @@ virt_viewer_app_show_status(VirtViewerApp *self, const gchar *fmt, ...)
 	gchar *text;
 
 	g_return_if_fail(VIRT_VIEWER_IS_APP(self));
+	g_return_if_fail(fmt != NULL);
 
 	va_start(args, fmt);
 	text = g_strdup_vprintf(fmt, args);
diff --git a/src/virt-viewer-app.h b/src/virt-viewer-app.h
index cc85dfa..93b2b58 100644
--- a/src/virt-viewer-app.h
+++ b/src/virt-viewer-app.h
@@ -46,6 +46,11 @@ typedef struct {
 typedef struct {
         GObjectClass parent_class;
 
+        /* signals */
+       void (*window_added) (VirtViewerApp *self, VirtViewerWindow *window);
+       void (*window_removed) (VirtViewerApp *self, VirtViewerWindow *window);
+
+        /*< private >*/
         gboolean (*start) (VirtViewerApp *self);
         int (*initial_connect) (VirtViewerApp *self);
         void (*deactivated) (VirtViewerApp *self);
-- 
1.7.7.3




More information about the virt-tools-list mailing list