현재 데스크탑 레이아웃을 저장하는 방법이 있습니까?


29

내 응용 프로그램의 현재 위치를 저장하고 싶기 때문에 동일한 응용 프로그램을 열고 무언가를 실행하면 원래대로 다시 정렬됩니다.

예를 들어 숭고한 3 개의 터미널 창을 열려면 어떻게 든 저장하고 싶습니다.

여기에 이미지 설명을 입력하십시오

앱의 위치를 ​​쉽게 저장할 수있는 한 앱이나 명령 줄 도구인지는 신경 쓰지 않습니다.

나는 Moom 의 큰 팬 이지만 불행히도 MacOS에서만 작동하며 우분투에서는 그리워합니다. 그것은 더 많은 기능을 지원하며 내 주요 문제 위에 그것에 가까운 것을 알고 있다면 괜찮습니다.


@VitaliusKuchalskis 창 레이아웃 이 올바르게 작동 합니까, 아니면 해당 파일을 열어야합니까? 그리고 창 관리자는 무엇입니까? (통합?)
Jacob Vlijm

무슨 창 레이아웃 을 말하고 있는지 모르겠 습니까? 작업 공간 당 창의 위치와 크기를 저장하고로드하는 도구가 있거나있을 것이라고 생각합니다. 지금까지 [wmctrl] ( en.wikipedia.org/wiki/Wmctrl )을 찾았습니다 . 그러나이 기능을 사용하려면 스크립트를 작성하거나 구성을 변경해야합니다. 그래서 나는 이미 누군가 이것을 만들 었는지 궁금해하고 그것을 공유 할만 큼 친절했습니다.
Qualphey

@VitaliusKuchalskis 당신은 이것을 볼 수 있습니다 : askubuntu.com/questions/631392/… 이것은 창이 열린 채로 있다고 가정하지만 복원 후 컴퓨터를 종료하고 창 위치를 다시 지정하고 싶다고 가정합니다. 크기와 위치 (레이아웃). 중요한 질문은 응용 프로그램 이나 창 내부에서 열린 파일을 참조하는지 여부 입니다.
Jacob Vlijm

물론 응용 프로그램 창만 있습니다.
Qualphey

스크린 샷에서 창에 타일 형성을 좋아하거나 사용하는 것처럼 보입니다. 타일링 WM에 예를 들어 i3을 사용해보십시오.
nixpower

답변:


26

노트

이 스크립트는 2017 년 1 월 16 일 패치 / 수정되었으며 프로세스 이름 이 응용 프로그램을 실행하는 명령 과 다른 일부 응용 프로그램의 수정입니다 . 아마도 응용 프로그램에서 가끔 발생합니다. 누군가 발견하면 의견을 남겨주세요.


창 배열과 해당 응용 프로그램을 기억하고 복원하는 스크립트

아래 스크립트는 두 가지 옵션으로 실행할 수 있습니다. 아래와 같이 창 배열이 있다고 가정 해 봅시다.

여기에 이미지 설명을 입력하십시오

현재 창 배열 및 해당 응용 프로그램 을 읽거나 기억 하려면 다음 옵션을 사용하여 스크립트를 실행하십시오.

<script> -read

그런 다음 모든 창을 닫으십시오.

여기에 이미지 설명을 입력하십시오

그런 다음 마지막으로 기억 된 창 배열 을 설정하려면 다음 옵션으로 실행하십시오.

<script> -run

마지막으로 기억 된 창 배열이 복원됩니다.

여기에 이미지 설명을 입력하십시오

다시 시작한 후에도 작동합니다.

두 명령을 두 개의 다른 바로 가기 키 아래에 놓으면 창 배열을 "기록"하고 컴퓨터를 종료하며 재시작 후 동일한 창 배열을 불러올 수 있습니다.

스크립트가하는 것과 그렇지 않은 것

옵션으로 실행 -read

  • 이 스크립트는 wmctrl모든 작업 공간, 위치, 크기, 응용 프로그램이 속한 모든 창을 나열하는 데 사용 합니다.
  • 그런 다음 스크립트는 스패닝 작업 영역 에서 창 위치를 상대 위치 (의 출력에서와 같이 현재 작업 영역으로 wmctrl)에서 절대 위치 로 "변환"합니다 . 따라서 기억하려는 창이 하나의 작업 공간에만 있거나 다른 작업 공간에 분산되어 있는지는 중요하지 않습니다.
  • 그런 다음 스크립트는 현재 창 배열을 "기억"하여 홈 디렉토리의 보이지 않는 파일에 작성합니다.

옵션으로 실행 -run

  • 스크립트는 마지막으로 기억 된 창 배열을 읽습니다. 해당 응용 프로그램을 시작하고 창을 기억 된 위치로 이동시킵니다.wmctrl

스크립트는 창에서 열릴 수있는 파일이나 브라우저 창에서 열린 웹 사이트 (예 : 웹 사이트)를 기억 하지 않습니다 .

이슈

몇 가지 버그 의 조합 wmctrlUnity버그가 있습니다 :

  • 여기에 언급 된 것처럼 창 좌표는 창 위치wmctrl지정 하는 명령과 약간 다릅니다 . 따라서 불러 온 창 위치는 원래 위치와 약간 다를 수 있습니다.
  • wmctrl윈도우의 가장자리는 아주 가까운 중 하나 인 경우 명령은 비트가 예측할 수없는 작동 Unity Launcher또는 패널.
  • wmctrl배치 명령이 제대로 작동 하려면 "기억 된"창이 작업 공간 경계 안에 완전히 있어야합니다 .

일부 응용 프로그램은 기본적으로 같은 창에서 새 탭의 같은 새 창을 엽니 다 (예 gedit:). 에 대해 수정 gedit했지만 더 많은 예외를 발견하면 언급하십시오.

스크립트

#!/usr/bin/env python3
import subprocess
import os
import sys
import time

wfile = os.environ["HOME"]+"/.windowlist"
arg = sys.argv[1]

def get(command):
    return subprocess.check_output(["/bin/bash", "-c", command]).decode("utf-8")

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 get_res():
    # get resolution and the workspace correction (vector)
    xr = subprocess.check_output(["xrandr"]).decode("utf-8").split()
    pos = xr.index("current")
    res = [int(xr[pos+1]), int(xr[pos+3].replace(",", "") )]
    vp_data = subprocess.check_output(["wmctrl", "-d"]).decode("utf-8").split()
    curr_vpdata = [int(n) for n in vp_data[5].split(",")]
    return [res, curr_vpdata]

app = lambda pid: subprocess.check_output(["ps", "-p",  pid, "-o", "comm="]).decode("utf-8").strip()

def read_windows():
    res = get_res()
    w_list =  [l.split() for l in get("wmctrl -lpG").splitlines()]
    relevant = [[w[2],[int(n) for n in w[3:7]]] for w in w_list if check_window(w[0]) == True]
    for i, r in enumerate(relevant):      
        relevant[i] = app(r[0])+" "+str((" ").join([str(n) for n in r[1]]))
    with open(wfile, "wt") as out:
        for l in relevant:
            out.write(l+"\n")

def open_appwindow(app, x, y, w, h):
    ws1 = get("wmctrl -lp"); t = 0
    # fix command for certain apps that open in new tab by default
    if app == "gedit":
        option = " --new-window"
    else:
        option = ""
    # fix command if process name and command to run are different
    if "gnome-terminal" in app:
        app = "gnome-terminal"
    elif "chrome" in app:
        app = "/usr/bin/google-chrome-stable"


    subprocess.Popen(["/bin/bash", "-c", app+option])
    # 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:
            time.sleep(0.5)
            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,"+x+","+y+","+w+","+h
            for cmd in [cmd1, cmd2, cmd3]:   
                subprocess.call(["/bin/bash", "-c", cmd])
            break
        time.sleep(0.5)
        t = t+1

def run_remembered():
    res = get_res()[1]
    try:
        lines = [l.split() for l in open(wfile).read().splitlines()]
        for l in lines:          
            l[1] = str(int(l[1]) - res[0]); l[2] = str(int(l[2]) - res[1] - 24)
            open_appwindow(l[0], l[1], l[2], l[3], l[4])   
    except FileNotFoundError:
        pass

if arg == "-run":
    run_remembered()
elif arg == "-read":
    read_windows()

설정 방법

시작하기 전에 wmctrl설치되어 있는지 확인하십시오 .

sudo apt-get install wmctrl

그때:

  1. 빈 파일에 스크립트를 복사로 저장 recall_windows에서 ~/bin. 필요한 경우 디렉토리를 작성하십시오. 디렉토리가 아직 없으면 디렉토리 source ~/.profile를 작성한 후 실행 하거나 로그 아웃 / 인하십시오. 이제는$PATH
  2. 스크립트를 실행 가능하게 만드십시오 (!).
  3. 이제 몇 창, 열 gedit, firefox또는 무엇이든을, 그리고 (어떤 경로 접두사 필요) 명령을 실행하지하여 터미널에서 스크립트를 테스트 실행 :

    recall_windows -read
    
  4. 창문을 닫습니다. 이제 터미널에서 실행하십시오.

    recall_windows -run
    

이제 창 설정이 복원되었습니다

모두 제대로 작동하면 바로 가기 키에 두 가지 명령을 추가하십시오. 시스템 설정> "키보드"> "바로 가기"> "사용자 정의 바로 가기"를 선택하십시오. "+"를 클릭하고 다음 명령을 추가하십시오.

recall_windows -read

recall_windows -run

두 개의 다른 단축키로


2
하! 첫 번째 단락을 읽고 나는 그것이 당신의 것 중 하나라는 것을 알고있었습니다! (upvoted)
Fabby

@Fabby와 내 휴가 축하 :)
Jacob Vlijm

좋아 보인다! 이제 설정 이름에 대한 두 번째 매개 변수를 쉽게 추가 한 다음 다른 환경, clientA, clientB, home, .. cool을 저장 / 복원 할 수 있습니다.
Bachi

다른 버전은 멋지다. 프로그램을 닫을 수 있다면 좋을 것이다. 아내가 올 때 화면에 어떤 것이 있는지 생각하면 내가 일하는 것처럼 쉽게 보일 수 있습니다!
Jamie Hutber

이 작업 공간 관련 문제를 살펴볼 수 있습니까? 감사!!
natty에 대해 nutty

4

세션을 저장하고 복원 할 수 있고 가상 모니터뿐만 아니라 다른 모니터 설정을 지원하는 작은 라이브러리 / 명령 줄 도구를 작성했습니다.

설치

npm install -g linux-window-session-manager

용법

현재 세션을 ~ / .lwsm / sessionData / DEFAULT.json에 저장하십시오.

lwsm save

현재 세션을 ~ / .lwsm / sessionData / my-session.json에 저장하십시오.

lwsm save my-session   

~ / .lwsm / sessionData / DEFAULT.json에서 세션을 복원하십시오.

lwsm restore

~ / .lwsm / sessionData / my-session.json에서 세션을 복원하십시오.

lwsm restore my-session   

세션을 시작하기 전에 실행중인 모든 앱을 정상적으로 닫으십시오

lwsm restore --closeAllOpenWindows

확인하십시오 : https://github.com/johannesjo/linux-window-session-manager


1
잘 작동합니다! 이것은 최고의 답변이어야합니다.
user3751385

2

그러한 프로그램은 없습니다. compiz cub를 설치할 수 있습니다 :

sudo apt-get install compiz compizconfig-settings-manager compiz-fusion-plugins-extra compiz-fusion-plugins-main compiz-plugins

이 방법을 따르십시오

compiz는 통일 / 그놈을위한 가장 진보 된 데스크탑 도구입니다


1

나는 이것을 달성하는 간단한 방법을 모른다.

그러나 매우 간단한 이유로 일시 중지가 거의 필요하지 않습니다. 일시 중지최대 절전 모드 는 친구입니다. 창 위치를 저장할뿐만 아니라 시스템의 전체 상태도 저장합니다. 새 커널 버전을 다시로드하는 것을 제외하고는 컴퓨터를 완전히 끄는 경우는 거의 없습니다.


글쎄, 나는 그것을 전환하거나 아무것도하지 않습니다 .. 그러나 나는 당신이 새로운 터미널, 다른 프로젝트, 브라우저가 닫히거나 기타 등등을 알고 있음을 보여줍니다.
Lipis

그래 몇 주 동안 만지지 않은 데스크톱이 있는데, 여기에는 특정 프로젝트와 관련된 여러 터미널 창, 브라우저 창, R 그래픽 디스플레이 창이 있습니다.
1

Suspend는 노트북에 사용하는 솔루션이지만 데스크톱 PC는 좀 더 복잡합니다.
cantoni
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.