현재 데스크탑 레이아웃을 저장하는 방법이 있습니까? 저장하고 싶습니다. 앱의 위치를 ​​쉽게 저장할 수있는 한

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

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

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

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

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



답변

노트

이 스크립트는 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

두 개의 다른 단축키로


답변

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

설치

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


답변

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

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

이 방법을 따르십시오

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


답변

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

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


답변