カーソルがウィンドウ上部のタイトルバーにあるときにマウスの中央のローラーボタンを押すのと同等のキーボードを探しています。これにより、そのウィンドウが低くなり、他のすべてのウィンドウの背後に表示されます。
あなたが望むことをするコマンドを達成することは、一見思われるよりも複雑であることがわかります。問題は、ウィンドウを下げ、同時にウィンドウの順序を維持することです(z方向)。これはほとんど不可能と思われます。 xdotool
とwmctrl
はどちらもraiseウィンドウにコマンドを提供しますが、lowerウィンドウには提供しません。
以下の解決策は汚いハック/回避策ですが、それでもうまく動作します。デフォルトではシステムにない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 2ではgnome-keybinding-properties
を介して、Gnome 3ではgnome-control-center keyboard
を介してキーバインドを提供します。
Gnome 2では、あなたが望むものに近いデフォルトのアクティブなキーバインディングは
別のウィンドウで覆われている場合はウィンドウを上げ、それ以外の場合は下げます
のショートカットを使用して Win+space