summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas James Alexander Thurman <tthurman@src.gnome.org>2008-05-19 12:42:09 +0000
committerThomas James Alexander Thurman <tthurman@src.gnome.org>2008-05-19 12:42:09 +0000
commit969475cc95d74800412f06080896a3617e08f57b (patch)
tree6d41c2ff12761f0214cf8bd1448af4b2edd2f20b
parent3e077643e0d445ab94bf0bf3b35a190e16bac65e (diff)
downloadmetacity-969475cc95d74800412f06080896a3617e08f57b.tar.gz
First hack at centralising testing
svn path=/branches/test-system/; revision=3718
-rw-r--r--src/Makefile.am2
-rw-r--r--src/core/testing.c81
-rw-r--r--src/core/testing.h71
-rw-r--r--src/core/window-props.c27
4 files changed, 178 insertions, 3 deletions
diff --git a/src/Makefile.am b/src/Makefile.am
index e5f9e131..98179adf 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -56,6 +56,8 @@ metacity_SOURCES= \
core/session.h \
core/stack.c \
core/stack.h \
+ core/testing.c \
+ core/testing.h \
core/util.c \
include/util.h \
core/window-props.c \
diff --git a/src/core/testing.c b/src/core/testing.c
new file mode 100644
index 00000000..650a397a
--- /dev/null
+++ b/src/core/testing.c
@@ -0,0 +1,81 @@
+/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
+
+/*
+ * Copyright (C) 2008 Thomas Thurman
+ *
+ * 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.
+ */
+
+/**
+ * \file testing.c The window manager's part of the test subsystem
+ */
+
+#include "config.h"
+
+#ifdef USING_TESTING
+
+#include "testing.h"
+#include <glib.h>
+
+static GSList *handlers = NULL;
+
+void
+meta_testing_register (MetaTestingHandler *handler)
+{
+ handlers = g_slist_prepend (handlers, handler);
+}
+
+char *
+meta_testing_notify (char type, char *details)
+{
+ /*
+ * We could be all efficient and have some way of letting the registration
+ * function specify which types you're interested in, and then only notifying
+ * the relevant handlers, but really the tiny amount of extra efficiency
+ * isn't worth the extra complexity of the code for something that's run
+ * so rarely.
+ */
+
+ GSList *cursor = handlers;
+
+ while (cursor)
+ {
+ char *possible_result;
+
+ possible_result = (*((MetaTestingHandler*)cursor->data)) (type, details);
+
+ if (possible_result)
+ {
+ return possible_result;
+ }
+
+ cursor = g_slist_next (cursor);
+ }
+
+ return NULL; /* Give up. */
+
+}
+
+#else /* USING_TESTING */
+
+/* Nothing happens. */
+
+#endif /* USING_TESTING */
+
+/* eof testing.c */
+
+
+
diff --git a/src/core/testing.h b/src/core/testing.h
new file mode 100644
index 00000000..23dd5aff
--- /dev/null
+++ b/src/core/testing.h
@@ -0,0 +1,71 @@
+/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
+
+/*
+ * Copyright (C) 2008 Thomas Thurman
+ *
+ * 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.
+ */
+
+/**
+ * \file testing.h The window manager's part of the test subsystem
+ */
+
+#ifndef META_TESTING_H
+#define META_TESTING_H
+
+#ifdef USING_TESTING
+
+/**
+ * A handler for a certain kind of testing request. See the testing
+ * documentation in the "doc" directory for more details on the format
+ * of the requests and responses here.
+ *
+ * \param type The type of request.
+ * \param details Details of the request (interpretation depends on the type)
+ * \return A string to be returned to the client. If this handler
+ * does not wish to handle this request, it should return NULL;
+ * if it returns a non-NULL value, processing of this request
+ * will cease immediately; no other handlers will be called.
+ */
+typedef char* (* MetaTestingHandler) (char type, char *details);
+
+/**
+ * Registers a handler for some kind of testing request. This handler
+ * will be called by meta_testing_notify on receipt of __METACITY_TESTING.
+ *
+ * \param handler The handler.
+ */
+void meta_testing_register (MetaTestingHandler *handler);
+
+/**
+ * After a __METACITY_TESTING property has been set, this function runs
+ * through all the handlers which have been registered, looking for one
+ * which can deal with that particular property.
+ *
+ * \param type The type of request.
+ * \param details Details of the request (interpretation depends on the type)
+ * \return A string to be returned to the client. (Note that if the
+ * client is to see "A=1234", the string returned should be "1234";
+ * the caller adds the "A=".) It is the caller's responsibility to
+ * g_free the string. If no other string can be found, returns NULL.
+ */
+char* meta_testing_notify (char type, char *details);
+
+#endif /* USING_TESTING */
+
+#endif /* META_TESTING_H */
+
+/* eof testing.h */
diff --git a/src/core/window-props.c b/src/core/window-props.c
index 510aa50b..8b02e843 100644
--- a/src/core/window-props.c
+++ b/src/core/window-props.c
@@ -39,6 +39,11 @@
#define HOST_NAME_MAX 255
#endif
+#ifdef USING_TESTING
+#include "testing.h"
+#endif /* USING_TESTING */
+
+
typedef void (* InitValueFunc) (MetaDisplay *display,
Atom property,
MetaPropValue *value);
@@ -862,14 +867,30 @@ reload_metacity_testing (MetaWindow *window,
strlen(value->v.str) >= 2 &&
value->v.str[1] == '?')
{
- meta_warning ("Okay, we have a testing request on window %lx saying %s.\n", window->xwindow, value->v.str);
+ char *answer = meta_testing_notify (value->v.str[0], value->v.str+2);
+
+ char *result;
- /* Use a dummy answer for now */
+ if (answer!=NULL)
+ {
+ result = g_strdup_printf ("%c=%s", value->v.str[0], answer);
+ }
+ else
+ {
+ /* Universal error code: */
+ result = g_strdup ("?=?");
+ }
+
meta_prop_set_utf8_string_hint (window->display,
window->xwindow,
window->display->atom__METACITY_TESTING,
- "A=2");
+ result);
+
+ /* FIXME: Does it work without this? */
XSync (window->display->xdisplay, False); /* push everything through */
+
+ g_free (answer);
+ g_free (result);
}
}
#endif /* USING_TESTING */