어떤 창이 초점이 있고 그것을 변경하는 방법을 아는 방법은 무엇입니까?
-
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