summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBradley Smith2008-03-12 17:10:36 +0000
committerBradley Smith2008-03-12 17:10:36 +0000
commitc03fe0d1dc69b0322853d4ca4862ece10d942f66 (patch)
tree0819aa93ef75eb9c3aefc0e67deefac5d3694a08
parentRemove sign hack. (diff)
downloadgnurobots-c03fe0d1dc69b0322853d4ca4862ece10d942f66.tar.gz
Make UI update in a loop, and thread out input.
Signed-off-by: Bradley Smith <brad@brad-smith.co.uk>
-rw-r--r--include/userinterface.h2
-rw-r--r--lib/x11plugin.c17
-rw-r--r--src/Makefile.am2
-rw-r--r--src/main.c26
-rw-r--r--src/userinterface.c5
5 files changed, 40 insertions, 12 deletions
diff --git a/include/userinterface.h b/include/userinterface.h
index ef86f74..c67d364 100644
--- a/include/userinterface.h
+++ b/include/userinterface.h
@@ -53,6 +53,7 @@ struct _UserInterfaceClass {
gint y,
gint thing);
+ void (* user_interface_run) (UserInterface *ui);
void (* user_interface_draw) (UserInterface *ui);
void (* user_interface_update_status) (UserInterface *ui,
@@ -134,6 +135,7 @@ void user_interface_add_thing (UserInterface *ui,
gint y,
gint thing);
+void user_interface_run (UserInterface *ui);
void user_interface_draw (UserInterface *ui);
void user_interface_update_status (UserInterface *ui,
diff --git a/lib/x11plugin.c b/lib/x11plugin.c
index 0d9436b..b46b5cd 100644
--- a/lib/x11plugin.c
+++ b/lib/x11plugin.c
@@ -118,6 +118,8 @@ x11_plugin_constructor (GType type,
x11 = X11_PLUGIN (object);
+ XInitThreads();
+
if ((x11->dpy = XOpenDisplay ("")) == NULL) {
g_printf ("Couldn't open the X Server Display!\n");
exit (1); /* Exit nicely isn't needed yet, and causes segfault */
@@ -147,7 +149,7 @@ x11_plugin_constructor (GType type,
XSetWMHints (x11->dpy, x11->x_win, &wmhints);
XSelectInput (x11->dpy, x11->x_win,
- KeyPressMask | KeyReleaseMask | StructureNotifyMask
+ ExposureMask | KeyPressMask | KeyReleaseMask | StructureNotifyMask
| FocusChangeMask);
XMapWindow (x11->dpy, x11->x_win);
@@ -597,12 +599,15 @@ inline void x11_plugin_update_status (X11Plugin *x11,
glong score,
glong shields)
{
+ x11_update_status (x11, s, energy, score, shields);
+}
+
+inline void x11_plugin_run(X11Plugin* x11)
+{
XEvent ev;
XClientMessageEvent* evt;
- x11_update_status (x11, s, energy, score, shields);
-
- while (XPending (x11->dpy))
+ while (TRUE)
{
XNextEvent (x11->dpy, &ev);
@@ -625,6 +630,9 @@ inline void x11_plugin_update_status (X11Plugin *x11,
exit(0);
}
break;
+ case Expose:
+ x11_plugin_draw(x11);
+ break;
}
}
@@ -752,6 +760,7 @@ static void x11_plugin_interface_init (gpointer g_iface, gpointer iface_data)
gint thing))
x11_plugin_add_thing;
+ klass->user_interface_run = (void(*)(UserInterface *ui)) x11_plugin_run;
klass->user_interface_draw = (void (*) (UserInterface *ui)) x11_plugin_draw;
klass->user_interface_update_status = (void (*) (UserInterface *ui,
const gchar *s,
diff --git a/src/Makefile.am b/src/Makefile.am
index 865a5de..8cdb716 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -26,4 +26,4 @@ INCLUDES = $(GLIB2_CFLAGS) $(GUILE_CFLAGS) -I$(top_builddir)/include \
-DSCRIPTS_PATH=\"$(schemedir)\"
gnurobots_SOURCES = main.c api.c map.c grobot.c userinterface.c
-gnurobots_LDFLAGS = $(GLIB2_LIBS) $(GUILE_LDFLAGS) -lltdl
+gnurobots_LDFLAGS = $(GLIB2_LIBS) $(GUILE_LDFLAGS) -lltdl -lgthread-2.0
diff --git a/src/main.c b/src/main.c
index ed5378a..2dd9c16 100644
--- a/src/main.c
+++ b/src/main.c
@@ -59,6 +59,7 @@ Map *map;
GModule *plugin;
UserInterface *load_ui_module (gchar *module_name, Map *map);
+gpointer callback(gpointer data);
SCM catch_handler (void *data, SCM tag, SCM throw_args);
gint is_file_readable (const gchar *filename);
@@ -331,6 +332,7 @@ main_prog (void *closure, gint argc, gchar *argv[])
/* draw the map */
user_interface_draw (ui);
+ user_interface_update_status (ui, "", -1, -1, -1);
if (strlen (robot_program) != 0)
{
@@ -342,16 +344,19 @@ main_prog (void *closure, gint argc, gchar *argv[])
else
{
gchar buff[BUFF_LEN];
- SCM value;
- g_printf ("Robot program not specified. Entering interactive mode..\n");
- user_interface_update_status (ui, "", -1, -1, -1);
- while (1)
+ g_thread_init(NULL);
+
+ g_printf("Robot program not specified. Entering interactive mode..\n");
+
+ g_thread_create(callback, NULL, FALSE, NULL);
+
+ while(1)
{
user_interface_get_string (ui, "guile> ", buff, BUFF_LEN);
- value = scm_internal_catch (SCM_BOOL_T,
- (scm_t_catch_body) scm_c_eval_string,
- (void *) buff, catch_handler, NULL);
+
+ scm_internal_catch (SCM_BOOL_T, (scm_t_catch_body) scm_c_eval_string,
+ (void *) buff, catch_handler, NULL);
}
}
@@ -359,6 +364,13 @@ main_prog (void *closure, gint argc, gchar *argv[])
exit_nicely ();
}
+gpointer callback(gpointer data)
+{
+ user_interface_run(ui);
+
+ return NULL;
+}
+
/************************************************************************
* SCM catch_handler (void *data, SCM tag, SCM throw_args); *
* *
diff --git a/src/userinterface.c b/src/userinterface.c
index 8cee000..f31591f 100644
--- a/src/userinterface.c
+++ b/src/userinterface.c
@@ -88,6 +88,11 @@ user_interface_add_thing (UserInterface * ui, gint x, gint y, gint thing)
USER_INTERFACE_GET_CLASS (ui)->user_interface_add_thing (ui, x, y, thing);
}
+void user_interface_run(UserInterface* ui)
+{
+ USER_INTERFACE_GET_CLASS(ui)->user_interface_run(ui);
+}
+
void
user_interface_draw (UserInterface * ui)
{