X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=openbox%2Faction.c;h=9350c3ce6bc6c0cd9db6300dc7f54c8d06479fd3;hb=d3d4aa29871111737a4f6985da695c8688a05270;hp=fa41e788670af3f2608854408ec9679393ca6e04;hpb=916e24d9c4e86f878e677512d82647d6038a2dbe;p=chaz%2Fopenbox diff --git a/openbox/action.c b/openbox/action.c index fa41e788..9350c3ce 100644 --- a/openbox/action.c +++ b/openbox/action.c @@ -1,6 +1,7 @@ /* -*- indent-tabs-mode: nil; tab-width: 4; c-basic-offset: 4; -*- action.c for the Openbox window manager + Copyright (c) 2006 Mikael Magnusson Copyright (c) 2003 Ben Jansens This program is free software; you can redistribute it and/or modify @@ -29,6 +30,7 @@ #include "grab.h" #include "keyboard.h" #include "event.h" +#include "dock.h" #include "config.h" #include "mainloop.h" @@ -301,28 +303,60 @@ void setup_action_cycle_windows_previous(ObAction **a, ObUserAction uact) (*a)->data.cycle.dialog = TRUE; } +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) @@ -556,6 +590,16 @@ ActionString actionstrings[] = 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, @@ -771,6 +815,26 @@ ActionString actionstrings[] = 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, @@ -872,7 +936,21 @@ ObAction *action_parse(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node, act->func == action_resize_relative_horz || act->func == action_resize_relative_vert) { if ((n = parse_find_node("delta", node->xmlChildrenNode))) - act->data.relative.delta = parse_int(doc, n); + act->data.relative.deltax = parse_int(doc, n); + } else if (act->func == action_move_relative) { + if ((n = parse_find_node("x", node->xmlChildrenNode))) + act->data.relative.deltax = parse_int(doc, n); + if ((n = parse_find_node("y", node->xmlChildrenNode))) + act->data.relative.deltay = parse_int(doc, n); + } else if (act->func == action_resize_relative) { + if ((n = parse_find_node("left", node->xmlChildrenNode))) + act->data.relative.deltaxl = parse_int(doc, n); + if ((n = parse_find_node("up", node->xmlChildrenNode))) + act->data.relative.deltayu = parse_int(doc, n); + if ((n = parse_find_node("right", node->xmlChildrenNode))) + act->data.relative.deltax = parse_int(doc, n); + if ((n = parse_find_node("down", node->xmlChildrenNode))) + act->data.relative.deltay = parse_int(doc, n); } else if (act->func == action_desktop) { if ((n = parse_find_node("desktop", node->xmlChildrenNode))) act->data.desktop.desk = parse_int(doc, n); @@ -1047,7 +1125,8 @@ void action_focus(union ActionData *data) void action_unfocus (union ActionData *data) { - client_unfocus(data->client.any.c); + if (data->client.any.c == focus_client) + focus_fallback(OB_FOCUS_FALLBACK_UNFOCUSING); } void action_iconify(union ActionData *data) @@ -1069,17 +1148,19 @@ void action_raiselower(union ActionData *data) gboolean raise = FALSE; for (it = stacking_list; it; it = g_list_next(it)) { - ObClient *cit = it->data; - - if (cit == c) break; - if (client_normal(cit) == client_normal(c) && - cit->layer == c->layer && - cit->frame->visible && - !client_search_transient(c, cit)) - { - if (RECT_INTERSECTS_RECT(cit->frame->area, c->frame->area)) { - raise = TRUE; - break; + if (WINDOW_IS_CLIENT(it->data)) { + ObClient *cit = it->data; + + if (cit == c) break; + if (client_normal(cit) == client_normal(c) && + cit->layer == c->layer && + cit->frame->visible && + !client_search_transient(c, cit)) + { + if (RECT_INTERSECTS_RECT(cit->frame->area, c->frame->area)) { + raise = TRUE; + break; + } } } } @@ -1162,7 +1243,7 @@ void action_move_relative_horz(union ActionData *data) { ObClient *c = data->relative.any.c; client_action_start(data); - client_move(c, c->area.x + data->relative.delta, c->area.y); + client_move(c, c->area.x + data->relative.deltax, c->area.y); client_action_end(data); } @@ -1170,7 +1251,7 @@ void action_move_relative_vert(union ActionData *data) { ObClient *c = data->relative.any.c; client_action_start(data); - client_move(c, c->area.x, c->area.y + data->relative.delta); + client_move(c, c->area.x, c->area.y + data->relative.deltax); client_action_end(data); } @@ -1190,7 +1271,7 @@ void action_resize_relative_horz(union ActionData *data) ObClient *c = data->relative.any.c; client_action_start(data); client_resize(c, - c->area.width + data->relative.delta * c->size_inc.width, + c->area.width + data->relative.deltax * c->size_inc.width, c->area.height); client_action_end(data); } @@ -1201,11 +1282,34 @@ void action_resize_relative_vert(union ActionData *data) if (!c->shaded) { client_action_start(data); client_resize(c, c->area.width, c->area.height + - data->relative.delta * c->size_inc.height); + data->relative.deltax * c->size_inc.height); client_action_end(data); } } +void action_move_relative(union ActionData *data) +{ + ObClient *c = data->relative.any.c; + client_action_start(data); + client_move(c, c->area.x + data->relative.deltax, c->area.y + + data->relative.deltay); + client_action_end(data); +} + +void action_resize_relative(union ActionData *data) +{ + ObClient *c = data->relative.any.c; + client_action_start(data); + client_move_resize(c, + c->area.x - data->relative.deltaxl * c->size_inc.width, + c->area.y - data->relative.deltayu * c->size_inc.height, + c->area.width + data->relative.deltax * c->size_inc.width + + data->relative.deltaxl * c->size_inc.width, + c->area.height + data->relative.deltay * c->size_inc.height + + data->relative.deltayu * c->size_inc.height); + client_action_end(data); +} + void action_maximize_full(union ActionData *data) { client_action_start(data); @@ -1502,18 +1606,24 @@ void action_movetoedge(union ActionData *data) switch(data->diraction.direction) { case OB_DIRECTION_NORTH: - y = client_directional_edge_search(c, 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); + 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) - - c->frame->area.height; + 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) - - c->frame->area.width; + 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(); @@ -1542,7 +1652,7 @@ void action_growtoedge(union ActionData *data) switch(data->diraction.direction) { case OB_DIRECTION_NORTH: - dest = client_directional_edge_search(c, OB_DIRECTION_NORTH); + dest = client_directional_edge_search(c, OB_DIRECTION_NORTH, FALSE); if (a->y == y) height = c->frame->area.height / 2; else { @@ -1551,7 +1661,7 @@ void action_growtoedge(union ActionData *data) } break; case OB_DIRECTION_WEST: - dest = client_directional_edge_search(c, OB_DIRECTION_WEST); + dest = client_directional_edge_search(c, OB_DIRECTION_WEST, FALSE); if (a->x == x) width = c->frame->area.width / 2; else { @@ -1560,7 +1670,7 @@ void action_growtoedge(union ActionData *data) } break; case OB_DIRECTION_SOUTH: - dest = client_directional_edge_search(c, OB_DIRECTION_SOUTH); + dest = client_directional_edge_search(c, OB_DIRECTION_SOUTH, FALSE); if (a->y + a->height == y + c->frame->area.height) { height = c->frame->area.height / 2; y = a->y + a->height - height; @@ -1570,7 +1680,7 @@ void action_growtoedge(union ActionData *data) height -= (height - c->frame->area.height) % c->size_inc.height; break; case OB_DIRECTION_EAST: - dest = client_directional_edge_search(c, OB_DIRECTION_EAST); + dest = client_directional_edge_search(c, OB_DIRECTION_EAST, FALSE); if (a->x + a->width == x + c->frame->area.width) { width = c->frame->area.width / 2; x = a->x + a->width - width;