Tôi có thể thu nhỏ cửa sổ vào hộp trên Unity không?


17

Trên 4Dwm của Irix, có khả năng thu nhỏ cửa sổ vào một hộp (trái với thanh tác vụ được sử dụng bởi các trình quản lý cửa sổ hiện đại). Tôi cũng đã thấy điều này trên một HPUX cũ.

Xem hình vuông "bàn điều khiển" trong hình ảnh được liên kết:

nhập mô tả hình ảnh ở đây

Có thể thực hiện trên Ubuntu, với một plugin hoặc có thể một số trình quản lý cửa sổ khác ngoài Unity không?


Câu hỏi kỳ lạ, nhưng thú vị :) Tôi có thể nghĩ về một cái gì đó như thế này. Biểu tượng sẽ quan trọng, hoặc nó có thể là một cái chung? Nó cư xử thế nào? như một biểu tượng trên màn hình nền hoặc một "cửa sổ" tối thiểu.
Jacob Vlijm

@JacobVlijm Biểu tượng không chung chung. Mỗi ứng dụng có biểu tượng riêng là biểu tượng của các cửa sổ được thu nhỏ trong Unity)
Artium

Cũng có thể được thực hiện trong Unity, nhưng cửa sổ sẽ được biểu tượng hóa trên màn hình nền (với biểu tượng của ứng dụng tương ứng và tên của cửa sổ). Bạn có thích một shot? (sẽ là một công việc thú vị, nhưng đầy thách thức, tốt hơn hãy hỏi trước khi tôi bắt đầu :))
Jacob Vlijm

1
Vâng, điều này có thể hữu ích cho tôi. Tôi phải làm việc với rất nhiều cửa sổ đang mở và theo cách này thì cách tổ chức chúng tốt hơn. Tôi biết các thông tin về Unity, vì vậy tôi chỉ có thể giúp kiểm tra.
Artium

Câu trả lời:


18

Thật ngạc nhiên, nó hoạt động khá độc đáo, miễn là bạn không có quá nhiều thứ khác trên máy tính để bàn của mình .

Tôi đã làm việc với nó một thời gian, và nó có vẻ như là một sự thay thế kỳ lạ, nhưng đủ đẹp để chuyển đổi không gian làm việc thường xuyên. Làm mới cho sự đơn giản của nó.

Trong thực tế

Giải pháp thực sự là khá nhiều những gì bạn mô tả:

  • Nhấn tổ hợp phím sẽ "đóng hộp" cửa sổ trên màn hình của bạn, từ cửa sổ:

    nhập mô tả hình ảnh ở đây

    thành một biểu tượng, với sự xuất hiện của ứng dụng:

    nhập mô tả hình ảnh ở đây

  • Nhấp đúp vào biểu tượng và cửa sổ sẽ xuất hiện lại và biểu tượng sẽ biến mất.

Làm thế nào nó hoạt động

Truyện ngắn (giải thích):

  • Khi nhấn phím tắt, tập lệnh được gọi với đối số box:

    windowbox box
    
  • Kịch bản sau đó:

    • đọc id cửa sổ của cửa sổ ngoài cùng
    • kiểm tra xem đó có phải là cửa sổ "bình thường" không (ví dụ: bạn không muốn hủy sơ đồ màn hình của mình)
    • Tra cứu tên quá trình của ứng dụng, sở hữu cửa sổ.
    • Tra cứu biểu tượng tương ứng trong .desktoptệp của ứng dụng tương ứng trong/usr/share/applications
    • tạo một .desktoptệp có tên duy nhất , với một Exec=dòng gọi tập lệnh (khi nhấp đúp) với đối số show:

      windowbox show
      

Các .desktoptập tin sẽ bổ sung thêm một số đối số đối số bổ sung, chẳng hạn như id cửa sổ, (File-) tên của .desktoptập tin.

Sau đó:

  • Các .desktoptập tin sau đó được thực hiện để làm cho nó trở thành một đối tượng có thể nhấp đúp.

  • Khi .desktoptệp được nhấp đúp, cửa sổ sẽ được ánh xạ lại, .desktoptệp sẽ bị xóa khỏi màn hình của bạn.

Làm thế nào để thiết lập

  1. Giống như thực tế luôn luôn, khi bạn muốn chơi xung quanh với các cửa sổ, tập lệnh cần cả hai wmctrlxdotool:

    sudo apt-get install xdotool wmctrl
    
  2. Tạo thư mục ~/bin( ~viết tắt của thư mục nhà của bạn)
  3. Sao chép tập lệnh bên dưới vào một tệp trống, lưu nó dưới dạng windowbox(không có phần mở rộng) trong ~/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. Làm cho tập lệnh thực thi

  5. Để làm cho thư mục mới được tạo "bật lên" $PATH, hãy đăng xuất / đăng nhập hoặc chạy source ~/.profile(từ cửa sổ đầu cuối)
  6. Kiểm tra- chạy tập lệnh từ cửa sổ đầu cuối bằng lệnh:

    windowbox box
    

    Cửa sổ sẽ biến mất, cửa sổ "đóng hộp" sẽ xuất hiện trên màn hình của bạn.

  7. Nếu tất cả đều hoạt động tốt, hãy thêm lệnh sau vào phím tắt: chọn biểu tượng bánh răng ở phía trên bên phải màn hình của bạn:

    Biểu tượng bánh răng

  8. Chuyển đến System SettingsKeyboardShortcutsCustom Shortcuts. Nhấp vào +và thêm lệnh:

    windowbox box
    

Nên làm vậy.

Lưu ý quan trọng

Việc sử dụng kịch bản xdotoolwindowunmapđể làm cho cửa sổ vô hình. "Hộp" (biểu tượng) đã tạo trên màn hình của bạn là "cổng" duy nhất cho cửa sổ ẩn. Nói cách khác: không xóa (các) tệp máy tính để bàn theo cách thủ công. Cửa sổ sẽ bị mất nếu bạn làm.

Công việc cần làm [chỉnh sửa 20-12: xong ]

Kịch bản vẫn có thể sử dụng một số tinh chỉnh:

  • Hình dạng cửa sổ không được khôi phục theo định nghĩa. Có thể được sửa rất tốt, nhưng tôi nghĩ tôi sẽ cho bạn thấy kết quả đầu tiên.
  • Trong hầu hết các trường hợp, cửa sổ đóng hộp có biểu tượng chính xác. Các chức năng get_process(w_id)có thể sử dụng một số cải tiến tuy nhiên. Nếu quá trình không được tìm thấy dưới dạng một lệnh trong /usr/share/applications, tệp có biểu tượng chung.

Cung cấp cho các biểu tượng cửa sổ có kích thước khác với các biểu tượng khác

Tập lệnh đặt tên cho .desktopcác tệp được tạo luôn boxed_1.desktop , boxed_2.desktopv.v., tùy thuộc vào tên "khả dụng" tại thời điểm tạo (tên tệp, không phải tên được hiển thị).

Bạn có thể thay đổi kích thước các tệp (nói chung), bằng cách nhấp chuột phải> kích thước biểu tượng. Tin tốt là nếu bạn loại bỏ tệp và tạo lại nó, kích thước được ghi nhớ. Ngay cả khi bạn tạo lại tệp sau khi khởi động lại. Điều đó có nghĩa là nếu bạn đã thay đổi kích thước các cửa sổ được đóng hộp (ví dụ) 1-5, chúng sẽ luôn có cùng kích thước khi bạn (tập lệnh) tạo lại chúng!

nhập mô tả hình ảnh ở đây


2
Tôi không thể cưỡng lại bản thân mà không để lại nhận xét, câu trả lời rất hay từ bạn :)
Ravan

Đẹp! Một số ý kiến: 1. Tôi đã thay thế dòng dtop = "/home/jacob/Bureaublad"bằng một đường dẫn đến máy tính để bàn của tôi ( dtop = "/home/" + user + "/Desktop") 2. Khôi phục bằng cách nhấp đúp không hoạt động. Tôi nghi ngờ rằng source ~/.profilekhông đủ sẽ đăng nhập / đăng xuất kịp thời để kiểm tra thử nghiệm này. 3. Để thống nhất có thể thay đổi kích thước biểu tượng theo cách thủ công (nhấp chuột phải -> thay đổi kích thước biểu tượng), có thể thêm một số tham số f_contentđể đặt kích thước của biểu tượng không?
Artium

4
Khi tôi bắt đầu đọc đoạn đầu tiên của câu trả lời này, tôi chỉ biết sẽ có một biểu tượng màu cam ở phía dưới! ;-): P
Fabby

1
Xin chào @Artium Tôi đã cập nhật tập lệnh, hiện tại nó có một vài cải tiến quan trọng, bao gồm tìm kiếm biểu tượng và tìm kiếm hình học tốt hơn, Hãy vui vẻ!
Jacob Vlijm

1
@Artium Tôi biết, nhưng hãy thử một trong kịch bản, đó là biểu tượng thư mục thông thường, tương tự như hình ảnh của bạn. có lẽ chỉ là một liên kết đến cùng một biểu tượng.
Jacob Vlijm

7

Bạn có thể sử dụng fvwm để thực hiện điều này.

  1. Cài đặt fvwm:

    sudo apt-get update
    sudo apt-get install fvwm
    
  2. Tìm một ứng dụng sử dụng chức năng iconify - có một số ở đây: http://www.jmcunx.com/fvwm_theme.html Một số trông giống như ảnh chụp màn hình bạn hiển thị.

  3. Sao chép văn bản của chủ đề, sau đó điều hướng đến ~/.fvwm/(hiển thị tệp ẩn trước) sau đó tạo tệp.fvwm2rc

  4. Mở tệp đó trong trình soạn thảo văn bản (như gedit) và dán văn bản chủ đề vào đó.

  5. Khởi động lại máy tính, và chọn fvwm và đăng nhập.

nhập mô tả hình ảnh ở đây

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.