In case of GConf failure, fall back to local keybinding values

Always compile the default keybindings into Metacity, and if we
fail to retrieve the values from GConf, use the compiled-in
value. This makes things more robust especially in an environment
like JHBuild where GConf-schema-installation may not work
correctly.

Also use these values for the no-GConf case, rather than
having a separate arrray and code path.

http://bugzilla.gnome.org/show_bug.cgi?id=576127
This commit is contained in:
Owen W. Taylor 2009-03-20 16:28:13 -04:00 committed by Owen W. Taylor
parent 514d00698d
commit 52638b9d8e
2 changed files with 12 additions and 50 deletions

View File

@ -1871,48 +1871,15 @@ meta_prefs_set_num_workspaces (int n_workspaces)
}
#define keybind(name, handler, param, flags, stroke, description) \
{ #name, NULL, !!(flags & BINDING_REVERSES), !!(flags & BINDING_PER_WINDOW) },
{ #name, stroke, NULL, !!(flags & BINDING_REVERSES), !!(flags & BINDING_PER_WINDOW) },
static MetaKeyPref key_bindings[] = {
#include "all-keybindings.h"
{ NULL, NULL, FALSE }
{ NULL, NULL, NULL, FALSE }
};
#undef keybind
static MetaKeyCombo overlay_key_combo = { 0, 0, 0 };
#ifndef HAVE_GCONF
/**
* A type to map names of keybindings (such as "switch_windows")
* to the binding strings themselves (such as "<Alt>Tab").
* It exists only when GConf is turned off in ./configure and
* functions as a sort of ersatz GConf.
*/
typedef struct
{
const char *name;
const char *keybinding;
} MetaSimpleKeyMapping;
/* FIXME: This would be neater if the array only contained entries whose
* default keystroke was non-null. You COULD do this by defining
* ONLY_BOUND_BY_DEFAULT around various blocks at the cost of making
* the bindings file way more complicated. However, we could stop this being
* data and move it into code. Then the compiler would optimise away
* the problem lines.
*/
#define keybind(name, handler, param, flags, stroke, description) \
{ #name, stroke },
static MetaSimpleKeyMapping key_string_bindings[] = {
#include "all-keybindings.h"
{ NULL, NULL }
};
#undef keybind
#endif /* NOT HAVE_GCONF */
/* These bindings are for modifiers alone, so they need special handling */
static void
init_special_bindings (void)
@ -2000,22 +1967,13 @@ init_bindings (void)
#else /* HAVE_GCONF */
int i = 0;
int which = 0;
while (key_string_bindings[i].name)
while (key_bindings[i].name)
{
if (key_string_bindings[i].keybinding == NULL) {
++i;
continue;
}
while (strcmp(key_bindings[which].name,
key_string_bindings[i].name) != 0)
which++;
/* Set the binding */
update_binding (&key_bindings[which],
key_string_bindings[i].keybinding);
if (key_bindings[i].default_keybinding)
{
/* Set the binding */
update_binding (&key_bindings[i], NULL);
}
++i;
}
@ -2105,6 +2063,9 @@ update_binding (MetaKeyPref *binding,
MetaKeyCombo *combo;
gboolean changed;
if (value == NULL)
value = binding->default_keybinding;
meta_topic (META_DEBUG_KEYBINDINGS,
"Binding \"%s\" has new gconf value \"%s\"\n",
binding->name, value ? value : "none");

View File

@ -222,6 +222,7 @@ typedef struct
typedef struct
{
const char *name;
const char *default_keybinding;
/**
* A list of MetaKeyCombos. Each of them is bound to
* this keypref. If one has keysym==modifiers==0, it is