X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=openbox%2Faction.c;h=249dec07dcef7f8f458d92a45b84b2002316c5d8;hb=03f861b0ac70450359656ad16c754e9e394d6c49;hp=80b0a8f11ce20a4511a640ef0ae23e6b18374cd0;hpb=26879183e96f5a0d981e6ae76fda82a0d4564b20;p=chaz%2Fopenbox diff --git a/openbox/action.c b/openbox/action.c index 80b0a8f1..249dec07 100644 --- a/openbox/action.c +++ b/openbox/action.c @@ -505,7 +505,7 @@ ActionString actionstrings[] = { "activate", action_activate, - setup_client_action + setup_action_focus }, { "focus", @@ -1098,6 +1098,17 @@ void action_run_list(GSList *acts, ObClient *c, ObFrameContext context, if (a->data.any.interactive || a->func == action_moveresize) { /* interactive actions are not queued */ a->func(&a->data); + } else if (context == OB_FRAME_CONTEXT_CLIENT || + (c && c->type == OB_CLIENT_TYPE_DESKTOP && + context == OB_FRAME_CONTEXT_DESKTOP)) { + /* XXX MORE UGLY HACK + actions from clicks on client windows are NOT queued. + this solves the mysterious click-and-drag-doesnt-work + problem. it was because the window gets focused and stuff + after the button event has already been passed through. i + dont really know why it should care but it does and it makes + a difference. */ + a->func(&a->data); } else ob_main_loop_queue_action(ob_main_loop, a); } @@ -1172,15 +1183,22 @@ void action_execute(union ActionData *data) void action_activate(union ActionData *data) { - /* similar to the openbox dock for dockapps, don't let user actions give - focus to 3rd-party docks (panels) either (unless they ask for it - themselves). */ - if (data->client.any.c->type != OB_CLIENT_TYPE_DOCK) { - /* if using focus_delay, stop the timer now so that focus doesn't go - moving on us */ - event_halt_focus_delay(); + if (data->client.any.c) { + /* similar to the openbox dock for dockapps, don't let user actions + give focus to 3rd-party docks (panels) either (unless they ask for + it themselves). */ + if (data->client.any.c->type != OB_CLIENT_TYPE_DOCK) { + /* if using focus_delay, stop the timer now so that focus doesn't + go moving on us */ + event_halt_focus_delay(); - client_activate(data->activate.any.c, data->activate.here, TRUE); + client_activate(data->activate.any.c, data->activate.here, TRUE); + } + } else { + /* focus action on something other than a client, make keybindings + work for this openbox instance, but don't focus any specific client + */ + focus_nothing(); } } @@ -1394,7 +1412,7 @@ void action_resize_relative(union ActionData *data) h = oh + data->relative.deltay * c->size_inc.height + data->relative.deltayu * c->size_inc.height; - client_try_configure(c, OB_CORNER_TOPLEFT, &x, &y, &w, &h, &lw, &lh, TRUE); + client_try_configure(c, &x, &y, &w, &h, &lw, &lh, TRUE); client_move_resize(c, x + (ow - w), y + (oh - h), w, h); client_action_end(data); } @@ -1795,7 +1813,7 @@ void action_movetoedge(union ActionData *data) default: g_assert_not_reached(); } - frame_frame_gravity(c->frame, &x, &y); + 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); @@ -1807,36 +1825,37 @@ void action_growtoedge(union ActionData *data) ObClient *c = data->diraction.any.c; Rect *a; - //FIXME growtoedge resizes shaded windows to 0 height - if (c->shaded) - return; - a = screen_area(c->desktop); x = c->frame->area.x; y = c->frame->area.y; - width = c->frame->area.width; - height = c->frame->area.height; + /* get the unshaded frame's dimensions..if it is shaded */ + width = c->area.width + c->frame->size.left + c->frame->size.right; + height = c->area.height + c->frame->size.top + c->frame->size.bottom; switch(data->diraction.direction) { case OB_DIRECTION_NORTH: + if (c->shaded) break; /* don't allow vertical resize if shaded */ + dest = client_directional_edge_search(c, OB_DIRECTION_NORTH, FALSE); if (a->y == y) - height = c->frame->area.height / 2; + height = height / 2; else { - height = c->frame->area.y + c->frame->area.height - dest; + height = c->frame->area.y + height - dest; y = dest; } break; case OB_DIRECTION_WEST: dest = client_directional_edge_search(c, OB_DIRECTION_WEST, FALSE); if (a->x == x) - width = c->frame->area.width / 2; + width = width / 2; else { - width = c->frame->area.x + c->frame->area.width - dest; + width = c->frame->area.x + width - dest; x = dest; } break; case OB_DIRECTION_SOUTH: + if (c->shaded) break; /* don't allow vertical resize if shaded */ + 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; @@ -1859,9 +1878,9 @@ void action_growtoedge(union ActionData *data) default: g_assert_not_reached(); } - frame_frame_gravity(c->frame, &x, &y); width -= c->frame->size.left + c->frame->size.right; height -= c->frame->size.top + c->frame->size.bottom; + frame_frame_gravity(c->frame, &x, &y, width, height); client_action_start(data); client_move_resize(c, x, y, width, height); client_action_end(data);