#include "gettext.h"
#include "grab.h"
#include "screen.h"
+#include "event.h"
+#include "config.h"
+#include "client.h"
+#include "debug.h"
#include "actions/all.h"
GSList *it;
ObActionsDefinition *def;
+ g_assert(run != NULL);
+ g_assert((i_input == NULL) == (i_cancel == NULL));
+
for (it = registered; it; it = g_slist_next(it)) {
def = it->data;
if (!g_ascii_strcasecmp(name, def->name)) /* already registered */
return FALSE;
}
- g_assert((i_input == NULL) == (i_cancel == NULL));
-
def = g_new(ObActionsDefinition, 1);
def->ref = 1;
def->name = g_strdup(name);
if (parse_attr_string("name", node, &name)) {
if ((act = actions_parse_string(name)))
/* there is more stuff to parse here */
- act->options = act->def->setup(i, doc, node->xmlChildrenNode);
+ if (act->def->setup)
+ act->options = act->def->setup(i, doc, node->xmlChildrenNode);
g_free(name);
}
{
if (act && --act->ref == 0) {
/* free the action specific options */
- act->def->free(act->options);
+ if (act->def->free)
+ act->def->free(act->options);
/* unref the definition */
actions_definition_unref(act->def);
g_free(act);
static void actions_setup_data(ObActionsData *data,
ObUserAction uact,
- Time time,
guint state,
gint x,
gint y,
+ gint button,
ObFrameContext con,
struct _ObClient *client)
{
data->uact = uact;
- data->time = time;
data->state = state;
data->x = x;
data->y = y;
+ data->button = button;
data->context = con;
data->client = client;
}
void actions_run_acts(GSList *acts,
ObUserAction uact,
- Time time,
guint state,
gint x,
gint y,
+ gint button,
ObFrameContext con,
struct _ObClient *client)
{
ObActionsAct *act = it->data;
gboolean ok = TRUE;
- actions_setup_data(&data, uact, time, state, x, y, con, client);
+ actions_setup_data(&data, uact, state, x, y, button, con, client);
if (actions_act_is_interactive(act) &&
(!interactive_act || interactive_act->def != act->def))
}
return used;
}
+
+void actions_client_move(ObActionsData *data, gboolean start)
+{
+ static gulong ignore_start = 0;
+ if (start)
+ ignore_start = event_start_ignore_all_enters();
+ else if (config_focus_follow &&
+ data->context != OB_FRAME_CONTEXT_CLIENT)
+ {
+ if (!data->button && data->client && !config_focus_under_mouse)
+ event_end_ignore_all_enters(ignore_start);
+ else {
+ struct _ObClient *c;
+
+ /* usually this is sorta redundant, but with a press action
+ that moves windows our from under the cursor, the enter
+ event will come as a GrabNotify which is ignored, so this
+ makes a fake enter event
+ */
+ if ((c = client_under_pointer()) && c != data->client) {
+ ob_debug_type(OB_DEBUG_FOCUS,
+ "Generating fake enter because we did a "
+ "mouse-event action");
+ event_enter_client(c);
+ }
+ }
+ }
+}