使用 Python xlib 在活动 X 窗口发生更改时获取通知

2023-11-27

我想监视运行 X 的 Linux 系统上哪个窗口处于活动状态,以及该活动窗口何时调整大小或移动。我可以监视活动窗口(它位于_NET_ACTIVE_WINDOW根窗口上的属性,我可以注册PropertyNotify根窗口上的事件以发现该属性何时发生更改)。但是,我不知道如何监视活动窗口以了解它是否调整大小或移动。

import Xlib
import Xlib.display

disp = Xlib.display.Display()
Xroot = disp.screen().root
NET_ACTIVE_WINDOW = disp.intern_atom('_NET_ACTIVE_WINDOW')
Xroot.change_attributes(event_mask=Xlib.X.PropertyChangeMask)

while True:
    # loop until an event happens that we care about
    # we care about a change to which window is active
    # (NET_ACTIVE_WINDOW property changes on the root)
    # or about the currently active window changing
    # in size or position (don't know how to do this)
    event = disp.next_event()
    if (event.type == Xlib.X.PropertyNotify and
            event.atom == NET_ACTIVE_WINDOW):
        active = disp.get_input_focus().focus
        try:
            name = active.get_wm_class()[1]
        except TypeError:
            name = "unknown"
        print("The active window has changed! It is now", name)

有没有办法做到这一点?它可能涉及监听当前活动窗口上的ConfigureNotify事件(并调用change_attributes当它变得活跃时在该窗口上设置适当的掩码),但我无法让它工作。

(注意:我没有使用 Gtk,所以请不要提供 Gtk 解决方案。)

更新:有一种相当可疑的方法来检测窗口resizes,通过观察活动窗口的值_NET_WM_OPAQUE_REGION属性更改(因为我正确接收了 PropertyChange 事件,尽管我没有接收到ConfigureNotify 事件)。但是,尚不清楚所有窗口管理器都设置此属性,并且此属性仅在窗口大小调整时发生变化;它不会随着窗口移动而改变(任何其他属性也不会改变)。


执行此操作的方法是选择SubstructureNotifyMask在根窗口上,然后阅读全部ConfigureNotify事件并忽略那些不适合我们关心的窗口的事件,因此:

import Xlib
import Xlib.display

disp = Xlib.display.Display()
Xroot = disp.screen().root
NET_ACTIVE_WINDOW = disp.intern_atom('_NET_ACTIVE_WINDOW')
Xroot.change_attributes(event_mask=Xlib.X.PropertyChangeMask |
                        Xlib.X.SubstructureNotifyMask)

windows = []

while True:
    # loop until an event happens that we care about
    # we care about a change to which window is active
    # (NET_ACTIVE_WINDOW property changes on the root)
    # or about the currently active window changing
    # in size or position (ConfigureNotify event for
    # our window or one of its ancestors)
    event = disp.next_event()
    if (event.type == Xlib.X.PropertyNotify and
            event.atom == NET_ACTIVE_WINDOW):
        active = disp.get_input_focus().focus
        try:
            name = active.get_wm_class()[1]
        except TypeError:
            name = "unknown"
        print("The active window has changed! It is now", name)

        # Because an X window is not necessarily just what one thinks of
        # as a window (the window manager may add an invisible frame, and
        # so on), we record not just the active window but its ancestors
        # up to the root, and treat a ConfigureNotify on any of those
        # ancestors as meaning that the active window has been moved or resized
        pointer = active
        windows = []
        while pointer.id != Xroot.id:
            windows.append(pointer)
            pointer = pointer.query_tree().parent
    elif event.type == Xlib.X.ConfigureNotify and event.window in windows:
        print("Active window size/position is now", event.x, event.y,
              event.width, event.height)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Python xlib 在活动 X 窗口发生更改时获取通知 的相关文章

  • Pandas set_levels,如何避免标签排序?

    我使用时遇到问题set levels多索引 from io import StringIO txt Name Height Age Metres A 1 25 B 95 1 df pd read csv StringIO txt heade
  • Python - 比较同一字典中的值

    我有一本字典 d Trump MAGA FollowTheMoney Clinton dems Clinton Stein FollowTheMoney Atlanta 我想删除字符串列表中的重复字符串 该字符串是键的值 对于这个例子 期望
  • 多输出堆叠回归器

    一次性问题 我正在尝试构建一个多输入堆叠回归器 添加到 sklearn 0 22 据我了解 我必须结合StackingRegressor and MultiOutputRegressor 经过多次尝试 这似乎是正确的顺序 import nu
  • NLTK 2.0分类器批量分类器方法

    当我运行此代码时 它会抛出一个错误 我认为这是由于 NLTK 3 0 中不存在batch classify 方法 我很好奇如何解决旧版本中的某些内容在新版本中消失的此类问题 def accuracy classifier gold resu
  • 使用主题交换运行多个 Celery 任务

    我正在用 Celery 替换一些自制代码 但很难复制当前的行为 我期望的行为如下 创建新用户时 应向tasks与交换user created路由键 该消息应该触发两个 Celery 任务 即send user activate email
  • python multiprocessing 设置生成进程等待

    是否可以生成一些进程并将生成进程设置为等待生成的进程完成 下面是我用过的一个例子 import multiprocessing import time import sys def daemon p multiprocessing curr
  • Pycharm 在 os.path 连接上出现“未解析的引用”

    将pycharm升级到2018 1 并将python升级到3 6 5后 pycharm报告 未解析的引用 join 最新版本的 pycharm 不会显示以下行的任何警告 from os path import join expanduser
  • Tensorboard SyntaxError:语法无效

    当我尝试制作张量板时 出现语法错误 尽管开源代码我还是无法理解 我尝试搜索张量板的代码 但不清楚 即使我不擅长Python 我这样写路径C Users jh902 Documents logs因为我正在使用 Windows 10 但我不确定
  • 矩形函数的数值傅里叶变换

    本文的目的是通过一个众所周知的分析傅里叶变换示例来正确理解 Python 或 Matlab 上的数值傅里叶变换 为此 我选择矩形函数 这里报告了它的解析表达式及其傅立叶变换https en wikipedia org wiki Rectan
  • Python 内置的 super() 是否违反了 DRY?

    显然这是有原因的 但我没有足够的经验来认识到这一点 这是Python中给出的例子docs http docs python org 2 library functions html super class C B def method se
  • 从 Powershell 脚本安装 Python

    当以管理员身份从 PowerShell 命令行运行以下命令时 可以在 Windows 11 上成功安装 Python c temp python 3 11 4 amd64 exe quiet InstallAllUsers 0 Instal
  • 为什么一旦我离开内置的运行服务器,Django 就无法找到我的管理媒体文件?

    当我使用内置的简单服务器时 一切正常 管理界面很漂亮 python manage py runserver 但是 当我尝试使用 wsgi 服务器为我的应用程序提供服务时django core handlers wsgi WSGIHandle
  • 导入错误:没有名为flask.ext.login的模块

    我的flask login 模块有问题 我已经成功安装了flask login模块 另外 从命令提示符我可以轻松运行此脚本 不会出现错误 Python 2 7 r27 82525 Jul 4 2010 07 43 08 MSC v 1500
  • pandas - 包含时间序列数据的堆积条形图

    我正在尝试使用时间序列数据在 pandas 中创建堆积条形图 DATE TYPE VOL 0 2010 01 01 Heavy 932 612903 1 2010 01 01 Light 370 612903 2 2010 01 01 Me
  • Pandas 组合不同索引的数据帧

    我有两个数据框df 1 and df 2具有不同的索引和列 但是 有一些索引和列重叠 我创建了一个数据框df索引和列的并集 因此不存在重复的索引或列 我想填写数据框df通过以下方式 for x in df index for y in df
  • 在 Google App Engine 中,如何避免创建具有相同属性的重复实体?

    我正在尝试添加一个事务 以避免创建具有相同属性的两个实体 在我的应用程序中 每次看到新的 Google 用户登录时 我都会创建一个新的播放器 当新的 Google 用户在几毫秒内进行多个 json 调用时 我当前的实现偶尔会创建重复的播放器
  • 如何以正确的方式为独立的Python应用程序制作setup.py?

    我读过几个类似的主题 但还没有成功 我觉得我错过或误解了一些基本的事情 这就是我失败的原因 我有一个用 python 编写的 应用程序 我想在标准 setup py 的帮助下进行部署 由于功能复杂 它由不同的 python 模块组成 但单独
  • 重新分配唯一值 - pandas DataFrame

    我在尝试着assign unique值在pandas df给特定的个人 For the df below Area and Place 会一起弥补unique不同的价值观jobs 这些值将分配给个人 总体目标是使用尽可能少的个人 诀窍在于这
  • Firebase Firestore:获取文档的生成 ID (Python)

    我可以创建一个新文档 带有自动生成的 ID 并存储对其的引用 如下所示 my data key value doc ref db collection u campaigns add my data 我可以像这样访问数据本身 print d
  • 如何将Python3设置为Mac上的默认Python版本?

    有没有办法将 Python 3 8 3 设置为 macOS Catalina 版本 10 15 2 上的默认 Python 版本 我已经完成的步骤 看看它安装在哪里 ls l usr local bin python 我得到的输出是这样的

随机推荐

  • 使用 JAX-RS 进行 Bean 验证(rest-easy):无法识别参数名称

    我将 JAX RS 资源与 Bean 验证一起使用 并按预期在这两个工作之间进行集成 但是 在验证错误报告参数名称为 arg0 的情况下生成的默认错误消息 如下所示 PARAMETER login arg0 password passwor
  • 键盘隐藏TabBar

    我正在 TabBar 应用程序中工作 在一个视图中 有一个 UISearchBar 按下 时 会出现键盘 问题是键盘隐藏了标签栏 你知道如何解决吗 自从有人问这个问题以来已经有一段时间了 但为了文档的缘故 这里是这样的 首先订阅NSNoti
  • 当 url 包含尾部斜杠时 CSS 不加载

    我正在构建一个 j2ee 应用程序并将其部署到 gae 由于某种原因 当我的 url 末尾有一个尾部斜杠时 CSS 不会加载 例如 mysite com account完美运作 but mysite com account 加载没有 CSS
  • 按顺序运行多个 Magento DataFlow 配置文件

    我正在开发一个 Magento 扩展 允许用户将类别 产品和其他类型的数据从不同的网上商店解决方案导入到 Magento 中 为了实现这一目标 我设置了几个负责导入的 DataFlow 高级配置文件 到目前为止 它工作正常 但配置文件需要按
  • 使用 grep 查找带有反斜杠的字符串 - 字符转义

    我使用时遇到困难 作为正则表达式中的喋喋不休者 有什么想法可以让它发挥作用吗 grep pattern text with backslash value T Expected output 1 text with backslash 单个
  • ASP.NET GridView SortedAscendingHeaderStyle 不起作用

    My SortedAscendingHeaderStyle and SortedDescendingHeaderStyle根本不工作
  • 为什么 React hooks 以这种方式命名为 useXXX? [关闭]

    Closed 这个问题是基于意见的 目前不接受答案 我一直想知道 React hooks 的命名 例如 useEffect 它的名称如何暗示像 componentDidUpdate 或 componentDidMount 之类的东西 它相当
  • Django Rest Framework 如何发布日期字段

    我想发布带有字段的 JSON 请求date date 2015 02 11T00 00 00 000Z 它的字符串是自动转换而来的Date对象 我不想裁剪该部分T00 00 00 000Z在前端手动 但是如果我发布这样的请求 DateFie
  • 如何使用 inotifywait 来查看文件夹中的文件而不是文件夹中的文件

    我想使用 inotifyway 来监视文件夹中新创建或移动的文件 但仅限于文件 假设我的文件夹名称为 watched folder test 文件名为 toto txt 如果我使用 mv 命令将文件移动到 Watched folder te
  • RegularExpressionValidator 上用于检查文本框文本长度是否为 6 个或更多字符的表达式是什么?

    RegularExpressionValidator 控件检查要验证的文本框是否包含 6 个或更多字符的格式是什么 6 会在正则表达式的大多数变体中执行此操作 让我验证它在这个特定情况下是否有效 编辑 我想它有效
  • Python sys.argv 保留 ' ' 或 ""

    终端 python test py blah blah 在测试 py中 print sys argv test py blah blah lt blah arg 如何保留其 或有没有办法知道 arg 是否用 或 包裹 Your shell在
  • 如何在 Angular 6 中动态添加输入字段

    我需要将输入字段添加到对象数组和根据用户选择动态增长的地图 例如InputForm有一个列表和一张需要用户填写的地图 export class InputForm mapA listA ListA export class ListA in
  • 如何确定 ThreadPool 队列中的项目数

    我正在使用 ThreadPool 对 1000 个工作项进行排队 While reading in data for processing args some data that has been read ThreadPool Queue
  • 句子的 RDF 表示

    我需要以 RDF 格式表示句子 换句话说 约翰喜欢可乐 将自动表示为 Subject John Predicate Likes Object Coke 有谁知道我应该从哪里开始 是否有任何程序可以自动执行此操作 或者我需要从头开始执行所有操
  • Monodroid Javascript 回调

    我正在尝试使用 monodroid 和 webkit 来创建一个应用程序 我在让 html 页面调用 javascript 方法时遇到问题 该方法将是我的应用程序中方法的接口 有一个关于此的教程http developer android
  • 使用 csrf 令牌从 Android 应用程序访问 laravel 应用程序

    我正在学习laravel框架 我已经安装了5 0版本 我将它用于 json api 服务 该服务将在调用特定路由后提供 JSON 输出 如果我从浏览器请求 URL 它效果很好 但是当我尝试从我的 Android 应用程序访问时 它会给出错误
  • 使用 LINQ 从 XML 获取最大属性值

    我有以下内容XML文件 我想要得到Max NR using LINQ 有人可以帮我做到这一点吗 我知道如何对节点执行此操作 但属性让我感到困惑 S
  • 让用户指定 RazorEngine 模板有多危险?

    我有类似邮件合并的功能 它需要一个模板 一些业务对象 并生成 html 然后将其转换为 PDF 我在用着剃刀引擎将模板 模型转换为 html 位 如果我让用户指定模板 我要冒什么风险 是否可以降低任何风险 例如 用户可以执行任意代码吗 删除
  • XOR 问题可以用 2x2x1 神经网络无偏差解决吗?

    如果没有偏差 具有 2 个输入节点 2 个隐藏节点和一个输出的神经网络是否应该能够解决 XOR 问题 或者它会被卡住吗 保留偏差 它不会看到您输入的值 就一对一的类比而言 我喜欢将偏差视为抵消c 直线方程中的值 y mx c 它为您的系统添
  • 使用 Python xlib 在活动 X 窗口发生更改时获取通知

    我想监视运行 X 的 Linux 系统上哪个窗口处于活动状态 以及该活动窗口何时调整大小或移动 我可以监视活动窗口 它位于 NET ACTIVE WINDOW根窗口上的属性 我可以注册PropertyNotify根窗口上的事件以发现该属性何