1 9711 padraig --- /dev/null Tue Nov 14 14:11:58 2006 2 9711 padraig +++ control-center-2.16.1/capplets/keybindings/custom-binding.h Tue Nov 14 14:02:17 2006 3 9711 padraig @@ -0,0 +1,107 @@ 4 6233 laca +/* Erwann Chenede 2002 */ 5 6233 laca + 6 6233 laca +#include <config.h> 7 6233 laca + 8 6233 laca +#include <string.h> 9 6233 laca +#include <gtk/gtk.h> 10 6233 laca +#include <gconf/gconf-client.h> 11 6233 laca +#include <gdk/gdkx.h> 12 6233 laca +#include <glade/glade.h> 13 6233 laca +#include <X11/Xatom.h> 14 6233 laca + 15 6233 laca +#include "wm-common.h" 16 6233 laca +#include "capplet-util.h" 17 6233 laca +#include "eggcellrendererkeys.h" 18 6233 laca +#include "activate-settings-daemon.h" 19 6233 laca + 20 6233 laca +#ifndef __CUSTOM_BINDING__H__ 21 6233 laca +#define __CUSTOM_BINDING__H__ 22 6233 laca + 23 6233 laca +#define GCONF_CUSTOM_BINDING_DIR "/desktop/gnome/keybindings" 24 6233 laca + 25 6233 laca +typedef enum { 26 6233 laca + ALWAYS_VISIBLE, 27 6233 laca + N_WORKSPACES_GT 28 6233 laca +} KeyListEntryVisibility; 29 6233 laca + 30 6233 laca +typedef struct 31 6233 laca +{ 32 6233 laca + const char *name; 33 6233 laca + KeyListEntryVisibility visibility; 34 6233 laca + gint data; 35 6233 laca +} KeyListEntry; 36 6233 laca + 37 6233 laca +enum 38 6233 laca +{ 39 6233 laca + DESCRIPTION_COLUMN, 40 6233 laca + KEYENTRY_COLUMN, 41 6233 laca + N_COLUMNS 42 6233 laca +}; 43 6233 laca + 44 6233 laca +typedef struct 45 6233 laca +{ 46 6233 laca + char *gconf_key; 47 6233 laca + guint keyval; 48 6233 laca + guint keycode; 49 6233 laca + EggVirtualModifierType mask; 50 6233 laca + gboolean editable; 51 6233 laca + GtkTreeModel *model; 52 6233 laca + guint gconf_cnxn; 53 6233 laca + gboolean custom_key; 54 6233 laca + guint cmd_line_cnxn; 55 6233 laca + char *action; 56 6233 laca + char *binding; 57 6233 laca + char *description; 58 6233 laca +} KeyEntry; 59 6233 laca + 60 6233 laca +void 61 6233 laca +my_verbose (const char *format, ...); 62 6233 laca + 63 6233 laca +void 64 6233 laca +cmd_line_changed (GConfClient *client, 65 6233 laca + guint cnxn_id, 66 6233 laca + GConfEntry *entry, 67 6233 laca + gpointer user_data); 68 6233 laca + 69 6233 laca +void 70 6233 laca +disable_custom (GtkWidget *widget, GtkTreeView *tree_view); 71 6233 laca + 72 6233 laca +gboolean 73 6233 laca +grab_key_callback (GtkWidget *widget, 74 6233 laca + GdkEventKey *event, 75 6233 laca + void *data); 76 6233 laca +void grab_key (GtkWidget *widget, GladeXML *dialog); 77 6233 laca + 78 6233 laca +void custom_cancel (GtkWidget *widget, GladeXML *dialog); 79 6233 laca + 80 6233 laca +void delete_event_cb (GtkWidget *widget, GdkEventAny *event, gpointer *user_data); 81 9711 padraig +void cursor_changed_cb (GtkTreeView *treeview, GladeXML *dialog); 82 6233 laca + 83 6233 laca +GladeXML * 84 6233 laca +setup_custom_binding_dialog (); 85 6233 laca + 86 6233 laca +void 87 6233 laca +add_custom (GtkWidget *widget); 88 6233 laca + 89 6233 laca +void 90 6233 laca +edit_custom (GtkWidget *widget); 91 6233 laca + 92 6233 laca +void 93 6233 laca +create_custom_bindings_list (); 94 6233 laca + 95 6233 laca +KeyEntry * 96 6233 laca +custom_key_new (char *dir); 97 6233 laca + 98 6233 laca +gboolean 99 6233 laca +is_gconf_key_custom_binding (char *key); 100 6233 laca + 101 6233 laca +gboolean 102 6233 laca +keybinding_key_changed_foreach (GtkTreeModel *model, 103 6233 laca + GtkTreePath *path, 104 6233 laca + GtkTreeIter *iter, 105 6233 laca + gpointer user_data); 106 6233 laca + 107 6233 laca +void 108 6233 laca +reload_key_entries (gpointer wm_name, GladeXML *dialog); 109 6233 laca +#endif /*__CUSTOM_BINDING__H__*/ 110 6233 laca + 111 9711 padraig --- /dev/null Tue Nov 14 14:12:48 2006 112 9711 padraig +++ control-center-2.16.1/capplets/keybindings/custom-binding.c Tue Nov 14 14:02:17 2006 113 9711 padraig @@ -0,0 +1,514 @@ 114 6233 laca +/* Erwann Chenede 2002 */ 115 6233 laca + 116 6233 laca +#include <config.h> 117 6233 laca + 118 6233 laca +#include <string.h> 119 6233 laca +#include <gtk/gtk.h> 120 6233 laca +#include <gconf/gconf-client.h> 121 6233 laca +#include <gdk/gdkx.h> 122 6233 laca +#include <glade/glade.h> 123 6233 laca +#include <X11/Xatom.h> 124 6233 laca + 125 6233 laca +#include "wm-common.h" 126 6233 laca +#include "capplet-util.h" 127 6233 laca +#include "eggcellrendererkeys.h" 128 6233 laca +#include "activate-settings-daemon.h" 129 6233 laca +#include "custom-binding.h" 130 6233 laca + 131 6233 laca +extern KeyListEntry *custom_binding_list; 132 6233 laca +extern GladeXML *main_dialog; 133 6233 laca + 134 6233 laca +void 135 6233 laca +my_verbose (const char *format, ...) 136 6233 laca +{ 137 6233 laca + va_list args; 138 6233 laca + gchar *str; 139 6233 laca + 140 6233 laca + if (format == NULL) 141 6233 laca + return; 142 6233 laca + 143 6233 laca + if (1) /*DEBUG*/ 144 6233 laca + return; 145 6233 laca + 146 6233 laca + va_start (args, format); 147 6233 laca + str = g_strdup_vprintf (format, args); 148 6233 laca + va_end (args); 149 6233 laca + 150 6233 laca + fputs (str, stderr); 151 6233 laca + 152 6233 laca + fflush (stderr); 153 6233 laca + 154 6233 laca + g_free (str); 155 6233 laca +} 156 6233 laca + 157 6233 laca +void 158 6233 laca +cmd_line_changed (GConfClient *client, 159 6233 laca + guint cnxn_id, 160 6233 laca + GConfEntry *entry, 161 6233 laca + gpointer user_data) 162 6233 laca +{ 163 6233 laca + KeyEntry *key_entry; 164 6233 laca + 165 6233 laca + my_verbose ("In cmd_line_changed\n"); 166 6233 laca + 167 6233 laca + key_entry = (KeyEntry *)user_data; 168 6233 laca + g_free (key_entry->action); 169 6233 laca + key_entry->action = g_strdup (gconf_value_get_string (entry->value)); 170 6233 laca + key_entry->editable = gconf_entry_get_is_writable (entry); 171 6233 laca + 172 6233 laca + /* update the model */ 173 6233 laca + gtk_tree_model_foreach (key_entry->model, keybinding_key_changed_foreach, key_entry); 174 6233 laca +} 175 6233 laca + 176 6233 laca +KeyEntry * 177 6233 laca +find_keyentry_selected (GtkTreeView *tree_view) 178 6233 laca +{ 179 6233 laca + GtkTreeSelection* sel = NULL; 180 6233 laca + sel = gtk_tree_view_get_selection (tree_view); 181 6233 laca + 182 6233 laca + if (sel) 183 6233 laca + { 184 6233 laca + GtkTreeIter iter; 185 6233 laca + GtkTreeModel *model; 186 6233 laca + if (gtk_tree_selection_get_selected (sel, &model, &iter)) 187 6233 laca + { 188 6233 laca + KeyEntry *key_entry; 189 6233 laca + 190 6233 laca + gtk_tree_model_get (model, &iter, KEYENTRY_COLUMN, &key_entry, -1); 191 6233 laca + return key_entry; 192 6233 laca + } 193 6233 laca + } 194 6233 laca + return NULL; 195 6233 laca +} 196 6233 laca + 197 6233 laca +static gboolean key_delete_cleanup (KeyEntry *key_entry) 198 6233 laca +{ 199 6233 laca + GConfClient *client = gconf_client_get_default(); 200 6233 laca + 201 6233 laca + gconf_client_recursive_unset (client, key_entry->gconf_key, 0, NULL); 202 6233 laca + 203 6233 laca + create_custom_bindings_list (); 204 6233 laca + reload_key_entries (wm_common_get_current_window_manager(), main_dialog); 205 6233 laca + 206 6233 laca + return FALSE; 207 6233 laca +} 208 6233 laca + 209 6233 laca +void 210 6233 laca +disable_custom (GtkWidget *widget, GtkTreeView *tree_view) 211 6233 laca +{ 212 6233 laca + KeyEntry *key_entry = find_keyentry_selected (tree_view); 213 6233 laca + 214 6233 laca + if (key_entry) 215 6233 laca + { 216 6233 laca + if (key_entry->custom_key) 217 6233 laca + { 218 6233 laca + GConfClient *client = gconf_client_get_default(); 219 6233 laca + gchar *binding = g_strdup_printf ("%s/binding", key_entry->gconf_key); 220 6233 laca + gchar *binding_str; 221 6233 laca + 222 6233 laca + gconf_client_notify_remove (client, key_entry->gconf_cnxn); 223 6233 laca + gconf_client_notify_remove (client, key_entry->cmd_line_cnxn); 224 6233 laca + 225 6233 laca + key_entry->gconf_cnxn = 0; 226 6233 laca + key_entry->cmd_line_cnxn = 0; 227 6233 laca + 228 6233 laca + binding_str = gconf_client_get_string (client,binding, NULL); 229 6233 laca + 230 6233 laca + if (binding_str && strcmp (binding_str, "disabled")) { 231 6233 laca + /* This is a neccessery evil. We need to follow a similar 232 6233 laca + pattern of sequence in setting the binding to disabled state 233 6233 laca + before deleting it. The timeout is to ensure that when 234 6233 laca + g-s-d is getting the changes it does not find a key which 235 6233 laca + is non-existent and crash. 236 6233 laca + */ 237 6233 laca + gconf_client_set_string (client, 238 6233 laca + binding, 239 6233 laca + "disabled", 240 6233 laca + NULL); 241 6233 laca + g_timeout_add (1000, (GSourceFunc) key_delete_cleanup, key_entry); 242 6233 laca + 243 6233 laca + g_free (binding_str); 244 6233 laca + } else 245 6233 laca + key_delete_cleanup (key_entry); 246 6233 laca + 247 6233 laca + g_free (binding); 248 6233 laca + } 249 6233 laca + else 250 6233 laca + gconf_client_set_string (gconf_client_get_default(),key_entry->gconf_key, "", NULL); 251 6233 laca + } 252 6233 laca +} 253 6233 laca + 254 6233 laca +static int 255 6233 laca +get_trailing_num (char *str) 256 6233 laca +{ 257 6233 laca + char **result = g_strsplit (str, "_", 2); 258 6233 laca + int i = atoi (result[1]); 259 6233 laca + g_strfreev (result); 260 6233 laca + return i; 261 6233 laca +} 262 6233 laca + 263 6233 laca +static char * 264 6233 laca +find_free_custom_gconf_key () 265 6233 laca +{ 266 6233 laca + GConfClient *client; 267 6233 laca + GSList *list, *li; 268 6233 laca + int num_bindings = 0; 269 6233 laca + int max_num = 0; 270 6233 laca + 271 6233 laca + client = gconf_client_get_default (); 272 6233 laca + 273 6233 laca + list = gconf_client_all_dirs (client, GCONF_CUSTOM_BINDING_DIR, NULL); 274 6233 laca + 275 6233 laca + num_bindings = g_slist_length (list); 276 6233 laca + 277 6233 laca + custom_binding_list = g_new0 (KeyListEntry, num_bindings+1); 278 6233 laca + 279 6233 laca + /*find the highest num */ 280 6233 laca + 281 6233 laca + for (li = list; li != NULL; li = li->next) 282 6233 laca + { 283 6233 laca + char *subdir = li->data; 284 6233 laca + char *key = g_path_get_basename(subdir); 285 6233 laca + li->data = NULL; 286 6233 laca + 287 6233 laca + if (g_ascii_strncasecmp(key, "custom_", 7) == 0) 288 6233 laca + { 289 6233 laca + int i = get_trailing_num (key); 290 6233 laca + if (i > max_num) 291 6233 laca + max_num = i; 292 6233 laca + } 293 6233 laca + } 294 6233 laca + g_slist_free (list); 295 6233 laca + 296 6233 laca + return g_strdup_printf ("%s/custom_%d",GCONF_CUSTOM_BINDING_DIR, max_num + 1); 297 6233 laca +} 298 6233 laca + 299 6233 laca + 300 6233 laca +static void 301 6233 laca +add_real_key (GtkWidget *widget, GladeXML *dialog) 302 6233 laca +{ 303 6233 laca + KeyEntry *entry = NULL; 304 6233 laca + GError *err = NULL; 305 6233 laca + GtkWidget *area_tf = WID ("action_tf"); 306 6233 laca + char *binding_key, *action_key; 307 6233 laca + char *action = g_strdup (gtk_entry_get_text (GTK_ENTRY (area_tf))); 308 6233 laca + 309 6233 laca + entry = g_object_steal_data (G_OBJECT (area_tf), "key_entry"); 310 6233 laca + 311 6233 laca + if (!entry) 312 6233 laca + { 313 6233 laca + char *new_gconf_key = find_free_custom_gconf_key (); 314 6233 laca + GConfClient *client = gconf_client_get_default (); 315 6233 laca + 316 6233 laca + binding_key = g_strdup_printf ("%s/binding", new_gconf_key); 317 6233 laca + action_key = g_strdup_printf ("%s/action", new_gconf_key); 318 6233 laca + 319 6233 laca + gconf_client_set_string (client, new_gconf_key, "", &err); 320 6233 laca + 321 6233 laca + gconf_client_set_string (client, binding_key, "", &err); 322 6233 laca + 323 6233 laca + gconf_client_set_string (client, action_key, action, &err); 324 6233 laca + 325 6233 laca + create_custom_bindings_list (); 326 6233 laca + reload_key_entries (wm_common_get_current_window_manager(), main_dialog); 327 6233 laca + g_free (binding_key); 328 6233 laca + g_free (new_gconf_key); 329 6233 laca + } 330 6233 laca + else 331 6233 laca + { 332 6233 laca + action_key = g_strdup_printf ("%s/action", entry->gconf_key); 333 6233 laca + gconf_client_set_string (gconf_client_get_default (), 334 6233 laca + action_key, action, &err); 335 6233 laca + } 336 6233 laca + 337 6233 laca + g_free (action); 338 6233 laca + g_free (action_key); 339 6233 laca + 340 6233 laca + custom_cancel (widget, dialog); 341 6233 laca +} 342 6233 laca + 343 6233 laca +void 344 6233 laca +custom_cancel (GtkWidget *widget, GladeXML *dialog) 345 6233 laca +{ 346 6233 laca + gtk_entry_set_text (GTK_ENTRY (WID ("action_tf")), ""); 347 6233 laca + 348 6233 laca + gtk_widget_hide (WID ("custom-binding-dialog")); 349 6233 laca +} 350 6233 laca + 351 6233 laca +void 352 6233 laca +delete_event_cb (GtkWidget *widget, GdkEventAny *event, gpointer *user_data) 353 6233 laca +{ 354 6233 laca + GtkWidget *entry = GTK_WIDGET (user_data); 355 6233 laca + gtk_entry_set_text (GTK_ENTRY (entry), ""); 356 6233 laca + 357 6233 laca + gtk_widget_hide (widget); 358 6233 laca +} 359 6233 laca + 360 6233 laca +static void 361 6233 laca +cb_dialog_response (GtkWidget *widget, GladeXML *dialog) 362 6233 laca +{ 363 6233 laca + capplet_help (GTK_WINDOW (gtk_widget_get_toplevel (widget)), 364 6233 laca + "user-guide.xml", 365 6233 laca + "goscustdesk-39"); 366 6233 laca +} 367 6233 laca + 368 6233 laca +typedef struct 369 6233 laca +{ 370 6233 laca + GtkFileSelection *fs; 371 6233 laca + GladeXML *dialog; 372 6233 laca +} FileSelData; 373 6233 laca + 374 6233 laca + 375 6233 laca +static void 376 6233 laca +command_selection_ok (FileSelData *fs_data) 377 6233 laca +{ 378 6233 laca + GtkWidget *action_tf = glade_xml_get_widget (fs_data->dialog, "action_tf"); 379 6233 laca + gchar **selections; 380 6233 laca + 381 6233 laca + selections = gtk_file_selection_get_selections (fs_data->fs); 382 6233 laca + 383 6233 laca + gtk_entry_set_text (GTK_ENTRY (action_tf), selections[0]); 384 6233 laca + gtk_widget_destroy (GTK_WIDGET (fs_data->fs)); 385 6233 laca +} 386 6233 laca + 387 6233 laca +static void 388 6233 laca +set_command (GtkWidget *widget, GladeXML *dialog) 389 6233 laca +{ 390 6233 laca + GtkWidget *window; 391 6233 laca + FileSelData *fs_data = g_new (FileSelData, 1); 392 6233 laca + 393 6233 laca + window = gtk_file_selection_new ("Select Command"); 394 6233 laca + 395 6233 laca + gtk_window_set_screen (GTK_WINDOW (window), 396 6233 laca + gtk_widget_get_screen (widget)); 397 6233 laca + 398 6233 laca + gtk_file_selection_set_select_multiple (GTK_FILE_SELECTION (window), 399 6233 laca + FALSE); 400 6233 laca + 401 6233 laca + g_signal_connect (window, "destroy", 402 6233 laca + G_CALLBACK (gtk_widget_destroyed), 403 6233 laca + &window); 404 6233 laca + 405 6233 laca + fs_data->fs = GTK_FILE_SELECTION (window); 406 6233 laca + fs_data->dialog = dialog; 407 6233 laca + 408 6233 laca + g_signal_connect_swapped (GTK_FILE_SELECTION (window)->ok_button, 409 6233 laca + "clicked", 410 6233 laca + G_CALLBACK (command_selection_ok), 411 6233 laca + fs_data); 412 6233 laca + 413 6233 laca + g_signal_connect_swapped (GTK_FILE_SELECTION (window)->cancel_button, 414 6233 laca + "clicked", 415 6233 laca + G_CALLBACK (gtk_widget_destroy), 416 6233 laca + window); 417 6233 laca + gtk_widget_show (window); 418 6233 laca +} 419 6233 laca + 420 6233 laca +GladeXML * 421 6233 laca +setup_custom_binding_dialog () 422 6233 laca +{ 423 6233 laca + static GladeXML *dialog = NULL; 424 6233 laca + GtkWidget *widget, *entry; 425 6233 laca + 426 6233 laca + if (dialog) 427 6233 laca + return dialog; 428 6233 laca + 429 6233 laca + /* setup dialog */ 430 6233 laca + dialog = glade_xml_new (GNOMECC_DATA_DIR "/interfaces/gnome-keybinding-properties.glade", "custom-binding-dialog", NULL); 431 6233 laca + 432 6233 laca + widget = WID ("custom-binding-dialog"); 433 6233 laca + entry = WID ("action_tf"); 434 6233 laca + g_signal_connect (G_OBJECT (widget), "delete_event", 435 6233 laca + G_CALLBACK (delete_event_cb), 436 6233 laca + entry); 437 6233 laca + 438 6233 laca + g_signal_connect (G_OBJECT (WID ("browse_button")), "clicked", 439 6233 laca + G_CALLBACK (set_command), dialog); 440 6233 laca + 441 6233 laca + g_signal_connect (G_OBJECT (WID ("cancelbutton1")), "clicked", 442 6233 laca + G_CALLBACK (custom_cancel), dialog); 443 6233 laca + 444 6233 laca + g_signal_connect (G_OBJECT (WID ("okbutton1")), "clicked", 445 6233 laca + G_CALLBACK (add_real_key), dialog); 446 6233 laca + 447 6233 laca + g_signal_connect (G_OBJECT (WID ("helpbutton2")), "clicked", 448 6233 laca + G_CALLBACK (cb_dialog_response), NULL); 449 6233 laca + 450 6233 laca + /* gtk_widget_hide (WID ("custom-binding-dialog")); */ 451 6233 laca + return dialog; 452 6233 laca +} 453 6233 laca +void 454 6233 laca +edit_custom (GtkWidget *widget) 455 6233 laca +{ 456 6233 laca + KeyEntry *entry = find_keyentry_selected (GTK_TREE_VIEW (glade_xml_get_widget (main_dialog,"shortcut_treeview"))); 457 6233 laca + if (entry) 458 6233 laca + { 459 6233 laca + if (entry->custom_key) 460 6233 laca + { 461 6233 laca + GladeXML *dialog = setup_custom_binding_dialog (); 462 6233 laca + GtkWidget *widget; 463 6233 laca + widget = WID ("action_tf"); 464 6233 laca + g_object_set_data (G_OBJECT (widget), "key_entry", entry); 465 6233 laca + gtk_entry_set_text (GTK_ENTRY (widget), entry->action); 466 6233 laca + gtk_widget_show_all (WID ("custom-binding-dialog")); 467 6233 laca + } 468 6233 laca + } 469 6233 laca +} 470 6233 laca +void 471 6233 laca +add_custom (GtkWidget *widget) 472 6233 laca +{ 473 6233 laca + GladeXML *dialog = setup_custom_binding_dialog (); 474 6233 laca + GtkWidget *action_widget; 475 6233 laca + action_widget = WID ("action_tf"); 476 6233 laca + g_object_set_data (G_OBJECT (action_widget), "key_entry", NULL); 477 6233 laca + gtk_widget_show_all (WID ("custom-binding-dialog")); 478 6233 laca +} 479 6233 laca + 480 6233 laca +void 481 6233 laca +create_custom_bindings_list () 482 6233 laca +{ 483 6233 laca + GConfClient *client; 484 6233 laca + GSList *list, *li; 485 6233 laca + int num_bindings = 0, i = 0; 486 6233 laca + 487 6233 laca + client = gconf_client_get_default (); 488 6233 laca + 489 6233 laca + list = gconf_client_all_dirs (client, GCONF_CUSTOM_BINDING_DIR, NULL); 490 6233 laca + 491 6233 laca + num_bindings = g_slist_length (list); 492 6233 laca + 493 6233 laca + if (custom_binding_list) 494 6233 laca + g_free (custom_binding_list); 495 6233 laca + 496 6233 laca + 497 6233 laca + custom_binding_list = g_new0 (KeyListEntry, num_bindings+1); 498 6233 laca + 499 6233 laca + for (li = list; li != NULL; li = li->next) 500 6233 laca + { 501 6233 laca + char *subdir = li->data; 502 6233 laca + li->data = NULL; 503 6233 laca + custom_binding_list[i].name = subdir; 504 6233 laca + custom_binding_list[i].visibility = ALWAYS_VISIBLE; 505 6233 laca + i++; 506 6233 laca + } 507 6233 laca + g_slist_free (list); 508 6233 laca +} 509 6233 laca + 510 6233 laca +KeyEntry * 511 6233 laca +custom_key_new (char *dir) 512 6233 laca +{ 513 6233 laca + GConfValue *value; 514 6233 laca + KeyEntry *new_binding; 515 6233 laca + GSList *tmp_elem = NULL, *list = NULL, *li; 516 6233 laca + char *gconf_key; 517 6233 laca + char *action = NULL; 518 6233 laca + char *key = NULL; 519 6233 laca + 520 6233 laca + g_return_val_if_fail (dir != NULL, NULL); 521 6233 laca + 522 6233 laca + /* value = gconf_entry_get_value (entry); */ 523 6233 laca + gconf_key = dir; 524 6233 laca + 525 6233 laca + if (!gconf_key) 526 6233 laca + return NULL; 527 6233 laca + 528 6233 laca + /* Get entries for this binding */ 529 6233 laca + list = gconf_client_all_entries (gconf_client_get_default (), dir, NULL); 530 6233 laca + 531 6233 laca + for (li = list; li != NULL; li = li->next) 532 6233 laca + { 533 6233 laca + GConfEntry *entry = li->data; 534 6233 laca + char *key_name = g_path_get_basename (gconf_entry_get_key (entry)); 535 6233 laca + if (strcmp (key_name, "action") == 0) 536 6233 laca + { 537 6233 laca + if (!action) 538 6233 laca + { 539 6233 laca + value = gconf_entry_get_value (entry); 540 6233 laca + if (value) 541 6233 laca + { 542 6233 laca + if (value->type != GCONF_VALUE_STRING) 543 6233 laca + return NULL; 544 6233 laca + action = g_strdup (gconf_value_get_string (value)); 545 6233 laca + } 546 6233 laca + } 547 6233 laca + else 548 6233 laca + g_warning (_("Key Binding (%s) has its action defined multiple times\n"), 549 6233 laca + gconf_key); 550 6233 laca + } 551 6233 laca + if (strcmp (key_name, "binding") == 0) 552 6233 laca + { 553 6233 laca + if (!key) 554 6233 laca + { 555 6233 laca + value = gconf_entry_get_value (entry); 556 6233 laca + if (value) 557 6233 laca + { 558 6233 laca + if (value->type != GCONF_VALUE_STRING) 559 6233 laca + return NULL; 560 6233 laca + key = g_strdup (gconf_value_get_string (value)); 561 6233 laca + } 562 6233 laca + } 563 6233 laca + else 564 6233 laca + g_warning (_("Key Binding (%s) has its binding defined multiple times\n"), 565 6233 laca + gconf_key); 566 6233 laca + } 567 6233 laca + } 568 6233 laca + if (!action || !key) 569 6233 laca + { 570 6233 laca + g_warning (_("Key Binding (%s) is incomplete\n"), gconf_key); 571 6233 laca + return NULL; 572 6233 laca + } 573 6233 laca + 574 6233 laca + new_binding = g_new0 (KeyEntry, 1); 575 6233 laca + 576 6233 laca + 577 6233 laca + new_binding->binding = key; 578 6233 laca + new_binding->action = action; 579 6233 laca + new_binding->gconf_key = gconf_key; 580 6233 laca + return new_binding; 581 6233 laca +} 582 6233 laca + 583 6233 laca +gboolean 584 6233 laca +is_gconf_key_custom_binding (char *key) 585 6233 laca +{ 586 6233 laca + char *str = NULL; 587 6233 laca + 588 6233 laca + str = g_strrstr (key, "keybindings"); 589 6233 laca + 590 6233 laca + if (str) 591 6233 laca + return TRUE; 592 6233 laca + return FALSE; 593 6233 laca +} 594 9711 padraig + 595 9711 padraig +void 596 9711 padraig +cursor_changed_cb (GtkTreeView *tree_view, 597 9711 padraig + GladeXML *dialog) 598 9711 padraig +{ 599 9711 padraig + KeyEntry *key_entry = find_keyentry_selected (tree_view); 600 9711 padraig + GtkWidget *widget; 601 9711 padraig + 602 9711 padraig + my_verbose ("In cursor_changed_cb\n"); 603 9711 padraig + if (key_entry) 604 9711 padraig + { 605 9711 padraig + if (key_entry->custom_key) 606 9711 padraig + { 607 9711 padraig + widget = WID ("edit_custom_button"); 608 9711 padraig + gtk_widget_set_sensitive (widget, TRUE); 609 9711 padraig + widget = WID ("disable_custom_button"); 610 9711 padraig + gtk_widget_set_sensitive (widget, TRUE); 611 9711 padraig + } 612 9711 padraig + else 613 9711 padraig + { 614 9711 padraig + widget = WID ("edit_custom_button"); 615 9711 padraig + gtk_widget_set_sensitive (widget, FALSE); 616 9711 padraig + widget = WID ("disable_custom_button"); 617 9711 padraig + gtk_widget_set_sensitive (widget, FALSE); 618 9711 padraig + } 619 9711 padraig + } 620 9711 padraig + else 621 9711 padraig + { 622 9711 padraig + widget = WID ("edit_custom_button"); 623 9711 padraig + gtk_widget_set_sensitive (widget, FALSE); 624 9711 padraig + widget = WID ("disable_custom_button"); 625 9711 padraig + gtk_widget_set_sensitive (widget, FALSE); 626 9711 padraig + } 627 9711 padraig +} 628 6233 laca --- control-center-2.10.1/capplets/keybindings/gnome-keybinding-properties.glade Thu May 12 16:46:18 2005 629 6233 laca +++ control-center-2.10.1-new/capplets/keybindings/gnome-keybinding-properties.glade Fri May 13 11:51:17 2005 630 6233 laca @@ -11,6 +11,11 @@ 631 6233 laca <property name="modal">False</property> 632 6233 laca <property name="resizable">True</property> 633 6233 laca <property name="destroy_with_parent">False</property> 634 6233 laca + <property name="decorated">True</property> 635 6233 laca + <property name="skip_taskbar_hint">False</property> 636 6233 laca + <property name="skip_pager_hint">False</property> 637 6233 laca + <property name="type_hint">GDK_WINDOW_TYPE_HINT_DIALOG</property> 638 6233 laca + <property name="gravity">GDK_GRAVITY_NORTH_WEST</property> 639 6233 laca <property name="has_separator">False</property> 640 6233 laca 641 6233 laca <child internal-child="vbox"> 642 6233 laca @@ -32,6 +37,7 @@ 643 6233 laca <property name="label">gtk-help</property> 644 6233 laca <property name="use_stock">True</property> 645 6233 laca <property name="relief">GTK_RELIEF_NORMAL</property> 646 6233 laca + <property name="focus_on_click">True</property> 647 6233 laca <property name="response_id">-11</property> 648 6233 laca </widget> 649 6233 laca </child> 650 6233 laca @@ -44,6 +50,7 @@ 651 6233 laca <property name="label">gtk-close</property> 652 6233 laca <property name="use_stock">True</property> 653 6233 laca <property name="relief">GTK_RELIEF_NORMAL</property> 654 6233 laca + <property name="focus_on_click">True</property> 655 6233 laca <property name="response_id">-7</property> 656 6233 laca </widget> 657 6233 laca </child> 658 6233 laca @@ -152,6 +159,362 @@ 659 6233 laca <property name="padding">0</property> 660 6233 laca <property name="expand">True</property> 661 6233 laca <property name="fill">True</property> 662 6233 laca + </packing> 663 6233 laca + </child> 664 6233 laca + 665 6233 laca + <child> 666 6233 laca + <widget class="GtkHBox" id="hbox2"> 667 6233 laca + <property name="border_width">5</property> 668 6233 laca + <property name="visible">True</property> 669 6233 laca + <property name="homogeneous">False</property> 670 6233 laca + <property name="spacing">6</property> 671 6233 laca + 672 6233 laca + <child> 673 6233 laca + <widget class="GtkLabel" id="label13"> 674 6233 laca + <property name="visible">True</property> 675 6233 laca + <property name="label" translatable="yes">Custom Shortcuts:</property> 676 6233 laca + <property name="use_underline">False</property> 677 6233 laca + <property name="use_markup">False</property> 678 6233 laca + <property name="justify">GTK_JUSTIFY_LEFT</property> 679 6233 laca + <property name="wrap">False</property> 680 6233 laca + <property name="selectable">False</property> 681 6233 laca + <property name="xalign">0.5</property> 682 6233 laca + <property name="yalign">0.5</property> 683 6233 laca + <property name="xpad">0</property> 684 6233 laca + <property name="ypad">0</property> 685 6233 laca + </widget> 686 6233 laca + <packing> 687 6233 laca + <property name="padding">0</property> 688 6233 laca + <property name="expand">False</property> 689 6233 laca + <property name="fill">False</property> 690 6233 laca + </packing> 691 6233 laca + </child> 692 6233 laca + 693 6233 laca + <child> 694 6233 laca + <widget class="GtkButton" id="add_custom_button"> 695 6233 laca + <property name="width_request">60</property> 696 6233 laca + <property name="height_request">30</property> 697 6233 laca + <property name="visible">True</property> 698 6233 laca + <property name="can_focus">True</property> 699 6233 laca + <property name="label">gtk-new</property> 700 6233 laca + <property name="use_stock">True</property> 701 6233 laca + <property name="relief">GTK_RELIEF_NORMAL</property> 702 6233 laca + <property name="focus_on_click">True</property> 703 6233 laca + </widget> 704 6233 laca + <packing> 705 6233 laca + <property name="padding">0</property> 706 6233 laca + <property name="expand">True</property> 707 6233 laca + <property name="fill">True</property> 708 6233 laca + </packing> 709 6233 laca + </child> 710 6233 laca + 711 6233 laca + <child> 712 6233 laca + <widget class="GtkButton" id="edit_custom_button"> 713 6233 laca + <property name="visible">True</property> 714 6233 laca + <property name="can_focus">True</property> 715 6233 laca + <property name="relief">GTK_RELIEF_NORMAL</property> 716 6233 laca + <property name="focus_on_click">True</property> 717 6233 laca + 718 6233 laca + <child> 719 6233 laca + <widget class="GtkAlignment" id="alignment1"> 720 6233 laca + <property name="visible">True</property> 721 6233 laca + <property name="xalign">0.5</property> 722 6233 laca + <property name="yalign">0.5</property> 723 6233 laca + <property name="xscale">0</property> 724 6233 laca + <property name="yscale">0</property> 725 6233 laca + <property name="top_padding">0</property> 726 6233 laca + <property name="bottom_padding">0</property> 727 6233 laca + <property name="left_padding">0</property> 728 6233 laca + <property name="right_padding">0</property> 729 6233 laca + 730 6233 laca + <child> 731 6233 laca + <widget class="GtkHBox" id="hbox3"> 732 6233 laca + <property name="visible">True</property> 733 6233 laca + <property name="homogeneous">False</property> 734 6233 laca + <property name="spacing">2</property> 735 6233 laca + 736 6233 laca + <child> 737 6233 laca + <widget class="GtkImage" id="image2"> 738 6233 laca + <property name="visible">True</property> 739 6233 laca + <property name="stock">gtk-preferences</property> 740 6233 laca + <property name="icon_size">4</property> 741 6233 laca + <property name="xalign">0.5</property> 742 6233 laca + <property name="yalign">0.5</property> 743 6233 laca + <property name="xpad">0</property> 744 6233 laca + <property name="ypad">0</property> 745 6233 laca + </widget> 746 6233 laca + <packing> 747 6233 laca + <property name="padding">0</property> 748 6233 laca + <property name="expand">False</property> 749 6233 laca + <property name="fill">False</property> 750 6233 laca + </packing> 751 6233 laca + </child> 752 6233 laca + 753 6233 laca + <child> 754 6233 laca + <widget class="GtkLabel" id="label14"> 755 6233 laca + <property name="visible">True</property> 756 6233 laca + <property name="label" translatable="yes">_Edit...</property> 757 6233 laca + <property name="use_underline">True</property> 758 6233 laca + <property name="use_markup">False</property> 759 6233 laca + <property name="justify">GTK_JUSTIFY_LEFT</property> 760 6233 laca + <property name="wrap">False</property> 761 6233 laca + <property name="selectable">False</property> 762 6233 laca + <property name="xalign">0.5</property> 763 6233 laca + <property name="yalign">0.5</property> 764 6233 laca + <property name="xpad">0</property> 765 6233 laca + <property name="ypad">0</property> 766 6233 laca + </widget> 767 6233 laca + <packing> 768 6233 laca + <property name="padding">0</property> 769 6233 laca + <property name="expand">False</property> 770 6233 laca + <property name="fill">False</property> 771 6233 laca + </packing> 772 6233 laca + </child> 773 6233 laca + </widget> 774 6233 laca + </child> 775 6233 laca + </widget> 776 6233 laca + </child> 777 6233 laca + </widget> 778 6233 laca + <packing> 779 6233 laca + <property name="padding">0</property> 780 6233 laca + <property name="expand">True</property> 781 6233 laca + <property name="fill">True</property> 782 6233 laca + </packing> 783 6233 laca + </child> 784 6233 laca + 785 6233 laca + <child> 786 6233 laca + <widget class="GtkButton" id="disable_custom_button"> 787 6233 laca + <property name="visible">True</property> 788 6233 laca + <property name="can_focus">True</property> 789 6233 laca + <property name="label">gtk-delete</property> 790 6233 laca + <property name="use_stock">True</property> 791 6233 laca + <property name="relief">GTK_RELIEF_NORMAL</property> 792 6233 laca + <property name="focus_on_click">True</property> 793 6233 laca + </widget> 794 6233 laca + <packing> 795 6233 laca + <property name="padding">0</property> 796 6233 laca + <property name="expand">True</property> 797 6233 laca + <property name="fill">True</property> 798 6233 laca + </packing> 799 6233 laca + </child> 800 6233 laca + </widget> 801 6233 laca + <packing> 802 6233 laca + <property name="padding">0</property> 803 6233 laca + <property name="expand">False</property> 804 6233 laca + <property name="fill">False</property> 805 6233 laca + <property name="pack_type">GTK_PACK_END</property> 806 6233 laca + </packing> 807 6233 laca + </child> 808 6233 laca + </widget> 809 6233 laca + <packing> 810 6233 laca + <property name="padding">0</property> 811 6233 laca + <property name="expand">True</property> 812 6233 laca + <property name="fill">True</property> 813 6233 laca + </packing> 814 6233 laca + </child> 815 6233 laca + </widget> 816 6233 laca + </child> 817 6233 laca +</widget> 818 6233 laca + 819 6233 laca +<widget class="GtkDialog" id="custom-binding-dialog"> 820 6233 laca + <property name="visible">True</property> 821 6233 laca + <property name="title" translatable="yes">Custom Binding</property> 822 6233 laca + <property name="type">GTK_WINDOW_TOPLEVEL</property> 823 6233 laca + <property name="window_position">GTK_WIN_POS_NONE</property> 824 6233 laca + <property name="modal">False</property> 825 6233 laca + <property name="resizable">True</property> 826 6233 laca + <property name="destroy_with_parent">False</property> 827 6233 laca + <property name="decorated">True</property> 828 6233 laca + <property name="skip_taskbar_hint">False</property> 829 6233 laca + <property name="skip_pager_hint">False</property> 830 6233 laca + <property name="type_hint">GDK_WINDOW_TYPE_HINT_DIALOG</property> 831 6233 laca + <property name="gravity">GDK_GRAVITY_NORTH_WEST</property> 832 6233 laca + <property name="has_separator">True</property> 833 6233 laca + <accessibility> 834 6233 laca + <atkproperty name="AtkObject::accessible_name" translatable="yes">Custom Binding</atkproperty> 835 6233 laca + </accessibility> 836 6233 laca + 837 6233 laca + <child internal-child="vbox"> 838 6233 laca + <widget class="GtkVBox" id="dialog-vbox1"> 839 6233 laca + <property name="visible">True</property> 840 6233 laca + <property name="homogeneous">False</property> 841 6233 laca + <property name="spacing">0</property> 842 6233 laca + 843 6233 laca + <child internal-child="action_area"> 844 6233 laca + <widget class="GtkHButtonBox" id="dialog-action_area2"> 845 6233 laca + <property name="visible">True</property> 846 6233 laca + <property name="layout_style">GTK_BUTTONBOX_END</property> 847 6233 laca + 848 6233 laca + <child> 849 6233 laca + <widget class="GtkButton" id="helpbutton2"> 850 6233 laca + <property name="visible">True</property> 851 6233 laca + <property name="can_default">True</property> 852 6233 laca + <property name="can_focus">True</property> 853 6233 laca + <property name="label">gtk-help</property> 854 6233 laca + <property name="use_stock">True</property> 855 6233 laca + <property name="relief">GTK_RELIEF_NORMAL</property> 856 6233 laca + <property name="focus_on_click">True</property> 857 6233 laca + <property name="response_id">-11</property> 858 6233 laca + </widget> 859 6233 laca + </child> 860 6233 laca + 861 6233 laca + <child> 862 6233 laca + <widget class="GtkButton" id="cancelbutton1"> 863 6233 laca + <property name="visible">True</property> 864 6233 laca + <property name="can_default">True</property> 865 6233 laca + <property name="can_focus">True</property> 866 6233 laca + <property name="label">gtk-cancel</property> 867 6233 laca + <property name="use_stock">True</property> 868 6233 laca + <property name="relief">GTK_RELIEF_NORMAL</property> 869 6233 laca + <property name="focus_on_click">True</property> 870 6233 laca + <property name="response_id">-6</property> 871 6233 laca + </widget> 872 6233 laca + </child> 873 6233 laca + 874 6233 laca + <child> 875 6233 laca + <widget class="GtkButton" id="okbutton1"> 876 6233 laca + <property name="visible">True</property> 877 6233 laca + <property name="can_default">True</property> 878 6233 laca + <property name="can_focus">True</property> 879 6233 laca + <property name="label">gtk-ok</property> 880 6233 laca + <property name="use_stock">True</property> 881 6233 laca + <property name="relief">GTK_RELIEF_NORMAL</property> 882 6233 laca + <property name="focus_on_click">True</property> 883 6233 laca + <property name="response_id">-5</property> 884 6233 laca + </widget> 885 6233 laca + </child> 886 6233 laca + </widget> 887 6233 laca + <packing> 888 6233 laca + <property name="padding">0</property> 889 6233 laca + <property name="expand">False</property> 890 6233 laca + <property name="fill">True</property> 891 6233 laca + <property name="pack_type">GTK_PACK_END</property> 892 6233 laca + </packing> 893 6233 laca + </child> 894 6233 laca + 895 6233 laca + <child> 896 6233 laca + <widget class="GtkHBox" id="hbox5"> 897 6233 laca + <property name="visible">True</property> 898 6233 laca + <property name="homogeneous">False</property> 899 6233 laca + <property name="spacing">0</property> 900 6233 laca + 901 6233 laca + <child> 902 6233 laca + <widget class="GtkLabel" id="label15"> 903 6233 laca + <property name="visible">True</property> 904 6233 laca + <property name="label" translatable="yes">_New Command: </property> 905 6233 laca + <property name="use_underline">True</property> 906 6233 laca + <property name="use_markup">False</property> 907 6233 laca + <property name="justify">GTK_JUSTIFY_LEFT</property> 908 6233 laca + <property name="wrap">False</property> 909 6233 laca + <property name="selectable">False</property> 910 6233 laca + <property name="xalign">0.5</property> 911 6233 laca + <property name="yalign">0.5</property> 912 6233 laca + <property name="xpad">0</property> 913 6233 laca + <property name="ypad">0</property> 914 6233 laca + </widget> 915 6233 laca + <packing> 916 6233 laca + <property name="padding">0</property> 917 6233 laca + <property name="expand">False</property> 918 6233 laca + <property name="fill">False</property> 919 6233 laca + </packing> 920 6233 laca + </child> 921 6233 laca + 922 6233 laca + <child> 923 6233 laca + <widget class="GtkEntry" id="action_tf"> 924 6233 laca + <property name="visible">True</property> 925 6233 laca + <property name="can_focus">True</property> 926 6233 laca + <property name="editable">True</property> 927 6233 laca + <property name="visibility">True</property> 928 6233 laca + <property name="max_length">0</property> 929 6233 laca + <property name="text" translatable="yes"></property> 930 6233 laca + <property name="has_frame">True</property> 931 6233 laca + <property name="invisible_char" translatable="yes">*</property> 932 6233 laca + <property name="activates_default">False</property> 933 6233 laca + <accessibility> 934 6233 laca + <atkproperty name="AtkObject::accessible_name" translatable="yes">action_tf</atkproperty> 935 6233 laca + </accessibility> 936 6233 laca + </widget> 937 6233 laca + <packing> 938 6233 laca + <property name="padding">0</property> 939 6233 laca + <property name="expand">True</property> 940 6233 laca + <property name="fill">True</property> 941 6233 laca + </packing> 942 6233 laca + </child> 943 6233 laca + 944 6233 laca + <child> 945 6233 laca + <widget class="GtkButton" id="browse_button"> 946 6233 laca + <property name="visible">True</property> 947 6233 laca + <property name="can_focus">True</property> 948 6233 laca + <property name="relief">GTK_RELIEF_NORMAL</property> 949 6233 laca + <property name="focus_on_click">True</property> 950 6233 laca + <accessibility> 951 6233 laca + <atkproperty name="AtkObject::accessible_name" translatable="yes">Browse</atkproperty> 952 6233 laca + </accessibility> 953 6233 laca + 954 6233 laca + <child> 955 6233 laca + <widget class="GtkAlignment" id="alignment2"> 956 6233 laca + <property name="visible">True</property> 957 6233 laca + <property name="xalign">0.5</property> 958 6233 laca + <property name="yalign">0.5</property> 959 6233 laca + <property name="xscale">0</property> 960 6233 laca + <property name="yscale">0</property> 961 6233 laca + <property name="top_padding">0</property> 962 6233 laca + <property name="bottom_padding">0</property> 963 6233 laca + <property name="left_padding">0</property> 964 6233 laca + <property name="right_padding">0</property> 965 6233 laca + 966 6233 laca + <child> 967 6233 laca + <widget class="GtkHBox" id="hbox6"> 968 6233 laca + <property name="visible">True</property> 969 6233 laca + <property name="homogeneous">False</property> 970 6233 laca + <property name="spacing">2</property> 971 6233 laca + 972 6233 laca + <child> 973 6233 laca + <widget class="GtkImage" id="image3"> 974 6233 laca + <property name="visible">True</property> 975 6233 laca + <property name="stock">gtk-open</property> 976 6233 laca + <property name="icon_size">4</property> 977 6233 laca + <property name="xalign">0.5</property> 978 6233 laca + <property name="yalign">0.5</property> 979 6233 laca + <property name="xpad">0</property> 980 6233 laca + <property name="ypad">0</property> 981 6233 laca + </widget> 982 6233 laca + <packing> 983 6233 laca + <property name="padding">0</property> 984 6233 laca + <property name="expand">False</property> 985 6233 laca + <property name="fill">False</property> 986 6233 laca + </packing> 987 6233 laca + </child> 988 6233 laca + 989 6233 laca + <child> 990 6233 laca + <widget class="GtkLabel" id="label16"> 991 6233 laca + <property name="visible">True</property> 992 6233 laca + <property name="label" translatable="yes">_Browse</property> 993 6233 laca + <property name="use_underline">True</property> 994 6233 laca + <property name="use_markup">False</property> 995 6233 laca + <property name="justify">GTK_JUSTIFY_LEFT</property> 996 6233 laca + <property name="wrap">False</property> 997 6233 laca + <property name="selectable">False</property> 998 6233 laca + <property name="xalign">0.5</property> 999 6233 laca + <property name="yalign">0.5</property> 1000 6233 laca + <property name="xpad">0</property> 1001 6233 laca + <property name="ypad">0</property> 1002 6233 laca + </widget> 1003 6233 laca + <packing> 1004 6233 laca + <property name="padding">0</property> 1005 6233 laca + <property name="expand">False</property> 1006 6233 laca + <property name="fill">False</property> 1007 6233 laca + </packing> 1008 6233 laca + </child> 1009 6233 laca + </widget> 1010 6233 laca + </child> 1011 6233 laca + </widget> 1012 6233 laca + </child> 1013 6233 laca + </widget> 1014 6233 laca + <packing> 1015 6233 laca + <property name="padding">0</property> 1016 6233 laca + <property name="expand">False</property> 1017 6233 laca + <property name="fill">False</property> 1018 6233 laca </packing> 1019 6233 laca </child> 1020 6233 laca </widget> 1021 6233 laca --- control-center-2.10.1/capplets/keybindings/Makefile.am Thu May 12 16:46:18 2005 1022 6233 laca +++ control-center-2.10.1-new/capplets/keybindings/Makefile.am Fri May 13 11:51:17 2005 1023 6233 laca @@ -3,6 +3,8 @@ bin_PROGRAMS = gnome-keybinding-properti 1024 6233 laca gnome_keybinding_properties_LDADD = $(GNOMECC_CAPPLETS_LIBS) 1025 6233 laca gnome_keybinding_properties_SOURCES = \ 1026 6233 laca gnome-keybinding-properties.c \ 1027 6233 laca + custom-binding.c \ 1028 6233 laca + custom-binding.h \ 1029 6233 laca eggcellrendererkeys.c \ 1030 6233 laca eggcellrendererkeys.h \ 1031 6233 laca eggaccelerators.c \ 1032 9529 dkenny --- control-center-2.10.1/gnome-settings-daemon/gnome-settings-keybindings.c Thu May 12 16:46:31 2005 1033 9529 dkenny +++ control-center-2.10.1-new/gnome-settings-daemon/gnome-settings-keybindings.c Fri May 13 11:51:17 2005 1034 9529 dkenny @@ -199,7 +199,7 @@ bindings_get_entry (char *subdir) 1035 9529 dkenny if (!action) 1036 9529 dkenny { 1037 9529 dkenny value = gconf_entry_get_value (entry); 1038 9529 dkenny - if (value->type != GCONF_VALUE_STRING) 1039 9529 dkenny + if (value && value->type != GCONF_VALUE_STRING) 1040 9529 dkenny return FALSE; 1041 9529 dkenny action = g_strdup (gconf_value_get_string (value)); 1042 9529 dkenny } 1043 9529 dkenny @@ -212,7 +212,7 @@ bindings_get_entry (char *subdir) 1044 9529 dkenny if (!key) 1045 9529 dkenny { 1046 9529 dkenny value = gconf_entry_get_value (entry); 1047 9529 dkenny - if (value->type != GCONF_VALUE_STRING) 1048 9529 dkenny + if (value && value->type != GCONF_VALUE_STRING) 1049 9529 dkenny return FALSE; 1050 9529 dkenny key = g_strdup (gconf_value_get_string (value)); 1051 9529 dkenny } 1052 9529 dkenny @@ -259,22 +259,6 @@ bindings_get_entry (char *subdir) 1053 9529 dkenny return TRUE; 1054 9529 dkenny } 1055 9529 dkenny 1056 9529 dkenny -static gboolean 1057 9529 dkenny -key_already_used (Binding *binding) 1058 9529 dkenny -{ 1059 9529 dkenny - GSList *li; 1060 9529 dkenny - 1061 9529 dkenny - for (li = binding_list; li != NULL; li = li->next) 1062 9529 dkenny - { 1063 9529 dkenny - Binding *tmp_binding = (Binding*) li->data; 1064 9529 dkenny - 1065 9529 dkenny - if (tmp_binding != binding && tmp_binding->key.keycode == binding->key.keycode && 1066 9529 dkenny - tmp_binding->key.state == binding->key.state) 1067 9529 dkenny - return TRUE; 1068 9529 dkenny - } 1069 9529 dkenny - return FALSE; 1070 9529 dkenny -} 1071 9529 dkenny - 1072 9529 dkenny static void 1073 9529 dkenny grab_key (GdkWindow *root, Key *key, int result, gboolean grab) 1074 9529 dkenny { 1075 9529 dkenny @@ -344,9 +328,6 @@ binding_register_keys (void) 1076 9529 dkenny if (binding->previous_key.keycode != binding->key.keycode || 1077 9529 dkenny binding->previous_key.state != binding->key.state) 1078 9529 dkenny { 1079 9529 dkenny - /* Ungrab key if it changed and not clashing with previously set binding */ 1080 9529 dkenny - if (!key_already_used (binding)) 1081 9529 dkenny - { 1082 9529 dkenny if (binding->previous_key.keycode) 1083 9529 dkenny do_grab (FALSE, &binding->previous_key); 1084 9529 dkenny do_grab (TRUE, &binding->key); 1085 9529 dkenny @@ -354,9 +335,6 @@ binding_register_keys (void) 1086 9529 dkenny binding->previous_key.keysym = binding->key.keysym; 1087 9529 dkenny binding->previous_key.state = binding->key.state; 1088 9529 dkenny binding->previous_key.keycode = binding->key.keycode; 1089 9529 dkenny - } 1090 9529 dkenny - else 1091 9529 dkenny - g_warning (_("Key Binding (%s) is already in use\n"), binding->binding_str); 1092 9529 dkenny } 1093 9529 dkenny } 1094 9529 dkenny gdk_flush (); 1095 9529 dkenny 1096 9711 padraig --- /usr/tmp/clean/control-center-2.16.1/capplets/keybindings/gnome-keybinding-properties.c 2006-11-14 15:16:57.919910000 +0000 1097 9711 padraig +++ control-center-2.16.1/capplets/keybindings/gnome-keybinding-properties.c 2006-11-14 15:18:14.085992000 +0000 1098 9529 dkenny @@ -16,22 +16,10 @@ 1099 6233 laca #include "capplet-util.h" 1100 6233 laca #include "eggcellrendererkeys.h" 1101 6233 laca #include "activate-settings-daemon.h" 1102 6233 laca +#include "custom-binding.h" 1103 6233 laca 1104 6233 laca #define LABEL_DATA "gnome-keybinding-properties-label" 1105 6233 laca #define MAX_ELEMENTS_BEFORE_SCROLLING 10 1106 6233 laca - 1107 6233 laca -typedef enum { 1108 6233 laca - ALWAYS_VISIBLE, 1109 6233 laca - N_WORKSPACES_GT 1110 6233 laca -} KeyListEntryVisibility; 1111 6233 laca - 1112 6233 laca -typedef struct 1113 6233 laca -{ 1114 6233 laca - const char *name; 1115 6233 laca - KeyListEntryVisibility visibility; 1116 6233 laca - gint data; 1117 6233 laca -} KeyListEntry; 1118 6233 laca - 1119 7376 dc144907 static const KeyListEntry desktop_key_list[] = 1120 6233 laca { 1121 6233 laca { "/apps/gnome_settings_daemon/keybindings/help", ALWAYS_VISIBLE, 0 }, 1122 9529 dkenny @@ -124,13 +112,7 @@ 1123 6233 laca { NULL } 1124 6233 laca }; 1125 6233 laca 1126 6233 laca -enum 1127 6233 laca -{ 1128 6233 laca - DESCRIPTION_COLUMN, 1129 6233 laca - KEYENTRY_COLUMN, 1130 6233 laca - N_COLUMNS 1131 6233 laca -}; 1132 6233 laca - 1133 6233 laca +/* 1134 6233 laca typedef struct 1135 6233 laca { 1136 6233 laca char *gconf_key; 1137 9529 dkenny @@ -142,9 +124,11 @@ 1138 6233 laca guint gconf_cnxn; 1139 6233 laca char *description; 1140 6233 laca } KeyEntry; 1141 6233 laca +*/ 1142 6233 laca + 1143 6233 laca +KeyListEntry *custom_binding_list = NULL; 1144 6233 laca +GladeXML *main_dialog; 1145 6233 laca 1146 6233 laca -static void reload_key_entries (gpointer wm_name, 1147 6233 laca - GladeXML *dialog); 1148 6233 laca static char* binding_name (guint keyval, 1149 6233 laca guint keycode, 1150 6233 laca EggVirtualModifierType mask, 1151 9529 dkenny @@ -169,11 +153,8 @@ 1152 6233 laca static GladeXML * 1153 6233 laca create_dialog (void) 1154 6233 laca { 1155 6233 laca - GladeXML *dialog; 1156 6233 laca - 1157 6233 laca - dialog = glade_xml_new (GNOMECC_DATA_DIR "/interfaces/gnome-keybinding-properties.glade", "gnome-keybinding-dialog", NULL); 1158 6233 laca - 1159 6233 laca - return dialog; 1160 6233 laca + main_dialog = glade_xml_new (GNOMECC_DATA_DIR "/interfaces/gnome-keybinding-properties.glade", "gnome-keybinding-dialog", NULL); 1161 6233 laca + return main_dialog; 1162 6233 laca } 1163 6233 laca 1164 6233 laca static char* 1165 9529 dkenny @@ -184,7 +165,7 @@ 1166 6233 laca { 1167 6233 laca if (keyval != 0 || keycode != 0) 1168 6233 laca return egg_virtual_accelerator_name (keyval, keycode, mask); 1169 6233 laca - else 1170 6233 laca + else 1171 6233 laca return translate ? g_strdup (_("Disabled")) : g_strdup ("disabled"); 1172 6233 laca } 1173 6233 laca 1174 9529 dkenny @@ -249,7 +230,7 @@ 1175 6233 laca NULL); 1176 6233 laca } 1177 6233 laca 1178 6233 laca -static gboolean 1179 6233 laca +gboolean 1180 6233 laca keybinding_key_changed_foreach (GtkTreeModel *model, 1181 6233 laca GtkTreePath *path, 1182 6233 laca GtkTreeIter *iter, 1183 9529 dkenny @@ -265,6 +246,11 @@ 1184 6233 laca 1185 6233 laca if (key_entry == tmp_key_entry) 1186 6233 laca { 1187 6233 laca + if (key_entry->custom_key) 1188 6233 laca + gtk_tree_store_set (GTK_TREE_STORE (key_entry->model), iter, 1189 6233 laca + DESCRIPTION_COLUMN, key_entry->action, 1190 6233 laca + -1); 1191 6233 laca + 1192 6233 laca gtk_tree_model_row_changed (key_entry->model, path, iter); 1193 6233 laca return TRUE; 1194 6233 laca } 1195 9529 dkenny @@ -279,7 +265,6 @@ 1196 6233 laca { 1197 6233 laca KeyEntry *key_entry; 1198 6233 laca const gchar *key_value; 1199 6233 laca - 1200 6233 laca key_entry = (KeyEntry *)user_data; 1201 6233 laca key_value = gconf_value_get_string (entry->value); 1202 6233 laca 1203 9529 dkenny @@ -352,10 +337,11 @@ 1204 6233 laca { 1205 6233 laca GtkTreeModel *model; 1206 6233 laca GtkTreeModel *sort_model; 1207 6233 laca - GtkTreeIter iter; 1208 6233 laca + GtkTreeIter iter, parent_iter; 1209 6233 laca KeyEntry *key_entry; 1210 6233 laca gboolean valid; 1211 6233 laca GConfClient *client; 1212 6233 laca + int children, i; 1213 6233 laca 1214 6233 laca client = gconf_client_get_default (); 1215 6233 laca model = get_real_model (GTK_TREE_VIEW (tree_view)); 1216 9529 dkenny @@ -364,21 +350,33 @@ 1217 6233 laca { 1218 6233 laca g_object_ref (model); 1219 6233 laca 1220 6233 laca - for (valid = gtk_tree_model_get_iter_first (model, &iter); 1221 6233 laca - valid; 1222 6233 laca - valid = gtk_tree_model_iter_next (model, &iter)) 1223 6233 laca + valid = gtk_tree_model_get_iter_first (model, &parent_iter); 1224 6233 laca + while (valid) 1225 6233 laca { 1226 6233 laca - gtk_tree_model_get (model, &iter, 1227 6233 laca - KEYENTRY_COLUMN, &key_entry, 1228 6233 laca - -1); 1229 6233 laca - if (key_entry != NULL) 1230 6233 laca - { 1231 6233 laca - gconf_client_notify_remove (client, key_entry->gconf_cnxn); 1232 6233 laca - g_free (key_entry->gconf_key); 1233 6233 laca - g_free (key_entry->description); 1234 6233 laca - g_free (key_entry); 1235 6233 laca - } 1236 6233 laca - } 1237 6233 laca + children = gtk_tree_model_iter_n_children (model,&parent_iter); 1238 6233 laca + 1239 6233 laca + for (i = 0; i < children ; i++) 1240 6233 laca + { 1241 6233 laca + if (gtk_tree_model_iter_nth_child (model, &iter, &parent_iter, i)) 1242 6233 laca + { 1243 6233 laca + gtk_tree_model_get (model, &iter, 1244 6233 laca + KEYENTRY_COLUMN, &key_entry, 1245 6233 laca + -1); 1246 6233 laca + if (key_entry != NULL) 1247 6233 laca + { 1248 6233 laca + if (key_entry->custom_key == TRUE) 1249 6233 laca + gconf_client_notify_remove (client, key_entry->cmd_line_cnxn); 1250 6233 laca + gconf_client_notify_remove (client, key_entry->gconf_cnxn); 1251 6233 laca + g_free (key_entry->gconf_key); 1252 6233 laca + g_free (key_entry->description); 1253 6233 laca + g_free (key_entry); 1254 6233 laca + } 1255 6233 laca + 1256 6233 laca + } 1257 6233 laca + 1258 6233 laca + } 1259 6233 laca + valid = gtk_tree_model_iter_next (model, &parent_iter); 1260 6233 laca + } 1261 6233 laca g_object_unref (model); 1262 6233 laca } 1263 6233 laca 1264 9529 dkenny @@ -441,7 +439,8 @@ 1265 6233 laca static void 1266 6233 laca append_keys_to_tree (GladeXML *dialog, 1267 6233 laca const gchar *title, 1268 6233 laca - const KeyListEntry *keys_list) 1269 6233 laca + const KeyListEntry *keys_list, 1270 6233 laca + gboolean custom_binding) 1271 6233 laca { 1272 6233 laca GConfClient *client; 1273 6233 laca GtkTreeIter parent_iter; 1274 9529 dkenny @@ -461,57 +460,97 @@ 1275 6233 laca 1276 6233 laca for (j = 0; keys_list[j].name != NULL; j++) 1277 6233 laca { 1278 6233 laca - GConfEntry *entry; 1279 6233 laca + GConfEntry *entry = NULL; 1280 6233 laca GConfSchema *schema = NULL; 1281 6233 laca - KeyEntry *key_entry; 1282 6233 laca + KeyEntry *key_entry = NULL; 1283 6233 laca GError *error = NULL; 1284 6233 laca GtkTreeIter iter; 1285 6233 laca const gchar *key_string; 1286 6233 laca gchar *key_value; 1287 6233 laca 1288 6233 laca if (!should_show_key (&keys_list[j])) 1289 6233 laca - continue; 1290 6233 laca - 1291 6233 laca - key_string = keys_list[j].name; 1292 6233 laca + continue; 1293 6233 laca 1294 6233 laca - entry = gconf_client_get_entry (client, 1295 6233 laca - key_string, 1296 6233 laca - NULL, 1297 6233 laca - TRUE, 1298 6233 laca - &error); 1299 6233 laca - if (error || entry == NULL) 1300 6233 laca - { 1301 6233 laca - /* We don't actually want to popup a dialog - just skip this one */ 1302 6233 laca - if (error) 1303 6233 laca - g_error_free (error); 1304 6233 laca - continue; 1305 6233 laca - } 1306 6233 laca + if (!custom_binding) 1307 6233 laca + { 1308 6233 laca + key_string = keys_list[j].name; 1309 6233 laca + 1310 6233 laca + entry = gconf_client_get_entry (client, 1311 6233 laca + key_string, 1312 6233 laca + NULL, 1313 6233 laca + TRUE, 1314 6233 laca + &error); 1315 6233 laca + } 1316 6233 laca + else if (error || entry == NULL) 1317 6233 laca + { 1318 6233 laca + key_entry = custom_key_new ((char *)keys_list[j].name); 1319 6233 laca + if (!key_entry) 1320 6233 laca + continue; 1321 6233 laca + key_string = key_entry->gconf_key; 1322 6233 laca + } 1323 6233 laca + 1324 6233 laca + 1325 6233 laca + if (!custom_binding) 1326 6233 laca + { 1327 6233 laca + if (error || entry == NULL) 1328 6233 laca + { 1329 6233 laca + /* We don't actually want to popup a dialog - just skip this one */ 1330 6233 laca + if (error) 1331 6233 laca + g_error_free (error); 1332 6233 laca + continue; 1333 6233 laca + } 1334 6233 laca 1335 6233 laca - if (gconf_entry_get_schema_name (entry)) 1336 6233 laca - schema = gconf_client_get_schema (client, gconf_entry_get_schema_name (entry), &error); 1337 6233 laca + if (gconf_entry_get_schema_name (entry)) 1338 6233 laca + schema = gconf_client_get_schema (client, gconf_entry_get_schema_name (entry), &error); 1339 6233 laca 1340 6233 laca - if (error || schema == NULL) 1341 6233 laca - { 1342 6233 laca - /* We don't actually want to popup a dialog - just skip this one */ 1343 6233 laca - if (error) 1344 6233 laca - g_error_free (error); 1345 6233 laca - continue; 1346 6233 laca + if (error || schema == NULL) 1347 6233 laca + { 1348 6233 laca + /* We don't actually want to popup a dialog - just skip this one */ 1349 6233 laca + if (error) 1350 6233 laca + g_error_free (error); 1351 6233 laca + continue; 1352 6233 laca + } 1353 6233 laca } 1354 6233 laca 1355 6233 laca - key_value = gconf_client_get_string (client, key_string, &error); 1356 6233 laca + if (!custom_binding) 1357 6233 laca + { 1358 6233 laca 1359 6233 laca - key_entry = g_new0 (KeyEntry, 1); 1360 6233 laca - key_entry->gconf_key = g_strdup (key_string); 1361 6233 laca - key_entry->editable = gconf_entry_get_is_writable (entry); 1362 6233 laca - key_entry->model = model; 1363 6233 laca - gconf_client_add_dir (client, key_string, GCONF_CLIENT_PRELOAD_ONELEVEL, NULL); 1364 6233 laca - key_entry->gconf_cnxn = gconf_client_notify_add (client, 1365 6233 laca - key_string, 1366 6233 laca - (GConfClientNotifyFunc) &keybinding_key_changed, 1367 6233 laca - key_entry, NULL, NULL); 1368 6233 laca - binding_from_string (key_value, &key_entry->keyval, &key_entry->keycode, &key_entry->mask); 1369 6233 laca - g_free (key_value); 1370 6233 laca - key_entry->description = g_strdup (gconf_schema_get_short_desc (schema)); 1371 6233 laca + key_entry = g_new0 (KeyEntry, 1); 1372 6233 laca + key_value = gconf_client_get_string (client, key_string, &error); 1373 6233 laca + key_entry->gconf_key = g_strdup (key_string); 1374 6233 laca + key_entry->editable = gconf_entry_get_is_writable (entry); 1375 6233 laca + key_entry->model = model; 1376 6233 laca + gconf_client_add_dir (client, key_string, GCONF_CLIENT_PRELOAD_ONELEVEL, NULL); 1377 6233 laca + key_entry->gconf_cnxn = gconf_client_notify_add (client, 1378 6233 laca + key_string, 1379 6233 laca + (GConfClientNotifyFunc) &keybinding_key_changed, 1380 6233 laca + key_entry, NULL, NULL); 1381 6233 laca + binding_from_string (key_value, &key_entry->keyval, &key_entry->keycode, &key_entry->mask); 1382 6233 laca + g_free (key_value); 1383 6233 laca + key_entry->description = g_strdup (gconf_schema_get_short_desc (schema)); 1384 6233 laca + } 1385 6233 laca + else 1386 6233 laca + { 1387 6233 laca + char *key_binding = g_strdup_printf ("%s/binding", key_entry->gconf_key); 1388 6233 laca + char *cmd_binding = g_strdup_printf ("%s/action", key_entry->gconf_key); 1389 6233 laca + key_entry->editable = TRUE; 1390 6233 laca + key_entry->model = model; 1391 6233 laca + gconf_client_add_dir (client, key_entry->gconf_key, GCONF_CLIENT_PRELOAD_ONELEVEL, NULL); 1392 6233 laca + 1393 6233 laca + key_entry->gconf_cnxn = gconf_client_notify_add (client, 1394 6233 laca + key_binding, 1395 6233 laca + (GConfClientNotifyFunc) &keybinding_key_changed, 1396 6233 laca + key_entry, NULL, NULL); 1397 6233 laca + binding_from_string (key_entry->binding, &key_entry->keyval, &key_entry->keycode, &key_entry->mask); 1398 6233 laca + 1399 6233 laca + key_entry->custom_key = TRUE; 1400 6233 laca + key_entry->cmd_line_cnxn = gconf_client_notify_add (client, cmd_binding, 1401 6233 laca + (GConfClientNotifyFunc) &cmd_line_changed, 1402 6233 laca + key_entry, NULL, NULL); 1403 6233 laca + key_entry->action = g_strdup (gconf_client_get_string (client, cmd_binding, &error)); 1404 6233 laca + g_free (key_binding); 1405 6233 laca + g_free (cmd_binding); 1406 6233 laca + } 1407 6233 laca 1408 6233 laca if (i == MAX_ELEMENTS_BEFORE_SCROLLING) 1409 6233 laca { 1410 9529 dkenny @@ -524,20 +563,35 @@ 1411 6233 laca } 1412 6233 laca i++; 1413 6233 laca gtk_tree_store_append (GTK_TREE_STORE (model), &iter, &parent_iter); 1414 6233 laca - if (gconf_schema_get_short_desc (schema)) 1415 6233 laca - gtk_tree_store_set (GTK_TREE_STORE (model), &iter, 1416 6233 laca - DESCRIPTION_COLUMN, 1417 6233 laca - key_entry->description, 1418 6233 laca - KEYENTRY_COLUMN, key_entry, 1419 6233 laca - -1); 1420 6233 laca - else 1421 6233 laca - gtk_tree_store_set (GTK_TREE_STORE (model), &iter, 1422 6233 laca - DESCRIPTION_COLUMN, _("<Unknown Action>"), 1423 6233 laca - KEYENTRY_COLUMN, key_entry, 1424 6233 laca - -1); 1425 9529 dkenny + 1426 6233 laca + if (!custom_binding) 1427 9529 dkenny + { 1428 9529 dkenny + if (gconf_schema_get_short_desc (schema)) 1429 9529 dkenny + gtk_tree_store_set (GTK_TREE_STORE (model), &iter, 1430 9529 dkenny + DESCRIPTION_COLUMN, 1431 9529 dkenny + key_entry->description, 1432 9529 dkenny + KEYENTRY_COLUMN, key_entry, 1433 9529 dkenny + -1); 1434 9529 dkenny + else 1435 9529 dkenny + gtk_tree_store_set (GTK_TREE_STORE (model), &iter, 1436 9529 dkenny + DESCRIPTION_COLUMN, _("<Unknown Action>"), 1437 9529 dkenny + KEYENTRY_COLUMN, key_entry, 1438 9529 dkenny + -1); 1439 9529 dkenny + } 1440 6233 laca + else { 1441 9529 dkenny + gtk_tree_store_set (GTK_TREE_STORE (model), &iter, 1442 9529 dkenny + DESCRIPTION_COLUMN, key_entry->action, 1443 9529 dkenny + KEYENTRY_COLUMN, key_entry, 1444 9529 dkenny + -1); 1445 6233 laca + } 1446 6233 laca + 1447 6233 laca gtk_tree_view_expand_all (GTK_TREE_VIEW (WID ("shortcut_treeview"))); 1448 6233 laca - gconf_entry_free (entry); 1449 6233 laca - gconf_schema_free (schema); 1450 6233 laca + 1451 6233 laca + if (entry) 1452 6233 laca + gconf_entry_free (entry); 1453 6233 laca + if (schema) 1454 6233 laca + gconf_schema_free (schema); 1455 9529 dkenny + 1456 6233 laca } 1457 6233 laca 1458 9529 dkenny g_object_unref (client); 1459 9529 dkenny @@ -548,18 +602,20 @@ 1460 6233 laca gtk_widget_show (WID ("shortcuts_vbox")); 1461 6233 laca } 1462 6233 laca 1463 6233 laca -static void 1464 6233 laca +void 1465 6233 laca reload_key_entries (gpointer wm_name, GladeXML *dialog) 1466 6233 laca { 1467 6233 laca clear_old_model (dialog, WID ("shortcut_treeview")); 1468 6233 laca 1469 6233 laca - append_keys_to_tree (dialog, _("Desktop"), desktop_key_list); 1470 6233 laca - append_keys_to_tree (dialog, _("Sound"), sounds_key_list); 1471 6233 laca + append_keys_to_tree (dialog, _("Desktop"), desktop_key_list, FALSE); 1472 6233 laca + append_keys_to_tree (dialog, _("Sound"), sounds_key_list, FALSE); 1473 6233 laca 1474 6233 laca if (strcmp((char *) wm_name, WM_COMMON_METACITY) == 0) 1475 6233 laca { 1476 6233 laca - append_keys_to_tree (dialog, _("Window Management"), metacity_key_list); 1477 6233 laca + append_keys_to_tree (dialog, _("Window Management"), metacity_key_list, FALSE); 1478 6233 laca } 1479 6233 laca + 1480 6233 laca + append_keys_to_tree (dialog, _("Custom Shortcuts"), custom_binding_list, TRUE); 1481 6233 laca } 1482 6233 laca 1483 6233 laca static void 1484 9529 dkenny @@ -627,7 +683,6 @@ 1485 6233 laca /* sanity check */ 1486 6233 laca if (key_entry == NULL) 1487 6233 laca return; 1488 6233 laca - 1489 6233 laca model = get_real_model (view); 1490 6233 laca tmp_key.model = model; 1491 6233 laca tmp_key.keyval = keyval; 1492 9529 dkenny @@ -712,10 +767,22 @@ 1493 6233 laca str = binding_name (keyval, keycode, mask, FALSE); 1494 6233 laca 1495 6233 laca client = gconf_client_get_default(); 1496 6233 laca - gconf_client_set_string (client, 1497 6233 laca - key_entry->gconf_key, 1498 6233 laca - str, 1499 6233 laca - &err); 1500 6233 laca + 1501 6233 laca + if (!key_entry->custom_key) 1502 6233 laca + gconf_client_set_string (gconf_client_get_default(), 1503 6233 laca + key_entry->gconf_key, 1504 6233 laca + str, 1505 6233 laca + &err); 1506 6233 laca + else 1507 6233 laca + { 1508 6233 laca + char *key = g_strdup_printf ("%s/binding", key_entry->gconf_key); 1509 6233 laca + gconf_client_set_string (gconf_client_get_default(), 1510 6233 laca + key, 1511 6233 laca + str, 1512 6233 laca + &err); 1513 6233 laca + g_free (key); 1514 6233 laca + } 1515 6233 laca + 1516 6233 laca g_free (str); 1517 6233 laca g_object_unref (G_OBJECT (client)); 1518 6233 laca 1519 9529 dkenny @@ -763,6 +830,22 @@ 1520 6233 laca 1521 6233 laca /* Unset the key */ 1522 6233 laca client = gconf_client_get_default(); 1523 6233 laca + 1524 6233 laca + if (!key_entry->custom_key) { 1525 6233 laca + gconf_client_set_string (gconf_client_get_default(), 1526 6233 laca + key_entry->gconf_key, 1527 6233 laca + "disabled", 1528 6233 laca + &err); 1529 6233 laca + } else { 1530 6233 laca + char *key = g_strdup_printf ("%s/binding", key_entry->gconf_key); 1531 6233 laca + gconf_client_set_string (gconf_client_get_default(), 1532 6233 laca + key, 1533 6233 laca + "disabled", 1534 6233 laca + &err); 1535 6233 laca + g_free (key); 1536 6233 laca + 1537 6233 laca + } 1538 6233 laca + 1539 6233 laca gconf_client_set_string (client, 1540 6233 laca key_entry->gconf_key, 1541 6233 laca "disabled", 1542 9529 dkenny @@ -830,6 +913,8 @@ 1543 6233 laca { 1544 6233 laca GtkTreePath *path; 1545 6233 laca 1546 6233 laca + my_verbose ("In start_editing_cb\n"); 1547 6233 laca + 1548 6233 laca if (event->window != gtk_tree_view_get_bin_window (tree_view)) 1549 6233 laca return FALSE; 1550 6233 laca 1551 9711 padraig @@ -878,11 +963,11 @@ 1552 6233 laca client = gconf_client_get_default (); 1553 6233 laca 1554 6233 laca g_signal_connect (GTK_TREE_VIEW (WID ("shortcut_treeview")), 1555 6233 laca - "button_press_event", 1556 6233 laca - G_CALLBACK (start_editing_cb), dialog), 1557 6233 laca - g_signal_connect (GTK_TREE_VIEW (WID ("shortcut_treeview")), 1558 6233 laca - "row-activated", 1559 6233 laca + "row-activated", 1560 6233 laca G_CALLBACK (start_editing_kb_cb), dialog), 1561 9711 padraig + g_signal_connect (GTK_TREE_VIEW (WID ("shortcut_treeview")), 1562 9711 padraig + "cursor-changed", 1563 9711 padraig + G_CALLBACK (cursor_changed_cb), dialog), 1564 6233 laca 1565 6233 laca column = gtk_tree_view_column_new_with_attributes (_("Action"), 1566 9711 padraig gtk_cell_renderer_text_new (), 1567 9711 padraig @@ -893,6 +978,7 @@ 1568 6233 laca gtk_tree_view_append_column (GTK_TREE_VIEW (WID ("shortcut_treeview")), column); 1569 6233 laca gtk_tree_view_column_set_sort_column_id (column, DESCRIPTION_COLUMN); 1570 6233 laca 1571 6233 laca + 1572 6233 laca renderer = (GtkCellRenderer *) g_object_new (EGG_TYPE_CELL_RENDERER_KEYS, 1573 6233 laca "editable", TRUE, 1574 6233 laca "accel_mode", EGG_CELL_RENDERER_KEYS_MODE_X, 1575 9711 padraig @@ -918,12 +1004,14 @@ 1576 6233 laca 1577 6233 laca gconf_client_add_dir (client, "/apps/gnome_keybinding_properties", GCONF_CLIENT_PRELOAD_ONELEVEL, NULL); 1578 6233 laca gconf_client_add_dir (client, "/apps/metacity/general", GCONF_CLIENT_PRELOAD_ONELEVEL, NULL); 1579 6233 laca + gconf_client_add_dir (client, GCONF_CUSTOM_BINDING_DIR, GCONF_CLIENT_PRELOAD_ONELEVEL, NULL); 1580 6233 laca gconf_client_notify_add (client, 1581 6233 laca "/apps/metacity/general/num_workspaces", 1582 6233 laca (GConfClientNotifyFunc) &key_entry_controlling_key_changed, 1583 6233 laca dialog, NULL, NULL); 1584 6258 laca g_object_unref (client); 1585 6233 laca 1586 6233 laca + create_custom_bindings_list (); 1587 6233 laca /* set up the dialog */ 1588 6233 laca reload_key_entries (wm_common_get_current_window_manager(), dialog); 1589 6233 laca 1590 9711 padraig @@ -932,6 +1020,19 @@ 1591 6233 laca gtk_widget_show (widget); 1592 6233 laca 1593 6233 laca g_signal_connect (G_OBJECT (widget), "response", G_CALLBACK(cb_dialog_response), NULL); 1594 9529 dkenny + 1595 9529 dkenny + /* set up custom bindings buttons and dialog*/ 1596 9529 dkenny + widget = WID ("disable_custom_button"); 1597 9529 dkenny + g_signal_connect (G_OBJECT (widget), "clicked", G_CALLBACK (disable_custom), 1598 9529 dkenny + GTK_TREE_VIEW (WID ("shortcut_treeview"))); 1599 9711 padraig + gtk_widget_set_sensitive (widget, FALSE); 1600 9529 dkenny + 1601 9529 dkenny + widget = WID ("add_custom_button"); 1602 9529 dkenny + g_signal_connect (G_OBJECT (widget), "clicked", G_CALLBACK (add_custom), NULL); 1603 9529 dkenny + 1604 9529 dkenny + widget = WID ("edit_custom_button"); 1605 9529 dkenny + g_signal_connect (G_OBJECT (widget), "clicked", G_CALLBACK (edit_custom), NULL); 1606 9711 padraig + gtk_widget_set_sensitive (widget, FALSE); 1607 6233 laca } 1608 6233 laca 1609 6233 laca int 1610