Сочетания клавиш Block Unity, когда определенное приложение активно

Большой JetBrains IDE (ИДЕЯ и др.) присваивает в значительной степени каждое мыслимое сочетание клавиш некоторой функции. В то время как мягко подавляющий время от времени, это также делает для эффективного использования.

Моя проблема состоит в том, что Единица присваивает некоторые из этих ярлыков также, и они имеют приоритет. Одним особенно раздражающим примером является CTRL + ALT + L. Проблема была исследована прежде здесь.

Однако ни один из подходов не является удовлетворительным.

  1. Выключение системных ярлыков глобально препятствует моей полной производительности с системой.
  2. Переключение на другую контурную карту в ИДЕЕ перепутает ад из меня, когда я разработаю на различных платформах (и должны выбрать различные отображения).

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

Я был бы готов запустить скрипт каждый раз, когда я запускаю приложение.

5
задан 13 April 2017 в 05:25

2 ответа

Тодорхой програмын цонх идэвхжсэн тохиолдолд (мөн) олон тооны (тодорхой) товчлолыг хэрхэн автоматаар хаах вэ

Доорх скрипт нь дурын програмын цонх идэвхжсэн үед товчлуурын тодорхой товчлолыг хаах болно. .

Та хэдийгээр "" "Програмыг ажиллуулах болгондоо би скрипт ажиллуулахад бэлэн байх болно." , Дараа нь скриптийг устгах шалтгаан байхгүй, жүүс нь маш бага байдаг.

Скрипт

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

app = "gedit"

f = os.path.join(os.environ["HOME"], "keylist")

def run(cmd):
    subprocess.Popen(cmd)

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

def getactive():
    return get(["xdotool", "getactivewindow"])

def setkeys(val):
    # --- add the keys to be disabled below  
    keys = [
         ["org.gnome.settings-daemon.plugins.media-keys", "logout"],
         ["org.gnome.settings-daemon.plugins.media-keys", "screensaver"],
        ]
    # ---
    writelist = []
    if not val:
        try:
            values = open(f).read().splitlines()
        except FileNotFoundError:
            values = []
        for i, key in enumerate(keys):
            try:
                cmd = ["gsettings", "set"]+key+[values[i]]
            except IndexError:
                cmd = ["gsettings", "reset"]+key
            run(cmd)
    else:
        for key in keys:
            cmd = ["gsettings", "set"]+key+["['']"]
            read =  get(["gsettings", "get"]+key)
            writelist.append(read)
            run(cmd)

    if writelist:
        open(f, "wt").write("\n".join(writelist))

front1 = None

while True:
    time.sleep(1)
    pid = get(["pgrep", app])
    if pid:
        try:
            active = get(["xdotool", "getactivewindow"])
            relevant = get(["xdotool", "search", "--all", "--pid", pid]).splitlines()
            front2 = active in relevant
        except AttributeError:
            front2 = front1           
    else:
        front2 = False
    if front2 != front1:
        if front2:
            setkeys(True)
        else:
            setkeys(False)

    front1 = front2

Хэрхэн ашиглах

  1. Скрипт хэрэгтэй xdotool :

     sudo apt-get install xdotool
     
  2. Скриптийг хоосон файлд хуулж, disable_shortcuts.py

  3. гэж хадгалж, скриптийн толгой хэсэгт мөрөнд орлуулна уу:

     app = "gedit"
     

    цонхыг эзэмшдэг процессын нэр гэсэн утгатай таны програмын дагуу "gedit".

  4. Скриптийг дараах тушаалаар туршиж ажиллуулна уу:

     python3 /path/to/disable_shortcuts.py
     
  5. Хэрэв бүгд сайн ажиллаж байвал Startup Applications дээр нэмж оруулна уу: Dash> Startup Applications> Add. Тушаалыг нэмнэ үү:

     / bin / bash -c "sleep 15 && python3 /path/to/disable_shortcuts.py"
     

Илүү олон товчлолыг идэвхгүй болгох

Жишээ болгон би таны дурдсан товчлолыг нэмж оруулав: CTRL + ALT + L . Товчлолуудыг dconf мэдээллийн санд тохируулах бөгөөд gsettings ашиглан тохируулах буюу идэвхгүйжүүлэх боломжтой.

Скриптэд эдгээр gsettings оруулгуудыг функцэд тохируулсан болно. : setkeys ()

def setkeys(val):
    # --- add the keys to be disabled below
    keys = [
        ["org.gnome.settings-daemon.plugins.media-keys", "screensaver"]
        ]
    # ---

Гарах товчлолыг нэмэх (идэвхгүй болгох) жишээ:

  1. Терминал цонхыг нээгээд dconf watch /
  2. Системийн тохиргоог нээх> "Keyboard"> "Товчлол"> "Систем"
  3. Товчлолыг өөртөө дахин тохируулна уу. Терминал дээр та товчлолд хамаарах gsettings товчлуурыг харж болно:

    enter image description here

  4. Одоо бид олсон товчлуурыг нэмэх ёстой (арай өөр дүр төрхөөр):

      ["org.gnome.settings-daemon.plugins.media-keys", "logout"]
     

    ... манай функцийн "товчлуурууд" жагсаалтад:

     def setkeys (val):
      # --- идэвхгүй болгох түлхүүрүүдийг доор нэмнэ үү
      түлхүүрүүд = [
      ["org.gnome.settings-daemon.plugins.media-keys", "screensaver"],
      ["org.gnome.settings-daemon.plugins.media-keys", "logout"],
      ]
     

Одоо хоёулаа CTRL + ALT + L ба CTRL + ALT + Устгах [ Хэрэв таны програм урд талд байвал 11110291] -ийг идэвхгүйжүүлнэ.

Тайлбар

Дээр дурдсанчлан, таны дурдсантай адил товчлолуудыг dconf мэдээллийн санд тохируулсан болно. CTRL + ALT + L жишээнд богино холболтыг тохируулах эсвэл засах түлхүүр нь:

org.gnome.settings-daemon.plugins.media-keys screensaver

-г идэвхгүйжүүлэх , тушаал нь:

gsettings set org.gnome.settings-daemon.plugins.media-keys screensaver ""

Түлхүүрийг анхны утгад нь тохируулахын тулд:

gsettings reset org.gnome.settings-daemon.plugins.media-keys screensaver

Хэрэв скрипт секундэд нэг удаа харагдана, хэрэв:

  • таны програм огт ажиллуулдаггүй бол
  • хэрэв тийм бол түүний цонхнуудын аль нэг нь байвал идэвхтэй
  • дахин (зөвхөн) хэрэв тийм бол

     # --- жагсаалтад орсон товчлолуудыг идэвхгүйжүүлнэ.
    түлхүүрүүд = [
      ["org.gnome.settings-daemon.plugins.media-keys", "screensaver"],
      ["org.gnome.settings-daemon.plugins.media-keys", "logout"],
      ]
     

    ... төлөвийн дараагийн өөрчлөлтийг хүлээж байна.

Хэрэв идэвхтэй цонх таны програмын нэг биш бол жагсаалтад дурдсан товчлууруудыг анхдагчаар буцаана.

Тэмдэглэл

Өмнө дурьдсанчлан, скриптийн процессорт ирэх нэмэлт ачаалал нь nihil. Та "Хэрхэн ашиглах" хэсэгт тайлбарласны дагуу үүнийг эхлүүлэхдээ маш сайн ажиллуулж болно.


Олон програмд ​​нөлөөлөх

Тайлбар дээр дурдсанчлан, ОП-ийн тодорхой тохиолдолд, идэвхгүйжүүлэх товчлолыг бүлэгт ашиглах нь ашигтай байдаг. програмууд бүгд нэг директор дотор байрладаг.

Үүнийг

pgrep -f 

гаралт нь тодорхой лавлах бичгийг багтаасан бүх програмуудад ашиглах хувилбарын доор байрлуулна. Миний жишээнд би / opt директорыг тохируулсан тул хэрэв идэвхтэй цонх нь / opt дээрх програмын аль нэг нь байвал тохируулсан товчлолууд идэвхгүй болно.


аль нэг програмын цонхыг урд талд нь авчрах нь гаралтын товчлолыг идэвхгүй болгоно

enter image description here

, хэрэв өөр цонх фокуствал товчлолыг идэвхжүүлнэ

enter image description here


Скрипт

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

appdir = "/opt"

f = os.path.join(os.environ["HOME"], "keylist")

def run(cmd):
    subprocess.call(cmd)

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

def getactive():
    return get(["xdotool", "getactivewindow"])

def setkeys(val):
    # --- add the keys to be disabled below  
    keys = [
         ["org.gnome.settings-daemon.plugins.media-keys", "logout"],
         ["org.gnome.settings-daemon.plugins.media-keys", "screensaver"],
         ["org.gnome.desktop.wm.keybindings", "begin-move"],
        ]
    # ---
    writelist = []
    if not val:
        try:
            values = open(f).read().splitlines()
        except FileNotFoundError:
            values = []
        # for key in keys:
        for i, key in enumerate(keys):
            try:
                cmd = ["gsettings", "set"]+key+[values[i]]
            except IndexError:
                cmd = ["gsettings", "reset"]+key
            run(cmd)
    else:
        for key in keys:
            cmd = ["gsettings", "set"]+key+["['']"]
            read =  get(["gsettings", "get"]+key)
            writelist.append(read)
            run(cmd)
    if writelist:
        open(f, "wt").write("\n".join(writelist))

front1 = None

while True:
    time.sleep(1)
    # check if any of the apps runs at all
    checkpids = get(["pgrep", "-f", appdir])
    # if so:
    if checkpids:
        checkpids = checkpids.splitlines()
        active = getactive()
        # get pid frontmost (doesn't work on pid 0)
        match = [l for l in get(["xprop", "-id", active]).splitlines()\
                 if "_NET_WM_PID(CARDINAL)" in l]
        if match:
            # check if pid is of any of the relevant apps
            pid = match[0].split("=")[1].strip()
            front2 = True if pid in checkpids else False
        else:
            front2 = False
    else:
        front2 = False
    if front2 != front1:
        if front2:
            setkeys(True)
        else:
            setkeys(False)
    front1 = front2

Хэрхэн ашиглах

  1. Like эхний скрипт, xdotool -г суулгах шаардлагатай:

     sudo apt-get install xdotool
     
  2. Скриптийг хоосон файлд хуулж, disable_shortcuts.py

  3. гэж хадгалж, скриптийн толгой хэсэгт мөрөнд орлуулна уу:

     appdir = "/ opt"
     

    "/ opt" -ийг өөрийн програмын жагсаалтад оруулна уу.

  4. Скриптийг дараах тушаалаар туршиж ажиллуулна уу:

     python3 /path/to/disable_shortcuts.py
     
  5. Хэрэв бүгд сайн ажиллаж байвал Startup Applications дээр нэмж оруулна уу: Dash> Startup Applications> Add. Тушаалыг нэмнэ үү:

     / bin / bash -c "sleep 15 && python3 /path/to/disable_shortcuts.py"
     

Жагсаалтад бусад товчлолуудыг нэмж оруулах нь скриптийн 1-р хувилбартай яг ижил төстэй ажиллана.

Энэ нь бүх програм дээр ажилладаг уу?

Таны хариулт дээр:

xprop нь бүх цонхнуудад PID илрүүлдэггүй . Бүтэлгүй жишээ: секундомер.

pid 0 -тай Windows (tkinter цонх, түүний дотор Idle гэх мэт), xprop -id гаралтад цонх id байхгүй байна. Сул зогсолт -д миний мөрдөж байгаа мөргөлдөөний товчлол байхгүй байна. Хэрэв та тусгай товчлолыг идэвхгүй болгохыг шаардсан pid 0 програмтай ямар нэгэн програм ажиллуулах бол дурдах хэрэгтэй.

Ийм тохиолдолд

xdotool getactivewindow

-н гаралтыг hex хэлбэрт хөрвүүлэх wmctrl ] ашигладаг бөгөөд дараа нь харгалзах pid -ийг

wmctrl -lp

-н гарцаас хайж олох хэрэгтэй байсан боловч эхлүүлэх нь хамгийн тодорхой зүйл байсан ч би скриптийг дараах байдлаар хадгалахын тулд скриптэд үүнийг ашиглаагүй. аль болох хөнгөн жинтэй.

10
ответ дан 23 November 2019 в 08:41

дээр үндэслэсэн (хуучин хувилбар) Жейкоб Влиймын хариулт Эдгээр нэмэлт асуудлуудыг шийдвэрлэхийн тулд би энэ хувилбарыг бичсэн:

  1. Скрипт ажиллаж байх үед хэрэглэгчийн хийсэн хүндэтгэлийг өөрчилдөг.
  2. Хэрэглэгчийн анхдагчаар тохируулсан утгыг дахин тохируулдаггүй.
  3. Тохиргооны нөөцийг хадгалах тохиолдолд хадгалдаг. товчлолыг идэвхгүй болгох үед скриптийг зогсооно.
  4. Бариул gsettings ба dconf товчлолууд. (Энэ нь асуудалгүй байж болзошгүй.)

Нээлттэй асуудлууд:

  • Alt + ` ба Alt + F1 гэх мэт зарим товчлолыг хаана тохируулсныг би олж чадахгүй байна. Эдгээр нь Эв нэгдлийн респ. Compiz; Супер -г барьж байх үед бид хэрхэн харуулах товчлолыг програмчлалтайгаар өөрчлөх вэ?
  • xprop бүх цонхны PID-ийг илрүүлэхгүй. Бүтэлгүй жишээ: секундомер . ( Жако Влиймд зарим санаа байна .)

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

# Path pattern to block
apppattern = "myprocess"

# Write a backup that can restore the settings at the
# start of the script.
# Leave empty to not write a backup.
backupfile = "~/.keymap_backup"

# Add the keys to be disabled below.
shortcuts = {
    "org.gnome.settings-daemon.plugins.media-keys/key" : "gsettings",
    "/org/gnome/desktop/wm/keybindings/key" : "dconf",
}

#
# Helper functions
#

# Run a command on the shell
def run(cmd):
    subprocess.Popen(cmd)

# Run a command on the shell and return the
# stripped result
def get(cmd):
    try:
        return subprocess.check_output(cmd).decode("utf-8").strip()
    except:
        pass

# Get the PID of the currently active window
def getactive():
    xdoid = get(["xdotool", "getactivewindow"])
    pidline = [l for l in get(["xprop", "-id", xdoid]).splitlines()\
                 if "_NET_WM_PID(CARDINAL)" in l]
    if pidline:
        pid = pidline[0].split("=")[1].strip()
    else:
        # Something went wrong
        print("Warning: Could not obtain PID of current window")
        pid = ""

    return pid

def readkey(key):
    if shortcuts[key] == "gsettings":
        return get(["gsettings", "get"] + key.split("/"))
    elif shortcuts[key] == "dconf":
        return get(["dconf", "read", key])

def writekey(key, val):
    if val == "": 
        val = "['']"
    if shortcuts[key] == "gsettings":        
        run(["gsettings", "set"] + key.split("/") + [val])
    elif shortcuts[key] == "dconf":
        run(["dconf", "write", key, val])

def resetkey(key):
    if shortcuts[key] == "gsettings":
        run(["gsettings", "reset"] + key.split("/"))
    elif shortcuts[key] == "dconf":
        run(["dconf", "reset", key])

# If val == True, disables all shortcuts.
# If val == False, resets all shortcuts.
def setkeys(flag):
    for key, val in shortcutmap.items():
        if flag == True:
            # Read current value again; user may change
            # settings, after all!
            shortcutmap[key] = readkey(key)
            writekey(key, "")            
        elif flag == False:
            if val:
                writekey(key, val)
            else:
                resetkey(key)

#
# Main script
#

# Store current shortcuts in case they are non-default
# Note: if the default is set, dconf returns an empty string!
# Optionally, create a backup script to restore the value in case
# this script crashes at an inopportune time.
shortcutmap = {}
if backupfile:
    f = open(os.path.expanduser(backupfile),'w+') 
    f.write('#!/bin/sh\n')

for key, val in shortcuts.items():
    if shortcuts[key] == "gsettings":
        shortcutmap[key] = get(["gsettings", "get"] + key.split("/"))

        if backupfile:
            if shortcutmap[key]:
                f.write("gsettings set " + " ".join(key.split("/")) + " " + 
                shortcutmap[key] + "\n")
            else:
                f.write("gsettings reset " + " ".join(key.split("/")) + "\n")
    elif shortcuts[key] == "dconf":
        shortcutmap[key] = get(["dconf", "read", key])

        if backupfile:
            if shortcutmap[key]:
                f.write("dconf write " + key + " " + shortcutmap[key] + "\n")
            else:
                f.write("dconf reset " + key + "\n")

if backupfile: f.close()

# Check every half second if the window changed form or to a 
# matching application.
front1 = None
while True:
    time.sleep(0.5)
    checkpids = get(["pgrep", "-f", apppattern])

    if checkpids:
        checkpids = checkpids.splitlines()
        activepid = getactive()
        #print(activepid)

        if activepid:
            front2 = True if activepid in checkpids else False
        else:
            front2 = False
    else:
        front2 = False

    if front2 != front1:
        #print("Matches: " + str(flag))
        if front2:
            setkeys(True)
        else:
            setkeys(False)
    front1 = front2

Тэмдэглэл:

  • gsettings resp. dconf .
  • gsettings түлхүүрүүд do dconf дээр гарч ирсэн боловч хийсэн өөрчлөлтүүд нь ямар ч нөлөө үзүүлэхгүй. Ерөнхий дүрмийн дагуу Жейкобын аргыг ашиглан олсон түлхүүрүүдийг gsettings болон dconf хэсэгт гараар мөрдөх шаардлагатай байсан түлхүүрүүдийг нэмнэ үү.
  • Нөөцлөлтийг ажиллуулна уу. товчлолууд замбараагүй болох тохиолдолд файлыг скрипт болгон оруулах, жишээлбэл
7
ответ дан 23 November 2019 в 08:41

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

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