परिचय
निम्नलिखित स्क्रिप्ट दो विंडो का चयन करने की अनुमति देता है, और जब दोनों खिड़कियां खुली होती हैं, तो यह दोनों खिड़कियों को तब बढ़ाएगा जब उपयोगकर्ता किसी एक पर ध्यान केंद्रित करता है। उदाहरण के लिए, यदि कोई लिंक A और B को चौड़ा करता है, तो A या B में से दोनों को दूसरी विधवाओं से ऊपर उठाया जाएगा।
स्क्रिप्ट को बंद करने के लिए आप killall link_windows.py
टर्मिनल में उपयोग कर सकते हैं , या किसी एक विंडो को बंद करके फिर से खोल सकते हैं। आप Xविंडो-सेलेक्शन पॉपअप डायलॉग्स में से किसी पर भी क्लोज बटन दबाकर एक्जीक्यूशन रद्द कर सकते हैं ।
संभावित मोड़:
- स्क्रिप्ट के कई उदाहरणों का उपयोग दो खिड़कियों के समूह जोड़े के लिए किया जा सकता है। उदाहरण के लिए, यदि हमारे पास ए, बी, सी और डी हैं, तो हम ए और बी को एक साथ जोड़ सकते हैं, और सी और डी को एक साथ जोड़ सकते हैं।
- एक सिंगल विंडो के तहत कई विंडो को समूहीकृत किया जा सकता है। उदाहरण के लिए, अगर मैं विंडो B को A, C से A, और D से A से लिंक करता हूं, तो इसका मतलब है कि अगर मैं हमेशा A से स्विच करता हूं, तो मैं एक ही समय में सभी 4 विंडो उठा सकता हूं।
प्रयोग
स्क्रिप्ट को इस रूप में चलाएँ:
python link_windows.py
स्क्रिप्ट पायथन 3 के साथ संगत है, इसलिए इसे भी चला सकते हैं
python3 link_windows.py
दो कमांड लाइन विकल्प हैं:
--quiet
या -q
, GUI विंडो को बंद करने की अनुमति देता है। इस विकल्प के साथ आप किसी भी दो विंडो पर माउस से क्लिक कर सकते हैं, और स्क्रिप्ट उन लोगों को जोड़ना शुरू कर देगी।
--help
या -h
, उपयोग और विवरण की जानकारी प्रिंट करता है।
-h
विकल्प निम्न जानकारी का उत्पादन:
$ 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.
अतिरिक्त तकनीकी जानकारी के माध्यम से देखा जा सकता है pydoc ./link_windows.py
, जहां ./
यह दर्शाता है कि आपको स्क्रिप्ट के समान निर्देशिका में होना चाहिए।
दो खिड़कियों के लिए सरल उपयोग प्रक्रिया:
एक पॉपअप आपको एक विंडो # 1 का चयन करने के लिए कहेगा, प्रेस OKया हिट Enter। माउस पॉइंटर एक क्रॉस में बदल जाएगा। उन खिड़कियों में से एक पर क्लिक करें जिन्हें आप लिंक करना चाहते हैं।
एक दूसरा पॉपअप आपको विंडो # 2 का चयन करने के लिए कहेगा, प्रेस OKया हिट Enter। फिर से, माउस पॉइंटर एक क्रॉस में बदल जाएगा। उस दूसरी विंडो पर क्लिक करें जिसे आप लिंक करना चाहते हैं। उसके बाद अमल शुरू हो जाएगा।
जब भी आप या तो खिड़की पर ध्यान केंद्रित करते हैं, तो स्क्रिप्ट दूसरी विंडो को ऊपर उठाएगी, लेकिन मूल रूप से चयनित (ध्यान दें - सर्वश्रेष्ठ प्रदर्शन के लिए एक सेकंड की देरी के एक चौथाई के साथ) पर ध्यान केंद्रित करें, इस प्रकार यह महसूस करते हुए कि खिड़कियां एक साथ जुड़ी हुई हैं।
यदि आप दोनों बार एक ही विंडो चुनते हैं, तो स्क्रिप्ट छोड़ देगा। यदि किसी भी समय आप पॉपअप संवाद के करीब बटन पर क्लिक करते हैं, तो स्क्रिप्ट छोड़ देगा।
लिपि स्रोत
GitHub Gist के रूप में भी उपलब्ध है
#!/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()
टिप्पणियाँ: