Вопрос по – Как узнать, какое окно имеет фокус и как его изменить?

11

Я хотел бы знать, как я могу спросить X11, какие окна имеют фокус. И если по какой-либо причине мое собственное приложение (которое может быть видимым или нет) получило фокус, я хочу, чтобы прежние окна снова получили фокус.

Например, мое приложение работает со многими другими (например, firefox, gvim, nautilus, ...)

Предположим, что сначала Firefox сфокусировался на том, что пользователь нажал на мое приложение, которое теперь имеет фокус. Я хочу, чтобы мое приложение снова сфокусировалось на Firefox.

Кто-нибудь знает, как этого добиться? Книги с рекомендациями были бы очень хорошими.

Большое спасибо.

Ваш Ответ

4   ответа
6

XQueryTree найти текущее активное или самое верхнее окно.

Вот функция, которая при отображении отображает текущее окно в фокусе:

static Window
GetCurrWindow(d)
Display *d;
{
Window foo;
Window win;
int bar;

    do{
    (void) XQueryPointer(d, DefaultRootWindow(d), &foo, &win,
        &bar, &bar, &bar, &bar, &bar);
    } while(win <= 0);


#ifdef VROOT
    {
    int n;
    Window *wins;
    XWindowAttributes xwa;

    (void) fputs("=xwa=", stdout);

    /* do{  */
        XQueryTree(d, win, &foo, &foo, &wins, &n);
    /* } while(wins <= 0); */
    bar=0;
    while(--n >= 0) {
        XGetWindowAttributes(d, wins[n], &xwa);
        if( (xwa.width * xwa.height) > bar) {
        win = wins[n];
        bar = xwa.width * xwa.height;
        }
        n--;
    }
    XFree(wins);
    }
#endif
    return(win);
}

http://tronche.com/gui/x/xlib/window-information/XQueryTree.html

Я нашел источник:

http://examples.oreilly.com/networksa/tools/xsnoop.c

Good Luck

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded Marcio Andrey Oliveira
Error: User Rate Limit Exceeded Marcio Andrey Oliveira
Error: User Rate Limit Exceeded
9

XGetInputFocus вызов.

Window focused;
int revert_to;

XGetInputFocus(dpy, &focused, &revert_to);

В этом фрагментеfocused будет окно с текущим фокусом ввода, получение событий клавиатуры и нажатий кнопок мыши.

Это будет работать, даже если оконный менеджер не устанавливает_NET_ACTIVE_WINDOW свойство в корневом окне, как указано в EWMH. Несколько оконных менеджеров, таких как dwm и my 9wm, не устанавливают это.

Error: User Rate Limit ExceededXSetInputFocusError: User Rate Limit ExceededXSetInputFocus(display, window_to_focus, RevertToNone, CurrentTime);
1

о много запросов, элементов управления и даже хуков.

> xdotool getwindowfocus               # 29360135
> xdotool getwindowfocus getwindowpid  # 12988
> xdotool getwindowfocus getwindowname # tilda
> xdotool getwindowfocus behave '%@' blur getmouselocation
#      or focus, mouse-enter, etc.
x:514 y:317 screen:0 window:56623121
x:271 y:26 screen:0 window:56623121
...

Команды какbehave принять обратный вызов, который может быть встроен какgetmouselocation или внешний, какexec notify-send 'focused window', exec zsh myscript.zshи т. д., однако вы хотите использовать его.

Изменить - вы можете сосредоточиться, используяxdotool windowfocus [options] [window], как вxdotool search --class firefox windowfocus, В моем случае это приводит к ошибкам, поскольку Firefox отображается в виде пары дюжин «окон», но у всех одинаковый PID; это работает с правильным ID. Надеюсь, это начало.

Изменить 2 - «идентификатор окна» является десятичным представлением указателя окна, например, отxprop:

> xprop -root _NET_ACTIVE_WINDOW
_NET_ACTIVE_WINDOW(WINDOW): window id # 0x1c00007, 0x0
> xdotool getwindowfocus
29360135
> printf '%d\n' '0x1c00007'
29360135
17

Посмотрите на_NET_ACTIVE_WINDOW значение корневого окна, которое задается большинством современных оконных менеджеров:

xprop -root _NET_ACTIVE_WINDOW

Это значение, конечно, можно получить с помощью вызовов библиотеки Xlib.

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