私はWindows 10から来ていますが、Ubuntuの動作を開始(および受け入れ)していますが、Windows 10で気に入っていることはまだいくつかあります。ここで問題になっている機能は、1つのウィンドウをディスプレイの右端はディスプレイの右半分を占有します(ubuntuでも同様です)が、バックグラウンドの別のアプリがディスプレイの左半分を占有するため、手動で行う必要はありません。
この図では、ブラウザウィンドウを右にスナップすると、Nautilusウィンドウはアクションの影響を受けませんが、左にスナップする(nautilusウィンドウ)
詳細
更新
fillscreen.py
スクリプトの結果
最初の試行でfillscreen通知が来て(それをキャプチャできませんでした)、ボックス内の2番目のウィンドウ(右側のウィンドウ)を移動し、1番目のウィンドウは影響を受けませんでしたすべて。
2回目の試行では、このオフセットは存在していましたが、機能しました(そして、ほとんど機能します)
以下のスクリプトは、説明したとおりに実行します 2つの最も若いウィンドウ、つまり:最後に作成された2つのウィンドウ.
このスクリプトは、ドラッグの2つの「最新」ウィンドウの1つを、画面の2つの領域の1つに作用します(画像を参照)。
この領域は、「通常の」ウィンドウのスナップを妨げないように、意図的に not コーナーにぴったりと収まります。
ウィンドウがいずれかの領域にドラッグされた場合、スクリプトは0.15秒待機して、マウスが同じ位置にあるかどうかを確認し、ユーザーがコーナーの「途中」にある場合に動作しないようにします。通常のウィンドウスナップの画面。
続いて、ドラッグされたウィンドウが領域のある画面の半分にスナップされ、2番目のウィンドウが画面の反対側にスナップされます
1。ウィンドウを領域にドラッグします
2。ウィンドウがスナップし、もう一方が反対側のサイトにスナップします
最後に、確認として、通知が3秒間表示されます。
セットアップには2つの項目が含まれます。
スクリプト:
#!/usr/bin/env python3
import sys
import os
import subprocess
import time
from operator import itemgetter
from itertools import groupby
import math
#--- set your preferences below: padding between windows, margin(s)
cols = 2; rows = 1; padding = 20; left_margin = 0; top_margin = 30
#---
fpath = os.path.dirname(os.path.abspath(__file__))
n_wins = cols*rows
def get_spot(pos):
# get the resolution
scrdata = get("xrandr").split(); resindex = scrdata.index("connected")+2
res = [int(n) for n in scrdata[resindex].split("+")[0].split("x")]
# list the corners, could be more elegant no doubt
corners = [[0, res[1]], [res[0], res[1]]]
diff = [int(math.sqrt(sum([(c[i]-pos[i])**2 for i, n in enumerate(res)])))\
for c in corners]
return diff
def get(cmd):
try:
return subprocess.check_output(cmd).decode("utf-8")
except subprocess.CalledProcessError:
pass
def get_res():
xr = get("xrandr").split(); pos = xr.index("current")
return [int(xr[pos+1]), int(xr[pos+3].replace(",", "") )]
def get_pos():
return [int(s.split(":")[1]) for s in get(["xdotool", "getmouselocation"]).split()[:2]]
def check_window(w_id):
w_type = get(["xprop", "-id", w_id])
if " _NET_WM_WINDOW_TYPE_NORMAL" in w_type:
return True
else:
return False
def confirm():
val = False
mouseloc = get_spot(get_pos())
match = [mouseloc.index(n) for n in mouseloc if 50 < n < 400]
if match:
time.sleep(0.15)
val = True if get_spot(get_pos()) == mouseloc else False
return val, match
def arrange_wins(active, side):
# get resolution
res = get_res()
# define (calculate) the area to divide
area_h = res[0] - left_margin; area_v = res[1] - top_margin
# create a list of calculated coordinates
x_coords = [int(left_margin+area_h/cols*n) for n in range(cols)]
y_coords = [int(top_margin+area_v/rows*n) for n in range(rows)]
coords = sum([[(cx, cy) for cx in x_coords] for cy in y_coords], [])
# calculate the corresponding window size, given the padding, margins, columns and rows
w_size = [str(int(area_h/cols - padding)), str(int(area_v/rows - padding))]
# find windows of the application, identified by their pid
active = hex(int(get(["xdotool", "getactivewindow"])))
active = active[:2]+(10-len(active))*"0"+active[2:]
wlist = [w.split()[0] for w in get(["wmctrl", "-l"]).splitlines()]
w_list = [w for w in wlist if check_window(w) == True][-n_wins:]
try:
w_list = w_list[::-1] if w_list.index(active) != side else w_list
except ValueError:
pass
else:
print(w_list)
# remove possibly maximization, move the windows
for n, w in enumerate(w_list):
data = (",").join([str(item) for item in coords[n]])+","+(",").join(w_size)
cmd1 = "wmctrl -ir "+w+" -b remove,maximized_horz"
cmd2 = "wmctrl -ir "+w+" -b remove,maximized_vert"
cmd3 = "wmctrl -ir "+w+" -e 0,"+data
for cmd in [cmd1, cmd2, cmd3]:
subprocess.Popen(["/bin/bash", "-c", cmd])
wins1 = []
while True:
time.sleep(0.5)
windata = get(["wmctrl", "-lG"])
if windata:
wins2 = [[l[0], l[2]] for l in [
ln.split() for ln in windata.splitlines()]
]
# combined window locations old/new, grouped to see if moved
winlocs = sorted(wins1 + wins2, key = itemgetter(0))
test = [[item, [item[1] for item in list(occ)]] \
for item, occ in groupby(winlocs, itemgetter(0))]
for item in test:
# old loc, new loc of window
locs = item[1]
# window moves?
if locs.count(locs[0]) != len(locs):
args = confirm()
if args[0]:
arrange_wins(item[0], args[1][0])
subprocess.Popen([
"notify-send", "-i", os.path.join(
fpath, "left.png"), "Fill screen"
])
time.sleep(3)
subprocess.Popen(["pkill", "notify-osd"])
wins1 = wins2
通知に表示するアイコン
Setup
xdotool
とwmctrl
の両方をインストールしますfillscreen.py
として専用のフォルダーに保存します。left.png
としてscript と同じフォルダーに保存します。ターミナルを開き、コマンドを実行します:
python3 /path/to/fillscreen.py
この端末ウィンドウは、スクリプトがスナップする2つのウィンドウの1つであることに注意してください。端末を左または右のいずれかのエリアにドラフトします。最新の2つのウィンドウがスナップするはずです。
すべてが正常に機能する場合は、スクリプトをスタートアップアプリケーションに追加します:[ダッシュ]> [スタートアップアプリケーション]> [追加]。コマンドを追加します。
/bin/bash -c "sleep 10 && python3 /path/to/fillscreen.py"
スクリプトはウィンドウの移動にのみ作用し、その後のすべてのアクションは状況に依存するという事実により、スクリプトの効果は非常に低くなっています。それよりずっと低かったのは、作業を開始したときのことでした。