Based on a patch by: Denis Washington <denisw@svn.gnome.org>

2008-07-26  Jens Granseuer  <jensgr@gmx.net>

	Based on a patch by: Denis Washington <denisw@svn.gnome.org>

	* gnome-keybinding-properties.c: (binding_name), (show_error),
	(accel_edited_callback): when trying to assign a shortcut that is
	already in use, ask the user whether to reassign it instead of
	refusing to do anything (bug #133318)

svn path=/trunk/; revision=8796
This commit is contained in:
Jens Granseuer 2008-07-26 09:13:40 +00:00 committed by Jens Granseuer
parent bb97264fdd
commit 4a8637592a
2 changed files with 102 additions and 25 deletions

View file

@ -1,3 +1,12 @@
2008-07-26 Jens Granseuer <jensgr@gmx.net>
Based on a patch by: Denis Washington <denisw@svn.gnome.org>
* gnome-keybinding-properties.c: (binding_name), (show_error),
(accel_edited_callback): when trying to assign a shortcut that is
already in use, ask the user whether to reassign it instead of
refusing to do anything (bug #133318)
2008-06-21 Jens Granseuer <jensgr@gmx.net>
Patch by: Matthias Clasen <mclasen@redhat.com>

View file

@ -87,7 +87,7 @@ binding_name (guint keyval,
egg_virtual_accelerator_label (keyval, keycode, mask) :
egg_virtual_accelerator_name (keyval, keycode, mask);
else
return translate ? g_strdup (_("Disabled")) : g_strdup ("disabled");
return g_strdup (translate ? _("Disabled") : "");
}
static gboolean
@ -925,6 +925,23 @@ keyval_is_forbidden (guint keyval)
return FALSE;
}
static void
show_error (GtkWindow *parent,
GError *err)
{
GtkWidget *dialog;
dialog = gtk_message_dialog_new (parent,
GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_MODAL,
GTK_MESSAGE_WARNING,
GTK_BUTTONS_OK,
_("Error saving the new shortcut: %s"),
err->message);
gtk_dialog_run (GTK_DIALOG (dialog));
gtk_widget_destroy (dialog);
}
static void
accel_edited_callback (GtkCellRendererText *cell,
const char *path_string,
@ -1017,25 +1034,86 @@ accel_edited_callback (GtkCellRendererText *cell,
{
GtkWidget *dialog;
char *name;
int response;
name = binding_name (keyval, keycode, mask, TRUE);
dialog =
gtk_message_dialog_new (GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (view))),
GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_MODAL,
GTK_MESSAGE_WARNING,
GTK_BUTTONS_CANCEL,
_("The shortcut \"%s\" is already used for:\n \"%s\""),
name,
tmp_key.description ?
tmp_key.description : tmp_key.gconf_key);
gtk_message_dialog_new (GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (view))),
GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_MODAL,
GTK_MESSAGE_WARNING,
GTK_BUTTONS_CANCEL,
_("The shortcut \"%s\" is already used for\n\"%s\""),
name, tmp_key.description ?
tmp_key.description : tmp_key.gconf_key);
g_free (name);
gtk_dialog_run (GTK_DIALOG (dialog));
gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog),
_("If you reassign the shortcut to \"%s\", the \"%s\" shortcut "
"will be disabled."),
key_entry->description ?
key_entry->description : key_entry->gconf_key,
tmp_key.description ?
tmp_key.description : tmp_key.gconf_key);
gtk_dialog_add_button (GTK_DIALOG (dialog),
_("_Reassign"),
GTK_RESPONSE_ACCEPT);
gtk_dialog_set_default_response (GTK_DIALOG (dialog),
GTK_RESPONSE_ACCEPT);
response = gtk_dialog_run (GTK_DIALOG (dialog));
gtk_widget_destroy (dialog);
/* set it back to its previous value. */
egg_cell_renderer_keys_set_accelerator (EGG_CELL_RENDERER_KEYS (cell),
key_entry->keyval, key_entry->keycode, key_entry->mask);
if (response == GTK_RESPONSE_ACCEPT)
{
GConfClient *client;
client = gconf_client_get_default ();
gconf_client_set_string (client,
tmp_key.gconf_key,
"", &err);
if (err != NULL)
{
show_error (GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (view))),
err);
g_error_free (err);
g_object_unref (client);
return;
}
str = binding_name (keyval, keycode, mask, FALSE);
gconf_client_set_string (client,
key_entry->gconf_key,
str, &err);
if (err != NULL)
{
show_error (GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (view))),
err);
g_error_free (err);
/* reset the previous shortcut */
gconf_client_set_string (client,
tmp_key.gconf_key,
str, NULL);
}
g_free (str);
g_object_unref (client);
}
else
{
/* set it back to its previous value. */
egg_cell_renderer_keys_set_accelerator (EGG_CELL_RENDERER_KEYS (cell),
key_entry->keyval,
key_entry->keycode,
key_entry->mask);
}
return;
}
@ -1051,17 +1129,7 @@ accel_edited_callback (GtkCellRendererText *cell,
if (err != NULL)
{
GtkWidget *dialog;
dialog = gtk_message_dialog_new (GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (view))),
GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_MODAL,
GTK_MESSAGE_WARNING,
GTK_BUTTONS_OK,
_("Error setting new accelerator in configuration database: %s"),
err->message);
gtk_dialog_run (GTK_DIALOG (dialog));
gtk_widget_destroy (dialog);
show_error (GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (view))), err);
g_error_free (err);
key_entry->editable = FALSE;
}
@ -1097,7 +1165,7 @@ accel_cleared_callback (GtkCellRendererText *cell,
client = gconf_client_get_default();
gconf_client_set_string (client,
key_entry->gconf_key,
"disabled",
"",
&err);
g_object_unref (client);