Update to latest eggcellrendererkeys.

2002-05-06  Anders Carlsson  <andersca@gnu.org>

	* eggcellrendererkeys.c: (grab_key_callback), (ungrab_stuff),
	(pointless_eventbox_start_editing),
	(egg_cell_renderer_keys_start_editing):
	* eggcellrendererkeys.h:
	Update to latest eggcellrendererkeys.

	* gnome-keybinding-properties.c: (get_wm_name),
	(is_metacity_running), (update_wm_window),
	(wm_window_event_filter), (initialize_wm_handling),
	(binding_from_string), (accel_set_func), (keybinding_key_changed),
	(clear_old_model), (count_rows_foreach), (should_show_key),
	(append_keys_to_tree), (reload_key_entries),
	(key_entry_controlling_key_changed), (disable_collapsing_cb),
	(setup_dialog), (main):
	* gnome-keybinding-properties.glade:
	Hard-code the list of keybindings. Add Metacity keybindings
	and code for handling WM changes.
This commit is contained in:
Anders Carlsson 2002-05-05 23:04:45 +00:00 committed by Anders Carlsson
parent 0ea4906ae9
commit 0f67005a9c
5 changed files with 411 additions and 161 deletions

View file

@ -5,13 +5,17 @@
#include <gdk/gdkkeysyms.h>
#include "eggcellrendererkeys.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 USED_MODS (GDK_SHIFT_MASK | GDK_CONTROL_MASK | GDK_MOD1_MASK)
static void egg_cell_renderer_keys_finalize (GObject *object);
static void egg_cell_renderer_keys_init (EggCellRendererKeys *cell_keys);
@ -311,63 +315,71 @@ egg_cell_renderer_keys_get_size (GtkCellRenderer *cell,
}
static GdkFilterReturn
grab_key_filter (GdkXEvent *gdk_xevent, GdkEvent *event, gpointer data)
static gboolean
grab_key_callback (GtkWidget *widget,
GdkEventKey *event,
void *data)
{
XEvent *xevent = (XEvent *)gdk_xevent;
guint keycode, state;
char buf[10];
KeySym keysym;
GdkModifierType accel_mods;
guint accel_keyval;
EggCellRendererKeys *keys;
char *path;
gboolean edited;
if (xevent->type != KeyPress)
return GDK_FILTER_CONTINUE;
GdkModifierType consumed_modifiers;
keys = EGG_CELL_RENDERER_KEYS (data);
keycode = xevent->xkey.keycode;
if (is_modifier (keycode))
return GDK_FILTER_CONTINUE;
if (is_modifier (event->hardware_keycode))
return FALSE;
edited = 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);
accel_keyval = gdk_keyval_to_lower (event->keyval);
accel_mods = event->state & gtk_accelerator_get_default_mod_mask () & ~consumed_modifiers;
state = xevent->xkey.state & USED_MODS;
XLookupString ((XKeyEvent*)xevent, buf, sizeof (buf), &keysym, NULL);
if (state == 0 && keysym == GDK_Escape)
if (accel_mods == 0 && accel_keyval == GDK_Escape)
goto out; /* cancel */
/* clear the accelerator on Backspace */
if (keys->edit_key != 0 &&
state == 0 &&
keysym == GDK_BackSpace)
keysym = 0;
accel_mods == 0 &&
accel_keyval == GDK_BackSpace)
accel_keyval = 0;
if (!gtk_accelerator_valid (accel_keyval, accel_mods))
{
accel_keyval = 0;
accel_mods = 0;
}
edited = TRUE;
out:
path = g_strdup (g_object_get_data (G_OBJECT (keys->edit_widget),
EGG_CELL_RENDERER_TEXT_PATH));
gdk_keyboard_ungrab (xevent->xkey.time);
gdk_pointer_ungrab (xevent->xkey.time);
gdk_keyboard_ungrab (event->time);
gdk_pointer_ungrab (event->time);
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->filter_window = NULL;
keys->grab_widget = NULL;
if (edited)
g_signal_emit_by_name (G_OBJECT (keys), "keys_edited", path,
keysym, state);
accel_keyval, accel_mods);
g_free (path);
return GDK_FILTER_REMOVE;
return FALSE;
}
static void
@ -378,13 +390,13 @@ ungrab_stuff (GtkWidget *widget, gpointer data)
gdk_keyboard_ungrab (GDK_CURRENT_TIME);
gdk_pointer_ungrab (GDK_CURRENT_TIME);
gdk_window_remove_filter (keys->filter_window,
grab_key_filter, data);
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)
GdkEvent *event)
{
/* do nothing, because we are pointless */
}
@ -465,9 +477,11 @@ egg_cell_renderer_keys_start_editing (GtkCellRenderer *cell,
return NULL;
}
keys->filter_window = widget->window;
gdk_window_add_filter (keys->filter_window, grab_key_filter, keys);
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);