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); }