summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSimon Howard2007-06-04 18:32:50 +0000
committerSimon Howard2007-06-04 18:32:50 +0000
commit9d7126c11b5f1577b00987b8d5f0f7f761b012d7 (patch)
treeb832c6f922879be3668d7f6720c3887ac4409f99
parent2c4e3a7dbf89608355d1ce49c221d41b3e2fa7a8 (diff)
downloadchocolate-doom-9d7126c11b5f1577b00987b8d5f0f7f761b012d7.tar.gz
chocolate-doom-9d7126c11b5f1577b00987b8d5f0f7f761b012d7.tar.bz2
chocolate-doom-9d7126c11b5f1577b00987b8d5f0f7f761b012d7.zip
Rename txt_main.c to txt_sdl.c; add txt_sdl.h for SDL-specific API
functions, while keeping txt_main.h for the common API. Add TXT_SDL_SetEventCallback to allow programs to intercept SDL events in the textscreen main loop. Subversion-branch: /trunk/chocolate-doom Subversion-revision: 892
-rw-r--r--textscreen/Makefile.am3
-rw-r--r--textscreen/txt_desktop.c1
-rw-r--r--textscreen/txt_main.h8
-rw-r--r--textscreen/txt_sdl.c (renamed from textscreen/txt_main.c)23
-rw-r--r--textscreen/txt_sdl.h50
5 files changed, 80 insertions, 5 deletions
diff --git a/textscreen/Makefile.am b/textscreen/Makefile.am
index 71989c3b..752e6361 100644
--- a/textscreen/Makefile.am
+++ b/textscreen/Makefile.am
@@ -15,12 +15,13 @@ libtextscreen_a_SOURCES = \
txt_gui.c txt_gui.h \
txt_inputbox.c txt_inputbox.h \
txt_io.c txt_io.h \
- txt_main.c txt_main.h \
+ txt_main.h \
txt_button.c txt_button.h \
txt_label.c txt_label.h \
txt_radiobutton.c txt_radiobutton.h \
txt_separator.c txt_separator.h \
txt_spinctrl.c txt_spinctrl.h \
+ txt_sdl.c txt_sdl.h \
txt_strut.c txt_strut.h \
txt_table.c txt_table.h \
txt_widget.c txt_widget.h \
diff --git a/textscreen/txt_desktop.c b/textscreen/txt_desktop.c
index ee6c1671..4b90ed66 100644
--- a/textscreen/txt_desktop.c
+++ b/textscreen/txt_desktop.c
@@ -19,6 +19,7 @@
// 02111-1307, USA.
//
+#include <stdio.h>
#include <stdlib.h>
#include <string.h>
diff --git a/textscreen/txt_main.h b/textscreen/txt_main.h
index 13c38537..7978c8b7 100644
--- a/textscreen/txt_main.h
+++ b/textscreen/txt_main.h
@@ -20,17 +20,17 @@
//
//-----------------------------------------------------------------------------
//
-// Text mode emulation in SDL
+// Base interface that abstracts the text mode screen.
//
//-----------------------------------------------------------------------------
#ifndef TXT_MAIN_H
#define TXT_MAIN_H
-// The textscreen API itself doesn't need SDL; however, SDL needs its
-// headers included where main() is defined.
+// For the moment, txt_sdl.c is the only implementation of the base
+// text mode screen API:
-#include "SDL.h"
+#include "txt_sdl.h"
// Special keypress values that correspond to mouse button clicks
//
diff --git a/textscreen/txt_main.c b/textscreen/txt_sdl.c
index f184ce0f..a7e08e1d 100644
--- a/textscreen/txt_main.c
+++ b/textscreen/txt_sdl.c
@@ -33,6 +33,7 @@
#include "doomkeys.h"
#include "txt_main.h"
+#include "txt_sdl.h"
#include "txt_font.h"
#define CHAR_W 8
@@ -46,6 +47,9 @@ static SDL_Surface *screen;
static unsigned char *screendata;
static int key_mapping = 1;
+static TxtSDLEventCallbackFunc event_callback;
+static void *event_callback_data;
+
//#define TANGO
#ifndef TANGO
@@ -321,6 +325,19 @@ signed int TXT_GetChar(void)
while (SDL_PollEvent(&ev))
{
+ // If there is an event callback, allow it to intercept this
+ // event.
+
+ if (event_callback != NULL)
+ {
+ if (event_callback(&ev, event_callback_data))
+ {
+ continue;
+ }
+ }
+
+ // Process the event.
+
switch (ev.type)
{
case SDL_MOUSEBUTTONDOWN:
@@ -523,3 +540,9 @@ void TXT_SetWindowTitle(char *title)
SDL_WM_SetCaption(title, NULL);
}
+void TXT_SDL_SetEventCallback(TxtSDLEventCallbackFunc callback, void *user_data)
+{
+ event_callback = callback;
+ event_callback_data = user_data;
+}
+
diff --git a/textscreen/txt_sdl.h b/textscreen/txt_sdl.h
new file mode 100644
index 00000000..ed131970
--- /dev/null
+++ b/textscreen/txt_sdl.h
@@ -0,0 +1,50 @@
+// Emacs style mode select -*- C++ -*-
+//-----------------------------------------------------------------------------
+//
+// Copyright(C) 2005,2006 Simon Howard
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+// 02111-1307, USA.
+//
+//-----------------------------------------------------------------------------
+//
+// Text mode emulation in SDL
+//
+//-----------------------------------------------------------------------------
+
+#ifndef TXT_SDL_H
+#define TXT_SDL_H
+
+// The textscreen API itself doesn't need SDL; however, SDL needs its
+// headers included where main() is defined.
+
+#include "SDL.h"
+
+// Event callback function type: a function of this type can be used
+// to intercept events in the textscreen event processing loop.
+// Returning 1 will cause the event to be eaten; the textscreen code
+// will not see it.
+
+typedef int (*TxtSDLEventCallbackFunc)(SDL_Event *event, void *user_data);
+
+// Set a callback function to call in the SDL event loop. Useful for
+// intercepting events. Pass callback=NULL to clear an existing
+// callback function.
+// user_data is a void pointer to be passed to the callback function.
+
+void TXT_SDL_SetEventCallback(TxtSDLEventCallbackFunc callback, void *user_data);
+
+#endif /* #ifndef TXT_SDL_H */
+