diff --git a/tuxedo-touchpad-switch.cpp b/tuxedo-touchpad-switch.cpp index c6291bd..30c581a 100644 --- a/tuxedo-touchpad-switch.cpp +++ b/tuxedo-touchpad-switch.cpp @@ -34,7 +34,8 @@ using std::cout; using std::cerr; using std::endl; -int lockfile; +int lockfile = -1; +gboolean isMousePluggedInPrev = TRUE; static int get_touchpad_hidraw_devices(std::vector *devnodes) { int result = -EXIT_FAILURE; @@ -193,6 +194,48 @@ void display_config_properties_changed_handler(__attribute__((unused)) GDBusPro } } +void kded5_modules_touchpad_handler(GDBusProxy *proxy, __attribute__((unused)) char *sender_name, char *signal_name, GVariant *parameters, __attribute__((unused)) gpointer user_data) { + if (!strcmp("enabledChanged", signal_name) && g_variant_is_of_type(parameters, (const GVariantType *)"(b)") && g_variant_n_children(parameters)) { + GVariant *enabledChanged = g_variant_get_child_value(parameters, 0); + if (g_variant_get_boolean(enabledChanged)) { + if (set_touchpad_state(1)) { + cerr << "kded5_modules_touchpad_handler(...): set_touchpad_state(...) failed." << endl; + } + } + else { + if (set_touchpad_state(0)) { + cerr << "kded5_modules_touchpad_handler(...): set_touchpad_state(...) failed." << endl; + } + } + g_variant_unref(enabledChanged); + } + else if (!strcmp("mousePluggedInChanged", signal_name) && g_variant_is_of_type(parameters, (const GVariantType *)"(b)") && g_variant_n_children(parameters)) { + GVariant *isMousePluggedInParam = g_dbus_proxy_call_sync(proxy, "isMousePluggedIn", NULL, G_DBUS_CALL_FLAGS_NONE, G_MAXINT, NULL, NULL); + if (isMousePluggedInParam != NULL && g_variant_is_of_type(isMousePluggedInParam, (const GVariantType *)"(b)") && g_variant_n_children(isMousePluggedInParam)) { + GVariant *isMousePluggedIn = g_variant_get_child_value(isMousePluggedInParam, 0); + if (!g_variant_get_boolean(isMousePluggedIn)) { + if (set_touchpad_state(1)) { + cerr << "kded5_modules_touchpad_handler(...): set_touchpad_state(...) failed." << endl; + } + if (flock(lockfile, LOCK_UN)) { + cerr << "kded5_modules_touchpad_handler(...): flock(...) failed." << endl; + } + } + else if (!isMousePluggedInPrev) { + if (flock(lockfile, LOCK_EX)) { + cerr << "kded5_modules_touchpad_handler(...): flock(...) failed." << endl; + } + } + isMousePluggedInPrev = g_variant_get_boolean(isMousePluggedIn); + g_variant_unref(isMousePluggedIn); + g_variant_unref(isMousePluggedInParam); + } + else { + cerr << "kded5_modules_touchpad_handler(...): g_dbus_proxy_call_sync(...) failed." << endl; + } + } +} + int main() { // Currently this programm works on desktop environments using Gnome settings only (Gnome/Budgie/Cinnamon/etc.). // A KDE configuration version will be developt once this works flawless. @@ -202,6 +245,7 @@ int main() { gracefull_exit(0); } + //FIXME singal(...) deprecated -> man signal signal(SIGINT, gracefull_exit); signal(SIGTERM, gracefull_exit); @@ -244,11 +288,11 @@ int main() { // sync on wakeup GDBusProxy *display_config_properties = g_dbus_proxy_new_for_bus_sync(G_BUS_TYPE_SESSION, - G_DBUS_PROXY_FLAGS_NONE, NULL, - "org.gnome.Mutter.DisplayConfig", - "/org/gnome/Mutter/DisplayConfig", - "org.gnome.Mutter.DisplayConfig", - NULL, NULL); + G_DBUS_PROXY_FLAGS_NONE, NULL, + "org.gnome.Mutter.DisplayConfig", + "/org/gnome/Mutter/DisplayConfig", + "org.gnome.Mutter.DisplayConfig", + NULL, NULL); if (display_config_properties == NULL) { cerr << "main(...): g_dbus_proxy_new_for_bus_sync(...) failed." << endl; gracefull_exit(0); @@ -257,6 +301,23 @@ int main() { cerr << "main(...): g_signal_connect(...) failed." << endl; gracefull_exit(0); } + + + // sync on config or xsession change kde + GDBusProxy *kded5_modules_touchpad = g_dbus_proxy_new_for_bus_sync(G_BUS_TYPE_SESSION, + G_DBUS_PROXY_FLAGS_NONE, NULL, + "org.kde.kded5", + "/modules/touchpad", + "org.kde.touchpad", + NULL, NULL); + if (kded5_modules_touchpad == NULL) { + cerr << "main(...): g_dbus_proxy_new_for_bus_sync(...) failed." << endl; + gracefull_exit(0); + } + if (g_signal_connect(kded5_modules_touchpad, "g-signal", G_CALLBACK(kded5_modules_touchpad_handler), NULL) < 1) { + cerr << "main(...): g_signal_connect(...) failed." << endl; + gracefull_exit(0); + } // sync on start