diff --git a/community/plasma-bigscreen/0001-cec-daemon.patch b/community/plasma-bigscreen/0001-cec-daemon.patch new file mode 100644 index 0000000000000000000000000000000000000000..faacc25217fca4aff3509f05d7a1fb34cfca4b92 --- /dev/null +++ b/community/plasma-bigscreen/0001-cec-daemon.patch @@ -0,0 +1,149 @@ +diff --git a/CMakeLists.txt b/CMakeLists.txt +index ecdf04e..8ad1961 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -64,6 +64,8 @@ plasma_install_package(lookandfeel org.kde.plasma.mycroft.bigscreen look-and-fee + + + install(FILES bin/mycroft-skill-launcher.py DESTINATION ${BIN_INSTALL_DIR}) ++install(FILES bin/cec-daemon.py DESTINATION ${BIN_INSTALL_DIR}) ++install(FILES bin/40-uinput.rules DESTINATION ${LIB_INSTALL_DIR}/udev/rules.d) + + if(ECM_VERSION VERSION_GREATER_EQUAL 5.79) + include(KDEClangFormat) +diff --git a/bin/40-uinput.rules b/bin/40-uinput.rules +new file mode 100644 +index 0000000..918e0a7 +--- /dev/null ++++ b/bin/40-uinput.rules +@@ -0,0 +1 @@ ++SUBSYSTEM=="misc", KERNEL=="uinput", MODE="0660", GROUP="video" +diff --git a/bin/CMakeLists.txt b/bin/CMakeLists.txt +index 2f1bb3b..85eee3b 100644 +--- a/bin/CMakeLists.txt ++++ b/bin/CMakeLists.txt +@@ -1,6 +1,12 @@ + configure_file(plasma-bigscreen-wayland.in ${CMAKE_CURRENT_BINARY_DIR}/plasma-bigscreen-wayland) + install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/plasma-bigscreen-wayland DESTINATION ${BIN_INSTALL_DIR}) + ++configure_file(cec-daemon.desktop.cmake ${CMAKE_CURRENT_BINARY_DIR}/cec-daemon.desktop) ++install(FILES ++ ${CMAKE_CURRENT_BINARY_DIR}/cec-daemon.desktop ++ DESTINATION ${KDE_INSTALL_SYSCONFDIR}/xdg/autostart ++) ++ + configure_file(plasma-bigscreen-wayland.desktop.cmake ${CMAKE_CURRENT_BINARY_DIR}/plasma-bigscreen-wayland.desktop) + install(FILES + ${CMAKE_CURRENT_BINARY_DIR}/plasma-bigscreen-wayland.desktop +diff --git a/bin/cec-daemon.desktop.cmake b/bin/cec-daemon.desktop.cmake +new file mode 100644 +index 0000000..2435539 +--- /dev/null ++++ b/bin/cec-daemon.desktop.cmake +@@ -0,0 +1,5 @@ ++[Desktop Entry] ++Exec=${CMAKE_INSTALL_FULL_BINDIR}/cec-daemon.py ++Name=CEC Daemon ++Description=Allows input using TV remote controls through the CEC protocol ++X-KDE-PluginInfo-Version=${PROJECT_VERSION} +diff --git a/bin/cec-daemon.py b/bin/cec-daemon.py +new file mode 100755 +index 0000000..b731970 +--- /dev/null ++++ b/bin/cec-daemon.py +@@ -0,0 +1,95 @@ ++#!/usr/bin/python3 ++ ++import cec ++import uinput ++import time ++import psutil ++ ++u = uinput ++ ++KEYMAP = { ++ 0: u.KEY_ENTER, ++ 1: u.KEY_UP, ++ 2: u.KEY_DOWN, ++ 3: u.KEY_LEFT, ++ 4: u.KEY_RIGHT, ++ 9: u.KEY_HOMEPAGE, ++ 10: u.KEY_MENU, ++ 13: u.KEY_BACK, ++ 44: u.KEY_HOMEPAGE, ++ 68: u.KEY_PLAY, ++ 69: u.KEY_STOP, ++ 70: u.KEY_PAUSE, ++ 75: u.KEY_FASTFORWARD, ++ 76: u.KEY_REWIND, ++ 103: u.KEY_HOMEPAGE, ++ 113: u.KEY_BLUE, ++ 114: u.KEY_RED, ++ 115: u.KEY_YELLOW, ++ 116: u.KEY_GREEN ++} ++ ++device = uinput.Device(KEYMAP.values()) ++ ++keystate = None ++override = False ++ ++ ++def check_override(): ++ global override ++ if "kodi-x11" in (p.name() for p in psutil.process_iter()): ++ override = True ++ else: ++ override = False ++ ++ ++def init_cec(): ++ cecconfig = cec.libcec_configuration() ++ cecconfig.strDeviceName = "libcec" ++ cecconfig.bActivateSource = 0 ++ cecconfig.deviceTypes.Add(cec.CEC_DEVICE_TYPE_RECORDING_DEVICE) ++ cecconfig.clientVersion = cec.LIBCEC_VERSION_CURRENT ++ ++ cecconfig.SetKeyPressCallback(keypress_callback) ++ ++ lib = cec.ICECAdapter.Create(cecconfig) ++ adapters = lib.DetectAdapters() ++ returned_adapter = None ++ ++ # Wait till we get a CEC device ++ while returned_adapter is None: ++ for adapter in adapters: ++ print("Found a CEC adapter:") ++ print("Port: " + adapter.strComName) ++ print("Vendor: " + hex(adapter.iVendorId)) ++ print("Product: " + hex(adapter.iProductId)) ++ returned_adapter = adapter.strComName ++ ++ if lib.Open(returned_adapter): ++ print("Connection opened") ++ ++ main_loop() ++ ++ ++def main_loop(): ++ while True: ++ # Just make sure we live forever ++ time.sleep(9e9) ++ ++ ++def keypress_callback(key, duration): ++ global keystate ++ ++ if override: ++ return ++ ++ if keystate is None: ++ device.emit(KEYMAP[key], 1) ++ keystate = "down" ++ else: ++ device.emit(KEYMAP[key], 0) ++ keystate = None ++ ++ ++if __name__ == '__main__': ++ init_cec() diff --git a/community/plasma-bigscreen/APKBUILD b/community/plasma-bigscreen/APKBUILD index aec7f07fb40c69a807fbe46b50936f1da7f03f0c..2a74c0370b90508b842a021b0cc5f88184ebe2cf 100644 --- a/community/plasma-bigscreen/APKBUILD +++ b/community/plasma-bigscreen/APKBUILD @@ -2,7 +2,7 @@ # Maintainer: Bart Ribbers <bribbers@disroot.org> pkgname=plasma-bigscreen pkgver=0_git20211219 -pkgrel=0 +pkgrel=1 _commit="1f44b4a1c5b0c16e47a40a8ad0c03305ea275806" pkgdesc="A 10-feet interface made for TVs" url="https://invent.kde.org/plasma/plasma-bigscreen/" @@ -18,6 +18,8 @@ depends=" plasma-pa plasma-settings plasma-workspace + py3-libcec + py3-uinput " makedepends=" extra-cmake-modules @@ -37,7 +39,10 @@ makedepends=" qt5-qtdeclarative-dev qt5-qtmultimedia-dev " -source="https://invent.kde.org/plasma/plasma-bigscreen/-/archive/$_commit/plasma-bigscreen-$_commit.tar.gz" +source="https://invent.kde.org/plasma/plasma-bigscreen/-/archive/$_commit/plasma-bigscreen-$_commit.tar.gz + 0001-cec-daemon.patch + uinput.conf + " builddir="$srcdir/plasma-bigscreen-$_commit" build() { @@ -55,8 +60,13 @@ check() { package() { DESTDIR="$pkgdir" cmake --install build + + install -Dm644 -t "$pkgdir"/etc/modules-load.d \ + "$srcdir"/uinput.conf } sha512sums=" 3e3841658ff84650c2a491f22a28d0afec557d4ed781ef1adf4d37db85da57e23037ae5a99dc2014a2f23d792477644fb119119929d5e825e32d62954d126af4 plasma-bigscreen-1f44b4a1c5b0c16e47a40a8ad0c03305ea275806.tar.gz +8c96e9bac10ddddfe07300b3a08a67d06fbffc1e775047ffc855537765e4843d1dbc56c26040ee2a15ff97099866ca2ae497f1c7dcd01b6568ccb5d485671b09 0001-cec-daemon.patch +a9b069ed121ffeee887e0583d8cb46035ecf1fa90a26a4ecb3aa11ff03178b2b08621f6676db6b2350f290694c04aabcf36f2ce3e0813a76dde9a33555edb112 uinput.conf " diff --git a/community/plasma-bigscreen/uinput.conf b/community/plasma-bigscreen/uinput.conf new file mode 100644 index 0000000000000000000000000000000000000000..42bc0053c7855f611d5c25ff68123cdb12be3f5d --- /dev/null +++ b/community/plasma-bigscreen/uinput.conf @@ -0,0 +1 @@ +uinput diff --git a/community/py3-uinput/0001-fix-32bit-build.patch b/community/py3-uinput/0001-fix-32bit-build.patch new file mode 100644 index 0000000000000000000000000000000000000000..9b91d42ffe0fce68af86a920cd8150f81dd45b97 --- /dev/null +++ b/community/py3-uinput/0001-fix-32bit-build.patch @@ -0,0 +1,33 @@ +diff --git a/libsuinput/src/suinput.c b/libsuinput/src/suinput.c +index 8d5fb71..8c368e6 100644 +--- a/libsuinput/src/suinput.c ++++ b/libsuinput/src/suinput.c +@@ -28,6 +28,14 @@ + + #include "suinput.h" + ++#ifndef input_event_sec ++#define input_event_sec time.tv_sec ++#endif ++ ++#ifndef input_event_usec ++#define input_event_usec time.tv_usec ++#endif ++ + int suinput_write_event(int uinput_fd, const struct input_event *event_p) + { + ssize_t bytes; +@@ -43,9 +51,12 @@ int suinput_emit(int uinput_fd, uint16_t ev_type, uint16_t ev_code, + int32_t ev_value) + { + struct input_event event; ++ struct timeval tv; + + memset(&event, 0, sizeof(event)); +- gettimeofday(&event.time, 0); ++ gettimeofday(&tv, 0); ++ event.input_event_sec = tv.tv_sec; ++ event.input_event_usec = tv.tv_usec; + event.type = ev_type; + event.code = ev_code; + event.value = ev_value; diff --git a/community/py3-uinput/APKBUILD b/community/py3-uinput/APKBUILD index 770436b94609242ec9bfa2fdd3a4c94e3b127e43..19c7d4683042ce88a629cfa8dc5260482e34daa9 100644 --- a/community/py3-uinput/APKBUILD +++ b/community/py3-uinput/APKBUILD @@ -13,7 +13,9 @@ makedepends=" linux-headers py3-setuptools " -source="https://pypi.python.org/packages/source/p/python-uinput/python-uinput-$pkgver.tar.gz" +source="https://pypi.python.org/packages/source/p/python-uinput/python-uinput-$pkgver.tar.gz + 0001-fix-32bit-build.patch + " builddir="$srcdir/python-uinput-$pkgver" build() { @@ -26,4 +28,5 @@ package() { sha512sums=" 47cf878c57da8117010caa3ccbdfe8ee96106b2c7164639c779ea16be05eed2ffea0341c14738c7491ff98827f756772944783d560a747b4b011c76e77693fda python-uinput-0.11.2.tar.gz +3c5d3b39fa5cd6f44700fb767dd351d90cfb0efe50d5e1eb10f3e214ddd998acb71117e86acae66288ca3bae4b704368d9406ac603e612ae23c475ed7e6e5532 0001-fix-32bit-build.patch "