Paparan Satu Klik

11

Apakah mungkin untuk memiliki satu klik pada ikon dock mengaktifkan expose secara default?

Jika Anda memiliki satu jendela terbuka di ubuntu itu tidak mengaktifkan mengekspos tetapi jika Anda memiliki beberapa jendela terbuka itu. Ini menyebabkan masalah ketika saya mencoba menggunakan expose di beberapa jendela berbeda di ubuntu.

masukkan deskripsi gambar di sini

William
sumber
1
Bisakah Anda menambahkan tautan ke paparan pertanyaan Anda?
Bruni
jadi, dengan kata lain, Anda ingin memiliki tampilan seperti itu meskipun hanya ada satu jendela aplikasi yang terbuka?
Sergiy Kolodyazhnyy
@LiamWilliam apakah itu mengekspos atau skala?
Anwar
1
@LiamWilliam tidak, sayangnya saya tidak menemukan sesuatu yang relevan sejauh ini :(
Sergiy Kolodyazhnyy
1
@LiamWilliam Saya hanya menemukan opsi "spread" melalui pintasan, tetapi jendela Anda harus difokuskan untuk melakukan itu. Saya belum menemukan cara melalui klik
Sergiy Kolodyazhnyy

Jawaban:

6

Isi:

  1. Gambaran
  2. Sumber skrip
  3. Catatan tambahan

1. Ikhtisar

Seperti yang disebutkan dalam komentar, fungsi ini tampaknya telah dihapus sejak 12,04 dan sekarang klik pada ikon peluncur meminimalkan jendela (yang tampaknya adalah fitur yang sangat diminta, dari apa yang dapat saya lihat dalam pencarian online saya). Namun, ada keyboard untuk mengaktifkan expo untuk satu jendela, yaitu Super+ Ctrl+ W. Mengetahui hal itu, jika kita dapat mendeteksi klik pada peluncur atau posisi kursor ketika jendela dinaikkan, maka kita dapat mensimulasikan expo satu jendela itu melalui pintasan keyboard itu. Script di bawah ini tidak persis seperti itu.

Ini dimaksudkan untuk disimpan sebagai /usr/bin/single_click_expo.pyfile dan ditambahkan ke Aplikasi Startup

masukkan deskripsi gambar di sini

2. Sumber Skrip

Juga tersedia di 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. Catatan tambahan

  • Mungkin disarankan untuk memetakan ulang jalan pintas ke sesuatu yang lain Super+ Ctrl+ W, karena dalam expo Ctrl+ Wdalam Expo berhubungan dengan perintah "tutup jendela". Masalah potensial di sini adalah bahwa peralihan yang sering dapat menyebabkan penutupan jendela. Script harus disesuaikan juga.

CATATAN:

Skrip bergantung pada xdotoolutilitas. Anda harus menginstalnya. Tanpa xdotoolitu tidak akan berfungsi, karena xdotooldigunakan untuk mensimulasikan penekanan tombol. Instal melaluisudo apt-get install xdotool

Sergiy Kolodyazhnyy
sumber
Saya mendapatkanNo module named gi
William
@LiamWilliam Anda mungkin perlu menginstal python3-gipaket. Aneh, karena ini seperti modul standar dan dilengkapi dengan Ubuntu secara default.
Sergiy Kolodyazhnyy
askubuntu.com/q/159074/295286
Sergiy Kolodyazhnyy
Anda berada di versi ubuntu apa?
William
@LiamWilliam 16,04 LTS, tetapi python3-gijuga datang secara default dalam 14,04 LTS. Saya tidak tahu tentang versi sebelumnya
Sergiy Kolodyazhnyy