summaryrefslogtreecommitdiff
path: root/gtk/spicy.c
diff options
context:
space:
mode:
Diffstat (limited to 'gtk/spicy.c')
-rw-r--r--gtk/spicy.c54
1 files changed, 52 insertions, 2 deletions
diff --git a/gtk/spicy.c b/gtk/spicy.c
index 6a7c41c..4ec9b52 100644
--- a/gtk/spicy.c
+++ b/gtk/spicy.c
@@ -15,6 +15,7 @@ struct spice_window {
/* config */
static char *host = "localhost";
static char *port = "5920";
+static bool fullscreen = false;
/* state */
static SpiceSession *session;
@@ -40,6 +41,18 @@ static void menu_cb_fullscreen(GtkAction *action, void *data)
}
}
+static void menu_cb_bool_prop(GtkToggleAction *action, gpointer data)
+{
+ struct spice_window *win = data;
+ gboolean state = gtk_toggle_action_get_active(action);
+
+ fprintf(stderr, "%s: %s = %s\n", __FUNCTION__,
+ gtk_action_get_name(GTK_ACTION(action)), state ? "yes" : "no");
+ g_object_set(G_OBJECT(win->spice),
+ gtk_action_get_name(GTK_ACTION(action)), state,
+ NULL);
+}
+
static void menu_cb_about(GtkAction *action, void *data)
{
static char *comments = "gtk client app for the\n"
@@ -80,6 +93,7 @@ static gboolean window_state_cb(GtkWidget *widget, GdkEventWindowState *event,
gtk_widget_hide(win->menubar);
gtk_widget_hide(win->toolbar);
gtk_widget_hide(win->fstatus);
+ gtk_widget_grab_focus(win->spice);
} else {
gtk_widget_show(win->menubar);
gtk_widget_show(win->toolbar);
@@ -99,6 +113,9 @@ static const GtkActionEntry entries[] = {
.name = "ViewMenu",
.label = "_View",
},{
+ .name = "OptionMenu",
+ .label = "_Options",
+ },{
.name = "HelpMenu",
.label = "_Help",
},{
@@ -127,6 +144,18 @@ static const GtkActionEntry entries[] = {
}
};
+static const GtkToggleActionEntry tentries[] = {
+ {
+ .name = "grab-keyboard",
+ .label = "Grab keyboard",
+ .callback = G_CALLBACK(menu_cb_bool_prop),
+ },{
+ .name = "resize-guest",
+ .label = "Resize guest",
+ .callback = G_CALLBACK(menu_cb_bool_prop),
+ }
+};
+
static char ui_xml[] =
"<ui>\n"
" <menubar action='MainMenu'>\n"
@@ -136,6 +165,10 @@ static char ui_xml[] =
" <menu action='ViewMenu'>\n"
" <menuitem action='Fullscreen'/>\n"
" </menu>\n"
+" <menu action='OptionMenu'>\n"
+" <menuitem action='grab-keyboard'/>\n"
+" <menuitem action='resize-guest'/>\n"
+" </menu>\n"
" <menu action='HelpMenu'>\n"
" <menuitem action='About'/>\n"
" </menu>\n"
@@ -153,6 +186,7 @@ static spice_window *create_spice_window(SpiceSession *s, int id)
struct spice_window *win;
GtkWidget *vbox;
GError *err = NULL;
+ int i;
win = malloc(sizeof(*win));
if (NULL == win)
@@ -164,7 +198,6 @@ static spice_window *create_spice_window(SpiceSession *s, int id)
win->toplevel = gtk_window_new(GTK_WINDOW_TOPLEVEL);
snprintf(title, sizeof(title), "spice display %d", id);
gtk_window_set_title(GTK_WINDOW(win->toplevel), title);
- gtk_window_set_default_size(GTK_WINDOW(win->toplevel), 640, 480);
g_signal_connect(G_OBJECT(win->toplevel), "destroy",
G_CALLBACK(destroy_cb), win);
g_signal_connect(G_OBJECT(win->toplevel), "window-state-event",
@@ -174,6 +207,8 @@ static spice_window *create_spice_window(SpiceSession *s, int id)
win->ui = gtk_ui_manager_new();
win->ag = gtk_action_group_new("MenuActions");
gtk_action_group_add_actions(win->ag, entries, G_N_ELEMENTS(entries), win);
+ gtk_action_group_add_toggle_actions(win->ag, tentries,
+ G_N_ELEMENTS(tentries), win);
gtk_ui_manager_insert_action_group(win->ui, win->ag, 0);
win->accel = gtk_ui_manager_get_accel_group(win->ui);
gtk_window_add_accel_group(GTK_WINDOW(win->toplevel), win->accel);
@@ -206,7 +241,18 @@ static spice_window *create_spice_window(SpiceSession *s, int id)
gtk_box_pack_end(GTK_BOX(vbox), win->fstatus, FALSE, TRUE, 0);
gtk_container_add(GTK_CONTAINER(win->fstatus), win->status);
+ /* init toggle actions */
+ for (i = 0; i < G_N_ELEMENTS(tentries); i++) {
+ GtkAction *toggle;
+ gboolean state;
+ toggle = gtk_action_group_get_action(win->ag, tentries[i].name);
+ g_object_get(win->spice, tentries[i].name, &state, NULL);
+ gtk_toggle_action_set_active(GTK_TOGGLE_ACTION(toggle), state);
+ }
+
/* show window */
+ if (fullscreen)
+ gtk_window_fullscreen(GTK_WINDOW(win->toplevel));
gtk_widget_show_all(win->toplevel);
return win;
}
@@ -262,6 +308,7 @@ static void usage(FILE *fp)
"options:\n"
" -h host [ %s ]\n"
" -p port [ %s ]\n"
+ " -f fullscreen\n"
"\n",
host, port);
}
@@ -273,7 +320,7 @@ int main(int argc, char *argv[])
/* parse opts */
gtk_init(&argc, &argv);
for (;;) {
- if (-1 == (c = getopt(argc, argv, "h:p:")))
+ if (-1 == (c = getopt(argc, argv, "h:p:f")))
break;
switch (c) {
case 'h':
@@ -282,6 +329,9 @@ int main(int argc, char *argv[])
case 'p':
port = optarg;
break;
+ case 'f':
+ fullscreen = true;
+ break;
#if 0 /* --help */
case 'h':
usage(stdout);