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

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