Compare commits
2 commits
06b88b88e2
...
0a2757fc34
Author | SHA1 | Date | |
---|---|---|---|
0a2757fc34 | |||
8bacd78b01 |
95
hotkeymute.py
Executable file
95
hotkeymute.py
Executable file
|
@ -0,0 +1,95 @@
|
|||
#!/usr/bin/env python3
|
||||
#
|
||||
# Mutes Jack input when you press super
|
||||
#
|
||||
# Adapted from https://stackoverflow.com/questions/204017 which
|
||||
# was adapted from http://stackoverflow.com/questions/22367358/
|
||||
# Requires python-xlib (pip3 install xlib)
|
||||
#
|
||||
# Probably gonna rework the whole thing since there's a lot of
|
||||
# unnecessary code and then use the pulseaudio module
|
||||
#
|
||||
|
||||
from Xlib.display import Display
|
||||
from Xlib import X, XK
|
||||
from Xlib.ext import record
|
||||
from Xlib.protocol import rq
|
||||
import subprocess
|
||||
from os import system
|
||||
|
||||
class Listener:
|
||||
def __init__(self):
|
||||
self.disp = None
|
||||
self.keys_down = set()
|
||||
|
||||
def keycode_to_key(self, keycode, state):
|
||||
i = 0
|
||||
if state & X.ShiftMask:
|
||||
i += 1
|
||||
if state & X.Mod1Mask:
|
||||
i += 2
|
||||
return self.disp.keycode_to_keysym(keycode, i)
|
||||
|
||||
def key_to_string(self, key):
|
||||
keys = []
|
||||
for name in dir(XK):
|
||||
if name.startswith("XK_") and getattr(XK, name) == key:
|
||||
keys.append(name.lstrip("XK_").replace("_L", "").replace("_R", ""))
|
||||
if keys:
|
||||
return " or ".join(keys)
|
||||
return "[%d]" % key
|
||||
|
||||
def keycode_to_string(self, keycode, state):
|
||||
return self.key_to_string(self.keycode_to_key(keycode, state))
|
||||
|
||||
def down(self, key):
|
||||
self.keys_down.add(key)
|
||||
self.print_keys()
|
||||
|
||||
def up(self, key):
|
||||
if key in self.keys_down:
|
||||
self.keys_down.remove(key)
|
||||
self.print_keys()
|
||||
|
||||
def print_keys(self):
|
||||
keys = list(self.keys_down)
|
||||
#print("Currently pressed:", ", ".join(keys))
|
||||
|
||||
if ", ".join(keys) == 'Super':
|
||||
system('pactl set-source-mute jack_in toggle')
|
||||
print('toggled mute')
|
||||
|
||||
def event_handler(self, reply):
|
||||
data = reply.data
|
||||
while data:
|
||||
event, data = rq.EventField(None).parse_binary_value(data, self.disp.display, None, None)
|
||||
if event.type == X.KeyPress:
|
||||
self.down(self.keycode_to_string(event.detail, event.state))
|
||||
elif event.type == X.KeyRelease:
|
||||
self.up(self.keycode_to_string(event.detail, event.state))
|
||||
|
||||
def run(self):
|
||||
self.disp = Display()
|
||||
XK.load_keysym_group('xf86')
|
||||
root = self.disp.screen().root
|
||||
ctx = self.disp.record_create_context(0,
|
||||
[record.AllClients],
|
||||
[{
|
||||
'core_requests': (0, 0),
|
||||
'core_replies': (0, 0),
|
||||
'ext_requests': (0, 0, 0, 0),
|
||||
'ext_replies': (0, 0, 0, 0),
|
||||
'delivered_events': (0, 0),
|
||||
'device_events': (X.KeyReleaseMask, X.ButtonReleaseMask),
|
||||
'errors': (0, 0),
|
||||
'client_started': False,
|
||||
'client_died': False,
|
||||
}])
|
||||
self.disp.record_enable_context(ctx, lambda reply: self.event_handler(reply))
|
||||
self.disp.record_free_context(ctx)
|
||||
while True:
|
||||
event = root.display.next_event()
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
Listener().run()
|
|
@ -75,10 +75,10 @@ function installMastodon {
|
|||
cd $MASTO_PATH
|
||||
|
||||
# update gem
|
||||
printf 'y\n' | gem update --system --no-document
|
||||
gem update --system --no-document
|
||||
|
||||
# install ruby and nodejs deps
|
||||
gem install bundler
|
||||
#printf 'y\n' | gem install bundler
|
||||
bundle install -j$(getconf _NPROCESSORS_ONLN)
|
||||
yarn install --pure-lockfile
|
||||
gem install foreman
|
||||
|
|
Loading…
Reference in a new issue