summaryrefslogtreecommitdiff
path: root/main.c3
diff options
context:
space:
mode:
authorandromeda <andromeda@lenovo>2026-04-24 17:47:27 +0200
committerandromeda <andromeda@lenovo>2026-04-24 17:47:27 +0200
commit3adf2a7b49a3a62b4c019b745a6c631a2b518b5e (patch)
tree320e0c5fac59f1e4f168582ac39215cebd6283de /main.c3
parent3b3cfa6c91f66440a64fdfb26559972a6ab600e4 (diff)
attempt wayland :~
Diffstat (limited to 'main.c3')
-rw-r--r--main.c3102
1 files changed, 91 insertions, 11 deletions
diff --git a/main.c3 b/main.c3
index 306d5c4..742616e 100644
--- a/main.c3
+++ b/main.c3
@@ -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 = &registry_handle_global;
+ registry_listener.global_remove = &registry_handle_global_remove;
+
+ wl_registry_add_listener(registry, &registry_listener, null);
+
+ wl_display_roundtrip(display);
+
+ wl_display_disconnect(display);
+ io::printn("disconnected");
+ return(0);
}