Single Click Expose


11

Ist es möglich, mit einem Klick auf die Dock-Symbole die Belichtung standardmäßig zu aktivieren?

Wenn Sie ein einzelnes Fenster in Ubuntu geöffnet haben, wird Expose nicht aktiviert. Wenn Sie jedoch mehrere Fenster geöffnet haben, wird es geöffnet. Dies verursacht Probleme, als ich versuchte, Expose in mehreren verschiedenen Fenstern in Ubuntu zu verwenden.

Geben Sie hier die Bildbeschreibung ein


1
Könnten Sie einen Link zu dem hinzufügen, was zu Ihrer Frage gehört?
Bruni

Mit anderen Worten, Sie möchten eine solche Ansicht haben, auch wenn nur ein Fenster dieser App geöffnet ist?
Sergiy Kolodyazhnyy

@ LiamWilliam ist es belichten oder skalieren?
Anwar

1
@ LiamWilliam nein, leider habe ich bisher nichts relevantes gefunden :(
Sergiy Kolodyazhnyy

1
@LiamWilliam Ich habe die Option "Verbreiten" nur über eine Verknüpfung gefunden, aber Ihr Fenster muss fokussiert sein, um dies zu tun. Ich habe keinen Weg per Klick gefunden
Sergiy Kolodyazhnyy

Antworten:


6

Inhalt:

  1. Überblick
  2. Skriptquelle
  3. Zusätzliche Bemerkungen

1. Übersicht

Wie in den Kommentaren erwähnt, wurde diese Funktionalität anscheinend seit 12.04 entfernt und jetzt durch Klicken auf das Startsymbol wird das Fenster minimiert (was anscheinend eine sehr gefragte Funktion war, wie ich in meinen Online-Suchen sehen kann). Es gibt jedoch eine Tastatur zum Einschalten der Ausstellung für ein einzelnes Fenster, nämlich Super+ Ctrl+ W. Wenn wir wissen, dass wir beim Öffnen des Fensters einen Klick auf den Launcher oder die Position des Cursors erkennen können, können wir diese einzelne Fensterausstellung über diese Tastenkombination simulieren. Das folgende Skript macht genau das.

Dies soll als /usr/bin/single_click_expo.pyDatei gespeichert und zu Startanwendungen hinzugefügt werden

Geben Sie hier die Bildbeschreibung ein

2. Skriptquelle

Auch auf GitHub verfügbar

#!/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. Zusätzliche Hinweise

  • Es kann ratsam sein, die Verknüpfung einem anderen Super+ Ctrl+ zuzuordnen W, da in expo Ctrl+ Win Expo dem Befehl "Fenster schließen" entspricht. Mögliches Problem hierbei ist, dass häufiges Umschalten zum Schließen des Fensters führen kann. Das Skript müsste ebenfalls entsprechend angepasst werden.

HINWEIS:

Das Skript basiert auf dem xdotoolDienstprogramm. Sie müssen es installiert haben. Ohne xdotoolfunktioniert es nicht, da xdotooles zum Simulieren von Tastendrücken verwendet wird. Installieren Sie es übersudo apt-get install xdotool


Ich bekommeNo module named gi
William

@LiamWilliam Sie müssen wahrscheinlich das python3-giPaket installieren . Seltsam, da es wie ein Standardmodul ist und standardmäßig mit Ubuntu geliefert wird.
Sergiy Kolodyazhnyy


Auf welcher Ubuntu-Version bist du?
William

@LiamWilliam 16.04 LTS, python3-gikommt aber standardmäßig auch in 14.04 LTS. Ich weiß nicht über frühere Versionen
Sergiy Kolodyazhnyy
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.