} setup;
ObActionsDataFreeFunc free;
ObActionsRunFunc run;
+ ObActionsShutdownFunc shutdown;
};
struct _ObActionsAct {
/* free all the registered actions */
while (registered) {
- actions_definition_unref(registered->data);
+ ObActionsDefinition *d = registered->data;
+ if (d->shutdown) d->shutdown();
+ actions_definition_unref(d);
registered = g_slist_delete_link(registered, registered);
}
}
def->name = g_strdup(name);
def->free = free;
def->run = run;
+ def->shutdown = NULL;
registered = g_slist_prepend(registered, def);
return def;
return def != NULL;
}
+gboolean actions_set_shutdown(const gchar *name,
+ ObActionsShutdownFunc shutdown)
+{
+ GSList *it;
+ ObActionsDefinition *def;
+
+ for (it = registered; it; it = g_slist_next(it)) {
+ def = it->data;
+ if (!g_ascii_strcasecmp(name, def->name)) {
+ def->shutdown = shutdown;
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+
static void actions_definition_ref(ObActionsDefinition *def)
{
++def->ref;
gchar *name;
ObActionsAct *act = NULL;
- if (obt_parse_attr_string(node, "name", &name)) {
+ if (obt_xml_attr_string(node, "name", &name)) {
if ((act = actions_build_act_from_string(name))) {
/* there is more stuff to parse here */
if (act->def->canbeinteractive) {
gboolean used = FALSE;
if (interactive_act) {
if (!interactive_act->i_input(interactive_initial_state, e,
+ grab_input_context(),
interactive_act->options, &used))
{
used = TRUE; /* if it cancelled the action then it has to of
are ignored during a grab, so don't force fake ones when they
should be ignored
*/
- if ((c = client_under_pointer()) && c != data->client &&
- !grab_on_pointer())
- {
- ob_debug_type(OB_DEBUG_FOCUS,
- "Generating fake enter because we did a "
- "mouse-event action");
- event_enter_client(c);
+ if (!grab_on_pointer()) {
+ 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);
+ }
+ else if (!c && c != data->client) {
+ ob_debug_type(OB_DEBUG_FOCUS,
+ "Generating fake leave because we did a "
+ "mouse-event action");
+ event_enter_client(data->client);
+ }
}
}
else if (!data->button && !config_focus_under_mouse)