X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=src%2Frandr.c;h=161c8886cf8685371a90f905aac150a2c91b2f6b;hb=fc27c19761b47fa449514395f7ea2a21654f515d;hp=dd30925b9301c654132105bda8a23f325e452203;hpb=717ae819c55d2aca9f4bf2e1198e035ca64114ac;p=i3%2Fi3 diff --git a/src/randr.c b/src/randr.c index dd30925b..161c8886 100644 --- a/src/randr.c +++ b/src/randr.c @@ -2,26 +2,21 @@ * vim:ts=4:sw=4:expandtab * * i3 - an improved dynamic tiling window manager - * - * © 2009-2011 Michael Stapelberg and contributors - * - * See file LICENSE for license information. + * © 2009-2011 Michael Stapelberg and contributors (see also: LICENSE) * * For more information on RandR, please see the X.org RandR specification at * http://cgit.freedesktop.org/xorg/proto/randrproto/tree/randrproto.txt * (take your time to read it completely, it answers all questions). * */ -#include +#include "all.h" +#include #include -#include "all.h" - /* While a clean namespace is usually a pretty good thing, we really need * to use shorter names than the whole xcb_randr_* default names. */ typedef xcb_randr_get_crtc_info_reply_t crtc_info; -typedef xcb_randr_mode_info_t mode_info; typedef xcb_randr_get_screen_resources_current_reply_t resources_reply; /* Pointer to the result of the query for primary output */ @@ -248,7 +243,7 @@ void output_init_con(Output *output) { output->con = con; char *name; - asprintf(&name, "[i3 con] output %s", con->name); + sasprintf(&name, "[i3 con] output %s", con->name); x_set_name(con, name); FREE(name); @@ -272,7 +267,7 @@ void output_init_con(Output *output) { FREE(topdock->name); topdock->name = sstrdup("topdock"); - asprintf(&name, "[i3 con] top dockarea %s", con->name); + sasprintf(&name, "[i3 con] top dockarea %s", con->name); x_set_name(topdock, name); FREE(name); DLOG("attaching\n"); @@ -286,7 +281,7 @@ void output_init_con(Output *output) { FREE(content->name); content->name = sstrdup("content"); - asprintf(&name, "[i3 con] content %s", con->name); + sasprintf(&name, "[i3 con] content %s", con->name); x_set_name(content, name); FREE(name); con_attach(content, con, false); @@ -306,7 +301,7 @@ void output_init_con(Output *output) { FREE(bottomdock->name); bottomdock->name = sstrdup("bottomdock"); - asprintf(&name, "[i3 con] bottom dockarea %s", con->name); + sasprintf(&name, "[i3 con] bottom dockarea %s", con->name); x_set_name(bottomdock, name); FREE(name); DLOG("attaching\n"); @@ -363,7 +358,7 @@ void init_ws_for_output(Output *output, Con *content) { if (visible && (previous = TAILQ_NEXT(workspace, focused))) { LOG("Switching to previously used workspace \"%s\" on output \"%s\"\n", previous->name, workspace_out->name); - workspace_show(previous->name); + workspace_show(previous); } con_detach(workspace); @@ -390,7 +385,7 @@ void init_ws_for_output(Output *output, Con *content) { if (!visible) { visible = TAILQ_FIRST(&(content->nodes_head)); focused = content; - workspace_show(visible->name); + workspace_show(visible); } return; } @@ -403,7 +398,7 @@ void init_ws_for_output(Output *output, Con *content) { LOG("Initializing first assigned workspace \"%s\" for output \"%s\"\n", assignment->name, assignment->output); focused = content; - workspace_show(assignment->name); + workspace_show_by_name(assignment->name); return; } @@ -425,11 +420,16 @@ void init_ws_for_output(Output *output, Con *content) { continue; DLOG("relevant command = %s\n", bind->command); char *target = bind->command + strlen("workspace "); - /* We check if this is the workspace next/prev command. Beware: The - * workspace names "next" and "prev" are OK, so we check before + /* We check if this is the workspace + * next/prev/next_on_output/prev_on_output/back_and_forth command. + * Beware: The workspace names "next", "prev", "next_on_output", + * "prev_on_output" and "back_and_forth" are OK, so we check before * stripping the double quotes */ if (strncasecmp(target, "next", strlen("next")) == 0 || - strncasecmp(target, "prev", strlen("prev")) == 0) + strncasecmp(target, "prev", strlen("prev")) == 0 || + strncasecmp(target, "next_on_output", strlen("next_on_output")) == 0 || + strncasecmp(target, "prev_on_output", strlen("prev_on_output")) == 0 || + strncasecmp(target, "back_and_forth", strlen("back_and_forth")) == 0) continue; if (*target == '"') target++; @@ -469,7 +469,7 @@ void init_ws_for_output(Output *output, Con *content) { c++; FREE(ws->name); - asprintf(&(ws->name), "%d", c); + sasprintf(&(ws->name), "%d", c); current = NULL; TAILQ_FOREACH(out, &(croot->nodes_head), nodes) @@ -482,7 +482,7 @@ void init_ws_for_output(Output *output, Con *content) { } con_attach(ws, content, false); - asprintf(&name, "[i3 con] workspace %s", ws->name); + sasprintf(&name, "[i3 con] workspace %s", ws->name); x_set_name(ws, name); free(name); @@ -567,7 +567,7 @@ static void handle_output(xcb_connection_t *conn, xcb_randr_output_t id, new->id = id; new->primary = (primary && primary->output == id); FREE(new->name); - asprintf(&new->name, "%.*s", + sasprintf(&new->name, "%.*s", xcb_randr_get_output_info_name_length(output), xcb_randr_get_output_info_name(output)); @@ -748,7 +748,7 @@ void randr_query_outputs() { Con *next = NULL; if (TAILQ_FIRST(&(croot->focus_head)) == output->con) { DLOG("This output (%p) was focused! Getting next\n", output->con); - next = con_next_focused(output->con); + next = focused; DLOG("next = %p\n", next); } @@ -768,6 +768,7 @@ void randr_query_outputs() { if (next) { DLOG("now focusing next = %p\n", next); con_focus(next); + workspace_show(con_get_workspace(next)); } /* 3: move the dock clients to the first output */ @@ -791,7 +792,7 @@ void randr_query_outputs() { } DLOG("destroying disappearing con %p\n", output->con); - tree_close(output->con, DONT_KILL_WINDOW, true); + tree_close(output->con, DONT_KILL_WINDOW, true, false); DLOG("Done. Should be fine now\n"); output->con = NULL; } @@ -811,8 +812,6 @@ void randr_query_outputs() { disable_randr(conn); } - ewmh_update_workarea(); - /* Just go through each active output and assign one workspace */ TAILQ_FOREACH(output, &outputs, outputs) { if (!output->active) @@ -849,9 +848,10 @@ void randr_init(int *event_base) { const xcb_query_extension_reply_t *extreply; extreply = xcb_get_extension_data(conn, &xcb_randr_id); - if (!extreply->present) + if (!extreply->present) { disable_randr(conn); - else randr_query_outputs(); + return; + } else randr_query_outputs(); if (event_base != NULL) *event_base = extreply->first_event;