--- /dev/null
+/* -*- 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);
+ }
+}
See the COPYING file for a copy of the GNU General Public License.
*/
+#include "misc.h"
+#include "frame.h"
+#include "parser/parse.h"
+#include <glib.h>
+
+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,
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;
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;
};
#include "xerror.h"
#include "prop.h"
#include "screen.h"
+#include "actions.h"
#include "startupnotify.h"
#include "focus.h"
#include "focus_cycle.h"
/* 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)) {
sn_shutdown(reconfigure);
window_shutdown(reconfigure);
event_shutdown(reconfigure);
+ actions_shutdown(reconfigure);
config_shutdown();
modkeys_shutdown(reconfigure);
} while (reconfigure);