2 * vim:ts=4:sw=4:expandtab
4 * i3 - an improved dynamic tiling window manager
5 * © 2009 Michael Stapelberg and contributors (see also: LICENSE)
7 * Faking outputs is useful in pathological situations (like network X servers
8 * which don’t support multi-monitor in a useful way) and for our testsuite.
13 static int num_screens;
16 * Looks in outputs for the Output whose start coordinates are x, y
19 static Output *get_screen_at(unsigned int x, unsigned int y) {
21 TAILQ_FOREACH(output, &outputs, outputs)
22 if (output->rect.x == x && output->rect.y == y)
29 * Creates outputs according to the given specification.
30 * The specification must be in the format wxh+x+y, for example 1024x768+0+0,
31 * with multiple outputs separated by commas:
32 * 1900x1200+0+0,1280x1024+1900+0
35 void fake_outputs_init(const char *output_spec) {
36 char useless_buffer[1024];
37 const char *walk = output_spec;
38 unsigned int x, y, width, height;
39 while (sscanf(walk, "%ux%u+%u+%u", &width, &height, &x, &y) == 4) {
40 DLOG("Parsed output as width = %u, height = %u at (%u, %u)\n",
42 Output *new_output = get_screen_at(x, y);
43 if (new_output != NULL) {
44 DLOG("Re-used old output %p\n", new_output);
45 /* This screen already exists. We use the littlest screen so that the user
46 can always see the complete workspace */
47 new_output->rect.width = min(new_output->rect.width, width);
48 new_output->rect.height = min(new_output->rect.height, height);
50 new_output = scalloc(1, sizeof(Output));
51 sasprintf(&(new_output->name), "fake-%d", num_screens);
52 DLOG("Created new fake output %s (%p)\n", new_output->name, new_output);
53 new_output->active = true;
54 new_output->rect.x = x;
55 new_output->rect.y = y;
56 new_output->rect.width = width;
57 new_output->rect.height = height;
58 /* We always treat the screen at 0x0 as the primary screen */
59 if (new_output->rect.x == 0 && new_output->rect.y == 0)
60 TAILQ_INSERT_HEAD(&outputs, new_output, outputs);
62 TAILQ_INSERT_TAIL(&outputs, new_output, outputs);
63 output_init_con(new_output);
64 init_ws_for_output(new_output, output_get_content(new_output->con));
68 /* Figure out how long the input was to skip it */
69 walk += sprintf(useless_buffer, "%ux%u+%u+%u", width, height, x, y) + 1;
72 if (num_screens == 0) {
73 ELOG("No screens found. Please fix your setup. i3 will exit now.\n");