summaryrefslogtreecommitdiff
path: root/lib/CWayland/CWayland.cc
blob: 5877ad4f3fed063c139143140b456dc18d4bec90 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
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);
}