diff options
| author | Marco Trevisan (Treviño) <mail@3v1n0.net> | 2016-07-01 14:37:43 +0200 |
|---|---|---|
| committer | Marco Trevisan (Treviño) <mail@3v1n0.net> | 2016-07-01 14:37:43 +0200 |
| commit | 17ddd81a9b9f47540a6ea72b00c68fe70749a508 (patch) | |
| tree | ebf2c9ec90ccd808a73a819b151c77a947bb5feb | |
| parent | 07bd79a32f8321484fd65e947d7711566bbe7270 (diff) | |
LockScreenAcceleratorController: check if a setting key is available instead of crashing
(bzr r4132.4.1)
| -rw-r--r-- | lockscreen/LockScreenAcceleratorController.cpp | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/lockscreen/LockScreenAcceleratorController.cpp b/lockscreen/LockScreenAcceleratorController.cpp index adc2de355..fbbedbe38 100644 --- a/lockscreen/LockScreenAcceleratorController.cpp +++ b/lockscreen/LockScreenAcceleratorController.cpp @@ -70,6 +70,22 @@ const std::vector<std::string> ALLOWED_XF86_KEYS = { "XF86Touchpad", }; +bool IsSettingKeyAvailable(glib::Object<GSettings> const& settings, std::string const& key) +{ + bool available = false; + GSettingsSchema* schema; + + g_object_get(glib::object_cast<GObject>(settings), "settings-schema", &schema, nullptr); + + if (schema) + { + available = g_settings_schema_has_key(schema, key.c_str()); + g_settings_schema_unref(schema); + } + + return available; +} + bool IsKeyBindingAllowed(std::string const& key) { if (std::find(begin(ALLOWED_XF86_KEYS), end(ALLOWED_XF86_KEYS), key) != end(ALLOWED_XF86_KEYS)) @@ -80,6 +96,9 @@ bool IsKeyBindingAllowed(std::string const& key) for (auto const& setting : ALLOWED_MEDIA_KEYS) { + if (!IsSettingKeyAvailable(media_settings, setting)) + continue; + Accelerator media_key(glib::String(g_settings_get_string(media_settings, setting.c_str())).Str()); if (media_key == key_accelerator) return true; @@ -89,6 +108,9 @@ bool IsKeyBindingAllowed(std::string const& key) for (auto const& setting : ALLOWED_WM_KEYS) { + if (!IsSettingKeyAvailable(wm_settings, setting)) + continue; + glib::Variant accels(g_settings_get_value(wm_settings, setting.c_str()), glib::StealRef()); auto children = g_variant_n_children(accels); |
