diff --git a/gdk/gdkkeyuni.c b/gdk/gdkkeyuni.c
index 4282597..60e2b11 100644
--- a/gdk/gdkkeyuni.c
+++ b/gdk/gdkkeyuni.c
@@ -881,6 +881,12 @@ gdk_keyval_to_unicode (guint keyval)
   if ((keyval & 0xff000000) == 0x01000000)
     return keyval & 0x00ffffff;
 
+#if defined(G_OS_WIN32)
+  extern guint32 gdk_win32_keymap_get_decimal_mark(void);
+  if (keyval == 0xffae)
+      return (guint32) gdk_win32_keymap_get_decimal_mark ();
+#endif
+
   /* binary search in table */
   while (max >= min) {
     mid = (min + max) / 2;
diff --git a/gdk/win32/gdkkeys-win32.c b/gdk/win32/gdkkeys-win32.c
index d9f86d7..67d9725 100644
--- a/gdk/win32/gdkkeys-win32.c
+++ b/gdk/win32/gdkkeys-win32.c
@@ -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; /* bug id 756751 */
 
 #ifdef G_ENABLE_DEBUG
 static void
@@ -329,6 +330,16 @@ handle_dead (guint  keysym,
     }
 }
 
+/* return current decimal mark as unicode character - bug id 756751 */
+guint32 gdk_win32_keymap_get_decimal_mark(void)
+{
+#if 0
+	g_print("gdk_win32_keymap_get_decimal_mark(): %04x\n", decimal_mark);
+#endif
+	if (decimal_mark) return (decimal_mark);
+	return ((guint32) '.');
+}
+
 static void
 update_keymap (void)
 {
@@ -382,7 +393,7 @@ update_keymap (void)
 	       */
 	      handle_special (vk, ksymp, shift);
 
-	      if (*ksymp == 0)
+	      if ((*ksymp == 0) || (vk == VK_DECIMAL))
 		{
 		  wchar_t wcs[10];
 		  gint k;
@@ -396,6 +407,16 @@ update_keymap (void)
 			   vk, scancode, shift, k,
 			   wcs[0], wcs[1]);
 #endif
+			if (vk == VK_DECIMAL)
+				{
+#if 0
+				g_print("ToUnicodeEx(%#02x, %d: %d): %d, %04x %04x\n",
+						vk, scancode, shift, k,
+						wcs[0], wcs[1]);
+#endif
+				if ((k == 1) && (shift == 0)) decimal_mark = wcs[0];
+				}
+			else
 		  if (k == 1)
 		    *ksymp = gdk_unicode_to_keyval (wcs[0]);
 		  else if (k == -1)
