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