WM-independent способ фокусировать/повышать окно URGENT

Это не точно, как Вы структурировали его, но, учитывая Вашу фактическую цель будет более просто захватить часть перед двоеточием и видом этим. Вот сценарий Perl, который накапливает строки от отдельных ключей сортировки в записях отдельного массива и сбрасывает vcard, когда он достигает конца.

#!/usr/bin/perl -n
BEGIN {
    @headers = qw(BEGIN VERSION FN N NICKNAME EMAIL X- TEL ADR ORG TITLE BDAY URL ROLE NOTE END);
    for $h (@headers) { $data{$h} = ""; }
}
if (/^([^:]+):/) {
    $data{exists $data{$1} ? $1 : "X-"} .= $_;
    if ($1 eq 'END') {
        for $h (@headers) { print $data{$h}; $data{$h} = ""; }
    }
} else {
    print;
}

И если Вы действительно хотите полную regexp гибкость, выполняете итерации по regexps вместо того, чтобы искать ключ в хеше.

#!/usr/bin/perl -n
BEGIN {
    @regexps = qw(^BEGIN:VCARD\r$ ^VERSION[^A-Z] ^FN[^A-Z] ^N[^A-Z] ... ^END:VCARD\r$);
    for $r (@regexps) { $data{$r} = ""; }
}
for $r (@regexps) {
    next unless $_ =~ $r;
    $data{$r} .= $_;
    last;
}
if ($_ =~ $regexps[@regexps-1]) {
    for $r (@regexps) { print "++", $data{$r}; $data{$r} = ""; }
}
7
03.11.2016, 23:48
2 ответа

Я думаю, что нашел некоторое рабочее решение здесь.

Сценарии Bash, если существует то, что я искал и они, по-видимому, используют wmctrl!

В быстрых целях доступа/архивации I copy-n-paste оба сценария здесь:

Переход к вниманию требующего окна:

#!/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
27.01.2020, 20:19

Есть небольшой рабочий проект C seturgent (спасибо hiltjo). Использование:

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;
}
2
27.01.2020, 20:19

Теги

Похожие вопросы