The OvirtForeignMenu pointer is needed by the new ISO list dialog, and we make it acessible via property to avoid interdependency between objects.
Signed-off-by: Eduardo Lima (Etrunko) <etru...@redhat.com> --- src/remote-viewer-iso-list-dialog.c | 25 ++++++++++++++++++++----- src/remote-viewer-iso-list-dialog.h | 2 +- src/remote-viewer.c | 37 +++++++++++++++++++++++++++++++++++++ src/virt-viewer-window.c | 14 +++++++++++++- 4 files changed, 71 insertions(+), 7 deletions(-) diff --git a/src/remote-viewer-iso-list-dialog.c b/src/remote-viewer-iso-list-dialog.c index 3ede716..045d601 100644 --- a/src/remote-viewer-iso-list-dialog.c +++ b/src/remote-viewer-iso-list-dialog.c @@ -24,6 +24,7 @@ #include "remote-viewer-iso-list-dialog.h" #include "virt-viewer-util.h" +#include "ovirt-foreign-menu.h" G_DEFINE_TYPE(RemoteViewerISOListDialog, remote_viewer_iso_list_dialog, GTK_TYPE_DIALOG) @@ -33,6 +34,7 @@ G_DEFINE_TYPE(RemoteViewerISOListDialog, remote_viewer_iso_list_dialog, GTK_TYPE struct _RemoteViewerISOListDialogPrivate { GtkWidget *notebook; + OvirtForeignMenu *foreign_menu; }; enum RemoteViewerIsoListDialogPages @@ -44,6 +46,10 @@ enum RemoteViewerIsoListDialogPages static void remote_viewer_iso_list_dialog_dispose(GObject *object) { + RemoteViewerISOListDialog *self = REMOTE_VIEWER_ISO_LIST_DIALOG(object); + RemoteViewerISOListDialogPrivate *priv = self->priv = DIALOG_PRIVATE(self); + + g_clear_object(&priv->foreign_menu); G_OBJECT_CLASS(remote_viewer_iso_list_dialog_parent_class)->dispose(object); } @@ -102,10 +108,19 @@ remote_viewer_iso_list_dialog_init(RemoteViewerISOListDialog *self) } GtkWidget * -remote_viewer_iso_list_dialog_new(GtkWindow *parent) +remote_viewer_iso_list_dialog_new(GtkWindow *parent, GObject *foreign_menu) { - return g_object_new(REMOTE_VIEWER_TYPE_ISO_LIST_DIALOG, - "title", _("Change CD"), - "transient-for", parent, - NULL); + GtkWidget *dialog; + RemoteViewerISOListDialog *self; + + g_return_val_if_fail(foreign_menu != NULL, NULL); + + dialog = g_object_new(REMOTE_VIEWER_TYPE_ISO_LIST_DIALOG, + "title", _("Change CD"), + "transient-for", parent, + NULL); + + self = REMOTE_VIEWER_ISO_LIST_DIALOG(dialog); + self->priv->foreign_menu = OVIRT_FOREIGN_MENU(g_object_ref(foreign_menu)); + return dialog; } diff --git a/src/remote-viewer-iso-list-dialog.h b/src/remote-viewer-iso-list-dialog.h index def841b..8b936f5 100644 --- a/src/remote-viewer-iso-list-dialog.h +++ b/src/remote-viewer-iso-list-dialog.h @@ -51,7 +51,7 @@ struct _RemoteViewerISOListDialogClass GType remote_viewer_iso_list_dialog_get_type(void) G_GNUC_CONST; -GtkWidget *remote_viewer_iso_list_dialog_new(GtkWindow *parent); +GtkWidget *remote_viewer_iso_list_dialog_new(GtkWindow *parent, GObject *foreign_menu); G_END_DECLS diff --git a/src/remote-viewer.c b/src/remote-viewer.c index 95130dc..e0cd139 100644 --- a/src/remote-viewer.c +++ b/src/remote-viewer.c @@ -67,6 +67,13 @@ G_DEFINE_TYPE (RemoteViewer, remote_viewer, VIRT_VIEWER_TYPE_APP) #define GET_PRIVATE(o) \ (G_TYPE_INSTANCE_GET_PRIVATE ((o), REMOTE_VIEWER_TYPE, RemoteViewerPrivate)) +enum RemoteViewerProperties { + PROP_0, +#ifdef HAVE_OVIRT + PROP_OVIRT_FOREIGN_MENU, +#endif +}; + #ifdef HAVE_OVIRT static OvirtVm * choose_vm(GtkWindow *main_window, char **vm_name, @@ -213,6 +220,25 @@ end: } static void +remote_viewer_get_property(GObject *object, guint property_id, + GValue *value, GParamSpec *pspec) +{ + RemoteViewer *self = REMOTE_VIEWER(object); + RemoteViewerPrivate *priv = self->priv; + + switch (property_id) { +#ifdef HAVE_OVIRT + case PROP_OVIRT_FOREIGN_MENU: + g_value_set_object(value, priv->ovirt_foreign_menu); + break; +#endif + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + } +} + +static void remote_viewer_class_init (RemoteViewerClass *klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); @@ -222,6 +248,7 @@ remote_viewer_class_init (RemoteViewerClass *klass) g_type_class_add_private (klass, sizeof (RemoteViewerPrivate)); + object_class->get_property = remote_viewer_get_property; object_class->dispose = remote_viewer_dispose; g_app_class->local_command_line = remote_viewer_local_command_line; @@ -235,6 +262,16 @@ remote_viewer_class_init (RemoteViewerClass *klass) #else (void) gtk_app_class; #endif + +#ifdef HAVE_OVIRT + g_object_class_install_property(object_class, + PROP_OVIRT_FOREIGN_MENU, + g_param_spec_object("ovirt-foreign-menu", + "oVirt Foreign Menu", + "Object which is used as interface to oVirt", + OVIRT_TYPE_FOREIGN_MENU, + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); +#endif } static void diff --git a/src/virt-viewer-window.c b/src/virt-viewer-window.c index 867fb86..6f2ca9f 100644 --- a/src/virt-viewer-window.c +++ b/src/virt-viewer-window.c @@ -1072,11 +1072,23 @@ virt_viewer_window_menu_change_cd_activate(GtkWidget *menu G_GNUC_UNUSED, { VirtViewerWindowPrivate *priv = self->priv; static GtkWidget *dialog = NULL; + GObject *foreign_menu; if (dialog) return; - dialog = remote_viewer_iso_list_dialog_new(GTK_WINDOW(priv->window)); + g_object_get(G_OBJECT(priv->app), "ovirt-foreign-menu", &foreign_menu, NULL); + dialog = remote_viewer_iso_list_dialog_new(GTK_WINDOW(priv->window), foreign_menu); + g_object_unref(&foreign_menu); + + if (!dialog) { + dialog = gtk_message_dialog_new(GTK_WINDOW(priv->window), + GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_MESSAGE_ERROR, + GTK_BUTTONS_CLOSE, + _("Unable do connnect to oVirt")); + } + g_signal_connect(dialog, "response", G_CALLBACK(iso_dialog_response), &dialog); gtk_widget_show_all(dialog); gtk_dialog_run(GTK_DIALOG(dialog)); -- 2.7.4 _______________________________________________ virt-tools-list mailing list virt-tools-list@redhat.com https://www.redhat.com/mailman/listinfo/virt-tools-list