W32: Fix for commit 1f74f12d9, re-enabling decimal separator key
1f74f12d9 rendered entry of keypad decimal mark unuseable for
several national keyboard layouts, this commit amends that, at
least for W32, and makes GTK+ behave more or less the same way
W32 behaves.
The patch works like this:
- When typing the first character at the keyboard or when switching
keyboard layouts, the decimal mark character will be cached in the
static variable "decimal_mark" within gdkkeys-win32.c
- in case of WIN32, gdk_keyval_to_unicode() asks gdkkeys-win32.c for the
current decimal_mark when converting GDK_KEY_KP_Decimal.
This commit is contained in:
committed by
Руслан Ижбулатов
parent
dd90d178cc
commit
4bf5290a25
@@ -881,6 +881,11 @@ gdk_keyval_to_unicode (guint keyval)
|
||||
if ((keyval & 0xff000000) == 0x01000000)
|
||||
return keyval & 0x00ffffff;
|
||||
|
||||
#if defined(GDK_WINDOWING_WIN32)
|
||||
if (keyval == 0xffae)
|
||||
return (guint32) _gdk_win32_keymap_get_decimal_mark ();
|
||||
#endif
|
||||
|
||||
/* binary search in table */
|
||||
while (max >= min) {
|
||||
mid = (min + max) / 2;
|
||||
|
||||
@@ -47,6 +47,7 @@ static GdkModifierType gdk_shift_modifiers = GDK_SHIFT_MASK;
|
||||
static GdkKeymap *default_keymap = NULL;
|
||||
|
||||
static guint *keysym_tab = NULL;
|
||||
static wchar_t decimal_mark = 0;
|
||||
|
||||
#ifdef G_ENABLE_DEBUG
|
||||
static void
|
||||
@@ -329,6 +330,18 @@ handle_dead (guint keysym,
|
||||
}
|
||||
}
|
||||
|
||||
/* keypad decimal mark depends on active keyboard layout
|
||||
return current decimal mark as unicode character
|
||||
*/
|
||||
guint32
|
||||
_gdk_win32_keymap_get_decimal_mark (void)
|
||||
{
|
||||
if (decimal_mark)
|
||||
return (decimal_mark);
|
||||
|
||||
return ((guint32) '.');
|
||||
}
|
||||
|
||||
static void
|
||||
update_keymap (void)
|
||||
{
|
||||
@@ -382,7 +395,7 @@ update_keymap (void)
|
||||
*/
|
||||
handle_special (vk, ksymp, shift);
|
||||
|
||||
if (*ksymp == 0)
|
||||
if ((*ksymp == 0) || ((vk == VK_DECIMAL) && (shift == 0)))
|
||||
{
|
||||
wchar_t wcs[10];
|
||||
gint k;
|
||||
@@ -396,7 +409,12 @@ update_keymap (void)
|
||||
vk, scancode, shift, k,
|
||||
wcs[0], wcs[1]);
|
||||
#endif
|
||||
if (k == 1)
|
||||
if ((vk == VK_DECIMAL) && (shift == 0))
|
||||
{
|
||||
if (k == 1)
|
||||
decimal_mark = wcs[0];
|
||||
}
|
||||
else if (k == 1)
|
||||
*ksymp = gdk_unicode_to_keyval (wcs[0]);
|
||||
else if (k == -1)
|
||||
{
|
||||
|
||||
@@ -500,6 +500,8 @@ void _gdk_win32_emit_configure_event (GdkWindow *window);
|
||||
GdkWindow *_gdk_win32_find_window_for_mouse_event (GdkWindow* reported_window,
|
||||
MSG* msg);
|
||||
|
||||
guint32 _gdk_win32_keymap_get_decimal_mark (void);
|
||||
|
||||
/* Initialization */
|
||||
void _gdk_windowing_window_init (GdkScreen *screen);
|
||||
void _gdk_root_window_size_init (void);
|
||||
|
||||
Reference in New Issue
Block a user