Como posso minimizar janelas, apenas em um monitor específico?

5

Eu tenho monitor e tela do laptop e tenho um problema com a função "Mostrar área de trabalho".

A tela do laptop está mostrando um widget que deve permanecer o tempo todo. O monitor principal é usado normalmente.

Sempre que eu uso o atalho de teclado (tecla do windows + d no meu caso), todas as janelas ficarão ocultas, mas eu quero apenas ocultar todas as janelas no monitor específico.

Isso é possível?

Pergunta semelhante a link , com uma diferença notável que eu pergunto sobre diferentes sistemas operacionais.

    
por Mateusz Konieczny 30.06.2016 / 17:33

2 respostas

3

Apenas minimize as janelas em uma tela

O script abaixo pode ser usado para (apenas) minimizar as janelas na tela esquerda ou somente na tela da direita.

O script é executado com 1 ou 2 como argumento, dependendo de qual tela você deseja minimizar as janelas.

O script

#!/usr/bin/env python3
import subprocess
import sys

scr = sys.argv[1]

def get(cmd):
    return subprocess.check_output(cmd).decode("utf-8")

# find the right side of the left screen
edge = [int(s.split("x")[0]) for s in get("xrandr").split() if "+0+" in s][0]
# read the window list
wlist = [w.split() for w in get(["wmctrl", "-lG"]).splitlines()]
for w in wlist:
    # retrieve the window id and -position
    w_id = w[0]; xpos = int(w[2])
    # check the position of the window, decide action depending on arg.
    test = xpos < edge if scr == "1" else xpos >= edge
    if test:
        # check if the window is "normal" and / or minimized
        w_data = get(["xprop", "-id", w_id])
        if all([not "_NET_WM_STATE_HIDDEN" in w_data,
                    "_NET_WM_WINDOW_TYPE_NORMAL" in w_data]):
            subprocess.Popen(["xdotool", "windowminimize", w_id])

Como usar

  1. O script precisa dos dois wmctrl e xdotool

    sudo apt-get install xdotool wmctrl
    
  2. Copie o script em um arquivo vazio, salve-o como min_screen.py

  3. Para executá-lo:

    python3 /path/to/min_screen.py 1
    

    para minimizar as janelas na tela esquerda e

    python3 /path/to/min_screen.py 2 
    

    para minimizar as janelas apenas na tela da direita

  4. Se tudo funcionar bem, adicione-o a uma tecla de atalho

Notas

  • O script assume que o python3 está instalado, mas o código não é específico do python3, acredito.
  • O script foi escrito em Unity , mas, diferentemente das áreas de trabalho (viewports), o tratamento das telas não deve fazer diferença.
  • O script não minimiza as janelas com pid 0 (Idle ou outras tkinter windows por exemplo). Se isso é um problema, por favor mencione. Pode ser resolvido.

Explicação

O script primeiro procura a borda direita da tela esquerda, procurando a string com +0+ na saída de xrandr , como:

1680x1050+0+0

A primeira seção, 1680 , é a largura da tela esquerda. Posteriormente, tudo o que temos a fazer é olhar a lista de janelas ( wmctrl -lG ) e ver qual das janelas está "abaixo" ou "acima" 1680 , e agir de acordo, minimizando com o comando xdotool windowminimize <window_id> (ou não ).

O "teste" finalmente ( mmiz ): xprop -id <window_id> é verificar se estamos lidando com uma janela "normal" (em vez de, por exemplo, sua área de trabalho, que também é listada como uma janela), e se a janela já está minimizado.

Veja também o comentário no script.

Vinculando o script a um atalho de teclado

1. No Lubuntu

Para editar os atalhos de teclado globais no Lubuntu, consulte Lubuntu minimizar todos os atalhos de teclado da área de trabalho da área de trabalho

Neste caso: salve o script desta resposta em um arquivo no computador, torne este arquivo executável, abra /.config/openbox/lubuntu-rc.xml e substitua

  <keybind key="W-d">
    <action name="ToggleShowDesktop"/>
  </keybind>

por

  <action name="Execute">
   <command>/path/to/show_desktop.py 1</command>
  </action>

em que /path/to/show_desktop.py é (é claro) o caminho para o script e 1 ou 2 da tela segmentada. Torne o script executável .

Reinicie o computador para recarregar a configuração.

2. Unidade / Gnomo

Torne o script executável e escolha: Configurações do sistema > "Teclado" > "Atalhos" > "Atalhos personalizados". Clique no botão "+" e adicione o comando:

/path/to/show_desktop.py 1

... para um atalho de sua escolha

    
por Jacob Vlijm 30.06.2016 / 20:06
2

Introdução

O script abaixo permite que o usuário clique em uma exibição que deseja e todas as janelas nessa exibição serão minimizadas. Este script deve ser vinculado a um atalho de teclado, mas pode ser executado manualmente, se desejado.

O uso é simples:

  1. ativar o script, o cursor do mouse se transformará em uma cruz
  2. Clique em qualquer janela do programa (mas não na área de trabalho) no monitor que você deseja minimizar.
  3. O script determinará todas as janelas nessa exibição e minimizará (as iconificará).

O programa não requer nenhum pacote adicional para ser instalado. O script foi testado no Ubuntu 16.04 LTS regular e no Lubuntu 16.04 LTS. Obrigado ao @JourneymanGeek por testá-lo no Fedora 24 com o KDE também!

Obtendo o código fonte do script

O código-fonte do script pode ser obtido copiando-o manualmente aqui ou obtendo-o do meu repositório github . Para obtê-lo via git , siga estas etapas:

  1. sudo apt-get install git
  2. cd /opt ; sudo git clone https://github.com/SergKolo/sergrep.git
  3. sudo chmod -R +x sergrep

O arquivo será chamado de minimize_display_windows.py . Certifique-se de vincular isso a um atalho de teclado para fornecer o caminho completo para o script. Por exemplo, assim:

 python /opt/sergrep/minimize_display_windows.py

Código-fonte

Garanta que o arquivo para o qual você salvou este código tenha permissões executáveis.

#!/usr/bin/env python
#
###########################################################
# Author: Serg Kolo , contact: [email protected] 
# Date: July 3, 2016
# Purpose:  Minimize windows on a display which user clicks
# Written for: http://askubuntu.com/q/793195/295286  
# Tested on: Ubuntu 16.04 LTS,Lubuntu 16.04 Virtual Machine
###########################################################
# Copyright: Serg Kolo , 2016
#    
#     Permission to use,copy,modify,and distribute this software is hereby granted
#     without fee, provided that  the copyright notice above and this permission statement
#     appear in all copies.
#
#     THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
#     IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
#     FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
#     THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
#     LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
#     FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
#     DEALINGS IN THE SOFTWARE.
#
#     https://opensource.org/licenses/MIT

from gi.repository import GdkX11,Gdk
import subprocess

def run_sh(cmd):
    # reusable function to 
    # run shell commands
    # Returns stdout of the
    # process
    proc = subprocess.Popen(cmd, shell=True,stdout=subprocess.PIPE)
    out = proc.stdout.read().strip()
    return out 

# First,let the user click on any window
# on the monitor which they want to minimize.
# For that we need to extract integer XID of
# the window from xwininfo output.
# Basically,same as xwininfo -int | awk '/Window id/{print $4}'

user_selected = ""
for item in run_sh("xwininfo -int").split("\n"):
    if "Window id" in item:
       user_selected = item.split()[3]

# Here we basically get all the windows on the screen,
# and check if their XID matches the one user selected
# Once we find that window, we need to know to what display
# that window belongs. 
screen =  Gdk.Screen.get_default()
for window in screen.get_window_stack():
    if str(window.get_xid()) == user_selected:
       close_screen = int(screen.get_monitor_at_window(window))

# We know which display to close now. Loop over all
# windows again, and if they're on the same display
# the one that user chose - iconify it ( in X11 terminology
# that means minimize the window  )
for window in screen.get_window_stack():
    if screen.get_monitor_at_window(window) == close_screen :
       window.iconify()

Demo

Uma breve gravação do script em ação pode ser encontrada no meu canal do youtube

Notas laterais

Originalmente, escrevi outro script, mas ele só pode ser usado no Unity e requer que o xdotool esteja presente. Para os interessados, é publicado como gist

    
por Sergiy Kolodyazhnyy 03.07.2016 / 11:13