--- src/Makefile.am | 1 + src/remote-viewer.c | 85 ++++++------------------------ src/virt-viewer-vm-connection.c | 105 ++++++++++++++++++++++++++++++++++++++ src/virt-viewer-vm-connection.h | 36 +++++++++++++ src/virt-viewer-vm-connection.xml | 20 -------- 5 files changed, 159 insertions(+), 88 deletions(-) create mode 100644 src/virt-viewer-vm-connection.c create mode 100644 src/virt-viewer-vm-connection.h diff --git a/src/Makefile.am b/src/Makefile.am index a33417c..e76da2c 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -47,6 +47,7 @@ COMMON_SOURCES = \ virt-viewer-display.h virt-viewer-display.c \ virt-viewer-notebook.h virt-viewer-notebook.c \ virt-viewer-window.h virt-viewer-window.c \ + virt-viewer-vm-connection.h virt-viewer-vm-connection.c \ view/autoDrawer.c \ view/autoDrawer.h \ view/drawer.c \ diff --git a/src/remote-viewer.c b/src/remote-viewer.c index 3b44269..485baf2 100644 --- a/src/remote-viewer.c +++ b/src/remote-viewer.c @@ -31,6 +31,7 @@ #ifdef HAVE_OVIRT #include <govirt/govirt.h> #include "ovirt-foreign-menu.h" +#include "virt-viewer-vm-connection.h" #endif #ifdef HAVE_SPICE_GTK @@ -75,7 +76,7 @@ enum { }; #ifdef HAVE_OVIRT -static OvirtVm * choose_vm_dialog(char **vm_name, OvirtCollection *vms, GError **error); +static OvirtVm * choose_vm(char **vm_name, OvirtCollection *vms, GError **error); #endif static gboolean remote_viewer_start(VirtViewerApp *self); @@ -861,7 +862,7 @@ create_ovirt_session(VirtViewerApp *app, const char *uri, GError **err) } if (vm_name == NULL || (vm = OVIRT_VM(ovirt_collection_lookup_resource(vms, vm_name))) == NULL) { - vm = choose_vm_dialog(&vm_name, vms, &error); + vm = choose_vm(&vm_name, vms, &error); if (vm == NULL) { goto error; } @@ -1133,91 +1134,39 @@ connect_dialog(gchar **uri) #ifdef HAVE_OVIRT -static void -treeview_row_activated_cb(GtkTreeView *treeview G_GNUC_UNUSED, - GtkTreePath *path G_GNUC_UNUSED, - GtkTreeViewColumn *col G_GNUC_UNUSED, - gpointer userdata) -{ - gtk_widget_activate(GTK_WIDGET(userdata)); -} - -static void -treeselection_changed_cb(GtkTreeSelection *selection, gpointer userdata) -{ - gtk_widget_set_sensitive(GTK_WIDGET(userdata), - gtk_tree_selection_count_selected_rows(selection) == 1); -} - - static OvirtVm * -choose_vm_dialog(char **vm_name, OvirtCollection *vms_collection, GError **error) +choose_vm(char **vm_name, OvirtCollection *vms_collection, GError **error) { - GtkBuilder *vm_connection; - GtkWidget *dialog; - GtkButton *button_connect; - GtkTreeView *treeview; - GtkTreeModel *store; - GtkTreeSelection *select; + GtkListStore *model; GtkTreeIter iter; GHashTable *vms; GHashTableIter vms_iter; - OvirtVm *vm; OvirtVmState state; - int response; - gboolean any_vm_running = FALSE; + OvirtVm *vm; g_return_val_if_fail(vm_name != NULL, NULL); if (*vm_name != NULL) { free(*vm_name); } - vms = ovirt_collection_get_resources(vms_collection); - - vm_connection = virt_viewer_util_load_ui("virt-viewer-vm-connection.xml"); - dialog = GTK_WIDGET(gtk_builder_get_object(vm_connection, "vm-connection-dialog")); - button_connect = GTK_BUTTON(gtk_builder_get_object(vm_connection, "button-connect")); - treeview = GTK_TREE_VIEW(gtk_builder_get_object(vm_connection, "treeview")); - select = GTK_TREE_SELECTION(gtk_builder_get_object(vm_connection, "treeview-selection")); - store = GTK_TREE_MODEL(gtk_builder_get_object(vm_connection, "store")); - - g_signal_connect(treeview, "row-activated", - G_CALLBACK(treeview_row_activated_cb), button_connect); - g_signal_connect(select, "changed", - G_CALLBACK(treeselection_changed_cb), button_connect); + model = gtk_list_store_new(1, G_TYPE_STRING); + vms = ovirt_collection_get_resources(vms_collection); g_hash_table_iter_init(&vms_iter, vms); while (g_hash_table_iter_next(&vms_iter, (gpointer *) vm_name, (gpointer *) &vm)) { g_object_get(G_OBJECT(vm), "state", &state, NULL); if (state == OVIRT_VM_STATE_UP) { - gtk_list_store_append(GTK_LIST_STORE(store), &iter); - gtk_list_store_set(GTK_LIST_STORE(store), &iter, 0, *vm_name, -1); - any_vm_running = TRUE; + gtk_list_store_append(model, &iter); + gtk_list_store_set(model, &iter, 0, *vm_name, -1); } } - *vm_name = NULL; - if (any_vm_running) { - gtk_widget_show_all(dialog); - response = gtk_dialog_run(GTK_DIALOG(dialog)); - gtk_widget_hide(dialog); - if (response == GTK_RESPONSE_ACCEPT && - gtk_tree_selection_get_selected(select, &store, &iter)) { - gtk_tree_model_get(store, &iter, 0, vm_name, -1); - vm = OVIRT_VM(ovirt_collection_lookup_resource(vms_collection, *vm_name)); - } else { - g_set_error_literal(error, - VIRT_VIEWER_ERROR, VIRT_VIEWER_VM_CHOOSE_DIALOG_CANCELLED, - _("No virtual machine was chosen")); - vm = NULL; - } - } else { - g_set_error_literal(error, - VIRT_VIEWER_ERROR, VIRT_VIEWER_ERROR_FAILED, - _("No running virtual machines found")); - vm = NULL; - } - gtk_widget_destroy(dialog); - g_object_unref(G_OBJECT(vm_connection)); + + *vm_name = virt_viewer_vm_connection_choose_name_dialog(GTK_TREE_MODEL(model), error); + g_object_unref(model); + if (*vm_name == NULL) + return NULL; + + vm = OVIRT_VM(ovirt_collection_lookup_resource(vms_collection, *vm_name)); return vm; } diff --git a/src/virt-viewer-vm-connection.c b/src/virt-viewer-vm-connection.c new file mode 100644 index 0000000..fb0c2b0 --- /dev/null +++ b/src/virt-viewer-vm-connection.c @@ -0,0 +1,105 @@ +/* + * Virt Viewer: A virtual machine console viewer + * + * Copyright (C) 2014 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 <config.h> + +#include <glib.h> +#include <glib/gi18n.h> + +#include "virt-viewer-vm-connection.h" +#include "virt-viewer-util.h" + +static void +treeview_row_activated_cb(GtkTreeView *treeview G_GNUC_UNUSED, + GtkTreePath *path G_GNUC_UNUSED, + GtkTreeViewColumn *col G_GNUC_UNUSED, + gpointer userdata) +{ + gtk_widget_activate(GTK_WIDGET(userdata)); +} + +static void +treeselection_changed_cb(GtkTreeSelection *selection, gpointer userdata) +{ + gtk_widget_set_sensitive(GTK_WIDGET(userdata), + gtk_tree_selection_count_selected_rows(selection) == 1); +} + +gchar* +virt_viewer_vm_connection_choose_name_dialog(GtkTreeModel *model, GError **error) +{ + GtkBuilder *vm_connection; + GtkWidget *dialog; + GtkButton *button_connect; + GtkTreeView *treeview; + GtkTreeSelection *select; + GtkTreeIter iter; + int dialog_response; + gchar *vm_name = NULL; + + g_return_val_if_fail(model != NULL, NULL); + + if (!gtk_tree_model_get_iter_first(model, &iter)) { + g_set_error_literal(error, + VIRT_VIEWER_ERROR, VIRT_VIEWER_ERROR_FAILED, + _("No virtual machine found")); + return NULL; + } + + vm_connection = virt_viewer_util_load_ui("virt-viewer-vm-connection.xml"); + g_return_val_if_fail(vm_connection != NULL, NULL); + + dialog = GTK_WIDGET(gtk_builder_get_object(vm_connection, "vm-connection-dialog")); + button_connect = GTK_BUTTON(gtk_builder_get_object(vm_connection, "button-connect")); + treeview = GTK_TREE_VIEW(gtk_builder_get_object(vm_connection, "treeview")); + select = GTK_TREE_SELECTION(gtk_builder_get_object(vm_connection, "treeview-selection")); + gtk_tree_view_set_model(treeview, model); + + g_signal_connect(treeview, "row-activated", + G_CALLBACK(treeview_row_activated_cb), button_connect); + g_signal_connect(select, "changed", + G_CALLBACK(treeselection_changed_cb), button_connect); + + gtk_widget_show_all(dialog); + dialog_response = gtk_dialog_run(GTK_DIALOG(dialog)); + gtk_widget_hide(dialog); + + if (dialog_response == GTK_RESPONSE_ACCEPT && + gtk_tree_selection_get_selected(select, &model, &iter)) { + gtk_tree_model_get(model, &iter, 0, &vm_name, -1); + } else { + g_set_error_literal(error, + VIRT_VIEWER_ERROR, VIRT_VIEWER_VM_CHOOSE_DIALOG_CANCELLED, + _("No virtual machine was chosen")); + } + + gtk_widget_destroy(dialog); + g_object_unref(G_OBJECT(vm_connection)); + + return vm_name; +} + +/* + * Local variables: + * c-indent-level: 4 + * c-basic-offset: 4 + * indent-tabs-mode: nil + * End: + */ diff --git a/src/virt-viewer-vm-connection.h b/src/virt-viewer-vm-connection.h new file mode 100644 index 0000000..d198c89 --- /dev/null +++ b/src/virt-viewer-vm-connection.h @@ -0,0 +1,36 @@ +/* + * Virt Viewer: A virtual machine console viewer + * + * Copyright (C) 2014 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 + */ + +#ifndef VIRT_VIEWER_VM_CONNECTION_H +#define VIRT_VIEWER_VM_CONNECTION_H + +#include <glib.h> +#include <gtk/gtk.h> + +gchar* virt_viewer_vm_connection_choose_name_dialog(GtkTreeModel *model, GError **error); + +#endif +/* + * Local variables: + * c-indent-level: 4 + * c-basic-offset: 4 + * indent-tabs-mode: nil + * End: + */ diff --git a/src/virt-viewer-vm-connection.xml b/src/virt-viewer-vm-connection.xml index 147dc92..04797fa 100644 --- a/src/virt-viewer-vm-connection.xml +++ b/src/virt-viewer-vm-connection.xml @@ -1,14 +1,6 @@ <?xml version="1.0" encoding="UTF-8"?> <!-- Generated with glade 3.16.1 --> <interface> - <object class="GtkListStore" id="store"> - <columns> - <!-- column-name name --> - <column type="gchararray"/> - <!-- column-name state --> - <column type="gchararray"/> - </columns> - </object> <object class="GtkDialog" id="vm-connection-dialog"> <property name="can_focus">False</property> <property name="border_width">5</property> @@ -71,7 +63,6 @@ <object class="GtkTreeView" id="treeview"> <property name="visible">True</property> <property name="can_focus">True</property> - <property name="model">store</property> <property name="headers_visible">False</property> <property name="search_column">0</property> <property name="enable_grid_lines">horizontal</property> @@ -89,17 +80,6 @@ </child> </object> </child> - <child> - <object class="GtkTreeViewColumn" id="treeviewcolumn2"> - <property name="title" translatable="yes">State</property> - <child> - <object class="GtkCellRendererText" id="cellrenderertext2"/> - <attributes> - <attribute name="text">1</attribute> - </attributes> - </child> - </object> - </child> </object> <packing> <property name="expand">True</property> -- 1.9.3 _______________________________________________ virt-tools-list mailing list virt-tools-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/virt-tools-list