আমি কীভাবে উইন্ডোজগুলিকে এক হিসাবে উত্থাপিত করতে গ্রুপ করব?


10

আমার দুটি উইন্ডো রয়েছে, এ এবং বি আছে, কীভাবে কোনওভাবে দুটি উইন্ডোকে একসাথে যুক্ত করা সম্ভব, যেমন এ-এ স্যুইচ করাও বি উত্থাপন করে, বা বিতে স্যুইচিংও এটিকে উত্থাপন করে?

আমি বুঝতে পারি যে একাধিক ওয়ার্কস্পেস ব্যবহার করা একটি বিকল্প বিকল্প তবে ভাবছিলাম যে এটি কি সম্ভব?


জেড-অর্ডার অত্যন্ত গুরুত্বপূর্ণ নয় তবে যদি সম্ভব হয় তবে দুর্দান্ত হবে
সাইমন টং

আমি মনে করি একাধিক কর্মস্থলগুলি এখন পর্যন্ত সবচেয়ে সহজ সমাধান। আপনি কি তাদের মধ্যে স্যুইচিংয়ের মূল সংমিশ্রণগুলি জানেন?
থোমাসরুটটার

1
আপনি একজন দ্রুত গ্রাহক :) তা সত্ত্বেও, আপনি যদি আমার উত্তর সম্পর্কে কিছু মন্তব্য করেন তবে তা প্রশংসা করবে।
জ্যাকব Vlijm

উত্তর:


9

ভূমিকা

নিম্নলিখিত স্ক্রিপ্টটি দুটি উইন্ডো নির্বাচন করার অনুমতি দেয় এবং উভয় উইন্ডো খোলা থাকাকালীন ব্যবহারকারী উভয়টিতে একটিতে দৃষ্টি নিবদ্ধ করলে এটি উভয় উইন্ডোকে বাড়িয়ে তুলবে। উদাহরণস্বরূপ, যদি কেউ বিধবা 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, জিইউআই উইন্ডোগুলি নিঃশব্দ করার অনুমতি দেয়। এই বিকল্পের সাহায্যে আপনি যে কোনও দুটি উইন্ডোতে মাউস দিয়ে ক্লিক করতে পারেন, এবং স্ক্রিপ্টটি তাদের লিঙ্ক করা শুরু করবে।
  • --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. একটি পপআপ আপনাকে উইন্ডো # 1 নির্বাচন করতে, চাপতে OKবা হিট করতে বলবে Enter। মাউস পয়েন্টারটি একটি ক্রসে পরিণত হবে। আপনি যে উইন্ডোটি লিঙ্ক করতে চান তার একটিতে ক্লিক করুন।

  2. দ্বিতীয় পপআপ আপনাকে উইন্ডো # 2 নির্বাচন করতে, চাপতে OKবা হিট করতে বলবে Enter। আবার, মাউস পয়েন্টারটি ক্রসে পরিণত হবে you আপনি যে উইন্ডোটি লিঙ্ক করতে চান সেটিতে ক্লিক করুন। এরপরে ফাঁসি কার্যকর করা শুরু হবে।

  3. যখনই আপনি উভয় উইন্ডোতে ফোকাস করবেন, স্ক্রিপ্টটি অন্য উইন্ডোটিকে উপরে উঠিয়ে দেবে, তবে মূলভাবে নির্বাচিত একটিতে ফোকাসটি ফিরিয়ে দেবে (দ্রষ্টব্য - সেরা পারফরম্যান্সের জন্য দ্বিতীয় দেরির এক চতুর্থাংশ সহ) উইন্ডোজগুলি একত্রে যুক্ত রয়েছে বলে মনে করে।

আপনি যদি একই সময় উভয় সময় নির্বাচন করেন তবে স্ক্রিপ্টটি বন্ধ হবে। যদি কোনও মুহুর্তে আপনি পপআপ ডায়ালগের ক্লোজ বোতামটি ক্লিক করেন তবে স্ক্রিপ্টটি বন্ধ হয়ে যাবে।

স্ক্রিপ্ট উত্স

গিটহাব গিস্ট হিসাবেও উপলব্ধ

#!/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()

মন্তব্য:


চিয়ার্স আমি সত্যিই মুগ্ধ। time.sleepসুইচিং মধ্যে বিট, আমি লাগাতে শূন্য করতে পারি? দেরি করার কোন কারণ আছে কি?
সাইমন টং 5 ই

1
@ সিমন্ত আপনি এই লাইনের মত মন্তব্য করার চেষ্টা করতে পারেন # time.sleep(0.25)এবং এটি কার্যকর হবে না। এর কারণটি হ'ল প্রতিটি উইন্ডো যথাযথভাবে উত্থিত হয়েছে তা নিশ্চিত করা। অতীতে আমার অভিজ্ঞতায় উইন্ডোজে অপারেটিংয়ের জন্য আমার বিলম্ব হওয়া দরকার ছিল। আমি ভাবব কোয়ার্টার-সেকেন্ড বিলম্ব এতটা নয়। আসলে, আমাকে স্ক্রিপ্টে আরও একটি লাইন যুক্ত করুন, এটি এটির গতি বাড়িয়ে দিতে পারে। ঠিক আছে ?
সের্গেই কোলোডিয়াজনি

@ সিমন্টং ঠিক আছে, আমি স্ক্রিপ্টটি আপডেট করেছি। এটি এখন চেষ্টা করুন. দ্রুত স্যুইচিং করা উচিত
সের্গেই কলডিয়াজহনি

@ সিমন্টং আমি কয়েকটি অতিরিক্ত বৈশিষ্ট্য যুক্ত করতে কিছু ছোটখাটো সংযোজন সহ স্ক্রিপ্টটি আপডেট করব। এটি প্রস্তুত হওয়ার পরে আমি আপনাকে জানাব, আপনি কী ভাবছেন তা দয়া করে আমাকে জানান
সের্গেই কোলোডিয়াজহনি

স্ক্রিপ্ট যোগ করা অতিরিক্ত অপশন @simontong, পর্যালোচনা করুন
Sergiy Kolodyazhnyy

6

এক হিসাবে উইন্ডোজ একটি স্বেচ্ছাসেবী সংখ্যা উত্থাপন

নীচের সমাধানটি আপনাকে দুটি, তিন বা ততোধিক উইন্ডোর সংমিশ্রণ করতে এবং কীবোর্ড শর্টকাটের সাথে এক হিসাবে উত্থাপনের জন্য যে কোনও সমন্বয় চয়ন করতে দেয়।

স্ক্রিপ্টটি তিনটি যুক্তি দিয়ে কাজ করে:

add

গ্রুপে সক্রিয় উইন্ডো যুক্ত করতে

raise

সেট গ্রুপ বাড়াতে

clear

গোষ্ঠীটি সাফ করার জন্য, একটি নতুন গ্রুপ সংজ্ঞায়িত করতে প্রস্তুত

এই পান্ডুলিপি

#!/usr/bin/env python3
import sys
import os
import subprocess

wlist = os.path.join(os.environ["HOME"], ".windowlist")

arg = sys.argv[1]

if arg == "add":
    active = subprocess.check_output([
        "xdotool", "getactivewindow"
        ]).decode("utf-8").strip()
    try:
        currlist = open(wlist).read()
    except FileNotFoundError:
        currlist = []
    if not active in currlist:
        open(wlist, "a").write(active + "\n")
elif arg == "raise":
    group = [w.strip() for w in open(wlist).readlines()]
    [subprocess.call(["wmctrl", "-ia", w]) for w in group]
elif arg == "clear":
    os.remove(wlist)

ব্যবহারবিধি

  1. স্ক্রিপ্টের প্রয়োজন wmctrlএবং xdotool:

    sudo apt-get install wmctrl xdotool
  2. উপরের স্ক্রিপ্টটি একটি খালি ফাইলে অনুলিপি করুন, এটি সংরক্ষণ করুন groupwindows.py
  3. স্ক্রিপ্টটি পরীক্ষা করুন: দুটি টার্মিনাল উইন্ডো খুলুন, কমান্ডটি চালান:

    python3 /absolute/path/to/groupwindows.py add

    উভয় মধ্যে। এগুলি অন্যান্য উইন্ডো দিয়ে Coverেকে রাখুন (বা এগুলি ছোট করুন)। তৃতীয় টার্মিনাল উইন্ডোটি খুলুন, কমান্ডটি চালান:

    python3 /absolute/path/to/groupwindows.py raise

    প্রথম দুটি উইন্ডো এক হিসাবে উত্থাপিত হবে।

  4. যদি সমস্ত ঠিকঠাক কাজ করে তবে তিনটি কাস্টম শর্টকাট কী তৈরি করুন: চয়ন করুন: সিস্টেম সেটিংস> "কীবোর্ড"> "শর্টকাট"> "কাস্টম শর্টকাট"। "+" ক্লিক করুন এবং নীচে তিনটি পৃথক শর্টকাটে কমান্ড যুক্ত করুন:

    আমার সিস্টেমে, আমি ব্যবহার করেছি:

    Alt+ + A, কমান্ড চালানোর:

    python3 /absolute/path/to/groupwindows.py add

    ... গ্রুপে একটি উইন্ডো যুক্ত করতে।

    Alt+ + R, কমান্ড চালানোর:

    python3 /absolute/path/to/groupwindows.py raise

    ... দল বাড়াতে

    Alt+ + C, কমান্ড চালানোর:

    python3 /absolute/path/to/groupwindows.py clear

    ... গ্রুপ সাফ করার জন্য

ব্যাখ্যা

স্ক্রিপ্টটি বেশ সহজভাবে কাজ করে:

  • যখন আর্গুমেন্ট দিয়ে চালানো হয় add, স্ক্রিপ্টটি সক্রিয় উইন্ডোর উইন্ডো-আইডিটিকে একটি লুকানো ফাইলে সংরক্ষণ করে / যুক্ত করে~/.windowlist
  • যখন আর্গুমেন্ট দিয়ে চালানো হয় raise, স্ক্রিপ্ট ফাইলটি পড়ে, কমান্ডটি দিয়ে তালিকায় উইন্ডো উত্থাপন করে:

    wmctrl -ia <window_id>
  • যুক্তি দিয়ে চালানো হলে clear, স্ক্রিপ্টটি লুকানো ফাইলটি সরিয়ে দেয় ~/.windowlist

মন্তব্য

  • স্ক্রিপ্টটি ন্যূনতম উইন্ডোজগুলিতেও কাজ করবে, এটি সম্ভবত মিনিমাইজ করা উইন্ডোজকে সর্বনিম্ন করবে
  • যদি উইন্ডোগুলির সেট অন্য ভিউপোর্টে থাকে তবে স্ক্রিপ্টটি সংশ্লিষ্ট ভিউপোর্টে স্যুইচ করবে
  • সেটটি ফ্লেক্সিবল, আপনি সর্বদা বর্তমান সেটে অন্যান্য উইন্ডোজ যুক্ত করতে পারেন।

আরও নমনীয়তা?

উল্লিখিত হিসাবে, উপরের স্ক্রিপ্টটি গ্রুপযুক্ত উইন্ডোগুলিতে যে কোনও সময় উইন্ডো যুক্ত করতে দেয়। সংস্করণ নীচে মঞ্জুরি দেয় সরানোর দলবদ্ধ তালিকা থেকে উইন্ডোগুলি (যে কোন সময়ে) মধ্যে একটি:

#!/usr/bin/env python3
import sys
import os
import subprocess

wlist = os.path.join(os.environ["HOME"], ".windowlist")
arg = sys.argv[1]
# add windows to the group
if arg == "add":
    active = subprocess.check_output([
        "xdotool", "getactivewindow"
        ]).decode("utf-8").strip()
    try:
        currlist = open(wlist).read()
    except FileNotFoundError:
        currlist = []
    if not active in currlist:
        open(wlist, "a").write(active + "\n")
# delete window from the group
if arg == "delete":
    try:
        currlist = [w.strip() for w in open(wlist).readlines()]
    except FileNotFoundError:
        pass
    else:
        currlist.remove(subprocess.check_output([
            "xdotool", "getactivewindow"]).decode("utf-8").strip())      
        open(wlist, "w").write("\n".join(currlist)+"\n")
# raise the grouped windows
elif arg == "raise":
    group = [w.strip() for w in open(wlist).readlines()]
    [subprocess.call(["wmctrl", "-ia", w]) for w in group]
# clear the grouped window list
elif arg == "clear":
    os.remove(wlist)

স্ক্রিপ্টটি চালানোর জন্য অতিরিক্ত যুক্তি হ'ল delete:

python3 /absolute/path/to/groupwindows.py delete

গোষ্ঠীযুক্ত উইন্ডোগুলি থেকে সক্রিয় উইন্ডোটি মুছে দেয়। এই কমান্ড চালাতে, আমার সিস্টেম উপর, আমি সেট Alt+ + Dশর্টকাট হিসাবে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.