Как запустить программу при запуске, свести к минимуму?

В случае, если у кого-то есть несколько раскладок клавиатуры - это решение сработало для меня.

У меня есть две раскладки клавиатуры: английский (нами) и украинский (uk). Первый был установлен по умолчанию в системных настройках. Однако в играх Wine буквы (q, w, e, r, t, y и т. Д.) Вообще не работали.

Основываясь на ответе Алекса, я нашел способ определить мой текущие настройки раскладки клавиатуры X:

setxkbmap -v

Он показал мне следующее:

Trying to build keymap using the following components:
keycodes:   evdev+aliases(qwerty)
types:      complete+numpad(microsoft)
compat:     complete
symbols:    pc+ua+us:2+inet(evdev)+group(alt_shift_toggle)
geometry:   pc(pc101)

Я заметил, что строка symbols имеет ua (не us), на первом месте. Предполагая, что Wine всегда использует первый указанный макет, мне просто нужно было изменить приоритет макета:

setxkbmap us,ua

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

1
задан 19 August 2015 в 22:12

3 ответа

Хорошо, что сценарии, предоставленные user72216 и Sergey, являются общими решениями проблемы, но иногда приложение, которое вы хотите свернуть, уже имеет переключатель, который будет делать то, что вы хотите.

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

У Telegram (начиная с версии 0.7.10) есть опция -startintray: <path-to-Telegram>/Telegram -startintray У Steam есть опция -silent: /usr/bin/steam %U -silent Передача имеет --minimized: /usr/bin/transmission-gtk --minimized

В Unity эти приложения начинают свертываться как значки в верхней строке меню, а не как значки на панели запуска, хотя обычный значок запуска будет отображаться после запуска приложения , Другие приложения могут вести себя по-другому.

3
ответ дан 23 May 2018 в 18:06

Если программа закрывается в лоток, можно фактически закрыть окно программы при запуске, а не минимизировать ее. Одним из примеров такой программы является Viber. В этом случае можно использовать следующий скрипт start_closed.sh:

#!/bin/bash

# Check that there is only one input argument
if [[ $# -gt 1 ]]; then
echo "Usage: $0 <program-to-start>"
exit 1
fi

$1 &                               # Start program passed in first argument
pid=$!                             # Get PID of last started program
xdotool search --sync --pid $pid | # Wait for window with PID to appear...
xargs wmctrl -i -c                 # ...and close it

Использование: <path-to-script> <program-to-start>

1
ответ дан 23 May 2018 в 18:06
  • 1
    Возможно, вы захотите отметить, что xdotool не будет работать правильно при установке с Wayland. – Videonauth 3 December 2017 в 13:21

Я взял сценарии Джейкоба и немного изменил их, чтобы сделать более универсальным.

#!/usr/bin/python

import os
import subprocess
import sys
import time
import signal

WAIT_TIME = 10


def check_exist(name):
    return subprocess.Popen("which "+name,
                            shell=True,
                            stdout=subprocess.PIPE
                            ).stdout.read().rstrip("-n")


def killpid(pidlist):
    for pid in pidlist:
        args = ["xdotool",
                "search",
                "--any",
                "--pid",
                pid,
                "--name",
                "notarealprogramname",
                "windowunmap",
                "--sync",
                "%@"]
        subprocess.Popen(args)


def killname(name):
    args = ["xdotool",
            "search",
            "--any",
            "--name",
            "--class",
            "--classname",
            name,
            "windowunmap",
            "--sync",
            "%@"]
    subprocess.Popen(args)


sys.argv.pop(0)

if check_exist(sys.argv[0]) == "":
    sys.exit(1)
if check_exist("xdotool") == "":
    sys.stderr.write("xdotool is not installed\n")
    sys.exit(1)
if check_exist("wmctrl") == "":
    sys.stderr.write("wmctrl is not installed\n")
    sys.exit(1)

try:
    prog = subprocess.Popen(sys.argv, preexec_fn=os.setsid)
except OSError, e:
    sys.exit(1)

time.sleep(WAIT_TIME)
idlist = subprocess.Popen("pgrep -g " + str(prog.pid),
                          shell=True,
                          stdout=subprocess.PIPE
                          ).stdout.read().splitlines()

ps1 = os.fork()
if ps1 > 0:
    ps2 = os.fork()

if ps1 == 0:  # Child 1
    os.setpgid(os.getpid(), os.getpid())
    killpid(idlist)
    sys.exit(0)
elif ps2 == 0:  # Child 2
    killname(os.path.basename(sys.argv[0]))
    sys.exit(0)
elif ps1 > 0 and ps2 > 0:  # Parent
    time.sleep(WAIT_TIME)
    os.killpg(os.getpgid(int(ps1)), signal.SIGTERM)
    os.kill(ps2, signal.SIGTERM)
    os.waitpid(ps1, 0)
    os.waitpid(ps2, 0)
    sys.exit(0)
else:
    exit(1)

Основные отличия:

Программа устанавливает идентификатор группы (GID) для процесса , Таким образом, все дочерние процессы и их окна могут быть легко найдены. Xdotool - опция sync используется вместо цикла while. Script позволяет передавать аргументы в программу

. WAIT_TIME должен быть установлен достаточно большим, чтобы программа зависла его дочерние процессы. На моем компьютере достаточно больших программ, таких как пар. Увеличьте его, если необходимо.

Дополнение

xdotool 's опция windowunmap может работать фанки с некоторыми приложениями и программами лотков (например, лоток для linux mint), так что альтернативная версия скрипта для этих исключений.

#!/usr/bin/python

import os
import subprocess
import sys
import time
import signal

WAIT_TIME = 10


def check_exist(name):
    return subprocess.Popen("which "+name,
                            shell=True,
                            stdout=subprocess.PIPE
                            ).stdout.read().rstrip("-n")


def killpid(pidlist):
    for pid in pidlist:
        args = ["xdotool",
                "search",
                "--sync",
                "--pid",
                pid]
        for i in subprocess.Popen(args,
                                  stdout=subprocess.PIPE).\
                stdout.read().splitlines():
            if i != "":
                subprocess.Popen("wmctrl -i -c " +
                                 hex(int(i)), shell=True)


def killname(name):
    args = ["xdotool",
            "search",
            "--sync",
            "--any",
            "--name",
            "--class",
            "--classname",
            name]
    for i in subprocess.Popen(args,
                              preexec_fn=os.setsid,
                              stdout=subprocess.PIPE)\
            .stdout.read().splitlines():
        if i != "":
            subprocess.Popen("wmctrl -i -c " + hex(int(i)),
                             shell=True)


sys.argv.pop(0)

if check_exist(sys.argv[0]) == "":
    sys.exit(1)
if check_exist("xdotool") == "":
    sys.stderr.write("xdotool is not installed\n")
    sys.exit(1)
if check_exist("wmctrl") == "":
    sys.stderr.write("wmctrl is not installed\n")
    sys.exit(1)


try:
    prog = subprocess.Popen(sys.argv, preexec_fn=os.setsid)
except OSError, e:
    sys.exit(1)

time.sleep(WAIT_TIME)
idlist = subprocess.Popen("pgrep -g " + str(prog.pid),
                          shell=True,
                          stdout=subprocess.PIPE
                          ).stdout.read().splitlines()

ps1 = os.fork()
if ps1 > 0:
    ps2 = os.fork()

if ps1 == 0:  # Child 1
    os.setpgid(os.getpid(), os.getpid())
    killpid(idlist)
    sys.exit(0)
elif ps2 == 0:  # Child 2
    killname(os.path.basename(sys.argv[0]))
    sys.exit(0)
elif ps1 > 0 and ps2 > 0:  # Parent
    time.sleep(WAIT_TIME)
    os.killpg(os.getpgid(int(ps1)), signal.SIGTERM)
    os.kill(ps2, signal.SIGTERM)
    os.waitpid(ps1, 0)
    os.waitpid(ps2, 0)
    sys.exit(0)
else:
    exit(1)
0
ответ дан 23 May 2018 в 18:06
  • 1
    Я попробовал свой первый скрипт. Он не работал или не уменьшался достаточно быстро. Я сохранил его как startminimized. Затем я побежал startminimized gnome-calendar. Календарь открыт и продолжает работать? – Khurshid Alam 1 April 2017 в 10:19
  • 2
    Вы можете попытаться увеличить переменную WAIT_TIME. Я использую 40-секундную задержку для слабых компьютеров. Также вы можете попробовать второй скрипт, поскольку он использует другую команду для минимизации приложения. – Sergey 2 April 2017 в 13:08

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

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