잘 할 수 있지만 Unity / 뷰포트에 대한 이해가 필요합니다. 아래 이야기가 이해할 수 있기를 바랍니다. 그렇지 않으면 의견을 남겨주세요.
아래의 스크립트를 사용 하면 올바른 인수로 실행 하면 모든 위치에서 모든 뷰포트에서 응용 프로그램의 창을 열 수 있습니다 . 스크립트는 이 버전의 편집 된 버전 이지만 이제는 확장 가상 데스크톱 에 창을 배치 할 준비가되었습니다 .
1. 뷰포트 및 창 좌표 이해
Unity의 작업 공간
Unity에서는 다른 창 관리자와 달리 실제로는 하나의 스패닝 작업 영역 만 있으며 뷰포트로 나뉩니다. 귀하의 경우 작업 공간은 8 개의 뷰포트로 나뉩니다.
창의 위치를 정의하는 방법
명령의 출력으로서의 창 위치 :
wmctrl -lG
(you need to have wmctrl installed to run the command)
현재 뷰포트의 왼쪽 상단 을 기준 으로 한 위치로 설명됩니다 .
따라서 뷰포트에있는 경우 1
:
뷰포트 2의 창을 1700 (x-wise) x 500 (y-wise)에 배치 할 수 있습니다
(내 화면은 1680x1050)
그러나 뷰포트 6에
있는 경우 동일한 창이 20 (x), -550 (y)에 위치합니다.
아래에 설명 된대로 올바른 인수를 사용하여 스크립트를 실행하려면 이러한 좌표를 올바르게 사용하는 것이 중요합니다.
2. 스크립트 사용법
아래 스크립트는 가상 (스팬) 작업 공간에 새로운 응용 프로그램 창을 배치하는 데 사용할 수 있습니다.
wmctrl
설치되어 있는지 확인하십시오 .
sudo apt-get install wmctrl
아래의 스크립트를 빈 파일에 복사하고에 setwindow
(확장자 없음) 으로 저장하십시오 ~/bin
. 디렉토리가 없으면 작성하십시오. 스크립트를 실행 가능하게 만드십시오 .
- 방금 만든 경우
~/bin
명령을 실행 source ~/.profile
하거나 로그 아웃 / 인하여 디렉토리를에서 사용할 수있게하십시오 $PATH
.
다음 명령을 테스트 실행하십시오.
setwindow <application> <x_position> <y_position> <horizontal_size> <vertical_size>
예 :
setwindow gedit 100 100 200 200
현재 뷰포트에 gedit 창이 나타납니다.
노트:
- 모든 응용 프로그램이 특정 너비 나 높이 미만의 창 크기를 허용하는 것은 아닙니다.
gedit
내 시스템 에서 창의 최소 너비는 appr입니다. 470 픽셀
- 스크립트 는 전체 창이 대상 뷰포트에 맞는 경우에만 잘 작동 하고 그에 따라 좌표 / 크기를 선택하십시오. 또한 Unity Launcher와 패널은 창의 위치에 영향을 줄 수있는 공간 (!)을 사용합니다.
<x_position>
현재 뷰포트 왼쪽에 창을 배치 하려면 음수 를 사용하십시오.
<y_position>
현재 뷰포트 위에 창을 배치 하려면 음수 를 사용하십시오.
한 번에 다른 뷰포트에서 새 창을 열려면 간단히 명령을 연결하면됩니다. "긴 스토리"예제에서 뷰포트 설정을 살펴보면, 뷰포트 1에있는 경우 다음 명령을 사용하여 뷰포트 1, 2, 3 및 4에서 gedit 창을 열 수 있습니다.
setwindow gedit 100 100 200 200&&setwindow gedit 1780 100 200 200&&setwindow gedit 3460 100 200 200&&setwindow gedit 5140 100 200 200
스크립트
#!/usr/bin/env python3
import subprocess
import time
import sys
app = sys.argv[1]
get = lambda x: subprocess.check_output(["/bin/bash", "-c", x]).decode("utf-8")
ws1 = get("wmctrl -lp"); t = 0
subprocess.Popen(["/bin/bash", "-c", app])
# fix exception for Chrome (command = google-chrome-stable, but processname = chrome)
app = "chrome" if "chrome" in app else app
while t < 30:
ws2 = [w.split()[0:3] for w in get("wmctrl -lp").splitlines() if not w in ws1]
procs = [[(p, w[0]) for p in get("ps -e ww").splitlines() \
if app in p and w[2] in p] for w in ws2]
if len(procs) > 0:
w_id = procs[0][0][1]
cmd1 = "wmctrl -ir "+w_id+" -b remove,maximized_horz"
cmd2 = "wmctrl -ir "+w_id+" -b remove,maximized_vert"
cmd3 = "wmctrl -ir "+procs[0][0][1]+" -e 0,"+sys.argv[2]+","+sys.argv[3]+","+sys.argv[4]+","+sys.argv[5]
for cmd in [cmd1, cmd2, cmd3]:
subprocess.call(["/bin/bash", "-c", cmd])
break
time.sleep(0.5)
t = t+1
편집 : 게으른 버전
현재 뷰포트에서 창을 여는 것처럼 좌표와 크기를 입력하고 대상 뷰포트를 인수로 지정하면 (아무것도 계산하지 않아도 됨) 아래 버전을 사용하십시오 ...
스크립트의 첫 번째 버전처럼 설정 한 경우 다음 명령을 사용하여 실행할 수 있습니다.
setwindow <application> <x_position> <y_position> <horizontal_size> <vertical_size> <targeted_viewport>
예 : viewport 에서 size Google-Chrome
에 위치한 창 을 여는 방법 :20, 20
300x300
5
setwindow google-chrome 20 20 300 300 5
설정은 스크립트의 첫 번째 버전과 거의 동일합니다.
또한이 스크립트는 정의 된 창 (위치 / 크기)이 대상 뷰포트에 완전히 맞는 경우에만 올바르게 작동합니다.
스크립트 :
#!/usr/bin/env python3
import subprocess
import time
import sys
app = sys.argv[1]
target_vp = int(sys.argv[6])
def get_res():
# get resolution
xr = subprocess.check_output(["xrandr"]).decode("utf-8").split()
pos = xr.index("current")
return [int(xr[pos+1]), int(xr[pos+3].replace(",", "") )]
res = get_res()
def current(set_vp):
# get the current viewport
vp_data = subprocess.check_output(
["wmctrl", "-d"]
).decode("utf-8").split()
dt = [int(n) for n in vp_data[3].split("x")]
cols = int(dt[0]/res[0])
rows = int(dt[1]/res[1])
curr_vpdata = [int(n) for n in vp_data[5].split(",")]
curr_col = int(curr_vpdata[0]/res[0])
curr_row = int(curr_vpdata[1]/res[1])
curr_vp = curr_col+curr_row*cols+1
# calculate the vector to the origin from the current viewport (in resolution units)
vec_curr = vector(curr_vp, cols)
# calculate the vector to the origin from the targeted viewport
vec_set = vector(set_vp, cols)
# calculate the vector between current and targeted viewport
vec_relative = [vec_set[0] - vec_curr[0],
vec_set[1] - vec_curr[1]]
# calculate needed correction (absolute)
relative = [vec_relative[0]*res[0],
vec_relative[1]*res[1]]
return relative
def vector(vp, cols):
rem = vp%cols
vec_x = rem-1 if rem != 0 else cols-1
vec_y = int((vp-1)/cols)
return [vec_x, vec_y]
res = get_res() # nieuw
get = lambda x: subprocess.check_output(["/bin/bash", "-c", x]).decode("utf-8")
ws1 = get("wmctrl -lp"); t = 0
# check for additional arguments to run the application
try:
subprocess.Popen(["/bin/bash", "-c", app+" "+sys.argv[7]])
except IndexError:
subprocess.Popen(["/bin/bash", "-c", app])
# fix exception for Chrome (command = google-chrome-stable, but processname = chrome)
app = "chrome" if "chrome" in app else app
while t < 30:
ws2 = [w.split()[0:3] for w in get("wmctrl -lp").splitlines() if not w in ws1]
procs = [[(p, w[0]) for p in get("ps -e ww").splitlines() \
if app in p and w[2] in p] for w in ws2]
if len(procs) > 0:
w_id = procs[0][0][1]
cmd1 = "wmctrl -ir "+w_id+" -b remove,maximized_horz"
cmd2 = "wmctrl -ir "+w_id+" -b remove,maximized_vert"
# calculate the correction, related to the current workspace, marge for launcher and panel
pos_x = int(sys.argv[2]); pos_y = int(sys.argv[3]); x_marge = 65; y_marge = 35
pos_x = pos_x if pos_x > x_marge else x_marge; pos_y = pos_y if pos_y > y_marge else y_marge
x_relative = pos_x+current(target_vp)[0]
y_relative = pos_y+current(target_vp)[1]
# correct possible inaccurately set width / height
x_size = res[0]; y_size = res[1]
set_width = int(sys.argv[4]); set_height = int(sys.argv[5])
width = set_width if set_width+x_marge+pos_x < x_size else x_size - pos_x - x_marge
height = set_height if set_height+y_marge+pos_y < y_size else y_size - pos_y - y_marge
cmd3 = "wmctrl -ir "+w_id+" -e 0,"+str(x_relative)+","+str(y_relative)+","+str(width)+","+str(height)
for cmd in [cmd1, cmd2, cmd3]:
subprocess.call(["/bin/bash", "-c", cmd])
break
time.sleep(0.5)
t = t+1
인수가있는 응용 프로그램 창 열기
작업을 마치려면 질문에 완전히 대답하십시오.
다음과 같이 스크립트를 실행하면
setwindow google-chrome 20 20 300 300 5
대상 데스크톱 에서 기본 창이 열립니다.
그러나 최신 버전의 스크립트를 사용 하면 추가 인수를 추가 하여 응용 프로그램 창을 열 수 있습니다 ( 예 :url
setwindow <application> <x_position> <y_position> <horizontal_size> <vertical_size> <targeted_viewport> <(optional)_argument>
예 :
setwindow google-chrome 0 0 600 600 3 "--new-window http://askubuntu.com"
(추가) 인수에 공백이 있으면 따옴표를 사용하십시오. 위의 예제는 google-chrome
뷰포트 3에서 창을 열고을 엽니 다 url
http://askubuntu.com
.
하나의 명령으로 여러 작업 공간에서 여러 개의 창 / URL을 열도록 명령을 연결할 수 있습니다. 예 :
setwindow google-chrome 0 0 600 600 8 "--new-window http://askubuntu.com"&&setwindow google-chrome 0 0 600 600 7 "--new-window www.google.com"
wmctrl
스크립트 나 터미널을 통해 창을 제어하는 소프트웨어와 같은 을 포함 합니다. 그러나 창문을 다시 시작하는 것은 조금 더 어려운 문제 일 수 있습니다.