From cff4d8a2d93be2bff2c3de617008f1c0c28cd59a Mon Sep 17 00:00:00 2001
From: Mavridis Philippe <mavridisf@gmail.com>
Date: Wed, 13 Nov 2024 00:07:36 +0200
Subject: Kxkb: reapply Xkb settings when a keyboard device changes state

Signed-off-by: Mavridis Philippe <mavridisf@gmail.com>
---
 kxkb/kxkb.cpp | 45 +++++++++++++++++++++++++++++++++++++++++----
 1 file changed, 41 insertions(+), 4 deletions(-)

(limited to 'kxkb/kxkb.cpp')

diff --git a/kxkb/kxkb.cpp b/kxkb/kxkb.cpp
index a6435eb58..8d0fbc517 100644
--- a/kxkb/kxkb.cpp
+++ b/kxkb/kxkb.cpp
@@ -34,6 +34,7 @@ DESCRIPTION
 
 #include <tdeaboutdata.h>
 #include <tdecmdlineargs.h>
+#include <tdehardwaredevices.h>
 #include <tdeglobal.h>
 #include <kglobalaccel.h>
 #include <tdelocale.h>
@@ -84,6 +85,11 @@ KXKBApp::KXKBApp(bool allowStyles, bool GUIenabled)
 
     connect( this, TQ_SIGNAL(settingsChanged(int)), TQ_SLOT(slotSettingsChanged(int)) );
     addKipcEventMask( KIPC::SettingsChanged );
+
+    TDEHardwareDevices *hwdevices = TDEGlobal::hardwareDevices();
+    connect(hwdevices, TQ_SIGNAL(hardwareAdded(TDEGenericDevice*)), this, TQ_SLOT(hardwareAdded(TDEGenericDevice*)));
+    connect(hwdevices, TQ_SIGNAL(hardwareRemoved(TDEGenericDevice*)), this, TQ_SLOT(hardwareRemoved(TDEGenericDevice*)));
+    connect(hwdevices, TQ_SIGNAL(hardwareUpdated(TDEGenericDevice*)), this, TQ_SLOT(hardwareUpdated(TDEGenericDevice*)));
 }
 
 KXKBApp::~KXKBApp()
@@ -107,10 +113,7 @@ int KXKBApp::newInstance()
 bool KXKBApp::settingsRead()
 {
     kxkbConfig.load(KxkbConfig::LOAD_ALL);
-    XkbOptions options = kxkbConfig.getKXkbOptions();
-    if (!m_extension->setXkbOptions(options)) {
-        kdWarning() << "Setting XKB options failed!" << endl;
-    }
+    applySettings();
 
     if ( kxkbConfig.m_useKxkb == false ) {
         kapp->quit();
@@ -165,6 +168,14 @@ bool KXKBApp::settingsRead()
 	return true;
 }
 
+void KXKBApp::applySettings()
+{
+    XkbOptions options = kxkbConfig.getKXkbOptions();
+    if (!m_extension->setXkbOptions(options)) {
+        kdWarning() << "Setting XKB options failed!" << endl;
+    }
+}
+
 void KXKBApp::initTray()
 {
     if (!m_tray)
@@ -179,6 +190,32 @@ void KXKBApp::initTray()
     m_tray->show();
 }
 
+void KXKBApp::hardwareAdded(TDEGenericDevice *dev)
+{
+    if (dev->type() == TDEGenericDeviceType::Keyboard)
+    {
+        kdDebug() << "keyboard attached: " << dev->friendlyName() << endl;
+        applySettings();
+    }
+}
+void KXKBApp::hardwareRemoved(TDEGenericDevice *dev)
+{
+    if (dev->type() == TDEGenericDeviceType::Keyboard)
+    {
+        kdDebug() << "keyboard removed: " << dev->friendlyName() << endl;
+        applySettings();
+    }
+}
+
+void KXKBApp::hardwareUpdated(TDEGenericDevice *dev)
+{
+    if (dev->type() == TDEGenericDeviceType::Keyboard)
+    {
+        kdDebug() << "keyboard updated: " << dev->friendlyName() << endl;
+        applySettings();
+    }
+}
+
 // kdcop
 bool KXKBApp::setLayout(const TQString& layoutPair)
 {
-- 
cgit v1.2.1