- unixforum.org
- Re: Запуск оконных приложений в свернутом виде
- Re: Запуск оконных приложений в свернутом виде
- Re: Запуск оконных приложений в свернутом виде
- Re: Запуск оконных приложений в свернутом виде
- Как я могу запустить программу при запуске, свернуто?
- 9 ответов
- Запуск приложения свернут
- Общее решение для запуска приложения сведено к минимуму
- Сценарий
- Как пользоваться
- объяснение
- Заметка
- РЕДАКТИРОВАТЬ
- узнав окно по пиду
- Сценарий
- Обратите внимание на второй сценарий
- EDIT2 конкретная версия скрипта для Steam
- Почему конкретная версия для Steam?
- Сценарий
- Использовать его
- Как заставить приложения, которые в автозапуске убунту, сворачиваться после старта?
unixforum.org
Существует ли возможность запускать оконные приложения в свернутом виде? Указанный функционал необходим для того, чтобы при старте среды рабочего стола автоматически запускаемые программы не разворачивали свои окна, а запускались как бы „втихую”.
Re: Запуск оконных приложений в свернутом виде
Сообщение shevan » 07.11.2009 15:24
Re: Запуск оконных приложений в свернутом виде
Сообщение vkapas » 13.11.2009 02:22
Aectann Бывший модератор Сообщения: 3491 Статус: . ОС: OS X, GNU_и_не_только/Linux
Re: Запуск оконных приложений в свернутом виде
Сообщение Aectann » 19.11.2009 16:21
serzh-z Бывший модератор Сообщения: 8256 Статус: Маньяк ОС: Arch, Fedora, Ubuntu Контактная информация:
Re: Запуск оконных приложений в свернутом виде
Сообщение serzh-z » 19.11.2009 16:35
DevilsPie — ужасная штука. Он не умеет отслеживать окна, который «только что были созданы и отображены». Т.е. в нём не получится свернуть окно только один раз, при его создании, он не сможет потом игнорировать это окно. У меня вышло лишь заставить его сворачивать окна *каждый раз*, когда оно было отображено — что, разумеется, совершенно бесполезно.
Да, кстати, работает он под любым DE с Metacity-подобным WM — ему это без разницы, зависит он лишь от Xorg.
Как я могу запустить программу при запуске, свернуто?
Я просто хочу, чтобы Telegram запускался, и я добавил его в автозагрузку приложений. Дело в том, что мне нужно, чтобы это было минимизировано. Любые команды?
9 ответов
Запуск приложения свернут
Минимизированный запуск приложения требует двух команд:
Следовательно, команда или скрипт должны быть «умными»; вторая команда должна дождаться фактического появления окна приложения.
Общее решение для запуска приложения сведено к минимуму
Сценарий ниже делает это и может использоваться в качестве общего решения для запуска приложения в минимизированном виде. Просто запустите его в синтаксисе:
Сценарий
#!/usr/bin/env python3 import subprocess import sys import time subprocess.Popen(["/bin/bash", "-c", sys.argv[1]]) windowname = sys.argv[2] def read_wlist(w_name): try: l = subprocess.check_output(["wmctrl", "-l"]).decode("utf-8").splitlines() return [w.split()[0] for w in l if w_name in w][0] except (IndexError, subprocess.CalledProcessError): return None t = 0 while t < 30: window = read_wlist(windowname) time.sleep(0.1) if window != None: subprocess.Popen(["xdotool", "windowminimize", window]) break time.sleep(1) t += 1
Как пользоваться
Скрипт нуждается в обоих wmctrl а также xdotool :
sudo apt-get install wmctrl xdotool
- Скопируйте скрипт в пустой файл, сохраните его как startup_minimizd.py
- Протестируйте скрипт с помощью (например) gedit команда:
python3 /path/to/startup_minimizd.py gedit gedit
объяснение
- Сценарий запускает приложение, выполняя команду, которую вы дали в качестве первого аргумента.
- Затем скрипт проверяет список окон (с помощью wmctrl ) для окон, названный в честь вашего второго аргумента.
- Если окно появляется, оно немедленно сворачивается с помощью xdotool Чтобы предотвратить бесконечный цикл, если окно может не появиться по какой-либо причине, сценарий устанавливает ограничение времени 30 секунд для отображения окна.
Заметка
Не нужно упоминать, что вы можете использовать скрипт для нескольких приложений одновременно, так как вы запускаете его с аргументами вне скрипта.
РЕДАКТИРОВАТЬ
узнав окно по пиду
Если заголовок окна является неопределенным или переменным, или существует риск столкновения имен в имени окна, используя pid это более надежный метод для использования.
Сценарий ниже основан на использовании pid приложения, как в выводе обоих wmctrl -lp а также ps -ef ,
Настройка почти такая же, но заголовок окна в этой версии не нужен, поэтому команда для его запуска:
python3 /path/to/startup_minimizd.py
Так же, как и первый скрипт wmctrl а также xdotool
Сценарий
#!/usr/bin/env python3 import subprocess import sys import time command = sys.argv[1] command_check = command.split("/")[-1] subprocess.Popen(["/bin/bash", "-c", command]) t = 1 while t < 30: try: w_list = [l.split() for l in subprocess.check_output(["wmctrl", "-lp"]).decode("utf-8").splitlines()] proc = subprocess.check_output(["pgrep", "-f", command_check]).decode("utf-8").strip().split() match = sum([[l[0] for l in w_list if p in l] for p in proc], []) subprocess.Popen(["xdotool", "windowminimize", match[0]]) break except (IndexError, subprocess.CalledProcessError): pass t += 1 time.sleep(1)
Обратите внимание на второй сценарий
Хотя в общем случае вторая версия должна быть более надежной, в случаях, когда приложение запускается сценарием-оболочкой, pid команды будет отличаться от приложения, которое окончательно вызывается.
В таких случаях я рекомендую использовать первый скрипт.
EDIT2 конкретная версия скрипта для Steam
Как указано в комментарии, ниже версия, специально сделанная для запуска STEAM, свернута.
Почему конкретная версия для Steam?
Оказывается Steam ведет себя совершенно иначе, чем "нормальное" приложение:
- Оказывается Steam не запускается один пид, но не менее (в моем тесте) восемь!
- Steam запускается при запуске как минимум с двумя окнами (одно окно, похожее на заставку), но иногда появляется дополнительное окно сообщений.
- Окна Стима есть pid 0 , которая является проблемой в сценарии, как это было.
- После того, как главное окно создано, оно поднимается второй раз через секунду или около того, поэтому минимизация не будет выполняться.
Это исключительное поведение Steam запрашивает специальную версию скрипта, которая добавлена ниже. Скрипт запускается Steam и в течение 12 секунд отслеживает все новые окна соответствующих WM_CLASS , проверяя, минимизированы ли они. Если нет, сценарий гарантирует, что они будут.
Как и оригинальный скрипт, этот нужен wmctrl а также xdotool быть установленным.
Сценарий
#!/usr/bin/env python3 import subprocess import time command = "steam" subprocess.Popen(["/bin/bash", "-c", command]) def get(cmd): return subprocess.check_output(cmd).decode("utf-8").strip() t = 0 while t < 12: try: w_list = [l.split()[0] for l in get(["wmctrl", "-l"]).splitlines()] for w in w_list: data = get(["xprop", "-id", w]) if all(["Steam" in data, not "_NET_WM_STATE_HIDDEN" in data]): subprocess.Popen(["xdotool", "windowminimize", w]) except (IndexError, subprocess.CalledProcessError): pass t += 1 time.sleep(1)
Использовать его
- Просто скопируйте его в пустой файл, сохраните как runsteam_minimized.py
- Запустите его командой:
python3 /path/to/runsteam_minimized.py
Хорошо иметь сценарии, предоставленные user72216 и Sergey, в качестве общих решений проблемы, но иногда приложение, которое вы хотите минимизировать при запуске, уже имеет переключатель, который будет делать то, что вы хотите.
Вот несколько примеров с соответствующими строками команд запуска программы:
- Telegram (начиная с версии 0.7.10) имеет -startintray опция: /Telegram -startintray
- Steam имеет -silent опция: /usr/bin/steam %U -silent
- Коробка передач имеет --minimized опция: /usr/bin/transmission-gtk --minimized
В Unity эти приложения начинают сворачиваться в виде значков в верхней строке меню, а не значков на панели запуска, хотя значок обычного запуска все равно будет отображаться после запуска приложения. Другие приложения могут вести себя по-другому.
Мне нужно было, чтобы программы были закрыты в трей, а не свернуты, и я перепробовал все скрипты, которые выложены здесь, те, которые работали, работали только для одних программ, а не для других. Итак, я написал код, который работает намного лучше (вы почти не видите появления окна, только значок в трее, он выглядит нативно) и работает для всех программ, которые я пробовал. Он основан на Джейкобе. С этим сценарием вам может потребоваться добавить аргумент в зависимости от программы (см. Ниже), но он всегда работал для меня со многими программами, он также должен работать с Steam.
Использование:
- sudo apt-get install wmctrl xdotool
- Сохранить скрипт как startup_closed.py дать ему разрешение на выполнение, а затем выполнить python3 ./startup_closed.py -c
- Если значок на панели задач не отображается или окно не отображается, необходимо добавить один из следующих аргументов: -splash или же -hide , методом проб и ошибок. Например: python3 ./startup_closed.py -hide -c teamviewer или же python3 ./startup_closed.py -splash -c slack
- Есть больше аргументов, но вы, вероятно, не нуждаетесь в них. Также есть полная информация о том, когда и зачем нужны аргументы в справке: ./startup_closed.py --help
Авторсценария:
#!/usr/bin/env python3 import subprocess import sys import time import argparse import random parser = argparse.ArgumentParser(description='This script executes a command you specify and closes or hides the window/s that opens from it, leaving only the tray icon. Useful to "open closed to tray" a program. If the program does not have a tray icon then it just gets closed. There is no magic solution to achieve this that works for all the programs, so you may need to tweek a couple of arguments to make it work for your program, a couple of trial and error may be required with the arguments -splash and -hide, you probably will not need the others.') parser.add_argument("-c", type=str, help="The command to open your program. This parameter is required.", required=True) parser.add_argument("-splash", help="Does not close the first screen detected. Closes the second window detected. Use in programs that opens an independent splash screen. Otherwise the splash screen gets closed and the program cannot start.", action='store_true', default=False) parser.add_argument("-hide", help="Hides instead of closing, for you is the same but some programs needs this for the tray icon to appear.", action='store_true', default=False) parser.add_argument("-skip", type=int, default=0, help='Skips the ammount of windows specified. For example if you set -skip 2 then the first 2 windows that appear from the program will not be affected, use it in programs that opens multiple screens and not all must be closed. The -splash argument just increments by 1 this argument.', required=False) parser.add_argument("-repeat", type=int, default=1, help='The amount of times the window will be closed or hidden. Default = 1. Use it for programs that opens multiple windows to be closed or hidden.', required=False) parser.add_argument("-delay", type=float, default=10, help="Delay in seconds to wait before running the application, useful at boot to not choke the computer. Default = 10", required=False) parser.add_argument("-speed", type=float, default=0.02, help="Delay in seconds to wait between closing attempts, multiple frequent attempts are required because the application may be still loading Default = 0.02", required=False) args = parser.parse_args() if args.delay > 0: finalWaitTime = random.randint(args.delay, args.delay * 2); print(str(args.delay) + " seconds of delay configured, will wait for: " + str(finalWaitTime)) time.sleep(finalWaitTime) print("waiting finished, running the application command. ") command_check = args.c.split("/")[-1] subprocess.Popen(["/bin/bash", "-c", args.c]) hasIndependentSplashScreen = args.splash onlyHide = args.hide skip = args.skip repeatAmmount = args.repeat speed = args.speed actionsPerformed = 0 lastWindowId = 0 if hasIndependentSplashScreen: skip += 1 while True: try: w_list = [l.split() for l in subprocess.check_output(["wmctrl", "-lp"]).decode("utf-8").splitlines()] proc = subprocess.check_output(["pgrep", "-f", command_check]).decode("utf-8").strip().split() match = sum([[l[0] for l in w_list if p in l] for p in proc], []) if len(match) > 0: windowId = match[0] if windowId != lastWindowId: if skip > 0: skip -= 1 print("skipped window: " + windowId) lastWindowId = windowId else: print("new window detected: " + windowId) if onlyHide: subprocess.Popen(["xdotool", "windowunmap", windowId]) print("window was hidden: " + windowId) else: subprocess.Popen(["xdotool", "key", windowId, "alt+F4"]) print("window was closed: " + windowId) actionsPerformed += 1 lastWindowId = windowId if actionsPerformed == repeatAmmount: break except (IndexError, subprocess.CalledProcessError): break time.sleep(speed) print("finished")
Как заставить приложения, которые в автозапуске убунту, сворачиваться после старта?
К примеру вайбер телеграм или thunderbird в автозапуске. Можно сделать так, чтоб они после запуска сворачивались?
Добавить в файле: name_of_your_soft.desktop
в папке: ~/.config/autostart
в секции: Exec
параметр: StartMinimized
Например (Viber у меня):
файл: env.desktop
секция Exec выглядит так:
Exec=env QT_SCREEN_SCALE_FACTORS=1.3 /opt/viber/Viber StartMinimized %u
Можно добавить это значение через sed или awk в Терминале или в графическом режиме в редакторе (Nano, Gedit, Vim), открыв этот файл им и добавив это значение.
Или через GUI - Автоматически запускаемые приложения (вызов терминале: gnome-session-properties).
Щёлкаешь 2 раза мышом на нужную запись:
И в выпавшем окне:
добавляешь в разделе Команда: в код, как на скрине через пробелы StartMinimized.
Жмёшь на Сохранить и Закрыть.
Вуаля.