ubuntu 16.04 – Exponer con un solo clic

Pregunta:

¿Es posible hacer que un solo clic en los íconos del dock se activen y expongan de forma predeterminada?

Si tiene una sola ventana abierta en ubuntu, no se activa exponer, pero si tiene varias ventanas abiertas, sí lo hace. Esto causa problemas cuando traté de usar exponer en varias ventanas diferentes en ubuntu.

ingrese la descripción de la imagen aquí

Respuesta:

Contenido:

  1. Descripción general
  2. Fuente de la secuencia de comandos
  3. Notas adicionales

1. Información general

Como se mencionó en los comentarios, esta funcionalidad aparentemente se eliminó desde 12.04 y ahora, al hacer clic en el ícono del iniciador, se 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 eso, si podemos detectar un 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.

Esto debe guardarse como archivo /usr/bin/single_click_expo.py y agregarse a las aplicaciones de inicio

ingrese la descripción de la imagen aquí

2. Fuente de la secuencia de comandos

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

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

NOTA:

El script se basa en la utilidad xdotool . Debe tenerlo instalado. Sin xdotool no funcionará, ya que xdotool se usa para simular pulsaciones de teclas. Instálelo a través de sudo apt-get install xdotool

Leave a Comment

Your email address will not be published. Required fields are marked *

Scroll to Top

web tasarım