Как понизить окно так позади всех других - точно так же, как кнопка середины мыши

Я ищу эквивалент клавиатуры нажимающей кнопке ролика середины мыши, в то время как курсор в строке заголовка вершины окна. Это понижает то окно так позади всех других окон.

3
задан 20 October 2016 в 23:00

2 ответа

Бесстыдно грязное решение

Достигнуть команды, которая делает то, что Вы хотите, оказывается более сложным, чем это кажется на первый взгляд. Проблема должна понизить окно и поддержать порядок окна (z-wise) одновременно, который кажется почти невозможным. Оба xdotool и wmctrl обеспечьте команды, чтобы повысить окно, но не понизить окно.

Решением ниже является грязный взлом/обходное решение, но оно работает приятно и надежно тем не менее. Это использует обоих wmctrl и xdotool, которые не находятся в Вашей системе по умолчанию.

Хотя скрипт запущен сочетанием клавиш, он на самом деле делает точно то же как тогда, когда Вы щелкаете средней кнопкой по вершине своего окна. Что это делает:

  • Это ищет активное окно (использование xprop -root)
  • Ищет, если окно является "нормальным" окном (в отличие от этого, например, Ваш рабочий стол, который также перечислен в wmctrl -lG как окно)
  • Если так, это вычисляет положение вершины окна, перемещает мышь в расчетное положение, моделирует щелчок средней кнопкой и кладет обратно мышь туда, где Вы оставили его.

Это все происходит в долю секунды, таким образом, Вы даже не заметите перемещение мыши и движение назад. Единственной вещью, которую Вы замечаете, является окно, отправленное в спину, которая является точно, что Вы хотите.

Сценарий

#!/usr/bin/env python3
import subprocess
import time

# find the frontmost window
active = [l for l in subprocess.check_output(["xprop", "-root"]).decode("utf-8").splitlines() \
          if "_NET_ACTIVE_WINDOW(WINDOW)" in l][0].split("#")[-1].strip()
# convert the window-id from xprop- format to wmctrl- format
w_id = active[:2] + str((10-len(active))*"0")+active[2:]
# if the window is a "normal" window, find the window geometry in wmctrl -lG,
# move the mouse to the top of the window and click the middle button
if "_NET_WM_WINDOW_TYPE_NORMAL" in subprocess.check_output(["xprop", "-id", w_id]).decode("utf-8"):
    match = [l for l in subprocess.check_output(["wmctrl", "-lG"]).decode("utf-8").splitlines() if w_id in l][0].split()[2:6]
    current_mousepos = subprocess.check_output(["xdotool", "getmouselocation"]).decode("utf-8").split()
    coords = ([s.replace("x:", "") for s in current_mousepos if s.startswith("x:")][0],
              [s.replace("y:", "") for s in current_mousepos if s.startswith("y:")][0])
    top_x = str(int(int(match[0])+(int(match[2])/2))); top_y = str(int(match[1]) -10)
    # The time.sleep(0.3) possibly needs to be optimized (longer sleep = safer); the 0.3 works fine on my system when used from a keyboard shortcut (which turns out to make a difference...)
    subprocess.Popen(["xdotool", "mousemove", "--sync", top_x, top_y]); time.sleep(0.3)
    # move the mouse back to its original position
    subprocess.Popen(["xdotool", "click", "2"]); time.sleep(0.05)
    subprocess.Popen(["xdotool", "mousemove", coords[0], coords[1]])

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

  1. Установите обоих wmctrl и xdotool

    sudo apt-get install xdotool wmctrl
    
  2. Скопируйте сценарий выше в пустой файл, сохраните его как sendtoback.py

  3. Тестовый прогон сценарий путем открытия терминала, выполненного команда в нем:

    python3 /path/to/sendtoback.py
    

    Окно должно быть отправлено в фон, точно как Вы привыкли к когда щелкнутый средней кнопкой.

  4. Если все хорошо работает, Выберите: Параметры настройки системы> "Клавиатура"> "Ярлыки"> "Пользовательские Ярлыки". Нажмите "+" и добавьте команду:

    python3 /path/to/sendtoback.py
    

    к ключевому ярлыку по Вашему выбору.

Примечание:

В некоторых случаях (особенно в более медленных системах), время сна в строке:

subprocess.Popen(["xdotool", "mousemove", "--sync", top_x, top_y]); time.sleep(0.3)

потребности, которые будут увеличены. В более быстрых системах это могло быть уменьшено.

5
ответ дан 1 December 2019 в 15:37

Gnome обеспечивает привязки клавиш через gnome-keybinding-properties в Gnome 2, и через gnome-control-center keyboard в Gnome 3.

В Gnome 2, активная привязка клавиш по умолчанию, которая близко подходит к тому, что Вы хотите,

окно Raise, если это покрыто другим окном, иначе понизьте его

использование ярлыка Win +

пространства
0
ответ дан 1 December 2019 в 15:37

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

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