Bisakah saya mengatur Hot Corner untuk menjalankan perintah khusus di Unity?


13

Saya sangat suka Hot Corner. :-)

Apakah mungkin menjalankan perintah khusus di sudut panas seperti yang ditunjukkan di bawah ini?

masukkan deskripsi gambar di sini


Saya tidak berpikir itu mungkin dengan hotcorner secara khusus (setidaknya tidak dengan cara Unity menggunakannya), tetapi dimungkinkan untuk memicu skrip ketika mouse ditempatkan di area layar tertentu. Misalnya, lihat askubuntu.com/a/758307/295286 , bagian Mouse over action. Saya akan melihat lebih dalam tentang hotcorners, tetapi jika itu tidak berhasil, apakah skrip kustom tidak masalah?
Sergiy Kolodyazhnyy

Multi-monitor atau tunggal?
Jacob Vlijm

Hai orschiro, diposkan. Harap sebutkan apakah semuanya jelas (atau tidak).
Jacob Vlijm

Hei, saya melihat ada lebih banyak hotcorner di sini daripada jawaban saya. Berapa banyak yang Anda inginkan?
Jacob Vlijm

2
@ JacobVlijm, Serg, Lihat jawaban saya.
wjandrea

Jawaban:


10

CCSM

  1. Instal CompizConfig Settings Manager (CCSM). Jalankan di terminal:

    sudo apt-get install compizconfig-settings-manager
  2. Buka CCSM.

  3. Pergi ke "Perintah"
  4. Masukkan perintah yang Anda inginkan di salah satu slot. Misalnya:

    Tangkapan layar CCSM - command

  5. Buka tab "Edge Bindings"

  6. Klik "Tidak Ada" dan atur sudut panas yang Anda inginkan (atau tepi), yang sesuai dengan perintah yang baru saja Anda atur

    Tangkapan layar CCSM - sudut panas

  7. Gerakkan mouse Anda ke sudut

  8. Sekarang perintahmu dijalankan!

    Tangkapan layar CCSM - perintah berjalan

Dikonfirmasi bekerja pada 14.04.


Solusi termudah dari semua yang diusulkan. Jika perintah yang diinginkan lebih baik direalisasikan melalui sebuah skrip daripada hanya membuat komando komando menunjuk ke skrip itu atau hanya nama skrip jika skrip ada dalam folder bin di $ PATH. Satunya downside yang mungkin adalah kesatuan / compiz telah dikenal secara acak 'kehilangan' perintah set pengguna, yaitu, mereka yang tidak terintegrasi. Bagaimana mengintegrasikan perintah pengguna berada di luar cakupan pertanyaan ini.
doug

@wjandrea Jadi ini sudah diterapkan. Compiz tidak ingin membuatku kagum. Jawaban bagus, paling pas untuk apa yang dicari OP. Memberi +1
Sergiy Kolodyazhnyy

Sayangnya, kamu benar, haha. Ya persis apa yang diminta OP.
Jacob Vlijm

Anda telah membantu saya beberapa kali dengan suntingan dan jawaban Anda. Miliki "kue" seperti kata ole'Serg dulu ... memang punya setengah lusin :)
WinEunuuchs2Unix

6

Perintah khusus

Jika Anda menggunakan Unity dan sudah menginstal ccsm, tentu saja jawaban wjandrea adalah jawaban Anda. Jika tidak , atau untuk digunakan pada distro lain, alternatif yang ringan mungkin berguna.

Dengan skrip di bawah ini, Anda dapat mengatur perintah apa pun , khusus untuk masing-masing hotcorner Anda.

Sebagai contoh, saya membuat pengaturan berikut:

  • Kiri Atas Tidak ada tindakan
  • Jalankan kanan Atas Gedit
  • Kiri Bawah Tidak ada tindakan
  • Bawah Kanan Jalankan terminal Gnome

Tentu saja Anda juga dapat membuat perintah menjalankan skrip eksternal.

Selanjutnya, Anda dapat mengatur ukuran sudut panas di baris:

cornersize = 10

Cukup ubah nilainya (piksel). Script menetapkan area (kotak) untuk memicu perintah Anda:

masukkan deskripsi gambar di sini

Naskah

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

Mempersiapkan

  1. Kebutuhan skrip xdotool

    sudo apt install xdotool
  2. Salin skrip ke file kosong, simpan saya sebagai hotcorners2.py
  3. Di bagian atas skrip, tetapkan perintah Anda (ingat tanda kutip)

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

    (selanjutnya kiri atas / kanan, kiri bawah / kanan)

  4. Tes-jalankan skrip:

    python3 /path/to/hotcorners2.py
  5. Jika semua berfungsi dengan baik, tambahkan ke Aplikasi Startup: Dash> Startup Applications> Add. Tambahkan perintah:

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

Catatan

  • Script saat ini berjalan pada layar (pertama). Dapat dengan mudah diedit untuk menangani beberapa layar, bahkan melakukan hal yang berbeda di layar yang berbeda, harap disebutkan.
  • Jika beberapa orang menyukainya, kita dapat menambahkan gui dan ppa untuk penggunaan yang mudah dan pemasangan yang mudah.

EDIT

Jika kita menggunakan komputasi yang sedikit lebih maju, kita bisa menggunakan radius alih-alih area kuadrat untuk memicu perintah (terima kasih kepada @pythagoras yang baik):

masukkan deskripsi gambar di sini

Perbedaan kecil, tetapi hanya untuk bersenang-senang:

Naskah

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

Pemakaian

Hampir sama. Atur perintah Anda, dan radius untuk memicu, di bagian kepala skrip.


5

CATATAN:

Jawaban wjandrea adalah jawaban yang paling cocok untuk seseorang yang menggunakan Ubuntu default atau Ubuntu Kylin (atau memiliki compiz sebagai manajer tampilan mereka), sehingga mendapat upvote dan rasa hormat saya. Jawaban yang diberikan di bawah ini, dapat digunakan pada Unity juga, tetapi mungkin akan sedikit berlebihan. Namun, pada lingkungan desktop yang tidak memiliki compiz, seseorang dapat menggunakan indikator yang disajikan di bawah ini. Saya sudah mengujinya secara singkat di Lubuntu 16.04 VM, jadi saya tahu ini berfungsi di sana, dan membuatnya kompatibel dengan Kylin 14.04 juga. Untuk desktop GNOME dan MATE, Anda harus memiliki dukungan untuk AppIndikator diaktifkan terlebih dahulu untuk menggunakan indikator apa pun.

pengantar

Saya telah menerapkan indicator-edgeryang memungkinkan memicu perintah yang ditentukan pengguna berdasarkan posisi mouse di mana saja di sepanjang 4 tepi layar. Versi asli dilakukan dalam satu hari, dalam waktu sekitar 7 jam, sehingga cukup minimalis tetapi melakukan pekerjaan.

masukkan deskripsi gambar di sini

Indikator dikontrol melalui ~/.edger-commands.jsonfile, jelas dalam jsonformat. Itu dapat ditulis secara manual oleh pengguna, atau diatur melalui DEFINE COMMANDSopsi indikator . Opsi aktifkan / nonaktifkan dipicu diingat dan ditulis secara otomatis ke file untuk kenyamanan pengguna. Contoh file konfigurasi akan seperti ini:

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

Perhatikan "left"entri dalam file. Tepi itu tidak disetel, tetapi karena jsonsintaksis memerlukan string kosong di sana, yaitu kutipan "".

Setelah indikator mendeteksi bahwa pengguna telah menempatkan mouse di sepanjang salah satu sisi (dengan ~ 3 piksel margin), indikator akan mengirim pemberitahuan gelembung dan menjalankan perintah yang sesuai (jika ditentukan). Aktivasi pemicu tidak akan terulang kecuali jika pengguna menggerakkan mouse menjauh dari tepi.

masukkan deskripsi gambar di sini

Seperti yang dapat Anda lihat dari tangkapan layar di atas, indikator juga memiliki keluaran debug pada baris perintah. Jika Anda menemukan bug, silakan jalankan dari terminal, cari tahu kesalahan apa yang terjadi, dan kirimkan laporan bug yang sesuai pada halaman masalah GitHub proyek .

Saat ini tidak ada dukungan untuk sudut (hanya tepi) dan itu dibangun untuk pengaturan satu monitor (jelas, seseorang tidak dapat mencakup semua pangkalan dalam waktu 7 jam penciptaan), tetapi fitur-fitur itu mungkin akan tersedia pada akhirnya di masa depan.

Instalasi dan kode sumber

Kode sumber tersedia di halaman proyek GitHub atau melalui Launchpad . Instalasi dilakukan melalui perintah-perintah berikut di terminal:

sudo add-apt-repository ppa:1047481448-2/sergkolo
sudo apt-get update
sudo apt-get install indicator-edger
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.