Giriş
Aşağıdaki komut dosyası iki pencere seçmeye izin verir ve her iki pencere açıkken, kullanıcı her ikisini de odakladığında her iki pencereyi de yükseltir. Örneğin, eğer A ve B dulları birbirine bağlarsa, ya A ya da B'ye geçmek her ikisini de diğer dulların üzerine çıkarır.
Komut dosyasını durdurmak için killall link_windows.py
terminalde kullanabilir veya pencerelerden birini kapatıp yeniden açabilirsiniz . Ayrıca X, pencere seçimi açılır iletişim kutularından herhangi birinde kapat düğmesine basarak yürütmeyi iptal edebilirsiniz .
Potansiyel ayarlamalar:
- iki pencerenin çiftlerini gruplandırmak için betiğin birden çok örneği kullanılabilir. Örneğin, A, B, C ve D pencerelerimiz varsa, A ve B'yi birbirine bağlayabilir ve C ve D'yi birbirine bağlayabiliriz.
- birden çok pencere tek bir pencere altında gruplandırılabilir. Örneğin, B penceresini A, C'den A'ya ve D'yi A'ya bağlarsam, her zaman A'ya geçersem, aynı anda 4 pencereyi de kaldırabilirim.
kullanım
Komut dosyasını şu şekilde çalıştırın:
python link_windows.py
Komut dosyası Python 3 ile uyumlu olduğundan,
python3 link_windows.py
İki komut satırı seçeneği vardır:
--quiet
veya -q
, GUI pencerelerinin sessizleştirilmesine izin verir. Bu seçenekle herhangi bir pencerede fare ile tıklayabilirsiniz ve komut dosyası bunları bağlamaya başlayacaktır.
--help
veya -h
kullanım ve açıklama bilgilerini yazdırır.
-h
Seçenek aşağıdaki bilgileri üretir:
$ python3 link_windows.py -h
usage: link_windows.py [-h] [--quiet]
Linker for two X11 windows.Allows raising two user selected windows together
optional arguments:
-h, --help show this help message and exit
-q, --quiet Blocks GUI dialogs.
Ek teknik bilgiler aracılığıyla görülebilir pydoc ./link_windows.py
, nereye ./
komut dosyası ile aynı dizinde olmalıdır anlamına hangi.
İki pencere için basit kullanım süreci:
Bir pencere # seçmenizi, basın OKveya vurmanızı isteyen bir açılır pencere görünecektir Enter. Fare işaretçisi çarpı işaretine dönüşür. Bağlamak istediğiniz pencerelerden birini tıklayın.
2. pencereyi seçmenizi, basın OKveya vurmanızı isteyen ikinci bir açılır pencere görüntülenir Enter. Fare işaretçisi bir çarpı işaretine dönüşecektir. Bağlamak istediğiniz diğer pencereye tıklayın. Bundan sonra icra başlayacak.
Her iki pencereden birine odaklandığınızda, komut dosyası diğer pencereyi yukarı kaldırır, ancak odağı orijinal olarak seçilen pencereye döndürür (not - en iyi performans için ikinci bir gecikmenin çeyreği ile), böylece pencerelerin birbirine bağlı olduğu hissini yaratır.
Aynı pencereyi iki kez seçerseniz, komut dosyası kapanır. Herhangi bir anda açılır iletişim kutusunun kapat düğmesini tıklarsanız, komut dosyası kapanır.
Komut dosyası kaynağı
GitHub Gist olarak da mevcut
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
Author: Sergiy Kolodyazhnyy
Date: August 2nd, 2016
Written for: https://askubuntu.com/q/805515/295286
Tested on Ubuntu 16.04 LTS
"""
import gi
gi.require_version('Gdk', '3.0')
gi.require_version('Gtk', '3.0')
from gi.repository import Gdk, Gtk
import time
import subprocess
import sys
import argparse
def run_cmd(cmdlist):
""" Reusable function for running shell commands"""
try:
stdout = subprocess.check_output(cmdlist)
except subprocess.CalledProcessError:
sys.exit(1)
else:
if stdout:
return stdout
def focus_windows_in_order(first, second, scr):
"""Raise two user-defined windows above others.
Takes two XID integers and screen object.
Window with first XID will have the focus"""
first_obj = None
second_obj = None
for window in scr.get_window_stack():
if window.get_xid() == first:
first_obj = window
if window.get_xid() == second:
second_obj = window
# When this function is called first_obj is alread
# raised. Therefore we must raise second one, and switch
# back to first
second_obj.focus(int(time.time()))
second_obj.get_update_area()
# time.sleep(0.25)
first_obj.focus(int(time.time()))
first_obj.get_update_area()
def get_user_window():
"""Select two windows via mouse. Returns integer value of window's id"""
window_id = None
while not window_id:
for line in run_cmd(['xwininfo', '-int']).decode().split('\n'):
if 'Window id:' in line:
window_id = line.split()[3]
return int(window_id)
def main():
""" Main function. This is where polling for window stack is done"""
# Parse command line arguments
arg_parser = argparse.ArgumentParser(
description="""Linker for two X11 windows.Allows raising """ +
"""two user selected windows together""")
arg_parser.add_argument(
'-q','--quiet', action='store_true',
help='Blocks GUI dialogs.',
required=False)
args = arg_parser.parse_args()
# Obtain list of two user windows
user_windows = [None, None]
if not args.quiet:
run_cmd(['zenity', '--info', '--text="select first window"'])
user_windows[0] = get_user_window()
if not args.quiet:
run_cmd(['zenity', '--info', '--text="select second window"'])
user_windows[1] = get_user_window()
if user_windows[0] == user_windows[1]:
run_cmd(
['zenity', '--error', '--text="Same window selected. Exiting"'])
sys.exit(1)
screen = Gdk.Screen.get_default()
flag = False
# begin watching for changes in window stack
while True:
window_stack = [window.get_xid()
for window in screen.get_window_stack()]
if user_windows[0] in window_stack and user_windows[1] in window_stack:
active_xid = screen.get_active_window().get_xid()
if active_xid not in user_windows:
flag = True
if flag and active_xid == user_windows[0]:
focus_windows_in_order(
user_windows[0], user_windows[1], screen)
flag = False
elif flag and active_xid == user_windows[1]:
focus_windows_in_order(
user_windows[1], user_windows[0], screen)
flag = False
else:
break
time.sleep(0.15)
if __name__ == "__main__":
main()
Notlar:
- Komut satırından çalıştırıldığında, açılır iletişim kutuları aşağıdaki iletiyi oluşturur:
Gtk-Message: GtkDialog mapped without a transient parent. This is discouraged.
Bunlar yok sayılabilir.
- Danışmak Unity'deki yeni başlatıcı öğelerini elle nasıl düzenleyebilir / oluşturabilirim? çift tıklatarak başlatmak istiyorsanız, bu komut dosyası için bir başlatıcı veya masaüstü kısayolu oluşturmak için
- Bu komut dosyasını kolay erişim için bir klavye kısayoluna bağlamak için bkz. Klavye kısayolları nasıl eklenir?