organiza janelas por script

0

Estou usando meu laptop em diferentes configurações. Às vezes eu estou usando apenas laptop, com saída LVDS1. Às vezes eu tenho um monitor (DP1) à direita do LVDS. Às vezes à esquerda. Às vezes eu tenho dois monitores (DP2 / DP3) - um à esquerda e outro à direita do LVDS

Eu gostaria de configurar minha área de trabalho para esse ambiente. Eu quero o painel xfce sempre no LVDS, navegador da web - sempre no monitor externo (e se forem 2 monitores - à direita), comunicador (pidgin) na esquerda (DP2) ou LVDS se não houver monitor esquerdo.

Eu preparei um conjunto de scripts para configurar o xserver usando xrandr - para todas as configurações. posição do painel que estou configurando pelo xfconf-query.

Mas - como mover um aplicativo específico para um monitor específico? Por exemplo - como executar todos os aplicativos pidgin para o DP2? Eu não quero fazer isso por mouse - eu quero mover todos os clientes xwindow filtrados para exibição específica. É possível?

    
por undefine 06.10.2015 / 09:21

2 respostas

3

Se o seu objetivo principal é evitar o uso do mouse, esse script permite um atalho de teclado para mover as janelas entre os monitores. Ele funciona muito bem para mim na minha configuração de monitor triplo. Em seguida, você pode atribuir um atalho de teclado ao bloco depois de se mudar para um novo monitor.

  1. Faça o download do script abaixo. Salvar em ~ / bin /
  2. Torne-o executável: chmod + x ~ / bin / mover para o próximo monitor

Fonte: link . Graças a jc00ke!

#!/bin/sh
#
# Move the current window to the next monitor.
#
# Also works only on one X screen (which is the most common case).
#
# Props to
# http://icyrock.com/blog/2012/05/xubuntu-moving-windows-between-monitors/
#
# Unfortunately, both "xdotool getwindowgeometry --shell $window_id" and
# checking "-geometry" of "xwininfo -id $window_id" are not sufficient, as
# the first command does not respect panel/decoration offsets and the second
# will sometimes give a "-0-0" geometry. This is why we resort to "xwininfo".
# Make sure your largest monitor is set to Primary display.

screen_width='xdpyinfo | awk '/dimensions:/ { print $2; exit }' | cut -d"x" -f1'
screen_height='xdpyinfo | awk '/dimensions:/ { print $2; exit }' | cut -d"x" -f2'
display_width='xdotool getdisplaygeometry | cut -d" " -f1'
display_height='xdotool getdisplaygeometry | cut -d" " -f2'
window_id='xdotool getactivewindow'

# Remember if it was maximized.
window_state='xprop -id $window_id _NET_WM_STATE | awk '{ print $3 }''

# Un-maximize current window so that we can move it
wmctrl -ir $window_id -b remove,maximized_vert,maximized_horz

# Read window position
x='xwininfo -id $window_id | awk '/Absolute upper-left X:/ { print $4 }''
y='xwininfo -id $window_id | awk '/Absolute upper-left Y:/ { print $4 }''

# Subtract any offsets caused by panels or window decorations
x_offset='xwininfo -id $window_id | awk '/Relative upper-left X:/ { print $4 }''
y_offset='xwininfo -id $window_id | awk '/Relative upper-left Y:/ { print $4 }''
x='expr $x - $x_offset'
y='expr $y - $y_offset'

# Compute new X position
new_x='expr $x + $display_width'
# Compute new Y position
new_y='expr $y + $display_height'

# If we would move off the right-most monitor, we set it to the left one.
# We also respect the window's width here: moving a window off more than half its width won't happen.
width='xdotool getwindowgeometry $window_id | awk '/Geometry:/ { print $2 }'|cut -d"x" -f1'
if [ 'expr $new_x + $width / 2' -gt $screen_width ]; then
  new_x='expr $new_x - $screen_width'
fi

height='xdotool getwindowgeometry $window_id | awk '/Geometry:/ { print $2 }'|cut -d"x" -f2'
if [ 'expr $new_y + $height / 2' -gt $screen_height ]; then
  new_y='expr $new_y - $screen_height'
fi

# Don't move off the left side.
if [ $new_x -lt 0 ]; then
  new_x=0
fi

# Don't move off the bottom
if [ $new_y -lt 0 ]; then
  new_y=0
fi

# Move the window
xdotool windowmove $window_id $new_x $new_y

# Maintain if window was maximized or not
if [ "${window_state}" = "_NET_WM_STATE_MAXIMIZED_HORZ," ]; then
    wmctrl -ir $window_id -b add,maximized_vert,maximized_horz
fi
  1. Se ainda não estiver instalado, instale o xdotool e o wmctrl: sudo apt-get install xdotool wmctrl
  2. Em seguida, atribua um atalho de teclado para o script em Teclado > Atalhos de aplicativos. (Eu uso Alt + Direita. Em seguida, para lado direito, uso Ctrl + Alt + Direita e para a esquerda, Ctrl + Alt + Esquerda. Os atalhos de teclado na janela estão no Gerenciador de Janelas.)
    Fonte: link

Para monitores de tamanhos diferentes
Eu tenho um monitor central de 1920x1080 e dois monitores laterais de 1440x900.

display_width='xdotool getdisplaygeometry | cut -d" " -f1'
display_height='xdotool getdisplaygeometry | cut -d" " -f2'

Os dois comandos acima exibem as dimensões do meu maior monitor, mesmo que a janela esteja em um monitor lateral. Portanto, o script sempre movia a janela de acordo com essas dimensões. Isso fazia com que o script nem sempre fosse movido para o próximo monitor, mas às vezes ele se movia para o monitor anterior. Eu tirei a largura total da tela (4800) e dividi-a por três. Agora ele sempre passa para o próximo monitor.

display_width="1600"
display_height='xdotool getdisplaygeometry | cut -d" " -f2'
    
por jbrock 07.10.2015 / 19:39
1

Por algum motivo, posso adicionar uma resposta, mas não posso comentar a resposta do jbrock acima ...

no meu equipamento (Fedora 22), xprop -id $window_id _NET_WM_STATE retorna "_NET_WM_STATE_FOCUSED" ao invés de nada para janelas não maximizadas, então o script como sempre maximiza a janela depois de movê-lo.

Além disso, é possível que uma janela seja maximizada em apenas uma direção, mas o script sempre aplica as duas direções no final.

Para restaurar a janela exatamente para o estado de maximização em que estava antes, teste os dois sinalizadores explicitamente e adicione-os de volta individualmente. Substitua as últimas 3 linhas do script original por:

if [[ $window_state = *MAXIMIZED_HORZ* ]]; then
  wmctrl -ir $window_id -b add,maximized_horz
fi
if [[ $window_state = *MAXIMIZED_VERT* ]]; then
  wmctrl -ir $window_id -b add,maximized_vert
fi
    
por Funkster 07.01.2016 / 17:12