diff options
author | Gerd Hoffmann <kraxel@redhat.com> | 2014-09-23 07:40:41 +0200 |
---|---|---|
committer | Gerd Hoffmann <kraxel@redhat.com> | 2014-09-23 07:40:41 +0200 |
commit | 8c7eac0fbf18273ff4a8036ad412da25a4e11382 (patch) | |
tree | 14eaebc340f48ad27f6a766d1bf6adaa7357f44f | |
parent | 65df255453ce41fe15fda89787ba6b46e8b22464 (diff) | |
download | vconsole-8c7eac0fbf18273ff4a8036ad412da25a4e11382.tar.gz |
add virsh edit support, tab buttons, notebook tweaks
-rw-r--r-- | domain.c | 25 | ||||
-rw-r--r-- | vconsole.c | 51 |
2 files changed, 72 insertions, 4 deletions
@@ -678,11 +678,19 @@ void domain_update_all(struct vconsole_window *win) } } +static void domain_close_tab_btn(GtkWidget *btn, gpointer opaque) +{ + struct vconsole_domain *dom = opaque; + virDomainPtr d = virDomainLookupByUUIDString(dom->conn->ptr, dom->uuid); + + domain_close_tab(dom, d); +} + void domain_activate(struct vconsole_domain *dom) { virDomainPtr d = virDomainLookupByUUIDString(dom->conn->ptr, dom->uuid); struct vconsole_window *win = dom->conn->win; - GtkWidget *label, *fstatus; + GtkWidget *label, *lclose, *limg, *lhbox, *fstatus; gint page; if (dom->vte) { @@ -710,8 +718,21 @@ void domain_activate(struct vconsole_domain *dom) gtk_container_add(GTK_CONTAINER(fstatus), dom->status); label = gtk_label_new(dom->name); + lclose = gtk_button_new(); + g_signal_connect(lclose, "clicked", + G_CALLBACK(domain_close_tab_btn), dom); + limg = gtk_image_new_from_stock(GTK_STOCK_CLOSE, GTK_ICON_SIZE_MENU); + gtk_button_set_image(GTK_BUTTON(lclose), limg); + gtk_button_set_always_show_image(GTK_BUTTON(lclose), TRUE); + lhbox = gtk_hbox_new(FALSE, 1); + gtk_box_pack_start(GTK_BOX(lhbox), label, TRUE, TRUE, 0); + gtk_box_pack_start(GTK_BOX(lhbox), lclose, FALSE, TRUE, 0); + gtk_widget_show_all(lhbox); + page = gtk_notebook_insert_page(GTK_NOTEBOOK(win->notebook), - dom->vbox, label, -1); + dom->vbox, lhbox, -1); + gtk_notebook_set_tab_reorderable(GTK_NOTEBOOK(win->notebook), + dom->vbox, TRUE); gtk_widget_show_all(dom->vbox); gtk_notebook_set_current_page(GTK_NOTEBOOK(win->notebook), page); domain_configure_vte(dom); @@ -324,6 +324,36 @@ static void run_virt_viewer(struct vconsole_domain *dom, } } +static void run_virsh_edit(struct vconsole_domain *dom) +{ + char *argv[32]; + int argc = 0; + char *uri; + + uri = virConnectGetURI(dom->conn->ptr); + + argv[argc++] = "xterm"; + argv[argc++] = "-e"; + argv[argc++] = "virsh"; + argv[argc++] = "-c"; + argv[argc++] = uri; + argv[argc++] = "edit"; + argv[argc++] = dom->uuid; + argv[argc++] = NULL; + assert(argc < sizeof(argv)/sizeof(argv[0])); + + if (fork() <= 0) { + /* parent */ + free(uri); + return; + } else { + /* child */ + execvp("xterm", argv); + perror("execvp"); + exit(1); + } +} + static void menu_cb_untabify(GtkToggleAction *action, gpointer userdata) { struct vconsole_window *win = userdata; @@ -333,6 +363,15 @@ static void menu_cb_untabify(GtkToggleAction *action, gpointer userdata) domain_untabify(dom); } +static void menu_cb_vm_edit(GtkAction *action, void *data) +{ + struct vconsole_window *win = data; + struct vconsole_domain *dom = find_guest(win); + + if (dom) + run_virsh_edit(dom); +} + static void menu_cb_vm_gfx(GtkAction *action, void *data) { struct vconsole_window *win = data; @@ -529,6 +568,10 @@ static const GtkActionEntry entries[] = { },{ /* --- guest menu --- */ + .name = "GuestEdit", + .label = "Change guest configuration", + .callback = G_CALLBACK(menu_cb_vm_edit), + },{ .name = "GuestGfx", .label = "Show graphic console", .callback = G_CALLBACK(menu_cb_vm_gfx), @@ -636,6 +679,8 @@ static char ui_xml[] = " <menu action='GuestMenu'>\n" " <menuitem action='GuestLogging'/>\n" " <separator/>\n" +" <menuitem action='GuestEdit'/>\n" +" <separator/>\n" " <menuitem action='GuestGfx'/>\n" " <separator/>\n" " <menuitem action='GuestRun'/>\n" @@ -653,8 +698,6 @@ static char ui_xml[] = " </menu>\n" " </menubar>\n" " <toolbar action='ToolBar'>" -" <toolitem action='CloseTab'/>\n" -" <separator/>\n" " <toolitem action='GuestRun'/>\n" " <toolitem action='GuestPause'/>\n" " <toolitem action='GuestSave'/>\n" @@ -794,6 +837,10 @@ static struct vconsole_window *vconsole_toplevel_create(void) /* main area */ win->notebook = gtk_notebook_new(); + gtk_notebook_set_tab_pos(GTK_NOTEBOOK(win->notebook), GTK_POS_TOP); + gtk_notebook_set_show_tabs(GTK_NOTEBOOK(win->notebook), TRUE); + gtk_notebook_set_scrollable(GTK_NOTEBOOK(win->notebook), TRUE); + gtk_notebook_popup_enable(GTK_NOTEBOOK(win->notebook)); /* Make a vbox and put stuff in */ vbox = gtk_vbox_new(FALSE, 1); |