X-Git-Url: https://git.brokenzipper.com/gitweb?a=blobdiff_plain;f=openbox%2Factions.h;h=b55a7f077ce6b851f60829dba7bc5336fb31aa02;hb=8becd1f93f9a8a448ca61372e50bd8bf79e7ab9d;hp=548b40b5bc4d17dbeff712946805ebcf94e715af;hpb=828d06f271392abbef75bb37e2635b2085bdef90;p=chaz%2Fopenbox diff --git a/openbox/actions.h b/openbox/actions.h index 548b40b5..b55a7f07 100644 --- a/openbox/actions.h +++ b/openbox/actions.h @@ -20,6 +20,7 @@ #include "frame.h" #include "parser/parse.h" #include +#include typedef struct _ObActionsDefinition ObActionsDefinition; typedef struct _ObActionsAct ObActionsAct; @@ -29,60 +30,44 @@ typedef struct _ObActionsGlobalData ObActionsGlobalData; typedef struct _ObActionsClientData ObActionsClientData; typedef struct _ObActionsSelectorData ObActionsSelectorData; -typedef enum { - OB_ACTION_DONE, - OB_ACTION_CANCELLED, - OB_ACTION_INTERACTING, - OB_NUM_ACTIONS_INTERACTIVE_STATES -} ObActionsInteractiveState; - typedef gpointer (*ObActionsDataSetupFunc)(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node); typedef void (*ObActionsDataFreeFunc)(gpointer options); -typedef void (*ObActionsRunFunc)(ObActionsData *data, +typedef gboolean (*ObActionsRunFunc)(ObActionsData *data, gpointer options); - -/* - The theory goes: - - 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 -*/ +typedef gboolean (*ObActionsInteractiveInputFunc)(guint initial_state, + XEvent *e, + gpointer options); +typedef void (*ObActionsInteractiveCancelFunc)(gpointer options); typedef enum { OB_ACTION_TYPE_GLOBAL, - OB_ACTION_TYPE_CLIENT, - OB_ACTION_TYPE_SELECTOR + OB_ACTION_TYPE_CLIENT } ObActionsType; +/* These structures are all castable as eachother */ + struct _ObActionsAnyData { ObUserAction uact; + Time time; + guint state; gint x; gint y; - gint button; - Time time; - - ObActionsInteractiveState interactive; }; struct _ObActionsGlobalData { + ObActionsType type; ObActionsAnyData any; }; struct _ObActionsClientData { + ObActionsType type; ObActionsAnyData any; struct _ObClient *c; ObFrameContext context; }; -struct _ObActionsSelectorData { - ObActionsAnyData any; - - GSList *actions; -}; - struct _ObActionsData { ObActionsType type; @@ -90,23 +75,40 @@ struct _ObActionsData { ObActionsAnyData any; ObActionsGlobalData global; ObActionsClientData client; - ObActionsSelectorData selector; }; }; void actions_startup(gboolean reconfigure); void actions_shutdown(gboolean reconfigure); +/*! If the action is interactive, then i_input and i_cancel are not NULL. + Otherwise, they should both be NULL. */ gboolean actions_register(const gchar *name, - gboolean allow_interactive, + ObActionsType type, ObActionsDataSetupFunc setup, ObActionsDataFreeFunc free, - ObActionsRunFunc run); + ObActionsRunFunc run, + ObActionsInteractiveInputFunc i_input, + ObActionsInteractiveCancelFunc i_cancel); ObActionsAct* actions_parse(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node); ObActionsAct* actions_parse_string(const gchar *name); +gboolean actions_act_is_interactive(ObActionsAct *act); + void actions_act_ref(ObActionsAct *act); void actions_act_unref(ObActionsAct *act); + +/*! Pass in a GSList of ObActionsAct's to be run. + @return TRUE if an action is in interactive state, FALSE is none are +*/ +void actions_run_acts(GSList *acts, + ObUserAction uact, + Time time, + guint state, + gint x, + gint y, + ObFrameContext con, + struct _ObClient *client);