X-Git-Url: https://git.sur5r.net/?p=i3%2Fi3;a=blobdiff_plain;f=src%2Ffake_outputs.c;h=39cbd7bbc6e98fead58a72f94074b45f2826a933;hp=acbc456d99bebe57d15f711d523ed7c43042b16f;hb=HEAD;hpb=b0990c183ae1e25aaddb2af40eeb11eff1a208af diff --git a/src/fake_outputs.c b/src/fake_outputs.c index acbc456d..39cbd7bb 100644 --- a/src/fake_outputs.c +++ b/src/fake_outputs.c @@ -1,10 +1,8 @@ -#undef I3__FILE__ -#define I3__FILE__ "fake_outputs.c" /* * vim:ts=4:sw=4:expandtab * * i3 - an improved dynamic tiling window manager - * © 2009-2012 Michael Stapelberg and contributors (see also: LICENSE) + * © 2009 Michael Stapelberg and contributors (see also: LICENSE) * * Faking outputs is useful in pathological situations (like network X servers * which don’t support multi-monitor in a useful way) and for our testsuite. @@ -21,8 +19,8 @@ static int num_screens; static Output *get_screen_at(unsigned int x, unsigned int y) { Output *output; TAILQ_FOREACH(output, &outputs, outputs) - if (output->rect.x == x && output->rect.y == y) - return output; + if (output->rect.x == x && output->rect.y == y) + return output; return NULL; } @@ -30,17 +28,27 @@ static Output *get_screen_at(unsigned int x, unsigned int y) { /* * Creates outputs according to the given specification. * The specification must be in the format wxh+x+y, for example 1024x768+0+0, + * optionally followed by 'P' to indicate a primary output, * with multiple outputs separated by commas: - * 1900x1200+0+0,1280x1024+1900+0 + * 1900x1200+0+0P,1280x1024+1900+0 * */ void fake_outputs_init(const char *output_spec) { - char useless_buffer[1024]; const char *walk = output_spec; unsigned int x, y, width, height; - while (sscanf(walk, "%ux%u+%u+%u", &width, &height, &x, &y) == 4) { - DLOG("Parsed output as width = %u, height = %u at (%u, %u)\n", - width, height, x, y); + int chars_consumed; + while (sscanf(walk, "%ux%u+%u+%u%n", &width, &height, &x, &y, &chars_consumed) == 4) { + walk += chars_consumed; + bool primary = false; + if (*walk == 'P') { + primary = true; + walk++; + } + if (*walk == ',') + walk++; /* Skip delimiter */ + DLOG("Parsed output as width = %u, height = %u at (%u, %u)%s\n", + width, height, x, y, primary ? " (primary)" : ""); + Output *new_output = get_screen_at(x, y); if (new_output != NULL) { DLOG("Re-used old output %p\n", new_output); @@ -49,9 +57,12 @@ void fake_outputs_init(const char *output_spec) { new_output->rect.width = min(new_output->rect.width, width); new_output->rect.height = min(new_output->rect.height, height); } else { - new_output = scalloc(sizeof(Output)); - sasprintf(&(new_output->name), "fake-%d", num_screens); - DLOG("Created new fake output %s (%p)\n", new_output->name, new_output); + struct output_name *output_name = scalloc(1, sizeof(struct output_name)); + new_output = scalloc(1, sizeof(Output)); + sasprintf(&(output_name->name), "fake-%d", num_screens); + SLIST_INIT(&(new_output->names_head)); + SLIST_INSERT_HEAD(&(new_output->names_head), output_name, names); + DLOG("Created new fake output %s (%p)\n", output_primary_name(new_output), new_output); new_output->active = true; new_output->rect.x = x; new_output->rect.y = y; @@ -60,14 +71,13 @@ void fake_outputs_init(const char *output_spec) { /* We always treat the screen at 0x0 as the primary screen */ if (new_output->rect.x == 0 && new_output->rect.y == 0) TAILQ_INSERT_HEAD(&outputs, new_output, outputs); - else TAILQ_INSERT_TAIL(&outputs, new_output, outputs); + else + TAILQ_INSERT_TAIL(&outputs, new_output, outputs); output_init_con(new_output); init_ws_for_output(new_output, output_get_content(new_output->con)); num_screens++; } - - /* Figure out how long the input was to skip it */ - walk += sprintf(useless_buffer, "%ux%u+%u+%u", width, height, x, y) + 1; + new_output->primary = primary; } if (num_screens == 0) {