X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=openbox%2Factions.c;h=ac849a9741b794070537ef1094e35787985628cd;hb=2ea60e77c085a724b2ec28273e24e12ece0e84f3;hp=2324bc95ad846963521458fa8a610e44a7f17308;hpb=4f93731cdbecbf43b82aa000c07ec8b40f97dd03;p=chaz%2Fopenbox diff --git a/openbox/actions.c b/openbox/actions.c index 2324bc95..ac849a97 100644 --- a/openbox/actions.c +++ b/openbox/actions.c @@ -1,6 +1,6 @@ /* -*- indent-tabs-mode: nil; tab-width: 4; c-basic-offset: 4; -*- - actions.h for the Openbox window manager + actions.c for the Openbox window manager Copyright (c) 2007 Dana Jansens This program is free software; you can redistribute it and/or modify @@ -23,6 +23,7 @@ #include "event.h" #include "config.h" #include "client.h" +#include "focus.h" #include "openbox.h" #include "debug.h" @@ -50,6 +51,7 @@ struct _ObActionsDefinition { ObActionsDataFreeFunc free; ObActionsRunFunc run; ObActionsShutdownFunc shutdown; + gboolean modifies_focused_window; }; struct _ObActionsAct { @@ -102,12 +104,13 @@ ObActionsDefinition* do_register(const gchar *name, return NULL; } - def = g_slice_new(ObActionsDefinition); + def = g_slice_new0(ObActionsDefinition); def->ref = 1; def->name = g_strdup(name); def->free = free; def->run = run; def->shutdown = NULL; + def->modifies_focused_window = TRUE; registered = g_slist_prepend(registered, def); return def; @@ -155,6 +158,22 @@ gboolean actions_set_shutdown(const gchar *name, return FALSE; } +gboolean actions_set_modifies_focused_window(const gchar *name, + gboolean modifies) +{ + GSList *it; + ObActionsDefinition *def; + + for (it = registered; it; it = g_slist_next(it)) { + def = it->data; + if (!g_ascii_strcasecmp(name, def->name)) { + def->modifies_focused_window = modifies; + return TRUE; + } + } + return FALSE; +} + static void actions_definition_ref(ObActionsDefinition *def) { ++def->ref; @@ -300,6 +319,7 @@ void actions_run_acts(GSList *acts, struct _ObClient *client) { GSList *it; + gboolean update_user_time; /* Don't allow saving the initial state when running things from the menu */ @@ -309,6 +329,7 @@ void actions_run_acts(GSList *acts, if (x < 0 && y < 0) screen_pointer_pos(&x, &y); + update_user_time = FALSE; for (it = acts; it; it = g_slist_next(it)) { ObActionsData data; ObActionsAct *act = it->data; @@ -337,6 +358,11 @@ void actions_run_acts(GSList *acts, if (!act->def->run(&data, act->options)) { if (actions_act_is_interactive(act)) actions_interactive_end_act(); + if (client && client == focus_client && + act->def->modifies_focused_window) + { + update_user_time = TRUE; + } } else { /* make sure its interactive if it returned TRUE */ g_assert(act->i_input); @@ -346,6 +372,8 @@ void actions_run_acts(GSList *acts, } } } + if (update_user_time) + event_update_user_time(); } gboolean actions_interactive_act_running(void) @@ -383,13 +411,19 @@ static gboolean actions_interactive_begin_act(ObActionsAct *act, guint state) static void actions_interactive_end_act(void) { if (interactive_act) { + ObActionsAct *ia = interactive_act; + + /* set this to NULL first so the i_post() function can't cause this to + get called again (if it decides it wants to cancel any ongoing + interactive action). */ + interactive_act = NULL; + ungrab_keyboard(); - if (interactive_act->i_post) - interactive_act->i_post(interactive_act->options); + if (ia->i_post) + ia->i_post(ia->options); - actions_act_unref(interactive_act); - interactive_act = NULL; + actions_act_unref(ia); } } @@ -440,7 +474,7 @@ void actions_client_move(ObActionsData *data, gboolean start) ob_debug_type(OB_DEBUG_FOCUS, "Generating fake leave because we did a " "mouse-event action"); - event_enter_client(data->client); + event_leave_client(data->client); } } }