foxygit / doom Log in
commit 9d7126c11b5f1577b00987b8d5f0f7f761b012d7
Author:     Simon Howard <fraggle@gmail.com>
AuthorDate: Mon Jun 4 18:32:50 2007 +0000
Commit:     Simon Howard <fraggle@gmail.com>
CommitDate: Mon Jun 4 18:32:50 2007 +0000

    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
---
 textscreen/Makefile.am               |  3 ++-
 textscreen/txt_desktop.c             |  1 +
 textscreen/txt_main.h                |  8 +++---
 textscreen/{txt_main.c => txt_sdl.c} | 23 +++++++++++++++++
 textscreen/txt_sdl.h                 | 50 ++++++++++++++++++++++++++++++++++++
 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
similarity index 96%
rename from textscreen/txt_main.c
rename to 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 */
+