Forma independente de WM para focar / levantar janela URGENTE

4

Eu gostaria de ter um atalho de teclado para "ir para" (focus + raise) janela com conjunto de sinalizadores URGENT que parece URGENT: aparece na barra de tarefas (Gnome + Metacity) mesmo se está na área de trabalho diferente da atual e começa a piscar (graças a @slm por apontá-la).

Esta janela pode estar em outra área de trabalho virtual do que a atual.

Neste caso particular, são as janelas do Skype que definem o sinalizador de urgência e, portanto, aparecem em alt-tab popup (metacity WM), mas não posso alternar para esta janela se ela não estiver na área de trabalho virtual atual.

Eu estava pesquisando o comando xdotool e wmctrl sem sorte.

Alguma idéia ou pista?

Atualização: Parece que estou falando de _NET_WM_STATE = _NET_WM_STATE_DEMANDS_ATTENTION ...

    
por roomcays 07.08.2013 / 13:10

2 respostas

2

Existe um pequeno projeto em C em funcionamento seturgent (obrigado hiltjo). Uso:

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

Copiando a fonte 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;
}
    
por 03.11.2016 / 20:27
1

Acho que encontrei algumas soluções funcionando aqui .

Scripts bash fornecidos lá são o que eu estava procurando e eles aparentemente usam wmctrl !

Para fins de acesso rápido / arquivamento eu copio e colo os dois scripts aqui:

Salte para a janela que exige atenção:

#!/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

Volte para a janela em que você estava ocupado:

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

Obrigado pela discussão, especialmente @slm por me direcionar para o lado certo.

    
por 08.08.2013 / 14:19