keybindings: convert capplet to a settings panel
Add a module and CcPanel implementation for keyboard shortcuts settings.
This commit is contained in:
parent
f112fc3a8e
commit
19b7502f5e
21 changed files with 560 additions and 92 deletions
|
@ -3,14 +3,12 @@ SUBDIRS = \
|
|||
accessibility \
|
||||
appearance \
|
||||
display \
|
||||
keybindings \
|
||||
windows
|
||||
|
||||
DIST_SUBDIRS = \
|
||||
common \
|
||||
accessibility \
|
||||
appearance \
|
||||
keybindings \
|
||||
windows \
|
||||
display \
|
||||
about-me
|
||||
|
|
|
@ -1,35 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<KeyListEntries _name="Sound">
|
||||
|
||||
<KeyListEntry
|
||||
name="/apps/gnome_settings_daemon/keybindings/volume_mute" />
|
||||
|
||||
<KeyListEntry
|
||||
name="/apps/gnome_settings_daemon/keybindings/volume_down" />
|
||||
|
||||
<KeyListEntry
|
||||
name="/apps/gnome_settings_daemon/keybindings/volume_up" />
|
||||
|
||||
<KeyListEntry
|
||||
name="/apps/gnome_settings_daemon/keybindings/media" />
|
||||
|
||||
<KeyListEntry
|
||||
name="/apps/gnome_settings_daemon/keybindings/play" />
|
||||
|
||||
<KeyListEntry
|
||||
name="/apps/gnome_settings_daemon/keybindings/pause" />
|
||||
|
||||
<KeyListEntry
|
||||
name="/apps/gnome_settings_daemon/keybindings/stop" />
|
||||
|
||||
<KeyListEntry
|
||||
name="/apps/gnome_settings_daemon/keybindings/previous" />
|
||||
|
||||
<KeyListEntry
|
||||
name="/apps/gnome_settings_daemon/keybindings/next" />
|
||||
|
||||
<KeyListEntry
|
||||
name="/apps/gnome_settings_daemon/keybindings/eject" />
|
||||
|
||||
</KeyListEntries>
|
||||
|
|
@ -1,29 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<KeyListEntries _name="Desktop">
|
||||
|
||||
<KeyListEntry
|
||||
name="/apps/gnome_settings_daemon/keybindings/help" />
|
||||
|
||||
<KeyListEntry
|
||||
name="/apps/gnome_settings_daemon/keybindings/calculator" />
|
||||
|
||||
<KeyListEntry
|
||||
name="/apps/gnome_settings_daemon/keybindings/email" />
|
||||
|
||||
<KeyListEntry
|
||||
name="/apps/gnome_settings_daemon/keybindings/www" />
|
||||
|
||||
<KeyListEntry
|
||||
name="/apps/gnome_settings_daemon/keybindings/power" />
|
||||
|
||||
<KeyListEntry
|
||||
name="/apps/gnome_settings_daemon/keybindings/screensaver" />
|
||||
|
||||
<KeyListEntry
|
||||
name="/apps/gnome_settings_daemon/keybindings/home" />
|
||||
|
||||
<KeyListEntry
|
||||
name="/apps/gnome_settings_daemon/keybindings/search" />
|
||||
|
||||
</KeyListEntries>
|
||||
|
|
@ -1,46 +0,0 @@
|
|||
# This is used in GNOMECC_CAPPLETS_CFLAGS
|
||||
cappletname = keybinding
|
||||
|
||||
bin_PROGRAMS = gnome-keybinding-properties
|
||||
|
||||
gnome_keybinding_properties_LDADD = $(GNOMECC_CAPPLETS_LIBS)
|
||||
gnome_keybinding_properties_SOURCES = \
|
||||
gnome-keybinding-properties.c \
|
||||
eggcellrendererkeys.c \
|
||||
eggcellrendererkeys.h \
|
||||
eggaccelerators.c \
|
||||
eggaccelerators.h
|
||||
|
||||
@INTLTOOL_DESKTOP_RULE@
|
||||
|
||||
uidir = $(pkgdatadir)/ui
|
||||
ui_DATA = gnome-keybinding-properties.ui
|
||||
|
||||
desktopdir = $(datadir)/applications
|
||||
Desktop_in_files = keybinding.desktop.in
|
||||
desktop_DATA = $(Desktop_in_files:.desktop.in=.desktop)
|
||||
|
||||
@INTLTOOL_XML_NOMERGE_RULE@
|
||||
|
||||
xmldir = $(pkgdatadir)/keybindings
|
||||
xml_in_files = 00-multimedia-key.xml.in 01-desktop-key.xml.in
|
||||
xml_DATA = $(xml_in_files:.xml.in=.xml)
|
||||
|
||||
pkgconfigdir = $(datadir)/pkgconfig
|
||||
pkgconfig_DATA = gnome-keybindings.pc
|
||||
|
||||
INCLUDES = \
|
||||
$(GNOMECC_CAPPLETS_CFLAGS) \
|
||||
-DGNOMELOCALEDIR="\"$(datadir)/locale\"" \
|
||||
-DGNOMECC_DATA_DIR="\"$(pkgdatadir)\"" \
|
||||
-DGNOMECC_UI_DIR="\"$(uidir)\"" \
|
||||
-DGNOMECC_KEYBINDINGS_DIR="\"$(pkgdatadir)/keybindings\""
|
||||
CLEANFILES = \
|
||||
$(GNOMECC_CAPPLETS_CLEANFILES) \
|
||||
$(Desktop_in_files) \
|
||||
$(desktop_DATA) \
|
||||
$(xml_DATA)
|
||||
EXTRA_DIST = $(ui_DATA) $(xml_in_files) gnome-keybindings.pc.in
|
||||
|
||||
|
||||
-include $(top_srcdir)/git.mk
|
|
@ -1,632 +0,0 @@
|
|||
/* eggaccelerators.c
|
||||
* Copyright (C) 2002 Red Hat, Inc.; Copyright 1998, 2001 Tim Janik
|
||||
* Developed by Havoc Pennington, Tim Janik
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Library General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Library General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Library General Public
|
||||
* License along with this library; if not, write to the
|
||||
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
* Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#include "eggaccelerators.h"
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <gdk/gdkx.h>
|
||||
#include <gdk/gdkkeysyms.h>
|
||||
#include <gtk/gtk.h>
|
||||
|
||||
enum
|
||||
{
|
||||
EGG_MODMAP_ENTRY_SHIFT = 0,
|
||||
EGG_MODMAP_ENTRY_LOCK = 1,
|
||||
EGG_MODMAP_ENTRY_CONTROL = 2,
|
||||
EGG_MODMAP_ENTRY_MOD1 = 3,
|
||||
EGG_MODMAP_ENTRY_MOD2 = 4,
|
||||
EGG_MODMAP_ENTRY_MOD3 = 5,
|
||||
EGG_MODMAP_ENTRY_MOD4 = 6,
|
||||
EGG_MODMAP_ENTRY_MOD5 = 7,
|
||||
EGG_MODMAP_ENTRY_LAST = 8
|
||||
};
|
||||
|
||||
#define MODMAP_ENTRY_TO_MODIFIER(x) (1 << (x))
|
||||
|
||||
typedef struct
|
||||
{
|
||||
EggVirtualModifierType mapping[EGG_MODMAP_ENTRY_LAST];
|
||||
|
||||
} EggModmap;
|
||||
|
||||
const EggModmap* egg_keymap_get_modmap (GdkKeymap *keymap);
|
||||
|
||||
static inline gboolean
|
||||
is_alt (const gchar *string)
|
||||
{
|
||||
return ((string[0] == '<') &&
|
||||
(string[1] == 'a' || string[1] == 'A') &&
|
||||
(string[2] == 'l' || string[2] == 'L') &&
|
||||
(string[3] == 't' || string[3] == 'T') &&
|
||||
(string[4] == '>'));
|
||||
}
|
||||
|
||||
static inline gboolean
|
||||
is_ctl (const gchar *string)
|
||||
{
|
||||
return ((string[0] == '<') &&
|
||||
(string[1] == 'c' || string[1] == 'C') &&
|
||||
(string[2] == 't' || string[2] == 'T') &&
|
||||
(string[3] == 'l' || string[3] == 'L') &&
|
||||
(string[4] == '>'));
|
||||
}
|
||||
|
||||
static inline gboolean
|
||||
is_modx (const gchar *string)
|
||||
{
|
||||
return ((string[0] == '<') &&
|
||||
(string[1] == 'm' || string[1] == 'M') &&
|
||||
(string[2] == 'o' || string[2] == 'O') &&
|
||||
(string[3] == 'd' || string[3] == 'D') &&
|
||||
(string[4] >= '1' && string[4] <= '5') &&
|
||||
(string[5] == '>'));
|
||||
}
|
||||
|
||||
static inline gboolean
|
||||
is_ctrl (const gchar *string)
|
||||
{
|
||||
return ((string[0] == '<') &&
|
||||
(string[1] == 'c' || string[1] == 'C') &&
|
||||
(string[2] == 't' || string[2] == 'T') &&
|
||||
(string[3] == 'r' || string[3] == 'R') &&
|
||||
(string[4] == 'l' || string[4] == 'L') &&
|
||||
(string[5] == '>'));
|
||||
}
|
||||
|
||||
static inline gboolean
|
||||
is_shft (const gchar *string)
|
||||
{
|
||||
return ((string[0] == '<') &&
|
||||
(string[1] == 's' || string[1] == 'S') &&
|
||||
(string[2] == 'h' || string[2] == 'H') &&
|
||||
(string[3] == 'f' || string[3] == 'F') &&
|
||||
(string[4] == 't' || string[4] == 'T') &&
|
||||
(string[5] == '>'));
|
||||
}
|
||||
|
||||
static inline gboolean
|
||||
is_shift (const gchar *string)
|
||||
{
|
||||
return ((string[0] == '<') &&
|
||||
(string[1] == 's' || string[1] == 'S') &&
|
||||
(string[2] == 'h' || string[2] == 'H') &&
|
||||
(string[3] == 'i' || string[3] == 'I') &&
|
||||
(string[4] == 'f' || string[4] == 'F') &&
|
||||
(string[5] == 't' || string[5] == 'T') &&
|
||||
(string[6] == '>'));
|
||||
}
|
||||
|
||||
static inline gboolean
|
||||
is_control (const gchar *string)
|
||||
{
|
||||
return ((string[0] == '<') &&
|
||||
(string[1] == 'c' || string[1] == 'C') &&
|
||||
(string[2] == 'o' || string[2] == 'O') &&
|
||||
(string[3] == 'n' || string[3] == 'N') &&
|
||||
(string[4] == 't' || string[4] == 'T') &&
|
||||
(string[5] == 'r' || string[5] == 'R') &&
|
||||
(string[6] == 'o' || string[6] == 'O') &&
|
||||
(string[7] == 'l' || string[7] == 'L') &&
|
||||
(string[8] == '>'));
|
||||
}
|
||||
|
||||
static inline gboolean
|
||||
is_release (const gchar *string)
|
||||
{
|
||||
return ((string[0] == '<') &&
|
||||
(string[1] == 'r' || string[1] == 'R') &&
|
||||
(string[2] == 'e' || string[2] == 'E') &&
|
||||
(string[3] == 'l' || string[3] == 'L') &&
|
||||
(string[4] == 'e' || string[4] == 'E') &&
|
||||
(string[5] == 'a' || string[5] == 'A') &&
|
||||
(string[6] == 's' || string[6] == 'S') &&
|
||||
(string[7] == 'e' || string[7] == 'E') &&
|
||||
(string[8] == '>'));
|
||||
}
|
||||
|
||||
static inline gboolean
|
||||
is_meta (const gchar *string)
|
||||
{
|
||||
return ((string[0] == '<') &&
|
||||
(string[1] == 'm' || string[1] == 'M') &&
|
||||
(string[2] == 'e' || string[2] == 'E') &&
|
||||
(string[3] == 't' || string[3] == 'T') &&
|
||||
(string[4] == 'a' || string[4] == 'A') &&
|
||||
(string[5] == '>'));
|
||||
}
|
||||
|
||||
static inline gboolean
|
||||
is_super (const gchar *string)
|
||||
{
|
||||
return ((string[0] == '<') &&
|
||||
(string[1] == 's' || string[1] == 'S') &&
|
||||
(string[2] == 'u' || string[2] == 'U') &&
|
||||
(string[3] == 'p' || string[3] == 'P') &&
|
||||
(string[4] == 'e' || string[4] == 'E') &&
|
||||
(string[5] == 'r' || string[5] == 'R') &&
|
||||
(string[6] == '>'));
|
||||
}
|
||||
|
||||
static inline gboolean
|
||||
is_hyper (const gchar *string)
|
||||
{
|
||||
return ((string[0] == '<') &&
|
||||
(string[1] == 'h' || string[1] == 'H') &&
|
||||
(string[2] == 'y' || string[2] == 'Y') &&
|
||||
(string[3] == 'p' || string[3] == 'P') &&
|
||||
(string[4] == 'e' || string[4] == 'E') &&
|
||||
(string[5] == 'r' || string[5] == 'R') &&
|
||||
(string[6] == '>'));
|
||||
}
|
||||
|
||||
static inline gboolean
|
||||
is_keycode (const gchar *string)
|
||||
{
|
||||
return ((string[0] == '0') &&
|
||||
(string[1] == 'x'));
|
||||
}
|
||||
|
||||
/**
|
||||
* egg_accelerator_parse_virtual:
|
||||
* @accelerator: string representing an accelerator
|
||||
* @accelerator_key: return location for accelerator keyval
|
||||
* @accelerator_mods: return location for accelerator modifier mask
|
||||
*
|
||||
* Parses a string representing a virtual accelerator. The format
|
||||
* looks like "<Control>a" or "<Shift><Alt>F1" or
|
||||
* "<Release>z" (the last one is for key release). The parser
|
||||
* is fairly liberal and allows lower or upper case, and also
|
||||
* abbreviations such as "<Ctl>" and "<Ctrl>".
|
||||
*
|
||||
* If the parse fails, @accelerator_key and @accelerator_mods will
|
||||
* be set to 0 (zero) and %FALSE will be returned. If the string contains
|
||||
* only modifiers, @accelerator_key will be set to 0 but %TRUE will be
|
||||
* returned.
|
||||
*
|
||||
* The virtual vs. concrete accelerator distinction is a relic of
|
||||
* how the X Window System works; there are modifiers Mod2-Mod5 that
|
||||
* can represent various keyboard keys (numlock, meta, hyper, etc.),
|
||||
* the virtual modifier represents the keyboard key, the concrete
|
||||
* modifier the actual Mod2-Mod5 bits in the key press event.
|
||||
*
|
||||
* Returns: %TRUE on success.
|
||||
*/
|
||||
gboolean
|
||||
egg_accelerator_parse_virtual (const gchar *accelerator,
|
||||
guint *accelerator_key,
|
||||
guint *keycode,
|
||||
EggVirtualModifierType *accelerator_mods)
|
||||
{
|
||||
guint keyval;
|
||||
GdkModifierType mods;
|
||||
gint len;
|
||||
gboolean bad_keyval;
|
||||
|
||||
if (accelerator_key)
|
||||
*accelerator_key = 0;
|
||||
if (accelerator_mods)
|
||||
*accelerator_mods = 0;
|
||||
if (keycode)
|
||||
*keycode = 0;
|
||||
|
||||
g_return_val_if_fail (accelerator != NULL, FALSE);
|
||||
|
||||
bad_keyval = FALSE;
|
||||
|
||||
keyval = 0;
|
||||
mods = 0;
|
||||
len = strlen (accelerator);
|
||||
while (len)
|
||||
{
|
||||
if (*accelerator == '<')
|
||||
{
|
||||
if (len >= 9 && is_release (accelerator))
|
||||
{
|
||||
accelerator += 9;
|
||||
len -= 9;
|
||||
mods |= EGG_VIRTUAL_RELEASE_MASK;
|
||||
}
|
||||
else if (len >= 9 && is_control (accelerator))
|
||||
{
|
||||
accelerator += 9;
|
||||
len -= 9;
|
||||
mods |= EGG_VIRTUAL_CONTROL_MASK;
|
||||
}
|
||||
else if (len >= 7 && is_shift (accelerator))
|
||||
{
|
||||
accelerator += 7;
|
||||
len -= 7;
|
||||
mods |= EGG_VIRTUAL_SHIFT_MASK;
|
||||
}
|
||||
else if (len >= 6 && is_shft (accelerator))
|
||||
{
|
||||
accelerator += 6;
|
||||
len -= 6;
|
||||
mods |= EGG_VIRTUAL_SHIFT_MASK;
|
||||
}
|
||||
else if (len >= 6 && is_ctrl (accelerator))
|
||||
{
|
||||
accelerator += 6;
|
||||
len -= 6;
|
||||
mods |= EGG_VIRTUAL_CONTROL_MASK;
|
||||
}
|
||||
else if (len >= 6 && is_modx (accelerator))
|
||||
{
|
||||
static const guint mod_vals[] = {
|
||||
EGG_VIRTUAL_ALT_MASK, EGG_VIRTUAL_MOD2_MASK, EGG_VIRTUAL_MOD3_MASK,
|
||||
EGG_VIRTUAL_MOD4_MASK, EGG_VIRTUAL_MOD5_MASK
|
||||
};
|
||||
|
||||
len -= 6;
|
||||
accelerator += 4;
|
||||
mods |= mod_vals[*accelerator - '1'];
|
||||
accelerator += 2;
|
||||
}
|
||||
else if (len >= 5 && is_ctl (accelerator))
|
||||
{
|
||||
accelerator += 5;
|
||||
len -= 5;
|
||||
mods |= EGG_VIRTUAL_CONTROL_MASK;
|
||||
}
|
||||
else if (len >= 5 && is_alt (accelerator))
|
||||
{
|
||||
accelerator += 5;
|
||||
len -= 5;
|
||||
mods |= EGG_VIRTUAL_ALT_MASK;
|
||||
}
|
||||
else if (len >= 6 && is_meta (accelerator))
|
||||
{
|
||||
accelerator += 6;
|
||||
len -= 6;
|
||||
mods |= EGG_VIRTUAL_META_MASK;
|
||||
}
|
||||
else if (len >= 7 && is_hyper (accelerator))
|
||||
{
|
||||
accelerator += 7;
|
||||
len -= 7;
|
||||
mods |= EGG_VIRTUAL_HYPER_MASK;
|
||||
}
|
||||
else if (len >= 7 && is_super (accelerator))
|
||||
{
|
||||
accelerator += 7;
|
||||
len -= 7;
|
||||
mods |= EGG_VIRTUAL_SUPER_MASK;
|
||||
}
|
||||
else
|
||||
{
|
||||
gchar last_ch;
|
||||
|
||||
last_ch = *accelerator;
|
||||
while (last_ch && last_ch != '>')
|
||||
{
|
||||
last_ch = *accelerator;
|
||||
accelerator += 1;
|
||||
len -= 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
keyval = gdk_keyval_from_name (accelerator);
|
||||
|
||||
if (keyval == 0)
|
||||
{
|
||||
/* If keyval is 0, then maybe it's a keycode. Check for 0x## */
|
||||
if (len >= 4 && is_keycode (accelerator))
|
||||
{
|
||||
char keystring[5];
|
||||
gchar *endptr;
|
||||
gint tmp_keycode;
|
||||
|
||||
memcpy (keystring, accelerator, 4);
|
||||
keystring [4] = '\000';
|
||||
|
||||
tmp_keycode = strtol (keystring, &endptr, 16);
|
||||
|
||||
if (endptr == NULL || *endptr != '\000')
|
||||
{
|
||||
bad_keyval = TRUE;
|
||||
}
|
||||
else if (keycode != NULL)
|
||||
{
|
||||
*keycode = tmp_keycode;
|
||||
/* 0x00 is an invalid keycode too. */
|
||||
if (*keycode == 0)
|
||||
bad_keyval = TRUE;
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (keycode != NULL)
|
||||
{
|
||||
*keycode = XKeysymToKeycode (GDK_DISPLAY(), keyval);
|
||||
if (*keycode == 0)
|
||||
bad_keyval = TRUE;
|
||||
}
|
||||
|
||||
accelerator += len;
|
||||
len -= len;
|
||||
}
|
||||
}
|
||||
|
||||
if (accelerator_key)
|
||||
*accelerator_key = gdk_keyval_to_lower (keyval);
|
||||
if (accelerator_mods)
|
||||
*accelerator_mods = mods;
|
||||
|
||||
return !bad_keyval;
|
||||
}
|
||||
|
||||
/**
|
||||
* egg_virtual_accelerator_name:
|
||||
* @accelerator_key: accelerator keyval
|
||||
* @accelerator_mods: accelerator modifier mask
|
||||
* @returns: a newly-allocated accelerator name
|
||||
*
|
||||
* Converts an accelerator keyval and modifier mask
|
||||
* into a string parseable by egg_accelerator_parse_virtual().
|
||||
* For example, if you pass in #GDK_q and #EGG_VIRTUAL_CONTROL_MASK,
|
||||
* this function returns "<Control>q".
|
||||
*
|
||||
* The caller of this function must free the returned string.
|
||||
*/
|
||||
gchar*
|
||||
egg_virtual_accelerator_name (guint accelerator_key,
|
||||
guint keycode,
|
||||
EggVirtualModifierType accelerator_mods)
|
||||
{
|
||||
gchar *gtk_name;
|
||||
GdkModifierType gdkmods = 0;
|
||||
|
||||
egg_keymap_resolve_virtual_modifiers (NULL, accelerator_mods, &gdkmods);
|
||||
gtk_name = gtk_accelerator_name (accelerator_key, gdkmods);
|
||||
|
||||
if (!accelerator_key)
|
||||
{
|
||||
gchar *name;
|
||||
name = g_strdup_printf ("%s0x%02x", gtk_name, keycode);
|
||||
g_free (gtk_name);
|
||||
return name;
|
||||
}
|
||||
|
||||
return gtk_name;
|
||||
}
|
||||
|
||||
/**
|
||||
* egg_virtual_accelerator_label:
|
||||
* @accelerator_key: accelerator keyval
|
||||
* @accelerator_mods: accelerator modifier mask
|
||||
* @returns: a newly-allocated accelerator label
|
||||
*
|
||||
* Converts an accelerator keyval and modifier mask
|
||||
* into a (possibly translated) string that can be displayed to
|
||||
* a user.
|
||||
* For example, if you pass in #GDK_q and #EGG_VIRTUAL_CONTROL_MASK,
|
||||
* and you use a German locale, this function returns "Strg+Q".
|
||||
*
|
||||
* The caller of this function must free the returned string.
|
||||
*/
|
||||
gchar*
|
||||
egg_virtual_accelerator_label (guint accelerator_key,
|
||||
guint keycode,
|
||||
EggVirtualModifierType accelerator_mods)
|
||||
{
|
||||
gchar *gtk_label;
|
||||
GdkModifierType gdkmods = 0;
|
||||
|
||||
egg_keymap_resolve_virtual_modifiers (NULL, accelerator_mods, &gdkmods);
|
||||
gtk_label = gtk_accelerator_get_label (accelerator_key, gdkmods);
|
||||
|
||||
if (!accelerator_key)
|
||||
{
|
||||
gchar *label;
|
||||
label = g_strdup_printf ("%s0x%02x", gtk_label, keycode);
|
||||
g_free (gtk_label);
|
||||
return label;
|
||||
}
|
||||
|
||||
return gtk_label;
|
||||
}
|
||||
|
||||
void
|
||||
egg_keymap_resolve_virtual_modifiers (GdkKeymap *keymap,
|
||||
EggVirtualModifierType virtual_mods,
|
||||
GdkModifierType *concrete_mods)
|
||||
{
|
||||
GdkModifierType concrete;
|
||||
int i;
|
||||
const EggModmap *modmap;
|
||||
|
||||
g_return_if_fail (concrete_mods != NULL);
|
||||
g_return_if_fail (keymap == NULL || GDK_IS_KEYMAP (keymap));
|
||||
|
||||
modmap = egg_keymap_get_modmap (keymap);
|
||||
|
||||
/* Not so sure about this algorithm. */
|
||||
|
||||
concrete = 0;
|
||||
for (i = 0; i < EGG_MODMAP_ENTRY_LAST; ++i)
|
||||
{
|
||||
if (modmap->mapping[i] & virtual_mods)
|
||||
concrete |= MODMAP_ENTRY_TO_MODIFIER (i);
|
||||
}
|
||||
|
||||
*concrete_mods = concrete;
|
||||
}
|
||||
|
||||
void
|
||||
egg_keymap_virtualize_modifiers (GdkKeymap *keymap,
|
||||
GdkModifierType concrete_mods,
|
||||
EggVirtualModifierType *virtual_mods)
|
||||
{
|
||||
GdkModifierType virtual;
|
||||
int i;
|
||||
const EggModmap *modmap;
|
||||
|
||||
g_return_if_fail (virtual_mods != NULL);
|
||||
g_return_if_fail (keymap == NULL || GDK_IS_KEYMAP (keymap));
|
||||
|
||||
modmap = egg_keymap_get_modmap (keymap);
|
||||
|
||||
/* Not so sure about this algorithm. */
|
||||
|
||||
virtual = 0;
|
||||
for (i = 0; i < EGG_MODMAP_ENTRY_LAST; ++i)
|
||||
{
|
||||
if (MODMAP_ENTRY_TO_MODIFIER (i) & concrete_mods)
|
||||
{
|
||||
EggVirtualModifierType cleaned;
|
||||
|
||||
cleaned = modmap->mapping[i] & ~(EGG_VIRTUAL_MOD2_MASK |
|
||||
EGG_VIRTUAL_MOD3_MASK |
|
||||
EGG_VIRTUAL_MOD4_MASK |
|
||||
EGG_VIRTUAL_MOD5_MASK);
|
||||
|
||||
if (cleaned != 0)
|
||||
{
|
||||
virtual |= cleaned;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Rather than dropping mod2->mod5 if not bound,
|
||||
* go ahead and use the concrete names
|
||||
*/
|
||||
virtual |= modmap->mapping[i];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
*virtual_mods = virtual;
|
||||
}
|
||||
|
||||
static void
|
||||
reload_modmap (GdkKeymap *keymap,
|
||||
EggModmap *modmap)
|
||||
{
|
||||
XModifierKeymap *xmodmap;
|
||||
int map_size;
|
||||
int i;
|
||||
|
||||
/* FIXME multihead */
|
||||
xmodmap = XGetModifierMapping (gdk_x11_get_default_xdisplay ());
|
||||
|
||||
memset (modmap->mapping, 0, sizeof (modmap->mapping));
|
||||
|
||||
/* there are 8 modifiers in the order shift, shift lock,
|
||||
* control, mod1-5 with up to max_keypermod bindings each
|
||||
*/
|
||||
map_size = 8 * xmodmap->max_keypermod;
|
||||
for (i = 3 * xmodmap->max_keypermod; i < map_size; ++i)
|
||||
{
|
||||
/* get the key code at this point in the map,
|
||||
* see if its keysym is one we're interested in
|
||||
*/
|
||||
int keycode = xmodmap->modifiermap[i];
|
||||
GdkKeymapKey *keys;
|
||||
guint *keyvals;
|
||||
int n_entries;
|
||||
int j;
|
||||
EggVirtualModifierType mask;
|
||||
|
||||
keys = NULL;
|
||||
keyvals = NULL;
|
||||
n_entries = 0;
|
||||
|
||||
gdk_keymap_get_entries_for_keycode (keymap,
|
||||
keycode,
|
||||
&keys, &keyvals, &n_entries);
|
||||
|
||||
mask = 0;
|
||||
for (j = 0; j < n_entries; ++j)
|
||||
{
|
||||
if (keyvals[j] == GDK_Num_Lock)
|
||||
mask |= EGG_VIRTUAL_NUM_LOCK_MASK;
|
||||
else if (keyvals[j] == GDK_Scroll_Lock)
|
||||
mask |= EGG_VIRTUAL_SCROLL_LOCK_MASK;
|
||||
else if (keyvals[j] == GDK_Meta_L ||
|
||||
keyvals[j] == GDK_Meta_R)
|
||||
mask |= EGG_VIRTUAL_META_MASK;
|
||||
else if (keyvals[j] == GDK_Hyper_L ||
|
||||
keyvals[j] == GDK_Hyper_R)
|
||||
mask |= EGG_VIRTUAL_HYPER_MASK;
|
||||
else if (keyvals[j] == GDK_Super_L ||
|
||||
keyvals[j] == GDK_Super_R)
|
||||
mask |= EGG_VIRTUAL_SUPER_MASK;
|
||||
else if (keyvals[j] == GDK_Mode_switch)
|
||||
mask |= EGG_VIRTUAL_MODE_SWITCH_MASK;
|
||||
}
|
||||
|
||||
/* Mod1Mask is 1 << 3 for example, i.e. the
|
||||
* fourth modifier, i / keyspermod is the modifier
|
||||
* index
|
||||
*/
|
||||
modmap->mapping[i/xmodmap->max_keypermod] |= mask;
|
||||
|
||||
g_free (keyvals);
|
||||
g_free (keys);
|
||||
}
|
||||
|
||||
/* Add in the not-really-virtual fixed entries */
|
||||
modmap->mapping[EGG_MODMAP_ENTRY_SHIFT] |= EGG_VIRTUAL_SHIFT_MASK;
|
||||
modmap->mapping[EGG_MODMAP_ENTRY_CONTROL] |= EGG_VIRTUAL_CONTROL_MASK;
|
||||
modmap->mapping[EGG_MODMAP_ENTRY_LOCK] |= EGG_VIRTUAL_LOCK_MASK;
|
||||
modmap->mapping[EGG_MODMAP_ENTRY_MOD1] |= EGG_VIRTUAL_ALT_MASK;
|
||||
modmap->mapping[EGG_MODMAP_ENTRY_MOD2] |= EGG_VIRTUAL_MOD2_MASK;
|
||||
modmap->mapping[EGG_MODMAP_ENTRY_MOD3] |= EGG_VIRTUAL_MOD3_MASK;
|
||||
modmap->mapping[EGG_MODMAP_ENTRY_MOD4] |= EGG_VIRTUAL_MOD4_MASK;
|
||||
modmap->mapping[EGG_MODMAP_ENTRY_MOD5] |= EGG_VIRTUAL_MOD5_MASK;
|
||||
|
||||
XFreeModifiermap (xmodmap);
|
||||
}
|
||||
|
||||
const EggModmap*
|
||||
egg_keymap_get_modmap (GdkKeymap *keymap)
|
||||
{
|
||||
EggModmap *modmap;
|
||||
|
||||
if (keymap == NULL)
|
||||
keymap = gdk_keymap_get_default ();
|
||||
|
||||
/* This is all a hack, much simpler when we can just
|
||||
* modify GDK directly.
|
||||
*/
|
||||
|
||||
modmap = g_object_get_data (G_OBJECT (keymap), "egg-modmap");
|
||||
|
||||
if (modmap == NULL)
|
||||
{
|
||||
modmap = g_new0 (EggModmap, 1);
|
||||
|
||||
/* FIXME modify keymap change events with an event filter
|
||||
* and force a reload if we get one
|
||||
*/
|
||||
|
||||
reload_modmap (keymap, modmap);
|
||||
|
||||
g_object_set_data_full (G_OBJECT (keymap),
|
||||
"egg-modmap",
|
||||
modmap,
|
||||
g_free);
|
||||
}
|
||||
|
||||
g_assert (modmap != NULL);
|
||||
|
||||
return modmap;
|
||||
}
|
|
@ -1,95 +0,0 @@
|
|||
/* eggaccelerators.h
|
||||
* Copyright (C) 2002 Red Hat, Inc.
|
||||
* Developed by Havoc Pennington
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Library General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Library General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Library General Public
|
||||
* License along with this library; if not, write to the
|
||||
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
* Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#ifndef __EGG_ACCELERATORS_H__
|
||||
#define __EGG_ACCELERATORS_H__
|
||||
|
||||
#include <gtk/gtk.h>
|
||||
#include <gdk/gdk.h>
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
/* Where a value is also in GdkModifierType we coincide,
|
||||
* otherwise we don't overlap.
|
||||
*/
|
||||
typedef enum
|
||||
{
|
||||
EGG_VIRTUAL_SHIFT_MASK = 1 << 0,
|
||||
EGG_VIRTUAL_LOCK_MASK = 1 << 1,
|
||||
EGG_VIRTUAL_CONTROL_MASK = 1 << 2,
|
||||
|
||||
EGG_VIRTUAL_ALT_MASK = 1 << 3, /* fixed as Mod1 */
|
||||
|
||||
EGG_VIRTUAL_MOD2_MASK = 1 << 4,
|
||||
EGG_VIRTUAL_MOD3_MASK = 1 << 5,
|
||||
EGG_VIRTUAL_MOD4_MASK = 1 << 6,
|
||||
EGG_VIRTUAL_MOD5_MASK = 1 << 7,
|
||||
|
||||
#if 0
|
||||
GDK_BUTTON1_MASK = 1 << 8,
|
||||
GDK_BUTTON2_MASK = 1 << 9,
|
||||
GDK_BUTTON3_MASK = 1 << 10,
|
||||
GDK_BUTTON4_MASK = 1 << 11,
|
||||
GDK_BUTTON5_MASK = 1 << 12,
|
||||
/* 13, 14 are used by Xkb for the keyboard group */
|
||||
#endif
|
||||
|
||||
EGG_VIRTUAL_MODE_SWITCH_MASK = 1 << 23,
|
||||
EGG_VIRTUAL_NUM_LOCK_MASK = 1 << 24,
|
||||
EGG_VIRTUAL_SCROLL_LOCK_MASK = 1 << 25,
|
||||
|
||||
/* Also in GdkModifierType */
|
||||
EGG_VIRTUAL_SUPER_MASK = 1 << 26,
|
||||
EGG_VIRTUAL_HYPER_MASK = 1 << 27,
|
||||
EGG_VIRTUAL_META_MASK = 1 << 28,
|
||||
|
||||
/* Also in GdkModifierType */
|
||||
EGG_VIRTUAL_RELEASE_MASK = 1 << 30,
|
||||
|
||||
/* 28-31 24-27 20-23 16-19 12-15 8-11 4-7 0-3
|
||||
* 5 f 8 0 0 0 f f
|
||||
*/
|
||||
EGG_VIRTUAL_MODIFIER_MASK = 0x5f8000ff
|
||||
|
||||
} EggVirtualModifierType;
|
||||
|
||||
gboolean egg_accelerator_parse_virtual (const gchar *accelerator,
|
||||
guint *accelerator_key,
|
||||
guint *keycode,
|
||||
EggVirtualModifierType *accelerator_mods);
|
||||
void egg_keymap_resolve_virtual_modifiers (GdkKeymap *keymap,
|
||||
EggVirtualModifierType virtual_mods,
|
||||
GdkModifierType *concrete_mods);
|
||||
void egg_keymap_virtualize_modifiers (GdkKeymap *keymap,
|
||||
GdkModifierType concrete_mods,
|
||||
EggVirtualModifierType *virtual_mods);
|
||||
|
||||
gchar* egg_virtual_accelerator_name (guint accelerator_key,
|
||||
guint keycode,
|
||||
EggVirtualModifierType accelerator_mods);
|
||||
|
||||
gchar* egg_virtual_accelerator_label (guint accelerator_key,
|
||||
guint keycode,
|
||||
EggVirtualModifierType accelerator_mods);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
|
||||
#endif /* __EGG_ACCELERATORS_H__ */
|
|
@ -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 shortcut...")
|
||||
|
||||
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,
|
||||
g_cclosure_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_label (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 |
|
||||
EGG_VIRTUAL_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;
|
||||
GValue celltext_editable = {0};
|
||||
|
||||
celltext = GTK_CELL_RENDERER_TEXT (cell);
|
||||
keys = EGG_CELL_RENDERER_KEYS (cell);
|
||||
|
||||
/* If the cell isn't editable we return NULL. */
|
||||
g_value_init (&celltext_editable, G_TYPE_BOOLEAN);
|
||||
g_object_get_property (G_OBJECT (celltext), "editable", &celltext_editable);
|
||||
if (g_value_get_boolean (&celltext_editable) == FALSE)
|
||||
return NULL;
|
||||
g_return_val_if_fail (gtk_widget_get_window (widget) != NULL, NULL);
|
||||
|
||||
if (gdk_keyboard_grab (gtk_widget_get_window (widget), FALSE,
|
||||
gdk_event_get_time (event)) != GDK_GRAB_SUCCESS)
|
||||
return NULL;
|
||||
|
||||
if (gdk_pointer_grab (gtk_widget_get_window (widget), 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,
|
||||
>k_widget_get_style (widget)->bg[GTK_STATE_SELECTED]);
|
||||
|
||||
gtk_widget_modify_fg (label, GTK_STATE_NORMAL,
|
||||
>k_widget_get_style (widget)->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;
|
||||
|
||||
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 */
|
||||
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");
|
||||
}
|
|
@ -1,89 +0,0 @@
|
|||
/* gtkcellrendererkeybinding.h
|
||||
* Copyright (C) 2000 Red Hat, Inc., Jonathan Blandford <jrb@redhat.com>
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Library General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Library General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Library General Public
|
||||
* License along with this library; if not, write to the
|
||||
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
* Boston, MA 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#ifndef __EGG_CELL_RENDERER_KEYS_H__
|
||||
#define __EGG_CELL_RENDERER_KEYS_H__
|
||||
|
||||
#include <gtk/gtk.h>
|
||||
#include "eggaccelerators.h"
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
#define EGG_TYPE_CELL_RENDERER_KEYS (egg_cell_renderer_keys_get_type ())
|
||||
#define EGG_CELL_RENDERER_KEYS(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), EGG_TYPE_CELL_RENDERER_KEYS, EggCellRendererKeys))
|
||||
#define EGG_CELL_RENDERER_KEYS_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), EGG_TYPE_CELL_RENDERER_KEYS, EggCellRendererKeysClass))
|
||||
#define EGG_IS_CELL_RENDERER_KEYS(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), EGG_TYPE_CELL_RENDERER_KEYS))
|
||||
#define EGG_IS_CELL_RENDERER_KEYS_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), EGG_TYPE_CELL_RENDERER_KEYS))
|
||||
#define EGG_CELL_RENDERER_KEYS_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), EGG_TYPE_CELL_RENDERER_KEYS, EggCellRendererKeysClass))
|
||||
|
||||
typedef struct _EggCellRendererKeys EggCellRendererKeys;
|
||||
typedef struct _EggCellRendererKeysClass EggCellRendererKeysClass;
|
||||
|
||||
|
||||
typedef enum
|
||||
{
|
||||
EGG_CELL_RENDERER_KEYS_MODE_GTK,
|
||||
EGG_CELL_RENDERER_KEYS_MODE_X
|
||||
} EggCellRendererKeysMode;
|
||||
|
||||
struct _EggCellRendererKeys
|
||||
{
|
||||
GtkCellRendererText parent;
|
||||
guint accel_key;
|
||||
guint keycode;
|
||||
EggVirtualModifierType accel_mask;
|
||||
GtkWidget *edit_widget;
|
||||
GtkWidget *grab_widget;
|
||||
guint edit_key;
|
||||
GtkWidget *sizing_label;
|
||||
EggCellRendererKeysMode accel_mode;
|
||||
};
|
||||
|
||||
struct _EggCellRendererKeysClass
|
||||
{
|
||||
GtkCellRendererTextClass parent_class;
|
||||
|
||||
void (* accel_edited) (EggCellRendererKeys *keys,
|
||||
const char *path_string,
|
||||
guint keyval,
|
||||
EggVirtualModifierType mask,
|
||||
guint hardware_keycode);
|
||||
|
||||
void (* accel_cleared) (EggCellRendererKeys *keys,
|
||||
const char *path_string);
|
||||
};
|
||||
|
||||
GType egg_cell_renderer_keys_get_type (void);
|
||||
GtkCellRenderer *egg_cell_renderer_keys_new (void);
|
||||
|
||||
void egg_cell_renderer_keys_set_accelerator (EggCellRendererKeys *keys,
|
||||
guint keyval,
|
||||
guint keycode,
|
||||
EggVirtualModifierType mask);
|
||||
void egg_cell_renderer_keys_get_accelerator (EggCellRendererKeys *keys,
|
||||
guint *keyval,
|
||||
EggVirtualModifierType *mask);
|
||||
void egg_cell_renderer_keys_set_accel_mode (EggCellRendererKeys *keys,
|
||||
EggCellRendererKeysMode accel_mode);
|
||||
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
|
||||
#endif /* __GTK_CELL_RENDERER_KEYS_H__ */
|
File diff suppressed because it is too large
Load diff
|
@ -1,301 +0,0 @@
|
|||
<?xml version="1.0"?>
|
||||
<interface>
|
||||
<requires lib="gtk+" version="2.14"/>
|
||||
<!-- interface-naming-policy toplevel-contextual -->
|
||||
<object class="GtkDialog" id="gnome-keybinding-dialog">
|
||||
<property name="border_width">5</property>
|
||||
<property name="title" translatable="yes">Keyboard Shortcuts</property>
|
||||
<property name="type_hint">dialog</property>
|
||||
<property name="has_separator">False</property>
|
||||
<child internal-child="vbox">
|
||||
<object class="GtkVBox" id="shortcut_dialog">
|
||||
<property name="visible">True</property>
|
||||
<property name="spacing">2</property>
|
||||
<child>
|
||||
<object class="GtkVBox" id="vbox3">
|
||||
<property name="visible">True</property>
|
||||
<property name="border_width">5</property>
|
||||
<property name="spacing">12</property>
|
||||
<child>
|
||||
<object class="GtkVBox" id="shortcuts_vbox">
|
||||
<property name="visible">True</property>
|
||||
<property name="spacing">6</property>
|
||||
<child>
|
||||
<object class="GtkScrolledWindow" id="actions_swindow">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="hscrollbar_policy">never</property>
|
||||
<property name="vscrollbar_policy">never</property>
|
||||
<property name="shadow_type">in</property>
|
||||
<child>
|
||||
<object class="GtkTreeView" id="shortcut_treeview">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="rules_hint">True</property>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="position">0</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkHBox" id="hbox1">
|
||||
<property name="visible">True</property>
|
||||
<property name="border_width">6</property>
|
||||
<property name="spacing">12</property>
|
||||
<child>
|
||||
<object class="GtkImage" id="image1">
|
||||
<property name="visible">True</property>
|
||||
<property name="yalign">0</property>
|
||||
<property name="stock">gtk-dialog-info</property>
|
||||
<property name="icon-size">6</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">False</property>
|
||||
<property name="position">0</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkLabel" id="label12">
|
||||
<property name="visible">True</property>
|
||||
<property name="xalign">0</property>
|
||||
<property name="label" translatable="yes">To edit a shortcut key, click on the corresponding row and type a new key combination, or press backspace to clear.</property>
|
||||
<property name="justify">fill</property>
|
||||
<property name="wrap">True</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="position">1</property>
|
||||
</packing>
|
||||
</child>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="position">1</property>
|
||||
</packing>
|
||||
</child>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="position">0</property>
|
||||
</packing>
|
||||
</child>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="position">1</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child internal-child="action_area">
|
||||
<object class="GtkHButtonBox" id="dialog-action_area1">
|
||||
<property name="visible">True</property>
|
||||
<property name="layout_style">end</property>
|
||||
<child>
|
||||
<object class="GtkButton" id="helpbutton1">
|
||||
<property name="label">gtk-help</property>
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="can_default">True</property>
|
||||
<property name="receives_default">False</property>
|
||||
<property name="use_stock">True</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">False</property>
|
||||
<property name="position">0</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkButton" id="add-button">
|
||||
<property name="label">gtk-add</property>
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="can_default">True</property>
|
||||
<property name="receives_default">False</property>
|
||||
<property name="use_stock">True</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">False</property>
|
||||
<property name="position">1</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkButton" id="remove-button">
|
||||
<property name="label">gtk-remove</property>
|
||||
<property name="visible">True</property>
|
||||
<property name="sensitive">False</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="can_default">True</property>
|
||||
<property name="receives_default">False</property>
|
||||
<property name="use_stock">True</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">False</property>
|
||||
<property name="position">2</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkButton" id="button1">
|
||||
<property name="label">gtk-close</property>
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="can_default">True</property>
|
||||
<property name="receives_default">False</property>
|
||||
<property name="use_stock">True</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">False</property>
|
||||
<property name="position">3</property>
|
||||
</packing>
|
||||
</child>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="pack_type">end</property>
|
||||
<property name="position">0</property>
|
||||
</packing>
|
||||
</child>
|
||||
</object>
|
||||
</child>
|
||||
<action-widgets>
|
||||
<action-widget response="-11">helpbutton1</action-widget>
|
||||
<action-widget response="0">add-button</action-widget>
|
||||
<action-widget response="1">remove-button</action-widget>
|
||||
<action-widget response="-7">button1</action-widget>
|
||||
</action-widgets>
|
||||
</object>
|
||||
<object class="GtkDialog" id="custom-shortcut-dialog">
|
||||
<property name="title" translatable="yes">Custom Shortcut</property>
|
||||
<property name="type_hint">dialog</property>
|
||||
<property name="has_separator">False</property>
|
||||
<child internal-child="vbox">
|
||||
<object class="GtkVBox" id="dialog-vbox1">
|
||||
<property name="visible">True</property>
|
||||
<child>
|
||||
<object class="GtkVBox" id="vbox4">
|
||||
<property name="visible">True</property>
|
||||
<property name="border_width">5</property>
|
||||
<property name="spacing">6</property>
|
||||
<child>
|
||||
<object class="GtkTable" id="table1">
|
||||
<property name="visible">True</property>
|
||||
<property name="n_rows">2</property>
|
||||
<property name="n_columns">2</property>
|
||||
<property name="column_spacing">6</property>
|
||||
<property name="row_spacing">6</property>
|
||||
<child>
|
||||
<object class="GtkLabel" id="label13">
|
||||
<property name="visible">True</property>
|
||||
<property name="xalign">0</property>
|
||||
<property name="label" translatable="yes">_Name:</property>
|
||||
<property name="use_underline">True</property>
|
||||
<property name="mnemonic_widget">custom-shortcut-name-entry</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="x_options">GTK_FILL</property>
|
||||
<property name="y_options"></property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkLabel" id="label14">
|
||||
<property name="visible">True</property>
|
||||
<property name="xalign">0</property>
|
||||
<property name="label" translatable="yes">C_ommand:</property>
|
||||
<property name="use_underline">True</property>
|
||||
<property name="mnemonic_widget">custom-shortcut-command-entry</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="top_attach">1</property>
|
||||
<property name="bottom_attach">2</property>
|
||||
<property name="x_options">GTK_FILL</property>
|
||||
<property name="y_options"></property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkEntry" id="custom-shortcut-name-entry">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="invisible_char">•</property>
|
||||
<property name="activates_default">True</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="left_attach">1</property>
|
||||
<property name="right_attach">2</property>
|
||||
<property name="y_options"></property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkEntry" id="custom-shortcut-command-entry">
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="invisible_char">•</property>
|
||||
<property name="activates_default">True</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="left_attach">1</property>
|
||||
<property name="right_attach">2</property>
|
||||
<property name="top_attach">1</property>
|
||||
<property name="bottom_attach">2</property>
|
||||
<property name="y_options"></property>
|
||||
</packing>
|
||||
</child>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="position">0</property>
|
||||
</packing>
|
||||
</child>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="position">1</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child internal-child="action_area">
|
||||
<object class="GtkHButtonBox" id="dialog-action_area2">
|
||||
<property name="visible">True</property>
|
||||
<property name="layout_style">end</property>
|
||||
<child>
|
||||
<object class="GtkButton" id="cancelbutton1">
|
||||
<property name="label">gtk-cancel</property>
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="receives_default">False</property>
|
||||
<property name="use_stock">True</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">False</property>
|
||||
<property name="position">0</property>
|
||||
</packing>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkButton" id="okbutton1">
|
||||
<property name="label">gtk-apply</property>
|
||||
<property name="visible">True</property>
|
||||
<property name="can_focus">True</property>
|
||||
<property name="can_default">True</property>
|
||||
<property name="receives_default">False</property>
|
||||
<property name="use_stock">True</property>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="fill">False</property>
|
||||
<property name="position">1</property>
|
||||
</packing>
|
||||
</child>
|
||||
</object>
|
||||
<packing>
|
||||
<property name="expand">False</property>
|
||||
<property name="pack_type">end</property>
|
||||
<property name="position">0</property>
|
||||
</packing>
|
||||
</child>
|
||||
</object>
|
||||
</child>
|
||||
<action-widgets>
|
||||
<action-widget response="-6">cancelbutton1</action-widget>
|
||||
<action-widget response="-5">okbutton1</action-widget>
|
||||
</action-widgets>
|
||||
</object>
|
||||
</interface>
|
|
@ -1,10 +0,0 @@
|
|||
prefix=@prefix@
|
||||
datarootdir=@datarootdir@
|
||||
datadir=@datadir@
|
||||
pkgdatadir=${datadir}/@PACKAGE@
|
||||
keysdir=${pkgdatadir}/keybindings
|
||||
|
||||
Name: gnome-keybindings
|
||||
Description: Keybindings configuration for GNOME applications
|
||||
Version: @VERSION@
|
||||
|
|
@ -1,14 +0,0 @@
|
|||
[Desktop Entry]
|
||||
_Name=Keyboard Shortcuts
|
||||
_Comment=Assign shortcut keys to commands
|
||||
Exec=gnome-keybinding-properties
|
||||
Icon=preferences-desktop-keyboard-shortcuts
|
||||
Terminal=false
|
||||
Type=Application
|
||||
StartupNotify=true
|
||||
Categories=GNOME;GTK;Settings;X-GNOME-PersonalSettings;
|
||||
OnlyShowIn=GNOME;
|
||||
X-GNOME-Bugzilla-Bugzilla=GNOME
|
||||
X-GNOME-Bugzilla-Product=gnome-control-center
|
||||
X-GNOME-Bugzilla-Component=Keybinding
|
||||
X-GNOME-Bugzilla-Version=@VERSION@
|
Loading…
Add table
Add a link
Reference in a new issue