summaryrefslogtreecommitdiff
path: root/gtk/spicy.c
diff options
context:
space:
mode:
Diffstat (limited to 'gtk/spicy.c')
-rw-r--r--gtk/spicy.c53
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;
+ }
}
/* ------------------------------------------------------------------ */