Unity의 창을 창으로 최소화 할 수 있습니까?


17

Irix의 4Dwm에는 창을 상자로 최소화하는 기능이있었습니다 (현대 창 관리자가 사용하는 작업 표시 줄과 달리). 나는 오래된 HPUX에서도 이것을 보았습니다.

링크 된 이미지에서 "콘솔"사각형을 참조하십시오.

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

플러그인 또는 Unity 이외의 창 관리자를 사용하여 Ubuntu에서 수행 할 수 있습니까?


이상하지만 재미있는 질문 :) 나는 이런 식으로 생각할 수 있습니다. 아이콘이 중요합니까, 아니면 일반적인 아이콘 일 수 있습니까? 어떻게 동작합니까? 바탕 화면의 아이콘 또는 최소 "창"처럼.
Jacob Vlijm

@JacobVlijm 아이콘이 일반이 아닙니다. 각 응용 프로그램에는 Unity에서 최소화 된 창의 아이콘으로 고유 한 아이콘이 있습니다)
Artium

Unity에서도 가능하지만 창은 바탕 화면에서 아이콘으로 표시됩니다 (해당 응용 프로그램 아이콘과 창 이름 사용). 당신은 기회를 공상 하시겠습니까? (흥미롭지 만 도전적인 직업이 될 것입니다. 시작하기 전에 더 잘 물어보십시오.)
Jacob Vlijm

1
예, 이것이 도움이 될 수 있습니다. 나는 많은 열린 창으로 작업해야하며이를 구성하는이 방법이 더 좋습니다. 나는 Unity에 대해 아무것도 모르므로 테스트에만 도움을 줄 수 있습니다.
Artium

답변:


18

내 자신의 놀랍게도, 그것은 당신이 데스크탑에 너무 많은 다른 것들을 가지고 있지 않는 한 , 아주 잘 작동 합니다 .

나는 잠시 동안 그것을 사용했고, 빈번한 작업 공간 스위치에 대한 이상하지만 이상하게도 좋은 대안으로 보입니다 . 단순함을 상쾌하게합니다.

실제로

해결책은 실제로 당신이 묘사 한 것입니다.

  • 키 조합을 누르면 창에서 바탕 화면의 창을 "상자"로 만듭니다.

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

    응용 프로그램의 모양과 함께 아이콘으로 :

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

  • 아이콘을 두 번 클릭하면 창이 나타나고 아이콘이 사라집니다.

작동 원리

짧은 이야기 (설명) :

  • 바로 가기 키를 누르면 스크립트가 인수와 함께 호출됩니다 box.

    windowbox box
    
  • 스크립트는 다음과 같습니다.

    • 맨 앞 창의 창 ID를 읽습니다.
    • "정상"창인지 확인합니다 (예를 들어 데스크탑을 매핑 해제하지 않으려는 경우).
    • 창을 소유 한 응용 프로그램의 프로세스 이름을 찾습니다.
    • 해당 응용 프로그램의 .desktop파일에서 해당 아이콘을 찾습니다 ./usr/share/applications
    • 인수를 사용하여 스크립트를 두 번 클릭 할 때 다음 .desktop과 같이 고유 한 이름의 파일을 작성합니다 .Exec=show

      windowbox show
      

.desktop파일은 윈도우 ID의의 (파일 -) 이름으로 추가 인수 인수의 수를 추가 할 .desktop파일을.

그후:

  • .desktop파일은 그것을 더블 클릭 개체를 만들기 위해 실행된다.

  • .desktop파일을 더블 클릭하면, 윈도우는 (재) 매핑의 .desktop파일이 바탕 화면에서 제거됩니다.

설정 방법

  1. 당신은 창문이 놀러 할 때처럼 거의 항상 스크립트가 모두 필요 wmctrl하고 xdotool:

    sudo apt-get install xdotool wmctrl
    
  2. 디렉토리를 만듭니다 ~/bin( ~홈 디렉토리를 나타냄)
  3. 아래의 스크립트를 빈 파일에 복사하고에 windowbox(확장자 없음) 으로 저장하십시오 ~/bin.

    #!/usr/bin/env python3
    import subprocess
    import sys
    import os
    
    # --- On Unity, there is a (y-wise) deviation in window placement
    # set to zero for other window managers
    deviation = 28
    # ---
    
    args = sys.argv[1:]
    
    get = lambda cmd: subprocess.check_output(cmd).decode("utf-8").strip()
    
    def find_dtop():
        # get the localized path to the Desktop folder
        home = os.environ["HOME"]
        dr_file = home+"/.config/user-dirs.dirs"
        return [home+"/"+ l.split("/")[-1].strip() \
                for l in open(dr_file).readlines() \
                if l.startswith("XDG_DESKTOP_DIR=")][0].replace('"', "")
    
    def check_windowtype(w_id):
        # check the type of window; only unmap "NORMAL" windows
        return "_NET_WM_WINDOW_TYPE_NORMAL" in get(["xprop", "-id", w_id])
    
    def get_process(w_id):
        # get the name of the process, owning the window and window x/y position
        w_list = get(["wmctrl", "-lpG"]).splitlines()
        pid = [l for l in w_list if w_id in l][0].split()
        proc = get(["ps", "-p", pid[2], "-o", "comm="])
        xy = (" ").join(pid[3:5])
        return (proc, xy)
    
    def read_f(f, string, proc):
        # search for a possible match in a targeted .desktop file
        try:
            with open(f) as read:
                for l in read:
                    if all([l.startswith(string), proc in l]):
                        in_f = True
                        break
                    else:
                        in_f = False
        except:
            in_f = False
        return in_f
    
    def get_icon(proc, w_name):
        # search appropriate icon in /usr/share/applications
        exceptions = [item for item in [
            ["soffice", "libreoffice-main"],
            ["gnome-terminal", "utilities-terminal"],
            ["nautilus", "folder"],
            ] if item[0] in proc]
        if exceptions:
            if exceptions == [["soffice", "libreoffice-main"]]:
                loffice = [
                    ["Calc", "libreoffice-calc"],
                    ["Writer", "libreoffice-writer"],
                    ["Base", "libreoffice-base"],
                    ["Draw", "libreoffice-draw"],
                    ["Impress", "libreoffice-impress"],
                    ]
                match = [m[1] for m in loffice if m[0] in w_name]
                if match:
                    return match[0]
                else:
                    return exceptions[0][1]
            else:      
                return exceptions[0][1]
        else:
            default = "/usr/share/applications"
            dtfiles = [default+"/"+f for f in os.listdir(default)]
            for f in dtfiles:
                if read_f(f, "Exec=", proc) == True:   
                    for l in open(f).readlines():
                        if l.startswith("Icon="):
                            icon = l.replace("Icon=", "").strip()
                            print(f)
                            break
                    break
            return icon
    
    def create_name():
        # create unique (file-) name for boxed window
        n = 1
        while True:
            name = dtop+"/"+"boxed_"+str(n)+".desktop"
            if os.path.exists(name):
                n += 1
            else:
                break
        return name
    
    def convert_wid(w_id):
        # convert window- id, xdotool format, into wmctrl format
        w_id = hex(int(w_id))
        return w_id[:2]+(10-len(w_id))*"0"+w_id[2:]
    
    def create_icon(w_id, w_name, icon, pos):
        # create the launcher, representing the boxed window
        boxedwindow = create_name()
        f_content =[
                "[Desktop Entry]",
                "Name=[WINDOW] "+w_name,
                "Exec=windowbox show "+w_id+" '"+boxedwindow+"' "+pos,
                "Icon="+icon,
                "Type=Application",
                ]
        if icon == "generic":
            f_content.pop(3)
        with open(boxedwindow, "wt") as boxed:
            for l in f_content:
                boxed.write(l+"\n")
        command = "chmod +x "+"'"+boxedwindow+"'"
        subprocess.call(["/bin/bash", "-c", command])
    
    if args[0] == "box":
        dtop = find_dtop()
        w_id = convert_wid(get(["xdotool", "getactivewindow"]))
        w_name = get(["xdotool", "getwindowname", w_id])
        if check_windowtype(w_id) == True:
            procdata = get_process(w_id)
            procname = procdata[0]
            icon = get_icon(procname, w_name); icon = icon if icon != None else "generic"
            create_icon(w_id, w_name, icon, procdata[1])
            subprocess.call(["xdotool", "windowunmap", w_id])
    
    elif args[0] == "show":
        w_id = args[1]
        subprocess.call(["xdotool", "windowmap", w_id])    
        subprocess.call(["xdotool", "windowmove", "--sync", w_id, args[3], str(int(args[4])-deviation)])
        os.remove(args[2])
  4. 스크립트를 실행 가능하게 만들기

  5. 에서 새로 만든 디렉토리를 "팝업"으로 만들려면 $PATH로그 아웃 / 로그인하거나 source ~/.profile터미널 창에서 실행하십시오.
  6. 다음 명령을 사용하여 터미널 창에서 스크립트를 테스트하십시오.

    windowbox box
    

    창이 사라지고 "상자"창이 데스크탑에 나타납니다.

  7. 모두 제대로 작동하면 바로 가기 키에 다음 명령을 추가하십시오. 화면 오른쪽 상단에서 톱니 바퀴 아이콘을 선택하십시오.

    기어 아이콘

  8. System SettingsKeyboardShortcuts→로 이동하십시오 Custom Shortcuts. 를 클릭하고 +다음 명령을 추가하십시오.

    windowbox box
    

그렇게해야합니다.

중요 사항

스크립트 용도 xdotoolwindowunmap창을 보이지 않게 할 수 있습니다. 데스크탑에서 생성 된 "상자"(아이콘)는 숨겨진 창에 대한 유일한 "게이트"입니다. 다시 말해서 데스크탑 파일을 수동으로 제거하지 마십시오. 당신이하면 창문이 잘 없어집니다.

해야 할 일 [편집 20-12 : 완료 ]

스크립트는 여전히 약간의 수정을 사용할 수 있습니다.

  • 창 지오메트리는 정의에 의해 복원되지 않습니다. 잘 고칠 수 있지만 첫 번째 결과를 보여줄 것이라고 생각했습니다.
  • 대부분의 경우 상자가있는 창에는 올바른 아이콘이 있습니다. get_process(w_id)그러나이 기능 은 약간의 개선이 필요할 수 있습니다. 에서 명령으로 프로세스를 찾을 수 없으면 /usr/share/applications파일에 일반 아이콘이 있습니다.

박스형 창 아이콘을 다른 아이콘과 다른 크기로 제공

스크립트 이름 생성 된 .desktop파일을 항상 boxed_1.desktop , boxed_2.desktop등, 창조의 순간에 "가능"이름에 따라 (파일 이름이 아닌 표시 이름).

마우스 오른쪽 버튼으로> 아이콘 크기를 클릭하여 파일 크기를 조정할 수 있습니다 (일반적으로). 좋은 소식은 파일을 제거하고 다시 만들면 크기가 기억된다는 것입니다. 다시 시작한 후에 파일을 다시 작성하더라도 당신이 경우에 것을 의미 이제까지 포장 된 창 (예) 1-5 크기를 조정, 그들은 것입니다 항상 크기가 동일 할 때 (스크립트) 다시 만들!

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


2
나는 의견을 남기지 않고 나 자신을 저항 할 수 없다, 당신으로부터 아주 좋은 답변 :)
Ravan

좋은! 몇 가지 의견 : 1. 줄 dtop = "/home/jacob/Bureaublad"을 데스크탑 경로 ( dtop = "/home/" + user + "/Desktop")로 바꿨습니다. 2. 두 번 클릭으로 복원해도 작동하지 않았습니다. 나는 의심 source ~/.profile신속하게 테스트 시험이에-로그인 / 아웃됩니다 충분하지 않습니다. 3. 단일성으로 아이콘 크기를 수동으로 조정할 수 있습니다 (마우스 오른쪽 버튼 클릭-> 아이콘 크기 조정), f_content아이콘 크기를 설정하기 위해 매개 변수를 추가 할 수 있습니까?
Artium

4
이 답변의 첫 번째 단락을 읽기 시작했을 때 바닥에 주황색 아이콘이 있음을 알았 습니다! ;-) : P
Fabby

1
안녕하세요 @Artium 스크립트를 업데이트했습니다. 아이콘 찾기 및 형상 복원 기능을 비롯하여 몇 가지 중요한 기능이 개선되었습니다.
Jacob Vlijm

1
@Artium 알고 있지만 스크립트에서 시도해보십시오. 이미지와 비슷한 일반적인 폴더 아이콘입니다. 아마도 같은 아이콘에 대한 링크 일 것입니다.
Jacob Vlijm

7

fvwm 을 사용 하여이를 수행 할 수 있습니다 .

  1. fvwm을 설치하십시오 :

    sudo apt-get update
    sudo apt-get install fvwm
    
  2. 여기 몇 가지가 있습니다 - A가 아이콘 화 함수를 사용하여 그들을 찾기 http://www.jmcunx.com/fvwm_theme.html 당신이 보여주는 스크린 샷과 같은 여러 모양.

  3. 테마의 텍스트를 복사 한 다음 ~/.fvwm/(숨겨진 파일을 먼저 표시) 파일을 만듭니다..fvwm2rc

  4. 텍스트 편집기 (예 : gedit)에서 해당 파일을 열고 테마 텍스트를 붙여 넣습니다.

  5. 컴퓨터를 재부팅하고 fvwm 및 로그인을 선택하십시오.

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.