summaryrefslogtreecommitdiff
path: root/textscreen
diff options
context:
space:
mode:
authorSimon Howard2006-05-20 16:34:34 +0000
committerSimon Howard2006-05-20 16:34:34 +0000
commit62b5f953677addeebac38ab6774599bbbab130f0 (patch)
tree66a787570daedf15c342099784e7ed9a1a8f30b0 /textscreen
parentbb630087923d51ce190461e8aba044bff04249eb (diff)
downloadchocolate-doom-62b5f953677addeebac38ab6774599bbbab130f0.tar.gz
chocolate-doom-62b5f953677addeebac38ab6774599bbbab130f0.tar.bz2
chocolate-doom-62b5f953677addeebac38ab6774599bbbab130f0.zip
Add main loop function and forward key presses to widgets.
Subversion-branch: /trunk/chocolate-doom Subversion-revision: 490
Diffstat (limited to 'textscreen')
-rw-r--r--textscreen/Makefile.am2
-rw-r--r--textscreen/guitest.c7
-rw-r--r--textscreen/txt_button.c1
-rw-r--r--textscreen/txt_desktop.c27
-rw-r--r--textscreen/txt_main.c87
-rw-r--r--textscreen/txt_widget.c6
-rw-r--r--textscreen/txt_widget.h2
-rw-r--r--textscreen/txt_window.c53
8 files changed, 173 insertions, 12 deletions
diff --git a/textscreen/Makefile.am b/textscreen/Makefile.am
index c00f6179..17f9f39d 100644
--- a/textscreen/Makefile.am
+++ b/textscreen/Makefile.am
@@ -1,5 +1,5 @@
-AM_CFLAGS = @SDL_CFLAGS@
+AM_CFLAGS = @SDL_CFLAGS@ -I../src
noinst_LIBRARIES=libtextscreen.a
bin_PROGRAMS=guitest
diff --git a/textscreen/guitest.c b/textscreen/guitest.c
index 44da349c..66f2a363 100644
--- a/textscreen/guitest.c
+++ b/textscreen/guitest.c
@@ -66,12 +66,7 @@ int main()
Window2();
SetupWindow();
- for (;;)
- {
- firstwin->selected = (firstwin->selected + 1) % firstwin->num_widgets;
-
- TXT_DrawDesktop();
- }
+ TXT_GUIMainLoop();
}
diff --git a/textscreen/txt_button.c b/textscreen/txt_button.c
index 4bf5b9c0..35457d69 100644
--- a/textscreen/txt_button.c
+++ b/textscreen/txt_button.c
@@ -47,6 +47,7 @@ static void TXT_ButtonDestructor(txt_widget_t *widget)
static int TXT_ButtonKeyPress(txt_widget_t *widget, int key)
{
+ return 0;
}
txt_widget_class_t txt_button_class =
diff --git a/textscreen/txt_desktop.c b/textscreen/txt_desktop.c
index a2ec5c56..4cfe30a0 100644
--- a/textscreen/txt_desktop.c
+++ b/textscreen/txt_desktop.c
@@ -131,3 +131,30 @@ void TXT_DrawDesktop(void)
TXT_UpdateScreen();
}
+void TXT_DispatchEvents(void)
+{
+ int c;
+
+ while ((c = TXT_GetChar()) > 0)
+ {
+ if (c == 27)
+ exit(0);
+
+ if (num_windows > 0)
+ {
+ // Send the keypress to the top window
+
+ TXT_WindowKeyPress(all_windows[num_windows - 1], c);
+ }
+ }
+}
+
+void TXT_GUIMainLoop(void)
+{
+ for (;;)
+ {
+ TXT_DispatchEvents();
+ TXT_DrawDesktop();
+ }
+}
+
diff --git a/textscreen/txt_main.c b/textscreen/txt_main.c
index 256775a8..5682c023 100644
--- a/textscreen/txt_main.c
+++ b/textscreen/txt_main.c
@@ -1,7 +1,7 @@
// Emacs style mode select -*- C++ -*-
//-----------------------------------------------------------------------------
//
-// $Id: txt_main.c 291 2006-01-13 23:56:00Z fraggle $
+// $Id: txt_main.c 490 2006-05-20 16:34:34Z fraggle $
//
// Copyright(C) 1993-1996 Id Software, Inc.
// Copyright(C) 2005 Simon Howard
@@ -49,6 +49,8 @@
#include <stdlib.h>
#include <string.h>
+#include "doomkeys.h"
+
#include "txt_main.h"
#include "txt_font.h"
@@ -183,6 +185,87 @@ void TXT_UpdateScreen(void)
TXT_UpdateScreenArea(0, 0, TXT_SCREEN_W, TXT_SCREEN_H);
}
+//
+// Translates the SDL key
+//
+
+static int TranslateKey(SDL_keysym *sym)
+{
+ switch(sym->sym)
+ {
+ case SDLK_LEFT: return KEY_LEFTARROW;
+ case SDLK_RIGHT: return KEY_RIGHTARROW;
+ case SDLK_DOWN: return KEY_DOWNARROW;
+ case SDLK_UP: return KEY_UPARROW;
+ case SDLK_ESCAPE: return KEY_ESCAPE;
+ case SDLK_RETURN: return KEY_ENTER;
+ case SDLK_TAB: return KEY_TAB;
+ case SDLK_F1: return KEY_F1;
+ case SDLK_F2: return KEY_F2;
+ case SDLK_F3: return KEY_F3;
+ case SDLK_F4: return KEY_F4;
+ case SDLK_F5: return KEY_F5;
+ case SDLK_F6: return KEY_F6;
+ case SDLK_F7: return KEY_F7;
+ case SDLK_F8: return KEY_F8;
+ case SDLK_F9: return KEY_F9;
+ case SDLK_F10: return KEY_F10;
+ case SDLK_F11: return KEY_F11;
+ case SDLK_F12: return KEY_F12;
+
+ case SDLK_BACKSPACE: return KEY_BACKSPACE;
+ case SDLK_DELETE: return KEY_DEL;
+
+ case SDLK_PAUSE: return KEY_PAUSE;
+
+ case SDLK_EQUALS:
+ case SDLK_KP_EQUALS: return KEY_EQUALS;
+
+ case SDLK_MINUS: return KEY_MINUS;
+
+ case SDLK_LSHIFT:
+ case SDLK_RSHIFT:
+ return KEY_RSHIFT;
+
+ case SDLK_LCTRL:
+ case SDLK_RCTRL:
+ return KEY_RCTRL;
+
+ case SDLK_LALT:
+ case SDLK_LMETA:
+ case SDLK_RALT:
+ case SDLK_RMETA:
+ return KEY_RALT;
+
+ case SDLK_CAPSLOCK: return KEY_CAPSLOCK;
+ case SDLK_SCROLLOCK: return KEY_SCRLCK;
+
+ case SDLK_KP0: return KEYP_0;
+ case SDLK_KP1: return KEYP_1;
+ case SDLK_KP2: return KEYP_2;
+ case SDLK_KP3: return KEYP_3;
+ case SDLK_KP4: return KEYP_4;
+ case SDLK_KP5: return KEYP_5;
+ case SDLK_KP6: return KEYP_6;
+ case SDLK_KP7: return KEYP_7;
+ case SDLK_KP8: return KEYP_8;
+ case SDLK_KP9: return KEYP_9;
+
+ case SDLK_HOME: return KEY_HOME;
+ case SDLK_INSERT: return KEY_INS;
+ case SDLK_END: return KEY_END;
+ case SDLK_PAGEUP: return KEY_PGUP;
+ case SDLK_PAGEDOWN: return KEY_PGDN;
+ case SDLK_KP_MULTIPLY: return KEYP_MULTIPLY;
+ case SDLK_KP_PLUS: return KEYP_PLUS;
+ case SDLK_KP_MINUS: return KEYP_MINUS;
+ case SDLK_KP_DIVIDE: return KEYP_DIVIDE;
+
+ default: return tolower(sym->sym);
+ }
+}
+
+
signed int TXT_GetChar(void)
{
SDL_Event ev;
@@ -201,7 +284,7 @@ signed int TXT_GetChar(void)
break;
case SDL_KEYDOWN:
- return ev.key.keysym.unicode;
+ return TranslateKey(&ev.key.keysym);
case SDL_QUIT:
// Quit = escape
diff --git a/textscreen/txt_widget.c b/textscreen/txt_widget.c
index 68e3d9b5..de79beb7 100644
--- a/textscreen/txt_widget.c
+++ b/textscreen/txt_widget.c
@@ -17,12 +17,14 @@ void TXT_DestroyWidget(txt_widget_t *widget)
widget->widget_class->destructor(widget);
}
-void TXT_WidgetKeyPress(txt_widget_t *widget, int key)
+int TXT_WidgetKeyPress(txt_widget_t *widget, int key)
{
if (widget->widget_class->key_press != NULL)
{
- widget->widget_class->key_press(widget, key);
+ return widget->widget_class->key_press(widget, key);
}
+
+ return 0;
}
diff --git a/textscreen/txt_widget.h b/textscreen/txt_widget.h
index e0a4350e..9852f732 100644
--- a/textscreen/txt_widget.h
+++ b/textscreen/txt_widget.h
@@ -52,7 +52,7 @@ struct txt_widget_s
int TXT_WidgetWidth(txt_widget_t *widget);
void TXT_DrawWidget(txt_widget_t *widget, int w, int selected);
-void TXT_WidgetKeyPress(txt_widget_t *widget, int key);
+int TXT_WidgetKeyPress(txt_widget_t *widget, int key);
void TXT_DestroyWidget(txt_widget_t *widget);
#endif /* #ifndef TXT_WIDGET_H */
diff --git a/textscreen/txt_window.c b/textscreen/txt_window.c
index 1dcb2d88..85c6c5d1 100644
--- a/textscreen/txt_window.c
+++ b/textscreen/txt_window.c
@@ -25,6 +25,8 @@
#include <stdlib.h>
#include <string.h>
+#include "doomkeys.h"
+
#include "txt_desktop.h"
#include "txt_gui.h"
#include "txt_main.h"
@@ -217,3 +219,54 @@ void TXT_SetWindowPosition(txt_window_t *window,
window->y = y;
}
+void TXT_WindowKeyPress(txt_window_t *window, int c)
+{
+ // Send to the currently selected widget first
+
+ if (window->selected > 0 && window->selected <= window->num_widgets)
+ {
+ if (TXT_WidgetKeyPress(window->widgets[window->selected], c))
+ {
+ return;
+ }
+ }
+
+ if (c == KEY_DOWNARROW)
+ {
+ int newsel;
+
+ // Move cursor down to the next selectable widget
+
+ for (newsel = window->selected + 1;
+ newsel < window->num_widgets;
+ ++newsel)
+ {
+ if (window->widgets[newsel]->visible
+ && window->widgets[newsel]->selectable)
+ {
+ window->selected = newsel;
+ break;
+ }
+ }
+ }
+
+ if (c == KEY_UPARROW)
+ {
+ int newsel;
+
+ // Move cursor down to the next selectable widget
+
+ for (newsel = window->selected - 1;
+ newsel >= 0;
+ --newsel)
+ {
+ if (window->widgets[newsel]->visible
+ && window->widgets[newsel]->selectable)
+ {
+ window->selected = newsel;
+ break;
+ }
+ }
+ }
+}
+