diff options
author | kraxel <kraxel> | 2008-10-08 20:51:12 +0000 |
---|---|---|
committer | kraxel <kraxel> | 2008-10-08 20:51:12 +0000 |
commit | ef561c275174cf420d4584b7a8e1b4de16fc4cc3 (patch) | |
tree | e4093034fb08d812e7a59314baebad40feff174d | |
parent | 58d0aaa1c4cde71ab8ff00b2ed858592de4b09cd (diff) | |
download | qemu-gtk-ef561c275174cf420d4584b7a8e1b4de16fc4cc3.tar.gz |
- add config file.
- make menu options persistent across restarts.
-rw-r--r-- | qemu-gtk.c | 92 | ||||
-rw-r--r-- | qemu-gtk.h | 5 |
2 files changed, 83 insertions, 14 deletions
@@ -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); @@ -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 */ |