كيف تعرف النافذة التي تركز عليها وكيفية تغييرها؟

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

  •  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
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top