summaryrefslogtreecommitdiff
diff options
authorMarco Trevisan (TreviƱo) <mail@3v1n0.net>2016-07-05 10:22:08 +0000
committerBileto Bot <ci-train-bot@canonical.com>2016-07-05 10:22:08 +0000
commit95ba1e6c7ed7b663cb3a67026cea68aa9bfc3685 (patch)
tree58d7aa734a983b1d572873fb7896b9024bbb79e2
parent2f9eccd50187f0a5257b76b01efbe93b7386b6f0 (diff)
parent17ddd81a9b9f47540a6ea72b00c68fe70749a508 (diff)
LockScreenAcceleratorController: check if a setting key is available instead of crashing
(bzr r4140)
-rw-r--r--lockscreen/LockScreenAcceleratorController.cpp22
1 files changed, 22 insertions, 0 deletions
diff --git a/lockscreen/LockScreenAcceleratorController.cpp b/lockscreen/LockScreenAcceleratorController.cpp
index a3d3911f0..80436881d 100644
--- a/lockscreen/LockScreenAcceleratorController.cpp
+++ b/lockscreen/LockScreenAcceleratorController.cpp
@@ -72,6 +72,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))
@@ -82,6 +98,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;
@@ -91,6 +110,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);