aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGerd Hoffmann <kraxel@redhat.com>2014-09-23 07:40:41 +0200
committerGerd Hoffmann <kraxel@redhat.com>2014-09-23 07:40:41 +0200
commit8c7eac0fbf18273ff4a8036ad412da25a4e11382 (patch)
tree14eaebc340f48ad27f6a766d1bf6adaa7357f44f
parent65df255453ce41fe15fda89787ba6b46e8b22464 (diff)
downloadvconsole-8c7eac0fbf18273ff4a8036ad412da25a4e11382.tar.gz
add virsh edit support, tab buttons, notebook tweaks
-rw-r--r--domain.c25
-rw-r--r--vconsole.c51
2 files changed, 72 insertions, 4 deletions
diff --git a/domain.c b/domain.c
index 1bdb10e..a0da485 100644
--- a/domain.c
+++ b/domain.c
@@ -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);
diff --git a/vconsole.c b/vconsole.c
index 2201cfe..757fab1 100644
--- a/vconsole.c
+++ b/vconsole.c
@@ -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);