Чи можу я встановити Hot Corners на запуск спеціальних команд в Unity?


13

Мені дуже подобаються гарячі куточки. :-)

Чи можна якось запустити спеціальну команду в гарячому куті, як показано нижче?

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


Я не думаю, що це можливо для гарячих корнерів (принаймні, не тим, як Unity використовує їх), але можна запускати сценарії, коли миша розміщується в певній області екрана. Наприклад, див. Розділ askubuntu.com/a/758307/295286 , Наведіть курсор миші на дію. Я детальніше розбираюсь у гарячих куточках, але якщо вони не вийдуть, чи добре налаштований сценарій?
Сергій Колодяжний

Багатомоніторний або одиночний?
Яків Влійм

Привіт орхіро, розміщено. Будь ласка, зазначте, чи все зрозуміло (чи ні).
Яків Влійм

Гей, я бачу, що тут більше гарячих шнурів, ніж у моїй відповіді. Скільки б ви віддали перевагу?
Яків Влійм

2
@JacobVlijm, Serg, Дивіться мою відповідь.
wjandrea

Відповіді:


10

CCSM

  1. Встановіть менеджер налаштувань CompizConfig (CCSM). Запуск у терміналі:

    sudo apt-get install compizconfig-settings-manager
  2. Відкрите СКСМ.

  3. Перейдіть до "Команди"
  4. Введіть бажану команду в один із слотів. Наприклад:

    Скріншот CCSM - команда

  5. Перейдіть на вкладку "Прив’язка до країв"

  6. Клацніть "None" і встановіть потрібний гарячий кут (або край), який відповідає команді, яку ви тільки що встановили

    Скріншот CCSM - гарячі куточки

  7. Пересуньте мишу в кут

  8. Тепер ваша команда виконується!

    Скріншот CCSM - команда працює

Підтверджено роботу 14.04.


Найпростіше з усіх запропонованих рішень. Якщо потрібна команда в кращому розумінні через скрипт, ніж просто вкажіть команду compiz на цей скрипт або просто ім'я сценарію, якщо сценарій знаходиться у папці bin у $ PATH. Єдиний можливий мінус - це відомо, що єдність / compiz випадковим чином «втрачають» команди набору користувачів, тобто ті, які не інтегровані. Як інтегрувати команду користувача, виходить за рамки цього питання.
дог

@wjandrea Тож він реалізований зрештою. Compiz не захоплює мене дивувати. Хороша відповідь, найбільше відповідає тому, чого прагне ОП. + 1'ed
Сергій Колодяжний

На жаль, ти маєш рацію, ха-ха. Так, саме те, про що вимагала ОП.
Яків Влійм

Ви досить багато разів допомагали мені своїми правками та відповідями. Майте "cookie", як говорили ole'Serg ... дійсно є півдюжини :)
WinEunuuchs2Unix

6

Спеціальні команди

Якщо ви використовуєте Unity і у вас встановлено ccsm, відповідь wjandrea - це, звичайно, ваша відповідь. Якщо ні , або для використання в інших дистрибутивах, може бути корисною легкою альтернативою.

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

Як приклад, я зробив наступне налаштування:

  • Зліва вгору Без дій
  • Правий верхній бік Gedit
  • Знизу вліво Без дій
  • Нижній 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. Скопіюйте скрипт у порожній файл, збережіть i як hotcorners2.py
  3. У голові сценарію встановіть свої команди (пам’ятайте про цитати)

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

    (згодом лівий / правий, нижній лівий / правий)

  4. Тестовий запуск сценарію:

    python3 /path/to/hotcorners2.py
  5. Якщо все працює добре, додайте до програми запуску програми: тире> програми запуску> Додати. Додайте команду:

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

Примітки

  • Зараз сценарій працює на (першому) екрані. Це можна легко редагувати, щоб доглядати за кількома екранами, навіть робити різні речі на різних екранах, будь ласка, згадайте.
  • Якщо комусь подобається, ми можемо додати gui та ppa для зручного використання та простого встановлення.

EDIT

Якщо ми використовуємо трохи більш досконалі обчислення, ми можемо використовувати радіус замість квадратної площі для запуску команд (завдяки старому доброму @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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.