Я происхожу из Windows 10, хотя я запустил (и принял), способ, которым работает Ubuntu, их все еще несколько вещей, которые я люблю в Windows 10, рассматриваемой функцией здесь является путь, Если я привязываю окна к экстремальной правой стороне дисплея, это поднимает правильную половину части дисплея (который также подобен в человечности), но другое приложение в фоне берет левую половину дисплея и не должно вручную делать этого.
В этом изображении, если бы я привязываю Окна браузера направо, окно Nautilus не влияло бы действием, Но я хочу, чтобы оно (окно наутилуса) привязалось к левому
Подробнее
Обновление
результат fillscreen.py
сценарий
в первой попытке fillscreen уведомление прибыл (я не мог получить это), и это переместило 2-е окно (окно в праве) в поле, и 1-е окно не было затронуто вообще.
во второй попытке присутствовало это смещение, но это действительно работало (и это главным образом работает),
Сценарий ниже сделает точно, как Вы описываете на двух самых молодых окнах, который является: два окна, которые были в последний раз созданы.
Сценарий действует на перетаскивание одного из двух "новейших" окон к одной из этих двух областей на экране, как показано в изображении.
Область сознательно не трудна в угол, чтобы удостовериться, что это не вмешивается в "нормальную" привязку окна.
Если окно тормозится к любой из областей, сценарий ожидает 0,15 секунды, чтобы видеть, находится ли мышь все еще в том же положении, чтобы удостовериться, что не действовала, если пользователь был на пути к углу экрана для нормальной привязки окна.
Впоследствии, перетащенное окно сфотографировано в половину экрана, область идет, второе окно сфотографировано к противоположной стороне экрана
1. перетащите окно к области
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
значок для показа в уведомлении
Установка
xdotool
и wmctrl
fillscreen.py
в специализированной папке где-нибудь.left.png
в одной и той же папке как сценарий.Теперь откройте терминал, выполните команду:
python3 /path/to/fillscreen.py
Обратите внимание, что это окно терминала является одним из этих двух окон, которые привяжет сценарий. Draf терминал или к одной из областей слева или к праву. Два новых окна должны привязаться.
Если все хорошо работает, добавьте сценарий для запущения приложений: Тире> Приложения Запуска> Добавляет. Добавьте команду:
/bin/bash -c "sleep 10 && python3 /path/to/fillscreen.py"
Вследствие того, что сценарий только действует на перемещение окна, и впоследствии все дальнейшие действия зависят от ситуации, сценарий является очень низким на соке. Намного ниже затем я ожидал, что это будет, когда я начал работать над ним.