You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 10:54:03