For some reason, the behaviour changed between gtk2 and gtk3, the menu is removed from display when we unref it with gtk3. Keep a ref on built menu and reuse it until the window is disposed. --- src/virt-viewer-window.c | 15 +++++++++++++-- 1 files changed, 13 insertions(+), 2 deletions(-) diff --git a/src/virt-viewer-window.c b/src/virt-viewer-window.c index ec96532..0763481 100644 --- a/src/virt-viewer-window.c +++ b/src/virt-viewer-window.c @@ -98,6 +98,7 @@ struct _VirtViewerWindowPrivate { GtkWidget *toolbar_usb_device_selection; GtkWidget *toolbar_send_key; GtkAccelGroup *accel_group; + GtkMenu *keycombo_menu; VirtViewerNotebook *notebook; VirtViewerDisplay *display; @@ -187,6 +188,11 @@ virt_viewer_window_dispose (GObject *object) priv->display = NULL; } + if (priv->keycombo_menu) { + g_object_unref(priv->keycombo_menu); + priv->keycombo_menu = NULL; + } + g_free(priv->subtitle); priv->subtitle = NULL; } @@ -568,6 +574,10 @@ virt_viewer_window_menu_send(GtkWidget *menu, static GtkMenu* virt_viewer_window_get_keycombo_menu(VirtViewerWindow *self) { + if (self->priv->keycombo_menu != NULL) { + return self->priv->keycombo_menu; + } + gint i; GtkMenu *menu = GTK_MENU(gtk_menu_new()); @@ -583,7 +593,9 @@ virt_viewer_window_get_keycombo_menu(VirtViewerWindow *self) } gtk_widget_show_all(GTK_WIDGET(menu)); - return g_object_ref_sink(menu); + self->priv->keycombo_menu = g_object_ref_sink(menu); + + return self->priv->keycombo_menu; } static gboolean @@ -713,7 +725,6 @@ virt_viewer_window_toolbar_send_key(GtkWidget *button G_GNUC_UNUSED, GtkMenu *menu = virt_viewer_window_get_keycombo_menu(self); gtk_menu_popup(menu, NULL, NULL, keycombo_menu_location, self, 0, gtk_get_current_event_time()); - g_object_unref(menu); } -- 1.7.7.6