#include "misc.h"
#include "frame.h"
-#include "parser/parse.h"
+#include "obt/parse.h"
+
#include <glib.h>
+#include <X11/Xlib.h>
typedef struct _ObActionsDefinition ObActionsDefinition;
typedef struct _ObActionsAct ObActionsAct;
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 gpointer (*ObActionsDataSetupFunc)(xmlNodePtr node);
typedef void (*ObActionsDataFreeFunc)(gpointer options);
-typedef void (*ObActionsRunFunc)(ObActionsData *data,
+typedef gboolean (*ObActionsRunFunc)(ObActionsData *data,
gpointer options);
+typedef gboolean (*ObActionsInteractiveInputFunc)(guint initial_state,
+ XEvent *e,
+ gpointer options,
+ gboolean *used);
+typedef void (*ObActionsInteractiveCancelFunc)(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 enum {
- OB_ACTION_TYPE_GLOBAL,
- OB_ACTION_TYPE_CLIENT,
- OB_ACTION_TYPE_SELECTOR
-} ObActionsType;
-
-struct _ObActionsAnyData {
+struct _ObActionsData {
ObUserAction uact;
+ guint state;
gint x;
gint y;
gint button;
- Time time;
-
- ObActionsInteractiveState interactive;
-};
-
-struct _ObActionsGlobalData {
- ObActionsAnyData any;
-};
-struct _ObActionsClientData {
- ObActionsAnyData any;
-
- struct _ObClient *c;
+ struct _ObClient *client;
ObFrameContext context;
};
-struct _ObActionsSelectorData {
- ObActionsAnyData any;
-
- GSList *actions;
-};
-
-struct _ObActionsData {
- ObActionsType type;
-
- union {
- 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,
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(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);
+
+/*! When this is true, an XAllowEvents with ReplayPointer will be called
+ if an action is going to maybe try moving windows around on screen (or
+ map/unmap windows)
+*/
+void actions_set_need_pointer_replay_before_move(gboolean replay);
+/*! Returns if a ReplayPointer is still needed. If it was called while running
+ actions then this will be false */
+gboolean actions_get_need_pointer_replay_before_move();
+
+/*! Pass in a GSList of ObActionsAct's to be run. */
+void actions_run_acts(GSList *acts,
+ ObUserAction uact,
+ guint state,
+ gint x,
+ gint y,
+ gint button,
+ ObFrameContext con,
+ struct _ObClient *client);
+
+gboolean actions_interactive_act_running();
+void actions_interactive_cancel_act();
+
+gboolean actions_interactive_input_event(XEvent *e);
+
+/*! Function for actions to call when they are moving a client around */
+void actions_client_move(ObActionsData *data, gboolean start);