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
|
module c3term;
import std::io;
import libc;
typedef WL_display = void;
typedef WL_registry = void;
typedef WL_compositor = void;
extern fn WL_display* wl_display_connect(ZString);
extern fn WL_display* wl_display_disconnect(WL_display*);
extern fn CInt wl_display_roundtrip(WL_display*);
extern fn void* wl_registry_bind(WL_registry*, uint, WL_interface*, uint) @cname("_wl_registry_bind");
extern fn CInt wl_registry_add_listener(WL_registry*, WL_registry_listener*, void*) @cname("_wl_registry_add_listener");
extern fn WL_registry* wl_display_get_registry(WL_display*) @cname("_wl_display_get_registry");
alias RegistryListenerGlobalCallback = fn void (void*, WL_registry*, uint, ZString, uint);
alias RegistryListenerGlobalRemoveCallback = fn void (void*, WL_registry*, uint);
struct WL_registry_listener
{
RegistryListenerGlobalCallback global;
RegistryListenerGlobalRemoveCallback global_remove;
}
struct WL_message
{
ZString name;
ZString signature;
WL_interface** types;
}
struct WL_interface
{
ZString name;
int version;
int method_count;
WL_message* methods;
int event_count;
WL_message* events;
}
void* wl_client_lib;
WL_interface wl_compositor_interface;
fn void? init()
{
wl_client_lib = libc::dlopen("libwayland-client.so", libc::RTLD_LAZY);
wl_compositor_interface = *(WL_interface*)load_symbol("wl_compositor_interface")!;
}
struct State
{
WL_compositor* compositor;
}
fn void registry_handle_global(void* data, WL_registry* registry, uint name, ZString nterface, uint version)
{
io::printf("interface: %s\nversion: %d\nname: %d\n", nterface, version, name);
State* state = data;
if (nterface == wl_compositor_interface.name)
{
state.compositor = wl_registry_bind(registry, name, &wl_compositor_interface, 4);
}
}
fn void registry_handle_global_remove(void* data, WL_registry* registry, uint name)
{
}
fn int main(String[] args)
{
init()!!;
WL_display* display = wl_display_connect(null);
if (!display) {
io::printn("failed to connect display");
return(1);
};
WL_registry* registry = wl_display_get_registry(display);
if (!registry) {
io::printn("failed to get registry");
return(1);
}
WL_registry_listener registry_listener;
registry_listener.global = ®istry_handle_global;
registry_listener.global_remove = ®istry_handle_global_remove;
wl_registry_add_listener(registry, ®istry_listener, null);
wl_display_roundtrip(display);
wl_display_disconnect(display);
io::printn("disconnected");
return(0);
}
|