summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDana Jansens <danakj@orodu.net>2007-06-23 15:08:08 +0000
committerDana Jansens <danakj@orodu.net>2007-06-23 15:08:08 +0000
commitc15da849dd28565aa8ce19569ec1280961eb605d (patch)
tree6e84441d3d26de7e2acbc779246a9353883da092
parent7f50e04925e539dbe28997a6b07369d9f5cb43e3 (diff)
add moveto/fromedge actions
-rw-r--r--Makefile.am1
-rw-r--r--openbox/action.c173
-rw-r--r--openbox/actions/all.c1
-rw-r--r--openbox/actions/all.h1
-rw-r--r--openbox/actions/movetofromedge.c125
5 files changed, 128 insertions, 173 deletions
diff --git a/Makefile.am b/Makefile.am
index ab4d8867..a03e3a3d 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -182,6 +182,7 @@ openbox_openbox_SOURCES = \
openbox/actions/move.c \
openbox/actions/moverelative.c \
openbox/actions/moveto.c \
+ openbox/actions/movetofromedge.c \
openbox/actions/omnipresent.c \
openbox/actions/raise.c \
openbox/actions/raiselower.c \
diff --git a/openbox/action.c b/openbox/action.c
index 9dd4965f..d0953cc1 100644
--- a/openbox/action.c
+++ b/openbox/action.c
@@ -42,62 +42,6 @@
-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;
@@ -158,71 +102,6 @@ ActionString actionstrings[] =
setup_client_action
},
{
- "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
- },
- {
- "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
@@ -265,44 +144,6 @@ void action_shadelower(union ActionData *data)
action_shade(data);
}
-void action_movetoedge(union ActionData *data)
-{
- gint x, y;
- ObClient *c = data->diraction.any.c;
-
- x = c->frame->area.x;
- y = c->frame->area.y;
-
- switch(data->diraction.direction) {
- case 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,
- 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,
- 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,
- data->diraction.hang)
- - (data->diraction.hang ? 0 : c->frame->area.width);
- break;
- default:
- g_assert_not_reached();
- }
- frame_frame_gravity(c->frame, &x, &y, c->area.width, c->area.height);
- client_action_start(data);
- client_move(c, x, y);
- client_action_end(data, FALSE);
-}
-
void action_growtoedge(union ActionData *data)
{
gint x, y, width, height, dest;
@@ -370,17 +211,3 @@ void action_growtoedge(union ActionData *data)
client_action_end(data, FALSE);
g_free(a);
}
-
-void action_send_to_layer(union ActionData *data)
-{
- client_set_layer(data->layer.any.c, data->layer.layer);
-}
-
-void action_toggle_layer(union ActionData *data)
-{
- ObClient *c = data->layer.any.c;
-
- client_action_start(data);
- client_action_end(data, config_focus_under_mouse);
-}
-
diff --git a/openbox/actions/all.c b/openbox/actions/all.c
index 8219325d..d22a25fb 100644
--- a/openbox/actions/all.c
+++ b/openbox/actions/all.c
@@ -38,4 +38,5 @@ void action_all_startup()
action_addremovedesktop_startup();
action_dockautohide_startup();
action_layer_startup();
+ action_movetofromedge_startup();
}
diff --git a/openbox/actions/all.h b/openbox/actions/all.h
index 7d4a68ad..9b318c0f 100644
--- a/openbox/actions/all.h
+++ b/openbox/actions/all.h
@@ -39,5 +39,6 @@ void action_resizerelative_startup();
void action_addremovedesktop_startup();
void action_dockautohide_startup();
void action_layer_startup();
+void action_movetofromedge_startup();
#endif
diff --git a/openbox/actions/movetofromedge.c b/openbox/actions/movetofromedge.c
new file mode 100644
index 00000000..72a89c1c
--- /dev/null
+++ b/openbox/actions/movetofromedge.c
@@ -0,0 +1,125 @@
+#include "openbox/actions.h"
+#include "openbox/misc.h"
+#include "openbox/client.h"
+#include "openbox/frame.h"
+#include <glib.h>
+
+typedef struct {
+ ObDirection dir;
+ gboolean hang;
+} Options;
+
+static gpointer setup_func(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node);
+static gpointer setup_to_func(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node);
+static gpointer setup_from_func(ObParseInst *i,xmlDocPtr doc, xmlNodePtr node);
+static void free_func(gpointer options);
+static gboolean run_func(ObActionsData *data, gpointer options);
+
+void action_movetofromedge_startup()
+{
+ actions_register("MoveToEdge",
+ setup_to_func,
+ free_func,
+ run_func,
+ NULL, NULL);
+ actions_register("MoveFromEdge",
+ setup_from_func,
+ free_func,
+ run_func,
+ NULL, NULL);
+}
+
+static gpointer setup_func(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node)
+{
+ xmlNodePtr n;
+ Options *o;
+
+ o = g_new0(Options, 1);
+ o->dir = OB_DIRECTION_NORTH;
+
+ if ((n = parse_find_node("direction", node))) {
+ gchar *s = parse_string(doc, n);
+ if (!g_ascii_strcasecmp(s, "north") ||
+ !g_ascii_strcasecmp(s, "up"))
+ o->dir = OB_DIRECTION_NORTH;
+ else if (!g_ascii_strcasecmp(s, "south") ||
+ !g_ascii_strcasecmp(s, "down"))
+ o->dir = OB_DIRECTION_SOUTH;
+ else if (!g_ascii_strcasecmp(s, "west") ||
+ !g_ascii_strcasecmp(s, "left"))
+ o->dir = OB_DIRECTION_WEST;
+ else if (!g_ascii_strcasecmp(s, "east") ||
+ !g_ascii_strcasecmp(s, "right"))
+ o->dir = OB_DIRECTION_EAST;
+ g_free(s);
+ }
+
+ return o;
+}
+
+static gpointer setup_to_func(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node)
+{
+ Options *o = setup_func(i, doc, node);
+ o->hang = FALSE;
+ return o;
+}
+
+static gpointer setup_from_func(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node)
+{
+ Options *o = setup_func(i, doc, node);
+ o->hang = TRUE;
+ return o;
+}
+
+static void free_func(gpointer options)
+{
+ Options *o = options;
+
+ g_free(o);
+}
+
+/* Always return FALSE because its not interactive */
+static gboolean run_func(ObActionsData *data, gpointer options)
+{
+ Options *o = options;
+
+ if (data->client) {
+ gint x, y;
+ ObClient *c = data->client;
+
+ x = c->frame->area.x;
+ y = c->frame->area.y;
+
+ switch(o->dir) {
+ case OB_DIRECTION_NORTH:
+ y = client_directional_edge_search(c, OB_DIRECTION_NORTH,
+ o->hang)
+ - (o->hang ? c->frame->area.height : 0);
+ break;
+ case OB_DIRECTION_WEST:
+ x = client_directional_edge_search(c, OB_DIRECTION_WEST,
+ o->hang)
+ - (o->hang ? c->frame->area.width : 0);
+ break;
+ case OB_DIRECTION_SOUTH:
+ y = client_directional_edge_search(c, OB_DIRECTION_SOUTH,
+ o->hang)
+ - (o->hang ? 0 : c->frame->area.height);
+ break;
+ case OB_DIRECTION_EAST:
+ x = client_directional_edge_search(c, OB_DIRECTION_EAST,
+ o->hang)
+ - (o->hang ? 0 : c->frame->area.width);
+ break;
+ default:
+ g_assert_not_reached();
+ }
+ frame_frame_gravity(c->frame, &x, &y);
+
+ actions_client_move(data, FALSE);
+ client_move(c, x, y);
+ actions_client_move(data, TRUE);
+ }
+
+ return FALSE;
+}