비상 창에 집중/상승시키는 WM 독립적인 방법

비상 창에 집중/상승시키는 WM 독립적인 방법

창으로 "이동"(포커스 + 상승) 하고 비상 플래그를 비상처럼 보이도록 설정하는 키보드 단축키를 원합니다. 현재 데스크탑이 아닌 데스크탑에 있더라도 작업 표시줄(Gnome + Metacity)에 나타납니다. 그리고 깜박이기 시작했습니다(지적해 주신 @slm에게 감사드립니다).

해당 창은 현재 가상 데스크톱이 아닌 다른 가상 데스크톱에 있을 수 있습니다.

이 특별한 경우 Skype 창에는 비상 플래그가 설정되어 alt-tab팝업(메타시티 WM)에 표시되지만 현재 가상 데스크톱에 없으면 해당 창으로 전환할 수 없습니다.

조사 xdotool하고 wmctrl감독하고 있는데 운이 없군요.

어떤 아이디어나 단서가 있나요?


고쳐 쓰다:_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 프로젝트를 가지고세투르겐트(Hilljoy에게 감사드립니다). 용법:

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;
}

관련 정보