fix: compositor handles wl_data_device_manager and wl_subcompositor
- get_data_device: stores wl_data_device in client object map - get_subsurface: stores wl_subsurface in client object map - data_device/subsurface requests accepted silently (Qt6 needs these proxies to exist for initialization even though we don't implement clipboard or subsurface compositing yet) Instrumentation confirmed: setupConnection() completes with valid registry=0x44f230. Crash is in Qt6 global binding path during forceRoundTrip(), not in compositor protocol handling.
This commit is contained in:
@@ -401,6 +401,13 @@ const OBJECT_TYPE_WL_POINTER: u32 = 15;
|
|||||||
const OBJECT_TYPE_WL_KEYBOARD: u32 = 16;
|
const OBJECT_TYPE_WL_KEYBOARD: u32 = 16;
|
||||||
const OBJECT_TYPE_WL_DATA_DEVICE_MANAGER: u32 = 17;
|
const OBJECT_TYPE_WL_DATA_DEVICE_MANAGER: u32 = 17;
|
||||||
const OBJECT_TYPE_WL_SUBCOMPOSITOR: u32 = 18;
|
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 {
|
struct Global {
|
||||||
name: u32,
|
name: u32,
|
||||||
@@ -1078,13 +1085,49 @@ impl Compositor {
|
|||||||
| OBJECT_TYPE_XDG_TOPLEVEL
|
| OBJECT_TYPE_XDG_TOPLEVEL
|
||||||
| OBJECT_TYPE_WL_POINTER
|
| OBJECT_TYPE_WL_POINTER
|
||||||
| OBJECT_TYPE_WL_KEYBOARD
|
| OBJECT_TYPE_WL_KEYBOARD
|
||||||
| OBJECT_TYPE_WL_DATA_DEVICE_MANAGER
|
| OBJECT_TYPE_WL_DATA_DEVICE_MANAGER => match opcode {
|
||||||
| OBJECT_TYPE_WL_SUBCOMPOSITOR => {
|
WL_DATA_DEVICE_MANAGER_GET_DATA_DEVICE => {
|
||||||
eprintln!(
|
if payload.len() >= 4 {
|
||||||
"redbear-compositor: unhandled opcode {} on object {}",
|
let new_id = u32::from_le_bytes([
|
||||||
opcode, object_id
|
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!(
|
eprintln!(
|
||||||
"redbear-compositor: unhandled object {} opcode {}",
|
"redbear-compositor: unhandled object {} opcode {}",
|
||||||
|
|||||||
Reference in New Issue
Block a user