diff options
| author | Marco Trevisan (TreviƱo) <mail@3v1n0.net> | 2016-07-05 10:22:08 +0000 |
|---|---|---|
| committer | Bileto Bot <ci-train-bot@canonical.com> | 2016-07-05 10:22:08 +0000 |
| commit | 95ba1e6c7ed7b663cb3a67026cea68aa9bfc3685 (patch) | |
| tree | 58d7aa734a983b1d572873fb7896b9024bbb79e2 | |
| parent | 2f9eccd50187f0a5257b76b01efbe93b7386b6f0 (diff) | |
| parent | 17ddd81a9b9f47540a6ea72b00c68fe70749a508 (diff) | |
LockScreenAcceleratorController: check if a setting key is available instead of crashing
(bzr r4140)
| -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 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); |
