Один клик Expose

11

Можно ли одним кликом по значкам док-станции активировать экспозицию по умолчанию?

Если у вас есть одно открытое окно в Ubuntu, оно не активирует Expose, но если у вас открыто несколько окон, оно активирует. Это вызывает проблемы, когда я пытался использовать expose на нескольких разных окнах в Ubuntu.

введите описание изображения здесь

Уильям
источник
1
Не могли бы вы добавить ссылку на то, что выставить на ваш вопрос?
Бруни
Итак, другими словами, вы хотите иметь такой вид, даже если открыто только одно окно этого приложения?
Сергей Колодяжный
@LiamWilliam это разоблачение или масштаб?
Анвар
1
@LiamWilliam нет, к сожалению, я пока не нашел ничего актуального :(
Сергей Колодяжный,
1
@LiamWilliam Я нашел опцию «распространение» только через ярлык, но для этого нужно сфокусировать ваше окно. Я не нашел пути с помощью клика
Сергей Колодяжный

Ответы:

6

Содержание:

  1. обзор
  2. Источник скрипта
  3. Дополнительные замечания

1. Обзор

Как уже упоминалось в комментариях, эта функциональность, по-видимому, была удалена с 12.04, и теперь щелчок по значку запуска минимизирует окно (что, по-видимому, было крайне востребованной функцией, из того, что я вижу в своих онлайн-поисках). Тем не менее, существует клавиатура для включения экспо для одного окна, которое Super+ Ctrl+ W. Зная, что, если мы можем обнаружить щелчок на панели запуска или позиции курсора, когда окно поднято, то мы можем смоделировать эту экспозицию одного окна с помощью этого сочетания клавиш. Сценарий ниже делает именно это.

Это должно быть сохранено в виде /usr/bin/single_click_expo.pyфайла и добавлено в Startup Applications

введите описание изображения здесь

2. Источник скрипта

Также доступно на 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. Дополнительные примечания

  • Может быть целесообразно переназначить ярлык на что-то другое Super+ Ctrl+ W, потому что в expo Ctrl+ Wв Expo соответствует команде «закрыть окно». Здесь потенциальная проблема заключается в том, что частое переключение может привести к закрытию окна. Сценарий также должен быть соответствующим образом скорректирован.

НОТА:

Скрипт опирается на xdotoolутилиту. Вы должны установить его. Без xdotoolэтого не получится, так xdotoolкак используется для имитации нажатия клавиш. Установите его черезsudo apt-get install xdotool

Сергей Колодяжный
источник
Я получаюNo module named gi
Уильям
@LiamWilliam Возможно, вам нужно установить python3-giпакет. Странно, так как он похож на стандартный модуль и поставляется с Ubuntu по умолчанию.
Сергей Колодяжный
askubuntu.com/q/159074/295286
Сергей Колодяжный
На какой версии Ubuntu вы работаете?
Уильям
@LiamWilliam 16.04 LTS, но python3-giтакже поставляется по умолчанию в 14.04 LTS. Я не знаю о более ранних версиях
Сергей Колодяжный