Nội dung:
- Tổng quat
- Nguồn kịch bản
- Ghi chú bổ sung
1. Sơ lượt
Như đã đề cập trong các nhận xét, chức năng này rõ ràng đã bị xóa kể từ ngày 12.04 và bây giờ nhấp vào biểu tượng trình khởi chạy thu nhỏ cửa sổ (rõ ràng là một tính năng được yêu cầu cao, từ những gì tôi có thể thấy trong các tìm kiếm trực tuyến của mình). Tuy nhiên, tồn tại một bàn phím để bật expo cho một cửa sổ duy nhất, đó là Super+ Ctrl+ W. Biết rằng, nếu chúng ta có thể phát hiện nhấp vào trình khởi chạy hoặc vị trí của con trỏ khi cửa sổ được nâng lên, thì chúng ta có thể mô phỏng triển lãm cửa sổ duy nhất đó thông qua phím tắt đó. Kịch bản dưới đây thực hiện chính xác điều đó.
Điều này có nghĩa là được lưu dưới dạng /usr/bin/single_click_expo.py
tệp và được thêm vào Ứng dụng khởi động
2. Nguồn kịch bản
Cũng có sẵn trên 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. Ghi chú bổ sung
- Có thể nên ánh xạ lại phím tắt sang thứ khác Super+ Ctrl+ W, vì trong expo Ctrl+ Wtrong Expo tương ứng với lệnh "đóng cửa sổ". Vấn đề tiềm ẩn ở đây là việc chuyển đổi thường xuyên có thể gây ra đóng cửa sổ. Kịch bản sẽ phải được điều chỉnh cho phù hợp.
GHI CHÚ:
Các kịch bản dựa trên xdotool
tiện ích. Bạn phải cài đặt nó. Không có xdotool
nó sẽ không hoạt động, vì xdotool
được sử dụng để mô phỏng nhấn phím. Cài đặt nó quasudo apt-get install xdotool