Могу ли я установить Hot Corners для запуска пользовательских команд в Unity?

Мне очень нравятся горячие уголки. : -)

Как-то можно запустить пользовательскую команду в горячем уголке, как показано ниже?

1
задан 14 February 2018 в 10:33

2 ответа

Пользовательские команды

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

С помощью приведенного ниже сценария вы можете установить команду и , специфичную для каждого из ваших hotcorners.

В качестве примера я сделал следующую настройку:

Вверху слева Нет действия Вверх Вправо Выполнить Gedit Нижнее левое Нет действий Нижнее правое правое Гном-терминал

Конечно вы также можете заставить команды запускать внешние скрипты.

Кроме того, вы можете установить размер горячего угла в строке:

cornersize = 10

Просто измените значение (пиксели). Сценарий устанавливает (квадратные) области для запуска ваших команд:

Сценарий

#!/usr/bin/env python3
import subprocess
import time

cornersize = 20

commands = [
    None,
    "gedit",
    None,
    "gnome-terminal",
    ]

def get(cmd):
    return subprocess.check_output(cmd).decode("utf-8").strip()

def get_pos():
    return [int(s.split(":")[1]) for s in get(["xdotool", "getmouselocation"]).split()[:2]]

scrdata = get("xrandr").split(); resindex = scrdata.index("connected")+2
res = [int(n) for n in scrdata[resindex].split("+")[0].split("x")]

match1 = None

while True:
    time.sleep(1)
    xy = get_pos()
    x = xy[0]; y = xy[1]
    test = [
        [x < cornersize, y < cornersize],
        [x > res[0]-cornersize, y < cornersize],
        [x < cornersize, y > res[1]-cornersize],
        [x > res[0]-cornersize, y > res[1]-cornersize],
        ]
    match2 = [i for i, p in enumerate(test) if all(p)]
    if match2 != match1:
        if match2:
            cmd = commands[match2[0]]
            if cmd:
                subprocess.Popen(["/bin/bash", "-c", cmd])
    match1 = match2

Настроить

Требуется сценарий xdotool
sudo apt install xdotool
Скопируйте сценарий в пустой файл, сохраните i как hotcorners2.py. В начале скрипта задайте свои команды (вспомните кавычки)
commands = [
    None,
    "gedit",
    None,
    "gnome-terminal",
]
(впоследствии верхний левый / средний, нижний левый / правый) Проверить сценарий:
python3 /path/to/hotcorners2.py
Если все работает нормально, добавьте в приложения для запуска: Dash> Startup Applications> Add. Добавьте команду:
/bin/bash -c "sleep 5 && python3 /path/to/hotcorners2.py"

Примечания

Вверху слева Нет действия Если кому-то понравится, мы можем добавить gui и ppa для удобного использования и легкой установки.

EDIT

Если мы используем немного более сложные вычисления, мы можем использовать размер вместо квадратной области для запуска команды (спасибо старым старым @pythagoras):

Небольшая разница, но только для удовольствия:

Сценарий [ ! d52]
#!/usr/bin/env python3
import subprocess
import math
import time

# set distance (hotcorner sensitivity)
radius = 20

# top-left, top-right, bottom-left, bottom-right
commands = [
    None,
    "gedit",
    None,
    "gnome-terminal",
    ]

def get(cmd):
    return subprocess.check_output(cmd).decode("utf-8").strip()

def get_pos():
    return [int(s.split(":")[1]) for s in get(["xdotool", "getmouselocation"]).split()[:2]]

# get the resolution
scrdata = get("xrandr").split(); resindex = scrdata.index("connected")+2
res = [int(n) for n in scrdata[resindex].split("+")[0].split("x")]
# list the corners, could be more elegant no doubt
corners = [[0, 0], [res[0], 0], [0, res[1]], [res[0], res[1]]]

match1 = None

while True:
    time.sleep(1)
    pos = get_pos()
    # get the current difference from the mousepointer to each of the corner (radius)
    diff = [int(math.sqrt(sum([(c[i]-pos[i])**2 for i, n in enumerate(res)])))\
            for c in corners]
    # see if any of the corners is "approached" within the radius
    match2 = [diff.index(n) for n in diff if n < radius]
    # if so, and the corresponding command is not set to None, run it.
    if all([match2 != match1, match2]):
        cmd = commands[match2[0]]
        if cmd:
            subprocess.Popen(["/bin/bash", "-c", cmd])
    match1 = match2

Использование

В значительной степени то же самое. Задайте свои команды и радиус запуска в разделе главы скрипта.

5
ответ дан 23 May 2018 в 01:21

ПРИМЕЧАНИЕ:

ответ wjandrea является наиболее подходящим ответом для тех, кто использует Ubuntu по умолчанию или Ubuntu Kylin (или имеет compiz в качестве своего диспетчера дисплея), таким образом, он получает мое преимущество и уважение. Ответ, приведенный ниже, может быть использован и для Unity, но, вероятно, будет немного лишним. Однако в среде рабочего стола, где нет компилятора, можно использовать индикатор, представленный ниже. Я кратко протестировал его в Lubuntu 16.04 VM, поэтому я знаю, что он работает там и совместил его с Kylin 14.04.

Введение

Я реализовал indicator-edger, что позволяет запускать пользовательские команды на основе положения мыши в любом месте по 4 краям экрана. Первоначальная версия была сделана в течение одного дня, примерно через 7 часов, поэтому она довольно минималистична, но делает работу.

Ответ wjandrea

Индикатор управляется файлом ~/.edger-commands.json, очевидно, в формате json. Он может быть написан вручную пользователем или установлен через опцию DEFINE COMMANDS индикатора. Опция включения / отключения триггера запоминается и записывается автоматически для удобства пользователя. Пример файла конфигурации будет таким:

{
    "right": "gnome-terminal",
    "top": "firefox",
    "left": "",
    "bottom": "gnome-screenshot",
    "enabled": true
}

Обратите внимание на запись "left" в файле. Этот край не установлен, но из-за синтаксиса json он требует наличия пустой строки, т. Е. Кавычки "".

Как только индикатор обнаруживает, что пользователь поместил мышь вдоль любого из краев (с ~ 3 пикселя), индикатор отправит уведомление о пузыре и запустит соответствующую команду (если она определена).

Как вы можете видеть на скриншоте выше, индикатор также имеет отладочный вывод в командная строка. Если вы обнаружите какие-либо ошибки, не стесняйтесь запускать их с терминала, узнайте, что происходит с ошибкой, и отправьте соответствующий отчет об ошибке на .

В настоящее время нет поддержки углов ( только ребра), и он был создан для настройки с одним монитором (очевидно, нельзя покрыть все базы в течение 7 часов после создания), но эти функции могут быть доступны в будущем в будущем.

Установка и исходный код

Исходный код доступен на странице проектов GitHub или через Launchpad. Установка выполняется с помощью следующих команд в терминале:

sudo add-apt-repository ppa:1047481448-2/sergkolo
sudo apt-get update
sudo apt-get install indicator-edger
5
ответ дан 23 May 2018 в 01:21

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

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