web-dev-qa-db-fra.com

Comment puis-je réduire les fenêtres, uniquement sur un moniteur spécifique?

J'ai un moniteur et un écran d'ordinateur portable et j'ai un problème avec la fonction "Afficher le bureau".

L'écran de l'ordinateur portable affiche un widget qui doit rester en permanence. Le moniteur principal est utilisé normalement.

Chaque fois que j'utilise un raccourci clavier (touche Windows + d dans mon cas), toutes les fenêtres sont masquées, mais je souhaite uniquement masquer toutes les fenêtres du moniteur spécifique.

Est-ce possible?

Question similaire à https://superuser.com/questions/200945/how-can-i-make-the-show-desktop-function-only-hide-the-windows-on- a-specific-m , avec une différence notable que je pose à propos d'un système d'exploitation différent.

5
Mateusz Konieczny

Réduire uniquement les fenêtres sur un seul écran

Le script ci-dessous peut être utilisé pour (seulement) minimiser les fenêtres sur l’écran de gauche ou uniquement sur celui de droite.

Le script est exécuté avec un argument _1_ ou _2_ en tant qu'argument, en fonction de l'écran avec lequel vous souhaitez réduire les fenêtres.

Le scénario

_#!/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])
_

Comment utiliser

  1. Le script nécessite à la fois wmctrl et xdotool

    _Sudo apt-get install xdotool wmctrl
    _
  2. Copiez le script dans un fichier vide, enregistrez-le sous le nom _min_screen.py_

  3. Pour l'exécuter:

    _python3 /path/to/min_screen.py 1
    _

    minimiser les fenêtres sur l'écran de gauche, et

    _python3 /path/to/min_screen.py 2 
    _

    minimiser les fenêtres uniquement sur le bon écran

  4. Si tout fonctionne bien, ajoutez-le à une touche de raccourci

Remarques

  • Le script suppose que python3 est installé, mais le code n'est pas spécifique à python3, je crois.
  • Le script a été écrit sur Unity, mais contrairement aux espaces de travail (fenêtres), la gestion des écrans ne devrait pas faire la différence.
  • Le script ne réduira pas les fenêtres avec le pid 0 (inactif ou autre tkinterwindows, par exemple). Si c'est un problème, merci de le mentionner. Peut être résolu.

Explication

Le script commence par regarder le bord droit de l'écran de gauche, en recherchant la chaîne avec _+0+_ dans le résultat de xrandr, comme suit:

_1680x1050+0+0
_

La première section, _1680_, est la largeur de l’écran de gauche. Par la suite, tout ce que nous avons à faire est de regarder dans la liste des fenêtres (_wmctrl -lG_) et de voir laquelle des fenêtres se trouve "au-dessous" ou "au-dessus" _1680_, et agissons en conséquence en minimisant avec la commande _xdotool windowminimize <window_id>_ (ou pas).

Le "test" enfin (mmiz): _xprop -id <window_id>_ permet de vérifier s’il s’agit d’une fenêtre "normale" (au lieu de votre bureau par exemple, qui est également répertorié comme une fenêtre), et si La fenêtre est déjà réduite.

Voir aussi le commentaire dans le script.

Relier le script à un raccourci clavier

1. Sur Lubuntu

Pour éditer les raccourcis clavier globaux dans Lubuntu, voir Lubuntu minimise tous les raccourcis clavier sur le bureau?

Dans ce cas: enregistrez le script de cette réponse dans un fichier sur l'ordinateur, exécutez ce fichier, ouvrez _/.config/openbox/lubuntu-rc.xml_ et remplacez

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

par

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

où _/path/to/show_desktop.py_ est (bien sûr) le chemin du script et soit _1_ ou _2_ l'écran ciblé. Rend le script exécutable .

Redémarrez l'ordinateur pour recharger la configuration.

2. Unité/Gnome

Rendez le script exécutable et choisissez: Paramètres système> "Clavier"> "Raccourcis"> "Personnalisé Raccourcis ". Cliquez sur le "+" et ajoutez la commande:

_/path/to/show_desktop.py 1
_

... vers un raccourci de votre choix

3
Jacob Vlijm

Introduction

Le script ci-dessous permet à l'utilisateur de cliquer sur l'affichage qu'il souhaite et toutes les fenêtres de cet affichage seront réduites au minimum. Ce script est destiné à être lié à un raccourci clavier, mais peut être exécuté manuellement si vous le souhaitez.

L'utilisation est simple:

  1. activer le script, le curseur de votre souris se transformera en croix
  2. Cliquez sur n’importe quelle fenêtre de programme (mais pas sur le bureau) sur l’affichage que vous souhaitez réduire.
  3. Le script déterminera toutes les fenêtres sur cet affichage et les minimisera (iconifiera).

Le programme ne nécessite l'installation d'aucun paquet supplémentaire. Le script a été testé sur Ubuntu 16.04 LTS et Lubuntu 16.04 LTS classiques. Merci à @JourneymanGeek pour l'avoir testé sur Fedora 24 avec KDE également!

Obtention du code source du script

Le code source du script peut être obtenu en le copiant manuellement ici ou en le récupérant depuis mon dépôt github . Pour l'obtenir via git, procédez comme suit:

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

Le fichier s'appellera minimiser_display_windows.py . Assurez-vous que lorsque vous liez cela à un raccourci clavier pour fournir le chemin complet du script. Par exemple, comme ceci:

 python /opt/sergrep/minimize_display_windows.py

Code source

Assurez-vous que le fichier dans lequel vous enregistrez ce code dispose d'autorisations exécutables.

#!/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()

Démo

Un bref enregistrement du script en action est disponible sur mon chaîne youtube

Notes de côté

A l'origine, j'ai écrit un autre script, mais il ne peut être utilisé que dans Unity et requiert la présence de xdotool. Pour ceux que cela intéresse, il est affiché comme Gist

2