On Tue, Dec 13, 2011 at 08:35:03PM +0100, Marc-André Lureau wrote: > --- > 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); ACK Daniel -- |: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :| |: http://libvirt.org -o- http://virt-manager.org :| |: http://autobuild.org -o- http://search.cpan.org/~danberr/ :| |: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :|