summaryrefslogtreecommitdiff
path: root/capplets/keybindings/eggcellrendererkeys.c
diff options
context:
space:
mode:
Diffstat (limited to 'capplets/keybindings/eggcellrendererkeys.c')
-rw-r--r--capplets/keybindings/eggcellrendererkeys.c695
1 files changed, 0 insertions, 695 deletions
diff --git a/capplets/keybindings/eggcellrendererkeys.c b/capplets/keybindings/eggcellrendererkeys.c
deleted file mode 100644
index 7d56e7c27..000000000
--- a/capplets/keybindings/eggcellrendererkeys.c
+++ /dev/null
@@ -1,695 +0,0 @@
-#include <config.h>
-#include <libintl.h>
-#include <gtk/gtk.h>
-#include <gdk/gdkx.h>
-#include <gdk/gdkkeysyms.h>
-#include "eggcellrendererkeys.h"
-#include "eggaccelerators.h"
-
-#ifndef EGG_COMPILATION
-#ifndef _
-#define _(x) dgettext (GETTEXT_PACKAGE, x)
-#define N_(x) x
-#endif
-#else
-#define _(x) x
-#define N_(x) x
-#endif
-
-#define EGG_CELL_RENDERER_TEXT_PATH "egg-cell-renderer-text"
-
-#define TOOLTIP_TEXT _("New accelerator...")
-
-static void egg_cell_renderer_keys_finalize (GObject *object);
-static void egg_cell_renderer_keys_init (EggCellRendererKeys *cell_keys);
-static void egg_cell_renderer_keys_class_init (EggCellRendererKeysClass *cell_keys_class);
-static GtkCellEditable *egg_cell_renderer_keys_start_editing (GtkCellRenderer *cell,
- GdkEvent *event,
- GtkWidget *widget,
- const gchar *path,
- GdkRectangle *background_area,
- GdkRectangle *cell_area,
- GtkCellRendererState flags);
-
-
-static void egg_cell_renderer_keys_get_property (GObject *object,
- guint param_id,
- GValue *value,
- GParamSpec *pspec);
-static void egg_cell_renderer_keys_set_property (GObject *object,
- guint param_id,
- const GValue *value,
- GParamSpec *pspec);
-static void egg_cell_renderer_keys_get_size (GtkCellRenderer *cell,
- GtkWidget *widget,
- GdkRectangle *cell_area,
- gint *x_offset,
- gint *y_offset,
- gint *width,
- gint *height);
-
-
-enum {
- PROP_0,
-
- PROP_ACCEL_KEY,
- PROP_ACCEL_MASK,
- PROP_KEYCODE,
- PROP_ACCEL_MODE
-};
-
-static GtkCellRendererTextClass *parent_class = NULL;
-
-GType
-egg_cell_renderer_keys_get_type (void)
-{
- static GType cell_keys_type = 0;
-
- if (!cell_keys_type)
- {
- static const GTypeInfo cell_keys_info =
- {
- sizeof (EggCellRendererKeysClass),
- NULL, /* base_init */
- NULL, /* base_finalize */
- (GClassInitFunc)egg_cell_renderer_keys_class_init,
- NULL, /* class_finalize */
- NULL, /* class_data */
- sizeof (EggCellRendererKeys),
- 0, /* n_preallocs */
- (GInstanceInitFunc) egg_cell_renderer_keys_init
- };
-
- cell_keys_type = g_type_register_static (GTK_TYPE_CELL_RENDERER_TEXT, "EggCellRendererKeys", &cell_keys_info, 0);
- }
-
- return cell_keys_type;
-}
-
-static void
-egg_cell_renderer_keys_init (EggCellRendererKeys *cell_keys)
-{
- cell_keys->accel_mode = EGG_CELL_RENDERER_KEYS_MODE_GTK;
-}
-
-/* FIXME setup stuff to generate this */
-/* VOID:STRING,UINT,FLAGS,UINT */
-static void
-marshal_VOID__STRING_UINT_FLAGS_UINT (GClosure *closure,
- GValue *return_value,
- guint n_param_values,
- const GValue *param_values,
- gpointer invocation_hint,
- gpointer marshal_data)
-{
- typedef void (*GMarshalFunc_VOID__STRING_UINT_FLAGS_UINT) (gpointer data1,
- const char *arg_1,
- guint arg_2,
- int arg_3,
- guint arg_4,
- gpointer data2);
- register GMarshalFunc_VOID__STRING_UINT_FLAGS_UINT callback;
- register GCClosure *cc = (GCClosure*) closure;
- register gpointer data1, data2;
-
- g_return_if_fail (n_param_values == 5);
-
- if (G_CCLOSURE_SWAP_DATA (closure))
- {
- data1 = closure->data;
- data2 = g_value_peek_pointer (param_values + 0);
- }
- else
- {
- data1 = g_value_peek_pointer (param_values + 0);
- data2 = closure->data;
- }
-
- callback = (GMarshalFunc_VOID__STRING_UINT_FLAGS_UINT) (marshal_data ? marshal_data : cc->callback);
-
- callback (data1,
- g_value_get_string (param_values + 1),
- g_value_get_uint (param_values + 2),
- g_value_get_flags (param_values + 3),
- g_value_get_uint (param_values + 4),
- data2);
-}
-
-static void
-egg_cell_renderer_keys_class_init (EggCellRendererKeysClass *cell_keys_class)
-{
- GObjectClass *object_class;
- GtkCellRendererClass *cell_renderer_class;
-
- object_class = G_OBJECT_CLASS (cell_keys_class);
- cell_renderer_class = GTK_CELL_RENDERER_CLASS (cell_keys_class);
- parent_class = g_type_class_peek_parent (object_class);
-
- GTK_CELL_RENDERER_CLASS (cell_keys_class)->start_editing = egg_cell_renderer_keys_start_editing;
-
- object_class->set_property = egg_cell_renderer_keys_set_property;
- object_class->get_property = egg_cell_renderer_keys_get_property;
- cell_renderer_class->get_size = egg_cell_renderer_keys_get_size;
-
- object_class->finalize = egg_cell_renderer_keys_finalize;
-
- /* FIXME if this gets moved to a real library, rename the properties
- * to match whatever the GTK convention is
- */
-
- g_object_class_install_property (object_class,
- PROP_ACCEL_KEY,
- g_param_spec_uint ("accel_key",
- _("Accelerator key"),
- _("Accelerator key"),
- 0,
- G_MAXINT,
- 0,
- G_PARAM_READABLE | G_PARAM_WRITABLE));
-
- g_object_class_install_property (object_class,
- PROP_ACCEL_MASK,
- g_param_spec_flags ("accel_mask",
- _("Accelerator modifiers"),
- _("Accelerator modifiers"),
- GDK_TYPE_MODIFIER_TYPE,
- 0,
- G_PARAM_READABLE | G_PARAM_WRITABLE));
-
- g_object_class_install_property (object_class,
- PROP_KEYCODE,
- g_param_spec_uint ("keycode",
- _("Accelerator keycode"),
- _("Accelerator keycode"),
- 0,
- G_MAXINT,
- 0,
- G_PARAM_READABLE | G_PARAM_WRITABLE));
-
- /* FIXME: Register the enum when moving to GTK+ */
- g_object_class_install_property (object_class,
- PROP_ACCEL_MODE,
- g_param_spec_int ("accel_mode",
- _("Accel Mode"),
- _("The type of accelerator."),
- 0,
- 2,
- 0,
- G_PARAM_READABLE | G_PARAM_WRITABLE));
-
- g_signal_new ("accel_edited",
- EGG_TYPE_CELL_RENDERER_KEYS,
- G_SIGNAL_RUN_LAST,
- G_STRUCT_OFFSET (EggCellRendererKeysClass, accel_edited),
- NULL, NULL,
- marshal_VOID__STRING_UINT_FLAGS_UINT,
- G_TYPE_NONE, 4,
- G_TYPE_STRING,
- G_TYPE_UINT,
- GDK_TYPE_MODIFIER_TYPE,
- G_TYPE_UINT);
-
- g_signal_new ("accel_cleared",
- EGG_TYPE_CELL_RENDERER_KEYS,
- G_SIGNAL_RUN_LAST,
- G_STRUCT_OFFSET (EggCellRendererKeysClass, accel_cleared),
- NULL, NULL,
- gtk_marshal_VOID__STRING,
- G_TYPE_NONE, 1,
- G_TYPE_STRING);
-}
-
-
-GtkCellRenderer *
-egg_cell_renderer_keys_new (void)
-{
- return GTK_CELL_RENDERER (g_object_new (EGG_TYPE_CELL_RENDERER_KEYS, NULL));
-}
-
-static void
-egg_cell_renderer_keys_finalize (GObject *object)
-{
-
- (* G_OBJECT_CLASS (parent_class)->finalize) (object);
-}
-
-static gchar *
-convert_keysym_state_to_string (guint keysym,
- guint keycode,
- EggVirtualModifierType mask)
-{
- if (keysym == 0 && keycode == 0)
- return g_strdup (_("Disabled"));
- else
- return egg_virtual_accelerator_name (keysym, keycode, mask);
-}
-
-static void
-egg_cell_renderer_keys_get_property (GObject *object,
- guint param_id,
- GValue *value,
- GParamSpec *pspec)
-{
- EggCellRendererKeys *keys;
-
- g_return_if_fail (EGG_IS_CELL_RENDERER_KEYS (object));
-
- keys = EGG_CELL_RENDERER_KEYS (object);
-
- switch (param_id)
- {
- case PROP_ACCEL_KEY:
- g_value_set_uint (value, keys->accel_key);
- break;
-
- case PROP_ACCEL_MASK:
- g_value_set_flags (value, keys->accel_mask);
- break;
-
- case PROP_ACCEL_MODE:
- g_value_set_int (value, keys->accel_mode);
- break;
-
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
- }
-}
-
-static void
-egg_cell_renderer_keys_set_property (GObject *object,
- guint param_id,
- const GValue *value,
- GParamSpec *pspec)
-{
- EggCellRendererKeys *keys;
-
- g_return_if_fail (EGG_IS_CELL_RENDERER_KEYS (object));
-
- keys = EGG_CELL_RENDERER_KEYS (object);
-
- switch (param_id)
- {
- case PROP_ACCEL_KEY:
- egg_cell_renderer_keys_set_accelerator (keys,
- g_value_get_uint (value),
- keys->keycode,
- keys->accel_mask);
- break;
-
- case PROP_ACCEL_MASK:
- egg_cell_renderer_keys_set_accelerator (keys,
- keys->accel_key,
- keys->keycode,
- g_value_get_flags (value));
- break;
- case PROP_KEYCODE:
- egg_cell_renderer_keys_set_accelerator (keys,
- keys->accel_key,
- g_value_get_uint (value),
- keys->accel_mask);
- break;
-
- case PROP_ACCEL_MODE:
- egg_cell_renderer_keys_set_accel_mode (keys, g_value_get_int (value));
- break;
-
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
- }
-}
-
-static gboolean
-is_modifier (guint keycode)
-{
- gint i;
- gint map_size;
- XModifierKeymap *mod_keymap;
- gboolean retval = FALSE;
-
- mod_keymap = XGetModifierMapping (gdk_display);
-
- map_size = 8 * mod_keymap->max_keypermod;
- i = 0;
- while (i < map_size)
- {
- if (keycode == mod_keymap->modifiermap[i])
- {
- retval = TRUE;
- break;
- }
- ++i;
- }
-
- XFreeModifiermap (mod_keymap);
-
- return retval;
-}
-
-static void
-egg_cell_renderer_keys_get_size (GtkCellRenderer *cell,
- GtkWidget *widget,
- GdkRectangle *cell_area,
- gint *x_offset,
- gint *y_offset,
- gint *width,
- gint *height)
-
-{
- EggCellRendererKeys *keys = (EggCellRendererKeys *) cell;
- GtkRequisition requisition;
-
- if (keys->sizing_label == NULL)
- keys->sizing_label = gtk_label_new (TOOLTIP_TEXT);
-
- gtk_widget_size_request (keys->sizing_label, &requisition);
- (* GTK_CELL_RENDERER_CLASS (parent_class)->get_size) (cell, widget, cell_area, x_offset, y_offset, width, height);
- /* FIXME: need to take the cell_area et al. into account */
- if (width)
- *width = MAX (*width, requisition.width);
- if (height)
- *height = MAX (*height, requisition.height);
-}
-
-/* FIXME: Currently we don't differentiate between a 'bogus' key (like tab in
- * GTK mode) and a removed key.
- */
-
-static gboolean
-grab_key_callback (GtkWidget *widget,
- GdkEventKey *event,
- void *data)
-{
- GdkModifierType accel_mods = 0;
- guint accel_keyval;
- EggCellRendererKeys *keys;
- char *path;
- gboolean edited;
- gboolean cleared;
- GdkModifierType consumed_modifiers;
- guint upper;
- GdkModifierType ignored_modifiers;
-
- keys = EGG_CELL_RENDERER_KEYS (data);
-
- if (is_modifier (event->hardware_keycode))
- return TRUE;
-
- edited = FALSE;
- cleared = FALSE;
-
- consumed_modifiers = 0;
- gdk_keymap_translate_keyboard_state (gdk_keymap_get_default (),
- event->hardware_keycode,
- event->state,
- event->group,
- NULL, NULL, NULL, &consumed_modifiers);
-
- upper = event->keyval;
- accel_keyval = gdk_keyval_to_lower (upper);
- if (accel_keyval == GDK_ISO_Left_Tab)
- accel_keyval = GDK_Tab;
-
-
-
- /* Put shift back if it changed the case of the key, not otherwise.
- */
- if (upper != accel_keyval &&
- (consumed_modifiers & GDK_SHIFT_MASK))
- {
- consumed_modifiers &= ~(GDK_SHIFT_MASK);
- }
-
- egg_keymap_resolve_virtual_modifiers (gdk_keymap_get_default (),
- EGG_VIRTUAL_NUM_LOCK_MASK |
- EGG_VIRTUAL_SCROLL_LOCK_MASK,
- &ignored_modifiers);
-
- /* http://bugzilla.gnome.org/show_bug.cgi?id=139605
- * mouse keys should effect keybindings */
- ignored_modifiers |= GDK_BUTTON1_MASK |
- GDK_BUTTON2_MASK |
- GDK_BUTTON3_MASK |
- GDK_BUTTON4_MASK |
- GDK_BUTTON5_MASK;
-
- /* filter consumed/ignored modifiers */
-
- if (keys->accel_mode == EGG_CELL_RENDERER_KEYS_MODE_GTK)
- accel_mods = event->state & GDK_MODIFIER_MASK & ~(consumed_modifiers | ignored_modifiers);
- else if (keys->accel_mode == EGG_CELL_RENDERER_KEYS_MODE_X)
- accel_mods = event->state & GDK_MODIFIER_MASK & ~(ignored_modifiers);
- else
- g_assert_not_reached ();
-
- if (accel_mods == 0 && accel_keyval == GDK_Escape)
- goto out; /* cancel */
-
- /* clear the accelerator on Backspace */
- if (accel_mods == 0 && accel_keyval == GDK_BackSpace)
- {
- cleared = TRUE;
- goto out;
- }
-
- if (keys->accel_mode == EGG_CELL_RENDERER_KEYS_MODE_GTK)
- {
- if (!gtk_accelerator_valid (accel_keyval, accel_mods))
- {
- accel_keyval = 0;
- accel_mods = 0;
- }
- }
-
- edited = TRUE;
- out:
- gdk_keyboard_ungrab (event->time);
- gdk_pointer_ungrab (event->time);
-
- path = g_strdup (g_object_get_data (G_OBJECT (keys->edit_widget), EGG_CELL_RENDERER_TEXT_PATH));
-
- gtk_cell_editable_editing_done (GTK_CELL_EDITABLE (keys->edit_widget));
- gtk_cell_editable_remove_widget (GTK_CELL_EDITABLE (keys->edit_widget));
- keys->edit_widget = NULL;
- keys->grab_widget = NULL;
-
- if (edited)
- {
- g_signal_emit_by_name (G_OBJECT (keys), "accel_edited", path,
- accel_keyval, accel_mods, event->hardware_keycode);
- }
- else if (cleared)
- {
- g_signal_emit_by_name (G_OBJECT (keys), "accel_cleared", path);
- }
-
- g_free (path);
- return TRUE;
-}
-
-static void
-ungrab_stuff (GtkWidget *widget, gpointer data)
-{
- EggCellRendererKeys *keys = EGG_CELL_RENDERER_KEYS (data);
-
- gdk_keyboard_ungrab (GDK_CURRENT_TIME);
- gdk_pointer_ungrab (GDK_CURRENT_TIME);
-
- g_signal_handlers_disconnect_by_func (G_OBJECT (keys->grab_widget),
- G_CALLBACK (grab_key_callback), data);
-}
-
-static void
-pointless_eventbox_start_editing (GtkCellEditable *cell_editable,
- GdkEvent *event)
-{
- /* do nothing, because we are pointless */
-}
-
-static void
-pointless_eventbox_cell_editable_init (GtkCellEditableIface *iface)
-{
- iface->start_editing = pointless_eventbox_start_editing;
-}
-
-static GType
-pointless_eventbox_subclass_get_type (void)
-{
- static GType eventbox_type = 0;
-
- if (!eventbox_type)
- {
- static const GTypeInfo eventbox_info =
- {
- sizeof (GtkEventBoxClass),
- NULL, /* base_init */
- NULL, /* base_finalize */
- NULL,
- NULL, /* class_finalize */
- NULL, /* class_data */
- sizeof (GtkEventBox),
- 0, /* n_preallocs */
- (GInstanceInitFunc) NULL,
- };
-
- static const GInterfaceInfo cell_editable_info = {
- (GInterfaceInitFunc) pointless_eventbox_cell_editable_init,
- NULL, NULL };
-
- eventbox_type = g_type_register_static (GTK_TYPE_EVENT_BOX, "EggCellEditableEventBox", &eventbox_info, 0);
-
- g_type_add_interface_static (eventbox_type,
- GTK_TYPE_CELL_EDITABLE,
- &cell_editable_info);
- }
-
- return eventbox_type;
-}
-
-static GtkCellEditable *
-egg_cell_renderer_keys_start_editing (GtkCellRenderer *cell,
- GdkEvent *event,
- GtkWidget *widget,
- const gchar *path,
- GdkRectangle *background_area,
- GdkRectangle *cell_area,
- GtkCellRendererState flags)
-{
- GtkCellRendererText *celltext;
- EggCellRendererKeys *keys;
- GtkWidget *label;
- GtkWidget *eventbox;
-
- celltext = GTK_CELL_RENDERER_TEXT (cell);
- keys = EGG_CELL_RENDERER_KEYS (cell);
-
- /* If the cell isn't editable we return NULL. */
- if (celltext->editable == FALSE)
- return NULL;
-
- g_return_val_if_fail (widget->window != NULL, NULL);
-
- if (gdk_keyboard_grab (widget->window, FALSE,
- gdk_event_get_time (event)) != GDK_GRAB_SUCCESS)
- return NULL;
-
- if (gdk_pointer_grab (widget->window, FALSE,
- GDK_BUTTON_PRESS_MASK,
- NULL, NULL,
- gdk_event_get_time (event)) != GDK_GRAB_SUCCESS)
- {
- gdk_keyboard_ungrab (gdk_event_get_time (event));
- return NULL;
- }
-
- keys->grab_widget = widget;
-
- g_signal_connect (G_OBJECT (widget), "key_press_event",
- G_CALLBACK (grab_key_callback),
- keys);
-
- eventbox = g_object_new (pointless_eventbox_subclass_get_type (),
- NULL);
- keys->edit_widget = eventbox;
- g_object_add_weak_pointer (G_OBJECT (keys->edit_widget),
- (void**) &keys->edit_widget);
-
- label = gtk_label_new (NULL);
- gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
-
- gtk_widget_modify_bg (eventbox, GTK_STATE_NORMAL,
- &widget->style->bg[GTK_STATE_SELECTED]);
-
- gtk_widget_modify_fg (label, GTK_STATE_NORMAL,
- &widget->style->fg[GTK_STATE_SELECTED]);
-
- gtk_label_set_text (GTK_LABEL (label),
- TOOLTIP_TEXT);
-
- gtk_container_add (GTK_CONTAINER (eventbox), label);
-
- g_object_set_data_full (G_OBJECT (keys->edit_widget), EGG_CELL_RENDERER_TEXT_PATH,
- g_strdup (path), g_free);
-
- gtk_widget_show_all (keys->edit_widget);
-
- g_signal_connect (G_OBJECT (keys->edit_widget), "unrealize",
- G_CALLBACK (ungrab_stuff), keys);
-
- keys->edit_key = keys->accel_key;
-
- return GTK_CELL_EDITABLE (keys->edit_widget);
-}
-
-void
-egg_cell_renderer_keys_set_accelerator (EggCellRendererKeys *keys,
- guint keyval,
- guint keycode,
- EggVirtualModifierType mask)
-{
- char *text;
- gboolean changed;
- GtkCellRendererText *celltext;
-
- g_return_if_fail (EGG_IS_CELL_RENDERER_KEYS (keys));
-
- g_object_freeze_notify (G_OBJECT (keys));
-
- changed = FALSE;
-
- if (keyval != keys->accel_key)
- {
- keys->accel_key = keyval;
- g_object_notify (G_OBJECT (keys), "accel_key");
- changed = TRUE;
- }
-
- if (mask != keys->accel_mask)
- {
- keys->accel_mask = mask;
-
- g_object_notify (G_OBJECT (keys), "accel_mask");
- changed = TRUE;
- }
-
- if (keycode != keys->keycode)
- {
- keys->keycode = keycode;
-
- g_object_notify (G_OBJECT (keys), "keycode");
- changed = TRUE;
- }
- g_object_thaw_notify (G_OBJECT (keys));
-
- if (changed)
- {
- /* sync string to the key values */
- celltext = GTK_CELL_RENDERER_TEXT (keys);
- text = convert_keysym_state_to_string (keys->accel_key, keys->keycode, keys->accel_mask);
- g_object_set (keys, "text", text, NULL);
- g_free (text);
- }
-
-}
-
-void
-egg_cell_renderer_keys_get_accelerator (EggCellRendererKeys *keys,
- guint *keyval,
- EggVirtualModifierType *mask)
-{
- g_return_if_fail (EGG_IS_CELL_RENDERER_KEYS (keys));
-
- if (keyval)
- *keyval = keys->accel_key;
-
- if (mask)
- *mask = keys->accel_mask;
-}
-
-void
-egg_cell_renderer_keys_set_accel_mode (EggCellRendererKeys *keys,
- EggCellRendererKeysMode accel_mode)
-{
- g_return_if_fail (EGG_IS_CELL_RENDERER_KEYS (keys));
- keys->accel_mode = accel_mode;
- g_object_notify (G_OBJECT (keys), "accel_mode");
-}