Минимизировать программы как значок на рабочем столе [dубликат]

В 4Dwm от Irix была возможность минимизировать окна в поле (в отличие от панели задач, используемой современными диспетчерами окон). Я видел это также на старом HPUX.

См. Квадрат «console» в связанном изображении:

Можно ли выполнить на Ubuntu, либо с плагином, либо с каким-либо оконным менеджером, кроме Unity?

17
задан 19 December 2015 в 22:25

11 ответов

К моему собственному удивлению, он работает довольно хорошо, до тех пор, пока у вас не слишком много других вещей на рабочем столе.

Я работал с ним некоторое время, и это кажется странным, но как ни странно До тех пор, пока у вас нет слишком много других вещей на вашем рабочем столе , альтернативных частым переключателям рабочего пространства. Обновление

На практике

Решение на самом деле в значительной степени описывает то, что вы описываете:

Нажатие комбинации клавиш будет «вставлять» окно на вашем рабочего стола, из окна: в значок с появлением приложения: дважды щелкните значок, и окно снова появится, и значок исчезнет.

Как это работает

Рассказ (объяснение):

Нажатие комбинации клавиш будет «вставлять» окно на ваш рабочий стол, из window: в значок с появлением приложения:

Нажатие комбинации клавиш «отобразит» окно на рабочем столе, из окна:

читает идентификатор окна в самом переднем окне, проверяет, это «нормальное» окно (вы бы не хотели, например, разархивировать рабочий стол). Ищет имя процесса приложения, владеющего окном. Поиск соответствующего значка в файле .desktop соответствующего приложения в /usr/share/applications создает файл с уникальным именем .desktop с линией Exec=, которая вызывает скрипт (при двойном щелчке) с аргументом show: windowbox show

Затем скрипт:

Файл .desktop добавит несколько дополнительных аргументов аргументов, таких как идентификатор окна, имя файла .desktop.

Нажатие комбинации клавиш «отобразит» окно на вашем рабочем столе, из окна:

читает идентификатор окна в самом крайнем окне, проверяет, «обычное» окно (например, вы не захотите, например, разархивировать рабочий стол). Ищет имя процесса приложения, владеющего окном. Поиск соответствующего значка в файле .desktop соответствующего приложения в /usr/share/applications создает файл с уникальным именем .desktop с линией Exec=, которая вызывает скрипт (при двойном щелчке) с аргументом show: windowbox show
Дважды щелкните значок, и окно снова появится, и значок исчезнет.

Как настроить

Как практически всегда, когда вы хотите играть с окнами, сценарию нужны как wmctrl, так и xdotool: sudo apt-get install xdotool wmctrl Создать каталог ~/bin (~ означает ваш домашний каталог) Скопируйте сценарий ниже в пустой файл, сохраните его как 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]) Сделайте исполняемый файл сценария. Чтобы вновь созданный каталог «всплыл» в $PATH, либо выйти из системы, либо запустить source ~/.profile (из окна терминала). Проверить запуск сценария из окна терминала с помощью command: windowbox box Окно должно исчезнуть, окно «в коробке» должно появиться на вашем рабочем столе. Если все работает нормально, добавьте следующую команду к клавише быстрого доступа: выберите значок шестеренки в правом верхнем углу экрана: перейдите в раздел «Системные настройки» → «Клавиатура» → «Ярлыки» → «Пользовательские ярлыки». Нажмите кнопку + и добавьте команду: windowbox box

Впоследствии:

Важное примечание

Это должно сделать это.

Работайте do [edit 20-12: done]

Скрипт использует xdotool 's windowunmap, чтобы сделать окно невидимым. Созданный «ящик» (значок) на вашем рабочем столе является единственным «затвором» для скрытого окна. Другими словами: не удаляйте файлы рабочего стола вручную. Окно будет потеряно навсегда, если вы это сделаете.

Геометрия окна по определению не восстанавливается. Может быть исправлено очень хорошо, но я думал, что покажу вам первый результат. В большинстве случаев окно в коробке имеет правильный значок. Однако функция get_process(w_id) может использовать некоторое улучшение. Если процесс не найден как команда в /usr/share/applications, файл имеет общий значок.

Предоставление значков в бокс-окне другого размера, чем другие значки

Сценарий все еще может использовать некоторую доработку:

Сценарий называет созданный .desktop файлы всегда boxed_1.desktop, boxed_2.desktop и т. д., в зависимости от «доступного» имени в момент создания (имена файлов, а не отображаемое имя).

Вы можете изменить размер файлов (в общем), щелкнув правой кнопкой мыши значок размера значка. Хорошей новостью является то, что если вы удалите файл и заново его создадите, размер запомнится. Даже если вы снова создадите файл после перезапуска. Это означает, что если вы когда-либо изменили размеры окон в коробке (например,) 1-5, они всегда будут иметь тот же размер, когда вы (скрипт) снова создадите их!

18
ответ дан 17 July 2018 в 21:04

К моему собственному удивлению, он работает довольно хорошо, до тех пор, пока у вас не слишком много других вещей на рабочем столе.

Я работал с ним некоторое время, и это кажется странным, но как ни странно До тех пор, пока у вас нет слишком много других вещей на вашем рабочем столе , альтернативных частым переключателям рабочего пространства. Обновление

На практике

Решение на самом деле в значительной степени описывает то, что вы описываете:

Нажатие комбинации клавиш будет «вставлять» окно на вашем рабочего стола, из окна: в значок с появлением приложения: дважды щелкните значок, и окно снова появится, и значок исчезнет.

Как это работает

Рассказ (объяснение):

Нажатие комбинации клавиш будет «вставлять» окно на ваш рабочий стол, из window: в значок с появлением приложения:

Нажатие комбинации клавиш «отобразит» окно на рабочем столе, из окна:

читает идентификатор окна в самом переднем окне, проверяет, это «нормальное» окно (вы бы не хотели, например, разархивировать рабочий стол). Ищет имя процесса приложения, владеющего окном. Поиск соответствующего значка в файле .desktop соответствующего приложения в /usr/share/applications создает файл с уникальным именем .desktop с линией Exec=, которая вызывает скрипт (при двойном щелчке) с аргументом show: windowbox show

Затем скрипт:

Файл .desktop добавит несколько дополнительных аргументов аргументов, таких как идентификатор окна, имя файла .desktop.

Нажатие комбинации клавиш «отобразит» окно на вашем рабочем столе, из окна:

читает идентификатор окна в самом крайнем окне, проверяет, «обычное» окно (например, вы не захотите, например, разархивировать рабочий стол). Ищет имя процесса приложения, владеющего окном. Поиск соответствующего значка в файле .desktop соответствующего приложения в /usr/share/applications создает файл с уникальным именем .desktop с линией Exec=, которая вызывает скрипт (при двойном щелчке) с аргументом show: windowbox show
Дважды щелкните значок, и окно снова появится, и значок исчезнет.

Как настроить

Как практически всегда, когда вы хотите играть с окнами, сценарию нужны как wmctrl, так и xdotool: sudo apt-get install xdotool wmctrl Создать каталог ~/bin (~ означает ваш домашний каталог) Скопируйте сценарий ниже в пустой файл, сохраните его как 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]) Сделайте исполняемый файл сценария. Чтобы вновь созданный каталог «всплыл» в $PATH, либо выйти из системы, либо запустить source ~/.profile (из окна терминала). Проверить запуск сценария из окна терминала с помощью command: windowbox box Окно должно исчезнуть, окно «в коробке» должно появиться на вашем рабочем столе. Если все работает нормально, добавьте следующую команду к клавише быстрого доступа: выберите значок шестеренки в правом верхнем углу экрана: перейдите в раздел «Системные настройки» → «Клавиатура» → «Ярлыки» → «Пользовательские ярлыки». Нажмите кнопку + и добавьте команду: windowbox box

Впоследствии:

Важное примечание

Это должно сделать это.

Работайте do [edit 20-12: done]

Скрипт использует xdotool 's windowunmap, чтобы сделать окно невидимым. Созданный «ящик» (значок) на вашем рабочем столе является единственным «затвором» для скрытого окна. Другими словами: не удаляйте файлы рабочего стола вручную. Окно будет потеряно навсегда, если вы это сделаете.

Геометрия окна по определению не восстанавливается. Может быть исправлено очень хорошо, но я думал, что покажу вам первый результат. В большинстве случаев окно в коробке имеет правильный значок. Однако функция get_process(w_id) может использовать некоторое улучшение. Если процесс не найден как команда в /usr/share/applications, файл имеет общий значок.

Предоставление значков в бокс-окне другого размера, чем другие значки

Сценарий все еще может использовать некоторую доработку:

Сценарий называет созданный .desktop файлы всегда boxed_1.desktop, boxed_2.desktop и т. д., в зависимости от «доступного» имени в момент создания (имена файлов, а не отображаемое имя).

Вы можете изменить размер файлов (в общем), щелкнув правой кнопкой мыши значок размера значка. Хорошей новостью является то, что если вы удалите файл и заново его создадите, размер запомнится. Даже если вы снова создадите файл после перезапуска. Это означает, что если вы когда-либо изменили размеры окон в коробке (например,) 1-5, они всегда будут иметь тот же размер, когда вы (скрипт) снова создадите их!

18
ответ дан 23 July 2018 в 21:44

К моему собственному удивлению, он работает довольно хорошо, Пока у вас не слишком много других вещей на вашем рабочем столе .

Я работал с ним некоторое время, и это кажется странным, но, как ни странно, хорошим альтернативой частым переключателям рабочего пространства. Обновление

На практике

Решение на самом деле в значительной степени описывает то, что вы описываете:

  • Нажатие комбинации клавиш будет «вставлять» окна на рабочем столе, из окна: в значок с появлением приложения:
  • Дважды щелкните значок,

Как это работает

Рассказ (объяснение):

  • При нажатии сочетания клавиш , скрипт вызывается с аргументом box:
    windowbox box
    
  • Затем скрипт: считывает идентификатор окна в самом переднем окне, проверяет, является ли это «нормальным» окном (вы не захотите разархивируйте свой рабочий стол, например) Выбирает имя процесса приложения, владеющего окном. Поиск соответствующего значка в файле .desktop соответствующего приложения в /usr/share/applications создает файл с уникальным именем .desktop с линией Exec=, которая вызывает скрипт (при двойном щелчке) с аргументом show:
    windowbox show
    

Файл .desktop добавит несколько дополнительных аргументов аргументов, таких как идентификатор окна, имя файла .desktop.

Впоследствии:

  • Затем файл .desktop становится исполняемым, чтобы сделать его объектом с двойным щелчком.
  • Когда файл .desktop дважды щелкнут, окно (повторно) отображается, файл .desktop удаляется со своего рабочего стола.

Как setup

  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. Перейдите в раздел «Системные настройки» → «Клавиатура» → «Ярлыки» → «Специальные ярлыки» , Нажмите кнопку + и добавьте команду:
    windowbox box
    

Это должно сделать это.

Важное примечание

Сценарий использует xdotool ' s windowunmap, чтобы сделать окно невидимым. Созданный «ящик» (значок) на вашем рабочем столе является единственным «затвором» для скрытого окна. Другими словами: не удаляйте файлы рабочего стола вручную.

[206: done ]

Сценарий все еще может использовать некоторую доработку :

  • Геометрия окна не восстанавливается по определению. Может быть исправлено очень хорошо, но я думал, что я покажу вам первый результат.
  • В большинстве случаев окно в коробке имеет свой правильный значок. Однако функция get_process(w_id) может использовать некоторое улучшение. Если процесс не найден в качестве команды в /usr/share/applications, файл имеет общий значок.

Предоставление значков в виде бокса в другом размере, чем другие значки

В сценарии имена созданных файлов .desktop всегда boxed_1.desktop, boxed_2.desktop и т. д., в зависимости от «доступного» имени на момент создания (имена файлов, а не отображаемое имя).

Вы можете изменить размер файлов (в общем), щелкнув правой кнопкой мыши значок размера значка. Хорошей новостью является то, что если вы удалите файл и заново его создадите, размер запомнится. Даже если вы снова создадите файл после перезапуска. Это означает, что если вы когда-либо изменили размер окон в коробке (например) 1-5, они всегда будут иметь одинаковый размер, когда вы (скрипт) создадите их снова!

18
ответ дан 31 July 2018 в 19:27

К моему собственному удивлению, он работает довольно хорошо, Пока у вас не слишком много других вещей на вашем рабочем столе .

Я работал с ним некоторое время, и это кажется странным, но, как ни странно, хорошим альтернативой частым переключателям рабочего пространства. Обновление

На практике

Решение на самом деле в значительной степени описывает то, что вы описываете:

  • Нажатие комбинации клавиш будет «вставлять» окна на рабочем столе, из окна: в значок с появлением приложения:
  • Дважды щелкните значок,

Как это работает

Рассказ (объяснение):

  • При нажатии сочетания клавиш , скрипт вызывается с аргументом box:
    windowbox box
    
  • Затем скрипт: считывает идентификатор окна в самом переднем окне, проверяет, является ли это «нормальным» окном (вы не захотите разархивируйте свой рабочий стол, например) Выбирает имя процесса приложения, владеющего окном. Поиск соответствующего значка в файле .desktop соответствующего приложения в /usr/share/applications создает файл с уникальным именем .desktop с линией Exec=, которая вызывает скрипт (при двойном щелчке) с аргументом show:
    windowbox show
    

Файл .desktop добавит несколько дополнительных аргументов аргументов, таких как идентификатор окна, имя файла .desktop.

Впоследствии:

  • Затем файл .desktop становится исполняемым, чтобы сделать его объектом с двойным щелчком.
  • Когда файл .desktop дважды щелкнут, окно (повторно) отображается, файл .desktop удаляется со своего рабочего стола.

Как setup

  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. Перейдите в раздел «Системные настройки» → «Клавиатура» → «Ярлыки» → «Специальные ярлыки» , Нажмите кнопку + и добавьте команду:
    windowbox box
    

Это должно сделать это.

Важное примечание

Сценарий использует xdotool ' s windowunmap, чтобы сделать окно невидимым. Созданный «ящик» (значок) на вашем рабочем столе является единственным «затвором» для скрытого окна. Другими словами: не удаляйте файлы рабочего стола вручную.

[206: done ]

Сценарий все еще может использовать некоторую доработку :

  • Геометрия окна не восстанавливается по определению. Может быть исправлено очень хорошо, но я думал, что я покажу вам первый результат.
  • В большинстве случаев окно в коробке имеет свой правильный значок. Однако функция get_process(w_id) может использовать некоторое улучшение. Если процесс не найден в качестве команды в /usr/share/applications, файл имеет общий значок.

Предоставление значков в виде бокса в другом размере, чем другие значки

В сценарии имена созданных файлов .desktop всегда boxed_1.desktop, boxed_2.desktop и т. д., в зависимости от «доступного» имени на момент создания (имена файлов, а не отображаемое имя).

Вы можете изменить размер файлов (в общем), щелкнув правой кнопкой мыши значок размера значка. Хорошей новостью является то, что если вы удалите файл и заново его создадите, размер запомнится. Даже если вы снова создадите файл после перезапуска. Это означает, что если вы когда-либо изменили размер окон в коробке (например) 1-5, они всегда будут иметь одинаковый размер, когда вы (скрипт) создадите их снова!

18
ответ дан 2 August 2018 в 12:29

К моему собственному удивлению, он работает довольно хорошо, Пока у вас не слишком много других вещей на вашем рабочем столе .

Я работал с ним некоторое время, и это кажется странным, но, как ни странно, хорошим альтернативой частым переключателям рабочего пространства. Обновление

На практике

Решение на самом деле в значительной степени описывает то, что вы описываете:

  • Нажатие комбинации клавиш будет «вставлять» окна на рабочем столе, из окна: в значок с появлением приложения:
  • Дважды щелкните значок,

Как это работает

Рассказ (объяснение):

  • При нажатии сочетания клавиш , скрипт вызывается с аргументом box:
    windowbox box
    
  • Затем скрипт: считывает идентификатор окна в самом переднем окне, проверяет, является ли это «нормальным» окном (вы не захотите разархивируйте свой рабочий стол, например) Выбирает имя процесса приложения, владеющего окном. Поиск соответствующего значка в файле .desktop соответствующего приложения в /usr/share/applications создает файл с уникальным именем .desktop с линией Exec=, которая вызывает скрипт (при двойном щелчке) с аргументом show:
    windowbox show
    

Файл .desktop добавит несколько дополнительных аргументов аргументов, таких как идентификатор окна, имя файла .desktop.

Впоследствии:

  • Затем файл .desktop становится исполняемым, чтобы сделать его объектом с двойным щелчком.
  • Когда файл .desktop дважды щелкнут, окно (повторно) отображается, файл .desktop удаляется со своего рабочего стола.

Как setup

  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. Перейдите в раздел «Системные настройки» → «Клавиатура» → «Ярлыки» → «Специальные ярлыки» , Нажмите кнопку + и добавьте команду:
    windowbox box
    

Это должно сделать это.

Важное примечание

Сценарий использует xdotool ' s windowunmap, чтобы сделать окно невидимым. Созданный «ящик» (значок) на вашем рабочем столе является единственным «затвором» для скрытого окна. Другими словами: не удаляйте файлы рабочего стола вручную.

[206: done ]

Сценарий все еще может использовать некоторую доработку :

  • Геометрия окна не восстанавливается по определению. Может быть исправлено очень хорошо, но я думал, что я покажу вам первый результат.
  • В большинстве случаев окно в коробке имеет свой правильный значок. Однако функция get_process(w_id) может использовать некоторое улучшение. Если процесс не найден в качестве команды в /usr/share/applications, файл имеет общий значок.

Предоставление значков в виде бокса в другом размере, чем другие значки

В сценарии имена созданных файлов .desktop всегда boxed_1.desktop, boxed_2.desktop и т. д., в зависимости от «доступного» имени на момент создания (имена файлов, а не отображаемое имя).

Вы можете изменить размер файлов (в общем), щелкнув правой кнопкой мыши значок размера значка. Хорошей новостью является то, что если вы удалите файл и заново его создадите, размер запомнится. Даже если вы снова создадите файл после перезапуска. Это означает, что если вы когда-либо изменили размер окон в коробке (например) 1-5, они всегда будут иметь одинаковый размер, когда вы (скрипт) создадите их снова!

18
ответ дан 3 August 2018 в 16:51

К моему собственному удивлению, он работает довольно хорошо, Пока у вас не слишком много других вещей на вашем рабочем столе .

Я работал с ним некоторое время, и это кажется странным, но, как ни странно, хорошим альтернативой частым переключателям рабочего пространства. Обновление

На практике

Решение на самом деле в значительной степени описывает то, что вы описываете:

  • Нажатие комбинации клавиш будет «вставлять» окна на рабочем столе, из окна: в значок с появлением приложения:
  • Дважды щелкните значок,

Как это работает

Рассказ (объяснение):

  • При нажатии сочетания клавиш , скрипт вызывается с аргументом box:
    windowbox box
    
  • Затем скрипт: считывает идентификатор окна в самом переднем окне, проверяет, является ли это «нормальным» окном (вы не захотите разархивируйте свой рабочий стол, например) Выбирает имя процесса приложения, владеющего окном. Поиск соответствующего значка в файле .desktop соответствующего приложения в /usr/share/applications создает файл с уникальным именем .desktop с линией Exec=, которая вызывает скрипт (при двойном щелчке) с аргументом show:
    windowbox show
    

Файл .desktop добавит несколько дополнительных аргументов аргументов, таких как идентификатор окна, имя файла .desktop.

Впоследствии:

  • Затем файл .desktop становится исполняемым, чтобы сделать его объектом с двойным щелчком.
  • Когда файл .desktop дважды щелкнут, окно (повторно) отображается, файл .desktop удаляется со своего рабочего стола.

Как setup

  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. Перейдите в раздел «Системные настройки» → «Клавиатура» → «Ярлыки» → «Специальные ярлыки» , Нажмите кнопку + и добавьте команду:
    windowbox box
    

Это должно сделать это.

Важное примечание

Сценарий использует xdotool ' s windowunmap, чтобы сделать окно невидимым. Созданный «ящик» (значок) на вашем рабочем столе является единственным «затвором» для скрытого окна. Другими словами: не удаляйте файлы рабочего стола вручную.

[206: done ]

Сценарий все еще может использовать некоторую доработку :

  • Геометрия окна не восстанавливается по определению. Может быть исправлено очень хорошо, но я думал, что я покажу вам первый результат.
  • В большинстве случаев окно в коробке имеет свой правильный значок. Однако функция get_process(w_id) может использовать некоторое улучшение. Если процесс не найден в качестве команды в /usr/share/applications, файл имеет общий значок.

Предоставление значков в виде бокса в другом размере, чем другие значки

В сценарии имена созданных файлов .desktop всегда boxed_1.desktop, boxed_2.desktop и т. д., в зависимости от «доступного» имени на момент создания (имена файлов, а не отображаемое имя).

Вы можете изменить размер файлов (в общем), щелкнув правой кнопкой мыши значок размера значка. Хорошей новостью является то, что если вы удалите файл и заново его создадите, размер запомнится. Даже если вы снова создадите файл после перезапуска. Это означает, что если вы когда-либо изменили размер окон в коробке (например) 1-5, они всегда будут иметь одинаковый размер, когда вы (скрипт) создадите их снова!

18
ответ дан 5 August 2018 в 02:11

К моему собственному удивлению, он работает довольно хорошо, Пока у вас не слишком много других вещей на вашем рабочем столе .

Я работал с ним некоторое время, и это кажется странным, но, как ни странно, хорошим альтернативой частым переключателям рабочего пространства. Обновление

На практике

Решение на самом деле в значительной степени описывает то, что вы описываете:

  • Нажатие комбинации клавиш будет «вставлять» окна на рабочем столе, из окна: в значок с появлением приложения:
  • Дважды щелкните значок,

Как это работает

Рассказ (объяснение):

  • При нажатии сочетания клавиш , скрипт вызывается с аргументом box:
    windowbox box
    
  • Затем скрипт: считывает идентификатор окна в самом переднем окне, проверяет, является ли это «нормальным» окном (вы не захотите разархивируйте свой рабочий стол, например) Выбирает имя процесса приложения, владеющего окном. Поиск соответствующего значка в файле .desktop соответствующего приложения в /usr/share/applications создает файл с уникальным именем .desktop с линией Exec=, которая вызывает скрипт (при двойном щелчке) с аргументом show:
    windowbox show
    

Файл .desktop добавит несколько дополнительных аргументов аргументов, таких как идентификатор окна, имя файла .desktop.

Впоследствии:

  • Затем файл .desktop становится исполняемым, чтобы сделать его объектом с двойным щелчком.
  • Когда файл .desktop дважды щелкнут, окно (повторно) отображается, файл .desktop удаляется со своего рабочего стола.

Как setup

  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. Перейдите в раздел «Системные настройки» → «Клавиатура» → «Ярлыки» → «Специальные ярлыки» , Нажмите кнопку + и добавьте команду:
    windowbox box
    

Это должно сделать это.

Важное примечание

Сценарий использует xdotool ' s windowunmap, чтобы сделать окно невидимым. Созданный «ящик» (значок) на вашем рабочем столе является единственным «затвором» для скрытого окна. Другими словами: не удаляйте файлы рабочего стола вручную.

[206: done ]

Сценарий все еще может использовать некоторую доработку :

  • Геометрия окна не восстанавливается по определению. Может быть исправлено очень хорошо, но я думал, что я покажу вам первый результат.
  • В большинстве случаев окно в коробке имеет свой правильный значок. Однако функция get_process(w_id) может использовать некоторое улучшение. Если процесс не найден в качестве команды в /usr/share/applications, файл имеет общий значок.

Предоставление значков в виде бокса в другом размере, чем другие значки

В сценарии имена созданных файлов .desktop всегда boxed_1.desktop, boxed_2.desktop и т. д., в зависимости от «доступного» имени на момент создания (имена файлов, а не отображаемое имя).

Вы можете изменить размер файлов (в общем), щелкнув правой кнопкой мыши значок размера значка. Хорошей новостью является то, что если вы удалите файл и заново его создадите, размер запомнится. Даже если вы снова создадите файл после перезапуска. Это означает, что если вы когда-либо изменили размер окон в коробке (например) 1-5, они всегда будут иметь одинаковый размер, когда вы (скрипт) создадите их снова!

18
ответ дан 6 August 2018 в 18:51

К моему собственному удивлению, он работает довольно хорошо, Пока у вас не слишком много других вещей на вашем рабочем столе .

Я работал с ним некоторое время, и это кажется странным, но, как ни странно, хорошим альтернативой частым переключателям рабочего пространства. Обновление

На практике

Решение на самом деле в значительной степени описывает то, что вы описываете:

  • Нажатие комбинации клавиш будет «вставлять» окна на рабочем столе, из окна: в значок с появлением приложения:
  • Дважды щелкните значок,

Как это работает

Рассказ (объяснение):

  • При нажатии сочетания клавиш , скрипт вызывается с аргументом box:
    windowbox box
    
  • Затем скрипт: считывает идентификатор окна в самом переднем окне, проверяет, является ли это «нормальным» окном (вы не захотите разархивируйте свой рабочий стол, например) Выбирает имя процесса приложения, владеющего окном. Поиск соответствующего значка в файле .desktop соответствующего приложения в /usr/share/applications создает файл с уникальным именем .desktop с линией Exec=, которая вызывает скрипт (при двойном щелчке) с аргументом show:
    windowbox show
    

Файл .desktop добавит несколько дополнительных аргументов аргументов, таких как идентификатор окна, имя файла .desktop.

Впоследствии:

  • Затем файл .desktop становится исполняемым, чтобы сделать его объектом с двойным щелчком.
  • Когда файл .desktop дважды щелкнут, окно (повторно) отображается, файл .desktop удаляется со своего рабочего стола.

Как setup

  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. Перейдите в раздел «Системные настройки» → «Клавиатура» → «Ярлыки» → «Специальные ярлыки» , Нажмите кнопку + и добавьте команду:
    windowbox box
    

Это должно сделать это.

Важное примечание

Сценарий использует xdotool ' s windowunmap, чтобы сделать окно невидимым. Созданный «ящик» (значок) на вашем рабочем столе является единственным «затвором» для скрытого окна. Другими словами: не удаляйте файлы рабочего стола вручную.

[206: done ]

Сценарий все еще может использовать некоторую доработку :

  • Геометрия окна не восстанавливается по определению. Может быть исправлено очень хорошо, но я думал, что я покажу вам первый результат.
  • В большинстве случаев окно в коробке имеет свой правильный значок. Однако функция get_process(w_id) может использовать некоторое улучшение. Если процесс не найден в качестве команды в /usr/share/applications, файл имеет общий значок.

Предоставление значков в виде бокса в другом размере, чем другие значки

В сценарии имена созданных файлов .desktop всегда boxed_1.desktop, boxed_2.desktop и т. д., в зависимости от «доступного» имени на момент создания (имена файлов, а не отображаемое имя).

Вы можете изменить размер файлов (в общем), щелкнув правой кнопкой мыши значок размера значка. Хорошей новостью является то, что если вы удалите файл и заново его создадите, размер запомнится. Даже если вы снова создадите файл после перезапуска. Это означает, что если вы когда-либо изменили размер окон в коробке (например) 1-5, они всегда будут иметь одинаковый размер, когда вы (скрипт) создадите их снова!

18
ответ дан 8 August 2018 в 23:12

К моему собственному удивлению, он работает довольно хорошо, Пока у вас не слишком много других вещей на вашем рабочем столе .

Я работал с ним некоторое время, и это кажется странным, но, как ни странно, хорошим альтернативой частым переключателям рабочего пространства. Обновление

На практике

Решение на самом деле в значительной степени описывает то, что вы описываете:

  • Нажатие комбинации клавиш будет «вставлять» окна на рабочем столе, из окна: в значок с появлением приложения:
  • Дважды щелкните значок,

Как это работает

Рассказ (объяснение):

  • При нажатии сочетания клавиш , скрипт вызывается с аргументом box:
    windowbox box
    
  • Затем скрипт: считывает идентификатор окна в самом переднем окне, проверяет, является ли это «нормальным» окном (вы не захотите разархивируйте свой рабочий стол, например) Выбирает имя процесса приложения, владеющего окном. Поиск соответствующего значка в файле .desktop соответствующего приложения в /usr/share/applications создает файл с уникальным именем .desktop с линией Exec=, которая вызывает скрипт (при двойном щелчке) с аргументом show:
    windowbox show
    

Файл .desktop добавит несколько дополнительных аргументов аргументов, таких как идентификатор окна, имя файла .desktop.

Впоследствии:

  • Затем файл .desktop становится исполняемым, чтобы сделать его объектом с двойным щелчком.
  • Когда файл .desktop дважды щелкнут, окно (повторно) отображается, файл .desktop удаляется со своего рабочего стола.

Как setup

  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. Перейдите в раздел «Системные настройки» → «Клавиатура» → «Ярлыки» → «Специальные ярлыки» , Нажмите кнопку + и добавьте команду:
    windowbox box
    

Это должно сделать это.

Важное примечание

Сценарий использует xdotool ' s windowunmap, чтобы сделать окно невидимым. Созданный «ящик» (значок) на вашем рабочем столе является единственным «затвором» для скрытого окна. Другими словами: не удаляйте файлы рабочего стола вручную.

[206: done ]

Сценарий все еще может использовать некоторую доработку :

  • Геометрия окна не восстанавливается по определению. Может быть исправлено очень хорошо, но я думал, что я покажу вам первый результат.
  • В большинстве случаев окно в коробке имеет свой правильный значок. Однако функция get_process(w_id) может использовать некоторое улучшение. Если процесс не найден в качестве команды в /usr/share/applications, файл имеет общий значок.

Предоставление значков в виде бокса в другом размере, чем другие значки

В сценарии имена созданных файлов .desktop всегда boxed_1.desktop, boxed_2.desktop и т. д., в зависимости от «доступного» имени на момент создания (имена файлов, а не отображаемое имя).

Вы можете изменить размер файлов (в общем), щелкнув правой кнопкой мыши значок размера значка. Хорошей новостью является то, что если вы удалите файл и заново его создадите, размер запомнится. Даже если вы снова создадите файл после перезапуска. Это означает, что если вы когда-либо изменили размер окон в коробке (например) 1-5, они всегда будут иметь одинаковый размер, когда вы (скрипт) создадите их снова!

18
ответ дан 14 August 2018 в 13:12

Вы можете использовать fvwm для выполнения этого.

Установить fvwm: sudo apt-get update sudo apt-get install fvwm Найти тех, кто использует функцию iconify, - здесь есть несколько: http://www.jmcunx.com/fvwm_theme. html Несколько выглядят как экранный снимок, который вы показываете. Скопируйте текст темы, затем перейдите к ~/.fvwm/ (сначала покажите скрытые файлы), затем создайте файл .fvwm2rc. Откройте этот файл в текстовом редакторе (например, gedit) и вставьте текст темы в него. Перезагрузите компьютер и выберите fvwm и войдите в систему.

7
ответ дан 17 July 2018 в 21:04

Вы можете использовать fvwm для выполнения этого.

Установить fvwm: sudo apt-get update sudo apt-get install fvwm Найти тех, кто использует функцию iconify, - здесь есть несколько: http://www.jmcunx.com/fvwm_theme. html Несколько выглядят как экранный снимок, который вы показываете. Скопируйте текст темы, затем перейдите к ~/.fvwm/ (сначала покажите скрытые файлы), затем создайте файл .fvwm2rc. Откройте этот файл в текстовом редакторе (например, gedit) и вставьте текст темы в него. Перезагрузите компьютер и выберите fvwm и войдите в систему.

7
ответ дан 23 July 2018 в 21:44

Другие вопросы по тегам:

Похожие вопросы: