diff options
Diffstat (limited to 'lib/CWayland')
| -rw-r--r-- | lib/CWayland/CWayland.cc | 31 | ||||
| -rw-r--r-- | lib/CWayland/CWayland.h | 11 |
2 files changed, 23 insertions, 19 deletions
diff --git a/lib/CWayland/CWayland.cc b/lib/CWayland/CWayland.cc index cc9a9de..5f9b052 100644 --- a/lib/CWayland/CWayland.cc +++ b/lib/CWayland/CWayland.cc @@ -697,7 +697,8 @@ namespace struct interface { wl_interface desc; - bool initialized; + bool is_initialized; + bool is_complete; }; class type_map @@ -706,10 +707,10 @@ namespace std::unordered_map<std::string_view, interface*> interfaces; public: - bool contains_iface(std::string_view iface_name) + bool is_complete(std::string_view iface_name) { auto it = interfaces.find(iface_name); - return it != interfaces.end() && it->second->initialized; + return it != interfaces.end() && it->second->is_complete; } interface* resolve_iface(std::string_view iface_name) @@ -721,13 +722,14 @@ namespace interface* iface = a.alloc_uninitialized<interface>(); iface->desc = wl_interface{ 0 }; iface->desc.name = name; - iface->initialized = false; + iface->is_initialized = false; + iface->is_complete= false; interfaces[name] = iface; return iface; } - void register_iface(b_lean_obj_arg iface_desc) + void register_iface(b_lean_obj_arg iface_desc, bool set_complete) { // structure Interface where // name : String @@ -738,8 +740,9 @@ namespace lean_object* iface_name = lean_ctor_get(iface_desc, 0); interface* iface = resolve_iface(lean_string_cstr(iface_name)); - if (iface->initialized) { return; } - iface->initialized = true; + if (set_complete) { iface->is_complete = true; } + if (iface->is_initialized) { return; } + iface->is_initialized = true; wl_interface* desc = &iface->desc; lean_object* iface_requests = lean_ctor_get(iface_desc, 1); @@ -817,19 +820,19 @@ lean_obj_res waylean_type_map_new(void) return lean_io_result_mk_ok(waylean_map); } -// TypeMap.contains : (typeMap : @& TypeMap) → (ifaceName : @& String) → IO Bool -lean_obj_res waylean_type_map_contains(b_lean_obj_arg map_obj, b_lean_obj_arg iface_name) +// TypeMap.isComplete : (typeMap : @& TypeMap) → (ifaceName : @& String) → IO Bool +lean_obj_res waylean_type_map_is_complete(b_lean_obj_arg map_obj, b_lean_obj_arg iface_name) { auto map = static_cast<type_map*>(lean_get_external_data(map_obj)); - auto res = map->contains_iface(lean_string_cstr(iface_name)); + auto res = map->is_complete(lean_string_cstr(iface_name)); return lean_io_result_mk_ok(lean_box(res ? 1 : 0)); } -// TypeMap.register : (typeMap : @& TypeMap) → (ifaceDesc : @& Interface) → IO Unit -lean_obj_res waylean_type_map_register(b_lean_obj_arg map_obj, b_lean_obj_arg iface_desc) +// TypeMap.register : (typeMap : @& TypeMap) → (ifaceDesc : @& Interface) → (setComplete : UInt32) → IO Unit +lean_obj_res waylean_type_map_register(b_lean_obj_arg map_obj, b_lean_obj_arg iface_desc, uint32_t set_complete) { auto map = static_cast<type_map*>(lean_get_external_data(map_obj)); - map->register_iface(iface_desc); + map->register_iface(iface_desc, set_complete); return lean_io_result_mk_ok(lean_box(0)); } @@ -1250,7 +1253,7 @@ lean_obj_res waylean_proxy_send_constructor(b_lean_obj_arg proxy_obj, uint32_t o auto buffer = static_cast<argument_buffer*>(lean_get_external_data(buffer_obj)); auto map = static_cast<type_map*>(lean_get_external_data(map_obj)); auto iface = map->resolve_iface(lean_string_cstr(iface_name)); - assert(iface->initialized && "expected interface to be initialized during construction"); + assert(iface->is_complete && "expected interface to be initialized during construction"); wl_proxy* res = wl_proxy_marshal_array_constructor(proxy, opcode, buffer->get_args(), &iface->desc); if (!res) { return io_result_mk_from_errno("<unknown>"); } diff --git a/lib/CWayland/CWayland.h b/lib/CWayland/CWayland.h index 1b8e0c8..74ed5e6 100644 --- a/lib/CWayland/CWayland.h +++ b/lib/CWayland/CWayland.h @@ -36,11 +36,12 @@ lean_obj_res waylean_event_loop_poll (b_lean_obj_arg event_loop); // -- Type Map -lean_obj_res waylean_type_map_new (void); -lean_obj_res waylean_type_map_contains(b_lean_obj_arg type_map, - b_lean_obj_arg iface_name); -lean_obj_res waylean_type_map_register(b_lean_obj_arg type_map, - b_lean_obj_arg iface_desc); +lean_obj_res waylean_type_map_new (void); +lean_obj_res waylean_type_map_is_complete(b_lean_obj_arg type_map, + b_lean_obj_arg iface_name); +lean_obj_res waylean_type_map_register (b_lean_obj_arg type_map, + b_lean_obj_arg iface_desc, + uint32_t set_complete); // -- Argument Buffer |
