Получите полные размеры окна (включая украшения) в Unity

Я использовал ответ « Как найти размеры окна и положение точно, включая украшения? в моих сценариях bash, и имел хороший успех с моим приложением Silentcast на Xfce, но теперь, когда другие его используют, они обнаруживают некоторые проблемы в Ubuntu 14.04, Unity. Вот одна проблема, вызванная выходом:

xwininfo -id $(xdotool getactivewindow) 

Показаны:

 Relative upper-left X: 0 Relative upper-left Y: 0 

Который я использую, чтобы рассчитать ширину границ и высоту заголовка. Их не должно быть 0.

Кто-нибудь знает, как получить ширину границ окна и высоту заголовка в Unity для Ubuntu 14.04.

Или, как напрямую получить полные размеры окна?

Я подал ошибку против xorg для пакета xwininfo https://bugs.freedesktop.org/show_bug.cgi?id=84348

Я также узнал информацию о создании вашей собственной темы в Unity под Ubuntu 14.04: https://wiki.ubuntu.com/Unity/Theming

Кажется, что ответ находится в той тематической странице где-то, но я пока этого не понимаю, тем более что я не использую Ubuntu или Unity.

Я также задал этот вопрос в stackoverflow и получил хороший ответ, который был отмечен как правильный и выше: https://stackoverflow.com/a/26060527/1707904

Это относится и к compiz. Есть несколько способов, которыми вы можете получить эти данные в некотором смысле:

 wnckprop --xid=$(xdotool getactivewindow) 

В противном случае вы можете просто смешать значение Absolute, которое вы получаете от xwininfo, вместе с размером доступных украшений:

 xprop _NET_FRAME_EXTENTS -id $(xdotool getactivewindow) 

Для вашей информации, если вы хотите получить полный размер кадра, включая область ввода вокруг окна, вы можете использовать xwininfo -frame

После экспериментов я лучше понимаю, что означает «область ввода» в Ubuntu. Поскольку размер по умолчанию для границы равен 0, вокруг окна есть область размером 10 пикселей, где вы можете захватить окно для изменения размера. Он может иметь другие цели, но область ввода в основном действует как невидимая граница 10 пикселей. Итак, Absolute от xwininfo дает внутреннее окно, в то время как xwininfo -frame дает все окно, включая заголовок и дополнительные 10 пикселей вокруг (если область ввода 10 пикселей). Xprop … дает только размер украшений, не включая область ввода. Таким образом, все 3 команды необходимы, чтобы получить полную картину геометрии окна.

Вот код, который я использовал (он игнорирует невидимую область ввода):

 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