Wayland协议事件排序咨询:wlr-data-control v2事件顺序是否会穿插
wlr-data-control协议v2的事件顺序疑问解答
问题原文(翻译后)
已知Wayland协议中事件按顺序发送,但存在疑问:在wlr-data-control协议(版本2)中,是否会出现如下事件顺序?
- 来自数据设备A的常规选择的
data offer事件; - 来自数据设备A关联的offer对象的
offer事件; - 来自数据设备A的主选择的
data offer事件; - 来自数据设备A关联的offer对象的
offer事件;
……
本质上,是否能保证主选择的data offer事件永远不会出现在常规选择的data offer事件与后续的selection事件之间?即事件顺序始终为:
data offer;- 多个
offer事件; selection;data offer;- 多个
offer事件; primary selection。
解答
可以明确的是:主选择的data offer事件不会插入到常规选择的data offer与对应selection事件之间,事件会以「完整选择类型事件组」的形式顺序发送。
原因如下:
- 从协议语义来看,
selection(常规选择)和primary selection(主选择)是两个独立的选择上下文,但每个上下文的事件序列具备原子性:针对某一选择类型,必须先发送data offer事件创建对应的offer对象,接着发送该offer支持的所有offer(MIME类型声明)事件,最后才会发送selection/primary selection事件,确认该选择类型的内容更新完成。 - 从实际 compositor 实现(如wlroots)的逻辑来看,处理选择更新时会将同一类型的事件批量发送完毕,不会中途切换到另一选择类型的事件流程——这是为了保证客户端能完整接收某一选择的所有元数据后,再处理选择生效的通知,避免出现状态不一致的情况。
简言之,事件顺序只会是两种情况:要么先完成常规选择的完整事件序列,再处理主选择的序列;要么反过来,绝不会出现跨选择类型的事件穿插。
内容的提问来源于stack exchange,提问作者expoodo
相关产品推荐
相关产品推荐

