+
+static gboolean
+is_printable_key (gint keyval)
+{
+ switch (keyval)
+ {
+ case GDK_KEY_Return:
+ case GDK_KEY_ISO_Left_Tab:
+ case GDK_KEY_Tab:
+ return FALSE;
+ break;
+ }
+
+ return (0 != gdk_keyval_to_unicode (keyval));
+}
+
+struct dispatch
+{
+ PsppireVariableSheet *sheet;
+ void (*payload) (PsppireVariableSheet *);
+};
+
+
+static gboolean
+on_key_press (GtkWidget *w, GdkEventKey *e, gpointer user_data)
+{
+ const struct dispatch *d = user_data;
+ if (is_printable_key (e->keyval))
+ {
+ d->payload (d->sheet);
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+static gboolean
+on_button_press (GtkWidget *w, GdkEventButton *e, gpointer user_data)
+{
+ const struct dispatch *d = user_data;
+ if (e->button != 1)
+ return TRUE;
+
+ d->payload (d->sheet);
+ return TRUE;
+}
+
+static void
+on_edit_start (GtkCellRenderer *renderer,
+ GtkCellEditable *editable,
+ gchar *path,
+ gpointer user_data)
+{
+ gtk_widget_grab_focus (GTK_WIDGET (editable));
+ g_signal_connect (editable, "key-press-event",
+ G_CALLBACK (on_key_press), user_data);
+ g_signal_connect (editable, "button-press-event",
+ G_CALLBACK (on_button_press), user_data);
+
+}
+