use new X mode of the eggcellrendererkeys.

Fri Aug 23 00:15:47 2002  Jonathan Blandford  <jrb@gnome.org>

	* gnome-keybinding-properties.c (setup_dialog): use new X mode of
	the eggcellrendererkeys.

	* eggcellrendererkeys.[ch]: update from libegg.
This commit is contained in:
Jonathan Blandford 2002-08-23 05:03:16 +00:00 committed by Jonathan Blandford
parent 4be36ac469
commit dbfc16764d
4 changed files with 104 additions and 51 deletions

View file

@ -1,3 +1,10 @@
Fri Aug 23 00:15:47 2002 Jonathan Blandford <jrb@gnome.org>
* gnome-keybinding-properties.c (setup_dialog): use new X mode of
the eggcellrendererkeys.
* eggcellrendererkeys.[ch]: update from libegg.
2002-08-21 Glynn Foster <glynn.foster@sun.com> 2002-08-21 Glynn Foster <glynn.foster@sun.com>
* configure.in: Don't put dnl's in AC_OUTPUT. * configure.in: Don't put dnl's in AC_OUTPUT.

View file

@ -50,9 +50,9 @@ static void egg_cell_renderer_keys_get_size (GtkCellRenderer *cell,
enum { enum {
PROP_0, PROP_0,
/* FIXME make names consistent with something else */
PROP_ACCEL_KEY, PROP_ACCEL_KEY,
PROP_ACCEL_MASK PROP_ACCEL_MASK,
PROP_ACCEL_MODE
}; };
static GtkCellRendererTextClass *parent_class = NULL; static GtkCellRendererTextClass *parent_class = NULL;
@ -86,6 +86,7 @@ egg_cell_renderer_keys_get_type (void)
static void static void
egg_cell_renderer_keys_init (EggCellRendererKeys *cell_keys) egg_cell_renderer_keys_init (EggCellRendererKeys *cell_keys)
{ {
cell_keys->accel_mode = EGG_CELL_RENDERER_KEYS_MODE_GTK;
} }
/* FIXME setup stuff to generate this */ /* FIXME setup stuff to generate this */
@ -153,6 +154,16 @@ egg_cell_renderer_keys_class_init (EggCellRendererKeysClass *cell_keys_class)
* to match whatever the GTK convention is * 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, g_object_class_install_property (object_class,
PROP_ACCEL_MASK, PROP_ACCEL_MASK,
g_param_spec_flags ("accel_mask", g_param_spec_flags ("accel_mask",
@ -162,13 +173,14 @@ egg_cell_renderer_keys_class_init (EggCellRendererKeysClass *cell_keys_class)
0, 0,
G_PARAM_READABLE | G_PARAM_WRITABLE)); G_PARAM_READABLE | G_PARAM_WRITABLE));
/* FIXME: Register the enum when moving to GTK+ */
g_object_class_install_property (object_class, g_object_class_install_property (object_class,
PROP_ACCEL_KEY, PROP_ACCEL_MODE,
g_param_spec_uint ("accel_key", g_param_spec_int ("accel_mode",
_("Accelerator key"), _("Accel Mode"),
_("Accelerator key"), _("The type of accelerator."),
0, 0,
G_MAXINT, 2,
0, 0,
G_PARAM_READABLE | G_PARAM_WRITABLE)); G_PARAM_READABLE | G_PARAM_WRITABLE));
@ -201,20 +213,12 @@ egg_cell_renderer_keys_finalize (GObject *object)
static gchar * static gchar *
convert_keysym_state_to_string (guint keysym, convert_keysym_state_to_string (guint keysym,
GdkModifierType state) EggVirtualModifierType mask)
{ {
if (keysym == 0) if (keysym == 0)
return g_strdup (_("Disabled")); return g_strdup (_("Disabled"));
else else
{ return egg_virtual_accelerator_name (keysym, mask);
EggVirtualModifierType virtual;
/* FIXME multihead */
egg_keymap_virtualize_modifiers (gdk_keymap_get_default (),
state, &virtual);
return egg_virtual_accelerator_name (keysym, virtual);
}
} }
static void static void
@ -239,6 +243,10 @@ egg_cell_renderer_keys_get_property (GObject *object,
g_value_set_flags (value, keys->accel_mask); g_value_set_flags (value, keys->accel_mask);
break; break;
case PROP_ACCEL_MODE:
g_value_set_int (value, keys->accel_mode);
break;
default: default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec); G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
} }
@ -270,6 +278,10 @@ egg_cell_renderer_keys_set_property (GObject *object,
g_value_get_flags (value)); g_value_get_flags (value));
break; break;
case PROP_ACCEL_MODE:
egg_cell_renderer_keys_set_accel_mode (keys, g_value_get_int (value));
break;
default: default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec); G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec);
} }
@ -326,6 +338,9 @@ egg_cell_renderer_keys_get_size (GtkCellRenderer *cell,
*height = MAX (*height, requisition.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 static gboolean
grab_key_callback (GtkWidget *widget, grab_key_callback (GtkWidget *widget,
@ -357,13 +372,16 @@ grab_key_callback (GtkWidget *widget,
upper = event->keyval; upper = event->keyval;
accel_keyval = gdk_keyval_to_lower (upper); 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. /* Put shift back if it changed the case of the key, not otherwise.
*/ */
if (upper != accel_keyval && if (upper != accel_keyval &&
(consumed_modifiers & GDK_SHIFT_MASK)) (consumed_modifiers & GDK_SHIFT_MASK))
{ {
accel_mods |= GDK_SHIFT_MASK;
consumed_modifiers &= ~(GDK_SHIFT_MASK); consumed_modifiers &= ~(GDK_SHIFT_MASK);
} }
@ -373,7 +391,13 @@ grab_key_callback (GtkWidget *widget,
&ignored_modifiers); &ignored_modifiers);
/* filter consumed/ignored modifiers */ /* filter consumed/ignored modifiers */
if (keys->accel_mode == EGG_CELL_RENDERER_KEYS_MODE_GTK)
accel_mods = event->state & ~(consumed_modifiers | ignored_modifiers); accel_mods = event->state & ~(consumed_modifiers | ignored_modifiers);
else if (keys->accel_mode == EGG_CELL_RENDERER_KEYS_MODE_X)
accel_mods = event->state & ~(ignored_modifiers);
else
g_assert_not_reached ();
if (accel_mods == 0 && accel_keyval == GDK_Escape) if (accel_mods == 0 && accel_keyval == GDK_Escape)
goto out; /* cancel */ goto out; /* cancel */
@ -384,14 +408,19 @@ grab_key_callback (GtkWidget *widget,
accel_keyval == GDK_BackSpace) accel_keyval == GDK_BackSpace)
accel_keyval = 0; accel_keyval = 0;
if (keys->accel_mode == EGG_CELL_RENDERER_KEYS_MODE_GTK)
{
if (!gtk_accelerator_valid (accel_keyval, accel_mods)) if (!gtk_accelerator_valid (accel_keyval, accel_mods))
{ {
accel_keyval = 0; accel_keyval = 0;
accel_mods = 0; accel_mods = 0;
} }
edited = TRUE; /* Remove modifiers like super and hyper, as GTK+ ignores them. */
accel_mods = accel_mods & GDK_MODIFIER_MASK;
}
edited = TRUE;
out: out:
path = g_strdup (g_object_get_data (G_OBJECT (keys->edit_widget), path = g_strdup (g_object_get_data (G_OBJECT (keys->edit_widget),
EGG_CELL_RENDERER_TEXT_PATH)); EGG_CELL_RENDERER_TEXT_PATH));
@ -547,7 +576,6 @@ egg_cell_renderer_keys_start_editing (GtkCellRenderer *cell,
G_CALLBACK (ungrab_stuff), keys); G_CALLBACK (ungrab_stuff), keys);
keys->edit_key = keys->accel_key; keys->edit_key = keys->accel_key;
keys->edit_mask = keys->accel_mask;
return GTK_CELL_EDITABLE (keys->edit_widget); return GTK_CELL_EDITABLE (keys->edit_widget);
} }
@ -593,7 +621,6 @@ egg_cell_renderer_keys_set_accelerator (EggCellRendererKeys *keys,
} }
void void
egg_cell_renderer_keys_get_accelerator (EggCellRendererKeys *keys, egg_cell_renderer_keys_get_accelerator (EggCellRendererKeys *keys,
guint *keyval, guint *keyval,
@ -607,3 +634,12 @@ egg_cell_renderer_keys_get_accelerator (EggCellRendererKeys *keys,
if (mask) if (mask)
*mask = keys->accel_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");
}

View file

@ -21,6 +21,7 @@
#define __EGG_CELL_RENDERER_KEYS_H__ #define __EGG_CELL_RENDERER_KEYS_H__
#include <gtk/gtkcellrenderertext.h> #include <gtk/gtkcellrenderertext.h>
#include "eggaccelerators.h"
G_BEGIN_DECLS G_BEGIN_DECLS
@ -34,16 +35,23 @@ G_BEGIN_DECLS
typedef struct _EggCellRendererKeys EggCellRendererKeys; typedef struct _EggCellRendererKeys EggCellRendererKeys;
typedef struct _EggCellRendererKeysClass EggCellRendererKeysClass; typedef struct _EggCellRendererKeysClass EggCellRendererKeysClass;
typedef enum
{
EGG_CELL_RENDERER_KEYS_MODE_GTK,
EGG_CELL_RENDERER_KEYS_MODE_X,
} EggCellRendererKeysMode;
struct _EggCellRendererKeys struct _EggCellRendererKeys
{ {
GtkCellRendererText parent; GtkCellRendererText parent;
guint accel_key; guint accel_key;
GdkModifierType accel_mask; EggVirtualModifierType accel_mask;
GtkWidget *edit_widget; GtkWidget *edit_widget;
GtkWidget *grab_widget; GtkWidget *grab_widget;
guint edit_key; guint edit_key;
GdkModifierType edit_mask;
GtkWidget *sizing_label; GtkWidget *sizing_label;
EggCellRendererKeysMode accel_mode;
}; };
struct _EggCellRendererKeysClass struct _EggCellRendererKeysClass
@ -53,7 +61,7 @@ struct _EggCellRendererKeysClass
void (* keys_edited) (EggCellRendererKeys *keys, void (* keys_edited) (EggCellRendererKeys *keys,
const char *path_string, const char *path_string,
guint keyval, guint keyval,
GdkModifierType mask, EggVirtualModifierType mask,
guint hardware_keycode); guint hardware_keycode);
}; };
@ -62,12 +70,12 @@ GtkCellRenderer *egg_cell_renderer_keys_new (void);
void egg_cell_renderer_keys_set_accelerator (EggCellRendererKeys *keys, void egg_cell_renderer_keys_set_accelerator (EggCellRendererKeys *keys,
guint keyval, guint keyval,
GdkModifierType mask); EggVirtualModifierType mask);
void egg_cell_renderer_keys_get_accelerator (EggCellRendererKeys *keys, void egg_cell_renderer_keys_get_accelerator (EggCellRendererKeys *keys,
guint *keyval, guint *keyval,
GdkModifierType *mask); EggVirtualModifierType *mask);
void egg_cell_renderer_keys_set_accel_mode (EggCellRendererKeys *keys,
EggCellRendererKeysMode accel_mode);
G_END_DECLS G_END_DECLS

View file

@ -748,7 +748,9 @@ setup_dialog (GladeXML *dialog)
renderer = (GtkCellRenderer *) g_object_new (EGG_TYPE_CELL_RENDERER_KEYS, renderer = (GtkCellRenderer *) g_object_new (EGG_TYPE_CELL_RENDERER_KEYS,
"editable", TRUE, "editable", TRUE,
"accel_mode", EGG_CELL_RENDERER_KEYS_MODE_X,
NULL); NULL);
g_signal_connect (G_OBJECT (renderer), g_signal_connect (G_OBJECT (renderer),
"keys_edited", "keys_edited",
G_CALLBACK (accel_edited_callback), G_CALLBACK (accel_edited_callback),