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