From eec4b339f3b82292e11d9c98835ab19542baa4f7 Mon Sep 17 00:00:00 2001 From: CentOS Sources Date: Nov 19 2015 03:43:00 +0000 Subject: import virt-viewer-2.0-6.el7 --- diff --git a/.gitignore b/.gitignore index cc80e5f..0e87d9a 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1 @@ -SOURCES/virt-viewer-0.6.0.tar.gz +SOURCES/virt-viewer-2.0.tar.gz diff --git a/.virt-viewer.metadata b/.virt-viewer.metadata index efe4935..30f7693 100644 --- a/.virt-viewer.metadata +++ b/.virt-viewer.metadata @@ -1 +1 @@ -91871971f1aea391843ca901ef28c1f721178b4e SOURCES/virt-viewer-0.6.0.tar.gz +95cc27d4168e199e0df6af79abac770c6d506d18 SOURCES/virt-viewer-2.0.tar.gz diff --git a/SOURCES/0001-Fix-race-with-metacity-in-fullscreen.patch b/SOURCES/0001-Fix-race-with-metacity-in-fullscreen.patch deleted file mode 100644 index c8edee9..0000000 --- a/SOURCES/0001-Fix-race-with-metacity-in-fullscreen.patch +++ /dev/null @@ -1,47 +0,0 @@ -From 254f2f8b03461fbb2cae39e7e11dcf52b3b684a4 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= -Date: Tue, 1 Apr 2014 18:37:28 +0200 -Subject: [PATCH] Fix race with metacity in fullscreen - -To avoid some races with metacity, the window should be placed as -early as possible, before it is (re)allocated & mapped (rhbz#809546). ---- - src/virt-viewer-window.c | 11 +++++++++-- - 1 file changed, 9 insertions(+), 2 deletions(-) - -diff --git a/src/virt-viewer-window.c b/src/virt-viewer-window.c -index 05d5fe7..a6ccaa1 100644 ---- a/src/virt-viewer-window.c -+++ b/src/virt-viewer-window.c -@@ -475,7 +475,7 @@ virt_viewer_window_move_to_monitor(VirtViewerWindow *self) - GdkRectangle mon; - gint n = priv->fullscreen_monitor; - -- if (n == -1 || !priv->fullscreen) -+ if (n == -1) - return; - - gdk_screen_get_monitor_geometry(gdk_screen_get_default(), n, &mon); -@@ -550,6 +550,12 @@ virt_viewer_window_enter_fullscreen(VirtViewerWindow *self, gint monitor) - priv->fullscreen = TRUE; - - if (!gtk_widget_get_mapped(priv->window)) { -+ /* -+ * To avoid some races with metacity, the window should be placed -+ * as early as possible, before it is (re)allocated & mapped -+ * Position & size should not be queried yet. (rhbz#809546). -+ */ -+ virt_viewer_window_move_to_monitor(self); - g_signal_connect(priv->window, "map-event", G_CALLBACK(mapped), self); - return; - } -@@ -1312,7 +1318,8 @@ virt_viewer_window_show(VirtViewerWindow *self) - if (self->priv->kiosk) - virt_viewer_window_enable_kiosk(self); - -- virt_viewer_window_move_to_monitor(self); -+ if (self->priv->fullscreen) -+ virt_viewer_window_move_to_monitor(self); - } - - void diff --git a/SOURCES/0001-Take-direct-into-consideration-when-checking-if-a-gu.patch b/SOURCES/0001-Take-direct-into-consideration-when-checking-if-a-gu.patch new file mode 100644 index 0000000..cf2ef14 --- /dev/null +++ b/SOURCES/0001-Take-direct-into-consideration-when-checking-if-a-gu.patch @@ -0,0 +1,71 @@ +From fe2d91f045188e5f58e33727741cff97793ad227 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Fabiano=20Fid=C3=AAncio?= +Date: Wed, 11 Mar 2015 16:19:12 +0100 +Subject: [PATCH] Take --direct into consideration when checking if a guest is + reachable + +When connecting to a remote host (using qemu+ssh://...) that has a +virtual machine listening to "127.0.0.1", virt_viewer_is_reachable() must +take --direct into account, otherwise it can end up connecting to a local +virtual machine listening to "0.0.0.0" instead of returning that the +guest is not reachable. + +Resolves: rhbz#1085216 +(cherry picked from commit 21306d13f931153a6eb13f455ca7d8fedc800f78) +--- + src/virt-viewer.c | 14 ++++++++------ + 1 file changed, 8 insertions(+), 6 deletions(-) + +diff --git a/src/virt-viewer.c b/src/virt-viewer.c +index ec7d875..aeed5c1 100644 +--- a/src/virt-viewer.c ++++ b/src/virt-viewer.c +@@ -355,8 +355,10 @@ virt_viewer_is_loopback(const char *host) + + + static gboolean +-virt_viewer_is_reachable(const gchar *host, const char *transport, +- const char *transport_host) ++virt_viewer_is_reachable(const gchar *host, ++ const char *transport, ++ const char *transport_host, ++ gboolean direct) + { + gboolean host_is_loopback; + gboolean transport_is_loopback; +@@ -367,7 +369,7 @@ virt_viewer_is_reachable(const gchar *host, const char *transport, + if (!transport) + return TRUE; + +- if (strcmp(transport, "ssh") == 0) ++ if (strcmp(transport, "ssh") == 0 && !direct) + return TRUE; + + if (strcmp(transport, "unix") == 0) +@@ -402,6 +404,7 @@ virt_viewer_extract_connect_info(VirtViewer *self, + gchar *user = NULL; + gint port = 0; + gchar *uri = NULL; ++ gboolean direct = virt_viewer_app_get_direct(app); + + virt_viewer_app_free_connect_info(app); + +@@ -457,8 +460,7 @@ virt_viewer_extract_connect_info(VirtViewer *self, + */ + if (virt_viewer_replace_host(ghost)) { + gchar *replacement_host = NULL; +- if ((g_strcmp0(transport, "ssh") == 0) +- && !virt_viewer_app_get_direct(app)) { ++ if ((g_strcmp0(transport, "ssh") == 0) && !direct) { + replacement_host = g_strdup("localhost"); + } else { + replacement_host = g_strdup(host); +@@ -469,7 +471,7 @@ virt_viewer_extract_connect_info(VirtViewer *self, + ghost = replacement_host; + } + +- if (!virt_viewer_is_reachable(ghost, transport, host)) { ++ if (!virt_viewer_is_reachable(ghost, transport, host, direct)) { + g_debug("graphics listen '%s' is not reachable from this machine", + ghost ? ghost : ""); + virt_viewer_app_simple_message_dialog(app, _("Guest '%s' is not reachable"), diff --git a/SOURCES/0002-Fix-scaling-of-window-upon-resize.patch b/SOURCES/0002-Fix-scaling-of-window-upon-resize.patch deleted file mode 100644 index 3641cc4..0000000 --- a/SOURCES/0002-Fix-scaling-of-window-upon-resize.patch +++ /dev/null @@ -1,51 +0,0 @@ -From 2f562451e3dcb4d6762a86f820d88048b321d343 Mon Sep 17 00:00:00 2001 -From: "Daniel P. Berrange" -Date: Wed, 12 Mar 2014 17:33:24 +0000 -Subject: [PATCH] Fix scaling of window upon resize - -The code to determine scaling of windows was incorrectly -using the original desktop size instead of the host screen -size. The 128 pixel fudge factor was also causing windows -to be scaled when there was no need for them to be. - -Signed-off-by: Daniel P. Berrange ---- - src/virt-viewer-window.c | 16 +++++++--------- - 1 file changed, 7 insertions(+), 9 deletions(-) - -diff --git a/src/virt-viewer-window.c b/src/virt-viewer-window.c -index a6ccaa1..d971263 100644 ---- a/src/virt-viewer-window.c -+++ b/src/virt-viewer-window.c -@@ -433,24 +433,22 @@ virt_viewer_window_resize(VirtViewerWindow *self, gboolean keep_win_size) - (screen, gtk_widget_get_window(priv->window)), - &fullscreen); - -- g_return_if_fail(fullscreen.height > 128); -- g_return_if_fail(fullscreen.width > 128); - g_return_if_fail(desktopWidth > 0); - g_return_if_fail(desktopHeight > 0); - - desktopAspect = (double)desktopWidth / (double)desktopHeight; -- screenAspect = (double)(fullscreen.width - 128) / (double)(fullscreen.height - 128); -+ screenAspect = (double)fullscreen.width / (double)fullscreen.height; - -- if ((desktopWidth > (fullscreen.width - 128)) || -- (desktopHeight > (fullscreen.height - 128))) { -+ if ((desktopWidth > fullscreen.width) || -+ (desktopHeight > fullscreen.height)) { - /* Doesn't fit native res, so go as large as possible - maintaining aspect ratio */ - if (screenAspect > desktopAspect) { -- width = desktopHeight * desktopAspect; -- height = desktopHeight; -+ width = fullscreen.height * desktopAspect; -+ height = fullscreen.height; - } else { -- width = desktopWidth; -- height = desktopWidth / desktopAspect; -+ width = fullscreen.width; -+ height = fullscreen.width / desktopAspect; - } - } else { - width = desktopWidth; diff --git a/SOURCES/0002-Update-geometry-when-enabling-disabling-displays.patch b/SOURCES/0002-Update-geometry-when-enabling-disabling-displays.patch new file mode 100644 index 0000000..6c89700 --- /dev/null +++ b/SOURCES/0002-Update-geometry-when-enabling-disabling-displays.patch @@ -0,0 +1,76 @@ +From ddedc917a5a52755bfb8f5c562107289df470521 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Fabiano=20Fid=C3=AAncio?= +Date: Wed, 4 Mar 2015 23:40:37 +0100 +Subject: [PATCH] Update geometry when enabling/disabling displays + +_update_displays_geometry() must be called every time a display is +enabled/disabled, avoiding gaps (when a display is disabled) or overlaps +(when a display is enabled) between the monitors. + +This is what happens when we have 3 displays enabled (each one +represented by: width x height + x position + y position) ... + + Display #0 Display #1 Display #2 + +---------+ +----------+ +---------+ + | | | | | | + | | | | | | + | | | | | | + | | | | | | + | | | | | | + | | | | | | + +---------+ +----------+ +---------+ +(680x804+0+0) (504x804+680+0) (408x804+1184+0) + +Whether the Display #1 is disable, a message will be sent down to the +vdagent, representing the new arrangement of the monitors: + + Display #0 Display #2 + +---------+ +---------+ + | | | | + | | | | + | | | | + | | | | + | | | | + | | | | + +---------+ +---------+ +(680x804+0+0) (408x804+1184+0) + +However, taking a look on the x position, a gap can be identified as +Display #0 starts at position (0,0) and has 680 pixels of width. But +Display #1 only starts at position (1184, 0), leaving 504 pixels as a +gap. The proper message, however, should represent the following +arrangement ... + + Display #0 Display #2 + +---------+ +---------+ + | | | | + | | | | + | | | | + | | | | + | | | | + | | | | + +---------+ +---------+ +(680x804+0+0) (408x804+680+0) + +... avoiding then gaps and overlaps. + +Resolves: rhbz#1111425 +https://bugzilla.redhat.com/show_bug.cgi?id=1111425 +(cherry picked from commit 4de3379f34a693a3ec81cce4f0ed741213ba00cb) +--- + src/virt-viewer-app.c | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/src/virt-viewer-app.c b/src/virt-viewer-app.c +index 4800beb..2315167 100644 +--- a/src/virt-viewer-app.c ++++ b/src/virt-viewer-app.c +@@ -2175,6 +2175,8 @@ menu_display_visible_toggled_cb(GtkCheckMenuItem *checkmenuitem, + + gtk_check_menu_item_set_active(checkmenuitem, /* will be toggled again */ !visible); + reentering = FALSE; ++ ++ virt_viewer_session_update_displays_geometry(virt_viewer_display_get_session(display)); + } + + static gint diff --git a/SOURCES/0003-Silence-a-message-about-missing-configuration-file.patch b/SOURCES/0003-Silence-a-message-about-missing-configuration-file.patch deleted file mode 100644 index b4617af..0000000 --- a/SOURCES/0003-Silence-a-message-about-missing-configuration-file.patch +++ /dev/null @@ -1,31 +0,0 @@ -From ffe0c92907cc949cb9cc4e5d00b5f2b377ec251d Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= -Date: Wed, 12 Mar 2014 14:43:28 +0100 -Subject: [PATCH] Silence a message about missing configuration file - -Do not print a g_debug() error when the configuration file is missing, -unless given the --debug option. - -https://bugzilla.redhat.com/show_bug.cgi?id=1006737 ---- - src/virt-viewer-app.c | 7 +++++-- - 1 file changed, 5 insertions(+), 2 deletions(-) - -diff --git a/src/virt-viewer-app.c b/src/virt-viewer-app.c -index 0cdf95a..4f31812 100644 ---- a/src/virt-viewer-app.c -+++ b/src/virt-viewer-app.c -@@ -1575,8 +1575,11 @@ virt_viewer_app_init (VirtViewerApp *self) - - g_key_file_load_from_file(self->priv->config, self->priv->config_file, - G_KEY_FILE_KEEP_COMMENTS|G_KEY_FILE_KEEP_TRANSLATIONS, &error); -- if (error) -- g_debug("Couldn't load configuration: %s", error->message); -+ -+ if (g_error_matches(error, G_FILE_ERROR, G_FILE_ERROR_NOENT)) -+ DEBUG_LOG("No configuration file %s", self->priv->config_file); -+ else if (error) -+ g_warning("Couldn't load configuration: %s", error->message); - - g_clear_error(&error); - diff --git a/SOURCES/0003-VirtViewerApp-create-main-window-after-constructor.patch b/SOURCES/0003-VirtViewerApp-create-main-window-after-constructor.patch new file mode 100644 index 0000000..9e73c87 --- /dev/null +++ b/SOURCES/0003-VirtViewerApp-create-main-window-after-constructor.patch @@ -0,0 +1,83 @@ +From ab33ebf46c2f8d53a8a0a89d240c744fc70fa633 Mon Sep 17 00:00:00 2001 +From: Jonathon Jongsma +Date: Thu, 19 Mar 2015 10:15:08 -0500 +Subject: [PATCH] VirtViewerApp: create main window after constructor + +When using the configuration file to specify which remote monitors +should be enabled when using the --full-screen option, it sometimes left +additional displays enabled, or didn't place the displays on the right +monitor, or didn't fullscreen them. + +Part of the problem was that we were creating the first display window before +loading the monitor mapping configuration from the settings file. So even if +the first display was disabled in the configuration, the first window will +still be created with an id of 0, and therefore didn't get set to fullscreen. +Moving the main window creation to the 'constructor' vfunc instead of the +object init func ensures that the configuration is all loaded before we attempt +to do any fullscreen autoconf. + +Related: rhbz#1200750 +(cherry picked from commit 3b8be76459518b8b3f730e8acf4798154d51b253) +--- + src/virt-viewer-app.c | 27 ++++++++++++++++++++++----- + 1 file changed, 22 insertions(+), 5 deletions(-) + +diff --git a/src/virt-viewer-app.c b/src/virt-viewer-app.c +index 2315167..431f897 100644 +--- a/src/virt-viewer-app.c ++++ b/src/virt-viewer-app.c +@@ -308,6 +308,22 @@ gint virt_viewer_app_get_n_initial_displays(VirtViewerApp* self) + return gdk_screen_get_n_monitors(gdk_screen_get_default()); + } + ++static gint virt_viewer_app_get_first_monitor(VirtViewerApp *self) ++{ ++ if (self->priv->fullscreen && self->priv->initial_display_map) { ++ gint first = G_MAXINT; ++ GHashTableIter iter; ++ gpointer key, value; ++ g_hash_table_iter_init(&iter, self->priv->initial_display_map); ++ while (g_hash_table_iter_next(&iter, &key, &value)) { ++ gint monitor = GPOINTER_TO_INT(key); ++ first = MIN(first, monitor); ++ } ++ return first; ++ } ++ return 0; ++} ++ + gint virt_viewer_app_get_initial_monitor_for_display(VirtViewerApp* self, gint display) + { + gint monitor = display; +@@ -1718,9 +1734,6 @@ virt_viewer_app_init (VirtViewerApp *self) + self->priv->config = g_key_file_new(); + self->priv->config_file = g_build_filename(g_get_user_config_dir(), + "virt-viewer", "settings", NULL); +- self->priv->main_window = virt_viewer_app_window_new(self, 0); +- self->priv->main_notebook = GTK_WIDGET(virt_viewer_window_get_notebook(self->priv->main_window)); +- + g_key_file_load_from_file(self->priv->config, self->priv->config_file, + G_KEY_FILE_KEEP_COMMENTS|G_KEY_FILE_KEEP_TRANSLATIONS, &error); + +@@ -1742,8 +1755,6 @@ virt_viewer_app_init (VirtViewerApp *self) + g_signal_connect(self, "notify::guest-name", G_CALLBACK(title_maybe_changed), NULL); + g_signal_connect(self, "notify::title", G_CALLBACK(title_maybe_changed), NULL); + g_signal_connect(self, "notify::guri", G_CALLBACK(title_maybe_changed), NULL); +- +- virt_viewer_window_set_zoom_level(self->priv->main_window, opt_zoom); + } + + static void +@@ -1809,6 +1820,12 @@ virt_viewer_app_constructor (GType gtype, + obj = G_OBJECT_CLASS (virt_viewer_app_parent_class)->constructor (gtype, n_properties, properties); + self = VIRT_VIEWER_APP(obj); + ++ self->priv->main_window = virt_viewer_app_window_new(self, ++ virt_viewer_app_get_first_monitor(self)); ++ self->priv->main_notebook = GTK_WIDGET(virt_viewer_window_get_notebook(self->priv->main_window)); ++ ++ virt_viewer_window_set_zoom_level(self->priv->main_window, opt_zoom); ++ + virt_viewer_set_insert_smartcard_accel(self, GDK_F8, GDK_SHIFT_MASK); + virt_viewer_set_remove_smartcard_accel(self, GDK_F9, GDK_SHIFT_MASK); + gtk_accel_map_add_entry("/view/toggle-fullscreen", GDK_F11, 0); diff --git a/SOURCES/0004-Remove-Automatically-resize-menu.patch b/SOURCES/0004-Remove-Automatically-resize-menu.patch deleted file mode 100644 index 5404311..0000000 --- a/SOURCES/0004-Remove-Automatically-resize-menu.patch +++ /dev/null @@ -1,209 +0,0 @@ -From 66f55ec707713472de4a76d851151a3c1d778e0d Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= -Date: Wed, 12 Mar 2014 18:46:49 +0100 -Subject: [PATCH] Remove "Automatically resize" menu - -Remove "Automatically resize" menu item (always enabled for Spice -display now) - -https://bugzilla.redhat.com/show_bug.cgi?id=1007649 ---- - src/virt-viewer-display-spice.c | 5 ----- - src/virt-viewer-display.c | 25 +------------------------ - src/virt-viewer-display.h | 2 -- - src/virt-viewer-window.c | 26 +------------------------- - src/virt-viewer.xml | 10 ---------- - 5 files changed, 2 insertions(+), 66 deletions(-) - -diff --git a/src/virt-viewer-display-spice.c b/src/virt-viewer-display-spice.c -index d13fbda..ff0d069 100644 ---- a/src/virt-viewer-display-spice.c -+++ b/src/virt-viewer-display-spice.c -@@ -97,12 +97,7 @@ get_main(VirtViewerDisplay *self) - static void - virt_viewer_display_spice_monitor_geometry_changed(VirtViewerDisplaySpice *self) - { -- -- if (virt_viewer_display_get_auto_resize(VIRT_VIEWER_DISPLAY(self)) == FALSE) -- return; -- - g_signal_emit_by_name(self, "monitor-geometry-changed", NULL); -- - } - - static void -diff --git a/src/virt-viewer-display.c b/src/virt-viewer-display.c -index feefcca..6c078a5 100644 ---- a/src/virt-viewer-display.c -+++ b/src/virt-viewer-display.c -@@ -47,7 +47,6 @@ struct _VirtViewerDisplayPrivate - gint monitor; /* Monitor number on the client */ - guint show_hint; - VirtViewerSession *session; -- gboolean auto_resize; - gboolean fullscreen; - }; - -@@ -280,7 +279,6 @@ virt_viewer_display_init(VirtViewerDisplay *display) - display->priv->desktopHeight = 100; - display->priv->zoom_level = 100; - display->priv->zoom = TRUE; -- display->priv->auto_resize = TRUE; - #if !GTK_CHECK_VERSION(3, 0, 0) - display->priv->dirty = TRUE; - #endif -@@ -691,20 +689,6 @@ VirtViewerSession* virt_viewer_display_get_session(VirtViewerDisplay *self) - return self->priv->session; - } - --void virt_viewer_display_set_auto_resize(VirtViewerDisplay *self, gboolean auto_resize) --{ -- g_return_if_fail(VIRT_VIEWER_IS_DISPLAY(self)); -- -- self->priv->auto_resize = auto_resize; --} -- --gboolean virt_viewer_display_get_auto_resize(VirtViewerDisplay *self) --{ -- g_return_val_if_fail(VIRT_VIEWER_IS_DISPLAY(self), FALSE); -- -- return self->priv->auto_resize; --} -- - void virt_viewer_display_set_monitor(VirtViewerDisplay *self, gint monitor) - { - g_return_if_fail(VIRT_VIEWER_IS_DISPLAY(self)); -@@ -796,14 +780,7 @@ void virt_viewer_display_get_preferred_monitor_geometry(VirtViewerDisplay* self, - topx = MAX(topx, 0); - topy = MAX(topy, 0); - -- if (virt_viewer_display_get_auto_resize(VIRT_VIEWER_DISPLAY(self)) == FALSE) { -- guint w, h; -- virt_viewer_display_get_desktop_size(self, &w, &h); -- preferred->width = w; -- preferred->height = h; -- preferred->x = topx; -- preferred->y = topy; -- } else { -+ { - if (virt_viewer_display_get_fullscreen(VIRT_VIEWER_DISPLAY(self))) { - GdkRectangle physical_monitor; - GdkScreen *screen = gtk_widget_get_screen(GTK_WIDGET(self)); -diff --git a/src/virt-viewer-display.h b/src/virt-viewer-display.h -index 195eeee..fe88d98 100644 ---- a/src/virt-viewer-display.h -+++ b/src/virt-viewer-display.h -@@ -114,8 +114,6 @@ GdkPixbuf* virt_viewer_display_get_pixbuf(VirtViewerDisplay *display); - void virt_viewer_display_set_show_hint(VirtViewerDisplay *display, guint mask, gboolean enable); - guint virt_viewer_display_get_show_hint(VirtViewerDisplay *display); - VirtViewerSession* virt_viewer_display_get_session(VirtViewerDisplay *display); --void virt_viewer_display_set_auto_resize(VirtViewerDisplay *display, gboolean auto_resize); --gboolean virt_viewer_display_get_auto_resize(VirtViewerDisplay *display); - void virt_viewer_display_set_monitor(VirtViewerDisplay *display, gint monitor); - gint virt_viewer_display_get_monitor(VirtViewerDisplay *display); - void virt_viewer_display_set_fullscreen(VirtViewerDisplay *display, gboolean fullscreen); -diff --git a/src/virt-viewer-window.c b/src/virt-viewer-window.c -index d971263..f75fc41 100644 ---- a/src/virt-viewer-window.c -+++ b/src/virt-viewer-window.c -@@ -50,7 +50,6 @@ gboolean virt_viewer_window_delete(GtkWidget *src, void *dummy, VirtViewerWindow - void virt_viewer_window_menu_file_quit(GtkWidget *src, VirtViewerWindow *self); - void virt_viewer_window_menu_help_about(GtkWidget *menu, VirtViewerWindow *self); - void virt_viewer_window_menu_view_fullscreen(GtkWidget *menu, VirtViewerWindow *self); --void virt_viewer_window_menu_view_resize(GtkWidget *menu, VirtViewerWindow *self); - void virt_viewer_window_menu_send(GtkWidget *menu, VirtViewerWindow *self); - void virt_viewer_window_menu_file_screenshot(GtkWidget *menu, VirtViewerWindow *self); - void virt_viewer_window_menu_file_usb_device_selection(GtkWidget *menu, VirtViewerWindow *self); -@@ -101,7 +100,6 @@ struct _VirtViewerWindowPrivate { - gboolean kiosk; - - gint zoomlevel; -- gboolean auto_resize; - gboolean fullscreen; - gchar *subtitle; - }; -@@ -287,7 +285,6 @@ virt_viewer_window_init (VirtViewerWindow *self) - { - VirtViewerWindowPrivate *priv; - GtkWidget *vbox; -- GtkWidget *menu; - GdkColor color; - GSList *accels; - -@@ -295,14 +292,11 @@ virt_viewer_window_init (VirtViewerWindow *self) - priv = self->priv; - - priv->fullscreen_monitor = -1; -- priv->auto_resize = TRUE; - g_value_init(&priv->accel_setting, G_TYPE_STRING); - - priv->notebook = virt_viewer_notebook_new(); - priv->builder = virt_viewer_util_load_ui("virt-viewer.xml"); - -- menu = GTK_WIDGET(gtk_builder_get_object(priv->builder, "menu-view-resize")); -- gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menu), TRUE); - gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(self->priv->builder, "menu-send")), FALSE); - gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(self->priv->builder, "menu-file-screenshot")), FALSE); - -@@ -415,7 +409,7 @@ virt_viewer_window_resize(VirtViewerWindow *self, gboolean keep_win_size) - guint desktopHeight; - VirtViewerWindowPrivate *priv = self->priv; - -- if (!priv->auto_resize || priv->fullscreen) -+ if (priv->fullscreen) - return; - - DEBUG_LOG("Preparing main window resize"); -@@ -876,23 +870,6 @@ virt_viewer_window_menu_view_fullscreen(GtkWidget *menu, - virt_viewer_window_leave_fullscreen(self); - } - --G_MODULE_EXPORT void --virt_viewer_window_menu_view_resize(GtkWidget *menu, -- VirtViewerWindow *self) --{ -- VirtViewerWindowPrivate *priv = self->priv; -- -- if (gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menu))) { -- priv->auto_resize = TRUE; -- virt_viewer_window_resize(self, TRUE); -- } else { -- priv->auto_resize = FALSE; -- } -- -- if (priv->display) -- virt_viewer_display_set_auto_resize(priv->display, priv->auto_resize); --} -- - static void add_if_writable (GdkPixbufFormat *data, GHashTable *formats) - { - if (gdk_pixbuf_format_is_writable(data)) { -@@ -1252,7 +1229,6 @@ virt_viewer_window_set_display(VirtViewerWindow *self, VirtViewerDisplay *displa - priv->display = g_object_ref(display); - - virt_viewer_display_set_zoom_level(VIRT_VIEWER_DISPLAY(priv->display), priv->zoomlevel); -- virt_viewer_display_set_auto_resize(VIRT_VIEWER_DISPLAY(priv->display), priv->auto_resize); - virt_viewer_display_set_monitor(VIRT_VIEWER_DISPLAY(priv->display), priv->fullscreen_monitor); - virt_viewer_display_set_fullscreen(VIRT_VIEWER_DISPLAY(priv->display), priv->fullscreen); - -diff --git a/src/virt-viewer.xml b/src/virt-viewer.xml -index 4917201..8a3d3c0 100644 ---- a/src/virt-viewer.xml -+++ b/src/virt-viewer.xml -@@ -172,16 +172,6 @@ - - - -- -- True -- False -- False -- Automatically resize -- True -- -- -- -- - - True - False diff --git a/SOURCES/0004-Use-constructed-vfunc-instead-of-constructor.patch b/SOURCES/0004-Use-constructed-vfunc-instead-of-constructor.patch new file mode 100644 index 0000000..6aab454 --- /dev/null +++ b/SOURCES/0004-Use-constructed-vfunc-instead-of-constructor.patch @@ -0,0 +1,56 @@ +From e6b3a678b9d9e6f202c8916f8c71b2fe58e44334 Mon Sep 17 00:00:00 2001 +From: Jonathon Jongsma +Date: Thu, 19 Mar 2015 10:20:06 -0500 +Subject: [PATCH] Use 'constructed' vfunc instead of 'constructor' + +We don't need the added complexity of 'constructor', since we only want +to do some final initializing after all of the properties have been set, +etc. So just use the simpler 'constructed'. + +(cherry picked from commit b368761ea1ed461e175af175ba4d5b268debc9a8) +--- + src/virt-viewer-app.c | 16 ++++------------ + 1 file changed, 4 insertions(+), 12 deletions(-) + +diff --git a/src/virt-viewer-app.c b/src/virt-viewer-app.c +index 431f897..3ab9462 100644 +--- a/src/virt-viewer-app.c ++++ b/src/virt-viewer-app.c +@@ -1809,16 +1809,10 @@ virt_viewer_update_smartcard_accels(VirtViewerApp *self) + } + } + +-static GObject * +-virt_viewer_app_constructor (GType gtype, +- guint n_properties, +- GObjectConstructParam *properties) ++static void ++virt_viewer_app_constructed(GObject *object) + { +- GObject *obj; +- VirtViewerApp *self; +- +- obj = G_OBJECT_CLASS (virt_viewer_app_parent_class)->constructor (gtype, n_properties, properties); +- self = VIRT_VIEWER_APP(obj); ++ VirtViewerApp *self = VIRT_VIEWER_APP(object); + + self->priv->main_window = virt_viewer_app_window_new(self, + virt_viewer_app_get_first_monitor(self)); +@@ -1838,8 +1832,6 @@ virt_viewer_app_constructor (GType gtype, + virt_viewer_app_set_fullscreen(self, opt_fullscreen); + virt_viewer_app_set_hotkeys(self, opt_hotkeys); + virt_viewer_app_set_kiosk(self, opt_kiosk); +- +- return obj; + } + + static void +@@ -1849,7 +1841,7 @@ virt_viewer_app_class_init (VirtViewerAppClass *klass) + + g_type_class_add_private (klass, sizeof (VirtViewerAppPrivate)); + +- object_class->constructor = virt_viewer_app_constructor; ++ object_class->constructed = virt_viewer_app_constructed; + object_class->get_property = virt_viewer_app_get_property; + object_class->set_property = virt_viewer_app_set_property; + object_class->dispose = virt_viewer_app_dispose; diff --git a/SOURCES/0005-Monitor-config-at-sometimes-leaves-additional-monito.patch b/SOURCES/0005-Monitor-config-at-sometimes-leaves-additional-monito.patch new file mode 100644 index 0000000..9e7bf31 --- /dev/null +++ b/SOURCES/0005-Monitor-config-at-sometimes-leaves-additional-monito.patch @@ -0,0 +1,151 @@ +From 389423f5168e7cc857a6dc170570e08b12db8c8c Mon Sep 17 00:00:00 2001 +From: Jonathon Jongsma +Date: Thu, 19 Mar 2015 10:53:55 -0500 +Subject: [PATCH] Monitor config at sometimes leaves additional monitors + enabled + +When using the configuration file to specify which remote monitors should be +enabled when using the --full-screen option, it sometimes left additional +displays enabled, or didn't place the displays on the right monitor, or didn't +fullscreen them. + +This was especially true when not enabling the first display on the remote +host. For example: + + monitor-mapping=2:2;3:3 + +(note that configuration file uses 1-based indexes, rather than 0-based +indexes, so the numbers used below will be 1 less than those above) + +Previously, when performing fullscreen auto-conf, we were configuring displays +starting at #0 and ending at ndisplays. So for the previous configuration, we +looped from i = 0 to i < 2 (i.e. display #0 and #1) even though we should have +configured display #1 and #2. After this fix, we configure the exact displays +that were specified in the monitor-mapping configuration. + +Resolves: rhbz#1200750 +(cherry picked from commit c586dc8c2bf84c2eda4db8759907e954dfb6ad6a) +--- + src/virt-viewer-app.c | 26 ++++++++++++++++---------- + src/virt-viewer-app.h | 2 +- + src/virt-viewer-session-spice.c | 13 ++++++++----- + 3 files changed, 25 insertions(+), 16 deletions(-) + +diff --git a/src/virt-viewer-app.c b/src/virt-viewer-app.c +index 3ab9462..a2328d7 100644 +--- a/src/virt-viewer-app.c ++++ b/src/virt-viewer-app.c +@@ -300,12 +300,19 @@ virt_viewer_app_quit(VirtViewerApp *self) + gtk_main_quit(); + } + +-gint virt_viewer_app_get_n_initial_displays(VirtViewerApp* self) ++GList* virt_viewer_app_get_initial_displays(VirtViewerApp* self) + { +- if (self->priv->initial_display_map) +- return g_hash_table_size(self->priv->initial_display_map); ++ if (!self->priv->initial_display_map) { ++ GList *l = NULL; ++ gint i; ++ gint n = gdk_screen_get_n_monitors(gdk_screen_get_default()); + +- return gdk_screen_get_n_monitors(gdk_screen_get_default()); ++ for (i = 0; i < n; i++) { ++ l = g_list_append(l, GINT_TO_POINTER(i)); ++ } ++ return l; ++ } ++ return g_hash_table_get_keys(self->priv->initial_display_map); + } + + static gint virt_viewer_app_get_first_monitor(VirtViewerApp *self) +@@ -1722,14 +1729,16 @@ title_maybe_changed(VirtViewerApp *self, GParamSpec* pspec G_GNUC_UNUSED, gpoint + } + + static void +-virt_viewer_app_init (VirtViewerApp *self) ++virt_viewer_app_init(VirtViewerApp *self) + { + GError *error = NULL; ++ self->priv = GET_PRIVATE(self); + + gtk_window_set_default_icon_name("virt-viewer"); + virt_viewer_app_set_debug(opt_debug); ++ virt_viewer_app_set_fullscreen(self, opt_fullscreen); ++ virt_viewer_app_set_hotkeys(self, opt_hotkeys); + +- self->priv = GET_PRIVATE(self); + self->priv->displays = g_hash_table_new_full(g_direct_hash, g_direct_equal, NULL, g_object_unref); + self->priv->config = g_key_file_new(); + self->priv->config_file = g_build_filename(g_get_user_config_dir(), +@@ -1818,6 +1827,7 @@ virt_viewer_app_constructed(GObject *object) + virt_viewer_app_get_first_monitor(self)); + self->priv->main_notebook = GTK_WIDGET(virt_viewer_window_get_notebook(self->priv->main_window)); + ++ virt_viewer_app_set_kiosk(self, opt_kiosk); + virt_viewer_window_set_zoom_level(self->priv->main_window, opt_zoom); + + virt_viewer_set_insert_smartcard_accel(self, GDK_F8, GDK_SHIFT_MASK); +@@ -1828,10 +1838,6 @@ virt_viewer_app_constructed(GObject *object) + gtk_accel_map_add_entry("/view/zoom-out", GDK_minus, GDK_CONTROL_MASK); + gtk_accel_map_add_entry("/view/zoom-in", GDK_plus, GDK_CONTROL_MASK); + gtk_accel_map_add_entry("/send/secure-attention", GDK_End, GDK_CONTROL_MASK | GDK_MOD1_MASK); +- +- virt_viewer_app_set_fullscreen(self, opt_fullscreen); +- virt_viewer_app_set_hotkeys(self, opt_hotkeys); +- virt_viewer_app_set_kiosk(self, opt_kiosk); + } + + static void +diff --git a/src/virt-viewer-app.h b/src/virt-viewer-app.h +index f127b32..c9b347d 100644 +--- a/src/virt-viewer-app.h ++++ b/src/virt-viewer-app.h +@@ -97,7 +97,7 @@ VirtViewerSession* virt_viewer_app_get_session(VirtViewerApp *self); + gboolean virt_viewer_app_get_fullscreen(VirtViewerApp *app); + GOptionGroup* virt_viewer_app_get_option_group(void); + void virt_viewer_app_clear_hotkeys(VirtViewerApp *app); +-gint virt_viewer_app_get_n_initial_displays(VirtViewerApp* self); ++GList* virt_viewer_app_get_initial_displays(VirtViewerApp* self); + gint virt_viewer_app_get_initial_monitor_for_display(VirtViewerApp* self, gint display); + void virt_viewer_app_set_enable_accel(VirtViewerApp *app, gboolean enable); + +diff --git a/src/virt-viewer-session-spice.c b/src/virt-viewer-session-spice.c +index ebe78fc..85e5360 100644 +--- a/src/virt-viewer-session-spice.c ++++ b/src/virt-viewer-session-spice.c +@@ -815,7 +815,8 @@ virt_viewer_session_spice_fullscreen_auto_conf(VirtViewerSessionSpice *self) + GdkRectangle *displays; + gboolean agent_connected; + gint i; +- gsize ndisplays = 0; ++ GList *initial_displays, *l; ++ guint ndisplays; + + /* only do auto-conf once at startup. Avoid repeating auto-conf later due to + * agent disconnection/re-connection, etc */ +@@ -845,18 +846,20 @@ virt_viewer_session_spice_fullscreen_auto_conf(VirtViewerSessionSpice *self) + + spice_main_set_display_enabled(cmain, -1, FALSE); + +- ndisplays = virt_viewer_app_get_n_initial_displays(app); +- g_debug("Performing full screen auto-conf, %" G_GSIZE_FORMAT " host monitors", ndisplays); ++ initial_displays = virt_viewer_app_get_initial_displays(app); ++ ndisplays = g_list_length(initial_displays); ++ g_debug("Performing full screen auto-conf, %u host monitors", ndisplays); + displays = g_new0(GdkRectangle, ndisplays); + +- for (i = 0; i < ndisplays; i++) { ++ for (i = 0, l = initial_displays; l != NULL; l = l->next, i++) { + GdkRectangle* rect = &displays[i]; +- gint j = virt_viewer_app_get_initial_monitor_for_display(app, i); ++ gint j = virt_viewer_app_get_initial_monitor_for_display(app, GPOINTER_TO_INT(l->data)); + if (j == -1) + continue; + + gdk_screen_get_monitor_geometry(screen, j, rect); + } ++ g_list_free(initial_displays); + + virt_viewer_shift_monitors_to_origin(displays, ndisplays); + diff --git a/SOURCES/0005-Use-a-USB-icon-in-the-fullscreen-toolbar.patch b/SOURCES/0005-Use-a-USB-icon-in-the-fullscreen-toolbar.patch deleted file mode 100644 index a144e79..0000000 --- a/SOURCES/0005-Use-a-USB-icon-in-the-fullscreen-toolbar.patch +++ /dev/null @@ -1,302 +0,0 @@ -From 7c219c7218705338578724ec75c3c02e4de8095e Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= -Date: Wed, 12 Mar 2014 22:35:25 +0100 -Subject: [PATCH] Use a USB icon in the fullscreen toolbar - -Replace the generic GTK_STOCK_PREFERENCES with a more appropriate USB icon. - -The icon was provided by Jakub Steiner - -https://bugzilla.redhat.com/show_bug.cgi?id=804184 ---- - icons/24x24/Makefile.am | 11 ++- - icons/24x24/virt-viewer-usb.svg | 204 ++++++++++++++++++++++++++++++++++++++++ - mingw-virt-viewer.spec.in | 2 + - src/virt-viewer-window.c | 5 +- - virt-viewer.spec.in | 1 + - 5 files changed, 219 insertions(+), 4 deletions(-) - create mode 100644 icons/24x24/virt-viewer-usb.svg - -diff --git a/icons/24x24/Makefile.am b/icons/24x24/Makefile.am -index ba7d6aa..50ba421 100644 ---- a/icons/24x24/Makefile.am -+++ b/icons/24x24/Makefile.am -@@ -1,7 +1,12 @@ -+EXTRA_DIST = - size = $(notdir $(PWD)) --icondir = $(datadir)/icons/hicolor/$(size)/apps/ --icon_DATA = $(PACKAGE).png - --EXTRA_DIST = $(icon_DATA) -+apps_icondir = $(datadir)/icons/hicolor/$(size)/apps/ -+apps_icon_DATA = $(PACKAGE).png -+EXTRA_DIST += $(apps_icon_DATA) -+ -+devices_icondir = $(datadir)/icons/hicolor/$(size)/devices/ -+devices_icon_DATA = virt-viewer-usb.svg -+EXTRA_DIST += $(devices_icon_DATA) - - -include $(top_srcdir)/git.mk -diff --git a/icons/24x24/virt-viewer-usb.svg b/icons/24x24/virt-viewer-usb.svg -new file mode 100644 -index 0000000..4101f6e ---- /dev/null -+++ b/icons/24x24/virt-viewer-usb.svg -@@ -0,0 +1,204 @@ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ image/svg+xml -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -diff --git a/mingw-virt-viewer.spec.in b/mingw-virt-viewer.spec.in -index 01f8575..44d9230 100644 ---- a/mingw-virt-viewer.spec.in -+++ b/mingw-virt-viewer.spec.in -@@ -123,6 +123,7 @@ rm -rf $RPM_BUILD_ROOT - %{mingw32_datadir}/virt-viewer/ui/virt-viewer-about.xml - %{mingw32_datadir}/virt-viewer/ui/virt-viewer-auth.xml - %{mingw32_datadir}/icons/hicolor/*/apps/* -+%{mingw32_datadir}/icons/hicolor/*/devices/* - - %{mingw32_mandir}/man1/virt-viewer.1* - %{mingw32_mandir}/man1/remote-viewer.1* -@@ -143,6 +144,7 @@ rm -rf $RPM_BUILD_ROOT - %{mingw64_datadir}/virt-viewer/ui/virt-viewer-about.xml - %{mingw64_datadir}/virt-viewer/ui/virt-viewer-auth.xml - %{mingw64_datadir}/icons/hicolor/*/apps/* -+%{mingw64_datadir}/icons/hicolor/*/devices/* - - %{mingw64_mandir}/man1/virt-viewer.1* - %{mingw64_mandir}/man1/remote-viewer.1* -diff --git a/src/virt-viewer-window.c b/src/virt-viewer-window.c -index f75fc41..1ad896c 100644 ---- a/src/virt-viewer-window.c -+++ b/src/virt-viewer-window.c -@@ -1045,12 +1045,15 @@ virt_viewer_window_toolbar_setup(VirtViewerWindow *self) - g_signal_connect(button, "clicked", G_CALLBACK(virt_viewer_window_menu_file_quit), self); - - /* USB Device selection */ -- button = GTK_WIDGET(gtk_tool_button_new_from_stock(GTK_STOCK_PREFERENCES)); -+ button = gtk_image_new_from_icon_name("virt-viewer-usb", -+ GTK_ICON_SIZE_INVALID); -+ button = GTK_WIDGET(gtk_tool_button_new(button, NULL)); - gtk_tool_button_set_label(GTK_TOOL_BUTTON(button), _("USB device selection")); - gtk_tool_item_set_tooltip_text(GTK_TOOL_ITEM(button), _("USB device selection")); - gtk_toolbar_insert(GTK_TOOLBAR(priv->toolbar), GTK_TOOL_ITEM(button), 0); - g_signal_connect(button, "clicked", G_CALLBACK(virt_viewer_window_menu_file_usb_device_selection), self); - priv->toolbar_usb_device_selection = button; -+ gtk_widget_show_all(button); - - /* Send key */ - button = GTK_WIDGET(gtk_tool_button_new(NULL, NULL)); -diff --git a/virt-viewer.spec.in b/virt-viewer.spec.in -index d68029c..3dfeb96 100644 ---- a/virt-viewer.spec.in -+++ b/virt-viewer.spec.in -@@ -154,6 +154,7 @@ update-desktop-database -q %{_datadir}/applications - %{_datadir}/%{name}/ui/virt-viewer-auth.xml - %{_datadir}/%{name}/ui/virt-viewer-about.xml - %{_datadir}/icons/hicolor/*/apps/* -+%{_datadir}/icons/hicolor/*/devices/* - %{_datadir}/applications/remote-viewer.desktop - %{_datadir}/mime/packages/virt-viewer-mime.xml - %ghost %{_libexecdir}/spice-xpi-client diff --git a/SOURCES/0006-build-sys-Always-prepend-to-build-id.patch b/SOURCES/0006-build-sys-Always-prepend-to-build-id.patch deleted file mode 100644 index b49d082..0000000 --- a/SOURCES/0006-build-sys-Always-prepend-to-build-id.patch +++ /dev/null @@ -1,71 +0,0 @@ -From d7574d436d973a44d02e26cc7fa77de21030ad62 Mon Sep 17 00:00:00 2001 -From: Christophe Fergeau -Date: Wed, 2 Apr 2014 13:43:17 +0200 -Subject: [PATCH] build-sys: Always prepend '-' to build id - -When using the --with-buildid configure paramater, the build id which is -substituted in the MSI wxs file is automatically prepended by a '-', but -the build id which is used in the C files does not get this '-' -automatically. - -Currently, the linux and mingw spec files prepend a '-' on their own to the ---with-buildid argument, but this causes the MSI installer to show 2 '-' -during installation: "Please wait while Windows configures VirtViewer -0.6.0--1" - -This commit always prepends a '-' to the buildid strings, and removes the -'-' from the spec files. This is to ensure the separator between version -number and buildid is not forgotten, which could give a confusing version -number. ---- - configure.ac | 9 +++++---- - mingw-virt-viewer.spec.in | 2 +- - virt-viewer.spec.in | 2 +- - 3 files changed, 7 insertions(+), 6 deletions(-) - -diff --git a/configure.ac b/configure.ac -index 7a00bf4..f966688 100644 ---- a/configure.ac -+++ b/configure.ac -@@ -211,10 +211,11 @@ if test "x$have_gtk_vnc" != "xyes" && test "x$have_spice_gtk" != "xyes"; then - fi - - AC_ARG_WITH([buildid], -- AS_HELP_STRING([--with-buildid=id], [Set additional build version details])) --AC_DEFINE_UNQUOTED([BUILDID], "$with_buildid", [Build version details]) --if test "x$with_buildid" != x; then -- AC_SUBST([BUILDID], "-$with_buildid") -+ AS_HELP_STRING([--with-buildid=id], [Set additional build version details]), -+ [buildid="-$with_buildid"], [buildid=""]) -+AC_DEFINE_UNQUOTED([BUILDID], "$buildid", [Build version details]) -+if test "x$buildid" != x; then -+ AC_SUBST([BUILDID], "$buildid") - fi - - major=`echo $PACKAGE_VERSION | cut -d. -f1` -diff --git a/mingw-virt-viewer.spec.in b/mingw-virt-viewer.spec.in -index 44d9230..fb1c9fd 100644 ---- a/mingw-virt-viewer.spec.in -+++ b/mingw-virt-viewer.spec.in -@@ -85,7 +85,7 @@ MinGW Windows virt-viewer MSI - - - %build --%mingw_configure --with-gtk=2.0 --with-buildid=-%{release} -+%mingw_configure --with-gtk=2.0 --with-buildid=%{release} - - %mingw_make %{?_smp_mflags} V=1 - %mingw_make %{?_smp_mflags} V=1 -C data msi -diff --git a/virt-viewer.spec.in b/virt-viewer.spec.in -index 3dfeb96..3cbf194 100644 ---- a/virt-viewer.spec.in -+++ b/virt-viewer.spec.in -@@ -109,7 +109,7 @@ autoreconf -if - %define govirt_arg --with-ovirt - %endif - --%configure %{spice_arg} %{gtk_arg} %{govirt_arg} --with-buildid=-%{release} --disable-update-mimedb -+%configure %{spice_arg} %{gtk_arg} %{govirt_arg} --with-buildid=%{release} --disable-update-mimedb - %__make %{?_smp_mflags} - - diff --git a/SOURCES/0006-virt-viewer-Bring-back-debug-log-about-nonexistent-g.patch b/SOURCES/0006-virt-viewer-Bring-back-debug-log-about-nonexistent-g.patch new file mode 100644 index 0000000..fc295d1 --- /dev/null +++ b/SOURCES/0006-virt-viewer-Bring-back-debug-log-about-nonexistent-g.patch @@ -0,0 +1,29 @@ +From 933b3921fb3adc4b2de19d73a23a4dee7d380f16 Mon Sep 17 00:00:00 2001 +From: Pavel Grunt +Date: Thu, 19 Mar 2015 11:39:42 +0100 +Subject: [PATCH] virt-viewer: Bring back debug log about nonexistent guest + +Although commit 88f6341 allowed to use virt-viewer with a wrong guest name, +the user is informed about the nonexistent guest only by a dialog showing +the list of running machines or informing about the connection error. + +Resolves https://bugzilla.redhat.com/show_bug.cgi?id=1201177 + +(cherry picked from commit aec2248cf86cacfc8950f48ccf0fc8fcaa261908) +--- + src/virt-viewer.c | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/src/virt-viewer.c b/src/virt-viewer.c +index aeed5c1..d95d1eb 100644 +--- a/src/virt-viewer.c ++++ b/src/virt-viewer.c +@@ -726,6 +726,8 @@ virt_viewer_initial_connect(VirtViewerApp *app, GError **error) + goto wait; + } else { + VirtViewerWindow *main_window = virt_viewer_app_get_main_window(app); ++ if (priv->domkey != NULL) ++ g_debug("Cannot find guest %s", priv->domkey); + dom = choose_vm(virt_viewer_window_get_window(main_window), + &priv->domkey, + priv->conn, diff --git a/SOURCES/0007-Update-user-visible-copyright-information.patch b/SOURCES/0007-Update-user-visible-copyright-information.patch deleted file mode 100644 index 5976a6a..0000000 --- a/SOURCES/0007-Update-user-visible-copyright-information.patch +++ /dev/null @@ -1,52 +0,0 @@ -From 7bcc1269ca9e629b4f7782e769b07330e5937956 Mon Sep 17 00:00:00 2001 -From: Christophe Fergeau -Date: Thu, 3 Apr 2014 17:32:52 +0200 -Subject: [PATCH] Update user-visible copyright information - -Years in copyright notices in the about dialog and man pages is at most -2012, let's set it to 2014 ---- - man/remote-viewer.pod | 2 +- - man/virt-viewer.pod | 2 +- - src/virt-viewer-about.xml | 2 +- - 3 files changed, 3 insertions(+), 3 deletions(-) - -diff --git a/man/remote-viewer.pod b/man/remote-viewer.pod -index 6773c3b..e35d281 100644 ---- a/man/remote-viewer.pod -+++ b/man/remote-viewer.pod -@@ -283,7 +283,7 @@ Report bugs to the mailing list C. There is NO WARRANTY, to the extent - permitted by law. -diff --git a/man/virt-viewer.pod b/man/virt-viewer.pod -index 963d7bc..5b3d6e6 100644 ---- a/man/virt-viewer.pod -+++ b/man/virt-viewer.pod -@@ -148,7 +148,7 @@ Report bugs to the mailing list C. There is NO WARRANTY, to the extent - permitted by law. -diff --git a/src/virt-viewer-about.xml b/src/virt-viewer-about.xml -index e9ae52a..16db3c2 100644 ---- a/src/virt-viewer-about.xml -+++ b/src/virt-viewer-about.xml -@@ -14,7 +14,7 @@ - True - Virtual Machine Viewer - Copyright (C) 2007-2012 Daniel P. Berrange --Copyright (C) 2007-2012 Red Hat, Inc. -+Copyright (C) 2007-2014 Red Hat, Inc. - A remote desktop client built with GTK-VNC, SPICE-GTK and libvirt - http://virt-manager.org/ - virt-manager.org diff --git a/SOURCES/0007-foreign-menu-Don-t-show-empty-foreign-menu-on-second.patch b/SOURCES/0007-foreign-menu-Don-t-show-empty-foreign-menu-on-second.patch new file mode 100644 index 0000000..f68b867 --- /dev/null +++ b/SOURCES/0007-foreign-menu-Don-t-show-empty-foreign-menu-on-second.patch @@ -0,0 +1,52 @@ +From 1969e97dfda4102eff2e0c0f03bc243cd857de31 Mon Sep 17 00:00:00 2001 +From: Christophe Fergeau +Date: Thu, 12 Mar 2015 17:11:25 +0100 +Subject: [PATCH] foreign-menu: Don't show empty foreign menu on secondary + displays + +When using ovirt://, the foreign menu will only be shown in the primary +window after getting notified about OvirtForeignMenu::files (ie when +it managed to fetch some ISO files to show in the foreign menu). + +However, for secondary windows, the foreign menu will be added to the +window even if there are no files to show. This commit makes sure we +destroy the window foreign menu whenever it would be empty. + +(cherry picked from commit 32d0ae09b865cfd6446b499225c895feaba27a51) +--- + src/ovirt-foreign-menu.c | 3 +++ + src/remote-viewer.c | 7 ++++++- + 2 files changed, 9 insertions(+), 1 deletion(-) + +diff --git a/src/ovirt-foreign-menu.c b/src/ovirt-foreign-menu.c +index 0de13e5..7c95e4c 100644 +--- a/src/ovirt-foreign-menu.c ++++ b/src/ovirt-foreign-menu.c +@@ -467,6 +467,9 @@ GtkWidget *ovirt_foreign_menu_get_gtk_menu(OvirtForeignMenu *foreign_menu) + char *current_iso; + + g_debug("Creating GtkMenu for foreign menu"); ++ if (foreign_menu->priv->iso_names == NULL) { ++ return NULL; ++ } + current_iso = ovirt_foreign_menu_get_current_iso_name(foreign_menu); + gtk_menu = gtk_menu_new(); + for (it = foreign_menu->priv->iso_names; it != NULL; it = it->next) { +diff --git a/src/remote-viewer.c b/src/remote-viewer.c +index a7122bc..5c17b22 100644 +--- a/src/remote-viewer.c ++++ b/src/remote-viewer.c +@@ -758,7 +758,12 @@ ovirt_foreign_menu_update(RemoteViewer *app, VirtViewerWindow *win) + } + + submenu = ovirt_foreign_menu_get_gtk_menu(app->priv->ovirt_foreign_menu); +- gtk_menu_item_set_submenu(GTK_MENU_ITEM(menu), submenu); ++ if (submenu != NULL) { ++ gtk_menu_item_set_submenu(GTK_MENU_ITEM(menu), submenu); ++ } else { ++ /* No items to show, no point in showing the menu */ ++ g_object_set_data(G_OBJECT(win), "foreign-menu", NULL); ++ } + + gtk_widget_show_all(menu); + } diff --git a/SOURCES/0008-Do-not-add-https-and-api-to-oVirt-URI.patch b/SOURCES/0008-Do-not-add-https-and-api-to-oVirt-URI.patch new file mode 100644 index 0000000..ff01345 --- /dev/null +++ b/SOURCES/0008-Do-not-add-https-and-api-to-oVirt-URI.patch @@ -0,0 +1,40 @@ +From 76a535feb79c3fa1882d5307b734bb955ab56991 Mon Sep 17 00:00:00 2001 +From: Pavel Grunt +Date: Mon, 2 Feb 2015 17:25:52 +0100 +Subject: [PATCH] Do not add "https://" and "/api" to oVirt URI + +It is deprecated since govirt 0.3.1 (and virt-viewer already depends on +govirt 0.3.2). + +Silences: +(remote-viewer:19420): libgovirt-WARNING **: Passing a full http:// or https:// URI to ovirt_proxy_new() is deprecated +(remote-viewer:19420): libgovirt-WARNING **: Passing an URI ending in /api to ovirt_proxy_new() is deprecated + +(cherry picked from commit 45c6fc9b06eab5b51243d4e46e7fd08fb94766c3) +--- + src/remote-viewer.c | 5 ++--- + 1 file changed, 2 insertions(+), 3 deletions(-) + +diff --git a/src/remote-viewer.c b/src/remote-viewer.c +index 5c17b22..2a6ad6d 100644 +--- a/src/remote-viewer.c ++++ b/src/remote-viewer.c +@@ -668,7 +668,7 @@ parse_ovirt_uri(const gchar *uri_str, char **rest_uri, char **name, char **usern + + if (uri->path == NULL) { + *name = NULL; +- *rest_uri = g_strdup_printf("https://%s/api/", uri->server); ++ *rest_uri = g_strdup(uri->server); + xmlFreeURI(uri); + return TRUE; + } +@@ -691,8 +691,7 @@ parse_ovirt_uri(const gchar *uri_str, char **rest_uri, char **name, char **usern + + /* build final URI */ + rel_path = g_strjoinv("/", path_elements); +- /* FIXME: how to decide between http and https? */ +- *rest_uri = g_strdup_printf("https://%s%s/api/", uri->server, rel_path); ++ *rest_uri = g_strdup_printf("%s%s", uri->server, rel_path); + *name = vm_name; + g_free(rel_path); + g_strfreev(path_elements); diff --git a/SOURCES/0008-man-Add-missing-.-at-end-of-one-sentence.patch b/SOURCES/0008-man-Add-missing-.-at-end-of-one-sentence.patch deleted file mode 100644 index 3667a7b..0000000 --- a/SOURCES/0008-man-Add-missing-.-at-end-of-one-sentence.patch +++ /dev/null @@ -1,22 +0,0 @@ -From 378f26bc9d0b21e7a4a7ea33cbf6beceb19b3f2c Mon Sep 17 00:00:00 2001 -From: Christophe Fergeau -Date: Thu, 3 Apr 2014 17:36:30 +0200 -Subject: [PATCH] man: Add missing '.' at end of one sentence - ---- - man/virt-viewer.pod | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/man/virt-viewer.pod b/man/virt-viewer.pod -index 5b3d6e6..45459ef 100644 ---- a/man/virt-viewer.pod -+++ b/man/virt-viewer.pod -@@ -13,7 +13,7 @@ B is a minimal tool for displaying the graphical console - of a virtual machine. The console is accessed using the VNC or SPICE - protocol. The guest can be referred to based on its name, ID, or - UUID. If the guest is not already running, then the viewer can be told --to wait until it starts before attempting to connect to the console -+to wait until it starts before attempting to connect to the console. - The viewer can connect to remote hosts to lookup the console - information and then also connect to the remote console using the same - network transport. diff --git a/SOURCES/0009-man-Fix-link-to-GPLv2-text.patch b/SOURCES/0009-man-Fix-link-to-GPLv2-text.patch deleted file mode 100644 index 273856e..0000000 --- a/SOURCES/0009-man-Fix-link-to-GPLv2-text.patch +++ /dev/null @@ -1,42 +0,0 @@ -From e53102cc563d1d382223b1482bfce31f730aa95e Mon Sep 17 00:00:00 2001 -From: Christophe Fergeau -Date: Fri, 4 Apr 2014 13:59:44 +0200 -Subject: [PATCH] man: Fix link to GPLv2 text - -The unversionned http links point to the GLPv3 text while virt-viewer is -still licensed under the GPLv2. ---- - man/remote-viewer.pod | 4 ++-- - man/virt-viewer.pod | 4 ++-- - 2 files changed, 4 insertions(+), 4 deletions(-) - -diff --git a/man/remote-viewer.pod b/man/remote-viewer.pod -index e35d281..253a809 100644 ---- a/man/remote-viewer.pod -+++ b/man/remote-viewer.pod -@@ -285,8 +285,8 @@ Report bugs to the mailing list C. There is NO WARRANTY, to the extent --permitted by law. -+Public License C. There is NO WARRANTY, -+to the extent permitted by law. - - =head1 SEE ALSO - -diff --git a/man/virt-viewer.pod b/man/virt-viewer.pod -index 45459ef..e766712 100644 ---- a/man/virt-viewer.pod -+++ b/man/virt-viewer.pod -@@ -150,8 +150,8 @@ Report bugs to the mailing list C. There is NO WARRANTY, to the extent --permitted by law. -+Public License C. There is NO WARRANTY, -+to the extent permitted by law. - - =head1 SEE ALSO - diff --git a/SOURCES/0009-virt-viewer-Add-a-GError-arg-to-extract_connect_info.patch b/SOURCES/0009-virt-viewer-Add-a-GError-arg-to-extract_connect_info.patch new file mode 100644 index 0000000..a231d6d --- /dev/null +++ b/SOURCES/0009-virt-viewer-Add-a-GError-arg-to-extract_connect_info.patch @@ -0,0 +1,86 @@ +From 000409744638d2a0de44cdd0b69326876381afab Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Fabiano=20Fid=C3=AAncio?= +Date: Thu, 26 Mar 2015 15:06:17 +0100 +Subject: [PATCH] virt-viewer: Add a GError arg to extract_connect_info() + +This is part of a small re-factoring that will have all connection +errors, when we won't be able to connect regardless of what changes on +the remote host, being treated by virt_viewer_app_initial_connect(), +avoiding weird behaviors as we have nowadays (like more than one error +dialog being shown or having the virt-viewer waiting forever for a guest +that will never show up). + +Related: rhbz#1085216 +(cherry picked from commit 2c03eacc2d71adb260fbf84b3b691b64fad15184) +--- + src/virt-viewer.c | 21 +++++++++++++++++++-- + 1 file changed, 19 insertions(+), 2 deletions(-) + +diff --git a/src/virt-viewer.c b/src/virt-viewer.c +index d95d1eb..bdcdb20 100644 +--- a/src/virt-viewer.c ++++ b/src/virt-viewer.c +@@ -387,7 +387,8 @@ virt_viewer_is_reachable(const gchar *host, + + static gboolean + virt_viewer_extract_connect_info(VirtViewer *self, +- virDomainPtr dom) ++ virDomainPtr dom, ++ GError **error) + { + char *type = NULL; + char *xpath = NULL; +@@ -409,8 +410,13 @@ virt_viewer_extract_connect_info(VirtViewer *self, + virt_viewer_app_free_connect_info(app); + + if ((type = virt_viewer_extract_xpath_string(xmldesc, "string(/domain/devices/graphics/@type)")) == NULL) { ++ g_set_error(error, ++ VIRT_VIEWER_ERROR, VIRT_VIEWER_ERROR_FAILED, ++ _("Cannot determine the graphic type for the guest %s"), priv->domkey); ++ + virt_viewer_app_simple_message_dialog(app, _("Cannot determine the graphic type for the guest %s"), + priv->domkey); ++ + goto cleanup; + } + +@@ -446,8 +452,13 @@ virt_viewer_extract_connect_info(VirtViewer *self, + + uri = virConnectGetURI(priv->conn); + if (virt_viewer_util_extract_host(uri, NULL, &host, &transport, &user, &port) < 0) { ++ g_set_error(error, ++ VIRT_VIEWER_ERROR, VIRT_VIEWER_ERROR_FAILED, ++ _("Cannot determine the host for the guest %s"), priv->domkey); ++ + virt_viewer_app_simple_message_dialog(app, _("Cannot determine the host for the guest %s"), + priv->domkey); ++ + goto cleanup; + } + +@@ -472,10 +483,16 @@ virt_viewer_extract_connect_info(VirtViewer *self, + } + + if (!virt_viewer_is_reachable(ghost, transport, host, direct)) { ++ g_set_error(error, ++ VIRT_VIEWER_ERROR, VIRT_VIEWER_ERROR_FAILED, ++ _("Guest '%s' is not reachable"), priv->domkey); ++ + g_debug("graphics listen '%s' is not reachable from this machine", + ghost ? ghost : ""); ++ + virt_viewer_app_simple_message_dialog(app, _("Guest '%s' is not reachable"), + priv->domkey); ++ + goto cleanup; + } + +@@ -515,7 +532,7 @@ virt_viewer_update_display(VirtViewer *self, virDomainPtr dom) + g_object_set(app, "guest-name", virDomainGetName(dom), NULL); + + if (!virt_viewer_app_has_session(app)) { +- if (!virt_viewer_extract_connect_info(self, dom)) ++ if (!virt_viewer_extract_connect_info(self, dom, NULL)) + return FALSE; + } + diff --git a/SOURCES/0010-man-Fix-concatonated-typo.patch b/SOURCES/0010-man-Fix-concatonated-typo.patch deleted file mode 100644 index e4b36e3..0000000 --- a/SOURCES/0010-man-Fix-concatonated-typo.patch +++ /dev/null @@ -1,23 +0,0 @@ -From 0d762a00b092ef06af9c8e57f26c1611bcafcd59 Mon Sep 17 00:00:00 2001 -From: Christophe Fergeau -Date: Fri, 4 Apr 2014 14:36:03 +0200 -Subject: [PATCH] man: Fix 'concatonated' typo - -This also removes an extra 'are' in the same sentence. ---- - man/remote-viewer.pod | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/man/remote-viewer.pod b/man/remote-viewer.pod -index 253a809..f65101b 100644 ---- a/man/remote-viewer.pod -+++ b/man/remote-viewer.pod -@@ -241,7 +241,7 @@ C - - Use -1 for class/vendor/product/version to accept any value. - --And the rules are themselves are concatonated like this: -+And the rules themselves are concatenated like this: - - C - diff --git a/SOURCES/0010-virt-viewer-Add-a-GError-arg-to-update_display.patch b/SOURCES/0010-virt-viewer-Add-a-GError-arg-to-update_display.patch new file mode 100644 index 0000000..b178d35 --- /dev/null +++ b/SOURCES/0010-virt-viewer-Add-a-GError-arg-to-update_display.patch @@ -0,0 +1,58 @@ +From b8ca721ecbf0b5c85bbac893e3e1a896f4df3a2d Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Fabiano=20Fid=C3=AAncio?= +Date: Thu, 26 Mar 2015 15:13:45 +0100 +Subject: [PATCH] virt-viewer: Add a GError arg to update_display() + +This is part of a small re-factoring that will have all connection +errors, when we won't be able to connect regardless of what changes on +the remote host, being treated by virt_viewer_app_initial_connect(), +avoiding weird behaviors as we have nowadays (like more than one error +dialog being shown or having the virt-viewer waiting forever for a guest +that will never show up). + +Related: rhbz#1085216 +(cherry picked from commit cab8f7450b8af6111c50d563321e5e7e50944479) +--- + src/virt-viewer.c | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +diff --git a/src/virt-viewer.c b/src/virt-viewer.c +index bdcdb20..6f76f92 100644 +--- a/src/virt-viewer.c ++++ b/src/virt-viewer.c +@@ -516,7 +516,7 @@ virt_viewer_extract_connect_info(VirtViewer *self, + } + + static gboolean +-virt_viewer_update_display(VirtViewer *self, virDomainPtr dom) ++virt_viewer_update_display(VirtViewer *self, virDomainPtr dom, GError **error) + { + VirtViewerPrivate *priv = self->priv; + VirtViewerApp *app = VIRT_VIEWER_APP(self); +@@ -532,7 +532,7 @@ virt_viewer_update_display(VirtViewer *self, virDomainPtr dom) + g_object_set(app, "guest-name", virDomainGetName(dom), NULL); + + if (!virt_viewer_app_has_session(app)) { +- if (!virt_viewer_extract_connect_info(self, dom, NULL)) ++ if (!virt_viewer_extract_connect_info(self, dom, error)) + return FALSE; + } + +@@ -607,7 +607,7 @@ virt_viewer_domain_event(virConnectPtr conn G_GNUC_UNUSED, + break; + + case VIR_DOMAIN_EVENT_STARTED: +- virt_viewer_update_display(self, dom); ++ virt_viewer_update_display(self, dom, NULL); + virt_viewer_app_activate(app, &error); + if (error) { + /* we may want to consolidate error reporting in +@@ -772,7 +772,7 @@ virt_viewer_initial_connect(VirtViewerApp *app, GError **error) + goto wait; + } + +- if (!virt_viewer_update_display(self, dom)) ++ if (!virt_viewer_update_display(self, dom, &err)) + goto wait; + + ret = VIRT_VIEWER_APP_CLASS(virt_viewer_parent_class)->initial_connect(app, &err); diff --git a/SOURCES/0011-man-Use-nicer-link-to-GPLv2.patch b/SOURCES/0011-man-Use-nicer-link-to-GPLv2.patch deleted file mode 100644 index 24dec9c..0000000 --- a/SOURCES/0011-man-Use-nicer-link-to-GPLv2.patch +++ /dev/null @@ -1,40 +0,0 @@ -From 1d01f3c9f4a2bbed427d860d4e46c861f6c7de09 Mon Sep 17 00:00:00 2001 -From: Christophe Fergeau -Date: Mon, 7 Apr 2014 09:07:05 +0200 -Subject: [PATCH] man: Use nicer link to GPLv2 - -As pointed out by Eric Blake, -https://www.gnu.org/licenses/gpl-2.0.html and -https://www.gnu.org/licenses/old-licenses/gpl-2.0.html -both point to the same location, with the former being nicer to read. ---- - man/remote-viewer.pod | 2 +- - man/virt-viewer.pod | 2 +- - 2 files changed, 2 insertions(+), 2 deletions(-) - -diff --git a/man/remote-viewer.pod b/man/remote-viewer.pod -index f65101b..63216e3 100644 ---- a/man/remote-viewer.pod -+++ b/man/remote-viewer.pod -@@ -285,7 +285,7 @@ Report bugs to the mailing list C. There is NO WARRANTY, -+Public License C. There is NO WARRANTY, - to the extent permitted by law. - - =head1 SEE ALSO -diff --git a/man/virt-viewer.pod b/man/virt-viewer.pod -index e766712..8b52377 100644 ---- a/man/virt-viewer.pod -+++ b/man/virt-viewer.pod -@@ -150,7 +150,7 @@ Report bugs to the mailing list C. There is NO WARRANTY, -+Public License C. There is NO WARRANTY, - to the extent permitted by law. - - =head1 SEE ALSO diff --git a/SOURCES/0011-virt-viewer-app-Add-a-GError-arg-to-create_session.patch b/SOURCES/0011-virt-viewer-app-Add-a-GError-arg-to-create_session.patch new file mode 100644 index 0000000..7ab5ce5 --- /dev/null +++ b/SOURCES/0011-virt-viewer-app-Add-a-GError-arg-to-create_session.patch @@ -0,0 +1,110 @@ +From 95e1d7f30f0afec5d4fb09cae3a9f9e28313d4ec Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Fabiano=20Fid=C3=AAncio?= +Date: Thu, 26 Mar 2015 23:05:31 +0100 +Subject: [PATCH] virt-viewer-app: Add a GError arg to create_session() + +This is part of a small re-factoring that will have all connection +errors, when we won't be able to connect regardless of what changes on +the remote host, being treated by virt_viewer_app_initial_connect(), +avoiding weird behaviors as we have nowadays (like more than one error +dialog being shown or having the virt-viewer waiting forever for a guest +that will never show up). + +Related: rhbz#1085216 +(cherry picked from commit f9c4a03bd76ca23b6eb715244b7019fddca0eb72) +--- + src/remote-viewer.c | 12 ++++-------- + src/virt-viewer-app.c | 6 +++++- + src/virt-viewer-app.h | 2 +- + src/virt-viewer.c | 2 +- + 4 files changed, 11 insertions(+), 11 deletions(-) + +diff --git a/src/remote-viewer.c b/src/remote-viewer.c +index 2a6ad6d..4ffae7e 100644 +--- a/src/remote-viewer.c ++++ b/src/remote-viewer.c +@@ -937,11 +937,9 @@ create_ovirt_session(VirtViewerApp *app, const char *uri, GError **err) + virt_viewer_app_set_connect_info(app, NULL, ghost, gport, gtlsport, + session_type, NULL, NULL, 0, NULL); + +- if (virt_viewer_app_create_session(app, session_type) < 0) { +- g_set_error(&error, VIRT_VIEWER_ERROR, VIRT_VIEWER_ERROR_FAILED, +- _("Failed to create a session type %s"), session_type); ++ if (virt_viewer_app_create_session(app, session_type, &error) < 0) + goto error; +- } ++ + #ifdef HAVE_SPICE_GTK + if (type == OVIRT_VM_DISPLAY_SPICE) { + SpiceSession *session; +@@ -1208,7 +1206,7 @@ remote_viewer_start(VirtViewerApp *app) + g_signal_connect(app, "notify", G_CALLBACK(app_notified), self); + + if (priv->controller) { +- if (virt_viewer_app_create_session(app, "spice") < 0) { ++ if (virt_viewer_app_create_session(app, "spice", &error) < 0) { + virt_viewer_app_simple_message_dialog(app, _("Couldn't create a Spice session")); + goto cleanup; + } +@@ -1269,10 +1267,8 @@ retry_dialog: + } else + #endif + { +- if (virt_viewer_app_create_session(app, type) < 0) { +- virt_viewer_app_simple_message_dialog(app, _("Couldn't create a session for this type: %s"), type); ++ if (virt_viewer_app_create_session(app, type, &error) < 0) + goto cleanup; +- } + } + + virt_viewer_session_set_file(virt_viewer_app_get_session(app), vvfile); +diff --git a/src/virt-viewer-app.c b/src/virt-viewer-app.c +index a2328d7..19df7ae 100644 +--- a/src/virt-viewer-app.c ++++ b/src/virt-viewer-app.c +@@ -1051,7 +1051,7 @@ static void notify_software_reader_cb(GObject *gobject G_GNUC_UNUSED, + } + + int +-virt_viewer_app_create_session(VirtViewerApp *self, const gchar *type) ++virt_viewer_app_create_session(VirtViewerApp *self, const gchar *type, GError **error) + { + g_return_val_if_fail(VIRT_VIEWER_IS_APP(self), -1); + VirtViewerAppPrivate *priv = self->priv; +@@ -1075,6 +1075,10 @@ virt_viewer_app_create_session(VirtViewerApp *self, const gchar *type) + } else + #endif + { ++ g_set_error(error, ++ VIRT_VIEWER_ERROR, VIRT_VIEWER_ERROR_FAILED, ++ _("Unsupported graphic type '%s'"), type); ++ + virt_viewer_app_trace(self, "Guest %s has unsupported %s display type", + priv->guest_name, type); + virt_viewer_app_simple_message_dialog(self, _("Unknown graphic type for the guest %s"), +diff --git a/src/virt-viewer-app.h b/src/virt-viewer-app.h +index c9b347d..6c8842c 100644 +--- a/src/virt-viewer-app.h ++++ b/src/virt-viewer-app.h +@@ -68,7 +68,7 @@ void virt_viewer_app_trace(VirtViewerApp *self, const char *fmt, ...); + void virt_viewer_app_simple_message_dialog(VirtViewerApp *self, const char *fmt, ...); + gboolean virt_viewer_app_is_active(VirtViewerApp *app); + void virt_viewer_app_free_connect_info(VirtViewerApp *self); +-int virt_viewer_app_create_session(VirtViewerApp *self, const gchar *type); ++int virt_viewer_app_create_session(VirtViewerApp *self, const gchar *type, GError **error); + gboolean virt_viewer_app_activate(VirtViewerApp *self, GError **error); + gboolean virt_viewer_app_initial_connect(VirtViewerApp *self, GError **error); + void virt_viewer_app_set_zoom_level(VirtViewerApp *self, gint zoom_level); +diff --git a/src/virt-viewer.c b/src/virt-viewer.c +index 6f76f92..fc27cb6 100644 +--- a/src/virt-viewer.c ++++ b/src/virt-viewer.c +@@ -420,7 +420,7 @@ virt_viewer_extract_connect_info(VirtViewer *self, + goto cleanup; + } + +- if (virt_viewer_app_create_session(app, type) < 0) ++ if (virt_viewer_app_create_session(app, type, error) < 0) + goto cleanup; + + xpath = g_strdup_printf("string(/domain/devices/graphics[@type='%s']/@port)", type); diff --git a/SOURCES/0012-man-remove-Perl-header.patch b/SOURCES/0012-man-remove-Perl-header.patch deleted file mode 100644 index c140ba2..0000000 --- a/SOURCES/0012-man-remove-Perl-header.patch +++ /dev/null @@ -1,22 +0,0 @@ -From 3ef2353f56185575657512a6b5787fb9899d1596 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= -Date: Thu, 3 Apr 2014 14:21:02 +0200 -Subject: [PATCH] man: remove Perl header - -Remove "User Contributed Perl Documentation" header. ---- - man/Makefile.am | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/man/Makefile.am b/man/Makefile.am -index d6f709c..13bfb94 100644 ---- a/man/Makefile.am -+++ b/man/Makefile.am -@@ -13,6 +13,6 @@ EXTRA_DIST = \ - DISTCLEANFILES = $(man_MANS) - - %.1: %.pod -- pod2man $< > $@ -+ pod2man -c "Virtualization Support" $< > $@ - - -include $(top_srcdir)/git.mk diff --git a/SOURCES/0012-virt-viewer-app-create_session-should-return-a-boole.patch b/SOURCES/0012-virt-viewer-app-create_session-should-return-a-boole.patch new file mode 100644 index 0000000..35a597b --- /dev/null +++ b/SOURCES/0012-virt-viewer-app-create_session-should-return-a-boole.patch @@ -0,0 +1,114 @@ +From 8ad4e365434cf4acf0d9c519795c173480b209ef Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Fabiano=20Fid=C3=AAncio?= +Date: Fri, 27 Mar 2015 16:18:23 +0100 +Subject: [PATCH] virt-viewer-app: create_session() should return a boolean + +By convention functions that take GError parameters should return FALSE +(or NULL) or error. + +Related: rhbz#1085216 +(cherry picked from commit f1204f0e695d9db2f4bdca433d2a75944673f490) +--- + src/remote-viewer.c | 6 +++--- + src/virt-viewer-app.c | 12 ++++++------ + src/virt-viewer-app.h | 2 +- + src/virt-viewer.c | 2 +- + 4 files changed, 11 insertions(+), 11 deletions(-) + +diff --git a/src/remote-viewer.c b/src/remote-viewer.c +index 4ffae7e..ae763ca 100644 +--- a/src/remote-viewer.c ++++ b/src/remote-viewer.c +@@ -937,7 +937,7 @@ create_ovirt_session(VirtViewerApp *app, const char *uri, GError **err) + virt_viewer_app_set_connect_info(app, NULL, ghost, gport, gtlsport, + session_type, NULL, NULL, 0, NULL); + +- if (virt_viewer_app_create_session(app, session_type, &error) < 0) ++ if (!virt_viewer_app_create_session(app, session_type, &error)) + goto error; + + #ifdef HAVE_SPICE_GTK +@@ -1206,7 +1206,7 @@ remote_viewer_start(VirtViewerApp *app) + g_signal_connect(app, "notify", G_CALLBACK(app_notified), self); + + if (priv->controller) { +- if (virt_viewer_app_create_session(app, "spice", &error) < 0) { ++ if (!virt_viewer_app_create_session(app, "spice", &error)) { + virt_viewer_app_simple_message_dialog(app, _("Couldn't create a Spice session")); + goto cleanup; + } +@@ -1267,7 +1267,7 @@ retry_dialog: + } else + #endif + { +- if (virt_viewer_app_create_session(app, type, &error) < 0) ++ if (!virt_viewer_app_create_session(app, type, &error)) + goto cleanup; + } + +diff --git a/src/virt-viewer-app.c b/src/virt-viewer-app.c +index 19df7ae..a688461 100644 +--- a/src/virt-viewer-app.c ++++ b/src/virt-viewer-app.c +@@ -1050,13 +1050,13 @@ static void notify_software_reader_cb(GObject *gobject G_GNUC_UNUSED, + virt_viewer_update_smartcard_accels(VIRT_VIEWER_APP(user_data)); + } + +-int ++gboolean + virt_viewer_app_create_session(VirtViewerApp *self, const gchar *type, GError **error) + { +- g_return_val_if_fail(VIRT_VIEWER_IS_APP(self), -1); ++ g_return_val_if_fail(VIRT_VIEWER_IS_APP(self), FALSE); + VirtViewerAppPrivate *priv = self->priv; +- g_return_val_if_fail(priv->session == NULL, -1); +- g_return_val_if_fail(type != NULL, -1); ++ g_return_val_if_fail(priv->session == NULL, FALSE); ++ g_return_val_if_fail(type != NULL, FALSE); + + #ifdef HAVE_GTK_VNC + if (g_ascii_strcasecmp(type, "vnc") == 0) { +@@ -1083,7 +1083,7 @@ virt_viewer_app_create_session(VirtViewerApp *self, const gchar *type, GError ** + priv->guest_name, type); + virt_viewer_app_simple_message_dialog(self, _("Unknown graphic type for the guest %s"), + priv->guest_name); +- return -1; ++ return FALSE; + } + + g_signal_connect(priv->session, "session-initialized", +@@ -1118,7 +1118,7 @@ virt_viewer_app_create_session(VirtViewerApp *self, const gchar *type, GError ** + + g_signal_connect(priv->session, "notify::software-smartcard-reader", + (GCallback)notify_software_reader_cb, self); +- return 0; ++ return TRUE; + } + + static gboolean +diff --git a/src/virt-viewer-app.h b/src/virt-viewer-app.h +index 6c8842c..a9bf16c 100644 +--- a/src/virt-viewer-app.h ++++ b/src/virt-viewer-app.h +@@ -68,7 +68,7 @@ void virt_viewer_app_trace(VirtViewerApp *self, const char *fmt, ...); + void virt_viewer_app_simple_message_dialog(VirtViewerApp *self, const char *fmt, ...); + gboolean virt_viewer_app_is_active(VirtViewerApp *app); + void virt_viewer_app_free_connect_info(VirtViewerApp *self); +-int virt_viewer_app_create_session(VirtViewerApp *self, const gchar *type, GError **error); ++gboolean virt_viewer_app_create_session(VirtViewerApp *self, const gchar *type, GError **error); + gboolean virt_viewer_app_activate(VirtViewerApp *self, GError **error); + gboolean virt_viewer_app_initial_connect(VirtViewerApp *self, GError **error); + void virt_viewer_app_set_zoom_level(VirtViewerApp *self, gint zoom_level); +diff --git a/src/virt-viewer.c b/src/virt-viewer.c +index fc27cb6..a7b3be4 100644 +--- a/src/virt-viewer.c ++++ b/src/virt-viewer.c +@@ -420,7 +420,7 @@ virt_viewer_extract_connect_info(VirtViewer *self, + goto cleanup; + } + +- if (virt_viewer_app_create_session(app, type, error) < 0) ++ if (!virt_viewer_app_create_session(app, type, error)) + goto cleanup; + + xpath = g_strdup_printf("string(/domain/devices/graphics[@type='%s']/@port)", type); diff --git a/SOURCES/0013-Don-t-show-do-you-want-to-quit-dialog-in-kiosk-mode.patch b/SOURCES/0013-Don-t-show-do-you-want-to-quit-dialog-in-kiosk-mode.patch deleted file mode 100644 index 5e33c8a..0000000 --- a/SOURCES/0013-Don-t-show-do-you-want-to-quit-dialog-in-kiosk-mode.patch +++ /dev/null @@ -1,45 +0,0 @@ -From 3c712c34f7d9fa6ecbeea04386850524c48f9028 Mon Sep 17 00:00:00 2001 -From: Christophe Fergeau -Date: Thu, 6 Feb 2014 10:07:14 +0100 -Subject: [PATCH] Don't show 'do you want to quit' dialog in kiosk mode - -In some situation, (for example, guest without vdagent running), it's -possible to pass key combinations to virt-viewer. When using alt+f4, -this can cause the 'do you want to quit?' dialog to show while it's -non-functional. -This commit moves the check for kiosk mode to before we show this dialog. ---- - src/virt-viewer-app.c | 11 ++++++----- - 1 file changed, 6 insertions(+), 5 deletions(-) - -diff --git a/src/virt-viewer-app.c b/src/virt-viewer-app.c -index 4f31812..499c33f 100644 ---- a/src/virt-viewer-app.c -+++ b/src/virt-viewer-app.c -@@ -252,13 +252,9 @@ static void - virt_viewer_app_quit(VirtViewerApp *self) - { - g_return_if_fail(VIRT_VIEWER_IS_APP(self)); -+ g_return_if_fail(!self->priv->kiosk); - VirtViewerAppPrivate *priv = self->priv; - -- if (self->priv->kiosk) { -- g_warning("The app is in kiosk mode and can't quit"); -- return; -- } -- - virt_viewer_app_save_config(self); - - if (priv->session) { -@@ -367,6 +363,11 @@ virt_viewer_app_maybe_quit(VirtViewerApp *self, VirtViewerWindow *window) - { - GError *error = NULL; - -+ if (self->priv->kiosk) { -+ g_warning("The app is in kiosk mode and can't quit"); -+ return; -+ } -+ - gboolean ask = g_key_file_get_boolean(self->priv->config, - "virt-viewer", "ask-quit", &error); - if (error) { diff --git a/SOURCES/0013-virt-viewer-Avoid-simple_message_dialog-when-errors-.patch b/SOURCES/0013-virt-viewer-Avoid-simple_message_dialog-when-errors-.patch new file mode 100644 index 0000000..2c269f7 --- /dev/null +++ b/SOURCES/0013-virt-viewer-Avoid-simple_message_dialog-when-errors-.patch @@ -0,0 +1,66 @@ +From 1358e46259fbbd941b72ea21ed11d9736ef3388c Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Fabiano=20Fid=C3=AAncio?= +Date: Thu, 26 Mar 2015 15:21:03 +0100 +Subject: [PATCH] virt-viewer: Avoid simple_message_dialog() when errors can be + propagated + +Remove all the dialogs used to report errors on extract_connect_info() +and just propagate the errors we got from it. +The only exception is virt_viewer_domain_event(), that is a callback +that doesn't have GError as argument. In this specific case, we show the +error dialog instead of propagating it. + +Related: rhbz#1085216 +(cherry picked from commit ffe19f6ece25e89968e74bccd12c61c1cd749f61) +--- + src/virt-viewer.c | 16 ++++++---------- + 1 file changed, 6 insertions(+), 10 deletions(-) + +diff --git a/src/virt-viewer.c b/src/virt-viewer.c +index a7b3be4..b22f221 100644 +--- a/src/virt-viewer.c ++++ b/src/virt-viewer.c +@@ -414,9 +414,6 @@ virt_viewer_extract_connect_info(VirtViewer *self, + VIRT_VIEWER_ERROR, VIRT_VIEWER_ERROR_FAILED, + _("Cannot determine the graphic type for the guest %s"), priv->domkey); + +- virt_viewer_app_simple_message_dialog(app, _("Cannot determine the graphic type for the guest %s"), +- priv->domkey); +- + goto cleanup; + } + +@@ -456,9 +453,6 @@ virt_viewer_extract_connect_info(VirtViewer *self, + VIRT_VIEWER_ERROR, VIRT_VIEWER_ERROR_FAILED, + _("Cannot determine the host for the guest %s"), priv->domkey); + +- virt_viewer_app_simple_message_dialog(app, _("Cannot determine the host for the guest %s"), +- priv->domkey); +- + goto cleanup; + } + +@@ -490,9 +484,6 @@ virt_viewer_extract_connect_info(VirtViewer *self, + g_debug("graphics listen '%s' is not reachable from this machine", + ghost ? ghost : ""); + +- virt_viewer_app_simple_message_dialog(app, _("Guest '%s' is not reachable"), +- priv->domkey); +- + goto cleanup; + } + +@@ -607,7 +598,12 @@ virt_viewer_domain_event(virConnectPtr conn G_GNUC_UNUSED, + break; + + case VIR_DOMAIN_EVENT_STARTED: +- virt_viewer_update_display(self, dom, NULL); ++ virt_viewer_update_display(self, dom, &error); ++ if (error) { ++ virt_viewer_app_simple_message_dialog(app, error->message); ++ g_clear_error(&error); ++ } ++ + virt_viewer_app_activate(app, &error); + if (error) { + /* we may want to consolidate error reporting in diff --git a/SOURCES/0014-Set-freed-variables-to-NULL-in-remote_viewer_start.patch b/SOURCES/0014-Set-freed-variables-to-NULL-in-remote_viewer_start.patch deleted file mode 100644 index 2066389..0000000 --- a/SOURCES/0014-Set-freed-variables-to-NULL-in-remote_viewer_start.patch +++ /dev/null @@ -1,27 +0,0 @@ -From 5e8642eb1f32109bf4801bd903fa945f580c0f2a Mon Sep 17 00:00:00 2001 -From: Jonathon Jongsma -Date: Tue, 3 Jun 2014 11:13:14 -0500 -Subject: [PATCH] Set freed variables to NULL in remote_viewer_start() - -Coverity warns that 'type' can sometimes be used or free after already having -been freed. This can happen when open_recent_dialog is true and we jump back up -to the retry_dialog label. To prevent this, make sure the freed variables are -set to NULL after freeing. ---- - src/remote-viewer.c | 2 ++ - 1 file changed, 2 insertions(+) - -diff --git a/src/remote-viewer.c b/src/remote-viewer.c -index 768ff74..5fa4ee4 100644 ---- a/src/remote-viewer.c -+++ b/src/remote-viewer.c -@@ -1043,7 +1043,9 @@ cleanup: - g_clear_object(&file); - g_clear_object(&vvfile); - g_free(guri); -+ guri = NULL; - g_free(type); -+ type = NULL; - - if (!ret && priv->open_recent_dialog) { - goto retry_dialog; diff --git a/SOURCES/0014-remote-viewer-Avoid-simple_message_dialog-when-error.patch b/SOURCES/0014-remote-viewer-Avoid-simple_message_dialog-when-error.patch new file mode 100644 index 0000000..8f772d4 --- /dev/null +++ b/SOURCES/0014-remote-viewer-Avoid-simple_message_dialog-when-error.patch @@ -0,0 +1,28 @@ +From c536197971b3587eefc7001c45a78a3d6a48acfe Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Fabiano=20Fid=C3=AAncio?= +Date: Thu, 26 Mar 2015 23:09:21 +0100 +Subject: [PATCH] remote-viewer: Avoid simple_message_dialog() when errors can + be propagated + +Remove the dialog used to report errors when create_session() fails, +propagating the error is enough and it is already done. + +Related: rhbz#1085216 +(cherry picked from commit f580f1ea54f98092791814e8f49fbcd5296a4a77) +--- + src/remote-viewer.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/src/remote-viewer.c b/src/remote-viewer.c +index ae763ca..0912f55 100644 +--- a/src/remote-viewer.c ++++ b/src/remote-viewer.c +@@ -1207,7 +1207,7 @@ remote_viewer_start(VirtViewerApp *app) + + if (priv->controller) { + if (!virt_viewer_app_create_session(app, "spice", &error)) { +- virt_viewer_app_simple_message_dialog(app, _("Couldn't create a Spice session")); ++ g_debug("Couldn't create a Spice session"); + goto cleanup; + } + diff --git a/SOURCES/0015-Don-t-resize-guest-display-on-zoom-change.patch b/SOURCES/0015-Don-t-resize-guest-display-on-zoom-change.patch deleted file mode 100644 index 09e1436..0000000 --- a/SOURCES/0015-Don-t-resize-guest-display-on-zoom-change.patch +++ /dev/null @@ -1,60 +0,0 @@ -From 8269ad003fffbb92ac93afc7f6d21e9ba7a8b934 Mon Sep 17 00:00:00 2001 -From: Jonathon Jongsma -Date: Fri, 21 Feb 2014 16:39:30 -0600 -Subject: [PATCH] Don't resize guest display on zoom change - -When the zoom level is changed, the virt-viewer window gets resized. But we -don't want this to trigger a resize of the guest display. But occasionally -rounding errors cause the guest display to be reconfigured when zooming out. To -fix this, we first check whether the current size is the preferred size. If it -is, we don't send down a resize command to the guest. - -In addition to preventing guest resizes in response to zooming, it also improves -the behavior when the guest display resolution is changed from within the guest. -Before this change, we'd have the following behavior: - A. guest changes display to WxH - B. client gets notified of change and resizes the window to WxH - C. client responds to window resize by sending a new monitor config command to the guest - -With this change, the extra step C will be avoided because we're already at the -preferred size. - -Resolves: rhbz#1004051 ---- - src/virt-viewer-display-spice.c | 21 ++++++++++++++++++++- - 1 file changed, 20 insertions(+), 1 deletion(-) - -diff --git a/src/virt-viewer-display-spice.c b/src/virt-viewer-display-spice.c -index ff0d069..8bffe5b 100644 ---- a/src/virt-viewer-display-spice.c -+++ b/src/virt-viewer-display-spice.c -@@ -185,9 +185,28 @@ virt_viewer_display_spice_mouse_grab(SpiceDisplay *display G_GNUC_UNUSED, - - static void - virt_viewer_display_spice_size_allocate(VirtViewerDisplaySpice *self, -- GtkAllocation *allocation G_GNUC_UNUSED, -+ GtkAllocation *allocation, - gpointer data G_GNUC_UNUSED) - { -+ GtkRequisition preferred; -+ -+ /* ignore all allocations before the widget gets mapped to screen since we -+ * only want to trigger guest resizing due to user actions -+ */ -+ if (!gtk_widget_get_mapped(GTK_WIDGET(self))) -+ return; -+ -+ /* when the window gets resized due to a change in zoom level, we don't want -+ * to re-size the guest display. So if we get an allocation event that -+ * resizes the window to the size it already wants to be (based on desktop -+ * size and zoom level), just return early -+ */ -+ gtk_widget_get_preferred_size(GTK_WIDGET(self), NULL, &preferred); -+ if (preferred.width == allocation->width -+ && preferred.height == allocation->height) { -+ return; -+ } -+ - if (self->priv->auto_resize != AUTO_RESIZE_NEVER) - virt_viewer_display_spice_monitor_geometry_changed(self); - diff --git a/SOURCES/0015-virt-viewer-Do-not-wait-for-a-guest-that-will-never-.patch b/SOURCES/0015-virt-viewer-Do-not-wait-for-a-guest-that-will-never-.patch new file mode 100644 index 0000000..cb4b84a --- /dev/null +++ b/SOURCES/0015-virt-viewer-Do-not-wait-for-a-guest-that-will-never-.patch @@ -0,0 +1,29 @@ +From cb5fb12de57334462e4c25f650fe69e2c41156f8 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Fabiano=20Fid=C3=AAncio?= +Date: Thu, 26 Mar 2015 16:26:06 +0100 +Subject: [PATCH] virt-viewer: Do not wait for a guest that will never show up + +All the situations where virt_viewer_update_display() can fail are +those when we won't be able to connect regardless of what changes on the +remote host. So, propagate the error instead of waiting for the guest to +start. + +Related: rhbz#1085216 +(cherry picked from commit dc2dd055d4334a5b8a1a93a460c97b35defb66e9) +--- + src/virt-viewer.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/src/virt-viewer.c b/src/virt-viewer.c +index b22f221..c1768b3 100644 +--- a/src/virt-viewer.c ++++ b/src/virt-viewer.c +@@ -769,7 +769,7 @@ virt_viewer_initial_connect(VirtViewerApp *app, GError **error) + } + + if (!virt_viewer_update_display(self, dom, &err)) +- goto wait; ++ goto cleanup; + + ret = VIRT_VIEWER_APP_CLASS(virt_viewer_parent_class)->initial_connect(app, &err); + if (ret || err) diff --git a/SOURCES/0016-Fix-regression-with-enabling-additional-displays.patch b/SOURCES/0016-Fix-regression-with-enabling-additional-displays.patch deleted file mode 100644 index d3f1f69..0000000 --- a/SOURCES/0016-Fix-regression-with-enabling-additional-displays.patch +++ /dev/null @@ -1,70 +0,0 @@ -From bbf59fabc8071bf671783b86be5604ce184aa9a3 Mon Sep 17 00:00:00 2001 -From: Jonathon Jongsma -Date: Fri, 14 Mar 2014 15:35:04 -0500 -Subject: [PATCH] Fix regression with enabling additional displays - -Commit 8fa942 broke enabling of additional displays. We don't want to send down -display re-configurations due to events that happen while setting up windows for -enabled displays that we recieve from the server. However, by ignoring -allocations on unmapped windows, we fail to send display configurations for new -displays that a user is attempting to enable via the window menu. To -discriminate between these two cases, we check whether the display is in the -'ready' state or not. -- Unmapped displays with the 'ready' hint set can be assumed to be displays - that are enabled on the server that we are attempting to create windows for on - the client. In this case, we should *not* send a display configuration to the - server -- Unmapped displays with the 'ready' hint cleared can be assumed to be displays - that are not yet enabled on the server that we are trying to enable in the - client. In this case, we *should* send a display configuration to the server ---- - src/virt-viewer-display-spice.c | 36 ++++++++++++++++++++---------------- - 1 file changed, 20 insertions(+), 16 deletions(-) - -diff --git a/src/virt-viewer-display-spice.c b/src/virt-viewer-display-spice.c -index 8bffe5b..c400f51 100644 ---- a/src/virt-viewer-display-spice.c -+++ b/src/virt-viewer-display-spice.c -@@ -189,22 +189,26 @@ virt_viewer_display_spice_size_allocate(VirtViewerDisplaySpice *self, - gpointer data G_GNUC_UNUSED) - { - GtkRequisition preferred; -- -- /* ignore all allocations before the widget gets mapped to screen since we -- * only want to trigger guest resizing due to user actions -- */ -- if (!gtk_widget_get_mapped(GTK_WIDGET(self))) -- return; -- -- /* when the window gets resized due to a change in zoom level, we don't want -- * to re-size the guest display. So if we get an allocation event that -- * resizes the window to the size it already wants to be (based on desktop -- * size and zoom level), just return early -- */ -- gtk_widget_get_preferred_size(GTK_WIDGET(self), NULL, &preferred); -- if (preferred.width == allocation->width -- && preferred.height == allocation->height) { -- return; -+ guint hint = virt_viewer_display_get_show_hint(VIRT_VIEWER_DISPLAY(self)); -+ -+ if (hint & VIRT_VIEWER_DISPLAY_SHOW_HINT_READY) -+ { -+ /* ignore all allocations before the widget gets mapped to screen since we -+ * only want to trigger guest resizing due to user actions -+ */ -+ if (!gtk_widget_get_mapped(GTK_WIDGET(self))) -+ return; -+ -+ /* when the window gets resized due to a change in zoom level, we don't want -+ * to re-size the guest display. So if we get an allocation event that -+ * resizes the window to the size it already wants to be (based on desktop -+ * size and zoom level), just return early -+ */ -+ gtk_widget_get_preferred_size(GTK_WIDGET(self), NULL, &preferred); -+ if (preferred.width == allocation->width -+ && preferred.height == allocation->height) { -+ return; -+ } - } - - if (self->priv->auto_resize != AUTO_RESIZE_NEVER) diff --git a/SOURCES/0016-virt-viewer-app-Do-not-show-error-dialog-twice-for-u.patch b/SOURCES/0016-virt-viewer-app-Do-not-show-error-dialog-twice-for-u.patch new file mode 100644 index 0000000..dbaee5c --- /dev/null +++ b/SOURCES/0016-virt-viewer-app-Do-not-show-error-dialog-twice-for-u.patch @@ -0,0 +1,25 @@ +From 39046f704dd226ae9740e83874226bc7b85ab782 Mon Sep 17 00:00:00 2001 +From: Pavel Grunt +Date: Wed, 8 Apr 2015 15:23:39 +0200 +Subject: [PATCH] virt-viewer-app: Do not show error dialog twice for unknown + graphic + +Related: rhbz#1085216 +(cherry picked from commit 07def4d4aa9113911177bf3f51c1f1e3dde7eaab) +--- + src/virt-viewer-app.c | 2 -- + 1 file changed, 2 deletions(-) + +diff --git a/src/virt-viewer-app.c b/src/virt-viewer-app.c +index a688461..9468ca0 100644 +--- a/src/virt-viewer-app.c ++++ b/src/virt-viewer-app.c +@@ -1081,8 +1081,6 @@ virt_viewer_app_create_session(VirtViewerApp *self, const gchar *type, GError ** + + virt_viewer_app_trace(self, "Guest %s has unsupported %s display type", + priv->guest_name, type); +- virt_viewer_app_simple_message_dialog(self, _("Unknown graphic type for the guest %s"), +- priv->guest_name); + return FALSE; + } + diff --git a/SOURCES/0017-Fix-gtk2-build.patch b/SOURCES/0017-Fix-gtk2-build.patch deleted file mode 100644 index 9923fdd..0000000 --- a/SOURCES/0017-Fix-gtk2-build.patch +++ /dev/null @@ -1,102 +0,0 @@ -From bc4be9139c60541659fae1fd961d9eb770820b08 Mon Sep 17 00:00:00 2001 -From: Jonathon Jongsma -Date: Mon, 31 Mar 2014 17:12:16 -0500 -Subject: [PATCH] Fix gtk2 build - -Previous commit accidentally broke gtk2 build by using -gtk_widget_get_preferred_size(). We can't simply use gtk_widget_size_request() -for the gtk2 build since this will generally return 50x50 whenever we're not in -the middle of a resize, so we need to add a compatibility function. ---- - src/virt-viewer-display-spice.c | 2 +- - src/virt-viewer-display.c | 41 ++++++++++++++++++++++++++++------------- - src/virt-viewer-display.h | 1 + - 3 files changed, 30 insertions(+), 14 deletions(-) - -diff --git a/src/virt-viewer-display-spice.c b/src/virt-viewer-display-spice.c -index c400f51..0450b5b 100644 ---- a/src/virt-viewer-display-spice.c -+++ b/src/virt-viewer-display-spice.c -@@ -204,7 +204,7 @@ virt_viewer_display_spice_size_allocate(VirtViewerDisplaySpice *self, - * resizes the window to the size it already wants to be (based on desktop - * size and zoom level), just return early - */ -- gtk_widget_get_preferred_size(GTK_WIDGET(self), NULL, &preferred); -+ virt_viewer_display_get_preferred_size(VIRT_VIEWER_DISPLAY(self), &preferred); - if (preferred.width == allocation->width - && preferred.height == allocation->height) { - return; -diff --git a/src/virt-viewer-display.c b/src/virt-viewer-display.c -index 6c078a5..f298bb0 100644 ---- a/src/virt-viewer-display.c -+++ b/src/virt-viewer-display.c -@@ -377,6 +377,31 @@ virt_viewer_display_grab_focus(GtkWidget *widget) - gtk_widget_grab_focus(gtk_bin_get_child(bin)); - } - -+/* Compatibility function to allow gtk2 to emulate gtk3 behavior. We can't use -+ * the size request since it simply returns the minimum size whenever dirty is -+ * false */ -+void virt_viewer_display_get_preferred_size(VirtViewerDisplay *self, -+ GtkRequisition *requisition) -+{ -+#if GTK_CHECK_VERSION(3, 0, 0) -+ gtk_widget_get_preferred_size(GTK_WIDGET(self), NULL, requisition); -+#else -+ VirtViewerDisplayPrivate *priv = self->priv; -+ int border_width = gtk_container_get_border_width(GTK_CONTAINER(self)); -+ -+ requisition->width = border_width * 2; -+ requisition->height = border_width * 2; -+ -+ if (priv->zoom) { -+ requisition->width += round(priv->desktopWidth * priv->zoom_level / 100.0); -+ requisition->height += round(priv->desktopHeight * priv->zoom_level / 100.0); -+ } else { -+ requisition->width += priv->desktopWidth; -+ requisition->height += priv->desktopHeight; -+ } -+#endif -+} -+ - - #if !GTK_CHECK_VERSION(3, 0, 0) - static gboolean -@@ -396,22 +421,12 @@ virt_viewer_display_size_request(GtkWidget *widget, - { - VirtViewerDisplay *display = VIRT_VIEWER_DISPLAY(widget); - VirtViewerDisplayPrivate *priv = display->priv; -- int border_width = gtk_container_get_border_width(GTK_CONTAINER(widget)); -- -- requisition->width = border_width * 2; -- requisition->height = border_width * 2; - - if (priv->dirty) { -- if (priv->zoom) { -- requisition->width += round(priv->desktopWidth * priv->zoom_level / 100.0); -- requisition->height += round(priv->desktopHeight * priv->zoom_level / 100.0); -- } else { -- requisition->width += priv->desktopWidth; -- requisition->height += priv->desktopHeight; -- } -+ virt_viewer_display_get_preferred_size(display, requisition); - } else { -- requisition->width += 50; -- requisition->height += 50; -+ requisition->width = 50; -+ requisition->height = 50; - } - - DEBUG_LOG("Display size request %dx%d (desktop %dx%d)", -diff --git a/src/virt-viewer-display.h b/src/virt-viewer-display.h -index fe88d98..70ce772 100644 ---- a/src/virt-viewer-display.h -+++ b/src/virt-viewer-display.h -@@ -126,6 +126,7 @@ gboolean virt_viewer_display_get_enabled(VirtViewerDisplay *display); - gboolean virt_viewer_display_get_selectable(VirtViewerDisplay *display); - void virt_viewer_display_queue_resize(VirtViewerDisplay *display); - void virt_viewer_display_get_preferred_monitor_geometry(VirtViewerDisplay *self, GdkRectangle* preferred); -+void virt_viewer_display_get_preferred_size(VirtViewerDisplay *self, GtkRequisition* requisistion); - - G_END_DECLS - diff --git a/SOURCES/0017-Use-ZOOM-constants-instead-of-numbers.patch b/SOURCES/0017-Use-ZOOM-constants-instead-of-numbers.patch new file mode 100644 index 0000000..9df9c3f --- /dev/null +++ b/SOURCES/0017-Use-ZOOM-constants-instead-of-numbers.patch @@ -0,0 +1,194 @@ +From afe09d733ef2670dc23b5ec4d48a8bb47282ec44 Mon Sep 17 00:00:00 2001 +From: Pavel Grunt +Date: Mon, 30 Mar 2015 22:17:35 +0200 +Subject: [PATCH] Use ZOOM constants instead of numbers + +(cherry picked from commit 2e5ae1550fce6ef064b390160a5a1516982ff6aa) +--- + src/virt-viewer-app.c | 4 ++-- + src/virt-viewer-display.c | 16 ++++++++-------- + src/virt-viewer-window.c | 26 +++++++++++++------------- + src/virt-viewer-window.h | 2 ++ + 4 files changed, 25 insertions(+), 23 deletions(-) + +diff --git a/src/virt-viewer-app.c b/src/virt-viewer-app.c +index 9468ca0..f6d9869 100644 +--- a/src/virt-viewer-app.c ++++ b/src/virt-viewer-app.c +@@ -1716,7 +1716,7 @@ gboolean virt_viewer_app_start(VirtViewerApp *self) + return self->priv->started; + } + +-static int opt_zoom = 100; ++static int opt_zoom = NORMAL_ZOOM_LEVEL; + static gchar *opt_hotkeys = NULL; + static gboolean opt_verbose = FALSE; + static gboolean opt_debug = FALSE; +@@ -1757,7 +1757,7 @@ virt_viewer_app_init(VirtViewerApp *self) + + if (opt_zoom < MIN_ZOOM_LEVEL || opt_zoom > MAX_ZOOM_LEVEL) { + g_printerr(_("Zoom level must be within %d-%d\n"), MIN_ZOOM_LEVEL, MAX_ZOOM_LEVEL); +- opt_zoom = 100; ++ opt_zoom = NORMAL_ZOOM_LEVEL; + } + + self->priv->initial_display_map = virt_viewer_app_get_monitor_mapping_for_section(self, "fallback"); +diff --git a/src/virt-viewer-display.c b/src/virt-viewer-display.c +index 66429f1..50245cb 100644 +--- a/src/virt-viewer-display.c ++++ b/src/virt-viewer-display.c +@@ -144,7 +144,7 @@ virt_viewer_display_class_init(VirtViewerDisplayClass *class) + "Zoom level", + MIN_ZOOM_LEVEL, + MAX_ZOOM_LEVEL, +- 100, ++ NORMAL_ZOOM_LEVEL, + G_PARAM_READWRITE)); + + g_object_class_install_property(object_class, +@@ -276,7 +276,7 @@ virt_viewer_display_init(VirtViewerDisplay *display) + + display->priv->desktopWidth = 100; + display->priv->desktopHeight = 100; +- display->priv->zoom_level = 100; ++ display->priv->zoom_level = NORMAL_ZOOM_LEVEL; + display->priv->zoom = TRUE; + #if !GTK_CHECK_VERSION(3, 0, 0) + display->priv->dirty = TRUE; +@@ -393,8 +393,8 @@ void virt_viewer_display_get_preferred_size(VirtViewerDisplay *self, + requisition->height = border_width * 2; + + if (priv->zoom) { +- requisition->width += round(priv->desktopWidth * priv->zoom_level / 100.0); +- requisition->height += round(priv->desktopHeight * priv->zoom_level / 100.0); ++ requisition->width += round(priv->desktopWidth * priv->zoom_level / (double) NORMAL_ZOOM_LEVEL); ++ requisition->height += round(priv->desktopHeight * priv->zoom_level / (double) NORMAL_ZOOM_LEVEL); + } else { + requisition->width += priv->desktopWidth; + requisition->height += priv->desktopHeight; +@@ -463,7 +463,7 @@ static void virt_viewer_display_get_preferred_width(GtkWidget *widget, + *minwidth = 50 + 2 * border_width; + + if (priv->zoom) { +- *defwidth = round(priv->desktopWidth * priv->zoom_level / 100.0) + ++ *defwidth = round(priv->desktopWidth * priv->zoom_level / (double) NORMAL_ZOOM_LEVEL) + + 2 * border_width; + } else { + *defwidth = priv->desktopWidth + 2 * border_width; +@@ -482,7 +482,7 @@ static void virt_viewer_display_get_preferred_height(GtkWidget *widget, + *minheight = 50 + 2 * border_height; + + if (priv->zoom) { +- *defheight = round(priv->desktopHeight * priv->zoom_level / 100.0) + ++ *defheight = round(priv->desktopHeight * priv->zoom_level / (double) NORMAL_ZOOM_LEVEL) + + 2 * border_height; + } else { + *defheight = priv->desktopHeight + 2 * border_height; +@@ -817,8 +817,8 @@ void virt_viewer_display_get_preferred_monitor_geometry(VirtViewerDisplay* self, + if (virt_viewer_display_get_zoom(VIRT_VIEWER_DISPLAY(self))) { + guint zoom = virt_viewer_display_get_zoom_level(VIRT_VIEWER_DISPLAY(self)); + +- preferred->width = round(preferred->width * 100 / zoom); +- preferred->height = round(preferred->height * 100 / zoom); ++ preferred->width = round(preferred->width * NORMAL_ZOOM_LEVEL / zoom); ++ preferred->height = round(preferred->height * NORMAL_ZOOM_LEVEL / zoom); + } + } + } +diff --git a/src/virt-viewer-window.c b/src/virt-viewer-window.c +index c5f7c75..5f16208 100644 +--- a/src/virt-viewer-window.c ++++ b/src/virt-viewer-window.c +@@ -345,7 +345,7 @@ virt_viewer_window_init (VirtViewerWindow *self) + g_object_ref(G_OBJECT(accels->data)); + } + +- priv->zoomlevel = 100; ++ priv->zoomlevel = NORMAL_ZOOM_LEVEL; + } + + static void +@@ -364,21 +364,21 @@ G_MODULE_EXPORT void + virt_viewer_window_menu_view_zoom_out(GtkWidget *menu G_GNUC_UNUSED, + VirtViewerWindow *self) + { +- virt_viewer_window_set_zoom_level(self, self->priv->zoomlevel - 10); ++ virt_viewer_window_set_zoom_level(self, self->priv->zoomlevel - ZOOM_STEP); + } + + G_MODULE_EXPORT void + virt_viewer_window_menu_view_zoom_in(GtkWidget *menu G_GNUC_UNUSED, + VirtViewerWindow *self) + { +- virt_viewer_window_set_zoom_level(self, self->priv->zoomlevel + 10); ++ virt_viewer_window_set_zoom_level(self, self->priv->zoomlevel + ZOOM_STEP); + } + + G_MODULE_EXPORT void + virt_viewer_window_menu_view_zoom_reset(GtkWidget *menu G_GNUC_UNUSED, + VirtViewerWindow *self) + { +- virt_viewer_window_set_zoom_level(self, 100); ++ virt_viewer_window_set_zoom_level(self, NORMAL_ZOOM_LEVEL); + } + + /* Kick GtkWindow to tell it to adjust to our new widget sizes */ +@@ -439,8 +439,8 @@ virt_viewer_window_resize(VirtViewerWindow *self, gboolean keep_win_size) + desktopAspect = (double)desktopWidth / (double)desktopHeight; + screenAspect = (double)fullscreen.width / (double)fullscreen.height; + +- display_width = desktopWidth * priv->zoomlevel / 100.0; +- display_height = desktopHeight * priv->zoomlevel / 100.0; ++ display_width = desktopWidth * priv->zoomlevel / (double) NORMAL_ZOOM_LEVEL; ++ display_height = desktopHeight * priv->zoomlevel / (double) NORMAL_ZOOM_LEVEL; + + if ((display_width > fullscreen.width) || + (display_height > fullscreen.height)) { +@@ -453,8 +453,8 @@ virt_viewer_window_resize(VirtViewerWindow *self, gboolean keep_win_size) + width = fullscreen.width; + height = fullscreen.width / desktopAspect; + } +- width *= 100.0 / priv->zoomlevel; +- height *= 100.0 / priv->zoomlevel; ++ width *= (double) NORMAL_ZOOM_LEVEL / priv->zoomlevel; ++ height *= (double) NORMAL_ZOOM_LEVEL / priv->zoomlevel; + } else { + width = desktopWidth; + height = desktopHeight; +@@ -1397,10 +1397,10 @@ virt_viewer_window_set_zoom_level(VirtViewerWindow *self, gint zoom_level) + g_return_if_fail(VIRT_VIEWER_IS_WINDOW(self)); + priv = self->priv; + +- if (zoom_level < 10) +- zoom_level = 10; +- if (zoom_level > 400) +- zoom_level = 400; ++ if (zoom_level < MIN_ZOOM_LEVEL) ++ zoom_level = MIN_ZOOM_LEVEL; ++ if (zoom_level > MAX_ZOOM_LEVEL) ++ zoom_level = MAX_ZOOM_LEVEL; + priv->zoomlevel = zoom_level; + + if (!priv->display) +@@ -1413,7 +1413,7 @@ virt_viewer_window_set_zoom_level(VirtViewerWindow *self, gint zoom_level) + + gint virt_viewer_window_get_zoom_level(VirtViewerWindow *self) + { +- g_return_val_if_fail(VIRT_VIEWER_IS_WINDOW(self), 100); ++ g_return_val_if_fail(VIRT_VIEWER_IS_WINDOW(self), NORMAL_ZOOM_LEVEL); + return self->priv->zoomlevel; + } + +diff --git a/src/virt-viewer-window.h b/src/virt-viewer-window.h +index 4639708..8a4322b 100644 +--- a/src/virt-viewer-window.h ++++ b/src/virt-viewer-window.h +@@ -32,6 +32,8 @@ G_BEGIN_DECLS + + #define MIN_ZOOM_LEVEL 10 + #define MAX_ZOOM_LEVEL 400 ++#define NORMAL_ZOOM_LEVEL 100 ++#define ZOOM_STEP 10 + + #define VIRT_VIEWER_TYPE_WINDOW virt_viewer_window_get_type() + diff --git a/SOURCES/0018-rhbz-1007306-Don-t-free-session-if-we-re-re-trying-a.patch b/SOURCES/0018-rhbz-1007306-Don-t-free-session-if-we-re-re-trying-a.patch deleted file mode 100644 index 8cd5df5..0000000 --- a/SOURCES/0018-rhbz-1007306-Don-t-free-session-if-we-re-re-trying-a.patch +++ /dev/null @@ -1,41 +0,0 @@ -From b03b437ba04f7dc9a7cc6881df09b1a560c46782 Mon Sep 17 00:00:00 2001 -From: Jonathon Jongsma -Date: Fri, 31 Jan 2014 13:56:19 -0600 -Subject: [PATCH] rhbz#1007306 - Don't free session if we're re-trying auth - -deactivate() is called in response to a failed authentication attempt. If the -session is cleared here, when a user attempts to re-authenticate, it will issue -a warning and will not actually work. So only clear the session here if we're -not going to re-try authentication. - -Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1007295 - -(cherry picked from commit 74b532f1ecf5affecc13e322723881ba42d2dd29) ---- - src/virt-viewer-app.c | 5 +++-- - 1 file changed, 3 insertions(+), 2 deletions(-) - -diff --git a/src/virt-viewer-app.c b/src/virt-viewer-app.c -index 499c33f..e4e2eeb 100644 ---- a/src/virt-viewer-app.c -+++ b/src/virt-viewer-app.c -@@ -1250,7 +1250,6 @@ virt_viewer_app_deactivate(VirtViewerApp *self, gboolean connect_error) - - if (priv->session) { - virt_viewer_session_close(VIRT_VIEWER_SESSION(priv->session)); -- g_clear_object(&priv->session); - } - - priv->connected = FALSE; -@@ -1266,8 +1265,10 @@ virt_viewer_app_deactivate(VirtViewerApp *self, gboolean connect_error) - if (priv->authretry) { - priv->authretry = FALSE; - g_idle_add(virt_viewer_app_retryauth, self); -- } else -+ } else { -+ g_clear_object(&priv->session); - virt_viewer_app_deactivated(self, connect_error); -+ } - - } - diff --git a/SOURCES/0018-virt-viewer-display-Use-MIN_DISPLAY_WIDTH-HEIGHT-ins.patch b/SOURCES/0018-virt-viewer-display-Use-MIN_DISPLAY_WIDTH-HEIGHT-ins.patch new file mode 100644 index 0000000..9f556b3 --- /dev/null +++ b/SOURCES/0018-virt-viewer-display-Use-MIN_DISPLAY_WIDTH-HEIGHT-ins.patch @@ -0,0 +1,59 @@ +From f85d36dfa01146b122acc6690c9b3590a9c68a78 Mon Sep 17 00:00:00 2001 +From: Pavel Grunt +Date: Mon, 30 Mar 2015 22:17:36 +0200 +Subject: [PATCH] virt-viewer-display: Use MIN_DISPLAY_WIDTH/HEIGHT instead of + numbers + +(cherry picked from commit 0b653558ad0e5a635df64a68121425be387900e2) +--- + src/virt-viewer-display.c | 8 ++++---- + src/virt-viewer-display.h | 3 +++ + 2 files changed, 7 insertions(+), 4 deletions(-) + +diff --git a/src/virt-viewer-display.c b/src/virt-viewer-display.c +index 50245cb..829ee07 100644 +--- a/src/virt-viewer-display.c ++++ b/src/virt-viewer-display.c +@@ -425,8 +425,8 @@ virt_viewer_display_size_request(GtkWidget *widget, + if (priv->dirty || !priv->size_request_once) { + virt_viewer_display_get_preferred_size(display, requisition); + } else { +- requisition->width = 50; +- requisition->height = 50; ++ requisition->width = MIN_DISPLAY_WIDTH; ++ requisition->height = MIN_DISPLAY_HEIGHT; + } + + priv->size_request_once = TRUE; +@@ -460,7 +460,7 @@ static void virt_viewer_display_get_preferred_width(GtkWidget *widget, + VirtViewerDisplayPrivate *priv = display->priv; + int border_width = gtk_container_get_border_width(GTK_CONTAINER(widget)); + +- *minwidth = 50 + 2 * border_width; ++ *minwidth = MIN_DISPLAY_WIDTH + 2 * border_width; + + if (priv->zoom) { + *defwidth = round(priv->desktopWidth * priv->zoom_level / (double) NORMAL_ZOOM_LEVEL) + +@@ -479,7 +479,7 @@ static void virt_viewer_display_get_preferred_height(GtkWidget *widget, + VirtViewerDisplayPrivate *priv = display->priv; + int border_height = gtk_container_get_border_width(GTK_CONTAINER(widget)); + +- *minheight = 50 + 2 * border_height; ++ *minheight = MIN_DISPLAY_HEIGHT + 2 * border_height; + + if (priv->zoom) { + *defheight = round(priv->desktopHeight * priv->zoom_level / (double) NORMAL_ZOOM_LEVEL) + +diff --git a/src/virt-viewer-display.h b/src/virt-viewer-display.h +index b1133e8..9829617 100644 +--- a/src/virt-viewer-display.h ++++ b/src/virt-viewer-display.h +@@ -29,6 +29,9 @@ + + G_BEGIN_DECLS + ++#define MIN_DISPLAY_WIDTH 50 ++#define MIN_DISPLAY_HEIGHT 50 ++ + #define VIRT_VIEWER_TYPE_DISPLAY virt_viewer_display_get_type() + + #define VIRT_VIEWER_DISPLAY(obj) \ diff --git a/SOURCES/0019-Fix-broken-release-cursor-accel-when-not-specified-i.patch b/SOURCES/0019-Fix-broken-release-cursor-accel-when-not-specified-i.patch deleted file mode 100644 index f882264..0000000 --- a/SOURCES/0019-Fix-broken-release-cursor-accel-when-not-specified-i.patch +++ /dev/null @@ -1,73 +0,0 @@ -From edb6ac714c6040ccd9a2f729ba636b63e2f35e9e Mon Sep 17 00:00:00 2001 -From: Jonathon Jongsma -Date: Wed, 12 Mar 2014 11:12:15 -0500 -Subject: [PATCH] Fix broken 'release-cursor' accel when not specified in - --hotkeys - -When the --hotkeys option is given, all hotkeys that are not explicitly -specified are disabled. The method used to disable hotkeys is to change the -accel map entry to key=0, mods=0. However, when we decide whether to set a grab -sequence on the spice dispay widget, we simply use the return value for -gtk_accel_map_lookup_entry and assume that a TRUE value returned from this -function means that the hotkey is enabled. In reality, this function will -return TRUE for disabled hotkeys, but the 'key' variable will be set to key=0, -mods=0. The result is that if I start virt-viewer like this: - - virt-viewer --hotkeys secure-attention=ctrl+alt+end ... - -and the guest that I'm attached to uses server mouse mode, it will be impossible -to release the grab on the spice widget. Because we will explicitly disable the -grab keys in the spice widget and handle the 'release-cursor' hotkey in -virt-viewer, but the hotkey is an empty accel key. - -Instead of simply checking the return value of gtk_accel_map_lookup_entry, we -have to inspect the return value for 'key' and check whether any keys are -actually assigned. - -Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1029108 - -(cherry picked from commit fe167a6668a131c6182f749c826e52046607cb6f) ---- - src/virt-viewer-display-spice.c | 7 +++++-- - src/virt-viewer-window.c | 9 ++++++--- - 2 files changed, 11 insertions(+), 5 deletions(-) - -diff --git a/src/virt-viewer-display-spice.c b/src/virt-viewer-display-spice.c -index 0450b5b..2ce42cf 100644 ---- a/src/virt-viewer-display-spice.c -+++ b/src/virt-viewer-display-spice.c -@@ -234,8 +234,11 @@ enable_accel_changed(VirtViewerApp *app, - GParamSpec *pspec G_GNUC_UNUSED, - VirtViewerDisplaySpice *self) - { -- if (virt_viewer_app_get_enable_accel(app) -- && gtk_accel_map_lookup_entry("/view/release-cursor", NULL)) { -+ GtkAccelKey key = { 0 }; -+ if (virt_viewer_app_get_enable_accel(app)) -+ gtk_accel_map_lookup_entry("/view/release-cursor", &key); -+ -+ if (key.accel_key || key.accel_mods) { - SpiceGrabSequence *seq = spice_grab_sequence_new(0, NULL); - /* disable default grab sequence */ - spice_display_set_grab_keys(self->priv->display, seq); -diff --git a/src/virt-viewer-window.c b/src/virt-viewer-window.c -index 1ad896c..6f6f9a4 100644 ---- a/src/virt-viewer-window.c -+++ b/src/virt-viewer-window.c -@@ -1141,10 +1141,13 @@ virt_viewer_window_update_title(VirtViewerWindow *self) - - if (priv->grabbed) { - gchar *label; -- GtkAccelKey key; -+ GtkAccelKey key = { 0 }; - -- if (virt_viewer_app_get_enable_accel(priv->app) -- && gtk_accel_map_lookup_entry("/view/release-cursor", &key)) { -+ if (virt_viewer_app_get_enable_accel(priv->app)) -+ gtk_accel_map_lookup_entry("/view/release-cursor", &key); -+ -+ if (key.accel_key || key.accel_mods) { -+ DEBUG_LOG("release-cursor accel key: key=%u, mods=%x, flags=%u", key.accel_key, key.accel_mods, key.accel_flags); - label = gtk_accelerator_get_label(key.accel_key, key.accel_mods); - } else { - label = g_strdup(_("Ctrl+Alt")); diff --git a/SOURCES/0019-virt-viewer-window-Change-zoom-of-the-display-only-w.patch b/SOURCES/0019-virt-viewer-window-Change-zoom-of-the-display-only-w.patch new file mode 100644 index 0000000..0707fe0 --- /dev/null +++ b/SOURCES/0019-virt-viewer-window-Change-zoom-of-the-display-only-w.patch @@ -0,0 +1,140 @@ +From 961d93430ddebd908823eabed4bdfe9ae20d8243 Mon Sep 17 00:00:00 2001 +From: Pavel Grunt +Date: Tue, 31 Mar 2015 15:03:51 +0200 +Subject: [PATCH] virt-viewer-window: Change zoom of the display only when it + is possible + +Do not allow to zoom out if it is not possible due to the width of +the top menu. It avoids emitting size allocation events that will +change the display resolution of the spice guest. + +Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1206460 +(cherry picked from commit c45a30e909656434aa842d48d828ef038ec7364a) +--- + src/virt-viewer-window.c | 72 +++++++++++++++++++++++++++++++++++++++++++++++- + 1 file changed, 71 insertions(+), 1 deletion(-) + +diff --git a/src/virt-viewer-window.c b/src/virt-viewer-window.c +index 5f16208..c808a4c 100644 +--- a/src/virt-viewer-window.c ++++ b/src/virt-viewer-window.c +@@ -34,9 +34,11 @@ + #include + #include + #include ++#include + + #include "virt-gtk-compat.h" + #include "virt-viewer-window.h" ++#include "virt-viewer-display.h" + #include "virt-viewer-session.h" + #include "virt-viewer-app.h" + #include "virt-viewer-util.h" +@@ -65,6 +67,8 @@ static void virt_viewer_window_disable_modifiers(VirtViewerWindow *self); + static void virt_viewer_window_resize(VirtViewerWindow *self, gboolean keep_win_size); + static void virt_viewer_window_toolbar_setup(VirtViewerWindow *self); + static GtkMenu* virt_viewer_window_get_keycombo_menu(VirtViewerWindow *self); ++static void virt_viewer_window_get_minimal_dimensions(VirtViewerWindow *self, guint *width, guint *height); ++static gint virt_viewer_window_get_minimal_zoom_level(VirtViewerWindow *self); + + G_DEFINE_TYPE (VirtViewerWindow, virt_viewer_window, G_TYPE_OBJECT) + +@@ -1297,7 +1301,7 @@ virt_viewer_window_set_display(VirtViewerWindow *self, VirtViewerDisplay *displa + if (display != NULL) { + priv->display = g_object_ref(display); + +- virt_viewer_display_set_zoom_level(VIRT_VIEWER_DISPLAY(priv->display), priv->zoomlevel); ++ virt_viewer_window_set_zoom_level(self, priv->zoomlevel); + virt_viewer_display_set_monitor(VIRT_VIEWER_DISPLAY(priv->display), priv->fullscreen_monitor); + virt_viewer_display_set_fullscreen(VIRT_VIEWER_DISPLAY(priv->display), priv->fullscreen); + +@@ -1393,9 +1397,11 @@ void + virt_viewer_window_set_zoom_level(VirtViewerWindow *self, gint zoom_level) + { + VirtViewerWindowPrivate *priv; ++ gint min_zoom, old_zoom; + + g_return_if_fail(VIRT_VIEWER_IS_WINDOW(self)); + priv = self->priv; ++ old_zoom = priv->zoomlevel; + + if (zoom_level < MIN_ZOOM_LEVEL) + zoom_level = MIN_ZOOM_LEVEL; +@@ -1406,6 +1412,17 @@ virt_viewer_window_set_zoom_level(VirtViewerWindow *self, gint zoom_level) + if (!priv->display) + return; + ++ min_zoom = virt_viewer_window_get_minimal_zoom_level(self); ++ if (min_zoom > priv->zoomlevel) { ++ g_debug("Cannot set zoom level %d, using %d", priv->zoomlevel, min_zoom); ++ priv->zoomlevel = min_zoom; ++ } ++ ++ if (priv->zoomlevel == old_zoom) { ++ g_debug("Zoom level not changed, using: %d", priv->zoomlevel); ++ return; ++ } ++ + virt_viewer_display_set_zoom_level(VIRT_VIEWER_DISPLAY(priv->display), priv->zoomlevel); + + virt_viewer_window_queue_resize(self); +@@ -1458,6 +1475,59 @@ virt_viewer_window_set_kiosk(VirtViewerWindow *self, gboolean enabled) + g_debug("disabling kiosk not implemented yet"); + } + ++static void ++virt_viewer_window_get_minimal_dimensions(VirtViewerWindow *self, ++ guint *width, ++ guint *height) ++{ ++ GtkRequisition req; ++ GtkWidget *top_menu; ++ ++ top_menu = GTK_WIDGET(gtk_builder_get_object(virt_viewer_window_get_builder(self), "top-menu")); ++#if !GTK_CHECK_VERSION(3, 0, 0) ++ gtk_widget_get_child_requisition(top_menu, &req); ++#else ++ gtk_widget_get_preferred_size(top_menu, &req, NULL); ++#endif ++ /* minimal dimensions of the window are the maximum of dimensions of the top-menu ++ * and minimal dimension of the display ++ */ ++ *height = MIN_DISPLAY_HEIGHT; ++ *width = MAX(MIN_DISPLAY_WIDTH, req.width); ++} ++ ++/** ++ * virt_viewer_window_get_minimal_zoom_level: ++ * @self: a #VirtViewerWindow ++ * ++ * Calculates the zoom level with respect to the desktop dimensions ++ * ++ * Returns: minimal possible zoom level (multiple of ZOOM_STEP) ++ */ ++static gint ++virt_viewer_window_get_minimal_zoom_level(VirtViewerWindow *self) ++{ ++ guint min_width, min_height; ++ guint width, height; /* desktop dimensions */ ++ gint zoom; ++ double width_ratio, height_ratio; ++ ++ g_return_val_if_fail(VIRT_VIEWER_IS_WINDOW(self) && ++ self->priv->display != NULL, MIN_ZOOM_LEVEL); ++ ++ virt_viewer_window_get_minimal_dimensions(self, &min_width, &min_height); ++ virt_viewer_display_get_desktop_size(virt_viewer_window_get_display(self), &width, &height); ++ ++ /* e.g. minimal width = 200, desktop width = 550 => width ratio = 0.36 ++ * which means that the minimal zoom level is 40 (4 * ZOOM_STEP) ++ */ ++ width_ratio = (double) min_width / width; ++ height_ratio = (double) min_height / height; ++ zoom = ceil(10 * MAX(width_ratio, height_ratio)); ++ ++ return MAX(MIN_ZOOM_LEVEL, zoom * ZOOM_STEP); ++} ++ + /* + * Local variables: + * c-indent-level: 4 diff --git a/SOURCES/0020-Fix-tiny-windows-for-secondary-displays-in-gtk2-buil.patch b/SOURCES/0020-Fix-tiny-windows-for-secondary-displays-in-gtk2-buil.patch deleted file mode 100644 index f81b363..0000000 --- a/SOURCES/0020-Fix-tiny-windows-for-secondary-displays-in-gtk2-buil.patch +++ /dev/null @@ -1,37 +0,0 @@ -From bd816fb6695f6e88521cff37faf12b061283d246 Mon Sep 17 00:00:00 2001 -From: Jonathon Jongsma -Date: Tue, 10 Jun 2014 11:31:25 -0500 -Subject: [PATCH] Fix tiny windows for secondary displays in gtk2 build - -When enabling a new display on linux guests, the new window would be tiny -(50x50) and zoomed way out. This was caused by the fact that when the display -widget received the 'map' event, it unconditionally cleared the 'dirty' flag, -which meant that it would only request 50x50 size. This behavior was intended to -fix a bug on the windows client which wprevented windows from resized smaller -than the guest display resolution. Unfortunately, due to the timing of the 'map' -and allocate events, the widget became very small. - -Instead of clearing the 'dirty' flag directly when a widget is mapped, we -now queue a resize event, which will guarantee that the widget attains its -desired size and will then clear its dirty flag (allowing it to be resized). -Testing on windows indicates that this fix still solves the 'unshrinkable -window' problem while also preventing the tiny secondary display bug. - -Resolves: rhbz#1104064 ---- - src/virt-viewer-display.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/src/virt-viewer-display.c b/src/virt-viewer-display.c -index f298bb0..48b7090 100644 ---- a/src/virt-viewer-display.c -+++ b/src/virt-viewer-display.c -@@ -454,7 +454,7 @@ virt_viewer_display_map(GtkWidget *widget) - { - GTK_WIDGET_CLASS(virt_viewer_display_parent_class)->map(widget); - -- virt_viewer_display_make_resizable(VIRT_VIEWER_DISPLAY(widget)); -+ virt_viewer_display_queue_resize(VIRT_VIEWER_DISPLAY(widget)); - } - - #else diff --git a/SOURCES/0020-virt-viewer-window-Set-zoom-when-display-is-enabled-.patch b/SOURCES/0020-virt-viewer-window-Set-zoom-when-display-is-enabled-.patch new file mode 100644 index 0000000..d2fc324 --- /dev/null +++ b/SOURCES/0020-virt-viewer-window-Set-zoom-when-display-is-enabled-.patch @@ -0,0 +1,43 @@ +From a2523a8f2d4ec837dbc3f9f355f3f16e49570e61 Mon Sep 17 00:00:00 2001 +From: Pavel Grunt +Date: Sun, 5 Apr 2015 15:45:00 +0200 +Subject: [PATCH] virt-viewer-window: Set zoom when display is enabled and + ready. + +The display has default dimensions (100x100) when it is disabled. +Calculating the minimal zoom for the display will give wrong value +for the newly opened display. + +It is better to wait for setting the zoom level to the moment when +the display is enabled and ready. + +Related to: https://bugzilla.redhat.com/show_bug.cgi?id=1206460 + +(cherry picked from commit 998b13c881480ffea98dd8b65e0495c49fc31d2d) +--- + src/virt-viewer-window.c | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +diff --git a/src/virt-viewer-window.c b/src/virt-viewer-window.c +index c808a4c..f185eb9 100644 +--- a/src/virt-viewer-window.c ++++ b/src/virt-viewer-window.c +@@ -1272,6 +1272,10 @@ display_show_hint(VirtViewerDisplay *display, + + hint = (hint & VIRT_VIEWER_DISPLAY_SHOW_HINT_READY); + ++ if (hint && virt_viewer_display_get_enabled(display)) { ++ virt_viewer_window_set_zoom_level(self, self->priv->zoomlevel); ++ } ++ + gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(self->priv->builder, "menu-file-screenshot")), hint); + } + static gboolean +@@ -1301,7 +1305,6 @@ virt_viewer_window_set_display(VirtViewerWindow *self, VirtViewerDisplay *displa + if (display != NULL) { + priv->display = g_object_ref(display); + +- virt_viewer_window_set_zoom_level(self, priv->zoomlevel); + virt_viewer_display_set_monitor(VIRT_VIEWER_DISPLAY(priv->display), priv->fullscreen_monitor); + virt_viewer_display_set_fullscreen(VIRT_VIEWER_DISPLAY(priv->display), priv->fullscreen); + diff --git a/SOURCES/0021-Fix-tiny-window-when-resetting-zoom-factor-in-gtk2-b.patch b/SOURCES/0021-Fix-tiny-window-when-resetting-zoom-factor-in-gtk2-b.patch deleted file mode 100644 index 2c09efd..0000000 --- a/SOURCES/0021-Fix-tiny-window-when-resetting-zoom-factor-in-gtk2-b.patch +++ /dev/null @@ -1,46 +0,0 @@ -From fcf77734a86732417142e81140f681233a4ef0da Mon Sep 17 00:00:00 2001 -From: Jonathon Jongsma -Date: Wed, 11 Jun 2014 13:09:30 -0500 -Subject: [PATCH] Fix tiny window when resetting zoom factor in gtk2 build - -rhbz#1104064 had a couple of symptoms. The first was fixed in -6edde57862ac30e74ce6412c93a2fa925ae4ea67. - -The second symptom is that displays could also become tiny when clicking 'View > -Zoom > Normal Size'. This was because VirtViewerDisplay returned early from -_display_set_zoom_level() if the zoom level was being set to the current zoom -setting. However, the calling function (_window_set_zoom_level()) also tries to -queue a resize event for itself after setting the zoom level on the display. If -the display doesn't queue a resize event for itself, its size request will only -be 50x50 during the window resize negotiation. This causes the display to become -tiny and zoomed out. Queueing a resize on the display widget ensures that it -will request the proper size during the next allocation. ---- - src/virt-viewer-display.c | 9 ++++++++- - 1 file changed, 8 insertions(+), 1 deletion(-) - -diff --git a/src/virt-viewer-display.c b/src/virt-viewer-display.c -index 48b7090..52e6962 100644 ---- a/src/virt-viewer-display.c -+++ b/src/virt-viewer-display.c -@@ -605,12 +605,19 @@ void virt_viewer_display_set_zoom_level(VirtViewerDisplay *display, - if (zoom > MAX_ZOOM_LEVEL) - zoom = MAX_ZOOM_LEVEL; - -+ // For the gtk2 build, we need to queue a resize even if the zoom level -+ // hasn't changed. This is due to the fact that VirtViewerWindow will queue -+ // a resize event for itself immediately after calling this function (in -+ // order to shrink the window to fit the new display size if necessary). If -+ // we don't queue a resize here, the window will become tiny because we will -+ // only request 50x50 during the window resize -+ virt_viewer_display_queue_resize(display); -+ - if (priv->zoom_level == zoom) - return; - - priv->zoom_level = zoom; - -- virt_viewer_display_queue_resize(display); - g_object_notify(G_OBJECT(display), "zoom-level"); - } - diff --git a/SOURCES/0021-virt-viewer-window-Return-early-when-zoom-of-window-.patch b/SOURCES/0021-virt-viewer-window-Return-early-when-zoom-of-window-.patch new file mode 100644 index 0000000..74f2dbd --- /dev/null +++ b/SOURCES/0021-virt-viewer-window-Return-early-when-zoom-of-window-.patch @@ -0,0 +1,44 @@ +From bca8df0e4bf7d63b5c954ea79e1020407905bbe8 Mon Sep 17 00:00:00 2001 +From: Pavel Grunt +Date: Sun, 5 Apr 2015 15:45:01 +0200 +Subject: [PATCH] virt-viewer-window: Return early when zoom of window and zoom + of display are same + +The zoom level should be changed when zoom levels of the window and +the display are different. It is wrong to check the previous value of +the window because it could be set just for the window and not for +the display (e.g. when setting zoom level using the command line). + +Related to: https://bugzilla.redhat.com/show_bug.cgi?id=1206460 + +(cherry picked from commit 01249f703263ef6a8be59479df5cf6c5e8b1ceb9) +--- + src/virt-viewer-window.c | 5 ++--- + 1 file changed, 2 insertions(+), 3 deletions(-) + +diff --git a/src/virt-viewer-window.c b/src/virt-viewer-window.c +index f185eb9..6a337da 100644 +--- a/src/virt-viewer-window.c ++++ b/src/virt-viewer-window.c +@@ -1400,11 +1400,10 @@ void + virt_viewer_window_set_zoom_level(VirtViewerWindow *self, gint zoom_level) + { + VirtViewerWindowPrivate *priv; +- gint min_zoom, old_zoom; ++ gint min_zoom; + + g_return_if_fail(VIRT_VIEWER_IS_WINDOW(self)); + priv = self->priv; +- old_zoom = priv->zoomlevel; + + if (zoom_level < MIN_ZOOM_LEVEL) + zoom_level = MIN_ZOOM_LEVEL; +@@ -1421,7 +1420,7 @@ virt_viewer_window_set_zoom_level(VirtViewerWindow *self, gint zoom_level) + priv->zoomlevel = min_zoom; + } + +- if (priv->zoomlevel == old_zoom) { ++ if (priv->zoomlevel == virt_viewer_display_get_zoom_level(priv->display)) { + g_debug("Zoom level not changed, using: %d", priv->zoomlevel); + return; + } diff --git a/SOURCES/0022-display-spice-Do-not-ignore-change-of-position.patch b/SOURCES/0022-display-spice-Do-not-ignore-change-of-position.patch new file mode 100644 index 0000000..10c64c6 --- /dev/null +++ b/SOURCES/0022-display-spice-Do-not-ignore-change-of-position.patch @@ -0,0 +1,91 @@ +From 8b93fe4931657c1bd993dcf1e05f671d82ebbd6a Mon Sep 17 00:00:00 2001 +From: Pavel Grunt +Date: Sun, 5 Apr 2015 15:45:02 +0200 +Subject: [PATCH] display-spice: Do not ignore change of position + +Positions of displays can be changed by guest, it is important to +react to this change by rearranging client's windows otherwise +mouse actions can be assigned to a wrong window. + +Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1206216 +(cherry picked from commit 310979947594bbbab39c4b1b25823cf0a2e56e93) +--- + src/virt-viewer-display-spice.c | 27 +++++++++++++++++++++++++++ + src/virt-viewer-display-spice.h | 2 ++ + src/virt-viewer-session-spice.c | 5 +++-- + 3 files changed, 32 insertions(+), 2 deletions(-) + +diff --git a/src/virt-viewer-display-spice.c b/src/virt-viewer-display-spice.c +index 6cd8394..399c207 100644 +--- a/src/virt-viewer-display-spice.c ++++ b/src/virt-viewer-display-spice.c +@@ -45,6 +45,8 @@ struct _VirtViewerDisplaySpicePrivate { + SpiceChannel *channel; /* weak reference */ + SpiceDisplay *display; + AutoResizeState auto_resize; ++ guint x; ++ guint y; + }; + + #define VIRT_VIEWER_DISPLAY_SPICE_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE((o), VIRT_VIEWER_TYPE_DISPLAY_SPICE, VirtViewerDisplaySpicePrivate)) +@@ -343,6 +345,31 @@ virt_viewer_display_spice_selectable(VirtViewerDisplay *self) + return agent_connected; + } + ++void ++virt_viewer_display_spice_set_desktop(VirtViewerDisplay *display, ++ guint x, guint y, ++ guint width, guint height) ++{ ++ VirtViewerDisplaySpicePrivate *priv; ++ guint desktopWidth, desktopHeight; ++ ++ g_return_if_fail(VIRT_VIEWER_IS_DISPLAY_SPICE(display)); ++ ++ virt_viewer_display_get_desktop_size(display, &desktopWidth, &desktopHeight); ++ ++ priv = VIRT_VIEWER_DISPLAY_SPICE(display)->priv; ++ ++ if (desktopWidth == width && desktopHeight == height && priv->x == x && priv->y == y) ++ return; ++ ++ g_object_set(G_OBJECT(display), "desktop-width", width, "desktop-height", height, NULL); ++ priv->x = x; ++ priv->y = y; ++ ++ virt_viewer_display_queue_resize(display); ++ ++ g_signal_emit_by_name(display, "display-desktop-resize"); ++} + + /* + * Local variables: +diff --git a/src/virt-viewer-display-spice.h b/src/virt-viewer-display-spice.h +index c2013ec..3c30270 100644 +--- a/src/virt-viewer-display-spice.h ++++ b/src/virt-viewer-display-spice.h +@@ -68,6 +68,8 @@ GType virt_viewer_display_spice_get_type(void); + + GtkWidget* virt_viewer_display_spice_new(VirtViewerSessionSpice *session, SpiceChannel *channel, gint monitorid); + ++void virt_viewer_display_spice_set_desktop(VirtViewerDisplay *display, guint x, guint y, ++ guint width, guint height); + G_END_DECLS + + #endif /* _VIRT_VIEWER_DISPLAY_SPICE_H */ +diff --git a/src/virt-viewer-session-spice.c b/src/virt-viewer-session-spice.c +index 85e5360..d3d7edc 100644 +--- a/src/virt-viewer-session-spice.c ++++ b/src/virt-viewer-session-spice.c +@@ -727,8 +727,9 @@ virt_viewer_session_spice_display_monitors(SpiceChannel *channel, + continue; + + virt_viewer_display_set_enabled(VIRT_VIEWER_DISPLAY(display), TRUE); +- virt_viewer_display_set_desktop_size(VIRT_VIEWER_DISPLAY(display), +- monitor->width, monitor->height); ++ virt_viewer_display_spice_set_desktop(VIRT_VIEWER_DISPLAY(display), ++ monitor->x, monitor->y, ++ monitor->width, monitor->height); + } + + g_clear_pointer(&monitors, g_array_unref); diff --git a/SOURCES/0022-window-take-zoom-level-into-account-for-display-limi.patch b/SOURCES/0022-window-take-zoom-level-into-account-for-display-limi.patch deleted file mode 100644 index 6841784..0000000 --- a/SOURCES/0022-window-take-zoom-level-into-account-for-display-limi.patch +++ /dev/null @@ -1,50 +0,0 @@ -From 32fb35b3c682b197238387fdd576dfb96571e6aa Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= -Date: Wed, 11 Jun 2014 20:56:39 +0300 -Subject: [PATCH] window: take zoom-level into account for display limits - -Fixes guest can not be resized to expected window size after zoom out. - -https://bugzilla.redhat.com/show_bug.cgi?id=1105528 ---- - src/virt-viewer-window.c | 13 +++++++++---- - 1 file changed, 9 insertions(+), 4 deletions(-) - -diff --git a/src/virt-viewer-window.c b/src/virt-viewer-window.c -index 6f6f9a4..b44c5cb 100644 ---- a/src/virt-viewer-window.c -+++ b/src/virt-viewer-window.c -@@ -405,8 +405,8 @@ virt_viewer_window_resize(VirtViewerWindow *self, gboolean keep_win_size) - int width, height; - double desktopAspect; - double screenAspect; -- guint desktopWidth; -- guint desktopHeight; -+ guint desktopWidth, display_width; -+ guint desktopHeight, display_height; - VirtViewerWindowPrivate *priv = self->priv; - - if (priv->fullscreen) -@@ -433,8 +433,11 @@ virt_viewer_window_resize(VirtViewerWindow *self, gboolean keep_win_size) - desktopAspect = (double)desktopWidth / (double)desktopHeight; - screenAspect = (double)fullscreen.width / (double)fullscreen.height; - -- if ((desktopWidth > fullscreen.width) || -- (desktopHeight > fullscreen.height)) { -+ display_width = desktopWidth * priv->zoomlevel / 100.0; -+ display_height = desktopHeight * priv->zoomlevel / 100.0; -+ -+ if ((display_width > fullscreen.width) || -+ (display_height > fullscreen.height)) { - /* Doesn't fit native res, so go as large as possible - maintaining aspect ratio */ - if (screenAspect > desktopAspect) { -@@ -444,6 +447,8 @@ virt_viewer_window_resize(VirtViewerWindow *self, gboolean keep_win_size) - width = fullscreen.width; - height = fullscreen.width / desktopAspect; - } -+ width *= 100.0 / priv->zoomlevel; -+ height *= 100.0 / priv->zoomlevel; - } else { - width = desktopWidth; - height = desktopHeight; diff --git a/SOURCES/0023-Remove-warning-when-removing-display.patch b/SOURCES/0023-Remove-warning-when-removing-display.patch deleted file mode 100644 index 9b322d7..0000000 --- a/SOURCES/0023-Remove-warning-when-removing-display.patch +++ /dev/null @@ -1,33 +0,0 @@ -From b8b4a32f2f5ad6ac8d7aeff6bd23a779e99bc63a Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= -Date: Tue, 10 Jun 2014 14:25:16 +0300 -Subject: [PATCH] Remove warning when removing display - -Some display have no associated window (for ex, if it doesn't fit -on client monitors). - -(remote-viewer:22275): remote-viewer-CRITICAL **: virt_viewer_window_set_display: assertion `VIRT_VIEWER_IS_WINDOW(self)' failed - -(remote-viewer:22275): remote-viewer-CRITICAL **: virt_viewer_app_remove_nth_window: assertion `win != NULL' failed - -https://bugzilla.redhat.com/show_bug.cgi?id=1107518 ---- - src/virt-viewer-app.c | 4 +++- - 1 file changed, 3 insertions(+), 1 deletion(-) - -diff --git a/src/virt-viewer-app.c b/src/virt-viewer-app.c -index e4e2eeb..5f7b85a 100644 ---- a/src/virt-viewer-app.c -+++ b/src/virt-viewer-app.c -@@ -856,8 +856,10 @@ virt_viewer_app_display_removed(VirtViewerSession *session G_GNUC_UNUSED, - gtk_widget_hide(GTK_WIDGET(display)); - g_object_get(display, "nth-display", &nth, NULL); - win = virt_viewer_app_get_nth_window(self, nth); -- virt_viewer_window_set_display(win, NULL); -+ if (!win) -+ return; - -+ virt_viewer_window_set_display(win, NULL); - if (nth != 0) - virt_viewer_app_remove_nth_window(self, nth); - } diff --git a/SOURCES/0023-virt-viewer-main-Require-domain-name-as-argument-for.patch b/SOURCES/0023-virt-viewer-main-Require-domain-name-as-argument-for.patch new file mode 100644 index 0000000..5210ae7 --- /dev/null +++ b/SOURCES/0023-virt-viewer-main-Require-domain-name-as-argument-for.patch @@ -0,0 +1,56 @@ +From 39af2ef261d2a2746d03f9493b56528ca0fd689e Mon Sep 17 00:00:00 2001 +From: Pavel Grunt +Date: Tue, 7 Apr 2015 11:06:46 +0200 +Subject: [PATCH] virt-viewer-main: Require domain name as argument for + '--wait' + +As since 88f634179e56742a21fb4c7efc270e4203322d74 virt-viewer can be +used without a domain-name, let's require it when using --wait. + +Resolves: rhbz#1209398 +(cherry picked from commit a830275344c88aef12166661b68ea2b4429c7212) +--- + src/virt-viewer-main.c | 9 +++++---- + 1 file changed, 5 insertions(+), 4 deletions(-) + +diff --git a/src/virt-viewer-main.c b/src/virt-viewer-main.c +index 3fae955..7f6e851 100644 +--- a/src/virt-viewer-main.c ++++ b/src/virt-viewer-main.c +@@ -50,7 +50,7 @@ int main(int argc, char **argv) + gchar **args = NULL; + gboolean direct = FALSE; + gboolean attach = FALSE; +- gboolean waitvm = FALSE; ++ char *waitvm = NULL; + gboolean reconnect = FALSE; + VirtViewer *viewer = NULL; + char *base_name; +@@ -64,8 +64,8 @@ int main(int argc, char **argv) + N_("Attach to the local display using libvirt"), NULL }, + { "connect", 'c', 0, G_OPTION_ARG_STRING, &uri, + N_("Connect to hypervisor"), "URI"}, +- { "wait", 'w', 0, G_OPTION_ARG_NONE, &waitvm, +- N_("Wait for domain to start"), NULL }, ++ { "wait", 'w', 0, G_OPTION_ARG_STRING, &waitvm, ++ N_("Wait for domain to start"), "DOMAIN-NAME|ID|UUID" }, + { "reconnect", 'r', 0, G_OPTION_ARG_NONE, &reconnect, + N_("Reconnect to domain upon restart"), NULL }, + { G_OPTION_REMAINING, '\0', 0, G_OPTION_ARG_STRING_ARRAY, &args, +@@ -109,7 +109,7 @@ int main(int argc, char **argv) + goto cleanup; + } + +- viewer = virt_viewer_new(uri, (args) ? args[0] : NULL, direct, attach, waitvm, reconnect); ++ viewer = virt_viewer_new(uri, (args) ? args[0] : waitvm, direct, attach, waitvm != NULL, reconnect); + if (viewer == NULL) + goto cleanup; + +@@ -124,6 +124,7 @@ int main(int argc, char **argv) + if (viewer) + g_object_unref(viewer); + g_free(uri); ++ g_free(waitvm); + g_strfreev(args); + g_free(help_msg); + diff --git a/SOURCES/0024-Replace-DEBUG_LOG-with-g_debug.patch b/SOURCES/0024-Replace-DEBUG_LOG-with-g_debug.patch deleted file mode 100644 index 7f4be68..0000000 --- a/SOURCES/0024-Replace-DEBUG_LOG-with-g_debug.patch +++ /dev/null @@ -1,821 +0,0 @@ -From efadf4908fd76435b5d3476221edb89c426e64a6 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= -Date: Tue, 10 Jun 2014 14:30:01 +0300 -Subject: [PATCH] Replace DEBUG_LOG with g_debug - -https://bugzilla.redhat.com/show_bug.cgi?id=1107518 ---- - src/remote-viewer.c | 6 +++--- - src/virt-viewer-app.c | 22 ++++++++++---------- - src/virt-viewer-auth.c | 12 +++++------ - src/virt-viewer-display-vnc.c | 2 +- - src/virt-viewer-display.c | 6 +++--- - src/virt-viewer-events.c | 28 ++++++++++++------------- - src/virt-viewer-notebook.c | 6 +++--- - src/virt-viewer-session-spice.c | 46 ++++++++++++++++++++--------------------- - src/virt-viewer-session-vnc.c | 4 ++-- - src/virt-viewer-util.h | 1 - - src/virt-viewer-window.c | 12 +++++------ - src/virt-viewer.c | 38 +++++++++++++++++----------------- - 12 files changed, 91 insertions(+), 92 deletions(-) - -diff --git a/src/remote-viewer.c b/src/remote-viewer.c -index 5fa4ee4..fac8915 100644 ---- a/src/remote-viewer.c -+++ b/src/remote-viewer.c -@@ -413,7 +413,7 @@ spice_ctrl_menu_updated(RemoteViewer *self) - { - GHashTable *windows = virt_viewer_app_get_windows(VIRT_VIEWER_APP(self)); - -- DEBUG_LOG("Spice controller menu updated"); -+ g_debug("Spice controller menu updated"); - - g_hash_table_foreach(windows, spice_menu_update_each, self); - } -@@ -462,7 +462,7 @@ spice_foreign_menu_updated(RemoteViewer *self) - { - GHashTable *windows = virt_viewer_app_get_windows(VIRT_VIEWER_APP(self)); - -- DEBUG_LOG("Spice foreign menu updated"); -+ g_debug("Spice foreign menu updated"); - - g_hash_table_foreach(windows, foreign_menu_update_each, self); - } -@@ -986,7 +986,7 @@ retry_dialog: - - g_return_val_if_fail(guri != NULL, FALSE); - -- DEBUG_LOG("Opening display to %s", guri); -+ g_debug("Opening display to %s", guri); - if ((virt_viewer_app_get_title(app) == NULL) || priv->default_title) { - priv->default_title = TRUE; - virt_viewer_app_set_title(app, guri); -diff --git a/src/virt-viewer-app.c b/src/virt-viewer-app.c -index 5f7b85a..e584e9b 100644 ---- a/src/virt-viewer-app.c -+++ b/src/virt-viewer-app.c -@@ -297,7 +297,7 @@ app_window_try_fullscreen(VirtViewerApp *self G_GNUC_UNUSED, - GdkScreen *screen = gdk_screen_get_default(); - - if (nth >= gdk_screen_get_n_monitors(screen)) { -- DEBUG_LOG("skipping display %d", nth); -+ g_debug("skipping display %d", nth); - return; - } - -@@ -313,7 +313,7 @@ void virt_viewer_app_set_uuid_string(VirtViewerApp* self, const gchar* uuid_stri - gint* displays = NULL; - gint nmonitors = gdk_screen_get_n_monitors(gdk_screen_get_default()); - -- DEBUG_LOG("%s: UUID changed to %s", G_STRFUNC, uuid_string); -+ g_debug("%s: UUID changed to %s", G_STRFUNC, uuid_string); - - displays = g_key_file_get_integer_list(self->priv->config, - uuid_string, "monitor-mapping", &ndisplays, &error); -@@ -681,7 +681,7 @@ virt_viewer_app_remove_nth_window(VirtViewerApp *self, gint nth) - win = virt_viewer_app_get_nth_window(self, nth); - g_return_val_if_fail(win != NULL, FALSE); - -- DEBUG_LOG("Remove window %d %p", nth, win); -+ g_debug("Remove window %d %p", nth, win); - g_object_ref(win); - removed = g_hash_table_remove(self->priv->windows, &nth); - g_warn_if_fail(removed); -@@ -703,7 +703,7 @@ virt_viewer_app_set_nth_window(VirtViewerApp *self, gint nth, VirtViewerWindow * - g_return_if_fail(virt_viewer_app_get_nth_window(self, nth) == NULL); - key = g_malloc(sizeof(gint)); - *key = nth; -- DEBUG_LOG("Insert window %d %p", nth, win); -+ g_debug("Insert window %d %p", nth, win); - g_hash_table_insert(self->priv->windows, key, win); - virt_viewer_app_set_window_subtitle(self, win, nth); - virt_viewer_app_update_menu_displays(self); -@@ -988,7 +988,7 @@ virt_viewer_app_channel_open(VirtViewerSession *session, - if (!virt_viewer_app_open_connection(self, &fd)) - return; - -- DEBUG_LOG("After open connection callback fd=%d", fd); -+ g_debug("After open connection callback fd=%d", fd); - - priv = self->priv; - if (priv->transport && g_ascii_strcasecmp(priv->transport, "ssh") == 0 && -@@ -1022,7 +1022,7 @@ virt_viewer_app_default_activate(VirtViewerApp *self, GError **error) - if (!virt_viewer_app_open_connection(self, &fd)) - return FALSE; - -- DEBUG_LOG("After open connection callback fd=%d", fd); -+ g_debug("After open connection callback fd=%d", fd); - - #if defined(HAVE_SOCKETPAIR) && defined(HAVE_FORK) - if (priv->transport && -@@ -1190,7 +1190,7 @@ virt_viewer_app_connect_timer(void *opaque) - VirtViewerApp *self = opaque; - VirtViewerAppPrivate *priv = self->priv; - -- DEBUG_LOG("Connect timer fired"); -+ g_debug("Connect timer fired"); - - if (!priv->active && - virt_viewer_app_initial_connect(self, NULL) < 0) -@@ -1210,7 +1210,7 @@ virt_viewer_app_start_reconnect_poll(VirtViewerApp *self) - g_return_if_fail(VIRT_VIEWER_IS_APP(self)); - VirtViewerAppPrivate *priv = self->priv; - -- DEBUG_LOG("reconnect_poll: %d", priv->reconnect_poll); -+ g_debug("reconnect_poll: %d", priv->reconnect_poll); - - if (priv->reconnect_poll != 0) - return; -@@ -1581,7 +1581,7 @@ virt_viewer_app_init (VirtViewerApp *self) - G_KEY_FILE_KEEP_COMMENTS|G_KEY_FILE_KEEP_TRANSLATIONS, &error); - - if (g_error_matches(error, G_FILE_ERROR, G_FILE_ERROR_NOENT)) -- DEBUG_LOG("No configuration file %s", self->priv->config_file); -+ g_debug("No configuration file %s", self->priv->config_file); - else if (error) - g_warning("Couldn't load configuration: %s", error->message); - -@@ -1967,7 +1967,7 @@ static void fullscreen_cb(gpointer key, - gint nth = virt_viewer_app_get_initial_monitor_for_display(options->app, *(gint*)key); - VirtViewerWindow *vwin = VIRT_VIEWER_WINDOW(value); - -- DEBUG_LOG("fullscreen display %d: %d", nth, options->fullscreen); -+ g_debug("fullscreen display %d: %d", nth, options->fullscreen); - if (options->fullscreen) - app_window_try_fullscreen(options->app, vwin, nth); - else -@@ -2136,7 +2136,7 @@ virt_viewer_app_set_connect_info(VirtViewerApp *self, - g_return_if_fail(VIRT_VIEWER_IS_APP(self)); - VirtViewerAppPrivate *priv = self->priv; - -- DEBUG_LOG("Set connect info: %s,%s,%s,%s,%s,%s,%s,%d", -+ g_debug("Set connect info: %s,%s,%s,%s,%s,%s,%s,%d", - host, ghost, gport, gtlsport ? gtlsport : "-1", transport, unixsock, user, port); - - g_free(priv->host); -diff --git a/src/virt-viewer-auth.c b/src/virt-viewer-auth.c -index 79c8589..1fb670d 100644 ---- a/src/virt-viewer-auth.c -+++ b/src/virt-viewer-auth.c -@@ -106,7 +106,7 @@ virt_viewer_auth_vnc_credentials(VirtViewerSession *session, - gboolean wantPassword = FALSE, wantUsername = FALSE; - int i; - -- DEBUG_LOG("Got VNC credential request for %d credential(s)", credList->n_values); -+ g_debug("Got VNC credential request for %d credential(s)", credList->n_values); - - for (i = 0 ; i < credList->n_values ; i++) { - GValue *cred = g_value_array_get_nth(credList, i); -@@ -120,7 +120,7 @@ virt_viewer_auth_vnc_credentials(VirtViewerSession *session, - case VNC_DISPLAY_CREDENTIAL_CLIENTNAME: - break; - default: -- DEBUG_LOG("Unsupported credential type %d", g_value_get_enum(cred)); -+ g_debug("Unsupported credential type %d", g_value_get_enum(cred)); - vnc_display_close(VNC_DISPLAY(vnc)); - goto cleanup; - } -@@ -158,7 +158,7 @@ virt_viewer_auth_vnc_credentials(VirtViewerSession *session, - vnc_display_set_credential(VNC_DISPLAY(vnc), - g_value_get_enum(cred), - username)) { -- DEBUG_LOG("Failed to set credential type %d", g_value_get_enum(cred)); -+ g_debug("Failed to set credential type %d", g_value_get_enum(cred)); - vnc_display_close(VNC_DISPLAY(vnc)); - } - break; -@@ -167,7 +167,7 @@ virt_viewer_auth_vnc_credentials(VirtViewerSession *session, - vnc_display_set_credential(VNC_DISPLAY(vnc), - g_value_get_enum(cred), - password)) { -- DEBUG_LOG("Failed to set credential type %d", g_value_get_enum(cred)); -+ g_debug("Failed to set credential type %d", g_value_get_enum(cred)); - vnc_display_close(VNC_DISPLAY(vnc)); - } - break; -@@ -175,12 +175,12 @@ virt_viewer_auth_vnc_credentials(VirtViewerSession *session, - if (vnc_display_set_credential(VNC_DISPLAY(vnc), - g_value_get_enum(cred), - "libvirt")) { -- DEBUG_LOG("Failed to set credential type %d", g_value_get_enum(cred)); -+ g_debug("Failed to set credential type %d", g_value_get_enum(cred)); - vnc_display_close(VNC_DISPLAY(vnc)); - } - break; - default: -- DEBUG_LOG("Unsupported credential type %d", g_value_get_enum(cred)); -+ g_debug("Unsupported credential type %d", g_value_get_enum(cred)); - vnc_display_close(VNC_DISPLAY(vnc)); - } - } -diff --git a/src/virt-viewer-display-vnc.c b/src/virt-viewer-display-vnc.c -index 32119bc..2222158 100644 ---- a/src/virt-viewer-display-vnc.c -+++ b/src/virt-viewer-display-vnc.c -@@ -150,7 +150,7 @@ virt_viewer_display_vnc_resize_desktop(VncDisplay *vnc G_GNUC_UNUSED, - int width, int height, - VirtViewerDisplay *display) - { -- DEBUG_LOG("desktop resize %dx%d", width, height); -+ g_debug("desktop resize %dx%d", width, height); - - virt_viewer_display_set_desktop_size(display, width, height); - } -diff --git a/src/virt-viewer-display.c b/src/virt-viewer-display.c -index 52e6962..c5170c4 100644 ---- a/src/virt-viewer-display.c -+++ b/src/virt-viewer-display.c -@@ -429,7 +429,7 @@ virt_viewer_display_size_request(GtkWidget *widget, - requisition->height = 50; - } - -- DEBUG_LOG("Display size request %dx%d (desktop %dx%d)", -+ g_debug("Display size request %dx%d (desktop %dx%d)", - requisition->width, requisition->height, - priv->desktopWidth, priv->desktopHeight); - } -@@ -512,7 +512,7 @@ virt_viewer_display_size_allocate(GtkWidget *widget, - double actualAspect; - GtkWidget *child = gtk_bin_get_child(bin); - -- DEBUG_LOG("Allocated %dx%d", allocation->width, allocation->height); -+ g_debug("Allocated %dx%d", allocation->width, allocation->height); - gtk_widget_set_allocation(widget, allocation); - - if (priv->desktopWidth == 0 || -@@ -543,7 +543,7 @@ virt_viewer_display_size_allocate(GtkWidget *widget, - child_allocation.x = 0.5 * (width - child_allocation.width) + allocation->x + border_width; - child_allocation.y = 0.5 * (height - child_allocation.height) + allocation->y + border_width; - -- DEBUG_LOG("Child allocate %dx%d", child_allocation.width, child_allocation.height); -+ g_debug("Child allocate %dx%d", child_allocation.width, child_allocation.height); - gtk_widget_size_allocate(child, &child_allocation); - } - -diff --git a/src/virt-viewer-events.c b/src/virt-viewer-events.c -index 6d7fe9e..f7ad3a7 100644 ---- a/src/virt-viewer-events.c -+++ b/src/virt-viewer-events.c -@@ -67,7 +67,7 @@ virt_viewer_events_dispatch_handle(GIOChannel *source G_GNUC_UNUSED, - if (condition & G_IO_ERR) - events |= VIR_EVENT_HANDLE_ERROR; - -- DEBUG_LOG("Dispatch handler %d %d %p", data->fd, events, data->opaque); -+ g_debug("Dispatch handler %d %d %p", data->fd, events, data->opaque); - - (data->cb)(data->watch, data->fd, events, data->opaque); - -@@ -100,14 +100,14 @@ int virt_viewer_events_add_handle(int fd, - data->cb = cb; - data->opaque = opaque; - #ifdef G_OS_WIN32 -- DEBUG_LOG("Converted fd %d to handle %d", fd, _get_osfhandle(fd)); -+ g_debug("Converted fd %d to handle %d", fd, _get_osfhandle(fd)); - data->channel = g_io_channel_win32_new_socket(_get_osfhandle(fd)); - #else - data->channel = g_io_channel_unix_new(fd); - #endif - data->ff = ff; - -- DEBUG_LOG("Add handle %d %d %p", data->fd, events, data->opaque); -+ g_debug("Add handle %d %d %p", data->fd, events, data->opaque); - - data->source = g_io_add_watch(data->channel, - cond, -@@ -137,7 +137,7 @@ virt_viewer_events_update_handle(int watch, - struct virt_viewer_events_handle *data = virt_viewer_events_find_handle(watch); - - if (!data) { -- DEBUG_LOG("Update for missing handle watch %d", watch); -+ g_debug("Update for missing handle watch %d", watch); - return; - } - -@@ -175,7 +175,7 @@ virt_viewer_events_cleanup_handle(gpointer user_data) - { - struct virt_viewer_events_handle *data = user_data; - -- DEBUG_LOG("Cleanup of handle %p", data); -+ g_debug("Cleanup of handle %p", data); - g_return_val_if_fail(data != NULL, FALSE); - - if (data->ff) -@@ -192,11 +192,11 @@ virt_viewer_events_remove_handle(int watch) - struct virt_viewer_events_handle *data = virt_viewer_events_find_handle(watch); - - if (!data) { -- DEBUG_LOG("Remove of missing watch %d", watch); -+ g_debug("Remove of missing watch %d", watch); - return -1; - } - -- DEBUG_LOG("Remove handle %d %d", watch, data->fd); -+ g_debug("Remove handle %d %d", watch, data->fd); - - if (!data->source) - return -1; -@@ -228,7 +228,7 @@ static gboolean - virt_viewer_events_dispatch_timeout(void *opaque) - { - struct virt_viewer_events_timeout *data = opaque; -- DEBUG_LOG("Dispatch timeout %p %p %d %p", data, data->cb, data->timer, data->opaque); -+ g_debug("Dispatch timeout %p %p %d %p", data, data->cb, data->timer, data->opaque); - (data->cb)(data->timer, data->opaque); - - return TRUE; -@@ -258,7 +258,7 @@ virt_viewer_events_add_timeout(int interval, - - timeouts[ntimeouts++] = data; - -- DEBUG_LOG("Add timeout %p %d %p %p %d", data, interval, cb, opaque, data->timer); -+ g_debug("Add timeout %p %d %p %p %d", data, interval, cb, opaque, data->timer); - - return data->timer; - } -@@ -283,11 +283,11 @@ virt_viewer_events_update_timeout(int timer, - struct virt_viewer_events_timeout *data = virt_viewer_events_find_timeout(timer); - - if (!data) { -- DEBUG_LOG("Update of missing timer %d", timer); -+ g_debug("Update of missing timer %d", timer); - return; - } - -- DEBUG_LOG("Update timeout %p %d %d", data, timer, interval); -+ g_debug("Update timeout %p %d %d", data, timer, interval); - - if (interval >= 0) { - if (data->source) -@@ -312,7 +312,7 @@ virt_viewer_events_cleanup_timeout(gpointer user_data) - { - struct virt_viewer_events_timeout *data = user_data; - -- DEBUG_LOG("Cleanup of timeout %p", data); -+ g_debug("Cleanup of timeout %p", data); - g_return_val_if_fail(data != NULL, FALSE); - - if (data->ff) -@@ -329,11 +329,11 @@ virt_viewer_events_remove_timeout(int timer) - struct virt_viewer_events_timeout *data = virt_viewer_events_find_timeout(timer); - - if (!data) { -- DEBUG_LOG("Remove of missing timer %d", timer); -+ g_debug("Remove of missing timer %d", timer); - return -1; - } - -- DEBUG_LOG("Remove timeout %p %d", data, timer); -+ g_debug("Remove timeout %p %d", data, timer); - - if (!data->source) - return -1; -diff --git a/src/virt-viewer-notebook.c b/src/virt-viewer-notebook.c -index cc7136b..07497e3 100644 ---- a/src/virt-viewer-notebook.c -+++ b/src/virt-viewer-notebook.c -@@ -98,7 +98,7 @@ virt_viewer_notebook_show_status_va(VirtViewerNotebook *self, const gchar *fmt, - VirtViewerNotebookPrivate *priv; - gchar *text; - -- DEBUG_LOG("notebook show status %p", self); -+ g_debug("notebook show status %p", self); - g_return_if_fail(VIRT_VIEWER_IS_NOTEBOOK(self)); - - text = g_strdup_vprintf(fmt, args); -@@ -126,12 +126,12 @@ virt_viewer_notebook_show_display(VirtViewerNotebook *self) - { - GtkWidget *display; - -- DEBUG_LOG("notebook show display %p", self); -+ g_debug("notebook show display %p", self); - g_return_if_fail(VIRT_VIEWER_IS_NOTEBOOK(self)); - - display = gtk_notebook_get_nth_page(GTK_NOTEBOOK(self), 1); - if (display == NULL) -- DEBUG_LOG("FIXME: showing display although it's not ready yet"); -+ g_debug("FIXME: showing display although it's not ready yet"); - else - gtk_widget_grab_focus(display); - -diff --git a/src/virt-viewer-session-spice.c b/src/virt-viewer-session-spice.c -index d87fcd7..fedde18 100644 ---- a/src/virt-viewer-session-spice.c -+++ b/src/virt-viewer-session-spice.c -@@ -409,7 +409,7 @@ fill_session(VirtViewerFile *file, SpiceSession *session) - } - - if (virt_viewer_file_is_set(file, "disable-channels")) { -- DEBUG_LOG("FIXME: disable-channels is not supported atm"); -+ g_debug("FIXME: disable-channels is not supported atm"); - } - } - -@@ -478,21 +478,21 @@ virt_viewer_session_spice_main_channel_event(SpiceChannel *channel G_GNUC_UNUSED - - switch (event) { - case SPICE_CHANNEL_OPENED: -- DEBUG_LOG("main channel: opened"); -+ g_debug("main channel: opened"); - g_signal_emit_by_name(session, "session-connected"); - break; - case SPICE_CHANNEL_CLOSED: -- DEBUG_LOG("main channel: closed"); -+ g_debug("main channel: closed"); - /* Ensure the other channels get closed too */ - virt_viewer_session_clear_displays(session); - if (self->priv->session) - spice_session_disconnect(self->priv->session); - break; - case SPICE_CHANNEL_SWITCHING: -- DEBUG_LOG("main channel: switching host"); -+ g_debug("main channel: switching host"); - break; - case SPICE_CHANNEL_ERROR_AUTH: -- DEBUG_LOG("main channel: auth failure (wrong password?)"); -+ g_debug("main channel: auth failure (wrong password?)"); - - if (self->priv->pass_try > 0) - g_signal_emit_by_name(session, "session-auth-failed", -@@ -518,7 +518,7 @@ virt_viewer_session_spice_main_channel_event(SpiceChannel *channel G_GNUC_UNUSED - } - break; - case SPICE_CHANNEL_ERROR_CONNECT: -- DEBUG_LOG("main channel: failed to connect"); -+ g_debug("main channel: failed to connect"); - g_signal_emit_by_name(session, "session-disconnected"); - break; - case SPICE_CHANNEL_ERROR_IO: -@@ -591,7 +591,7 @@ destroy_display(gpointer data) - VirtViewerDisplay *display = VIRT_VIEWER_DISPLAY(data); - VirtViewerSession *session = virt_viewer_display_get_session(display); - -- DEBUG_LOG("Destroying spice display %p", display); -+ g_debug("Destroying spice display %p", display); - virt_viewer_session_remove_display(session, display); - g_object_unref(display); - } -@@ -627,7 +627,7 @@ virt_viewer_session_spice_display_monitors(SpiceChannel *channel, - display = g_ptr_array_index(displays, i); - if (display == NULL) { - display = virt_viewer_display_spice_new(self, channel, i); -- DEBUG_LOG("creating spice display (#:%d)", i); -+ g_debug("creating spice display (#:%d)", i); - g_ptr_array_index(displays, i) = g_object_ref(display); - } - -@@ -667,7 +667,7 @@ virt_viewer_session_spice_channel_new(SpiceSession *s, - - g_object_get(channel, "channel-id", &id, NULL); - -- DEBUG_LOG("New spice channel %p %s %d", channel, g_type_name(G_OBJECT_TYPE(channel)), id); -+ g_debug("New spice channel %p %s %d", channel, g_type_name(G_OBJECT_TYPE(channel)), id); - - if (SPICE_IS_MAIN_CHANNEL(channel)) { - if (self->priv->main_channel != NULL) -@@ -695,17 +695,17 @@ virt_viewer_session_spice_channel_new(SpiceSession *s, - } - - if (SPICE_IS_INPUTS_CHANNEL(channel)) { -- DEBUG_LOG("new inputs channel"); -+ g_debug("new inputs channel"); - } - - if (SPICE_IS_PLAYBACK_CHANNEL(channel)) { -- DEBUG_LOG("new audio channel"); -+ g_debug("new audio channel"); - if (self->priv->audio == NULL) - self->priv->audio = spice_audio_get(s, NULL); - } - - if (SPICE_IS_USBREDIR_CHANNEL(channel)) { -- DEBUG_LOG("new usbredir channel"); -+ g_debug("new usbredir channel"); - self->priv->usbredir_channel_count++; - if (spice_usb_device_manager_get(self->priv->session, NULL)) - virt_viewer_session_set_has_usbredir(session, TRUE); -@@ -736,7 +736,7 @@ virt_viewer_session_spice_fullscreen_auto_conf(VirtViewerSessionSpice *self) - /* only do auto-conf once at startup. Avoid repeating auto-conf later due to - * agent disconnection/re-connection, etc */ - if (self->priv->did_auto_conf) { -- DEBUG_LOG("Already did auto-conf, skipping"); -+ g_debug("Already did auto-conf, skipping"); - return FALSE; - } - -@@ -744,16 +744,16 @@ virt_viewer_session_spice_fullscreen_auto_conf(VirtViewerSessionSpice *self) - g_return_val_if_fail(VIRT_VIEWER_IS_APP(app), TRUE); - - if (!virt_viewer_app_get_fullscreen(app)) { -- DEBUG_LOG("app is not in full screen"); -+ g_debug("app is not in full screen"); - return FALSE; - } - if (cmain == NULL) { -- DEBUG_LOG("no main channel yet"); -+ g_debug("no main channel yet"); - return FALSE; - } - g_object_get(cmain, "agent-connected", &agent_connected, NULL); - if (!agent_connected) { -- DEBUG_LOG("Agent not connected, skipping autoconf"); -+ g_debug("Agent not connected, skipping autoconf"); - g_signal_connect(cmain, "notify::agent-connected", G_CALLBACK(property_notify_do_auto_conf), self); - return FALSE; - } -@@ -761,12 +761,12 @@ virt_viewer_session_spice_fullscreen_auto_conf(VirtViewerSessionSpice *self) - spice_main_set_display_enabled(cmain, -1, FALSE); - - ndisplays = virt_viewer_app_get_n_initial_displays(app); -- DEBUG_LOG("Performing full screen auto-conf, %zd host monitors", ndisplays); -+ g_debug("Performing full screen auto-conf, %zd host monitors", ndisplays); - - for (i = 0; i < ndisplays; i++) { - gint j = virt_viewer_app_get_initial_monitor_for_display(app, i); - gdk_screen_get_monitor_geometry(screen, j, &dest); -- DEBUG_LOG("Set SPICE display %d to (%d,%d)-(%dx%d)", -+ g_debug("Set SPICE display %d to (%d,%d)-(%dx%d)", - i, dest.x, dest.y, dest.width, dest.height); - spice_main_set_display(cmain, i, dest.x, dest.y, dest.width, dest.height); - spice_main_set_display_enabled(cmain, i, TRUE); -@@ -788,26 +788,26 @@ virt_viewer_session_spice_channel_destroy(G_GNUC_UNUSED SpiceSession *s, - g_return_if_fail(self != NULL); - - g_object_get(channel, "channel-id", &id, NULL); -- DEBUG_LOG("Destroy SPICE channel %s %d", g_type_name(G_OBJECT_TYPE(channel)), id); -+ g_debug("Destroy SPICE channel %s %d", g_type_name(G_OBJECT_TYPE(channel)), id); - - if (SPICE_IS_MAIN_CHANNEL(channel)) { -- DEBUG_LOG("zap main channel"); -+ g_debug("zap main channel"); - if (channel == SPICE_CHANNEL(self->priv->main_channel)) - self->priv->main_channel = NULL; - } - - if (SPICE_IS_DISPLAY_CHANNEL(channel)) { -- DEBUG_LOG("zap display channel (#%d)", id); -+ g_debug("zap display channel (#%d)", id); - g_object_set_data(G_OBJECT(channel), "virt-viewer-displays", NULL); - } - - if (SPICE_IS_PLAYBACK_CHANNEL(channel) && self->priv->audio) { -- DEBUG_LOG("zap audio channel"); -+ g_debug("zap audio channel"); - self->priv->audio = NULL; - } - - if (SPICE_IS_USBREDIR_CHANNEL(channel)) { -- DEBUG_LOG("zap usbredir channel"); -+ g_debug("zap usbredir channel"); - self->priv->usbredir_channel_count--; - if (self->priv->usbredir_channel_count == 0) - virt_viewer_session_set_has_usbredir(session, FALSE); -diff --git a/src/virt-viewer-session-vnc.c b/src/virt-viewer-session-vnc.c -index 50fa11f..545caaa 100644 ---- a/src/virt-viewer-session-vnc.c -+++ b/src/virt-viewer-session-vnc.c -@@ -114,7 +114,7 @@ virt_viewer_session_vnc_disconnected(VncDisplay *vnc G_GNUC_UNUSED, - - virt_viewer_session_clear_displays(VIRT_VIEWER_SESSION(session)); - display = virt_viewer_display_vnc_new(session->priv->vnc); -- DEBUG_LOG("Disconnected"); -+ g_debug("Disconnected"); - g_signal_emit_by_name(session, "session-disconnected"); - virt_viewer_display_set_show_hint(VIRT_VIEWER_DISPLAY(display), - VIRT_VIEWER_DISPLAY_SHOW_HINT_READY, FALSE); -@@ -275,7 +275,7 @@ virt_viewer_session_vnc_close(VirtViewerSession* session) - - g_return_if_fail(self != NULL); - -- DEBUG_LOG("close vnc=%p", self->priv->vnc); -+ g_debug("close vnc=%p", self->priv->vnc); - if (self->priv->vnc != NULL) { - virt_viewer_session_clear_displays(session); - vnc_display_close(self->priv->vnc); -diff --git a/src/virt-viewer-util.h b/src/virt-viewer-util.h -index 8157df5..4f40116 100644 ---- a/src/virt-viewer-util.h -+++ b/src/virt-viewer-util.h -@@ -32,7 +32,6 @@ enum { - VIRT_VIEWER_ERROR_FAILED, - }; - --#define DEBUG_LOG(s, ...) do { if (doDebug) g_debug(s, ## __VA_ARGS__); } while (0) - #define ARRAY_CARDINALITY(Array) (sizeof (Array) / sizeof *(Array)) - - #define VIRT_VIEWER_ERROR virt_viewer_error_quark () -diff --git a/src/virt-viewer-window.c b/src/virt-viewer-window.c -index b44c5cb..22326e8 100644 ---- a/src/virt-viewer-window.c -+++ b/src/virt-viewer-window.c -@@ -169,7 +169,7 @@ virt_viewer_window_dispose (GObject *object) - priv->display = NULL; - } - -- DEBUG_LOG("Disposing window %p\n", object); -+ g_debug("Disposing window %p\n", object); - - if (priv->window) { - gtk_widget_destroy(priv->window); -@@ -412,9 +412,9 @@ virt_viewer_window_resize(VirtViewerWindow *self, gboolean keep_win_size) - if (priv->fullscreen) - return; - -- DEBUG_LOG("Preparing main window resize"); -+ g_debug("Preparing main window resize"); - if (!priv->display) { -- DEBUG_LOG("Skipping inactive resize"); -+ g_debug("Skipping inactive resize"); - return; - } - -@@ -454,7 +454,7 @@ virt_viewer_window_resize(VirtViewerWindow *self, gboolean keep_win_size) - height = desktopHeight; - } - -- DEBUG_LOG("Decided todo %dx%d (desktop is %dx%d, fullscreen is %dx%d", -+ g_debug("Decided todo %dx%d (desktop is %dx%d, fullscreen is %dx%d", - width, height, desktopWidth, desktopHeight, - fullscreen.width, fullscreen.height); - -@@ -809,7 +809,7 @@ virt_viewer_window_delete(GtkWidget *src G_GNUC_UNUSED, - void *dummy G_GNUC_UNUSED, - VirtViewerWindow *self) - { -- DEBUG_LOG("Window closed"); -+ g_debug("Window closed"); - virt_viewer_app_maybe_quit(self->priv->app, self); - return TRUE; - } -@@ -1152,7 +1152,7 @@ virt_viewer_window_update_title(VirtViewerWindow *self) - gtk_accel_map_lookup_entry("/view/release-cursor", &key); - - if (key.accel_key || key.accel_mods) { -- DEBUG_LOG("release-cursor accel key: key=%u, mods=%x, flags=%u", key.accel_key, key.accel_mods, key.accel_flags); -+ g_debug("release-cursor accel key: key=%u, mods=%x, flags=%u", key.accel_key, key.accel_mods, key.accel_flags); - label = gtk_accelerator_get_label(key.accel_key, key.accel_mods); - } else { - label = g_strdup(_("Ctrl+Alt")); -diff --git a/src/virt-viewer.c b/src/virt-viewer.c -index e1553fd..01a9a51 100644 ---- a/src/virt-viewer.c -+++ b/src/virt-viewer.c -@@ -126,7 +126,7 @@ virt_viewer_deactivated(VirtViewerApp *app, gboolean connect_error) - - if (priv->reconnect) { - if (!priv->withEvents) { -- DEBUG_LOG("No domain events, falling back to polling"); -+ g_debug("No domain events, falling back to polling"); - virt_viewer_app_start_reconnect_poll(app); - } - -@@ -345,9 +345,9 @@ virt_viewer_extract_connect_info(VirtViewer *self, - } - - if (ghost && gport) -- DEBUG_LOG("Guest graphics address is %s:%s", ghost, gport); -+ g_debug("Guest graphics address is %s:%s", ghost, gport); - else if (unixsock) -- DEBUG_LOG("Guest graphics address is %s", unixsock); -+ g_debug("Guest graphics address is %s", unixsock); - - uri = virConnectGetURI(priv->conn); - if (virt_viewer_util_extract_host(uri, NULL, &host, &transport, &user, &port) < 0) { -@@ -370,7 +370,7 @@ virt_viewer_extract_connect_info(VirtViewer *self, - } else { - replacement_host = g_strdup(host); - } -- DEBUG_LOG("Guest graphics listen '%s' is NULL or a wildcard, replacing with '%s'", -+ g_debug("Guest graphics listen '%s' is NULL or a wildcard, replacing with '%s'", - ghost ? ghost : "", replacement_host); - g_free(ghost); - ghost = replacement_host; -@@ -438,7 +438,7 @@ virt_viewer_open_connection(VirtViewerApp *self G_GNUC_UNUSED, int *fd) - if (virDomainOpenGraphics(priv->dom, 0, pair[0], - VIR_DOMAIN_OPEN_GRAPHICS_SKIPAUTH) < 0) { - virErrorPtr err = virGetLastError(); -- DEBUG_LOG("Error %s", err && err->message ? err->message : "Unknown"); -+ g_debug("Error %s", err && err->message ? err->message : "Unknown"); - close(pair[0]); - close(pair[1]); - return TRUE; -@@ -460,7 +460,7 @@ virt_viewer_domain_event(virConnectPtr conn G_GNUC_UNUSED, - VirtViewerApp *app = VIRT_VIEWER_APP(self); - GError *error = NULL; - -- DEBUG_LOG("Got domain event %d %d", event, detail); -+ g_debug("Got domain event %d %d", event, detail); - - if (!virt_viewer_matches_domain(self, dom)) - return 0; -@@ -494,7 +494,7 @@ virt_viewer_conn_event(virConnectPtr conn G_GNUC_UNUSED, - VirtViewerApp *app = VIRT_VIEWER_APP(self); - VirtViewerPrivate *priv = self->priv; - -- DEBUG_LOG("Got connection event %d", reason); -+ g_debug("Got connection event %d", reason); - - virConnectClose(priv->conn); - priv->conn = NULL; -@@ -532,7 +532,7 @@ virt_viewer_initial_connect(VirtViewerApp *app, GError **error) - VirtViewerPrivate *priv = self->priv; - char uuid_string[VIR_UUID_STRING_BUFLEN]; - -- DEBUG_LOG("initial connect"); -+ g_debug("initial connect"); - - if (!priv->conn && - virt_viewer_connect(app) < 0) { -@@ -551,20 +551,20 @@ virt_viewer_initial_connect(VirtViewerApp *app, GError **error) - } else { - virt_viewer_app_simple_message_dialog(app, _("Cannot find guest domain %s"), - priv->domkey); -- DEBUG_LOG("Cannot find guest %s", priv->domkey); -+ g_debug("Cannot find guest %s", priv->domkey); - goto cleanup; - } - } - - if (virDomainGetUUIDString(dom, uuid_string) < 0) { -- DEBUG_LOG("Couldn't get uuid from libvirt"); -+ g_debug("Couldn't get uuid from libvirt"); - } else { - virt_viewer_app_set_uuid_string(app, uuid_string); - } - - virt_viewer_app_show_status(app, _("Checking guest domain status")); - if (virDomainGetInfo(dom, &info) < 0) { -- DEBUG_LOG("Cannot get guest state"); -+ g_debug("Cannot get guest state"); - goto cleanup; - } - -@@ -580,7 +580,7 @@ virt_viewer_initial_connect(VirtViewerApp *app, GError **error) - virt_viewer_app_trace(app, "Guest %s has not activated its display yet, waiting for it to start", - priv->domkey); - } else { -- DEBUG_LOG("Failed to activate viewer"); -+ g_debug("Failed to activate viewer"); - goto cleanup; - } - } -@@ -613,7 +613,7 @@ virt_viewer_auth_libvirt_credentials(virConnectCredentialPtr cred, - int i; - int ret = -1; - -- DEBUG_LOG("Got libvirt credential request for %d credential(s)", ncred); -+ g_debug("Got libvirt credential request for %d credential(s)", ncred); - - for (i = 0 ; i < ncred ; i++) { - switch (cred[i].type) { -@@ -625,7 +625,7 @@ virt_viewer_auth_libvirt_credentials(virConnectCredentialPtr cred, - password = &cred[i].result; - break; - default: -- DEBUG_LOG("Unsupported libvirt credential %d", cred[i].type); -+ g_debug("Unsupported libvirt credential %d", cred[i].type); - return -1; - } - } -@@ -652,13 +652,13 @@ virt_viewer_auth_libvirt_credentials(virConnectCredentialPtr cred, - cred[i].resultlen = strlen(cred[i].result); - else - cred[i].resultlen = 0; -- DEBUG_LOG("Got '%s' %d %d", cred[i].result, cred[i].resultlen, cred[i].type); -+ g_debug("Got '%s' %d %d", cred[i].result, cred[i].resultlen, cred[i].type); - break; - } - } - - cleanup: -- DEBUG_LOG("Return %d", ret); -+ g_debug("Return %d", ret); - return ret; - } - -@@ -681,7 +681,7 @@ virt_viewer_connect(VirtViewerApp *app) - if (!virt_viewer_app_get_attach(app)) - oflags |= VIR_CONNECT_RO; - -- DEBUG_LOG("connecting ..."); -+ g_debug("connecting ..."); - - virt_viewer_app_trace(app, "Opening connection to libvirt with URI %s", - priv->uri ? priv->uri : ""); -@@ -712,7 +712,7 @@ virt_viewer_connect(VirtViewerApp *app) - - if (!priv->withEvents && - !virt_viewer_app_is_active(app)) { -- DEBUG_LOG("No domain events, falling back to polling"); -+ g_debug("No domain events, falling back to polling"); - virt_viewer_app_start_reconnect_poll(app); - } - -@@ -720,7 +720,7 @@ virt_viewer_connect(VirtViewerApp *app) - virt_viewer_conn_event, - self, - NULL) < 0) { -- DEBUG_LOG("Unable to register close callback on libvirt connection"); -+ g_debug("Unable to register close callback on libvirt connection"); - } - - return 0; diff --git a/SOURCES/0024-virt-viewer-app-Set-hotkeys-when-app-is-constructed.patch b/SOURCES/0024-virt-viewer-app-Set-hotkeys-when-app-is-constructed.patch new file mode 100644 index 0000000..a855262 --- /dev/null +++ b/SOURCES/0024-virt-viewer-app-Set-hotkeys-when-app-is-constructed.patch @@ -0,0 +1,35 @@ +From 354e7a492e0e12a6f646cd1cc99ebec352ecc880 Mon Sep 17 00:00:00 2001 +From: Pavel Grunt +Date: Sat, 28 Mar 2015 14:26:47 +0100 +Subject: [PATCH] virt-viewer-app: Set hotkeys when app is constructed + +virt_viewer_app_set_hotkeys() calls virt_viewer_app_set_enable_accel() +which notify the display about "enable-accel". However the display +begins to exist after the virt_viewer_app initialization. + +Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1206106 +(cherry picked from commit a66a8fbc9295a730a735378b3bb7b7e52ea7e360) +--- + src/virt-viewer-app.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/src/virt-viewer-app.c b/src/virt-viewer-app.c +index f6d9869..d7a8e56 100644 +--- a/src/virt-viewer-app.c ++++ b/src/virt-viewer-app.c +@@ -1739,7 +1739,6 @@ virt_viewer_app_init(VirtViewerApp *self) + gtk_window_set_default_icon_name("virt-viewer"); + virt_viewer_app_set_debug(opt_debug); + virt_viewer_app_set_fullscreen(self, opt_fullscreen); +- virt_viewer_app_set_hotkeys(self, opt_hotkeys); + + self->priv->displays = g_hash_table_new_full(g_direct_hash, g_direct_equal, NULL, g_object_unref); + self->priv->config = g_key_file_new(); +@@ -1830,6 +1829,7 @@ virt_viewer_app_constructed(GObject *object) + self->priv->main_notebook = GTK_WIDGET(virt_viewer_window_get_notebook(self->priv->main_window)); + + virt_viewer_app_set_kiosk(self, opt_kiosk); ++ virt_viewer_app_set_hotkeys(self, opt_hotkeys); + virt_viewer_window_set_zoom_level(self->priv->main_window, opt_zoom); + + virt_viewer_set_insert_smartcard_accel(self, GDK_F8, GDK_SHIFT_MASK); diff --git a/SOURCES/0025-Revert-virt-viewer-main-Require-domain-name-as-argum.patch b/SOURCES/0025-Revert-virt-viewer-main-Require-domain-name-as-argum.patch new file mode 100644 index 0000000..de29846 --- /dev/null +++ b/SOURCES/0025-Revert-virt-viewer-main-Require-domain-name-as-argum.patch @@ -0,0 +1,60 @@ +From 4ebcb79691cdc0d4947a130d77ba6d481e583291 Mon Sep 17 00:00:00 2001 +From: Pavel Grunt +Date: Tue, 14 Apr 2015 16:22:37 +0200 +Subject: [PATCH] Revert "virt-viewer-main: Require domain name as argument for + '--wait'" + +This reverts commit a830275344c88aef12166661b68ea2b4429c7212. + +Commit a830275344c88aef12166661b68ea2b4429c7212 required the domain +name to be placed just after the '--wait' option. It broke the +command line api, because running 'virt-viewer $vm --wait' was considered +as the error. + +Related: rhbz#1209398, rhbz#1211573 +(cherry picked from commit d71c2a673db4f647ff961fbd1add64216dd84c03) +--- + src/virt-viewer-main.c | 9 ++++----- + 1 file changed, 4 insertions(+), 5 deletions(-) + +diff --git a/src/virt-viewer-main.c b/src/virt-viewer-main.c +index 7f6e851..3fae955 100644 +--- a/src/virt-viewer-main.c ++++ b/src/virt-viewer-main.c +@@ -50,7 +50,7 @@ int main(int argc, char **argv) + gchar **args = NULL; + gboolean direct = FALSE; + gboolean attach = FALSE; +- char *waitvm = NULL; ++ gboolean waitvm = FALSE; + gboolean reconnect = FALSE; + VirtViewer *viewer = NULL; + char *base_name; +@@ -64,8 +64,8 @@ int main(int argc, char **argv) + N_("Attach to the local display using libvirt"), NULL }, + { "connect", 'c', 0, G_OPTION_ARG_STRING, &uri, + N_("Connect to hypervisor"), "URI"}, +- { "wait", 'w', 0, G_OPTION_ARG_STRING, &waitvm, +- N_("Wait for domain to start"), "DOMAIN-NAME|ID|UUID" }, ++ { "wait", 'w', 0, G_OPTION_ARG_NONE, &waitvm, ++ N_("Wait for domain to start"), NULL }, + { "reconnect", 'r', 0, G_OPTION_ARG_NONE, &reconnect, + N_("Reconnect to domain upon restart"), NULL }, + { G_OPTION_REMAINING, '\0', 0, G_OPTION_ARG_STRING_ARRAY, &args, +@@ -109,7 +109,7 @@ int main(int argc, char **argv) + goto cleanup; + } + +- viewer = virt_viewer_new(uri, (args) ? args[0] : waitvm, direct, attach, waitvm != NULL, reconnect); ++ viewer = virt_viewer_new(uri, (args) ? args[0] : NULL, direct, attach, waitvm, reconnect); + if (viewer == NULL) + goto cleanup; + +@@ -124,7 +124,6 @@ int main(int argc, char **argv) + if (viewer) + g_object_unref(viewer); + g_free(uri); +- g_free(waitvm); + g_strfreev(args); + g_free(help_msg); + diff --git a/SOURCES/0025-kiosk-don-t-attempt-to-hide-windows-when-disconnecti.patch b/SOURCES/0025-kiosk-don-t-attempt-to-hide-windows-when-disconnecti.patch deleted file mode 100644 index d5d32e5..0000000 --- a/SOURCES/0025-kiosk-don-t-attempt-to-hide-windows-when-disconnecti.patch +++ /dev/null @@ -1,28 +0,0 @@ -From b9b188ca00aa60e4ebf35bde4dba68f75c0ae226 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= -Date: Tue, 10 Jun 2014 15:14:20 +0300 -Subject: [PATCH] kiosk: don't attempt to hide windows when disconnecting - -Get rid of the following warning: -(virt-viewer:7262): virt-viewer-WARNING **: Can't hide windows in kiosk mode - -https://bugzilla.redhat.com/show_bug.cgi?id=1107518 ---- - src/virt-viewer-app.c | 4 +++- - 1 file changed, 3 insertions(+), 1 deletion(-) - -diff --git a/src/virt-viewer-app.c b/src/virt-viewer-app.c -index e584e9b..956aecb 100644 ---- a/src/virt-viewer-app.c -+++ b/src/virt-viewer-app.c -@@ -1304,7 +1304,9 @@ virt_viewer_app_disconnected(VirtViewerSession *session G_GNUC_UNUSED, - VirtViewerAppPrivate *priv = self->priv; - gboolean connect_error = !priv->connected && !priv->cancelled; - -- virt_viewer_app_hide_all_windows(self); -+ if (!priv->kiosk) -+ virt_viewer_app_hide_all_windows(self); -+ - if (priv->quitting) - gtk_main_quit(); - diff --git a/SOURCES/0026-Use-a-custom-log-handler-to-silence-debug-messages.patch b/SOURCES/0026-Use-a-custom-log-handler-to-silence-debug-messages.patch deleted file mode 100644 index 4f062f8..0000000 --- a/SOURCES/0026-Use-a-custom-log-handler-to-silence-debug-messages.patch +++ /dev/null @@ -1,49 +0,0 @@ -From c1e2e3603e5d76e6fd78a8a2d26d42acc1afd99f Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= -Date: Tue, 10 Jun 2014 17:37:33 +0200 -Subject: [PATCH] Use a custom log handler to silence debug messages - -On RHEL6, with old glib, all g_log messages are printed. -Filter the messages with a custom handler instead. - -https://bugzilla.redhat.com/show_bug.cgi?id=1107518 - -util: fix glib_check_version() condition - -glib_check_version() returns NULL if version is higher or equal. ---- - src/virt-viewer-util.c | 14 ++++++++++++++ - 1 file changed, 14 insertions(+) - -diff --git a/src/virt-viewer-util.c b/src/virt-viewer-util.c -index 9deddad..464a3d0 100644 ---- a/src/virt-viewer-util.c -+++ b/src/virt-viewer-util.c -@@ -273,6 +273,18 @@ gulong virt_viewer_signal_connect_object(gpointer instance, - return ctx->handler_id; - } - -+static void log_handler(const gchar *log_domain, -+ GLogLevelFlags log_level, -+ const gchar *message, -+ gpointer unused_data) -+{ -+ if (glib_check_version(2, 32, 0) != NULL) -+ if (log_level >= G_LOG_LEVEL_DEBUG && !doDebug) -+ return; -+ -+ g_log_default_handler(log_domain, log_level, message, unused_data); -+} -+ - void virt_viewer_util_init(const char *appname) - { - #ifdef G_OS_WIN32 -@@ -305,6 +317,8 @@ void virt_viewer_util_init(const char *appname) - textdomain(GETTEXT_PACKAGE); - - g_set_application_name(appname); -+ -+ g_log_set_default_handler(log_handler, NULL); - } - - static gchar * diff --git a/SOURCES/0026-virt-viewer-main-wait-should-not-be-used-without-dom.patch b/SOURCES/0026-virt-viewer-main-wait-should-not-be-used-without-dom.patch new file mode 100644 index 0000000..aa24a7c --- /dev/null +++ b/SOURCES/0026-virt-viewer-main-wait-should-not-be-used-without-dom.patch @@ -0,0 +1,35 @@ +From 5738b0b39f814b75108ce79b2fcbd6559de3701f Mon Sep 17 00:00:00 2001 +From: Pavel Grunt +Date: Tue, 14 Apr 2015 17:06:35 +0200 +Subject: [PATCH] virt-viewer-main: '--wait' should not be used without domain + name + +Commit a830275344c88aef12166661b68ea2b4429c7212 required the domain +name to be placed just after the '--wait' option. It broke the +command line api, because running 'virt-viewer $vm --wait' was considered +as the error. + +This patch rather checks whether the domain name was specified. + +Related: rhbz#1209398, rhbz#1211573 +(cherry picked from commit 69a5077a8ab99c3c83d73d81fbe1f29a46d4fdb8) +--- + src/virt-viewer-main.c | 5 +++++ + 1 file changed, 5 insertions(+) + +diff --git a/src/virt-viewer-main.c b/src/virt-viewer-main.c +index 3fae955..81d7c64 100644 +--- a/src/virt-viewer-main.c ++++ b/src/virt-viewer-main.c +@@ -109,6 +109,11 @@ int main(int argc, char **argv) + goto cleanup; + } + ++ if (args == NULL && waitvm) { ++ g_printerr(_("\nNo DOMAIN-NAME|ID|UUID was specified for '--wait'\n\n")); ++ goto cleanup; ++ } ++ + viewer = virt_viewer_new(uri, (args) ? args[0] : NULL, direct, attach, waitvm, reconnect); + if (viewer == NULL) + goto cleanup; diff --git a/SOURCES/0027-kiosk-remove-invalid-unref.patch b/SOURCES/0027-kiosk-remove-invalid-unref.patch deleted file mode 100644 index 77393d2..0000000 --- a/SOURCES/0027-kiosk-remove-invalid-unref.patch +++ /dev/null @@ -1,24 +0,0 @@ -From 5f86cca0c8e9006213e936adf9a6ea79132a052d Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= -Date: Mon, 16 Jun 2014 19:57:06 +0200 -Subject: [PATCH] kiosk: remove invalid unref - -This unref doesn't seem to be related to any reference, although it -was probably introduced in the first place to clear the floating ref, -wrongly. See following commit for a working solution. ---- - src/virt-viewer-app.c | 1 - - 1 file changed, 1 deletion(-) - -diff --git a/src/virt-viewer-app.c b/src/virt-viewer-app.c -index 956aecb..5dc7697 100644 ---- a/src/virt-viewer-app.c -+++ b/src/virt-viewer-app.c -@@ -829,7 +829,6 @@ virt_viewer_app_display_added(VirtViewerSession *session G_GNUC_UNUSED, - if (priv->kiosk) { - /* don't show extra monitors that don't fit on client */ - g_debug("kiosk mode: skip extra monitors that don't fit on client"); -- g_object_unref(display); - return; - } - diff --git a/SOURCES/0027-virt-viewer-window-Make-sure-that-minimum-zoom-level.patch b/SOURCES/0027-virt-viewer-window-Make-sure-that-minimum-zoom-level.patch new file mode 100644 index 0000000..2a8d764 --- /dev/null +++ b/SOURCES/0027-virt-viewer-window-Make-sure-that-minimum-zoom-level.patch @@ -0,0 +1,29 @@ +From 6b271d09c171304d54322a783e4e84899c2ed665 Mon Sep 17 00:00:00 2001 +From: Pavel Grunt +Date: Tue, 21 Apr 2015 18:37:16 +0200 +Subject: [PATCH] virt-viewer-window: Make sure that minimum zoom level is + lower than NORMAL_ZOOM_LEVEL + +The minimum size of the desktop is 100x100 if the minimum window size +is greater than this, the zoom level is greater than NORMAL_ZOOM_LEVEL + +related: rhbz#1206460 +(cherry picked from commit 41645a0eb594b3c847968642ee0bc13b5fc4e091) +--- + src/virt-viewer-window.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/src/virt-viewer-window.c b/src/virt-viewer-window.c +index 6a337da..7734b5d 100644 +--- a/src/virt-viewer-window.c ++++ b/src/virt-viewer-window.c +@@ -1527,7 +1527,8 @@ virt_viewer_window_get_minimal_zoom_level(VirtViewerWindow *self) + height_ratio = (double) min_height / height; + zoom = ceil(10 * MAX(width_ratio, height_ratio)); + +- return MAX(MIN_ZOOM_LEVEL, zoom * ZOOM_STEP); ++ /* make sure that the returned zoom level is in the range from MIN_ZOOM_LEVEL to NORMAL_ZOOM_LEVEL */ ++ return CLAMP(zoom * ZOOM_STEP, MIN_ZOOM_LEVEL, NORMAL_ZOOM_LEVEL); + } + + /* diff --git a/SOURCES/0028-Fix-a-floating-display-warning.patch b/SOURCES/0028-Fix-a-floating-display-warning.patch deleted file mode 100644 index b799e26..0000000 --- a/SOURCES/0028-Fix-a-floating-display-warning.patch +++ /dev/null @@ -1,60 +0,0 @@ -From 0c40a610483824f649561f9b171112aba2971519 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= -Date: Mon, 16 Jun 2014 19:55:39 +0200 -Subject: [PATCH] Fix a floating display warning - -You can reproduce the error by starting the client in kiosk and shuting -down the guest. - - #0 0x000000317e432915 in raise (sig=6) at - ../nptl/sysdeps/unix/sysv/linux/raise.c:64 - #1 0x000000317e4340f5 in abort () at abort.c:92 - #2 0x000000317fc4a98a in g_logv (log_domain=0x318730e657 "Gtk", - log_level=, format= - 0x31873a50a8 "A floating object was finalized. This means that - someone\ncalled g_object_unref() on an object that had only a - floating\nreference; the initial floating reference is not owned by - anyone\nand must be remo"..., args1=0x7fffffffd5f0) - at gmessages.c:557 - #3 0x000000317fc4aa23 in g_log (log_domain=, - log_level=, - format=) at gmessages.c:577 - #4 0x000000318717ba72 in ?? () from /usr/lib64/libgtk-x11-2.0.so.0 - #5 0x0000000000426eb5 in - virt_viewer_display_spice_finalize (obj=0x6fec20 - [VirtViewerDisplaySpice]) - at virt-viewer-display-spice.c:67 - #6 0x0000003180c106a4 in g_object_unref (_object=0x6fec20) at - gobject.c:2712 - #7 0x0000000000425b5d in destroy_display (data=0x6fec20) at - virt-viewer-session-spice.c:596 - #8 0x000000317fc1667b in g_ptr_array_foreach (array=0x74a040, - func=0x425ae7 , user_data=0x0) - at garray.c:1306 - #9 0x000000317fc16e7b in g_ptr_array_free (farray=0x74a040, - free_segment=1) at garray.c:938 - #10 0x000000317fc2906a in g_data_set_internal (datalist=, key_id=1297, data=0x0, destroy_func=0) - at gdataset.c:351 - #11 g_datalist_id_set_data_full (datalist=, - key_id=1297, data=0x0, destroy_func=0) at gdataset.c:598 - #12 0x00000000004268d0 in - virt_viewer_session_spice_channel_destroy (s=0x800000 [SpiceSession], - channel= ---- - src/virt-viewer-session-spice.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/src/virt-viewer-session-spice.c b/src/virt-viewer-session-spice.c -index fedde18..cb62444 100644 ---- a/src/virt-viewer-session-spice.c -+++ b/src/virt-viewer-session-spice.c -@@ -628,7 +628,7 @@ virt_viewer_session_spice_display_monitors(SpiceChannel *channel, - if (display == NULL) { - display = virt_viewer_display_spice_new(self, channel, i); - g_debug("creating spice display (#:%d)", i); -- g_ptr_array_index(displays, i) = g_object_ref(display); -+ g_ptr_array_index(displays, i) = g_object_ref_sink(display); - } - - virt_viewer_session_add_display(VIRT_VIEWER_SESSION(self), diff --git a/SOURCES/0028-virt-viewer-window-Set-initial-zoom-only-once.patch b/SOURCES/0028-virt-viewer-window-Set-initial-zoom-only-once.patch new file mode 100644 index 0000000..feb22d0 --- /dev/null +++ b/SOURCES/0028-virt-viewer-window-Set-initial-zoom-only-once.patch @@ -0,0 +1,36 @@ +From bce7870429760c730768f72fafab778f1b4a2067 Mon Sep 17 00:00:00 2001 +From: Pavel Grunt +Date: Tue, 21 Apr 2015 20:16:38 +0200 +Subject: [PATCH] virt-viewer-window: Set initial zoom only once + +It is not needed to do it more times as it may cause unnecessary resize +events especially when leaving the fullscreen mode + +related: rhbz#1206460 +(cherry picked from commit 4219a7ec694e45c43315100dceaa5a5a8542cec9) +--- + src/virt-viewer-window.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +diff --git a/src/virt-viewer-window.c b/src/virt-viewer-window.c +index 7734b5d..96d5757 100644 +--- a/src/virt-viewer-window.c ++++ b/src/virt-viewer-window.c +@@ -108,6 +108,7 @@ struct _VirtViewerWindowPrivate { + gint zoomlevel; + gboolean fullscreen; + gchar *subtitle; ++ gboolean initial_zoom_set; + }; + + static void +@@ -1272,7 +1273,8 @@ display_show_hint(VirtViewerDisplay *display, + + hint = (hint & VIRT_VIEWER_DISPLAY_SHOW_HINT_READY); + +- if (hint && virt_viewer_display_get_enabled(display)) { ++ if (!self->priv->initial_zoom_set && hint && virt_viewer_display_get_enabled(display)) { ++ self->priv->initial_zoom_set = TRUE; + virt_viewer_window_set_zoom_level(self, self->priv->zoomlevel); + } + diff --git a/SOURCES/0029-man-fix-zoom-level-range.patch b/SOURCES/0029-man-fix-zoom-level-range.patch deleted file mode 100644 index 06438b0..0000000 --- a/SOURCES/0029-man-fix-zoom-level-range.patch +++ /dev/null @@ -1,37 +0,0 @@ -From 0c56ca21815a8cfa37cb7e75a1083912ac6f86ad Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= -Date: Fri, 20 Jun 2014 13:35:51 +0200 -Subject: [PATCH] man: fix zoom level range - -https://bugzilla.redhat.com/show_bug.cgi?id=1111428 ---- - man/remote-viewer.pod | 2 +- - man/virt-viewer.pod | 2 +- - 2 files changed, 2 insertions(+), 2 deletions(-) - -diff --git a/man/remote-viewer.pod b/man/remote-viewer.pod -index 63216e3..bb7ede3 100644 ---- a/man/remote-viewer.pod -+++ b/man/remote-viewer.pod -@@ -38,7 +38,7 @@ Display information about the connection - - =item -z PCT, --zoom=PCT - --Zoom level of the display window in percentage. Range 10-200. -+Zoom level of the display window in percentage. Range 10-400. - - =item -f, --full-screen - -diff --git a/man/virt-viewer.pod b/man/virt-viewer.pod -index 8b52377..937a891 100644 ---- a/man/virt-viewer.pod -+++ b/man/virt-viewer.pod -@@ -50,7 +50,7 @@ Automatically reconnect to the domain if it shuts down and restarts - - =item -z PCT, --zoom=PCT - --Zoom level of the display window in percentage. Range 10-200. -+Zoom level of the display window in percentage. Range 10-400. - - =item -d, --direct - diff --git a/SOURCES/0029-session-spice-Destroy-the-channel-instead-of-emit-a-.patch b/SOURCES/0029-session-spice-Destroy-the-channel-instead-of-emit-a-.patch new file mode 100644 index 0000000..f87db48 --- /dev/null +++ b/SOURCES/0029-session-spice-Destroy-the-channel-instead-of-emit-a-.patch @@ -0,0 +1,39 @@ +From 3895d4e7532bb853fb62ff1991449398dee899b1 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Fabiano=20Fid=C3=AAncio?= +Date: Thu, 9 Apr 2015 13:25:36 +0200 +Subject: [PATCH] session-spice: Destroy the channel instead of emit a + "session-disconnect" signal + +Whenever we reach these branches, we will abort or have to create a new +spice session (from the dialog showed to the user). So, destroying the +channel on these situations seems sane enough. +It also avoids an error dialog to be popped out twice with (basically) +the same information. + +(cherry picked from commit f3fe9ffe7bd56a62e3a78f5974620fb54151918a) +--- + src/virt-viewer-session-spice.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/src/virt-viewer-session-spice.c b/src/virt-viewer-session-spice.c +index d3d7edc..f7a8dc7 100644 +--- a/src/virt-viewer-session-spice.c ++++ b/src/virt-viewer-session-spice.c +@@ -591,7 +591,7 @@ virt_viewer_session_spice_main_channel_event(SpiceChannel *channel G_GNUC_UNUSED + spice_session_connect(self->priv->session); + } + } else { +- g_signal_emit_by_name(session, "session-disconnected", error ? error->message : NULL); ++ virt_viewer_session_spice_channel_destroy(NULL, channel, session); + } + } + #else +@@ -602,7 +602,7 @@ virt_viewer_session_spice_main_channel_event(SpiceChannel *channel G_GNUC_UNUSED + case SPICE_CHANNEL_ERROR_IO: + case SPICE_CHANNEL_ERROR_LINK: + case SPICE_CHANNEL_ERROR_TLS: +- g_signal_emit_by_name(session, "session-disconnected", NULL); ++ virt_viewer_session_spice_channel_destroy(NULL, channel, session); + break; + default: + g_warning("unhandled spice main channel event: %d", event); diff --git a/SOURCES/0030-rhbz-1111514-Fix-un-shrinkable-displays-on-windows-g.patch b/SOURCES/0030-rhbz-1111514-Fix-un-shrinkable-displays-on-windows-g.patch deleted file mode 100644 index d56d280..0000000 --- a/SOURCES/0030-rhbz-1111514-Fix-un-shrinkable-displays-on-windows-g.patch +++ /dev/null @@ -1,66 +0,0 @@ -From b8ea8ef031e83fd1144bfc529c30d8804d92b749 Mon Sep 17 00:00:00 2001 -From: Jonathon Jongsma -Date: Fri, 20 Jun 2014 14:39:12 -0500 -Subject: [PATCH] rhbz#1111514: Fix un-shrinkable displays on windows guests - -Commit 6edde5786 introduced a regression wrt shrinking windows on windows -guests. This seems to be because resizing a display often causes the notebook -widget to switch to the status page temporarily (often so quickly that it's not -noticeable to the eye). This causes a quick 'unmap' and 'map' event sequence on -the display widget. Apparently the timing of these events varies enough between -linux and windows guests that it is only noticeable on windows gueststhe timing -of these events varies enough between linux and windows guests that it is only -noticeable on windows guests. The exact sequence that causes the bug appears to -be as follows: - -1 user resizes window smaller -2 display widget gets a new allocation, which causes it to send a display - reconfiguration to the guest -3 client receives a new show-hint for the display which causes it to switch - temporarily to the 'status' notebook page -4 display widget gets unmapped -5 Client receives another new show-hint, which causes the display widget to get - re- mapped, which causes client to send a display reconfiguration to the guest - (using the old size) -6 client receives new (smaller, from step 2) display size and temporarily - changes to the new size -7 client receives new (larger, from step 5) display size and changes back to - original size. - -To fix the issue, we only explicitly request a resize in response to the very -first map event, and for any subsequent map events, we simply call -_make_resizable() as before. ---- - src/virt-viewer-display.c | 10 +++++++++- - 1 file changed, 9 insertions(+), 1 deletion(-) - -diff --git a/src/virt-viewer-display.c b/src/virt-viewer-display.c -index c5170c4..e91450f 100644 ---- a/src/virt-viewer-display.c -+++ b/src/virt-viewer-display.c -@@ -38,6 +38,7 @@ struct _VirtViewerDisplayPrivate - { - #if !GTK_CHECK_VERSION(3, 0, 0) - gboolean dirty; -+ gboolean mapped_once; - #endif - guint desktopWidth; - guint desktopHeight; -@@ -452,9 +453,16 @@ virt_viewer_display_make_resizable(VirtViewerDisplay *self) - static void - virt_viewer_display_map(GtkWidget *widget) - { -+ VirtViewerDisplay* self = VIRT_VIEWER_DISPLAY(widget); -+ - GTK_WIDGET_CLASS(virt_viewer_display_parent_class)->map(widget); - -- virt_viewer_display_queue_resize(VIRT_VIEWER_DISPLAY(widget)); -+ if (!self->priv->mapped_once) -+ virt_viewer_display_queue_resize(self); -+ else -+ virt_viewer_display_make_resizable(self); -+ -+ self->priv->mapped_once = TRUE; - } - - #else diff --git a/SOURCES/0030-spice-session-use-the-error-message-when-available-o.patch b/SOURCES/0030-spice-session-use-the-error-message-when-available-o.patch new file mode 100644 index 0000000..46b05da --- /dev/null +++ b/SOURCES/0030-spice-session-use-the-error-message-when-available-o.patch @@ -0,0 +1,40 @@ +From ce7ff4af0ff08c250f94c22d5d325256ab94228c Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Fabiano=20Fid=C3=AAncio?= +Date: Thu, 9 Apr 2015 13:31:56 +0200 +Subject: [PATCH] spice-session: use the error message, when available, on + _channel_destroy() + +(cherry picked from commit 64e7b604d3449380fc24c9782013dcf3b62eec3e) +--- + src/virt-viewer-session-spice.c | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +diff --git a/src/virt-viewer-session-spice.c b/src/virt-viewer-session-spice.c +index f7a8dc7..d82fd49 100644 +--- a/src/virt-viewer-session-spice.c ++++ b/src/virt-viewer-session-spice.c +@@ -886,12 +886,15 @@ virt_viewer_session_spice_channel_destroy(G_GNUC_UNUSED SpiceSession *s, + { + VirtViewerSessionSpice *self = VIRT_VIEWER_SESSION_SPICE(session); + int id; ++ const GError *error; + + g_return_if_fail(self != NULL); + + g_object_get(channel, "channel-id", &id, NULL); + g_debug("Destroy SPICE channel %s %d", g_type_name(G_OBJECT_TYPE(channel)), id); + ++ error = spice_channel_get_error(channel); ++ + if (SPICE_IS_MAIN_CHANNEL(channel)) { + g_debug("zap main channel"); + if (channel == SPICE_CHANNEL(self->priv->main_channel)) +@@ -917,7 +920,7 @@ virt_viewer_session_spice_channel_destroy(G_GNUC_UNUSED SpiceSession *s, + + self->priv->channel_count--; + if (self->priv->channel_count == 0) +- g_signal_emit_by_name(self, "session-disconnected", NULL); ++ g_signal_emit_by_name(self, "session-disconnected", error ? error->message : NULL); + } + + #define UUID_LEN 16 diff --git a/SOURCES/0031-ovirt-Add-support-for-an-admin-key-in-vv-file.patch b/SOURCES/0031-ovirt-Add-support-for-an-admin-key-in-vv-file.patch new file mode 100644 index 0000000..a067a9c --- /dev/null +++ b/SOURCES/0031-ovirt-Add-support-for-an-admin-key-in-vv-file.patch @@ -0,0 +1,132 @@ +From bd65db51e463fe84a72ea7849483d21e87c97095 Mon Sep 17 00:00:00 2001 +From: Christophe Fergeau +Date: Fri, 3 Apr 2015 16:00:45 +0200 +Subject: [PATCH] ovirt: Add support for an 'admin' key in vv file + +When using a user with administrator rights, the VMs this user can +access from the user portal and the admin portal are different, and +REST API users must indicate which set of VMs they want through a +specific header. libgovirt already has support for that in its API, but +virt-viewer was not making use of that API. +This commit adds support for an 'admin' field in the [ovirt] section of +.vv files so oVirt can indicate remote-viewer whether this header should +be set or not. +--- + src/ovirt-foreign-menu.c | 3 +++ + src/virt-viewer-file.c | 26 ++++++++++++++++++++++++++ + src/virt-viewer-file.h | 2 ++ + 3 files changed, 31 insertions(+) + +diff --git a/src/ovirt-foreign-menu.c b/src/ovirt-foreign-menu.c +index 7c95e4c..9b6d3b8 100644 +--- a/src/ovirt-foreign-menu.c ++++ b/src/ovirt-foreign-menu.c +@@ -826,6 +826,7 @@ OvirtForeignMenu *ovirt_foreign_menu_new_from_file(VirtViewerFile *file) + { + OvirtProxy *proxy = NULL; + OvirtForeignMenu *menu = NULL; ++ gboolean admin; + char *ca_str = NULL; + char *jsessionid = NULL; + char *url = NULL; +@@ -836,6 +837,7 @@ OvirtForeignMenu *ovirt_foreign_menu_new_from_file(VirtViewerFile *file) + vm_guid = virt_viewer_file_get_ovirt_vm_guid(file); + jsessionid = virt_viewer_file_get_ovirt_jsessionid(file); + ca_str = virt_viewer_file_get_ovirt_ca(file); ++ admin = virt_viewer_file_get_ovirt_admin(file); + + if ((url == NULL) || (vm_guid == NULL)) + goto end; +@@ -850,6 +852,7 @@ OvirtForeignMenu *ovirt_foreign_menu_new_from_file(VirtViewerFile *file) + } + + g_object_set(G_OBJECT(proxy), ++ "admin", admin, + "session-id", jsessionid, + "ca-cert", ca, + NULL); +diff --git a/src/virt-viewer-file.c b/src/virt-viewer-file.c +index c8f04e8..69b6531 100644 +--- a/src/virt-viewer-file.c ++++ b/src/virt-viewer-file.c +@@ -76,6 +76,8 @@ + * - jsessionid: string containing an authentication cookie to be used to + * connect to the oVirt engine without being asked for credentials + * - ca: string PEM data (use \n to separate the lines) ++ * - admin: boolean (0 or 1) indicating whether the VM is visible in the user or ++ * admin portal + * + * (the file can be extended with extra groups or keys, which should + * be prefixed with x- to avoid later conflicts) +@@ -119,6 +121,7 @@ enum { + PROP_SECURE_CHANNELS, + PROP_DELETE_THIS_FILE, + PROP_SECURE_ATTENTION, ++ PROP_OVIRT_ADMIN, + PROP_OVIRT_HOST, + PROP_OVIRT_VM_GUID, + PROP_OVIRT_JSESSIONID, +@@ -677,6 +680,19 @@ virt_viewer_file_set_ovirt_ca(VirtViewerFile* self, const gchar* value) + g_object_notify(G_OBJECT(self), "ovirt-ca"); + } + ++gint ++virt_viewer_file_get_ovirt_admin(VirtViewerFile* self) ++{ ++ return virt_viewer_file_get_int(self, OVIRT_GROUP, "admin"); ++} ++ ++void ++virt_viewer_file_set_ovirt_admin(VirtViewerFile* self, gint value) ++{ ++ virt_viewer_file_set_int(self, OVIRT_GROUP, "admin", value); ++ g_object_notify(G_OBJECT(self), "ovirt-admin"); ++} ++ + static void + spice_hotkey_set_accel(const gchar *accel_path, const gchar *key) + { +@@ -840,6 +856,9 @@ virt_viewer_file_set_property(GObject* object, guint property_id, + case PROP_DELETE_THIS_FILE: + virt_viewer_file_set_delete_this_file(self, g_value_get_int(value)); + break; ++ case PROP_OVIRT_ADMIN: ++ virt_viewer_file_set_ovirt_admin(self, g_value_get_int(value)); ++ break; + case PROP_OVIRT_HOST: + virt_viewer_file_set_ovirt_host(self, g_value_get_string(value)); + break; +@@ -940,6 +959,9 @@ virt_viewer_file_get_property(GObject* object, guint property_id, + case PROP_DELETE_THIS_FILE: + g_value_set_int(value, virt_viewer_file_get_delete_this_file(self)); + break; ++ case PROP_OVIRT_ADMIN: ++ g_value_set_int(value, virt_viewer_file_get_ovirt_admin(self)); ++ break; + case PROP_OVIRT_HOST: + g_value_take_string(value, virt_viewer_file_get_ovirt_host(self)); + break; +@@ -1087,6 +1109,10 @@ virt_viewer_file_class_init(VirtViewerFileClass* klass) + g_param_spec_int("delete-this-file", "delete-this-file", "delete-this-file", 0, 1, 0, + G_PARAM_STATIC_STRINGS | G_PARAM_READWRITE)); + ++ g_object_class_install_property(G_OBJECT_CLASS(klass), PROP_OVIRT_ADMIN, ++ g_param_spec_int("ovirt-admin", "ovirt-admin", "ovirt-admin", 0, 1, 0, ++ G_PARAM_STATIC_STRINGS | G_PARAM_READWRITE)); ++ + g_object_class_install_property(G_OBJECT_CLASS(klass), PROP_OVIRT_HOST, + g_param_spec_string("ovirt-host", "ovirt-host", "ovirt-host", NULL, + G_PARAM_STATIC_STRINGS | G_PARAM_READWRITE)); +diff --git a/src/virt-viewer-file.h b/src/virt-viewer-file.h +index f4b030c..e84988a 100644 +--- a/src/virt-viewer-file.h ++++ b/src/virt-viewer-file.h +@@ -108,6 +108,8 @@ gint virt_viewer_file_get_delete_this_file(VirtViewerFile* self); + void virt_viewer_file_set_delete_this_file(VirtViewerFile* self, gint value); + gchar* virt_viewer_file_get_secure_attention(VirtViewerFile* self); + void virt_viewer_file_set_secure_attention(VirtViewerFile* self, const gchar* value); ++gint virt_viewer_file_get_ovirt_admin(VirtViewerFile* self); ++void virt_viewer_file_set_ovirt_admin(VirtViewerFile* self, gint value); + gchar* virt_viewer_file_get_ovirt_host(VirtViewerFile* self); + void virt_viewer_file_set_ovirt_host(VirtViewerFile* self, const gchar* value); + gchar* virt_viewer_file_get_ovirt_vm_guid(VirtViewerFile* self); diff --git a/SOURCES/0031-remote-viewer-mention-vv-file-in-help-output.patch b/SOURCES/0031-remote-viewer-mention-vv-file-in-help-output.patch deleted file mode 100644 index d34295f..0000000 --- a/SOURCES/0031-remote-viewer-mention-vv-file-in-help-output.patch +++ /dev/null @@ -1,26 +0,0 @@ -From 1d458688d31c29028f7efa8efc1502230f428b29 Mon Sep 17 00:00:00 2001 -From: Jonathon Jongsma -Date: Tue, 1 Jul 2014 15:10:48 -0500 -Subject: [PATCH] remote-viewer: mention vv-file in help output - -The man page already has a description of the vv-file format, but the ---help output didn't mention it how to use it. - -References: rhbz#970825 ---- - src/remote-viewer-main.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/src/remote-viewer-main.c b/src/remote-viewer-main.c -index 505074e..5533098 100644 ---- a/src/remote-viewer-main.c -+++ b/src/remote-viewer-main.c -@@ -104,7 +104,7 @@ main(int argc, char **argv) - N_("Open connection using Spice controller communication"), NULL }, - #endif - { G_OPTION_REMAINING, '\0', 0, G_OPTION_ARG_STRING_ARRAY, &args, -- NULL, "-- URI" }, -+ NULL, "URI|VV-FILE" }, - { NULL, 0, 0, G_OPTION_ARG_NONE, NULL, NULL, NULL } - }; - diff --git a/SOURCES/0032-Enable-hotkeys-after-setting-them-in-virt_viewer_app.patch b/SOURCES/0032-Enable-hotkeys-after-setting-them-in-virt_viewer_app.patch new file mode 100644 index 0000000..49c2332 --- /dev/null +++ b/SOURCES/0032-Enable-hotkeys-after-setting-them-in-virt_viewer_app.patch @@ -0,0 +1,38 @@ +From 179c6a0cb577f23032b7073e062b2eed21c4908f Mon Sep 17 00:00:00 2001 +From: Christophe Fergeau +Date: Wed, 10 Jun 2015 18:11:56 +0200 +Subject: [PATCH] Enable hotkeys after setting them in + virt_viewer_app_set_hotkeys + +Enabling hotkeys will trigger a rebuild of the 'send keys' menu +containing the new hotkeys. virt_viewer_app_set_hotkeys() was clearing +and then enabling the hotkeys before parsing the string containing the +new hotkeys. This was causing these hotkeys to be missing from the 'Send +keys' menu when they are set through the spice controller because the +'send keys' menu was rebuilt before the new hotkeys are set. + +Resolves: rhbz#1055600 +--- + src/virt-viewer-app.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/src/virt-viewer-app.c b/src/virt-viewer-app.c +index d7a8e56..972e4ec 100644 +--- a/src/virt-viewer-app.c ++++ b/src/virt-viewer-app.c +@@ -2041,7 +2041,6 @@ virt_viewer_app_set_hotkeys(VirtViewerApp *self, const gchar *hotkeys_str) + } + + virt_viewer_app_clear_hotkeys(self); +- virt_viewer_app_set_enable_accel(self, TRUE); + + for (hotkey = hotkeys; *hotkey != NULL; hotkey++) { + gchar *key = strstr(*hotkey, "="); +@@ -2073,6 +2072,7 @@ virt_viewer_app_set_hotkeys(VirtViewerApp *self, const gchar *hotkeys_str) + } + g_strfreev(hotkeys); + ++ virt_viewer_app_set_enable_accel(self, TRUE); + virt_viewer_update_smartcard_accels(self); + } + diff --git a/SOURCES/0032-Make-ctrl-zoom-in-out-in-fullscreen.patch b/SOURCES/0032-Make-ctrl-zoom-in-out-in-fullscreen.patch deleted file mode 100644 index 2e8dfd1..0000000 --- a/SOURCES/0032-Make-ctrl-zoom-in-out-in-fullscreen.patch +++ /dev/null @@ -1,86 +0,0 @@ -From 35a61bdeb62a4f2228a3c2d66a196bd32eb21706 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= -Date: Mon, 7 Jul 2014 00:14:41 +0200 -Subject: [PATCH] Make ctrl-[+-] zoom in/out in fullscreen - -Make ctrl-[+-] zoom in/out in fullscreen -with mouse over the control bar. - -https://bugzilla.redhat.com/show_bug.cgi?id=987549 ---- - src/virt-gtk-compat.h | 2 ++ - src/virt-viewer-app.c | 4 ++++ - src/virt-viewer-window.c | 4 ++++ - src/virt-viewer.xml | 2 ++ - 4 files changed, 12 insertions(+) - -diff --git a/src/virt-gtk-compat.h b/src/virt-gtk-compat.h -index 67ac768..110c17a 100644 ---- a/src/virt-gtk-compat.h -+++ b/src/virt-gtk-compat.h -@@ -55,6 +55,8 @@ G_BEGIN_DECLS - #define GDK_F11 GDK_KEY_F11 - #define GDK_F12 GDK_KEY_F12 - #define GDK_0 GDK_KEY_0 -+#define GDK_plus GDK_KEY_plus -+#define GDK_minus GDK_KEY_minus - #endif - - #if !GTK_CHECK_VERSION(3, 0, 0) -diff --git a/src/virt-viewer-app.c b/src/virt-viewer-app.c -index 5dc7697..033a594 100644 ---- a/src/virt-viewer-app.c -+++ b/src/virt-viewer-app.c -@@ -1667,6 +1667,8 @@ virt_viewer_app_constructor (GType gtype, - gtk_accel_map_add_entry("/view/toggle-fullscreen", GDK_F11, 0); - gtk_accel_map_add_entry("/view/release-cursor", GDK_F12, GDK_SHIFT_MASK); - gtk_accel_map_add_entry("/view/zoom-reset", GDK_0, GDK_CONTROL_MASK); -+ gtk_accel_map_add_entry("/view/zoom-out", GDK_minus, GDK_CONTROL_MASK); -+ gtk_accel_map_add_entry("/view/zoom-in", GDK_plus, GDK_CONTROL_MASK); - gtk_accel_map_add_entry("/send/secure-attention", GDK_End, GDK_CONTROL_MASK | GDK_MOD1_MASK); - - virt_viewer_app_set_fullscreen(self, opt_fullscreen); -@@ -1843,6 +1845,8 @@ virt_viewer_app_clear_hotkeys(VirtViewerApp *self) - gtk_accel_map_change_entry("/view/toggle-fullscreen", 0, 0, TRUE); - gtk_accel_map_change_entry("/view/release-cursor", 0, 0, TRUE); - gtk_accel_map_change_entry("/view/zoom-reset", 0, 0, TRUE); -+ gtk_accel_map_change_entry("/view/zoom-in", 0, 0, TRUE); -+ gtk_accel_map_change_entry("/view/zoom-out", 0, 0, TRUE); - gtk_accel_map_change_entry("/send/secure-attention", 0, 0, TRUE); - virt_viewer_set_insert_smartcard_accel(self, 0, 0); - virt_viewer_set_remove_smartcard_accel(self, 0, 0); -diff --git a/src/virt-viewer-window.c b/src/virt-viewer-window.c -index 22326e8..fadf0bb 100644 ---- a/src/virt-viewer-window.c -+++ b/src/virt-viewer-window.c -@@ -315,6 +315,10 @@ virt_viewer_window_init (VirtViewerWindow *self) - "can-activate-accel", G_CALLBACK(can_activate_cb), self); - g_signal_connect(gtk_builder_get_object(priv->builder, "menu-view-zoom-reset"), - "can-activate-accel", G_CALLBACK(can_activate_cb), self); -+ g_signal_connect(gtk_builder_get_object(priv->builder, "menu-view-zoom-in"), -+ "can-activate-accel", G_CALLBACK(can_activate_cb), self); -+ g_signal_connect(gtk_builder_get_object(priv->builder, "menu-view-zoom-out"), -+ "can-activate-accel", G_CALLBACK(can_activate_cb), self); - - vbox = GTK_WIDGET(gtk_builder_get_object(priv->builder, "viewer-box")); - virt_viewer_window_toolbar_setup(self); -diff --git a/src/virt-viewer.xml b/src/virt-viewer.xml -index 8a3d3c0..fd8295f 100644 ---- a/src/virt-viewer.xml -+++ b/src/virt-viewer.xml -@@ -127,6 +127,7 @@ - accelgroup - - -+ <virt-viewer>/view/zoom-in - gtk-zoom-in - True - False -@@ -139,6 +140,7 @@ - - - -+ <virt-viewer>/view/zoom-out - gtk-zoom-out - True - False diff --git a/SOURCES/0033-Don-t-connect-to-localhost-when-using-direct.patch b/SOURCES/0033-Don-t-connect-to-localhost-when-using-direct.patch deleted file mode 100644 index 6f10cc3..0000000 --- a/SOURCES/0033-Don-t-connect-to-localhost-when-using-direct.patch +++ /dev/null @@ -1,70 +0,0 @@ -From 7d8b1c5665e9f27533bea7c1e0876ffb784cd1b6 Mon Sep 17 00:00:00 2001 -From: Christophe Fergeau -Date: Thu, 3 Apr 2014 14:06:22 +0200 -Subject: [PATCH] Don't connect to localhost when using --direct - -Trying to connect to a remote virtual machine using -virt-viewer -c qemu+ssh://example.com/system --direct $vm_name -will currently fail with an error message saying it's not possible to -localhost. This happens with VMs which listen on a wildcard address (eg -'0.0.0.0'). -This was introduced by commit 74b1b62 which changes the host to connect to -to 'localhost' when trying to connect through ssh to a VM listening on a -wildcard address. This is only valid when using a ssh tunnel, and should -not be done with --direct. The fallback code which uses the hostname from -the libvirt URI is what makes the most sense in this situation (wildcard -listen address + --direct). -This commit introduces a virt_viewer_app_get_direct() so that this can be -implemented. - -Fixes https://bugzilla.redhat.com/show_bug.cgi?id=1079211 ---- - src/virt-viewer-app.c | 7 +++++++ - src/virt-viewer-app.h | 1 + - src/virt-viewer.c | 3 ++- - 3 files changed, 10 insertions(+), 1 deletion(-) - -diff --git a/src/virt-viewer-app.c b/src/virt-viewer-app.c -index 033a594..27e5164 100644 ---- a/src/virt-viewer-app.c -+++ b/src/virt-viewer-app.c -@@ -1838,6 +1838,13 @@ virt_viewer_app_set_direct(VirtViewerApp *self, gboolean direct) - self->priv->direct = direct; - } - -+gboolean virt_viewer_app_get_direct(VirtViewerApp *self) -+{ -+ g_return_val_if_fail(VIRT_VIEWER_IS_APP(self), FALSE); -+ -+ return self->priv->direct; -+} -+ - void - virt_viewer_app_clear_hotkeys(VirtViewerApp *self) - { -diff --git a/src/virt-viewer-app.h b/src/virt-viewer-app.h -index 7c77957..f03369b 100644 ---- a/src/virt-viewer-app.h -+++ b/src/virt-viewer-app.h -@@ -75,6 +75,7 @@ gboolean virt_viewer_app_activate(VirtViewerApp *self, GError **error); - gboolean virt_viewer_app_initial_connect(VirtViewerApp *self, GError **error); - void virt_viewer_app_start_reconnect_poll(VirtViewerApp *self); - void virt_viewer_app_set_zoom_level(VirtViewerApp *self, gint zoom_level); -+gboolean virt_viewer_app_get_direct(VirtViewerApp *self); - void virt_viewer_app_set_direct(VirtViewerApp *self, gboolean direct); - void virt_viewer_app_set_hotkeys(VirtViewerApp *self, const gchar *hotkeys); - void virt_viewer_app_set_attach(VirtViewerApp *self, gboolean attach); -diff --git a/src/virt-viewer.c b/src/virt-viewer.c -index 01a9a51..739b817 100644 ---- a/src/virt-viewer.c -+++ b/src/virt-viewer.c -@@ -365,7 +365,8 @@ virt_viewer_extract_connect_info(VirtViewer *self, - */ - if (virt_viewer_replace_host(ghost)) { - gchar *replacement_host = NULL; -- if (g_strcmp0(transport, "ssh") == 0) { -+ if ((g_strcmp0(transport, "ssh") == 0) -+ && !virt_viewer_app_get_direct(app)) { - replacement_host = g_strdup("localhost"); - } else { - replacement_host = g_strdup(host); diff --git a/SOURCES/0033-build-sys-Don-t-substitute-buildid-when-it-was-not-s.patch b/SOURCES/0033-build-sys-Don-t-substitute-buildid-when-it-was-not-s.patch new file mode 100644 index 0000000..5c83403 --- /dev/null +++ b/SOURCES/0033-build-sys-Don-t-substitute-buildid-when-it-was-not-s.patch @@ -0,0 +1,31 @@ +From 61c6c38d65a55c83415b792ad07bef3061e5e27a Mon Sep 17 00:00:00 2001 +From: Christophe Fergeau +Date: Fri, 17 Apr 2015 17:14:34 +0200 +Subject: [PATCH] build-sys: Don't substitute buildid when it was not set + +Since it defaults to being 0, we'll get a spurious 0 on remote-viewer +--version if we AC_DEFINE/AC_SUBST it when the user did not specify it. +--- + configure.ac | 9 +++++++-- + 1 file changed, 7 insertions(+), 2 deletions(-) + +diff --git a/configure.ac b/configure.ac +index ea49c3b..d6a438c 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -222,8 +222,13 @@ fi + AC_ARG_WITH([buildid], + AS_HELP_STRING([--with-buildid=id], [Set additional build version details]), + [buildid="$with_buildid"], [buildid="0"]) +-AC_DEFINE_UNQUOTED([BUILDID], "$buildid", [Build version details]) +-AC_SUBST([BUILDID], "$buildid") ++ ++if test "x$buildid" != "x0"; then ++ AC_DEFINE_UNQUOTED([BUILDID], "$buildid", [Build version details]) ++ AC_SUBST([BUILDID], "$buildid") ++else ++ AC_DEFINE_UNQUOTED([BUILDID], "", [Build version details]) ++fi + + major=`echo $PACKAGE_VERSION | cut -d. -f1` + minor=`echo $PACKAGE_VERSION | cut -d. -f2` diff --git a/SOURCES/0034-Improve-docs-for-attach-flag-in-virt-viewer.patch b/SOURCES/0034-Improve-docs-for-attach-flag-in-virt-viewer.patch deleted file mode 100644 index f23d730..0000000 --- a/SOURCES/0034-Improve-docs-for-attach-flag-in-virt-viewer.patch +++ /dev/null @@ -1,35 +0,0 @@ -From 87e32602e117d922f531fda93bad984665a655d9 Mon Sep 17 00:00:00 2001 -From: "Daniel P. Berrange" -Date: Wed, 29 Jan 2014 16:22:09 +0000 -Subject: [PATCH] Improve docs for --attach flag in virt-viewer - -People seem to have a hard time understanding the --attach flag. -Rewrite the docs in the hope that people figure it out this time. - -Signed-off-by: Daniel P. Berrange ---- - man/virt-viewer.pod | 11 +++++++---- - 1 file changed, 7 insertions(+), 4 deletions(-) - -diff --git a/man/virt-viewer.pod b/man/virt-viewer.pod -index 937a891..ac9b268 100644 ---- a/man/virt-viewer.pod -+++ b/man/virt-viewer.pod -@@ -59,10 +59,13 @@ used SSH. - - =item -a, --attach - --Use libvirt to directly attach to a local display, instead of making a --TCP/UNIX socket connection. This avoids the need to authentication with --the remote display, if authentication with libvirt is already allowed. --This option does not work with remote displays. -+Instead of making a direct TCP/UNIX socket connection to the remote display, -+ask libvirt to provide a pre-connected socket for the display. This avoids -+the need to authenticate with the remote display server directly. This option -+will only work when connecting to a guest that is running on the same host -+as the virt-viewer program. If attaching to the guest via libvirt fails, -+virt-viewer will automatically fallback to trying a regular direct TCP/UNIX -+socket connection. - - =item -f, --full-screen - diff --git a/SOURCES/0034-build-sys-Always-prepend-to-BUILDID.patch b/SOURCES/0034-build-sys-Always-prepend-to-BUILDID.patch new file mode 100644 index 0000000..e1a01f2 --- /dev/null +++ b/SOURCES/0034-build-sys-Always-prepend-to-BUILDID.patch @@ -0,0 +1,34 @@ +From 2f014c673eaa294b60f0898124c8beb45577cad2 Mon Sep 17 00:00:00 2001 +From: Christophe Fergeau +Date: Tue, 2 Jun 2015 16:51:45 +0200 +Subject: [PATCH] build-sys: Always prepend '-' to BUILDID + +This was removed by commit 28a6bd6 as WINDOWS_PRODUCTVERSION +needs a buildid without a dash. Apart from this variable, +all other uses of buildid/BUILDID in virt-viewer source tree +need a dash between the version number and the buildid to avoid getting +output like "3.01" instead of "3.0-1" + +Rather than patching every location where BUILDID is used, this commit +appends the "-" before substituting/defining BUILDID in configure.ac. +This does not modifies the buildid configure.ac variable, this way +WINDOWS_PRODUCTVERSION won't get an unwanted '-'. +--- + configure.ac | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/configure.ac b/configure.ac +index d6a438c..d893631 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -224,8 +224,8 @@ AC_ARG_WITH([buildid], + [buildid="$with_buildid"], [buildid="0"]) + + if test "x$buildid" != "x0"; then +- AC_DEFINE_UNQUOTED([BUILDID], "$buildid", [Build version details]) +- AC_SUBST([BUILDID], "$buildid") ++ AC_DEFINE_UNQUOTED([BUILDID], "-$buildid", [Build version details]) ++ AC_SUBST([BUILDID], "-$buildid") + else + AC_DEFINE_UNQUOTED([BUILDID], "", [Build version details]) + fi diff --git a/SOURCES/0035-Fix-silentely-typo-in-remote-viewer-man-page.patch b/SOURCES/0035-Fix-silentely-typo-in-remote-viewer-man-page.patch deleted file mode 100644 index e77bfeb..0000000 --- a/SOURCES/0035-Fix-silentely-typo-in-remote-viewer-man-page.patch +++ /dev/null @@ -1,22 +0,0 @@ -From 5c192f0f0f97409c5fb48043d251446d9f36553e Mon Sep 17 00:00:00 2001 -From: Christophe Fergeau -Date: Wed, 12 Mar 2014 09:29:23 +0100 -Subject: [PATCH] Fix 'silentely' typo in remote-viewer man page - ---- - man/remote-viewer.pod | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/man/remote-viewer.pod b/man/remote-viewer.pod -index bb7ede3..2c84432 100644 ---- a/man/remote-viewer.pod -+++ b/man/remote-viewer.pod -@@ -253,7 +253,7 @@ The current SPICE channels are: main, display, inputs, cursor, playback, record, - - =item C (boolean) - --Set to 1 for the client to remove this connection file (if it can't, it will fail silentely) -+Set to 1 for the client to remove this connection file (if it can't, it will fail silently) - - =item C (string) - diff --git a/SOURCES/0035-vv-file-Move-version-checking-code-in-its-own-functi.patch b/SOURCES/0035-vv-file-Move-version-checking-code-in-its-own-functi.patch new file mode 100644 index 0000000..f45df80 --- /dev/null +++ b/SOURCES/0035-vv-file-Move-version-checking-code-in-its-own-functi.patch @@ -0,0 +1,51 @@ +From 6100f15bf8331c9581e64c465191f84eaf3f73e6 Mon Sep 17 00:00:00 2001 +From: Christophe Fergeau +Date: Thu, 16 Apr 2015 18:01:19 +0200 +Subject: [PATCH] vv-file: Move version checking code in its own function + +This moves the version checking code in a +virt_viewer_file_check_min_version helper so that it can be +reused/extended more easily. +--- + src/virt-viewer-file.c | 20 +++++++++++++++----- + 1 file changed, 15 insertions(+), 5 deletions(-) + +diff --git a/src/virt-viewer-file.c b/src/virt-viewer-file.c +index 69b6531..8b732a3 100644 +--- a/src/virt-viewer-file.c ++++ b/src/virt-viewer-file.c +@@ -707,12 +707,9 @@ spice_hotkey_set_accel(const gchar *accel_path, const gchar *key) + gtk_accel_map_change_entry(accel_path, accel_key, accel_mods, TRUE); + } + +-gboolean +-virt_viewer_file_fill_app(VirtViewerFile* self, VirtViewerApp *app, GError **error) ++static gboolean ++virt_viewer_file_check_min_version(VirtViewerFile *self, GError **error) + { +- g_return_val_if_fail(VIRT_VIEWER_IS_FILE(self), FALSE); +- g_return_val_if_fail(VIRT_VIEWER_IS_APP(app), FALSE); +- + if (virt_viewer_file_is_set(self, "version")) { + gchar *val = virt_viewer_file_get_version(self); + +@@ -730,6 +727,19 @@ virt_viewer_file_fill_app(VirtViewerFile* self, VirtViewerApp *app, GError **err + g_free(val); + } + ++ return TRUE; ++} ++ ++gboolean ++virt_viewer_file_fill_app(VirtViewerFile* self, VirtViewerApp *app, GError **error) ++{ ++ g_return_val_if_fail(VIRT_VIEWER_IS_FILE(self), FALSE); ++ g_return_val_if_fail(VIRT_VIEWER_IS_APP(app), FALSE); ++ ++ if (!virt_viewer_file_check_min_version(self, error)) { ++ return FALSE; ++ } ++ + if (virt_viewer_file_is_set(self, "title")) { + char *title = virt_viewer_file_get_title(self); + g_object_set(app, "title", title, NULL); diff --git a/SOURCES/0036-virt-viewer.xml-remove-zoom-in-out-accelerators.patch b/SOURCES/0036-virt-viewer.xml-remove-zoom-in-out-accelerators.patch deleted file mode 100644 index 3fe7487..0000000 --- a/SOURCES/0036-virt-viewer.xml-remove-zoom-in-out-accelerators.patch +++ /dev/null @@ -1,31 +0,0 @@ -From 8e093e18406f6781a95bd49f6da5946562cb1a68 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= -Date: Tue, 22 Jul 2014 13:22:02 +0200 -Subject: [PATCH] virt-viewer.xml: remove zoom-{in,out} accelerators - -The XML menu accelerators conflict with accelerator set in the code and -prevent using them. This is a regression from d29fc63d. ---- - src/virt-viewer.xml | 2 -- - 1 file changed, 2 deletions(-) - -diff --git a/src/virt-viewer.xml b/src/virt-viewer.xml -index fd8295f..e2b836c 100644 ---- a/src/virt-viewer.xml -+++ b/src/virt-viewer.xml -@@ -134,7 +134,6 @@ - False - True - True -- - - - -@@ -147,7 +146,6 @@ - False - True - True -- - - - diff --git a/SOURCES/0036-vv-file-Refactor-virt_viewer_file_check_min_version.patch b/SOURCES/0036-vv-file-Refactor-virt_viewer_file_check_min_version.patch new file mode 100644 index 0000000..b744233 --- /dev/null +++ b/SOURCES/0036-vv-file-Refactor-virt_viewer_file_check_min_version.patch @@ -0,0 +1,52 @@ +From 76fecd7940315a6dfa45f78bf76507755500aa81 Mon Sep 17 00:00:00 2001 +From: Christophe Fergeau +Date: Thu, 16 Apr 2015 18:02:57 +0200 +Subject: [PATCH] vv-file: Refactor virt_viewer_file_check_min_version + +Reorganize the code a bit so that it's easier to extend it. +--- + src/virt-viewer-file.c | 27 +++++++++++++++------------ + 1 file changed, 15 insertions(+), 12 deletions(-) + +diff --git a/src/virt-viewer-file.c b/src/virt-viewer-file.c +index 8b732a3..23eae31 100644 +--- a/src/virt-viewer-file.c ++++ b/src/virt-viewer-file.c +@@ -710,22 +710,25 @@ spice_hotkey_set_accel(const gchar *accel_path, const gchar *key) + static gboolean + virt_viewer_file_check_min_version(VirtViewerFile *self, GError **error) + { +- if (virt_viewer_file_is_set(self, "version")) { +- gchar *val = virt_viewer_file_get_version(self); ++ gchar *min_version = NULL; ++ gint version_cmp; + +- if (virt_viewer_compare_version(val, PACKAGE_VERSION) > 0) { +- g_set_error(error, +- VIRT_VIEWER_ERROR, +- VIRT_VIEWER_ERROR_FAILED, +- _("At least %s version %s is required to setup this connection"), +- g_get_application_name(), val); ++ if (virt_viewer_file_is_set(self, "version")) { ++ min_version = virt_viewer_file_get_version(self); ++ } + +- g_free(val); +- return FALSE; +- } ++ version_cmp = virt_viewer_compare_version(min_version, PACKAGE_VERSION); + +- g_free(val); ++ if (version_cmp > 0) { ++ g_set_error(error, ++ VIRT_VIEWER_ERROR, ++ VIRT_VIEWER_ERROR_FAILED, ++ _("At least %s version %s is required to setup this connection"), ++ g_get_application_name(), min_version); ++ g_free(min_version); ++ return FALSE; + } ++ g_free(min_version); + + return TRUE; + } diff --git a/SOURCES/0037-Add-a-dialog-showing-details-of-the-current-guest.patch b/SOURCES/0037-Add-a-dialog-showing-details-of-the-current-guest.patch deleted file mode 100644 index de444b4..0000000 --- a/SOURCES/0037-Add-a-dialog-showing-details-of-the-current-guest.patch +++ /dev/null @@ -1,396 +0,0 @@ -From d3cd399f4379d4c635fbd88cc83773cffaafd1b3 Mon Sep 17 00:00:00 2001 -From: Jonathon Jongsma -Date: Fri, 17 Jan 2014 13:39:29 -0600 -Subject: [PATCH] Add a dialog showing details of the current guest - -This allows the user to obtain the GUID and vm name of the currently-connected -guest. Obviously, this only works with spice. In the future, it will allow them -to set guest-specific configuration options (using a GUID as a key) ---- - src/Makefile.am | 1 + - src/virt-viewer-app.c | 25 ++++++++ - src/virt-viewer-app.h | 1 - - src/virt-viewer-guest-details.xml | 120 ++++++++++++++++++++++++++++++++++++++ - src/virt-viewer-session-spice.c | 19 +++++- - src/virt-viewer-window.c | 45 ++++++++++++++ - src/virt-viewer.c | 2 +- - src/virt-viewer.xml | 10 ++++ - 8 files changed, 219 insertions(+), 4 deletions(-) - create mode 100644 src/virt-viewer-guest-details.xml - -diff --git a/src/Makefile.am b/src/Makefile.am -index b3a9637..d4163c8 100644 ---- a/src/Makefile.am -+++ b/src/Makefile.am -@@ -8,6 +8,7 @@ builderxml_DATA = \ - virt-viewer.xml \ - virt-viewer-about.xml \ - virt-viewer-auth.xml \ -+ virt-viewer-guest-details.xml \ - $(NULL) - - EXTRA_DIST = \ -diff --git a/src/virt-viewer-app.c b/src/virt-viewer-app.c -index 27e5164..8f5aa2b 100644 ---- a/src/virt-viewer-app.c -+++ b/src/virt-viewer-app.c -@@ -139,6 +139,7 @@ struct _VirtViewerAppPrivate { - gchar *guest_name; - gboolean grabbed; - char *title; -+ char *uuid; - - gint focused; - GKeyFile *config; -@@ -168,6 +169,7 @@ enum { - PROP_HAS_FOCUS, - PROP_KIOSK, - PROP_QUIT_ON_DISCONNECT, -+ PROP_UUID, - }; - - enum { -@@ -305,6 +307,7 @@ app_window_try_fullscreen(VirtViewerApp *self G_GNUC_UNUSED, - } - - -+static - void virt_viewer_app_set_uuid_string(VirtViewerApp* self, const gchar* uuid_string) - { - GArray* mapping = NULL; -@@ -315,6 +318,8 @@ void virt_viewer_app_set_uuid_string(VirtViewerApp* self, const gchar* uuid_stri - - g_debug("%s: UUID changed to %s", G_STRFUNC, uuid_string); - -+ g_free(self->priv->uuid); -+ self->priv->uuid = g_strdup(uuid_string); - displays = g_key_file_get_integer_list(self->priv->config, - uuid_string, "monitor-mapping", &ndisplays, &error); - if (error) { -@@ -1443,6 +1448,10 @@ virt_viewer_app_get_property (GObject *object, guint property_id, - g_value_set_boolean(value, priv->quit_on_disconnect); - break; - -+ case PROP_UUID: -+ g_value_set_string(value, priv->uuid); -+ break; -+ - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); - } -@@ -1492,6 +1501,10 @@ virt_viewer_app_set_property (GObject *object, guint property_id, - priv->quit_on_disconnect = g_value_get_boolean(value); - break; - -+ case PROP_UUID: -+ virt_viewer_app_set_uuid_string(self, g_value_get_string(value)); -+ break; -+ - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); - } -@@ -1524,6 +1537,8 @@ virt_viewer_app_dispose (GObject *object) - priv->guri = NULL; - g_free(priv->title); - priv->title = NULL; -+ g_free(priv->uuid); -+ priv->uuid = NULL; - g_free(priv->config_file); - priv->config_file = NULL; - g_clear_pointer(&priv->config, g_key_file_free); -@@ -1791,6 +1806,16 @@ virt_viewer_app_class_init (VirtViewerAppClass *klass) - G_PARAM_READWRITE | - G_PARAM_STATIC_STRINGS)); - -+ g_object_class_install_property(object_class, -+ PROP_UUID, -+ g_param_spec_string("uuid", -+ "uuid", -+ "uuid", -+ NULL, -+ G_PARAM_READABLE | -+ G_PARAM_WRITABLE | -+ G_PARAM_STATIC_STRINGS)); -+ - signals[SIGNAL_WINDOW_ADDED] = - g_signal_new("window-added", - G_OBJECT_CLASS_TYPE(object_class), -diff --git a/src/virt-viewer-app.h b/src/virt-viewer-app.h -index f03369b..804e076 100644 ---- a/src/virt-viewer-app.h -+++ b/src/virt-viewer-app.h -@@ -102,7 +102,6 @@ const GOptionEntry* virt_viewer_app_get_options(void); - void virt_viewer_app_clear_hotkeys(VirtViewerApp *app); - gint virt_viewer_app_get_n_initial_displays(VirtViewerApp* self); - gint virt_viewer_app_get_initial_monitor_for_display(VirtViewerApp* self, gint display); --void virt_viewer_app_set_uuid_string(VirtViewerApp* self, const gchar* uuid_string); - void virt_viewer_app_set_enable_accel(VirtViewerApp *app, gboolean enable); - - G_END_DECLS -diff --git a/src/virt-viewer-guest-details.xml b/src/virt-viewer-guest-details.xml -new file mode 100644 -index 0000000..7f00567 ---- /dev/null -+++ b/src/virt-viewer-guest-details.xml -@@ -0,0 +1,120 @@ -+ -+ -+ -+ -+ -+ False -+ Guest Details -+ True -+ 400 -+ dialog -+ -+ -+ -+ False -+ vertical -+ 2 -+ -+ -+ False -+ end -+ -+ -+ gtk-close -+ True -+ True -+ True -+ True -+ -+ -+ False -+ True -+ 0 -+ -+ -+ -+ -+ False -+ True -+ end -+ 0 -+ -+ -+ -+ -+ True -+ False -+ 6 -+ 6 -+ 6 -+ 2 -+ -+ -+ True -+ False -+ 1 -+ Name: -+ -+ -+ GTK_SHRINK | GTK_FILL -+ GTK_FILL -+ -+ -+ -+ -+ True -+ False -+ 1 -+ GUID: -+ -+ -+ 1 -+ 2 -+ GTK_SHRINK | GTK_FILL -+ GTK_FILL -+ -+ -+ -+ -+ True -+ False -+ 0 -+ label -+ True -+ -+ -+ 1 -+ 2 -+ GTK_FILL -+ -+ -+ -+ -+ True -+ False -+ 0 -+ label -+ True -+ -+ -+ 1 -+ 2 -+ 1 -+ 2 -+ GTK_FILL -+ -+ -+ -+ -+ False -+ True -+ 1 -+ -+ -+ -+ -+ -+ button1 -+ -+ -+ -diff --git a/src/virt-viewer-session-spice.c b/src/virt-viewer-session-spice.c -index cb62444..c286fd9 100644 ---- a/src/virt-viewer-session-spice.c -+++ b/src/virt-viewer-session-spice.c -@@ -840,8 +840,8 @@ uuid_changed(GObject *gobject G_GNUC_UNUSED, - } - - if (!uuid_empty) { -- gchar* uuid_str = spice_uuid_to_string(uuid); -- virt_viewer_app_set_uuid_string(app, uuid_str); -+ gchar *uuid_str = spice_uuid_to_string(uuid); -+ g_object_set(app, "uuid", uuid_str, NULL); - g_free(uuid_str); - } - } -@@ -849,6 +849,20 @@ uuid_changed(GObject *gobject G_GNUC_UNUSED, - virt_viewer_session_spice_fullscreen_auto_conf(self); - } - -+static void -+name_changed(GObject *gobject G_GNUC_UNUSED, -+ GParamSpec *pspec G_GNUC_UNUSED, -+ VirtViewerSessionSpice *self) -+{ -+ gchar *name = NULL; -+ VirtViewerApp* app = virt_viewer_session_get_app(VIRT_VIEWER_SESSION(self)); -+ -+ g_object_get(self->priv->session, "name", &name, NULL); -+ -+ g_object_set(app, "guest-name", name, NULL); -+ g_free(name); -+} -+ - VirtViewerSession * - virt_viewer_session_spice_new(VirtViewerApp *app, GtkWindow *main_window) - { -@@ -864,6 +878,7 @@ virt_viewer_session_spice_new(VirtViewerApp *app, GtkWindow *main_window) - /* notify::uuid is guaranteed to be emitted during connection startup even - * if the server is too old to support sending uuid */ - g_signal_connect(self->priv->session, "notify::uuid", G_CALLBACK(uuid_changed), self); -+ g_signal_connect(self->priv->session, "notify::name", G_CALLBACK(name_changed), self); - - return VIRT_VIEWER_SESSION(self); - } -diff --git a/src/virt-viewer-window.c b/src/virt-viewer-window.c -index fadf0bb..f74f17f 100644 ---- a/src/virt-viewer-window.c -+++ b/src/virt-viewer-window.c -@@ -49,6 +49,7 @@ void virt_viewer_window_menu_view_zoom_reset(GtkWidget *menu, VirtViewerWindow * - gboolean virt_viewer_window_delete(GtkWidget *src, void *dummy, VirtViewerWindow *self); - void virt_viewer_window_menu_file_quit(GtkWidget *src, VirtViewerWindow *self); - void virt_viewer_window_menu_help_about(GtkWidget *menu, VirtViewerWindow *self); -+void virt_viewer_window_menu_help_guest_details(GtkWidget *menu, VirtViewerWindow *self); - void virt_viewer_window_menu_view_fullscreen(GtkWidget *menu, VirtViewerWindow *self); - void virt_viewer_window_menu_send(GtkWidget *menu, VirtViewerWindow *self); - void virt_viewer_window_menu_file_screenshot(GtkWidget *menu, VirtViewerWindow *self); -@@ -1016,6 +1017,50 @@ virt_viewer_window_menu_view_release_cursor(GtkWidget *menu G_GNUC_UNUSED, - } - - G_MODULE_EXPORT void -+virt_viewer_window_menu_help_guest_details(GtkWidget *menu G_GNUC_UNUSED, -+ VirtViewerWindow *self) -+{ -+ GtkBuilder *ui = virt_viewer_util_load_ui("virt-viewer-guest-details.xml"); -+ char *name = NULL; -+ char *uuid = NULL; -+ -+ g_return_if_fail(ui != NULL); -+ -+ GtkWidget *dialog = GTK_WIDGET(gtk_builder_get_object(ui, "guestdetailsdialog")); -+ GtkWidget *namelabel = GTK_WIDGET(gtk_builder_get_object(ui, "namevaluelabel")); -+ GtkWidget *guidlabel = GTK_WIDGET(gtk_builder_get_object(ui, "guidvaluelabel")); -+ -+ g_return_if_fail(dialog && namelabel && guidlabel); -+ -+ g_object_get(self->priv->app, "guest-name", &name, "uuid", &uuid, NULL); -+ -+ if (!name || *name == '\0') -+ name = g_strdup(_("Unknown")); -+ if (!uuid || *uuid == '\0') -+ uuid = g_strdup(_("Unknown")); -+ gtk_label_set_text(GTK_LABEL(namelabel), name); -+ gtk_label_set_text(GTK_LABEL(guidlabel), uuid); -+ g_free(name); -+ g_free(uuid); -+ -+ gtk_window_set_transient_for(GTK_WINDOW(dialog), -+ GTK_WINDOW(self->priv->window)); -+ -+ gtk_builder_connect_signals(ui, self); -+ -+ gtk_widget_show_all(dialog); -+ -+ g_object_unref(G_OBJECT(ui)); -+} -+ -+G_MODULE_EXPORT void -+virt_viewer_window_guest_details_response(GtkDialog *dialog, gint response_id, gpointer user_data) -+{ -+ if (response_id == GTK_RESPONSE_CLOSE) -+ gtk_widget_hide(GTK_WIDGET(dialog)); -+} -+ -+G_MODULE_EXPORT void - virt_viewer_window_menu_help_about(GtkWidget *menu G_GNUC_UNUSED, - VirtViewerWindow *self) - { -diff --git a/src/virt-viewer.c b/src/virt-viewer.c -index 739b817..076611c 100644 ---- a/src/virt-viewer.c -+++ b/src/virt-viewer.c -@@ -560,7 +560,7 @@ virt_viewer_initial_connect(VirtViewerApp *app, GError **error) - if (virDomainGetUUIDString(dom, uuid_string) < 0) { - g_debug("Couldn't get uuid from libvirt"); - } else { -- virt_viewer_app_set_uuid_string(app, uuid_string); -+ g_object_set(app, "uuid", uuid_string, NULL); - } - - virt_viewer_app_show_status(app, _("Checking guest domain status")); -diff --git a/src/virt-viewer.xml b/src/virt-viewer.xml -index e2b836c..d489653 100644 ---- a/src/virt-viewer.xml -+++ b/src/virt-viewer.xml -@@ -215,6 +215,16 @@ - True - False - -+ -+ True -+ False -+ False -+ _Guest Details -+ True -+ -+ -+ -+ - - gtk-about - True diff --git a/SOURCES/0037-vv-file-Add-VirtViewerFile-versions.patch b/SOURCES/0037-vv-file-Add-VirtViewerFile-versions.patch new file mode 100644 index 0000000..faad70d --- /dev/null +++ b/SOURCES/0037-vv-file-Add-VirtViewerFile-versions.patch @@ -0,0 +1,178 @@ +From ad026e457f6e92a3963aa5999d1fba9a4316c470 Mon Sep 17 00:00:00 2001 +From: Christophe Fergeau +Date: Thu, 16 Apr 2015 15:11:48 +0200 +Subject: [PATCH] vv-file: Add VirtViewerFile::versions + +Specifying a single minimal version in the .vv file is not enough as +the client version will be highly dependent on the OS it's running in. +Windows versioning is not the same as linux versioning, Fedora 21 and +Fedora 22 may have different release numbers for the same version, +and we may want to force a specific minimal release in case of a +critical bug fix. + +This commit adds supports for a 'versions' field in .vv files where a +list of os-id:version couples can be stored. +--- + man/remote-viewer.pod | 8 ++++++ + src/virt-viewer-file.c | 73 +++++++++++++++++++++++++++++++++++++++++++++++++- + src/virt-viewer-file.h | 2 ++ + 3 files changed, 82 insertions(+), 1 deletion(-) + +diff --git a/man/remote-viewer.pod b/man/remote-viewer.pod +index 00b474c..e10b0b8 100644 +--- a/man/remote-viewer.pod ++++ b/man/remote-viewer.pod +@@ -147,6 +147,14 @@ Version comparison is done by comparing each integer from the list one by + one. If any of the component is not a number, the version comparison will fail + and consider that the 2 versions are considered to be the same. + ++=item C (osid:version list) ++ ++This is a list of osid:version couples separated by ';'. osid is an arbitrary string, version is ++a version number in the same format as in the 'version' field. A given couple indicates that ++remote-viewer builds matching the given 'osid' (fedora22, debian7, ...) must ++be at least version 'version'. For consistency, it's recommended to use libosinfo OS shortids as ++the osid. ++ + =item C (string, mandatory) + + The session type, either "spice", "vnc" or "ovirt". +diff --git a/src/virt-viewer-file.c b/src/virt-viewer-file.c +index 23eae31..35d25fb 100644 +--- a/src/virt-viewer-file.c ++++ b/src/virt-viewer-file.c +@@ -2,7 +2,7 @@ + /* + * Virt Viewer: A virtual machine console viewer + * +- * Copyright (C) 2012 Red Hat, Inc. ++ * Copyright (C) 2012-2015 Red Hat, Inc. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by +@@ -39,6 +39,7 @@ + * + * The current list of [virt-viewer] keys is: + * - version: string ++ * - versions: list of id:versions strings + * - type: string, mandatory, values: "spice" (later "vnc" etc..) + * - host: string + * - port: int +@@ -118,6 +119,7 @@ enum { + PROP_USB_FILTER, + PROP_PROXY, + PROP_VERSION, ++ PROP_VERSIONS, + PROP_SECURE_CHANNELS, + PROP_DELETE_THIS_FILE, + PROP_SECURE_ATTENTION, +@@ -615,6 +617,65 @@ virt_viewer_file_set_version(VirtViewerFile* self, const gchar* value) + g_object_notify(G_OBJECT(self), "version"); + } + ++GHashTable* ++virt_viewer_file_get_versions(VirtViewerFile* self) ++{ ++ GHashTable *versions; ++ gchar **versions_str; ++ gsize length; ++ unsigned int i; ++ ++ versions = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free); ++ versions_str = virt_viewer_file_get_string_list(self, MAIN_GROUP, ++ "versions", &length); ++ for (i = 0; i < length; i++) { ++ GStrv tokens; ++ ++ if (versions_str[i] == NULL) { ++ g_warn_if_reached(); ++ break; ++ } ++ tokens = g_strsplit(versions_str[i], ":", 2); ++ if (g_strv_length(tokens) != 2) { ++ g_warn_if_reached(); ++ continue; ++ } ++ g_debug("Minimum version '%s' for OS id '%s'", tokens[1], tokens[0]); ++ g_hash_table_insert(versions, tokens[0], tokens[1]); ++ g_free(tokens); ++ } ++ g_strfreev(versions_str); ++ ++ return versions; ++} ++ ++void ++virt_viewer_file_set_versions(VirtViewerFile* self, GHashTable *version_table) ++{ ++ GHashTableIter iter; ++ gpointer key, value; ++ GPtrArray *versions; ++ ++ versions = g_ptr_array_new_with_free_func(g_free); ++ ++ g_hash_table_iter_init(&iter, version_table); ++ while (g_hash_table_iter_next(&iter, &key, &value)) { ++ char *str; ++ ++ /* Check that id only contains letters/numbers/- */ ++ /* Check that version only contains numbers, ., :, -, (letters ?) */ ++ /* FIXME: ':' separator overlaps with ':' epoch indicator */ ++ ++ str = g_strdup_printf("%s:%s", (char *)key, (char *)value); ++ g_ptr_array_add(versions, str); ++ } ++ virt_viewer_file_set_string_list(self, MAIN_GROUP, "versions", ++ (const char * const *)versions->pdata, ++ versions->len); ++ g_ptr_array_unref(versions); ++ g_object_notify(G_OBJECT(self), "versions"); ++} ++ + gchar** + virt_viewer_file_get_secure_channels(VirtViewerFile* self, gsize* length) + { +@@ -862,6 +923,9 @@ virt_viewer_file_set_property(GObject* object, guint property_id, + case PROP_VERSION: + virt_viewer_file_set_version(self, g_value_get_string(value)); + break; ++ case PROP_VERSIONS: ++ virt_viewer_file_set_versions(self, g_value_get_boxed(value)); ++ break; + case PROP_SECURE_CHANNELS: + strv = g_value_get_boxed(value); + virt_viewer_file_set_secure_channels(self, (const gchar* const*)strv, g_strv_length(strv)); +@@ -966,6 +1030,9 @@ virt_viewer_file_get_property(GObject* object, guint property_id, + case PROP_VERSION: + g_value_take_string(value, virt_viewer_file_get_version(self)); + break; ++ case PROP_VERSIONS: ++ g_value_take_boxed(value, virt_viewer_file_get_versions(self)); ++ break; + case PROP_SECURE_CHANNELS: + g_value_take_boxed(value, virt_viewer_file_get_secure_channels(self, NULL)); + break; +@@ -1114,6 +1181,10 @@ virt_viewer_file_class_init(VirtViewerFileClass* klass) + g_param_spec_string("version", "version", "version", NULL, + G_PARAM_STATIC_STRINGS | G_PARAM_READWRITE)); + ++ g_object_class_install_property(G_OBJECT_CLASS(klass), PROP_VERSIONS, ++ g_param_spec_boxed("versions", "versions", "versions", G_TYPE_HASH_TABLE, ++ G_PARAM_STATIC_STRINGS | G_PARAM_READWRITE)); ++ + g_object_class_install_property(G_OBJECT_CLASS(klass), PROP_SECURE_CHANNELS, + g_param_spec_boxed("secure-channels", "secure-channels", "secure-channels", G_TYPE_STRV, + G_PARAM_STATIC_STRINGS | G_PARAM_READWRITE)); +diff --git a/src/virt-viewer-file.h b/src/virt-viewer-file.h +index e84988a..1635507 100644 +--- a/src/virt-viewer-file.h ++++ b/src/virt-viewer-file.h +@@ -102,6 +102,8 @@ gchar* virt_viewer_file_get_proxy(VirtViewerFile* self); + void virt_viewer_file_set_proxy(VirtViewerFile* self, const gchar* value); + gchar* virt_viewer_file_get_version(VirtViewerFile* self); + void virt_viewer_file_set_version(VirtViewerFile* self, const gchar* value); ++GHashTable* virt_viewer_file_get_versions(VirtViewerFile* self); ++void virt_viewer_file_set_versions(VirtViewerFile* self, GHashTable *version_table); + gchar** virt_viewer_file_get_secure_channels(VirtViewerFile* self, gsize* length); + void virt_viewer_file_set_secure_channels(VirtViewerFile* self, const gchar* const* value, gsize length); + gint virt_viewer_file_get_delete_this_file(VirtViewerFile* self); diff --git a/SOURCES/0038-Change-per-guest-fullscreen-config-format.patch b/SOURCES/0038-Change-per-guest-fullscreen-config-format.patch deleted file mode 100644 index 54f25fa..0000000 --- a/SOURCES/0038-Change-per-guest-fullscreen-config-format.patch +++ /dev/null @@ -1,214 +0,0 @@ -From 9c5cb3367b05ab32c9ecd88842736639e5b17328 Mon Sep 17 00:00:00 2001 -From: Jonathon Jongsma -Date: Mon, 20 Jan 2014 10:26:10 -0600 -Subject: [PATCH] Change per-guest fullscreen config format - -use :;: instead of simply implying the -display from the array index (e.g. ;). This allows you to set -up sparse guest displays (e.g. display 1 + 3). - -For example, to configure display 1 to be fullscreen on monitor 2 and display 2 -to be fullscreen on monitor 3: - - monitor-mapping=1:2;2:3 ---- - src/virt-viewer-app.c | 133 +++++++++++++++++++++++++++++----------- - src/virt-viewer-session-spice.c | 2 +- - 2 files changed, 99 insertions(+), 36 deletions(-) - -diff --git a/src/virt-viewer-app.c b/src/virt-viewer-app.c -index 8f5aa2b..9182fe4 100644 ---- a/src/virt-viewer-app.c -+++ b/src/virt-viewer-app.c -@@ -108,7 +108,7 @@ struct _VirtViewerAppPrivate { - VirtViewerWindow *main_window; - GtkWidget *main_notebook; - GHashTable *windows; -- GArray *initial_display_map; -+ GHashTable *initial_display_map; - gchar *clipboard; - - gboolean direct; -@@ -273,20 +273,19 @@ virt_viewer_app_quit(VirtViewerApp *self) - gint virt_viewer_app_get_n_initial_displays(VirtViewerApp* self) - { - if (self->priv->initial_display_map) -- return self->priv->initial_display_map->len; -+ return g_hash_table_size(self->priv->initial_display_map); - - return gdk_screen_get_n_monitors(gdk_screen_get_default()); - } - - gint virt_viewer_app_get_initial_monitor_for_display(VirtViewerApp* self, gint display) - { -- gint monitor = -1; -+ gint monitor = display; - - if (self->priv->initial_display_map) { -- if (display < self->priv->initial_display_map->len) -- monitor = g_array_index(self->priv->initial_display_map, gint, display); -- } else { -- monitor = display; -+ gpointer value = NULL; -+ if (g_hash_table_lookup_extended(self->priv->initial_display_map, GINT_TO_POINTER(display), NULL, &value)) -+ monitor = GPOINTER_TO_INT(value); - } - - return monitor; -@@ -307,43 +306,107 @@ app_window_try_fullscreen(VirtViewerApp *self G_GNUC_UNUSED, - } - - --static --void virt_viewer_app_set_uuid_string(VirtViewerApp* self, const gchar* uuid_string) -+static GHashTable* -+virt_viewer_app_parse_monitor_mappings(gchar **mappings, gsize nmappings) - { -- GArray* mapping = NULL; -- GError* error = NULL; -- gsize ndisplays = 0; -- gint* displays = NULL; - gint nmonitors = gdk_screen_get_n_monitors(gdk_screen_get_default()); -+ GHashTable *displaymap = g_hash_table_new(g_direct_hash, g_direct_equal); -+ GHashTable *monitormap = g_hash_table_new(g_direct_hash, g_direct_equal); -+ int i = 0; -+ gchar **tokens = NULL; -+ -+ for (i = 0; i < nmappings; i++) { -+ gchar *endptr = NULL; -+ gint display = 0, monitor = 0; -+ -+ tokens = g_strsplit(mappings[i], ":", 2); -+ if (g_strv_length(tokens) != 2) { -+ g_warning("Invalid monitor-mapping configuration: '%s'. Expected format is ':'. Got %lu elements", mappings[i], G_N_ELEMENTS(tokens)); -+ g_strfreev(tokens); -+ goto configerror; -+ } - -- g_debug("%s: UUID changed to %s", G_STRFUNC, uuid_string); -+ display = strtol(tokens[0], &endptr, 10); -+ if ((endptr && *endptr != '\0') || display < 1) { -+ g_warning("Invalid monitor-mapping configuration: display id is invalid: %s %p='%s'", tokens[0], endptr, endptr); -+ g_strfreev(tokens); -+ goto configerror; -+ } -+ monitor = strtol(tokens[1], &endptr, 10); -+ if ((endptr && *endptr != '\0') || monitor < 1) { -+ g_warning("Invalid monitor-mapping configuration: monitor id '%s' is invalid", tokens[1]); -+ g_strfreev(tokens); -+ goto configerror; -+ } -+ g_strfreev(tokens); -+ -+ if (monitor > nmonitors) -+ g_warning("Initial monitor #%i for display #%i does not exist, skipping...", monitor, display); -+ else { -+ /* config file format is 1-based, not 0-based */ -+ display--; -+ monitor--; -+ -+ if (g_hash_table_lookup_extended(displaymap, GINT_TO_POINTER(display), NULL, NULL) || -+ g_hash_table_lookup_extended(monitormap, GINT_TO_POINTER(monitor), NULL, NULL)) { -+ g_warning("Invalid monitor-mapping configuration: a display or monitor id was specified twice"); -+ goto configerror; -+ } -+ g_debug("Fullscreen config: mapping guest display %i to monitor %i", display, monitor); -+ g_hash_table_insert(displaymap, GINT_TO_POINTER(display), GINT_TO_POINTER(monitor)); -+ g_hash_table_insert(monitormap, GINT_TO_POINTER(monitor), GINT_TO_POINTER(display)); -+ } -+ } - -- g_free(self->priv->uuid); -- self->priv->uuid = g_strdup(uuid_string); -- displays = g_key_file_get_integer_list(self->priv->config, -- uuid_string, "monitor-mapping", &ndisplays, &error); -+ g_hash_table_unref(monitormap); -+ return displaymap; -+ -+configerror: -+ g_hash_table_unref(monitormap); -+ g_hash_table_unref(displaymap); -+ return NULL; -+} -+ -+static GHashTable* -+virt_viewer_app_get_monitor_mapping_for_section(VirtViewerApp *self, const gchar *section) -+{ -+ GError *error = NULL; -+ gsize nmappings = 0; -+ gchar **mappings = NULL; -+ GHashTable *mapping = NULL; -+ -+ mappings = g_key_file_get_string_list(self->priv->config, -+ section, "monitor-mapping", &nmappings, &error); - if (error) { -- if (error->code != G_KEY_FILE_ERROR_GROUP_NOT_FOUND) -- g_warning("Error reading monitor assignments: %s", error->message); -+ if (error->code != G_KEY_FILE_ERROR_GROUP_NOT_FOUND -+ && error->code != G_KEY_FILE_ERROR_KEY_NOT_FOUND) -+ g_warning("Error reading monitor assignments for %s: %s", section, error->message); - g_clear_error(&error); - } else { -- int i = 0; -- mapping = g_array_sized_new(FALSE, FALSE, sizeof(displays[0]), ndisplays); -- // config file format is 1-based, not 0-based -- for (i = 0; i < ndisplays; i++) { -- gint val = displays[i] - 1; -- -- // sanity check -- if (val >= nmonitors) -- g_warning("Initial monitor #%i for display #%i does not exist, skipping...", val, i); -- else -- g_array_append_val(mapping, val); -- } -- g_free(displays); -+ mapping = virt_viewer_app_parse_monitor_mappings(mappings, nmappings); -+ } -+ g_strfreev(mappings); -+ -+ return mapping; -+} -+ -+static -+void virt_viewer_app_set_uuid_string(VirtViewerApp *self, const gchar *uuid_string) -+{ -+ GHashTable *mapping = NULL; -+ -+ g_debug("%s: UUID changed to %s", G_STRFUNC, uuid_string); -+ -+ g_free(self->priv->uuid); -+ self->priv->uuid = g_strdup(uuid_string); -+ mapping = virt_viewer_app_get_monitor_mapping_for_section(self, uuid_string); -+ if (!mapping) { -+ g_debug("No guest-specific fullscreen config, using fallback"); -+ mapping = virt_viewer_app_get_monitor_mapping_for_section(self, "fallback"); - } - - if (self->priv->initial_display_map) -- g_array_unref(self->priv->initial_display_map); -+ g_hash_table_unref(self->priv->initial_display_map); - - self->priv->initial_display_map = mapping; - -@@ -1542,7 +1605,7 @@ virt_viewer_app_dispose (GObject *object) - g_free(priv->config_file); - priv->config_file = NULL; - g_clear_pointer(&priv->config, g_key_file_free); -- g_clear_pointer(&priv->initial_display_map, g_array_unref); -+ g_clear_pointer(&priv->initial_display_map, g_hash_table_unref); - - virt_viewer_app_free_connect_info(self); - -diff --git a/src/virt-viewer-session-spice.c b/src/virt-viewer-session-spice.c -index c286fd9..097c9d7 100644 ---- a/src/virt-viewer-session-spice.c -+++ b/src/virt-viewer-session-spice.c -@@ -855,7 +855,7 @@ name_changed(GObject *gobject G_GNUC_UNUSED, - VirtViewerSessionSpice *self) - { - gchar *name = NULL; -- VirtViewerApp* app = virt_viewer_session_get_app(VIRT_VIEWER_SESSION(self)); -+ VirtViewerApp *app = virt_viewer_session_get_app(VIRT_VIEWER_SESSION(self)); - - g_object_get(self->priv->session, "name", &name, NULL); - diff --git a/SOURCES/0038-build-sys-Add-with-osid.patch b/SOURCES/0038-build-sys-Add-with-osid.patch new file mode 100644 index 0000000..a35ebc5 --- /dev/null +++ b/SOURCES/0038-build-sys-Add-with-osid.patch @@ -0,0 +1,32 @@ +From ae7b4d9c8d9153d0562495f477d9b658c3473511 Mon Sep 17 00:00:00 2001 +From: Christophe Fergeau +Date: Tue, 19 May 2015 18:35:52 +0200 +Subject: [PATCH] build-sys: Add --with-osid + +This new configure flag allows to specify a string ID (eg fedora22, +ubuntu10.04, ..) identifying the OS this remote-viewer build will be +for. This will be used in combination with the new 'versions' field in +.vv files in order to make it possible for the creator of the .vv file +to specify which version it expects for the various OSes which may +connect. +--- + configure.ac | 6 ++++++ + 1 file changed, 6 insertions(+) + +diff --git a/configure.ac b/configure.ac +index d893631..4adb58d 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -219,6 +219,12 @@ if test "x$have_gtk_vnc" != "xyes" && test "x$have_spice_gtk" != "xyes"; then + AC_MSG_ERROR([At least one of spice or vnc must be used]) + fi + ++AC_ARG_WITH([osid], ++ AS_HELP_STRING([--with-osid=id], [Set OS ID for use in .vv files])) ++if test -n "$with_osid"; then ++ AC_DEFINE_UNQUOTED([REMOTE_VIEWER_OS_ID], "$with_osid", [OS ID for this build]) ++fi ++ + AC_ARG_WITH([buildid], + AS_HELP_STRING([--with-buildid=id], [Set additional build version details]), + [buildid="$with_buildid"], [buildid="0"]) diff --git a/SOURCES/0039-Show-osid-in-remote-viewer-version.patch b/SOURCES/0039-Show-osid-in-remote-viewer-version.patch new file mode 100644 index 0000000..6d2d59c --- /dev/null +++ b/SOURCES/0039-Show-osid-in-remote-viewer-version.patch @@ -0,0 +1,26 @@ +From 6b329feaeeb9f04b488e9b7b5f6c8f4c800a0355 Mon Sep 17 00:00:00 2001 +From: Christophe Fergeau +Date: Tue, 9 Jun 2015 12:22:25 +0200 +Subject: [PATCH] Show osid in remote-viewer --version + +--- + src/remote-viewer-main.c | 6 +++++- + 1 file changed, 5 insertions(+), 1 deletion(-) + +diff --git a/src/remote-viewer-main.c b/src/remote-viewer-main.c +index e8784ba..c5073d8 100644 +--- a/src/remote-viewer-main.c ++++ b/src/remote-viewer-main.c +@@ -47,7 +47,11 @@ + static void + remote_viewer_version(void) + { +- g_print(_("remote-viewer version %s\n"), VERSION BUILDID); ++ g_print(_("remote-viewer version %s"), VERSION BUILDID); ++#ifdef REMOTE_VIEWER_OS_ID ++ g_print(" (OS ID: %s)", REMOTE_VIEWER_OS_ID); ++#endif ++ g_print("\n"); + exit(EXIT_SUCCESS); + } + diff --git a/SOURCES/0039-Write-vm-name-to-config-file-as-comment.patch b/SOURCES/0039-Write-vm-name-to-config-file-as-comment.patch deleted file mode 100644 index 3702b5b..0000000 --- a/SOURCES/0039-Write-vm-name-to-config-file-as-comment.patch +++ /dev/null @@ -1,34 +0,0 @@ -From 894ca98a86fb56b5dd0fae2631a5ad1a5db64416 Mon Sep 17 00:00:00 2001 -From: Jonathon Jongsma -Date: Mon, 20 Jan 2014 10:27:36 -0600 -Subject: [PATCH] Write vm name to config file as comment - ---- - src/virt-viewer-app.c | 14 ++++++++++++++ - 1 file changed, 14 insertions(+) - -diff --git a/src/virt-viewer-app.c b/src/virt-viewer-app.c -index 9182fe4..aa574be 100644 ---- a/src/virt-viewer-app.c -+++ b/src/virt-viewer-app.c -@@ -242,6 +242,20 @@ virt_viewer_app_save_config(VirtViewerApp *self) - g_warning("failed to create config directory"); - g_free(dir); - -+ if (priv->uuid && priv->guest_name) { -+ // if there's no comment for this uuid settings group, add a comment -+ // with the vm name so user can make sense of it later. -+ gchar *comment = g_key_file_get_comment(priv->config, priv->uuid, NULL, &error); -+ if (error) { -+ g_warning("Unable to get comment from key file: %s", error->message); -+ g_clear_error(&error); -+ } else { -+ if (!comment || *comment == '\0') -+ g_key_file_set_comment(priv->config, priv->uuid, NULL, priv->guest_name, NULL); -+ } -+ g_free(comment); -+ } -+ - if ((data = g_key_file_to_data(priv->config, NULL, &error)) == NULL || - !g_file_set_contents(priv->config_file, data, -1, &error)) { - g_warning("Couldn't save configuration: %s", error->message); diff --git a/SOURCES/0040-Don-t-print-warning-for-missing-comment-in-config-fi.patch b/SOURCES/0040-Don-t-print-warning-for-missing-comment-in-config-fi.patch deleted file mode 100644 index 31abb67..0000000 --- a/SOURCES/0040-Don-t-print-warning-for-missing-comment-in-config-fi.patch +++ /dev/null @@ -1,23 +0,0 @@ -From e6afb98c0ed4aa45a77e84bea412b283a9b87789 Mon Sep 17 00:00:00 2001 -From: Jonathon Jongsma -Date: Fri, 5 Sep 2014 11:15:52 -0500 -Subject: [PATCH] Don't print warning for missing comment in config file - -Change g_warning to g_debug as suggested by Marc-Andre ---- - src/virt-viewer-app.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/src/virt-viewer-app.c b/src/virt-viewer-app.c -index aa574be..b8b5c9c 100644 ---- a/src/virt-viewer-app.c -+++ b/src/virt-viewer-app.c -@@ -247,7 +247,7 @@ virt_viewer_app_save_config(VirtViewerApp *self) - // with the vm name so user can make sense of it later. - gchar *comment = g_key_file_get_comment(priv->config, priv->uuid, NULL, &error); - if (error) { -- g_warning("Unable to get comment from key file: %s", error->message); -+ g_debug("Unable to get comment from key file: %s", error->message); - g_clear_error(&error); - } else { - if (!comment || *comment == '\0') diff --git a/SOURCES/0040-vv-file-Use-versions-in-min-version-check.patch b/SOURCES/0040-vv-file-Use-versions-in-min-version-check.patch new file mode 100644 index 0000000..45ba34a --- /dev/null +++ b/SOURCES/0040-vv-file-Use-versions-in-min-version-check.patch @@ -0,0 +1,48 @@ +From d02fdf662affc1a0911b2c56f28994160bbb19e8 Mon Sep 17 00:00:00 2001 +From: Christophe Fergeau +Date: Thu, 16 Apr 2015 17:28:57 +0200 +Subject: [PATCH] vv-file: Use "versions" in min version check + +This tries to use the list of versions added to .vv files by the +previous commit. If remote-viewer was built with an os-id specified, and +if it's found in the 'versions' .vv file key, then the version +associated with it is used for version checks, otherwise the 'version' +field is used if present. +--- + src/virt-viewer-file.c | 23 +++++++++++++++++++++-- + 1 file changed, 21 insertions(+), 2 deletions(-) + +diff --git a/src/virt-viewer-file.c b/src/virt-viewer-file.c +index 35d25fb..3caf1ec 100644 +--- a/src/virt-viewer-file.c ++++ b/src/virt-viewer-file.c +@@ -774,8 +774,27 @@ virt_viewer_file_check_min_version(VirtViewerFile *self, GError **error) + gchar *min_version = NULL; + gint version_cmp; + +- if (virt_viewer_file_is_set(self, "version")) { +- min_version = virt_viewer_file_get_version(self); ++#ifdef REMOTE_VIEWER_OS_ID ++ if (virt_viewer_file_is_set(self, "versions")) { ++ GHashTable *versions; ++ ++ versions = virt_viewer_file_get_versions(self); ++ ++ min_version = g_strdup(g_hash_table_lookup(versions, REMOTE_VIEWER_OS_ID)); ++ ++ g_hash_table_unref(versions); ++ } ++#endif ++ ++ ++ if (min_version == NULL) { ++ if (virt_viewer_file_is_set(self, "version")) { ++ min_version = virt_viewer_file_get_version(self); ++ } ++ } ++ ++ if (min_version == NULL) { ++ return TRUE; + } + + version_cmp = virt_viewer_compare_version(min_version, PACKAGE_VERSION); diff --git a/SOURCES/0041-remote-viewer-allow-username-in-ovirt-URIs.patch b/SOURCES/0041-remote-viewer-allow-username-in-ovirt-URIs.patch deleted file mode 100644 index 1f519c6..0000000 --- a/SOURCES/0041-remote-viewer-allow-username-in-ovirt-URIs.patch +++ /dev/null @@ -1,122 +0,0 @@ -From 7053d0bcbe47163fbc427aa8eff7e4892330c295 Mon Sep 17 00:00:00 2001 -From: Jonathon Jongsma -Date: Fri, 18 Jul 2014 16:51:05 -0500 -Subject: [PATCH] remote-viewer: allow username in ovirt URIs - -When the user launches remote-viewer with an ovirt URI of the form - - ovirt://user@host/vmname - -Pre-populate the authentication dialog with the specified username. We -don't support specifying the password on the commandline, since that is -a potential security risk. - -Resolves: rhbz#1061826 - -(cherry picked from commit 49abd71dae12d2b284aee7d6c9c8213b22738b19) ---- - src/remote-viewer.c | 20 ++++++++++++++++---- - src/virt-viewer-auth.c | 10 +++++++++- - 2 files changed, 25 insertions(+), 5 deletions(-) - -diff --git a/src/remote-viewer.c b/src/remote-viewer.c -index fac8915..2782ad3 100644 ---- a/src/remote-viewer.c -+++ b/src/remote-viewer.c -@@ -631,7 +631,7 @@ remote_viewer_window_added(VirtViewerApp *app G_GNUC_UNUSED, - - #ifdef HAVE_OVIRT - static gboolean --parse_ovirt_uri(const gchar *uri_str, char **rest_uri, char **name) -+parse_ovirt_uri(const gchar *uri_str, char **rest_uri, char **name, char** username) - { - char *vm_name = NULL; - char *rel_path; -@@ -669,6 +669,9 @@ parse_ovirt_uri(const gchar *uri_str, char **rest_uri, char **name) - vm_name = path_elements[element_count-1]; - path_elements[element_count-1] = NULL; - -+ if (username && uri->user) -+ *username = g_strdup(uri->user); -+ - /* build final URI */ - rel_path = g_strjoinv("/", path_elements); - /* FIXME: how to decide between http and https? */ -@@ -688,10 +691,14 @@ static gboolean - authenticate_cb(RestProxy *proxy, G_GNUC_UNUSED RestProxyAuth *auth, - G_GNUC_UNUSED gboolean retrying, gpointer user_data) - { -- gchar *username; -- gchar *password; -+ gchar *username = NULL; -+ gchar *password = NULL; - VirtViewerWindow *window; - -+ g_object_get(proxy, -+ "username", &username, -+ NULL); -+ - window = virt_viewer_app_get_main_window(VIRT_VIEWER_APP(user_data)); - int ret = virt_viewer_auth_collect_credentials(virt_viewer_window_get_window(window), - "oVirt", -@@ -723,6 +730,7 @@ create_ovirt_session(VirtViewerApp *app, const char *uri) - GError *error = NULL; - char *rest_uri = NULL; - char *vm_name = NULL; -+ char* username = NULL; - gboolean success = FALSE; - guint port; - guint secure_port; -@@ -737,11 +745,15 @@ create_ovirt_session(VirtViewerApp *app, const char *uri) - - g_return_val_if_fail(VIRT_VIEWER_IS_APP(app), FALSE); - -- if (!parse_ovirt_uri(uri, &rest_uri, &vm_name)) -+ if (!parse_ovirt_uri(uri, &rest_uri, &vm_name, &username)) - goto error; - proxy = ovirt_proxy_new(rest_uri); - if (proxy == NULL) - goto error; -+ -+ g_object_set(proxy, -+ "username", username, -+ NULL); - ovirt_set_proxy_options(proxy); - g_signal_connect(G_OBJECT(proxy), "authenticate", - G_CALLBACK(authenticate_cb), app); -diff --git a/src/virt-viewer-auth.c b/src/virt-viewer-auth.c -index 1fb670d..c4ea693 100644 ---- a/src/virt-viewer-auth.c -+++ b/src/virt-viewer-auth.c -@@ -32,6 +32,10 @@ - #include "virt-viewer-auth.h" - - -+/* NOTE: if username is provided, and *username is non-NULL, the user input -+ * field will be pre-filled with this value. The existing string will be freed -+ * before setting the output parameter to the user-entered value. -+ */ - int - virt_viewer_auth_collect_credentials(GtkWindow *window, - const char *type, -@@ -60,6 +64,8 @@ virt_viewer_auth_collect_credentials(GtkWindow *window, - promptPassword = GTK_WIDGET(gtk_builder_get_object(creds, "prompt-password")); - - gtk_widget_set_sensitive(credUsername, username != NULL); -+ if (username && *username) -+ gtk_entry_set_text(GTK_ENTRY(credUsername), *username); - gtk_widget_set_sensitive(promptUsername, username != NULL); - gtk_widget_set_sensitive(credPassword, password != NULL); - gtk_widget_set_sensitive(promptPassword, password != NULL); -@@ -82,8 +88,10 @@ virt_viewer_auth_collect_credentials(GtkWindow *window, - gtk_widget_hide(dialog); - - if (response == GTK_RESPONSE_OK) { -- if (username) -+ if (username) { -+ g_free(*username); - *username = g_strdup(gtk_entry_get_text(GTK_ENTRY(credUsername))); -+ } - if (password) - *password = g_strdup(gtk_entry_get_text(GTK_ENTRY(credPassword))); - } diff --git a/SOURCES/0041-util-Replace-virt_viewer_compare_version-with-_compa.patch b/SOURCES/0041-util-Replace-virt_viewer_compare_version-with-_compa.patch new file mode 100644 index 0000000..d63b840 --- /dev/null +++ b/SOURCES/0041-util-Replace-virt_viewer_compare_version-with-_compa.patch @@ -0,0 +1,167 @@ +From 6945375d605f7b7563994d3b801a8745f3d95ff5 Mon Sep 17 00:00:00 2001 +From: Christophe Fergeau +Date: Tue, 21 Apr 2015 18:09:14 +0200 +Subject: [PATCH] util: Replace virt_viewer_compare_version with + _compare_buildid + +This allows us to do a more accurate version check if the .vv file +producer wants to allow builds newer than x.y-z because they contain an +important bug fix. +--- + man/remote-viewer.pod | 3 ++- + src/virt-viewer-file.c | 3 +-- + src/virt-viewer-util.c | 73 +++++++++++++++++++++++++++++++++++++++----------- + src/virt-viewer-util.h | 2 +- + 4 files changed, 61 insertions(+), 20 deletions(-) + +diff --git a/man/remote-viewer.pod b/man/remote-viewer.pod +index e10b0b8..bda513d 100644 +--- a/man/remote-viewer.pod ++++ b/man/remote-viewer.pod +@@ -141,7 +141,8 @@ protocol: + If remote-viewer version number isn't greater or equal to the required + version, an error is raised with the expected version. + +-The version format accepted is a list of integers separated by '.'. ++The version format accepted is a list of integers separated by '.'. It can ++be followed by a dash '-' and an additional build number with the same format. + + Version comparison is done by comparing each integer from the list one by + one. If any of the component is not a number, the version comparison will fail +diff --git a/src/virt-viewer-file.c b/src/virt-viewer-file.c +index 3caf1ec..3f06d1e 100644 +--- a/src/virt-viewer-file.c ++++ b/src/virt-viewer-file.c +@@ -796,8 +796,7 @@ virt_viewer_file_check_min_version(VirtViewerFile *self, GError **error) + if (min_version == NULL) { + return TRUE; + } +- +- version_cmp = virt_viewer_compare_version(min_version, PACKAGE_VERSION); ++ version_cmp = virt_viewer_compare_buildid(min_version, PACKAGE_VERSION BUILDID); + + if (version_cmp > 0) { + g_set_error(error, +diff --git a/src/virt-viewer-util.c b/src/virt-viewer-util.c +index aec3b77..19a475e 100644 +--- a/src/virt-viewer-util.c ++++ b/src/virt-viewer-util.c +@@ -1,7 +1,7 @@ + /* + * Virt Viewer: A virtual machine console viewer + * +- * Copyright (C) 2007-2012 Red Hat, Inc. ++ * Copyright (C) 2007-2015 Red Hat, Inc. + * Copyright (C) 2009-2012 Daniel P. Berrange + * + * This program is free software; you can redistribute it and/or modify +@@ -439,25 +439,24 @@ spice_hotkey_to_gtk_accelerator(const gchar *key) + return accel; + } + +-/** +- * virt_viewer_compare_version: +- * @s1: a version-like string +- * @s2: a version-like string +- * +- * Compare two version-like strings: 1.1 > 1.0, 1.0.1 > 1.0, 1.10 > 1.7... +- * +- * String suffix (1.0rc1 etc) are not accepted, and will return 0. +- * +- * Returns: negative value if s1 < s2; zero if s1 = s2; positive value if s1 > s2. +- **/ +-gint ++static gboolean str_is_empty(const gchar *str) ++{ ++ return ((str == NULL) || (str[0] == '\0')); ++} ++ ++static gint + virt_viewer_compare_version(const gchar *s1, const gchar *s2) + { + gint i, retval = 0; + gchar **v1, **v2; + +- g_return_val_if_fail(s1 != NULL, 0); +- g_return_val_if_fail(s2 != NULL, 0); ++ if (str_is_empty(s1) && str_is_empty(s2)) { ++ return 0; ++ } else if (str_is_empty(s1)) { ++ return -1; ++ } else if (str_is_empty(s2)) { ++ return 1; ++ } + + v1 = g_strsplit(s1, ".", -1); + v2 = g_strsplit(s2, ".", -1); +@@ -473,7 +472,7 @@ virt_viewer_compare_version(const gchar *s1, const gchar *s2) + + g_return_val_if_fail(e1 && e2, 0); + if (*e1 || *e2) { +- g_warning("the version string contains suffix"); ++ g_warning("the version string contains a suffix"); + goto end; + } + } +@@ -489,6 +488,48 @@ end: + return retval; + } + ++/** ++ * virt_viewer_compare_buildid: ++ * @s1: a version-like string ++ * @s2: a version-like string ++ * ++ * Compare two buildid strings: 1.1-1 > 1.0-1, 1.0-2 > 1.0-1, 1.10 > 1.7... ++ * ++ * String suffix (1.0rc1 etc) are not accepted, and will return 0. ++ * ++ * Returns: negative value if s1 < s2; zero if s1 = s2; positive value if s1 > s2. ++ **/ ++gint ++virt_viewer_compare_buildid(const gchar *s1, const gchar *s2) ++{ ++ int ret = 0; ++ GStrv split1 = NULL; ++ GStrv split2 = NULL; ++ ++ split1 = g_strsplit(s1, "-", 2); ++ split2 = g_strsplit(s2, "-", 2); ++ if ((split1 == NULL) || (split2 == NULL)) { ++ goto end; ++ } ++ /* Compare versions */ ++ ret = virt_viewer_compare_version(split1[0], split2[0]); ++ if (ret != 0) { ++ goto end; ++ } ++ if ((split1[0] == NULL) || (split2[0] == NULL)) { ++ goto end; ++ } ++ ++ /* Compare -release */ ++ ret = virt_viewer_compare_version(split1[1], split2[1]); ++ ++end: ++ g_strfreev(split1); ++ g_strfreev(split2); ++ ++ return ret; ++} ++ + /* simple sorting of monitors. Primary sort left-to-right, secondary sort from + * top-to-bottom, finally by monitor id */ + static int +diff --git a/src/virt-viewer-util.h b/src/virt-viewer-util.h +index 1df81a5..ec9be22 100644 +--- a/src/virt-viewer-util.h ++++ b/src/virt-viewer-util.h +@@ -53,7 +53,7 @@ gulong virt_viewer_signal_connect_object(gpointer instance, + GConnectFlags connect_flags); + + gchar* spice_hotkey_to_gtk_accelerator(const gchar *key); +-gint virt_viewer_compare_version(const gchar *s1, const gchar *s2); ++gint virt_viewer_compare_buildid(const gchar *s1, const gchar *s2); + + /* monitor alignment */ + void virt_viewer_align_monitors_linear(GdkRectangle *displays, guint ndisplays); diff --git a/SOURCES/0042-remote-viewer-oVirt-username-review-fixes.patch b/SOURCES/0042-remote-viewer-oVirt-username-review-fixes.patch deleted file mode 100644 index 9fab72b..0000000 --- a/SOURCES/0042-remote-viewer-oVirt-username-review-fixes.patch +++ /dev/null @@ -1,61 +0,0 @@ -From 71241ea3d9643a1d735d68b2a9670ccd060a1df8 Mon Sep 17 00:00:00 2001 -From: Jonathon Jongsma -Date: Fri, 18 Jul 2014 16:45:58 -0500 -Subject: [PATCH] remote-viewer: oVirt username review fixes - -Minor fixes from patch review - -Resolves: rhbz#1061826 -(cherry picked from commit ad8966ccf93d10ee21d43328b3970e8857570584) ---- - src/remote-viewer.c | 5 +++-- - src/virt-viewer-auth.c | 5 ++++- - 2 files changed, 7 insertions(+), 3 deletions(-) - -diff --git a/src/remote-viewer.c b/src/remote-viewer.c -index 2782ad3..d9d7baf 100644 ---- a/src/remote-viewer.c -+++ b/src/remote-viewer.c -@@ -631,7 +631,7 @@ remote_viewer_window_added(VirtViewerApp *app G_GNUC_UNUSED, - - #ifdef HAVE_OVIRT - static gboolean --parse_ovirt_uri(const gchar *uri_str, char **rest_uri, char **name, char** username) -+parse_ovirt_uri(const gchar *uri_str, char **rest_uri, char **name, char **username) - { - char *vm_name = NULL; - char *rel_path; -@@ -730,7 +730,7 @@ create_ovirt_session(VirtViewerApp *app, const char *uri) - GError *error = NULL; - char *rest_uri = NULL; - char *vm_name = NULL; -- char* username = NULL; -+ char *username = NULL; - gboolean success = FALSE; - guint port; - guint secure_port; -@@ -836,6 +836,7 @@ create_ovirt_session(VirtViewerApp *app, const char *uri) - success = TRUE; - - error: -+ g_free(username); - g_free(rest_uri); - g_free(vm_name); - g_free(ticket); -diff --git a/src/virt-viewer-auth.c b/src/virt-viewer-auth.c -index c4ea693..bb03516 100644 ---- a/src/virt-viewer-auth.c -+++ b/src/virt-viewer-auth.c -@@ -64,8 +64,11 @@ virt_viewer_auth_collect_credentials(GtkWindow *window, - promptPassword = GTK_WIDGET(gtk_builder_get_object(creds, "prompt-password")); - - gtk_widget_set_sensitive(credUsername, username != NULL); -- if (username && *username) -+ if (username && *username) { - gtk_entry_set_text(GTK_ENTRY(credUsername), *username); -+ /* if username is pre-filled, move focus to password field */ -+ gtk_widget_grab_focus(credPassword); -+ } - gtk_widget_set_sensitive(promptUsername, username != NULL); - gtk_widget_set_sensitive(credPassword, password != NULL); - gtk_widget_set_sensitive(promptPassword, password != NULL); diff --git a/SOURCES/0042-test-Add-test-case-for-virt_viewer_compare_buildid.patch b/SOURCES/0042-test-Add-test-case-for-virt_viewer_compare_buildid.patch new file mode 100644 index 0000000..7ef7ba1 --- /dev/null +++ b/SOURCES/0042-test-Add-test-case-for-virt_viewer_compare_buildid.patch @@ -0,0 +1,107 @@ +From 9b976f34a414740aa966b7373930e8c17e28bd76 Mon Sep 17 00:00:00 2001 +From: Christophe Fergeau +Date: Wed, 20 May 2015 13:29:11 +0200 +Subject: [PATCH] test: Add test case for virt_viewer_compare_buildid + +--- + src/Makefile.am | 20 ++++++++++++++++ + src/test-version-compare.c | 59 ++++++++++++++++++++++++++++++++++++++++++++++ + 2 files changed, 79 insertions(+) + create mode 100644 src/test-version-compare.c + +diff --git a/src/Makefile.am b/src/Makefile.am +index e76da2c..b8dbb35 100644 +--- a/src/Makefile.am ++++ b/src/Makefile.am +@@ -75,6 +75,26 @@ COMMON_SOURCES += \ + ovirt-foreign-menu.h ovirt-foreign-menu.c + endif + ++check_PROGRAMS = test-version-compare ++TESTS = $(check_PROGRAMS) ++test_version_compare_SOURCES = \ ++ virt-viewer-util.c \ ++ virt-viewer-util.h \ ++ test-version-compare.c \ ++ $(NULL) ++test_version_compare_LDFLAGS = \ ++ $(GLIB2_LIBS) \ ++ $(GTK_LIBS) \ ++ $(LIBXML2_LIBS) \ ++ $(NULL) ++test_version_compare_CFLAGS = \ ++ -DLOCALE_DIR=\""$(datadir)/locale"\" \ ++ $(GLIB2_CFLAGS) \ ++ $(GTK_CFLAGS) \ ++ $(LIBXML2_CFLAGS) \ ++ $(WARN_CFLAGS) \ ++ $(NULL) ++ + if HAVE_LIBVIRT + bin_PROGRAMS += virt-viewer + virt_viewer_SOURCES = \ +diff --git a/src/test-version-compare.c b/src/test-version-compare.c +new file mode 100644 +index 0000000..0377f7e +--- /dev/null ++++ b/src/test-version-compare.c +@@ -0,0 +1,59 @@ ++/* -*- Mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*- */ ++/* ++ * Virt Viewer: A virtual machine console viewer ++ * ++ * Copyright (C) 2015 Red Hat, Inc. ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program; if not, write to the Free Software ++ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ++ */ ++#include ++#include ++ ++gboolean doDebug = FALSE; ++ ++int main(void) ++{ ++ g_assert(virt_viewer_compare_buildid("1-1", "1-1") == 0); ++ g_assert(virt_viewer_compare_buildid("1-1", "1-1.1") < 0); ++ g_assert(virt_viewer_compare_buildid("1-1", "1-2") < 0); ++ g_assert(virt_viewer_compare_buildid("1-3", "1-2") > 0); ++ g_assert(virt_viewer_compare_buildid("2-3", "1-2") > 0); ++ g_assert(virt_viewer_compare_buildid("2-3", "3-2") < 0); ++ g_assert(virt_viewer_compare_buildid("2-3", "3-4") < 0); ++ g_assert(virt_viewer_compare_buildid("4-3", "3-4") > 0); ++ ++ g_assert(virt_viewer_compare_buildid("4.0-", "3-4") > 0); ++ g_assert(virt_viewer_compare_buildid("4.0-", "3.4-4") > 0); ++ g_assert(virt_viewer_compare_buildid(".0-", "3.4-4") < 0); ++ g_assert(virt_viewer_compare_buildid("4-", "3-4") > 0); ++ g_assert(virt_viewer_compare_buildid("4-3", "3-") > 0); ++ g_assert(virt_viewer_compare_buildid("-3", "3-4") < 0); ++ g_assert(virt_viewer_compare_buildid("4-3", "-4") > 0); ++ g_assert(virt_viewer_compare_buildid("-3", "-4") < 0); ++ g_assert(virt_viewer_compare_buildid("4", "3-4") > 0); ++ g_assert(virt_viewer_compare_buildid("4-3", "3") > 0); ++ g_assert(virt_viewer_compare_buildid("3", "3-4") < 0); ++ g_assert(virt_viewer_compare_buildid("4-3", "4") > 0); ++ g_assert(virt_viewer_compare_buildid("-3", "-4") < 0); ++ ++ /* These trigger runtime warnings */ ++ g_assert(virt_viewer_compare_buildid("-3", "-") > 0); ++ g_assert(virt_viewer_compare_buildid("", "-") == 0); ++ g_assert(virt_viewer_compare_buildid("", "") == 0); ++ g_assert(virt_viewer_compare_buildid("", NULL) == 0); ++ g_assert(virt_viewer_compare_buildid(NULL, NULL) == 0); ++ ++ return 0; ++} diff --git a/SOURCES/0043-Auth-fix-leak-of-username.patch b/SOURCES/0043-Auth-fix-leak-of-username.patch deleted file mode 100644 index 018062d..0000000 --- a/SOURCES/0043-Auth-fix-leak-of-username.patch +++ /dev/null @@ -1,41 +0,0 @@ -From 7e2d056bd8db3068d1660ad934feae4f3787fc9f Mon Sep 17 00:00:00 2001 -From: Jonathon Jongsma -Date: Tue, 12 Aug 2014 11:01:46 -0500 -Subject: [PATCH] Auth: fix leak of username - -When collect_credentials() returns a failure status, 'username' was -potentially leaked. - -Resolves: rhbz#1061826 -(cherry picked from commit b7c80494606c0dbfbae305411ad0080a5ef9282c) ---- - src/remote-viewer.c | 11 +++++------ - 1 file changed, 5 insertions(+), 6 deletions(-) - -diff --git a/src/remote-viewer.c b/src/remote-viewer.c -index d9d7baf..2d398c8 100644 ---- a/src/remote-viewer.c -+++ b/src/remote-viewer.c -@@ -704,17 +704,16 @@ authenticate_cb(RestProxy *proxy, G_GNUC_UNUSED RestProxyAuth *auth, - "oVirt", - NULL, - &username, &password); -- if (ret < 0) { -- return FALSE; -- } else { -+ if (ret == 0) { - g_object_set(G_OBJECT(proxy), - "username", username, - "password", password, - NULL); -- g_free(username); -- g_free(password); -- return TRUE; - } -+ -+ g_free(username); -+ g_free(password); -+ return (ret == 0); - } - - diff --git a/SOURCES/0043-vv-file-Add-newer-version-url-key-to-.vv-files.patch b/SOURCES/0043-vv-file-Add-newer-version-url-key-to-.vv-files.patch new file mode 100644 index 0000000..d25ce3d --- /dev/null +++ b/SOURCES/0043-vv-file-Add-newer-version-url-key-to-.vv-files.patch @@ -0,0 +1,116 @@ +From 2e0bbfc29f92c5a44f76e3c191c8c2f8dbb9db3b Mon Sep 17 00:00:00 2001 +From: Christophe Fergeau +Date: Tue, 19 May 2015 18:56:14 +0200 +Subject: [PATCH] vv-file: Add 'newer-version-url' key to .vv files + +If set, this URL will be displayed when one of the version checks +('version' of 'versions' key fail). This URL should contain explanations +about how to get an updated remote-viewer version. +--- + man/remote-viewer.pod | 5 +++++ + src/virt-viewer-file.c | 27 +++++++++++++++++++++++++++ + src/virt-viewer-file.h | 2 ++ + 3 files changed, 34 insertions(+) + +diff --git a/man/remote-viewer.pod b/man/remote-viewer.pod +index bda513d..1358f1b 100644 +--- a/man/remote-viewer.pod ++++ b/man/remote-viewer.pod +@@ -156,6 +156,11 @@ remote-viewer builds matching the given 'osid' (fedora22, debian7, ...) must + be at least version 'version'. For consistency, it's recommended to use libosinfo OS shortids as + the osid. + ++=item C (string) ++ ++If specified, this field is an URL which will be displayed to the user when a version check ++fails. ++ + =item C (string, mandatory) + + The session type, either "spice", "vnc" or "ovirt". +diff --git a/src/virt-viewer-file.c b/src/virt-viewer-file.c +index 3f06d1e..906d719 100644 +--- a/src/virt-viewer-file.c ++++ b/src/virt-viewer-file.c +@@ -40,6 +40,8 @@ + * The current list of [virt-viewer] keys is: + * - version: string + * - versions: list of id:versions strings ++ * - newer-version-url: string specifying an URL to display when the minimum ++ * version check fails + * - type: string, mandatory, values: "spice" (later "vnc" etc..) + * - host: string + * - port: int +@@ -120,6 +122,7 @@ enum { + PROP_PROXY, + PROP_VERSION, + PROP_VERSIONS, ++ PROP_VERSION_URL, + PROP_SECURE_CHANNELS, + PROP_DELETE_THIS_FILE, + PROP_SECURE_ATTENTION, +@@ -676,6 +679,20 @@ virt_viewer_file_set_versions(VirtViewerFile* self, GHashTable *version_table) + g_object_notify(G_OBJECT(self), "versions"); + } + ++gchar* ++virt_viewer_file_get_version_url(VirtViewerFile* self) ++{ ++ return virt_viewer_file_get_string(self, MAIN_GROUP, "newer-version-url"); ++} ++ ++void ++virt_viewer_file_set_version_url(VirtViewerFile* self, const gchar* value) ++{ ++ virt_viewer_file_set_string(self, MAIN_GROUP, "newer-version-url", value); ++ g_object_notify(G_OBJECT(self), "version-url"); ++} ++ ++ + gchar** + virt_viewer_file_get_secure_channels(VirtViewerFile* self, gsize* length) + { +@@ -944,6 +961,9 @@ virt_viewer_file_set_property(GObject* object, guint property_id, + case PROP_VERSIONS: + virt_viewer_file_set_versions(self, g_value_get_boxed(value)); + break; ++ case PROP_VERSION_URL: ++ virt_viewer_file_set_version_url(self, g_value_get_string(value)); ++ break; + case PROP_SECURE_CHANNELS: + strv = g_value_get_boxed(value); + virt_viewer_file_set_secure_channels(self, (const gchar* const*)strv, g_strv_length(strv)); +@@ -1051,6 +1071,9 @@ virt_viewer_file_get_property(GObject* object, guint property_id, + case PROP_VERSIONS: + g_value_take_boxed(value, virt_viewer_file_get_versions(self)); + break; ++ case PROP_VERSION_URL: ++ g_value_take_string(value, virt_viewer_file_get_version_url(self)); ++ break; + case PROP_SECURE_CHANNELS: + g_value_take_boxed(value, virt_viewer_file_get_secure_channels(self, NULL)); + break; +@@ -1203,6 +1226,10 @@ virt_viewer_file_class_init(VirtViewerFileClass* klass) + g_param_spec_boxed("versions", "versions", "versions", G_TYPE_HASH_TABLE, + G_PARAM_STATIC_STRINGS | G_PARAM_READWRITE)); + ++ g_object_class_install_property(G_OBJECT_CLASS(klass), PROP_VERSION_URL, ++ g_param_spec_string("version-url", "version-url", "version-url", NULL, ++ G_PARAM_STATIC_STRINGS | G_PARAM_READWRITE)); ++ + g_object_class_install_property(G_OBJECT_CLASS(klass), PROP_SECURE_CHANNELS, + g_param_spec_boxed("secure-channels", "secure-channels", "secure-channels", G_TYPE_STRV, + G_PARAM_STATIC_STRINGS | G_PARAM_READWRITE)); +diff --git a/src/virt-viewer-file.h b/src/virt-viewer-file.h +index 1635507..0eb7966 100644 +--- a/src/virt-viewer-file.h ++++ b/src/virt-viewer-file.h +@@ -104,6 +104,8 @@ gchar* virt_viewer_file_get_version(VirtViewerFile* self); + void virt_viewer_file_set_version(VirtViewerFile* self, const gchar* value); + GHashTable* virt_viewer_file_get_versions(VirtViewerFile* self); + void virt_viewer_file_set_versions(VirtViewerFile* self, GHashTable *version_table); ++gchar* virt_viewer_file_get_version_url(VirtViewerFile* self); ++void virt_viewer_file_set_version_url(VirtViewerFile* self, const gchar* value); + gchar** virt_viewer_file_get_secure_channels(VirtViewerFile* self, gsize* length); + void virt_viewer_file_set_secure_channels(VirtViewerFile* self, const gchar* const* value, gsize length); + gint virt_viewer_file_get_delete_this_file(VirtViewerFile* self); diff --git a/SOURCES/0044-ovirt-Remove-extra-from-oVirt-URI.patch b/SOURCES/0044-ovirt-Remove-extra-from-oVirt-URI.patch deleted file mode 100644 index 0293e8b..0000000 --- a/SOURCES/0044-ovirt-Remove-extra-from-oVirt-URI.patch +++ /dev/null @@ -1,42 +0,0 @@ -From 85f1cf2f74e2f5dc18a57eded07faed148e4fec2 Mon Sep 17 00:00:00 2001 -From: Christophe Fergeau -Date: Wed, 16 Apr 2014 13:56:48 +0200 -Subject: [PATCH] ovirt: Remove extra '/' from oVirt URI - -The 'path' part of the URI will always start with a '/' when present as -this is what separates it from the hostname. When rebuilding the final -URI, the current code inserts a '/' by itself between the hostname and -the path, which results in URIs with an extra '/': -https://ovirt.example.com//some/path/api - -This is not only cosmetic as this can cause issues with cookie handling -if libgovirt accesses //some/path/api while the cookie is set for -/some/path/api. - -Resolves: rhbz#1127156 -(cherry picked from commit 914f75ee8d2264cb2fd4276a3a935f2f7bbfbc82) ---- - src/remote-viewer.c | 3 ++- - 1 file changed, 2 insertions(+), 1 deletion(-) - -diff --git a/src/remote-viewer.c b/src/remote-viewer.c -index 2d398c8..26f0634 100644 ---- a/src/remote-viewer.c -+++ b/src/remote-viewer.c -@@ -656,6 +656,7 @@ parse_ovirt_uri(const gchar *uri_str, char **rest_uri, char **name, char **usern - xmlFreeURI(uri); - return FALSE; - } -+ g_return_val_if_fail(*uri->path == '/', FALSE); - - /* extract VM name from path */ - path_elements = g_strsplit(uri->path, "/", -1); -@@ -675,7 +676,7 @@ parse_ovirt_uri(const gchar *uri_str, char **rest_uri, char **name, char **usern - /* build final URI */ - rel_path = g_strjoinv("/", path_elements); - /* FIXME: how to decide between http and https? */ -- *rest_uri = g_strdup_printf("https://%s/%s/api/", uri->server, rel_path); -+ *rest_uri = g_strdup_printf("https://%s%s/api/", uri->server, rel_path); - *name = vm_name; - g_free(rel_path); - g_strfreev(path_elements); diff --git a/SOURCES/0044-vv-file-Show-newer-version-url-when-version-check-fa.patch b/SOURCES/0044-vv-file-Show-newer-version-url-when-version-check-fa.patch new file mode 100644 index 0000000..f0f9775 --- /dev/null +++ b/SOURCES/0044-vv-file-Show-newer-version-url-when-version-check-fa.patch @@ -0,0 +1,46 @@ +From a02ac2c9ac6a27a0ab2e86e6c288df468264760b Mon Sep 17 00:00:00 2001 +From: Christophe Fergeau +Date: Tue, 19 May 2015 19:23:24 +0200 +Subject: [PATCH] vv-file: Show 'newer-version-url' when version check fails + +We currently display a generic error message when the current binary is +older than the minimum version specified in the vv file. The previous +commit added a 'newer-version-url' field to these .vv file. This commit +adds that URL to the error message if it's set. +--- + src/virt-viewer-file.c | 22 +++++++++++++++++----- + 1 file changed, 17 insertions(+), 5 deletions(-) + +diff --git a/src/virt-viewer-file.c b/src/virt-viewer-file.c +index 906d719..2f1eb2b 100644 +--- a/src/virt-viewer-file.c ++++ b/src/virt-viewer-file.c +@@ -816,11 +816,23 @@ virt_viewer_file_check_min_version(VirtViewerFile *self, GError **error) + version_cmp = virt_viewer_compare_buildid(min_version, PACKAGE_VERSION BUILDID); + + if (version_cmp > 0) { +- g_set_error(error, +- VIRT_VIEWER_ERROR, +- VIRT_VIEWER_ERROR_FAILED, +- _("At least %s version %s is required to setup this connection"), +- g_get_application_name(), min_version); ++ gchar *url; ++ url = virt_viewer_file_get_version_url(self); ++ if (url != NULL) { ++ g_set_error(error, ++ VIRT_VIEWER_ERROR, ++ VIRT_VIEWER_ERROR_FAILED, ++ _("At least %s version %s is required to setup this" ++ " connection, see %s for details"), ++ g_get_application_name(), min_version, url); ++ g_free(url); ++ } else { ++ g_set_error(error, ++ VIRT_VIEWER_ERROR, ++ VIRT_VIEWER_ERROR_FAILED, ++ _("At least %s version %s is required to setup this connection"), ++ g_get_application_name(), min_version); ++ } + g_free(min_version); + return FALSE; + } diff --git a/SOURCES/0045-Avoid-Dereference-of-a-null-pointer.patch b/SOURCES/0045-Avoid-Dereference-of-a-null-pointer.patch new file mode 100644 index 0000000..e65ab73 --- /dev/null +++ b/SOURCES/0045-Avoid-Dereference-of-a-null-pointer.patch @@ -0,0 +1,23 @@ +From 7c7cced636e84e46c8cf3a65de6fca0ea2b39132 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Fabiano=20Fid=C3=AAncio?= +Date: Wed, 11 Mar 2015 09:56:12 +0100 +Subject: [PATCH] Avoid 'Dereference of a null pointer' + +Caught by Covscan. +--- + src/virt-viewer.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/src/virt-viewer.c b/src/virt-viewer.c +index c1768b3..6e92b54 100644 +--- a/src/virt-viewer.c ++++ b/src/virt-viewer.c +@@ -829,7 +829,7 @@ virt_viewer_auth_libvirt_credentials(virConnectCredentialPtr cred, + VirtViewerWindow *vwin = virt_viewer_app_get_main_window(VIRT_VIEWER_APP(app)); + GtkWindow *win = virt_viewer_window_get_window(vwin); + +- if (*username == NULL || **username == '\0') ++ if (username && (*username == NULL || **username == '\0')) + *username = g_strdup(g_get_user_name()); + + priv->auth_cancelled = !virt_viewer_auth_collect_credentials(win, diff --git a/SOURCES/0045-ovirt-Add-OvirtForeignMenu-class.patch b/SOURCES/0045-ovirt-Add-OvirtForeignMenu-class.patch deleted file mode 100644 index a265e6e..0000000 --- a/SOURCES/0045-ovirt-Add-OvirtForeignMenu-class.patch +++ /dev/null @@ -1,837 +0,0 @@ -From 790fa32424a9192e8d9feb3c501c7159e746e881 Mon Sep 17 00:00:00 2001 -From: Christophe Fergeau -Date: Fri, 27 Sep 2013 13:17:55 +0200 -Subject: [PATCH] ovirt: Add OvirtForeignMenu class - -This class is used to implement the so-called oVirt 'foreign menu' -which is a menu populated with ISO images available on the -oVirt instance that the user can dynamically insert into the -virtual machine he is currently viewing. - -Resolves: rhbz#1127156 -(cherry picked from commit 894396d6b5e80ead9f04c28b859a111ed5b27ba5) ---- - configure.ac | 3 +- - src/Makefile.am | 4 + - src/ovirt-foreign-menu.c | 686 +++++++++++++++++++++++++++++++++++++++++++++++ - src/ovirt-foreign-menu.h | 82 ++++++ - 4 files changed, 774 insertions(+), 1 deletion(-) - create mode 100644 src/ovirt-foreign-menu.c - create mode 100644 src/ovirt-foreign-menu.h - -diff --git a/configure.ac b/configure.ac -index f966688..0515b37 100644 ---- a/configure.ac -+++ b/configure.ac -@@ -21,7 +21,7 @@ GTK_VNC1_REQUIRED="0.3.8" - GTK_VNC2_REQUIRED="0.4.0" - SPICE_GTK_REQUIRED="0.22" - SPICE_PROTOCOL_REQUIRED="0.10.1" --GOVIRT_REQUIRED="0.3.0" -+GOVIRT_REQUIRED="0.3.1" - - AC_SUBST([GLIB2_REQUIRED]) - AC_SUBST([LIBXML2_REQUIRED]) -@@ -200,6 +200,7 @@ AS_IF([test "x$have_ovirt" = "xyes"], - [AC_MSG_ERROR([oVirt support requested but libgovirt not found]) - ]) - ]) -+AM_CONDITIONAL([HAVE_OVIRT], [test "x$have_ovirt" = "xyes"]) - - dnl Decide if this platform can support the SSH tunnel feature. - AC_CHECK_HEADERS([sys/socket.h sys/un.h windows.h]) -diff --git a/src/Makefile.am b/src/Makefile.am -index d4163c8..c425522 100644 ---- a/src/Makefile.am -+++ b/src/Makefile.am -@@ -68,6 +68,10 @@ COMMON_SOURCES += \ - $(NULL) - endif - -+if HAVE_OVIRT -+COMMON_SOURCES += \ -+ ovirt-foreign-menu.h ovirt-foreign-menu.c -+endif - - if HAVE_LIBVIRT - bin_PROGRAMS += virt-viewer -diff --git a/src/ovirt-foreign-menu.c b/src/ovirt-foreign-menu.c -new file mode 100644 -index 0000000..0453ca1 ---- /dev/null -+++ b/src/ovirt-foreign-menu.c -@@ -0,0 +1,686 @@ -+/* -+ * Virt Viewer: A virtual machine console viewer -+ * -+ * Copyright (C) 2007-2014 Red Hat, Inc. -+ * Copyright (C) 2009-2012 Daniel P. Berrange -+ * Copyright (C) 2010 Marc-André Lureau -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -+ * -+ * Author: Daniel P. Berrange -+ * Christope Fergeau -+ */ -+ -+#include -+ -+#include "ovirt-foreign-menu.h" -+#include "virt-glib-compat.h" -+#include "virt-viewer-util.h" -+ -+typedef enum { -+ STATE_0, -+ STATE_STORAGE_DOMAIN, -+ STATE_VM_CDROM, -+ STATE_CDROM_FILE, -+ STATE_ISOS -+} OvirtForeignMenuState; -+ -+static void ovirt_foreign_menu_next_async_step(OvirtForeignMenu *menu, OvirtForeignMenuState state); -+static void ovirt_foreign_menu_fetch_storage_domain_async(OvirtForeignMenu *menu); -+static void ovirt_foreign_menu_fetch_vm_cdrom_async(OvirtForeignMenu *menu); -+static void ovirt_foreign_menu_refresh_cdrom_file_async(OvirtForeignMenu *menu); -+static gboolean ovirt_foreign_menu_refresh_iso_list(gpointer user_data); -+ -+G_DEFINE_TYPE (OvirtForeignMenu, ovirt_foreign_menu, G_TYPE_OBJECT) -+ -+ -+struct _OvirtForeignMenuPrivate { -+ OvirtProxy *proxy; -+ OvirtApi *api; -+ OvirtVm *vm; -+ -+ OvirtCollection *files; -+ OvirtCdrom *cdrom; -+ -+ /* The next 2 members are used when changing the ISO image shown in -+ * a VM */ -+ /* Name of the ISO which is currently used by the VM OvirtCdrom */ -+ char *current_iso_name; -+ /* Name of the ISO we are trying to insert in the VM OvirtCdrom */ -+ char *next_iso_name; -+ -+ GList *iso_names; -+}; -+ -+ -+#define OVIRT_FOREIGN_MENU_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE((o), OVIRT_TYPE_FOREIGN_MENU, OvirtForeignMenuPrivate)) -+ -+ -+enum { -+ PROP_0, -+ PROP_PROXY, -+ PROP_API, -+ PROP_VM, -+ PROP_FILE, -+ PROP_FILES, -+}; -+ -+ -+static char * -+ovirt_foreign_menu_get_current_iso_name(OvirtForeignMenu *foreign_menu) -+{ -+ char *name; -+ -+ if (foreign_menu->priv->cdrom == NULL) { -+ return NULL; -+ } -+ -+ g_object_get(foreign_menu->priv->cdrom, "file", &name, NULL); -+ -+ return name; -+} -+ -+ -+static void -+ovirt_foreign_menu_get_property(GObject *object, guint property_id, -+ GValue *value, GParamSpec *pspec) -+{ -+ OvirtForeignMenu *self = OVIRT_FOREIGN_MENU(object); -+ OvirtForeignMenuPrivate *priv = self->priv; -+ -+ switch (property_id) { -+ case PROP_PROXY: -+ g_value_set_object(value, priv->proxy); -+ break; -+ case PROP_API: -+ g_value_set_object(value, priv->api); -+ break; -+ case PROP_VM: -+ g_value_set_object(value, priv->vm); -+ break; -+ case PROP_FILE: -+ g_value_take_string(value, -+ ovirt_foreign_menu_get_current_iso_name(self)); -+ break; -+ case PROP_FILES: -+ g_value_set_pointer(value, priv->iso_names); -+ break; -+ default: -+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); -+ } -+} -+ -+ -+static void -+ovirt_foreign_menu_set_property(GObject *object, guint property_id, -+ const GValue *value G_GNUC_UNUSED, GParamSpec *pspec) -+{ -+ OvirtForeignMenu *self = OVIRT_FOREIGN_MENU(object); -+ OvirtForeignMenuPrivate *priv = self->priv; -+ -+ switch (property_id) { -+ case PROP_PROXY: -+ if (priv->proxy != NULL) { -+ g_object_unref(priv->proxy); -+ } -+ priv->proxy = g_value_dup_object(value); -+ break; -+ case PROP_API: -+ if (priv->api != NULL) { -+ g_object_unref(priv->api); -+ } -+ priv->api = g_value_dup_object(value); -+ break; -+ case PROP_VM: -+ if (priv->vm != NULL) { -+ g_object_unref(priv->vm); -+ } -+ priv->vm = g_value_dup_object(value); -+ break; -+ default: -+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); -+ } -+} -+ -+ -+static void -+ovirt_foreign_menu_dispose(GObject *obj) -+{ -+ OvirtForeignMenu *self = OVIRT_FOREIGN_MENU(obj); -+ -+ if (self->priv->proxy) { -+ g_object_unref(self->priv->proxy); -+ self->priv->proxy = NULL; -+ } -+ -+ if (self->priv->api != NULL) { -+ g_object_unref(self->priv->api); -+ self->priv->api = NULL; -+ } -+ -+ if (self->priv->vm) { -+ g_object_unref(self->priv->vm); -+ self->priv->vm = NULL; -+ } -+ -+ if (self->priv->files) { -+ g_object_unref(self->priv->files); -+ self->priv->files = NULL; -+ } -+ -+ if (self->priv->cdrom) { -+ g_object_unref(self->priv->cdrom); -+ self->priv->cdrom = NULL; -+ } -+ -+ if (self->priv->iso_names) { -+ g_list_free_full(self->priv->iso_names, (GDestroyNotify)g_free); -+ self->priv->iso_names = NULL; -+ } -+ -+ g_free(self->priv->current_iso_name); -+ self->priv->current_iso_name = NULL; -+ -+ g_free(self->priv->next_iso_name); -+ self->priv->next_iso_name = NULL; -+ -+ G_OBJECT_CLASS(ovirt_foreign_menu_parent_class)->dispose(obj); -+} -+ -+ -+static void -+ovirt_foreign_menu_class_init(OvirtForeignMenuClass *klass) -+{ -+ GObjectClass *oclass = G_OBJECT_CLASS(klass); -+ -+ oclass->get_property = ovirt_foreign_menu_get_property; -+ oclass->set_property = ovirt_foreign_menu_set_property; -+ oclass->dispose = ovirt_foreign_menu_dispose; -+ -+ g_type_class_add_private(klass, sizeof(OvirtForeignMenuPrivate)); -+ -+ g_object_class_install_property(oclass, -+ PROP_PROXY, -+ g_param_spec_object("proxy", -+ "OvirtProxy instance", -+ "OvirtProxy instance", -+ OVIRT_TYPE_PROXY, -+ G_PARAM_READWRITE | -+ G_PARAM_CONSTRUCT_ONLY | -+ G_PARAM_STATIC_STRINGS)); -+ g_object_class_install_property(oclass, -+ PROP_API, -+ g_param_spec_object("api", -+ "OvirtApi instance", -+ "Ovirt api root", -+ OVIRT_TYPE_API, -+ G_PARAM_READWRITE | -+ G_PARAM_STATIC_STRINGS)); -+ g_object_class_install_property(oclass, -+ PROP_VM, -+ g_param_spec_object("vm", -+ "OvirtVm instance", -+ "OvirtVm being handled", -+ OVIRT_TYPE_VM, -+ G_PARAM_READWRITE | -+ G_PARAM_STATIC_STRINGS)); -+ g_object_class_install_property(oclass, -+ PROP_FILE, -+ g_param_spec_string("file", -+ "File", -+ "Name of the image currently inserted in the virtual CDROM", -+ NULL, -+ G_PARAM_READABLE | -+ G_PARAM_STATIC_STRINGS)); -+ g_object_class_install_property(oclass, -+ PROP_FILES, -+ g_param_spec_pointer("files", -+ "ISO names", -+ "GSList of ISO names for this oVirt VM", -+ G_PARAM_READABLE | -+ G_PARAM_STATIC_STRINGS)); -+} -+ -+ -+static void -+ovirt_foreign_menu_init(OvirtForeignMenu *self) -+{ -+ self->priv = OVIRT_FOREIGN_MENU_GET_PRIVATE(self); -+} -+ -+ -+OvirtForeignMenu* ovirt_foreign_menu_new(OvirtProxy *proxy) -+{ -+ return g_object_new(OVIRT_TYPE_FOREIGN_MENU, -+ "proxy", proxy, -+ NULL); -+} -+ -+ -+static void -+ovirt_foreign_menu_next_async_step(OvirtForeignMenu *menu, -+ OvirtForeignMenuState current_state) -+{ -+ g_return_if_fail(current_state >= STATE_0); -+ g_return_if_fail(current_state < STATE_ISOS); -+ -+ current_state++; -+ -+ if (current_state == STATE_STORAGE_DOMAIN) { -+ if (menu->priv->files == NULL) { -+ ovirt_foreign_menu_fetch_storage_domain_async(menu); -+ } else { -+ current_state++; -+ } -+ } -+ -+ if (current_state == STATE_VM_CDROM) { -+ if (menu->priv->cdrom == NULL) { -+ ovirt_foreign_menu_fetch_vm_cdrom_async(menu); -+ } else { -+ current_state++; -+ } -+ } -+ -+ if (current_state == STATE_CDROM_FILE) { -+ ovirt_foreign_menu_refresh_cdrom_file_async(menu); -+ } -+ -+ if (current_state == STATE_ISOS) { -+ g_warn_if_fail(menu->priv->api != NULL); -+ g_warn_if_fail(menu->priv->vm != NULL); -+ g_warn_if_fail(menu->priv->files != NULL); -+ g_warn_if_fail(menu->priv->cdrom != NULL); -+ -+ ovirt_foreign_menu_refresh_iso_list(menu); -+ } -+} -+ -+ -+void -+ovirt_foreign_menu_start(OvirtForeignMenu *menu) -+{ -+ ovirt_foreign_menu_next_async_step(menu, STATE_0); -+} -+ -+ -+static void -+ovirt_foreign_menu_activate_item_cb(GtkMenuItem *menuitem, gpointer user_data); -+ -+ -+static void -+menu_item_set_active_no_signal(GtkMenuItem *menuitem, -+ gboolean active, -+ GCallback callback, -+ gpointer user_data) -+{ -+ g_signal_handlers_block_by_func(menuitem, callback, user_data); -+ gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem), active); -+ g_signal_handlers_unblock_by_func(menuitem, callback, user_data); -+} -+ -+ -+static void updated_cdrom_cb(GObject *source_object, -+ GAsyncResult *result, -+ G_GNUC_UNUSED gpointer user_data) -+{ -+ GError *error = NULL; -+ OvirtForeignMenu *foreign_menu; -+ gboolean updated; -+ -+ foreign_menu = OVIRT_FOREIGN_MENU(user_data); -+ updated = ovirt_cdrom_update_finish(OVIRT_CDROM(source_object), -+ result, &error); -+ g_debug("Finished updating cdrom content"); -+ if (updated) { -+ g_free(foreign_menu->priv->current_iso_name); -+ foreign_menu->priv->current_iso_name = foreign_menu->priv->next_iso_name; -+ foreign_menu->priv->next_iso_name = NULL; -+ g_object_notify(G_OBJECT(foreign_menu), "file"); -+ } else { -+ /* Reset old state back as we were not successful in switching to -+ * the new ISO */ -+ const char *current_file = foreign_menu->priv->current_iso_name; -+ -+ if (error != NULL) { -+ g_warning("failed to update cdrom resource: %s", error->message); -+ g_clear_error(&error); -+ } -+ g_debug("setting OvirtCdrom:file back to '%s'", -+ current_file?current_file:NULL); -+ g_object_set(foreign_menu->priv->cdrom, "file", current_file, NULL); -+ } -+ g_free(foreign_menu->priv->next_iso_name); -+ foreign_menu->priv->next_iso_name = NULL; -+} -+ -+ -+static void -+ovirt_foreign_menu_activate_item_cb(GtkMenuItem *menuitem, gpointer user_data) -+{ -+ OvirtForeignMenu *foreign_menu; -+ const char *iso_name; -+ gboolean checked; -+ -+ checked = gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menuitem)); -+ foreign_menu = OVIRT_FOREIGN_MENU(user_data); -+ g_return_if_fail(foreign_menu->priv->cdrom != NULL); -+ g_return_if_fail(foreign_menu->priv->next_iso_name == NULL); -+ -+ g_debug("'%s' clicked", gtk_menu_item_get_label(menuitem)); -+ -+ /* We only want to move the check mark for the currently selected ISO -+ * when ovirt_cdrom_update_async() is successful, so for now we move -+ * the check mark back to where it was before -+ */ -+ menu_item_set_active_no_signal(menuitem, !checked, -+ (GCallback)ovirt_foreign_menu_activate_item_cb, -+ foreign_menu); -+ -+ if (checked) { -+ iso_name = gtk_menu_item_get_label(menuitem); -+ g_debug("Updating VM cdrom image to '%s'", iso_name); -+ foreign_menu->priv->next_iso_name = g_strdup(iso_name); -+ } else { -+ g_debug("Removing current cdrom image"); -+ iso_name = NULL; -+ foreign_menu->priv->next_iso_name = NULL; -+ /* FIXME: No idea how to remove a CDRom from a VM through ovirt REST -+ * API for now, so return early. -+ */ -+ return; -+ } -+ g_object_set(foreign_menu->priv->cdrom, -+ "file", iso_name, -+ NULL); -+ ovirt_cdrom_update_async(foreign_menu->priv->cdrom, TRUE, -+ foreign_menu->priv->proxy, NULL, -+ updated_cdrom_cb, foreign_menu); -+} -+ -+ -+GtkWidget *ovirt_foreign_menu_get_gtk_menu(OvirtForeignMenu *foreign_menu) -+{ -+ GtkWidget *gtk_menu; -+ GList *it; -+ char *current_iso; -+ -+ g_debug("Creating GtkMenu for foreign menu"); -+ current_iso = ovirt_foreign_menu_get_current_iso_name(foreign_menu); -+ gtk_menu = gtk_menu_new(); -+ for (it = foreign_menu->priv->iso_names; it != NULL; it = it->next) { -+ GtkWidget *menuitem; -+ -+ menuitem = gtk_check_menu_item_new_with_label((char *)it->data); -+ if (g_strcmp0((char *)it->data, current_iso) == 0) { -+ g_warn_if_fail(g_strcmp0(current_iso, foreign_menu->priv->current_iso_name) == 0); -+ gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(menuitem), -+ TRUE); -+ } -+ g_signal_connect(menuitem, "activate", -+ G_CALLBACK(ovirt_foreign_menu_activate_item_cb), -+ foreign_menu); -+ gtk_menu_shell_append(GTK_MENU_SHELL(gtk_menu), menuitem); -+ } -+ g_free(current_iso); -+ -+ return gtk_menu; -+} -+ -+ -+static void ovirt_foreign_menu_set_files(OvirtForeignMenu *menu, -+ const GList *files) -+{ -+ GList *sorted_files = NULL; -+ const GList *it; -+ GList *it2; -+ -+ for (it = files; it != NULL; it = it->next) { -+ char *name; -+ g_object_get(it->data, "name", &name, NULL); -+ /* The oVirt REST API is supposed to have a 'type' node -+ * associated with file resources , but as of 3.2, this node -+ * is not present, so we do an extension check instead -+ * to differentiate between ISOs and floppy images */ -+ if (g_str_has_suffix(name, ".vfd")) { -+ g_free(name); -+ continue; -+ } -+ sorted_files = g_list_insert_sorted(sorted_files, name, -+ (GCompareFunc)g_strcmp0); -+ } -+ -+ for (it = sorted_files, it2 = menu->priv->iso_names; -+ (it != NULL) && (it2 != NULL); -+ it = it->next, it2 = it2->next) { -+ if (g_strcmp0(it->data, it2->data) != 0) { -+ break; -+ } -+ } -+ -+ if ((it == NULL) && (it2 == NULL)) { -+ /* sorted_files and menu->priv->files content was the same */ -+ g_list_free_full(sorted_files, (GDestroyNotify)g_free); -+ return; -+ } -+ -+ g_list_free_full(menu->priv->iso_names, (GDestroyNotify)g_free); -+ menu->priv->iso_names = sorted_files; -+ g_object_notify(G_OBJECT(menu), "files"); -+} -+ -+ -+static void cdrom_file_refreshed_cb(GObject *source_object, -+ GAsyncResult *result, -+ gpointer user_data) -+{ -+ OvirtResource *cdrom = OVIRT_RESOURCE(source_object); -+ OvirtForeignMenu *menu = OVIRT_FOREIGN_MENU(user_data); -+ GError *error = NULL; -+ -+ ovirt_resource_refresh_finish(cdrom, result, &error); -+ if (error != NULL) { -+ g_warning("failed to refresh cdrom content: %s", error->message); -+ g_clear_error(&error); -+ return; -+ } -+ -+ /* Content of OvirtCdrom is now current */ -+ g_free(menu->priv->current_iso_name); -+ if (menu->priv->cdrom != NULL) { -+ g_object_get(G_OBJECT(menu->priv->cdrom), -+ "file", &menu->priv->current_iso_name, -+ NULL); -+ } else { -+ menu->priv->current_iso_name = NULL; -+ } -+ g_object_notify(G_OBJECT(menu), "file"); -+ if (menu->priv->cdrom != NULL) { -+ ovirt_foreign_menu_next_async_step(menu, STATE_CDROM_FILE); -+ } else { -+ g_debug("Could not find VM cdrom through oVirt REST API"); -+ } -+} -+ -+ -+static void ovirt_foreign_menu_refresh_cdrom_file_async(OvirtForeignMenu *menu) -+{ -+ g_return_if_fail(OVIRT_IS_RESOURCE(menu->priv->cdrom)); -+ -+ ovirt_resource_refresh_async(OVIRT_RESOURCE(menu->priv->cdrom), -+ menu->priv->proxy, NULL, -+ cdrom_file_refreshed_cb, menu); -+} -+ -+ -+static void cdroms_fetched_cb(GObject *source_object, -+ GAsyncResult *result, -+ gpointer user_data) -+{ -+ GHashTable *cdroms; -+ OvirtCollection *cdrom_collection = OVIRT_COLLECTION(source_object); -+ OvirtForeignMenu *menu = OVIRT_FOREIGN_MENU(user_data); -+ GHashTableIter iter; -+ OvirtCdrom *cdrom; -+ GError *error = NULL; -+ -+ ovirt_collection_fetch_finish(cdrom_collection, result, &error); -+ if (error != NULL) { -+ g_warning("failed to fetch cdrom collection: %s", error->message); -+ g_clear_error(&error); -+ return; -+ } -+ -+ cdroms = ovirt_collection_get_resources(cdrom_collection); -+ -+ g_warn_if_fail(g_hash_table_size(cdroms) <= 1); -+ -+ g_hash_table_iter_init(&iter, cdroms); -+ /* Set CDROM drive. If we have multiple ones, only the first -+ * one will be kept, but currently oVirt only adds one CDROM -+ * device per-VM -+ */ -+ if (g_hash_table_iter_next(&iter, NULL, (gpointer *)&cdrom)) { -+ if (menu->priv->cdrom != NULL) { -+ g_object_unref(G_OBJECT(menu->priv->cdrom)); -+ } -+ menu->priv->cdrom = g_object_ref(G_OBJECT(cdrom)); -+ g_debug("Set VM cdrom to %p", menu->priv->cdrom); -+ } -+ -+ if (menu->priv->cdrom != NULL) { -+ ovirt_foreign_menu_next_async_step(menu, STATE_VM_CDROM); -+ } else { -+ g_debug("Could not find VM cdrom through oVirt REST API"); -+ } -+} -+ -+ -+static void ovirt_foreign_menu_fetch_vm_cdrom_async(OvirtForeignMenu *menu) -+{ -+ OvirtCollection *cdrom_collection; -+ -+ cdrom_collection = ovirt_vm_get_cdroms(menu->priv->vm); -+ ovirt_collection_fetch_async(cdrom_collection, menu->priv->proxy, NULL, -+ cdroms_fetched_cb, menu); -+} -+ -+ -+static void storage_domains_fetched_cb(GObject *source_object, -+ GAsyncResult *result, -+ gpointer user_data) -+{ -+ GError *error = NULL; -+ OvirtForeignMenu *menu = OVIRT_FOREIGN_MENU(user_data); -+ OvirtCollection *collection = OVIRT_COLLECTION(source_object); -+ GHashTableIter iter; -+ OvirtStorageDomain *domain; -+ -+ ovirt_collection_fetch_finish(collection, result, &error); -+ if (error != NULL) { -+ g_warning("failed to fetch storage domains: %s", error->message); -+ g_clear_error(&error); -+ return; -+ } -+ -+ g_hash_table_iter_init(&iter, ovirt_collection_get_resources(collection)); -+ while (g_hash_table_iter_next(&iter, NULL, (gpointer *)&domain)) { -+ OvirtCollection *file_collection; -+ int type; -+ -+ g_object_get(domain, "type", &type, NULL); -+ if (type != OVIRT_STORAGE_DOMAIN_TYPE_ISO) { -+ continue; -+ } -+ -+ file_collection = ovirt_storage_domain_get_files(domain); -+ if (file_collection != NULL) { -+ if (menu->priv->files) { -+ g_object_unref(G_OBJECT(menu->priv->files)); -+ } -+ menu->priv->files = g_object_ref(G_OBJECT(file_collection)); -+ g_debug("Set VM files to %p", menu->priv->files); -+ break; -+ } -+ } -+ -+ if (menu->priv->files != NULL) { -+ ovirt_foreign_menu_next_async_step(menu, STATE_STORAGE_DOMAIN); -+ } else { -+ g_debug("Could not find iso file collection"); -+ } -+} -+ -+ -+static void ovirt_foreign_menu_fetch_storage_domain_async(OvirtForeignMenu *menu) -+{ -+ OvirtCollection *collection; -+ -+ g_debug("Start fetching oVirt REST collection"); -+ collection = ovirt_api_get_storage_domains(menu->priv->api); -+ ovirt_collection_fetch_async(collection, menu->priv->proxy, NULL, -+ storage_domains_fetched_cb, menu); -+} -+ -+ -+static void iso_list_fetched_cb(GObject *source_object, -+ GAsyncResult *result, -+ gpointer user_data) -+{ -+ OvirtCollection *collection = OVIRT_COLLECTION(source_object); -+ GError *error = NULL; -+ GList *files; -+ -+ ovirt_collection_fetch_finish(collection, result, &error); -+ if (error != NULL) { -+ g_warning("failed to fetch files for ISO storage domain: %s", -+ error->message); -+ g_clear_error(&error); -+ return; -+ } -+ -+ files = g_hash_table_get_values(ovirt_collection_get_resources(collection)); -+ ovirt_foreign_menu_set_files(OVIRT_FOREIGN_MENU(user_data), files); -+ g_list_free(files); -+ -+ g_timeout_add_seconds(15, ovirt_foreign_menu_refresh_iso_list, user_data); -+} -+ -+ -+static void ovirt_foreign_menu_fetch_iso_list_async(OvirtForeignMenu *menu) -+{ -+ if (menu->priv->files == NULL) { -+ return; -+ } -+ -+ ovirt_collection_fetch_async(menu->priv->files, menu->priv->proxy, -+ NULL, iso_list_fetched_cb, menu); -+} -+ -+ -+static gboolean ovirt_foreign_menu_refresh_iso_list(gpointer user_data) -+{ -+ OvirtForeignMenu *menu; -+ -+ g_debug("Refreshing foreign menu iso list"); -+ menu = OVIRT_FOREIGN_MENU(user_data); -+ ovirt_foreign_menu_fetch_iso_list_async(menu); -+ -+ /* ovirt_foreign_menu_fetch_iso_list_async() will schedule a new call to -+ * that function through iso_list_fetched_cb() when it has finished -+ * fetching the iso list -+ */ -+ return G_SOURCE_REMOVE; -+} -diff --git a/src/ovirt-foreign-menu.h b/src/ovirt-foreign-menu.h -new file mode 100644 -index 0000000..7d28f0b ---- /dev/null -+++ b/src/ovirt-foreign-menu.h -@@ -0,0 +1,82 @@ -+/* -+ * Virt Viewer: A virtual machine console viewer -+ * -+ * Copyright (C) 2007-2014 Red Hat, Inc. -+ * Copyright (C) 2009-2012 Daniel P. Berrange -+ * Copyright (C) 2010 Marc-André Lureau -+ * -+ * This program is free software; you can redistribute it and/or modify -+ * it under the terms of the GNU General Public License as published by -+ * the Free Software Foundation; either version 2 of the License, or -+ * (at your option) any later version. -+ * -+ * This program is distributed in the hope that it will be useful, -+ * but WITHOUT ANY WARRANTY; without even the implied warranty of -+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ * GNU General Public License for more details. -+ * -+ * You should have received a copy of the GNU General Public License -+ * along with this program; if not, write to the Free Software -+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -+ * -+ * Author: Daniel P. Berrange -+ * Christophe Fergeau -+ */ -+#ifndef _OVIRT_FOREIGN_MENU_H -+#define _OVIRT_FOREIGN_MENU_H -+ -+#include -+#include -+#include -+ -+ -+G_BEGIN_DECLS -+ -+#define OVIRT_TYPE_FOREIGN_MENU ovirt_foreign_menu_get_type() -+ -+#define OVIRT_FOREIGN_MENU(obj) \ -+ (G_TYPE_CHECK_INSTANCE_CAST ((obj), OVIRT_TYPE_FOREIGN_MENU, OvirtForeignMenu)) -+ -+#define OVIRT_FOREIGN_MENU_CLASS(klass) \ -+ (G_TYPE_CHECK_CLASS_CAST ((klass), OVIRT_TYPE_FOREIGN_MENU, OvirtForeignMenuClass)) -+ -+#define OVIRT_IS_FOREIGN_MENU(obj) \ -+ (G_TYPE_CHECK_INSTANCE_TYPE ((obj), OVIRT_TYPE_FOREIGN_MENU)) -+ -+#define OVIRTIS_FOREIGN_MENU_CLASS(klass) \ -+ (G_TYPE_CHECK_CLASS_TYPE ((klass), OVIRT_TYPE_FOREIGN_MENU)) -+ -+#define OVIRT_FOREIGN_MENU_GET_CLASS(obj) \ -+ (G_TYPE_INSTANCE_GET_CLASS ((obj), OVIRT_TYPE_FOREIGN_MENU, OvirtForeignMenuClass)) -+ -+typedef struct _OvirtForeignMenu OvirtForeignMenu; -+typedef struct _OvirtForeignMenuClass OvirtForeignMenuClass; -+typedef struct _OvirtForeignMenuPrivate OvirtForeignMenuPrivate; -+ -+struct _OvirtForeignMenu { -+ GObject parent; -+ -+ OvirtForeignMenuPrivate *priv; -+}; -+ -+struct _OvirtForeignMenuClass { -+ GObjectClass parent_class; -+}; -+ -+GType ovirt_foreign_menu_get_type(void); -+ -+OvirtForeignMenu* ovirt_foreign_menu_new(OvirtProxy *proxy); -+void ovirt_foreign_menu_start(OvirtForeignMenu *menu); -+ -+GtkWidget *ovirt_foreign_menu_get_gtk_menu(OvirtForeignMenu *foreign_menu); -+ -+G_END_DECLS -+ -+#endif /* _OVIRT_FOREIGN_MENU_H */ -+/* -+ * Local variables: -+ * c-indent-level: 4 -+ * c-basic-offset: 4 -+ * indent-tabs-mode: nil -+ * End: -+ */ diff --git a/SOURCES/0046-ovirt-Use-OvirtForeignMenu-class.patch b/SOURCES/0046-ovirt-Use-OvirtForeignMenu-class.patch deleted file mode 100644 index 108cc7a..0000000 --- a/SOURCES/0046-ovirt-Use-OvirtForeignMenu-class.patch +++ /dev/null @@ -1,156 +0,0 @@ -From 448989f9c46bbc4ec54627f6cf4c9648c919cc12 Mon Sep 17 00:00:00 2001 -From: Christophe Fergeau -Date: Fri, 27 Sep 2013 17:53:04 +0200 -Subject: [PATCH] ovirt: Use OvirtForeignMenu class - -After the previous commit which introduced the OvirtForeignMenu -class, we can now make use of it in the remote-viewer UI code. - -Resolves: rhbz#1127156 -(cherry picked from commit 3df1e5a17a315d1421f3b34df3f078f0c1505d9d) ---- - src/remote-viewer.c | 82 +++++++++++++++++++++++++++++++++++++++++++++++++++++ - 1 file changed, 82 insertions(+) - -diff --git a/src/remote-viewer.c b/src/remote-viewer.c -index 26f0634..2b9b24d 100644 ---- a/src/remote-viewer.c -+++ b/src/remote-viewer.c -@@ -30,6 +30,7 @@ - - #ifdef HAVE_OVIRT - #include -+#include "ovirt-foreign-menu.h" - #endif - - #ifdef HAVE_SPICE_GTK -@@ -56,6 +57,9 @@ struct _RemoteViewerPrivate { - #endif - GtkWidget *controller_menu; - GtkWidget *foreign_menu; -+#ifdef HAVE_OVIRT -+ OvirtForeignMenu *ovirt_foreign_menu; -+#endif - gboolean open_recent_dialog; - - gboolean default_title; /* Whether the window title was set by the user, or -@@ -99,6 +103,13 @@ remote_viewer_dispose (GObject *object) - priv->ctrl_foreign_menu = NULL; - } - -+#ifdef HAVE_OVIRT -+ if (priv->ovirt_foreign_menu) { -+ g_object_unref(priv->ovirt_foreign_menu); -+ priv->ovirt_foreign_menu = NULL; -+ } -+#endif -+ - G_OBJECT_CLASS(remote_viewer_parent_class)->dispose (object); - } - #endif -@@ -418,6 +429,34 @@ spice_ctrl_menu_updated(RemoteViewer *self) - g_hash_table_foreach(windows, spice_menu_update_each, self); - } - -+#ifdef HAVE_OVIRT -+static void -+ovirt_foreign_menu_update(RemoteViewer *app, VirtViewerWindow *win) -+{ -+ GtkWidget *menu = g_object_get_data(G_OBJECT(win), "foreign-menu"); -+ GtkWidget *submenu; -+ GtkMenuShell *shell = GTK_MENU_SHELL(gtk_builder_get_object(virt_viewer_window_get_builder(win), "top-menu")); -+ -+ if (app->priv->ovirt_foreign_menu == NULL) { -+ /* nothing to do */ -+ return; -+ } -+ if (menu == NULL) { -+ menu = gtk_menu_item_new_with_label(_("_Change CD")); -+ gtk_menu_item_set_use_underline(GTK_MENU_ITEM(menu), TRUE); -+ gtk_menu_shell_append(shell, menu); -+ g_object_set_data_full(G_OBJECT(win), "foreign-menu", -+ g_object_ref(menu), -+ (GDestroyNotify)gtk_widget_destroy); -+ } -+ -+ submenu = ovirt_foreign_menu_get_gtk_menu(app->priv->ovirt_foreign_menu); -+ gtk_menu_item_set_submenu(GTK_MENU_ITEM(menu), submenu); -+ -+ gtk_widget_show_all(menu); -+} -+#endif -+ - static void - foreign_menu_update(RemoteViewer *self, VirtViewerWindow *win) - { -@@ -455,6 +494,10 @@ foreign_menu_update_each(gpointer key G_GNUC_UNUSED, - gpointer user_data) - { - foreign_menu_update(REMOTE_VIEWER(user_data), VIRT_VIEWER_WINDOW(value)); -+#ifdef HAVE_OVIRT -+ ovirt_foreign_menu_update(REMOTE_VIEWER(user_data), -+ VIRT_VIEWER_WINDOW(value)); -+#endif - } - - static void -@@ -626,6 +669,9 @@ remote_viewer_window_added(VirtViewerApp *app G_GNUC_UNUSED, - { - spice_menu_update(REMOTE_VIEWER(app), win); - foreign_menu_update(REMOTE_VIEWER(app), win); -+#ifdef HAVE_OVIRT -+ ovirt_foreign_menu_update(REMOTE_VIEWER(app), win); -+#endif - } - #endif - -@@ -718,6 +764,36 @@ authenticate_cb(RestProxy *proxy, G_GNUC_UNUSED RestProxyAuth *auth, - } - - -+static void -+ovirt_foreign_menu_changed(OvirtForeignMenu *foreign_menu G_GNUC_UNUSED, -+ GParamSpec *pspec G_GNUC_UNUSED, -+ VirtViewerApp *app) -+{ -+ spice_foreign_menu_updated(REMOTE_VIEWER(app)); -+} -+ -+ -+static void -+virt_viewer_app_set_ovirt_foreign_menu(VirtViewerApp *app, -+ OvirtForeignMenu *foreign_menu) -+{ -+ RemoteViewer *self; -+ g_return_if_fail(REMOTE_VIEWER_IS(app)); -+ g_return_if_fail(OVIRT_IS_FOREIGN_MENU(foreign_menu)); -+ -+ self = REMOTE_VIEWER(app); -+ if (self->priv->ovirt_foreign_menu != NULL) { -+ g_object_unref(G_OBJECT(self->priv->ovirt_foreign_menu)); -+ } -+ self->priv->ovirt_foreign_menu = foreign_menu; -+ g_signal_connect(G_OBJECT(foreign_menu), "notify::file", -+ (GCallback)ovirt_foreign_menu_changed, app); -+ g_signal_connect(G_OBJECT(foreign_menu), "notify::files", -+ (GCallback)ovirt_foreign_menu_changed, app); -+ ovirt_foreign_menu_start(foreign_menu); -+} -+ -+ - static gboolean - create_ovirt_session(VirtViewerApp *app, const char *uri) - { -@@ -807,6 +883,12 @@ create_ovirt_session(VirtViewerApp *app, const char *uri) - goto error; - } - -+ { -+ OvirtForeignMenu *ovirt_menu = ovirt_foreign_menu_new(proxy); -+ g_object_set(G_OBJECT(ovirt_menu), "api", api, "vm", vm, NULL); -+ virt_viewer_app_set_ovirt_foreign_menu(app, ovirt_menu); -+ } -+ - virt_viewer_app_set_connect_info(app, NULL, ghost, gport, gtlsport, - session_type, NULL, NULL, 0, NULL); - diff --git a/SOURCES/0046-virt-viewer-set-keepAlive-on-libvirt-connection.patch b/SOURCES/0046-virt-viewer-set-keepAlive-on-libvirt-connection.patch new file mode 100644 index 0000000..ade7c1e --- /dev/null +++ b/SOURCES/0046-virt-viewer-set-keepAlive-on-libvirt-connection.patch @@ -0,0 +1,29 @@ +From 58afcee7ed5d6022a72122f70af8474bb887e947 Mon Sep 17 00:00:00 2001 +From: Pavel Hrdina +Date: Tue, 30 Jun 2015 10:21:43 +0200 +Subject: [PATCH] virt-viewer: set keepAlive on libvirt connection + +Setting the keepAlive on libvirt connection is needed in order to +receive the CloseCallback event. + +Resolves: rhbz#1164052 +(cherry picked from commit 08378ec4dc3623792c64a3bae6279eac1c3c153e) +--- + src/virt-viewer.c | 4 ++++ + 1 file changed, 4 insertions(+) + +diff --git a/src/virt-viewer.c b/src/virt-viewer.c +index 6e92b54..fcd366a 100644 +--- a/src/virt-viewer.c ++++ b/src/virt-viewer.c +@@ -966,6 +966,10 @@ virt_viewer_connect(VirtViewerApp *app) + g_debug("Unable to register close callback on libvirt connection"); + } + ++ if (virConnectSetKeepAlive(priv->conn, 5, 3) < 0) { ++ g_debug("Unable to set keep alive"); ++ } ++ + return 0; + } + diff --git a/SOURCES/0047-Add-group-argument-to-VirtViewerFile-helpers.patch b/SOURCES/0047-Add-group-argument-to-VirtViewerFile-helpers.patch deleted file mode 100644 index c61b896..0000000 --- a/SOURCES/0047-Add-group-argument-to-VirtViewerFile-helpers.patch +++ /dev/null @@ -1,555 +0,0 @@ -From a5acd159c463000a5474439eec826824d931342a Mon Sep 17 00:00:00 2001 -From: Christophe Fergeau -Date: Thu, 12 Dec 2013 16:08:42 +0100 -Subject: [PATCH] Add 'group' argument to VirtViewerFile helpers - -For foreign menu support, we'll need a way to pass oVirt-specific -information in the .vv file. This will be done through an additional -[ovirt] section, this commit is in preparation for that. - -Resolves: rhbz#1127156 -(cherry picked from commit c7a8bcdb6328f595d456c96084e8c23999f6aee6) ---- - src/virt-viewer-file.c | 153 +++++++++++++++++++++++++++---------------------- - 1 file changed, 84 insertions(+), 69 deletions(-) - -diff --git a/src/virt-viewer-file.c b/src/virt-viewer-file.c -index 639d96e..3ead36d 100644 ---- a/src/virt-viewer-file.c -+++ b/src/virt-viewer-file.c -@@ -78,7 +78,7 @@ G_DEFINE_TYPE(VirtViewerFile, virt_viewer_file, G_TYPE_OBJECT); - - #define VIRT_VIEWER_FILE_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE((o), VIRT_VIEWER_TYPE_FILE, VirtViewerFilePrivate)) - --#define GROUP "virt-viewer" -+#define MAIN_GROUP "virt-viewer" - - enum { - PROP_DUMMY_PROPERTY, -@@ -128,7 +128,7 @@ virt_viewer_file_new(const gchar* location, GError** error) - return NULL; - } - -- if (!g_key_file_has_group (keyfile, GROUP) || -+ if (!g_key_file_has_group (keyfile, MAIN_GROUP) || - !virt_viewer_file_is_set(self, "type")) { - inner_error = g_error_new_literal(G_KEY_FILE_ERROR, - G_KEY_FILE_ERROR_NOT_FOUND, "Invalid file"); -@@ -155,7 +155,7 @@ virt_viewer_file_is_set(VirtViewerFile* self, const gchar* key) - g_return_val_if_fail(VIRT_VIEWER_IS_FILE(self), FALSE); - g_return_val_if_fail(key != NULL, FALSE); - -- set = g_key_file_has_key(self->priv->keyfile, GROUP, key, &inner_error); -+ set = g_key_file_has_key(self->priv->keyfile, MAIN_GROUP, key, &inner_error); - if (inner_error == NULL) - return set; - else { -@@ -165,17 +165,20 @@ virt_viewer_file_is_set(VirtViewerFile* self, const gchar* key) - } - - static void --virt_viewer_file_set_string(VirtViewerFile* self, const gchar* key, const gchar* value) -+virt_viewer_file_set_string(VirtViewerFile* self, const char *group, -+ const gchar* key, const gchar* value) - { - g_return_if_fail(VIRT_VIEWER_IS_FILE(self)); - g_return_if_fail(key != NULL); - g_return_if_fail(value != NULL); - -- g_key_file_set_string(self->priv->keyfile, GROUP, key, value); -+ g_key_file_set_string(self->priv->keyfile, group, key, value); - } - - static gchar* --virt_viewer_file_get_string(VirtViewerFile* self, const gchar* key) -+virt_viewer_file_get_string(VirtViewerFile* self, -+ const char *group, -+ const gchar* key) - { - GError* inner_error = NULL; - gchar* result = NULL; -@@ -183,7 +186,7 @@ virt_viewer_file_get_string(VirtViewerFile* self, const gchar* key) - g_return_val_if_fail(VIRT_VIEWER_IS_FILE(self), NULL); - g_return_val_if_fail(key != NULL, NULL); - -- result = g_key_file_get_string(self->priv->keyfile, GROUP, key, &inner_error); -+ result = g_key_file_get_string(self->priv->keyfile, group, key, &inner_error); - if (inner_error && inner_error->domain != G_KEY_FILE_ERROR) - g_critical("%s", inner_error->message); - g_clear_error(&inner_error); -@@ -192,16 +195,19 @@ virt_viewer_file_get_string(VirtViewerFile* self, const gchar* key) - } - - static void --virt_viewer_file_set_string_list(VirtViewerFile* self, const gchar* key, const gchar* const* value, gsize length) -+virt_viewer_file_set_string_list(VirtViewerFile* self, const char *group, -+ const gchar* key, const gchar* const* value, -+ gsize length) - { - g_return_if_fail(VIRT_VIEWER_IS_FILE(self)); - g_return_if_fail(key != NULL); - -- g_key_file_set_string_list(self->priv->keyfile, GROUP, key, value, length); -+ g_key_file_set_string_list(self->priv->keyfile, group, key, value, length); - } - - static gchar** --virt_viewer_file_get_string_list(VirtViewerFile* self, const gchar* key, gsize* length) -+virt_viewer_file_get_string_list(VirtViewerFile* self, const char *group, -+ const gchar* key, gsize* length) - { - GError* inner_error = NULL; - gchar** result = NULL; -@@ -209,7 +215,7 @@ virt_viewer_file_get_string_list(VirtViewerFile* self, const gchar* key, gsize* - g_return_val_if_fail(VIRT_VIEWER_IS_FILE(self), NULL); - g_return_val_if_fail(key != NULL, NULL); - -- result = g_key_file_get_string_list(self->priv->keyfile, GROUP, key, length, &inner_error); -+ result = g_key_file_get_string_list(self->priv->keyfile, group, key, length, &inner_error); - if (inner_error && inner_error->domain != G_KEY_FILE_ERROR) - g_critical("%s", inner_error->message); - g_clear_error(&inner_error); -@@ -218,16 +224,19 @@ virt_viewer_file_get_string_list(VirtViewerFile* self, const gchar* key, gsize* - } - - static void --virt_viewer_file_set_int(VirtViewerFile* self, const gchar* key, gint value) -+virt_viewer_file_set_int(VirtViewerFile* self, const char *group, -+ const gchar* key, gint value) - { - g_return_if_fail(VIRT_VIEWER_IS_FILE(self)); - g_return_if_fail(key != NULL); - -- g_key_file_set_integer(self->priv->keyfile, GROUP, key, value); -+ g_key_file_set_integer(self->priv->keyfile, group, key, value); - } - - static gint --virt_viewer_file_get_int(VirtViewerFile* self, const gchar* key) -+virt_viewer_file_get_int(VirtViewerFile* self, -+ const char *group, -+ const gchar* key) - { - GError* inner_error = NULL; - gint result; -@@ -235,7 +244,7 @@ virt_viewer_file_get_int(VirtViewerFile* self, const gchar* key) - g_return_val_if_fail(VIRT_VIEWER_IS_FILE(self), -1); - g_return_val_if_fail(key != NULL, -1); - -- result = g_key_file_get_integer(self->priv->keyfile, GROUP, key, &inner_error); -+ result = g_key_file_get_integer(self->priv->keyfile, group, key, &inner_error); - if (inner_error && inner_error->domain != G_KEY_FILE_ERROR) - g_critical("%s", inner_error->message); - g_clear_error(&inner_error); -@@ -246,351 +255,357 @@ virt_viewer_file_get_int(VirtViewerFile* self, const gchar* key) - gchar* - virt_viewer_file_get_ca(VirtViewerFile* self) - { -- return virt_viewer_file_get_string(self, "ca"); -+ return virt_viewer_file_get_string(self, MAIN_GROUP, "ca"); - } - - void - virt_viewer_file_set_ca(VirtViewerFile* self, const gchar* value) - { -- virt_viewer_file_set_string(self, "ca", value); -+ virt_viewer_file_set_string(self, MAIN_GROUP, "ca", value); - g_object_notify(G_OBJECT(self), "ca"); - } - - gchar* - virt_viewer_file_get_host(VirtViewerFile* self) - { -- return virt_viewer_file_get_string(self, "host"); -+ return virt_viewer_file_get_string(self, MAIN_GROUP, "host"); - } - - void - virt_viewer_file_set_host(VirtViewerFile* self, const gchar* value) - { -- virt_viewer_file_set_string(self, "host", value); -+ virt_viewer_file_set_string(self, MAIN_GROUP, "host", value); - g_object_notify(G_OBJECT(self), "host"); - } - - gchar* - virt_viewer_file_get_file_type(VirtViewerFile* self) - { -- return virt_viewer_file_get_string(self, "type"); -+ return virt_viewer_file_get_string(self, MAIN_GROUP, "type"); - } - - void - virt_viewer_file_set_type(VirtViewerFile* self, const gchar* value) - { -- virt_viewer_file_set_string(self, "type", value); -+ virt_viewer_file_set_string(self, MAIN_GROUP, "type", value); - g_object_notify(G_OBJECT(self), "type"); - } - - gint - virt_viewer_file_get_port(VirtViewerFile* self) - { -- return virt_viewer_file_get_int(self, "port"); -+ return virt_viewer_file_get_int(self, MAIN_GROUP, "port"); - } - - void - virt_viewer_file_set_port(VirtViewerFile* self, gint value) - { -- virt_viewer_file_set_int(self, "port", value); -+ virt_viewer_file_set_int(self, MAIN_GROUP, "port", value); - g_object_notify(G_OBJECT(self), "port"); - } - - gint - virt_viewer_file_get_tls_port(VirtViewerFile* self) - { -- return virt_viewer_file_get_int(self, "tls-port"); -+ return virt_viewer_file_get_int(self, MAIN_GROUP, "tls-port"); - } - - void - virt_viewer_file_set_tls_port(VirtViewerFile* self, gint value) - { -- virt_viewer_file_set_int(self, "tls-port", value); -+ virt_viewer_file_set_int(self, MAIN_GROUP, "tls-port", value); - g_object_notify(G_OBJECT(self), "tls-port"); - } - - gchar* - virt_viewer_file_get_username(VirtViewerFile* self) - { -- return virt_viewer_file_get_string(self, "username"); -+ return virt_viewer_file_get_string(self, MAIN_GROUP, "username"); - } - - gchar* - virt_viewer_file_get_password(VirtViewerFile* self) - { -- return virt_viewer_file_get_string(self, "password"); -+ return virt_viewer_file_get_string(self, MAIN_GROUP, "password"); - } - - void - virt_viewer_file_set_username(VirtViewerFile* self, const gchar* value) - { -- virt_viewer_file_set_string(self, "username", value); -+ virt_viewer_file_set_string(self, MAIN_GROUP, "username", value); - g_object_notify(G_OBJECT(self), "username"); - } - - void - virt_viewer_file_set_password(VirtViewerFile* self, const gchar* value) - { -- virt_viewer_file_set_string(self, "password", value); -+ virt_viewer_file_set_string(self, MAIN_GROUP, "password", value); - g_object_notify(G_OBJECT(self), "password"); - } - - gchar** - virt_viewer_file_get_disable_channels(VirtViewerFile* self, gsize* length) - { -- return virt_viewer_file_get_string_list(self, "disable-channels", length); -+ return virt_viewer_file_get_string_list(self, MAIN_GROUP, -+ "disable-channels", length); - } - - void - virt_viewer_file_set_disable_channels(VirtViewerFile* self, const gchar* const* value, gsize length) - { -- virt_viewer_file_set_string_list(self, "disable-channels", value, length); -+ virt_viewer_file_set_string_list(self, MAIN_GROUP, -+ "disable-channels", value, length); - g_object_notify(G_OBJECT(self), "disable-channels"); - } - - gchar** - virt_viewer_file_get_disable_effects(VirtViewerFile* self, gsize* length) - { -- return virt_viewer_file_get_string_list(self, "disable-effects", length); -+ return virt_viewer_file_get_string_list(self, MAIN_GROUP, -+ "disable-effects", length); - } - - void - virt_viewer_file_set_disable_effects(VirtViewerFile* self, const gchar* const* value, gsize length) - { -- virt_viewer_file_set_string_list(self, "disable-effects", value, length); -+ virt_viewer_file_set_string_list(self, MAIN_GROUP, -+ "disable-effects", value, length); - g_object_notify(G_OBJECT(self), "disable-effects"); - } - - gchar* - virt_viewer_file_get_tls_ciphers(VirtViewerFile* self) - { -- return virt_viewer_file_get_string(self, "tls-ciphers"); -+ return virt_viewer_file_get_string(self, MAIN_GROUP, "tls-ciphers"); - } - - void - virt_viewer_file_set_tls_ciphers(VirtViewerFile* self, const gchar* value) - { -- virt_viewer_file_set_string(self, "tls-ciphers", value); -+ virt_viewer_file_set_string(self, MAIN_GROUP, "tls-ciphers", value); - g_object_notify(G_OBJECT(self), "tls-ciphers"); - } - - gchar* - virt_viewer_file_get_host_subject(VirtViewerFile* self) - { -- return virt_viewer_file_get_string(self, "host-subject"); -+ return virt_viewer_file_get_string(self, MAIN_GROUP, -+ "host-subject"); - } - - void - virt_viewer_file_set_host_subject(VirtViewerFile* self, const gchar* value) - { -- virt_viewer_file_set_string(self, "host-subject", value); -+ virt_viewer_file_set_string(self, MAIN_GROUP, -+ "host-subject", value); - g_object_notify(G_OBJECT(self), "host-subject"); - } - - gint - virt_viewer_file_get_fullscreen(VirtViewerFile* self) - { -- return virt_viewer_file_get_int(self, "fullscreen"); -+ return virt_viewer_file_get_int(self, MAIN_GROUP, "fullscreen"); - } - - void - virt_viewer_file_set_fullscreen(VirtViewerFile* self, gint value) - { -- virt_viewer_file_set_int(self, "fullscreen", !!value); -+ virt_viewer_file_set_int(self, MAIN_GROUP, "fullscreen", !!value); - g_object_notify(G_OBJECT(self), "fullscreen"); - } - - gchar* - virt_viewer_file_get_title(VirtViewerFile* self) - { -- return virt_viewer_file_get_string(self, "title"); -+ return virt_viewer_file_get_string(self, MAIN_GROUP, "title"); - } - - void - virt_viewer_file_set_title(VirtViewerFile* self, const gchar* value) - { -- virt_viewer_file_set_string(self, "title", value); -+ virt_viewer_file_set_string(self, MAIN_GROUP, "title", value); - g_object_notify(G_OBJECT(self), "title"); - } - - gchar* - virt_viewer_file_get_toggle_fullscreen(VirtViewerFile* self) - { -- return virt_viewer_file_get_string(self, "toggle-fullscreen"); -+ return virt_viewer_file_get_string(self, MAIN_GROUP, "toggle-fullscreen"); - } - - void - virt_viewer_file_set_toggle_fullscreen(VirtViewerFile* self, const gchar* value) - { -- virt_viewer_file_set_string(self, "toggle-fullscreen", value); -+ virt_viewer_file_set_string(self, MAIN_GROUP, "toggle-fullscreen", value); - g_object_notify(G_OBJECT(self), "toggle-fullscreen"); - } - - gchar* - virt_viewer_file_get_release_cursor(VirtViewerFile* self) - { -- return virt_viewer_file_get_string(self, "release-cursor"); -+ return virt_viewer_file_get_string(self, MAIN_GROUP, "release-cursor"); - } - - void - virt_viewer_file_set_release_cursor(VirtViewerFile* self, const gchar* value) - { -- virt_viewer_file_set_string(self, "release-cursor", value); -+ virt_viewer_file_set_string(self, MAIN_GROUP, "release-cursor", value); - g_object_notify(G_OBJECT(self), "release-cursor"); - } - - gchar* - virt_viewer_file_get_secure_attention(VirtViewerFile* self) - { -- return virt_viewer_file_get_string(self, "secure-attention"); -+ return virt_viewer_file_get_string(self, MAIN_GROUP, "secure-attention"); - } - - void - virt_viewer_file_set_secure_attention(VirtViewerFile* self, const gchar* value) - { -- virt_viewer_file_set_string(self, "secure-attention", value); -+ virt_viewer_file_set_string(self, MAIN_GROUP, "secure-attention", value); - g_object_notify(G_OBJECT(self), "secure-attention"); - } - - gchar* - virt_viewer_file_get_smartcard_remove(VirtViewerFile* self) - { -- return virt_viewer_file_get_string(self, "smartcard-remove"); -+ return virt_viewer_file_get_string(self, MAIN_GROUP, "smartcard-remove"); - } - - void - virt_viewer_file_set_smartcard_remove(VirtViewerFile* self, const gchar* value) - { -- virt_viewer_file_set_string(self, "smartcard-remove", value); -+ virt_viewer_file_set_string(self, MAIN_GROUP, "smartcard-remove", value); - g_object_notify(G_OBJECT(self), "smartcard-remove"); - } - - gchar* - virt_viewer_file_get_smartcard_insert(VirtViewerFile* self) - { -- return virt_viewer_file_get_string(self, "smartcard-insert"); -+ return virt_viewer_file_get_string(self, MAIN_GROUP, "smartcard-insert"); - } - - void - virt_viewer_file_set_smartcard_insert(VirtViewerFile* self, const gchar* value) - { -- virt_viewer_file_set_string(self, "smartcard-insert", value); -+ virt_viewer_file_set_string(self, MAIN_GROUP, "smartcard-insert", value); - g_object_notify(G_OBJECT(self), "smartcard-insert"); - } - - gint - virt_viewer_file_get_enable_smartcard(VirtViewerFile* self) - { -- return virt_viewer_file_get_int(self, "enable-smartcard"); -+ return virt_viewer_file_get_int(self, MAIN_GROUP, "enable-smartcard"); - } - - void - virt_viewer_file_set_enable_smartcard(VirtViewerFile* self, gint value) - { -- virt_viewer_file_set_int(self, "enable-smartcard", !!value); -+ virt_viewer_file_set_int(self, MAIN_GROUP, "enable-smartcard", !!value); - g_object_notify(G_OBJECT(self), "enable-smartcard"); - } - - gint - virt_viewer_file_get_enable_usbredir(VirtViewerFile* self) - { -- return virt_viewer_file_get_int(self, "enable-usbredir"); -+ return virt_viewer_file_get_int(self, MAIN_GROUP, "enable-usbredir"); - } - - void - virt_viewer_file_set_enable_usbredir(VirtViewerFile* self, gint value) - { -- virt_viewer_file_set_int(self, "enable-usbredir", !!value); -+ virt_viewer_file_set_int(self, MAIN_GROUP, "enable-usbredir", !!value); - g_object_notify(G_OBJECT(self), "enable-usbredir"); - } - - gint - virt_viewer_file_get_delete_this_file(VirtViewerFile* self) - { -- return virt_viewer_file_get_int(self, "delete-this-file"); -+ return virt_viewer_file_get_int(self, MAIN_GROUP, "delete-this-file"); - } - - void - virt_viewer_file_set_delete_this_file(VirtViewerFile* self, gint value) - { -- virt_viewer_file_set_int(self, "delete-this-file", !!value); -+ virt_viewer_file_set_int(self, MAIN_GROUP, "delete-this-file", !!value); - g_object_notify(G_OBJECT(self), "delete-this-file"); - } - - gint - virt_viewer_file_get_color_depth(VirtViewerFile* self) - { -- return virt_viewer_file_get_int(self, "color-depth"); -+ return virt_viewer_file_get_int(self, MAIN_GROUP, "color-depth"); - } - - void - virt_viewer_file_set_color_depth(VirtViewerFile* self, gint value) - { -- virt_viewer_file_set_int(self, "color-depth", value); -+ virt_viewer_file_set_int(self, MAIN_GROUP, "color-depth", value); - g_object_notify(G_OBJECT(self), "color-depth"); - } - - gint - virt_viewer_file_get_enable_usb_autoshare(VirtViewerFile* self) - { -- return virt_viewer_file_get_int(self, "enable-usb-autoshare"); -+ return virt_viewer_file_get_int(self, MAIN_GROUP, "enable-usb-autoshare"); - } - - void - virt_viewer_file_set_enable_usb_autoshare(VirtViewerFile* self, gint value) - { -- virt_viewer_file_set_int(self, "enable-usb-autoshare", !!value); -+ virt_viewer_file_set_int(self, MAIN_GROUP, "enable-usb-autoshare", !!value); - g_object_notify(G_OBJECT(self), "enable-usb-autoshare"); - } - - gchar* - virt_viewer_file_get_usb_filter(VirtViewerFile* self) - { -- return virt_viewer_file_get_string(self, "usb-filter"); -+ return virt_viewer_file_get_string(self, MAIN_GROUP, "usb-filter"); - } - - void - virt_viewer_file_set_usb_filter(VirtViewerFile* self, const gchar* value) - { -- virt_viewer_file_set_string(self, "usb-filter", value); -+ virt_viewer_file_set_string(self, MAIN_GROUP, "usb-filter", value); - g_object_notify(G_OBJECT(self), "usb-filter"); - } - - gchar* - virt_viewer_file_get_proxy(VirtViewerFile* self) - { -- return virt_viewer_file_get_string(self, "proxy"); -+ return virt_viewer_file_get_string(self, MAIN_GROUP, "proxy"); - } - - void - virt_viewer_file_set_proxy(VirtViewerFile* self, const gchar* value) - { -- virt_viewer_file_set_string(self, "proxy", value); -+ virt_viewer_file_set_string(self, MAIN_GROUP, "proxy", value); - g_object_notify(G_OBJECT(self), "proxy"); - } - - gchar* - virt_viewer_file_get_version(VirtViewerFile* self) - { -- return virt_viewer_file_get_string(self, "version"); -+ return virt_viewer_file_get_string(self, MAIN_GROUP, "version"); - } - - void - virt_viewer_file_set_version(VirtViewerFile* self, const gchar* value) - { -- virt_viewer_file_set_string(self, "version", value); -+ virt_viewer_file_set_string(self, MAIN_GROUP, "version", value); - g_object_notify(G_OBJECT(self), "version"); - } - - gchar** - virt_viewer_file_get_secure_channels(VirtViewerFile* self, gsize* length) - { -- return virt_viewer_file_get_string_list(self, "secure-channels", length); -+ return virt_viewer_file_get_string_list(self, MAIN_GROUP, "secure-channels", length); - } - - void - virt_viewer_file_set_secure_channels(VirtViewerFile* self, const gchar* const* value, gsize length) - { -- virt_viewer_file_set_string_list(self, "secure-channels", value, length); -+ virt_viewer_file_set_string_list(self, MAIN_GROUP, "secure-channels", value, length); - g_object_notify(G_OBJECT(self), "secure-channels"); - } - diff --git a/SOURCES/0047-Remove-unnecessary-parameter-from-virt_viewer_window.patch b/SOURCES/0047-Remove-unnecessary-parameter-from-virt_viewer_window.patch new file mode 100644 index 0000000..819b9d8 --- /dev/null +++ b/SOURCES/0047-Remove-unnecessary-parameter-from-virt_viewer_window.patch @@ -0,0 +1,63 @@ +From 793ad7a0ecf66a78c952773276463f4d58b62862 Mon Sep 17 00:00:00 2001 +From: Pavel Grunt +Date: Tue, 14 Jul 2015 10:16:50 +0200 +Subject: [PATCH] Remove unnecessary parameter from virt_viewer_window_resize() + +Since c3cbdef888cc823e92140027d38378f40ccd4174 virt_viewer_window_resize +is always called with keep_win_size = FALSE. + +(cherry picked from commit c645a99267eda3a7834b83ced428aa74c4a56e13) +--- + src/virt-viewer-window.c | 11 +++++------ + 1 file changed, 5 insertions(+), 6 deletions(-) + +diff --git a/src/virt-viewer-window.c b/src/virt-viewer-window.c +index 96d5757..5aed50d 100644 +--- a/src/virt-viewer-window.c ++++ b/src/virt-viewer-window.c +@@ -64,7 +64,7 @@ void virt_viewer_window_menu_view_release_cursor(GtkWidget *menu, VirtViewerWind + /* Internal methods */ + static void virt_viewer_window_enable_modifiers(VirtViewerWindow *self); + static void virt_viewer_window_disable_modifiers(VirtViewerWindow *self); +-static void virt_viewer_window_resize(VirtViewerWindow *self, gboolean keep_win_size); ++static void virt_viewer_window_resize(VirtViewerWindow *self); + static void virt_viewer_window_toolbar_setup(VirtViewerWindow *self); + static GtkMenu* virt_viewer_window_get_keycombo_menu(VirtViewerWindow *self); + static void virt_viewer_window_get_minimal_dimensions(VirtViewerWindow *self, guint *width, guint *height); +@@ -361,7 +361,7 @@ virt_viewer_window_desktop_resize(VirtViewerDisplay *display G_GNUC_UNUSED, + self->priv->desktop_resize_pending = TRUE; + return; + } +- virt_viewer_window_resize(self, FALSE); ++ virt_viewer_window_resize(self); + } + + +@@ -409,7 +409,7 @@ virt_viewer_window_queue_resize(VirtViewerWindow *self) + * scale down to fit, maintaining aspect ratio + */ + static void +-virt_viewer_window_resize(VirtViewerWindow *self, gboolean keep_win_size) ++virt_viewer_window_resize(VirtViewerWindow *self) + { + GdkRectangle fullscreen; + GdkScreen *screen; +@@ -472,8 +472,7 @@ virt_viewer_window_resize(VirtViewerWindow *self, gboolean keep_win_size) + virt_viewer_display_set_desktop_size(VIRT_VIEWER_DISPLAY(priv->display), + width, height); + +- if (!keep_win_size) +- virt_viewer_window_queue_resize(self); ++ virt_viewer_window_queue_resize(self); + } + + static void +@@ -1371,7 +1370,7 @@ virt_viewer_window_show(VirtViewerWindow *self) + gtk_widget_show(self->priv->window); + + if (self->priv->desktop_resize_pending) { +- virt_viewer_window_resize(self, FALSE); ++ virt_viewer_window_resize(self); + self->priv->desktop_resize_pending = FALSE; + } + diff --git a/SOURCES/0048-Add-ovirt-specific-properties-to-VirtViewerFile.patch b/SOURCES/0048-Add-ovirt-specific-properties-to-VirtViewerFile.patch deleted file mode 100644 index 0acd1c0..0000000 --- a/SOURCES/0048-Add-ovirt-specific-properties-to-VirtViewerFile.patch +++ /dev/null @@ -1,193 +0,0 @@ -From ef33efbc6425b6243b1a39995f13d6fbce90bf54 Mon Sep 17 00:00:00 2001 -From: Christophe Fergeau -Date: Thu, 12 Dec 2013 16:26:44 +0100 -Subject: [PATCH] Add ovirt-specific properties to VirtViewerFile - -They will be useful to implement foreign menu support through -oVirt REST API - -Resolves: rhbz#1127156 -(cherry picked from commit eb4a7e4a840e4fb71eb499d4288eb4092f038e2d) ---- - src/virt-viewer-file.c | 108 +++++++++++++++++++++++++++++++++++++++++++++++++ - src/virt-viewer-file.h | 8 ++++ - 2 files changed, 116 insertions(+) - -diff --git a/src/virt-viewer-file.c b/src/virt-viewer-file.c -index 3ead36d..8c618c7 100644 ---- a/src/virt-viewer-file.c -+++ b/src/virt-viewer-file.c -@@ -66,6 +66,17 @@ - * - delete-this-file: int (0 or 1 atm) - * - proxy: proxy URL, like http://user:pass@foobar:8080 - * -+ * There is an optional [ovirt] section which can be used to specify -+ * the connection parameters to interact with the remote oVirt REST API. -+ * This is currently used to present a list of CDRom images which can be -+ * inserted in the VM. -+ * -+ * - host: string containing the URL of the oVirt engine -+ * - vm-guid: string containing the guid of the oVirt VM we are connecting to -+ * - jsessionid: string containing an authentication cookie to be used to -+ * connect to the oVirt engine without being asked for credentials -+ * - ca: string PEM data (use \n to seperate the lines) -+ * - * (the file can be extended with extra groups or keys, which should - * be prefixed with x- to avoid later conflicts) - */ -@@ -79,6 +90,7 @@ G_DEFINE_TYPE(VirtViewerFile, virt_viewer_file, G_TYPE_OBJECT); - #define VIRT_VIEWER_FILE_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE((o), VIRT_VIEWER_TYPE_FILE, VirtViewerFilePrivate)) - - #define MAIN_GROUP "virt-viewer" -+#define OVIRT_GROUP "ovirt" - - enum { - PROP_DUMMY_PROPERTY, -@@ -107,6 +119,10 @@ enum { - PROP_SECURE_CHANNELS, - PROP_DELETE_THIS_FILE, - PROP_SECURE_ATTENTION, -+ PROP_OVIRT_HOST, -+ PROP_OVIRT_VM_GUID, -+ PROP_OVIRT_JSESSIONID, -+ PROP_OVIRT_CA, - }; - - VirtViewerFile* -@@ -609,6 +625,58 @@ virt_viewer_file_set_secure_channels(VirtViewerFile* self, const gchar* const* v - g_object_notify(G_OBJECT(self), "secure-channels"); - } - -+gchar* -+virt_viewer_file_get_ovirt_host(VirtViewerFile* self) -+{ -+ return virt_viewer_file_get_string(self, OVIRT_GROUP, "host"); -+} -+ -+void -+virt_viewer_file_set_ovirt_host(VirtViewerFile* self, const gchar* value) -+{ -+ virt_viewer_file_set_string(self, OVIRT_GROUP, "host", value); -+ g_object_notify(G_OBJECT(self), "ovirt-host"); -+} -+ -+gchar* -+virt_viewer_file_get_ovirt_vm_guid(VirtViewerFile* self) -+{ -+ return virt_viewer_file_get_string(self, OVIRT_GROUP, "vm-guid"); -+} -+ -+void -+virt_viewer_file_set_ovirt_vm_guid(VirtViewerFile* self, const gchar* value) -+{ -+ virt_viewer_file_set_string(self, OVIRT_GROUP, "vm-guid", value); -+ g_object_notify(G_OBJECT(self), "ovirt-vm-guid"); -+} -+ -+gchar* -+virt_viewer_file_get_ovirt_jsessionid(VirtViewerFile* self) -+{ -+ return virt_viewer_file_get_string(self, OVIRT_GROUP, "jsessionid"); -+} -+ -+void -+virt_viewer_file_set_ovirt_jsessionid(VirtViewerFile* self, const gchar* value) -+{ -+ virt_viewer_file_set_string(self, OVIRT_GROUP, "jsessionid", value); -+ g_object_notify(G_OBJECT(self), "ovirt-jsessionid"); -+} -+ -+gchar* -+virt_viewer_file_get_ovirt_ca(VirtViewerFile* self) -+{ -+ return virt_viewer_file_get_string(self, OVIRT_GROUP, "ca"); -+} -+ -+void -+virt_viewer_file_set_ovirt_ca(VirtViewerFile* self, const gchar* value) -+{ -+ virt_viewer_file_set_string(self, OVIRT_GROUP, "ca", value); -+ g_object_notify(G_OBJECT(self), "ovirt-ca"); -+} -+ - static void - spice_hotkey_set_accel(const gchar *accel_path, const gchar *key) - { -@@ -770,6 +838,18 @@ virt_viewer_file_set_property(GObject* object, guint property_id, - case PROP_DELETE_THIS_FILE: - virt_viewer_file_set_delete_this_file(self, g_value_get_int(value)); - break; -+ case PROP_OVIRT_HOST: -+ virt_viewer_file_set_ovirt_host(self, g_value_get_string(value)); -+ break; -+ case PROP_OVIRT_VM_GUID: -+ virt_viewer_file_set_ovirt_vm_guid(self, g_value_get_string(value)); -+ break; -+ case PROP_OVIRT_JSESSIONID: -+ virt_viewer_file_set_ovirt_jsessionid(self, g_value_get_string(value)); -+ break; -+ case PROP_OVIRT_CA: -+ virt_viewer_file_set_ovirt_ca(self, g_value_get_string(value)); -+ break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID(object, property_id, pspec); - break; -@@ -858,6 +938,18 @@ virt_viewer_file_get_property(GObject* object, guint property_id, - case PROP_DELETE_THIS_FILE: - g_value_set_int(value, virt_viewer_file_get_delete_this_file(self)); - break; -+ case PROP_OVIRT_HOST: -+ g_value_take_string(value, virt_viewer_file_get_ovirt_host(self)); -+ break; -+ case PROP_OVIRT_VM_GUID: -+ g_value_take_string(value, virt_viewer_file_get_ovirt_vm_guid(self)); -+ break; -+ case PROP_OVIRT_JSESSIONID: -+ g_value_take_string(value, virt_viewer_file_get_ovirt_jsessionid(self)); -+ break; -+ case PROP_OVIRT_CA: -+ g_value_take_string(value, virt_viewer_file_get_ovirt_ca(self)); -+ break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID(object, property_id, pspec); - break; -@@ -992,4 +1084,20 @@ virt_viewer_file_class_init(VirtViewerFileClass* klass) - g_object_class_install_property(G_OBJECT_CLASS(klass), PROP_DELETE_THIS_FILE, - g_param_spec_int("delete-this-file", "delete-this-file", "delete-this-file", 0, 1, 0, - G_PARAM_STATIC_STRINGS | G_PARAM_READWRITE)); -+ -+ g_object_class_install_property(G_OBJECT_CLASS(klass), PROP_OVIRT_HOST, -+ g_param_spec_string("ovirt-host", "ovirt-host", "ovirt-host", NULL, -+ G_PARAM_STATIC_STRINGS | G_PARAM_READWRITE)); -+ -+ g_object_class_install_property(G_OBJECT_CLASS(klass), PROP_OVIRT_VM_GUID, -+ g_param_spec_string("ovirt-vm-guid", "ovirt-vm-guid", "ovirt-vm-guid", NULL, -+ G_PARAM_STATIC_STRINGS | G_PARAM_READWRITE)); -+ -+ g_object_class_install_property(G_OBJECT_CLASS(klass), PROP_OVIRT_JSESSIONID, -+ g_param_spec_string("ovirt-jsessionid", "ovirt-jsessionid", "ovirt-jsessionid", NULL, -+ G_PARAM_STATIC_STRINGS | G_PARAM_READWRITE)); -+ -+ g_object_class_install_property(G_OBJECT_CLASS(klass), PROP_OVIRT_CA, -+ g_param_spec_string("ovirt-ca", "ovirt-ca", "ovirt-ca", NULL, -+ G_PARAM_STATIC_STRINGS | G_PARAM_READWRITE)); - } -diff --git a/src/virt-viewer-file.h b/src/virt-viewer-file.h -index 9507bf9..f4b030c 100644 ---- a/src/virt-viewer-file.h -+++ b/src/virt-viewer-file.h -@@ -108,6 +108,14 @@ gint virt_viewer_file_get_delete_this_file(VirtViewerFile* self); - void virt_viewer_file_set_delete_this_file(VirtViewerFile* self, gint value); - gchar* virt_viewer_file_get_secure_attention(VirtViewerFile* self); - void virt_viewer_file_set_secure_attention(VirtViewerFile* self, const gchar* value); -+gchar* virt_viewer_file_get_ovirt_host(VirtViewerFile* self); -+void virt_viewer_file_set_ovirt_host(VirtViewerFile* self, const gchar* value); -+gchar* virt_viewer_file_get_ovirt_vm_guid(VirtViewerFile* self); -+void virt_viewer_file_set_ovirt_vm_guid(VirtViewerFile* self, const gchar* value); -+gchar* virt_viewer_file_get_ovirt_jsessionid(VirtViewerFile* self); -+void virt_viewer_file_set_ovirt_jsessionid(VirtViewerFile* self, const gchar* value); -+gchar* virt_viewer_file_get_ovirt_ca(VirtViewerFile* self); -+void virt_viewer_file_set_ovirt_ca(VirtViewerFile* self, const gchar* value); - - G_END_DECLS - diff --git a/SOURCES/0048-virt-viewer-window-Allow-to-resize-window-to-any-siz.patch b/SOURCES/0048-virt-viewer-window-Allow-to-resize-window-to-any-siz.patch new file mode 100644 index 0000000..53e32ce --- /dev/null +++ b/SOURCES/0048-virt-viewer-window-Allow-to-resize-window-to-any-siz.patch @@ -0,0 +1,133 @@ +From 7ee5ad961df82103a2c0c97312573f4b4245226a Mon Sep 17 00:00:00 2001 +From: Pavel Grunt +Date: Tue, 14 Jul 2015 14:35:11 +0200 +Subject: [PATCH] virt-viewer-window: Allow to resize window to any size + +The function virt_viewer_window_resize restricts window to be bigger +than a client's screen. It avoids extending the window to more client's +screens, it causes changes of the zoom level if the guest does not fit +into a screen. + +Lets remove virt_viewer_window_resize (its behaviour was introduced +by the commit 6acb3856b6d8007752388f22f97aa8aaffdb7a5e). It will let +the window managers to handle resizing of the window. + +Resolves: +https://bugzilla.redhat.com/show_bug.cgi?id=1221501 +https://bugzilla.redhat.com/show_bug.cgi?id=1205804 +(cherry picked from commit 3cbb6232f33d0ecdc7f58e2ea8eb7830f9fe007f) +--- + src/virt-viewer-window.c | 79 ++---------------------------------------------- + 1 file changed, 3 insertions(+), 76 deletions(-) + +diff --git a/src/virt-viewer-window.c b/src/virt-viewer-window.c +index 5aed50d..0879913 100644 +--- a/src/virt-viewer-window.c ++++ b/src/virt-viewer-window.c +@@ -64,7 +64,7 @@ void virt_viewer_window_menu_view_release_cursor(GtkWidget *menu, VirtViewerWind + /* Internal methods */ + static void virt_viewer_window_enable_modifiers(VirtViewerWindow *self); + static void virt_viewer_window_disable_modifiers(VirtViewerWindow *self); +-static void virt_viewer_window_resize(VirtViewerWindow *self); ++static void virt_viewer_window_queue_resize(VirtViewerWindow *self); + static void virt_viewer_window_toolbar_setup(VirtViewerWindow *self); + static GtkMenu* virt_viewer_window_get_keycombo_menu(VirtViewerWindow *self); + static void virt_viewer_window_get_minimal_dimensions(VirtViewerWindow *self, guint *width, guint *height); +@@ -361,7 +361,7 @@ virt_viewer_window_desktop_resize(VirtViewerDisplay *display G_GNUC_UNUSED, + self->priv->desktop_resize_pending = TRUE; + return; + } +- virt_viewer_window_resize(self); ++ virt_viewer_window_queue_resize(self); + } + + +@@ -402,79 +402,6 @@ virt_viewer_window_queue_resize(VirtViewerWindow *self) + #endif + } + +-/* +- * This code attempts to resize the top level window to be large enough +- * to contain the entire display desktop at 1:1 ratio. If the local desktop +- * isn't large enough that it goes as large as possible and lets the display +- * scale down to fit, maintaining aspect ratio +- */ +-static void +-virt_viewer_window_resize(VirtViewerWindow *self) +-{ +- GdkRectangle fullscreen; +- GdkScreen *screen; +- int width, height; +- double desktopAspect; +- double screenAspect; +- guint desktopWidth, display_width; +- guint desktopHeight, display_height; +- VirtViewerWindowPrivate *priv = self->priv; +- +- if (priv->fullscreen) +- return; +- +- g_debug("Preparing main window resize"); +- if (!priv->display) { +- g_debug("Skipping inactive resize"); +- return; +- } +- +- virt_viewer_display_get_desktop_size(VIRT_VIEWER_DISPLAY(priv->display), +- &desktopWidth, &desktopHeight); +- +- screen = gtk_widget_get_screen(priv->window); +- gdk_screen_get_monitor_geometry(screen, +- gdk_screen_get_monitor_at_window +- (screen, gtk_widget_get_window(priv->window)), +- &fullscreen); +- +- g_return_if_fail(desktopWidth > 0); +- g_return_if_fail(desktopHeight > 0); +- +- desktopAspect = (double)desktopWidth / (double)desktopHeight; +- screenAspect = (double)fullscreen.width / (double)fullscreen.height; +- +- display_width = desktopWidth * priv->zoomlevel / (double) NORMAL_ZOOM_LEVEL; +- display_height = desktopHeight * priv->zoomlevel / (double) NORMAL_ZOOM_LEVEL; +- +- if ((display_width > fullscreen.width) || +- (display_height > fullscreen.height)) { +- /* Doesn't fit native res, so go as large as possible +- maintaining aspect ratio */ +- if (screenAspect > desktopAspect) { +- width = fullscreen.height * desktopAspect; +- height = fullscreen.height; +- } else { +- width = fullscreen.width; +- height = fullscreen.width / desktopAspect; +- } +- width *= (double) NORMAL_ZOOM_LEVEL / priv->zoomlevel; +- height *= (double) NORMAL_ZOOM_LEVEL / priv->zoomlevel; +- } else { +- width = desktopWidth; +- height = desktopHeight; +- } +- +- g_debug("Decided todo %dx%d (desktop is %dx%d, fullscreen is %dx%d", +- width, height, desktopWidth, desktopHeight, +- fullscreen.width, fullscreen.height); +- +- virt_viewer_display_set_desktop_size(VIRT_VIEWER_DISPLAY(priv->display), +- width, height); +- +- virt_viewer_window_queue_resize(self); +-} +- + static void + virt_viewer_window_move_to_monitor(VirtViewerWindow *self) + { +@@ -1370,7 +1297,7 @@ virt_viewer_window_show(VirtViewerWindow *self) + gtk_widget_show(self->priv->window); + + if (self->priv->desktop_resize_pending) { +- virt_viewer_window_resize(self); ++ virt_viewer_window_queue_resize(self); + self->priv->desktop_resize_pending = FALSE; + } + diff --git a/SOURCES/0049-Create-foreign-menu-from-.vv-file-information.patch b/SOURCES/0049-Create-foreign-menu-from-.vv-file-information.patch deleted file mode 100644 index 062b1c8..0000000 --- a/SOURCES/0049-Create-foreign-menu-from-.vv-file-information.patch +++ /dev/null @@ -1,334 +0,0 @@ -From da9529ca4c5bb4424f258275c5678a9190444b78 Mon Sep 17 00:00:00 2001 -From: Christophe Fergeau -Date: Thu, 17 Apr 2014 21:00:28 +0200 -Subject: [PATCH] Create foreign menu from .vv file information - -When the .vv file has an [ovirt] section, we should try to create a foreign -menu out of it. This will allow remote-viewer to offer a menu to change the -currenty inserted cdrom. - -Contrary to the ovirt:// case when we already have fetched an OvirtAPI -and OvirtVm instance in order to get the SPICE/VNC connection details, -when working from a .vv file, we'll need to get them from the REST API. -Authentication should happen through the JSESSIONID cookie, if that -fails we want to give up on using the foreign menu, so we don't need to -set up authentication callbacks. - -Resolves: rhbz#1127156 -(cherry picked from commit 6ab5444c81a8f6a15012a55283e2737406fb08b1) ---- - src/ovirt-foreign-menu.c | 186 +++++++++++++++++++++++++++++++++++++++++++++++ - src/ovirt-foreign-menu.h | 2 + - src/remote-viewer.c | 9 +++ - 3 files changed, 197 insertions(+) - -diff --git a/src/ovirt-foreign-menu.c b/src/ovirt-foreign-menu.c -index 0453ca1..6fc9577 100644 ---- a/src/ovirt-foreign-menu.c -+++ b/src/ovirt-foreign-menu.c -@@ -25,12 +25,16 @@ - - #include - -+#include -+ - #include "ovirt-foreign-menu.h" - #include "virt-glib-compat.h" - #include "virt-viewer-util.h" - - typedef enum { - STATE_0, -+ STATE_API, -+ STATE_VM, - STATE_STORAGE_DOMAIN, - STATE_VM_CDROM, - STATE_CDROM_FILE, -@@ -38,6 +42,8 @@ typedef enum { - } OvirtForeignMenuState; - - static void ovirt_foreign_menu_next_async_step(OvirtForeignMenu *menu, OvirtForeignMenuState state); -+static void ovirt_foreign_menu_fetch_api_async(OvirtForeignMenu *menu); -+static void ovirt_foreign_menu_fetch_vm_async(OvirtForeignMenu *menu); - static void ovirt_foreign_menu_fetch_storage_domain_async(OvirtForeignMenu *menu); - static void ovirt_foreign_menu_fetch_vm_cdrom_async(OvirtForeignMenu *menu); - static void ovirt_foreign_menu_refresh_cdrom_file_async(OvirtForeignMenu *menu); -@@ -50,6 +56,7 @@ struct _OvirtForeignMenuPrivate { - OvirtProxy *proxy; - OvirtApi *api; - OvirtVm *vm; -+ char *vm_guid; - - OvirtCollection *files; - OvirtCdrom *cdrom; -@@ -75,6 +82,7 @@ enum { - PROP_VM, - PROP_FILE, - PROP_FILES, -+ PROP_VM_GUID, - }; - - -@@ -117,6 +125,10 @@ ovirt_foreign_menu_get_property(GObject *object, guint property_id, - case PROP_FILES: - g_value_set_pointer(value, priv->iso_names); - break; -+ case PROP_VM_GUID: -+ g_value_set_string(value, priv->vm_guid); -+ break; -+ - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); - } -@@ -148,6 +160,19 @@ ovirt_foreign_menu_set_property(GObject *object, guint property_id, - g_object_unref(priv->vm); - } - priv->vm = g_value_dup_object(value); -+ g_free(priv->vm_guid); -+ priv->vm_guid = NULL; -+ if (priv->vm != NULL) { -+ g_object_get(G_OBJECT(priv->vm), "guid", &priv->vm_guid, NULL); -+ } -+ break; -+ case PROP_VM_GUID: -+ if (priv->vm != NULL) { -+ g_object_unref(priv->vm); -+ priv->vm = NULL; -+ } -+ g_free(priv->vm_guid); -+ priv->vm_guid = g_value_dup_string(value); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); -@@ -175,6 +200,9 @@ ovirt_foreign_menu_dispose(GObject *obj) - self->priv->vm = NULL; - } - -+ g_free(self->priv->vm_guid); -+ self->priv->vm_guid = NULL; -+ - if (self->priv->files) { - g_object_unref(self->priv->files); - self->priv->files = NULL; -@@ -251,6 +279,15 @@ ovirt_foreign_menu_class_init(OvirtForeignMenuClass *klass) - "GSList of ISO names for this oVirt VM", - G_PARAM_READABLE | - G_PARAM_STATIC_STRINGS)); -+ g_object_class_install_property(oclass, -+ PROP_VM_GUID, -+ g_param_spec_string("vm-guid", -+ "VM GUID", -+ "GUID of the virtual machine to provide a foreign menu for", -+ NULL, -+ G_PARAM_READWRITE | -+ G_PARAM_CONSTRUCT_ONLY | -+ G_PARAM_STATIC_STRINGS)); - } - - -@@ -278,6 +315,22 @@ ovirt_foreign_menu_next_async_step(OvirtForeignMenu *menu, - - current_state++; - -+ if (current_state == STATE_API) { -+ if (menu->priv->api == NULL) { -+ ovirt_foreign_menu_fetch_api_async(menu); -+ } else { -+ current_state++; -+ } -+ } -+ -+ if (current_state == STATE_VM) { -+ if (menu->priv->vm == NULL) { -+ ovirt_foreign_menu_fetch_vm_async(menu); -+ } else { -+ current_state++; -+ } -+ } -+ - if (current_state == STATE_STORAGE_DOMAIN) { - if (menu->priv->files == NULL) { - ovirt_foreign_menu_fetch_storage_domain_async(menu); -@@ -635,6 +688,90 @@ static void ovirt_foreign_menu_fetch_storage_domain_async(OvirtForeignMenu *menu - } - - -+static void vms_fetched_cb(GObject *source_object, -+ GAsyncResult *result, -+ gpointer user_data) -+{ -+ GError *error = NULL; -+ OvirtForeignMenu *menu = OVIRT_FOREIGN_MENU(user_data); -+ OvirtCollection *collection; -+ GHashTableIter iter; -+ OvirtVm *vm; -+ -+ collection = OVIRT_COLLECTION(source_object); -+ ovirt_collection_fetch_finish(collection, result, &error); -+ if (error != NULL) { -+ g_debug("failed to fetch VM list: %s", error->message); -+ g_clear_error(&error); -+ return; -+ } -+ -+ g_hash_table_iter_init(&iter, ovirt_collection_get_resources(collection)); -+ while (g_hash_table_iter_next(&iter, NULL, (gpointer *)&vm)) { -+ char *guid; -+ -+ g_object_get(G_OBJECT(vm), "guid", &guid, NULL); -+ if (g_strcmp0(guid, menu->priv->vm_guid) == 0) { -+ menu->priv->vm = g_object_ref(vm); -+ g_free(guid); -+ break; -+ } -+ g_free(guid); -+ } -+ if (menu->priv->vm != NULL) { -+ ovirt_foreign_menu_next_async_step(menu, STATE_VM); -+ } else { -+ g_warning("failed to find a VM with guid \"%s\"", menu->priv->vm_guid); -+ } -+} -+ -+ -+static void ovirt_foreign_menu_fetch_vm_async(OvirtForeignMenu *menu) -+{ -+ OvirtCollection *vms; -+ -+ g_return_if_fail(OVIRT_IS_FOREIGN_MENU(menu)); -+ g_return_if_fail(OVIRT_IS_PROXY(menu->priv->proxy)); -+ g_return_if_fail(OVIRT_IS_API(menu->priv->api)); -+ -+ vms = ovirt_api_get_vms(menu->priv->api); -+ ovirt_collection_fetch_async(vms, menu->priv->proxy, -+ NULL, vms_fetched_cb, menu); -+} -+ -+ -+static void api_fetched_cb(GObject *source_object, -+ GAsyncResult *result, -+ gpointer user_data) -+{ -+ GError *error = NULL; -+ OvirtProxy *proxy; -+ OvirtForeignMenu *menu = OVIRT_FOREIGN_MENU(user_data); -+ -+ proxy = OVIRT_PROXY(source_object); -+ menu->priv->api = ovirt_proxy_fetch_api_finish(proxy, result, &error); -+ if (error != NULL) { -+ g_debug("failed to fetch toplevel API object: %s", error->message); -+ g_clear_error(&error); -+ return; -+ } -+ g_return_if_fail(OVIRT_IS_API(menu->priv->api)); -+ -+ ovirt_foreign_menu_next_async_step(menu, STATE_API); -+} -+ -+ -+static void ovirt_foreign_menu_fetch_api_async(OvirtForeignMenu *menu) -+{ -+ g_debug("Start fetching oVirt main entry point"); -+ -+ g_return_if_fail(OVIRT_IS_FOREIGN_MENU(menu)); -+ g_return_if_fail(OVIRT_IS_PROXY(menu->priv->proxy)); -+ -+ ovirt_proxy_fetch_api_async(menu->priv->proxy, NULL, api_fetched_cb, menu); -+} -+ -+ - static void iso_list_fetched_cb(GObject *source_object, - GAsyncResult *result, - gpointer user_data) -@@ -684,3 +821,52 @@ static gboolean ovirt_foreign_menu_refresh_iso_list(gpointer user_data) - */ - return G_SOURCE_REMOVE; - } -+ -+ -+OvirtForeignMenu *ovirt_foreign_menu_new_from_file(VirtViewerFile *file) -+{ -+ OvirtProxy *proxy = NULL; -+ OvirtForeignMenu *menu = NULL; -+ char *ca_str = NULL; -+ char *jsessionid = NULL; -+ char *url = NULL; -+ char *vm_guid = NULL; -+ GByteArray *ca = NULL; -+ -+ url = virt_viewer_file_get_ovirt_host(file); -+ vm_guid = virt_viewer_file_get_ovirt_vm_guid(file); -+ jsessionid = virt_viewer_file_get_ovirt_jsessionid(file); -+ ca_str = virt_viewer_file_get_ovirt_ca(file); -+ -+ if ((url == NULL) || (vm_guid == NULL)) -+ goto end; -+ -+ proxy = ovirt_proxy_new(url); -+ if (proxy == NULL) -+ goto end; -+ -+ if (ca_str != NULL) { -+ ca = g_byte_array_new_take((guint8 *)ca_str, strlen(ca_str) + 1); -+ ca_str = NULL; -+ } -+ -+ g_object_set(G_OBJECT(proxy), -+ "session-id", jsessionid, -+ "ca-cert", ca, -+ NULL); -+ menu = g_object_new(OVIRT_TYPE_FOREIGN_MENU, -+ "proxy", proxy, -+ "vm-guid", vm_guid, -+ NULL); -+ -+end: -+ g_free(url); -+ g_free(vm_guid); -+ g_free(jsessionid); -+ g_free(ca_str); -+ if (ca != NULL) { -+ g_byte_array_unref(ca); -+ } -+ -+ return menu; -+} -diff --git a/src/ovirt-foreign-menu.h b/src/ovirt-foreign-menu.h -index 7d28f0b..cf18b52 100644 ---- a/src/ovirt-foreign-menu.h -+++ b/src/ovirt-foreign-menu.h -@@ -29,6 +29,7 @@ - #include - #include - -+#include "virt-viewer-file.h" - - G_BEGIN_DECLS - -@@ -66,6 +67,7 @@ struct _OvirtForeignMenuClass { - GType ovirt_foreign_menu_get_type(void); - - OvirtForeignMenu* ovirt_foreign_menu_new(OvirtProxy *proxy); -+OvirtForeignMenu *ovirt_foreign_menu_new_from_file(VirtViewerFile *self); - void ovirt_foreign_menu_start(OvirtForeignMenu *menu); - - GtkWidget *ovirt_foreign_menu_get_gtk_menu(OvirtForeignMenu *foreign_menu); -diff --git a/src/remote-viewer.c b/src/remote-viewer.c -index 2b9b24d..11b3136 100644 ---- a/src/remote-viewer.c -+++ b/src/remote-viewer.c -@@ -1119,6 +1119,15 @@ retry_dialog: - } - - virt_viewer_session_set_file(virt_viewer_app_get_session(app), vvfile); -+#ifdef HAVE_OVIRT -+ if (vvfile != NULL) { -+ OvirtForeignMenu *ovirt_menu; -+ ovirt_menu = ovirt_foreign_menu_new_from_file(vvfile); -+ if (ovirt_menu != NULL) { -+ virt_viewer_app_set_ovirt_foreign_menu(app, ovirt_menu); -+ } -+ } -+#endif - - if (!virt_viewer_app_initial_connect(app, &error)) { - const gchar *msg = error ? error->message : diff --git a/SOURCES/0049-events-ensure-event-callbacks-are-threadsafe.patch b/SOURCES/0049-events-ensure-event-callbacks-are-threadsafe.patch new file mode 100644 index 0000000..a6ba8a9 --- /dev/null +++ b/SOURCES/0049-events-ensure-event-callbacks-are-threadsafe.patch @@ -0,0 +1,240 @@ +From 04dc4bc7eb1eb51ae1a8882319091698c47846a3 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Fabiano=20Fid=C3=AAncio?= +Date: Wed, 22 Jul 2015 02:48:05 +0200 +Subject: [PATCH] events: ensure event callbacks are threadsafe + +Take a global lock whenever changing any event callbacks to ensure +thread safety. + +Based on commit f1fe67da2dac6a249f796535b8dbd155d5741ad7 from +libvirt-glib. +Original author: Daniel P. Berrange + +Related to: rhbz#1243228 + +(cherry picked from commit 8a2420ecdfe7ae9eff3f7c9a0c0412af7d985fab) +--- + src/virt-viewer-events.c | 83 +++++++++++++++++++++++++++++++++++++----------- + 1 file changed, 65 insertions(+), 18 deletions(-) + +diff --git a/src/virt-viewer-events.c b/src/virt-viewer-events.c +index 3b5a136..f767c2e 100644 +--- a/src/virt-viewer-events.c ++++ b/src/virt-viewer-events.c +@@ -34,6 +34,8 @@ + + #include "virt-viewer-events.h" + ++static GMutex *eventlock = NULL; ++ + struct virt_viewer_events_handle + { + int watch; +@@ -85,6 +87,9 @@ int virt_viewer_events_add_handle(int fd, + { + struct virt_viewer_events_handle *data; + GIOCondition cond = 0; ++ int ret; ++ ++ g_mutex_lock(eventlock); + + handles = g_realloc(handles, sizeof(*handles)*(nhandles+1)); + data = g_malloc(sizeof(*data)); +@@ -117,7 +122,11 @@ int virt_viewer_events_add_handle(int fd, + + handles[nhandles++] = data; + +- return data->watch; ++ ret = data->watch; ++ ++ g_mutex_unlock(eventlock); ++ ++ return ret; + } + + static struct virt_viewer_events_handle * +@@ -135,17 +144,21 @@ static void + virt_viewer_events_update_handle(int watch, + int events) + { +- struct virt_viewer_events_handle *data = virt_viewer_events_find_handle(watch); ++ struct virt_viewer_events_handle *data; ++ ++ g_mutex_lock(eventlock); ++ ++ data = virt_viewer_events_find_handle(watch); + + if (!data) { + g_debug("Update for missing handle watch %d", watch); +- return; ++ goto cleanup; + } + + if (events) { + GIOCondition cond = 0; + if (events == data->events) +- return; ++ goto cleanup; + + if (data->source) + g_source_remove(data->source); +@@ -162,12 +175,15 @@ virt_viewer_events_update_handle(int watch, + data->events = events; + } else { + if (!data->source) +- return; ++ goto cleanup; + + g_source_remove(data->source); + data->source = 0; + data->events = 0; + } ++ ++cleanup: ++ g_mutex_unlock(eventlock); + } + + +@@ -190,24 +206,33 @@ virt_viewer_events_cleanup_handle(gpointer user_data) + static int + virt_viewer_events_remove_handle(int watch) + { +- struct virt_viewer_events_handle *data = virt_viewer_events_find_handle(watch); ++ struct virt_viewer_events_handle *data; ++ int ret = -1; ++ ++ g_mutex_lock(eventlock); ++ ++ data = virt_viewer_events_find_handle(watch); + + if (!data) { + g_debug("Remove of missing watch %d", watch); +- return -1; ++ goto cleanup; + } + + g_debug("Remove handle %d %d", watch, data->fd); + + if (!data->source) +- return -1; ++ goto cleanup; + + g_source_remove(data->source); + data->source = 0; + data->events = 0; + + g_idle_add(virt_viewer_events_cleanup_handle, data); +- return 0; ++ ret = 0; ++ ++cleanup: ++ g_mutex_unlock(eventlock); ++ return ret; + } + + struct virt_viewer_events_timeout +@@ -242,6 +267,9 @@ virt_viewer_events_add_timeout(int interval, + virFreeCallback ff) + { + struct virt_viewer_events_timeout *data; ++ int ret; ++ ++ g_mutex_lock(eventlock); + + timeouts = g_realloc(timeouts, sizeof(*timeouts)*(ntimeouts+1)); + data = g_malloc(sizeof(*data)); +@@ -261,7 +289,11 @@ virt_viewer_events_add_timeout(int interval, + + g_debug("Add timeout %p %d %p %p %d", data, interval, cb, opaque, data->timer); + +- return data->timer; ++ ret = data->timer; ++ ++ g_mutex_unlock(eventlock); ++ ++ return ret; + } + + +@@ -281,18 +313,21 @@ static void + virt_viewer_events_update_timeout(int timer, + int interval) + { +- struct virt_viewer_events_timeout *data = virt_viewer_events_find_timeout(timer); ++ struct virt_viewer_events_timeout *data; + ++ g_mutex_lock(eventlock); ++ ++ data = virt_viewer_events_find_timeout(timer); + if (!data) { + g_debug("Update of missing timer %d", timer); +- return; ++ goto cleanup; + } + + g_debug("Update timeout %p %d %d", data, timer, interval); + + if (interval >= 0) { + if (data->source) +- return; ++ goto cleanup; + + data->interval = interval; + data->source = g_timeout_add(data->interval, +@@ -300,11 +335,14 @@ virt_viewer_events_update_timeout(int timer, + data); + } else { + if (!data->source) +- return; ++ goto cleanup; + + g_source_remove(data->source); + data->source = 0; + } ++ ++cleanup: ++ g_mutex_unlock(eventlock); + } + + +@@ -327,27 +365,36 @@ virt_viewer_events_cleanup_timeout(gpointer user_data) + static int + virt_viewer_events_remove_timeout(int timer) + { +- struct virt_viewer_events_timeout *data = virt_viewer_events_find_timeout(timer); ++ struct virt_viewer_events_timeout *data; ++ int ret = -1; + ++ g_mutex_lock(eventlock); ++ ++ data = virt_viewer_events_find_timeout(timer); + if (!data) { + g_debug("Remove of missing timer %d", timer); +- return -1; ++ goto cleanup; + } + + g_debug("Remove timeout %p %d", data, timer); + + if (!data->source) +- return -1; ++ goto cleanup; + + g_source_remove(data->source); + data->source = 0; + + g_idle_add(virt_viewer_events_cleanup_timeout, data); +- return 0; ++ ret = 0; ++ ++cleanup: ++ g_mutex_unlock(eventlock); ++ return ret; + } + + + void virt_viewer_events_register(void) { ++ eventlock = g_mutex_new(); + virEventRegisterImpl(virt_viewer_events_add_handle, + virt_viewer_events_update_handle, + virt_viewer_events_remove_handle, diff --git a/SOURCES/0050-Fix-without-spice-gtk-with-ovirt-build.patch b/SOURCES/0050-Fix-without-spice-gtk-with-ovirt-build.patch deleted file mode 100644 index f7ac2f6..0000000 --- a/SOURCES/0050-Fix-without-spice-gtk-with-ovirt-build.patch +++ /dev/null @@ -1,225 +0,0 @@ -From 7b2b5e8467fc36c7115a1e942daba071d110e0d4 Mon Sep 17 00:00:00 2001 -From: Christophe Fergeau -Date: Mon, 8 Sep 2014 18:23:08 +0200 -Subject: [PATCH] Fix --without-spice-gtk --with-ovirt build - -The oVirt foreign menu support reused some existing bits from the older -SPICE controller foreign menu code. However, this controller code is -only built when spice-gtk support is built, while the oVirt foreign menu -code could be used with VNC as well. Trying to build the ovirt foreign -menu code without spice-gtk causes build issues due to missing -functions, or missing declarations, ... - -The libgovirt/spice-gtk code which is entangled is the code to update -the foreign menu when its content changes, or when a new window is -opened. Making the oVirt-specific code independant from the -spice-gtk-specific code is not too complicated, but this comes at the -expense of a bit of code duplication, but this is only simple code -iterating over the GHashTable storing the opened windows. - -Resolves: rhbz#1127156 -(cherry picked from commit 69eccb59f99ebdd3f4a90d59e2dd99e92f540b7b) ---- - src/remote-viewer.c | 107 +++++++++++++++++++++++++++++----------------------- - 1 file changed, 60 insertions(+), 47 deletions(-) - -diff --git a/src/remote-viewer.c b/src/remote-viewer.c -index 11b3136..237e6a3 100644 ---- a/src/remote-viewer.c -+++ b/src/remote-viewer.c -@@ -86,13 +86,17 @@ static gboolean remote_viewer_activate(VirtViewerApp *self, GError **error); - static void remote_viewer_window_added(VirtViewerApp *self, VirtViewerWindow *win); - static void spice_foreign_menu_updated(RemoteViewer *self); - static gint connect_dialog(gchar **uri); -+#endif - - static void - remote_viewer_dispose (GObject *object) - { -+#if defined(HAVE_SPICE_GTK) || defined(HAVE_OVIRT) - RemoteViewer *self = REMOTE_VIEWER(object); - RemoteViewerPrivate *priv = self->priv; -+#endif - -+#ifdef HAVE_SPICE_GTK - if (priv->controller) { - g_object_unref(priv->controller); - priv->controller = NULL; -@@ -102,6 +106,7 @@ remote_viewer_dispose (GObject *object) - g_object_unref(priv->ctrl_foreign_menu); - priv->ctrl_foreign_menu = NULL; - } -+#endif - - #ifdef HAVE_OVIRT - if (priv->ovirt_foreign_menu) { -@@ -112,7 +117,6 @@ remote_viewer_dispose (GObject *object) - - G_OBJECT_CLASS(remote_viewer_parent_class)->dispose (object); - } --#endif - - static void - remote_viewer_get_property (GObject *object, guint property_id, -@@ -192,13 +196,11 @@ remote_viewer_class_init (RemoteViewerClass *klass) - - app_class->start = remote_viewer_start; - app_class->deactivated = remote_viewer_deactivated; --#ifdef HAVE_SPICE_GTK - object_class->dispose = remote_viewer_dispose; -+#ifdef HAVE_SPICE_GTK - app_class->activate = remote_viewer_activate; - app_class->window_added = remote_viewer_window_added; --#endif - --#ifdef HAVE_SPICE_GTK - g_object_class_install_property(object_class, - PROP_CONTROLLER, - g_param_spec_object("controller", -@@ -429,36 +431,8 @@ spice_ctrl_menu_updated(RemoteViewer *self) - g_hash_table_foreach(windows, spice_menu_update_each, self); - } - --#ifdef HAVE_OVIRT - static void --ovirt_foreign_menu_update(RemoteViewer *app, VirtViewerWindow *win) --{ -- GtkWidget *menu = g_object_get_data(G_OBJECT(win), "foreign-menu"); -- GtkWidget *submenu; -- GtkMenuShell *shell = GTK_MENU_SHELL(gtk_builder_get_object(virt_viewer_window_get_builder(win), "top-menu")); -- -- if (app->priv->ovirt_foreign_menu == NULL) { -- /* nothing to do */ -- return; -- } -- if (menu == NULL) { -- menu = gtk_menu_item_new_with_label(_("_Change CD")); -- gtk_menu_item_set_use_underline(GTK_MENU_ITEM(menu), TRUE); -- gtk_menu_shell_append(shell, menu); -- g_object_set_data_full(G_OBJECT(win), "foreign-menu", -- g_object_ref(menu), -- (GDestroyNotify)gtk_widget_destroy); -- } -- -- submenu = ovirt_foreign_menu_get_gtk_menu(app->priv->ovirt_foreign_menu); -- gtk_menu_item_set_submenu(GTK_MENU_ITEM(menu), submenu); -- -- gtk_widget_show_all(menu); --} --#endif -- --static void --foreign_menu_update(RemoteViewer *self, VirtViewerWindow *win) -+spice_foreign_menu_update(RemoteViewer *self, VirtViewerWindow *win) - { - GtkWidget *menuitem = g_object_get_data(G_OBJECT(win), "foreign-menu"); - SpiceCtrlMenu *menu; -@@ -489,15 +463,11 @@ foreign_menu_update(RemoteViewer *self, VirtViewerWindow *win) - } - - static void --foreign_menu_update_each(gpointer key G_GNUC_UNUSED, -- gpointer value, -- gpointer user_data) -+spice_foreign_menu_update_each(gpointer key G_GNUC_UNUSED, -+ gpointer value, -+ gpointer user_data) - { -- foreign_menu_update(REMOTE_VIEWER(user_data), VIRT_VIEWER_WINDOW(value)); --#ifdef HAVE_OVIRT -- ovirt_foreign_menu_update(REMOTE_VIEWER(user_data), -- VIRT_VIEWER_WINDOW(value)); --#endif -+ spice_foreign_menu_update(REMOTE_VIEWER(user_data), VIRT_VIEWER_WINDOW(value)); - } - - static void -@@ -507,7 +477,7 @@ spice_foreign_menu_updated(RemoteViewer *self) - - g_debug("Spice foreign menu updated"); - -- g_hash_table_foreach(windows, foreign_menu_update_each, self); -+ g_hash_table_foreach(windows, spice_foreign_menu_update_each, self); - } - - static SpiceSession * -@@ -668,10 +638,7 @@ remote_viewer_window_added(VirtViewerApp *app G_GNUC_UNUSED, - VirtViewerWindow *win) - { - spice_menu_update(REMOTE_VIEWER(app), win); -- foreign_menu_update(REMOTE_VIEWER(app), win); --#ifdef HAVE_OVIRT -- ovirt_foreign_menu_update(REMOTE_VIEWER(app), win); --#endif -+ spice_foreign_menu_update(REMOTE_VIEWER(app), win); - } - #endif - -@@ -763,13 +730,57 @@ authenticate_cb(RestProxy *proxy, G_GNUC_UNUSED RestProxyAuth *auth, - return (ret == 0); - } - -+static void -+ovirt_foreign_menu_update(RemoteViewer *app, VirtViewerWindow *win) -+{ -+ GtkWidget *menu = g_object_get_data(G_OBJECT(win), "foreign-menu"); -+ GtkWidget *submenu; -+ GtkMenuShell *shell = GTK_MENU_SHELL(gtk_builder_get_object(virt_viewer_window_get_builder(win), "top-menu")); -+ -+ if (app->priv->ovirt_foreign_menu == NULL) { -+ /* nothing to do */ -+ return; -+ } -+ if (menu == NULL) { -+ menu = gtk_menu_item_new_with_label(_("_Change CD")); -+ gtk_menu_item_set_use_underline(GTK_MENU_ITEM(menu), TRUE); -+ gtk_menu_shell_append(shell, menu); -+ g_object_set_data_full(G_OBJECT(win), "foreign-menu", -+ g_object_ref(menu), -+ (GDestroyNotify)gtk_widget_destroy); -+ } -+ -+ submenu = ovirt_foreign_menu_get_gtk_menu(app->priv->ovirt_foreign_menu); -+ gtk_menu_item_set_submenu(GTK_MENU_ITEM(menu), submenu); -+ -+ gtk_widget_show_all(menu); -+} -+ -+static void -+ovirt_foreign_menu_update_each(gpointer key G_GNUC_UNUSED, -+ gpointer value, -+ gpointer user_data) -+{ -+ ovirt_foreign_menu_update(REMOTE_VIEWER(user_data), -+ VIRT_VIEWER_WINDOW(value)); -+} -+ -+static void -+ovirt_foreign_menu_updated(RemoteViewer *self) -+{ -+ GHashTable *windows = virt_viewer_app_get_windows(VIRT_VIEWER_APP(self)); -+ -+ g_debug("Spice foreign menu updated"); -+ -+ g_hash_table_foreach(windows, ovirt_foreign_menu_update_each, self); -+} - - static void - ovirt_foreign_menu_changed(OvirtForeignMenu *foreign_menu G_GNUC_UNUSED, - GParamSpec *pspec G_GNUC_UNUSED, - VirtViewerApp *app) - { -- spice_foreign_menu_updated(REMOTE_VIEWER(app)); -+ ovirt_foreign_menu_updated(REMOTE_VIEWER(app)); - } - - -@@ -790,6 +801,8 @@ virt_viewer_app_set_ovirt_foreign_menu(VirtViewerApp *app, - (GCallback)ovirt_foreign_menu_changed, app); - g_signal_connect(G_OBJECT(foreign_menu), "notify::files", - (GCallback)ovirt_foreign_menu_changed, app); -+ g_signal_connect(G_OBJECT(app), "window-added", -+ (GCallback)ovirt_foreign_menu_update, NULL); - ovirt_foreign_menu_start(foreign_menu); - } - diff --git a/SOURCES/0050-events-register-event-using-GOnce-to-avoid-multiple-.patch b/SOURCES/0050-events-register-event-using-GOnce-to-avoid-multiple-.patch new file mode 100644 index 0000000..28f343c --- /dev/null +++ b/SOURCES/0050-events-register-event-using-GOnce-to-avoid-multiple-.patch @@ -0,0 +1,50 @@ +From 8b3f405adcfda8b31e331582579f6efd93cfc7a3 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Fabiano=20Fid=C3=AAncio?= +Date: Wed, 22 Jul 2015 02:51:49 +0200 +Subject: [PATCH] events: register event using GOnce to avoid multiple + initializations +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Based on commit 8f8d9ce5238dbcbce40aa04ba55b8c55f97c79c0 from +libvirt-glib. +Original author: Marc-André Lureau + +Related to: rhbz#1243228 + +(cherry picked from commit 0a464aae9a764c404ea76fe2212d45e5b2d87d2f) +--- + src/virt-viewer-events.c | 12 ++++++++++-- + 1 file changed, 10 insertions(+), 2 deletions(-) + +diff --git a/src/virt-viewer-events.c b/src/virt-viewer-events.c +index f767c2e..daf128e 100644 +--- a/src/virt-viewer-events.c ++++ b/src/virt-viewer-events.c +@@ -392,8 +392,8 @@ cleanup: + return ret; + } + +- +-void virt_viewer_events_register(void) { ++static gpointer event_register_once(gpointer data G_GNUC_UNUSED) ++{ + eventlock = g_mutex_new(); + virEventRegisterImpl(virt_viewer_events_add_handle, + virt_viewer_events_update_handle, +@@ -401,6 +401,14 @@ void virt_viewer_events_register(void) { + virt_viewer_events_add_timeout, + virt_viewer_events_update_timeout, + virt_viewer_events_remove_timeout); ++ ++ return NULL; ++} ++ ++void virt_viewer_events_register(void) { ++ static GOnce once = G_ONCE_INIT; ++ ++ g_once(&once, event_register_once, NULL); + } + + /* diff --git a/SOURCES/0051-Fix-gcc-warning-missing-prototypes.patch b/SOURCES/0051-Fix-gcc-warning-missing-prototypes.patch deleted file mode 100644 index 11f004a..0000000 --- a/SOURCES/0051-Fix-gcc-warning-missing-prototypes.patch +++ /dev/null @@ -1,23 +0,0 @@ -From 540b0c5cefa480dcf4ff6d5732c7ff8c2b7e950d Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Fabiano=20Fid=C3=AAncio?= -Date: Fri, 8 Aug 2014 16:26:27 +0200 -Subject: [PATCH] Fix gcc warning (missing-prototypes) - -Related: rhbz#1129477 -(cherry picked from commit 729ce99023e48eb70ed49a27729a20111f3a3f53) ---- - src/virt-viewer-window.c | 1 + - 1 file changed, 1 insertion(+) - -diff --git a/src/virt-viewer-window.c b/src/virt-viewer-window.c -index f74f17f..668a980 100644 ---- a/src/virt-viewer-window.c -+++ b/src/virt-viewer-window.c -@@ -48,6 +48,7 @@ void virt_viewer_window_menu_view_zoom_in(GtkWidget *menu, VirtViewerWindow *sel - void virt_viewer_window_menu_view_zoom_reset(GtkWidget *menu, VirtViewerWindow *self); - gboolean virt_viewer_window_delete(GtkWidget *src, void *dummy, VirtViewerWindow *self); - void virt_viewer_window_menu_file_quit(GtkWidget *src, VirtViewerWindow *self); -+void virt_viewer_window_guest_details_response(GtkDialog *dialog, gint response_id, gpointer user_data); - void virt_viewer_window_menu_help_about(GtkWidget *menu, VirtViewerWindow *self); - void virt_viewer_window_menu_help_guest_details(GtkWidget *menu, VirtViewerWindow *self); - void virt_viewer_window_menu_view_fullscreen(GtkWidget *menu, VirtViewerWindow *self); diff --git a/SOURCES/0051-events-remove-timeout-and-handle-from-arrays.patch b/SOURCES/0051-events-remove-timeout-and-handle-from-arrays.patch new file mode 100644 index 0000000..1dfd807 --- /dev/null +++ b/SOURCES/0051-events-remove-timeout-and-handle-from-arrays.patch @@ -0,0 +1,260 @@ +From e529f4a2e8dc6ba8ad6469c3a68338b8d9c9186e Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Fabiano=20Fid=C3=AAncio?= +Date: Wed, 22 Jul 2015 03:16:37 +0200 +Subject: [PATCH] events: remove timeout and handle from arrays +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Otherwise, it will crash next time it goes find() + +Backtrace: +(gdb) where + #0 0x00007efcae715095 in g_io_create_watch () from + /lib64/libglib-2.0.so.0 + #1 0x00007efcae7150ef in g_io_add_watch_full () from + /lib64/libglib-2.0.so.0 + #2 0x00000000004275ba in virt_viewer_events_update_handle + (watch=, events=1) at + virt-viewer-events.c:158 + #3 0x00007efcb1a62dce in virNetSocketUpdateIOCallback (sock=0x1e75c00, + events=1) at rpc/virnetsocket.c:1981 + #4 0x00007efcb1a50113 in virNetClientIOUpdateCallback + (client=, enableCallback=) at + rpc/virnetclient.c:1639 + #5 0x00007efcb1a50f82 in virNetClientIO (thiscall=0x20e0170, + client=0x1f2e060) at rpc/virnetclient.c:1793 + #6 virNetClientSendInternal (client=client@entry=0x1f2e060, + msg=msg@entry=0x20e0100, + expectReply=expectReply@entry=false, nonBlock=nonBlock@entry=true) at + rpc/virnetclient.c:1962 + #7 0x00007efcb1a52413 in virNetClientSendNonBlock (client=0x1f2e060, + msg=msg@entry=0x20e0100) at + rpc/virnetclient.c:2036 + #8 0x00007efcb1a5243d in virNetClientKeepAliveSendCB (opaque=, msg=0x20e0100) at + rpc/virnetclient.c:293 + #9 0x00007efcb1a5ba02 in virKeepAliveTimer (timer=, + opaque=0x20d3d00) at rpc/virkeepalive.c:176 + #10 0x00000000004272e9 in virt_viewer_events_dispatch_timeout + (opaque=0x1e6cd30) at virt-viewer-events.c:233 + #11 0x00007efcae7231b3 in g_timeout_dispatch () from + /lib64/libglib-2.0.so.0 + #12 0x00007efcae72279a in g_main_context_dispatch () from + /lib64/libglib-2.0.so.0 + #13 0x00007efcae722ae8 in g_main_context_iterate.isra.24 () from + /lib64/libglib-2.0.so.0 + #14 0x00007efcae722dba in g_main_loop_run () from + /lib64/libglib-2.0.so.0 + #15 0x00007efcb054a045 in gtk_main () from /lib64/libgtk-3.so.0 + #16 0x0000000000410a9c in main (argc=1, argv=0x7ffde58a7978) at + virt-viewer-main.c:124 + +Based on commit cff5f1c46f4b9661e112b85159fb58ae473a9a89 from +libvirt-glib. +Original author: Marc-André Lureau + +Related to: rhbz#1243228 + +(cherry picked from commit d28077ad08f46514f75ca13d9656635cc2111bd5) +--- + src/virt-viewer-events.c | 80 +++++++++++++++++++++++++++++++----------------- + 1 file changed, 52 insertions(+), 28 deletions(-) + +diff --git a/src/virt-viewer-events.c b/src/virt-viewer-events.c +index daf128e..74828f5 100644 +--- a/src/virt-viewer-events.c ++++ b/src/virt-viewer-events.c +@@ -50,8 +50,7 @@ struct virt_viewer_events_handle + }; + + static int nextwatch = 1; +-static unsigned int nhandles = 0; +-static struct virt_viewer_events_handle **handles = NULL; ++static GPtrArray *handles; + + static gboolean + virt_viewer_events_dispatch_handle(GIOChannel *source G_GNUC_UNUSED, +@@ -91,9 +90,7 @@ int virt_viewer_events_add_handle(int fd, + + g_mutex_lock(eventlock); + +- handles = g_realloc(handles, sizeof(*handles)*(nhandles+1)); +- data = g_malloc(sizeof(*data)); +- memset(data, 0, sizeof(*data)); ++ data = g_new0(struct virt_viewer_events_handle, 1); + + if (events & VIR_EVENT_HANDLE_READABLE) + cond |= G_IO_IN; +@@ -120,7 +117,7 @@ int virt_viewer_events_add_handle(int fd, + virt_viewer_events_dispatch_handle, + data); + +- handles[nhandles++] = data; ++ g_ptr_array_add(handles, data); + + ret = data->watch; + +@@ -130,12 +127,24 @@ int virt_viewer_events_add_handle(int fd, + } + + static struct virt_viewer_events_handle * +-virt_viewer_events_find_handle(int watch) ++virt_viewer_events_find_handle(int watch, guint *idx) + { +- unsigned int i; +- for (i = 0 ; i < nhandles ; i++) +- if (handles[i]->watch == watch) +- return handles[i]; ++ guint i; ++ ++ for (i = 0 ; i < handles->len ; i++) { ++ struct virt_viewer_events_handle *h = g_ptr_array_index(handles, i); ++ ++ if (h == NULL) { ++ g_warn_if_reached (); ++ continue; ++ } ++ ++ if (h->watch == watch) { ++ if (idx != NULL) ++ *idx = i; ++ return h; ++ } ++ } + + return NULL; + } +@@ -148,7 +157,7 @@ virt_viewer_events_update_handle(int watch, + + g_mutex_lock(eventlock); + +- data = virt_viewer_events_find_handle(watch); ++ data = virt_viewer_events_find_handle(watch, NULL); + + if (!data) { + g_debug("Update for missing handle watch %d", watch); +@@ -198,7 +207,7 @@ virt_viewer_events_cleanup_handle(gpointer user_data) + if (data->ff) + (data->ff)(data->opaque); + +- free(data); ++ g_ptr_array_remove_fast(handles, data); + return FALSE; + } + +@@ -208,10 +217,11 @@ virt_viewer_events_remove_handle(int watch) + { + struct virt_viewer_events_handle *data; + int ret = -1; ++ guint idx; + + g_mutex_lock(eventlock); + +- data = virt_viewer_events_find_handle(watch); ++ data = virt_viewer_events_find_handle(watch, &idx); + + if (!data) { + g_debug("Remove of missing watch %d", watch); +@@ -247,8 +257,7 @@ struct virt_viewer_events_timeout + + + static int nexttimer = 1; +-static unsigned int ntimeouts = 0; +-static struct virt_viewer_events_timeout **timeouts = NULL; ++static GPtrArray *timeouts; + + static gboolean + virt_viewer_events_dispatch_timeout(void *opaque) +@@ -271,9 +280,7 @@ virt_viewer_events_add_timeout(int interval, + + g_mutex_lock(eventlock); + +- timeouts = g_realloc(timeouts, sizeof(*timeouts)*(ntimeouts+1)); +- data = g_malloc(sizeof(*data)); +- memset(data, 0, sizeof(*data)); ++ data = g_new0(struct virt_viewer_events_timeout, 1); + + data->timer = nexttimer++; + data->interval = interval; +@@ -285,7 +292,7 @@ virt_viewer_events_add_timeout(int interval, + virt_viewer_events_dispatch_timeout, + data); + +- timeouts[ntimeouts++] = data; ++ g_ptr_array_add(timeouts, data); + + g_debug("Add timeout %p %d %p %p %d", data, interval, cb, opaque, data->timer); + +@@ -298,12 +305,26 @@ virt_viewer_events_add_timeout(int interval, + + + static struct virt_viewer_events_timeout * +-virt_viewer_events_find_timeout(int timer) ++virt_viewer_events_find_timeout(int timer, guint *idx) + { +- unsigned int i; +- for (i = 0 ; i < ntimeouts ; i++) +- if (timeouts[i]->timer == timer) +- return timeouts[i]; ++ guint i; ++ ++ g_return_val_if_fail(timeouts != NULL, NULL); ++ ++ for (i = 0 ; i < timeouts->len ; i++) { ++ struct virt_viewer_events_timeout *t = g_ptr_array_index(timeouts, i); ++ ++ if (t == NULL) { ++ g_warn_if_reached (); ++ continue; ++ } ++ ++ if (t->timer == timer) { ++ if (idx != NULL) ++ *idx = i; ++ return t; ++ } ++ } + + return NULL; + } +@@ -317,7 +338,7 @@ virt_viewer_events_update_timeout(int timer, + + g_mutex_lock(eventlock); + +- data = virt_viewer_events_find_timeout(timer); ++ data = virt_viewer_events_find_timeout(timer, NULL); + if (!data) { + g_debug("Update of missing timer %d", timer); + goto cleanup; +@@ -357,7 +378,7 @@ virt_viewer_events_cleanup_timeout(gpointer user_data) + if (data->ff) + (data->ff)(data->opaque); + +- free(data); ++ g_ptr_array_remove_fast(timeouts, data); + return FALSE; + } + +@@ -367,10 +388,11 @@ virt_viewer_events_remove_timeout(int timer) + { + struct virt_viewer_events_timeout *data; + int ret = -1; ++ guint idx; + + g_mutex_lock(eventlock); + +- data = virt_viewer_events_find_timeout(timer); ++ data = virt_viewer_events_find_timeout(timer, &idx); + if (!data) { + g_debug("Remove of missing timer %d", timer); + goto cleanup; +@@ -395,6 +417,8 @@ cleanup: + static gpointer event_register_once(gpointer data G_GNUC_UNUSED) + { + eventlock = g_mutex_new(); ++ timeouts = g_ptr_array_new_with_free_func(g_free); ++ handles = g_ptr_array_new_with_free_func(g_free); + virEventRegisterImpl(virt_viewer_events_add_handle, + virt_viewer_events_update_handle, + virt_viewer_events_remove_handle, diff --git a/SOURCES/0052-Fix-gcc-warning-unused-parameter.patch b/SOURCES/0052-Fix-gcc-warning-unused-parameter.patch deleted file mode 100644 index 1ddca2e..0000000 --- a/SOURCES/0052-Fix-gcc-warning-unused-parameter.patch +++ /dev/null @@ -1,26 +0,0 @@ -From 77a43a8efdf6a02f25ff7ea8c0560b84f5ce66e4 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Fabiano=20Fid=C3=AAncio?= -Date: Fri, 8 Aug 2014 16:27:31 +0200 -Subject: [PATCH] Fix gcc warning (unused-parameter) - -Related: rhbz#1129477 -(cherry picked from commit 4767491532da81acddf48ade32eb7b8b621952b5) ---- - src/virt-viewer-window.c | 4 +++- - 1 file changed, 3 insertions(+), 1 deletion(-) - -diff --git a/src/virt-viewer-window.c b/src/virt-viewer-window.c -index 668a980..c8d5722 100644 ---- a/src/virt-viewer-window.c -+++ b/src/virt-viewer-window.c -@@ -1055,7 +1055,9 @@ virt_viewer_window_menu_help_guest_details(GtkWidget *menu G_GNUC_UNUSED, - } - - G_MODULE_EXPORT void --virt_viewer_window_guest_details_response(GtkDialog *dialog, gint response_id, gpointer user_data) -+virt_viewer_window_guest_details_response(GtkDialog *dialog, -+ gint response_id, -+ gpointer user_data G_GNUC_UNUSED) - { - if (response_id == GTK_RESPONSE_CLOSE) - gtk_widget_hide(GTK_WIDGET(dialog)); diff --git a/SOURCES/0052-glib-compat-Use-g_new0-GMutex-1-if-GLib-2.31.patch b/SOURCES/0052-glib-compat-Use-g_new0-GMutex-1-if-GLib-2.31.patch new file mode 100644 index 0000000..0e37b29 --- /dev/null +++ b/SOURCES/0052-glib-compat-Use-g_new0-GMutex-1-if-GLib-2.31.patch @@ -0,0 +1,46 @@ +From 9a715e7027916d7e4701f1ded7b07e9d40cfee55 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Fabiano=20Fid=C3=AAncio?= +Date: Wed, 22 Jul 2015 02:14:09 +0200 +Subject: [PATCH] glib-compat: Use g_new0(GMutex, 1) if GLib >= 2.31 + +Since 2.31, g_mutex_new() is deprecated. + +Based on commit 2dc7476d32a9e158e688486e8f184c719c53bb4c from +libvirt-glib. +Original author: Daniel P. Berrange + +Related to: rhbz#1243228 + +(cherry picked from commit a7050b7d2c82c103bc932a327a7a9152ab77a033) +--- + src/virt-glib-compat.h | 4 ++++ + src/virt-viewer-events.c | 1 + + 2 files changed, 5 insertions(+) + +diff --git a/src/virt-glib-compat.h b/src/virt-glib-compat.h +index 37b6f61..a919fcf 100644 +--- a/src/virt-glib-compat.h ++++ b/src/virt-glib-compat.h +@@ -71,6 +71,10 @@ G_BEGIN_DECLS + GByteArray *g_byte_array_new_take (guint8 *data, gsize len); + #endif + ++#if GLIB_CHECK_VERSION(2,31,0) ++#define g_mutex_new() g_new0(GMutex, 1) ++#endif ++ + G_END_DECLS + + #endif // _VIRT_GLIB_COMPAT_H +diff --git a/src/virt-viewer-events.c b/src/virt-viewer-events.c +index 74828f5..02b7216 100644 +--- a/src/virt-viewer-events.c ++++ b/src/virt-viewer-events.c +@@ -33,6 +33,7 @@ + #include + + #include "virt-viewer-events.h" ++#include "virt-glib-compat.h" + + static GMutex *eventlock = NULL; + diff --git a/SOURCES/0053-events-allow-zero-timeouts-for-timer.patch b/SOURCES/0053-events-allow-zero-timeouts-for-timer.patch new file mode 100644 index 0000000..f442c9e --- /dev/null +++ b/SOURCES/0053-events-allow-zero-timeouts-for-timer.patch @@ -0,0 +1,34 @@ +From acc448a9d65783e760d84a5c82ba788b00106137 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Fabiano=20Fid=C3=AAncio?= +Date: Wed, 22 Jul 2015 03:27:50 +0200 +Subject: [PATCH] events: allow zero timeouts for timer + +In libvirt, it's perfectly possible and widely used to have disabled +timers (timeout=-1) and fire them up 'randomly' with timeout=0. +However, with current mapping into glib mainloop it's not possible +and causing troubles. + +Based on commit a40a1732e0d53fcc44b8d348cec97152dafd2b88 from +libvirt-glib. +Original author: Michal Privoznik + +Related to: rhbz#1243228 + +(cherry picked from commit 7805b67b68aba43afb7f421f76cf0c49afa3ea06) +--- + src/virt-viewer-events.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/src/virt-viewer-events.c b/src/virt-viewer-events.c +index 02b7216..462ce6c 100644 +--- a/src/virt-viewer-events.c ++++ b/src/virt-viewer-events.c +@@ -349,7 +349,7 @@ virt_viewer_events_update_timeout(int timer, + + if (interval >= 0) { + if (data->source) +- goto cleanup; ++ g_source_remove(data->source); + + data->interval = interval; + data->source = g_timeout_add(data->interval, diff --git a/SOURCES/0053-virt-viewer-Don-t-connect-to-localhost-displays-with.patch b/SOURCES/0053-virt-viewer-Don-t-connect-to-localhost-displays-with.patch deleted file mode 100644 index 2c3c77e..0000000 --- a/SOURCES/0053-virt-viewer-Don-t-connect-to-localhost-displays-with.patch +++ /dev/null @@ -1,94 +0,0 @@ -From c075e62f55cfbcb8ac4a73f0aec665c990075d7a Mon Sep 17 00:00:00 2001 -From: Christophe Fergeau -Date: Thu, 12 Jun 2014 11:59:51 +0200 -Subject: [PATCH] virt-viewer: Don't connect to localhost displays with - qemu+tcp:// - -When connecting to a remote libvirt instance, a VM may only be listening -on localhost for SPICE/VNC connections. In such a situation, virt-viewer -then tries to connect to localhost, which is not correct as this -'localhost' referred to the remote libvirt host it connected to. -This commit adds a couple of tests on the libvirt URI used and the - listen address to error out in this situation. - -Resolves: rhbz#1108523 -(cherry picked from commit a4dde5e6185776b9cd0a0ced2e9257c7d0192d2f) ---- - src/virt-viewer.c | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ - 1 file changed, 57 insertions(+) - -diff --git a/src/virt-viewer.c b/src/virt-viewer.c -index 076611c..8d3e6fb 100644 ---- a/src/virt-viewer.c -+++ b/src/virt-viewer.c -@@ -292,6 +292,55 @@ virt_viewer_replace_host(const gchar *host) - return ret; - } - -+ -+static gboolean -+virt_viewer_is_loopback(const char *host) -+{ -+ GInetAddress *addr = NULL; -+ gboolean is_loopback = FALSE; -+ -+ g_return_val_if_fail(host != NULL, FALSE); -+ -+ addr = g_inet_address_new_from_string(host); -+ if (!addr) /* Parsing error means it was probably a hostname */ -+ return (strcmp(host, "localhost") == 0); -+ -+ is_loopback = g_inet_address_get_is_loopback(addr); -+ g_object_unref(addr); -+ -+ return is_loopback; -+} -+ -+ -+static gboolean -+virt_viewer_is_reachable(const gchar *host, const char *transport, -+ const char *transport_host) -+{ -+ gboolean host_is_loopback; -+ gboolean transport_is_loopback; -+ -+ if (!host) -+ return FALSE; -+ -+ if (!transport) -+ return TRUE; -+ -+ if (strcmp(transport, "ssh") == 0) -+ return TRUE; -+ -+ if (strcmp(transport, "unix") == 0) -+ return TRUE; -+ -+ host_is_loopback = virt_viewer_is_loopback(host); -+ transport_is_loopback = virt_viewer_is_loopback(transport_host); -+ -+ if (transport_is_loopback && host_is_loopback) -+ return TRUE; -+ else -+ return !host_is_loopback; -+} -+ -+ - static gboolean - virt_viewer_extract_connect_info(VirtViewer *self, - virDomainPtr dom) -@@ -377,6 +426,14 @@ virt_viewer_extract_connect_info(VirtViewer *self, - ghost = replacement_host; - } - -+ if (!virt_viewer_is_reachable(ghost, transport, host)) { -+ g_debug("graphics listen '%s' is not reachable from this machine", -+ ghost ? ghost : ""); -+ virt_viewer_app_simple_message_dialog(app, _("Guest '%s' is not reachable"), -+ priv->domkey); -+ goto cleanup; -+ } -+ - virt_viewer_app_set_connect_info(app, host, ghost, gport, gtlsport,transport, unixsock, user, port, NULL); - - retval = TRUE; diff --git a/SOURCES/0054-app-add-virt_viewer_app_make_dialog.patch b/SOURCES/0054-app-add-virt_viewer_app_make_dialog.patch deleted file mode 100644 index 110fba0..0000000 --- a/SOURCES/0054-app-add-virt_viewer_app_make_dialog.patch +++ /dev/null @@ -1,85 +0,0 @@ -From 9411e11af06fbb24a68d2dca7dcb55267606d09d Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= -Date: Thu, 3 Jul 2014 18:41:08 +0200 -Subject: [PATCH] app: add virt_viewer_app_make_dialog() - -Add a function to create an application dialog. In the following -commit, we will add more details for connection failures. - -Resolves: rhbz#1115986 -(cherry picked from commit df28177c679e8ba0a7cf069c5f816167a0a96904) ---- - src/virt-viewer-app.c | 37 +++++++++++++++++++++++++++---------- - 1 file changed, 27 insertions(+), 10 deletions(-) - -diff --git a/src/virt-viewer-app.c b/src/virt-viewer-app.c -index b8b5c9c..0110a9f 100644 ---- a/src/virt-viewer-app.c -+++ b/src/virt-viewer-app.c -@@ -199,20 +199,18 @@ virt_viewer_app_set_debug(gboolean debug) - doDebug = debug; - } - --void --virt_viewer_app_simple_message_dialog(VirtViewerApp *self, -- const char *fmt, ...) -+static GtkWidget* -+virt_viewer_app_make_message_dialog(VirtViewerApp *self, -+ const char *fmt, ...) - { -- g_return_if_fail(VIRT_VIEWER_IS_APP(self)); -+ g_return_val_if_fail(VIRT_VIEWER_IS_APP(self), NULL); - GtkWindow *window = GTK_WINDOW(virt_viewer_window_get_window(self->priv->main_window)); - GtkWidget *dialog; - char *msg; - va_list vargs; - - va_start(vargs, fmt); -- - msg = g_strdup_vprintf(fmt, vargs); -- - va_end(vargs); - - dialog = gtk_message_dialog_new(window, -@@ -223,8 +221,25 @@ virt_viewer_app_simple_message_dialog(VirtViewerApp *self, - "%s", - msg); - -+ g_free(msg); -+ -+ return dialog; -+} -+ -+void -+virt_viewer_app_simple_message_dialog(VirtViewerApp *self, -+ const char *fmt, ...) -+{ -+ GtkWidget *dialog; -+ char *msg; -+ va_list vargs; -+ -+ va_start(vargs, fmt); -+ msg = g_strdup_vprintf(fmt, vargs); -+ va_end(vargs); -+ -+ dialog = virt_viewer_app_make_message_dialog(self, msg); - gtk_dialog_run(GTK_DIALOG(dialog)); -- - gtk_widget_destroy(dialog); - - g_free(msg); -@@ -1392,9 +1407,11 @@ virt_viewer_app_disconnected(VirtViewerSession *session G_GNUC_UNUSED, - gtk_main_quit(); - - if (connect_error) { -- virt_viewer_app_simple_message_dialog(self, -- _("Unable to connect to the graphic server %s"), -- priv->pretty_address); -+ GtkWidget *dialog = virt_viewer_app_make_message_dialog(self, -+ _("Unable to connect to the graphic server %s"), priv->pretty_address); -+ -+ gtk_dialog_run(GTK_DIALOG(dialog)); -+ gtk_widget_destroy(dialog); - } - virt_viewer_app_set_usb_options_sensitive(self, FALSE); - virt_viewer_app_deactivate(self, connect_error); diff --git a/SOURCES/0054-events-remove-unused-virt_viewer_events_find_-handle.patch b/SOURCES/0054-events-remove-unused-virt_viewer_events_find_-handle.patch new file mode 100644 index 0000000..2ce30dd --- /dev/null +++ b/SOURCES/0054-events-remove-unused-virt_viewer_events_find_-handle.patch @@ -0,0 +1,101 @@ +From 98121fa937ed7659fa0960913126b8f2b570444d Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Fabiano=20Fid=C3=AAncio?= +Date: Wed, 22 Jul 2015 03:31:58 +0200 +Subject: [PATCH] events: remove unused + virt_viewer_events_find_{handle,timeout} arg + +Based on commit 1fb34633ef3b318ea678b775d5e47debc98d2184 from +libvirt-glib. +Original author: Christophe Fergeau + +Related to: rhbz#1243228 + +(cherry picked from commit 31fa350266e5c85c4129cf23405844115a3aae26) +--- + src/virt-viewer-events.c | 18 ++++++------------ + 1 file changed, 6 insertions(+), 12 deletions(-) + +diff --git a/src/virt-viewer-events.c b/src/virt-viewer-events.c +index 462ce6c..3d05502 100644 +--- a/src/virt-viewer-events.c ++++ b/src/virt-viewer-events.c +@@ -128,7 +128,7 @@ int virt_viewer_events_add_handle(int fd, + } + + static struct virt_viewer_events_handle * +-virt_viewer_events_find_handle(int watch, guint *idx) ++virt_viewer_events_find_handle(int watch) + { + guint i; + +@@ -141,8 +141,6 @@ virt_viewer_events_find_handle(int watch, guint *idx) + } + + if (h->watch == watch) { +- if (idx != NULL) +- *idx = i; + return h; + } + } +@@ -158,7 +156,7 @@ virt_viewer_events_update_handle(int watch, + + g_mutex_lock(eventlock); + +- data = virt_viewer_events_find_handle(watch, NULL); ++ data = virt_viewer_events_find_handle(watch); + + if (!data) { + g_debug("Update for missing handle watch %d", watch); +@@ -218,11 +216,10 @@ virt_viewer_events_remove_handle(int watch) + { + struct virt_viewer_events_handle *data; + int ret = -1; +- guint idx; + + g_mutex_lock(eventlock); + +- data = virt_viewer_events_find_handle(watch, &idx); ++ data = virt_viewer_events_find_handle(watch); + + if (!data) { + g_debug("Remove of missing watch %d", watch); +@@ -306,7 +303,7 @@ virt_viewer_events_add_timeout(int interval, + + + static struct virt_viewer_events_timeout * +-virt_viewer_events_find_timeout(int timer, guint *idx) ++virt_viewer_events_find_timeout(int timer) + { + guint i; + +@@ -321,8 +318,6 @@ virt_viewer_events_find_timeout(int timer, guint *idx) + } + + if (t->timer == timer) { +- if (idx != NULL) +- *idx = i; + return t; + } + } +@@ -339,7 +334,7 @@ virt_viewer_events_update_timeout(int timer, + + g_mutex_lock(eventlock); + +- data = virt_viewer_events_find_timeout(timer, NULL); ++ data = virt_viewer_events_find_timeout(timer); + if (!data) { + g_debug("Update of missing timer %d", timer); + goto cleanup; +@@ -389,11 +384,10 @@ virt_viewer_events_remove_timeout(int timer) + { + struct virt_viewer_events_timeout *data; + int ret = -1; +- guint idx; + + g_mutex_lock(eventlock); + +- data = virt_viewer_events_find_timeout(timer, &idx); ++ data = virt_viewer_events_find_timeout(timer); + if (!data) { + g_debug("Remove of missing timer %d", timer); + goto cleanup; diff --git a/SOURCES/0055-app-report-disconnection-error-details.patch b/SOURCES/0055-app-report-disconnection-error-details.patch deleted file mode 100644 index 4ccd69a..0000000 --- a/SOURCES/0055-app-report-disconnection-error-details.patch +++ /dev/null @@ -1,126 +0,0 @@ -From 259dff25a78a23ee35dfc9a7ae20ca1013b1f9fa Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= -Date: Thu, 3 Jul 2014 18:42:37 +0200 -Subject: [PATCH] app: report disconnection error details - -It may be useful to provide more detailed reason for disconnection. - -Resolves: rhbz#1115986 -(cherry picked from commit 225dff3cb068d8920d647d1e0a07f3f352bbc8d4) ---- - src/virt-viewer-app.c | 6 ++++-- - src/virt-viewer-session-spice.c | 6 +++--- - src/virt-viewer-session-vnc.c | 2 +- - src/virt-viewer-session.c | 5 +++-- - src/virt-viewer-session.h | 2 +- - 5 files changed, 12 insertions(+), 9 deletions(-) - -diff --git a/src/virt-viewer-app.c b/src/virt-viewer-app.c -index 0110a9f..b05e966 100644 ---- a/src/virt-viewer-app.c -+++ b/src/virt-viewer-app.c -@@ -75,6 +75,7 @@ static void virt_viewer_app_connected(VirtViewerSession *session, - static void virt_viewer_app_initialized(VirtViewerSession *session, - VirtViewerApp *self); - static void virt_viewer_app_disconnected(VirtViewerSession *session, -+ const gchar *msg, - VirtViewerApp *self); - static void virt_viewer_app_auth_refused(VirtViewerSession *session, - const char *msg, -@@ -1394,7 +1395,7 @@ virt_viewer_app_initialized(VirtViewerSession *session G_GNUC_UNUSED, - } - - static void --virt_viewer_app_disconnected(VirtViewerSession *session G_GNUC_UNUSED, -+virt_viewer_app_disconnected(VirtViewerSession *session G_GNUC_UNUSED, const gchar *msg, - VirtViewerApp *self) - { - VirtViewerAppPrivate *priv = self->priv; -@@ -1410,6 +1411,7 @@ virt_viewer_app_disconnected(VirtViewerSession *session G_GNUC_UNUSED, - GtkWidget *dialog = virt_viewer_app_make_message_dialog(self, - _("Unable to connect to the graphic server %s"), priv->pretty_address); - -+ g_object_set(dialog, "secondary-text", msg, NULL); - gtk_dialog_run(GTK_DIALOG(dialog)); - gtk_widget_destroy(dialog); - } -@@ -1422,7 +1424,7 @@ static void virt_viewer_app_cancelled(VirtViewerSession *session, - { - VirtViewerAppPrivate *priv = self->priv; - priv->cancelled = TRUE; -- virt_viewer_app_disconnected(session, self); -+ virt_viewer_app_disconnected(session, NULL, self); - } - - -diff --git a/src/virt-viewer-session-spice.c b/src/virt-viewer-session-spice.c -index 097c9d7..ad3028a 100644 ---- a/src/virt-viewer-session-spice.c -+++ b/src/virt-viewer-session-spice.c -@@ -519,12 +519,12 @@ virt_viewer_session_spice_main_channel_event(SpiceChannel *channel G_GNUC_UNUSED - break; - case SPICE_CHANNEL_ERROR_CONNECT: - g_debug("main channel: failed to connect"); -- g_signal_emit_by_name(session, "session-disconnected"); -+ g_signal_emit_by_name(session, "session-disconnected", NULL); - break; - case SPICE_CHANNEL_ERROR_IO: - case SPICE_CHANNEL_ERROR_LINK: - case SPICE_CHANNEL_ERROR_TLS: -- g_signal_emit_by_name(session, "session-disconnected"); -+ g_signal_emit_by_name(session, "session-disconnected", NULL); - break; - default: - g_warning("unhandled spice main channel event: %d", event); -@@ -815,7 +815,7 @@ virt_viewer_session_spice_channel_destroy(G_GNUC_UNUSED SpiceSession *s, - - self->priv->channel_count--; - if (self->priv->channel_count == 0) -- g_signal_emit_by_name(self, "session-disconnected"); -+ g_signal_emit_by_name(self, "session-disconnected", NULL); - } - - #define UUID_LEN 16 -diff --git a/src/virt-viewer-session-vnc.c b/src/virt-viewer-session-vnc.c -index 545caaa..e4a6c93 100644 ---- a/src/virt-viewer-session-vnc.c -+++ b/src/virt-viewer-session-vnc.c -@@ -115,7 +115,7 @@ virt_viewer_session_vnc_disconnected(VncDisplay *vnc G_GNUC_UNUSED, - virt_viewer_session_clear_displays(VIRT_VIEWER_SESSION(session)); - display = virt_viewer_display_vnc_new(session->priv->vnc); - g_debug("Disconnected"); -- g_signal_emit_by_name(session, "session-disconnected"); -+ g_signal_emit_by_name(session, "session-disconnected", NULL); - virt_viewer_display_set_show_hint(VIRT_VIEWER_DISPLAY(display), - VIRT_VIEWER_DISPLAY_SHOW_HINT_READY, FALSE); - } -diff --git a/src/virt-viewer-session.c b/src/virt-viewer-session.c -index 20d5fb1..9410004 100644 ---- a/src/virt-viewer-session.c -+++ b/src/virt-viewer-session.c -@@ -220,9 +220,10 @@ virt_viewer_session_class_init(VirtViewerSessionClass *class) - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET(VirtViewerSessionClass, session_disconnected), - NULL, NULL, -- g_cclosure_marshal_VOID__VOID, -+ g_cclosure_marshal_VOID__STRING, - G_TYPE_NONE, -- 0); -+ 1, -+ G_TYPE_STRING); - - g_signal_new("session-channel-open", - G_OBJECT_CLASS_TYPE(object_class), -diff --git a/src/virt-viewer-session.h b/src/virt-viewer-session.h -index 388d675..316fdf0 100644 ---- a/src/virt-viewer-session.h -+++ b/src/virt-viewer-session.h -@@ -78,7 +78,7 @@ struct _VirtViewerSessionClass { - /* signals */ - void (*session_connected)(VirtViewerSession *session); - void (*session_initialized)(VirtViewerSession *session); -- void (*session_disconnected)(VirtViewerSession *session); -+ void (*session_disconnected)(VirtViewerSession *session, const gchar *msg); - void (*session_auth_refused)(VirtViewerSession *session, const gchar *msg); - void (*session_auth_failed)(VirtViewerSession *session, const gchar *msg); - void (*session_usb_failed)(VirtViewerSession *session, const gchar *msg); diff --git a/SOURCES/0055-events-protect-handles-and-timeouts-against-concurre.patch b/SOURCES/0055-events-protect-handles-and-timeouts-against-concurre.patch new file mode 100644 index 0000000..4436944 --- /dev/null +++ b/SOURCES/0055-events-protect-handles-and-timeouts-against-concurre.patch @@ -0,0 +1,62 @@ +From 651458d98a05bd438b2e5f7fc9729b058d80c424 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Fabiano=20Fid=C3=AAncio?= +Date: Wed, 22 Jul 2015 03:44:15 +0200 +Subject: [PATCH] events: protect 'handles' and 'timeouts' against concurrent + accesses + +Timeout and watch deletion is done from an idle callback. However, +we cannot assume that all libvirt event calls (the callbacks passed +to virEventRegisterImpl) will be done from the mainloop thread. It's +thus possible that a libvirt event call will run a thread while +one of the idle deletion callbacks runs. +Given that the 'handles' and 'timeouts' arrays are shared among all +threads, we need to make sure we hold the 'eventlock' mutex before +modifying them. + +Based on commit 924178f6b35735458b37d30303fe7bc753dde0b1 from +libvirt-glib. +Original author: Christophe Fergeau + +Related to: rhbz#1243228 + +(cherry picked from commit 3874a3015d721946d843bb4f141d3805b5fa748d) +--- + src/virt-viewer-events.c | 10 ++++++++++ + 1 file changed, 10 insertions(+) + +diff --git a/src/virt-viewer-events.c b/src/virt-viewer-events.c +index 3d05502..65db605 100644 +--- a/src/virt-viewer-events.c ++++ b/src/virt-viewer-events.c +@@ -203,10 +203,15 @@ virt_viewer_events_cleanup_handle(gpointer user_data) + g_debug("Cleanup of handle %p", data); + g_return_val_if_fail(data != NULL, FALSE); + ++ g_mutex_lock(eventlock); ++ + if (data->ff) + (data->ff)(data->opaque); + + g_ptr_array_remove_fast(handles, data); ++ ++ g_mutex_unlock(eventlock); ++ + return FALSE; + } + +@@ -371,10 +376,15 @@ virt_viewer_events_cleanup_timeout(gpointer user_data) + g_debug("Cleanup of timeout %p", data); + g_return_val_if_fail(data != NULL, FALSE); + ++ g_mutex_lock(eventlock); ++ + if (data->ff) + (data->ff)(data->opaque); + + g_ptr_array_remove_fast(timeouts, data); ++ ++ g_mutex_unlock(eventlock); ++ + return FALSE; + } + diff --git a/SOURCES/0056-Don-t-check-for-NULL-when-it-never-can-happen.patch b/SOURCES/0056-Don-t-check-for-NULL-when-it-never-can-happen.patch deleted file mode 100644 index fae0469..0000000 --- a/SOURCES/0056-Don-t-check-for-NULL-when-it-never-can-happen.patch +++ /dev/null @@ -1,24 +0,0 @@ -From 48cec1e3cafbb204b9b07357b58db09277f2b984 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Fabiano=20Fid=C3=AAncio?= -Date: Fri, 25 Jul 2014 00:39:19 +0200 -Subject: [PATCH] Don't check for NULL when it never can happen - -Resolves: rhbz#885108 -(cherry picked from commit dc3db6302e6d6e2411911ae7bc3fd885676fe40d) ---- - src/virt-viewer-util.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/src/virt-viewer-util.c b/src/virt-viewer-util.c -index 464a3d0..6dd048d 100644 ---- a/src/virt-viewer-util.c -+++ b/src/virt-viewer-util.c -@@ -112,7 +112,7 @@ virt_viewer_util_extract_host(const char *uristr, - g_return_val_if_fail(uri != NULL, 1); - - if (host) { -- if (!uri || !uri->server) { -+ if (!uri->server) { - *host = g_strdup("localhost"); - } else { - if (uri->server[0] == '[') { diff --git a/SOURCES/0056-events-don-t-reschedule-deleted-timeouts-watches.patch b/SOURCES/0056-events-don-t-reschedule-deleted-timeouts-watches.patch new file mode 100644 index 0000000..ef214c4 --- /dev/null +++ b/SOURCES/0056-events-don-t-reschedule-deleted-timeouts-watches.patch @@ -0,0 +1,101 @@ +From db963540d203ecffa85e644b089530383b08ab92 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Fabiano=20Fid=C3=AAncio?= +Date: Wed, 22 Jul 2015 03:50:08 +0200 +Subject: [PATCH] events: don't reschedule deleted timeouts/watches + +The deletion of libvirt timeouts/watches is done in 2 steps: +- the first step is synchronous and unregisters the timeout/watch + from glib mainloop +- the second step is asynchronous and triggered from the first step. + It releases the memory used for bookkeeping for the timeout/watch + being deleted + +This is done this way to avoid some possible deadlocks when +reentering the sync callback while freeing the memory associated +with the timeout/watch. + +However, it's possible to call gvir_event_update_handle after +gvir_event_remove_handle but before _event_handle_remove does +the final cleanup. When this happen, _update_handle will reregister +the handle with glib mainloop, and bad things will happen when +a glib callback is triggered for this event after _event_handle_remove +has freed the memory associated with this handle watch. + +This commit marks the timeouts and watches as removed in the +synchronous _remove callback and makes sure removed timeouts/watches +are ignored in _update callbacks. + +Based on commit 3e73e0cee977fb20dd29db3ccfe85b00cc386c43 from +libvirt-glib. +Original author: Christophe Fergeau + +Related to: rhbz#1243228 + +(cherry picked from commit d2c136b020223abbf591915e06dd00fd906764c6) +--- + src/virt-viewer-events.c | 17 ++++++++++++++--- + 1 file changed, 14 insertions(+), 3 deletions(-) + +diff --git a/src/virt-viewer-events.c b/src/virt-viewer-events.c +index 65db605..1655a70 100644 +--- a/src/virt-viewer-events.c ++++ b/src/virt-viewer-events.c +@@ -42,7 +42,7 @@ struct virt_viewer_events_handle + int watch; + int fd; + int events; +- int enabled; ++ int removed; + GIOChannel *channel; + guint source; + virEventHandleCallback cb; +@@ -140,7 +140,7 @@ virt_viewer_events_find_handle(int watch) + continue; + } + +- if (h->watch == watch) { ++ if ((h->watch == watch) && !h->removed) { + return h; + } + } +@@ -240,6 +240,11 @@ virt_viewer_events_remove_handle(int watch) + data->source = 0; + data->events = 0; + ++ /* since the actual watch deletion is done asynchronously, a update_handle call may ++ * reschedule the watch before it's fully deleted, that's why we need to mark it as ++ * 'removed' to prevent reuse ++ */ ++ data->removed = TRUE; + g_idle_add(virt_viewer_events_cleanup_handle, data); + ret = 0; + +@@ -252,6 +257,7 @@ struct virt_viewer_events_timeout + { + int timer; + int interval; ++ int removed; + guint source; + virEventTimeoutCallback cb; + void *opaque; +@@ -322,7 +328,7 @@ virt_viewer_events_find_timeout(int timer) + continue; + } + +- if (t->timer == timer) { ++ if ((t->timer == timer) && !t->removed) { + return t; + } + } +@@ -411,6 +417,11 @@ virt_viewer_events_remove_timeout(int timer) + g_source_remove(data->source); + data->source = 0; + ++ /* since the actual timeout deletion is done asynchronously, a update_timeout call may ++ * reschedule the timeout before it's fully deleted, that's why we need to mark it as ++ * 'removed' to prevent reuse ++ */ ++ data->removed = TRUE; + g_idle_add(virt_viewer_events_cleanup_timeout, data); + ret = 0; + diff --git a/SOURCES/0057-app-report-disconnection-error-details.patch b/SOURCES/0057-app-report-disconnection-error-details.patch deleted file mode 100644 index 7535efa..0000000 --- a/SOURCES/0057-app-report-disconnection-error-details.patch +++ /dev/null @@ -1,32 +0,0 @@ -From 008e5c245c201a645504593132ea75b33af84839 Mon Sep 17 00:00:00 2001 -From: Christophe Fergeau -Date: Thu, 18 Sep 2014 11:45:52 +0200 -Subject: [PATCH] app: report disconnection error details - -This RHEL-only patch backports bits from upstream commit 4c658485, -225dff3c, b6d2744b and d1d53d0c. - -Related: rhbz#1115986 ---- - src/virt-viewer-session-spice.c | 7 +++++-- - 1 file changed, 5 insertions(+), 2 deletions(-) - -diff --git a/src/virt-viewer-session-spice.c b/src/virt-viewer-session-spice.c -index ad3028a..58a1dd7 100644 ---- a/src/virt-viewer-session-spice.c -+++ b/src/virt-viewer-session-spice.c -@@ -518,9 +518,12 @@ virt_viewer_session_spice_main_channel_event(SpiceChannel *channel G_GNUC_UNUSED - } - break; - case SPICE_CHANNEL_ERROR_CONNECT: -- g_debug("main channel: failed to connect"); -- g_signal_emit_by_name(session, "session-disconnected", NULL); -+ { -+ const GError *error = spice_channel_get_error(channel); -+ g_debug("main channel: failed to connect %s", error ? error->message : NULL); -+ g_signal_emit_by_name(session, "session-disconnected", error ? error->message : NULL); - break; -+ } - case SPICE_CHANNEL_ERROR_IO: - case SPICE_CHANNEL_ERROR_LINK: - case SPICE_CHANNEL_ERROR_TLS: diff --git a/SOURCES/0057-events-don-t-hold-events-lock-when-dispatching-free-.patch b/SOURCES/0057-events-don-t-hold-events-lock-when-dispatching-free-.patch new file mode 100644 index 0000000..e8e941b --- /dev/null +++ b/SOURCES/0057-events-don-t-hold-events-lock-when-dispatching-free-.patch @@ -0,0 +1,57 @@ +From 78629d47e21847478918e4e9e9a2b16ea2adbaf5 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Fabiano=20Fid=C3=AAncio?= +Date: Wed, 22 Jul 2015 03:53:41 +0200 +Subject: [PATCH] events: don't hold events lock when dispatching free + callbacks + +The _event_timeout_remove and _event_handle_remove methods +were holding onto the global lock when invoking the free +callback. This is a violation of the libvirt events API +contract which requires free callbacks to be invoked in +a re-entrant safe context. + +Based on commit dd17c3cc587c73a8c915238f9d9a3e200e89c93f from +libvirt-glib. +Original author: Daniel P. Berrange + +Related to: rhbz#1243228 + +(cherry picked from commit 0e0f021dec03bc7a8ef776c258b886d616e65eb2) +--- + src/virt-viewer-events.c | 8 ++------ + 1 file changed, 2 insertions(+), 6 deletions(-) + +diff --git a/src/virt-viewer-events.c b/src/virt-viewer-events.c +index 1655a70..f68791f 100644 +--- a/src/virt-viewer-events.c ++++ b/src/virt-viewer-events.c +@@ -203,13 +203,11 @@ virt_viewer_events_cleanup_handle(gpointer user_data) + g_debug("Cleanup of handle %p", data); + g_return_val_if_fail(data != NULL, FALSE); + +- g_mutex_lock(eventlock); +- + if (data->ff) + (data->ff)(data->opaque); + ++ g_mutex_lock(eventlock); + g_ptr_array_remove_fast(handles, data); +- + g_mutex_unlock(eventlock); + + return FALSE; +@@ -382,13 +380,11 @@ virt_viewer_events_cleanup_timeout(gpointer user_data) + g_debug("Cleanup of timeout %p", data); + g_return_val_if_fail(data != NULL, FALSE); + +- g_mutex_lock(eventlock); +- + if (data->ff) + (data->ff)(data->opaque); + ++ g_mutex_lock(eventlock); + g_ptr_array_remove_fast(timeouts, data); +- + g_mutex_unlock(eventlock); + + return FALSE; diff --git a/SOURCES/0058-Add-support-to-use-numpad-accelarators-for-zoom-in.o.patch b/SOURCES/0058-Add-support-to-use-numpad-accelarators-for-zoom-in.o.patch deleted file mode 100644 index 1264792..0000000 --- a/SOURCES/0058-Add-support-to-use-numpad-accelarators-for-zoom-in.o.patch +++ /dev/null @@ -1,121 +0,0 @@ -From 37bd26f92d220a26cba68055d66d44cbeedbb875 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Fabiano=20Fid=C3=AAncio?= -Date: Thu, 18 Sep 2014 12:21:11 +0200 -Subject: [PATCH] Add support to use numpad accelarators for - zoom-{in.out,reset} - -As virt-viewer uses GtkAccelMap for shortcuts and that GTK only can have -one key binding per accelerator (in accel_map_add_entry), let's also add -support specificly for the numpad keys in the virt-viewer code - -https://bugzilla.redhat.com/show_bug.cgi?id=883433 -(cherry picked from commit 3a168815b738076526ba0f3e9a82e6fb1db482e9) ---- - src/virt-gtk-compat.h | 3 +++ - src/virt-viewer-app.c | 6 ++++++ - src/virt-viewer.xml | 36 ++++++++++++++++++++++++++++++++++++ - 3 files changed, 45 insertions(+) - -diff --git a/src/virt-gtk-compat.h b/src/virt-gtk-compat.h -index 110c17a..aca38b1 100644 ---- a/src/virt-gtk-compat.h -+++ b/src/virt-gtk-compat.h -@@ -57,6 +57,9 @@ G_BEGIN_DECLS - #define GDK_0 GDK_KEY_0 - #define GDK_plus GDK_KEY_plus - #define GDK_minus GDK_KEY_minus -+#define GDK_KP_Add GDK_KEY_KP_Add -+#define GDK_KP_Subtract GDK_KEY_KP_Subtract -+#define GDK_KP_0 GDK_KEY_KP_0 - #endif - - #if !GTK_CHECK_VERSION(3, 0, 0) -diff --git a/src/virt-viewer-app.c b/src/virt-viewer-app.c -index b05e966..2fb430f 100644 ---- a/src/virt-viewer-app.c -+++ b/src/virt-viewer-app.c -@@ -1778,8 +1778,11 @@ virt_viewer_app_constructor (GType gtype, - gtk_accel_map_add_entry("/view/toggle-fullscreen", GDK_F11, 0); - gtk_accel_map_add_entry("/view/release-cursor", GDK_F12, GDK_SHIFT_MASK); - gtk_accel_map_add_entry("/view/zoom-reset", GDK_0, GDK_CONTROL_MASK); -+ gtk_accel_map_add_entry("/view/kp-zoom-reset", GDK_KP_0, GDK_CONTROL_MASK); - gtk_accel_map_add_entry("/view/zoom-out", GDK_minus, GDK_CONTROL_MASK); -+ gtk_accel_map_add_entry("/view/kp-zoom-out", GDK_KP_Subtract, GDK_CONTROL_MASK); - gtk_accel_map_add_entry("/view/zoom-in", GDK_plus, GDK_CONTROL_MASK); -+ gtk_accel_map_add_entry("/view/kp-zoom-in", GDK_KP_Add, GDK_CONTROL_MASK); - gtk_accel_map_add_entry("/send/secure-attention", GDK_End, GDK_CONTROL_MASK | GDK_MOD1_MASK); - - virt_viewer_app_set_fullscreen(self, opt_fullscreen); -@@ -1973,8 +1976,11 @@ virt_viewer_app_clear_hotkeys(VirtViewerApp *self) - gtk_accel_map_change_entry("/view/toggle-fullscreen", 0, 0, TRUE); - gtk_accel_map_change_entry("/view/release-cursor", 0, 0, TRUE); - gtk_accel_map_change_entry("/view/zoom-reset", 0, 0, TRUE); -+ gtk_accel_map_change_entry("/view/kp-zoom-reset", 0, 0, TRUE); - gtk_accel_map_change_entry("/view/zoom-in", 0, 0, TRUE); -+ gtk_accel_map_change_entry("/view/kp-zoom-in", 0, 0, TRUE); - gtk_accel_map_change_entry("/view/zoom-out", 0, 0, TRUE); -+ gtk_accel_map_change_entry("/view/kp-zoom-out", 0, 0, TRUE); - gtk_accel_map_change_entry("/send/secure-attention", 0, 0, TRUE); - virt_viewer_set_insert_smartcard_accel(self, 0, 0); - virt_viewer_set_remove_smartcard_accel(self, 0, 0); -diff --git a/src/virt-viewer.xml b/src/virt-viewer.xml -index d489653..760550e 100644 ---- a/src/virt-viewer.xml -+++ b/src/virt-viewer.xml -@@ -138,6 +138,18 @@ - - - -+ -+ <virt-viewer>/view/kp-zoom-in -+ gtk-zoom-in -+ True -+ False -+ False -+ True -+ True -+ -+ -+ -+ - - <virt-viewer>/view/zoom-out - gtk-zoom-out -@@ -150,6 +162,18 @@ - - - -+ -+ <virt-viewer>/view/kp-zoom-out -+ gtk-zoom-out -+ True -+ False -+ False -+ True -+ True -+ -+ -+ -+ - - True - False -@@ -167,6 +191,18 @@ - - - -+ -+ -+ <virt-viewer>/view/kp-zoom-reset -+ gtk-zoom-100 -+ True -+ False -+ False -+ True -+ True -+ -+ -+ - - - diff --git a/SOURCES/0058-events-don-t-create-glib-IO-watch-for-disabled-handl.patch b/SOURCES/0058-events-don-t-create-glib-IO-watch-for-disabled-handl.patch new file mode 100644 index 0000000..0e2f2cb --- /dev/null +++ b/SOURCES/0058-events-don-t-create-glib-IO-watch-for-disabled-handl.patch @@ -0,0 +1,51 @@ +From d40fc60dca8688f6e5ac5137f4e011e696d85cb3 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Fabiano=20Fid=C3=AAncio?= +Date: Wed, 22 Jul 2015 03:57:18 +0200 +Subject: [PATCH] events: don't create glib IO watch for disabled handles + +It's possible to create a handle to watch for file events which do not +watch for any file event. Such a handle can be enabled later with +virt_viewer_events_update_handle() by setting some conditions to watch for. + +When a handle is disabled after it has been created, +virt_viewer_events_update_handle() makes sure it removes the corresponding +virt_viewer_events_handle::source IO watch if any was set. +virt_viewer_events_add_handle() will always create a +virt_viewer_events_handle::source IO watch even if the handle is not +watching for any events. + +This commit makes consistent by only creating a watch with g_io_add_watch() +when the caller asked to watch for some events. + +Based on commit d71c143936a35cd6c3f23ae0cbf7f3215d944051 from +libvirt-glib. +Original author: Christophe Fergeau + +Related to: rhbz#1243228 + +(cherry picked from commit 3281c47e8b03cd0072c5ac18e97f1a36d08ec485) +--- + src/virt-viewer-events.c | 10 ++++++---- + 1 file changed, 6 insertions(+), 4 deletions(-) + +diff --git a/src/virt-viewer-events.c b/src/virt-viewer-events.c +index f68791f..fe3aaa6 100644 +--- a/src/virt-viewer-events.c ++++ b/src/virt-viewer-events.c +@@ -113,10 +113,12 @@ int virt_viewer_events_add_handle(int fd, + + g_debug("Add handle %d %d %p", data->fd, events, data->opaque); + +- data->source = g_io_add_watch(data->channel, +- cond, +- virt_viewer_events_dispatch_handle, +- data); ++ if (events != 0) { ++ data->source = g_io_add_watch(data->channel, ++ cond, ++ virt_viewer_events_dispatch_handle, ++ data); ++ } + + g_ptr_array_add(handles, data); + diff --git a/SOURCES/0059-Do-not-show-duplicated-menu-items.patch b/SOURCES/0059-Do-not-show-duplicated-menu-items.patch deleted file mode 100644 index 330f60e..0000000 --- a/SOURCES/0059-Do-not-show-duplicated-menu-items.patch +++ /dev/null @@ -1,46 +0,0 @@ -From c6f69143bb5a6c95f812f9d71d7a78f6b2c2eaeb Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Fabiano=20Fid=C3=AAncio?= -Date: Thu, 18 Sep 2014 12:21:12 +0200 -Subject: [PATCH] Do not show duplicated menu items - -When the support to use numpad accelerators for zoom-{in,out,reset} -was added (3a168815), by mistake, we have added duplicated buttons -in View -> Zoom. - -https://bugzilla.redhat.com/show_bug.cgi?id=883433 -(cherry picked from commit 55cdb9867df05f1c4f6c8e569a6f0c1e0bc28d99) ---- - src/virt-viewer.xml | 6 +++--- - 1 file changed, 3 insertions(+), 3 deletions(-) - -diff --git a/src/virt-viewer.xml b/src/virt-viewer.xml -index 760550e..6f2eebb 100644 ---- a/src/virt-viewer.xml -+++ b/src/virt-viewer.xml -@@ -141,7 +141,7 @@ - - <virt-viewer>/view/kp-zoom-in - gtk-zoom-in -- True -+ False - False - False - True -@@ -165,7 +165,7 @@ - - <virt-viewer>/view/kp-zoom-out - gtk-zoom-out -- True -+ False - False - False - True -@@ -195,7 +195,7 @@ - - <virt-viewer>/view/kp-zoom-reset - gtk-zoom-100 -- True -+ False - False - False - True diff --git a/SOURCES/0059-events-allow-to-remove-disabled-timers-and-handles.patch b/SOURCES/0059-events-allow-to-remove-disabled-timers-and-handles.patch new file mode 100644 index 0000000..fc4200e --- /dev/null +++ b/SOURCES/0059-events-allow-to-remove-disabled-timers-and-handles.patch @@ -0,0 +1,58 @@ +From 7f6fb2959c3c26533053ac829e6e396b25aef393 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Fabiano=20Fid=C3=AAncio?= +Date: Wed, 22 Jul 2015 04:05:45 +0200 +Subject: [PATCH] events: allow to remove disabled timers and handles + +Trying to remove a disabled timer or handle will cause +virt_viewer_events_remove_{handle,timeout}() to return an error +rather than removing it. + +Based on commit 79699d73e6e1b7218e3bd8349d176752f86128b9 from +libvirt-glib. +Original author: Christophe Fergeau + +Related to: rhbz#1243228 + +(cherry picked from commit 4ec75ee70cbe7560ffb83e4e84ffb4f925a41390) +--- + src/virt-viewer-events.c | 20 +++++++++----------- + 1 file changed, 9 insertions(+), 11 deletions(-) + +diff --git a/src/virt-viewer-events.c b/src/virt-viewer-events.c +index fe3aaa6..44740c3 100644 +--- a/src/virt-viewer-events.c ++++ b/src/virt-viewer-events.c +@@ -233,12 +233,11 @@ virt_viewer_events_remove_handle(int watch) + + g_debug("Remove handle %d %d", watch, data->fd); + +- if (!data->source) +- goto cleanup; +- +- g_source_remove(data->source); +- data->source = 0; +- data->events = 0; ++ if (data->source != 0) { ++ g_source_remove(data->source); ++ data->source = 0; ++ data->events = 0; ++ } + + /* since the actual watch deletion is done asynchronously, a update_handle call may + * reschedule the watch before it's fully deleted, that's why we need to mark it as +@@ -409,11 +408,10 @@ virt_viewer_events_remove_timeout(int timer) + + g_debug("Remove timeout %p %d", data, timer); + +- if (!data->source) +- goto cleanup; +- +- g_source_remove(data->source); +- data->source = 0; ++ if (data->source != 0) { ++ g_source_remove(data->source); ++ data->source = 0; ++ } + + /* since the actual timeout deletion is done asynchronously, a update_timeout call may + * reschedule the timeout before it's fully deleted, that's why we need to mark it as diff --git a/SOURCES/0060-Revert-changes-related-to-numpad-accelerators.patch b/SOURCES/0060-Revert-changes-related-to-numpad-accelerators.patch deleted file mode 100644 index ee90b9e..0000000 --- a/SOURCES/0060-Revert-changes-related-to-numpad-accelerators.patch +++ /dev/null @@ -1,133 +0,0 @@ -From 044d1d0cdc67ae6d131baf8c26fc6a903cf41f2a Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Fabiano=20Fid=C3=AAncio?= -Date: Tue, 23 Sep 2014 01:32:16 +0200 -Subject: [PATCH] Revert changes related to numpad accelerators - -Due to a GTK+ limitation and bad testing from my side, I've pushed -two patches trying to add support to use Ctrl + {+, -, 0} from numpad -to control zoom-in, zoom-out and zoom-reset. -Unfortunately, with the first patch (3a168815) I've duplicated the menu -items related to the zoom functions. With the second one (55cdb986), -provided to not show the duplicated menu items, we came back to the -initial state, where the numpad accelerators don't work. - -So, in resume, multiple accelerators in a GTK+ widget are only supported -on applications using GApplication, what is not our case and won't be -till we drop the GTK+2 support. - -Revert "Do not show duplicated menu items" and -Revert "Add support to use numpad accelarators for zoom-{in.out,reset}" - -This reverts commits 55cdb9867df05f1c4f6c8e569a6f0c1e0bc28d99 and -3a168815b738076526ba0f3e9a82e6fb1db482e9. - -(cherry picked from commit e86e8853807f9026c62ef36f56e03d8eda7ce4e1) ---- - src/virt-gtk-compat.h | 3 --- - src/virt-viewer-app.c | 6 ------ - src/virt-viewer.xml | 36 ------------------------------------ - 3 files changed, 45 deletions(-) - -diff --git a/src/virt-gtk-compat.h b/src/virt-gtk-compat.h -index aca38b1..110c17a 100644 ---- a/src/virt-gtk-compat.h -+++ b/src/virt-gtk-compat.h -@@ -57,9 +57,6 @@ G_BEGIN_DECLS - #define GDK_0 GDK_KEY_0 - #define GDK_plus GDK_KEY_plus - #define GDK_minus GDK_KEY_minus --#define GDK_KP_Add GDK_KEY_KP_Add --#define GDK_KP_Subtract GDK_KEY_KP_Subtract --#define GDK_KP_0 GDK_KEY_KP_0 - #endif - - #if !GTK_CHECK_VERSION(3, 0, 0) -diff --git a/src/virt-viewer-app.c b/src/virt-viewer-app.c -index 2fb430f..b05e966 100644 ---- a/src/virt-viewer-app.c -+++ b/src/virt-viewer-app.c -@@ -1778,11 +1778,8 @@ virt_viewer_app_constructor (GType gtype, - gtk_accel_map_add_entry("/view/toggle-fullscreen", GDK_F11, 0); - gtk_accel_map_add_entry("/view/release-cursor", GDK_F12, GDK_SHIFT_MASK); - gtk_accel_map_add_entry("/view/zoom-reset", GDK_0, GDK_CONTROL_MASK); -- gtk_accel_map_add_entry("/view/kp-zoom-reset", GDK_KP_0, GDK_CONTROL_MASK); - gtk_accel_map_add_entry("/view/zoom-out", GDK_minus, GDK_CONTROL_MASK); -- gtk_accel_map_add_entry("/view/kp-zoom-out", GDK_KP_Subtract, GDK_CONTROL_MASK); - gtk_accel_map_add_entry("/view/zoom-in", GDK_plus, GDK_CONTROL_MASK); -- gtk_accel_map_add_entry("/view/kp-zoom-in", GDK_KP_Add, GDK_CONTROL_MASK); - gtk_accel_map_add_entry("/send/secure-attention", GDK_End, GDK_CONTROL_MASK | GDK_MOD1_MASK); - - virt_viewer_app_set_fullscreen(self, opt_fullscreen); -@@ -1976,11 +1973,8 @@ virt_viewer_app_clear_hotkeys(VirtViewerApp *self) - gtk_accel_map_change_entry("/view/toggle-fullscreen", 0, 0, TRUE); - gtk_accel_map_change_entry("/view/release-cursor", 0, 0, TRUE); - gtk_accel_map_change_entry("/view/zoom-reset", 0, 0, TRUE); -- gtk_accel_map_change_entry("/view/kp-zoom-reset", 0, 0, TRUE); - gtk_accel_map_change_entry("/view/zoom-in", 0, 0, TRUE); -- gtk_accel_map_change_entry("/view/kp-zoom-in", 0, 0, TRUE); - gtk_accel_map_change_entry("/view/zoom-out", 0, 0, TRUE); -- gtk_accel_map_change_entry("/view/kp-zoom-out", 0, 0, TRUE); - gtk_accel_map_change_entry("/send/secure-attention", 0, 0, TRUE); - virt_viewer_set_insert_smartcard_accel(self, 0, 0); - virt_viewer_set_remove_smartcard_accel(self, 0, 0); -diff --git a/src/virt-viewer.xml b/src/virt-viewer.xml -index 6f2eebb..d489653 100644 ---- a/src/virt-viewer.xml -+++ b/src/virt-viewer.xml -@@ -138,18 +138,6 @@ - - - -- -- <virt-viewer>/view/kp-zoom-in -- gtk-zoom-in -- False -- False -- False -- True -- True -- -- -- -- - - <virt-viewer>/view/zoom-out - gtk-zoom-out -@@ -162,18 +150,6 @@ - - - -- -- <virt-viewer>/view/kp-zoom-out -- gtk-zoom-out -- False -- False -- False -- True -- True -- -- -- -- - - True - False -@@ -191,18 +167,6 @@ - - - -- -- -- <virt-viewer>/view/kp-zoom-reset -- gtk-zoom-100 -- False -- False -- False -- True -- True -- -- -- - - - diff --git a/SOURCES/0060-events-don-t-leak-GIOChannel-when-destroying-IO-hand.patch b/SOURCES/0060-events-don-t-leak-GIOChannel-when-destroying-IO-hand.patch new file mode 100644 index 0000000..e9826fe --- /dev/null +++ b/SOURCES/0060-events-don-t-leak-GIOChannel-when-destroying-IO-hand.patch @@ -0,0 +1,37 @@ +From a368207a44ab132ff2f1ca8cc0703fe31d05fd3f Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Fabiano=20Fid=C3=AAncio?= +Date: Wed, 22 Jul 2015 04:09:32 +0200 +Subject: [PATCH] events: don't leak GIOChannel when destroying IO handle + +virt_viewer_events_add_handle() creates a GIOChannel in order to watch the +fd it was given for changes. +virt_viewer_events_remove_handle() is freeing all the resources allocated by +virt_viewer_events_add_handle() except for this GIOChannel. This commit adds +the needed g_io_channel_unref() call to virt_viewer_events_remove_handle() + +Based on commit 8e95b8d25a3eee6316aff2f83b0c449aaf10984a from +libvirt-glib. +Original author: Christophe Fergeau + +Related to: rhbz#1243228 + +(cherry picked from commit b225ef5884214763ae5650202ebbc914ba77f224) +--- + src/virt-viewer-events.c | 4 ++++ + 1 file changed, 4 insertions(+) + +diff --git a/src/virt-viewer-events.c b/src/virt-viewer-events.c +index 44740c3..9636e3e 100644 +--- a/src/virt-viewer-events.c ++++ b/src/virt-viewer-events.c +@@ -239,6 +239,10 @@ virt_viewer_events_remove_handle(int watch) + data->events = 0; + } + ++ g_warn_if_fail(data->channel != NULL); ++ g_io_channel_unref(data->channel); ++ data->channel = NULL; ++ + /* since the actual watch deletion is done asynchronously, a update_handle call may + * reschedule the watch before it's fully deleted, that's why we need to mark it as + * 'removed' to prevent reuse diff --git a/SOURCES/0061-Add-documentation-for-fullscreen-monitor-mapping.patch b/SOURCES/0061-Add-documentation-for-fullscreen-monitor-mapping.patch deleted file mode 100644 index 5a26aa2..0000000 --- a/SOURCES/0061-Add-documentation-for-fullscreen-monitor-mapping.patch +++ /dev/null @@ -1,140 +0,0 @@ -From 99f69ebf08dd972de655459e8c008c82f5231663 Mon Sep 17 00:00:00 2001 -From: Jonathon Jongsma -Date: Thu, 25 Sep 2014 17:26:33 -0500 -Subject: [PATCH] Add documentation for fullscreen monitor mapping - -see https://bugzilla.redhat.com/show_bug.cgi?id=1142769 - -(cherry picked from commit 882a59596d24770bcefc6fb641c634dd0a2245f1) ---- - man/remote-viewer.pod | 43 ++++++++++++++++++++++++++++++++++++------- - man/virt-viewer.pod | 34 ++++++++++++++++++++++++++++++++++ - 2 files changed, 70 insertions(+), 7 deletions(-) - -diff --git a/man/remote-viewer.pod b/man/remote-viewer.pod -index 2c84432..1683e44 100644 ---- a/man/remote-viewer.pod -+++ b/man/remote-viewer.pod -@@ -15,8 +15,8 @@ protocols are SPICE and VNC. - Starting remote-viewer without URI will open a simple dialog with an - entry and a list of previously successfully accessed URI. - --The URI can also point to a connection settings file, see FILE section --for a description of the format. -+The URI can also point to a connection settings file, see the CONNECTION FILE -+section for a description of the format. - - =head1 OPTIONS - -@@ -44,10 +44,12 @@ Zoom level of the display window in percentage. Range 10-400. - - Start with the windows maximized to fullscreen. - --If supported, the remote display will be reconfigured to match at best the --client physical monitor configuration on initialization, by enabling or --disabling extra monitors as necessary. This is currently implemented by the --Spice backend only. -+If supported, the remote display will be reconfigured to match the physical -+client monitor configuration, by enabling or disabling extra monitors as -+necessary. This is currently implemented by the Spice backend only. -+ -+To specify which client monitors are used in fullscreen mode, see the -+CONFIGURATION section below. - - =item -t TITLE, --title TITLE - -@@ -113,7 +115,7 @@ the associated action. - It must be composed of modifiers (shift, ctrl or alt) and a - non-modifier key. For example, "shift+f11". - --=head1 FILE -+=head1 CONNECTION FILE - - B connection file is of INI file format, with a - mandatory [virt-viewer] group and "type" key. -@@ -267,6 +269,33 @@ port 8080, use the value "http://foobar:8080". - - =back - -+=head1 CONFIGURATION -+ -+A small number of configuration options can be controlled by editing the -+settings file located in the user configuration directory: -+ -+ /virt-viewer/settings -+ -+This file is a text file in INI format, with application options in the -+[virt-viewer] group and per-guest options in a group identified by the guest's -+UUID. The application options should not be edited manually. There is also a -+special [fallback] group which specifies options for all guests that don't have -+an explicit group. -+ -+For each guest, the initial fullscreen monitor configuration can be specified -+by using the B key. This configuration only takes effect when -+the -f/--full-screen option is specified. -+ -+The value of this key is a list of mappings between a guest display and a -+client monitor. Each mapping is separated by a semicolon character, and the -+mappings have the format :. -+ -+For example, to map guest displays 1 and 2 to client monitors 2 and 3 for the -+guest with a UUID of e4591275-d9d3-4a44-a18b-ef2fbc8ac3e2, use: -+ -+ [e4591275-d9d3-4a44-a18b-ef2fbc8ac3e2] -+ monitor-mapping=1:2;2:3 -+ - =head1 EXAMPLES - - To connect to SPICE server on host "makai" with port 5900 -diff --git a/man/virt-viewer.pod b/man/virt-viewer.pod -index ac9b268..e976c69 100644 ---- a/man/virt-viewer.pod -+++ b/man/virt-viewer.pod -@@ -71,6 +71,13 @@ socket connection. - - Start with the window maximised to fullscreen - -+If supported, the remote display will be reconfigured to match the physical -+client monitor configuration, by enabling or disabling extra monitors as -+necessary. This is currently implemented by the Spice backend only. -+ -+To specify which client monitors are used in fullscreen mode, see the -+CONFIGURATION section below. -+ - =item --debug - - Print debugging information -@@ -117,6 +124,33 @@ option, and will attempt to do a reconnection before it quits. - - =back - -+=head1 CONFIGURATION -+ -+A small number of configuration options can be controlled by editing the -+settings file located in the user configuration directory: -+ -+ /virt-viewer/settings -+ -+This file is a text file in INI format, with application options in the -+[virt-viewer] group and per-guest options in a group identified by the guest's -+UUID. The application options should not be edited manually. There is also a -+special [fallback] group which specifies options for all guests that don't have -+an explicit group. -+ -+For each guest, the initial fullscreen monitor configuration can be specified -+by using the B key. This configuration only takes effect when -+the -f/--full-screen option is specified. -+ -+The value of this key is a list of mappings between a guest display and a -+client monitor. Each mapping is separated by a semicolon character, and the -+mappings have the format :. -+ -+For example, to map guest displays 1 and 2 to client monitors 2 and 3 for the -+guest with a UUID of e4591275-d9d3-4a44-a18b-ef2fbc8ac3e2, use: -+ -+ [e4591275-d9d3-4a44-a18b-ef2fbc8ac3e2] -+ monitor-mapping=1:2;2:3 -+ - =head1 EXAMPLES - - To connect to the guest called 'demo' running under Xen diff --git a/SOURCES/0061-Exit-normally-when-canceling-dialog.patch b/SOURCES/0061-Exit-normally-when-canceling-dialog.patch new file mode 100644 index 0000000..a70dd76 --- /dev/null +++ b/SOURCES/0061-Exit-normally-when-canceling-dialog.patch @@ -0,0 +1,344 @@ +From e000297fc9329a03a455c3a984cef20843cc5844 Mon Sep 17 00:00:00 2001 +From: Pavel Grunt +Date: Wed, 18 Mar 2015 17:49:38 +0100 +Subject: [PATCH] Exit normally when canceling dialog + +This applies for: + libvirt authentication dialog (e.g. virt-viewer --attach guest) + 'recent connection' dialog (e.g. remote-viewer) + 'vm choose' dialog when connecting without specifying the vm name + +This is done by using a new GError VIRT_VIEWER_ERROR_CANCELLED. + +(cherry picked from commit 1bcd8d0fe6df553f087d11b539a59e128a2a350b) +--- + src/remote-viewer-main.c | 6 +++++- + src/remote-viewer.c | 23 ++++++++++++-------- + src/virt-viewer-app.c | 6 +++--- + src/virt-viewer-app.h | 4 ++-- + src/virt-viewer-main.c | 6 +++++- + src/virt-viewer-util.h | 1 + + src/virt-viewer-vm-connection.c | 4 ++++ + src/virt-viewer.c | 48 ++++++++++++++++++++++++----------------- + 8 files changed, 62 insertions(+), 36 deletions(-) + +diff --git a/src/remote-viewer-main.c b/src/remote-viewer-main.c +index c5073d8..b689033 100644 +--- a/src/remote-viewer-main.c ++++ b/src/remote-viewer-main.c +@@ -178,8 +178,12 @@ main(int argc, char **argv) + + app = VIRT_VIEWER_APP(viewer); + +- if (!virt_viewer_app_start(app)) ++ if (!virt_viewer_app_start(app, &error)) { ++ if (g_error_matches(error, VIRT_VIEWER_ERROR, VIRT_VIEWER_ERROR_CANCELLED)) ++ ret = 0; ++ g_clear_error(&error); + goto cleanup; ++ } + + g_signal_connect(virt_viewer_app_get_session(app), "session-connected", + G_CALLBACK(connected), app); +diff --git a/src/remote-viewer.c b/src/remote-viewer.c +index 0912f55..b571c0b 100644 +--- a/src/remote-viewer.c ++++ b/src/remote-viewer.c +@@ -82,7 +82,7 @@ static OvirtVm * choose_vm(GtkWindow *main_window, + GError **error); + #endif + +-static gboolean remote_viewer_start(VirtViewerApp *self); ++static gboolean remote_viewer_start(VirtViewerApp *self, GError **error); + #ifdef HAVE_SPICE_GTK + static gboolean remote_viewer_activate(VirtViewerApp *self, GError **error); + static void remote_viewer_window_added(VirtViewerApp *self, VirtViewerWindow *win); +@@ -177,7 +177,7 @@ remote_viewer_deactivated(VirtViewerApp *app, gboolean connect_error) + RemoteViewerPrivate *priv = self->priv; + + if (connect_error && priv->open_recent_dialog) { +- if (virt_viewer_app_start(app)) { ++ if (virt_viewer_app_start(app, NULL)) { + return; + } + } +@@ -1188,7 +1188,7 @@ choose_vm(GtkWindow *main_window, + #endif + + static gboolean +-remote_viewer_start(VirtViewerApp *app) ++remote_viewer_start(VirtViewerApp *app, GError **err) + { + g_return_val_if_fail(REMOTE_VIEWER_IS(app), FALSE); + +@@ -1227,8 +1227,13 @@ remote_viewer_start(VirtViewerApp *app) + retry_dialog: + main_window = virt_viewer_app_get_main_window(app); + if (priv->open_recent_dialog) { +- if (connect_dialog(virt_viewer_window_get_window(main_window), &guri) != 0) ++ if (connect_dialog(virt_viewer_window_get_window(main_window), &guri) != 0) { ++ g_set_error_literal(&error, ++ VIRT_VIEWER_ERROR, VIRT_VIEWER_ERROR_CANCELLED, ++ _("No connection was chosen")); ++ g_propagate_error(err, error); + return FALSE; ++ } + g_object_set(app, "guri", guri, NULL); + } else + g_object_get(app, "guri", &guri, NULL); +@@ -1245,7 +1250,6 @@ retry_dialog: + if (error) { + virt_viewer_app_simple_message_dialog(app, _("Invalid file %s"), guri); + g_warning("%s", error->message); +- g_clear_error(&error); + goto cleanup; + } + g_object_get(G_OBJECT(vvfile), "type", &type, NULL); +@@ -1256,12 +1260,11 @@ retry_dialog: + #ifdef HAVE_OVIRT + if (g_strcmp0(type, "ovirt") == 0) { + if (!create_ovirt_session(app, guri, &error)) { +- if (error) { ++ if (error && !g_error_matches(error, VIRT_VIEWER_ERROR, VIRT_VIEWER_ERROR_CANCELLED)) { + virt_viewer_app_simple_message_dialog(app, + _("Couldn't open oVirt session: %s"), + error->message); + } +- g_clear_error(&error); + goto cleanup; + } + } else +@@ -1287,14 +1290,13 @@ retry_dialog: + _("Failed to initiate connection"); + + virt_viewer_app_simple_message_dialog(app, msg); +- g_clear_error(&error); + goto cleanup; + } + #ifdef HAVE_SPICE_GTK + } + #endif + +- ret = VIRT_VIEWER_APP_CLASS(remote_viewer_parent_class)->start(app); ++ ret = VIRT_VIEWER_APP_CLASS(remote_viewer_parent_class)->start(app, &error); + + cleanup: + g_clear_object(&file); +@@ -1305,8 +1307,11 @@ cleanup: + type = NULL; + + if (!ret && priv->open_recent_dialog) { ++ g_clear_error(&error); + goto retry_dialog; + } ++ if (error != NULL) ++ g_propagate_error(err, error); + + return ret; + } +diff --git a/src/virt-viewer-app.c b/src/virt-viewer-app.c +index 972e4ec..297c6f6 100644 +--- a/src/virt-viewer-app.c ++++ b/src/virt-viewer-app.c +@@ -1697,13 +1697,13 @@ virt_viewer_app_dispose (GObject *object) + } + + static gboolean +-virt_viewer_app_default_start(VirtViewerApp *self) ++virt_viewer_app_default_start(VirtViewerApp *self, GError **error G_GNUC_UNUSED) + { + virt_viewer_window_show(self->priv->main_window); + return TRUE; + } + +-gboolean virt_viewer_app_start(VirtViewerApp *self) ++gboolean virt_viewer_app_start(VirtViewerApp *self, GError **error) + { + VirtViewerAppClass *klass; + +@@ -1712,7 +1712,7 @@ gboolean virt_viewer_app_start(VirtViewerApp *self) + + g_return_val_if_fail(!self->priv->started, TRUE); + +- self->priv->started = klass->start(self); ++ self->priv->started = klass->start(self, error); + return self->priv->started; + } + +diff --git a/src/virt-viewer-app.h b/src/virt-viewer-app.h +index a9bf16c..517a22d 100644 +--- a/src/virt-viewer-app.h ++++ b/src/virt-viewer-app.h +@@ -51,7 +51,7 @@ typedef struct { + void (*window_removed) (VirtViewerApp *self, VirtViewerWindow *window); + + /*< private >*/ +- gboolean (*start) (VirtViewerApp *self); ++ gboolean (*start) (VirtViewerApp *self, GError **error); + gboolean (*initial_connect) (VirtViewerApp *self, GError **error); + gboolean (*activate) (VirtViewerApp *self, GError **error); + void (*deactivated) (VirtViewerApp *self, gboolean connect_error); +@@ -61,7 +61,7 @@ typedef struct { + GType virt_viewer_app_get_type (void); + + void virt_viewer_app_set_debug(gboolean debug); +-gboolean virt_viewer_app_start(VirtViewerApp *app); ++gboolean virt_viewer_app_start(VirtViewerApp *app, GError **error); + void virt_viewer_app_maybe_quit(VirtViewerApp *self, VirtViewerWindow *window); + VirtViewerWindow* virt_viewer_app_get_main_window(VirtViewerApp *self); + void virt_viewer_app_trace(VirtViewerApp *self, const char *fmt, ...); +diff --git a/src/virt-viewer-main.c b/src/virt-viewer-main.c +index 81d7c64..a55b4f1 100644 +--- a/src/virt-viewer-main.c ++++ b/src/virt-viewer-main.c +@@ -118,8 +118,12 @@ int main(int argc, char **argv) + if (viewer == NULL) + goto cleanup; + +- if (!virt_viewer_app_start(VIRT_VIEWER_APP(viewer))) ++ if (!virt_viewer_app_start(VIRT_VIEWER_APP(viewer), &error)) { ++ if (g_error_matches(error, VIRT_VIEWER_ERROR, VIRT_VIEWER_ERROR_CANCELLED)) ++ ret = 0; ++ g_clear_error(&error); + goto cleanup; ++ } + + gtk_main(); + +diff --git a/src/virt-viewer-util.h b/src/virt-viewer-util.h +index ec9be22..98badd2 100644 +--- a/src/virt-viewer-util.h ++++ b/src/virt-viewer-util.h +@@ -30,6 +30,7 @@ extern gboolean doDebug; + + enum { + VIRT_VIEWER_ERROR_FAILED, ++ VIRT_VIEWER_ERROR_CANCELLED, + }; + + #define VIRT_VIEWER_ERROR virt_viewer_error_quark () +diff --git a/src/virt-viewer-vm-connection.c b/src/virt-viewer-vm-connection.c +index e15fd4f..35d10ff 100644 +--- a/src/virt-viewer-vm-connection.c ++++ b/src/virt-viewer-vm-connection.c +@@ -87,6 +87,10 @@ virt_viewer_vm_connection_choose_name_dialog(GtkWindow *main_window, + if (dialog_response == GTK_RESPONSE_ACCEPT && + gtk_tree_selection_get_selected(selection, &model, &iter)) { + gtk_tree_model_get(model, &iter, 0, &vm_name, -1); ++ } else { ++ g_set_error_literal(error, ++ VIRT_VIEWER_ERROR, VIRT_VIEWER_ERROR_CANCELLED, ++ _("No virtual machine was chosen")); + } + + gtk_widget_destroy(dialog); +diff --git a/src/virt-viewer.c b/src/virt-viewer.c +index fcd366a..bbdee73 100644 +--- a/src/virt-viewer.c ++++ b/src/virt-viewer.c +@@ -69,7 +69,7 @@ G_DEFINE_TYPE (VirtViewer, virt_viewer, VIRT_VIEWER_TYPE_APP) + static gboolean virt_viewer_initial_connect(VirtViewerApp *self, GError **error); + static gboolean virt_viewer_open_connection(VirtViewerApp *self, int *fd); + static void virt_viewer_deactivated(VirtViewerApp *self, gboolean connect_error); +-static gboolean virt_viewer_start(VirtViewerApp *self); ++static gboolean virt_viewer_start(VirtViewerApp *self, GError **error); + static void virt_viewer_dispose (GObject *object); + + static void +@@ -710,7 +710,7 @@ choose_vm(GtkWindow *main_window, + return dom; + } + +-static int virt_viewer_connect(VirtViewerApp *app); ++static int virt_viewer_connect(VirtViewerApp *app, GError **error); + + static gboolean + virt_viewer_initial_connect(VirtViewerApp *app, GError **error) +@@ -726,7 +726,7 @@ virt_viewer_initial_connect(VirtViewerApp *app, GError **error) + g_debug("initial connect"); + + if (!priv->conn && +- virt_viewer_connect(app) < 0) { ++ virt_viewer_connect(app, &err) < 0) { + virt_viewer_app_show_status(app, _("Waiting for libvirt to start")); + goto wait; + } +@@ -892,7 +892,7 @@ virt_viewer_get_error_message_from_vir_error(VirtViewer *self, + } + + static int +-virt_viewer_connect(VirtViewerApp *app) ++virt_viewer_connect(VirtViewerApp *app, GError **err) + { + VirtViewer *self = VIRT_VIEWER(app); + VirtViewerPrivate *priv = self->priv; +@@ -921,28 +921,36 @@ virt_viewer_connect(VirtViewerApp *app) + if (!priv->conn) { + if (!priv->auth_cancelled) { + gchar *error_message = virt_viewer_get_error_message_from_vir_error(self, virGetLastError()); +- ++ g_set_error_literal(&error, ++ VIRT_VIEWER_ERROR, VIRT_VIEWER_ERROR_FAILED, ++ error_message); + virt_viewer_app_simple_message_dialog(app, error_message); + + g_free(error_message); ++ } else { ++ g_set_error_literal(&error, ++ VIRT_VIEWER_ERROR, VIRT_VIEWER_ERROR_CANCELLED, ++ _("Authentication was cancelled")); + } +- ++ g_propagate_error(err, error); + return -1; + } + + if (!virt_viewer_app_initial_connect(app, &error)) { + if (error != NULL) { +- VirtViewerWindow *main_window = virt_viewer_app_get_main_window(app); +- +- GtkWidget *dialog = gtk_message_dialog_new(virt_viewer_window_get_window(main_window), +- GTK_DIALOG_DESTROY_WITH_PARENT, +- GTK_MESSAGE_ERROR, +- GTK_BUTTONS_CLOSE, +- "Failed to connect: %s", +- error->message); +- gtk_dialog_run(GTK_DIALOG(dialog)); +- gtk_widget_destroy(GTK_WIDGET(dialog)); +- g_clear_error(&error); ++ if (!g_error_matches(error, VIRT_VIEWER_ERROR, VIRT_VIEWER_ERROR_CANCELLED)) { ++ VirtViewerWindow *main_window = virt_viewer_app_get_main_window(app); ++ ++ GtkWidget *dialog = gtk_message_dialog_new(virt_viewer_window_get_window(main_window), ++ GTK_DIALOG_DESTROY_WITH_PARENT, ++ GTK_MESSAGE_ERROR, ++ GTK_BUTTONS_CLOSE, ++ "Failed to connect: %s", ++ error->message); ++ gtk_dialog_run(GTK_DIALOG(dialog)); ++ gtk_widget_destroy(GTK_WIDGET(dialog)); ++ } ++ g_propagate_error(err, error); + } + return -1; + } +@@ -974,16 +982,16 @@ virt_viewer_connect(VirtViewerApp *app) + } + + static gboolean +-virt_viewer_start(VirtViewerApp *app) ++virt_viewer_start(VirtViewerApp *app, GError **error) + { + virt_viewer_events_register(); + + virSetErrorFunc(NULL, virt_viewer_error_func); + +- if (virt_viewer_connect(app) < 0) ++ if (virt_viewer_connect(app, error) < 0) + return FALSE; + +- return VIRT_VIEWER_APP_CLASS(virt_viewer_parent_class)->start(app); ++ return VIRT_VIEWER_APP_CLASS(virt_viewer_parent_class)->start(app, error); + } + + VirtViewer * diff --git a/SOURCES/0062-Add-example-of-an-oVirt-URI-to-the-manpage.patch b/SOURCES/0062-Add-example-of-an-oVirt-URI-to-the-manpage.patch deleted file mode 100644 index d3048ff..0000000 --- a/SOURCES/0062-Add-example-of-an-oVirt-URI-to-the-manpage.patch +++ /dev/null @@ -1,27 +0,0 @@ -From f0b52036b3928b4a510562356e06e7e10df1bfca Mon Sep 17 00:00:00 2001 -From: Jonathon Jongsma -Date: Thu, 25 Sep 2014 17:26:33 -0500 -Subject: [PATCH] Add example of an oVirt URI to the manpage - -https://bugzilla.redhat.com/show_bug.cgi?id=1142769 -(cherry picked from commit 0107214070b796ab5f00168f963081238e6379fa) ---- - man/remote-viewer.pod | 5 +++++ - 1 file changed, 5 insertions(+) - -diff --git a/man/remote-viewer.pod b/man/remote-viewer.pod -index 1683e44..b3b0bbc 100644 ---- a/man/remote-viewer.pod -+++ b/man/remote-viewer.pod -@@ -306,6 +306,11 @@ To connect to VNC server on host "tsingy" with port 5900 - - remote-viewer vnc://tsingy:5900 - -+To connect to a virtual machine named "toliara" on an oVirt server at -+example.org -+ -+ remote-viewer ovirt://[username@]example.org/toliara -+ - =head1 BUGS - - Report bugs to the mailing list C diff --git a/SOURCES/0062-Clear-GError-in-cleanup-section.patch b/SOURCES/0062-Clear-GError-in-cleanup-section.patch new file mode 100644 index 0000000..030e030 --- /dev/null +++ b/SOURCES/0062-Clear-GError-in-cleanup-section.patch @@ -0,0 +1,67 @@ +From 4a3fbfcc343728a93ca4c9d004a1ce4626782065 Mon Sep 17 00:00:00 2001 +From: Pavel Grunt +Date: Fri, 20 Mar 2015 10:35:55 +0100 +Subject: [PATCH] Clear GError in cleanup section + +(cherry picked from commit 526e882368eb74eb1ed9de5c1c8aefb7b428fb9d) +--- + src/remote-viewer-main.c | 3 +-- + src/virt-viewer-main.c | 3 +-- + 2 files changed, 2 insertions(+), 4 deletions(-) + +diff --git a/src/remote-viewer-main.c b/src/remote-viewer-main.c +index b689033..8298053 100644 +--- a/src/remote-viewer-main.c ++++ b/src/remote-viewer-main.c +@@ -138,7 +138,6 @@ main(int argc, char **argv) + g_printerr(_("%s\nRun '%s --help' to see a full list of available command line options\n"), + error->message, base_name); + g_free(base_name); +- g_error_free(error); + goto cleanup; + } + +@@ -181,7 +180,6 @@ main(int argc, char **argv) + if (!virt_viewer_app_start(app, &error)) { + if (g_error_matches(error, VIRT_VIEWER_ERROR, VIRT_VIEWER_ERROR_CANCELLED)) + ret = 0; +- g_clear_error(&error); + goto cleanup; + } + +@@ -197,6 +195,7 @@ main(int argc, char **argv) + if (viewer) + g_object_unref(viewer); + g_strfreev(args); ++ g_clear_error(&error); + + return ret; + } +diff --git a/src/virt-viewer-main.c b/src/virt-viewer-main.c +index a55b4f1..713cdec 100644 +--- a/src/virt-viewer-main.c ++++ b/src/virt-viewer-main.c +@@ -98,7 +98,6 @@ int main(int argc, char **argv) + if (error) { + g_printerr("%s\n%s\n", + error->message, help_msg); +- g_error_free(error); + goto cleanup; + } + +@@ -121,7 +120,6 @@ int main(int argc, char **argv) + if (!virt_viewer_app_start(VIRT_VIEWER_APP(viewer), &error)) { + if (g_error_matches(error, VIRT_VIEWER_ERROR, VIRT_VIEWER_ERROR_CANCELLED)) + ret = 0; +- g_clear_error(&error); + goto cleanup; + } + +@@ -135,6 +133,7 @@ int main(int argc, char **argv) + g_free(uri); + g_strfreev(args); + g_free(help_msg); ++ g_clear_error(&error); + + return ret; + } diff --git a/SOURCES/0063-Do-not-fail-when-the-auth-dialog-is-cancelled.patch b/SOURCES/0063-Do-not-fail-when-the-auth-dialog-is-cancelled.patch deleted file mode 100644 index fe063db..0000000 --- a/SOURCES/0063-Do-not-fail-when-the-auth-dialog-is-cancelled.patch +++ /dev/null @@ -1,62 +0,0 @@ -From e39786a67599b20ae86f2df9cb9e140f0e36742d Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Fabiano=20Fid=C3=AAncio?= -Date: Mon, 22 Sep 2014 17:14:39 +0200 -Subject: [PATCH] Do not fail when the auth dialog is cancelled - -https://bugzilla.redhat.com/show_bug.cgi?id=1145460 -(cherry picked from commit a5ce2ed3aea30486900e868dc2158fc591321ec1) ---- - src/virt-viewer.c | 19 ++++++++++++------- - 1 file changed, 12 insertions(+), 7 deletions(-) - -diff --git a/src/virt-viewer.c b/src/virt-viewer.c -index 8d3e6fb..aceb474 100644 ---- a/src/virt-viewer.c -+++ b/src/virt-viewer.c -@@ -57,6 +57,7 @@ struct _VirtViewerPrivate { - gboolean withEvents; - gboolean waitvm; - gboolean reconnect; -+ gboolean auth_cancelled; - }; - - G_DEFINE_TYPE (VirtViewer, virt_viewer, VIRT_VIEWER_TYPE_APP) -@@ -668,6 +669,7 @@ virt_viewer_auth_libvirt_credentials(virConnectCredentialPtr cred, - { - char **username = NULL, **password = NULL; - VirtViewer *app = cbdata; -+ VirtViewerPrivate *priv = app->priv; - int i; - int ret = -1; - -@@ -691,11 +693,11 @@ virt_viewer_auth_libvirt_credentials(virConnectCredentialPtr cred, - if (username || password) { - VirtViewerWindow *vwin = virt_viewer_app_get_main_window(VIRT_VIEWER_APP(app)); - GtkWindow *win = virt_viewer_window_get_window(vwin); -- ret = virt_viewer_auth_collect_credentials(win, -- "libvirt", -- app->priv->uri, -- username, password); -- if (ret < 0) -+ priv->auth_cancelled = !virt_viewer_auth_collect_credentials(win, -+ "libvirt", -+ app->priv->uri, -+ username, password); -+ if (priv->auth_cancelled) - goto cleanup; - } else { - ret = 0; -@@ -748,8 +750,11 @@ virt_viewer_connect(VirtViewerApp *app) - &auth_libvirt, - oflags); - if (!priv->conn) { -- virt_viewer_app_simple_message_dialog(app, _("Unable to connect to libvirt with URI %s"), -- priv->uri ? priv->uri : _("[none]")); -+ if (!priv->auth_cancelled) { -+ virt_viewer_app_simple_message_dialog(app, _("Unable to connect to libvirt with URI %s"), -+ priv->uri ? priv->uri : _("[none]")); -+ } -+ - return -1; - } - diff --git a/SOURCES/0063-Report-errors-in-one-place.patch b/SOURCES/0063-Report-errors-in-one-place.patch new file mode 100644 index 0000000..d67dc80 --- /dev/null +++ b/SOURCES/0063-Report-errors-in-one-place.patch @@ -0,0 +1,143 @@ +From e28fa61b1548d0bad2833c8025c99da2a0939e71 Mon Sep 17 00:00:00 2001 +From: Pavel Grunt +Date: Fri, 20 Mar 2015 10:35:56 +0100 +Subject: [PATCH] Report errors in one place + +Since the error is propagated to the main, report the error there. +To make it work GError VIRT_VIEWER_ERROR_FAILED is set for all +failing states and it is reported using virt_viewer_app_simple_message_dialog(). + +(cherry picked from commit 1a619f23835abcc358b84bcead14171361907038) + + Conflicts: + src/remote-viewer.c +--- + src/remote-viewer-main.c | 3 +++ + src/remote-viewer.c | 21 ++++++++++----------- + src/virt-viewer-main.c | 3 +++ + src/virt-viewer.c | 21 ++++----------------- + 4 files changed, 20 insertions(+), 28 deletions(-) + +diff --git a/src/remote-viewer-main.c b/src/remote-viewer-main.c +index 8298053..81cf736 100644 +--- a/src/remote-viewer-main.c ++++ b/src/remote-viewer-main.c +@@ -180,6 +180,9 @@ main(int argc, char **argv) + if (!virt_viewer_app_start(app, &error)) { + if (g_error_matches(error, VIRT_VIEWER_ERROR, VIRT_VIEWER_ERROR_CANCELLED)) + ret = 0; ++ else if (error) { ++ virt_viewer_app_simple_message_dialog(app, error->message); ++ } + goto cleanup; + } + +diff --git a/src/remote-viewer.c b/src/remote-viewer.c +index b571c0b..32793e5 100644 +--- a/src/remote-viewer.c ++++ b/src/remote-viewer.c +@@ -1248,23 +1248,21 @@ retry_dialog: + vvfile = virt_viewer_file_new(path, &error); + g_free(path); + if (error) { +- virt_viewer_app_simple_message_dialog(app, _("Invalid file %s"), guri); ++ g_prefix_error(&error, _("Invalid file %s: "), guri); + g_warning("%s", error->message); + goto cleanup; + } + g_object_get(G_OBJECT(vvfile), "type", &type, NULL); + } else if (virt_viewer_util_extract_host(guri, &type, NULL, NULL, NULL, NULL) < 0 || type == NULL) { +- virt_viewer_app_simple_message_dialog(app, _("Cannot determine the connection type from URI")); ++ g_set_error_literal(&error, ++ VIRT_VIEWER_ERROR, VIRT_VIEWER_ERROR_FAILED, ++ _("Cannot determine the connection type from URI")); + goto cleanup; + } + #ifdef HAVE_OVIRT + if (g_strcmp0(type, "ovirt") == 0) { + if (!create_ovirt_session(app, guri, &error)) { +- if (error && !g_error_matches(error, VIRT_VIEWER_ERROR, VIRT_VIEWER_ERROR_CANCELLED)) { +- virt_viewer_app_simple_message_dialog(app, +- _("Couldn't open oVirt session: %s"), +- error->message); +- } ++ g_prefix_error(&error, _("Couldn't open oVirt session: ")); + goto cleanup; + } + } else +@@ -1286,10 +1284,11 @@ retry_dialog: + #endif + + if (!virt_viewer_app_initial_connect(app, &error)) { +- const gchar *msg = error ? error->message : +- _("Failed to initiate connection"); +- +- virt_viewer_app_simple_message_dialog(app, msg); ++ if (error == NULL) { ++ g_set_error_literal(&error, ++ VIRT_VIEWER_ERROR, VIRT_VIEWER_ERROR_FAILED, ++ _("Failed to initiate connection")); ++ } + goto cleanup; + } + #ifdef HAVE_SPICE_GTK +diff --git a/src/virt-viewer-main.c b/src/virt-viewer-main.c +index 713cdec..1f154cd 100644 +--- a/src/virt-viewer-main.c ++++ b/src/virt-viewer-main.c +@@ -120,6 +120,9 @@ int main(int argc, char **argv) + if (!virt_viewer_app_start(VIRT_VIEWER_APP(viewer), &error)) { + if (g_error_matches(error, VIRT_VIEWER_ERROR, VIRT_VIEWER_ERROR_CANCELLED)) + ret = 0; ++ else if (error) { ++ virt_viewer_app_simple_message_dialog(VIRT_VIEWER_APP(viewer), error->message); ++ } + goto cleanup; + } + +diff --git a/src/virt-viewer.c b/src/virt-viewer.c +index bbdee73..f077ab6 100644 +--- a/src/virt-viewer.c ++++ b/src/virt-viewer.c +@@ -759,7 +759,9 @@ virt_viewer_initial_connect(VirtViewerApp *app, GError **error) + + virt_viewer_app_show_status(app, _("Checking guest domain status")); + if (virDomainGetInfo(dom, &info) < 0) { +- g_debug("Cannot get guest state"); ++ g_set_error_literal(&err, VIRT_VIEWER_ERROR, VIRT_VIEWER_ERROR_FAILED, ++ _("Cannot get guest state")); ++ g_debug("%s", err->message); + goto cleanup; + } + +@@ -924,7 +926,6 @@ virt_viewer_connect(VirtViewerApp *app, GError **err) + g_set_error_literal(&error, + VIRT_VIEWER_ERROR, VIRT_VIEWER_ERROR_FAILED, + error_message); +- virt_viewer_app_simple_message_dialog(app, error_message); + + g_free(error_message); + } else { +@@ -937,21 +938,7 @@ virt_viewer_connect(VirtViewerApp *app, GError **err) + } + + if (!virt_viewer_app_initial_connect(app, &error)) { +- if (error != NULL) { +- if (!g_error_matches(error, VIRT_VIEWER_ERROR, VIRT_VIEWER_ERROR_CANCELLED)) { +- VirtViewerWindow *main_window = virt_viewer_app_get_main_window(app); +- +- GtkWidget *dialog = gtk_message_dialog_new(virt_viewer_window_get_window(main_window), +- GTK_DIALOG_DESTROY_WITH_PARENT, +- GTK_MESSAGE_ERROR, +- GTK_BUTTONS_CLOSE, +- "Failed to connect: %s", +- error->message); +- gtk_dialog_run(GTK_DIALOG(dialog)); +- gtk_widget_destroy(GTK_WIDGET(dialog)); +- } +- g_propagate_error(err, error); +- } ++ g_propagate_prefixed_error(err, error, _("Failed to connect: ")); + return -1; + } + diff --git a/SOURCES/0064-Simplify-virt_viewer_auth_libvirt_credentials-return.patch b/SOURCES/0064-Simplify-virt_viewer_auth_libvirt_credentials-return.patch deleted file mode 100644 index 8acd731..0000000 --- a/SOURCES/0064-Simplify-virt_viewer_auth_libvirt_credentials-return.patch +++ /dev/null @@ -1,45 +0,0 @@ -From 98dec8d10fa401aabc1da4caa571df964f6bfc13 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Fabiano=20Fid=C3=AAncio?= -Date: Tue, 23 Sep 2014 16:07:50 +0200 -Subject: [PATCH] Simplify virt_viewer_auth_libvirt_credentials() return value - logic - -As the function should return < 0 in error cases, let's explicitly -return/set the return value to -1 in error cases. Otherwise, the -function will return 0. - -This patch also fixes a regression introduced by (a5ce2ed3). - -https://bugzilla.redhat.com/show_bug.cgi?id=1142742 -(cherry picked from commit 42ffe6f8b4efe2a1e80fc98dbded37823133b55c) ---- - src/virt-viewer.c | 8 ++++---- - 1 file changed, 4 insertions(+), 4 deletions(-) - -diff --git a/src/virt-viewer.c b/src/virt-viewer.c -index aceb474..1d14b70 100644 ---- a/src/virt-viewer.c -+++ b/src/virt-viewer.c -@@ -671,7 +671,7 @@ virt_viewer_auth_libvirt_credentials(virConnectCredentialPtr cred, - VirtViewer *app = cbdata; - VirtViewerPrivate *priv = app->priv; - int i; -- int ret = -1; -+ int ret = 0; - - g_debug("Got libvirt credential request for %d credential(s)", ncred); - -@@ -697,10 +697,10 @@ virt_viewer_auth_libvirt_credentials(virConnectCredentialPtr cred, - "libvirt", - app->priv->uri, - username, password); -- if (priv->auth_cancelled) -+ if (priv->auth_cancelled) { -+ ret = -1; - goto cleanup; -- } else { -- ret = 0; -+ } - } - - for (i = 0 ; i < ncred ; i++) { diff --git a/SOURCES/0064-virt-viewer-Clean-up-if-no-vm-was-chosen.patch b/SOURCES/0064-virt-viewer-Clean-up-if-no-vm-was-chosen.patch new file mode 100644 index 0000000..d6d5823 --- /dev/null +++ b/SOURCES/0064-virt-viewer-Clean-up-if-no-vm-was-chosen.patch @@ -0,0 +1,29 @@ +From 4c3a31097970e551348102990b7c5ba684c68bbc Mon Sep 17 00:00:00 2001 +From: Pavel Grunt +Date: Tue, 17 Mar 2015 15:42:29 +0100 +Subject: [PATCH] virt-viewer: Clean up if no vm was chosen + +It is safe to clean up when running virt-viewer without specifying +vm name if no vm was chosen. It brings back behavior before 88f6341. + +The 'if (dom == NULL && err != NULL)' part was affected by commits +824c4b9, 1eaaf8c, 15c7d17 so the check for 'err' is not needed anymore. + +(cherry picked from commit 66afac53b6769f079d537cfa130f212286981c93) +--- + src/virt-viewer.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/src/virt-viewer.c b/src/virt-viewer.c +index f077ab6..bcac2ca 100644 +--- a/src/virt-viewer.c ++++ b/src/virt-viewer.c +@@ -745,7 +745,7 @@ virt_viewer_initial_connect(VirtViewerApp *app, GError **error) + &priv->domkey, + priv->conn, + &err); +- if (dom == NULL && err != NULL) { ++ if (dom == NULL) { + goto cleanup; + } + } diff --git a/SOURCES/0065-Improve-authentication-error-messages.patch b/SOURCES/0065-Improve-authentication-error-messages.patch deleted file mode 100644 index e315c53..0000000 --- a/SOURCES/0065-Improve-authentication-error-messages.patch +++ /dev/null @@ -1,69 +0,0 @@ -From ed387e66019867e2ca68a00473ef9b7e4b9db831 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Fabiano=20Fid=C3=AAncio?= -Date: Tue, 23 Sep 2014 16:23:42 +0200 -Subject: [PATCH] Improve authentication error messages - -Adding a better error message to our default error message, based on the -libvirt error. Also, the libvirt error is shown as debug. - -https://bugzilla.redhat.com/show_bug.cgi?id=1142742 -(cherry picked from commit 141d69b7f523f1ecc3c328b43e4a54f9cbfb5eee) ---- - src/virt-viewer.c | 37 +++++++++++++++++++++++++++++++++++-- - 1 file changed, 35 insertions(+), 2 deletions(-) - -diff --git a/src/virt-viewer.c b/src/virt-viewer.c -index 1d14b70..604dea6 100644 ---- a/src/virt-viewer.c -+++ b/src/virt-viewer.c -@@ -722,6 +722,36 @@ virt_viewer_auth_libvirt_credentials(virConnectCredentialPtr cred, - return ret; - } - -+static gchar * -+virt_viewer_get_error_message_from_vir_error(VirtViewer *self, -+ virErrorPtr error) -+{ -+ VirtViewerPrivate *priv = self->priv; -+ const gchar *error_details = NULL; -+ gchar *detailed_error_message = NULL; -+ gchar *error_message = g_strdup_printf(_("Unable to connect to libvirt with URI: %s."), -+ priv->uri ? priv->uri : _("[none]")); -+ -+ g_debug("Error: %s", error->message); -+ -+ /* For now we are only treating authentication errors. */ -+ switch (error->code) { -+ case VIR_ERR_AUTH_FAILED: -+ error_details = _("Authentication failed."); -+ break; -+ default: -+ break; -+ } -+ -+ if (error_details != NULL) { -+ detailed_error_message = g_strdup_printf("%s\n%s", error_message, error_details); -+ g_free(error_message); -+ return detailed_error_message; -+ } -+ -+ return error_message; -+} -+ - static int - virt_viewer_connect(VirtViewerApp *app) - { -@@ -751,8 +781,11 @@ virt_viewer_connect(VirtViewerApp *app) - oflags); - if (!priv->conn) { - if (!priv->auth_cancelled) { -- virt_viewer_app_simple_message_dialog(app, _("Unable to connect to libvirt with URI %s"), -- priv->uri ? priv->uri : _("[none]")); -+ gchar *error_message = virt_viewer_get_error_message_from_vir_error(self, virGetLastError()); -+ -+ virt_viewer_app_simple_message_dialog(app, error_message); -+ -+ g_free(error_message); - } - - return -1; diff --git a/SOURCES/0066-Unset-app-fullscreen-when-leaving-fullscreen.patch b/SOURCES/0066-Unset-app-fullscreen-when-leaving-fullscreen.patch deleted file mode 100644 index 261dbc1..0000000 --- a/SOURCES/0066-Unset-app-fullscreen-when-leaving-fullscreen.patch +++ /dev/null @@ -1,70 +0,0 @@ -From 002d20ade8d60d940f8722b1ffea433a671f345a Mon Sep 17 00:00:00 2001 -From: Jonathon Jongsma -Date: Thu, 25 Sep 2014 10:53:55 -0500 -Subject: [PATCH] Unset app 'fullscreen' when leaving fullscreen - -Previously, the fullscreen floating toolbar and the "toggle-fullscreen" -hotkey (which maps to the menu item action) had slightly different -methods of exiting fullscreen. The floating toolbar method unset the -'fullscreen' property on the application (which causes all windows to -simultaneously exit fullscreen), whereas the hotkey did not. This had a -side-effect of preventing the display from auto re-sizing if it was -fullscreened again. After this change, both the hotkey and the toolbar -button will unset the application-level 'fullscreen' property when -exiting fullscreen mode. - -Resolves: rhbz#1022608 -(cherry picked from commit c4d1347a6d9893c34bb50c3fafcd7c9c23e1dc08) ---- - src/virt-viewer-window.c | 28 ++++++++++++++++++---------- - 1 file changed, 18 insertions(+), 10 deletions(-) - -diff --git a/src/virt-viewer-window.c b/src/virt-viewer-window.c -index c8d5722..8dbf5a5 100644 ---- a/src/virt-viewer-window.c -+++ b/src/virt-viewer-window.c -@@ -830,15 +830,26 @@ virt_viewer_window_menu_file_quit(GtkWidget *src G_GNUC_UNUSED, - - - static void -+virt_viewer_window_set_fullscreen(VirtViewerWindow *self, -+ gboolean fullscreen) -+{ -+ if (fullscreen) { -+ virt_viewer_window_enter_fullscreen(self, -1); -+ } else { -+ /* leave all windows fullscreen state */ -+ if (virt_viewer_app_get_fullscreen(self->priv->app)) -+ g_object_set(self->priv->app, "fullscreen", FALSE, NULL); -+ /* or just this window */ -+ else -+ virt_viewer_window_leave_fullscreen(self); -+ } -+} -+ -+static void - virt_viewer_window_toolbar_leave_fullscreen(GtkWidget *button G_GNUC_UNUSED, - VirtViewerWindow *self) - { -- /* leave all windows fullscreen state */ -- if (virt_viewer_app_get_fullscreen(self->priv->app)) -- g_object_set(self->priv->app, "fullscreen", FALSE, NULL); -- /* or just this window */ -- else -- virt_viewer_window_leave_fullscreen(self); -+ virt_viewer_window_set_fullscreen(self, FALSE); - } - - static void keycombo_menu_location(GtkMenu *menu G_GNUC_UNUSED, gint *x, gint *y, -@@ -875,10 +886,7 @@ virt_viewer_window_menu_view_fullscreen(GtkWidget *menu, - { - gboolean fullscreen = gtk_check_menu_item_get_active(GTK_CHECK_MENU_ITEM(menu)); - -- if (fullscreen) -- virt_viewer_window_enter_fullscreen(self, -1); -- else -- virt_viewer_window_leave_fullscreen(self); -+ virt_viewer_window_set_fullscreen(self, fullscreen); - } - - static void add_if_writable (GdkPixbufFormat *data, GHashTable *formats) diff --git a/SOURCES/0067-Don-t-use-fallback-ca-file-when-launching-vv-file.patch b/SOURCES/0067-Don-t-use-fallback-ca-file-when-launching-vv-file.patch deleted file mode 100644 index 45adde0..0000000 --- a/SOURCES/0067-Don-t-use-fallback-ca-file-when-launching-vv-file.patch +++ /dev/null @@ -1,31 +0,0 @@ -From e63dd36d1468cc089b74cb04fbf9d80b47988ca4 Mon Sep 17 00:00:00 2001 -From: Jonathon Jongsma -Date: Fri, 15 Aug 2014 10:58:56 -0500 -Subject: [PATCH] Don't use fallback ca-file when launching vv-file - -When launching from a vv-file, we want to use the ca specified in the vv -file and not load additional certs from the fallback ca-file. This -ensures that the ca-file property of the spice session is unset when -loading a ca from a vv-file. - -Resolves: rhbz#1127762 ---- - src/virt-viewer-session-spice.c | 5 ++++- - 1 file changed, 4 insertions(+), 1 deletion(-) - -diff --git a/src/virt-viewer-session-spice.c b/src/virt-viewer-session-spice.c -index 58a1dd7..ceef067 100644 ---- a/src/virt-viewer-session-spice.c -+++ b/src/virt-viewer-session-spice.c -@@ -359,7 +359,10 @@ fill_session(VirtViewerFile *file, SpiceSession *session) - g_return_if_fail(ca != NULL); - - GByteArray *ba = g_byte_array_new_take((guint8 *)ca, strlen(ca) + 1); -- g_object_set(G_OBJECT(session), "ca", ba, NULL); -+ g_object_set(G_OBJECT(session), -+ "ca", ba, -+ "ca-file", NULL, -+ NULL); - g_byte_array_unref(ba); - } - diff --git a/SOURCES/0068-Force-displays-to-update-geometry-when-agent-connect.patch b/SOURCES/0068-Force-displays-to-update-geometry-when-agent-connect.patch deleted file mode 100644 index bf1b1cf..0000000 --- a/SOURCES/0068-Force-displays-to-update-geometry-when-agent-connect.patch +++ /dev/null @@ -1,59 +0,0 @@ -From f02d4352d3157a953fa4609c48746cffaee45d14 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Fabiano=20Fid=C3=AAncio?= -Date: Mon, 11 Aug 2014 22:38:38 +0200 -Subject: [PATCH] Force displays to update geometry when agent connects - -We have to force displays to update geometry when the agent connects to -ensure the client will have the guest with the right resolution when the -guest has rebooted or the agent has crashed. - -https://bugzilla.redhat.com/sho_bug.cgi?id=1021841 -(cherry picked from commit e85ae4c27c84282572e42145a56e37c171a8a24a) ---- - src/virt-viewer-session-spice.c | 4 ++++ - src/virt-viewer-session.c | 4 ++++ - src/virt-viewer-session.h | 1 + - 3 files changed, 9 insertions(+) - -diff --git a/src/virt-viewer-session-spice.c b/src/virt-viewer-session-spice.c -index ceef067..0c8cefb 100644 ---- a/src/virt-viewer-session-spice.c -+++ b/src/virt-viewer-session-spice.c -@@ -589,6 +589,10 @@ agent_connected_changed(SpiceChannel *cmain G_GNUC_UNUSED, - { - // this will force refresh of application menu - g_signal_emit_by_name(self, "session-display-updated"); -+ -+ /* this will force update displays geometry when the agent has connected -+ * after the application (eg: rebooting the guest) */ -+ virt_viewer_session_update_displays_geometry(VIRT_VIEWER_SESSION(self)); - } - - static void -diff --git a/src/virt-viewer-session.c b/src/virt-viewer-session.c -index 9410004..8413bfe 100644 ---- a/src/virt-viewer-session.c -+++ b/src/virt-viewer-session.c -@@ -475,6 +475,10 @@ void virt_viewer_session_clear_displays(VirtViewerSession *session) - session->priv->displays = NULL; - } - -+void virt_viewer_session_update_displays_geometry(VirtViewerSession *session) -+{ -+ virt_viewer_session_on_monitor_geometry_changed(session, NULL); -+} - - - void virt_viewer_session_close(VirtViewerSession *session) -diff --git a/src/virt-viewer-session.h b/src/virt-viewer-session.h -index 316fdf0..ba0f6b2 100644 ---- a/src/virt-viewer-session.h -+++ b/src/virt-viewer-session.h -@@ -107,6 +107,7 @@ void virt_viewer_session_add_display(VirtViewerSession *session, - void virt_viewer_session_remove_display(VirtViewerSession *session, - VirtViewerDisplay *display); - void virt_viewer_session_clear_displays(VirtViewerSession *session); -+void virt_viewer_session_update_displays_geometry(VirtViewerSession *session); - - void virt_viewer_session_close(VirtViewerSession* session); - gboolean virt_viewer_session_open_fd(VirtViewerSession* session, int fd); diff --git a/SOURCES/0069-Adapt-auth_cancelled-to-the-downstream-code.patch b/SOURCES/0069-Adapt-auth_cancelled-to-the-downstream-code.patch deleted file mode 100644 index 27e487b..0000000 --- a/SOURCES/0069-Adapt-auth_cancelled-to-the-downstream-code.patch +++ /dev/null @@ -1,42 +0,0 @@ -From 8fc10c02f53754dfd83cf50327e801cdec4d2895 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Fabiano=20Fid=C3=AAncio?= -Date: Thu, 9 Oct 2014 17:05:05 +0200 -Subject: [PATCH] Adapt auth_cancelled to the downstream code - -While upstream we have virt_viewer_auth_collect_credentials() returning -a boolean (FALSE, 0, indicating that the user cancelled the auth dialog -and TRUE, !0, otherwise), downstream the function is still returning an -integer (-1 indicating that the user cancelled the auth dialog and 0 -otherwise). - -Related: rhbz#1142742 ---- - src/virt-viewer.c | 14 ++++++++------ - 1 file changed, 8 insertions(+), 6 deletions(-) - -diff --git a/src/virt-viewer.c b/src/virt-viewer.c -index 604dea6..4159203 100644 ---- a/src/virt-viewer.c -+++ b/src/virt-viewer.c -@@ -693,13 +693,15 @@ virt_viewer_auth_libvirt_credentials(virConnectCredentialPtr cred, - if (username || password) { - VirtViewerWindow *vwin = virt_viewer_app_get_main_window(VIRT_VIEWER_APP(app)); - GtkWindow *win = virt_viewer_window_get_window(vwin); -- priv->auth_cancelled = !virt_viewer_auth_collect_credentials(win, -- "libvirt", -- app->priv->uri, -- username, password); -- if (priv->auth_cancelled) { -- ret = -1; -+ ret = virt_viewer_auth_collect_credentials(win, -+ "libvirt", -+ app->priv->uri, -+ username, password); -+ if (ret < 0) { -+ priv->auth_cancelled = TRUE; - goto cleanup; -+ } else { -+ priv->auth_cancelled = FALSE; - } - } - diff --git a/SOURCES/0070-ovirt-Allow-to-remove-CD-images.patch b/SOURCES/0070-ovirt-Allow-to-remove-CD-images.patch deleted file mode 100644 index 626f212..0000000 --- a/SOURCES/0070-ovirt-Allow-to-remove-CD-images.patch +++ /dev/null @@ -1,36 +0,0 @@ -From afa84a03c2584a971b54bd3a69ecb4429d517630 Mon Sep 17 00:00:00 2001 -From: Christophe Fergeau -Date: Mon, 22 Sep 2014 14:15:00 +0200 -Subject: [PATCH] ovirt: Allow to remove CD images - -It turns out this is supposed to be done through update requests with a -CD image with an empty name, which is what the current code tries to do. -The only reason it's not working is because of server-side bugs with -oVirt < 3.5 -The requirement on libgovirt is raised to 0.3.2 as -a small change is needed as well in libgovirt to allow empty filenames: -https://git.gnome.org/browse/libgovirt/commit/?id=bdb788fcc - -Without this change, nothing too bad will happen, but the CD won't be -removed and warnings will be logged in the console. - -(cherry picked from commit 9803f9cb420368e38117c5789777a6eeda5efbbd) ---- - src/ovirt-foreign-menu.c | 4 ---- - 1 file changed, 4 deletions(-) - -diff --git a/src/ovirt-foreign-menu.c b/src/ovirt-foreign-menu.c -index 6fc9577..c813fed 100644 ---- a/src/ovirt-foreign-menu.c -+++ b/src/ovirt-foreign-menu.c -@@ -450,10 +450,6 @@ ovirt_foreign_menu_activate_item_cb(GtkMenuItem *menuitem, gpointer user_data) - g_debug("Removing current cdrom image"); - iso_name = NULL; - foreign_menu->priv->next_iso_name = NULL; -- /* FIXME: No idea how to remove a CDRom from a VM through ovirt REST -- * API for now, so return early. -- */ -- return; - } - g_object_set(foreign_menu->priv->cdrom, - "file", iso_name, diff --git a/SOURCES/0071-App-keep-hash-table-of-displays.patch b/SOURCES/0071-App-keep-hash-table-of-displays.patch deleted file mode 100644 index 422d32d..0000000 --- a/SOURCES/0071-App-keep-hash-table-of-displays.patch +++ /dev/null @@ -1,71 +0,0 @@ -From bc712aca20f55565e259d666284947d645348f7e Mon Sep 17 00:00:00 2001 -From: Jonathon Jongsma -Date: Wed, 20 Aug 2014 14:19:31 -0500 -Subject: [PATCH] App: keep hash table of displays - -This is part of a re-factoring that will de-couple the client window -from the remote display id. - -(cherry picked from commit 573c1cfc9118b730f2ff5aa6a7d45529f2978fbf) - -Conflicts: - src/virt-viewer-app.c ---- - src/virt-viewer-app.c | 16 ++++++++++++++++ - 1 file changed, 16 insertions(+) - -diff --git a/src/virt-viewer-app.c b/src/virt-viewer-app.c -index b05e966..0b86b9b 100644 ---- a/src/virt-viewer-app.c -+++ b/src/virt-viewer-app.c -@@ -109,6 +109,7 @@ struct _VirtViewerAppPrivate { - VirtViewerWindow *main_window; - GtkWidget *main_notebook; - GHashTable *windows; -+ GHashTable *displays; - GHashTable *initial_display_map; - gchar *clipboard; - -@@ -919,6 +920,10 @@ virt_viewer_app_display_added(VirtViewerSession *session G_GNUC_UNUSED, - gint nth; - - g_object_get(display, "nth-display", &nth, NULL); -+ -+ g_debug("Insert display %d %p", nth, display); -+ g_hash_table_insert(self->priv->displays, GINT_TO_POINTER(nth), g_object_ref(display)); -+ - if (nth == 0) { - window = priv->main_window; - } else { -@@ -952,6 +957,7 @@ virt_viewer_app_display_removed(VirtViewerSession *session G_GNUC_UNUSED, - - gtk_widget_hide(GTK_WIDGET(display)); - g_object_get(display, "nth-display", &nth, NULL); -+ g_hash_table_remove(self->priv->displays, GINT_TO_POINTER(nth)); - win = virt_viewer_app_get_nth_window(self, nth); - if (!win) - return; -@@ -1622,6 +1628,15 @@ virt_viewer_app_dispose (GObject *object) - g_hash_table_unref(tmp); - } - -+ if (priv->displays) { -+ GHashTable *tmp = priv->displays; -+ /* null-ify before unrefing, because we need -+ * to prevent callbacks using priv->displays -+ * while it is being disposed of. */ -+ priv->displays = NULL; -+ g_hash_table_unref(tmp); -+ } -+ - g_clear_object(&priv->session); - g_free(priv->title); - priv->title = NULL; -@@ -1682,6 +1697,7 @@ virt_viewer_app_init (VirtViewerApp *self) - virt_viewer_app_set_debug(opt_debug); - - self->priv = GET_PRIVATE(self); -+ self->priv->displays = g_hash_table_new_full(g_direct_hash, g_direct_equal, NULL, g_object_unref); - self->priv->windows = g_hash_table_new_full(g_int_hash, g_int_equal, g_free, g_object_unref); - self->priv->config = g_key_file_new(); - self->priv->config_file = g_build_filename(g_get_user_config_dir(), diff --git a/SOURCES/0072-VirtViewerDisplay-add-convenience-API-for-getting-nt.patch b/SOURCES/0072-VirtViewerDisplay-add-convenience-API-for-getting-nt.patch deleted file mode 100644 index b8ad81e..0000000 --- a/SOURCES/0072-VirtViewerDisplay-add-convenience-API-for-getting-nt.patch +++ /dev/null @@ -1,45 +0,0 @@ -From daa3538174b7c451db4e58da348afe38cdc4084f Mon Sep 17 00:00:00 2001 -From: Jonathon Jongsma -Date: Wed, 20 Aug 2014 14:23:12 -0500 -Subject: [PATCH] VirtViewerDisplay: add convenience API for getting nth - -g_object_get(...) can be cumbersome, so add convenience API for getting -the display ID ("nth-display") property: - - virt_viewer_display_get_nth() - -(cherry picked from commit 0e6735b4a4f1c21364781f97630ec1a12a82fd60) ---- - src/virt-viewer-display.c | 6 ++++++ - src/virt-viewer-display.h | 1 + - 2 files changed, 7 insertions(+) - -diff --git a/src/virt-viewer-display.c b/src/virt-viewer-display.c -index e91450f..e6bc108 100644 ---- a/src/virt-viewer-display.c -+++ b/src/virt-viewer-display.c -@@ -838,6 +838,12 @@ void virt_viewer_display_get_preferred_monitor_geometry(VirtViewerDisplay* self, - } - } - -+gint -+virt_viewer_display_get_nth(VirtViewerDisplay *self) -+{ -+ return self->priv->nth_display; -+} -+ - /* - * Local variables: - * c-indent-level: 4 -diff --git a/src/virt-viewer-display.h b/src/virt-viewer-display.h -index 70ce772..b1133e8 100644 ---- a/src/virt-viewer-display.h -+++ b/src/virt-viewer-display.h -@@ -127,6 +127,7 @@ gboolean virt_viewer_display_get_selectable(VirtViewerDisplay *display); - void virt_viewer_display_queue_resize(VirtViewerDisplay *display); - void virt_viewer_display_get_preferred_monitor_geometry(VirtViewerDisplay *self, GdkRectangle* preferred); - void virt_viewer_display_get_preferred_size(VirtViewerDisplay *self, GtkRequisition* requisistion); -+gint virt_viewer_display_get_nth(VirtViewerDisplay *self); - - G_END_DECLS - diff --git a/SOURCES/0073-VirtViewerApp-store-windows-in-a-list.patch b/SOURCES/0073-VirtViewerApp-store-windows-in-a-list.patch deleted file mode 100644 index dc8401a..0000000 --- a/SOURCES/0073-VirtViewerApp-store-windows-in-a-list.patch +++ /dev/null @@ -1,550 +0,0 @@ -From 4f1fac21ebd15ba0f3c660eb203b836cb9531b5c Mon Sep 17 00:00:00 2001 -From: Jonathon Jongsma -Date: Wed, 20 Aug 2014 16:30:58 -0500 -Subject: [PATCH] VirtViewerApp: store windows in a list - -Use a list to store the application's windows. This is another step -towards separating the window from the guest display ID. - -(cherry picked from commit 453704789036551aa61bf19bc369c8c5709e49f3) - -Conflicts: - src/virt-viewer-app.c ---- - src/remote-viewer.c | 21 +++--- - src/virt-viewer-app.c | 204 +++++++++++++++++++++++--------------------------- - src/virt-viewer-app.h | 2 +- - 3 files changed, 104 insertions(+), 123 deletions(-) - -diff --git a/src/remote-viewer.c b/src/remote-viewer.c -index 237e6a3..0c6067c 100644 ---- a/src/remote-viewer.c -+++ b/src/remote-viewer.c -@@ -414,8 +414,7 @@ spice_menu_update(RemoteViewer *self, VirtViewerWindow *win) - } - - static void --spice_menu_update_each(gpointer key G_GNUC_UNUSED, -- gpointer value, -+spice_menu_update_each(gpointer value, - gpointer user_data) - { - spice_menu_update(REMOTE_VIEWER(user_data), VIRT_VIEWER_WINDOW(value)); -@@ -424,11 +423,11 @@ spice_menu_update_each(gpointer key G_GNUC_UNUSED, - static void - spice_ctrl_menu_updated(RemoteViewer *self) - { -- GHashTable *windows = virt_viewer_app_get_windows(VIRT_VIEWER_APP(self)); -+ GList *windows = virt_viewer_app_get_windows(VIRT_VIEWER_APP(self)); - - g_debug("Spice controller menu updated"); - -- g_hash_table_foreach(windows, spice_menu_update_each, self); -+ g_list_foreach(windows, spice_menu_update_each, self); - } - - static void -@@ -463,8 +462,7 @@ spice_foreign_menu_update(RemoteViewer *self, VirtViewerWindow *win) - } - - static void --spice_foreign_menu_update_each(gpointer key G_GNUC_UNUSED, -- gpointer value, -+spice_foreign_menu_update_each(gpointer value, - gpointer user_data) - { - spice_foreign_menu_update(REMOTE_VIEWER(user_data), VIRT_VIEWER_WINDOW(value)); -@@ -473,11 +471,11 @@ spice_foreign_menu_update_each(gpointer key G_GNUC_UNUSED, - static void - spice_foreign_menu_updated(RemoteViewer *self) - { -- GHashTable *windows = virt_viewer_app_get_windows(VIRT_VIEWER_APP(self)); -+ GList *windows = virt_viewer_app_get_windows(VIRT_VIEWER_APP(self)); - - g_debug("Spice foreign menu updated"); - -- g_hash_table_foreach(windows, spice_foreign_menu_update_each, self); -+ g_list_foreach(windows, spice_foreign_menu_update_each, self); - } - - static SpiceSession * -@@ -757,8 +755,7 @@ ovirt_foreign_menu_update(RemoteViewer *app, VirtViewerWindow *win) - } - - static void --ovirt_foreign_menu_update_each(gpointer key G_GNUC_UNUSED, -- gpointer value, -+ovirt_foreign_menu_update_each(gpointer value, - gpointer user_data) - { - ovirt_foreign_menu_update(REMOTE_VIEWER(user_data), -@@ -768,11 +765,11 @@ ovirt_foreign_menu_update_each(gpointer key G_GNUC_UNUSED, - static void - ovirt_foreign_menu_updated(RemoteViewer *self) - { -- GHashTable *windows = virt_viewer_app_get_windows(VIRT_VIEWER_APP(self)); -+ GList *windows = virt_viewer_app_get_windows(VIRT_VIEWER_APP(self)); - - g_debug("Spice foreign menu updated"); - -- g_hash_table_foreach(windows, ovirt_foreign_menu_update_each, self); -+ g_list_foreach(windows, ovirt_foreign_menu_update_each, self); - } - - static void -diff --git a/src/virt-viewer-app.c b/src/virt-viewer-app.c -index 0b86b9b..0be0aeb 100644 ---- a/src/virt-viewer-app.c -+++ b/src/virt-viewer-app.c -@@ -108,7 +108,7 @@ static void virt_viewer_update_smartcard_accels(VirtViewerApp *self); - struct _VirtViewerAppPrivate { - VirtViewerWindow *main_window; - GtkWidget *main_notebook; -- GHashTable *windows; -+ GList *windows; - GHashTable *displays; - GHashTable *initial_display_map; - gchar *clipboard; -@@ -444,14 +444,11 @@ void virt_viewer_app_set_uuid_string(VirtViewerApp *self, const gchar *uuid_stri - // if we're changing our initial display map, move any existing windows to - // the appropriate monitors according to the per-vm configuration - if (mapping && self->priv->fullscreen) { -- GHashTableIter iter; -- gpointer value; -+ GList *l; - gint i = 0; - -- g_hash_table_iter_init(&iter, self->priv->windows); -- while (g_hash_table_iter_next(&iter, NULL, &value)) { -- gint monitor = virt_viewer_app_get_initial_monitor_for_display(self, i); -- app_window_try_fullscreen(self, VIRT_VIEWER_WINDOW(value), monitor); -+ for (l = self->priv->windows; l; l = l->next) { -+ app_window_try_fullscreen(self, VIRT_VIEWER_WINDOW(l->data), i); - i++; - } - } -@@ -509,8 +506,7 @@ virt_viewer_app_maybe_quit(VirtViewerApp *self, VirtViewerWindow *window) - - } - --static void count_window_visible(gpointer key G_GNUC_UNUSED, -- gpointer value, -+static void count_window_visible(gpointer value, - gpointer user_data) - { - GtkWindow *win = virt_viewer_window_get_window(VIRT_VIEWER_WINDOW(value)); -@@ -524,7 +520,7 @@ static guint - virt_viewer_app_get_n_windows_visible(VirtViewerApp *self) - { - guint n = 0; -- g_hash_table_foreach(self->priv->windows, count_window_visible, &n); -+ g_list_foreach(self->priv->windows, count_window_visible, &n); - return n; - } - -@@ -551,8 +547,7 @@ virt_viewer_app_window_set_visible(VirtViewerApp *self, - return FALSE; - } - --static void hide_one_window(gpointer key G_GNUC_UNUSED, -- gpointer value, -+static void hide_one_window(gpointer value, - gpointer user_data G_GNUC_UNUSED) - { - virt_viewer_window_hide(VIRT_VIEWER_WINDOW(value)); -@@ -561,7 +556,7 @@ static void hide_one_window(gpointer key G_GNUC_UNUSED, - static void - virt_viewer_app_hide_all_windows(VirtViewerApp *app) - { -- g_hash_table_foreach(app->priv->windows, hide_one_window, NULL); -+ g_list_foreach(app->priv->windows, hide_one_window, app); - } - - G_MODULE_EXPORT void -@@ -719,24 +714,27 @@ virt_viewer_app_set_window_subtitle(VirtViewerApp *app, - } - - static void --set_title(gpointer key, -- gpointer value, -+set_title(gpointer value, - gpointer user_data) - { -- gint *nth = key; - VirtViewerApp *app = user_data; - VirtViewerWindow *window = value; -- virt_viewer_app_set_window_subtitle(app, window, *nth); -+ VirtViewerDisplay *display = virt_viewer_window_get_display(window); -+ -+ if (!display) -+ return; -+ -+ virt_viewer_app_set_window_subtitle(app, window, -+ virt_viewer_display_get_nth(display)); - } - - static void - virt_viewer_app_set_all_window_subtitles(VirtViewerApp *app) - { -- g_hash_table_foreach(app->priv->windows, set_title, app); -+ g_list_foreach(app->priv->windows, set_title, app); - } - --static void update_title(gpointer key G_GNUC_UNUSED, -- gpointer value, -+static void update_title(gpointer value, - gpointer user_data G_GNUC_UNUSED) - { - virt_viewer_window_update_title(VIRT_VIEWER_WINDOW(value)); -@@ -745,11 +743,10 @@ static void update_title(gpointer key G_GNUC_UNUSED, - static void - virt_viewer_app_update_title(VirtViewerApp *self) - { -- g_hash_table_foreach(self->priv->windows, update_title, NULL); -+ g_list_foreach(self->priv->windows, update_title, NULL); - } - --static void set_usb_options_sensitive(gpointer key G_GNUC_UNUSED, -- gpointer value, -+static void set_usb_options_sensitive(gpointer value, - gpointer user_data) - { - virt_viewer_window_set_usb_options_sensitive(VIRT_VIEWER_WINDOW(value), -@@ -759,59 +756,22 @@ static void set_usb_options_sensitive(gpointer key G_GNUC_UNUSED, - static void - virt_viewer_app_set_usb_options_sensitive(VirtViewerApp *self, gboolean sensitive) - { -- g_hash_table_foreach(self->priv->windows, set_usb_options_sensitive, -- GINT_TO_POINTER(sensitive)); -+ g_list_foreach(self->priv->windows, set_usb_options_sensitive, -+ GINT_TO_POINTER(sensitive)); - } - - static VirtViewerWindow * - virt_viewer_app_get_nth_window(VirtViewerApp *self, gint nth) - { -- return g_hash_table_lookup(self->priv->windows, &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); -- -- win = virt_viewer_app_get_nth_window(self, nth); -- g_return_val_if_fail(win != NULL, FALSE); -- -- g_debug("Remove window %d %p", nth, win); -- g_object_ref(win); -- removed = g_hash_table_remove(self->priv->windows, &nth); -- g_warn_if_fail(removed); -- virt_viewer_app_update_menu_displays(self); -- -- if (removed) -- g_signal_emit(self, signals[SIGNAL_WINDOW_REMOVED], 0, win); -- -- g_object_unref(win); -- -- return removed; --} -- --static void --virt_viewer_app_set_nth_window(VirtViewerApp *self, gint nth, VirtViewerWindow *win) --{ -- gint *key; -- -- g_return_if_fail(virt_viewer_app_get_nth_window(self, nth) == NULL); -- key = g_malloc(sizeof(gint)); -- *key = nth; -- g_debug("Insert window %d %p", nth, win); -- g_hash_table_insert(self->priv->windows, key, win); -- virt_viewer_app_set_window_subtitle(self, win, nth); -- virt_viewer_app_update_menu_displays(self); -- if (self->priv->session) { -- virt_viewer_window_set_usb_options_sensitive(win, -- virt_viewer_session_get_has_usbredir(self->priv->session)); -+ GList *l; -+ for (l = self->priv->windows; l; l = l->next) { -+ VirtViewerDisplay *display = virt_viewer_window_get_display(l->data); -+ if (display -+ && (virt_viewer_display_get_nth(display) == nth)) { -+ return l->data; -+ } - } -- -- g_signal_emit(self, signals[SIGNAL_WINDOW_ADDED], 0, win); -+ return NULL; - } - - static void -@@ -862,7 +822,17 @@ virt_viewer_app_window_new(VirtViewerApp *self, gint nth) - virt_viewer_window_set_kiosk(window, self->priv->kiosk); - if (self->priv->main_window) - virt_viewer_window_set_zoom_level(window, virt_viewer_window_get_zoom_level(self->priv->main_window)); -- virt_viewer_app_set_nth_window(self, nth, window); -+ -+ self->priv->windows = g_list_append(self->priv->windows, window); -+ virt_viewer_app_set_window_subtitle(self, window, nth); -+ virt_viewer_app_update_menu_displays(self); -+ if (self->priv->session) { -+ virt_viewer_window_set_usb_options_sensitive(window, -+ virt_viewer_session_get_has_usbredir(self->priv->session)); -+ } -+ -+ g_signal_emit(self, signals[SIGNAL_WINDOW_ADDED], 0, window); -+ - if (self->priv->fullscreen) - app_window_try_fullscreen(self, window, - virt_viewer_app_get_initial_monitor_for_display(self, nth)); -@@ -947,24 +917,35 @@ virt_viewer_app_display_added(VirtViewerSession *session G_GNUC_UNUSED, - } - - -+static void virt_viewer_app_remove_nth_window(VirtViewerApp *self, -+ gint nth) -+{ -+ VirtViewerWindow *win = virt_viewer_app_get_nth_window(self, nth); -+ if (!win) -+ return; -+ -+ virt_viewer_window_set_display(win, NULL); -+ virt_viewer_window_hide(win); -+ -+ g_debug("Remove window %d %p", nth, win); -+ self->priv->windows = g_list_remove(self->priv->windows, win); -+ -+ g_signal_emit(self, signals[SIGNAL_WINDOW_REMOVED], 0, win); -+ -+ g_object_unref(win); -+} -+ - static void - virt_viewer_app_display_removed(VirtViewerSession *session G_GNUC_UNUSED, - VirtViewerDisplay *display, - VirtViewerApp *self) - { -- VirtViewerWindow *win = NULL; - gint nth; - -- gtk_widget_hide(GTK_WIDGET(display)); - g_object_get(display, "nth-display", &nth, NULL); -+ virt_viewer_app_remove_nth_window(self, nth); - g_hash_table_remove(self->priv->displays, GINT_TO_POINTER(nth)); -- win = virt_viewer_app_get_nth_window(self, nth); -- if (!win) -- return; -- -- virt_viewer_window_set_display(win, NULL); -- if (nth != 0) -- virt_viewer_app_remove_nth_window(self, nth); -+ virt_viewer_app_update_menu_displays(self); - } - - static void -@@ -1619,13 +1600,13 @@ virt_viewer_app_dispose (GObject *object) - VirtViewerAppPrivate *priv = self->priv; - - if (priv->windows) { -- GHashTable *tmp = priv->windows; -+ GList *tmp = priv->windows; - /* null-ify before unrefing, because we need - * to prevent callbacks using priv->windows - * while it is being disposed off. */ - priv->windows = NULL; - priv->main_window = NULL; -- g_hash_table_unref(tmp); -+ g_list_free_full(tmp, g_object_unref); - } - - if (priv->displays) { -@@ -1698,7 +1679,6 @@ virt_viewer_app_init (VirtViewerApp *self) - - self->priv = GET_PRIVATE(self); - self->priv->displays = g_hash_table_new_full(g_direct_hash, g_direct_equal, NULL, g_object_unref); -- self->priv->windows = g_hash_table_new_full(g_int_hash, g_int_equal, g_free, g_object_unref); - self->priv->config = g_key_file_new(); - self->priv->config_file = g_build_filename(g_get_user_config_dir(), - "virt-viewer", "settings", NULL); -@@ -2108,15 +2088,20 @@ typedef struct { - gboolean fullscreen; - } FullscreenOptions; - --static void fullscreen_cb(gpointer key, -- gpointer value, -+static void fullscreen_cb(gpointer value, - gpointer user_data) - { - FullscreenOptions *options = (FullscreenOptions *)user_data; -- gint nth = virt_viewer_app_get_initial_monitor_for_display(options->app, *(gint*)key); -+ gint nth = 0; - VirtViewerWindow *vwin = VIRT_VIEWER_WINDOW(value); -+ VirtViewerDisplay *display = virt_viewer_window_get_display(vwin); - -+ /* At startup, the main window will not yet have an associated display, so -+ * assume that it's the first display */ -+ if (display) -+ nth = virt_viewer_display_get_nth(display); - g_debug("fullscreen display %d: %d", nth, options->fullscreen); -+ - if (options->fullscreen) - app_window_try_fullscreen(options->app, vwin, nth); - else -@@ -2142,18 +2127,20 @@ virt_viewer_app_set_fullscreen(VirtViewerApp *self, gboolean fullscreen) - - /* we iterate unconditionnaly, even if it was set before to update new windows */ - priv->fullscreen = fullscreen; -- g_hash_table_foreach(priv->windows, fullscreen_cb, &options); -+ g_list_foreach(priv->windows, fullscreen_cb, &options); - - g_object_notify(G_OBJECT(self), "fullscreen"); - } - - static void - menu_display_visible_toggled_cb(GtkCheckMenuItem *checkmenuitem, -- VirtViewerWindow *vwin) -+ VirtViewerDisplay *display) - { -- VirtViewerApp *self; -+ VirtViewerApp *self = virt_viewer_session_get_app(virt_viewer_display_get_session(display)); - gboolean visible; - static gboolean reentering = FALSE; -+ VirtViewerWindow *vwin = virt_viewer_app_get_nth_window(self, -+ virt_viewer_display_get_nth(display)); - - if (reentering) /* do not reenter if I switch you back */ - return; -@@ -2170,12 +2157,12 @@ menu_display_visible_toggled_cb(GtkCheckMenuItem *checkmenuitem, - static gint - update_menu_displays_sort(gconstpointer a, gconstpointer b) - { -- const int *ai = a; -- const int *bi = b; -+ const int ai = GPOINTER_TO_INT(a); -+ const int bi = GPOINTER_TO_INT(b); - -- if (*ai > *bi) -+ if (ai > bi) - return 1; -- else if (*ai < *bi) -+ else if (ai < bi) - return -1; - else - return 0; -@@ -2212,13 +2199,12 @@ window_empty_display_submenu(VirtViewerWindow *window) - } - - static void --window_update_menu_displays_cb(gpointer key G_GNUC_UNUSED, -- gpointer value, -+window_update_menu_displays_cb(gpointer value, - gpointer user_data) - { - VirtViewerApp *self = VIRT_VIEWER_APP(user_data); - GtkMenuShell *submenu; -- GList *keys = g_hash_table_get_keys(self->priv->windows); -+ GList *keys = g_hash_table_get_keys(self->priv->displays); - GList *tmp; - - keys = g_list_sort(keys, update_menu_displays_sort); -@@ -2226,18 +2212,18 @@ window_update_menu_displays_cb(gpointer key G_GNUC_UNUSED, - - tmp = keys; - while (tmp) { -- int *nth = tmp->data; -- VirtViewerWindow *vwin = VIRT_VIEWER_WINDOW(g_hash_table_lookup(self->priv->windows, nth)); -- VirtViewerDisplay *display = virt_viewer_window_get_display(vwin); -+ int nth = GPOINTER_TO_INT(tmp->data); -+ VirtViewerWindow *vwin = virt_viewer_app_get_nth_window(self, nth); -+ VirtViewerDisplay *display = VIRT_VIEWER_DISPLAY(g_hash_table_lookup(self->priv->displays, tmp->data)); - GtkWidget *item; - gboolean visible, sensitive; - gchar *label; - -- label = g_strdup_printf(_("Display %d"), *nth + 1); -+ label = g_strdup_printf(_("Display %d"), nth + 1); - item = gtk_check_menu_item_new_with_label(label); - g_free(label); - -- visible = gtk_widget_get_visible(GTK_WIDGET(virt_viewer_window_get_window(vwin))); -+ visible = vwin && gtk_widget_get_visible(GTK_WIDGET(virt_viewer_window_get_window(vwin))); - gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(item), visible); - - sensitive = visible; -@@ -2253,7 +2239,7 @@ window_update_menu_displays_cb(gpointer key G_GNUC_UNUSED, - gtk_widget_set_sensitive(item, sensitive); - - g_signal_connect(G_OBJECT(item), -- "toggled", G_CALLBACK(menu_display_visible_toggled_cb), vwin); -+ "toggled", G_CALLBACK(menu_display_visible_toggled_cb), display); - gtk_menu_shell_append(submenu, item); - tmp = tmp->next; - } -@@ -2267,7 +2253,7 @@ virt_viewer_app_update_menu_displays(VirtViewerApp *self) - { - if (!self->priv->windows) - return; -- g_hash_table_foreach(self->priv->windows, window_update_menu_displays_cb, self); -+ g_list_foreach(self->priv->windows, window_update_menu_displays_cb, self); - } - - void -@@ -2327,8 +2313,7 @@ virt_viewer_app_get_main_window(VirtViewerApp *self) - } - - static void --show_status_cb(gpointer key G_GNUC_UNUSED, -- gpointer value, -+show_status_cb(gpointer value, - gpointer user_data) - { - VirtViewerNotebook *nb = virt_viewer_window_get_notebook(VIRT_VIEWER_WINDOW(value)); -@@ -2350,13 +2335,12 @@ virt_viewer_app_show_status(VirtViewerApp *self, const gchar *fmt, ...) - text = g_strdup_vprintf(fmt, args); - va_end(args); - -- g_hash_table_foreach(self->priv->windows, show_status_cb, text); -+ g_list_foreach(self->priv->windows, show_status_cb, text); - g_free(text); - } - - static void --show_display_cb(gpointer key G_GNUC_UNUSED, -- gpointer value, -+show_display_cb(gpointer value, - gpointer user_data G_GNUC_UNUSED) - { - VirtViewerNotebook *nb = virt_viewer_window_get_notebook(VIRT_VIEWER_WINDOW(value)); -@@ -2368,7 +2352,7 @@ void - virt_viewer_app_show_display(VirtViewerApp *self) - { - g_return_if_fail(VIRT_VIEWER_IS_APP(self)); -- g_hash_table_foreach(self->priv->windows, show_display_cb, self); -+ g_list_foreach(self->priv->windows, show_display_cb, self); - } - - gboolean -@@ -2387,7 +2371,7 @@ virt_viewer_app_get_session(VirtViewerApp *self) - return self->priv->session; - } - --GHashTable* -+GList* - virt_viewer_app_get_windows(VirtViewerApp *self) - { - g_return_val_if_fail(VIRT_VIEWER_IS_APP(self), NULL); -diff --git a/src/virt-viewer-app.h b/src/virt-viewer-app.h -index 804e076..2d2fec7 100644 ---- a/src/virt-viewer-app.h -+++ b/src/virt-viewer-app.h -@@ -94,7 +94,7 @@ void virt_viewer_app_set_connect_info(VirtViewerApp *self, - gboolean virt_viewer_app_window_set_visible(VirtViewerApp *self, VirtViewerWindow *window, gboolean visible); - void virt_viewer_app_show_status(VirtViewerApp *self, const gchar *fmt, ...); - void virt_viewer_app_show_display(VirtViewerApp *self); --GHashTable* virt_viewer_app_get_windows(VirtViewerApp *self); -+GList* virt_viewer_app_get_windows(VirtViewerApp *self); - gboolean virt_viewer_app_get_enable_accel(VirtViewerApp *self); - VirtViewerSession* virt_viewer_app_get_session(VirtViewerApp *self); - gboolean virt_viewer_app_get_fullscreen(VirtViewerApp *app); diff --git a/SOURCES/0074-Create-windows-on-demand-not-at-startup.patch b/SOURCES/0074-Create-windows-on-demand-not-at-startup.patch deleted file mode 100644 index d3d67cc..0000000 --- a/SOURCES/0074-Create-windows-on-demand-not-at-startup.patch +++ /dev/null @@ -1,212 +0,0 @@ -From a3274f16431bc6bdf1ab62f5621b685d2e128888 Mon Sep 17 00:00:00 2001 -From: Jonathon Jongsma -Date: Thu, 21 Aug 2014 15:59:31 -0500 -Subject: [PATCH] Create windows on demand, not at startup - -Previously, a window was created at startup for each display, even if -the display was not enabled. This resulted in a fixed 1:1 association -between windows and remote displays. Since there was always one window -created at startup to display status messages (the "main window"), this -was always associated with remote display #1. But if the first remote -display was not enabled, we ended up with a extra black window with a -message saying ("Waiting for display 1..."). - -By creating windows on demand, we can re-use the "main window" for any -arbitrary display, even if it's not display #1. - -Resolves: rhbz#1032939 -(cherry picked from commit f03285ba8da4a40a8058c3259788293124cc2803) - -Conflicts: - src/virt-viewer-app.c ---- - src/virt-viewer-app.c | 117 ++++++++++++++++++++++++++++++-------------------- - 1 file changed, 70 insertions(+), 47 deletions(-) - -diff --git a/src/virt-viewer-app.c b/src/virt-viewer-app.c -index 0be0aeb..837f636 100644 ---- a/src/virt-viewer-app.c -+++ b/src/virt-viewer-app.c -@@ -845,39 +845,78 @@ virt_viewer_app_window_new(VirtViewerApp *self, gint nth) - return window; - } - -+static VirtViewerWindow * -+ensure_window_for_display(VirtViewerApp *self, VirtViewerDisplay *display) -+{ -+ gint nth = virt_viewer_display_get_nth(display); -+ VirtViewerWindow *win = virt_viewer_app_get_nth_window(self, nth); -+ if (win == NULL) { -+ GList *l = self->priv->windows; -+ -+ /* There should always be at least a main window created at startup */ -+ g_return_val_if_fail(l != NULL, NULL); -+ /* if there's a window that doesn't yet have an associated display, use -+ * that window */ -+ for (; l; l = l->next) { -+ if (virt_viewer_window_get_display(VIRT_VIEWER_WINDOW(l->data)) == NULL) -+ break; -+ } -+ if (l && virt_viewer_window_get_display(VIRT_VIEWER_WINDOW(l->data)) == NULL) { -+ win = VIRT_VIEWER_WINDOW(l->data); -+ g_debug("Found a window without a display, reusing for this display..."); -+ virt_viewer_app_set_window_subtitle(self, win, nth); -+ if (self->priv->fullscreen && !self->priv->kiosk) -+ app_window_try_fullscreen(self, win, -+ virt_viewer_app_get_initial_monitor_for_display(self, nth)); -+ } else { -+ win = virt_viewer_app_window_new(self, nth); -+ } -+ -+ virt_viewer_window_set_display(win, display); -+ } -+ -+ return win; -+} -+ - static void - display_show_hint(VirtViewerDisplay *display, - GParamSpec *pspec G_GNUC_UNUSED, -- VirtViewerWindow *win) -+ gpointer user_data G_GNUC_UNUSED) - { -- VirtViewerApp *self; -- VirtViewerNotebook *nb = virt_viewer_window_get_notebook(win); -+ VirtViewerApp *self = virt_viewer_session_get_app(virt_viewer_display_get_session(display)); -+ VirtViewerNotebook *nb; -+ VirtViewerWindow *win; - gint nth; - guint hint; - -- g_object_get(win, -- "app", &self, -- NULL); - g_object_get(display, - "nth-display", &nth, - "show-hint", &hint, - NULL); - -+ win = virt_viewer_app_get_nth_window(self, nth); -+ - if (self->priv->fullscreen && - nth >= gdk_screen_get_n_monitors(gdk_screen_get_default())) { -- virt_viewer_window_hide(win); -+ if (win) -+ virt_viewer_window_hide(win); - } else if (hint & VIRT_VIEWER_DISPLAY_SHOW_HINT_DISABLED) { -- virt_viewer_window_hide(win); -- } else if (hint & VIRT_VIEWER_DISPLAY_SHOW_HINT_READY) { -- virt_viewer_notebook_show_display(nb); -- virt_viewer_window_show(win); -+ if (win) -+ virt_viewer_window_hide(win); - } else { -- if (!self->priv->kiosk) -- virt_viewer_notebook_show_status(nb, _("Waiting for display %d..."), nth + 1); -+ if (hint & VIRT_VIEWER_DISPLAY_SHOW_HINT_READY) { -+ win = ensure_window_for_display(self, display); -+ nb = virt_viewer_window_get_notebook(win); -+ virt_viewer_notebook_show_display(nb); -+ virt_viewer_window_show(win); -+ } else { -+ if (!self->priv->kiosk && win) { -+ nb = virt_viewer_window_get_notebook(win); -+ virt_viewer_notebook_show_status(nb, _("Waiting for display %d..."), nth + 1); -+ } -+ } - } - virt_viewer_app_update_menu_displays(self); -- -- g_object_unref(self); - } - - static void -@@ -885,8 +924,6 @@ virt_viewer_app_display_added(VirtViewerSession *session G_GNUC_UNUSED, - VirtViewerDisplay *display, - VirtViewerApp *self) - { -- VirtViewerAppPrivate *priv = self->priv; -- VirtViewerWindow *window; - gint nth; - - g_object_get(display, "nth-display", &nth, NULL); -@@ -894,25 +931,8 @@ virt_viewer_app_display_added(VirtViewerSession *session G_GNUC_UNUSED, - g_debug("Insert display %d %p", nth, display); - g_hash_table_insert(self->priv->displays, GINT_TO_POINTER(nth), g_object_ref(display)); - -- if (nth == 0) { -- window = priv->main_window; -- } else { -- window = virt_viewer_app_get_nth_window(self, nth); -- if (window == NULL) { -- if (priv->kiosk) { -- /* don't show extra monitors that don't fit on client */ -- g_debug("kiosk mode: skip extra monitors that don't fit on client"); -- return; -- } -- -- window = virt_viewer_app_window_new(self, nth); -- } -- } -- -- virt_viewer_window_set_display(window, display); -- virt_viewer_app_update_menu_displays(self); -- virt_viewer_signal_connect_object(display, "notify::show-hint", -- G_CALLBACK(display_show_hint), window, 0); -+ g_signal_connect(display, "notify::show-hint", -+ G_CALLBACK(display_show_hint), NULL); - g_object_notify(G_OBJECT(display), "show-hint"); /* call display_show_hint */ - } - -@@ -1463,16 +1483,20 @@ static void - virt_viewer_app_set_kiosk(VirtViewerApp *self, gboolean enabled) - { - int i; -+ GList *l; - - self->priv->kiosk = enabled; - if (enabled) - virt_viewer_app_set_fullscreen(self, enabled); - -- for (i = 0; i < gdk_screen_get_n_monitors(gdk_screen_get_default()); i++) { -- VirtViewerWindow *win = virt_viewer_app_get_nth_window(self, i); -+ /* create windows for each client monitor */ -+ for (i = g_list_length(self->priv->windows); -+ i < gdk_screen_get_n_monitors(gdk_screen_get_default()); i++) { -+ virt_viewer_app_window_new(self, i); -+ } - -- if (win == NULL) -- win = virt_viewer_app_window_new(self, i); -+ for (l = self->priv->windows; l != NULL; l = l ->next) { -+ VirtViewerWindow *win = l->data; - - if (enabled) - virt_viewer_window_show(win); -@@ -2137,20 +2161,19 @@ menu_display_visible_toggled_cb(GtkCheckMenuItem *checkmenuitem, - VirtViewerDisplay *display) - { - VirtViewerApp *self = virt_viewer_session_get_app(virt_viewer_display_get_session(display)); -- gboolean visible; -+ gboolean visible = gtk_check_menu_item_get_active(checkmenuitem); - static gboolean reentering = FALSE; -- VirtViewerWindow *vwin = virt_viewer_app_get_nth_window(self, -- virt_viewer_display_get_nth(display)); -+ VirtViewerWindow *vwin; - - if (reentering) /* do not reenter if I switch you back */ - return; - - reentering = TRUE; -- g_object_get(vwin, "app", &self, NULL); -- visible = virt_viewer_app_window_set_visible(self, vwin, -- gtk_check_menu_item_get_active(checkmenuitem)); -+ -+ vwin = ensure_window_for_display(self, display); -+ visible = virt_viewer_app_window_set_visible(self, vwin, visible); -+ - gtk_check_menu_item_set_active(checkmenuitem, /* will be toggled again */ !visible); -- g_object_unref(self); - reentering = FALSE; - } - diff --git a/SOURCES/0075-Use-socat-instead-of-nc-if-possible.patch b/SOURCES/0075-Use-socat-instead-of-nc-if-possible.patch deleted file mode 100644 index 1163bee..0000000 --- a/SOURCES/0075-Use-socat-instead-of-nc-if-possible.patch +++ /dev/null @@ -1,70 +0,0 @@ -From 692a0295fe82a68c5b11b4d9f588b22b0008ebeb Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= -Date: Mon, 8 Sep 2014 23:14:23 +0200 -Subject: [PATCH] Use socat instead of nc if possible - -It turns out that nc does not leave on server disconnect, and there -doesn't seem to be any option to do that, leaving client open, and -a bunch of idle processes. - -Replacing nc with socat solves that, client is disconnected when -the VM is shut down, when the sever connection is closed. - -https://bugzilla.redhat.com/show_bug.cgi?id=1030487 -(cherry picked from commit 3eaecbb3a4d069cde18cb0ad1e93735e0b73ef72) ---- - src/virt-viewer-app.c | 32 +++++++++++++++++++++++--------- - 1 file changed, 23 insertions(+), 9 deletions(-) - -diff --git a/src/virt-viewer-app.c b/src/virt-viewer-app.c -index 837f636..1abcc90 100644 ---- a/src/virt-viewer-app.c -+++ b/src/virt-viewer-app.c -@@ -622,6 +622,7 @@ virt_viewer_app_open_tunnel_ssh(const char *sshhost, - const char *cmd[10]; - char portstr[50]; - int n = 0; -+ GString *cat; - - cmd[n++] = "ssh"; - if (sshport) { -@@ -634,17 +635,30 @@ virt_viewer_app_open_tunnel_ssh(const char *sshhost, - cmd[n++] = sshuser; - } - cmd[n++] = sshhost; -- cmd[n++] = "nc"; -- if (port) { -- cmd[n++] = host; -- cmd[n++] = port; -- } else { -- cmd[n++] = "-U"; -- cmd[n++] = unixsock; -- } -+ -+ cat = g_string_new("if (command -v socat) >/dev/null 2>&1"); -+ -+ g_string_append(cat, "; then socat - "); -+ if (port) -+ g_string_append_printf(cat, "TCP:%s:%s", host, port); -+ else -+ g_string_append_printf(cat, "UNIX-CONNECT:%s", unixsock); -+ -+ g_string_append(cat, "; else nc "); -+ if (port) -+ g_string_append_printf(cat, "%s %s", host, port); -+ else -+ g_string_append_printf(cat, "-U %s", unixsock); -+ -+ g_string_append(cat, "; fi"); -+ -+ cmd[n++] = cat->str; - cmd[n++] = NULL; - -- return virt_viewer_app_open_tunnel(cmd); -+ n = virt_viewer_app_open_tunnel(cmd); -+ g_string_free(cat, TRUE); -+ -+ return n; - } - - static int diff --git a/SOURCES/0076-spice-do-not-open-in-fullscreen-with-CONTROLLER_AUTO.patch b/SOURCES/0076-spice-do-not-open-in-fullscreen-with-CONTROLLER_AUTO.patch deleted file mode 100644 index 3e702b4..0000000 --- a/SOURCES/0076-spice-do-not-open-in-fullscreen-with-CONTROLLER_AUTO.patch +++ /dev/null @@ -1,26 +0,0 @@ -From 16beefaf0b2892029fd067093fa498843d84ab0a Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= -Date: Wed, 26 Feb 2014 11:55:50 +0100 -Subject: [PATCH] spice: do not open in fullscreen with - CONTROLLER_AUTO_DISPLAY_RES - -This flag is always set when using the rhevm user portal. Best is -probably to ignore it, now that fullscreen has simplified unique -behaviour. ---- - src/remote-viewer.c | 2 +- - 1 file changed, 1 insertion(+), 1 deletion(-) - -diff --git a/src/remote-viewer.c b/src/remote-viewer.c -index 0c6067c..2cb8925 100644 ---- a/src/remote-viewer.c -+++ b/src/remote-viewer.c -@@ -561,7 +561,7 @@ spice_ctrl_notified(SpiceCtrlController *ctrl, - virt_viewer_app_set_title(app, g_value_get_string(&value)); - } else if (g_str_equal(pspec->name, "display-flags")) { - guint flags = g_value_get_uint(&value); -- gboolean fullscreen = !!(flags & (CONTROLLER_SET_FULL_SCREEN | CONTROLLER_AUTO_DISPLAY_RES)); -+ gboolean fullscreen = !!(flags & CONTROLLER_SET_FULL_SCREEN); - g_object_set(G_OBJECT(self), "fullscreen", fullscreen, NULL); - } else if (g_str_equal(pspec->name, "menu")) { - spice_ctrl_menu_updated(self); diff --git a/SOURCES/0077-Set-initial-window-size-to-display-desktop-size.patch b/SOURCES/0077-Set-initial-window-size-to-display-desktop-size.patch deleted file mode 100644 index 6bdab4c..0000000 --- a/SOURCES/0077-Set-initial-window-size-to-display-desktop-size.patch +++ /dev/null @@ -1,30 +0,0 @@ -From 6df976eb6a078ea81b32c218b8c4fec1faf7c02e Mon Sep 17 00:00:00 2001 -From: Jonathon Jongsma -Date: Tue, 2 Sep 2014 16:45:00 -0500 -Subject: [PATCH] Set initial window size to display desktop size - -When setting the 'display' for a VirtViewerWindow, the initial size for -that window should be the size of the remote display. So we synthesize a -desktop resize event when setting a new display for a window. This is -only done for enabled displays. Disabled displays generally have a size -of 0x0, which would result in the window being at it's minimum size, so -just allow the window to use its default size. - -(cherry picked from commit 29c8cadd4037681e8eb417fd8a0bb6cc6170a6b3) ---- - src/virt-viewer-window.c | 2 ++ - 1 file changed, 2 insertions(+) - -diff --git a/src/virt-viewer-window.c b/src/virt-viewer-window.c -index 8dbf5a5..7182c2f 100644 ---- a/src/virt-viewer-window.c -+++ b/src/virt-viewer-window.c -@@ -1327,6 +1327,8 @@ virt_viewer_window_set_display(VirtViewerWindow *self, VirtViewerDisplay *displa - G_CALLBACK(virt_viewer_window_desktop_resize), self, 0); - virt_viewer_signal_connect_object(display, "notify::show-hint", - G_CALLBACK(display_show_hint), self, 0); -+ if (virt_viewer_display_get_enabled(display)) -+ virt_viewer_window_desktop_resize(display, self); - } - } - diff --git a/SOURCES/0078-Make-default-window-size-a-bit-more-useful.patch b/SOURCES/0078-Make-default-window-size-a-bit-more-useful.patch deleted file mode 100644 index 004dbd5..0000000 --- a/SOURCES/0078-Make-default-window-size-a-bit-more-useful.patch +++ /dev/null @@ -1,31 +0,0 @@ -From 13701ea3777df7febd2f5f2bee33e1b2c16f85df Mon Sep 17 00:00:00 2001 -From: Jonathon Jongsma -Date: Wed, 3 Sep 2014 13:54:47 -0500 -Subject: [PATCH] Make default window size a bit more useful - -Currently, windows have a default size of 400x400 pixels. This is a -strange aspect ratio for a display, and it is also too small to be -useful for much. Since the default window size determines the initial -size of newly-enabled displays, it would be nice if we used a slightly -better size. - -(cherry picked from commit a15bbac32001d8fb9eea5e6149df2aa2231f1a4f) ---- - src/virt-viewer.xml | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -diff --git a/src/virt-viewer.xml b/src/virt-viewer.xml -index d489653..849fc7d 100644 ---- a/src/virt-viewer.xml -+++ b/src/virt-viewer.xml -@@ -4,8 +4,8 @@ - - - False -- 400 -- 400 -+ 1024 -+ 768 - - - diff --git a/SOURCES/0079-Force-display_show_hint-when-the-display-is-set.patch b/SOURCES/0079-Force-display_show_hint-when-the-display-is-set.patch deleted file mode 100644 index 255c789..0000000 --- a/SOURCES/0079-Force-display_show_hint-when-the-display-is-set.patch +++ /dev/null @@ -1,34 +0,0 @@ -From 9869dc23a842efa97fa9dcf71a13dfa33e1accc1 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Fabiano=20Fid=C3=AAncio?= -Date: Tue, 14 Oct 2014 16:47:03 +0200 -Subject: [PATCH] Force display_show_hint() when the display is set - -Since a window is not created at startup for each display, the first -display(s) set when the application is opened will never receive and -treat the "notify::show-hint" signal on VirtViewerWindow, once the -callback is only set when the display is set to the specific window. -It causes problems like the "Send Key" menu not activated till an extra -display is added. To avoid this problem, let's force a call to -display_show_hint() everytime a display is set. - -Resolves: rhbz#1152468 -https://bugzilla.redhat.com/show_bug.cgi?id=1152468 -(cherry picked from commit 910ee34248d98bd9f328c3f3e92120d49f55dedc) ---- - src/virt-viewer-window.c | 3 +++ - 1 file changed, 3 insertions(+) - -diff --git a/src/virt-viewer-window.c b/src/virt-viewer-window.c -index 7182c2f..4cda1e0 100644 ---- a/src/virt-viewer-window.c -+++ b/src/virt-viewer-window.c -@@ -1327,6 +1327,9 @@ virt_viewer_window_set_display(VirtViewerWindow *self, VirtViewerDisplay *displa - G_CALLBACK(virt_viewer_window_desktop_resize), self, 0); - virt_viewer_signal_connect_object(display, "notify::show-hint", - G_CALLBACK(display_show_hint), self, 0); -+ -+ display_show_hint(display, NULL, self); -+ - if (virt_viewer_display_get_enabled(display)) - virt_viewer_window_desktop_resize(display, self); - } diff --git a/SOURCES/0080-Fix-bug-with-initial-placement-of-fullscreen-windows.patch b/SOURCES/0080-Fix-bug-with-initial-placement-of-fullscreen-windows.patch deleted file mode 100644 index a1ffe9c..0000000 --- a/SOURCES/0080-Fix-bug-with-initial-placement-of-fullscreen-windows.patch +++ /dev/null @@ -1,31 +0,0 @@ -From 912d62f4b706db37a8b023ca2e06a24fb0ac97e5 Mon Sep 17 00:00:00 2001 -From: Jonathon Jongsma -Date: Thu, 9 Oct 2014 11:21:07 -0500 -Subject: [PATCH] Fix bug with initial placement of fullscreen windows - -The function app_window_try_fullscreen() will lookup the initial monitor -for the nth monitor internally, so we should pass in the display ID to the function -rather than the mapped monitor ID. This was causing 2 monitors on the -same monitor with a configuration like this: - - monitor-mapping=1:2;2:1 - -(cherry picked from commit c64a3c8f707fcbb45c21cb6b4f5fc0b799ca6df5) ---- - src/virt-viewer-app.c | 3 +-- - 1 file changed, 1 insertion(+), 2 deletions(-) - -diff --git a/src/virt-viewer-app.c b/src/virt-viewer-app.c -index 1abcc90..6dbe4bb 100644 ---- a/src/virt-viewer-app.c -+++ b/src/virt-viewer-app.c -@@ -880,8 +880,7 @@ ensure_window_for_display(VirtViewerApp *self, VirtViewerDisplay *display) - g_debug("Found a window without a display, reusing for this display..."); - virt_viewer_app_set_window_subtitle(self, win, nth); - if (self->priv->fullscreen && !self->priv->kiosk) -- app_window_try_fullscreen(self, win, -- virt_viewer_app_get_initial_monitor_for_display(self, nth)); -+ app_window_try_fullscreen(self, win, nth); - } else { - win = virt_viewer_app_window_new(self, nth); - } diff --git a/SOURCES/0081-Don-t-disable-send-key-menu-when-display-isn-t-ready.patch b/SOURCES/0081-Don-t-disable-send-key-menu-when-display-isn-t-ready.patch deleted file mode 100644 index e5b6a3f..0000000 --- a/SOURCES/0081-Don-t-disable-send-key-menu-when-display-isn-t-ready.patch +++ /dev/null @@ -1,48 +0,0 @@ -From ac763b6423d5e14729a48e236e5f7c7261e2d1a2 Mon Sep 17 00:00:00 2001 -From: Jonathon Jongsma -Date: Thu, 16 Oct 2014 09:07:58 -0500 -Subject: [PATCH] Don't disable "send key" menu when display isn't ready - -The ability to send a keystroke should not depend on whether a display -is ready or not, it only depends on whether the display exists or not. - -See https://bugzilla.redhat.com/show_bug.cgi?id=1152574 - -(cherry picked from commit 65560fa4664e0cee5a0c7f76065a9418f06bbd86) ---- - src/virt-viewer-window.c | 7 ++++--- - 1 file changed, 4 insertions(+), 3 deletions(-) - -diff --git a/src/virt-viewer-window.c b/src/virt-viewer-window.c -index 4cda1e0..3ee25e6 100644 ---- a/src/virt-viewer-window.c -+++ b/src/virt-viewer-window.c -@@ -206,7 +206,7 @@ rebuild_combo_menu(GObject *gobject G_GNUC_UNUSED, - menu = GTK_WIDGET(gtk_builder_get_object(self->priv->builder, "menu-send")); - gtk_menu_item_set_submenu(GTK_MENU_ITEM(menu), - GTK_WIDGET(virt_viewer_window_get_keycombo_menu(self))); -- gtk_widget_set_sensitive(menu, FALSE); -+ gtk_widget_set_sensitive(menu, (self->priv->display != NULL)); - } - - static void -@@ -1268,9 +1268,7 @@ display_show_hint(VirtViewerDisplay *display, - - hint = (hint & VIRT_VIEWER_DISPLAY_SHOW_HINT_READY); - -- gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(self->priv->builder, "menu-send")), hint); - gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(self->priv->builder, "menu-file-screenshot")), hint); -- gtk_widget_set_sensitive(self->priv->toolbar_send_key, hint); - } - static gboolean - window_key_pressed (GtkWidget *widget G_GNUC_UNUSED, -@@ -1332,6 +1330,9 @@ virt_viewer_window_set_display(VirtViewerWindow *self, VirtViewerDisplay *displa - - if (virt_viewer_display_get_enabled(display)) - virt_viewer_window_desktop_resize(display, self); -+ -+ gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(self->priv->builder, "menu-send")), TRUE); -+ gtk_widget_set_sensitive(self->priv->toolbar_send_key, TRUE); - } - } - diff --git a/SOURCES/0082-VirtViewerDisplayVnc-set-session-property.patch b/SOURCES/0082-VirtViewerDisplayVnc-set-session-property.patch deleted file mode 100644 index 680863a..0000000 --- a/SOURCES/0082-VirtViewerDisplayVnc-set-session-property.patch +++ /dev/null @@ -1,78 +0,0 @@ -From 98a8729326c132b906a5c38e9f9f3d97b9b77691 Mon Sep 17 00:00:00 2001 -From: Jonathon Jongsma -Date: Wed, 3 Sep 2014 16:59:05 -0500 -Subject: [PATCH] VirtViewerDisplayVnc: set 'session' property - -Set the display's session property in the constructor. If the session is -not set, then virt_viewer_display_get_session() doesn't return anything -useful. - -(cherry picked from commit 804564e2460011dfbf3f195aa8931b15d98f8824) ---- - src/virt-viewer-display-vnc.c | 5 +++-- - src/virt-viewer-display-vnc.h | 3 ++- - src/virt-viewer-session-vnc.c | 4 ++-- - 3 files changed, 7 insertions(+), 5 deletions(-) - -diff --git a/src/virt-viewer-display-vnc.c b/src/virt-viewer-display-vnc.c -index 2222158..8a9564a 100644 ---- a/src/virt-viewer-display-vnc.c -+++ b/src/virt-viewer-display-vnc.c -@@ -157,11 +157,12 @@ virt_viewer_display_vnc_resize_desktop(VncDisplay *vnc G_GNUC_UNUSED, - - - GtkWidget * --virt_viewer_display_vnc_new(VncDisplay *vnc) -+virt_viewer_display_vnc_new(VirtViewerSessionVnc *session, -+ VncDisplay *vnc) - { - VirtViewerDisplayVnc *display; - -- display = g_object_new(VIRT_VIEWER_TYPE_DISPLAY_VNC, NULL); -+ display = g_object_new(VIRT_VIEWER_TYPE_DISPLAY_VNC, "session", session, NULL); - - g_object_ref(vnc); - display->priv->vnc = vnc; -diff --git a/src/virt-viewer-display-vnc.h b/src/virt-viewer-display-vnc.h -index 7020437..0b50563 100644 ---- a/src/virt-viewer-display-vnc.h -+++ b/src/virt-viewer-display-vnc.h -@@ -28,6 +28,7 @@ - #include - - #include "virt-viewer-display.h" -+#include "virt-viewer-session-vnc.h" - - G_BEGIN_DECLS - -@@ -64,7 +65,7 @@ struct _VirtViewerDisplayVncClass { - - GType virt_viewer_display_vnc_get_type(void); - --GtkWidget* virt_viewer_display_vnc_new(VncDisplay *display); -+GtkWidget* virt_viewer_display_vnc_new(VirtViewerSessionVnc *session, VncDisplay *display); - - G_END_DECLS - -diff --git a/src/virt-viewer-session-vnc.c b/src/virt-viewer-session-vnc.c -index e4a6c93..1e82fbb 100644 ---- a/src/virt-viewer-session-vnc.c -+++ b/src/virt-viewer-session-vnc.c -@@ -98,7 +98,7 @@ static void - virt_viewer_session_vnc_connected(VncDisplay *vnc G_GNUC_UNUSED, - VirtViewerSessionVnc *session) - { -- GtkWidget *display = virt_viewer_display_vnc_new(session->priv->vnc); -+ GtkWidget *display = virt_viewer_display_vnc_new(session, session->priv->vnc); - g_signal_emit_by_name(session, "session-connected"); - virt_viewer_display_set_show_hint(VIRT_VIEWER_DISPLAY(display), - VIRT_VIEWER_DISPLAY_SHOW_HINT_READY, TRUE); -@@ -113,7 +113,7 @@ virt_viewer_session_vnc_disconnected(VncDisplay *vnc G_GNUC_UNUSED, - GtkWidget *display; - - virt_viewer_session_clear_displays(VIRT_VIEWER_SESSION(session)); -- display = virt_viewer_display_vnc_new(session->priv->vnc); -+ display = virt_viewer_display_vnc_new(session, session->priv->vnc); - g_debug("Disconnected"); - g_signal_emit_by_name(session, "session-disconnected", NULL); - virt_viewer_display_set_show_hint(VIRT_VIEWER_DISPLAY(display), diff --git a/SOURCES/0083-Revert-Fix-bug-with-initial-placement-of-fullscreen-.patch b/SOURCES/0083-Revert-Fix-bug-with-initial-placement-of-fullscreen-.patch deleted file mode 100644 index 19ae0ae..0000000 --- a/SOURCES/0083-Revert-Fix-bug-with-initial-placement-of-fullscreen-.patch +++ /dev/null @@ -1,24 +0,0 @@ -From ea9a07c37739d94df2ffcdb46a20a03297dd61c0 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Fabiano=20Fid=C3=AAncio?= -Date: Thu, 23 Oct 2014 15:03:27 +0200 -Subject: [PATCH] Revert "Fix bug with initial placement of fullscreen windows" - -This reverts commit 912d62f4b706db37a8b023ca2e06a24fb0ac97e5. ---- - src/virt-viewer-app.c | 3 ++- - 1 file changed, 2 insertions(+), 1 deletion(-) - -diff --git a/src/virt-viewer-app.c b/src/virt-viewer-app.c -index 6dbe4bb..1abcc90 100644 ---- a/src/virt-viewer-app.c -+++ b/src/virt-viewer-app.c -@@ -880,7 +880,8 @@ ensure_window_for_display(VirtViewerApp *self, VirtViewerDisplay *display) - g_debug("Found a window without a display, reusing for this display..."); - virt_viewer_app_set_window_subtitle(self, win, nth); - if (self->priv->fullscreen && !self->priv->kiosk) -- app_window_try_fullscreen(self, win, nth); -+ app_window_try_fullscreen(self, win, -+ virt_viewer_app_get_initial_monitor_for_display(self, nth)); - } else { - win = virt_viewer_app_window_new(self, nth); - } diff --git a/SOURCES/0084-Move-vnc-specific-auth-logic-to-VirtViewerSessionVnc.patch b/SOURCES/0084-Move-vnc-specific-auth-logic-to-VirtViewerSessionVnc.patch deleted file mode 100644 index a5fbe99..0000000 --- a/SOURCES/0084-Move-vnc-specific-auth-logic-to-VirtViewerSessionVnc.patch +++ /dev/null @@ -1,247 +0,0 @@ -From 25ef080ac79f31002259a050944079bb9672f5ea Mon Sep 17 00:00:00 2001 -From: Jonathon Jongsma -Date: Fri, 31 Jan 2014 11:31:33 -0600 -Subject: [PATCH] Move vnc-specific auth logic to VirtViewerSessionVnc - -Conflicts: - src/virt-viewer-auth.c -(cherry picked from commit dce19b379ad65a0d0edef6dfce19f1177eb082c6) ---- - src/virt-viewer-auth.c | 97 ------------------------------------------- - src/virt-viewer-auth.h | 6 --- - src/virt-viewer-session-vnc.c | 92 +++++++++++++++++++++++++++++++++++++--- - 3 files changed, 86 insertions(+), 109 deletions(-) - -diff --git a/src/virt-viewer-auth.c b/src/virt-viewer-auth.c -index bb03516..a796619 100644 ---- a/src/virt-viewer-auth.c -+++ b/src/virt-viewer-auth.c -@@ -105,103 +105,6 @@ virt_viewer_auth_collect_credentials(GtkWindow *window, - return response == GTK_RESPONSE_OK ? 0 : -1; - } - --#ifdef HAVE_GTK_VNC --void --virt_viewer_auth_vnc_credentials(VirtViewerSession *session, -- GtkWindow *window, -- GtkWidget *vnc, -- GValueArray *credList, -- char *vncAddress) --{ -- char *username = NULL, *password = NULL; -- gboolean wantPassword = FALSE, wantUsername = FALSE; -- int i; -- -- g_debug("Got VNC credential request for %d credential(s)", credList->n_values); -- -- for (i = 0 ; i < credList->n_values ; i++) { -- GValue *cred = g_value_array_get_nth(credList, i); -- switch (g_value_get_enum(cred)) { -- case VNC_DISPLAY_CREDENTIAL_USERNAME: -- wantUsername = TRUE; -- break; -- case VNC_DISPLAY_CREDENTIAL_PASSWORD: -- wantPassword = TRUE; -- break; -- case VNC_DISPLAY_CREDENTIAL_CLIENTNAME: -- break; -- default: -- g_debug("Unsupported credential type %d", g_value_get_enum(cred)); -- vnc_display_close(VNC_DISPLAY(vnc)); -- goto cleanup; -- } -- } -- -- VirtViewerFile *file = virt_viewer_session_get_file(session); -- if (file != NULL) { -- if (wantUsername && virt_viewer_file_is_set(file, "username")) { -- username = virt_viewer_file_get_username(file); -- wantUsername = FALSE; -- } -- if (wantPassword && virt_viewer_file_is_set(file, "password")) { -- password = virt_viewer_file_get_password(file); -- wantPassword = FALSE; -- } -- } -- -- if (wantUsername || wantPassword) { -- int ret = virt_viewer_auth_collect_credentials(window, -- "VNC", vncAddress, -- wantUsername ? &username : NULL, -- wantPassword ? &password : NULL); -- -- if (ret < 0) { -- vnc_display_close(VNC_DISPLAY(vnc)); -- goto cleanup; -- } -- } -- -- for (i = 0 ; i < credList->n_values ; i++) { -- GValue *cred = g_value_array_get_nth(credList, i); -- switch (g_value_get_enum(cred)) { -- case VNC_DISPLAY_CREDENTIAL_USERNAME: -- if (!username || -- vnc_display_set_credential(VNC_DISPLAY(vnc), -- g_value_get_enum(cred), -- username)) { -- g_debug("Failed to set credential type %d", g_value_get_enum(cred)); -- vnc_display_close(VNC_DISPLAY(vnc)); -- } -- break; -- case VNC_DISPLAY_CREDENTIAL_PASSWORD: -- if (!password || -- vnc_display_set_credential(VNC_DISPLAY(vnc), -- g_value_get_enum(cred), -- password)) { -- g_debug("Failed to set credential type %d", g_value_get_enum(cred)); -- vnc_display_close(VNC_DISPLAY(vnc)); -- } -- break; -- case VNC_DISPLAY_CREDENTIAL_CLIENTNAME: -- if (vnc_display_set_credential(VNC_DISPLAY(vnc), -- g_value_get_enum(cred), -- "libvirt")) { -- g_debug("Failed to set credential type %d", g_value_get_enum(cred)); -- vnc_display_close(VNC_DISPLAY(vnc)); -- } -- break; -- default: -- g_debug("Unsupported credential type %d", g_value_get_enum(cred)); -- vnc_display_close(VNC_DISPLAY(vnc)); -- } -- } -- -- cleanup: -- g_free(username); -- g_free(password); --} --#endif -- - /* - * Local variables: - * c-indent-level: 4 -diff --git a/src/virt-viewer-auth.h b/src/virt-viewer-auth.h -index 1f102e0..ad932c5 100644 ---- a/src/virt-viewer-auth.h -+++ b/src/virt-viewer-auth.h -@@ -32,12 +32,6 @@ - #include "virt-viewer-session.h" - #include "virt-viewer-util.h" - --void virt_viewer_auth_vnc_credentials(VirtViewerSession *session, -- GtkWindow *window, -- GtkWidget *vnc, -- GValueArray *credList, -- char *vncAddress); -- - int virt_viewer_auth_collect_credentials(GtkWindow *window, - const char *type, - const char *address, -diff --git a/src/virt-viewer-session-vnc.c b/src/virt-viewer-session-vnc.c -index 1e82fbb..3f4c90d 100644 ---- a/src/virt-viewer-session-vnc.c -+++ b/src/virt-viewer-session-vnc.c -@@ -254,17 +254,97 @@ virt_viewer_session_vnc_open_uri(VirtViewerSession* session, - - - static void --virt_viewer_session_vnc_auth_credential(GtkWidget *src, -+virt_viewer_session_vnc_auth_credential(GtkWidget *src G_GNUC_UNUSED, - GValueArray *credList, - VirtViewerSession *session) - { - VirtViewerSessionVnc *self = VIRT_VIEWER_SESSION_VNC(session); -+ char *username = NULL, *password = NULL; -+ gboolean wantPassword = FALSE, wantUsername = FALSE; -+ int i; -+ -+ g_debug("Got VNC credential request for %d credential(s)", credList->n_values); -+ -+ for (i = 0 ; i < credList->n_values ; i++) { -+ GValue *cred = g_value_array_get_nth(credList, i); -+ switch (g_value_get_enum(cred)) { -+ case VNC_DISPLAY_CREDENTIAL_USERNAME: -+ wantUsername = TRUE; -+ break; -+ case VNC_DISPLAY_CREDENTIAL_PASSWORD: -+ wantPassword = TRUE; -+ break; -+ case VNC_DISPLAY_CREDENTIAL_CLIENTNAME: -+ break; -+ default: -+ g_debug("Unsupported credential type %d", g_value_get_enum(cred)); -+ vnc_display_close(self->priv->vnc); -+ goto cleanup; -+ } -+ } -+ -+ VirtViewerFile *file = virt_viewer_session_get_file(VIRT_VIEWER_SESSION(self)); -+ if (file != NULL) { -+ if (wantUsername && virt_viewer_file_is_set(file, "username")) { -+ username = virt_viewer_file_get_username(file); -+ wantUsername = FALSE; -+ } -+ if (wantPassword && virt_viewer_file_is_set(file, "password")) { -+ password = virt_viewer_file_get_password(file); -+ wantPassword = FALSE; -+ } -+ } -+ -+ if (wantUsername || wantPassword) { -+ int ret = virt_viewer_auth_collect_credentials(self->priv->main_window, -+ "VNC", NULL, -+ wantUsername ? &username : NULL, -+ wantPassword ? &password : NULL); -+ -+ if (ret < 0) { -+ vnc_display_close(self->priv->vnc); -+ goto cleanup; -+ } -+ } -+ -+ for (i = 0 ; i < credList->n_values ; i++) { -+ GValue *cred = g_value_array_get_nth(credList, i); -+ switch (g_value_get_enum(cred)) { -+ case VNC_DISPLAY_CREDENTIAL_USERNAME: -+ if (!username || -+ vnc_display_set_credential(self->priv->vnc, -+ g_value_get_enum(cred), -+ username)) { -+ g_debug("Failed to set credential type %d", g_value_get_enum(cred)); -+ vnc_display_close(self->priv->vnc); -+ } -+ break; -+ case VNC_DISPLAY_CREDENTIAL_PASSWORD: -+ if (!password || -+ vnc_display_set_credential(self->priv->vnc, -+ g_value_get_enum(cred), -+ password)) { -+ g_debug("Failed to set credential type %d", g_value_get_enum(cred)); -+ vnc_display_close(self->priv->vnc); -+ } -+ break; -+ case VNC_DISPLAY_CREDENTIAL_CLIENTNAME: -+ if (vnc_display_set_credential(self->priv->vnc, -+ g_value_get_enum(cred), -+ "libvirt")) { -+ g_debug("Failed to set credential type %d", g_value_get_enum(cred)); -+ vnc_display_close(self->priv->vnc); -+ } -+ break; -+ default: -+ g_debug("Unsupported credential type %d", g_value_get_enum(cred)); -+ vnc_display_close(self->priv->vnc); -+ } -+ } - -- virt_viewer_auth_vnc_credentials(session, -- self->priv->main_window, -- src, -- credList, -- NULL); -+ cleanup: -+ g_free(username); -+ g_free(password); - } - - diff --git a/SOURCES/0085-Don-t-hide-the-main-window-when-disconnecting.patch b/SOURCES/0085-Don-t-hide-the-main-window-when-disconnecting.patch deleted file mode 100644 index cf53aef..0000000 --- a/SOURCES/0085-Don-t-hide-the-main-window-when-disconnecting.patch +++ /dev/null @@ -1,47 +0,0 @@ -From 6b2c83325556bcc0c332221856d7999435a41906 Mon Sep 17 00:00:00 2001 -From: Jonathon Jongsma -Date: Fri, 31 Jan 2014 13:59:42 -0600 -Subject: [PATCH] Don't hide the main window when disconnecting - -The main window (display #1) is treated a bit differently from other windows, -since it is opened at app start and displays status messages while we attempt to -connect to the remote guest. As such, it should really stay open as long as the -app is running. - -The impetus for this change is the following: -- user attempts to connect to a remote VNC display with a password -- user types the wrong password -- A dialog pops up indicating that authentication failed and asking if the user - would like to try to re-connect. -- User clicks 'Yes' -- Because the connection was disconnected, all windows are closed -- remote-viewer tries to reconnect again, at which point a new display window is - opened, and the window gets placed by the window manager (possibly on another - monitor altogether). - -As a user, I expect the program to simply re-use the existing window when trying -to re-authenticate, instead of having the window disappear and then re-appear at -a different location. This patch accomplishes that. - -Conflicts: - src/virt-viewer-app.c -(cherry picked from commit ed9b3f3450832c0b17b80468748aff4bddfcec34) ---- - src/virt-viewer-app.c | 4 +++- - 1 file changed, 3 insertions(+), 1 deletion(-) - -diff --git a/src/virt-viewer-app.c b/src/virt-viewer-app.c -index 1abcc90..f635393 100644 ---- a/src/virt-viewer-app.c -+++ b/src/virt-viewer-app.c -@@ -550,7 +550,9 @@ virt_viewer_app_window_set_visible(VirtViewerApp *self, - static void hide_one_window(gpointer value, - gpointer user_data G_GNUC_UNUSED) - { -- virt_viewer_window_hide(VIRT_VIEWER_WINDOW(value)); -+ VirtViewerApp* self = VIRT_VIEWER_APP(user_data); -+ if (self->priv->main_window != value) -+ virt_viewer_window_hide(VIRT_VIEWER_WINDOW(value)); - } - - static void diff --git a/SOURCES/0086-Don-t-set-VNC-display-to-ready-until-vnc-is-initiali.patch b/SOURCES/0086-Don-t-set-VNC-display-to-ready-until-vnc-is-initiali.patch deleted file mode 100644 index d1ef3ef..0000000 --- a/SOURCES/0086-Don-t-set-VNC-display-to-ready-until-vnc-is-initiali.patch +++ /dev/null @@ -1,57 +0,0 @@ -From 5a494f14bce402634f0e6a65046a31e0cbda8783 Mon Sep 17 00:00:00 2001 -From: Jonathon Jongsma -Date: Fri, 31 Jan 2014 14:48:35 -0600 -Subject: [PATCH] Don't set VNC display to ready until vnc is initialized - -We were setting the show_hint to READY as soon as we got the vnc-connected -signal. But there may be an authentication step between vnc-connected and -vnc-initialized. In this case, we switch to an empty black display during the -authentication step instead of showing the 'waiting for display N' status. - -(cherry picked from commit 51c3a0decf21e9cfc200e20ad6635f39262efdf9) ---- - src/virt-viewer-display-vnc.c | 10 ++++++++++ - src/virt-viewer-session-vnc.c | 2 -- - 2 files changed, 10 insertions(+), 2 deletions(-) - -diff --git a/src/virt-viewer-display-vnc.c b/src/virt-viewer-display-vnc.c -index 8a9564a..1f7c11b 100644 ---- a/src/virt-viewer-display-vnc.c -+++ b/src/virt-viewer-display-vnc.c -@@ -113,6 +113,14 @@ virt_viewer_display_vnc_key_ungrab(VncDisplay *vnc G_GNUC_UNUSED, - } - - static void -+virt_viewer_display_vnc_initialized(VncDisplay *vnc G_GNUC_UNUSED, -+ VirtViewerDisplay *display) -+{ -+ virt_viewer_display_set_show_hint(display, -+ VIRT_VIEWER_DISPLAY_SHOW_HINT_READY, TRUE); -+} -+ -+static void - virt_viewer_display_vnc_send_keys(VirtViewerDisplay* display, - const guint *keyvals, - int nkeyvals) -@@ -195,6 +203,8 @@ virt_viewer_display_vnc_new(VirtViewerSessionVnc *session, - G_CALLBACK(virt_viewer_display_vnc_key_grab), display); - g_signal_connect(display->priv->vnc, "vnc-keyboard-ungrab", - G_CALLBACK(virt_viewer_display_vnc_key_ungrab), display); -+ g_signal_connect(display->priv->vnc, "vnc-initialized", -+ G_CALLBACK(virt_viewer_display_vnc_initialized), display); - - return GTK_WIDGET(display); - } -diff --git a/src/virt-viewer-session-vnc.c b/src/virt-viewer-session-vnc.c -index 3f4c90d..7c31f87 100644 ---- a/src/virt-viewer-session-vnc.c -+++ b/src/virt-viewer-session-vnc.c -@@ -100,8 +100,6 @@ virt_viewer_session_vnc_connected(VncDisplay *vnc G_GNUC_UNUSED, - { - GtkWidget *display = virt_viewer_display_vnc_new(session, session->priv->vnc); - g_signal_emit_by_name(session, "session-connected"); -- virt_viewer_display_set_show_hint(VIRT_VIEWER_DISPLAY(display), -- VIRT_VIEWER_DISPLAY_SHOW_HINT_READY, TRUE); - virt_viewer_session_add_display(VIRT_VIEWER_SESSION(session), - VIRT_VIEWER_DISPLAY(display)); - } diff --git a/SOURCES/0087-remote-viewer-Show-debug-message-when-an-invalid-Ovi.patch b/SOURCES/0087-remote-viewer-Show-debug-message-when-an-invalid-Ovi.patch deleted file mode 100644 index 8de53e4..0000000 --- a/SOURCES/0087-remote-viewer-Show-debug-message-when-an-invalid-Ovi.patch +++ /dev/null @@ -1,31 +0,0 @@ -From 9434767f8df4631d7ff807fa0d8cd53f8e665d2a Mon Sep 17 00:00:00 2001 -From: Pavel Grunt -Date: Thu, 27 Nov 2014 14:11:35 +0100 -Subject: [PATCH] remote-viewer: Show debug message when an invalid Ovirt VM - name is given - -This patch is intended for rhel-7.1 only. Upstream version handles this -situation by showing a list of all available machines. - -https://bugzilla.redhat.com/show_bug.cgi?id=1168495 ---- - src/remote-viewer.c | 6 +++++- - 1 file changed, 5 insertions(+), 1 deletion(-) - -diff --git a/src/remote-viewer.c b/src/remote-viewer.c -index 2cb8925..5ae3319 100644 ---- a/src/remote-viewer.c -+++ b/src/remote-viewer.c -@@ -856,7 +856,11 @@ create_ovirt_session(VirtViewerApp *app, const char *uri) - goto error; - } - vm = OVIRT_VM(ovirt_collection_lookup_resource(vms, vm_name)); -- g_return_val_if_fail(vm != NULL, FALSE); -+ if (vm == NULL) { -+ g_debug("Cannot find guest %s", vm_name); -+ goto error; -+ } -+ - g_object_get(G_OBJECT(vm), "state", &state, NULL); - if (state != OVIRT_VM_STATE_UP) { - g_debug("oVirt VM %s is not running", vm_name); diff --git a/SPECS/virt-viewer.spec b/SPECS/virt-viewer.spec index 0896bc8..40a0b97 100644 --- a/SPECS/virt-viewer.spec +++ b/SPECS/virt-viewer.spec @@ -3,7 +3,7 @@ # Default to skipping autoreconf. Distros can change just this one line # (or provide a command-line override) if they backport any patches that # touch configure.ac or Makefile.am. -%{!?enable_autotools:%define enable_autotools 0} +%{!?enable_autotools:%define enable_autotools 1} %define with_gtk3 0 %if 0%{?fedora} >= 15 || 0%{?rhel} >= 7 @@ -26,100 +26,77 @@ %endif Name: virt-viewer -Version: 0.6.0 -Release: 12%{?dist}%{?extra_release} +Version: 2.0 +Release: 6%{?dist}%{?extra_release} Summary: Virtual Machine Viewer Group: Applications/System License: GPLv2+ URL: http://virt-manager.org/ Source0: http://virt-manager.org/download/sources/%{name}/%{name}-%{version}.tar.gz -Patch1: 0001-Fix-race-with-metacity-in-fullscreen.patch -Patch2: 0002-Fix-scaling-of-window-upon-resize.patch -Patch3: 0003-Silence-a-message-about-missing-configuration-file.patch -Patch4: 0004-Remove-Automatically-resize-menu.patch -Patch5: 0005-Use-a-USB-icon-in-the-fullscreen-toolbar.patch -Patch6: 0006-build-sys-Always-prepend-to-build-id.patch -Patch7: 0007-Update-user-visible-copyright-information.patch -Patch8: 0008-man-Add-missing-.-at-end-of-one-sentence.patch -Patch9: 0009-man-Fix-link-to-GPLv2-text.patch -Patch10: 0010-man-Fix-concatonated-typo.patch -Patch11: 0011-man-Use-nicer-link-to-GPLv2.patch -Patch12: 0012-man-remove-Perl-header.patch -Patch13: 0013-Don-t-show-do-you-want-to-quit-dialog-in-kiosk-mode.patch -Patch14: 0014-Set-freed-variables-to-NULL-in-remote_viewer_start.patch -Patch15: 0015-Don-t-resize-guest-display-on-zoom-change.patch -Patch16: 0016-Fix-regression-with-enabling-additional-displays.patch -Patch17: 0017-Fix-gtk2-build.patch -Patch18: 0018-rhbz-1007306-Don-t-free-session-if-we-re-re-trying-a.patch -Patch19: 0019-Fix-broken-release-cursor-accel-when-not-specified-i.patch -Patch20: 0020-Fix-tiny-windows-for-secondary-displays-in-gtk2-buil.patch -Patch21: 0021-Fix-tiny-window-when-resetting-zoom-factor-in-gtk2-b.patch -Patch22: 0022-window-take-zoom-level-into-account-for-display-limi.patch -Patch23: 0023-Remove-warning-when-removing-display.patch -Patch24: 0024-Replace-DEBUG_LOG-with-g_debug.patch -Patch25: 0025-kiosk-don-t-attempt-to-hide-windows-when-disconnecti.patch -Patch26: 0026-Use-a-custom-log-handler-to-silence-debug-messages.patch -Patch27: 0027-kiosk-remove-invalid-unref.patch -Patch28: 0028-Fix-a-floating-display-warning.patch -Patch29: 0029-man-fix-zoom-level-range.patch -Patch30: 0030-rhbz-1111514-Fix-un-shrinkable-displays-on-windows-g.patch -Patch31: 0031-remote-viewer-mention-vv-file-in-help-output.patch -Patch32: 0032-Make-ctrl-zoom-in-out-in-fullscreen.patch -Patch33: 0033-Don-t-connect-to-localhost-when-using-direct.patch -Patch34: 0034-Improve-docs-for-attach-flag-in-virt-viewer.patch -Patch35: 0035-Fix-silentely-typo-in-remote-viewer-man-page.patch -Patch36: 0036-virt-viewer.xml-remove-zoom-in-out-accelerators.patch -Patch37: 0037-Add-a-dialog-showing-details-of-the-current-guest.patch -Patch38: 0038-Change-per-guest-fullscreen-config-format.patch -Patch39: 0039-Write-vm-name-to-config-file-as-comment.patch -Patch40: 0040-Don-t-print-warning-for-missing-comment-in-config-fi.patch -Patch41: 0041-remote-viewer-allow-username-in-ovirt-URIs.patch -Patch42: 0042-remote-viewer-oVirt-username-review-fixes.patch -Patch43: 0043-Auth-fix-leak-of-username.patch -Patch44: 0044-ovirt-Remove-extra-from-oVirt-URI.patch -Patch45: 0045-ovirt-Add-OvirtForeignMenu-class.patch -Patch46: 0046-ovirt-Use-OvirtForeignMenu-class.patch -Patch47: 0047-Add-group-argument-to-VirtViewerFile-helpers.patch -Patch48: 0048-Add-ovirt-specific-properties-to-VirtViewerFile.patch -Patch49: 0049-Create-foreign-menu-from-.vv-file-information.patch -Patch50: 0050-Fix-without-spice-gtk-with-ovirt-build.patch -Patch51: 0051-Fix-gcc-warning-missing-prototypes.patch -Patch52: 0052-Fix-gcc-warning-unused-parameter.patch -Patch53: 0053-virt-viewer-Don-t-connect-to-localhost-displays-with.patch -Patch54: 0054-app-add-virt_viewer_app_make_dialog.patch -Patch55: 0055-app-report-disconnection-error-details.patch -Patch56: 0056-Don-t-check-for-NULL-when-it-never-can-happen.patch -Patch57: 0057-app-report-disconnection-error-details.patch -Patch58: 0058-Add-support-to-use-numpad-accelarators-for-zoom-in.o.patch -Patch59: 0059-Do-not-show-duplicated-menu-items.patch -Patch60: 0060-Revert-changes-related-to-numpad-accelerators.patch -Patch61: 0061-Add-documentation-for-fullscreen-monitor-mapping.patch -Patch62: 0062-Add-example-of-an-oVirt-URI-to-the-manpage.patch -Patch63: 0063-Do-not-fail-when-the-auth-dialog-is-cancelled.patch -Patch64: 0064-Simplify-virt_viewer_auth_libvirt_credentials-return.patch -Patch65: 0065-Improve-authentication-error-messages.patch -Patch66: 0066-Unset-app-fullscreen-when-leaving-fullscreen.patch -Patch67: 0067-Don-t-use-fallback-ca-file-when-launching-vv-file.patch -Patch68: 0068-Force-displays-to-update-geometry-when-agent-connect.patch -Patch69: 0069-Adapt-auth_cancelled-to-the-downstream-code.patch -Patch70: 0070-ovirt-Allow-to-remove-CD-images.patch -Patch71: 0071-App-keep-hash-table-of-displays.patch -Patch72: 0072-VirtViewerDisplay-add-convenience-API-for-getting-nt.patch -Patch73: 0073-VirtViewerApp-store-windows-in-a-list.patch -Patch74: 0074-Create-windows-on-demand-not-at-startup.patch -Patch75: 0075-Use-socat-instead-of-nc-if-possible.patch -Patch76: 0076-spice-do-not-open-in-fullscreen-with-CONTROLLER_AUTO.patch -Patch77: 0077-Set-initial-window-size-to-display-desktop-size.patch -Patch78: 0078-Make-default-window-size-a-bit-more-useful.patch -Patch79: 0079-Force-display_show_hint-when-the-display-is-set.patch -Patch80: 0080-Fix-bug-with-initial-placement-of-fullscreen-windows.patch -Patch81: 0081-Don-t-disable-send-key-menu-when-display-isn-t-ready.patch -Patch82: 0082-VirtViewerDisplayVnc-set-session-property.patch -Patch83: 0083-Revert-Fix-bug-with-initial-placement-of-fullscreen-.patch -Patch84: 0084-Move-vnc-specific-auth-logic-to-VirtViewerSessionVnc.patch -Patch85: 0085-Don-t-hide-the-main-window-when-disconnecting.patch -Patch86: 0086-Don-t-set-VNC-display-to-ready-until-vnc-is-initiali.patch -Patch87: 0087-remote-viewer-Show-debug-message-when-an-invalid-Ovi.patch +Patch1: 0001-Take-direct-into-consideration-when-checking-if-a-gu.patch +Patch2: 0002-Update-geometry-when-enabling-disabling-displays.patch +Patch3: 0003-VirtViewerApp-create-main-window-after-constructor.patch +Patch4: 0004-Use-constructed-vfunc-instead-of-constructor.patch +Patch5: 0005-Monitor-config-at-sometimes-leaves-additional-monito.patch +Patch6: 0006-virt-viewer-Bring-back-debug-log-about-nonexistent-g.patch +Patch7: 0007-foreign-menu-Don-t-show-empty-foreign-menu-on-second.patch +Patch8: 0008-Do-not-add-https-and-api-to-oVirt-URI.patch +Patch9: 0009-virt-viewer-Add-a-GError-arg-to-extract_connect_info.patch +Patch10: 0010-virt-viewer-Add-a-GError-arg-to-update_display.patch +Patch11: 0011-virt-viewer-app-Add-a-GError-arg-to-create_session.patch +Patch12: 0012-virt-viewer-app-create_session-should-return-a-boole.patch +Patch13: 0013-virt-viewer-Avoid-simple_message_dialog-when-errors-.patch +Patch14: 0014-remote-viewer-Avoid-simple_message_dialog-when-error.patch +Patch15: 0015-virt-viewer-Do-not-wait-for-a-guest-that-will-never-.patch +Patch16: 0016-virt-viewer-app-Do-not-show-error-dialog-twice-for-u.patch +Patch17: 0017-Use-ZOOM-constants-instead-of-numbers.patch +Patch18: 0018-virt-viewer-display-Use-MIN_DISPLAY_WIDTH-HEIGHT-ins.patch +Patch19: 0019-virt-viewer-window-Change-zoom-of-the-display-only-w.patch +Patch20: 0020-virt-viewer-window-Set-zoom-when-display-is-enabled-.patch +Patch21: 0021-virt-viewer-window-Return-early-when-zoom-of-window-.patch +Patch22: 0022-display-spice-Do-not-ignore-change-of-position.patch +Patch23: 0023-virt-viewer-main-Require-domain-name-as-argument-for.patch +Patch24: 0024-virt-viewer-app-Set-hotkeys-when-app-is-constructed.patch +Patch25: 0025-Revert-virt-viewer-main-Require-domain-name-as-argum.patch +Patch26: 0026-virt-viewer-main-wait-should-not-be-used-without-dom.patch +Patch27: 0027-virt-viewer-window-Make-sure-that-minimum-zoom-level.patch +Patch28: 0028-virt-viewer-window-Set-initial-zoom-only-once.patch +Patch29: 0029-session-spice-Destroy-the-channel-instead-of-emit-a-.patch +Patch30: 0030-spice-session-use-the-error-message-when-available-o.patch +Patch31: 0031-ovirt-Add-support-for-an-admin-key-in-vv-file.patch +Patch32: 0032-Enable-hotkeys-after-setting-them-in-virt_viewer_app.patch +Patch33: 0033-build-sys-Don-t-substitute-buildid-when-it-was-not-s.patch +Patch34: 0034-build-sys-Always-prepend-to-BUILDID.patch +Patch35: 0035-vv-file-Move-version-checking-code-in-its-own-functi.patch +Patch36: 0036-vv-file-Refactor-virt_viewer_file_check_min_version.patch +Patch37: 0037-vv-file-Add-VirtViewerFile-versions.patch +Patch38: 0038-build-sys-Add-with-osid.patch +Patch39: 0039-Show-osid-in-remote-viewer-version.patch +Patch40: 0040-vv-file-Use-versions-in-min-version-check.patch +Patch41: 0041-util-Replace-virt_viewer_compare_version-with-_compa.patch +Patch42: 0042-test-Add-test-case-for-virt_viewer_compare_buildid.patch +Patch43: 0043-vv-file-Add-newer-version-url-key-to-.vv-files.patch +Patch44: 0044-vv-file-Show-newer-version-url-when-version-check-fa.patch +Patch45: 0045-Avoid-Dereference-of-a-null-pointer.patch +Patch46: 0046-virt-viewer-set-keepAlive-on-libvirt-connection.patch +Patch47: 0047-Remove-unnecessary-parameter-from-virt_viewer_window.patch +Patch48: 0048-virt-viewer-window-Allow-to-resize-window-to-any-siz.patch +Patch49: 0049-events-ensure-event-callbacks-are-threadsafe.patch +Patch50: 0050-events-register-event-using-GOnce-to-avoid-multiple-.patch +Patch51: 0051-events-remove-timeout-and-handle-from-arrays.patch +Patch52: 0052-glib-compat-Use-g_new0-GMutex-1-if-GLib-2.31.patch +Patch53: 0053-events-allow-zero-timeouts-for-timer.patch +Patch54: 0054-events-remove-unused-virt_viewer_events_find_-handle.patch +Patch55: 0055-events-protect-handles-and-timeouts-against-concurre.patch +Patch56: 0056-events-don-t-reschedule-deleted-timeouts-watches.patch +Patch57: 0057-events-don-t-hold-events-lock-when-dispatching-free-.patch +Patch58: 0058-events-don-t-create-glib-IO-watch-for-disabled-handl.patch +Patch59: 0059-events-allow-to-remove-disabled-timers-and-handles.patch +Patch60: 0060-events-don-t-leak-GIOChannel-when-destroying-IO-hand.patch +Patch61: 0061-Exit-normally-when-canceling-dialog.patch +Patch62: 0062-Clear-GError-in-cleanup-section.patch +Patch63: 0063-Report-errors-in-one-place.patch +Patch64: 0064-virt-viewer-Clean-up-if-no-vm-was-chosen.patch BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) Requires: openssh-clients @@ -160,7 +137,7 @@ BuildRequires: spice-protocol >= 0.10.1 BuildRequires: /usr/bin/pod2man BuildRequires: intltool %if %{with_govirt} -BuildRequires: libgovirt-devel >= 0.3.0 +BuildRequires: libgovirt-devel >= 0.3.2 %endif %if 0%{?fedora} >= 20 @@ -239,29 +216,6 @@ the display, and libvirt for looking up VNC/SPICE server details. %patch62 -p1 %patch63 -p1 %patch64 -p1 -%patch65 -p1 -%patch66 -p1 -%patch67 -p1 -%patch68 -p1 -%patch69 -p1 -%patch70 -p1 -%patch71 -p1 -%patch72 -p1 -%patch73 -p1 -%patch74 -p1 -%patch75 -p1 -%patch76 -p1 -%patch77 -p1 -%patch78 -p1 -%patch79 -p1 -%patch80 -p1 -%patch81 -p1 -%patch82 -p1 -%patch83 -p1 -%patch84 -p1 -%patch85 -p1 -%patch86 -p1 -%patch87 -p1 %build %if 0%{?enable_autotools} @@ -284,7 +238,7 @@ autoreconf -if %define govirt_arg --with-ovirt %endif -%configure %{spice_arg} %{gtk_arg} %{govirt_arg} --with-buildid=%{release} --disable-update-mimedb +%configure %{spice_arg} %{gtk_arg} %{govirt_arg} --with-buildid=%{release} --disable-update-mimedb --with-osid=rhel%{?rhel} %__make %{?_smp_mflags} @@ -329,6 +283,7 @@ update-desktop-database -q %{_datadir}/applications %{_datadir}/%{name}/ui/virt-viewer-auth.xml %{_datadir}/%{name}/ui/virt-viewer-about.xml %{_datadir}/%{name}/ui/virt-viewer-guest-details.xml +%{_datadir}/%{name}/ui/virt-viewer-vm-connection.xml %{_datadir}/icons/hicolor/*/apps/* %{_datadir}/icons/hicolor/*/devices/* %{_datadir}/applications/remote-viewer.desktop @@ -339,6 +294,50 @@ update-desktop-database -q %{_datadir}/applications %{_mandir}/man1/remote-viewer.1* %changelog +* Sun Aug 09 2015 Fabiano Fidêncio - 2.0-6 +- Error message continously popping out when stopping libvirtd + Resolves: rhbz#1246022 + +* Thu Jul 23 2015 Fabiano Fidêncio - 2.0-5 +- Allow to resize window to any size + Resolves: rhbz#1242509 +- Upate virt-viewer-events.c to match libvirt-glib's event file + Resolves: rhbz#1243228 + +* Fri Jul 10 2015 Fabiano Fidêncio - 2.0-4 +- set keepAlive on libvirt connection + Resolves: rhbz#1164052 +- Rebase to 2.0: Add a missing bug + Resolves: rhbz#1228759 + +* Wed Jun 17 2015 Jonathon Jongsma - 2.0-3 +- fix coverity warning for code introduced in 2.0 + Related: rhbz#1181288 + +* Tue Jun 16 2015 Jonathon Jongsma - 2.0-2 +- Add 'admin' key to [ovirt] .vv file section + Resolves: rhbz#1210248 +- Shortcuts missing from "Send key" menu when started using plugin + Resolves: rhbz#1230602 +- Add minimum version check to rhev spice-client + Resolves: rhbz#1223469 + +* Mon May 18 2015 Fabiano Fidêncio 2.0-1 +- Rebase to 2.0 + Resolves: rhbz#1181288 +- virt-viewer cannot connect to spice VM when libvirt uses tcp port + with sasl encryption + Resolves: rhbz#1167354 +- virt-viewer will core dump with -r option via ssh when destroying + the guest + Resolves: rhbz#1163647 +- virt-viewer cannot set zoom level in command line for vnc guest + Resolves: rhbz#1170071 +- launching virt-viewer using --attach makes it crashes + Resolves: rhbz#1196552 +- --attach doesn't work with SELinux + Resolves: rhbz#1141228 + * Mon Dec 01 2014 Fabiano Fidêncio 0.6.0.12 - Show a debug message instead of an error message when trying to connect to a non-existent guest using ovirt