작업 공간마다 다른 아이콘으로 다른 Unity Launcher를 얻는 방법은 무엇입니까? 대답은 아닙니다. 며칠 전에 14.04 LTS를 설치했으며

Screenlet, devilspie 또는 CCSM을 사용하여 각 작업 영역에 별도의 데스크탑 폴더 를 갖는 것에 대한 다양한 답변을 읽었 지만 … 내 질문에 대한 대답은 아닙니다. 며칠 전에 14.04 LTS를 설치했으며 대부분의 앱과 새로운 앱을 실행하는 데 성공했습니다. 내가 원하는 것은 각각 내가 실행하는 환경에 대해 서로 다른 아이콘 이있는 4 개의 별도 작업 공간을 갖는 것 입니다. 예를 들어

  • 작업 공간 1 – 과학 및 수학 앱 전용
  • 작업 공간 2 – 음악 도구 전용
  • 작업 공간 3 – 전자 회로 및 시뮬레이션
  • 작업 공간 4 – 웹 브라우징 및 일반 컴퓨팅

각 화면에 별도의 아이콘이 포함될 수있는 Android 태블릿을 생각해보십시오.

이 작업을 수행하는 방법은 분명해야하지만 답변을 찾을 수 없습니다. 나는 우분투에서 4 일이되었으므로 내가 뭘하는지 안다고 가정하지 마십시오!



답변

작업 공간마다 다른 Unity Launcher 설정 :

1. 2. 3. 4.

아래 솔루션을 사용하면 작업 공간의 수에 관계없이 작업 공간마다 다른 실행기 아이콘 세트를 쉽게 가질 수 있습니다.

설정에는 두 부분이 있습니다.

  1. 현재 작업 공간의 실행기 아이콘 세트를 “기억”하기위한 하나의 바로 가기 키 조합입니다.

  2. 현재 작업 공간을 추적하고 해당 Unity Launcher를 설정하는 백그라운드에서 실행할 스크립트입니다. 사용자가 작업 공간을 전환 할 때마다 작동합니다.

작동 원리

두 개의 작은 스크립트가 관련됩니다.

번째 스크립트는 한 가지 간단한 작업을 수행합니다. 현재 실행기의 내용을 홈 디렉토리의 (숨겨진) 파일에 작성합니다 (현재 작업 공간 다음에 이름이 매겨 짐).

번째 스크립트는 현재 작업 공간이 무엇인지 주시합니다. 작업 공간 변경 이있는 경우 스크립트는 해당 (실행기) 데이터 파일이 존재하는지 (첫 번째 스크립트로 작성) 확인합니다. 그렇다면 파일에서 기억 된 것처럼 파일을 읽고 Unity Launcher를 변경합니다.

그게 다야.

설정 방법

  1. 스크립트 wmctrl를 설치 해야 합니다 :

    sudo apt-get install wmctrl
    
  2. 두 스크립트 가 모두 저장 될 디렉토리를 작성하십시오 . 두 스크립트는 기능을 공유하고 하나는 다른 디렉토리에서 가져 오기 때문에 하나의 디렉토리에 함께 보관해야합니다. 같은 이유로 아래 표시된대로 정확하게 이름을 지정해야합니다.

  3. 아래의 각 스크립트를 (서로 다른) 빈 파일에 복사 2.하고 정확히 이름이 지정된 디렉토리 (에 생성됨)에 저장하십시오 .

    set_workspace.py

    #!/usr/bin/env python3
    import subprocess
    import os
    
    workspace_data = os.environ["HOME"]+"/.launcher_data_"
    key = ["gsettings get ", "gsettings set ", "com.canonical.Unity.Launcher favorites"]
    
    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(",", "") )]
    
    def current():
        # get the current viewport
        res = get_res()
        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])
        curr_vpdata = [int(n) for n in vp_data[5].split(",")]
        curr_col = int(curr_vpdata[0]/res[0])+1; curr_row = int(curr_vpdata[1]/res[1])
        return str(curr_col+curr_row*cols)
    
    def remember_current():
        currlauncher = subprocess.check_output(["/bin/bash", "-c", key[0]+key[2]]).decode("utf-8").strip()
        f = workspace_data+current()
        open(f, "w").write(currlauncher)
    
    if __name__ == "__main__":
        remember_current()

    launcher_perworkspace.py

    #!/usr/bin/env python3
    import subprocess
    import set_workspace
    import time
    
    workspace_data = set_workspace.workspace_data
    key = set_workspace.key
    
    def check_datafile(desktop):
        f = workspace_data+str(desktop)
        try:
            new_launcher = open(f).read()
            command = key[1]+key[2]+' "'+str(new_launcher)+'"'
            subprocess.Popen(["/bin/bash", "-c", command])
        except FileNotFoundError:
            pass
    
    curr_dt1 = set_workspace.current()
    check_datafile(curr_dt1)
    
    while True:
        time.sleep(1)
        curr_dt2 = set_workspace.current()
        if curr_dt2 != curr_dt1:
            check_datafile(curr_dt2)
        curr_dt1 = curr_dt2
  4. 첫 번째 스크립트 ( set_workspace.py)를 선택한 단축키 조합 (시스템 설정> “키보드”> “바로 가기”> “사용자 정의 바로 가기”)에 추가하십시오. “+”를 클릭하고 다음 명령을 추가하십시오.

    python3 /path/to/set_workspace.py
    
  5. 키 조합을 실행하고 다음과 같은 파일 .launcher_data_3이 홈 디렉토리에 작성 되는지 확인하십시오 . 파일을 표시하려면 Ctrl+ 를 눌러야 H합니다 (파일,. 기본적 로 은 보이지 않음).

    작업 공간을 탐색하고 절차를 반복하십시오. 실행기 아이콘 조합 설정 및 키 조합을 눌러 해당 특정 작업 공간 세트를 “기억”하십시오.

  6. 당신은 지금 실제로 끝났습니다. 다음 명령을 사용하여 백그라운드 스크립트를 테스트 실행하십시오 (터미널 창에서 계속 실행).

    python3 /path/to/launcher_perworkspace.py
    

    모두 제대로 작동하고 시작 프로그램이 작업 공간마다 전환되는 경우 시작 응용 프로그램에 대시> 시작 응용 프로그램> 추가 명령을 추가하십시오.

    /bin/bash -c "sleep 15&&python3 /path/to/launcher_perworkspace.py"
    

노트

  1. 특정 작업 공간에 대한 실행기 아이콘 세트를 변경하려면 작업 공간으로 이동하고 원하는대로 아이콘을 추가 / 제거한 다음 키 조합을 누르십시오 (백그라운드 스크립트를 다시 시작할 필요가 없음).
  2. 의견에서 현재 작업 공간의 현재 실행기를 기억하는 단축키에 대한 오해가 있다고 생각합니다. 현재 작업 공간의 현재 실행기를 “저장” 하려면 하나의 키보드 단축키 만 필요합니다 . 어떤 작업 공간에 있더라도 정확히 동일하게 작동합니다. 스크립트 자체가 결정됩니다 입니다 현재 작업 공간.

편집하다

귀하의 의견에 따르면, 귀하는 스크립트를 실행할지 확실하지 않으며 현재 실행기를 엉망으로 만들 것 같습니다.

스크립트가 수행하는 작업에 대해 너무 많은 (또는 너무 작은 🙂 존중한다고 확신합니다. 그러나 다음 명령을 사용하여 현재 Unity Launcher를 백업 할 수 있습니다.

printf 'gsettings set com.canonical.Unity.Launcher favorites "' > ~/launcher_output&&printf "$(gsettings get com.canonical.Unity.Launcher favorites)">>~/launcher_output&&printf '"'>>~/launcher_output

그러면 ~/launcher_outputUnity Launcher를 초기 상황으로 복원하는 complete 명령이 포함 된 파일이 생성됩니다 . 응급 상황 인 경우 파일 내용을 복사하여 터미널에 붙여 넣기 만하면됩니다.

그러나 스크립트를 수동으로 변경하지 않으면 실행기가 엉망이 될 가능성이 거의 없습니다.


중요 편집 (2)

이에 버전 코멘트에의 요청에 따라 그 사용하지 않고 실행 중 하나를 단축키 조합을; 스크립트를 실행하고 특정 작업 공간에서 런처 설정을 시작하십시오. 스크립트는 홈 디렉토리에 (보이지 않는) 파일을 작성하여 다른 작업 공간에서 (Unity-) 실행 프로그램 세트를 기억합니다.

스크립트의 “버전 1″에서이 작업을 시도했지만 두 작업 공간 확인 사이에 두 개의 실행기 검사를 항상 “포함”하면 작업 공간을 빠르게 이동할 때 원하지 않는 동작 (잘못된 데이터 저장)을 방지하는 트릭으로 판명되었습니다.

사용하는 방법

  1. 첫 번째 버전과 마찬가지로이 스크립트는 wmctrl다음을 사용합니다 .

    sudo apt-get 설치 wmctrl

  2. 스크립트를 빈 파일로 복사하여 다른 이름으로 저장하십시오. launcher_toworkspace.py

  3. 다음 명령으로 실행하십시오 :

    python3 /path/to/launcher_toworkspace.py
    
  4. 예상대로 작동하면 시작 응용 프로그램에 다음 명령을 추가하십시오.

    /bin/bash -c "sleep 15&&python3 /path/to/launcher_toworkspace.py"
    

스크립트

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

datadir = os.environ["HOME"]+"/.config/lswitcher"
if not os.path.exists(datadir):
    os.makedirs(datadir)
workspace_data = datadir+"/launcher_data_"

key = [
    "gsettings get ",
    "gsettings set ",
    "com.canonical.Unity.Launcher favorites",
    ]

def get_launcher():
    return subprocess.check_output(
        ["/bin/bash", "-c", key[0]+key[2]]
        ).decode("utf-8").strip()

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(",", "") )]

def current():
    # get the current viewport
    res = get_res()
    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])
    curr_vpdata = [int(n) for n in vp_data[5].split(",")]
    curr_col = int(curr_vpdata[0]/res[0])+1
    curr_row = int(curr_vpdata[1]/res[1])
    return str(curr_col+curr_row*cols)

curr_ws1 = current()
currlauncher1 = get_launcher()

while True:
    time.sleep(1)
    currlauncher2 = get_launcher()
    curr_ws2 = current()
    datafile = workspace_data+curr_ws2
    if curr_ws2 == curr_ws1:
        if currlauncher2 != currlauncher1:
            open(datafile, "wt").write(currlauncher2)
    else:
        if not os.path.exists(datafile):
            open(datafile, "wt").write(currlauncher2)
        else:
            curr_set = open(datafile).read()
            command = key[1]+key[2]+' "'+str(curr_set)+'"'
            subprocess.Popen(["/bin/bash", "-c", command])
    curr_ws1 = curr_ws2
    currlauncher1 = get_launcher()

노트

이전 버전의 스크립트를 사용하여 작업 공간을 설정 한 경우이 버전에서도 작동해야합니다.

PPA

2015-04-23에 따르면 Dennis J의 좋은 질문과 Parto의 격려는 webupd8 에서 다루는 GUI를 포함 ppa하여 스크립트 를 작성 하여 스크립트 를 작성 했습니다.

ppa:vlijm/lswitcher

설치하려면 다음을 실행하십시오.

sudo add-apt-repository ppa:vlijm/lswitcher
sudo apt-get update
sudo apt-get install lswitcher

그 이후로 Trusty & Utopic 용으로 패키지되었습니다. 테스트 후 다른 사람을 추가하겠습니다. 또한 .deb설치 프로그램 을 추가 할 것입니다. 그러나 ppa일반적으로 이런 종류의 것들이 때때로 업데이트되기 때문에을 사용하는 것이 좋습니다 .

뷰포트 데이터의 위치가에서 (으) ~/로 변경 ~/.config/lswitcher되었으므로 이전 스크립트를 사용한 경우 Unity Launcher를 다시 설정해야합니다.