static void MouseButtonPress(txt_window_t *window, int b) { int x, y; int i; txt_widget_t *widgets; txt_widget_t *widget; // Lay out the window, set positions and sizes of all widgets TXT_LayoutWindow(window); // Get the current mouse position TXT_GetMousePosition(&x, &y); // Try the mouse button listener // This happens whether it is in the window range or not if (window->mouse_listener != NULL) { // Mouse listener can eat button presses if (window->mouse_listener(window, x, y, b, window->mouse_listener_data)) { return; } } // Is it within the table range? widgets = (txt_widget_t *) window; if (x >= widgets->x && x < (signed) (widgets->x + widgets->w) && y >= widgets->y && y < (signed) (widgets->y + widgets->h)) { TXT_WidgetMousePress(window, x, y, b); } // Was one of the action area buttons pressed? for (i=0; i<3; ++i) { widget = (txt_widget_t *) window->actions[i]; if (widget != NULL && x >= widget->x && x < (signed) (widget->x + widget->w) && y >= widget->y && y < (signed) (widget->y + widget->h)) { TXT_WidgetMousePress(widget, x, y, b); break; } } }
static void TXT_ScrollPaneMousePress(TXT_UNCAST_ARG(scrollpane), int x, int y, int b) { TXT_CAST_ARG(txt_scrollpane_t, scrollpane); int scrollbars; int rel_x, rel_y; scrollbars = NeedsScrollbars(scrollpane); rel_x = x - scrollpane->widget.x; rel_y = y - scrollpane->widget.y; // Click on the horizontal scrollbar? if ((scrollbars & SCROLLBAR_HORIZONTAL) && rel_y == scrollpane->h) { if (rel_x == 0) { --scrollpane->x; } else if (rel_x == scrollpane->w - 1) { ++scrollpane->x; } else { int range = FullWidth(scrollpane) - scrollpane->w; scrollpane->x = ((rel_x - 1) * range) / (scrollpane->w - 3); } return; } // Click on the horizontal scrollbar? if ((scrollbars & SCROLLBAR_VERTICAL) && rel_x == scrollpane->w) { if (rel_y == 0) { --scrollpane->y; } else if (rel_y == scrollpane->h - 1) { ++scrollpane->y; } else { int range = FullHeight(scrollpane) - scrollpane->h; scrollpane->y = ((rel_y - 1) * range) / (scrollpane->h - 3); } return; } if (scrollpane->child != NULL) { TXT_WidgetMousePress(scrollpane->child, x, y, b); } }
static void TXT_FileSelectMousePress(TXT_UNCAST_ARG(fileselect), int x, int y, int b) { TXT_CAST_ARG(txt_fileselect_t, fileselect); if (!fileselect->inputbox->editing && !TXT_GetModifierState(TXT_MOD_ALT) && b == TXT_MOUSE_LEFT) { if (DoSelectFile(fileselect)) { return; } } return TXT_WidgetMousePress(fileselect->inputbox, x, y, b); }
static void TXT_TableMousePress(TXT_UNCAST_ARG(table), int x, int y, int b) { TXT_CAST_ARG(txt_table_t, table); txt_widget_t *widget; int i; for (i=0; i<table->num_widgets; ++i) { widget = table->widgets[i]; // NULL widgets are spacers if (widget != NULL) { if (x >= widget->x && x < (signed) (widget->x + widget->w) && y >= widget->y && y < (signed) (widget->y + widget->h)) { // This is the widget that was clicked! // Select the cell if the widget is selectable if (widget->selectable) { table->selected_x = i % table->columns; table->selected_y = i / table->columns; } // Propagate click TXT_WidgetMousePress(widget, x, y, b); break; } } } }
static void MouseButtonPress(txt_window_t *window, int b) { int x, y; int i; txt_widget_t *widgets; txt_widget_t *widget; // Lay out the window, set positions and sizes of all widgets TXT_LayoutWindow(window); // Get the current mouse position TXT_GetMousePosition(&x, &y); // Try the mouse button listener // This happens whether it is in the window range or not if (window->mouse_listener != NULL) { // Mouse listener can eat button presses if (window->mouse_listener(window, x, y, b, window->mouse_listener_data)) { return; } } // Is it within the table range? widgets = (txt_widget_t *) window; if (x >= widgets->x && x < (signed) (widgets->x + widgets->w) && y >= widgets->y && y < (signed) (widgets->y + widgets->h)) { TXT_WidgetMousePress(window, x, y, b); } // Was one of the action area buttons pressed? for (i=0; i<3; ++i) { widget = (txt_widget_t *) window->actions[i]; if (widget != NULL && x >= widget->x && x < (signed) (widget->x + widget->w) && y >= widget->y && y < (signed) (widget->y + widget->h)) { int was_focused; // Main table temporarily loses focus when action area button // is clicked. This way, any active input boxes that depend // on having focus will save their values before the // action is performed. was_focused = window->table.widget.focused; TXT_SetWidgetFocus(window, 0); TXT_SetWidgetFocus(window, was_focused); // Pass through mouse press. TXT_WidgetMousePress(widget, x, y, b); break; } } }