X-Git-Url: https://git.distorted.org.uk/~mdw/sgt/puzzles/blobdiff_plain/8c1fd9740e4de65fff05f3635491e23d67d065e8..5dda68e8cf413ef970e2aed330c01af2aeae856a:/gtk.c diff --git a/gtk.c b/gtk.c index 1703001..72fdcdd 100644 --- a/gtk.c +++ b/gtk.c @@ -231,6 +231,8 @@ void end_draw(frontend *fe) static void destroy(GtkWidget *widget, gpointer data) { + frontend *fe = (frontend *)data; + deactivate_timer(fe); gtk_main_quit(); } @@ -283,7 +285,7 @@ static gint button_event(GtkWidget *widget, GdkEventButton *event, if (!fe->pixmap) return TRUE; - if (event->type != GDK_BUTTON_PRESS) + if (event->type != GDK_BUTTON_PRESS && event->type != GDK_BUTTON_RELEASE) return TRUE; if (event->button == 2 || (event->state & GDK_SHIFT_MASK)) @@ -295,6 +297,33 @@ static gint button_event(GtkWidget *widget, GdkEventButton *event, else return FALSE; /* don't even know what button! */ + if (event->type == GDK_BUTTON_RELEASE) + button += LEFT_RELEASE - LEFT_BUTTON; + + if (!midend_process_key(fe->me, event->x, event->y, button)) + gtk_widget_destroy(fe->window); + + return TRUE; +} + +static gint motion_event(GtkWidget *widget, GdkEventMotion *event, + gpointer data) +{ + frontend *fe = (frontend *)data; + int button; + + if (!fe->pixmap) + return TRUE; + + if (event->state & (GDK_BUTTON2_MASK | GDK_SHIFT_MASK)) + button = MIDDLE_DRAG; + else if (event->state & GDK_BUTTON1_MASK) + button = LEFT_DRAG; + else if (event->state & GDK_BUTTON3_MASK) + button = RIGHT_DRAG; + else + return FALSE; /* don't even know what button! */ + if (!midend_process_key(fe->me, event->x, event->y, button)) gtk_widget_destroy(fe->window); @@ -434,6 +463,8 @@ void error_box(GtkWidget *parent, char *msg) gtk_window_set_default(GTK_WINDOW(window), ok); gtk_signal_connect(GTK_OBJECT(ok), "clicked", GTK_SIGNAL_FUNC(errmsg_button_clicked), window); + gtk_signal_connect(GTK_OBJECT(window), "destroy", + GTK_SIGNAL_FUNC(window_destroy), NULL); gtk_signal_connect(GTK_OBJECT(window), "key_press_event", GTK_SIGNAL_FUNC(win_key_press), ok); gtk_window_set_modal(GTK_WINDOW(window), TRUE); @@ -735,7 +766,7 @@ static void add_menu_separator(GtkContainer *cont) gtk_widget_show(menuitem); } -static frontend *new_window(void) +static frontend *new_window(char *game_id, char **error) { frontend *fe; GtkBox *vbox; @@ -747,6 +778,14 @@ static frontend *new_window(void) time(&t); fe->me = midend_new(fe, &t, sizeof(t)); + if (game_id) { + *error = midend_game_id(fe->me, game_id, FALSE); + if (*error) { + midend_free(fe->me); + sfree(fe); + return NULL; + } + } midend_new_game(fe->me); fe->window = gtk_window_new(GTK_WINDOW_TOPLEVEL); @@ -869,7 +908,7 @@ static frontend *new_window(void) #if 0 /* For GTK 2.0, should we be using gtk_widget_set_size_request? */ #endif - gtk_widget_set_usize(viewport, x, req.height); + gtk_widget_set_usize(viewport, -1, req.height); } else fe->statusbar = NULL; @@ -893,6 +932,10 @@ static frontend *new_window(void) GTK_SIGNAL_FUNC(key_event), fe); gtk_signal_connect(GTK_OBJECT(fe->area), "button_press_event", GTK_SIGNAL_FUNC(button_event), fe); + gtk_signal_connect(GTK_OBJECT(fe->area), "button_release_event", + GTK_SIGNAL_FUNC(button_event), fe); + gtk_signal_connect(GTK_OBJECT(fe->area), "motion_notify_event", + GTK_SIGNAL_FUNC(motion_event), fe); gtk_signal_connect(GTK_OBJECT(fe->area), "expose_event", GTK_SIGNAL_FUNC(expose_area), fe); gtk_signal_connect(GTK_OBJECT(fe->window), "map_event", @@ -900,7 +943,10 @@ static frontend *new_window(void) gtk_signal_connect(GTK_OBJECT(fe->area), "configure_event", GTK_SIGNAL_FUNC(configure_area), fe); - gtk_widget_add_events(GTK_WIDGET(fe->area), GDK_BUTTON_PRESS_MASK); + gtk_widget_add_events(GTK_WIDGET(fe->area), + GDK_BUTTON_PRESS_MASK | + GDK_BUTTON_RELEASE_MASK | + GDK_BUTTON_MOTION_MASK); gtk_widget_show(fe->area); gtk_widget_show(fe->window); @@ -910,8 +956,16 @@ static frontend *new_window(void) int main(int argc, char **argv) { + char *pname = argv[0]; + char *error; + gtk_init(&argc, &argv); - (void) new_window(); + + if (!new_window(argc > 1 ? argv[1] : NULL, &error)) { + fprintf(stderr, "%s: %s\n", pname, error); + return 1; + } + gtk_main(); return 0;