}
void
-HighlightListBoxItem (Option *opt, int index)
+HighlightItem (Option *opt, int index, int scroll)
{
char *value, **data = (char **) (opt->target);
GtkWidget *list = (GtkWidget *) (opt->handle);
GtkListStore *store = GTK_LIST_STORE(model);
GtkTreePath *path = gtk_tree_path_new_from_indices(index, -1);
GtkTreeIter iter;
- gtk_tree_model_get_iter(GTK_TREE_MODEL (store), &iter, path);
+ gtk_tree_selection_select_path(selection, path);
+ if(scroll) gtk_tree_view_scroll_to_cell(list, path, NULL, 0, 0, 0);
gtk_tree_path_free(path);
- gtk_tree_selection_select_iter(selection, &iter);
}
void
-HighlightWithScroll (Option *opt, int sel, int max)
+HighlightListBoxItem (Option *opt, int index)
+{
+ HighlightItem (opt, index, FALSE);
+}
+
+void
+HighlightWithScroll (Option *opt, int index, int max)
{
- HighlightListBoxItem (opt, index); // just highlight, as GTK scrolls by itself
+ HighlightItem (opt, index, TRUE); // ignore max
}
int
}
}
+int shiftState, controlState;
+
+static gboolean
+TypeInProc (GtkWidget *widget, GdkEventKey *event, gpointer gdata)
+{ // This callback catches key presses on text-entries, and uses <Enter> and <Esc> as synonyms for dialog OK or Cancel
+ // *** kludge alert *** If a dialog does want some other action, like sending the line typed in the text-entry to an ICS,
+ // it should define an OK handler that does so, and returns FALSE to suppress the popdown.
+ int n = (intptr_t) gdata;
+ int dlg = n >> 16;
+ Option *opt;
+ n &= 0xFFFF;
+ opt = &dialogOptions[dlg][n];
+
+ if(opt == icsBox) return ICSKeyEvent(event->keyval); // Intercept ICS Input Box, which needs special treatment
+
+ shiftState = event->state & GDK_SHIFT_MASK;
+ controlState = event->state & GDK_CONTROL_MASK;
+ switch(event->keyval) {
+ case GDK_Return:
+ if(GenericReadout(dialogOptions[dlg], -1)) PopDown(dlg);
+ break;
+ case GDK_Escape:
+ PopDown(dlg);
+ break;
+ default:
+ return FALSE;
+ }
+ return TRUE;
+}
+
void
HighlightText (Option *opt, int from, int to, Boolean highlight)
{
gtk_text_buffer_apply_tag_by_name(opt->handle, highlight ? "highlight" : "normal", &start, &end);
}
+int
+ShiftKeys ()
+{ // bassic primitive for determining if modifier keys are pressed
+ return 3*(shiftState != 0) + 0xC*(controlState != 0); // rely on what last mouse button press left us
+}
+
+static gboolean
+GameListEvent(GtkWidget *widget, GdkEvent *event, gpointer gdata)
+{
+ int n = (int) gdata;
+
+ if(n == 4) {
+ if(((GdkEventKey *) event)->keyval != GDK_Return) return FALSE;
+ SetFilter();
+ return TRUE;
+ }
+
+ if(event->type == GDK_KEY_PRESS) {
+ int ctrl = (((GdkEventKey *) event)->state & GDK_CONTROL_MASK) != 0;
+ switch(((GdkEventKey *) event)->keyval) {
+ case GDK_Up: GameListClicks(-1 - 2*ctrl); return TRUE;
+ case GDK_Left: GameListClicks(-1); return TRUE;
+ case GDK_Down: GameListClicks(1 + 2*ctrl); return TRUE;
+ case GDK_Right: GameListClicks(1); return TRUE;
+ case GDK_Prior: GameListClicks(-4); return TRUE;
+ case GDK_Next: GameListClicks(4); return TRUE;
+ case GDK_Home: GameListClicks(-2); return TRUE;
+ case GDK_End: GameListClicks(2); return TRUE;
+ case GDK_Return: GameListClicks(0); return TRUE;
+ default: return FALSE;
+ }
+ }
+ if(event->type != GDK_2BUTTON_PRESS || ((GdkEventButton *) event)->button != 1) return FALSE;
+ GameListClicks(0);
+ return TRUE;
+}
+
static gboolean
MemoEvent(GtkWidget *widget, GdkEvent *event, gpointer gdata)
{ // handle mouse clicks on text widgets that need it
gboolean res;
gint index, x, y;
+ if(memo->type == Label) { ((ButtonCallback*) memo->target)(memo->value); return TRUE; } // only clock widgets use this
+
switch(event->type) { // figure out what's up
case GDK_MOTION_NOTIFY:
f = 0;
case GDK_BUTTON_PRESS:
w = bevent->x; h = bevent->y;
button = bevent->button;
+ shiftState = bevent->state & GDK_SHIFT_MASK;
+ controlState = bevent->state & GDK_CONTROL_MASK;
// GTK_TODO: is this really the most efficient way to get the character at the mouse cursor???
gtk_text_view_window_to_buffer_coords(widget, GTK_TEXT_WINDOW_WIDGET, w, h, &x, &y);
gtk_text_view_get_iter_at_location(widget, &start, x, y);
}
void
-AddHandler (Option *opt, int nr)
+AddHandler (Option *opt, DialogClass dlg, int nr)
{
switch(nr) {
case 0:
case 1:
case 2: break;
- case 3: g_signal_connect(opt->handle, "key-press-event", G_CALLBACK (ICSKeyEvent), NULL); break; // Input Box
- case 4:
- case 5:
- case 6: break;
+ case 3: // input box
+ g_signal_connect(opt->handle, "key-press-event", G_CALLBACK (ICSKeyEvent), NULL); break; // Input Box
+ case 5: // game list
+ g_signal_connect(opt->handle, "button-press-event", G_CALLBACK (GameListEvent), (gpointer) 0 );
+ case 4: // game-list filter
+ g_signal_connect(opt->handle, "key-press-event", G_CALLBACK (GameListEvent), (gpointer) nr );
+ break;
+ case 6:
+ break;
}
-#ifdef TODO_GTK
- XtOverrideTranslations(opt->handle, XtParseTranslationTable(translationTable[nr]));
-#endif
}
//----------------------------Generic dialog --------------------------------------------
xev.xclient.data.l[1] = CurrentTime;
XSendEvent (xDisplay,
- root, False,
+ root, False,static gboolean
+MemoEvent(GtkWidget *widget, GdkEvent *event, gpointer gdata)
+
SubstructureRedirectMask | SubstructureNotifyMask,
&xev);
case GDK_BUTTON_PRESS:
w = bevent->x; h = bevent->y;
button = bevent->button;
+ shiftState = bevent->state & GDK_SHIFT_MASK;
+ controlState = bevent->state & GDK_CONTROL_MASK;
}
button *= f;
gtk_container_add(GTK_CONTAINER(frame), label);
label = frame;
}
- Pack(hbox, table, label, left, left+3, top);
+ Pack(hbox, table, label, left, left+3, top);
+ if(option[i].target) { // allow user to specify event handler for button presses
+ gtk_widget_add_events(GTK_WIDGET(label), GDK_BUTTON_PRESS_MASK);
+ g_signal_connect(label, "button-press-event", G_CALLBACK(MemoEvent), (gpointer) &option[i]);
+ }
break;
case SaveButton:
case Button: