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

13

Мне очень нравятся Hot Corners. :-)

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

введите описание изображения здесь

orschiro
источник
Я не думаю, что это возможно с помощью горячих клавиш (по крайней мере, не так, как их использует Unity), но можно запускать сценарии, когда мышь находится в определенной области экрана. Например, см. Askubuntu.com/a/758307/295286 , раздел «Наведите курсор на действия». Я более подробно расскажу о горячих углах, но если они не сработают, можно ли использовать собственный сценарий?
Сергей Колодяжный
Мульти монитор или одиночный?
Джейкоб Влейм
Привет орширо, выложил. Пожалуйста, укажите, все ли ясно (или нет).
Джейкоб Влейм
Эй, я вижу, что здесь больше горячих углов, чем в моем ответе. Сколько бы вы предпочли?
Джейкоб Влейм
2
@JacobVlijm, Сергей, смотрите мой ответ.
wjandrea

Ответы:

10

CCSM

  1. Установите CompizConfig Settings Manager (CCSM). Запустите в терминале:

    sudo apt-get install compizconfig-settings-manager
  2. Откройте CCSM.

  3. Перейти в «Команды»
  4. Введите желаемую команду в одном из слотов. Например:

    Снимок CCSM - команда

  5. Перейдите на вкладку «Привязки краев»

  6. Нажмите «Нет» и установите желаемый горячий угол (или край), который соответствует команде, которую вы только что установили

    Скриншот CCSM - горячие углы

  7. Переместите мышь в угол

  8. Теперь ваша команда запущена!

    Снимок экрана CCSM - команда запущена

Подтвердили работу на 14.04.

wjandrea
источник
Самый простой из всех предложенных решений. Если команда желательна, лучше реализуется через скрипт, чем просто указывать команду compiz на этот скрипт или просто имя скрипта, если скрипт находится в папке bin в $ PATH. Единственный возможный недостаток - известно, что Unity / Compiz случайно «теряют» пользовательские команды, то есть те, которые не интегрированы. Как интегрировать пользовательскую команду выходит за рамки этого вопроса.
Дуг
@wjandrea Так что это все-таки реализовано. Compiz не пытается меня удивить. Хороший ответ, наиболее подходящий для того, что ищет ОП. + 1 '
Сергей Колодяжный
К сожалению, вы правы, хаха. Да, именно то, что ОП попросил.
Джейкоб Влейм
Вы помогали мне довольно много раз с вашими правками и ответами. Имейте «cookie», как говорил Оле Серг… действительно, есть полдюжины :)
WinEunuuchs2Unix
6

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

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

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

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

  • Слева вверху Нет действий
  • Верхний правый бег Гедит
  • Снизу слева Нет действий
  • Bottom RightRun Gnome-терминал

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

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

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

Настроить

  1. Скрипт нуждается xdotool

    sudo apt install xdotool
  2. Скопируйте скрипт в пустой файл, сохраните его как hotcorners2.py
  3. В заголовке сценария задайте свои команды (обратите внимание на кавычки)

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

    (впоследствии вверху слева / справа, внизу слева / справа)

  4. Тест - запустите скрипт:

    python3 /path/to/hotcorners2.py
  5. Если все работает нормально, добавьте в Startup Applications: Dash> Startup Applications> Add. Добавьте команду:

    /bin/bash -c "sleep 5 && python3 /path/to/hotcorners2.py"

Примечания

  • Скрипт в данный момент запускается на (первом) экране. Это может быть легко отредактировано, чтобы позаботиться о нескольких экранах, даже делать разные вещи на разных экранах, пожалуйста, укажите
  • Если это понравится нескольким людям, мы можем добавить графический интерфейс и ppa для удобного использования и простой установки.

РЕДАКТИРОВАТЬ

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

введите описание изображения здесь

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

Сценарий

#!/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

НОТА:

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

Вступление

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

введите описание изображения здесь

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

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

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

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

введите описание изображения здесь

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

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

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

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

sudo add-apt-repository ppa:1047481448-2/sergkolo
sudo apt-get update
sudo apt-get install indicator-edger
Сергей Колодяжный
источник