web-dev-qa-db-ja.com

他のすべてのウィンドウの後ろにウィンドウを下げる方法-マウスの中央ボタンのように

カーソルがウィンドウ上部のタイトルバーにあるときにマウスの中央のローラーボタンを押すのと同等のキーボードを探しています。これにより、そのウィンドウが低くなり、他のすべてのウィンドウの背後に表示されます。

3
Scott Stensland

恥ずかしそうに汚いソリューション

あなたが望むことをするコマンドを達成することは、一見思われるよりも複雑であることがわかります。問題は、ウィンドウを下げ、同時にウィンドウの順序を維持することです(z方向)。これはほとんど不可能と思われます。 xdotoolwmctrlはどちらもraiseウィンドウにコマンドを提供しますが、lowerウィンドウには提供しません。

以下の解決策は汚いハック/回避策ですが、それでもうまく動作します。デフォルトではシステムにないwmctrlxdotoolの両方を使用します。

スクリプトはキーボードショートカットによって実行されますが、実際にはウィンドウの上部を中クリックしたときとまったく同じです。それが何をする:

  • アクティブなウィンドウを検索します(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. wmctrlxdotoolの両方をインストールします

    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
Jacob Vlijm

Gnomeは、Gnome 2ではgnome-keybinding-propertiesを介して、Gnome 3ではgnome-control-center keyboardを介してキーバインドを提供します。

Gnome 2では、あなたが望むものに近いデフォルトのアクティブなキーバインディングは

別のウィンドウで覆われている場合はウィンドウを上げ、それ以外の場合は下げます

のショートカットを使用して Win+space

0
Randall