Я ищу эквивалент клавиатуры нажимающей кнопке ролика середины мыши, в то время как курсор в строке заголовка вершины окна. Это понижает то окно так позади всех других окон.
Достигнуть команды, которая делает то, что Вы хотите, оказывается более сложным, чем это кажется на первый взгляд. Проблема должна понизить окно и поддержать порядок окна (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]])
Установите обоих wmctrl
и xdotool
sudo apt-get install xdotool wmctrl
Скопируйте сценарий выше в пустой файл, сохраните его как sendtoback.py
Тестовый прогон сценарий путем открытия терминала, выполненного команда в нем:
python3 /path/to/sendtoback.py
Окно должно быть отправлено в фон, точно как Вы привыкли к когда щелкнутый средней кнопкой.
Если все хорошо работает, Выберите: Параметры настройки системы> "Клавиатура"> "Ярлыки"> "Пользовательские Ярлыки". Нажмите "+" и добавьте команду:
python3 /path/to/sendtoback.py
к ключевому ярлыку по Вашему выбору.
В некоторых случаях (особенно в более медленных системах), время сна в строке:
subprocess.Popen(["xdotool", "mousemove", "--sync", top_x, top_y]); time.sleep(0.3)
потребности, которые будут увеличены. В более быстрых системах это могло быть уменьшено.
Gnome обеспечивает привязки клавиш через gnome-keybinding-properties
в Gnome 2, и через gnome-control-center keyboard
в Gnome 3.
В Gnome 2, активная привязка клавиш по умолчанию, которая близко подходит к тому, что Вы хотите,
окно Raise, если это покрыто другим окном, иначе понизьте его
использование ярлыка Win +
пространства