Статистика даст Вам эту информацию:
$ stat current
File: `current' -> `/home/user/releases/build/'
...
Следующий сценарий даст Вам верхние левые экранные 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"
#
Принятый ответ может быть расширен, чтобы получить все окно:
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.
Принятый ответ явно не включает в себя украшение окна. Для тех, которые все еще ищут, как получить геометрию , в том числе Все украшения, согласно титуре этого вопроса, вы можете использовать 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
Использование xdotool:
sleep 3s && xdotool getactivewindow
, у вас есть 3 секунды, чтобы открыть окно
xdotool getwindowgeometry $ WINDOW_ID
xdotool getwindowgeometry -shell $ WINDOW_ID
Намного более простой способ получить текущий размер и положение окна:
xdotool getwindowfocus getwindowgeometry
и для получения выбранного размера и положения окна:
xdotool selectwindow getwindowgeometry
Попробуйте этот код. Сохраните как 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;
}
Если вы хотите выбрать окно мышью, просто запустите
$ 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
Если у вас его нет.
xdotool getactivewindow
возвращает идентификатор окна кадра менеджера окон (который включает художественное оформление), а не клиентское окно, содержавшее в нем. – Adam Spiers 12.02.2015, 02:53xdotool getactivewindow
возвращает идентификатор окна кадра менеджера окон (который включает художественное оформление), а не клиентское окно, содержавшее в нем. – Adam Spiers 12.02.2015, 02:53xdotool getactivewindow getwindowgeometry
– slinkp 27.01.2016, 06:20