XMonad 原子更改未反映在 Tint2 面板中 - 事件传播问题

问题描述 投票:0回答:1

这个问题不是关于设置桌面环境,它严格是关于用于处理下面的事件/情况的Xorg或X11协议。

我遇到了 X11 原子更改的问题。情况是这样的:

  1. 在 XMonad 中,我正在修改某些窗口的
    _NET_WM_STATE_SKIP_TASKBAR
    原子。
  2. 这些更改已成功应用于窗口(我可以使用
    xprop
    验证这一点)。
  3. 但是,tint2 并未更新其面板来反映这些更改。受影响的窗口继续出现(或不出现)在tint2任务栏中,就像原子没有被修改一样。

我的问题是:

  1. 是否有通用程序或最佳实践将原子更改传播到其他 X11 客户端(例如本例中的tint2)?
  2. 这可能是tint2的事件掩码不包括检测这些原子变化所需的事件的问题吗?
  3. 修改原子后是否需要触发特定事件(如 PropertyNotify)以确保其他客户端知道更改?

我使用 XMonad 作为我的窗口管理器,并且我直接通过 XMonad 的 X11 绑定修改原子。 Tint2 被用作我的面板/任务栏。

任何有关原子更改应如何正确传播或tint2如何处理此类更改的见解将不胜感激。


据我所知,当我修改窗口原子时,似乎

PropertyNotify
事件会自动从 XMonad 发送。看来tint2确实不会重绘面板,因为

        else if (at == server.atom [_NET_WM_STATE])
        {
            if (debug) {
                int count;
                Atom *atom_state = get_property(win, server.atom [_NET_WM_STATE], XA_ATOM, &count);
                for (int j = 0; j < count; j++)
                {
                    char *atom_state_name = XGetAtomName(server.display, atom_state[j]);
                    fprintf(stderr, "tint2: %s %d: _NET_WM_STATE = %s\n", __func__, __LINE__, atom_state_name);
                    XFree(atom_state_name);
                }
                XFree(atom_state);
            }
            if (window_is_urgent(win))
                add_urgent(task);
            if (window_is_skip_taskbar(win)) {
                remove_task(task);
                schedule_panel_redraw();
            }
        }

这似乎没有正确安排面板重绘 - 没有为我正在查看的操作执行 if 条件(删除

_NET_WM_STATE_SKIP_TASKBAR
)。

x11 xorg
1个回答
0
投票

PropertyNotify
事件似乎是这里的正确程序。 Tint2 没有正确处理这些事件。

可以使用

xev
程序调试/查看这些事件。

© www.soinside.com 2019 - 2024. All rights reserved.