From a07465f376b0a33270532501127ec812efe2c2b2 Mon Sep 17 00:00:00 2001 From: Dana Jansens Date: Fri, 22 Jun 2007 14:24:23 +0000 Subject: [PATCH] add raise action --- Makefile.am | 1 + openbox/action.c | 47 ----------------------------------------- openbox/actions.c | 32 ++++++++++++++++++++++++++++ openbox/actions.h | 3 +++ openbox/actions/all.c | 1 + openbox/actions/all.h | 1 + openbox/actions/focus.c | 7 +++--- openbox/actions/raise.c | 24 +++++++++++++++++++++ 8 files changed, 65 insertions(+), 51 deletions(-) create mode 100644 openbox/actions/raise.c diff --git a/Makefile.am b/Makefile.am index a1bc2645..cebec407 100644 --- a/Makefile.am +++ b/Makefile.am @@ -164,6 +164,7 @@ openbox_openbox_SOURCES = \ openbox/actions/exit.c \ openbox/actions/focus.c \ openbox/actions/move.c \ + openbox/actions/raise.c \ openbox/actions/reconfigure.c \ openbox/actions/restart.c \ openbox/actions/showdesktop.c \ diff --git a/openbox/action.c b/openbox/action.c index cdf48df3..f0fe691e 100644 --- a/openbox/action.c +++ b/openbox/action.c @@ -39,36 +39,7 @@ #include -static gulong ignore_start = 0; -static void client_action_start(union ActionData *data) -{ - ignore_start = event_start_ignore_all_enters(); -} - -static void client_action_end(union ActionData *data, gboolean allow_enters) -{ - if (config_focus_follow) - if (data->any.context != OB_FRAME_CONTEXT_CLIENT) { - if (!data->any.button && data->any.c && !allow_enters) { - event_end_ignore_all_enters(ignore_start); - } else { - 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->any.c) { - ob_debug_type(OB_DEBUG_FOCUS, - "Generating fake enter because we did a " - "mouse-event action"); - event_enter_client(c); - } - } - } -} typedef struct { @@ -498,11 +469,6 @@ ActionString actionstrings[] = action_raiselower, setup_client_action }, - { - "raise", - action_raise, - setup_client_action - }, { "lower", action_lower, @@ -957,12 +923,6 @@ ObAction *action_parse(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node, prop_atoms.net_wm_moveresize_size_bottomright; g_free(s); } - } else if (act->func == action_raise || - act->func == action_lower || - act->func == action_raiselower || - act->func == action_shadelower || - act->func == action_unshaderaise) { - } INTERACTIVE_LIMIT(act, uact); } g_free(actname); @@ -1097,13 +1057,6 @@ void action_raiselower(union ActionData *data) client_action_end(data, config_focus_under_mouse); } -void action_raise(union ActionData *data) -{ - client_action_start(data); - stacking_raise(CLIENT_AS_WINDOW(data->client.any.c)); - client_action_end(data, config_focus_under_mouse); -} - void action_unshaderaise(union ActionData *data) { if (data->client.any.c->shaded) diff --git a/openbox/actions.c b/openbox/actions.c index a4308e62..67dc3d31 100644 --- a/openbox/actions.c +++ b/openbox/actions.c @@ -20,6 +20,10 @@ #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" @@ -307,3 +311,31 @@ gboolean actions_interactive_input_event(XEvent *e) } 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); + } + } + } +} diff --git a/openbox/actions.h b/openbox/actions.h index 7c69b10f..477e4ba1 100644 --- a/openbox/actions.h +++ b/openbox/actions.h @@ -90,3 +90,6 @@ 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); diff --git a/openbox/actions/all.c b/openbox/actions/all.c index 71e439e6..4bc4814a 100644 --- a/openbox/actions/all.c +++ b/openbox/actions/all.c @@ -14,4 +14,5 @@ void action_all_startup() action_close_startup(); action_move_startup(); action_focus_startup(); + action_raise_startup(); } diff --git a/openbox/actions/all.h b/openbox/actions/all.h index 2f2cf18a..01716e39 100644 --- a/openbox/actions/all.h +++ b/openbox/actions/all.h @@ -15,5 +15,6 @@ void action_breakchroot_startup(); void action_close_startup(); void action_move_startup(); void action_focus_startup(); +void action_raise_startup(); #endif diff --git a/openbox/actions/focus.c b/openbox/actions/focus.c index 9be6741c..254850ec 100644 --- a/openbox/actions/focus.c +++ b/openbox/actions/focus.c @@ -51,10 +51,9 @@ static gboolean run_func(ObActionsData *data, gpointer options) { client_activate(data->client, o->here, FALSE, FALSE, TRUE); } - } else { - /* focus action on something other than a client, make keybindings - work for this openbox instance, but don't focus any specific client - */ + } else if (data->context == OB_FRAME_CONTEXT_DESKTOP) { + /* focus action on the root window. make keybindings work for this + openbox instance, but don't focus any specific client */ focus_nothing(); } diff --git a/openbox/actions/raise.c b/openbox/actions/raise.c new file mode 100644 index 00000000..916c27b5 --- /dev/null +++ b/openbox/actions/raise.c @@ -0,0 +1,24 @@ +#include "openbox/actions.h" +#include "openbox/stacking.h" + +static gboolean run_func(ObActionsData *data, gpointer options); + +void action_raise_startup() +{ + actions_register("Raise", + NULL, NULL, + run_func, + NULL, NULL); +} + +/* Always return FALSE because its not interactive */ +static gboolean run_func(ObActionsData *data, gpointer options) +{ + if (data->client) { + actions_client_move(data, TRUE); + stacking_raise(CLIENT_AS_WINDOW(data->client)); + actions_client_move(data, FALSE); + } + + return FALSE; +} -- 2.45.2