Как я нахожу размеры окна и положение точно включая художественные оформления?

Статистика даст Вам эту информацию:

$ stat current
  File: `current' -> `/home/user/releases/build/'
  ...
37
12.12.2014, 23:21
7 ответов

Следующий сценарий даст Вам верхние левые экранные co-порядки и размер окна (без любого художественного оформления).... xwininfo -id $(xdotool getactivewindow) содержит достаточно информации для Вас.


#!/bin/bash
# Get the coordinates of the active window's
#    top-left corner, and the window's size.
#    This excludes the window decoration.
  unset x y w h
  eval $(xwininfo -id $(xdotool getactivewindow) |
    sed -n -e "s/^ \+Absolute upper-left X: \+\([0-9]\+\).*/x=\1/p" \
           -e "s/^ \+Absolute upper-left Y: \+\([0-9]\+\).*/y=\1/p" \
           -e "s/^ \+Width: \+\([0-9]\+\).*/w=\1/p" \
           -e "s/^ \+Height: \+\([0-9]\+\).*/h=\1/p" )
  echo -n "$x $y $w $h"
#
36
27.01.2020, 19:36
  • 1
    Это, кажется, работает потому что xdotool getactivewindow возвращает идентификатор окна кадра менеджера окон (который включает художественное оформление), а не клиентское окно, содержавшее в нем. –  Adam Spiers 12.02.2015, 02:53
  • 2
    Это, кажется, работает потому что xdotool getactivewindow возвращает идентификатор окна кадра менеджера окон (который включает художественное оформление), а не клиентское окно, содержавшее в нем. –  Adam Spiers 12.02.2015, 02:53
  • 3
    Нет, это возвращает геометрию без художественных оформлений, которая является явно не что вопрос, который задают. Если Вы не хотите включенные художественные оформления, существуют более легкие способы сделать это, например xdotool getactivewindow getwindowgeometry –  slinkp 27.01.2016, 06:20
  • 4
    Это не работает хорошо на меня (т.е. художественные оформления не включены). Этот ответ лучше. –  Jan Warchoł 18.01.2017, 21:24

Принятый ответ может быть расширен, чтобы получить все окно:

entire=false
x=0
y=0
w=0
h=0
b=0  # b for border
t=0  # t for title (or top)

# ... find out what user wants then 

eval $(xwininfo -id $(xdotool getactivewindow) |
  sed -n -e "s/^ \+Absolute upper-left X: \+\([0-9]\+\).*/x=\1/p" \
         -e "s/^ \+Absolute upper-left Y: \+\([0-9]\+\).*/y=\1/p" \
         -e "s/^ \+Width: \+\([0-9]\+\).*/w=\1/p" \
         -e "s/^ \+Height: \+\([0-9]\+\).*/h=\1/p" \
         -e "s/^ \+Relative upper-left X: \+\([0-9]\+\).*/b=\1/p" \
         -e "s/^ \+Relative upper-left Y: \+\([0-9]\+\).*/t=\1/p" )
if [ "$entire" = true ]
then                     # if user wanted entire window, adjust x,y,w and h
    let x=$x-$b
    let y=$y-$t
    let w=$w+2*$b
    let h=$h+$t+$b
fi
echo "$w"x"$h" $x,$y

Несмотря на простоту, оказалось, что он не работает в Unity в Ubuntu 14.04, потому что относительная информация равна нулю. Я попросил Получить полные размеры окна (включая украшения) в Unity и получил хороший ответ. Вот как я использовал этот ответ:

aw=$(xdotool getactivewindow)
eval $(xwininfo -id "$aw" |
      sed -n -e "s/^ \+Absolute upper-left X: \+\([0-9]\+\).*/x=\1/p" \
             -e "s/^ \+Absolute upper-left Y: \+\([0-9]\+\).*/y=\1/p" \
             -e "s/^ \+Width: \+\([0-9]\+\).*/w=\1/p" \
             -e "s/^ \+Height: \+\([0-9]\+\).*/h=\1/p" )
if [ "$entire" = true ]
then
    extents=$(xprop _NET_FRAME_EXTENTS -id "$aw" | grep "NET_FRAME_EXTENTS" | cut -d '=' -f 2 | tr -d ' ')
    bl=$(echo $extents | cut -d ',' -f 1) # width of left border
    br=$(echo $extents | cut -d ',' -f 2) # width of right border
    t=$(echo $extents | cut -d ',' -f 3)  # height of title bar
    bb=$(echo $extents | cut -d ',' -f 4) # height of bottom border

    let x=$x-$bl
    let y=$y-$t
    let w=$w+$bl+$br
    let h=$h+$t+$bb
fi

Этот второй метод работает как в Unity, так и в Xfce, а также должен работать в Gnome.

7
27.01.2020, 19:36

Принятый ответ явно не включает в себя украшение окна. Для тех, которые все еще ищут, как получить геометрию , в том числе Все украшения, согласно титуре этого вопроса, вы можете использовать WMIFACE в соответствии с этим другим вопросом HTTPS: // Superuser. com / options / 164047 / Как-to-get-точные-оконные информационные измерители-etc-in-linux-x . Пример:

wmiface frameGeometry `wmiface activeWindow`

Это возвращает геометрию и положение относительно вверху в верхнем, как:

650x437+0+1003

Wmiface, похоже, не поставляется со всеми дистрибутивами Linux (я не нашел пакет, предоставляющую его на мяту или Ubuntu), но я смог Установите его из пакетов здесь: http://kde-apps.org/content/show.php?content=40425

И он поставляется без документов ни даже - помогите , Но readme здесь:

https://gitorious.org/wmiface/wmiface/source/ea941eeb2076124734f6a3d3079326c826b462d7:readme

3
27.01.2020, 19:36

Использование xdotool:

  • Сначала вам нужно получить идентификатор окна:

sleep 3s && xdotool getactivewindow , у вас есть 3 секунды, чтобы открыть окно

  • Затем вам нужно использовать:
    1. для вывода информации используйте это: xdotool getwindowgeometry $ WINDOW_ID
    2. или, если вы хотите, чтобы параметр оболочки использовал это: xdotool getwindowgeometry -shell $ WINDOW_ID
3
27.01.2020, 19:36

Намного более простой способ получить текущий размер и положение окна:

xdotool getwindowfocus getwindowgeometry

и для получения выбранного размера и положения окна:

xdotool selectwindow getwindowgeometry
24
27.01.2020, 19:36

Попробуйте этот код. Сохраните как xgeometry.cи скомпилируйте с gcc -o xgeometry xgeometry.c -lX11 -lXt. Программа принимает один или несколько идентификаторов окон (в десятичном, шестнадцатеричном или восьмеричном формате )в качестве аргументов и выводит через пробел идентификатор окна (в шестнадцатеричном формате ), позицию X, позицию Y, ширину, высота и ширина границы (обычно нулевые — это не то, что оконный менеджер ставит на окно ). X, Y, ширина и высота включают декорации оконного менеджера, по крайней мере, в случае, когда wmctrlиспользует эти числа для позиционирования.

Интересно, что wmctrl -e, по крайней мере, при использовании с xfwm, требует позиции X и Y от этой программы, а также ширину и высоту, возвращаемые wmctrl -l -G, для того, чтобы wmctrl -eне перемещало окно. Я не тестировал другие оконные менеджеры, поэтому результаты могут отличаться.

#include <stdio.h>
#include <stdlib.h>
#include <X11/Xlib.h>
#include <X11/Intrinsic.h>

int
main(int argc, char **argv)
{
    XtAppContext app;
    Display *display;
    int status = 0;

    app = XtCreateApplicationContext();
    display = XtOpenDisplay(app, 0, argv[0], "xgeometry", 0, 0, &argc, argv);

    if (display)
    {
        while (--argc)
        {
            char const *idstring = *++argv;
            char *endptr = 0;
            unsigned long id;

            if (idstring[0] != '0')
                id = strtoul(idstring, &endptr, 10);
            else if (idstring[1] == 'x' || idstring[1] == 'X')
                id = strtoul(idstring + 2, &endptr, 16);
            else
                id = strtoul(idstring + 1, &endptr, 8);
            if (*endptr)
            {
                fprintf(stderr, "Invalid window id: %s\n", idstring);
                status = 1;
            }
            else
            {
                Window win = (Window) id;

                while (1)
                {
                    Window parent;
                    Window  root;
                    Window *children;
                    int nchildren;
                    

                    if (!XQueryTree(display, win, &root, &parent, &children, &nchildren))
                    {
                        fprintf(stderr, "Error finding top level window for %08lx", id);
                        status = 1;
                        break;
                    }
                    XFree(children);
                    if (parent == root)
                    {
                        int x, y;
                        unsigned w, h;
                        unsigned border;
                        unsigned depth;

                        if (XGetGeometry(display, win, &root, &x, &y, &w, &h, &border, &depth))
                        {
                            printf("0x%08lx %d %d %u %u %u\n", id, x, y, w, h, border);
                        }
                        else
                        {
                            fprintf(stderr, "Could not get location of window 0x%08lx\n", id);
                            status = 1;
                        }
                        break;
                    }
                    win = parent;
                }
            }

        }
        XtCloseDisplay(display);
    }
    else
    {
        fprintf(stderr, "Cannot open display\n");
        status = 1;
    }

    XtDestroyApplicationContext(app);

    return status;
}
3
15.07.2020, 23:45

Если вы хотите выбрать окно мышью, просто запустите

$ xwininfo

Щелкните по нужному окну. Он дает много информации и геометрии, включая декорации в формате, который можно просто скопировать -и вставить в другие программы, такие как xterm. например.

xwininfo: Please select the window about which you
          would like information by clicking the
          mouse in that window.

xwininfo: Window id: 0x160000d "watch"

  Absolute upper-left X:  1184
  Absolute upper-left Y:  215
  Relative upper-left X:  0
  Relative upper-left Y:  0
  Width: 484
  Height: 615
  Depth: 24
  Visual: 0x21
  Visual Class: TrueColor
  Border width: 0
  Class: InputOutput
  Colormap: 0x20 (installed)
  Bit Gravity State: NorthWestGravity
  Window Gravity State: NorthWestGravity
  Backing Store State: NotUseful
  Save Under State: no
  Map State: IsViewable
  Override Redirect State: no
  Corners:  +1184+215  -2812+215  -2812-1150  +1184-1150
  -geometry 80x47+1178+188

Затем вы можете поместить следующее в свой.xinitrc или аналогичный файл:

xterm -geometry 80x47+1178+188 -bg black -fg white -T sensors -e watch -n10 -d "sensors;"

Параметр -geometryинтерпретируется почти каждым X-приложением.

Если вы не получаете точную геометрию, это связано с тем, что рассматриваемое окно рисует свои собственные украшения, о которых оконная система не знает, поэтому вам придется проверить настройки для рассматриваемого приложения и соответствующим образом настроить.

В Debian это из:

$ dpkg -S xwininfo
x11-utils: /usr/bin/xwininfo
x11-utils: /usr/share/man/man1/xwininfo.1.gz

Так просто

$ apt install x11-utils

Если у вас его нет.

1
04.02.2021, 05:25

Теги

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