Casilda 1.6 发布

Lobsters Hottest 工具

摘要

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

Hacker News Top

Olivier Fourdan 宣布了 Xwayland 26.1.0 的首个发布候选版,包括更改如 EGLStream 移除、rootful 模式的剪贴板桥接、多座位支持以及各种错误修复,并请求进行测试。

Xfwl4 的首个预览版发布

Lobsters Hottest

Brian Tarricone 宣布推出 xfwl4 的首个预览版,这是 Xfce 的 Wayland 合成器,经过了六个月的工作,详细说明了已知缺失的功能和未来计划。

Slint 1.17 发布

Lobsters Hottest

Slint 1.17 引入了拖放、系统托盘图标、工具提示以及模型行上的双向绑定,进一步推动其成为桌面级 UI 工具包的目标。