คลิกเดียวสัมผัส


11

เป็นไปได้หรือไม่ที่จะมีการคลิกเพียงครั้งเดียวบนไอคอนท่าเรือจะเป็นการเปิดใช้งานโดยค่าเริ่มต้นหรือไม่

หากคุณเปิดหน้าต่างเดียวในอูบุนตูมันจะไม่เปิดใช้งานการเปิดเผย แต่หากคุณมีหลายหน้าต่างที่เปิดอยู่ ปัญหานี้ทำให้เกิดปัญหาเมื่อฉันพยายามใช้ expose ในหลาย windows ใน Ubuntu

ป้อนคำอธิบายรูปภาพที่นี่


1
คุณสามารถเพิ่มลิงก์ไปยังคำถามของคุณได้หรือไม่?
Bruni

ดังนั้นในคำอื่น ๆ ที่คุณต้องการที่จะมีมุมมองดังกล่าวแม้ว่าจะมีหน้าต่างเดียวของแอพนั้นเปิด?
Sergiy Kolodyazhnyy

@LiamWilliam มันเปิดเผยหรือปรับขนาด?
อันวาร์

1
@LiamWilliam ไม่น่าเสียดายที่ฉันไม่พบสิ่งที่เกี่ยวข้องเลย :(
Sergiy Kolodyazhnyy

1
@LiamWilliam ฉันพบเพียงตัวเลือก "แพร่กระจาย" ผ่านทางลัด แต่หน้าต่างของคุณต้องได้รับการโฟกัสเพื่อที่จะทำเช่นนั้น ฉันไม่พบวิธีการคลิก
Sergiy Kolodyazhnyy

คำตอบ:


6

สารบัญ:

  1. ภาพรวม
  2. แหล่งสคริปต์
  3. หมายเหตุเพิ่มเติม

1. ภาพรวม

ดังที่ได้กล่าวไว้ในความคิดเห็นฟังก์ชั่นนี้จะถูกลบตั้งแต่ 12.04 และตอนนี้คลิกที่ไอคอนตัวเรียกใช้ลดขนาดหน้าต่าง (ซึ่งเห็นได้ชัดว่าเป็นคุณลักษณะที่มีการร้องขออย่างมากจากสิ่งที่ฉันเห็นในการค้นหาออนไลน์ของฉัน) แต่มีอยู่แป้นพิมพ์เพื่อเปิดงานแสดงสินค้าสำหรับหน้าต่างเดียวซึ่งเป็นSuper+ +Ctrl Wรู้ว่าถ้าเราสามารถตรวจจับการคลิกบนตัวเรียกใช้หรือตำแหน่งของเคอร์เซอร์เมื่อยกหน้าต่างขึ้นมาเราสามารถจำลอง expo หน้าต่างเดียวผ่านทางแป้นพิมพ์ลัดนั้น สคริปต์ด้านล่างทำสิ่งนั้นอย่างแท้จริง

สิ่งนี้มีไว้เพื่อบันทึกเป็น/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. หมายเหตุเพิ่มเติม

  • อาจแนะนำให้ทำการแมปทางลัดอื่นSuper+ Ctrl+ Wเนื่องจากใน expo Ctrl+ Wใน Expo สอดคล้องกับคำสั่ง "ปิดหน้าต่าง" ปัญหาที่อาจเกิดขึ้นที่นี่คือการสลับบ่อยครั้งอาจทำให้ปิดหน้าต่าง สคริปต์จะต้องมีการปรับเช่นกัน

บันทึก:

สคริปต์อาศัยxdotoolยูทิลิตี้ คุณต้องติดตั้งมัน หากไม่มีxdotoolมันจะไม่ทำงานเนื่องจากxdotoolใช้เพื่อจำลองการกดแป้น ติดตั้งผ่านsudo apt-get install xdotool


ฉันได้รับNo module named gi
วิลเลียม

@LiamWilliam คุณอาจต้องติดตั้งpython3-giแพ็คเกจ แปลกเพราะมันเป็นโมดูลมาตรฐานและมาพร้อมกับ Ubuntu โดยค่าเริ่มต้น
Sergiy Kolodyazhnyy


คุณใช้ Ubuntu รุ่นใดอยู่
วิลเลียม

@LiamWilliam 16.04 LTS แต่python3-giก็มาเป็นค่าเริ่มต้นใน 14.04 LTS ฉันไม่รู้เกี่ยวกับรุ่นก่อนหน้านี้
Sergiy Kolodyazhnyy
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.