Blame SOURCES/0010-Run-ISO-dialog-when-Change-CD-menu-is-activated.patch

48c875
From 00f9ae545ec7b885c666b6066d40f4c336b4643d Mon Sep 17 00:00:00 2001
48c875
From: "Eduardo Lima (Etrunko)" <etrunko@redhat.com>
48c875
Date: Tue, 19 Jul 2016 14:31:45 -0300
48c875
Subject: [PATCH 10/26] Run ISO dialog when 'Change CD' menu is activated
48c875
48c875
Also moves 'Change CD' menu item from the toplevel menu to a subitem
48c875
under 'File' toplevel menu.
48c875
48c875
In order to avoid object interdependency, it is necessary to make the
48c875
ovirt foreign-menu pointer from RemoteViewer, accessible via property,
48c875
so it can be passed to the dialog as an opaque GObject.
48c875
48c875
Finally, with this commit, we clean up ovirt foreign menu code, which
48c875
only deals with data, leaving the UI bits to be handled properly in the
48c875
new ISO list dialog.
48c875
48c875
Signed-off-by: Eduardo Lima (Etrunko) <etrunko@redhat.com>
48c875
---
48c875
 src/ovirt-foreign-menu.c        |  99 --------------------------------
48c875
 src/remote-viewer.c             | 124 ++++++++++++++--------------------------
48c875
 src/resources/ui/virt-viewer.ui |  19 +++---
48c875
 src/virt-viewer-window.c        |  37 ++++++++++++
48c875
 4 files changed, 90 insertions(+), 189 deletions(-)
48c875
48c875
diff --git a/src/ovirt-foreign-menu.c b/src/ovirt-foreign-menu.c
48c875
index ef3ddd9..2939ae5 100644
48c875
--- a/src/ovirt-foreign-menu.c
48c875
+++ b/src/ovirt-foreign-menu.c
48c875
@@ -350,22 +350,6 @@ ovirt_foreign_menu_fetch_iso_names_finish(OvirtForeignMenu *foreign_menu,
48c875
 }
48c875
 
48c875
 
48c875
-static void
48c875
-ovirt_foreign_menu_activate_item_cb(GtkMenuItem *menuitem, gpointer user_data);
48c875
-
48c875
-
48c875
-static void
48c875
-menu_item_set_active_no_signal(GtkMenuItem *menuitem,
48c875
-                               gboolean active,
48c875
-                               GCallback callback,
48c875
-                               gpointer user_data)
48c875
-{
48c875
-    g_signal_handlers_block_by_func(menuitem, callback, user_data);
48c875
-    gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem), active);
48c875
-    g_signal_handlers_unblock_by_func(menuitem, callback, user_data);
48c875
-}
48c875
-
48c875
-
48c875
 static void iso_name_set_cb(GObject *source_object,
48c875
                             GAsyncResult *result,
48c875
                             gpointer user_data)
48c875
@@ -447,88 +431,6 @@ gboolean ovirt_foreign_menu_set_current_iso_name_finish(OvirtForeignMenu *foreig
48c875
 }
48c875
 
48c875
 
48c875
-static void
48c875
-ovirt_foreign_menu_iso_name_changed(GObject *source_object,
48c875
-                                    GAsyncResult *result,
48c875
-                                    gpointer user_data G_GNUC_UNUSED)
48c875
-{
48c875
-    OvirtForeignMenu *foreign_menu = OVIRT_FOREIGN_MENU(source_object);
48c875
-    GError *error = NULL;
48c875
-
48c875
-    if (!ovirt_foreign_menu_set_current_iso_name_finish(foreign_menu, result, &error)) {
48c875
-        g_warning(error ? error->message : "Failed to change CD");
48c875
-        g_clear_error(&error);
48c875
-        return;
48c875
-    }
48c875
-
48c875
-    g_object_notify(G_OBJECT(foreign_menu), "file");
48c875
-}
48c875
-
48c875
-
48c875
-static void
48c875
-ovirt_foreign_menu_activate_item_cb(GtkMenuItem *menuitem, gpointer user_data)
48c875
-{
48c875
-    OvirtForeignMenu *foreign_menu;
48c875
-    const char *iso_name = NULL;
48c875
-    gboolean checked;
48c875
-
48c875
-    checked = gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menuitem));
48c875
-    foreign_menu = OVIRT_FOREIGN_MENU(user_data);
48c875
-    g_return_if_fail(foreign_menu->priv->cdrom != NULL);
48c875
-    g_return_if_fail(foreign_menu->priv->next_iso_name == NULL);
48c875
-
48c875
-    g_debug("'%s' clicked", gtk_menu_item_get_label(menuitem));
48c875
-
48c875
-    /* We only want to move the check mark for the currently selected ISO
48c875
-     * when ovirt_cdrom_update_async() is successful, so for now we move
48c875
-     * the check mark back to where it was before
48c875
-     */
48c875
-    menu_item_set_active_no_signal(menuitem, !checked,
48c875
-                                   (GCallback)ovirt_foreign_menu_activate_item_cb,
48c875
-                                   foreign_menu);
48c875
-
48c875
-    if (checked) {
48c875
-        iso_name = gtk_menu_item_get_label(menuitem);
48c875
-    }
48c875
-    ovirt_foreign_menu_set_current_iso_name_async(foreign_menu, iso_name, NULL,
48c875
-                                                  ovirt_foreign_menu_iso_name_changed,
48c875
-                                                  menuitem);
48c875
-}
48c875
-
48c875
-
48c875
-GtkWidget *ovirt_foreign_menu_get_gtk_menu(OvirtForeignMenu *foreign_menu)
48c875
-{
48c875
-    GtkWidget *gtk_menu;
48c875
-    GList *it;
48c875
-    char *current_iso;
48c875
-
48c875
-    if (foreign_menu->priv->iso_names == NULL) {
48c875
-        g_debug("ISO list is empty, no menu to show");
48c875
-        return NULL;
48c875
-    }
48c875
-    g_debug("Creating GtkMenu for foreign menu");
48c875
-    current_iso = ovirt_foreign_menu_get_current_iso_name(foreign_menu);
48c875
-    gtk_menu = gtk_menu_new();
48c875
-    for (it = foreign_menu->priv->iso_names; it != NULL; it = it->next) {
48c875
-        GtkWidget *menuitem;
48c875
-
48c875
-        menuitem = gtk_check_menu_item_new_with_label((char *)it->data);
48c875
-        if (g_strcmp0((char *)it->data, current_iso) == 0) {
48c875
-            g_warn_if_fail(g_strcmp0(current_iso, foreign_menu->priv->current_iso_name) == 0);
48c875
-            gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem),
48c875
-                                           TRUE);
48c875
-        }
48c875
-        g_signal_connect(menuitem, "activate",
48c875
-                         G_CALLBACK(ovirt_foreign_menu_activate_item_cb),
48c875
-                         foreign_menu);
48c875
-        gtk_menu_shell_append(GTK_MENU_SHELL(gtk_menu), menuitem);
48c875
-    }
48c875
-    g_free(current_iso);
48c875
-
48c875
-    return gtk_menu;
48c875
-}
48c875
-
48c875
-
48c875
 static void ovirt_foreign_menu_set_files(OvirtForeignMenu *menu,
48c875
                                          const GList *files)
48c875
 {
48c875
@@ -594,7 +496,6 @@ static void cdrom_file_refreshed_cb(GObject *source_object,
48c875
                      "file", &menu->priv->current_iso_name,
48c875
                      NULL);
48c875
     }
48c875
-    g_object_notify(G_OBJECT(menu), "file");
48c875
     if (menu->priv->cdrom != NULL) {
48c875
         ovirt_foreign_menu_next_async_step(menu, task, STATE_CDROM_FILE);
48c875
     } else {
48c875
diff --git a/src/remote-viewer.c b/src/remote-viewer.c
48c875
index c84a35b..d04dbb5 100644
48c875
--- a/src/remote-viewer.c
48c875
+++ b/src/remote-viewer.c
48c875
@@ -67,12 +67,18 @@ G_DEFINE_TYPE (RemoteViewer, remote_viewer, VIRT_VIEWER_TYPE_APP)
48c875
 #define GET_PRIVATE(o)                                                        \
48c875
     (G_TYPE_INSTANCE_GET_PRIVATE ((o), REMOTE_VIEWER_TYPE, RemoteViewerPrivate))
48c875
 
48c875
+enum RemoteViewerProperties {
48c875
+    PROP_0,
48c875
+#ifdef HAVE_OVIRT
48c875
+    PROP_OVIRT_FOREIGN_MENU,
48c875
+#endif
48c875
+};
48c875
+
48c875
 #ifdef HAVE_OVIRT
48c875
 static OvirtVm * choose_vm(GtkWindow *main_window,
48c875
                            char **vm_name,
48c875
                            OvirtCollection *vms,
48c875
                            GError **error);
48c875
-static gboolean remote_viewer_refresh_ovirt_foreign_menu(gpointer user_data);
48c875
 #endif
48c875
 
48c875
 static gboolean remote_viewer_start(VirtViewerApp *self, GError **error);
48c875
@@ -214,6 +220,25 @@ end:
48c875
 }
48c875
 
48c875
 static void
48c875
+remote_viewer_get_property(GObject *object, guint property_id,
48c875
+                           GValue *value, GParamSpec *pspec)
48c875
+{
48c875
+    RemoteViewer *self = REMOTE_VIEWER(object);
48c875
+    RemoteViewerPrivate *priv = self->priv;
48c875
+
48c875
+    switch (property_id) {
48c875
+#ifdef HAVE_OVIRT
48c875
+    case PROP_OVIRT_FOREIGN_MENU:
48c875
+        g_value_set_object(value, priv->ovirt_foreign_menu);
48c875
+        break;
48c875
+#endif
48c875
+
48c875
+    default:
48c875
+        G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
48c875
+    }
48c875
+}
48c875
+
48c875
+static void
48c875
 remote_viewer_class_init (RemoteViewerClass *klass)
48c875
 {
48c875
     GObjectClass *object_class = G_OBJECT_CLASS (klass);
48c875
@@ -223,6 +248,7 @@ remote_viewer_class_init (RemoteViewerClass *klass)
48c875
 
48c875
     g_type_class_add_private (klass, sizeof (RemoteViewerPrivate));
48c875
 
48c875
+    object_class->get_property = remote_viewer_get_property;
48c875
     object_class->dispose = remote_viewer_dispose;
48c875
 
48c875
     g_app_class->local_command_line = remote_viewer_local_command_line;
48c875
@@ -236,6 +262,16 @@ remote_viewer_class_init (RemoteViewerClass *klass)
48c875
 #else
48c875
     (void) gtk_app_class;
48c875
 #endif
48c875
+
48c875
+#ifdef HAVE_OVIRT
48c875
+    g_object_class_install_property(object_class,
48c875
+                                    PROP_OVIRT_FOREIGN_MENU,
48c875
+                                    g_param_spec_object("ovirt-foreign-menu",
48c875
+                                                        "oVirt Foreign Menu",
48c875
+                                                        "Object which is used as interface to oVirt",
48c875
+                                                        OVIRT_TYPE_FOREIGN_MENU,
48c875
+                                                        G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
48c875
+#endif
48c875
 }
48c875
 
48c875
 static void
48c875
@@ -735,33 +771,11 @@ authenticate_cb(RestProxy *proxy, G_GNUC_UNUSED RestProxyAuth *auth,
48c875
 static void
48c875
 ovirt_foreign_menu_update(GtkApplication *gtkapp, GtkWindow *gtkwin, G_GNUC_UNUSED gpointer data)
48c875
 {
48c875
-    RemoteViewer *app = REMOTE_VIEWER(gtkapp);
48c875
+    RemoteViewer *self = REMOTE_VIEWER(gtkapp);
48c875
     VirtViewerWindow *win = g_object_get_data(G_OBJECT(gtkwin), "virt-viewer-window");
48c875
-    GtkWidget *menu = g_object_get_data(G_OBJECT(win), "foreign-menu");
48c875
-    GtkWidget *submenu;
48c875
-
48c875
-    if (app->priv->ovirt_foreign_menu == NULL) {
48c875
-        /* nothing to do */
48c875
-        return;
48c875
-    }
48c875
-
48c875
-    submenu = ovirt_foreign_menu_get_gtk_menu(app->priv->ovirt_foreign_menu);
48c875
-    if (submenu == NULL) {
48c875
-        /* No items to show, no point in showing the menu */
48c875
-        if (menu != NULL)
48c875
-           gtk_widget_set_visible(menu, FALSE);
48c875
-        g_object_set_data(G_OBJECT(win), "foreign-menu", NULL);
48c875
-        return;
48c875
-    }
48c875
-
48c875
-    if (menu == NULL) {
48c875
-        menu = GTK_WIDGET(gtk_builder_get_object(virt_viewer_window_get_builder(win), "menu-change-cd"));
48c875
-        g_object_set_data(G_OBJECT(win), "foreign-menu", menu);
48c875
-        gtk_widget_set_visible(menu, TRUE);
48c875
-    }
48c875
-
48c875
-    gtk_menu_item_set_submenu(GTK_MENU_ITEM(menu), submenu);
48c875
-    gtk_widget_show_all(menu);
48c875
+    GtkBuilder *builder = virt_viewer_window_get_builder(win);
48c875
+    GtkWidget *menu = GTK_WIDGET(gtk_builder_get_object(builder, "menu-change-cd"));
48c875
+    gtk_widget_set_visible(menu, self->priv->ovirt_foreign_menu != NULL);
48c875
 }
48c875
 
48c875
 static void
48c875
@@ -784,52 +798,6 @@ ovirt_foreign_menu_updated(RemoteViewer *self)
48c875
 }
48c875
 
48c875
 static void
48c875
-ovirt_foreign_menu_fetch_iso_names_cb(GObject *source_object,
48c875
-                                      GAsyncResult *result,
48c875
-                                      gpointer user_data)
48c875
-{
48c875
-    OvirtForeignMenu *foreign_menu = OVIRT_FOREIGN_MENU(source_object);
48c875
-    RemoteViewer *self = REMOTE_VIEWER(user_data);
48c875
-    VirtViewerApp *app = VIRT_VIEWER_APP(user_data);
48c875
-    GError *error = NULL;
48c875
-    GList *iso_list;
48c875
-
48c875
-    iso_list = ovirt_foreign_menu_fetch_iso_names_finish(foreign_menu, result, &error);
48c875
-
48c875
-    if (!iso_list) {
48c875
-        virt_viewer_app_simple_message_dialog(app, error ? error->message : _("Failed to fetch CD names"));
48c875
-        g_clear_error(&error);
48c875
-        return;
48c875
-     }
48c875
-
48c875
-    ovirt_foreign_menu_updated(self);
48c875
-    g_timeout_add_seconds(300, remote_viewer_refresh_ovirt_foreign_menu, self);
48c875
-}
48c875
-
48c875
-static gboolean
48c875
-remote_viewer_refresh_ovirt_foreign_menu(gpointer user_data)
48c875
-{
48c875
-    VirtViewerApp *app = VIRT_VIEWER_APP(user_data);
48c875
-    RemoteViewer *self = REMOTE_VIEWER(user_data);
48c875
-
48c875
-    g_debug("Refreshing foreign menu iso list");
48c875
-    ovirt_foreign_menu_fetch_iso_names_async(self->priv->ovirt_foreign_menu,
48c875
-                                             NULL,
48c875
-                                             ovirt_foreign_menu_fetch_iso_names_cb,
48c875
-                                             app);
48c875
-    return G_SOURCE_REMOVE;
48c875
-}
48c875
-
48c875
-static void
48c875
-ovirt_foreign_menu_changed(OvirtForeignMenu *foreign_menu G_GNUC_UNUSED,
48c875
-                           GParamSpec *pspec G_GNUC_UNUSED,
48c875
-                           VirtViewerApp *app)
48c875
-{
48c875
-    ovirt_foreign_menu_updated(REMOTE_VIEWER(app));
48c875
-}
48c875
-
48c875
-
48c875
-static void
48c875
 virt_viewer_app_set_ovirt_foreign_menu(VirtViewerApp *app,
48c875
                                        OvirtForeignMenu *foreign_menu)
48c875
 {
48c875
@@ -838,17 +806,11 @@ virt_viewer_app_set_ovirt_foreign_menu(VirtViewerApp *app,
48c875
     g_return_if_fail(OVIRT_IS_FOREIGN_MENU(foreign_menu));
48c875
 
48c875
     self = REMOTE_VIEWER(app);
48c875
-    if (self->priv->ovirt_foreign_menu != NULL) {
48c875
-        g_object_unref(G_OBJECT(self->priv->ovirt_foreign_menu));
48c875
-    }
48c875
+    g_clear_object(&self->priv->ovirt_foreign_menu);
48c875
     self->priv->ovirt_foreign_menu = foreign_menu;
48c875
-    g_signal_connect(G_OBJECT(foreign_menu), "notify::file",
48c875
-                     (GCallback)ovirt_foreign_menu_changed, app);
48c875
-
48c875
     g_signal_connect(G_OBJECT(app), "window-added",
48c875
                      (GCallback)ovirt_foreign_menu_update, NULL);
48c875
-
48c875
-    remote_viewer_refresh_ovirt_foreign_menu(self);
48c875
+    ovirt_foreign_menu_updated(self);
48c875
 }
48c875
 
48c875
 static gboolean
48c875
diff --git a/src/resources/ui/virt-viewer.ui b/src/resources/ui/virt-viewer.ui
48c875
index 6e3c5ad..e9609ec 100644
48c875
--- a/src/resources/ui/virt-viewer.ui
48c875
+++ b/src/resources/ui/virt-viewer.ui
48c875
@@ -1,6 +1,7 @@
48c875
 
48c875
+
48c875
 <interface>
48c875
-  
48c875
+  <requires lib="gtk+" version="3.0"/>
48c875
   <object class="GtkAccelGroup" id="accelgroup"/>
48c875
   <object class="GtkApplicationWindow" id="viewer">
48c875
     <property name="can_focus">False</property>
48c875
@@ -73,6 +74,14 @@
48c875
                           </object>
48c875
                         </child>
48c875
                         <child>
48c875
+                          <object class="GtkMenuItem" id="menu-change-cd">
48c875
+                            <property name="can_focus">False</property>
48c875
+                            <property name="label" translatable="yes">_Change CD</property>
48c875
+                            <property name="use_underline">True</property>
48c875
+                            <signal name="activate" handler="virt_viewer_window_menu_change_cd_activate" swapped="no"/>
48c875
+                          </object>
48c875
+                        </child>
48c875
+                        <child>
48c875
                           <object class="GtkMenuItem" id="menu-preferences">
48c875
                             <property name="visible">True</property>
48c875
                             <property name="can_focus">False</property>
48c875
@@ -247,14 +256,6 @@
48c875
                     </child>
48c875
                   </object>
48c875
                 </child>
48c875
-                <child>
48c875
-                  <object class="GtkMenuItem" id="menu-change-cd">
48c875
-                    <property name="use_action_appearance">False</property>
48c875
-                    <property name="can_focus">False</property>
48c875
-                    <property name="label" translatable="yes">_Change CD</property>
48c875
-                    <property name="use_underline">True</property>
48c875
-                  </object>
48c875
-                </child>
48c875
               </object>
48c875
               <packing>
48c875
                 <property name="expand">False</property>
48c875
diff --git a/src/virt-viewer-window.c b/src/virt-viewer-window.c
48c875
index 99fd102..8eda12e 100644
48c875
--- a/src/virt-viewer-window.c
48c875
+++ b/src/virt-viewer-window.c
48c875
@@ -43,6 +43,8 @@
48c875
 #include "virt-viewer-util.h"
48c875
 #include "virt-viewer-timed-revealer.h"
48c875
 
48c875
+#include "remote-viewer-iso-list-dialog.h"
48c875
+
48c875
 #define ZOOM_STEP 10
48c875
 
48c875
 /* Signal handlers for main window (move in a VirtViewerMainWindow?) */
48c875
@@ -62,6 +64,7 @@ void virt_viewer_window_menu_file_smartcard_insert(GtkWidget *menu, VirtViewerWi
48c875
 void virt_viewer_window_menu_file_smartcard_remove(GtkWidget *menu, VirtViewerWindow *self);
48c875
 void virt_viewer_window_menu_view_release_cursor(GtkWidget *menu, VirtViewerWindow *self);
48c875
 void virt_viewer_window_menu_preferences_cb(GtkWidget *menu, VirtViewerWindow *self);
48c875
+void virt_viewer_window_menu_change_cd_activate(GtkWidget *menu, VirtViewerWindow *self);
48c875
 
48c875
 
48c875
 /* Internal methods */
48c875
@@ -1056,6 +1059,40 @@ virt_viewer_window_menu_help_about(GtkWidget *menu G_GNUC_UNUSED,
48c875
     g_object_unref(G_OBJECT(about));
48c875
 }
48c875
 
48c875
+static void
48c875
+iso_dialog_response(GtkDialog *dialog,
48c875
+                    gint response_id,
48c875
+                    gpointer user_data G_GNUC_UNUSED)
48c875
+{
48c875
+    if (response_id == GTK_RESPONSE_NONE)
48c875
+        return;
48c875
+
48c875
+    gtk_widget_destroy(GTK_WIDGET(dialog));
48c875
+}
48c875
+
48c875
+void
48c875
+virt_viewer_window_menu_change_cd_activate(GtkWidget *menu G_GNUC_UNUSED,
48c875
+                                           VirtViewerWindow *self)
48c875
+{
48c875
+    VirtViewerWindowPrivate *priv = self->priv;
48c875
+    GtkWidget *dialog;
48c875
+    GObject *foreign_menu;
48c875
+
48c875
+    g_object_get(G_OBJECT(priv->app), "ovirt-foreign-menu", &foreign_menu, NULL);
48c875
+    dialog = remote_viewer_iso_list_dialog_new(GTK_WINDOW(priv->window), foreign_menu);
48c875
+    g_object_unref(foreign_menu);
48c875
+
48c875
+    if (!dialog)
48c875
+        dialog = gtk_message_dialog_new(GTK_WINDOW(priv->window),
48c875
+                                        GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
48c875
+                                        GTK_MESSAGE_ERROR,
48c875
+                                        GTK_BUTTONS_CLOSE,
48c875
+                                        _("Unable to connnect to oVirt"));
48c875
+
48c875
+    g_signal_connect(dialog, "response", G_CALLBACK(iso_dialog_response), NULL);
48c875
+    gtk_widget_show_all(dialog);
48c875
+    gtk_dialog_run(GTK_DIALOG(dialog));
48c875
+}
48c875
 
48c875
 static void
48c875
 virt_viewer_window_toolbar_setup(VirtViewerWindow *self)
48c875
-- 
48c875
2.12.0
48c875