--- gtk.c-1 2009-11-16 08:38:12.000000000 +0100 +++ gtk.c 2009-11-16 08:39:03.000000000 +0100 @@ -139,6 +139,10 @@ int preset_threaded; GtkWidget *preset_custom; GtkWidget *copy_menu_item; + /* value mappings for the mouse buttons. used for stylus devices. */ + int button_map_left; + int button_map_right; + int button_map_middle; }; void get_random_seed(void **randseed, int *randseedsize) @@ -608,11 +612,11 @@ return TRUE; if (event->button == 2 || (event->state & GDK_SHIFT_MASK)) - button = MIDDLE_BUTTON; + button = fe->button_map_middle; else if (event->button == 3 || (event->state & GDK_MOD1_MASK)) - button = RIGHT_BUTTON; + button = fe->button_map_right; else if (event->button == 1) - button = LEFT_BUTTON; + button = fe->button_map_left; else return FALSE; /* don't even know what button! */ @@ -636,14 +640,16 @@ return TRUE; if (event->state & (GDK_BUTTON2_MASK | GDK_SHIFT_MASK)) - button = MIDDLE_DRAG; + button = fe->button_map_middle; else if (event->state & GDK_BUTTON1_MASK) - button = LEFT_DRAG; + button = fe->button_map_left; else if (event->state & GDK_BUTTON3_MASK) - button = RIGHT_DRAG; + button = fe->button_map_right; else return FALSE; /* don't even know what button! */ + button += LEFT_DRAG - LEFT_BUTTON; + if (!midend_process_key(fe->me, event->x - fe->ox, event->y - fe->oy, button)) gtk_widget_destroy(fe->window); @@ -1536,6 +1542,29 @@ message_box(fe->window, titlebuf, textbuf, TRUE, MB_OK); } +#ifdef STYLUS_BASED +static void button_mouse_remap_event(GtkToggleButton *button, gpointer data) +{ + frontend *fe = (frontend *)data; + const gchar* label; + if (gtk_toggle_button_get_active(button)!=TRUE) return; + label=gtk_button_get_label(GTK_BUTTON(button)); + if (!label || label[0]=='L') { + fe->button_map_left =LEFT_BUTTON; + fe->button_map_right =RIGHT_BUTTON; + fe->button_map_middle=MIDDLE_BUTTON; + } else if (label[0]=='R') { + fe->button_map_left =RIGHT_BUTTON; + fe->button_map_right =LEFT_BUTTON; + fe->button_map_middle=MIDDLE_BUTTON; + } else if (label[0]=='M') { + fe->button_map_left =MIDDLE_BUTTON; + fe->button_map_right =LEFT_BUTTON; + fe->button_map_middle=RIGHT_BUTTON; + } +} +#endif /* STYLUS_BASED */ + static GtkWidget *add_menu_item_with_key(frontend *fe, GtkContainer *cont, char *text, int key) { @@ -1590,6 +1619,10 @@ fe = snew(frontend); + fe->button_map_left=LEFT_BUTTON; + fe->button_map_right=RIGHT_BUTTON; + fe->button_map_middle=MIDDLE_BUTTON; + fe->timer_active = FALSE; fe->timer_id = -1; @@ -1805,12 +1838,48 @@ gtk_widget_show(menuitem); #ifdef STYLUS_BASED + if (thegame.flags & REQUIRE_RBUTTON) { +#ifdef REQUIRE_MBUTTON + menuitem=gtk_radio_button_new_with_label(NULL,"Middle"); + gtk_toggle_button_set_mode(GTK_TOGGLE_BUTTON(menuitem),FALSE); + gtk_signal_connect(GTK_OBJECT(menuitem), "toggled", + GTK_SIGNAL_FUNC(button_mouse_remap_event), fe); + gtk_box_pack_end(hbox, menuitem, FALSE, FALSE, 0); + gtk_widget_show(menuitem); +#else + menuitem=NULL; +#endif + + menuitem=gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(menuitem),"Right"); + gtk_toggle_button_set_mode(GTK_TOGGLE_BUTTON(menuitem),FALSE); + gtk_signal_connect(GTK_OBJECT(menuitem), "toggled", + GTK_SIGNAL_FUNC(button_mouse_remap_event), fe); + gtk_box_pack_end(hbox, menuitem, FALSE, FALSE, 0); + gtk_widget_show(menuitem); + + menuitem=gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(menuitem),"Left"); + gtk_toggle_button_set_mode(GTK_TOGGLE_BUTTON(menuitem),FALSE); + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(menuitem),TRUE); + gtk_signal_connect(GTK_OBJECT(menuitem), "toggled", + GTK_SIGNAL_FUNC(button_mouse_remap_event), fe); + gtk_box_pack_end(hbox, menuitem, FALSE, FALSE, 0); + gtk_widget_show(menuitem); + } + + if (thegame.flags & REQUIRE_RBUTTON) { + menubar = GTK_WIDGET(gtk_hbox_new(FALSE, 0)); + gtk_box_pack_start(hbox, menubar, TRUE, FALSE, 0); + gtk_widget_show(menubar); + } else { + menubar=GTK_WIDGET(hbox); + } + menuitem=gtk_button_new_with_mnemonic("_Redo"); gtk_object_set_data(GTK_OBJECT(menuitem), "user-data", GINT_TO_POINTER((int)('r'))); gtk_signal_connect(GTK_OBJECT(menuitem), "clicked", GTK_SIGNAL_FUNC(menu_key_event), fe); - gtk_box_pack_end(hbox, menuitem, FALSE, FALSE, 0); + gtk_box_pack_end(GTK_BOX(menubar), menuitem, FALSE, FALSE, 0); gtk_widget_show(menuitem); menuitem=gtk_button_new_with_mnemonic("_Undo"); @@ -1818,7 +1887,7 @@ GINT_TO_POINTER((int)('u'))); gtk_signal_connect(GTK_OBJECT(menuitem), "clicked", GTK_SIGNAL_FUNC(menu_key_event), fe); - gtk_box_pack_end(hbox, menuitem, FALSE, FALSE, 0); + gtk_box_pack_end(GTK_BOX(menubar), menuitem, FALSE, FALSE, 0); gtk_widget_show(menuitem); if (thegame.flags & REQUIRE_NUMPAD) {