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 \
#include <glib.h>
-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
{
action_raiselower,
setup_client_action
},
- {
- "raise",
- action_raise,
- setup_client_action
- },
{
"lower",
action_lower,
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);
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)
#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"
}
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);
+ }
+ }
+ }
+}
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);
action_close_startup();
action_move_startup();
action_focus_startup();
+ action_raise_startup();
}
void action_close_startup();
void action_move_startup();
void action_focus_startup();
+void action_raise_startup();
#endif
{
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();
}
--- /dev/null
+#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;
+}