CHỈNH SỬA
(Câu trả lời mới)
LÀM XONG.
Câu trả lời dưới đây hiện có sẵn ở dạng đánh bóng, dưới dạng chỉ báo, dưới dạng ppa cho Trusty, Xenial, Yakkety và Zesty:
sudo apt-add-repository ppa:vlijm/windowspy
sudo apt-get update
sudo apt-get install windowspy
Chỉ báo (bao gồm cả cửa sổ xem trước) hiện đang ở mức thấp. Các tùy chọn bao gồm cửa sổ cài đặt, cài đặt kích thước / màu viền cửa sổ, kích thước cửa sổ.
Trong khi đó, tôi thấy thật hữu ích khi để mắt đến cửa sổ AU; xem có tin nhắn nào không :)
TRẢ LỜI
( khái niệm thô thứ hai đầu tiên )
Có một đại diện tối thiểu của một cửa sổ trên không gian làm việc khác
Đối với sự ngạc nhiên (lớn) của riêng tôi, nó có thể được thực hiện một cách hiệu quả , có thể là với mánh khóe và lừa dối; có một đại diện cập nhật của một cửa sổ trên không gian làm việc khác. Không phù hợp để xem phim, chắc chắn đủ tốt để theo dõi cửa sổ ở nơi khác (ví dụ: cửa sổ thẻ tv của tôi):
Làm thế nào nó hoạt động trong thực tế
Với cửa sổ phía trước, bấm phím tắt:
(cửa sổ sẽ thu nhỏ)
Di chuyển đến không gian làm việc khác, nhấn phím tắt một lần nữa, một đại diện nhỏ của cửa sổ sẽ xuất hiện, cập nhật cứ sau 4 giây:
Cửa sổ luôn hiển thị trên đầu các cửa sổ khác. Như vậy, cửa sổ có kích thước 300px (chiều rộng), nhưng có thể được đặt thành bất kỳ kích thước nào.
Để kết thúc nó, nhấn (một lần nữa) phím tắt. Cửa sổ nhỏ sẽ đóng lại, bạn sẽ di chuyển đến khung nhìn của cửa sổ ban đầu, nó sẽ xuất hiện lại, không bị tối ưu hóa.
Các kịch bản
Kịch bản điều khiển
#!/usr/bin/env python3
import subprocess
import os
import sys
import time
# paths
imagepath = os.path.join(os.environ["HOME"], ".showcase")
wfile = os.path.join(imagepath, "currentwindow")
vpfile = os.path.join(imagepath, "last_vp")
# setup path
if not os.path.exists(imagepath):
os.mkdir(imagepath)
def get(command):
try:
return subprocess.check_output(command).decode("utf-8").strip()
except subprocess.CalledProcessError:
pass
def get_vp():
open(vpfile, "wt").write(get(["wmctrl", "-d"]).split()[5])
def run(command):
subprocess.Popen(command)
def convert_tohex(widxd):
return widxd[:2]+((10-len(widxd))*"0")+widxd[2:]
def check_windowtype(wid):
check = get(["xprop", "-id", wid])
return not any([s in check for s in [
"_NET_WM_WINDOW_TYPE_DOCK",
"_NET_WM_WINDOW_TYPE_DESKTOP"]])
def edit_winprops(wid, convert=True):
run(["xdotool", "windowminimize", wid])
if convert:
widxd = convert_tohex(hex(int(wid)))
else:
widxd = wid
run(["wmctrl", "-i", "-r", widxd, "-b", "add,sticky"])
get_vp()
open(os.path.join(imagepath, "currentwindow"), "wt").write(widxd)
def initiate_min():
# if not, minmize window, write the file
wid = get(["xdotool", "getactivewindow"])
if check_windowtype(wid):
edit_winprops(wid)
else:
pidinfo = [l.split() for l in wlist.splitlines()]
match = [l for l in pidinfo if all([
get(["ps", "-p", l[2], "-o", "comm="]) == "VirtualBox",
not "Manager" in l])]
if match:
edit_winprops(match[0][0], convert=False)
# windowlist
wlist = get(["wmctrl", "-lp"])
if "Window preview" in wlist:
# kill the miniwindow
pid = get(["pgrep", "-f", "showmin"])
run(["kill", pid])
window = open(wfile).read().strip()
viewport = open(vpfile).read().strip()
run(["wmctrl", "-o", viewport])
time.sleep(0.3)
run(["wmctrl", "-i", "-r", window, "-b", "remove,sticky"])
run(["wmctrl", "-ia", window])
os.remove(wfile)
else:
# check if windowfile exists
wfileexists = os.path.exists(wfile)
if wfileexists:
# if file exists, try to run miniwindow
window = open(wfile).read().strip()
if window in wlist:
# if the window exists, run!
run(["showmin", window])
else:
# if not, minmize window, write the file
initiate_min()
else:
# if not, minmize window, write the file
initiate_min()
Cửa sổ đại diện
#!/usr/bin/env python3
import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk, GObject
from PIL import Image
import os
import subprocess
import time
from threading import Thread
import sys
wid = sys.argv[1]
xsize = 300
imagepath = os.path.join(os.environ["HOME"], ".showcase")
if not os.path.exists(imagepath):
os.mkdir(imagepath)
img_in = os.path.join(imagepath, "image.png")
resized = os.path.join(imagepath, "resized.png")
def get_img():
subprocess.Popen([
"import", "-window", wid, "-resize", str(xsize), resized
])
get_img()
class Splash(Gtk.Window):
def __init__(self):
Gtk.Window.__init__(self, title="Window preview")
maingrid = Gtk.Grid()
self.add(maingrid)
self.image = Gtk.Image()
# set the path to the image below
self.resized = resized
self.image.set_from_file(self.resized)
maingrid.attach(self.image, 0, 0, 1, 1)
maingrid.set_border_width(3)
self.update = Thread(target=self.update_preview)
self.update.setDaemon(True)
self.update.start()
def update_preview(self):
while True:
get_img()
time.sleep(3)
GObject.idle_add(
self.image.set_from_file, self.resized,
priority=GObject.PRIORITY_DEFAULT
)
def miniwindow():
window = Splash()
window.set_decorated(False)
window.set_resizable(False)
window.set_keep_above(True)
window.set_wmclass("ShowCase", "showcase")
window.connect("destroy", Gtk.main_quit)
GObject.threads_init()
window.show_all()
window.move(70, 50)
Gtk.main()
miniwindow()
Cách sử dụng
Cài đặt python3-pil
, xdotool
vàwmctrl
sudo apt-get install xdotool wmctrl python3-pil
Tạo, nếu nó chưa tồn tại, thư mục ~/bin
.
- Sao chép tập lệnh 1, anh ta kiểm soát tập lệnh, như (chính xác)
showcase_control
(không có phần mở rộng) trong ~/bin
và làm cho tập lệnh thực thi .
- Sao chép tập lệnh 2, tập lệnh cửa sổ nhỏ, dưới dạng (chính xác)
showmin
(không có phần mở rộng) ~/bin
và làm cho tập lệnh thực thi .
Đăng xuất và đăng nhập lại và thêm lệnh sau vào lối tắt bạn chọn:
showcase_control
Chọn: Cài đặt hệ thống> "Bàn phím"> "Phím tắt"> "Phím tắt tùy chỉnh". Nhấp vào "+" và thêm lệnh:
showcase_control
và nó nên hoạt động!
- Nhấn phím một lần để lấy cửa sổ hiện tại
- di chuyển đến không gian làm việc khác nơi bạn thích cửa sổ nhỏ
- Nhấn một lần nữa để hiển thị miniwindow
- Nhấn một lần nữa để di chuyển trở lại không gian làm việc ban đầu, (tự động) bỏ thu nhỏ cửa sổ ban đầu và đóng mini -one.
Nhược điểm?
Việc thiết lập, như hiện tại, thêm một số công việc cho bộ xử lý của bạn. Tuy nhiên, trên hệ thống cũ (rất) của tôi, nó bổ sung (trung bình) appr. 4-5% tôi nghĩ, điều mà tôi đã không nhận thấy bằng bất kỳ cách nào.
Cập nhật: Hóa ra import
có thể thay đổi kích thước hình ảnh trong một bước, cùng với tìm nạp hình ảnh cửa sổ. Điều này có nghĩa là giảm đáng kể tải bộ xử lý. Đồng thời thời gian làm mới ngắn hơn (3 giây bây giờ), vẫn với "chi phí" thấp hơn.
Giải trình
- Điểm xuất phát của tôi là cách OP đề cập rằng anh ấy muốn sử dụng tùy chọn để theo dõi một cửa sổ trên một không gian làm việc khác, chờ đợi một cái gì đó kết thúc.
- Trong khi theo nghĩa đen có một chính xác (mini) sao chép của một cửa sổ trên không gian làm việc khác dường như không thể, chúng ta có thể làm cho một hình ảnh của một cửa sổ hiện tại với
import
-Command, một khi chúng ta có id cửa sổ. Mặc dù cả hai đều hoạt động trên các cửa sổ hoặc cửa sổ thu nhỏ mà không tập trung, tuy nhiên có một vấn đề: cửa sổ cần phải ở trên không gian làm việc hiện tại .
- Thủ thuật sau đó là tạm thời (trong khi cửa sổ nhỏ được sử dụng) làm cho cửa sổ "dính" (hầu như có sẵn trên tất cả các không gian làm việc) với
wmctrl
, nhưng được thu nhỏ cùng một lúc.
- Vì tất cả được thực hiện tự động, nên sự khác biệt có hiệu quả là không có, vì cũng quay lại chế độ xem ban đầu, "un-" dán cửa sổ ban đầu và bỏ tối thiểu nó, được thực hiện tự động.
Nói ngắn gọn:
- Nhấn phím tắt một lần: cửa sổ được nhắm mục tiêu được thực hiện dính, nhưng được thu nhỏ
- Nhấn lại lần nữa (có lẽ là trên một không gian làm việc khác): một phiên bản nhỏ của cửa sổ xuất hiện ở góc trên bên trái, được cập nhật một lần trong bốn giây.
- Nhấn lại lần nữa: cửa sổ mini được đóng lại, màn hình nền di chuyển đến không gian làm việc ban đầu của cửa sổ, cửa sổ được khôi phục không dính và không thu nhỏ.
Cụ thể cho VirtualBox
Khi cửa sổ VBox ở phía trước, hóa ra các phím tắt Ubuntu bị vô hiệu hóa (!), Vì vậy tập lệnh điều khiển cần được khởi chạy theo cách khác. Dưới đây một vài cái ngắn gọn.
lựa chọn 1
Tôi đã chỉnh sửa tập lệnh điều khiển. Bây giờ chỉ trong trường hợp VirtualBox:
Nhấp vào bất cứ nơi nào trên máy tính để bàn, sau đó nhấn phím tắt của bạn. Sau đó, chỉ cần sử dụng phím tắt để hiển thị cửa sổ và thoát.
Giải thích: Tập lệnh điều khiển được tạo để thoát nếu cửa sổ thuộc loại "máy tính để bàn", vì bạn sẽ không muốn thu nhỏ màn hình. Bây giờ tập lệnh trước tiên tìm các cửa sổ VirtualBox có thể có, để nhắm mục tiêu, nếu cửa sổ hiện đang hoạt động là máy tính để bàn.
Lựa chọn 2
Sao chép biểu tượng bên dưới (nhấp chuột phải -> lưu dưới dạng), lưu dưới dạng minwinicon.png
Sao chép các dòng dưới đây vào một tệp trống, lưu nó như minwin.desktop
trong ~/.local/share/applications
:
[Desktop Entry]
Type=Application
Name=Window Spy
Exec=showcase_control
Icon=/path/to/minwinicon.png
StartupNotify=false
Bạn cần đăng xuất và đăng nhập lại để trình khởi chạy "tìm" ~/bin
đường dẫn cục bộ !
Kéo biểu tượng vào trình khởi chạy để sử dụng nó.
Giải pháp thứ hai có một nhược điểm quan trọng: sau khi sử dụng nó từ trình khởi chạy, nó sẽ tiếp tục nhấp nháy trong vài giây, chờ đợi một cửa sổ xuất hiện. Trong thời gian đó, nhấp lại sẽ không có hiệu lực. Điều đó có thể được giải quyết, như được mô tả ở đây , nhưng bao gồm điều đó trong câu trả lời này sẽ thực sự làm cho nó quá dài. Nếu bạn muốn sử dụng tùy chọn hai, vui lòng xem liên kết.