summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDaniel P. Berrange <berrange@redhat.com>2011-08-04 10:34:18 +0100
committerDaniel P. Berrange <berrange@redhat.com>2011-08-04 10:34:18 +0100
commit321f253ad18dc80ff781580b65b0b289117457ec (patch)
tree7fc5759e6652f152bec41032036b5c42b2b14b5c
parent39439b0b3e531f1eeac44fec229b8cd77bed78a6 (diff)
downloadvirt-viewer-321f253ad18dc80ff781580b65b0b289117457ec.tar.gz
virt-viewer-321f253ad18dc80ff781580b65b0b289117457ec.tar.xz
virt-viewer-321f253ad18dc80ff781580b65b0b289117457ec.zip
Fix sort order of displays submenu
-rw-r--r--src/virt-viewer-app.c53
1 files changed, 34 insertions, 19 deletions
diff --git a/src/virt-viewer-app.c b/src/virt-viewer-app.c
index d173f48..918e788 100644
--- a/src/virt-viewer-app.c
+++ b/src/virt-viewer-app.c
@@ -1227,22 +1227,18 @@ menu_display_visible_toggled_cb(GtkCheckMenuItem *checkmenuitem,
reentering = FALSE;
}
-static void update_menu_displays_cb(gpointer key,
- gpointer value,
- gpointer user_data)
+static gint
+update_menu_displays_sort(gconstpointer a, gconstpointer b)
{
- gint nth = *(gint*)key;
- VirtViewerWindow *vwin = VIRT_VIEWER_WINDOW(value);
- GtkMenuShell *submenu = GTK_MENU_SHELL(user_data);
- GtkWidget *item;
- gboolean visible;
+ const int *ai = a;
+ const int *bi = b;
- item = gtk_check_menu_item_new_with_label(g_strdup_printf("Display %d", nth));
- visible = gtk_widget_get_visible(GTK_WIDGET(virt_viewer_window_get_window(vwin)));
- gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(item), visible);
- g_signal_connect(G_OBJECT(item),
- "toggled", G_CALLBACK(menu_display_visible_toggled_cb), vwin);
- gtk_menu_shell_append(submenu, item);
+ if (*ai > *bi)
+ return 1;
+ else if (*ai < *bi)
+ return -1;
+ else
+ return 0;
}
static void
@@ -1252,13 +1248,32 @@ window_update_menu_displays_cb(gpointer key G_GNUC_UNUSED,
{
VirtViewerApp *self = VIRT_VIEWER_APP(user_data);
VirtViewerWindow *window = VIRT_VIEWER_WINDOW(value);
- GtkWidget *submenu = gtk_menu_new();
+ GtkMenuShell *submenu = GTK_MENU_SHELL(gtk_menu_new());
GtkMenuItem *menu = virt_viewer_window_get_menu_displays(window);
+ GList *keys = g_hash_table_get_keys(self->priv->windows);
+ GList *tmp;
+
+ keys = g_list_sort(keys, update_menu_displays_sort);
+
+ tmp = keys;
+ while (tmp) {
+ int *nth = tmp->data;
+ VirtViewerWindow *vwin = VIRT_VIEWER_WINDOW(g_hash_table_lookup(self->priv->windows, nth));
+ GtkWidget *item;
+ gboolean visible;
+
+ item = gtk_check_menu_item_new_with_label(g_strdup_printf("Display %d", *nth));
+ visible = gtk_widget_get_visible(GTK_WIDGET(virt_viewer_window_get_window(vwin)));
+ gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(item), visible);
+ g_signal_connect(G_OBJECT(item),
+ "toggled", G_CALLBACK(menu_display_visible_toggled_cb), vwin);
+ gtk_menu_shell_append(submenu, item);
+ tmp = tmp->next;
+ }
- g_hash_table_foreach(self->priv->windows, update_menu_displays_cb, submenu);
-
- gtk_widget_show_all(submenu);
- gtk_menu_item_set_submenu(menu, submenu);
+ gtk_widget_show_all(GTK_WIDGET(submenu));
+ gtk_menu_item_set_submenu(menu, GTK_WIDGET(submenu));
+ g_list_free(keys);
}
static void