-
Notifications
You must be signed in to change notification settings - Fork 21
/
hsr-outputs.c
88 lines (73 loc) · 1.71 KB
/
hsr-outputs.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <X11/Xlib.h>
#include <X11/extensions/Xinerama.h>
void
print_text(XineramaScreenInfo *si) {
if (! si) {
printf("\n");
return;
}
printf("screen_number: %d\n", si->screen_number);
printf("\tx_org:\t%d\n", si->x_org);
printf("\ty_org:\t%d\n", si->y_org);
printf("\twidth:\t%d\n", si->width);
printf("\theight:\t%d\n", si->height);
}
void
print_csv(XineramaScreenInfo *si) {
if (! si)
return;
printf("%d,%d,%d,%d,%d\n", si->screen_number, si->x_org, si->y_org, si->width, si->height);
}
void
print_json(XineramaScreenInfo *si) {
if (! si) {
printf(",\n");
return;
}
printf(" {\n");
printf(" \"screen\": %d,\n", si->screen_number);
printf(" \"x\": %d,\n", si->x_org);
printf(" \"y\": %d,\n", si->y_org);
printf(" \"width\": %d,\n", si->width);
printf(" \"height\": %d\n", si->height);
printf(" }");
}
enum Format { TEXT, CSV, JSON };
int
main(int argc, char **argv)
{
Display *display = XOpenDisplay(NULL);
if (! display) {
fprintf(stderr, "Cannot open X display!\n");
exit(123);
}
enum Format format = TEXT;
void (*print)(XineramaScreenInfo*) = print_text;
if ((argc > 1) && !strcmp(argv[1], "--csv")) {
print = print_csv;
format = CSV;
}
if ((argc > 1) && !strcmp(argv[1], "--json")) {
print = print_json;
format = JSON;
}
if (format == CSV)
printf("screen_number,x_org,y_org,width,height\n");
if (format == JSON)
printf("[\n");
int nscreens = 0;
XineramaScreenInfo *xisi = XineramaQueryScreens(display, &nscreens);
for (int i = 0; i < nscreens; i++) {
if (i)
print(NULL);
print(xisi + i);
}
XFree(xisi);
if (format == JSON)
printf("\n]\n");
XCloseDisplay(display);
return 0;
}