Home | History | Annotate | Download | only in patches
      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