diff --git a/local/recipes/wayland/redbear-compositor/source/src/main.rs b/local/recipes/wayland/redbear-compositor/source/src/main.rs index cadb8d87b..71c0b3cb7 100644 --- a/local/recipes/wayland/redbear-compositor/source/src/main.rs +++ b/local/recipes/wayland/redbear-compositor/source/src/main.rs @@ -401,6 +401,13 @@ const OBJECT_TYPE_WL_POINTER: u32 = 15; const OBJECT_TYPE_WL_KEYBOARD: u32 = 16; const OBJECT_TYPE_WL_DATA_DEVICE_MANAGER: u32 = 17; const OBJECT_TYPE_WL_SUBCOMPOSITOR: u32 = 18; +const OBJECT_TYPE_WL_DATA_DEVICE: u32 = 19; +const OBJECT_TYPE_WL_SUBSURFACE: u32 = 20; + +// wl_data_device_manager opcodes +const WL_DATA_DEVICE_MANAGER_GET_DATA_DEVICE: u16 = 1; +// wl_subcompositor opcodes +const WL_SUBCOMPOSITOR_GET_SUBSURFACE: u16 = 1; struct Global { name: u32, @@ -1078,13 +1085,49 @@ impl Compositor { | OBJECT_TYPE_XDG_TOPLEVEL | OBJECT_TYPE_WL_POINTER | OBJECT_TYPE_WL_KEYBOARD - | OBJECT_TYPE_WL_DATA_DEVICE_MANAGER - | OBJECT_TYPE_WL_SUBCOMPOSITOR => { - eprintln!( - "redbear-compositor: unhandled opcode {} on object {}", - opcode, object_id - ); - } + | OBJECT_TYPE_WL_DATA_DEVICE_MANAGER => match opcode { + WL_DATA_DEVICE_MANAGER_GET_DATA_DEVICE => { + if payload.len() >= 4 { + let new_id = u32::from_le_bytes([ + payload[0], payload[1], payload[2], payload[3], + ]); + let mut clients = self.clients.lock().unwrap(); + if let Some(client) = clients.get_mut(&client_id) { + client.objects.insert(new_id, OBJECT_TYPE_WL_DATA_DEVICE); + } + } + } + _ => { + eprintln!( + "redbear-compositor: unhandled data_device_manager opcode {} on object {}", + opcode, object_id + ); + } + }, + OBJECT_TYPE_WL_SUBCOMPOSITOR => match opcode { + WL_SUBCOMPOSITOR_GET_SUBSURFACE => { + if payload.len() >= 4 { + let new_id = u32::from_le_bytes([ + payload[0], payload[1], payload[2], payload[3], + ]); + let mut clients = self.clients.lock().unwrap(); + if let Some(client) = clients.get_mut(&client_id) { + client.objects.insert(new_id, OBJECT_TYPE_WL_SUBSURFACE); + } + } + } + _ => { + eprintln!( + "redbear-compositor: unhandled subcompositor opcode {} on object {}", + opcode, object_id + ); + } + }, + OBJECT_TYPE_WL_DATA_DEVICE | OBJECT_TYPE_WL_SUBSURFACE => { + // Accept all requests silently — Qt6 needs these proxies + // to exist for initialization but we don't implement + // clipboard or subsurface compositing yet. + }, _ => { eprintln!( "redbear-compositor: unhandled object {} opcode {}",