/* -*- 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"
{
(*a)->data.interdiraction.inter.any.interactive = TRUE;
(*a)->data.interdiraction.direction = OB_DIRECTION_NORTH;
+ (*a)->data.interdiraction.dialog = TRUE;
}
void setup_action_directional_focus_east(ObAction **a, ObUserAction uact)
{
(*a)->data.interdiraction.inter.any.interactive = TRUE;
(*a)->data.interdiraction.direction = OB_DIRECTION_EAST;
+ (*a)->data.interdiraction.dialog = TRUE;
}
void setup_action_directional_focus_south(ObAction **a, ObUserAction uact)
{
(*a)->data.interdiraction.inter.any.interactive = TRUE;
(*a)->data.interdiraction.direction = OB_DIRECTION_SOUTH;
+ (*a)->data.interdiraction.dialog = TRUE;
}
void setup_action_directional_focus_west(ObAction **a, ObUserAction uact)
{
(*a)->data.interdiraction.inter.any.interactive = TRUE;
(*a)->data.interdiraction.direction = OB_DIRECTION_WEST;
+ (*a)->data.interdiraction.dialog = TRUE;
}
void setup_action_directional_focus_northeast(ObAction **a, ObUserAction uact)
{
(*a)->data.interdiraction.inter.any.interactive = TRUE;
(*a)->data.interdiraction.direction = OB_DIRECTION_NORTHEAST;
+ (*a)->data.interdiraction.dialog = TRUE;
}
void setup_action_directional_focus_southeast(ObAction **a, ObUserAction uact)
{
(*a)->data.interdiraction.inter.any.interactive = TRUE;
(*a)->data.interdiraction.direction = OB_DIRECTION_SOUTHEAST;
+ (*a)->data.interdiraction.dialog = TRUE;
}
void setup_action_directional_focus_southwest(ObAction **a, ObUserAction uact)
{
(*a)->data.interdiraction.inter.any.interactive = TRUE;
(*a)->data.interdiraction.direction = OB_DIRECTION_SOUTHWEST;
+ (*a)->data.interdiraction.dialog = TRUE;
}
void setup_action_directional_focus_northwest(ObAction **a, ObUserAction uact)
{
(*a)->data.interdiraction.inter.any.interactive = TRUE;
(*a)->data.interdiraction.direction = OB_DIRECTION_NORTHWEST;
+ (*a)->data.interdiraction.dialog = TRUE;
}
void setup_action_send_to_desktop(ObAction **a, ObUserAction uact)
void setup_action_desktop(ObAction **a, ObUserAction uact)
{
- (*a)->data.desktop.inter.any.interactive = TRUE;
+ (*a)->data.desktop.inter.any.interactive = FALSE;
}
void setup_action_desktop_prev(ObAction **a, ObUserAction uact)
(*a)->data.cycle.inter.any.interactive = TRUE;
(*a)->data.cycle.linear = FALSE;
(*a)->data.cycle.forward = TRUE;
+ (*a)->data.cycle.dialog = TRUE;
}
void setup_action_cycle_windows_previous(ObAction **a, ObUserAction uact)
(*a)->data.cycle.inter.any.interactive = TRUE;
(*a)->data.cycle.linear = FALSE;
(*a)->data.cycle.forward = FALSE;
+ (*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,
}
};
+/* only key bindings can be interactive. thus saith the xor.
+ because of how the mouse is grabbed, mouse events dont even get
+ read during interactive events, so no dice! >:) */
+#define INTERACTIVE_LIMIT(a, uact) \
+ if (uact != OB_USER_ACTION_KEYBOARD_KEY) \
+ a->data.any.interactive = FALSE;
+
ObAction *action_from_string(const gchar *name, ObUserAction uact)
{
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);
- /* only key bindings can be interactive. thus saith the xor.
- because of how the mouse is grabbed, mouse events dont even get
- read during interactive events, so no dice! >:) */
- if (uact != OB_USER_ACTION_KEYBOARD_KEY)
- a->data.any.interactive = FALSE;
+ 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->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);
if (act->data.desktop.desk > 0) act->data.desktop.desk--;
+ if ((n = parse_find_node("dialog", node->xmlChildrenNode)))
+ act->data.desktop.inter.any.interactive =
+ parse_bool(doc, n);
} else if (act->func == action_send_to_desktop) {
if ((n = parse_find_node("desktop", node->xmlChildrenNode)))
act->data.sendto.desk = parse_int(doc, n);
} else if (act->func == action_desktop_dir) {
if ((n = parse_find_node("wrap", node->xmlChildrenNode)))
act->data.desktopdir.wrap = parse_bool(doc, n);
+ if ((n = parse_find_node("dialog", node->xmlChildrenNode)))
+ act->data.desktopdir.inter.any.interactive =
+ parse_bool(doc, n);
} else if (act->func == action_send_to_desktop_dir) {
if ((n = parse_find_node("wrap", node->xmlChildrenNode)))
act->data.sendtodir.wrap = parse_bool(doc, n);
if ((n = parse_find_node("follow", node->xmlChildrenNode)))
act->data.sendtodir.follow = parse_bool(doc, n);
+ if ((n = parse_find_node("dialog", node->xmlChildrenNode)))
+ act->data.sendtodir.inter.any.interactive =
+ parse_bool(doc, n);
} else if (act->func == action_activate) {
if ((n = parse_find_node("here", node->xmlChildrenNode)))
act->data.activate.here = parse_bool(doc, n);
} else if (act->func == action_cycle_windows) {
if ((n = parse_find_node("linear", node->xmlChildrenNode)))
act->data.cycle.linear = parse_bool(doc, n);
+ if ((n = parse_find_node("dialog", node->xmlChildrenNode)))
+ act->data.cycle.dialog = parse_bool(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) {
+ if ((n = parse_find_node("group", node->xmlChildrenNode)))
+ act->data.stacking.group = parse_bool(doc, n);
}
+ INTERACTIVE_LIMIT(act, uact);
}
g_free(actname);
}
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_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 (!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_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();
+
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(OB_FOCUS_FALLBACK_UNFOCUSING);
}
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)
{
client_action_start(data);
- stacking_raise(CLIENT_AS_WINDOW(data->client.any.c));
+ stacking_raise(CLIENT_AS_WINDOW(data->client.any.c), data->stacking.group);
client_action_end(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));
+ stacking_lower(CLIENT_AS_WINDOW(data->client.any.c), data->stacking.group);
client_action_end(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;
+ client_action_start(data);
+ client_move_resize(c,
+ c->area.x - data->relative.deltaxl * c->size_inc.width,
+ c->area.y - data->relative.deltayu * c->size_inc.height,
+ c->area.width + data->relative.deltax * c->size_inc.width
+ + data->relative.deltaxl * c->size_inc.width,
+ c->area.height + data->relative.deltay * c->size_inc.height
+ + data->relative.deltayu * c->size_inc.height);
+ client_action_end(data);
+}
+
void action_maximize_full(union ActionData *data)
{
client_action_start(data);
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), TRUE);
+ client_action_end(data);
+}
+
void action_send_to_desktop(union ActionData *data)
{
ObClient *c = data->sendto.any.c;
screen_set_desktop(first);
}
- if (data->inter.any.interactive && data->inter.final) {
+ if (!data->inter.any.interactive || data->inter.final) {
screen_desktop_popup(0, FALSE);
first = (unsigned) -1;
}
d = screen_cycle_desktop(data->desktopdir.dir,
data->desktopdir.wrap,
- data->sendtodir.linear,
+ data->desktopdir.linear,
data->desktopdir.inter.any.interactive,
data->desktopdir.inter.final,
data->desktopdir.inter.cancel);
if (!data->sendtodir.inter.any.interactive ||
- !data->sendtodir.inter.final)
+ !data->sendtodir.inter.final ||
+ data->sendtodir.inter.cancel)
{
screen_set_desktop(d);
}
data->sendtodir.inter.final,
data->sendtodir.inter.cancel);
if (!data->sendtodir.inter.any.interactive ||
- !data->sendtodir.inter.final)
+ !data->sendtodir.inter.final ||
+ data->sendtodir.inter.cancel)
{
client_set_desktop(c, d, data->sendtodir.follow);
if (data->sendtodir.follow)
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,
- data->cycle.inter.any.interactive,
+ /* 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->interdiraction.inter.any.interactive,
+ 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);