summaryrefslogtreecommitdiff
diff options
authorMarco Trevisan (Treviño) <mail@3v1n0.net>2016-07-01 14:37:43 +0200
committerMarco Trevisan (Treviño) <mail@3v1n0.net>2016-07-01 14:37:43 +0200
commit17ddd81a9b9f47540a6ea72b00c68fe70749a508 (patch)
treeebf2c9ec90ccd808a73a819b151c77a947bb5feb
parent07bd79a32f8321484fd65e947d7711566bbe7270 (diff)
LockScreenAcceleratorController: check if a setting key is available instead of crashing
(bzr r4132.4.1)
-rw-r--r--lockscreen/LockScreenAcceleratorController.cpp22
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);