На Irix 4Dwm, была способность минимизировать окна в поле (вопреки панели задач, используемой современными менеджерами окон). Я видел это также на старом HPUX.
Посмотрите "консольный" квадрат в связанном изображении:
Действительно ли возможно выполнить на Ubuntu, или с плагином или возможно с некоторым менеджером окон кроме Единицы?
К моему собственному удивлению, это работает довольно хорошо, Если у вас не так много других вещей на вашем рабочем столе .
Я работал с ним некоторое время, и это кажется странным, но, как ни странно, приятной альтернативой частым переключениям рабочего пространства . Обновление для его простоты.
На самом деле решение в значительной степени то, что вы описываете:
Нажатие комбинации клавиш "закроет" окно на вашем рабочем столе из окна:
в значок , с внешним видом приложения:
Дважды щелкните значок, и окно снова появится, а значок исчезнет.
Краткая история (объяснение):
При нажатии на ярлык key, сценарий вызывается с аргументом box
:
windowbox box
Затем сценарий:
.desktop
соответствующего приложения в / usr / share / applications
, создает одноименный .desktop
файл со строкой Exec =
, которая вызывает сценарий (при двойном щелчке) с аргументом show
:
windowbox show
В файл .desktop
будет добавлен ряд дополнительных аргументов, таких как идентификатор окна, имя (файла) файла .desktop
.
Впоследствии :
Затем файл .desktop
становится исполняемым, чтобы сделать его объектом, доступным для двойного щелчка.
При двойном щелчке по файлу .desktop
окно (повторно) отображается, файл .desktop
удаляется с вашего рабочего стола.
Как практически всегда, когда вы хотите поиграть с окнами, скрипту необходимы как wmctrl
, так и xdotool
:
sudo apt-get install xdotool wmctrl
~ / bin
( ~
означает ваш домашний каталог) Скопируйте приведенный ниже сценарий в пустой файл, сохраните его как 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])
Сделайте скрипт исполняемым
$ PATH
, либо выйдите из системы / войдите в систему, либо запустите source ~ / .profile
( из окна терминала) Test - запустить скрипт из окна терминала командой:
windowbox box
Окно должно исчезнуть, а на рабочем столе должно появиться «прямоугольное» окно.
Если все работает нормально, добавьте следующую команду к сочетанию клавиш: выберите значок шестеренки в правом верхнем углу экрана:
Перейдите в Системные настройки → Клавиатура → Ярлыки → Пользовательские ярлыки . Нажмите + и добавьте команду:
окно окна
Это должно сработать.
Сценарий использует xdotool
windowunmap
, чтобы сделать окно невидимым. Созданный «ящик» (значок) на рабочем столе - единственные «ворота» в скрытое окно. Другими словами: не удаляйте файлы рабочего стола вручную. Если вы это сделаете, окно будет потеряно навсегда.
В сценарии все еще можно внести некоторые уточнения:
get_process (w_id)
могла бы использовать некоторые улучшения. Если процесс не найден в виде команды в / usr / share / applications
, у файла есть общий значок. скрипт называет созданные файлы .desktop
всегда boxed_1.desktop
, boxed_2.desktop
и т. д., в зависимости от «доступного» имени на момент создания (имена файлов, а не отображаемое имя).
Вы можете изменить размер файлов (в общем), щелкнув правой кнопкой мыши> размер значка. Хорошая новость заключается в том, что если вы удалите файл и создадите его заново, размер запомнится. Даже если вы создадите файл заново после перезапуска. Это означает, что если вы когда-либо изменяли размер окон в рамке (например) от 1 до 5, они всегда будут иметь тот же размер, когда вы (сценарий) создадите их снова!
Для этого можно использовать fvwm .
Установите fvwm:
sudo apt-get update
sudo apt-get install fvwm
Найдите их, которые используют функцию iconify - их здесь несколько: http://www.jmcunx.com/fvwm_theme.html Некоторые из них похожи на снимок экрана, который вы показываете.
Копировать текст темы, затем перейдите к ~ / .fvwm /
(сначала покажите скрытые файлы), затем создайте файл .fvwm2rc
Откройте этот файл в текстовом редакторе (например, gedit) и вставьте в него текст темы.
Перезагрузите компьютер, выберите fvwm и войдите в систему.