Casilda 1.6 发布
摘要
Casilda 1.6 已发布,为 Gtk 4 应用程序中使用的 Wayland 合成器组件增加了拖放和剪贴板支持。
<p><a href="https://lobste.rs/s/ckhrtg/casilda_1_6_released">评论</a></p>
查看缓存全文
缓存时间: 2026/09/24 19:04
# Casilda 1.6 发布!
来源:https://blogs.gnome.org/xjuan/2026/09/24/casilda-1-6-released/
### 拖放功能发布
我很高兴宣布 Casilda 的新版本!
一个基于 Gtk 4 的简洁 Wayland 合成器组件,最初是为 Cambalache (https://gitlab.gnome.org/jpu/cambalache) 创建的。
这个新版本带来了拖放功能以及剪贴板支持 / 与宿主合成器的集成,这意味着你可以从宿主应用程序中拖拽内容到嵌入在 Casilda 合成器组件中的应用程序窗口中,反之亦然!
在 GUADEC 上经历了一次非常坎坷的演示之后——我试图展示如何使用 Cambalache 创建幻灯片,并通过 Casilda 合成器嵌入 GNOME Builder 和 Cambalache 本身来构建简单的 Gtk 应用——我决定修复我发现的所有问题,以便重新进行演示并将其作为视频上传。
这是一张滑块窗口的截图,其内部有一个 Casilda 合成器(绿色线条)用于嵌入一个 Cambalache 实例,该 Cambalache 实例又使用了另一个 CasildaCompositor(红色线条)来预览 UI。
这是一张滑块窗口的截图,其内部有一个 Casilda 合成器 (绿色线条) 用于嵌入一个 Cambalache 实例,该 Cambalache 实例使用另一个 CasildaCompositor (红色线条) 来预览 UI。
可能出错并且确实出错的地方包括:
- 剪贴板(无法复制粘贴代码片段)
- 键盘数字小键盘
- 指针事件中的键盘修饰键(我无法使用 Alt+Click 强制创建组件)
- 示例应用程序连接到宿主合成器而不是 Casilda 组件
- GNOME Builder 全屏窗口状态损坏
- 弹出窗口的工具提示导致崩溃
修复所有错误和键盘支持后,我开始着手添加与宿主的剪贴板集成。
#### 剪贴板支持
在 Casilda 和 Gtk 之间集成剪贴板相当简单,因为我需要做的就是将 wlroots `wlr_seat::request_set_selection` 事件提供的所有剪贴板数据复制到 GdkClipboard,并在 GdkClipboard 的 changed 信号上调用 `wlr_seat_set_selection()`。
#### Wlroots 客户端到 Gtk
为此,我创建了一个新的 GdkContentProvider,它使用 wlr_data_source 作为数据源,并通过 gdk_clipboard_set_content() 将该提供者设置为剪贴板的内容。
内部实现是,当客户端想要从剪贴板获取数据时,新的提供者会创建一个 unix 管道,通过 `wlr_data_source_send()` 写入管道从 wlroots 读取数据,并使用 `g_output_stream_splice_async()` 从另一端读取。
#### Gtk 到 wlroots 再到客户端
为了反向实现,我创建了一个新的 `wlr_data_source`,它使用 GdkClipboard 作为数据源,并使用 wlr_seat_set_selection() 设置选区。
内部实现是,当 `wlr_data_source` 的 send() 方法被调用以将数据发送给客户端时,会调用 gdk_clipboard_read_async() 来启动数据读取。
#### 拖放支持
集成 DnD(拖放)不像剪贴板那么容易。除了连接一些事件,设置它在 Casilda 内部工作相对容易,我还需要绘制拖放图标表面。
获取拖放表面后,我做的第一件事是将其绘制在指针坐标处,这导致了模糊的结果,因为指针坐标是分数值,这意味着它们并不总是与像素网格对齐。
这样看起来不错,但现在我需要开始将拖放与 Gtk(宿主合成器)集成,所以在调用 wlr_seat_start_pointer_drag() 之后,我使用 gdk_drag_begin() 创建了一个 GdkDrag,并使用 gtk_drag_icon_set_from_paintable() 来设置拖放图标,然后我注意到它仍然很模糊!!!
困惑了一分钟后,我意识到 GNOME Shell(mutter)一定犯了和我之前一样的错误,所以我决定看看能否修复它!
感谢 Sebastian Wick 的指导以及他审阅我的 MR (https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/5212),GNOME Shell 51 应该会有清晰的拖放图标了!
现在回到将 DnD 与宿主合成器集成的问题上。
以下是使 DnD 能够透明地跨宿主和客户合成器工作所需的所有不同用例:
- Casilda 客户端到 Casilda 客户端
- Casilda 客户端到宿主客户端
- 宿主客户端到 Casilda 客户端
当然,wlroots 只考虑了第一个用例,后两种情况是 Casilda 特有的。
### Casilda 到宿主
到目前为止,我们可以检测到客户端何时开始拖拽,让 wlroot 处理它,并创建一个 GdkDrag 让 Gtk 在宿主级别发起另一个拖拽。
这意味着,当嵌入在 CasildaCompositor 中的客户端发起拖拽时,在客户和宿主合成器中会同时进行两个拖拽操作。请记住,Casilda 始终将拖放图标的渲染委托给宿主合成器。
在正常操作期间,Casilda 从一个事件控制器接收事件,但在拖拽操作期间,事件不会以正常方式发送给客户端,为此你可以使用 GtkDropTargetAsync 并连接到各种信号,例如我使用 drag-motion 将事件转发给客户端。
### 宿主到 Casilda
当在宿主合成器中发起拖拽时,Casilda 重用为跟踪运动事件而创建的 GtkDropTargetAsync,并连接到 drag-enter 信号以在 wlroots 中创建一个代理拖拽源,并在 GtkDropTargetAsync::drop 上合成一个按钮释放事件,以在客户端触发放置操作。
这是展示所有不同用例实际操作的屏幕录像。
你可以想象,让所有这些协同正确工作并非易事,我预计在不同边缘情况下会有微妙的 bug,所以如果你发现其中一个,请提交一个 bug 报告,如果可能的话,请附上屏幕录像。
### 发布说明
- 添加 DnD(拖放)和剪贴板支持
- 添加 xdg_foreign 协议支持
- 修复指针按钮按下事件中的修饰键
- 添加键盘 Caps/Num/Scroll Lock 支持
- 修复弹出窗口的崩溃问题
- 修复最大化/全屏状态处理
- 修复修饰键标志创建(Evgenii Danilin)
- 当表面被销毁时丢弃光标表面监听器(Evgenii Danilin)
- 当 dmabuf 导入失败时关闭重复的平面 FD(Evgenii Danilin)
- 公告有效的输出缩放比例以避免缩放-0 断言(Evgenii Danilin)
- 释放 wayland GSource(Evgenii Danilin)
- Meson 配置清理(Val Packett)
- 使用 gtk api 对齐设备像素网格
### 已修复问题
- \#20 “在 server_request_activate 中出现 SIGSEGV”
### 从哪里获取?
源代码位于 GNOME 的 gitlab 此处 (https://gitlab.gnome.org/jpu/casilda)
```
git clone https://gitlab.gnome.org/jpu/casilda.git
```
### Matrix 频道
有任何问题?来和我们一起聊天吧 #cambalache:gnome.org (https://matrix.to/#/#cambalache:gnome.org)
### Mastodon
在 Mastodon 上关注我 @xjuan (https://mastodon.social/@xjuan) 以获取与 Casilda 和 Cambalache 开发相关的新闻。
编程愉快!
相似文章
Xwayland 26.1.0 发布候选版1
Olivier Fourdan 宣布了 Xwayland 26.1.0 的首个发布候选版,包括更改如 EGLStream 移除、rootful 模式的剪贴板桥接、多座位支持以及各种错误修复,并请求进行测试。
Xfwl4 的首个预览版发布
Brian Tarricone 宣布推出 xfwl4 的首个预览版,这是 Xfce 的 Wayland 合成器,经过了六个月的工作,详细说明了已知缺失的功能和未来计划。
Slint 1.17 发布
Slint 1.17 引入了拖放、系统托盘图标、工具提示以及模型行上的双向绑定,进一步推动其成为桌面级 UI 工具包的目标。
本周 Plasma 更新:每个屏幕的虚拟桌面与 Wayland 会话恢复
KDE Plasma 6.7 引入了每个屏幕的虚拟桌面、Wayland 会话恢复以及大量 UI 改进,这些改进是在格拉茨举行的年度 KDE 大冲刺之后实现的,包括日历应用配置、Alt+Tab 定位选项和应用操作收藏。
在Wayland上追求永恒的停靠 - lambdock (C + GTK4 + Lisp GNU Guile Scheme)
lambdock是一款原生支持Wayland的、可修改的桌面停靠应用,使用C、GTK4和GNU Guile Scheme构建,具有流畅的物理动画和运行时REPL控制。