GNOME扩展开发求助:如何获取活动窗口所在显示器?
判断GNOME Shell中活动窗口所在的显示器
我太懂这种刚上手GNOME扩展开发、找不到靠谱API文档的憋屈了!从修改现有扩展入手确实是个高效的入门方式,关于你遇到的「确定活动窗口在哪台显示器」的问题,我刚好有实操经验可以分享。
核心思路是通过窗口的坐标和显示器的坐标范围做匹配,具体步骤和代码如下:
实现步骤
- 获取活动窗口的位置与尺寸:每个窗口对象都有
get_frame_rect()方法,能拿到窗口的全局坐标(x、y)和宽高(width、height)。 - 获取所有显示器的坐标范围:
Main.layoutManager.monitors返回的每个monitor对象,自带x、y、width、height属性,对应显示器的全局坐标和尺寸。 - 匹配窗口与显示器:通常用窗口的中心坐标来判断(比左上角更准确,毕竟窗口可能跨多个显示器),检查中心是否落在某台显示器的范围内即可。
代码示例
// 获取当前活动窗口和所有显示器 const activeWindow = global.display.focus_window; const monitors = Main.layoutManager.monitors; // 先处理没有活动窗口的边界情况 if (!activeWindow) { console.log("No active window found"); return null; } // 获取窗口的矩形区域(全局坐标) const winRect = activeWindow.get_frame_rect(); // 计算窗口的中心坐标 const winCenterX = winRect.x + winRect.width / 2; const winCenterY = winRect.y + winRect.height / 2; // 遍历显示器列表,找到包含窗口中心的那台 let targetMonitor = null; for (const monitor of monitors) { // 检查中心坐标是否在当前显示器的范围内 const isWithinX = winCenterX >= monitor.x && winCenterX <= monitor.x + monitor.width; const isWithinY = winCenterY >= monitor.y && winCenterY <= monitor.y + monitor.height; if (isWithinX && isWithinY) { targetMonitor = monitor; break; // 找到就停止遍历 } } // 输出结果,targetMonitor就是活动窗口所在的显示器 console.log("Active window is on monitor:", targetMonitor);
额外说明
- 如果你的场景更关注窗口的「主要显示区域」,用中心坐标是最符合用户直觉的;如果有特殊需求,也可以改成判断窗口左上角坐标,或者窗口面积占比最高的显示器。
- GNOME Shell的全局坐标系中,所有窗口和显示器的坐标都是统一的,所以直接对比数值就行,不需要额外转换。
内容的提问来源于stack exchange,提问作者Valentin Radu
相关产品推荐
相关产品推荐

