metacity r3718 - in branches/test-system/src: . core



Author: tthurman
Date: Mon May 19 12:42:09 2008
New Revision: 3718
URL: http://svn.gnome.org/viewvc/metacity?rev=3718&view=rev

Log:
First hack at centralising testing

Added:
   branches/test-system/src/core/testing.c
   branches/test-system/src/core/testing.h
Modified:
   branches/test-system/src/Makefile.am
   branches/test-system/src/core/window-props.c

Modified: branches/test-system/src/Makefile.am
==============================================================================
--- branches/test-system/src/Makefile.am	(original)
+++ branches/test-system/src/Makefile.am	Mon May 19 12:42:09 2008
@@ -56,6 +56,8 @@
 	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			\

Added: branches/test-system/src/core/testing.c
==============================================================================
--- (empty file)
+++ branches/test-system/src/core/testing.c	Mon May 19 12:42:09 2008
@@ -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 */
+
+
+

Added: branches/test-system/src/core/testing.h
==============================================================================
--- (empty file)
+++ branches/test-system/src/core/testing.h	Mon May 19 12:42:09 2008
@@ -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 */

Modified: branches/test-system/src/core/window-props.c
==============================================================================
--- branches/test-system/src/core/window-props.c	(original)
+++ branches/test-system/src/core/window-props.c	Mon May 19 12:42:09 2008
@@ -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 @@
       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 */



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]