Wyświetl jedno kliknięcie

11

Czy jest możliwe, aby pojedyncze kliknięcie ikon dokowania aktywowało ekspozycję domyślnie?

Jeśli masz jedno okno otwarte w Ubuntu, nie aktywuje on ekspozycji, ale jeśli masz wiele otwartych okien, robi to. Powoduje to problemy, gdy próbowałem używać ekspozycji w kilku różnych oknach w Ubuntu.

wprowadź opis zdjęcia tutaj

William
źródło
1
Czy możesz dodać link do tego, co naraża twoje pytanie?
Bruni
innymi słowy, chcesz mieć taki widok, nawet jeśli otwarte jest tylko jedno okno tej aplikacji?
Sergiy Kolodyazhnyy
@LiamWilliam jest to ujawniać lub skalować?
Anwar
1
@LiamWilliam nie, niestety nie znalazłem do tej pory nic istotnego :(
Sergiy Kolodyazhnyy 17.09.16
1
@LiamWilliam Znalazłem opcję „rozprzestrzeniania się” tylko za pomocą skrótu, ale aby to zrobić, okno musi być skoncentrowane. Nie znalazłem sposobu za pomocą kliknięcia
Sergiy Kolodyazhnyy,

Odpowiedzi:

6

Zawartość:

  1. Przegląd
  2. Źródło skryptu
  3. Dodatkowe uwagi

1. Przegląd

Jak wspomniano w komentarzach, ta funkcja najwyraźniej została usunięta od 12.04, a teraz kliknięcie ikony uruchamiania minimalizuje okno (która najwyraźniej była bardzo pożądaną funkcją, z tego, co widzę podczas wyszukiwania online). Istnieje jednak klawiatura do włączania expo dla pojedynczego okna, czyli Super+ Ctrl+ W. Wiedząc, że jeśli możemy wykryć kliknięcie programu uruchamiającego lub pozycję kursora, gdy okno jest podniesione, możemy symulować expo pojedynczego okna za pomocą tego skrótu klawiaturowego. Poniższy skrypt robi dokładnie to.

Ma to zostać zapisane jako /usr/bin/single_click_expo.pyplik i dodane do aplikacji startowych

wprowadź opis zdjęcia tutaj

2. Źródło skryptu

Dostępne również na 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. Dodatkowe uwagi

  • Wskazane może być ponowne przypisanie skrótu do czegoś innego Super+ Ctrl+ W, ponieważ w expo Ctrl+ Ww expo odpowiada poleceniu „zamknij okno”. Potencjalnym problemem jest to, że częste przełączanie może spowodować zamknięcie okna. Skrypt również musiałby zostać odpowiednio dostosowany.

UWAGA:

Skrypt opiera się na xdotoolużyteczności. Musisz go zainstalować. Bez xdotooltego nie będzie działać, ponieważ xdotoolsłuży do symulacji naciśnięć klawiszy. Zainstaluj za pośrednictwemsudo apt-get install xdotool

Sergiy Kolodyazhnyy
źródło
RozumiemNo module named gi
William
@LiamWilliam Prawdopodobnie musisz zainstalować python3-gipakiet. Dziwne, ponieważ jest jak standardowy moduł i domyślnie jest dostarczany z Ubuntu.
Sergiy Kolodyazhnyy 10.10.16
askubuntu.com/q/159074/295286
Sergiy Kolodyazhnyy,
W jakiej wersji ubuntu korzystasz?
William
@LiamWilliam 16.04 LTS, ale python3-gidomyślnie jest także dostępny w 14.04 LTS. Nie wiem o wcześniejszych wersjach
Sergiy Kolodyazhnyy 10.10.16