some first structural stuff for new actions

This commit is contained in:
Dana Jansens 2007-06-21 22:50:16 +00:00
parent e5cc6c8252
commit e5b94e6072
4 changed files with 116 additions and 14 deletions

View file

@ -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 \

88
openbox/actions.c Normal file
View file

@ -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);
}
}

View file

@ -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 <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,
@ -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;
};

View file

@ -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);