debian/patches/074_try-harder-to-discriminate-Shift-F10-and-F10.patch:

With xkb-data 2.5.1-2.1 preserving the Shift modifier, GTK+ can properly
map F10 and Shift-F10 to different key bindings. Closes: #658392
This commit is contained in:
Michael Biebl
2012-09-21 16:30:36 +00:00
parent 52f6305a9f
commit f2dc11801b
3 changed files with 78 additions and 0 deletions

8
debian/changelog vendored
View File

@ -1,3 +1,11 @@
gtk+3.0 (3.4.2-4) UNRELEASED; urgency=low
* debian/patches/074_try-harder-to-discriminate-Shift-F10-and-F10.patch:
With xkb-data 2.5.1-2.1 preserving the Shift modifier, GTK+ can properly
map F10 and Shift-F10 to different key bindings. Closes: #658392
-- Michael Biebl <biebl@debian.org> Fri, 21 Sep 2012 18:20:47 +0200
gtk+3.0 (3.4.2-3) unstable; urgency=low
[ Josselin Mouette ]

View File

@ -0,0 +1,69 @@
From 314b6abbe8d8daae1e2de50b15cc9b6553af1f3d Mon Sep 17 00:00:00 2001
From: Matthias Clasen <mclasen@redhat.com>
Date: Sat, 1 Sep 2012 22:51:18 -0400
Subject: [PATCH] Try harder to discriminate Shift-F10 and F10
A change in xkeyboard-config 2.4.1 made it so that function keys
now have a shift level which has the same symbol, but 'eats' the
shift modifier. This would ordinarily make it impossible for us
to discriminate between these key combinations.
This commit tries harder to discriminate in 2 ways:
- XKB has a mechanism to tell us when a modifier should not be
consumed even though it was used in determining the level.
We now respect such 'preserved' modifiers. This does not fix
the Shift-F10 vs F10 problem yet, since xkeyboard-config does
not currently mark Shift as preserved for function keys.
- Don't consume modifiers that do not change the symbol. For
the function keys, the symbol on the shift level is the same
as the base level, so we don't consider Shift consumed.
For more background on the xkeyboard-config change, see
https://bugs.freedesktop.org/show_bug.cgi?id=45008
https://bugzilla.gnome.org/show_bug.cgi?id=661973
---
gdk/x11/gdkkeys-x11.c | 20 +++++++++++++++-----
1 file changed, 15 insertions(+), 5 deletions(-)
Index: gtk+-3.4.2/gdk/x11/gdkkeys-x11.c
===================================================================
--- gtk+-3.4.2.orig/gdk/x11/gdkkeys-x11.c 2012-05-02 14:05:07.000000000 +0200
+++ gtk+-3.4.2/gdk/x11/gdkkeys-x11.c 2012-09-04 03:05:24.621782410 +0200
@@ -1113,6 +1113,8 @@
int found = 0;
for (i=0,entry=type->map;i<type->map_count;i++,entry++) {
+ if (!entry->active)
+ continue;
if (mods_rtrn) {
int bits = 0;
unsigned long tmp = entry->mods.mask;
@@ -1123,14 +1125,22 @@
}
/* We always add one-modifiers levels to mods_rtrn since
* they can't wipe out bits in the state unless the
- * level would be triggered. But return other modifiers
- *
+ * level would be triggered. But not if they don't change
+ * the symbol (otherwise we can't discriminate Shift-F10
+ * and F10 anymore). And don't add modifiers that are
+ * explicitly marked as preserved, either.
*/
- if (bits == 1 || (mods&type->mods.mask)==entry->mods.mask)
- *mods_rtrn |= entry->mods.mask;
+ if ((bits == 1 && syms[col+entry->level] != syms[col]) ||
+ (mods&type->mods.mask) == entry->mods.mask)
+ {
+ if (type->preserve)
+ *mods_rtrn |= (entry->mods.mask & ~type->preserve[i].mask);
+ else
+ *mods_rtrn |= entry->mods.mask;
+ }
}
- if (!found&&entry->active&&((mods&type->mods.mask)==entry->mods.mask)) {
+ if (!found&&((mods&type->mods.mask)==entry->mods.mask)) {
col+= entry->level;
if (type->preserve)
preserve= type->preserve[i].mask;

View File

@ -11,3 +11,4 @@
071_fix-installation-of-HTML-images.patch
072_statusicon_icon_size.patch
073_transparent_colors.patch
074_try-harder-to-discriminate-Shift-F10-and-F10.patch