Tek Tıkla Pozlama


11

Varsayılan olarak dock simgelerinin açıkta bırakılmasını etkinleştirmek mümkün mü?

Ubuntu'da açık tek bir pencereniz varsa pozlamayı etkinleştirmez, ancak birden fazla pencereniz açıksa açar. Ubuntu birkaç farklı pencerelerde maruz kullanmaya çalıştığımda bu sorunlara neden olur.

resim açıklamasını buraya girin


1
Sorunuza açıklamanın ne olduğuna bir bağlantı ekleyebilir misiniz?
Bruni

başka bir deyişle, o uygulamanın yalnızca bir penceresi açık olsa bile böyle bir görünüme sahip olmak ister misiniz?
Sergiy Kolodyazhnyy

@LiamWilliam poz veya ölçek mi?
Anwar

1
@LiamWilliam hayır, ne yazık ki şu ana kadar alakalı bir şey bulamadım :(
Sergiy Kolodyazhnyy

1
@LiamWilliam Yalnızca "kısayol" ile "yayma" seçeneğini buldum, ancak bunun için pencerenizin odaklanması gerekiyor. Tıklama ile bir yol bulamadım
Sergiy Kolodyazhnyy

Yanıtlar:


6

İçindekiler:

  1. genel bakış
  2. Komut dosyası kaynağı
  3. Ek Notlar

1. Genel Bakış

Yorumlarda belirtildiği gibi, bu işlevsellik 12.04'ten beri kaldırıldı ve şimdi başlatıcı simgesine tıklamak pencereyi en aza indirir (görünüşte çok talep edilen bir özellikti, çevrimiçi aramalarda görebildiğim kadarıyla). Ancak, Super+ Ctrl+ olan tek bir pencere için expo'yu açmak için bir klavye vardır W. Pencere yükseltildiğinde başlatıcıyı veya imlecin konumunu tıklarsak, o klavye kısayoluyla o tek pencere fuarını simüle edebiliriz. Aşağıdaki senaryo tam olarak bunu yapıyor.

Bu, /usr/bin/single_click_expo.pydosya olarak kaydedilmeli ve Başlangıç ​​Uygulamalarına eklenmelidir.

resim açıklamasını buraya girin

2. Komut Dosyası Kaynağı

GitHub'da da mevcuttur

#!/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. Ek notlar

  • Kısayolu başka bir Super+ Ctrl+ ile yeniden eşlemeniz tavsiye edilebilir W, çünkü Expo'daki expo Ctrl+ W'da "pencereyi kapat" komutuna karşılık gelir. Buradaki potansiyel sorun, sık sık değiştirmenin pencere kapanmasına neden olabilmesidir. Komut dosyasının da buna göre ayarlanması gerekir.

NOT:

Komut dosyası xdotoolyardımcı programa dayanır . Yüklemiş olmanız gerekir. Bu olmadan xdotoolişe yaramaz, çünkü xdotooltuş basımlarını simüle etmek için kullanılır. Yoluyla yükleyinsudo apt-get install xdotool


AnladımNo module named gi
William

@LiamWilliam Muhtemelen python3-gipaket kurmanız gerekiyor . Garip, çünkü standart bir modül gibi ve varsayılan olarak Ubuntu ile geliyor.
Sergiy Kolodyazhnyy


Hangi Ubuntu sürümünü kullanıyorsunuz?
William

@LiamWilliam 16.04 LTS, ancak python3-givarsayılan olarak 14.04 LTS'de gelir. Önceki sürümleri bilmiyorum
Sergiy Kolodyazhnyy
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.