i3
Main Page
Data Structures
Files
File List
Globals
src
fake_outputs.c
Go to the documentation of this file.
1
/*
2
* vim:ts=4:sw=4:expandtab
3
*
4
* i3 - an improved dynamic tiling window manager
5
* © 2009-2012 Michael Stapelberg and contributors (see also: LICENSE)
6
*
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.
9
*
10
*/
11
#include "
all.h
"
12
13
static
int
num_screens
;
14
15
/*
16
* Looks in outputs for the Output whose start coordinates are x, y
17
*
18
*/
19
static
Output
*
get_screen_at
(
int
x
,
int
y
) {
20
Output
*output;
21
TAILQ_FOREACH
(output, &
outputs
,
outputs
)
22
if
(output->
rect
.
x
== x && output->
rect
.
y
== y)
23
return
output;
24
25
return
NULL;
26
}
27
28
/*
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
33
*
34
*/
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"
,
41
width, height, x, y);
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);
49
}
else
{
50
new_output =
scalloc
(
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
);
61
else
TAILQ_INSERT_TAIL
(&
outputs
, new_output,
outputs
);
62
output_init_con
(new_output);
63
init_ws_for_output
(new_output,
output_get_content
(new_output->
con
));
64
num_screens
++;
65
}
66
67
/* Figure out how long the input was to skip it */
68
walk += sprintf(useless_buffer,
"%ux%u+%u+%u"
, width, height, x, y) + 1;
69
}
70
71
if
(
num_screens
== 0) {
72
ELOG
(
"No screens found. Please fix your setup. i3 will exit now.\n"
);
73
exit(0);
74
}
75
}
Generated by
1.8.1.1