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> 2008-06-21 Jens Granseuer <jensgr@gmx.net>
Patch by: Matthias Clasen <mclasen@redhat.com> 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_label (keyval, keycode, mask) :
egg_virtual_accelerator_name (keyval, keycode, mask); egg_virtual_accelerator_name (keyval, keycode, mask);
else else
return translate ? g_strdup (_("Disabled")) : g_strdup ("disabled"); return g_strdup (translate ? _("Disabled") : "");
} }
static gboolean static gboolean
@ -925,6 +925,23 @@ keyval_is_forbidden (guint keyval)
return FALSE; 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 static void
accel_edited_callback (GtkCellRendererText *cell, accel_edited_callback (GtkCellRendererText *cell,
const char *path_string, const char *path_string,
@ -1017,6 +1034,7 @@ accel_edited_callback (GtkCellRendererText *cell,
{ {
GtkWidget *dialog; GtkWidget *dialog;
char *name; char *name;
int response;
name = binding_name (keyval, keycode, mask, TRUE); name = binding_name (keyval, keycode, mask, TRUE);
@ -1025,17 +1043,77 @@ accel_edited_callback (GtkCellRendererText *cell,
GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_MODAL, GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_MODAL,
GTK_MESSAGE_WARNING, GTK_MESSAGE_WARNING,
GTK_BUTTONS_CANCEL, GTK_BUTTONS_CANCEL,
_("The shortcut \"%s\" is already used for:\n \"%s\""), _("The shortcut \"%s\" is already used for\n\"%s\""),
name, name, tmp_key.description ?
tmp_key.description ?
tmp_key.description : tmp_key.gconf_key); tmp_key.description : tmp_key.gconf_key);
g_free (name); 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); gtk_widget_destroy (dialog);
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. */ /* set it back to its previous value. */
egg_cell_renderer_keys_set_accelerator (EGG_CELL_RENDERER_KEYS (cell), egg_cell_renderer_keys_set_accelerator (EGG_CELL_RENDERER_KEYS (cell),
key_entry->keyval, key_entry->keycode, key_entry->mask); key_entry->keyval,
key_entry->keycode,
key_entry->mask);
}
return; return;
} }
@ -1051,17 +1129,7 @@ accel_edited_callback (GtkCellRendererText *cell,
if (err != NULL) if (err != NULL)
{ {
GtkWidget *dialog; show_error (GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (view))), err);
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);
g_error_free (err); g_error_free (err);
key_entry->editable = FALSE; key_entry->editable = FALSE;
} }
@ -1097,7 +1165,7 @@ accel_cleared_callback (GtkCellRendererText *cell,
client = gconf_client_get_default(); client = gconf_client_get_default();
gconf_client_set_string (client, gconf_client_set_string (client,
key_entry->gconf_key, key_entry->gconf_key,
"disabled", "",
&err); &err);
g_object_unref (client); g_object_unref (client);