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
89
90
91
92
93
94
95
96
97
98
99
100
101
102
|
#include "util.h"
#include "wayland.hpp"
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <map>
#include <memory>
#include <string>
#include <vector>
#include <sys/poll.h>
struct conn {
std::vector<std::unique_ptr<wl::output>> outputs;
std::unique_ptr<genivi::controller> c;
};
namespace {
int check_events(struct wl::display *d, struct conn *c, int fd) {
struct pollfd pfd[2] = {{.fd = d->get_fd(), .events = POLLIN, .revents = 0},
{.fd = fd, .events = POLLIN, .revents = 0}};
d->flush();
if (poll(pfd, fd != -1 ? 2 : 1, -1) != -1 && errno != EINTR) {
int ret = 0;
if (pfd[0].revents & POLLIN) {
ret = d->dispatch();
}
if (ret == -1)
return ret;
if (fd != -1 && (pfd[1].revents & POLLIN)) {
char buf[256];
// read all there is ...
while (read(pfd[1].fd, buf, sizeof(buf)) == sizeof(buf))
;
// Display current status
if (!c->c->surfaces.empty()) {
puts("Surfaces:");
for (auto const &i : c->c->surfaces) {
struct genivi::rect const &r = i.second->dst_rect;
struct genivi::size const &s = i.second->size;
printf("%d [%ux%u] (%ux%u@%dx%d), ", i.first, s.w, s.h, r.w, r.h,
r.x, r.y);
}
puts("\b\b ");
}
}
}
return 0;
}
}
int main(int argc, char **argv) {
lognotice("WinMan ver. %s", WINMAN_VERSION_STRING);
if (!getenv("XDG_RUNTIME_DIR"))
fatal("Environment variable XDG_RUNTIME_DIR not set");
auto d = std::make_unique<wl::display>();
if (!d->ok())
fatal("Could not connect to compositor");
struct conn c = {};
d->r->add_global_handler(
"ivi_controller", [&](wl_registry *r, uint32_t name, uint32_t v) {
c.c = std::make_unique<genivi::controller>(r, name, v);
});
d->r->add_global_handler(
"wl_output", [&](wl_registry *r, uint32_t name, uint32_t v) {
c.outputs.emplace_back(std::make_unique<wl::output>(r, name, v));
});
// First level objects
d->roundtrip();
// Second level objects
d->roundtrip();
// Third level objects
d->roundtrip();
if (!c.c)
fatal("ivi_controller global not available");
while (check_events(d.get(), &c, STDIN_FILENO) != -1) {
c.c->execute_pending();
}
d->roundtrip();
return 0;
}
|