fix to fit text into button using js and fix classname setting to not find wrong ids and update README
This commit is contained in:
12
README
12
README
@@ -1,21 +1,25 @@
|
|||||||
Install
|
Install
|
||||||
|
|
||||||
./setup.sh
|
|
||||||
|
|
||||||
Requirements:
|
Requirements:
|
||||||
- For volume buttons: libpulse
|
- (optionally) for volume buttons: libpulse
|
||||||
|
|
||||||
|
local:
|
||||||
|
./setup.sh
|
||||||
|
|
||||||
Uninstall
|
Uninstall
|
||||||
|
|
||||||
pip uninstall controldeck
|
pip uninstall controldeck
|
||||||
|
rm ~/.local/share/application/controldeck.desktop
|
||||||
|
rm ~/.config/systemd/user/controldeck.service
|
||||||
|
|
||||||
Configuration
|
Configuration
|
||||||
|
|
||||||
~/.config/controldeck/controldeck.conf
|
~/.config/controldeck/controldeck.conf
|
||||||
See example in example directory.
|
See example in example directory.
|
||||||
|
|
||||||
|
Start (autostart) with systemd
|
||||||
systemctl --user start controldeck.service
|
systemctl --user start controldeck.service
|
||||||
systemctl --user enable controldeck.service
|
systemctl --user enable controldeck.service
|
||||||
|
|
||||||
journalctl --user-unit=controldeck -e
|
journalctl --user-unit=controldeck -e
|
||||||
|
journalctl --user-unit=controldeck -f
|
||||||
|
|||||||
33
controldeck.py
Normal file → Executable file
33
controldeck.py
Normal file → Executable file
@@ -11,7 +11,7 @@ from os import path, sep, makedirs
|
|||||||
from subprocess import Popen, PIPE, STDOUT
|
from subprocess import Popen, PIPE, STDOUT
|
||||||
from configparser import ConfigParser
|
from configparser import ConfigParser
|
||||||
from re import search, IGNORECASE
|
from re import search, IGNORECASE
|
||||||
from justpy import Div, I, WebPage, SetRoute, parse_html, justpy
|
from justpy import Div, I, WebPage, SetRoute, parse_html, run_task, justpy
|
||||||
from cairosvg import svg2svg
|
from cairosvg import svg2svg
|
||||||
|
|
||||||
APP_NAME = "ControlDeck"
|
APP_NAME = "ControlDeck"
|
||||||
@@ -254,7 +254,7 @@ class Button(Div):
|
|||||||
self.text = ''
|
self.text = ''
|
||||||
|
|
||||||
else:
|
else:
|
||||||
self.classes = "border-2 border-gray-700 bg-gray-800 hover:bg-gray-700 text-gray-500 w-20 h-20 m-2 p-1 rounded-lg font-bold flex items-center text-center justify-center select-none"
|
self.classes = "fitin border-2 border-gray-700 bg-gray-800 hover:bg-gray-700 text-gray-500 w-20 h-20 m-2 p-1 rounded-lg font-bold flex items-center text-center justify-center select-none"
|
||||||
|
|
||||||
self.style = f"background-color:{self.color_bg};" if ishexcolor(self.color_bg) else ''
|
self.style = f"background-color:{self.color_bg};" if ishexcolor(self.color_bg) else ''
|
||||||
self.style += f"color:{self.color_fg};" if ishexcolor(self.color_fg) else ''
|
self.style += f"color:{self.color_fg};" if ishexcolor(self.color_fg) else ''
|
||||||
@@ -292,9 +292,13 @@ class Button(Div):
|
|||||||
self.inner_html = f"<i class='fa-2x {self.icon}'><i>"
|
self.inner_html = f"<i class='fa-2x {self.icon}'><i>"
|
||||||
else:
|
else:
|
||||||
if self.text_alt and not search(self.state_pattern, self.state):
|
if self.text_alt and not search(self.state_pattern, self.state):
|
||||||
self.text = self.text_alt
|
# self.text = self.text_alt
|
||||||
else:
|
# div for fitin logic
|
||||||
self.text = self.text_normal
|
self.inner_html = f"<div>{self.text_alt}</div>"
|
||||||
|
elif self.text_normal: # only if string is not empty (for font icons)
|
||||||
|
# self.text = self.text_normal
|
||||||
|
# div for fitin logic
|
||||||
|
self.inner_html = f"<div>{self.text_normal}</div>"
|
||||||
self.update_state()
|
self.update_state()
|
||||||
|
|
||||||
class ButtonsSound(Div):
|
class ButtonsSound(Div):
|
||||||
@@ -531,6 +535,25 @@ def application(request):
|
|||||||
icon=j['icon'], icon_alt=j['icon-alt'],
|
icon=j['icon'], icon_alt=j['icon-alt'],
|
||||||
image=j['image'], image_alt=j['image-alt'], a=eval(var))
|
image=j['image'], image_alt=j['image-alt'], a=eval(var))
|
||||||
|
|
||||||
|
# fit text of button
|
||||||
|
javascript_string = """
|
||||||
|
function fitin() {
|
||||||
|
var fitindiv = document.querySelectorAll(".fitin");
|
||||||
|
var i;
|
||||||
|
for (i = 0; i < fitindiv.length; i++) {
|
||||||
|
// inner div needed to see if inner div is larger in height to reduce the font-size
|
||||||
|
fitindivdiv = fitindiv[i].firstElementChild;
|
||||||
|
while( fitindivdiv.clientHeight > fitindiv[i].clientHeight ) {
|
||||||
|
fitindivdiv.style.fontSize = (parseInt(window.getComputedStyle(fitindivdiv).fontSize) - 1) + "px";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
fitin();
|
||||||
|
"""
|
||||||
|
async def page_ready(self, msg):
|
||||||
|
run_task(self.run_javascript(javascript_string, request_id='fitin_logic', send=False))
|
||||||
|
wp.on('page_ready', page_ready)
|
||||||
|
|
||||||
if not wp.components:
|
if not wp.components:
|
||||||
# config not found or empty, therefore insert an empty div to not get an error
|
# config not found or empty, therefore insert an empty div to not get an error
|
||||||
Div(text="add elements in controldeck.conf", classes="flex flex-wrap", a=wp)
|
Div(text="add elements in controldeck.conf", classes="flex flex-wrap", a=wp)
|
||||||
|
|||||||
11
controldeck_gui.py
Normal file → Executable file
11
controldeck_gui.py
Normal file → Executable file
@@ -12,14 +12,19 @@ def thread_function(name):
|
|||||||
# print("Thread %s: starting", name)
|
# print("Thread %s: starting", name)
|
||||||
for i in range(10):
|
for i in range(10):
|
||||||
# print("Thread %s: finishing", name)
|
# print("Thread %s: finishing", name)
|
||||||
p = process("xdotool search --name 'ControlDeck'")
|
# p = process("xdotool search --name 'ControlDeck'")
|
||||||
|
# intersection of ControlDeck window name and empty classname
|
||||||
|
p = process("comm -12 <(xdotool search --name 'ControlDeck' | sort) <(xdotool search --classname '^$' | sort)")
|
||||||
if p:
|
if p:
|
||||||
|
# print(p)
|
||||||
# process("xdotool search --name 'ControlDeck' set_window --class 'controldeck'", output=False)
|
# process("xdotool search --name 'ControlDeck' set_window --class 'controldeck'", output=False)
|
||||||
process("xdotool search --name 'ControlDeck' set_window --classname 'controldeck' --class 'ControlDeck' windowunmap windowmap", output=False)
|
# process("xdotool search --name 'ControlDeck' set_window --classname 'controldeck' --class 'ControlDeck' windowunmap windowmap", output=False) # will find to many wrong ids
|
||||||
|
process(f"xdotool set_window --classname 'controldeck' --class 'ControlDeck' {p} windowunmap {p} windowmap {p}", output=False)
|
||||||
time.sleep(0.1)
|
time.sleep(0.1)
|
||||||
|
|
||||||
def main(args, pid=-1):
|
def main(args, pid=-1):
|
||||||
controldeck_process = process("ps --no-headers -C controldeck")
|
#controldeck_process = process("ps --no-headers -C controldeck")
|
||||||
|
controldeck_process = process("ps --no-headers -C controldeck || ps aux | grep -e 'python.*controldeck.py' | grep -v grep")
|
||||||
|
|
||||||
if args.start and controldeck_process == "":
|
if args.start and controldeck_process == "":
|
||||||
process("controldeck &", output=False)
|
process("controldeck &", output=False)
|
||||||
|
|||||||
Reference in New Issue
Block a user