diff options
Diffstat (limited to 'gtk/spicy.c')
-rw-r--r-- | gtk/spicy.c | 53 |
1 files changed, 44 insertions, 9 deletions
diff --git a/gtk/spicy.c b/gtk/spicy.c index b374c64..7fe9455 100644 --- a/gtk/spicy.c +++ b/gtk/spicy.c @@ -17,6 +17,15 @@ static spice_window *wins[4]; /* ------------------------------------------------------------------ */ +static void destroy_cb(GtkWidget *widget, gpointer data) +{ + struct spice_window *win = data; + + if (win->id == 0) { + gtk_main_quit(); + } +} + static spice_window *create_spice_window(SpiceSession *s, int id) { char title[32]; @@ -34,6 +43,8 @@ static spice_window *create_spice_window(SpiceSession *s, int id) 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), 320, 280); + g_signal_connect(G_OBJECT(win->toplevel), "destroy", + G_CALLBACK(destroy_cb), win); /* spice display */ win->spice = spice_display_new(s, id); @@ -62,20 +73,44 @@ static spice_window *create_spice_window(SpiceSession *s, int id) return win; } +/* ------------------------------------------------------------------ */ + +static void main_channel_event(SpiceChannel *channel, enum SpiceChannelEvent event, + gpointer *data) +{ + fprintf(stderr, "main channel event: %d\n", event); + + switch (event) { + case SPICE_CHANNEL_OPENED: + /* nothing */ + break; + default: + /* TODO: more sophisticated error handling */ + gtk_main_quit(); + break; + } +} + static void channel_new(SpiceSession *s, SpiceChannel *channel, gpointer *data) { int type = spice_channel_type(channel); int id = spice_channel_id(channel); - if (type != SPICE_CHANNEL_DISPLAY) - return; - if (id >= SPICE_N_ELEMENTS(wins)) - return; - if (wins[id] != NULL) - return; - - fprintf(stderr, "new display channel (#%d), creating window\n", id); - wins[id] = create_spice_window(s, id); + switch (type) { + case SPICE_CHANNEL_MAIN: + g_signal_connect(channel, "spice-channel-event", + G_CALLBACK(main_channel_event), NULL); + fprintf(stderr, "new main channel\n"); + break; + case SPICE_CHANNEL_DISPLAY: + if (id >= SPICE_N_ELEMENTS(wins)) + return; + if (wins[id] != NULL) + return; + fprintf(stderr, "new display channel (#%d), creating window\n", id); + wins[id] = create_spice_window(s, id); + break; + } } /* ------------------------------------------------------------------ */ |