Exposición de un solo clic

11

¿Es posible hacer que un solo clic en los iconos del dock active la exposición por defecto?

Si tiene una sola ventana abierta en ubuntu, no activa la exposición, pero si tiene varias ventanas abiertas, lo hace. Esto causó problemas cuando traté de usar exponer en varias ventanas diferentes en ubuntu.

ingrese la descripción de la imagen aquí

William
fuente
1
¿Podría agregar un enlace a lo que expone a su pregunta?
Bruni
entonces, en otras palabras, ¿quieres tener esa vista incluso si solo hay una ventana abierta de esa aplicación?
Sergiy Kolodyazhnyy
@LiamWilliam ¿está expuesto o escalado?
Anwar
1
@LiamWilliam no, desafortunadamente no encontré nada relevante hasta ahora :(
Sergiy Kolodyazhnyy
1
@LiamWilliam Solo encontré la opción "propagar" a través de un acceso directo, pero tu ventana tiene que estar enfocada para hacerlo. No he encontrado una manera a través de clic
Sergiy Kolodyazhnyy

Respuestas:

6

Contenido:

  1. Visión general
  2. Fuente de script
  3. Notas adicionales

1. Información general

Como se mencionó en los comentarios, esta funcionalidad aparentemente se eliminó desde el 12.04 y ahora hacer clic en el icono del iniciador minimiza la ventana (que aparentemente era una característica muy solicitada, por lo que puedo ver en mis búsquedas en línea). Sin embargo, existe un teclado para activar la exposición para una sola ventana, que es Super+ Ctrl+ W. Sabiendo que, si podemos detectar el clic en el lanzador o la posición del cursor cuando se levanta la ventana, entonces podemos simular esa exposición de ventana única a través de ese atajo de teclado. El siguiente script hace exactamente eso.

Está destinado a guardarse como /usr/bin/single_click_expo.pyarchivo y agregarse a las aplicaciones de inicio

ingrese la descripción de la imagen aquí

2. Fuente del script

También disponible en 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. Notas adicionales

  • Puede ser aconsejable reasignar el acceso directo a otro Super+ Ctrl+ W, porque en expo Ctrl+ Wen Expo corresponde al comando "cerrar ventana". El problema potencial aquí es que el cambio frecuente puede causar el cierre de la ventana. El guión también tendría que ajustarse en consecuencia.

NOTA:

El script se basa en la xdotoolutilidad. Debes tenerlo instalado. Sin xdotoolesto no funcionará, ya que xdotoolse usa para simular pulsaciones de teclas. Instalarlo a través desudo apt-get install xdotool

Sergiy Kolodyazhnyy
fuente
ObtengoNo module named gi
William
@LiamWilliam Probablemente necesite instalar el python3-gipaquete. Extraño, ya que es como un módulo estándar y viene con Ubuntu por defecto.
Sergiy Kolodyazhnyy
askubuntu.com/q/159074/295286
Sergiy Kolodyazhnyy
¿En qué versión de ubuntu estás?
William
@LiamWilliam 16.04 LTS, pero python3-gitambién viene por defecto en 14.04 LTS. No sé sobre versiones anteriores
Sergiy Kolodyazhnyy