X-Git-Url: https://git.distorted.org.uk/~mdw/sgt/puzzles/blobdiff_plain/8c1fd9740e4de65fff05f3635491e23d67d065e8..50239b2de2485097ce279c34bc9f9e25105e1bac:/gtk.c diff --git a/gtk.c b/gtk.c index 1703001..6a98726 100644 --- a/gtk.c +++ b/gtk.c @@ -283,7 +283,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 +295,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); @@ -869,7 +896,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 +920,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 +931,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);