#include "misc.h"
#include "frame.h"
-#include "obt/parse.h"
+#include "obt/xml.h"
+#include "obt/keyboard.h"
#include <glib.h>
#include <X11/Xlib.h>
typedef struct _ObActionsClientData ObActionsClientData;
typedef struct _ObActionsSelectorData ObActionsSelectorData;
-typedef gpointer (*ObActionsDataSetupFunc)(xmlNodePtr node);
typedef void (*ObActionsDataFreeFunc)(gpointer options);
typedef gboolean (*ObActionsRunFunc)(ObActionsData *data,
gpointer options);
-typedef gboolean (*ObActionsInteractiveInputFunc)(guint initial_state,
- XEvent *e,
- gpointer options,
- gboolean *used);
-typedef void (*ObActionsInteractiveCancelFunc)(gpointer options);
+typedef gpointer (*ObActionsDataSetupFunc)(xmlNodePtr node);
+typedef void (*ObActionsShutdownFunc)(void);
+
+/* functions for interactive actions */
+/* return TRUE if the action is going to be interactive, or false to change
+ your mind and make it not */
+typedef gboolean (*ObActionsIPreFunc)(guint initial_state, gpointer options);
+typedef void (*ObActionsIPostFunc)(gpointer options);
+typedef gboolean (*ObActionsIInputFunc)(guint initial_state,
+ XEvent *e,
+ ObtIC *ic,
+ gpointer options,
+ gboolean *used);
+typedef void (*ObActionsICancelFunc)(gpointer options);
+typedef gpointer (*ObActionsIDataSetupFunc)(xmlNodePtr node,
+ ObActionsIPreFunc *pre,
+ ObActionsIInputFunc *input,
+ ObActionsICancelFunc *cancel,
+ ObActionsIPostFunc *post);
struct _ObActionsData {
ObUserAction uact;
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. */
+/*! Use this if the actions created from this name may be interactive */
+gboolean actions_register_i(const gchar *name,
+ ObActionsIDataSetupFunc setup,
+ ObActionsDataFreeFunc free,
+ ObActionsRunFunc run);
+
gboolean actions_register(const gchar *name,
ObActionsDataSetupFunc setup,
ObActionsDataFreeFunc free,
- ObActionsRunFunc run,
- ObActionsInteractiveInputFunc i_input,
- ObActionsInteractiveCancelFunc i_cancel);
+ ObActionsRunFunc run);
+
+gboolean actions_set_shutdown(const gchar *name,
+ ObActionsShutdownFunc shutdown);
+gboolean actions_set_modifies_focused_window(const gchar *name,
+ gboolean modifies);
ObActionsAct* actions_parse(xmlNodePtr node);
ObActionsAct* actions_parse_string(const gchar *name);
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
+/*! 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(void);
+
+/*! Pass in a GSList of ObActionsAct's to be run. */
void actions_run_acts(GSList *acts,
ObUserAction uact,
guint state,
ObFrameContext con,
struct _ObClient *client);
-gboolean actions_interactive_act_running();
-void actions_interactive_cancel_act();
+gboolean actions_interactive_act_running(void);
+void actions_interactive_cancel_act(void);
gboolean actions_interactive_input_event(XEvent *e);