When user starts virt-viewer without specifying VM domain name a list of running machines is shown and user may choose one of them. --- depends on ui file from http://www.redhat.com/archives/virt-tools-list/2014-September/msg00171.html src/virt-viewer-main.c | 4 ++-- src/virt-viewer.c | 65 ++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 67 insertions(+), 2 deletions(-) diff --git a/src/virt-viewer-main.c b/src/virt-viewer-main.c index 44d1182..3fae955 100644 --- a/src/virt-viewer-main.c +++ b/src/virt-viewer-main.c @@ -104,12 +104,12 @@ int main(int argc, char **argv) g_option_context_free(context); - if (!args || (g_strv_length(args) != 1)) { + if (args && (g_strv_length(args) != 1)) { g_printerr(_("\nUsage: %s [OPTIONS] DOMAIN-NAME|ID|UUID\n\n%s\n\n"), argv[0], help_msg); goto cleanup; } - viewer = virt_viewer_new(uri, args[0], direct, attach, waitvm, reconnect); + viewer = virt_viewer_new(uri, (args) ? args[0] : NULL, direct, attach, waitvm, reconnect); if (viewer == NULL) goto cleanup; diff --git a/src/virt-viewer.c b/src/virt-viewer.c index f8a9ab5..3c9701a 100644 --- a/src/virt-viewer.c +++ b/src/virt-viewer.c @@ -600,6 +600,66 @@ virt_viewer_initial_connect(VirtViewerApp *app, GError **error) } static void +vm_list_selection_changed_dialog_cb(GtkTreeSelection *selection, gpointer data) +{ + GtkTreeIter iter; + GtkTreeModel *model; + const gchar *vm_name; + GtkWidget *entry = data; + + if (gtk_tree_selection_get_selected (selection, &model, &iter)) { + gtk_tree_model_get(model, &iter, 0, &vm_name, -1); + gtk_entry_set_text(GTK_ENTRY(entry), vm_name); + } +} + +static char *choose_vm_dialog(virConnectPtr conn) +{ + GtkBuilder *vm_connection; + GtkWidget *dialog, *entry; + GtkTreeModel *store; + GtkTreeSelection *select; + GtkTreeIter iter; + char *vm_name; + virDomainPtr *domains; + int i, vms_running; + unsigned int flags = VIR_CONNECT_LIST_DOMAINS_RUNNING; + + vm_connection = virt_viewer_util_load_ui("virt-viewer-vm-connection.xml"); + dialog = GTK_WIDGET(gtk_builder_get_object(vm_connection, "vm-connection-dialog")); + entry = GTK_WIDGET(gtk_builder_get_object(vm_connection, "entry")); + select = GTK_TREE_SELECTION(gtk_builder_get_object(vm_connection, "treeview-selection")); + store = GTK_TREE_MODEL(gtk_builder_get_object(vm_connection, "store")); + + vms_running = virConnectListAllDomains(conn, &domains, flags); + for (i = 0; i < vms_running; i++) { + gtk_list_store_append(GTK_LIST_STORE(store), &iter); + gtk_list_store_set(GTK_LIST_STORE(store), &iter, 0, virDomainGetName(domains[i]), -1); + virDomainFree(domains[i]); + } + free(domains); + + g_signal_connect(select, "changed", + G_CALLBACK(vm_list_selection_changed_dialog_cb), entry); + if (gtk_tree_model_get_iter_first(store, &iter)) { + gtk_tree_selection_select_iter(select, &iter); + } + /* show and wait for response */ + vm_name = NULL; + if (vms_running > 0) { + gtk_widget_show_all(dialog); + if (gtk_dialog_run(GTK_DIALOG(dialog)) == GTK_RESPONSE_ACCEPT) { + vm_name = g_strdup(gtk_entry_get_text(GTK_ENTRY(entry))); + } + } else { + g_warning("No domain running"); + } + gtk_widget_destroy(dialog); + + return vm_name; +} + +static void virt_viewer_error_func (void *data G_GNUC_UNUSED, virErrorPtr error G_GNUC_UNUSED) { @@ -700,6 +760,11 @@ virt_viewer_connect(VirtViewerApp *app) return -1; } + if (priv->domkey == NULL && (priv->domkey = choose_vm_dialog(priv->conn)) == NULL) { + g_debug("No domain chosen"); + return -1; + } + if (!virt_viewer_app_initial_connect(app, &error)) { if (error) g_warning("%s", error->message); -- 1.9.3 _______________________________________________ virt-tools-list mailing list virt-tools-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/virt-tools-list