独立于 WM 的方式来聚焦/升起紧急窗口

独立于 WM 的方式来聚焦/升起紧急窗口

我想要一个键盘快捷键来“转到”(焦点+提升)窗口,并设置紧急标志,看起来像紧急:它出现在任务栏(Gnome + Metacity)上,即使它位于当前桌面以外的桌面上并且开始眨眼(感谢@slm 指出)。

该窗口可能位于当前虚拟桌面之外的其他虚拟桌面上。

在这种特殊情况下,Skype 窗口设置了紧急标志,因此它们出现在alt-tab弹出窗口(metacity WM)中,但如果它不在当前虚拟桌面上,我无法切换到该窗口。

我正在调查xdotoolwmctrl指挥,但没有运气。

有什么想法或线索吗?


更新:看来我正在谈论_NET_WM_STATE= _NET_WM_STATE_DEMANDS_ATTENTION...

答案1

我想我已经找到了一些在职的解决方案这里

提供的 Bash 脚本就是我正在寻找的内容,并且它们显然利用了wmctrl

为了快速访问/存档目的,我将两个脚本复制粘贴到此处:

跳转到需要注意的窗口:

#!/bin/bash
activeWinIdLine=`xprop -root | grep _NET_ACTIVE_WINDOW\(WINDOW\) `
activeWinId="${activeWinIdLine:40}"
echo $activeWinId > ~/activeWinId
for id in `wmctrl -l | cut -d " " -f 1`; do
    xprop -id $id | grep "_NET_WM_STATE_DEMANDS_ATTENTION" 2>&1 > /dev/null
    if [ "$?" = "0" ]; then
        wmctrl -i -a $id
        exit 0
    fi
done
exit 1

跳回到您正忙着的窗口:

#!/bin/bash
if [ -f ~/activeWinId ]; then
    origWinId=`cat ~/activeWinId`
    wmctrl -i -a $origWinId
fi

感谢您的讨论,特别是@slm 为我指明了正确的方向。

答案2

有一个小型的 C 项目塞图尔金特(谢谢希尔乔)。用法:

seturgent <winid> [0|1] # 0: urgent off, 1: urgent on

复制源seturgent.c:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <X11/Xlib.h>
#include <X11/Xutil.h>

static void die(const char *s) {
    fputs(s, stderr);
    exit(EXIT_FAILURE);
}

static void seturgency(Display *dpy, Window winid, Bool set) {
    XWMHints *hints = XGetWMHints(dpy, winid);
    if(!hints) {
        fputs("seturgent: unable to get window manager hints.\n", stderr);
        return;
    }
    if(set)
        hints->flags |= XUrgencyHint;
    else
        hints->flags &= ~XUrgencyHint;
    if(!XSetWMHints(dpy, winid, hints))
        fputs("seturgent: unable to set urgency hint.\n", stderr);
    XFree(hints);
}

int main(int argc, char **argv) {
    Display *dpy;

    if(argc < 2 || !strcmp(argv[1], "-h")) /* help / usage */
        die("Usage: seturgent <winid> [0|1]\n");
    if(argc == 2 && !strcmp(argv[1], "-v")) /* version */
        die("seturgent-"VERSION" © 2010-2012 seturgent engineer, see " \
            "LICENSE file for details.\n");
    if(!(dpy = XOpenDisplay(NULL)))
        die("seturgent: unable to open display.\n");
    /* set the urgency hint (or not), if not specified its True. */
    seturgency(dpy, (Window)strtol(argv[1], NULL, 0),
               !((argc > 2) && !atol(argv[2])));
    XSync(dpy, False);
    XCloseDisplay(dpy);

    return EXIT_SUCCESS;
}

相关内容