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

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