어떤 창이 초점이 있고 그것을 변경하는 방법을 아는 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/1014822

  •  06-07-2019
  •  | 
  •  

문제

X11에 어떤 초점이 있는지 물어볼 수있는 방법을 알고 싶습니다. 그리고 어떤 이유로 든 내 자신의 응용 프로그램 (눈에 띄지 않을 수도 있음)이 초점을 맞추면 이전 창이 다시 초점을 맞추도록 할 수 있기를 원합니다.

예를 들어, 내 응용 프로그램은 다른 많은 사람들과 함께 실행 중입니다 (예 : Firefox, GVIM, Nautilus, ...)

첫 번째 Firefox가 초점을 맞추고 사용자가 내 앱을 클릭했다고 가정합니다. 내 응용 프로그램이 다시 Firefox에 초점을 맞추기를 원합니다.

누구든지 이것을 달성하는 방법을 알고 있습니까? 책 추천은 매우 좋을 것입니다.

정말 감사합니다.

도움이 되었습니까?

해결책

이것을 사용하십시오 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

행운을 빕니다

다른 팁

살펴보십시오 _NET_ACTIVE_WINDOW 대부분의 최신 창 관리자가 설정 한 루트 창의 값 :

xprop -root _NET_ACTIVE_WINDOW

물론이 값은 XLIB 라이브러리 호출을 사용하여 얻을 수 있습니다.

당신은 아마도 원합니다 XGetInputFocus 전화.

Window focused;
int revert_to;

XGetInputFocus(dpy, &focused, &revert_to);

이 스 니펫에서 focused 현재 입력 초점이있는 창이되며 키보드 이벤트가 발생하고 마우스 버튼을 누릅니다.

Window Manager가 설정하지 않더라도 작동합니다. _NET_ACTIVE_WINDOW EWMH가 지정한 루트 창의 속성. DWM 및 My 9WM과 같은 몇몇 창 관리자는 이것을 설정하지 않습니다.

XDOTool이라는 응용 프로그램을 권장합니다. 그것은 많은 쿼리, 컨트롤 및 고리를 지원합니다.

> 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가 수십 개의 'Windows'로 나타나기 때문에 이것은 오류가 발생하지만 모두 동일한 PID를 가지고 있습니다. 올바른 ID가 주어지면 작동합니다. 바라건대 그것은 시작입니다.

편집 2- '창 ID'는 창 포인터의 소수점 표현입니다. xprop:

> xprop -root _NET_ACTIVE_WINDOW
_NET_ACTIVE_WINDOW(WINDOW): window id # 0x1c00007, 0x0
> xdotool getwindowfocus
29360135
> printf '%d\n' '0x1c00007'
29360135
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top