Мне очень нравятся Hot Corners. :-)
Можно ли как-то запустить пользовательскую команду в горячем углу, как показано ниже?
Мне очень нравятся Hot Corners. :-)
Можно ли как-то запустить пользовательскую команду в горячем углу, как показано ниже?
Ответы:
Установите CompizConfig Settings Manager (CCSM). Запустите в терминале:
sudo apt-get install compizconfig-settings-manager
Откройте CCSM.
Введите желаемую команду в одном из слотов. Например:
Перейдите на вкладку «Привязки краев»
Нажмите «Нет» и установите желаемый горячий угол (или край), который соответствует команде, которую вы только что установили
Переместите мышь в угол
Теперь ваша команда запущена!
Подтвердили работу на 14.04.
Если вы используете Unity и у вас установлен ccsm, ответ wjandrea, конечно же, ваш ответ. Если нет или для использования в других дистрибутивах, может быть полезна легкая альтернатива.
С помощью приведенного ниже сценария вы можете установить любую команду, специфичную для каждого из ваших горячих углов.
В качестве примера я сделал следующую настройку:
Конечно, вы также можете заставить команды запускать внешние скрипты.
Кроме того, вы можете установить размер горячего угла в строке:
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
hotcorners2.py
В заголовке сценария задайте свои команды (обратите внимание на кавычки)
commands = [
None,
"gedit",
None,
"gnome-terminal",
]
(впоследствии вверху слева / справа, внизу слева / справа)
Тест - запустите скрипт:
python3 /path/to/hotcorners2.py
Если все работает нормально, добавьте в Startup Applications: Dash> Startup Applications> Add. Добавьте команду:
/bin/bash -c "sleep 5 && python3 /path/to/hotcorners2.py"
Если мы используем немного более сложные вычисления, мы можем использовать радиус вместо квадратной области для запуска команд (благодаря старому доброму @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
Это почти то же самое. Установите ваши команды и радиус срабатывания в разделе заголовка скрипта.
Ответ 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