Obtenha a resolução da tela em que uma janela está ativada em uma configuração de vários monitores

0

Eu tenho 3 monitores configurados (um é 1080p, o outro 900p). Estou editando um script bash de janela que precisa recuperar a resolução da exibição em que uma janela ativa está ativada.

O

link oferece um script para fazer isso, mas retorna um erro. xdotool só retorna a resolução da exibição principal xdpyinfo e xwininfo retornam a resolução total dos 3 displays

Existe alguma solução?

    
por Ogami musashi 03.11.2015 / 13:56

2 respostas

0

Seguindo o conselho da AFH e com base no link e link eu vim com este script que é um pouco complicado porque a minha configuração de 3 telas não é horizontal e primário é de resolução diferente.

#!/bin/bash
# rsizes the window to full height and 50% width and moves into upper right corner


function getActiveWindowID
{
activeWinID=$(xdotool getactivewindow )
echo $activeWinID
}

function getActiveWindowHorizontalPosition
{
activeWinID=$(getActiveWindowID)
xPosLine=$(xwininfo -id $activeWinID | grep "Absolute upper-left X")
xPos=${xPosLine:25}
echo $xPos
}

function getActiveWindowVerticalPosition
{
activeWinID=$(getActiveWindowID)
yPosLine=$(xwininfo -id $activeWinID | grep "Absolute upper-left Y")
yPos=${yPosLine:25}
echo $yPos
}

function getActiveWindowWidth
{
activeWinID=$(getActiveWindowID)
xWidthLine=$(xwininfo -id $activeWinID | grep "Width")
xWidth=${xWidthLine:8}
echo $xWidth
}

function getActiveWindowHeight
{
activeWinID=$(getActiveWindowID)
xHeightLine=$(xwininfo -id $activeWinID | grep "Height")
xHeight=${xHeightLine:8}
echo $xHeight
}

function getActiveWindowCurrentMonitorHorizontal
{

activeWinID=$(getActiveWindowID)
xPos=$(getActiveWindowHorizontalPosition)
yPos=$(getActiveWindowVerticalPosition)



if [ $xPos -ge 1920 ] || [ $yPos -le 900 ]; then


monitorwidth=1440
echo $monitorwidth

else     
monitorwidth=1920
echo $monitorwidth


fi

}

function getActiveWindowCurrentMonitorVertical
{

activeWinID=$(getActiveWindowID)
xPos=$(getActiveWindowHorizontalPosition)
yPos=$(getActiveWindowVerticalPosition)




if [ $xPos -ge 1920 ] || [ $yPos -le 900 ]; then


monitorheight=873 
echo $monitorheight 
else     

monitorheight=1054
echo $monitorheight

fi

}
function getActiveScreenDistHorizontal
{

activeWinID=$(getActiveWindowID)
xPos=$(getActiveWindowHorizontalPosition)
yPos=$(getActiveWindowVerticalPosition)




if [ $xPos -ge 1920 ]; then
activescreendisthorizontal=1920
echo $activescreendisthorizontal
else
if [ $yPos -le 900 ]; then
activescreendisthorizontal=480
echo $activescreendisthorizontal
else
activescreendisthorizontal=0
echo $activescreendisthorizontal
fi
fi  
}

function getActiveScreenDistVertical
{

activeWinID=$(getActiveWindowID)
xPos=$(getActiveWindowHorizontalPosition)
yPos=$(getActiveWindowVerticalPosition)




if [ $xPos -ge 1920 ]; then
activescreendistvertical=438
echo $activescreendisvertical
else
if [ $yPos -le 900 ]; then

activescreendistvertical=0
echo $activescreendistvertical
else
activescreendistvertical=900
echo $activescreendistvertical
fi  
fi  
}

#define MARGINS IN PIXELS
TOPMARGIN=0
RIGHTMARGIN=0
LEFTMARGIN=0
BOTTOMMARGIN=0
# get width of screen and height of screen
SCREEN_WIDTH=$(getActiveWindowCurrentMonitorHorizontal)
SCREEN_HEIGHT=$(getActiveWindowCurrentMonitorVertical)

xPos=$(getActiveWindowHorizontalPosition)
yPos=$(getActiveWindowVerticalPosition)



AVAILABLE_WIDTH=$(( $SCREEN_WIDTH - $RIGHTMARGIN -$LEFTMARGIN))
AVAILABLE_HEIGHT=$(( $SCREEN_HEIGHT - $TOPMARGIN - $BOTTOMMARGIN))

# new width and height
W=$(( $AVAILABLE_WIDTH / 2))

H=$(( $AVAILABLE_HEIGHT))


# Available coordinates
activescreendisthorizontal=$(getActiveScreenDistHorizontal)
activescreendistvertical=$(getActiveScreenDistVertical)

XLEFT=$(($activescreendisthorizontal+$LEFTMARGIN))
XRIGHT=$(($XLEFT+$LEFTMARGIN+$W ))
YTOP=$(($activescreendistvertical+$TOPMARGIN))
YBOTTOM=$(( $TOPMARGIN+$H ))

# Actual new coordinates
X=$XRIGHT
Y=$YTOP

wmctrl -r :ACTIVE: -b remove,maximized_vert,maximized_horz && wmctrl -r 
:ACTIVE: -e 10,$X,$Y,$W,$H                    
    
por 05.11.2015 / 16:19
1

Não sei ao certo o que você quer, mas o seguinte comando obterá a posição e as dimensões do seu shell:

$ wmctrl -plG|grep -E "^[^ ]+ +[^ ]+ $PPID "
0x0560000b  1 2481   10   47   1352 386  Lenovo-Ubuntu Terminal

Isso é simplista, porque funciona apenas a partir do shell inicial; para trabalhar a partir de um sub-shell, você precisará:

$ wmctrl -plG|grep -E "^[^ ]+ +[^ ]+ $(pid=$PPID; until [ "'ps -p $pid -o comm= | grep -i term'" ]; do pid='ps -p $pid -o ppid='; done; echo $pid) "
0x0560000b  1 2481   10   47   1352 386  Lenovo-Ubuntu Terminal

Isso pressupõe que seu terminal contenha term em seu nome: você pode precisar de uma maneira diferente de identificar seu terminal (desculpe a linha longa, mas a maior parte dela está dentro da string de pesquisa).

Você pode descobrir as dimensões de seus monitores conectados digitando:

$ xrandr | grep ' connected'
LVDS1 connected primary 1366x768+0+0 (normal left inverted right x axis y axis) 344mm x 194mm
HDMI1 connected 1920x1080+1366+0 (normal left inverted right x axis y axis) 708mm x 398mm

Após as dimensões, os +0+0 e +1366+0 são os deslocamentos dos eixos X e Y de cada monitor na tela global.

Para descobrir o monitor onde o terminal é exibido, você precisará comparar o eixo X (entre os sinais '+') com o quarto campo na saída wmctrl para encontrar o monitor mais à direita, cujo X o eixo é menor que a posição X do terminal.

Nos exemplos que mostrei, a posição X do terminal é 10 , que é maior que 0 , o eixo X de LVDS1 , mas menor que 1366 , o eixo X de HDMI1 , então o terminal está em LVDS1 cujas dimensões são, portanto, 1366x768 .

Em contraste, o comando wmctrl em um terminal na outra tela deu:

0x0740000f 1 12147 1466 46 2356 966 Lenovo-Ubuntu xterm

Aqui 1466 é maior que ambos os0 e 1366 , então o monitor mais à direita é HDMI1 , com dimensões 1920x1080 .

Observe que um terminal pode ter dois monitores: o que descrevi encontrará o mais à esquerda deles, mas você pode verificar alguns dos outros campos se quiser fazer algo diferente nesse caso.

Você precisará de alguns scripts complexos para fazer as comparações, e eu não pretendo fazer isso para você, mas espero que você tenha informações suficientes para começar.

    
por 03.11.2015 / 18:15