add moveto/fromedge actions
This commit is contained in:
parent
7f50e04925
commit
c15da849dd
5 changed files with 128 additions and 173 deletions
|
@ -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 \
|
||||
|
|
173
openbox/action.c
173
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;
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -38,4 +38,5 @@ void action_all_startup()
|
|||
action_addremovedesktop_startup();
|
||||
action_dockautohide_startup();
|
||||
action_layer_startup();
|
||||
action_movetofromedge_startup();
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
125
openbox/actions/movetofromedge.c
Normal file
125
openbox/actions/movetofromedge.c
Normal 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;
|
||||
}
|
Loading…
Reference in a new issue