ฉันสามารถย่อขนาดหน้าต่างให้เป็นกล่องบน Unity ได้หรือไม่


17

บน 4Dwm ของ Irix มีความสามารถในการย่อขนาดหน้าต่างให้เล็กลงในกล่อง (ตรงกันข้ามกับแถบงานที่ผู้จัดการหน้าต่างสมัยใหม่ใช้) ฉันเคยเห็นสิ่งนี้ใน HPUX เก่าเช่นกัน

ดูสแควร์ "คอนโซล" ในภาพที่เชื่อมโยง:

ป้อนคำอธิบายรูปภาพที่นี่

เป็นไปได้ไหมที่จะทำสำเร็จบน Ubuntu ไม่ว่าจะใช้ปลั๊กอินหรือโปรแกรมจัดการหน้าต่างอื่นนอกเหนือจาก Unity


คำถามแปลก ๆ แต่น่าสนใจ :) ฉันนึกถึงอะไรแบบนี้ ไอคอนจะมีความสำคัญหรือเป็นไอคอนทั่วไปหรือไม่ มันทำงานอย่างไร? เช่นไอคอนบนเดสก์ท็อปหรือหน้าต่างเล็ก ๆ
Jacob Vlijm

@JacobVlijm ไอคอนไม่ธรรมดา แต่ละแอปพลิเคชันมีไอคอนเป็นของตัวเองเป็นไอคอนของหน้าต่างย่อเล็กสุดใน Unity)
Artium

สามารถทำได้ภายใน Unity เช่นกัน แต่หน้าต่างจะเป็นไอคอนบนเดสก์ท็อป (พร้อมไอคอนของแอปพลิเคชันที่เกี่ยวข้องและชื่อของหน้าต่าง) คุณอยากจะลองช็อตหรือไม่? (จะเป็นงานที่น่าสนใจ แต่ท้าทายขอให้ดีกว่าก่อนที่ฉันจะเริ่ม :))
Jacob Vlijm

1
ใช่สิ่งนี้จะเป็นประโยชน์กับฉัน ฉันต้องทำงานกับหน้าต่างแบบเปิดจำนวนมากและวิธีการจัดระเบียบแบบนี้ดีกว่าที่ฉันคิด ฉันรู้ว่าไม่มีอะไรเกี่ยวกับความสามัคคีดังนั้นฉันสามารถช่วยได้เฉพาะกับการทดสอบ
Artium

คำตอบ:


18

ที่แปลกใจของตัวเองก็ทำงานอย่างมาก, ตราบใดที่คุณไม่ได้มีสิ่งอื่น ๆ มากเกินไปบนเดสก์ทอปของคุณ

ฉันทำงานกับมันมาระยะหนึ่งแล้วดูเหมือนว่าจะแปลก แต่มีทางเลือกที่ดีพอสำหรับสวิตช์พื้นที่ทำงานเป็นประจำ สดชื่นเพื่อความเรียบง่าย

ในทางปฏิบัติ

การแก้ปัญหาเป็นสิ่งที่คุณอธิบาย:

  • การกดคีย์ผสมจะทำให้ "กล่อง" หน้าต่างบนเดสก์ท็อปของคุณจากหน้าต่าง:

    ป้อนคำอธิบายรูปภาพที่นี่

    เป็นไอคอนโดยมีรูปลักษณ์ของแอปพลิเคชัน:

    ป้อนคำอธิบายรูปภาพที่นี่

  • ดับเบิ้ลคลิกที่ไอคอนจากนั้นหน้าต่างจะปรากฏขึ้นและไอคอนจะหายไป

มันทำงานอย่างไร

เรื่องสั้น (คำอธิบาย):

  • เมื่อกดปุ่มทางลัดสคริปต์จะถูกเรียกด้วยอาร์กิวเมนต์box:

    windowbox box
    
  • สคริปต์แล้ว:

    • อ่าน ID หน้าต่างของหน้าต่างที่อยู่ด้านหน้าสุด
    • ตรวจสอบว่าเป็นหน้าต่าง "ปกติ" (คุณไม่ต้องการยกเลิกการแมปเดสก์ท็อปของคุณ)
    • ค้นหาชื่อกระบวนการของแอปพลิเคชันซึ่งเป็นเจ้าของหน้าต่าง
    • ค้นหาไอคอนที่เกี่ยวข้องใน.desktopไฟล์แอปพลิเคชันที่เกี่ยวข้องใน/usr/share/applications
    • สร้าง.desktopไฟล์ที่มีชื่อเฉพาะโดยมีExec=บรรทัดที่เรียกใช้สคริปต์ (เมื่อดับเบิลคลิก) ด้วยอาร์กิวเมนต์show:

      windowbox show
      

.desktopไฟล์จะเพิ่มจำนวนของข้อโต้แย้งข้อโต้แย้งเพิ่มเติมเช่นรหัสหน้าต่างชื่อ (File-) ของ.desktopไฟล์

ต่อมา:

  • .desktopไฟล์ทำแล้วปฏิบัติการที่จะทำให้มันเป็นวัตถุที่สามารถคลิกสองครั้ง

  • เมื่อ.desktopไฟล์ถูกดับเบิลคลิกหน้าต่างจะถูกแมปอีกครั้ง.desktopไฟล์จะถูกลบออกจากเดสก์ท็อปของคุณ

วิธีการตั้งค่า

  1. เหมือนจริงทุกครั้งเมื่อคุณต้องการเล่นกับ windows สคริปต์ต้องการทั้ง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 Settings→การKeyboard→การ→การShortcuts Custom Shortcutsคลิกที่+และเพิ่มคำสั่ง:

    windowbox box
    

ที่ควรทำ

โน๊ตสำคัญ

การใช้สคริปต์xdotool's windowunmapจะทำให้หน้าต่างที่มองไม่เห็น "กล่อง" (ไอคอน) ที่สร้างขึ้นบนเดสก์ท็อปของคุณเป็น "ประตู" เพียงหน้าต่างเดียวที่ซ่อนอยู่ กล่าวอีกนัยหนึ่ง: อย่าลบไฟล์เดสก์ท็อปด้วยตนเอง หน้าต่างจะหายไปถ้าคุณทำ

ทำงานต้องทำ [แก้ไข 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. ค้นหาคนที่ใช้ฟังก์ชั่น iconify - มีอยู่มากมายที่นี่: http://www.jmcunx.com/fvwm_theme.htmlมีหลายรูปแบบเหมือนภาพหน้าจอที่คุณแสดง

  3. คัดลอกข้อความของธีมจากนั้นไปที่~/.fvwm/(แสดงไฟล์ที่ซ่อนไว้ก่อน) จากนั้นสร้างไฟล์.fvwm2rc

  4. เปิดไฟล์นั้นในเท็กซ์เอดิเตอร์ (เช่น gedit) และวางข้อความธีมลงในไฟล์

  5. รีบูทคอมพิวเตอร์แล้วเลือก fvwm และล็อกอิน

ป้อนคำอธิบายรูปภาพที่นี่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.