كيف تعرف النافذة التي تركز عليها وكيفية تغييرها؟
-
06-07-2019 - |
سؤال
أود أن أعرف كيف يمكنني أن أسأل X11 عن النوافذ التي تركز عليها.وإذا حصل تطبيقي الخاص (الذي قد يكون مرئيًا أم لا) لأي سبب من الأسباب على التركيز، فأنا أريد أن أتمكن من السماح للنوافذ السابقة بالتركيز مرة أخرى.
على سبيل المثال، تطبيقي يعمل مع العديد من التطبيقات الأخرى (على سبيل المثال.فايرفوكس، gvim، نوتيلوس، ...)
لنفترض أنه في البداية تم التركيز على متصفح فايرفوكس وأن المستخدم نقر على تطبيقي الذي تم التركيز عليه الآن.أريد أن يركز تطبيقي على فايرفوكس مرة أخرى.
هل يعرف أحد كيفية تحقيق ذلك؟توصيات الكتب ستكون جميلة جدًا.
شكرًا جزيلاً.
المحلول
استخدم هذا 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
تكون نافذة مع التركيز المدخلات الحالية، والحصول على أحداث لوحة المفاتيح وتضغط على زر الماوس.
وهذا سيعمل حتى لو كان مدير النوافذ لا تعيين الخاصية _NET_ACTIVE_WINDOW
على النافذة الجذر، على النحو الذي يحدده EWMH. هناك عدد قليل من مديري النافذة، مثل دوم وبلدي 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
. في حالتي هذه يسبب الأخطاء لفايرفوكس يظهر كما بضع عشرات 'ويندوز'، ولكن كل لها نفس 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