/* -*- indent-tabs-mode: nil; tab-width: 4; c-basic-offset: 4; -*-
action.c for the Openbox window manager
+ Copyright (c) 2006 Mikael Magnusson
Copyright (c) 2003 Ben Jansens
This program is free software; you can redistribute it and/or modify
#include "grab.h"
#include "keyboard.h"
#include "event.h"
+#include "dock.h"
#include "config.h"
#include "mainloop.h"
+#include "startupnotify.h"
#include <glib.h>
(*a)->data.cycle.dialog = TRUE;
}
+void setup_action_movefromedge_north(ObAction **a, ObUserAction uact)
+{
+ (*a)->data.diraction.any.client_action = OB_CLIENT_ACTION_ALWAYS;
+ (*a)->data.diraction.direction = OB_DIRECTION_NORTH;
+ (*a)->data.diraction.hang = TRUE;
+}
+
+void setup_action_movefromedge_south(ObAction **a, ObUserAction uact)
+{
+ (*a)->data.diraction.any.client_action = OB_CLIENT_ACTION_ALWAYS;
+ (*a)->data.diraction.direction = OB_DIRECTION_SOUTH;
+ (*a)->data.diraction.hang = TRUE;
+}
+
+void setup_action_movefromedge_east(ObAction **a, ObUserAction uact)
+{
+ (*a)->data.diraction.any.client_action = OB_CLIENT_ACTION_ALWAYS;
+ (*a)->data.diraction.direction = OB_DIRECTION_EAST;
+ (*a)->data.diraction.hang = TRUE;
+}
+
+void setup_action_movefromedge_west(ObAction **a, ObUserAction uact)
+{
+ (*a)->data.diraction.any.client_action = OB_CLIENT_ACTION_ALWAYS;
+ (*a)->data.diraction.direction = OB_DIRECTION_WEST;
+ (*a)->data.diraction.hang = TRUE;
+}
+
void setup_action_movetoedge_north(ObAction **a, ObUserAction uact)
{
(*a)->data.diraction.any.client_action = OB_CLIENT_ACTION_ALWAYS;
(*a)->data.diraction.direction = OB_DIRECTION_NORTH;
+ (*a)->data.diraction.hang = FALSE;
}
void setup_action_movetoedge_south(ObAction **a, ObUserAction uact)
{
(*a)->data.diraction.any.client_action = OB_CLIENT_ACTION_ALWAYS;
(*a)->data.diraction.direction = OB_DIRECTION_SOUTH;
+ (*a)->data.diraction.hang = FALSE;
}
void setup_action_movetoedge_east(ObAction **a, ObUserAction uact)
{
(*a)->data.diraction.any.client_action = OB_CLIENT_ACTION_ALWAYS;
(*a)->data.diraction.direction = OB_DIRECTION_EAST;
+ (*a)->data.diraction.hang = FALSE;
}
void setup_action_movetoedge_west(ObAction **a, ObUserAction uact)
{
(*a)->data.diraction.any.client_action = OB_CLIENT_ACTION_ALWAYS;
(*a)->data.diraction.direction = OB_DIRECTION_WEST;
+ (*a)->data.diraction.hang = FALSE;
}
void setup_action_growtoedge_north(ObAction **a, ObUserAction uact)
a time! */
if (uact == OB_USER_ACTION_MENU_SELECTION) {
action_unref(*a);
- a = NULL;
+ *a = NULL;
}
}
action_iconify,
setup_client_action
},
+ {
+ "focustobottom",
+ action_focus_order_to_bottom,
+ setup_client_action
+ },
{
"raiselower",
action_raiselower,
action_move_relative_vert,
setup_client_action
},
+ {
+ "movetocenter",
+ action_move_to_center,
+ setup_client_action
+ },
{
"resizerelativehorz",
action_resize_relative_horz,
action_resize_relative_vert,
setup_client_action
},
+ {
+ "moverelative",
+ action_move_relative,
+ setup_client_action
+ },
+ {
+ "resizerelative",
+ action_resize_relative,
+ setup_client_action
+ },
{
"maximizefull",
action_maximize_full,
action_toggle_maximize_vert,
setup_client_action
},
+ {
+ "togglefullscreen",
+ action_toggle_fullscreen,
+ setup_client_action
+ },
{
"sendtodesktop",
action_send_to_desktop,
action_moveresize,
setup_action_resize
},
+ {
+ "toggledockautohide",
+ action_toggle_dockautohide,
+ NULL
+ },
{
"toggleshowdesktop",
action_toggle_show_desktop,
action_cycle_windows,
setup_action_cycle_windows_previous
},
+ {
+ "movefromedgenorth",
+ action_movetoedge,
+ setup_action_movefromedge_north
+ },
+ {
+ "movefromedgesouth",
+ action_movetoedge,
+ setup_action_movefromedge_south
+ },
+ {
+ "movefromedgewest",
+ action_movetoedge,
+ setup_action_movefromedge_west
+ },
+ {
+ "movefromedgeeast",
+ action_movetoedge,
+ setup_action_movefromedge_east
+ },
{
"movetoedgenorth",
action_movetoedge,
{
ObAction *a = NULL;
gboolean exist = FALSE;
- int i;
+ gint i;
for (i = 0; actionstrings[i].name; i++)
if (!g_ascii_strcasecmp(name, actionstrings[i].name)) {
a = action_new(actionstrings[i].func);
if (actionstrings[i].setup)
actionstrings[i].setup(&a, uact);
- INTERACTIVE_LIMIT(a, uact);
+ if (a)
+ INTERACTIVE_LIMIT(a, uact);
break;
}
if (!exist)
ObAction *action_parse(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node,
ObUserAction uact)
{
- char *actname;
+ gchar *actname;
ObAction *act = NULL;
xmlNodePtr n;
act->data.execute.path = parse_expand_tilde(s);
g_free(s);
}
+ if ((n = parse_find_node("startupnotify", node->xmlChildrenNode))) {
+ xmlNodePtr m;
+ if ((m = parse_find_node("enabled", n->xmlChildrenNode)))
+ act->data.execute.startupnotify = parse_bool(doc, m);
+ if ((m = parse_find_node("name", n->xmlChildrenNode)))
+ act->data.execute.name = parse_string(doc, m);
+ if ((m = parse_find_node("icon", n->xmlChildrenNode)))
+ act->data.execute.icon_name = parse_string(doc, m);
+ }
} else if (act->func == action_showmenu) {
if ((n = parse_find_node("menu", node->xmlChildrenNode)))
act->data.showmenu.name = parse_string(doc, n);
act->func == action_resize_relative_horz ||
act->func == action_resize_relative_vert) {
if ((n = parse_find_node("delta", node->xmlChildrenNode)))
- act->data.relative.delta = parse_int(doc, n);
+ act->data.relative.deltax = parse_int(doc, n);
+ } else if (act->func == action_move_relative) {
+ if ((n = parse_find_node("x", node->xmlChildrenNode)))
+ act->data.relative.deltax = parse_int(doc, n);
+ if ((n = parse_find_node("y", node->xmlChildrenNode)))
+ act->data.relative.deltay = parse_int(doc, n);
+ } else if (act->func == action_resize_relative) {
+ if ((n = parse_find_node("left", node->xmlChildrenNode)))
+ act->data.relative.deltaxl = parse_int(doc, n);
+ if ((n = parse_find_node("up", node->xmlChildrenNode)))
+ act->data.relative.deltayu = parse_int(doc, n);
+ if ((n = parse_find_node("right", node->xmlChildrenNode)))
+ act->data.relative.deltax = parse_int(doc, n);
+ if ((n = parse_find_node("down", node->xmlChildrenNode)))
+ act->data.relative.deltay = parse_int(doc, n);
} else if (act->func == action_desktop) {
if ((n = parse_find_node("desktop", node->xmlChildrenNode)))
act->data.desktop.desk = parse_int(doc, n);
} else if (act->func == action_directional_focus) {
if ((n = parse_find_node("dialog", node->xmlChildrenNode)))
act->data.cycle.dialog = parse_bool(doc, n);
+ } 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);
}
- INTERACTIVE_LIMIT(act, uact);
g_free(actname);
}
return act;
}
void action_run_list(GSList *acts, ObClient *c, ObFrameContext context,
- guint state, guint button, gint x, gint y,
+ guint state, guint button, gint x, gint y, Time time,
gboolean cancel, gboolean done)
{
GSList *it;
it won't work right unless we XUngrabKeyboard first,
even though we grabbed the key/button Asychronously.
e.g. "gnome-panel-control --main-menu" */
- XUngrabKeyboard(ob_display, event_lasttime);
+ XUngrabKeyboard(ob_display, event_curtime);
}
for (it = acts; it; it = g_slist_next(it)) {
a->data.any.button = button;
+ a->data.any.time = time;
+
if (a->data.any.interactive) {
a->data.inter.cancel = cancel;
a->data.inter.final = done;
if (!(cancel || done))
- keyboard_interactive_grab(state, a->data.any.c, a);
+ if (!keyboard_interactive_grab(state, a->data.any.c, a))
+ continue;
}
- ob_main_loop_queue_action(ob_main_loop, a);
+ /* XXX UGLY HACK race with motion event starting a move and the
+ button release gettnig processed first. answer: don't queue
+ moveresize starts. UGLY HACK XXX */
+ if (a->data.any.interactive || a->func == action_moveresize) {
+ /* interactive actions are not queued */
+ a->func(&a->data);
+ } else
+ ob_main_loop_queue_action(ob_main_loop, a);
}
}
}
-void action_run_string(const gchar *name, struct _ObClient *c)
+void action_run_string(const gchar *name, struct _ObClient *c, Time time)
{
ObAction *a;
GSList *l;
l = g_slist_append(NULL, a);
- action_run(l, c, 0);
+ action_run(l, c, 0, time);
}
void action_execute(union ActionData *data)
{
GError *e = NULL;
- char *cmd;
+ gchar *cmd, **argv = 0;
if (data->execute.path) {
cmd = g_filename_from_utf8(data->execute.path, -1, NULL, NULL, NULL);
if (cmd) {
- if (!g_spawn_command_line_async(cmd, &e)) {
+ if (!g_shell_parse_argv (cmd, NULL, &argv, &e)) {
g_warning("failed to execute '%s': %s",
cmd, e->message);
+ g_error_free(e);
+ } else if (data->execute.startupnotify) {
+ gchar *program;
+
+ program = g_path_get_basename(argv[0]);
+ /* sets up the environment */
+ sn_setup_spawn_environment(program,
+ data->execute.name,
+ data->execute.icon_name,
+ /* launch it on the current
+ desktop */
+ screen_desktop,
+ data->execute.any.time);
+ if (!g_spawn_async(NULL, argv, NULL, G_SPAWN_SEARCH_PATH |
+ G_SPAWN_DO_NOT_REAP_CHILD,
+ NULL, NULL, NULL, &e)) {
+ g_warning("failed to execute '%s': %s",
+ cmd, e->message);
+ g_error_free(e);
+ sn_spawn_cancel();
+ }
+ unsetenv("DESKTOP_STARTUP_ID");
+ g_free(program);
+ g_strfreev(argv);
+ } else {
+ if (!g_spawn_async(NULL, argv, NULL, G_SPAWN_SEARCH_PATH |
+ G_SPAWN_DO_NOT_REAP_CHILD,
+ NULL, NULL, NULL, &e))
+ {
+ g_warning("failed to execute '%s': %s",
+ cmd, e->message);
+ g_error_free(e);
+ }
+ g_strfreev(argv);
}
g_free(cmd);
} else {
void action_activate(union ActionData *data)
{
- client_activate(data->activate.any.c, data->activate.here);
+ /* similar to the openbox dock for dockapps, don't let user actions give
+ focus to 3rd-party docks (panels) either (unless they ask for it
+ themselves). */
+ if (data->client.any.c->type != OB_CLIENT_TYPE_DOCK) {
+ /* if using focus_delay, stop the timer now so that focus doesn't go
+ moving on us */
+ event_halt_focus_delay();
+
+ client_activate(data->activate.any.c, data->activate.here, TRUE);
+ }
}
void action_focus(union ActionData *data)
{
- client_focus(data->client.any.c);
+ /* similar to the openbox dock for dockapps, don't let user actions give
+ focus to 3rd-party docks (panels) either (unless they ask for it
+ themselves). */
+ if (data->client.any.c->type != OB_CLIENT_TYPE_DOCK) {
+ /* if using focus_delay, stop the timer now so that focus doesn't go
+ moving on us */
+ event_halt_focus_delay();
+
+ client_focus(data->client.any.c);
+ }
}
void action_unfocus (union ActionData *data)
{
- client_unfocus(data->client.any.c);
+ if (data->client.any.c == focus_client)
+ focus_fallback(FALSE);
}
void action_iconify(union ActionData *data)
{
+ client_action_start(data);
client_iconify(data->client.any.c, TRUE, TRUE);
+ client_action_end(data);
+}
+
+void action_focus_order_to_bottom(union ActionData *data)
+{
+ focus_order_to_bottom(data->client.any.c);
}
void action_raiselower(union ActionData *data)
gboolean raise = FALSE;
for (it = stacking_list; it; it = g_list_next(it)) {
- ObClient *cit = it->data;
-
- if (cit == c) break;
- if (client_normal(cit) == client_normal(c) &&
- cit->layer == c->layer &&
- cit->frame->visible &&
- !client_search_transient(c, cit))
- {
- if (RECT_INTERSECTS_RECT(cit->frame->area, c->frame->area)) {
- raise = TRUE;
- break;
+ if (WINDOW_IS_CLIENT(it->data)) {
+ ObClient *cit = it->data;
+
+ if (cit == c) break;
+ if (client_normal(cit) == client_normal(c) &&
+ cit->layer == c->layer &&
+ cit->frame->visible &&
+ !client_search_transient(c, cit))
+ {
+ if (RECT_INTERSECTS_RECT(cit->frame->area, c->frame->area)) {
+ raise = TRUE;
+ break;
+ }
}
}
}
- action_run_string((raise ? "Raise" : "Lower"), c);
+ if (raise)
+ action_raise(data);
+ else
+ action_lower(data);
}
void action_raise(union ActionData *data)
void action_unshaderaise(union ActionData *data)
{
if (data->client.any.c->shaded)
- action_run_string("Unshade", data->client.any.c);
+ action_unshade(data);
else
- action_run_string("Raise", data->client.any.c);
+ action_raise(data);
}
void action_shadelower(union ActionData *data)
{
if (data->client.any.c->shaded)
- action_run_string("Lower", data->client.any.c);
+ action_lower(data);
else
- action_run_string("Shade", data->client.any.c);
+ action_shade(data);
}
void action_lower(union ActionData *data)
client_action_start(data);
stacking_lower(CLIENT_AS_WINDOW(data->client.any.c));
client_action_end(data);
-
- focus_order_to_bottom(data->client.any.c);
}
void action_close(union ActionData *data)
{
ObClient *c = data->relative.any.c;
client_action_start(data);
- client_move(c, c->area.x + data->relative.delta, c->area.y);
+ client_move(c, c->area.x + data->relative.deltax, c->area.y);
client_action_end(data);
}
{
ObClient *c = data->relative.any.c;
client_action_start(data);
- client_move(c, c->area.x, c->area.y + data->relative.delta);
+ client_move(c, c->area.x, c->area.y + data->relative.deltax);
+ client_action_end(data);
+}
+
+void action_move_to_center(union ActionData *data)
+{
+ ObClient *c = data->client.any.c;
+ Rect *area;
+ area = screen_area_monitor(c->desktop, 0);
+ client_action_start(data);
+ client_move(c, area->width / 2 - c->area.width / 2,
+ area->height / 2 - c->area.height / 2);
client_action_end(data);
}
ObClient *c = data->relative.any.c;
client_action_start(data);
client_resize(c,
- c->area.width + data->relative.delta * c->size_inc.width,
+ c->area.width + data->relative.deltax * c->size_inc.width,
c->area.height);
client_action_end(data);
}
if (!c->shaded) {
client_action_start(data);
client_resize(c, c->area.width, c->area.height +
- data->relative.delta * c->size_inc.height);
+ data->relative.deltax * c->size_inc.height);
client_action_end(data);
}
}
+void action_move_relative(union ActionData *data)
+{
+ ObClient *c = data->relative.any.c;
+ client_action_start(data);
+ client_move(c, c->area.x + data->relative.deltax, c->area.y +
+ data->relative.deltay);
+ client_action_end(data);
+}
+
+void action_resize_relative(union ActionData *data)
+{
+ ObClient *c = data->relative.any.c;
+ gint x, y, ow, w, oh, h, lw, lh;
+
+ client_action_start(data);
+
+ x = c->area.x;
+ y = c->area.y;
+ ow = c->area.width;
+ w = ow + data->relative.deltax * c->size_inc.width
+ + data->relative.deltaxl * c->size_inc.width;
+ oh = c->area.height;
+ h = oh + data->relative.deltay * c->size_inc.height
+ + data->relative.deltayu * c->size_inc.height;
+
+ client_try_configure(c, OB_CORNER_TOPLEFT, &x, &y, &w, &h, &lw, &lh, TRUE);
+ client_move_resize(c, x + (ow - w), y + (oh - h), w, h);
+ client_action_end(data);
+}
+
void action_maximize_full(union ActionData *data)
{
client_action_start(data);
- client_maximize(data->client.any.c, TRUE, 0, TRUE);
+ client_maximize(data->client.any.c, TRUE, 0);
client_action_end(data);
}
void action_unmaximize_full(union ActionData *data)
{
client_action_start(data);
- client_maximize(data->client.any.c, FALSE, 0, TRUE);
+ client_maximize(data->client.any.c, FALSE, 0);
client_action_end(data);
}
client_maximize(data->client.any.c,
!(data->client.any.c->max_horz ||
data->client.any.c->max_vert),
- 0, TRUE);
+ 0);
client_action_end(data);
}
void action_maximize_horz(union ActionData *data)
{
client_action_start(data);
- client_maximize(data->client.any.c, TRUE, 1, TRUE);
+ client_maximize(data->client.any.c, TRUE, 1);
client_action_end(data);
}
void action_unmaximize_horz(union ActionData *data)
{
client_action_start(data);
- client_maximize(data->client.any.c, FALSE, 1, TRUE);
+ client_maximize(data->client.any.c, FALSE, 1);
client_action_end(data);
}
{
client_action_start(data);
client_maximize(data->client.any.c,
- !data->client.any.c->max_horz, 1, TRUE);
+ !data->client.any.c->max_horz, 1);
client_action_end(data);
}
void action_maximize_vert(union ActionData *data)
{
client_action_start(data);
- client_maximize(data->client.any.c, TRUE, 2, TRUE);
+ client_maximize(data->client.any.c, TRUE, 2);
client_action_end(data);
}
void action_unmaximize_vert(union ActionData *data)
{
client_action_start(data);
- client_maximize(data->client.any.c, FALSE, 2, TRUE);
+ client_maximize(data->client.any.c, FALSE, 2);
client_action_end(data);
}
{
client_action_start(data);
client_maximize(data->client.any.c,
- !data->client.any.c->max_vert, 2, TRUE);
+ !data->client.any.c->max_vert, 2);
+ client_action_end(data);
+}
+
+void action_toggle_fullscreen(union ActionData *data)
+{
+ client_action_start(data);
+ client_fullscreen(data->client.any.c, !(data->client.any.c->fullscreen));
client_action_end(data);
}
client_action_end(data);
}
-static guint32 pick_corner(int x, int y, int cx, int cy, int cw, int ch)
+static guint32 pick_corner(gint x, gint y, gint cx, gint cy, gint cw, gint ch)
{
- if (x - cx > cw / 2) {
- if (y - cy > ch / 2)
- return prop_atoms.net_wm_moveresize_size_bottomright;
- else
- return prop_atoms.net_wm_moveresize_size_topright;
+ if (config_resize_four_corners) {
+ if (x - cx > cw / 2) {
+ if (y - cy > ch / 2)
+ return prop_atoms.net_wm_moveresize_size_bottomright;
+ else
+ return prop_atoms.net_wm_moveresize_size_topright;
+ } else {
+ if (y - cy > ch / 2)
+ return prop_atoms.net_wm_moveresize_size_bottomleft;
+ else
+ return prop_atoms.net_wm_moveresize_size_topleft;
+ }
} else {
- if (y - cy > ch / 2)
- return prop_atoms.net_wm_moveresize_size_bottomleft;
- else
- return prop_atoms.net_wm_moveresize_size_topleft;
+ if (x - cx > cw * 2 / 3) {
+ if (y - cy > ch * 2 / 3)
+ return prop_atoms.net_wm_moveresize_size_bottomright;
+ else if (y - cy < ch / 3)
+ return prop_atoms.net_wm_moveresize_size_topright;
+ else
+ return prop_atoms.net_wm_moveresize_size_right;
+ } else if (x - cx < cw / 3) {
+ if (y - cy > ch * 2 / 3)
+ return prop_atoms.net_wm_moveresize_size_bottomleft;
+ else if (y - cy < ch / 3)
+ return prop_atoms.net_wm_moveresize_size_topleft;
+ else
+ return prop_atoms.net_wm_moveresize_size_left;
+ } else
+ if (y - cy > ch * 2 / 3)
+ return prop_atoms.net_wm_moveresize_size_bottom;
+ else if (y - cy < ch / 3)
+ return prop_atoms.net_wm_moveresize_size_top;
+ else
+ return prop_atoms.net_wm_moveresize_move;
}
}
void action_cycle_windows(union ActionData *data)
{
- focus_cycle(data->cycle.forward, data->cycle.linear,
+ /* if using focus_delay, stop the timer now so that focus doesn't go moving
+ on us */
+ event_halt_focus_delay();
+
+ focus_cycle(data->cycle.forward, data->cycle.linear, data->any.interactive,
data->cycle.dialog,
data->cycle.inter.final, data->cycle.inter.cancel);
}
void action_directional_focus(union ActionData *data)
{
+ /* if using focus_delay, stop the timer now so that focus doesn't go moving
+ on us */
+ event_halt_focus_delay();
+
focus_directional_cycle(data->interdiraction.direction,
+ data->any.interactive,
data->interdiraction.dialog,
data->interdiraction.inter.final,
data->interdiraction.inter.cancel);
void action_movetoedge(union ActionData *data)
{
- int x, y;
+ gint x, y;
ObClient *c = data->diraction.any.c;
x = c->frame->area.x;
switch(data->diraction.direction) {
case OB_DIRECTION_NORTH:
- y = client_directional_edge_search(c, OB_DIRECTION_NORTH);
+ y = client_directional_edge_search(c, OB_DIRECTION_NORTH,
+ data->diraction.hang)
+ - (data->diraction.hang ? c->frame->area.height : 0);
break;
case OB_DIRECTION_WEST:
- x = client_directional_edge_search(c, OB_DIRECTION_WEST);
+ x = client_directional_edge_search(c, OB_DIRECTION_WEST,
+ data->diraction.hang)
+ - (data->diraction.hang ? c->frame->area.width : 0);
break;
case OB_DIRECTION_SOUTH:
- y = client_directional_edge_search(c, OB_DIRECTION_SOUTH) -
- c->frame->area.height;
+ y = client_directional_edge_search(c, OB_DIRECTION_SOUTH,
+ data->diraction.hang)
+ - (data->diraction.hang ? 0 : c->frame->area.height);
break;
case OB_DIRECTION_EAST:
- x = client_directional_edge_search(c, OB_DIRECTION_EAST) -
- c->frame->area.width;
+ x = client_directional_edge_search(c, OB_DIRECTION_EAST,
+ data->diraction.hang)
+ - (data->diraction.hang ? 0 : c->frame->area.width);
break;
default:
g_assert_not_reached();
void action_growtoedge(union ActionData *data)
{
- int x, y, width, height, dest;
+ gint x, y, width, height, dest;
ObClient *c = data->diraction.any.c;
Rect *a;
+ //FIXME growtoedge resizes shaded windows to 0 height
+ if (c->shaded)
+ return;
+
a = screen_area(c->desktop);
x = c->frame->area.x;
y = c->frame->area.y;
switch(data->diraction.direction) {
case OB_DIRECTION_NORTH:
- dest = client_directional_edge_search(c, OB_DIRECTION_NORTH);
+ dest = client_directional_edge_search(c, OB_DIRECTION_NORTH, FALSE);
if (a->y == y)
height = c->frame->area.height / 2;
else {
}
break;
case OB_DIRECTION_WEST:
- dest = client_directional_edge_search(c, OB_DIRECTION_WEST);
+ dest = client_directional_edge_search(c, OB_DIRECTION_WEST, FALSE);
if (a->x == x)
width = c->frame->area.width / 2;
else {
}
break;
case OB_DIRECTION_SOUTH:
- dest = client_directional_edge_search(c, OB_DIRECTION_SOUTH);
+ dest = client_directional_edge_search(c, OB_DIRECTION_SOUTH, FALSE);
if (a->y + a->height == y + c->frame->area.height) {
height = c->frame->area.height / 2;
y = a->y + a->height - height;
height -= (height - c->frame->area.height) % c->size_inc.height;
break;
case OB_DIRECTION_EAST:
- dest = client_directional_edge_search(c, OB_DIRECTION_EAST);
+ dest = client_directional_edge_search(c, OB_DIRECTION_EAST, FALSE);
if (a->x + a->width == x + c->frame->area.width) {
width = c->frame->area.width / 2;
x = a->x + a->width - width;
client_action_end(data);
}
+void action_toggle_dockautohide(union ActionData *data)
+{
+ config_dock_hide = !config_dock_hide;
+ dock_configure();
+}
+
void action_toggle_show_desktop(union ActionData *data)
{
screen_show_desktop(!screen_showing_desktop);