diff --git a/res/doc b/res/doc index c644623..9943fda 100644 --- a/res/doc +++ b/res/doc @@ -37,6 +37,7 @@ # kfmon - TODO # nickel_setting - one of: # invert - toggles FeatureSettings.InvertScreen (all versions) +# lockscreen - toggles PowerSettings.UnlockEnabled (4.12.12111+) # screenshots - toggles FeatureSettings.Screenshots (all versions) # nickel_extras - the mimetype of the plugin, or one of: # web_browser diff --git a/src/action_cc.cc b/src/action_cc.cc index 060ae8c..55e37f8 100644 --- a/src/action_cc.cc +++ b/src/action_cc.cc @@ -102,6 +102,29 @@ NM_ACTION_(nickel_setting) { } else if (!strcmp(arg, "screenshots")) { NM_RETURN_ERR("not implemented yet"); } + } else if (!strcmp(arg, "lockscreen")) { + void *PowerSettings_vtable = dlsym(RTLD_DEFAULT, "_ZTV13PowerSettings"); + NM_ASSERT(PowerSettings_vtable, "could not dlsym the vtable for PowerSettings"); + vtable_ptr(settings) = vtable_target(PowerSettings_vtable); + + if (!strcmp(arg, "lockscreen")) { + bool (*PowerSettings__getUnlockEnabled)(Settings*); + reinterpret_cast(PowerSettings__getUnlockEnabled) = dlsym(RTLD_DEFAULT, "_ZN13PowerSettings16getUnlockEnabledEv"); + NM_ASSERT(PowerSettings__getUnlockEnabled, "could not dlsym PowerSettings::getUnlockEnabled"); + + bool (*PowerSettings__setUnlockEnabled)(Settings*, bool); + reinterpret_cast(PowerSettings__setUnlockEnabled) = dlsym(RTLD_DEFAULT, "_ZN13PowerSettings16setUnlockEnabledEb"); + NM_ASSERT(PowerSettings__setUnlockEnabled, "could not dlsym PowerSettings::setUnlockEnabled"); + + v = PowerSettings__getUnlockEnabled(settings); + vtable_ptr(settings) = vtable_target(PowerSettings_vtable); + + PowerSettings__setUnlockEnabled(settings, !v); + vtable_ptr(settings) = vtable_target(PowerSettings_vtable); + + NM_ASSERT(PowerSettings__getUnlockEnabled(settings) == !v, "failed to set setting"); + vtable_ptr(settings) = vtable_target(PowerSettings_vtable); + } } else { // TODO: more settings Settings_SettingsD(settings);