void TXT_WindowKeyPress(txt_window_t *window, int c) { int i; // Is this a mouse button ? if (c >= TXT_MOUSE_BASE && c < TXT_MOUSE_BASE + TXT_MAX_MOUSE_BUTTONS) { MouseButtonPress(window, c); return; } // Try the window key spy if (window->key_listener != NULL) { // key listener can eat keys if (window->key_listener(window, c, window->key_listener_data)) { return; } } // Send to the currently selected widget if (TXT_WidgetKeyPress(window, c)) { return; } // Try all of the action buttons for (i=0; i<3; ++i) { if (window->actions[i] != NULL && TXT_WidgetKeyPress(window->actions[i], c)) { return; } } }
static void TXT_InputBoxMousePress(TXT_UNCAST_ARG(inputbox), int x, int y, int b) { TXT_CAST_ARG(txt_inputbox_t, inputbox); if (b == TXT_MOUSE_LEFT) { // Make mouse clicks start editing the box if (!inputbox->editing) { // Send a simulated keypress to start editing TXT_WidgetKeyPress(inputbox, KEY_ENTER); } } }
static int TXT_FileSelectKeyPress(TXT_UNCAST_ARG(fileselect), int key) { TXT_CAST_ARG(txt_fileselect_t, fileselect); // When the enter key is pressed, pop up a file selection dialog, // if file selectors work. Allow holding down 'alt' to override // use of the native file selector, so the user can just type a path. if (!fileselect->inputbox->editing && !TXT_GetModifierState(TXT_MOD_ALT) && key == KEY_ENTER) { if (DoSelectFile(fileselect)) { return 1; } } return TXT_WidgetKeyPress(fileselect->inputbox, key); }
static int TXT_ScrollPaneKeyPress(TXT_UNCAST_ARG(scrollpane), int key) { TXT_CAST_ARG(txt_scrollpane_t, scrollpane); int result; result = 0; if (scrollpane->child != NULL) { result = TXT_WidgetKeyPress(scrollpane->child, key); // Gross hack - if we're scrolling in a menu with the keyboard, // automatically move the scroll pane to show the new // selected item. if ((key == KEY_UPARROW || key == KEY_DOWNARROW || key == KEY_LEFTARROW || key == KEY_RIGHTARROW || key == KEY_PGUP || key == KEY_PGDN || key == KEY_TAB) && scrollpane->child->widget_class == &txt_table_class) { if (PageSelectedWidget(scrollpane, key)) { result = 1; } ShowSelectedWidget(scrollpane); } // If the child widget didn't use the keypress, we can see // if it can be interpreted as a scrolling command. if (result == 0) { result = InterpretScrollKey(scrollpane, key); } } return result; }
static int TXT_TableKeyPress(TXT_UNCAST_ARG(table), int key) { TXT_CAST_ARG(txt_table_t, table); int selected; int rows; rows = TableRows(table); // Send to the currently selected widget first selected = table->selected_y * table->columns + table->selected_x; if (selected >= 0 && selected < table->num_widgets) { if (table->widgets[selected] != NULL && table->widgets[selected]->selectable && TXT_WidgetKeyPress(table->widgets[selected], key)) { return 1; } } if (key == KEY_DOWNARROW) { int new_x, new_y; // Move cursor down to the next selectable widget for (new_y = table->selected_y + 1; new_y < rows; ++new_y) { new_x = FindSelectableColumn(table, new_y, table->selected_x); if (new_x >= 0) { // Found a selectable widget in this column! table->selected_x = new_x; table->selected_y = new_y; return 1; } } } if (key == KEY_UPARROW) { int new_x, new_y; // Move cursor up to the next selectable widget for (new_y = table->selected_y - 1; new_y >= 0; --new_y) { new_x = FindSelectableColumn(table, new_y, table->selected_x); if (new_x >= 0) { // Found a selectable widget in this column! table->selected_x = new_x; table->selected_y = new_y; return 1; } } } if (key == KEY_LEFTARROW) { int new_x; // Move cursor left for (new_x = table->selected_x - 1; new_x >= 0; --new_x) { if (SelectableWidget(table, new_x, table->selected_y)) { // Found a selectable widget! table->selected_x = new_x; return 1; } } } if (key == KEY_RIGHTARROW) { int new_x; // Move cursor left for (new_x = table->selected_x + 1; new_x < table->columns; ++new_x) { if (SelectableWidget(table, new_x, table->selected_y)) { // Found a selectable widget! table->selected_x = new_x; return 1; } } } return 0; }
static void WindowSelectCallback(TXT_UNCAST_ARG(widget), TXT_UNCAST_ARG(window)) { TXT_CAST_ARG(txt_window_t, window); TXT_WidgetKeyPress(window, KEY_ENTER); }
static int TXT_TableKeyPress(TXT_UNCAST_ARG(table), int key) { TXT_CAST_ARG(txt_table_t, table); int selected; int rows; rows = TableRows(table); // Send to the currently selected widget first selected = table->selected_y * table->columns + table->selected_x; if (selected >= 0 && selected < table->num_widgets) { if (IsActualWidget(table->widgets[selected]) && TXT_SelectableWidget(table->widgets[selected]) && TXT_WidgetKeyPress(table->widgets[selected], key)) { return 1; } } if (key == KEY_TAB) { int dir; int i; dir = TXT_GetModifierState(TXT_MOD_SHIFT) ? -1 : 1; // Cycle through all widgets until we find one that can be selected. for (i = table->selected_y * table->columns + table->selected_x + dir; i >= 0 && i < table->num_widgets; i += dir) { if (IsActualWidget(table->widgets[i]) && TXT_SelectableWidget(table->widgets[i])) { ChangeSelection(table, i % table->columns, i / table->columns); return 1; } } return 0; } if (key == KEY_DOWNARROW) { int new_x, new_y; // Move cursor down to the next selectable widget for (new_y = table->selected_y + 1; new_y < rows; ++new_y) { new_x = FindSelectableColumn(table, new_y, table->selected_x); if (new_x >= 0) { // Found a selectable widget in this column! ChangeSelection(table, new_x, new_y); return 1; } } } if (key == KEY_UPARROW) { int new_x, new_y; // Move cursor up to the next selectable widget for (new_y = table->selected_y - 1; new_y >= 0; --new_y) { new_x = FindSelectableColumn(table, new_y, table->selected_x); if (new_x >= 0) { // Found a selectable widget in this column! ChangeSelection(table, new_x, new_y); return 1; } } } if (key == KEY_LEFTARROW) { int new_x; // Move cursor left for (new_x = table->selected_x - 1; new_x >= 0; --new_x) { if (SelectableCell(table, new_x, table->selected_y)) { // Found a selectable widget! ChangeSelection(table, new_x, table->selected_y); return 1; } } } if (key == KEY_RIGHTARROW) { int new_x; // Move cursor left for (new_x = table->selected_x + 1; new_x < table->columns; ++new_x) { if (SelectableCell(table, new_x, table->selected_y)) { // Found a selectable widget! ChangeSelection(table, new_x, table->selected_y); return 1; } } } return 0; }