]> Pileus Git - ~andy/gtk/blobdiff - gdk/win32/gdkkeys-win32.c
Updated Hungarian translation
[~andy/gtk] / gdk / win32 / gdkkeys-win32.c
index 24bffddc61b4cd7cdd795f67cea5fdaaf0812d1d..97034899a5a3fa072d8670855c1b28f33d9bb66f 100644 (file)
@@ -12,9 +12,7 @@
  * Lesser General Public License for more details.
  *
  * You should have received a copy of the GNU Lesser 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.
+ * License along with this library. If not, see <http://www.gnu.org/licenses/>.
  */
 
 /*
 #include "gdkprivate-win32.h"
 #include "gdkinternals.h"
 #include "gdkkeysyms.h"
+#include "gdkkeysprivate.h"
+#include "gdkwin32keys.h"
 
-#include <config.h>
+#include "config.h"
+
+struct _GdkWin32KeymapClass
+{
+  GdkKeymapClass parent_class;
+};
+
+struct _GdkWin32Keymap
+{
+  GdkKeymap parent_instance;
+};
+
+G_DEFINE_TYPE (GdkWin32Keymap, gdk_win32_keymap, GDK_TYPE_KEYMAP)
+
+static void
+gdk_win32_keymap_init (GdkWin32Keymap *keymap)
+{
+}
 
 guint _gdk_keymap_serial = 0;
 gboolean _gdk_keyboard_has_altgr = FALSE;
+guint _scancode_rshift = 0;
+
 static GdkModifierType gdk_shift_modifiers = GDK_SHIFT_MASK;
 
 static GdkKeymap *default_keymap = NULL;
 
 static guint *keysym_tab = NULL;
 
-typedef int (WINAPI *t_ToUnicodeEx) (UINT,UINT,PBYTE,LPWSTR,int,UINT,HKL);
-static t_ToUnicodeEx p_ToUnicodeEx = NULL;
-
 #ifdef G_ENABLE_DEBUG
 static void
 print_keysym_tab (void)
@@ -84,132 +100,154 @@ handle_special (guint  vk,
   switch (vk)
     {
     case VK_CANCEL:
-      *ksymp = GDK_Cancel; break;
+      *ksymp = GDK_KEY_Cancel; break;
     case VK_BACK:
-      *ksymp = GDK_BackSpace; break;
+      *ksymp = GDK_KEY_BackSpace; break;
     case VK_TAB:
       if (shift & 0x1)
-       *ksymp = GDK_ISO_Left_Tab;
+       *ksymp = GDK_KEY_ISO_Left_Tab;
       else
-       *ksymp = GDK_Tab;
+       *ksymp = GDK_KEY_Tab;
       break;
     case VK_CLEAR:
-      *ksymp = GDK_Clear; break;
+      *ksymp = GDK_KEY_Clear; break;
     case VK_RETURN:
-      *ksymp = GDK_Return; break;
+      *ksymp = GDK_KEY_Return; break;
     case VK_SHIFT:
     case VK_LSHIFT:
-      *ksymp = GDK_Shift_L; break;
+      *ksymp = GDK_KEY_Shift_L; break;
     case VK_CONTROL:
     case VK_LCONTROL:
-      *ksymp = GDK_Control_L; break;
+      *ksymp = GDK_KEY_Control_L; break;
     case VK_MENU:
     case VK_LMENU:
-      *ksymp = GDK_Alt_L; break;
+      *ksymp = GDK_KEY_Alt_L; break;
     case VK_PAUSE:
-      *ksymp = GDK_Pause; break;
+      *ksymp = GDK_KEY_Pause; break;
     case VK_ESCAPE:
-      *ksymp = GDK_Escape; break;
+      *ksymp = GDK_KEY_Escape; break;
     case VK_PRIOR:
-      *ksymp = GDK_Prior; break;
+      *ksymp = GDK_KEY_Prior; break;
     case VK_NEXT:
-      *ksymp = GDK_Next; break;
+      *ksymp = GDK_KEY_Next; break;
     case VK_END:
-      *ksymp = GDK_End; break;
+      *ksymp = GDK_KEY_End; break;
     case VK_HOME:
-      *ksymp = GDK_Home; break;
+      *ksymp = GDK_KEY_Home; break;
     case VK_LEFT:
-      *ksymp = GDK_Left; break;
+      *ksymp = GDK_KEY_Left; break;
     case VK_UP:
-      *ksymp = GDK_Up; break;
+      *ksymp = GDK_KEY_Up; break;
     case VK_RIGHT:
-      *ksymp = GDK_Right; break;
+      *ksymp = GDK_KEY_Right; break;
     case VK_DOWN:
-      *ksymp = GDK_Down; break;
+      *ksymp = GDK_KEY_Down; break;
     case VK_SELECT:
-      *ksymp = GDK_Select; break;
+      *ksymp = GDK_KEY_Select; break;
     case VK_PRINT:
-      *ksymp = GDK_Print; break;
+      *ksymp = GDK_KEY_Print; break;
     case VK_EXECUTE:
-      *ksymp = GDK_Execute; break;
+      *ksymp = GDK_KEY_Execute; break;
     case VK_INSERT:
-      *ksymp = GDK_Insert; break;
+      *ksymp = GDK_KEY_Insert; break;
     case VK_DELETE:
-      *ksymp = GDK_Delete; break;
+      *ksymp = GDK_KEY_Delete; break;
     case VK_HELP:
-      *ksymp = GDK_Help; break;
+      *ksymp = GDK_KEY_Help; break;
     case VK_LWIN:
-      *ksymp = GDK_Meta_L; break;
+      *ksymp = GDK_KEY_Meta_L; break;
     case VK_RWIN:
-      *ksymp = GDK_Meta_R; break;
+      *ksymp = GDK_KEY_Meta_R; break;
+    case VK_APPS:
+      *ksymp = GDK_KEY_Menu; break;
     case VK_MULTIPLY:
-      *ksymp = GDK_KP_Multiply; break;
+      *ksymp = GDK_KEY_KP_Multiply; break;
     case VK_ADD:
-      *ksymp = GDK_KP_Add; break;
+      *ksymp = GDK_KEY_KP_Add; break;
     case VK_SEPARATOR:
-      *ksymp = GDK_KP_Separator; break;
+      *ksymp = GDK_KEY_KP_Separator; break;
     case VK_SUBTRACT:
-      *ksymp = GDK_KP_Subtract; break;
+      *ksymp = GDK_KEY_KP_Subtract; break;
     case VK_DIVIDE:
-      *ksymp = GDK_KP_Divide; break;
+      *ksymp = GDK_KEY_KP_Divide; break;
+    case VK_NUMPAD0:
+      *ksymp = GDK_KEY_KP_0; break;
+    case VK_NUMPAD1:
+      *ksymp = GDK_KEY_KP_1; break;
+    case VK_NUMPAD2:
+      *ksymp = GDK_KEY_KP_2; break;
+    case VK_NUMPAD3:
+      *ksymp = GDK_KEY_KP_3; break;
+    case VK_NUMPAD4:
+      *ksymp = GDK_KEY_KP_4; break;
+    case VK_NUMPAD5:
+      *ksymp = GDK_KEY_KP_5; break;
+    case VK_NUMPAD6:
+      *ksymp = GDK_KEY_KP_6; break;
+    case VK_NUMPAD7:
+      *ksymp = GDK_KEY_KP_7; break;
+    case VK_NUMPAD8:
+      *ksymp = GDK_KEY_KP_8; break;
+    case VK_NUMPAD9:
+      *ksymp = GDK_KEY_KP_9; break;
     case VK_F1:
-      *ksymp = GDK_F1; break;
+      *ksymp = GDK_KEY_F1; break;
     case VK_F2:
-      *ksymp = GDK_F2; break;
+      *ksymp = GDK_KEY_F2; break;
     case VK_F3:
-      *ksymp = GDK_F3; break;
+      *ksymp = GDK_KEY_F3; break;
     case VK_F4:
-      *ksymp = GDK_F4; break;
+      *ksymp = GDK_KEY_F4; break;
     case VK_F5:
-      *ksymp = GDK_F5; break;
+      *ksymp = GDK_KEY_F5; break;
     case VK_F6:
-      *ksymp = GDK_F6; break;
+      *ksymp = GDK_KEY_F6; break;
     case VK_F7:
-      *ksymp = GDK_F7; break;
+      *ksymp = GDK_KEY_F7; break;
     case VK_F8:
-      *ksymp = GDK_F8; break;
+      *ksymp = GDK_KEY_F8; break;
     case VK_F9:
-      *ksymp = GDK_F9; break;
+      *ksymp = GDK_KEY_F9; break;
     case VK_F10:
-      *ksymp = GDK_F10; break;
+      *ksymp = GDK_KEY_F10; break;
     case VK_F11:
-      *ksymp = GDK_F11; break;
+      *ksymp = GDK_KEY_F11; break;
     case VK_F12:
-      *ksymp = GDK_F12; break;
+      *ksymp = GDK_KEY_F12; break;
     case VK_F13:
-      *ksymp = GDK_F13; break;
+      *ksymp = GDK_KEY_F13; break;
     case VK_F14:
-      *ksymp = GDK_F14; break;
+      *ksymp = GDK_KEY_F14; break;
     case VK_F15:
-      *ksymp = GDK_F15; break;
+      *ksymp = GDK_KEY_F15; break;
     case VK_F16:
-      *ksymp = GDK_F16; break;
+      *ksymp = GDK_KEY_F16; break;
     case VK_F17:
-      *ksymp = GDK_F17; break;
+      *ksymp = GDK_KEY_F17; break;
     case VK_F18:
-      *ksymp = GDK_F18; break;
+      *ksymp = GDK_KEY_F18; break;
     case VK_F19:
-      *ksymp = GDK_F19; break;
+      *ksymp = GDK_KEY_F19; break;
     case VK_F20:
-      *ksymp = GDK_F20; break;
+      *ksymp = GDK_KEY_F20; break;
     case VK_F21:
-      *ksymp = GDK_F21; break;
+      *ksymp = GDK_KEY_F21; break;
     case VK_F22:
-      *ksymp = GDK_F22; break;
+      *ksymp = GDK_KEY_F22; break;
     case VK_F23:
-      *ksymp = GDK_F23; break;
+      *ksymp = GDK_KEY_F23; break;
     case VK_F24:
-      *ksymp = GDK_F24; break;
+      *ksymp = GDK_KEY_F24; break;
     case VK_NUMLOCK:
-      *ksymp = GDK_Num_Lock; break;
+      *ksymp = GDK_KEY_Num_Lock; break;
     case VK_SCROLL:
-      *ksymp = GDK_Scroll_Lock; break;
+      *ksymp = GDK_KEY_Scroll_Lock; break;
     case VK_RSHIFT:
-      *ksymp = GDK_Shift_R; break;
+      *ksymp = GDK_KEY_Shift_R; break;
     case VK_RCONTROL:
-      *ksymp = GDK_Control_R; break;
+      *ksymp = GDK_KEY_Control_R; break;
     case VK_RMENU:
-      *ksymp = GDK_Alt_R; break;
+      *ksymp = GDK_KEY_Alt_R; break;
     }
 }
 
@@ -242,6 +280,7 @@ static void
 reset_after_dead (guchar key_state[256])
 {
   guchar temp_key_state[256];
+  wchar_t wcs[2];
 
   memmove (temp_key_state, key_state, sizeof (key_state));
 
@@ -249,66 +288,58 @@ reset_after_dead (guchar key_state[256])
     temp_key_state[VK_CONTROL] =
     temp_key_state[VK_MENU] = 0;
 
-  if (G_WIN32_HAVE_WIDECHAR_API ())
-    {
-      wchar_t wcs[2];
-      (*p_ToUnicodeEx) (VK_SPACE, MapVirtualKey (VK_SPACE, 0),
-                       temp_key_state, wcs, G_N_ELEMENTS (wcs),
-                       0, _gdk_input_locale);
-    }
-  else
-    {
-      char chars[2];
-      ToAsciiEx (VK_SPACE, MapVirtualKey (VK_SPACE, 0),
-                temp_key_state, (LPWORD) chars, 0,
-                _gdk_input_locale);
-    }
+  ToUnicodeEx (VK_SPACE, MapVirtualKey (VK_SPACE, 0),
+              temp_key_state, wcs, G_N_ELEMENTS (wcs),
+              0, _gdk_input_locale);
 }
 
-static gboolean
+static void
 handle_dead (guint  keysym,
             guint *ksymp)
 {
   switch (keysym)
     {
     case '"': /* 0x022 */
-      *ksymp = GDK_dead_diaeresis; break;
+      *ksymp = GDK_KEY_dead_diaeresis; break;
     case '\'': /* 0x027 */
-      *ksymp = GDK_dead_acute; break;
-    case GDK_asciicircum: /* 0x05e */
-      *ksymp = GDK_dead_circumflex; break;
-    case GDK_grave:    /* 0x060 */
-      *ksymp = GDK_dead_grave; break;
-    case GDK_asciitilde: /* 0x07e */
-      *ksymp = GDK_dead_tilde; break;
-    case GDK_diaeresis: /* 0x0a8 */
-      *ksymp = GDK_dead_diaeresis; break;
-    case GDK_degree: /* 0x0b0 */
-      *ksymp = GDK_dead_abovering; break;
-    case GDK_acute:    /* 0x0b4 */
-      *ksymp = GDK_dead_acute; break;
-    case GDK_periodcentered: /* 0x0b7 */
-      *ksymp = GDK_dead_abovedot; break;
-    case GDK_cedilla: /* 0x0b8 */
-      *ksymp = GDK_dead_cedilla; break;
-    case GDK_breve:    /* 0x1a2 */
-      *ksymp = GDK_dead_breve; break;
-    case GDK_ogonek: /* 0x1b2 */
-      *ksymp = GDK_dead_ogonek; break;
-    case GDK_caron:    /* 0x1b7 */
-      *ksymp = GDK_dead_caron; break;
-    case GDK_doubleacute: /* 0x1bd */
-      *ksymp = GDK_dead_doubleacute; break;
-    case GDK_abovedot: /* 0x1ff */
-      *ksymp = GDK_dead_abovedot; break;
+      *ksymp = GDK_KEY_dead_acute; break;
+    case GDK_KEY_asciicircum: /* 0x05e */
+      *ksymp = GDK_KEY_dead_circumflex; break;
+    case GDK_KEY_grave:        /* 0x060 */
+      *ksymp = GDK_KEY_dead_grave; break;
+    case GDK_KEY_asciitilde: /* 0x07e */
+      *ksymp = GDK_KEY_dead_tilde; break;
+    case GDK_KEY_diaeresis: /* 0x0a8 */
+      *ksymp = GDK_KEY_dead_diaeresis; break;
+    case GDK_KEY_degree: /* 0x0b0 */
+      *ksymp = GDK_KEY_dead_abovering; break;
+    case GDK_KEY_acute:        /* 0x0b4 */
+      *ksymp = GDK_KEY_dead_acute; break;
+    case GDK_KEY_periodcentered: /* 0x0b7 */
+      *ksymp = GDK_KEY_dead_abovedot; break;
+    case GDK_KEY_cedilla: /* 0x0b8 */
+      *ksymp = GDK_KEY_dead_cedilla; break;
+    case GDK_KEY_breve:        /* 0x1a2 */
+      *ksymp = GDK_KEY_dead_breve; break;
+    case GDK_KEY_ogonek: /* 0x1b2 */
+      *ksymp = GDK_KEY_dead_ogonek; break;
+    case GDK_KEY_caron:        /* 0x1b7 */
+      *ksymp = GDK_KEY_dead_caron; break;
+    case GDK_KEY_doubleacute: /* 0x1bd */
+      *ksymp = GDK_KEY_dead_doubleacute; break;
+    case GDK_KEY_abovedot: /* 0x1ff */
+      *ksymp = GDK_KEY_dead_abovedot; break;
     case 0x1000384: /* Greek tonos */
-      *ksymp = GDK_dead_acute; break;
-    case GDK_Greek_accentdieresis: /* 0x7ae */
-      *ksymp = GDK_Greek_accentdieresis; break;
+      *ksymp = GDK_KEY_dead_acute; break;
+    case GDK_KEY_Greek_accentdieresis: /* 0x7ae */
+      *ksymp = GDK_KEY_Greek_accentdieresis; break;
     default:
-      return FALSE;
+      /* By default use the keysym as such. This takes care of for
+       * instance the dead U+09CD (BENGALI VIRAMA) on the ekushey
+       * Bengali layout.
+       */
+      *ksymp = keysym; break;
     }
-  return TRUE;
 }
 
 static void
@@ -319,22 +350,10 @@ update_keymap (void)
   guint scancode;
   guint vk;
   gboolean capslock_tested = FALSE;
-  static HMODULE user32 = NULL;
 
   if (keysym_tab != NULL && current_serial == _gdk_keymap_serial)
     return;
 
-  g_assert (G_WIN32_HAVE_WIDECHAR_API () || _gdk_input_codepage != 0);
-
-  if (G_WIN32_HAVE_WIDECHAR_API () && user32 == NULL)
-    {
-      user32 = GetModuleHandle ("user32.dll");
-
-      g_assert (user32 != NULL);
-
-      p_ToUnicodeEx = (t_ToUnicodeEx) GetProcAddress (user32, "ToUnicodeEx");
-    }
-
   current_serial = _gdk_keymap_serial;
 
   if (keysym_tab == NULL)
@@ -352,16 +371,18 @@ update_keymap (void)
        keysym_tab[vk*4+0] =
          keysym_tab[vk*4+1] =
          keysym_tab[vk*4+2] =
-         keysym_tab[vk*4+3] = GDK_VoidSymbol;
+         keysym_tab[vk*4+3] = GDK_KEY_VoidSymbol;
       else
        {
          gint shift;
 
+         if (vk == VK_RSHIFT)
+           _scancode_rshift = scancode;
+
          key_state[vk] = 0x80;
          for (shift = 0; shift < 4; shift++)
            {
              guint *ksymp = keysym_tab + vk*4 + shift;
-             guchar chars[2];
              
              set_shift_vks (key_state, shift);
 
@@ -379,60 +400,22 @@ update_keymap (void)
                  wchar_t wcs[10];
                  gint k;
 
-                 if (G_WIN32_HAVE_WIDECHAR_API ())
-                   {
-                     k = (*p_ToUnicodeEx) (vk, scancode, key_state,
-                                           wcs, G_N_ELEMENTS (wcs),
-                                           0, _gdk_input_locale);
+                 wcs[0] = wcs[1] = 0;
+                 k = ToUnicodeEx (vk, scancode, key_state,
+                                  wcs, G_N_ELEMENTS (wcs),
+                                  0, _gdk_input_locale);
 #if 0
-                     g_print ("ToUnicodeEx(%02x, %d: %d): %d, %04x %04x\n",
-                              vk, scancode, shift, k,
-                              (k != 0 ? wcs[0] : 0),
-                              (k >= 2 ? wcs[1] : 0));
+                 g_print ("ToUnicodeEx(%#02x, %d: %d): %d, %04x %04x\n",
+                          vk, scancode, shift, k,
+                          wcs[0], wcs[1]);
 #endif
-                     if (k == 1)
-                       *ksymp = gdk_unicode_to_keyval (wcs[0]);
-                   }
-                 else
-                   {
-                     k = ToAsciiEx (vk, scancode, key_state,
-                                    (LPWORD) chars, 0, _gdk_input_locale);
-#if 0
-                     g_print ("ToAsciiEx(%02x, %d: %d): %d, %02x %02x\n",
-                              vk, scancode, shift, k,
-                              (k != 0 ? chars[0] : 0),
-                              (k == 2 ? chars[1] : 0));
-#endif
-                     if (k == 1)
-                       {
-                         if (_gdk_input_codepage >= 1250 &&
-                             _gdk_input_codepage <= 1258 &&
-                             chars[0] >= GDK_space &&
-                             chars[0] <= GDK_asciitilde)
-                           *ksymp = chars[0];
-                         else
-                           {
-                             if (MultiByteToWideChar (_gdk_input_codepage, 0,
-                                                      chars, 1, wcs, 1) > 0)
-                               *ksymp = gdk_unicode_to_keyval (wcs[0]);
-                           }
-                       }
-                     else if (k == -1)
-                       {
-                         MultiByteToWideChar (_gdk_input_codepage, 0,
-                                              chars, 1, wcs, 1);
-                       }
-                   }
-
                  if (k == 1)
-                   {
-                     /* Keysym already stored above */
-                   }
+                   *ksymp = gdk_unicode_to_keyval (wcs[0]);
                  else if (k == -1)
                    {
                      guint keysym = gdk_unicode_to_keyval (wcs[0]);
 
-                     /* It is a dead key, and it's has been stored in
+                     /* It is a dead key, and it has been stored in
                       * the keyboard layout's state by
                       * ToAsciiEx()/ToUnicodeEx(). Yes, this is an
                       * incredibly silly API! Make the keyboard
@@ -446,14 +429,7 @@ update_keymap (void)
                      reset_after_dead (key_state);
 
                      /* Use dead keysyms instead of "undead" ones */
-                     if (!handle_dead (keysym, ksymp))
-                       GDK_NOTE (EVENTS,
-                                 g_print ("Unhandled dead key cp:%d vk:%02x sc:%x ch:%02x wc:%04x keysym:%04x%s%s\n",
-                                          _gdk_input_codepage, vk,
-                                          scancode, chars[0],
-                                          wcs[0], keysym,
-                                          (shift&0x1 ? " shift" : ""),
-                                          (shift&0x2 ? " altgr" : "")));
+                     handle_dead (keysym, ksymp);
                    }
                  else if (k == 0)
                    {
@@ -466,10 +442,8 @@ update_keymap (void)
                    {
 #if 0
                      GDK_NOTE (EVENTS,
-                               g_print ("%s returns %d "
+                               g_print ("ToUnicodeEx returns %d "
                                         "for vk:%02x, sc:%02x%s%s\n",
-                                        (G_WIN32_HAVE_WIDECHAR_API () ?
-                                         "ToUnicodeEx" : "ToAsciiEx"),
                                         k, vk, scancode,
                                         (shift&0x1 ? " shift" : ""),
                                         (shift&0x2 ? " altgr" : "")));
@@ -477,7 +451,7 @@ update_keymap (void)
                    }
                }
              if (*ksymp == 0)
-               *ksymp = GDK_VoidSymbol;
+               *ksymp = GDK_KEY_VoidSymbol;
            }
          key_state[vk] = 0;
 
@@ -485,9 +459,9 @@ update_keymap (void)
           * the mapping with Control+Alt is different.
           */
          if (!_gdk_keyboard_has_altgr)
-           if ((keysym_tab[vk*4 + 2] != GDK_VoidSymbol &&
+           if ((keysym_tab[vk*4 + 2] != GDK_KEY_VoidSymbol &&
                 keysym_tab[vk*4] != keysym_tab[vk*4 + 2]) ||
-               (keysym_tab[vk*4 + 3] != GDK_VoidSymbol &&
+               (keysym_tab[vk*4 + 3] != GDK_KEY_VoidSymbol &&
                 keysym_tab[vk*4 + 1] != keysym_tab[vk*4 + 3]))
              _gdk_keyboard_has_altgr = TRUE;
          
@@ -515,8 +489,8 @@ update_keymap (void)
                  if (ToAsciiEx (vk, scancode, key_state,
                                 (LPWORD) chars, 0, _gdk_input_locale) == 1)
                    {
-                     if (chars[0] >= GDK_space &&
-                         chars[0] <= GDK_asciitilde &&
+                     if (chars[0] >= GDK_KEY_space &&
+                         chars[0] <= GDK_KEY_asciitilde &&
                          chars[0] == keysym_tab[vk*4 + 1])
                        {
                          /* CapsLock acts as ShiftLock */
@@ -532,22 +506,22 @@ update_keymap (void)
 } 
 
 GdkKeymap*
-gdk_keymap_get_for_display (GdkDisplay *display)
+_gdk_win32_display_get_keymap (GdkDisplay *display)
 {
   g_return_val_if_fail (display == gdk_display_get_default (), NULL);
 
   if (default_keymap == NULL)
-    default_keymap = g_object_new (gdk_keymap_get_type (), NULL);
+    default_keymap = g_object_new (gdk_win32_keymap_get_type (), NULL);
 
   return default_keymap;
 }
 
-PangoDirection
-gdk_keymap_get_direction (GdkKeymap *keymap)
+static PangoDirection
+gdk_win32_keymap_get_direction (GdkKeymap *keymap)
 {
   update_keymap ();
 
-  switch (PRIMARYLANGID (LOWORD ((DWORD) _gdk_input_locale)))
+  switch (PRIMARYLANGID (LOWORD ((DWORD) (gintptr) _gdk_input_locale)))
     {
     case LANG_HEBREW:
     case LANG_ARABIC:
@@ -563,8 +537,30 @@ gdk_keymap_get_direction (GdkKeymap *keymap)
     }
 }
 
-gboolean
-gdk_keymap_get_entries_for_keyval (GdkKeymap     *keymap,
+static gboolean
+gdk_win32_keymap_have_bidi_layouts (GdkKeymap *keymap)
+{
+  /* Should we check if the kayboard layouts switchable at the moment
+   * cover both directionalities? What does the doc comment in
+   * ../x11/gdkkeys-x11.c exactly mean?
+   */
+  return FALSE;
+}
+
+static gboolean
+gdk_win32_keymap_get_caps_lock_state (GdkKeymap *keymap)
+{
+  return ((GetKeyState (VK_CAPITAL) & 1) != 0);
+}
+
+static gboolean
+gdk_win32_keymap_get_num_lock_state (GdkKeymap *keymap)
+{
+  return ((GetKeyState (VK_NUMLOCK) & 1) != 0);
+}
+
+static gboolean
+gdk_win32_keymap_get_entries_for_keyval (GdkKeymap     *keymap,
                                    guint          keyval,
                                    GdkKeymapKey **keys,
                                    gint          *n_keys)
@@ -639,8 +635,8 @@ gdk_keymap_get_entries_for_keyval (GdkKeymap     *keymap,
   return *n_keys > 0;
 }
 
-gboolean
-gdk_keymap_get_entries_for_keycode (GdkKeymap     *keymap,
+static gboolean
+gdk_win32_keymap_get_entries_for_keycode (GdkKeymap     *keymap,
                                     guint          hardware_keycode,
                                     GdkKeymapKey **keys,
                                     guint        **keyvals,
@@ -733,8 +729,8 @@ gdk_keymap_get_entries_for_keycode (GdkKeymap     *keymap,
   return *n_entries > 0;
 }
 
-guint
-gdk_keymap_lookup_key (GdkKeymap          *keymap,
+static guint
+gdk_win32_keymap_lookup_key (GdkKeymap          *keymap,
                        const GdkKeymapKey *key)
 {
   guint sym;
@@ -756,14 +752,14 @@ gdk_keymap_lookup_key (GdkKeymap          *keymap,
   
   sym = keysym_tab[key->keycode*4 + key->group*2 + key->level];
   
-  if (sym == GDK_VoidSymbol)
+  if (sym == GDK_KEY_VoidSymbol)
     return 0;
   else
     return sym;
 }
 
-gboolean
-gdk_keymap_translate_keyboard_state (GdkKeymap       *keymap,
+static gboolean
+gdk_win32_keymap_translate_keyboard_state (GdkKeymap       *keymap,
                                      guint            hardware_keycode,
                                      GdkModifierType  state,
                                      gint             group,
@@ -825,23 +821,23 @@ gdk_keymap_translate_keyboard_state (GdkKeymap       *keymap,
    * the key for those.
    */
   if (shift_level == 1 &&
-      keyvals[group*2 + 1] == GDK_VoidSymbol &&
-      keyvals[group*2] != GDK_VoidSymbol)
+      keyvals[group*2 + 1] == GDK_KEY_VoidSymbol &&
+      keyvals[group*2] != GDK_KEY_VoidSymbol)
     {
       shift_level = 0;
       ignore_shift = TRUE;
     }
 
   if (group == 1 &&
-      keyvals[2 + shift_level] == GDK_VoidSymbol &&
-      keyvals[0 + shift_level] != GDK_VoidSymbol)
+      keyvals[2 + shift_level] == GDK_KEY_VoidSymbol &&
+      keyvals[0 + shift_level] != GDK_KEY_VoidSymbol)
     {
       group = 0;
       ignore_group = TRUE;
     }
 
-  if (keyvals[group *2 + shift_level] == GDK_VoidSymbol &&
-      keyvals[0 + 0] != GDK_VoidSymbol)
+  if (keyvals[group *2 + shift_level] == GDK_KEY_VoidSymbol &&
+      keyvals[0 + 0] != GDK_KEY_VoidSymbol)
     {
       shift_level = 0;
       group = 0;
@@ -852,11 +848,11 @@ gdk_keymap_translate_keyboard_state (GdkKeymap       *keymap,
   /* See whether the group and shift level actually mattered
    * to know what to put in consumed_modifiers
    */
-  if (keyvals[group*2 + 1] == GDK_VoidSymbol ||
+  if (keyvals[group*2 + 1] == GDK_KEY_VoidSymbol ||
       keyvals[group*2 + 0] == keyvals[group*2 + 1])
     ignore_shift = TRUE;
 
-  if (keyvals[2 + shift_level] == GDK_VoidSymbol ||
+  if (keyvals[2 + shift_level] == GDK_KEY_VoidSymbol ||
       keyvals[0 + shift_level] == keyvals[2 + shift_level])
     ignore_group = TRUE;
 
@@ -896,5 +892,44 @@ gdk_keymap_translate_keyboard_state (GdkKeymap       *keymap,
                             group, shift_level, tmp_modifiers, gdk_keyval_name (tmp_keyval)));
 #endif
 
-  return tmp_keyval != GDK_VoidSymbol;
+  return tmp_keyval != GDK_KEY_VoidSymbol;
+}
+
+static void
+gdk_win32_keymap_add_virtual_modifiers (GdkKeymap       *keymap,
+                                  GdkModifierType *state)
+{
+}
+
+static gboolean
+gdk_win32_keymap_map_virtual_modifiers (GdkKeymap       *keymap,
+                                  GdkModifierType *state)
+{
+  /* FIXME: Is this the right thing to do? */
+  return TRUE;
+}
+
+static void
+gdk_win32_keymap_finalize (GObject *object)
+{
+}
+
+static void
+gdk_win32_keymap_class_init (GdkWin32KeymapClass *klass)
+{
+  GObjectClass *object_class = G_OBJECT_CLASS (klass);
+  GdkKeymapClass *keymap_class = GDK_KEYMAP_CLASS (klass);
+
+  object_class->finalize = gdk_win32_keymap_finalize;
+
+  keymap_class->get_direction = gdk_win32_keymap_get_direction;
+  keymap_class->have_bidi_layouts = gdk_win32_keymap_have_bidi_layouts;
+  keymap_class->get_caps_lock_state = gdk_win32_keymap_get_caps_lock_state;
+  keymap_class->get_num_lock_state = gdk_win32_keymap_get_num_lock_state;
+  keymap_class->get_entries_for_keyval = gdk_win32_keymap_get_entries_for_keyval;
+  keymap_class->get_entries_for_keycode = gdk_win32_keymap_get_entries_for_keycode;
+  keymap_class->lookup_key = gdk_win32_keymap_lookup_key;
+  keymap_class->translate_keyboard_state = gdk_win32_keymap_translate_keyboard_state;
+  keymap_class->add_virtual_modifiers = gdk_win32_keymap_add_virtual_modifiers;
+  keymap_class->map_virtual_modifiers = gdk_win32_keymap_map_virtual_modifiers;
 }