한 번의 클릭 노출


11

독 아이콘을 한 번 클릭하여 기본적으로 노출을 활성화 할 수 있습니까?

우분투에서 하나의 창이 열려 있으면 노출이 활성화되지 않지만 여러 창이 열려 있으면 열립니다. 우분투의 여러 다른 창에서 노출을 사용하려고 할 때 문제가 발생합니다.

여기에 이미지 설명을 입력하십시오


1
질문에 대한 노출이 무엇인지에 대한 링크를 추가 할 수 있습니까?
Bruni

즉, 해당 앱의 창이 하나만 열려 있어도 그러한 뷰를 원합니다.
Sergiy Kolodyazhnyy

@LiamWilliam 노출 또는 확장입니까?
Anwar

1
@LiamWilliam 아니, 불행하게도 나는 아무것도 관련 지금까지 :( 찾을 수 없습니다
세르지 Kolodyazhnyy

1
@LiamWilliam 바로 가기를 통해 "확산"옵션 만 찾았지만 그렇게하려면 창에 초점을 맞춰야합니다. 클릭을 통해 방법을 찾지 못했습니다
Sergiy Kolodyazhnyy

답변:


6

내용:

  1. 개요
  2. 스크립트 소스
  3. 추가 사항

1. 개요

의견에서 언급 했듯이이 기능은 12.04 이후 분명히 제거되었으며 이제 런처 아이콘을 클릭하면 창을 최소화합니다 (온라인 검색에서 볼 수있는 것 중에서 요청이 많은 기능이었습니다). 그러나 단일 창에 대한 박람회를 켜는 키보드는 Super+ Ctrl+ W입니다. window가 올려 졌을 때 런처 또는 커서 위치의 클릭을 감지 할 수 있다면 키보드 단축키를 통해 단일 창 엑스포를 시뮬레이션 할 수 있습니다. 아래 스크립트는 정확히 그렇게합니다.

이것은 /usr/bin/single_click_expo.py파일 로 저장되고 시작 응용 프로그램에 추가됩니다

여기에 이미지 설명을 입력하십시오

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. 추가 사항

  • Expo의 expo + 는 "창 닫기"명령에 해당하기 때문에 단축키를 다른 Super+ Ctrl+ 로 다시 매핑하는 것이 좋습니다 . 여기에서 잠재적 인 문제는 자주 전환하면 창이 닫힐 수 있다는 것입니다. 이에 따라 스크립트도 조정해야합니다.WCtrlW

노트:

스크립트는 xdotool유틸리티에 의존 합니다. 설치되어 있어야합니다. 없이 xdotool그것 때문에 작동하지 않습니다 xdotool시뮬레이션 키 누름에 사용됩니다. 통해 설치sudo apt-get install xdotool


나는 얻는다No module named gi
William

@LiamWilliam python3-gi패키지 를 설치해야 할 것입니다 . 표준 모듈과 비슷하고 기본적으로 우분투와 함께 제공되기 때문에 이상합니다.
Sergiy Kolodyazhnyy


어떤 버전의 우분투를 사용하고 있습니까?
William

@LiamWilliam 16.04 LTS python3-gi는 기본적으로 14.04 LTS에도 제공됩니다. 나는 이전 버전에 대해 모른다
Sergiy Kolodyazhnyy
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.