Я могу минимизировать окно в поле на Единице?

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

Посмотрите "консольный" квадрат в связанном изображении:

enter image description here

Действительно ли возможно выполнить на Ubuntu, или с плагином или возможно с некоторым менеджером окон кроме Единицы?

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

2 ответа

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

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

На практике

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

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

    enter image description here

    в значок , с внешним видом приложения:

    enter image description here

  • Дважды щелкните значок, и окно снова появится, а значок исчезнет.

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

Краткая история (объяснение):

  • При нажатии на ярлык key, сценарий вызывается с аргументом box :

     windowbox box
     
  • Затем сценарий:

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

       windowbox show
       

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

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

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

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

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

  1. Как практически всегда, когда вы хотите поиграть с окнами, скрипту необходимы как wmctrl , так и xdotool :

     sudo apt-get install xdotool wmctrl
     
  2. Создайте каталог ~ / bin ( ~ означает ваш домашний каталог)
  3. Скопируйте приведенный ниже сценарий в пустой файл, сохраните его как windowbox ] (без расширения) в ~ / bin .

     #! / usr / bin / env python3
    подпроцесс импорта
    import sys
    импорт ОС
    
     # --- В Unity есть отклонение (по оси Y) в размещении окон
     # установить в ноль для других оконных менеджеров
    отклонение = 28
     # ---
    
    args = sys.argv [1:]
    
    get = lambda cmd: subprocess.check_output (cmd) .decode ("utf-8"). strip ()
    
    def find_dtop ():
      # получить локализованный путь к папке рабочего стола
      home = os.environ ["ГЛАВНАЯ"]
      dr_file = home + "/. config / user-dirs.dirs"
      return [home + "/" + l.split ("/") [- 1] .strip () \
      для l в open (dr_file) .readlines () \
      если l.startswith ("XDG_DESKTOP_DIR =")] [0] .replace ('"'," ")
    
    def check_windowtype (w_id):
      # проверить тип окна;  отключать отображение только "НОРМАЛЬНЫХ" окон
      вернуть "_NET_WM_WINDOW_TYPE_NORMAL" в get (["xprop", "-id", w_id])
    
    def get_process (w_id):
      # получаем имя процесса, владеющего окном и положение окна x / y
      w_list = get (["wmctrl", "-lpG"]). splitlines ()
      pid = [l для l в w_list, если w_id в l] [0] .split ()
      proc = get (["ps", "-p", pid [2], "-o", "comm ="])
      xy = ("") .join (pid [3: 5])
      return (proc, xy)
    
    def read_f (f, строка, proc):
      # поиск возможного совпадения в целевом файле .desktop
      пытаться:
      с открытым (f) читать:
      для l в прочтении:
      если все ([l.startswith (string), proc in l]):
      in_f = Правда
      сломать
      еще:
      in_f = Ложь
      Кроме:
      in_f = Ложь
      вернуть in_f
    
    def get_icon (proc, w_name):
      # найдите соответствующий значок в / usr / share / applications
      исключения = [элемент для элемента в [
      ["soffice", "libreoffice-main"],
      ["gnome-терминал", "утилиты-терминал"],
      ["наутилус", "папка"],
      ] если элемент [0] в процессе]
      если исключения:
      если исключения == [["soffice", "libreoffice-main"]]:
      loffice = [
      ["Calc", "libreoffice-calc"],
      ["Писатель", "libreoffice-писатель"],
      ["База", "libreoffice-base"],
      ["Draw", "libreoffice-draw"],
      ["Impress", "libreoffice-impression"],
      ]
      match = [m [1] для m в loffice, если m [0] в w_name]
      если совпадение:
      ответ [0]
      еще:
      вернуть исключения [0] [1]
      еще:
      вернуть исключения [0] [1]
      еще:по умолчанию = "/ usr / share / applications"
      dtfiles = [по умолчанию + "/" + f для f в os.listdir (по умолчанию)]
      для f в dtfiles:
      если read_f (f, "Exec =", proc) == True:
      для l в open (f) .readlines ():
      если l.startswith ("Icon ="):
      icon = l.replace ("Icon =", "") .strip ()
      печать (е)
      сломать
      сломать
      значок возврата
    
    def create_name ():
      # создать уникальное (файловое) имя для окна в штучной упаковке
      п = 1
      в то время как True:
      name = dtop + "/" + "в рамке _" + str (n) + ". desktop"
      если os.path.exists (имя):
      п + = 1
      еще:
      сломать
      вернуть имя
    
    def convert_wid (w_id):
      # преобразовать идентификатор окна формата xdotool в формат wmctrl
      w_id = шестнадцатеричный (int (w_id))
      return w_id [: 2] + (10-len (w_id)) * "0" + w_id [2:]
    
    def create_icon (w_id, w_name, icon, pos):
      # создаем пусковую установку, представляющую окно в рамке
      boxedwindow = create_name ()
      f_content = [
      "[Desktop Entry]",
      "Name = [WINDOW]" + w_name,
      "Exec = windowbox show" + w_id + "'" + boxedwindow + "'" + pos,
      "Icon =" + значок,
      "Тип = Приложение",
      ]
      если icon == "generic":
      f_content.pop (3)
      с open (boxedwindow, "wt") в рамке:
      для l в f_content:
      boxed.write (l + "\ n")
      command = "chmod + x" + "'" + boxedwindow + "'"
      subprocess.call (["/ bin / bash", "-c", команда])
    
    если args [0] == "коробка":
      dtop = find_dtop ()
      w_id = convert_wid (get (["xdotool", "getactivewindow"]))
      w_name = get (["xdotool", "getwindowname", w_id])
      если check_windowtype (w_id) == True:
      procdata = get_process (w_id)
      procname = procdata [0]
      icon = get_icon (procname, w_name);  icon = icon if icon! = ни один другой "общий"
      create_icon (w_id, w_name, icon, procdata [1])
      subprocess.call (["xdotool", "windowunmap", w_id])
    
    elif args [0] == "показать":
      w_id = args [1]
      subprocess.call (["xdotool", "windowmap", w_id])
      subprocess.call (["xdotool", "windowmove", "--sync", w_id, args [3], str (int (args [4]) - отклонение)])
      os.remove (аргументы [2])
     
  4. Сделайте скрипт исполняемым

  5. Чтобы вновь созданный каталог «всплывал» в $ PATH , либо выйдите из системы / войдите в систему, либо запустите source ~ / .profile ( из окна терминала)
  6. Test - запустить скрипт из окна терминала командой:

     windowbox box
     

    Окно должно исчезнуть, а на рабочем столе должно появиться «прямоугольное» окно.

  7. Если все работает нормально, добавьте следующую команду к сочетанию клавиш: выберите значок шестеренки в правом верхнем углу экрана:

    Gear icon

  8. Перейдите в Системные настройки Клавиатура Ярлыки Пользовательские ярлыки . Нажмите + и добавьте команду:

     окно окна
     

Это должно сработать.

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

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

Работа, которую нужно выполнить [edit 20-12: done ]

В сценарии все еще можно внести некоторые уточнения:

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

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

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

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

enter image description here

18
ответ дан 23 November 2019 в 02:21

Для этого можно использовать 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 и войдите в систему.

enter image description here

7
ответ дан 23 November 2019 в 02:21

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

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