aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorkraxel <kraxel>2008-10-08 20:51:12 +0000
committerkraxel <kraxel>2008-10-08 20:51:12 +0000
commitef561c275174cf420d4584b7a8e1b4de16fc4cc3 (patch)
treee4093034fb08d812e7a59314baebad40feff174d
parent58d0aaa1c4cde71ab8ff00b2ed858592de4b09cd (diff)
downloadqemu-gtk-ef561c275174cf420d4584b7a8e1b4de16fc4cc3.tar.gz
- add config file.
- make menu options persistent across restarts.
-rw-r--r--qemu-gtk.c92
-rw-r--r--qemu-gtk.h5
2 files changed, 83 insertions, 14 deletions
diff --git a/qemu-gtk.c b/qemu-gtk.c
index 1d99f90..ae3d08a 100644
--- a/qemu-gtk.c
+++ b/qemu-gtk.c
@@ -21,6 +21,43 @@
/* ------------------------------------------------------------------ */
+static GKeyFile *config;
+static char config_file[1024];
+static int config_dirty;
+
+static void config_read(void)
+{
+ char *home = getenv("HOME");
+ GError *err;
+
+ if (!home)
+ return;
+ snprintf(config_file, sizeof(config_file), "%s/.qemu-gtk.rc", home);
+ config = g_key_file_new();
+ g_key_file_load_from_file(config, config_file,
+ G_KEY_FILE_KEEP_COMMENTS, &err);
+}
+
+static void config_write(void)
+{
+ char *data;
+ gsize len;
+ GError *err;
+ int fd;
+
+ if (!config_dirty)
+ return;
+
+ data = g_key_file_to_data(config, &len, &err);
+ fd = open(config_file, O_WRONLY | O_CREAT | O_TRUNC, 0600);
+ if (-1 == fd)
+ return;
+ write(fd, data, len);
+ close(fd);
+}
+
+/* ------------------------------------------------------------------ */
+
static void vte_configure(GtkWidget *vte)
{
vte_terminal_set_scrollback_lines(VTE_TERMINAL(vte), 4096);
@@ -100,28 +137,34 @@ static gboolean window_state_cb(GtkWidget *widget, GdkEventWindowState *event,
static void menu_cb_scale_display(GtkToggleAction *action, gpointer userdata)
{
struct qemu_window *win = userdata;
- gboolean active;
- active = gtk_toggle_action_get_active(action);
- vnc_display_set_scaling(VNC_DISPLAY(win->vnc), active);
+ win->vnc_scale = gtk_toggle_action_get_active(action);
+ if (win->vnc)
+ vnc_display_set_scaling(VNC_DISPLAY(win->vnc), win->vnc_scale);
+ g_key_file_set_boolean(config, "vnc", "scale", win->vnc_scale);
+ config_dirty++;
}
static void menu_cb_grab_mouse(GtkToggleAction *action, gpointer userdata)
{
struct qemu_window *win = userdata;
- gboolean active;
- active = gtk_toggle_action_get_active(action);
- vnc_display_set_pointer_grab(VNC_DISPLAY(win->vnc), active);
+ win->vnc_grab_mouse = gtk_toggle_action_get_active(action);
+ if (win->vnc)
+ vnc_display_set_pointer_grab(VNC_DISPLAY(win->vnc), win->vnc_grab_mouse);
+ g_key_file_set_boolean(config, "vnc", "grab-mouse", win->vnc_grab_mouse);
+ config_dirty++;
}
static void menu_cb_grab_kbd(GtkToggleAction *action, gpointer userdata)
{
struct qemu_window *win = userdata;
- gboolean active;
- active = gtk_toggle_action_get_active(action);
- vnc_display_set_keyboard_grab(VNC_DISPLAY(win->vnc), active);
+ win->vnc_grab_kbd = gtk_toggle_action_get_active(action);
+ if (win->vnc)
+ vnc_display_set_keyboard_grab(VNC_DISPLAY(win->vnc), win->vnc_grab_kbd);
+ g_key_file_set_boolean(config, "vnc", "grab-kbd", win->vnc_grab_kbd);
+ config_dirty++;
}
static void menu_cb_send_ctrlaltdel(GtkToggleAction *action, gpointer userdata)
@@ -493,7 +536,7 @@ static const GtkActionEntry entries[] = {
static const GtkToggleActionEntry tentries[] = {
{
.name = "ScaleDisplay",
- .label = "_Scale Display",
+ .label = "_Scale VNC display",
.callback = G_CALLBACK(menu_cb_scale_display),
},{
.name = "FullScreen",
@@ -519,8 +562,8 @@ static char ui_xml[] =
" <menuitem action='Close'/>"
" </menu>"
" <menu action='ViewMenu'>"
-" <menuitem action='ScaleDisplay'/>"
" <menuitem action='FullScreen'/>"
+" <menuitem action='ScaleDisplay'/>"
" </menu>"
" <menu action='InputMenu'>"
" <menuitem action='GrabMouse'/>"
@@ -560,7 +603,7 @@ static void destroy(GtkWidget *widget, gpointer data)
static struct qemu_window *qemu_create_window(void)
{
struct qemu_window *win;
- GtkWidget *vbox, *menubar, *toolbar;
+ GtkWidget *vbox, *menubar, *toolbar, *item;
GtkAccelGroup *accel;
GtkActionGroup *ag;
GError *err;
@@ -598,7 +641,6 @@ static struct qemu_window *qemu_create_window(void)
/* main area */
win->tab = gtk_notebook_new();
-
/* status line */
win->status = gtk_label_new("status line");
gtk_misc_set_alignment(GTK_MISC(win->status), 0, 0.5);
@@ -620,6 +662,19 @@ static struct qemu_window *qemu_create_window(void)
gtk_box_pack_end(GTK_BOX(vbox), win->fstatus, FALSE, TRUE, 0);
gtk_container_add(GTK_CONTAINER(win->fstatus), win->status);
+ /* apply config */
+ win->vnc_scale = g_key_file_get_boolean(config, "vnc", "scale", &err);
+ item = gtk_ui_manager_get_widget(win->ui, "/MainMenu/ViewMenu/ScaleDisplay");
+ gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(item), win->vnc_scale);
+
+ win->vnc_grab_mouse = g_key_file_get_boolean(config, "vnc", "grab-mouse", &err);
+ item = gtk_ui_manager_get_widget(win->ui, "/MainMenu/InputMenu/GrabMouse");
+ gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(item), win->vnc_grab_mouse);
+
+ win->vnc_grab_kbd = g_key_file_get_boolean(config, "vnc", "grab-kbd", &err);
+ item = gtk_ui_manager_get_widget(win->ui, "/MainMenu/InputMenu/GrabKbd");
+ gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(item), win->vnc_grab_kbd);
+
return win;
}
@@ -628,6 +683,10 @@ void qemu_vnc_tab(struct qemu_window *win)
if (win->vnc)
return;
win->vnc = vnc_display_new();
+ vnc_display_set_scaling(VNC_DISPLAY(win->vnc), win->vnc_scale);
+ vnc_display_set_pointer_grab(VNC_DISPLAY(win->vnc), win->vnc_grab_mouse);
+ vnc_display_set_keyboard_grab(VNC_DISPLAY(win->vnc), win->vnc_grab_kbd);
+
gtk_signal_connect(GTK_OBJECT(win->vnc), "vnc-connected",
GTK_SIGNAL_FUNC(vnc_connected), win);
gtk_signal_connect(GTK_OBJECT(win->vnc), "vnc-initialized",
@@ -642,6 +701,7 @@ void qemu_vnc_tab(struct qemu_window *win)
GTK_SIGNAL_FUNC(vnc_credential), win);
gtk_signal_connect(GTK_OBJECT(win->vnc), "vnc-desktop-resize",
GTK_SIGNAL_FUNC(vnc_desktop_resize), win);
+
tabs_add(win, win->vnc, "vnc display", 0);
}
@@ -718,6 +778,9 @@ main(int argc, char *argv[])
exit(1);
}
+ /* init */
+ config_read();
+
/* main window */
win = qemu_create_window();
if (-1 == monitor_connect(win, argv[optind])) {
@@ -736,6 +799,9 @@ main(int argc, char *argv[])
/* main loop */
gtk_widget_show_all(win->toplevel);
gtk_main();
+
+ /* cleanup */
+ config_write();
if (win->gdb_pid)
kill(win->gdb_pid, SIGTERM);
exit(0);
diff --git a/qemu-gtk.h b/qemu-gtk.h
index 4e63d8c..3785378 100644
--- a/qemu-gtk.h
+++ b/qemu-gtk.h
@@ -65,7 +65,10 @@ struct qemu_window {
char name[128];
/* options */
- int quit_on_shutdown;
+ gboolean quit_on_shutdown;
+ gboolean vnc_scale;
+ gboolean vnc_grab_mouse;
+ gboolean vnc_grab_kbd;
};
/* qemu-gtk.c */