Exposition en un seul clic

11

Est-il possible d'avoir un simple clic sur les icônes du dock pour activer l'exposition par défaut?

Si vous avez une seule fenêtre ouverte dans ubuntu, elle n'active pas l'exposition, mais si vous avez plusieurs fenêtres ouvertes, elle le fait. Cela cause des problèmes lorsque j'ai essayé d'utiliser expose sur plusieurs fenêtres différentes dans Ubuntu.

entrez la description de l'image ici

William
la source
1
Pourriez-vous ajouter un lien vers ce qui est exposé à votre question?
Bruni
en d'autres termes, vous voulez avoir une telle vue même s'il n'y a qu'une seule fenêtre de cette application ouverte?
Sergiy Kolodyazhnyy
@LiamWilliam est-il exposé ou mis à l'échelle?
Anwar
1
@LiamWilliam non, malheureusement je n'ai rien trouvé de pertinent jusqu'à présent :(
Sergiy Kolodyazhnyy
1
@LiamWilliam J'ai seulement trouvé l'option "spread" via un raccourci, mais votre fenêtre doit être focalisée pour ce faire. Je n'ai pas trouvé de moyen via le clic
Sergiy Kolodyazhnyy

Réponses:

6

Contenu:

  1. Aperçu
  2. Source de script
  3. Notes complémentaires

1. Vue d'ensemble

Comme mentionné dans les commentaires, cette fonctionnalité a apparemment été supprimée depuis le 12.04 et maintenant cliquez sur l'icône du lanceur minimise la fenêtre (qui était apparemment une fonctionnalité très demandée, d'après ce que je peux voir dans mes recherches en ligne). Cependant, il existe un clavier pour activer l'expo pour une seule fenêtre, qui est Super+ Ctrl+ W. Sachant que, si nous pouvons détecter un clic sur le lanceur ou la position du curseur lorsque la fenêtre est levée, nous pouvons simuler cette exposition de fenêtre unique via ce raccourci clavier. Le script ci-dessous fait exactement cela.

Ceci est destiné à être enregistré en tant que /usr/bin/single_click_expo.pyfichier et ajouté aux applications de démarrage

entrez la description de l'image ici

2. Source du script

Aussi disponible sur GitHub

#!/usr/bin/env python3

# Author: Serg Kolo
# Date: Sept 28, 2016
# Purpose: activates
# Depends: python3-gi
#          xdotool
# Written for: http://askubuntu.com/q/651188/295286

# just in case user runs this with python 2
from __future__ import print_function
import gi
gi.require_version('Gdk', '3.0')
from gi.repository import Gdk,Gio
import sys
import dbus
import subprocess

def run_cmd(cmdlist):
    """ Reusable function for running shell commands"""
    try:
        stdout = subprocess.check_output(cmdlist)
    except subprocess.CalledProcessError:
        print(">>> subprocess:",cmdlist)
        sys.exit(1)
    else:
        if stdout:
            return stdout

def gsettings_get(schema,path,key):
    """Get value of gsettings schema"""
    if path is None:
        gsettings = Gio.Settings.new(schema)
    else:
        gsettings = Gio.Settings.new_with_path(schema,path)
    return gsettings.get_value(key)


def get_launcher_object(screen):

    # Unity allows launcher to be on multiple
    # monitors, so we need to account for all 
    # window objects of the launcher
    launchers = []

    for window in screen.get_window_stack():
        xid = window.get_xid()
        command = ['xprop','-notype',
                   'WM_NAME','-id',str(xid)
        ]
        xprop = run_cmd(command).decode()
        title = xprop.replace("WM_NAME =","")
        if title.strip()  == '"unity-launcher"':
           launchers.append(window)
           #return window
    return launchers

def get_dbus(bus_type,obj,path,interface,method,arg):
    # Reusable function for accessing dbus
    # This basically works the same as 
    # dbus-send or qdbus. Just give it
    # all the info, and it will spit out output
    if bus_type == "session":
        bus = dbus.SessionBus() 
    if bus_type == "system":
        bus = dbus.SystemBus()
    proxy = bus.get_object(obj,path)
    method = proxy.get_dbus_method(method,interface)
    if arg:
        return method(arg)
    else:
        return method() 


def main():


    previous_xid = int()
    screen = Gdk.Screen.get_default()

    while True:

        current_xid = screen.get_active_window().get_xid()
        if  int(current_xid) == previous_xid:
            continue
        previous_xid = int(current_xid)
        icon_size = gsettings_get(
                        'org.compiz.unityshell',
                        '/org/compiz/profiles/unity/plugins/unityshell/',
                        'icon-size')
        icon_size = int(str(icon_size))
        position = str(gsettings_get(
                       'com.canonical.Unity.Launcher',
                       None,
                       'launcher-position'))
        screen = Gdk.Screen.get_default()
        launcher_objs = get_launcher_object(screen)

        # for faster processing,figure out which launcher is used
        # first before running xdotool command. We also need
        # to account for different launcher positions (available since 16.04)
        pointer_on_launcher = None
        for launcher in launcher_objs:
            if 'Left' in position and  \
               abs(launcher.get_pointer().x) <= icon_size:
                  pointer_on_launcher = True
            elif 'Bottom' in position and \
               abs(launcher.get_pointer().y) <= icon_size:
                  pointer_on_launcher = True
            else:
               continue


        active_xid = int(screen.get_active_window().get_xid())

        application = get_dbus('session',
                               'org.ayatana.bamf',
                               '/org/ayatana/bamf/matcher',
                               'org.ayatana.bamf.matcher',
                               'ApplicationForXid',
                               active_xid)

        # Apparently desktop window returns empty application
        # we need to account for that as well
        if application:
            xids = list(get_dbus('session',
                            'org.ayatana.bamf',
                            application,
                            'org.ayatana.bamf.application',
                            'Xids',None))

        if pointer_on_launcher and\
           len(xids) == 1:
               run_cmd(['xdotool','key','Ctrl+Super+W'])


if __name__ == '__main__':
    main()

3. Notes supplémentaires

  • Il peut être judicieux de remapper le raccourci vers autre chose Super+ Ctrl+ W, car dans expo Ctrl+ Wdans Expo correspond à la commande "fermer la fenêtre". Le problème potentiel ici est qu'une commutation fréquente peut entraîner la fermeture de la fenêtre. Le script devrait également être ajusté en conséquence.

REMARQUE:

Le script repose sur l' xdotoolutilité. Vous devez l'avoir installé. Sans xdotoolcela ne fonctionnera pas, car xdotoolest utilisé pour simuler des pressions de touches. Installez-le viasudo apt-get install xdotool

Sergiy Kolodyazhnyy
la source
Je reçoisNo module named gi
William
@LiamWilliam Vous devrez probablement installer le python3-gipackage. Bizarre, car c'est comme un module standard et est livré avec Ubuntu par défaut.
Sergiy Kolodyazhnyy
askubuntu.com/q/159074/295286
Sergiy Kolodyazhnyy
Sur quelle version d'ubuntu êtes-vous?
William
@LiamWilliam 16.04 LTS, mais python3-givient également par défaut en 14.04 LTS. Je ne sais pas pour les versions antérieures
Sergiy Kolodyazhnyy