diff options
| author | Hannes Schulze <haschu0103@outlook.de> | 2026-03-03 16:43:56 +0100 |
|---|---|---|
| committer | Hannes Schulze <haschu0103@outlook.de> | 2026-03-03 16:43:56 +0100 |
| commit | ac696809b0c62f7f062a0dc155a4bf4a995cc9cf (patch) | |
| tree | f66179841980d791a935e108c86a4cecf55144e3 /lib/CWayland/CWayland.cc | |
| parent | 651c32bad4f336eee9cf423eec5f7b1057a58adf (diff) | |
display connect/disconnect
Diffstat (limited to 'lib/CWayland/CWayland.cc')
| -rw-r--r-- | lib/CWayland/CWayland.cc | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/lib/CWayland/CWayland.cc b/lib/CWayland/CWayland.cc new file mode 100644 index 0000000..5877ad4 --- /dev/null +++ b/lib/CWayland/CWayland.cc @@ -0,0 +1,60 @@ +#include "CWayland.h" +#include <wayland-client.h> + +static void noop_foreach(void *ptr, b_lean_obj_arg fn) +{ +} + +static void waylean_display_finalize(void* ptr) +{ + wl_display* disp = static_cast<wl_display*>(ptr); + wl_display_disconnect(disp); +} + +static lean_external_class* waylean_display_class() +{ + static lean_external_class* klass = lean_register_external_class(&waylean_display_finalize, &noop_foreach); + return klass; +} + +static char const* option_cstr_or_null(b_lean_obj_arg str) +{ + if (lean_is_scalar(str)) + { + return nullptr; + } + else + { + lean_object* val = lean_ctor_get(str, 0); + return lean_string_cstr(val); + } +} + +static lean_obj_res io_result_mk_from_errno(char const* file_name) +{ + int err = errno; + lean_object* file_name_str = lean_mk_string(file_name); + lean_object* error = lean_decode_io_error(err, file_name_str); + lean_dec(file_name_str); + + return lean_io_result_mk_error(error); +} + +// Display.new : (name : @& Option String) → IO Display +lean_obj_res waylean_display_new(b_lean_obj_arg name) +{ + char const* name_cstr = option_cstr_or_null(name); + wl_display* disp = wl_display_connect(name_cstr); + if (!disp) { return io_result_mk_from_errno(name_cstr ? name_cstr : "<default>"); } + + lean_object* waylean_disp = lean_alloc_external(waylean_display_class(), disp); + return lean_io_result_mk_ok(waylean_disp); +} + +// Display.getVersion : (display : @& Display) → IO UInt32 +lean_obj_res waylean_display_get_version(b_lean_obj_arg display) +{ + wl_display* disp = static_cast<wl_display*>(lean_get_external_data(display)); + lean_object* version = lean_box_uint32(wl_display_get_version(disp)); + return lean_io_result_mk_ok(version); +}
\ No newline at end of file |
