[virt-tools-list] [PATCH virt-viewer 05/17] Add window-added & window-removed signals
Marc-André Lureau
marcandre.lureau at gmail.com
Fri Jan 27 13:51:24 UTC 2012
From: Marc-André Lureau <marcandre.lureau at redhat.com>
---
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.6
More information about the virt-tools-list
mailing list