+static void client_action_start(union ActionData *data)
+{
+}
+
+static void client_action_end(union ActionData *data)
+{
+ if (config_focus_follow)
+ if (data->any.context != OB_FRAME_CONTEXT_CLIENT) {
+ if (!data->any.button && data->any.c)
+ event_ignore_all_queued_enters();
+ else {
+ /* we USED to create a fake enter event here, so that when you
+ used a Press context, and the button was still down,
+ you could still get enter events that weren't
+ NotifyWhileGrabbed.
+
+ only problem with this is that then the resulting focus
+ change events can ALSO be NotifyWhileGrabbed. And that is
+ bad. So, don't create fake enter events anymore. */
+ }
+ }
+}
+
+typedef struct
+{
+ const gchar *name;
+ void (*func)(union ActionData *);
+ void (*setup)(ObAction **, ObUserAction uact);
+} ActionString;
+
+static ObAction *action_new(void (*func)(union ActionData *data))
+{
+ ObAction *a = g_new0(ObAction, 1);
+ a->ref = 1;
+ a->func = func;
+
+ return a;
+}
+
+void action_ref(ObAction *a)
+{
+ ++a->ref;
+}
+
+void action_unref(ObAction *a)
+{
+ if (a == NULL) return;
+
+ if (--a->ref > 0) return;
+
+ /* deal with pointers */
+ if (a->func == action_execute || a->func == action_restart)
+ g_free(a->data.execute.path);
+ else if (a->func == action_debug)
+ g_free(a->data.debug.string);
+ else if (a->func == action_showmenu)
+ g_free(a->data.showmenu.name);
+
+ g_free(a);
+}
+
+ObAction* action_copy(const ObAction *src)
+{
+ ObAction *a = action_new(src->func);
+
+ a->data = src->data;
+
+ /* deal with pointers */
+ if (a->func == action_execute || a->func == action_restart)
+ a->data.execute.path = g_strdup(a->data.execute.path);
+ else if (a->func == action_debug)
+ a->data.debug.string = g_strdup(a->data.debug.string);
+ else if (a->func == action_showmenu)
+ a->data.showmenu.name = g_strdup(a->data.showmenu.name);
+
+ return a;
+}
+
+void setup_action_directional_focus_north(ObAction **a, ObUserAction uact)
+{
+ (*a)->data.interdiraction.inter.any.interactive = TRUE;
+ (*a)->data.interdiraction.direction = OB_DIRECTION_NORTH;
+ (*a)->data.interdiraction.dialog = TRUE;
+ (*a)->data.interdiraction.dock_windows = FALSE;
+ (*a)->data.interdiraction.desktop_windows = FALSE;
+}
+
+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;
+ (*a)->data.interdiraction.dock_windows = FALSE;
+ (*a)->data.interdiraction.desktop_windows = FALSE;
+}
+
+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;
+ (*a)->data.interdiraction.dock_windows = FALSE;
+ (*a)->data.interdiraction.desktop_windows = FALSE;
+}
+
+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;
+ (*a)->data.interdiraction.dock_windows = FALSE;
+ (*a)->data.interdiraction.desktop_windows = FALSE;
+}
+
+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;
+ (*a)->data.interdiraction.dock_windows = FALSE;
+ (*a)->data.interdiraction.desktop_windows = FALSE;
+}
+
+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;
+ (*a)->data.interdiraction.dock_windows = FALSE;
+ (*a)->data.interdiraction.desktop_windows = FALSE;
+}
+
+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;
+ (*a)->data.interdiraction.dock_windows = FALSE;
+ (*a)->data.interdiraction.desktop_windows = FALSE;
+}
+
+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;
+ (*a)->data.interdiraction.dock_windows = FALSE;
+ (*a)->data.interdiraction.desktop_windows = FALSE;
+}
+
+void setup_action_send_to_desktop(ObAction **a, ObUserAction uact)
+{
+ (*a)->data.sendto.any.client_action = OB_CLIENT_ACTION_ALWAYS;
+ (*a)->data.sendto.follow = TRUE;
+}
+
+void setup_action_send_to_desktop_prev(ObAction **a, ObUserAction uact)
+{
+ (*a)->data.sendtodir.inter.any.client_action = OB_CLIENT_ACTION_ALWAYS;
+ (*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.client_action = OB_CLIENT_ACTION_ALWAYS;
+ (*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.client_action = OB_CLIENT_ACTION_ALWAYS;
+ (*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.client_action = OB_CLIENT_ACTION_ALWAYS;
+ (*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.client_action = OB_CLIENT_ACTION_ALWAYS;
+ (*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.client_action = OB_CLIENT_ACTION_ALWAYS;
+ (*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(ObAction **a, ObUserAction uact)
+{
+/*
+ (*a)->data.desktop.inter.any.interactive = FALSE;
+*/
+}
+
+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;
+ (*a)->data.cycle.dialog = TRUE;
+ (*a)->data.cycle.dock_windows = FALSE;
+ (*a)->data.cycle.desktop_windows = FALSE;
+ (*a)->data.cycle.all_desktops = FALSE;
+}
+
+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;
+ (*a)->data.cycle.dock_windows = FALSE;
+ (*a)->data.cycle.desktop_windows = FALSE;
+ (*a)->data.cycle.all_desktops = FALSE;
+}
+
+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)->data.diraction.any.client_action = OB_CLIENT_ACTION_ALWAYS;
+ (*a)->data.diraction.direction = OB_DIRECTION_NORTH;
+}
+
+void setup_action_growtoedge_south(ObAction **a, ObUserAction uact)
+{
+ (*a)->data.diraction.any.client_action = OB_CLIENT_ACTION_ALWAYS;
+ (*a)->data.diraction.direction = OB_DIRECTION_SOUTH;
+}
+
+void setup_action_growtoedge_east(ObAction **a, ObUserAction uact)
+{
+ (*a)->data.diraction.any.client_action = OB_CLIENT_ACTION_ALWAYS;
+ (*a)->data.diraction.direction = OB_DIRECTION_EAST;
+}
+
+void setup_action_growtoedge_west(ObAction **a, ObUserAction uact)
+{
+ (*a)->data.diraction.any.client_action = OB_CLIENT_ACTION_ALWAYS;
+ (*a)->data.diraction.direction = OB_DIRECTION_WEST;
+}
+
+void setup_action_top_layer(ObAction **a, ObUserAction uact)
+{
+ (*a)->data.layer.any.client_action = OB_CLIENT_ACTION_ALWAYS;
+ (*a)->data.layer.layer = 1;
+}
+
+void setup_action_normal_layer(ObAction **a, ObUserAction uact)
+{
+ (*a)->data.layer.any.client_action = OB_CLIENT_ACTION_ALWAYS;
+ (*a)->data.layer.layer = 0;
+}
+
+void setup_action_bottom_layer(ObAction **a, ObUserAction uact)
+{
+ (*a)->data.layer.any.client_action = OB_CLIENT_ACTION_ALWAYS;
+ (*a)->data.layer.layer = -1;
+}
+
+void setup_action_move(ObAction **a, ObUserAction uact)
+{
+ (*a)->data.moveresize.any.client_action = OB_CLIENT_ACTION_ALWAYS;
+ (*a)->data.moveresize.keyboard =
+ (uact == OB_USER_ACTION_NONE ||
+ uact == OB_USER_ACTION_KEYBOARD_KEY ||
+ uact == OB_USER_ACTION_MENU_SELECTION);
+ (*a)->data.moveresize.corner = 0;
+}
+
+void setup_action_resize(ObAction **a, ObUserAction uact)
+{
+ (*a)->data.moveresize.any.client_action = OB_CLIENT_ACTION_ALWAYS;
+ (*a)->data.moveresize.keyboard =
+ (uact == OB_USER_ACTION_NONE ||
+ uact == OB_USER_ACTION_KEYBOARD_KEY ||
+ uact == OB_USER_ACTION_MENU_SELECTION);
+ (*a)->data.moveresize.corner = 0;
+}
+
+void setup_action_showmenu(ObAction **a, ObUserAction uact)
+{
+ (*a)->data.showmenu.any.client_action = OB_CLIENT_ACTION_OPTIONAL;
+ /* 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_unref(*a);
+ *a = NULL;
+ }
+}
+
+void setup_action_focus(ObAction **a, ObUserAction uact)
+{
+ (*a)->data.any.client_action = OB_CLIENT_ACTION_OPTIONAL;
+}
+
+void setup_client_action(ObAction **a, ObUserAction uact)
+{
+ (*a)->data.any.client_action = OB_CLIENT_ACTION_ALWAYS;
+}
+
+ActionString actionstrings[] =
+{
+ {
+ "debug",
+ action_debug,
+ NULL
+ },
+ {
+ "execute",
+ action_execute,
+ NULL
+ },
+ {
+ "directionalfocusnorth",
+ action_directional_focus,
+ setup_action_directional_focus_north
+ },
+ {
+ "directionalfocuseast",
+ action_directional_focus,
+ setup_action_directional_focus_east
+ },
+ {
+ "directionalfocussouth",
+ action_directional_focus,
+ setup_action_directional_focus_south
+ },
+ {
+ "directionalfocuswest",
+ action_directional_focus,
+ setup_action_directional_focus_west
+ },
+ {
+ "directionalfocusnortheast",
+ action_directional_focus,
+ setup_action_directional_focus_northeast
+ },
+ {
+ "directionalfocussoutheast",
+ action_directional_focus,
+ setup_action_directional_focus_southeast
+ },
+ {
+ "directionalfocussouthwest",
+ action_directional_focus,
+ setup_action_directional_focus_southwest
+ },
+ {
+ "directionalfocusnorthwest",
+ action_directional_focus,
+ setup_action_directional_focus_northwest
+ },
+ {
+ "activate",
+ action_activate,
+ setup_action_focus
+ },
+ {
+ "focus",
+ action_focus,
+ setup_action_focus
+ },
+ {
+ "unfocus",
+ action_unfocus,
+ setup_client_action
+ },
+ {
+ "iconify",
+ action_iconify,
+ setup_client_action
+ },
+ {
+ "focustobottom",
+ action_focus_order_to_bottom,
+ setup_client_action
+ },
+ {
+ "raiselower",
+ action_raiselower,
+ setup_client_action
+ },
+ {
+ "raise",
+ action_raise,
+ setup_client_action
+ },
+ {
+ "lower",
+ action_lower,
+ setup_client_action
+ },
+ {
+ "close",
+ action_close,
+ setup_client_action
+ },
+ {
+ "kill",
+ action_kill,
+ setup_client_action
+ },
+ {
+ "shadelower",
+ action_shadelower,
+ setup_client_action
+ },
+ {
+ "unshaderaise",
+ action_unshaderaise,
+ setup_client_action
+ },
+ {
+ "shade",
+ action_shade,
+ setup_client_action
+ },
+ {
+ "unshade",
+ action_unshade,
+ setup_client_action
+ },
+ {
+ "toggleshade",
+ action_toggle_shade,
+ setup_client_action
+ },
+ {
+ "toggleomnipresent",
+ action_toggle_omnipresent,
+ setup_client_action
+ },
+ {
+ "moverelativehorz",
+ action_move_relative_horz,
+ setup_client_action
+ },
+ {
+ "moverelativevert",
+ action_move_relative_vert,
+ setup_client_action
+ },
+ {
+ "movetocenter",
+ action_move_to_center,
+ setup_client_action
+ },
+ {
+ "resizerelativehorz",
+ action_resize_relative_horz,
+ setup_client_action
+ },
+ {
+ "resizerelativevert",
+ 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,
+ setup_client_action
+ },
+ {
+ "unmaximizefull",
+ action_unmaximize_full,
+ setup_client_action
+ },
+ {
+ "togglemaximizefull",
+ action_toggle_maximize_full,
+ setup_client_action
+ },
+ {
+ "maximizehorz",
+ action_maximize_horz,
+ setup_client_action
+ },
+ {
+ "unmaximizehorz",
+ action_unmaximize_horz,
+ setup_client_action
+ },
+ {
+ "togglemaximizehorz",
+ action_toggle_maximize_horz,
+ setup_client_action
+ },
+ {
+ "maximizevert",
+ action_maximize_vert,
+ setup_client_action
+ },
+ {
+ "unmaximizevert",
+ action_unmaximize_vert,
+ setup_client_action
+ },
+ {
+ "togglemaximizevert",
+ action_toggle_maximize_vert,
+ setup_client_action
+ },
+ {
+ "togglefullscreen",
+ action_toggle_fullscreen,
+ setup_client_action
+ },
+ {
+ "sendtodesktop",
+ action_send_to_desktop,
+ setup_action_send_to_desktop
+ },
+ {
+ "sendtodesktopnext",
+ action_send_to_desktop_dir,
+ setup_action_send_to_desktop_next
+ },
+ {
+ "sendtodesktopprevious",
+ action_send_to_desktop_dir,
+ setup_action_send_to_desktop_prev
+ },
+ {
+ "sendtodesktopright",
+ action_send_to_desktop_dir,
+ setup_action_send_to_desktop_right
+ },
+ {
+ "sendtodesktopleft",
+ action_send_to_desktop_dir,
+ setup_action_send_to_desktop_left
+ },
+ {
+ "sendtodesktopup",
+ action_send_to_desktop_dir,
+ setup_action_send_to_desktop_up
+ },
+ {
+ "sendtodesktopdown",
+ action_send_to_desktop_dir,
+ setup_action_send_to_desktop_down
+ },
+ {
+ "desktop",
+ action_desktop,
+ setup_action_desktop
+ },
+ {
+ "desktopnext",
+ action_desktop_dir,
+ setup_action_desktop_next
+ },
+ {
+ "desktopprevious",
+ action_desktop_dir,
+ setup_action_desktop_prev
+ },
+ {
+ "desktopright",
+ action_desktop_dir,
+ setup_action_desktop_right
+ },
+ {
+ "desktopleft",
+ action_desktop_dir,
+ setup_action_desktop_left
+ },
+ {
+ "desktopup",
+ action_desktop_dir,
+ setup_action_desktop_up
+ },
+ {
+ "desktopdown",
+ action_desktop_dir,
+ setup_action_desktop_down
+ },
+ {
+ "toggledecorations",
+ action_toggle_decorations,
+ setup_client_action
+ },
+ {
+ "move",
+ action_move,
+ setup_action_move
+ },
+ {
+ "resize",
+ action_resize,
+ setup_action_resize
+ },
+ {
+ "toggledockautohide",
+ action_toggle_dockautohide,
+ NULL
+ },
+ {
+ "toggleshowdesktop",
+ action_toggle_show_desktop,
+ NULL
+ },
+ {
+ "showdesktop",
+ action_show_desktop,
+ NULL
+ },
+ {
+ "unshowdesktop",
+ action_unshow_desktop,
+ NULL
+ },
+ {
+ "desktoplast",
+ action_desktop_last,
+ NULL
+ },
+ {
+ "reconfigure",
+ action_reconfigure,
+ NULL
+ },
+ {
+ "restart",
+ action_restart,
+ NULL
+ },
+ {
+ "exit",
+ action_exit,
+ NULL
+ },
+ {
+ "showmenu",
+ action_showmenu,
+ setup_action_showmenu
+ },
+ {
+ "sendtotoplayer",
+ action_send_to_layer,
+ setup_action_top_layer
+ },
+ {
+ "togglealwaysontop",
+ action_toggle_layer,
+ setup_action_top_layer
+ },
+ {
+ "sendtonormallayer",
+ action_send_to_layer,
+ setup_action_normal_layer
+ },
+ {
+ "sendtobottomlayer",
+ action_send_to_layer,
+ setup_action_bottom_layer
+ },
+ {
+ "togglealwaysonbottom",
+ action_toggle_layer,
+ setup_action_bottom_layer
+ },
+ {
+ "nextwindow",
+ action_cycle_windows,
+ setup_action_cycle_windows_next
+ },
+ {
+ "previouswindow",
+ 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,
+ setup_action_movetoedge_north
+ },
+ {
+ "movetoedgesouth",
+ action_movetoedge,
+ setup_action_movetoedge_south
+ },
+ {
+ "movetoedgewest",
+ action_movetoedge,
+ setup_action_movetoedge_west
+ },
+ {
+ "movetoedgeeast",
+ action_movetoedge,
+ setup_action_movetoedge_east
+ },
+ {
+ "growtoedgenorth",
+ action_growtoedge,
+ setup_action_growtoedge_north
+ },
+ {
+ "growtoedgesouth",
+ action_growtoedge,
+ setup_action_growtoedge_south
+ },
+ {
+ "growtoedgewest",
+ action_growtoedge,
+ setup_action_growtoedge_west
+ },
+ {
+ "growtoedgeeast",
+ action_growtoedge,
+ setup_action_growtoedge_east
+ },
+ {
+ "breakchroot",
+ action_break_chroot,
+ NULL
+ },
+ {
+ NULL,
+ NULL,
+ NULL
+ }
+};
+
+/* 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)