-Action *action_from_string(char *name)
-{
- Action *a = NULL;
- if (!g_ascii_strcasecmp(name, "execute")) {
- a = action_new(action_execute);
- } else if (!g_ascii_strcasecmp(name, "focus")) {
- a = action_new(action_focus);
- } else if (!g_ascii_strcasecmp(name, "unfocus")) {
- a = action_new(action_unfocus);
- } else if (!g_ascii_strcasecmp(name, "iconify")) {
- a = action_new(action_iconify);
- } else if (!g_ascii_strcasecmp(name, "raise")) {
- a = action_new(action_raise);
- } else if (!g_ascii_strcasecmp(name, "lower")) {
- a = action_new(action_lower);
- } else if (!g_ascii_strcasecmp(name, "focusraise")) {
- a = action_new(action_focusraise);
- } else if (!g_ascii_strcasecmp(name, "close")) {
- a = action_new(action_close);
- } else if (!g_ascii_strcasecmp(name, "kill")) {
- a = action_new(action_kill);
- } else if (!g_ascii_strcasecmp(name, "shadelower")) {
- a = action_new(action_shadelower);
- } else if (!g_ascii_strcasecmp(name, "unshaderaise")) {
- a = action_new(action_unshaderaise);
- } else if (!g_ascii_strcasecmp(name, "shade")) {
- a = action_new(action_shade);
- } else if (!g_ascii_strcasecmp(name, "unshade")) {
- a = action_new(action_unshade);
- } else if (!g_ascii_strcasecmp(name, "toggleshade")) {
- a = action_new(action_toggle_shade);
- } else if (!g_ascii_strcasecmp(name, "toggleomnipresent")) {
- a = action_new(action_toggle_omnipresent);
- } else if (!g_ascii_strcasecmp(name, "moverelativehorz")) {
- a = action_new(action_move_relative_horz);
- } else if (!g_ascii_strcasecmp(name, "moverelativevert")) {
- a = action_new(action_move_relative_vert);
- } else if (!g_ascii_strcasecmp(name, "resizerelativehorz")) {
- a = action_new(action_resize_relative_horz);
- } else if (!g_ascii_strcasecmp(name, "resizerelativevert")) {
- a = action_new(action_resize_relative_vert);
- } else if (!g_ascii_strcasecmp(name, "maximizefull")) {
- a = action_new(action_maximize_full);
- } else if (!g_ascii_strcasecmp(name, "unmaximizefull")) {
- a = action_new(action_unmaximize_full);
- } else if (!g_ascii_strcasecmp(name, "togglemaximizefull")) {
- a = action_new(action_toggle_maximize_full);
- } else if (!g_ascii_strcasecmp(name, "maximizehorz")) {
- a = action_new(action_maximize_horz);
- } else if (!g_ascii_strcasecmp(name, "unmaximizehorz")) {
- a = action_new(action_unmaximize_horz);
- } else if (!g_ascii_strcasecmp(name, "togglemaximizehorz")) {
- a = action_new(action_toggle_maximize_horz);
- } else if (!g_ascii_strcasecmp(name, "maximizevert")) {
- a = action_new(action_maximize_vert);
- } else if (!g_ascii_strcasecmp(name, "unmaximizevert")) {
- a = action_new(action_unmaximize_vert);
- } else if (!g_ascii_strcasecmp(name, "togglemaximizevert")) {
- a = action_new(action_toggle_maximize_vert);
- } else if (!g_ascii_strcasecmp(name, "sendtodesktop")) {
- a = action_new(action_send_to_desktop);
- } else if (!g_ascii_strcasecmp(name, "sendtonextdesktop")) {
- a = action_new(action_send_to_next_desktop);
- a->data.sendtonextprev.wrap = FALSE;
- a->data.sendtonextprev.follow = TRUE;
- } else if (!g_ascii_strcasecmp(name, "sendtonextdesktopwrap")) {
- a = action_new(action_send_to_next_desktop);
- a->data.sendtonextprev.wrap = TRUE;
- a->data.sendtonextprev.follow = TRUE;
- } else if (!g_ascii_strcasecmp(name, "sendtopreviousdesktop")) {
- a = action_new(action_send_to_previous_desktop);
- a->data.sendtonextprev.wrap = FALSE;
- a->data.sendtonextprev.follow = TRUE;
- } else if (!g_ascii_strcasecmp(name, "sendtopreviousdesktopwrap")) {
- a = action_new(action_send_to_previous_desktop);
- a->data.sendtonextprev.wrap = TRUE;
- a->data.sendtonextprev.follow = TRUE;
- } else if (!g_ascii_strcasecmp(name, "desktop")) {
- a = action_new(action_desktop);
- } else if (!g_ascii_strcasecmp(name, "nextdesktop")) {
- a = action_new(action_next_desktop);
- a->data.nextprevdesktop.wrap = FALSE;
- } else if (!g_ascii_strcasecmp(name, "nextdesktopwrap")) {
- a = action_new(action_next_desktop);
- a->data.nextprevdesktop.wrap = TRUE;
- } else if (!g_ascii_strcasecmp(name, "previousdesktop")) {
- a = action_new(action_previous_desktop);
- a->data.nextprevdesktop.wrap = FALSE;
- } else if (!g_ascii_strcasecmp(name, "previousdesktopwrap")) {
- a = action_new(action_previous_desktop);
- a->data.nextprevdesktop.wrap = TRUE;
- } else if (!g_ascii_strcasecmp(name, "nextdesktopcolumn")) {
- a = action_new(action_next_desktop_column);
- a->data.nextprevdesktop.wrap = FALSE;
- } else if (!g_ascii_strcasecmp(name, "nextdesktopcolumnwrap")) {
- a = action_new(action_next_desktop_column);
- a->data.nextprevdesktop.wrap = TRUE;
- } else if (!g_ascii_strcasecmp(name, "previousdesktopcolumn")) {
- a = action_new(action_previous_desktop_column);
- a->data.nextprevdesktop.wrap = FALSE;
- } else if (!g_ascii_strcasecmp(name, "previousdesktopcolumnwrap")) {
- a = action_new(action_previous_desktop_column);
- a->data.nextprevdesktop.wrap = TRUE;
- } else if (!g_ascii_strcasecmp(name, "nextdesktoprow")) {
- a = action_new(action_next_desktop_row);
- a->data.nextprevdesktop.wrap = FALSE;
- } else if (!g_ascii_strcasecmp(name, "nextdesktoprowwrap")) {
- a = action_new(action_next_desktop_row);
- a->data.nextprevdesktop.wrap = TRUE;
- } else if (!g_ascii_strcasecmp(name, "previousdesktoprow")) {
- a = action_new(action_previous_desktop_row);
- a->data.nextprevdesktop.wrap = FALSE;
- } else if (!g_ascii_strcasecmp(name, "previousdesktoprowwrap")) {
- a = action_new(action_previous_desktop_row);
- a->data.nextprevdesktop.wrap = TRUE;
- } else if (!g_ascii_strcasecmp(name, "toggledecorations")) {
- a = action_new(action_toggle_decorations);
- } else if (!g_ascii_strcasecmp(name, "move")) {
- a = action_new(action_move);
- } else if (!g_ascii_strcasecmp(name, "resize")) {
- a = action_new(action_resize);
- } else if (!g_ascii_strcasecmp(name, "restart")) {
- a = action_new(action_restart);
- } else if (!g_ascii_strcasecmp(name, "exit")) {
- a = action_new(action_exit);
+void setup_action_directional_focus_north(ObAction **a, ObUserAction uact)
+{
+ (*a)->data.interdiraction.inter.any.interactive = TRUE;
+ (*a)->data.interdiraction.direction = OB_DIRECTION_NORTH;
+}
+
+void setup_action_directional_focus_east(ObAction **a, ObUserAction uact)
+{
+ (*a)->data.interdiraction.inter.any.interactive = TRUE;
+ (*a)->data.interdiraction.direction = OB_DIRECTION_EAST;
+}
+
+void setup_action_directional_focus_south(ObAction **a, ObUserAction uact)
+{
+ (*a)->data.interdiraction.inter.any.interactive = TRUE;
+ (*a)->data.interdiraction.direction = OB_DIRECTION_SOUTH;
+}
+
+void setup_action_directional_focus_west(ObAction **a, ObUserAction uact)
+{
+ (*a)->data.interdiraction.inter.any.interactive = TRUE;
+ (*a)->data.interdiraction.direction = OB_DIRECTION_WEST;
+}
+
+void setup_action_directional_focus_northeast(ObAction **a, ObUserAction uact)
+{
+ (*a)->data.interdiraction.inter.any.interactive = TRUE;
+ (*a)->data.interdiraction.direction = OB_DIRECTION_NORTHEAST;
+}
+
+void setup_action_directional_focus_southeast(ObAction **a, ObUserAction uact)
+{
+ (*a)->data.interdiraction.inter.any.interactive = TRUE;
+ (*a)->data.interdiraction.direction = OB_DIRECTION_SOUTHEAST;
+}
+
+void setup_action_directional_focus_southwest(ObAction **a, ObUserAction uact)
+{
+ (*a)->data.interdiraction.inter.any.interactive = TRUE;
+ (*a)->data.interdiraction.direction = OB_DIRECTION_SOUTHWEST;
+}
+
+void setup_action_directional_focus_northwest(ObAction **a, ObUserAction uact)
+{
+ (*a)->data.interdiraction.inter.any.interactive = TRUE;
+ (*a)->data.interdiraction.direction = OB_DIRECTION_NORTHWEST;
+}
+
+void setup_action_send_to_desktop(ObAction **a, ObUserAction uact)
+{
+ (*a)->data.sendto.follow = TRUE;
+}
+
+void setup_action_send_to_desktop_prev(ObAction **a, ObUserAction uact)
+{
+ (*a)->data.sendtodir.inter.any.interactive = TRUE;
+ (*a)->data.sendtodir.dir = OB_DIRECTION_WEST;
+ (*a)->data.sendtodir.linear = TRUE;
+ (*a)->data.sendtodir.wrap = TRUE;
+ (*a)->data.sendtodir.follow = TRUE;
+}
+
+void setup_action_send_to_desktop_next(ObAction **a, ObUserAction uact)
+{
+ (*a)->data.sendtodir.inter.any.interactive = TRUE;
+ (*a)->data.sendtodir.dir = OB_DIRECTION_EAST;
+ (*a)->data.sendtodir.linear = TRUE;
+ (*a)->data.sendtodir.wrap = TRUE;
+ (*a)->data.sendtodir.follow = TRUE;
+}
+
+void setup_action_send_to_desktop_left(ObAction **a, ObUserAction uact)
+{
+ (*a)->data.sendtodir.inter.any.interactive = TRUE;
+ (*a)->data.sendtodir.dir = OB_DIRECTION_WEST;
+ (*a)->data.sendtodir.linear = FALSE;
+ (*a)->data.sendtodir.wrap = TRUE;
+ (*a)->data.sendtodir.follow = TRUE;
+}
+
+void setup_action_send_to_desktop_right(ObAction **a, ObUserAction uact)
+{
+ (*a)->data.sendtodir.inter.any.interactive = TRUE;
+ (*a)->data.sendtodir.dir = OB_DIRECTION_EAST;
+ (*a)->data.sendtodir.linear = FALSE;
+ (*a)->data.sendtodir.wrap = TRUE;
+ (*a)->data.sendtodir.follow = TRUE;
+}
+
+void setup_action_send_to_desktop_up(ObAction **a, ObUserAction uact)
+{
+ (*a)->data.sendtodir.inter.any.interactive = TRUE;
+ (*a)->data.sendtodir.dir = OB_DIRECTION_NORTH;
+ (*a)->data.sendtodir.linear = FALSE;
+ (*a)->data.sendtodir.wrap = TRUE;
+ (*a)->data.sendtodir.follow = TRUE;
+}
+
+void setup_action_send_to_desktop_down(ObAction **a, ObUserAction uact)
+{
+ (*a)->data.sendtodir.inter.any.interactive = TRUE;
+ (*a)->data.sendtodir.dir = OB_DIRECTION_SOUTH;
+ (*a)->data.sendtodir.linear = FALSE;
+ (*a)->data.sendtodir.wrap = TRUE;
+ (*a)->data.sendtodir.follow = TRUE;
+}
+
+void setup_action_desktop_prev(ObAction **a, ObUserAction uact)
+{
+ (*a)->data.desktopdir.inter.any.interactive = TRUE;
+ (*a)->data.desktopdir.dir = OB_DIRECTION_WEST;
+ (*a)->data.desktopdir.linear = TRUE;
+ (*a)->data.desktopdir.wrap = TRUE;
+}
+
+void setup_action_desktop_next(ObAction **a, ObUserAction uact)
+{
+ (*a)->data.desktopdir.inter.any.interactive = TRUE;
+ (*a)->data.desktopdir.dir = OB_DIRECTION_EAST;
+ (*a)->data.desktopdir.linear = TRUE;
+ (*a)->data.desktopdir.wrap = TRUE;
+}
+
+void setup_action_desktop_left(ObAction **a, ObUserAction uact)
+{
+ (*a)->data.desktopdir.inter.any.interactive = TRUE;
+ (*a)->data.desktopdir.dir = OB_DIRECTION_WEST;
+ (*a)->data.desktopdir.linear = FALSE;
+ (*a)->data.desktopdir.wrap = TRUE;
+}
+
+void setup_action_desktop_right(ObAction **a, ObUserAction uact)
+{
+ (*a)->data.desktopdir.inter.any.interactive = TRUE;
+ (*a)->data.desktopdir.dir = OB_DIRECTION_EAST;
+ (*a)->data.desktopdir.linear = FALSE;
+ (*a)->data.desktopdir.wrap = TRUE;
+}
+
+void setup_action_desktop_up(ObAction **a, ObUserAction uact)
+{
+ (*a)->data.desktopdir.inter.any.interactive = TRUE;
+ (*a)->data.desktopdir.dir = OB_DIRECTION_NORTH;
+ (*a)->data.desktopdir.linear = FALSE;
+ (*a)->data.desktopdir.wrap = TRUE;
+}
+
+void setup_action_desktop_down(ObAction **a, ObUserAction uact)
+{
+ (*a)->data.desktopdir.inter.any.interactive = TRUE;
+ (*a)->data.desktopdir.dir = OB_DIRECTION_SOUTH;
+ (*a)->data.desktopdir.linear = FALSE;
+ (*a)->data.desktopdir.wrap = TRUE;
+}
+
+void setup_action_cycle_windows_next(ObAction **a, ObUserAction uact)
+{
+ (*a)->data.cycle.inter.any.interactive = TRUE;
+ (*a)->data.cycle.linear = FALSE;
+ (*a)->data.cycle.forward = 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;
+}
+
+void setup_action_movetoedge_north(ObAction **a, ObUserAction uact)
+{
+ (*a)->data.diraction.direction = OB_DIRECTION_NORTH;
+}
+
+void setup_action_movetoedge_south(ObAction **a, ObUserAction uact)
+{
+ (*a)->data.diraction.direction = OB_DIRECTION_SOUTH;
+}
+
+void setup_action_movetoedge_east(ObAction **a, ObUserAction uact)
+{
+ (*a)->data.diraction.direction = OB_DIRECTION_EAST;
+}
+
+void setup_action_movetoedge_west(ObAction **a, ObUserAction uact)
+{
+ (*a)->data.diraction.direction = OB_DIRECTION_WEST;
+}
+
+void setup_action_growtoedge_north(ObAction **a, ObUserAction uact)
+{
+ (*a)->data.diraction.direction = OB_DIRECTION_NORTH;
+}
+
+void setup_action_growtoedge_south(ObAction **a, ObUserAction uact)
+{
+ (*a)->data.diraction.direction = OB_DIRECTION_SOUTH;
+}
+
+void setup_action_growtoedge_east(ObAction **a, ObUserAction uact)
+{
+ (*a)->data.diraction.direction = OB_DIRECTION_EAST;
+}
+
+void setup_action_growtoedge_west(ObAction **a, ObUserAction uact)
+{
+ (*a)->data.diraction.direction = OB_DIRECTION_WEST;
+}
+
+void setup_action_top_layer(ObAction **a, ObUserAction uact)
+{
+ (*a)->data.layer.layer = 1;
+}
+
+void setup_action_normal_layer(ObAction **a, ObUserAction uact)
+{
+ (*a)->data.layer.layer = 0;
+}
+
+void setup_action_bottom_layer(ObAction **a, ObUserAction uact)
+{
+ (*a)->data.layer.layer = -1;
+}
+
+void setup_action_move(ObAction **a, ObUserAction uact)
+{
+ (*a)->data.moveresize.move = TRUE;
+ (*a)->data.moveresize.keyboard =
+ (uact == OB_USER_ACTION_KEYBOARD_KEY ||
+ uact == OB_USER_ACTION_MENU_SELECTION);
+}
+
+void setup_action_resize(ObAction **a, ObUserAction uact)
+{
+ (*a)->data.moveresize.move = FALSE;
+ (*a)->data.moveresize.keyboard =
+ (uact == OB_USER_ACTION_KEYBOARD_KEY ||
+ uact == OB_USER_ACTION_MENU_SELECTION);
+}
+
+void setup_action_showmenu(ObAction **a, ObUserAction uact)
+{
+ /* you cannot call ShowMenu from inside a menu, cuz the menu code makes
+ assumptions that there is only one menu (and submenus) open at
+ a time! */
+ if (uact == OB_USER_ACTION_MENU_SELECTION) {
+ action_free(*a);
+ a = NULL;