summaryrefslogtreecommitdiff
path: root/lib/CWayland/CWayland.cc
diff options
context:
space:
mode:
Diffstat (limited to 'lib/CWayland/CWayland.cc')
-rw-r--r--lib/CWayland/CWayland.cc60
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