From: Dana Jansens Date: Thu, 21 Jun 2007 22:50:16 +0000 (+0000) Subject: some first structural stuff for new actions X-Git-Url: https://git.dogcows.com/gitweb?a=commitdiff_plain;h=e5b94e6072287d39a777a3cedd0f10a66c58a2b5;p=chaz%2Fopenbox some first structural stuff for new actions --- diff --git a/Makefile.am b/Makefile.am index dbecc434..230862a9 100644 --- a/Makefile.am +++ b/Makefile.am @@ -156,6 +156,8 @@ openbox_openbox_SOURCES = \ gettext.h \ openbox/action.c \ openbox/action.h \ + openbox/actions.c \ + openbox/actions.h \ openbox/client.c \ openbox/client.h \ openbox/client_list_menu.c \ diff --git a/openbox/actions.c b/openbox/actions.c new file mode 100644 index 00000000..48778faf --- /dev/null +++ b/openbox/actions.c @@ -0,0 +1,88 @@ +/* -*- indent-tabs-mode: nil; tab-width: 4; c-basic-offset: 4; -*- + + actions.h for the Openbox window manager + Copyright (c) 2007 Dana Jansens + + 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. + + See the COPYING file for a copy of the GNU General Public License. +*/ + +#include "actions.h" + +static void actions_unregister(ObActionsDefinition *def); + +struct _ObActionsDefinition { + gchar *name; + gboolean interactive; + + ObActionsDataParseFunc parse; + ObActionsDataFreeFunc free; + ObActionsRunFunc run; + + gpointer action_data; +}; + +static GSList *registered = NULL; + + +void actions_startup(gboolean reconfig) +{ + if (reconfig) return; + + +} + +void actions_shutdown(gboolean reconfig) +{ + if (reconfig) return; + + /* free all the registered actions */ + while (registered) { + actions_unregister(registered->data); + registered = g_slist_delete_link(registered, registered); + } +} + +gboolean actions_register(const gchar *name, + gboolean interactive, + ObActionsDataSetupFunc setup, + ObActionsDataParseFunc parse, + ObActionsDataFreeFunc free, + ObActionsRunFunc run) +{ + GSList *it; + ObActionsDefinition *def; + + for (it = registered; it; it = g_slist_next(it)) { + def = it->data; + if (!g_ascii_strcasecmp(name, def->name)) /* already registered */ + return FALSE; + } + + def = g_new(ObActionsDefinition, 1); + def->name = g_strdup(name); + def->interactive = interactive; + def->parse = parse; + def->free = free; + def->run = run; + def->action_data = setup(); + return TRUE; +} + +static void actions_unregister(ObActionsDefinition *def) +{ + if (def) { + def->free(def->action_data); + g_free(def->name); + g_free(def); + } +} diff --git a/openbox/actions.h b/openbox/actions.h index e2a8499f..cb1d377f 100644 --- a/openbox/actions.h +++ b/openbox/actions.h @@ -16,6 +16,17 @@ See the COPYING file for a copy of the GNU General Public License. */ +#include "misc.h" +#include "frame.h" +#include "parser/parse.h" +#include + +typedef struct _ObActionsDefinition ObActionsDefinition; +typedef struct _ObActionsAnyData ObActionsAnyData; +typedef struct _ObActionsGlobalData ObActionsGlobalData; +typedef struct _ObActionsClientData ObActionsClientData; +typedef struct _ObActionsSelectorData ObActionsSelectorData; + typedef enum { OB_ACTION_DONE, OB_ACTION_CANCELLED, @@ -28,17 +39,16 @@ typedef void (*ObActionsDataParseFunc)(gpointer action_data, ObParseInst *i, xmlDocPtr doc, xmlNodePtr node); typedef void (*ObActionsDataFreeFunc)(gpointer action_data); -typedef void (*ObActionsRunFunc)(ObActionsAnyData *data); +typedef void (*ObActionsRunFunc)(ObActionsAnyData *data, + gpointer action_data); -struct _ObActionsDefinition { - gchar *name; - gboolean interactive; +/* + The theory goes: - ObActionsDataSetupFunc setup; - ObActionsDataParseFunc parse; - ObActionsDataFreeFunc free; - ObActionsRunFunc run; -}; + 06:10 (@dana) hm i think there are 3 types of actions + 06:10 (@dana) global actions, window actions, and selector actions + 06:11 (@dana) eg show menu/exit, raise/focus, and cycling/directional/expose +*/ struct _ObActionsAnyData { ObUserAction uact; @@ -48,23 +58,21 @@ struct _ObActionsAnyData { Time time; ObActionsInteractiveState interactive; - - gpointer action_data; }; struct _ObActionsGlobalData { - ObActionsData any; + ObActionsAnyData any; }; struct _ObActionsClientData { - ObActionsData any; + ObActionsAnyData any; struct _ObClient *c; ObFrameContext context; }; struct _ObActionsSelectorData { - ObActionsData any; + ObActionsAnyData any; GSList *actions; }; diff --git a/openbox/openbox.c b/openbox/openbox.c index ae1232fa..db14afb0 100644 --- a/openbox/openbox.c +++ b/openbox/openbox.c @@ -28,6 +28,7 @@ #include "xerror.h" #include "prop.h" #include "screen.h" +#include "actions.h" #include "startupnotify.h" #include "focus.h" #include "focus_cycle.h" @@ -241,6 +242,8 @@ gint main(gint argc, gchar **argv) /* start up config which sets up with the parser */ config_startup(i); + /* register all the available actions */ + actions_startup(reconfigure); /* parse/load user options */ if (parse_load_rc(NULL, &doc, &node)) { @@ -373,6 +376,7 @@ gint main(gint argc, gchar **argv) sn_shutdown(reconfigure); window_shutdown(reconfigure); event_shutdown(reconfigure); + actions_shutdown(reconfigure); config_shutdown(); modkeys_shutdown(reconfigure); } while (reconfigure);