Групповые приложения / окна в Ubuntu [dубликат]

У меня есть два окна: A и B. Возможно ли каким-то образом связать два окна вместе, так что переключение на A также вызывает B, или переключение на B также увеличивает A?

Я понимаю, Рабочие пространства - альтернативный вариант, но было интересно, возможно ли это также?

9
задан 2 August 2016 в 16:37

11 ответов

Введение

Следующий скрипт позволяет выбрать два окна, и, хотя оба окна открыты, он будет поднимать оба окна, когда пользователь будет фокусироваться на одном. Например, если один из вдов вложений A и B, а для A или B будет делать оба рейза над другими вдовами.

Чтобы остановить скрипт, вы можете использовать killall link_windows.py в терминале или закрыть и снова открыть из окон. Вы также можете отменить выполнение, нажав кнопку закрытия X в любом из всплывающих диалоговых окон выбора окна.

Потенциальные настройки:

несколько экземпляров сценария могут использоваться для группировки пар двух окна. Например, если у нас есть окна A, B, C и D, мы можем связать A и B вместе и связывать C и D вместе. несколько окон могут быть сгруппированы под одним окном. Например, если я привязываю окно B к A, C к A и D к A, это означает, что если я всегда переключаюсь на A, я могу одновременно увеличить все 4 окна.

Использование

Запустите сценарий как:

python link_windows.py

Скрипт совместим с Python 3, поэтому он также может работать как

python3 link_windows.py

Существует две опции командной строки:

несколько экземпляров сценария могут использоваться для группировки пар из двух окон. Например, если у нас есть окна A, B, C и D, мы можем связывать A и B вместе и связывать C и D вместе. --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()

Примечания: Если вы нажимаете кнопку закрытия всплывающего диалогового окна,

--help или -h, печатает информацию об использовании и описании. несколько окон могут быть сгруппированы под одним окном. Например, если я привязываю окно B к A, C к A и D к A, это означает, что если я всегда переключаюсь на A, я могу одновременно увеличить все 4 окна. Чтобы связать этот скрипт для быстрого доступа к клавиатуре, проконсультируйтесь, как добавить сочетания клавиш?
9
ответ дан 18 July 2018 в 09:56

Введение

Следующий скрипт позволяет выбрать два окна, и, хотя оба окна открыты, он будет поднимать оба окна, когда пользователь будет фокусироваться на одном. Например, если один из вдов вложений A и B, а для A или B будет делать оба рейза над другими вдовами.

Чтобы остановить скрипт, вы можете использовать killall link_windows.py в терминале или закрыть и снова открыть из окон. Вы также можете отменить выполнение, нажав кнопку закрытия X в любом из всплывающих диалоговых окон выбора окна.

Потенциальные настройки:

несколько экземпляров сценария могут использоваться для группировки пар двух окна. Например, если у нас есть окна A, B, C и D, мы можем связать A и B вместе и связывать C и D вместе. несколько окон могут быть сгруппированы под одним окном. Например, если я привязываю окно B к A, C к A и D к A, это означает, что если я всегда переключаюсь на A, я могу одновременно увеличить все 4 окна.

Использование

Запустите сценарий как:

python link_windows.py

Скрипт совместим с Python 3, поэтому он также может работать как

python3 link_windows.py

Существует две опции командной строки:

несколько экземпляров сценария могут использоваться для группировки пар из двух окон. Например, если у нас есть окна A, B, C и D, мы можем связывать A и B вместе и связывать C и D вместе. --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()

Примечания: Если вы нажимаете кнопку закрытия всплывающего диалогового окна,

--help или -h, печатает информацию об использовании и описании. несколько окон могут быть сгруппированы под одним окном. Например, если я привязываю окно B к A, C к A и D к A, это означает, что если я всегда переключаюсь на A, я могу одновременно увеличить все 4 окна. Чтобы связать этот скрипт для быстрого доступа к клавиатуре, проконсультируйтесь, как добавить сочетания клавиш?
9
ответ дан 24 July 2018 в 19:28

Введение

Следующий сценарий позволяет выбрать два окна, и, хотя оба окна открыты, он поднимет оба окна, когда пользователь будет фокусироваться на одном. Например, если один из вдов вложений A и B, а для A или B будет делать оба рейза над другими вдовами.

Чтобы остановить скрипт, вы можете использовать killall link_windows.py в терминале или закрыть и снова открыть из окон. Вы также можете отменить выполнение, нажав кнопку закрытия X в любом из всплывающих диалоговых окон выбора окна.

Потенциальные настройки:

  • несколько экземпляров сценария могут использоваться для группировки пары двух окон. Например, если у нас есть окна A, B, C и D, мы можем связывать A и B вместе и связывать C и D вместе.
  • несколько окон могут быть сгруппированы под одним окном. Например, если я привязываю окно B к A, C к A и D к A, это означает, что если я всегда переключаюсь на A, я могу одновременно увеличить все 4 окна.

Использование

Запустите сценарий как:

python link_windows.py

Скрипт совместим с Python 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. Опять же, указатель мыши превратится в крест. Нажмите на другое окно, которое вы хотите связать. После этого начнется выполнение.
  3. Всякий раз, когда вы фокусируете любое окно, сценарий поднимает другое окно вверх, но возвращает фокус на тот, который был первоначально выбран (обратите внимание - с четвертью секундной задержки для лучшей производительности), создавая таким образом ощущение, что окна связаны между собой.

Если вы выберете одно и то же окно оба раза, сценарий завершится.

Источник скрипта

Также доступен как 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()

Примечания:

9
ответ дан 31 July 2018 в 22:31

Введение

Следующий сценарий позволяет выбрать два окна, и, хотя оба окна открыты, он поднимет оба окна, когда пользователь будет фокусироваться на одном. Например, если один из вдов вложений A и B, а для A или B будет делать оба рейза над другими вдовами.

Чтобы остановить скрипт, вы можете использовать killall link_windows.py в терминале или закрыть и снова открыть из окон. Вы также можете отменить выполнение, нажав кнопку закрытия X в любом из всплывающих диалоговых окон выбора окна.

Потенциальные настройки:

  • несколько экземпляров сценария могут использоваться для группировки пары двух окон. Например, если у нас есть окна A, B, C и D, мы можем связывать A и B вместе и связывать C и D вместе.
  • несколько окон могут быть сгруппированы под одним окном. Например, если я привязываю окно B к A, C к A и D к A, это означает, что если я всегда переключаюсь на A, я могу одновременно увеличить все 4 окна.

Использование

Запустите сценарий как:

python link_windows.py

Скрипт совместим с Python 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. Опять же, указатель мыши превратится в крест. Нажмите на другое окно, которое вы хотите связать. После этого начнется выполнение.
  3. Всякий раз, когда вы фокусируете любое окно, сценарий поднимает другое окно вверх, но возвращает фокус на тот, который был первоначально выбран (обратите внимание - с четвертью секундной задержки для лучшей производительности), создавая таким образом ощущение, что окна связаны между собой.

Если вы выберете одно и то же окно оба раза, сценарий завершится.

Источник скрипта

Также доступен как 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()

Примечания:

9
ответ дан 2 August 2018 в 17:15

Введение

Следующий сценарий позволяет выбрать два окна, и, хотя оба окна открыты, он поднимет оба окна, когда пользователь будет фокусироваться на одном. Например, если один из вдов вложений A и B, а для A или B будет делать оба рейза над другими вдовами.

Чтобы остановить скрипт, вы можете использовать killall link_windows.py в терминале или закрыть и снова открыть из окон. Вы также можете отменить выполнение, нажав кнопку закрытия X в любом из всплывающих диалоговых окон выбора окна.

Потенциальные настройки:

  • несколько экземпляров сценария могут использоваться для группировки пары двух окон. Например, если у нас есть окна A, B, C и D, мы можем связывать A и B вместе и связывать C и D вместе.
  • несколько окон могут быть сгруппированы под одним окном. Например, если я привязываю окно B к A, C к A и D к A, это означает, что если я всегда переключаюсь на A, я могу одновременно увеличить все 4 окна.

Использование

Запустите сценарий как:

python link_windows.py

Скрипт совместим с Python 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. Опять же, указатель мыши превратится в крест. Нажмите на другое окно, которое вы хотите связать. После этого начнется выполнение.
  3. Всякий раз, когда вы фокусируете любое окно, сценарий поднимает другое окно вверх, но возвращает фокус на тот, который был первоначально выбран (обратите внимание - с четвертью секундной задержки для лучшей производительности), создавая таким образом ощущение, что окна связаны между собой.

Если вы выберете одно и то же окно оба раза, сценарий завершится.

Источник скрипта

Также доступен как 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()

Примечания:

9
ответ дан 3 August 2018 в 19:48

Введение

Следующий сценарий позволяет выбрать два окна, и, хотя оба окна открыты, он поднимет оба окна, когда пользователь будет фокусироваться на одном. Например, если один из вдов вложений A и B, а для A или B будет делать оба рейза над другими вдовами.

Чтобы остановить скрипт, вы можете использовать killall link_windows.py в терминале или закрыть и снова открыть из окон. Вы также можете отменить выполнение, нажав кнопку закрытия X в любом из всплывающих диалоговых окон выбора окна.

Потенциальные настройки:

  • несколько экземпляров сценария могут использоваться для группировки пары двух окон. Например, если у нас есть окна A, B, C и D, мы можем связывать A и B вместе и связывать C и D вместе.
  • несколько окон могут быть сгруппированы под одним окном. Например, если я привязываю окно B к A, C к A и D к A, это означает, что если я всегда переключаюсь на A, я могу одновременно увеличить все 4 окна.

Использование

Запустите сценарий как:

python link_windows.py

Скрипт совместим с Python 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. Опять же, указатель мыши превратится в крест. Нажмите на другое окно, которое вы хотите связать. После этого начнется выполнение.
  3. Всякий раз, когда вы фокусируете любое окно, сценарий поднимает другое окно вверх, но возвращает фокус на тот, который был первоначально выбран (обратите внимание - с четвертью секундной задержки для лучшей производительности), создавая таким образом ощущение, что окна связаны между собой.

Если вы выберете одно и то же окно оба раза, сценарий завершится.

Источник скрипта

Также доступен как 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()

Примечания:

9
ответ дан 5 August 2018 в 04:32

Введение

Следующий сценарий позволяет выбрать два окна, и, хотя оба окна открыты, он поднимет оба окна, когда пользователь будет фокусироваться на одном. Например, если один из вдов вложений A и B, а для A или B будет делать оба рейза над другими вдовами.

Чтобы остановить скрипт, вы можете использовать killall link_windows.py в терминале или закрыть и снова открыть из окон. Вы также можете отменить выполнение, нажав кнопку закрытия X в любом из всплывающих диалоговых окон выбора окна.

Потенциальные настройки:

  • несколько экземпляров сценария могут использоваться для группировки пары двух окон. Например, если у нас есть окна A, B, C и D, мы можем связывать A и B вместе и связывать C и D вместе.
  • несколько окон могут быть сгруппированы под одним окном. Например, если я привязываю окно B к A, C к A и D к A, это означает, что если я всегда переключаюсь на A, я могу одновременно увеличить все 4 окна.

Использование

Запустите сценарий как:

python link_windows.py

Скрипт совместим с Python 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. Опять же, указатель мыши превратится в крест. Нажмите на другое окно, которое вы хотите связать. После этого начнется выполнение.
  3. Всякий раз, когда вы фокусируете любое окно, сценарий поднимает другое окно вверх, но возвращает фокус на тот, который был первоначально выбран (обратите внимание - с четвертью секундной задержки для лучшей производительности), создавая таким образом ощущение, что окна связаны между собой.

Если вы выберете одно и то же окно оба раза, сценарий завершится.

Источник скрипта

Также доступен как 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()

Примечания:

9
ответ дан 6 August 2018 в 21:37

Введение

Следующий сценарий позволяет выбрать два окна, и, хотя оба окна открыты, он поднимет оба окна, когда пользователь будет фокусироваться на одном. Например, если один из вдов вложений A и B, а для A или B будет делать оба рейза над другими вдовами.

Чтобы остановить скрипт, вы можете использовать killall link_windows.py в терминале или закрыть и снова открыть из окон. Вы также можете отменить выполнение, нажав кнопку закрытия X в любом из всплывающих диалоговых окон выбора окна.

Потенциальные настройки:

  • несколько экземпляров сценария могут использоваться для группировки пары двух окон. Например, если у нас есть окна A, B, C и D, мы можем связывать A и B вместе и связывать C и D вместе.
  • несколько окон могут быть сгруппированы под одним окном. Например, если я привязываю окно B к A, C к A и D к A, это означает, что если я всегда переключаюсь на A, я могу одновременно увеличить все 4 окна.

Использование

Запустите сценарий как:

python link_windows.py

Скрипт совместим с Python 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. Опять же, указатель мыши превратится в крест. Нажмите на другое окно, которое вы хотите связать. После этого начнется выполнение.
  3. Всякий раз, когда вы фокусируете любое окно, сценарий поднимает другое окно вверх, но возвращает фокус на тот, который был первоначально выбран (обратите внимание - с четвертью секундной задержки для лучшей производительности), создавая таким образом ощущение, что окна связаны между собой.

Если вы выберете одно и то же окно оба раза, сценарий завершится.

Источник скрипта

Также доступен как 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()

Примечания:

9
ответ дан 9 August 2018 в 02:02

Введение

Следующий сценарий позволяет выбрать два окна, и, хотя оба окна открыты, он поднимет оба окна, когда пользователь будет фокусироваться на одном. Например, если один из вдов вложений A и B, а для A или B будет делать оба рейза над другими вдовами.

Чтобы остановить скрипт, вы можете использовать killall link_windows.py в терминале или закрыть и снова открыть из окон. Вы также можете отменить выполнение, нажав кнопку закрытия X в любом из всплывающих диалоговых окон выбора окна.

Потенциальные настройки:

  • несколько экземпляров сценария могут использоваться для группировки пары двух окон. Например, если у нас есть окна A, B, C и D, мы можем связывать A и B вместе и связывать C и D вместе.
  • несколько окон могут быть сгруппированы под одним окном. Например, если я привязываю окно B к A, C к A и D к A, это означает, что если я всегда переключаюсь на A, я могу одновременно увеличить все 4 окна.

Использование

Запустите сценарий как:

python link_windows.py

Скрипт совместим с Python 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. Опять же, указатель мыши превратится в крест. Нажмите на другое окно, которое вы хотите связать. После этого начнется выполнение.
  3. Всякий раз, когда вы фокусируете любое окно, сценарий поднимает другое окно вверх, но возвращает фокус на тот, который был первоначально выбран (обратите внимание - с четвертью секундной задержки для лучшей производительности), создавая таким образом ощущение, что окна связаны между собой.

Если вы выберете одно и то же окно оба раза, сценарий завершится.

Источник скрипта

Также доступен как 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()

Примечания:

9
ответ дан 14 August 2018 в 20:15

Поднимите произвольное количество окон как одно

. Решение ниже позволит вам выбрать любую комбинацию из двух, трех или более окон, которые будут объединены и подняты как одна с сочетанием клавиш.

Скрипт выполняет свою работу с тремя аргументами:

add

, чтобы добавить активное окно к группе

raise

, чтобы поднять группу set

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)

Как использовать

Сценарий нуждается в wmctrl и xdotool: sudo apt-get install wmctrl xdotool Скопируйте сценарий выше в пустой файл, сохраните его как groupwindows.py. Запустите сценарий: откройте два окна терминала, запустите команду: python3 /absolute/path/to/groupwindows.py add в обоих из них. Закройте их другими окнами (или минимизируйте их). Откройте третье окно терминала, запустите команду: python3 /absolute/path/to/groupwindows.py raise Первые два окна будут подняты как один. Если все работает нормально, создайте три пользовательских сочетания клавиш: Выберите: Системные настройки> «Клавиатура»> «Ярлыки»> «Пользовательские ярлыки». Нажмите «+» и добавьте приведенные ниже команды к трем отдельным ярлыкам: в моей системе я использовал: 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.

Примечания

При запуске с аргументом add скрипт хранит / добавляет идентификатор окна активного окна в скрытый файл ~/.windowlist Если набор окон находится в другом окне просмотра, сценарий переключается на соответствующий видовой экран . Когда он запускается с аргументом raise, сценарий читает файл, он вызывает окна в списке с помощью команды: wmctrl -ia <window_id>

Больше гибкости?

Как уже упоминалось, сценарий выше позволяет добавлять окна в любое время к сгруппированным окнам. Версия ниже также позволяет любому любому из окон (в любое время) из сгруппированного списка:

#!/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 как ярлык.

6
ответ дан 18 July 2018 в 09:56

Поднимите произвольное количество окон как одно

. Решение ниже позволит вам выбрать любую комбинацию из двух, трех или более окон, которые будут объединены и подняты как одна с сочетанием клавиш.

Скрипт выполняет свою работу с тремя аргументами:

add

, чтобы добавить активное окно к группе

raise

, чтобы поднять группу set

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)

Как использовать

Сценарий нуждается в wmctrl и xdotool: sudo apt-get install wmctrl xdotool Скопируйте сценарий выше в пустой файл, сохраните его как groupwindows.py. Запустите сценарий: откройте два окна терминала, запустите команду: python3 /absolute/path/to/groupwindows.py add в обоих из них. Закройте их другими окнами (или минимизируйте их). Откройте третье окно терминала, запустите команду: python3 /absolute/path/to/groupwindows.py raise Первые два окна будут подняты как один. Если все работает нормально, создайте три пользовательских сочетания клавиш: Выберите: Системные настройки> «Клавиатура»> «Ярлыки»> «Пользовательские ярлыки». Нажмите «+» и добавьте приведенные ниже команды к трем отдельным ярлыкам: в моей системе я использовал: 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.

Примечания

При запуске с аргументом add скрипт хранит / добавляет идентификатор окна активного окна в скрытый файл ~/.windowlist Если набор окон находится в другом окне просмотра, сценарий переключается на соответствующий видовой экран . Когда он запускается с аргументом raise, сценарий читает файл, он вызывает окна в списке с помощью команды: wmctrl -ia <window_id>

Больше гибкости?

Как уже упоминалось, сценарий выше позволяет добавлять окна в любое время к сгруппированным окнам. Версия ниже также позволяет любому любому из окон (в любое время) из сгруппированного списка:

#!/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 как ярлык.

6
ответ дан 24 July 2018 в 19:28

Другие вопросы по тегам:

Похожие вопросы: