summaryrefslogtreecommitdiff
path: root/setup/txt_mouseinput.c
diff options
context:
space:
mode:
Diffstat (limited to 'setup/txt_mouseinput.c')
-rw-r--r--setup/txt_mouseinput.c180
1 files changed, 180 insertions, 0 deletions
diff --git a/setup/txt_mouseinput.c b/setup/txt_mouseinput.c
new file mode 100644
index 00000000..1c81e8dd
--- /dev/null
+++ b/setup/txt_mouseinput.c
@@ -0,0 +1,180 @@
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "doomkeys.h"
+
+#include "txt_mouseinput.h"
+#include "txt_io.h"
+#include "txt_label.h"
+#include "txt_window.h"
+
+#define MOUSE_INPUT_WIDTH 10
+
+static int MouseButtonToSetting(int b)
+{
+ switch (b)
+ {
+ case TXT_MOUSE_LEFT:
+ return 0;
+ case TXT_MOUSE_RIGHT:
+ return 1;
+ case TXT_MOUSE_MIDDLE:
+ return 2;
+ default:
+ return -1;
+ }
+}
+
+static int MousePressCallback(txt_window_t *window,
+ int x, int y, int b,
+ TXT_UNCAST_ARG(mouse_input))
+{
+ TXT_CAST_ARG(txt_mouse_input_t, mouse_input);
+
+ // Got the mouse press. Save to the variable and close the window.
+
+ *mouse_input->variable = MouseButtonToSetting(b);
+ TXT_EmitSignal(mouse_input, "set");
+ TXT_CloseWindow(window);
+
+ return 1;
+}
+
+static void OpenPromptWindow(txt_mouse_input_t *mouse_input)
+{
+ txt_window_t *window;
+ txt_label_t *label;
+
+ window = TXT_NewWindow(NULL);
+ TXT_SetWindowAction(window, TXT_HORIZ_LEFT, NULL);
+ TXT_SetWindowAction(window, TXT_HORIZ_CENTER,
+ TXT_NewWindowAbortAction(window));
+ TXT_SetWindowAction(window, TXT_HORIZ_RIGHT, NULL);
+
+ label = TXT_NewLabel("Press the new mouse button...");
+
+ TXT_AddWidget(window, label);
+ TXT_SetWidgetAlign(label, TXT_HORIZ_CENTER);
+
+ TXT_SetMouseListener(window, MousePressCallback, mouse_input);
+}
+
+static void TXT_MouseInputSizeCalc(TXT_UNCAST_ARG(mouse_input))
+{
+ TXT_CAST_ARG(txt_mouse_input_t, mouse_input);
+
+ // All mouseinputs are the same size.
+
+ mouse_input->widget.w = MOUSE_INPUT_WIDTH;
+ mouse_input->widget.h = 1;
+}
+
+static void GetMouseButtonDescription(int button, char *buf)
+{
+ switch (button)
+ {
+ case 0:
+ strcpy(buf, "LEFT");
+ break;
+ case 1:
+ strcpy(buf, "RIGHT");
+ break;
+ case 2:
+ strcpy(buf, "MID");
+ break;
+ default:
+ sprintf(buf, "BUTTON #%i", button);
+ break;
+ }
+}
+
+static void TXT_MouseInputDrawer(TXT_UNCAST_ARG(mouse_input), int selected)
+{
+ TXT_CAST_ARG(txt_mouse_input_t, mouse_input);
+ char buf[20];
+ int i;
+
+ if (*mouse_input->variable == -1)
+ {
+ strcpy(buf, "");
+ }
+ else
+ {
+ GetMouseButtonDescription(*mouse_input->variable, buf);
+ }
+
+ if (selected)
+ {
+ TXT_BGColor(TXT_COLOR_GREY, 0);
+ }
+ else
+ {
+ TXT_BGColor(TXT_COLOR_BLUE, 0);
+ }
+
+ TXT_FGColor(TXT_COLOR_BRIGHT_WHITE);
+
+ TXT_DrawString(buf);
+
+ for (i=strlen(buf); i<MOUSE_INPUT_WIDTH; ++i)
+ {
+ TXT_DrawString(" ");
+ }
+}
+
+static void TXT_MouseInputDestructor(TXT_UNCAST_ARG(mouse_input))
+{
+ TXT_CAST_ARG(txt_mouse_input_t, mouse_input);
+}
+
+static int TXT_MouseInputKeyPress(TXT_UNCAST_ARG(mouse_input), int mouse)
+{
+ TXT_CAST_ARG(txt_mouse_input_t, mouse_input);
+
+ if (mouse == KEY_ENTER)
+ {
+ // Open a window to prompt for the new mouse press
+
+ OpenPromptWindow(mouse_input);
+
+ return 1;
+ }
+
+ return 0;
+}
+
+static void TXT_MouseInputMousePress(TXT_UNCAST_ARG(widget), int x, int y, int b)
+{
+ TXT_CAST_ARG(txt_mouse_input_t, widget);
+
+ // Clicking is like pressing enter
+
+ if (b == TXT_MOUSE_LEFT)
+ {
+ TXT_MouseInputKeyPress(widget, KEY_ENTER);
+ }
+}
+
+txt_widget_class_t txt_mouse_input_class =
+{
+ TXT_MouseInputSizeCalc,
+ TXT_MouseInputDrawer,
+ TXT_MouseInputKeyPress,
+ TXT_MouseInputDestructor,
+ TXT_MouseInputMousePress,
+};
+
+txt_mouse_input_t *TXT_NewMouseInput(int *variable)
+{
+ txt_mouse_input_t *mouse_input;
+
+ mouse_input = malloc(sizeof(txt_mouse_input_t));
+
+ TXT_InitWidget(mouse_input, &txt_mouse_input_class);
+ mouse_input->variable = variable;
+
+ return mouse_input;
+}
+