#include "CWayland.h" #include static void noop_foreach(void *ptr, b_lean_obj_arg fn) { } static void waylean_display_finalize(void* ptr) { wl_display* disp = static_cast(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 : ""); } 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(lean_get_external_data(display)); lean_object* version = lean_box_uint32(wl_display_get_version(disp)); return lean_io_result_mk_ok(version); }