add moveto/fromedge actions

This commit is contained in:
Dana Jansens 2007-06-23 15:08:08 +00:00
parent 7f50e04925
commit c15da849dd
5 changed files with 128 additions and 173 deletions

View file

@ -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 \

View file

@ -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;
@ -157,71 +101,6 @@ ActionString actionstrings[] =
action_unshaderaise,
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,
@ -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);
}

View file

@ -38,4 +38,5 @@ void action_all_startup()
action_addremovedesktop_startup();
action_dockautohide_startup();
action_layer_startup();
action_movetofromedge_startup();
}

View file

@ -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

View file

@ -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;
}