diff options
| author | andromeda <andromeda@lenovo> | 2026-04-24 17:47:27 +0200 |
|---|---|---|
| committer | andromeda <andromeda@lenovo> | 2026-04-24 17:47:27 +0200 |
| commit | 3adf2a7b49a3a62b4c019b745a6c631a2b518b5e (patch) | |
| tree | 320e0c5fac59f1e4f168582ac39215cebd6283de /main.c3 | |
| parent | 3b3cfa6c91f66440a64fdfb26559972a6ab600e4 (diff) | |
attempt wayland :~
Diffstat (limited to 'main.c3')
| -rw-r--r-- | main.c3 | 102 |
1 files changed, 91 insertions, 11 deletions
@@ -1,18 +1,98 @@ module c3term; -import raylib; import std::io; +import libc; -fn int main(String[] args) +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 { - raylib::init_window(800, 450, "test window"); - raylib::set_target_fps(60); - while (!raylib::window_should_close()) + 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) { - raylib::begin_drawing(); - raylib::clear_background(raylib::RAYWHITE); - raylib::draw_text("first window", 190, 200, 20, raylib::LIGHTRAY); - raylib::end_drawing(); + state.compositor = wl_registry_bind(registry, name, &wl_compositor_interface, 4); } - raylib::close_window(); - return 0; +} + +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); } |
