如何在KWin scripting API中发射信号供其他组件接收
KWin脚本发射信号的实现方法
1. 发射客户端内置信号
你要触发的clientStartUserMovedResized是KWin Client对象的原生内置信号,不需要额外的emit方法,直接调用信号对应的触发函数即可,语法如下:
// 触发client对象的clientStartUserMovedResized信号 client.clientStartUserMovedResized();
Qt信号机制下,每个内置信号都会默认生成对应的触发方法,直接调用方法就会自动发射对应信号,所有已连接该信号的监听器都会被触发。
2. 自定义跨脚本通信信号
如果是你自行定义的、需要跨脚本传递的信号,可以借助KWin全局的workspace对象挂载自定义事件,实现不同脚本之间的通信:
- 信号发射端脚本写法:
// 挂载自定义信号(仅需执行一次) workspace.customWindowResizeAboutToStart = function(client) { // 可自行携带旧几何参数等需要传递的自定义数据 const oldGeometry = Object.assign({}, client.geometry); // 触发所有已注册的监听回调 if (this._customResizeListeners) { this._customResizeListeners.forEach(cb => cb(client, oldGeometry)); } } // 配套提供监听注册方法 workspace.onCustomWindowResizeAboutToStart = function(cb) { if (!this._customResizeListeners) this._customResizeListeners = []; this._customResizeListeners.push(cb); } // 需要发射信号的位置直接调用即可 workspace.customWindowResizeAboutToStart(client);
- 信号接收端脚本写法:
workspace.onCustomWindowResizeAboutToStart((client, oldGeometry) => { // 此处可直接拿到修改前的几何参数 console.log(`窗口${client.caption}即将调整大小,旧尺寸:`, oldGeometry); });
适配你的使用场景的最简方案
要在修改窗口几何属性前触发通知,直接调用对应内置信号的触发方法即可:
// 先触发移动/调整开始信号,此时窗口几何还未修改 client.clientStartUserMovedResized(); // 再执行修改窗口几何的操作 client.geometry = newGeometry;
接收端正常连接信号即可拿到修改前的窗口数据:
client.clientStartUserMovedResized.connect(() => { const oldGeo = client.geometry; // 在此处保存旧几何参数即可 });
内容的提问来源于stack exchange,提问作者Natalie Clarius
相关产品推荐
相关产品推荐

