diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/Makefile.am | 2 | ||||
-rw-r--r-- | src/core/testing.c | 81 | ||||
-rw-r--r-- | src/core/testing.h | 71 | ||||
-rw-r--r-- | src/core/window-props.c | 27 |
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 */ |