gdkevents-win32.c

Go to the documentation of this file.
00001 /* GDK - The GIMP Drawing Kit
00002  * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
00003  * Copyright (C) 1998-1999 Tor Lillqvist
00004  *
00005  * This library is free software; you can redistribute it and/or
00006  * modify it under the terms of the GNU Library General Public
00007  * License as published by the Free Software Foundation; either
00008  * version 2 of the License, or (at your option) any later version.
00009  *
00010  * This library is distributed in the hope that it will be useful,
00011  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00012  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
00013  * Library General Public License for more details.
00014  *
00015  * You should have received a copy of the GNU Library General Public
00016  * License along with this library; if not, write to the
00017  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
00018  * Boston, MA 02111-1307, USA.
00019  */
00020 
00021 /*
00022  * Modified by the GTK+ Team and others 1997-1999.  See the AUTHORS
00023  * file for a list of people on the GTK+ Team.  See the ChangeLog
00024  * files for a list of changes.  These files are distributed with
00025  * GTK+ at ftp://ftp.gtk.org/pub/gtk/. 
00026  */
00027 
00028 #include "config.h"
00029 
00030 /* Cannot use TrackMouseEvent, as the stupid WM_MOUSELEAVE message
00031  * doesn't tell us where the mouse has gone. Thus we cannot use it to
00032  * generate a correct GdkNotifyType. Pity, as using TrackMouseEvent
00033  * otherwise would make it possible to reliably generate
00034  * GDK_LEAVE_NOTIFY events, which would help get rid of those pesky
00035  * tooltips sometimes popping up in the wrong place.
00036  */
00037 /* define USE_TRACKMOUSEEVENT */
00038 
00039 #include <stdio.h>
00040 
00041 #include "gdk.h"
00042 #include "gdkwin32.h"
00043 
00044 #include "gdkkeysyms.h"
00045 
00046 #include "gdkinputprivate.h"
00047 
00048 #include <objbase.h>
00049 #include <imm.h>
00050 
00051 #ifdef HAVE_DIMM_H
00052 #include <dimm.h>
00053 #else
00054 #include "surrogate-dimm.h"
00055 #endif
00056 
00057 #ifdef HAVE_WINTAB
00058 #include "d:\development\wtkit\include\wintab.h"
00059 #endif
00060 
00061 #define PING() printf("%s: %d\n",__FILE__,__LINE__),fflush(stdout)
00062 
00063 #define WINDOW_PRIVATE(wp) GDK_WINDOW_WIN32DATA (wp)
00064 
00065 typedef struct _GdkIOClosure GdkIOClosure;
00066 typedef struct _GdkEventPrivate GdkEventPrivate;
00067 
00068 typedef enum {
00069    /* Following flag is set for events on the event queue during
00070     * translation and cleared afterwards.
00071     */
00072    GDK_EVENT_PENDING = 1 << 0
00073 } GdkEventFlags;
00074 
00075 struct _GdkIOClosure {
00076    GdkInputFunction function;
00077    GdkInputCondition condition;
00078    GdkDestroyNotify notify;
00079    gpointer data;
00080 };
00081 
00082 struct _GdkEventPrivate {
00083    GdkEvent event;
00084    guint flags;
00085 };
00086 
00087 /* 
00088  * Private function declarations
00089  */
00090 
00091 static GdkFilterReturn
00092 gdk_event_apply_filters(MSG * xevent, GdkEvent * event, GList * filters);
00093 static gboolean gdk_event_translate(GdkEvent * event,
00094                                     MSG * xevent,
00095                                     gboolean * ret_val_flagp,
00096                                     gint * ret_valp);
00097 static gboolean gdk_event_prepare(GSource * source, gint * timeout);
00098 static gboolean gdk_event_check(GSource * source);
00099 static gboolean gdk_event_dispatch(GSource * source,
00100                                    GSourceFunc callback,
00101                                    gpointer user_data);
00102 
00103 static void gdk_synthesize_click(GdkEvent * event, gint nclicks);
00104 
00105 /* Private variable declarations
00106  */
00107 
00108 static GdkWindow *p_grab_window = NULL; /* Window that currently
00109                                          * holds the pointer grab
00110                                          */
00111 
00112 static GdkWindow *k_grab_window = NULL; /* Window the holds the
00113                                          * keyboard grab
00114                                          */
00115 
00116 static GList *client_filters;   /* Filters for client messages */
00117 
00118 static gboolean p_grab_automatic;
00119 static GdkEventMask p_grab_mask;
00120 static gboolean p_grab_owner_events, k_grab_owner_events;
00121 static HCURSOR p_grab_cursor;
00122 
00123 static GList *client_filters;   /* Filters for client messages */
00124 
00125 static GSourceFuncs event_funcs = {
00126    gdk_event_prepare,
00127    gdk_event_check,
00128    gdk_event_dispatch,
00129    (GDestroyNotify) g_free
00130 };
00131 
00132 GPollFD event_poll_fd;
00133 
00134 static GdkWindow *curWnd = NULL;
00135 static HWND active = NULL;
00136 static gint curX, curY;
00137 static gdouble curXroot, curYroot;
00138 static UINT gdk_ping_msg;
00139 static UINT msh_mousewheel_msg;
00140 static gboolean ignore_WM_CHAR = FALSE;
00141 static gboolean is_AltGr_key = FALSE;
00142 
00143 static IActiveIMMApp *paimmapp = NULL;
00144 static IActiveIMMMessagePumpOwner *paimmmpo = NULL;
00145 
00146 typedef BOOL(WINAPI * PFN_TrackMouseEvent) (LPTRACKMOUSEEVENT);
00147 static PFN_TrackMouseEvent p_TrackMouseEvent = NULL;
00148 
00149 static gboolean use_IME_COMPOSITION = FALSE;
00150 
00151 static gboolean first_move = FALSE; // bb add
00152 
00153 static LRESULT
00154 inner_window_proc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
00155 {
00156    GdkEventPrivate event;
00157    GdkEvent *eventp;
00158    MSG msg;
00159    DWORD pos;
00160    LRESULT lres;
00161    gint ret_val;
00162    gboolean ret_val_flag;
00163 
00164    msg.hwnd = hWnd;
00165    msg.message = message;
00166    msg.wParam = wParam;
00167    msg.lParam = lParam;
00168    msg.time = GetTickCount();
00169    pos = GetMessagePos();
00170    msg.pt.x = LOWORD(pos);
00171    msg.pt.y = HIWORD(pos);
00172 
00173    event.flags = GDK_EVENT_PENDING;
00174    if (gdk_event_translate(&event.event, &msg, &ret_val_flag, &ret_val)) {
00175       event.flags &= ~GDK_EVENT_PENDING;
00176 #if 0
00177       if (event.event.any.type == GDK_CONFIGURE) {
00178          /* Compress configure events */
00179          GList *list = gdk_queued_events;
00180 
00181          while (list != NULL
00182                 && (((GdkEvent *) list->data)->any.type != GDK_CONFIGURE
00183                     || ((GdkEvent *) list->data)->any.window !=
00184                     event.event.any.window))
00185             list = list->next;
00186          if (list != NULL) {
00187             GDK_NOTE(EVENTS,
00188                      g_print("... compressing an CONFIGURE event\n"));
00189 
00190             *((GdkEvent *) list->data) = event.event;
00191             gdk_window_unref(event.event.any.window);
00192             /* Wake up WaitMessage */
00193             PostMessage(NULL, gdk_ping_msg, 0, 0);
00194             return FALSE;
00195          }
00196       } else if (event.event.any.type == GDK_EXPOSE) {
00197          /* Compress expose events */
00198          GList *list = gdk_queued_events;
00199 
00200          while (list != NULL
00201                 && (((GdkEvent *) list->data)->any.type != GDK_EXPOSE
00202                     || ((GdkEvent *) list->data)->any.window !=
00203                     event.event.any.window))
00204             list = list->next;
00205          if (list != NULL) {
00206             GdkRectangle u;
00207 
00208             GDK_NOTE(EVENTS, g_print("... compressing an EXPOSE event\n"));
00209             gdk_rectangle_union(&event.event.expose.area,
00210                                 &((GdkEvent *) list->data)->expose.area,
00211                                 &u);
00212             ((GdkEvent *) list->data)->expose.area = u;
00213             gdk_window_unref(event.event.any.window);
00214 //#if 0
00215             /* Wake up WaitMessage */
00216             PostMessage(NULL, gdk_ping_msg, 0, 0);
00217 //#endif
00218             return FALSE;
00219          }
00220       }
00221 #endif
00222       eventp = gdk_event_new();
00223       *((GdkEventPrivate *) eventp) = event;
00224 
00225       /* Philippe Colantoni <colanton@aris.ss.uci.edu> suggests this
00226        * in order to handle events while opaque resizing neatly.  I
00227        * don't want it as default. Set the
00228        * GDK_EVENT_FUNC_FROM_WINDOW_PROC env var to get this
00229        * behaviour.
00230        */
00231       if (gdk_event_func_from_window_proc && gdk_event_func) {
00232          GDK_THREADS_ENTER();
00233 
00234          (*gdk_event_func) (eventp, gdk_event_data);
00235          gdk_event_free(eventp);
00236 
00237          GDK_THREADS_LEAVE();
00238       } else {
00239          gdk_event_queue_append(eventp);
00240 #if 1
00241          /* Wake up WaitMessage */
00242          PostMessage(NULL, gdk_ping_msg, 0, 0);
00243 #endif
00244       }
00245 
00246       if (ret_val_flag)
00247          return ret_val;
00248       else
00249          return FALSE;
00250    }
00251 
00252    if (ret_val_flag)
00253       return ret_val;
00254    else {
00255       if (paimmapp == NULL
00256           || (*paimmapp->lpVtbl->OnDefWindowProc) (paimmapp, hWnd, message,
00257                                                    wParam, lParam,
00258                                                    &lres) == S_FALSE)
00259          return DefWindowProc(hWnd, message, wParam, lParam);
00260       else
00261          return lres;
00262    }
00263 }
00264 
00265 LRESULT CALLBACK
00266 gdk_WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
00267 {
00268    LRESULT retval;
00269    gint tid = GetCurrentThreadId();
00270 
00271    GDK_NOTE(EVENTS, g_print("gdk_WindowProc: thread %#x hwnd %#x %s\n",
00272                             tid, hWnd, gdk_win32_message_name(message)));
00273 
00274    retval = inner_window_proc(hWnd, message, wParam, lParam);
00275 
00276    GDK_NOTE(EVENTS,
00277             g_print("gdk_WindowProc: thread %#x hwnd %#x returns %d\n",
00278                     tid, hWnd, retval));
00279    return retval;
00280 }
00281 
00282 void gdk_events_init(void)
00283 {
00284    GSource *source;
00285    HRESULT hres;
00286    HMODULE user32, imm32;
00287    HINSTANCE commctrl32;
00288 
00289    gdk_ping_msg = RegisterWindowMessage("gdk-ping");
00290    GDK_NOTE(EVENTS, g_print("gdk-ping = %#x\n", gdk_ping_msg));
00291 
00292    /* This is the string MSH_MOUSEWHEEL from zmouse.h,
00293     * http://www.microsoft.com/mouse/intellimouse/sdk/zmouse.h
00294     * This message is used by mouse drivers than cannot generate WM_MOUSEWHEEL
00295     * or on Win95.
00296     */
00297    msh_mousewheel_msg = RegisterWindowMessage("MSWHEEL_ROLLMSG");
00298    GDK_NOTE(EVENTS, g_print("MSH_MOUSEWHEEL = %#x\n", msh_mousewheel_msg));
00299 
00300    source = g_source_new(&event_funcs, sizeof(GSource));
00301    g_source_set_priority(source, GDK_PRIORITY_EVENTS);
00302 
00303    event_poll_fd.fd = G_WIN32_MSG_HANDLE;
00304    event_poll_fd.events = G_IO_IN;
00305 
00306    g_source_add_poll(source, &event_poll_fd);
00307    g_source_set_can_recurse(source, TRUE);
00308    g_source_attach(source, NULL);
00309 
00310    hres = CoCreateInstance(&CLSID_CActiveIMM,
00311                            NULL,
00312                            CLSCTX_ALL,
00313                            &IID_IActiveIMMApp, (LPVOID *) & paimmapp);
00314 
00315    if (hres == S_OK) {
00316       GDK_NOTE(EVENTS, g_print("IActiveIMMApp created %#x\n", paimmapp));
00317       (*paimmapp->lpVtbl->Activate) (paimmapp, TRUE);
00318 
00319       hres =
00320           (*paimmapp->lpVtbl->QueryInterface) (paimmapp,
00321                                                &IID_IActiveIMMMessagePumpOwner,
00322                                                &paimmmpo);
00323       GDK_NOTE(EVENTS,
00324                g_print("IActiveIMMMessagePumpOwner created %#x\n",
00325                        paimmmpo));
00326       (paimmmpo->lpVtbl->Start) (paimmmpo);
00327    }
00328 #ifdef USE_TRACKMOUSEEVENT
00329    user32 = GetModuleHandle("user32.dll");
00330    if ((p_TrackMouseEvent =
00331         GetProcAddress(user32, "TrackMouseEvent")) == NULL) {
00332       if ((commctrl32 = LoadLibrary("commctrl32.dll")) != NULL)
00333          p_TrackMouseEvent = (PFN_TrackMouseEvent)
00334              GetProcAddress(commctrl32, "_TrackMouseEvent");
00335    }
00336    if (p_TrackMouseEvent != NULL)
00337       GDK_NOTE(EVENTS,
00338                g_print("Using TrackMouseEvent to detect leave events\n"));
00339 #endif
00340    if (IS_WIN_NT(windows_version) && (windows_version & 0xFF) == 5) {
00341       /* On Win2k (Beta 3, at least) WM_IME_CHAR doesn't seem to work
00342        * correctly for non-Unicode applications. Handle
00343        * WM_IME_COMPOSITION with GCS_RESULTSTR instead, fetch the
00344        * Unicode char from the IME with ImmGetCompositionStringW().
00345        */
00346       use_IME_COMPOSITION = TRUE;
00347    }
00348 }
00349 
00350 /*
00351  *--------------------------------------------------------------
00352  * gdk_events_pending
00353  *
00354  *   Returns if events are pending on the queue.
00355  *
00356  * Arguments:
00357  *
00358  * Results:
00359  *   Returns TRUE if events are pending
00360  *
00361  * Side effects:
00362  *
00363  *--------------------------------------------------------------
00364  */
00365 
00366 gboolean gdk_events_pending(void)
00367 {
00368    MSG msg;
00369 
00370    return (gdk_event_queue_find_first()
00371            || PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE));
00372 }
00373 
00374 /*
00375  *--------------------------------------------------------------
00376  * gdk_event_get_graphics_expose
00377  *
00378  *   Waits for a GraphicsExpose or NoExpose event
00379  *
00380  * Arguments:
00381  *
00382  * Results: 
00383  *   For GraphicsExpose events, returns a pointer to the event
00384  *   converted into a GdkEvent Otherwise, returns NULL.
00385  *
00386  * Side effects:
00387  *
00388  *-------------------------------------------------------------- */
00389 
00390 GdkEvent *gdk_event_get_graphics_expose(GdkWindow * window)
00391 {
00392    MSG xevent;
00393    GdkEvent *event;
00394    GdkWindowPrivate *private = (GdkWindowPrivate *) window;
00395 
00396    g_return_val_if_fail(window != NULL, NULL);
00397 
00398    GDK_NOTE(EVENTS, g_print("gdk_event_get_graphics_expose\n"));
00399 
00400 #if 1
00401    /* Some nasty bugs here, just return NULL for now. */
00402    return NULL;
00403 #else
00404    if (GetMessage(&xevent, private->xwindow, WM_PAINT, WM_PAINT)) {
00405       event = gdk_event_new();
00406 
00407       if (gdk_event_translate(event, &xevent, NULL, NULL))
00408          return event;
00409       else
00410          gdk_event_free(event);
00411    }
00412 
00413    return NULL;
00414 #endif
00415 }
00416 
00417 static char *event_mask_string(GdkEventMask mask)
00418 {
00419    static char bfr[500];
00420    char *p = bfr;
00421 
00422    *p = '\0';
00423 #define BIT(x) \
00424   if (mask & GDK_##x##_MASK) \
00425     p += sprintf (p, "%s" #x, (p > bfr ? " " : ""))
00426    BIT(EXPOSURE);
00427    BIT(POINTER_MOTION);
00428    BIT(POINTER_MOTION_HINT);
00429    BIT(BUTTON_MOTION);
00430    BIT(BUTTON1_MOTION);
00431    BIT(BUTTON2_MOTION);
00432    BIT(BUTTON3_MOTION);
00433    BIT(BUTTON_PRESS);
00434    BIT(BUTTON_RELEASE);
00435    BIT(KEY_PRESS);
00436    BIT(KEY_RELEASE);
00437    BIT(ENTER_NOTIFY);
00438    BIT(LEAVE_NOTIFY);
00439    BIT(FOCUS_CHANGE);
00440    BIT(STRUCTURE);
00441    BIT(PROPERTY_CHANGE);
00442    BIT(VISIBILITY_NOTIFY);
00443    BIT(PROXIMITY_IN);
00444    BIT(PROXIMITY_OUT);
00445    BIT(SUBSTRUCTURE);
00446    BIT(SCROLL);
00447 #undef BIT
00448 
00449    return bfr;
00450 }
00451 
00452 /*
00453  *--------------------------------------------------------------
00454  * gdk_pointer_grab
00455  *
00456  *   Grabs the pointer to a specific window
00457  *
00458  * Arguments:
00459  *   "window" is the window which will receive the grab
00460  *   "owner_events" specifies whether events will be reported as is,
00461  *     or relative to "window"
00462  *   "event_mask" masks only interesting events
00463  *   "confine_to" limits the cursor movement to the specified window
00464  *   "cursor" changes the cursor for the duration of the grab
00465  *   "time" specifies the time
00466  *
00467  * Results:
00468  *
00469  * Side effects:
00470  *   requires a corresponding call to gdk_pointer_ungrab
00471  *
00472  *--------------------------------------------------------------
00473  */
00474 
00475 gint
00476 gdk_pointer_grab(GdkWindow * window,
00477                  gint owner_events,
00478                  GdkEventMask event_mask,
00479                  GdkWindow * confine_to, GdkCursor * cursor, guint32 time)
00480 {
00481    HWND xwindow;
00482    HWND xconfine_to;
00483    HCURSOR xcursor;
00484    GdkCursorPrivate *cursor_private;
00485    gint return_val;
00486 
00487    g_return_val_if_fail(window != NULL, 0);
00488    g_return_val_if_fail(GDK_IS_WINDOW(window), 0);
00489    g_return_val_if_fail(confine_to == NULL
00490                         || GDK_IS_WINDOW(confine_to), 0);
00491 
00492    cursor_private = (GdkCursorPrivate *) cursor;
00493 
00494    xwindow = GDK_DRAWABLE_XID(window);
00495 
00496    if (!confine_to || GDK_DRAWABLE_DESTROYED(confine_to))
00497       xconfine_to = NULL;
00498    else
00499       xconfine_to = GDK_DRAWABLE_XID(confine_to);
00500 
00501    if (!cursor)
00502       xcursor = NULL;
00503    else
00504       xcursor = cursor_private->xcursor;
00505 
00506       return_val = Success;
00507 
00508    if (return_val == Success) {
00509       if (!GDK_DRAWABLE_DESTROYED(window)) {
00510          GDK_NOTE(EVENTS, g_print("gdk_pointer_grab: %#x %s %#x %s\n",
00511                                   xwindow,
00512                                   (owner_events ? "TRUE" : "FALSE"),
00513                                   xcursor, event_mask_string(event_mask)));
00514          p_grab_mask = event_mask;
00515          p_grab_owner_events = (owner_events != 0);
00516          p_grab_automatic = FALSE;
00517 
00518          SetCapture(xwindow);
00519          return_val = GrabSuccess;
00520       } else
00521          return_val = AlreadyGrabbed;
00522    }
00523 
00524    if (return_val == GrabSuccess) {
00525       p_grab_window = window;
00526       if (p_grab_cursor != NULL) {
00527          if (GetCursor () == p_grab_cursor)
00528             SetCursor (NULL);
00529          DestroyCursor (p_grab_cursor);
00530       }
00531       p_grab_cursor = CopyCursor(xcursor);
00532       if(p_grab_cursor) {
00533          SetCursor(p_grab_cursor);
00534          ShowCursor(TRUE);
00535       }
00536    }
00537 
00538    return return_val;
00539 }
00540 
00541 /*
00542  *--------------------------------------------------------------
00543  * gdk_pointer_ungrab
00544  *
00545  *   Releases any pointer grab
00546  *
00547  * Arguments:
00548  *
00549  * Results:
00550  *
00551  * Side effects:
00552  *
00553  *--------------------------------------------------------------
00554  */
00555 
00556 void gdk_pointer_ungrab(guint32 time)
00557 {
00558    if (GetCapture() != NULL)
00559       ReleaseCapture();
00560 
00561    GDK_NOTE(EVENTS, g_print("gdk_pointer_ungrab\n"));
00562   
00563    p_grab_window = NULL;
00564    if (p_grab_cursor != NULL) {
00565       if (GetCursor () == p_grab_cursor)
00566             SetCursor (NULL);
00567       DestroyCursor (p_grab_cursor);
00568       p_grab_cursor = NULL;
00569    }
00570 
00571    p_grab_window = NULL;
00572 }
00573 
00574 /*
00575  *--------------------------------------------------------------
00576  * gdk_pointer_is_grabbed
00577  *
00578  *   Tell wether there is an active x pointer grab in effect
00579  *
00580  * Arguments:
00581  *
00582  * Results:
00583  *
00584  * Side effects:
00585  *
00586  *--------------------------------------------------------------
00587  */
00588 
00589 gint gdk_pointer_is_grabbed(void)
00590 {
00591    return p_grab_window != NULL;
00592 }
00593 
00594 
00595 //vo
00596 gint gdk_button_grab(gint button, gint mod, GdkWindow * window,
00597                      gboolean owner_events,
00598                      GdkEventMask event_mask,
00599                      GdkWindow * confine_to,
00600                      GdkCursor * cursor)
00601 {
00602    gint return_val;
00603 
00604    g_return_val_if_fail(window != NULL, 0);
00605    g_return_val_if_fail(GDK_IS_WINDOW(window), 0);
00606    g_return_val_if_fail(confine_to == NULL
00607                         || GDK_IS_WINDOW(confine_to), 0);
00608 
00609    return_val = GrabSuccess;
00610 
00611    GDK_WINDOW_WIN32DATA(window)->grab_event_mask = event_mask;
00612    GDK_WINDOW_WIN32DATA(window)->grab_button = button < 0 ? 0 : button;
00613    GDK_WINDOW_WIN32DATA(window)->grab_owner_events = owner_events;
00614    GDK_WINDOW_WIN32DATA(window)->grab_modifiers |= mod;
00615    GDK_WINDOW_WIN32DATA(window)->grab_confine = confine_to;
00616    GDK_WINDOW_WIN32DATA(window)->grab_cursor = cursor;
00617 
00618    return return_val;
00619 }
00620 
00621 //vo
00622 void gdk_button_ungrab(gint button, gint mod, GdkWindow * window)
00623 { 
00624    if (window == NULL) return;
00625    if (!GDK_IS_WINDOW(window)) return;
00626 
00627    GDK_WINDOW_WIN32DATA(window)->grab_button = -1; // negative
00628    GDK_WINDOW_WIN32DATA(window)->grab_event_mask = 0;
00629 }
00630 
00631 //vo
00632 typedef struct {
00633    gint key;
00634    gint mod;
00635 } _Gdk_key_mod;
00636 
00637 //vo
00638 static _Gdk_key_mod *find_key_mod(GList *li, gint keycode, gint mod)
00639 {
00640    GList *list;
00641    _Gdk_key_mod *result;
00642 
00643    if (li == NULL) return NULL;
00644    list = li;
00645 
00646    while (list) {
00647       result = (_Gdk_key_mod *)list->data;
00648       if (((result->key == keycode) || (keycode == 0)) && 
00649           ((result->mod == mod) || 
00650            (result->mod == GDK_MODIFIER_MASK) ||
00651            (mod == GDK_MODIFIER_MASK))) {
00652          return result;
00653       }
00654       list = list->next;
00655    }
00656    return NULL;
00657 }
00658 
00659 //vo
00660 gint gdk_key_grab(gint keycode, gint mod, GdkWindow * window)
00661 {
00662    gint return_val;
00663    _Gdk_key_mod *key_mod;
00664 
00665    g_return_val_if_fail(window != NULL, 0);
00666    g_return_val_if_fail(GDK_IS_WINDOW(window), 0);
00667 
00668    return_val = GrabSuccess;
00669 
00670    key_mod = find_key_mod(GDK_WINDOW_WIN32DATA(window)->grab_keys, keycode, mod);
00671   
00672    if (key_mod == NULL) {
00673       key_mod = g_new(_Gdk_key_mod, 1);
00674       key_mod->key = keycode;
00675       key_mod->mod = mod;
00676       GDK_WINDOW_WIN32DATA(window)->grab_keys = 
00677          g_list_append(GDK_WINDOW_WIN32DATA(window)->grab_keys, key_mod);
00678    } else {
00679       return_val = AlreadyGrabbed;
00680    }
00681 
00682    return return_val;
00683 }
00684 
00685 //vo
00686 void gdk_key_ungrab(gint keycode, gint mod, GdkWindow * window)
00687 {
00688    _Gdk_key_mod *key_mod;
00689    int i;
00690 
00691    if (window == NULL) return;
00692    if (!GDK_IS_WINDOW(window)) return;
00693    if (GDK_WINDOW_WIN32DATA(window)->grab_keys == NULL) return;
00694  
00695    if (keycode) {
00696       key_mod = find_key_mod(GDK_WINDOW_WIN32DATA(window)->grab_keys, keycode, mod);
00697       if (key_mod == NULL) return;
00698    
00699       GDK_WINDOW_WIN32DATA(window)->grab_keys = 
00700          g_list_remove(GDK_WINDOW_WIN32DATA(window)->grab_keys, key_mod);
00701       g_free(key_mod);
00702    } else {
00703       while (1) {
00704          key_mod = find_key_mod(GDK_WINDOW_WIN32DATA(window)->grab_keys, 0, mod);
00705          if (key_mod) {
00706             GDK_WINDOW_WIN32DATA(window)->grab_keys = 
00707                g_list_remove(GDK_WINDOW_WIN32DATA(window)->grab_keys, key_mod);
00708             g_free(key_mod);
00709          } else {
00710             break;
00711          }
00712       }
00713    }
00714 
00715    if (g_list_length(GDK_WINDOW_WIN32DATA(window)->grab_keys) == 0) {
00716       g_list_free(GDK_WINDOW_WIN32DATA(window)->grab_keys);
00717       GDK_WINDOW_WIN32DATA(window)->grab_keys = NULL;
00718    } 
00719 }
00720 
00721 /*
00722  *--------------------------------------------------------------
00723  * find_window_for_pointer_event
00724  *
00725  *   Find the window a pointer event (mouse up, down, move) should
00726  *   be reported to.  If the return value != reported_window then
00727  *   the ref count of reported_window will be decremented and the
00728  *   ref count of the return value will be incremented.
00729  *
00730  * Arguments:
00731  *
00732  *  "reported_window" is the gdk window the xevent was reported relative to
00733  *  "xevent" is the win32 message
00734  *
00735  * Results:
00736  *
00737  * Side effects:
00738  *
00739  *--------------------------------------------------------------
00740  */
00741 
00742 static GdkWindow* 
00743 find_window_for_pointer_event (GdkWindow*  reported_window,
00744                                MSG*        msg)
00745 {
00746    HWND hwnd;
00747    POINTS points;
00748    POINT pt;
00749    GdkWindow* other_window;
00750 
00751    if (p_grab_window == NULL || !p_grab_owner_events)
00752       return reported_window;
00753 
00754    points = MAKEPOINTS (msg->lParam);
00755    pt.x = points.x;
00756    pt.y = points.y;
00757    ClientToScreen (msg->hwnd, &pt);
00758 
00759    GDK_NOTE (EVENTS, g_print ("Finding window for grabbed pointer event at (%ld, %ld)\n",
00760                              pt.x, pt.y));
00761 
00762    hwnd = WindowFromPoint (pt);
00763    if (hwnd == NULL) {
00764       return reported_window;
00765    }
00766    other_window = gdk_window_lookup(hwnd);
00767 
00768    if (other_window == NULL) {
00769       return reported_window;
00770    }
00771    GDK_NOTE (EVENTS, g_print ("Found window %p for point (%ld, %ld)\n",
00772                               hwnd, pt.x, pt.y));
00773 
00774    gdk_window_unref (reported_window);
00775    gdk_window_ref (other_window);
00776 
00777    return other_window;
00778 }
00779 
00780 static void
00781 track_mouse_event(HWND  hwnd)
00782 {
00783    typedef BOOL (WINAPI *PFN_TrackMouseEvent) (LPTRACKMOUSEEVENT);
00784    static PFN_TrackMouseEvent pTrackMouseEvent = NULL;
00785    static gboolean once = FALSE;
00786 
00787    if (!once) {
00788       HMODULE user32;
00789       HINSTANCE commctrl32;
00790 
00791       user32 = GetModuleHandle ("user32.dll");
00792       if ((pTrackMouseEvent = (PFN_TrackMouseEvent)GetProcAddress (user32, "TrackMouseEvent")) == NULL) {
00793          if ((commctrl32 = LoadLibrary ("commctrl32.dll")) != NULL)
00794             pTrackMouseEvent = (PFN_TrackMouseEvent) GetProcAddress (commctrl32, "_TrackMouseEvent");
00795       }
00796       once = TRUE;
00797    }
00798 
00799    if (pTrackMouseEvent) {
00800       TRACKMOUSEEVENT tme = {0};
00801       tme.cbSize = sizeof(TRACKMOUSEEVENT);
00802       tme.dwFlags = TME_LEAVE;
00803       tme.hwndTrack = hwnd;
00804 
00805       if (!pTrackMouseEvent (&tme))
00806          WIN32_API_FAILED ("TrackMouseEvent");
00807    }
00808 }
00809 
00810 
00811 /*
00812  *--------------------------------------------------------------
00813  * gdk_keyboard_grab
00814  *
00815  *   Grabs the keyboard to a specific window
00816  *
00817  * Arguments:
00818  *   "window" is the window which will receive the grab
00819  *   "owner_events" specifies whether events will be reported as is,
00820  *     or relative to "window"
00821  *   "time" specifies the time
00822  *
00823  * Results:
00824  *
00825  * Side effects:
00826  *   requires a corresponding call to gdk_keyboard_ungrab
00827  *
00828  *--------------------------------------------------------------
00829  */
00830 
00831 gint gdk_keyboard_grab(GdkWindow * window, gint owner_events, guint32 time)
00832 {
00833    gint return_val;
00834 
00835    g_return_val_if_fail(window != NULL, 0);
00836    g_return_val_if_fail(GDK_IS_WINDOW(window), 0);
00837 
00838    GDK_NOTE(EVENTS, g_print("gdk_keyboard_grab %#x\n",
00839                             GDK_DRAWABLE_XID(window)));
00840 
00841    if (!GDK_DRAWABLE_DESTROYED(window)) {
00842       k_grab_owner_events = owner_events != 0;
00843       return_val = GrabSuccess;
00844    } else
00845       return_val = AlreadyGrabbed;
00846 
00847    if (return_val == GrabSuccess) {
00848       k_grab_window = window;
00849       SetFocus((HWND)GDK_DRAWABLE_XID(k_grab_window));
00850    }
00851    return return_val;
00852 }
00853 
00854 /*
00855  *--------------------------------------------------------------
00856  * gdk_keyboard_ungrab
00857  *
00858  *   Releases any keyboard grab
00859  *
00860  * Arguments:
00861  *
00862  * Results:
00863  *
00864  * Side effects:
00865  *
00866  *--------------------------------------------------------------
00867  */
00868 
00869 void gdk_keyboard_ungrab(guint32 time)
00870 {
00871    GDK_NOTE(EVENTS, g_print("gdk_keyboard_ungrab\n"));
00872 
00873    k_grab_window = NULL;
00874 }
00875 
00876 static void gdk_io_destroy(gpointer data)
00877 {
00878    GdkIOClosure *closure = data;
00879 
00880    if (closure->notify)
00881       closure->notify(closure->data);
00882 
00883    g_free(closure);
00884 }
00885 
00886 static gboolean
00887 gdk_io_invoke(GIOChannel * source, GIOCondition condition, gpointer data)
00888 {
00889    GdkIOClosure *closure = data;
00890    GdkInputCondition gdk_cond = 0;
00891 
00892    if (condition & (G_IO_IN | G_IO_PRI))
00893       gdk_cond |= GDK_INPUT_READ;
00894    if (condition & G_IO_OUT)
00895       gdk_cond |= GDK_INPUT_WRITE;
00896    if (condition & (G_IO_ERR | G_IO_HUP | G_IO_NVAL))
00897       gdk_cond |= GDK_INPUT_EXCEPTION;
00898 
00899    if (closure->condition & gdk_cond)
00900       closure->function(closure->data, g_io_channel_unix_get_fd(source),
00901                         gdk_cond);
00902 
00903    return TRUE;
00904 }
00905 
00906 static GdkFilterReturn
00907 gdk_event_apply_filters(MSG * xevent, GdkEvent * event, GList * filters)
00908 {
00909    GdkEventFilter *filter;
00910    GList *tmp_list;
00911    GdkFilterReturn result;
00912 
00913    tmp_list = filters;
00914 
00915    while (tmp_list) {
00916       filter = (GdkEventFilter *) tmp_list->data;
00917 
00918       result = (*filter->function) (xevent, event, filter->data);
00919       if (result != GDK_FILTER_CONTINUE)
00920          return result;
00921 
00922       tmp_list = tmp_list->next;
00923    }
00924 
00925    return GDK_FILTER_CONTINUE;
00926 }
00927 
00928 void
00929 gdk_add_client_message_filter(GdkAtom message_type,
00930                               GdkFilterFunc func, gpointer data)
00931 {
00932    GdkClientFilter *filter = g_new(GdkClientFilter, 1);
00933 
00934    filter->type = message_type;
00935    filter->function = func;
00936    filter->data = data;
00937 
00938    client_filters = g_list_prepend(client_filters, filter);
00939 }
00940 
00941 /* Thanks to Markus G. Kuhn <mkuhn@acm.org> for the ksysym<->Unicode
00942  * mapping functions, from the xterm sources.
00943  */
00944 
00945 #if 0                           /* Keyval-to-Unicode isn't actually needed  */
00946 
00947 struct k2u {
00948    unsigned short keysym;
00949    unsigned short ucs;
00950 } k2utab[] = {
00951    {
00952    0x01a1, 0x0104},             /*                     Aogonek Ą LATIN CAPITAL LETTER A WITH OGONEK */
00953    {
00954    0x01a2, 0x02d8},             /*                       breve ˘ BREVE */
00955    {
00956    0x01a3, 0x0141},             /*                     Lstroke Ł LATIN CAPITAL LETTER L WITH STROKE */
00957    {
00958    0x01a5, 0x013d},             /*                      Lcaron Ľ LATIN CAPITAL LETTER L WITH CARON */
00959    {
00960    0x01a6, 0x015a},             /*                      Sacute Ś LATIN CAPITAL LETTER S WITH ACUTE */
00961    {
00962    0x01a9, 0x0160},             /*                      Scaron Š LATIN CAPITAL LETTER S WITH CARON */
00963    {
00964    0x01aa, 0x015e},             /*                    Scedilla Ş LATIN CAPITAL LETTER S WITH CEDILLA */
00965    {
00966    0x01ab, 0x0164},             /*                      Tcaron Ť LATIN CAPITAL LETTER T WITH CARON */
00967    {
00968    0x01ac, 0x0179},             /*                      Zacute Ź LATIN CAPITAL LETTER Z WITH ACUTE */
00969    {
00970    0x01ae, 0x017d},             /*                      Zcaron Ž LATIN CAPITAL LETTER Z WITH CARON */
00971    {
00972    0x01af, 0x017b},             /*                   Zabovedot Ż LATIN CAPITAL LETTER Z WITH DOT ABOVE */
00973    {
00974    0x01b1, 0x0105},             /*                     aogonek ą LATIN SMALL LETTER A WITH OGONEK */
00975    {
00976    0x01b2, 0x02db},             /*                      ogonek ˛ OGONEK */
00977    {
00978    0x01b3, 0x0142},             /*                     lstroke ł LATIN SMALL LETTER L WITH STROKE */
00979    {
00980    0x01b5, 0x013e},             /*                      lcaron ľ LATIN SMALL LETTER L WITH CARON */
00981    {
00982    0x01b6, 0x015b},             /*                      sacute ś LATIN SMALL LETTER S WITH ACUTE */
00983    {
00984    0x01b7, 0x02c7},             /*                       caron ˇ CARON */
00985    {
00986    0x01b9, 0x0161},             /*                      scaron š LATIN SMALL LETTER S WITH CARON */
00987    {
00988    0x01ba, 0x015f},             /*                    scedilla ş LATIN SMALL LETTER S WITH CEDILLA */
00989    {
00990    0x01bb, 0x0165},             /*                      tcaron ť LATIN SMALL LETTER T WITH CARON */
00991    {
00992    0x01bc, 0x017a},             /*                      zacute ź LATIN SMALL LETTER Z WITH ACUTE */
00993    {
00994    0x01bd, 0x02dd},             /*                 doubleacute ˝ DOUBLE ACUTE ACCENT */
00995    {
00996    0x01be, 0x017e},             /*                      zcaron ž LATIN SMALL LETTER Z WITH CARON */
00997    {
00998    0x01bf, 0x017c},             /*                   zabovedot ż LATIN SMALL LETTER Z WITH DOT ABOVE */
00999    {
01000    0x01c0, 0x0154},             /*                      Racute Ŕ LATIN CAPITAL LETTER R WITH ACUTE */
01001    {
01002    0x01c3, 0x0102},             /*                      Abreve Ă LATIN CAPITAL LETTER A WITH BREVE */
01003    {
01004    0x01c5, 0x0139},             /*                      Lacute Ĺ LATIN CAPITAL LETTER L WITH ACUTE */
01005    {
01006    0x01c6, 0x0106},             /*                      Cacute Ć LATIN CAPITAL LETTER C WITH ACUTE */
01007    {
01008    0x01c8, 0x010c},             /*                      Ccaron Č LATIN CAPITAL LETTER C WITH CARON */
01009    {
01010    0x01ca, 0x0118},             /*                     Eogonek Ę LATIN CAPITAL LETTER E WITH OGONEK */
01011    {
01012    0x01cc, 0x011a},             /*                      Ecaron Ě LATIN CAPITAL LETTER E WITH CARON */
01013    {
01014    0x01cf, 0x010e},             /*                      Dcaron Ď LATIN CAPITAL LETTER D WITH CARON */
01015    {
01016    0x01d0, 0x0110},             /*                     Dstroke Đ LATIN CAPITAL LETTER D WITH STROKE */
01017    {
01018    0x01d1, 0x0143},             /*                      Nacute Ń LATIN CAPITAL LETTER N WITH ACUTE */
01019    {
01020    0x01d2, 0x0147},             /*                      Ncaron Ň LATIN CAPITAL LETTER N WITH CARON */
01021    {
01022    0x01d5, 0x0150},             /*                Odoubleacute Ő LATIN CAPITAL LETTER O WITH DOUBLE ACUTE */
01023    {
01024    0x01d8, 0x0158},             /*                      Rcaron Ř LATIN CAPITAL LETTER R WITH CARON */
01025    {
01026    0x01d9, 0x016e},             /*                       Uring Ů LATIN CAPITAL LETTER U WITH RING ABOVE */
01027    {
01028    0x01db, 0x0170},             /*                Udoubleacute Ű LATIN CAPITAL LETTER U WITH DOUBLE ACUTE */
01029    {
01030    0x01de, 0x0162},             /*                    Tcedilla Ţ LATIN CAPITAL LETTER T WITH CEDILLA */
01031    {
01032    0x01e0, 0x0155},             /*                      racute ŕ LATIN SMALL LETTER R WITH ACUTE */
01033    {
01034    0x01e3, 0x0103},             /*                      abreve ă LATIN SMALL LETTER A WITH BREVE */
01035    {
01036    0x01e5, 0x013a},             /*                      lacute ĺ LATIN SMALL LETTER L WITH ACUTE */
01037    {
01038    0x01e6, 0x0107},             /*                      cacute ć LATIN SMALL LETTER C WITH ACUTE */
01039    {
01040    0x01e8, 0x010d},             /*                      ccaron č LATIN SMALL LETTER C WITH CARON */
01041    {
01042    0x01ea, 0x0119},             /*                     eogonek ę LATIN SMALL LETTER E WITH OGONEK */
01043    {
01044    0x01ec, 0x011b},             /*                      ecaron ě LATIN SMALL LETTER E WITH CARON */
01045    {
01046    0x01ef, 0x010f},             /*                      dcaron ď LATIN SMALL LETTER D WITH CARON */
01047    {
01048    0x01f0, 0x0111},             /*                     dstroke đ LATIN SMALL LETTER D WITH STROKE */
01049    {
01050    0x01f1, 0x0144},             /*                      nacute ń LATIN SMALL LETTER N WITH ACUTE */
01051    {
01052    0x01f2, 0x0148},             /*                      ncaron ň LATIN SMALL LETTER N WITH CARON */
01053    {
01054    0x01f5, 0x0151},             /*                odoubleacute ő LATIN SMALL LETTER O WITH DOUBLE ACUTE */
01055    {
01056    0x01f8, 0x0159},             /*                      rcaron ř LATIN SMALL LETTER R WITH CARON */
01057    {
01058    0x01f9, 0x016f},             /*                       uring ů LATIN SMALL LETTER U WITH RING ABOVE */
01059    {
01060    0x01fb, 0x0171},             /*                udoubleacute ű LATIN SMALL LETTER U WITH DOUBLE ACUTE */
01061    {
01062    0x01fe, 0x0163},             /*                    tcedilla ţ LATIN SMALL LETTER T WITH CEDILLA */
01063    {
01064    0x01ff, 0x02d9},             /*                    abovedot ˙ DOT ABOVE */
01065    {
01066    0x02a1, 0x0126},             /*                     Hstroke Ħ LATIN CAPITAL LETTER H WITH STROKE */
01067    {
01068    0x02a6, 0x0124},             /*                 Hcircumflex Ĥ LATIN CAPITAL LETTER H WITH CIRCUMFLEX */
01069    {
01070    0x02a9, 0x0130},             /*                   Iabovedot İ LATIN CAPITAL LETTER I WITH DOT ABOVE */
01071    {
01072    0x02ab, 0x011e},             /*                      Gbreve Ğ LATIN CAPITAL LETTER G WITH BREVE */
01073    {
01074    0x02ac, 0x0134},             /*                 Jcircumflex Ĵ LATIN CAPITAL LETTER J WITH CIRCUMFLEX */
01075    {
01076    0x02b1, 0x0127},             /*                     hstroke ħ LATIN SMALL LETTER H WITH STROKE */
01077    {
01078    0x02b6, 0x0125},             /*                 hcircumflex ĥ LATIN SMALL LETTER H WITH CIRCUMFLEX */
01079    {
01080    0x02b9, 0x0131},             /*                    idotless ı LATIN SMALL LETTER DOTLESS I */
01081    {
01082    0x02bb, 0x011f},             /*                      gbreve ğ LATIN SMALL LETTER G WITH BREVE */
01083    {
01084    0x02bc, 0x0135},             /*                 jcircumflex ĵ LATIN SMALL LETTER J WITH CIRCUMFLEX */
01085    {
01086    0x02c5, 0x010a},             /*                   Cabovedot Ċ LATIN CAPITAL LETTER C WITH DOT ABOVE */
01087    {
01088    0x02c6, 0x0108},             /*                 Ccircumflex Ĉ LATIN CAPITAL LETTER C WITH CIRCUMFLEX */
01089    {
01090    0x02d5, 0x0120},             /*                   Gabovedot Ġ LATIN CAPITAL LETTER G WITH DOT ABOVE */
01091    {
01092    0x02d8, 0x011c},             /*                 Gcircumflex Ĝ LATIN CAPITAL LETTER G WITH CIRCUMFLEX */
01093    {
01094    0x02dd, 0x016c},             /*                      Ubreve Ŭ LATIN CAPITAL LETTER U WITH BREVE */
01095    {
01096    0x02de, 0x015c},             /*                 Scircumflex Ŝ LATIN CAPITAL LETTER S WITH CIRCUMFLEX */
01097    {
01098    0x02e5, 0x010b},             /*                   cabovedot ċ LATIN SMALL LETTER C WITH DOT ABOVE */
01099    {
01100    0x02e6, 0x0109},             /*                 ccircumflex ĉ LATIN SMALL LETTER C WITH CIRCUMFLEX */
01101    {
01102    0x02f5, 0x0121},             /*                   gabovedot ġ LATIN SMALL LETTER G WITH DOT ABOVE */
01103    {
01104    0x02f8, 0x011d},             /*                 gcircumflex ĝ LATIN SMALL LETTER G WITH CIRCUMFLEX */
01105    {
01106    0x02fd, 0x016d},             /*                      ubreve ŭ LATIN SMALL LETTER U WITH BREVE */
01107    {
01108    0x02fe, 0x015d},             /*                 scircumflex ŝ LATIN SMALL LETTER S WITH CIRCUMFLEX */
01109    {
01110    0x03a2, 0x0138},             /*                         kra ĸ LATIN SMALL LETTER KRA */
01111    {
01112    0x03a3, 0x0156},             /*                    Rcedilla Ŗ LATIN CAPITAL LETTER R WITH CEDILLA */
01113    {
01114    0x03a5, 0x0128},             /*                      Itilde Ĩ LATIN CAPITAL LETTER I WITH TILDE */
01115    {
01116    0x03a6, 0x013b},             /*                    Lcedilla Ļ LATIN CAPITAL LETTER L WITH CEDILLA */
01117    {
01118    0x03aa, 0x0112},             /*                     Emacron Ē LATIN CAPITAL LETTER E WITH MACRON */
01119    {
01120    0x03ab, 0x0122},             /*                    Gcedilla Ģ LATIN CAPITAL LETTER G WITH CEDILLA */
01121    {
01122    0x03ac, 0x0166},             /*                      Tslash Ŧ LATIN CAPITAL LETTER T WITH STROKE */
01123    {
01124    0x03b3, 0x0157},             /*                    rcedilla ŗ LATIN SMALL LETTER R WITH CEDILLA */
01125    {
01126    0x03b5, 0x0129},             /*                      itilde ĩ LATIN SMALL LETTER I WITH TILDE */
01127    {
01128    0x03b6, 0x013c},             /*                    lcedilla ļ LATIN SMALL LETTER L WITH CEDILLA */
01129    {
01130    0x03ba, 0x0113},             /*                     emacron ē LATIN SMALL LETTER E WITH MACRON */
01131    {
01132    0x03bb, 0x0123},             /*                    gcedilla ģ LATIN SMALL LETTER G WITH CEDILLA */
01133    {
01134    0x03bc, 0x0167},             /*                      tslash ŧ LATIN SMALL LETTER T WITH STROKE */
01135    {
01136    0x03bd, 0x014a},             /*                         ENG Ŋ LATIN CAPITAL LETTER ENG */
01137    {
01138    0x03bf, 0x014b},             /*                         eng ŋ LATIN SMALL LETTER ENG */
01139    {
01140    0x03c0, 0x0100},             /*                     Amacron Ā LATIN CAPITAL LETTER A WITH MACRON */
01141    {
01142    0x03c7, 0x012e},             /*                     Iogonek Į LATIN CAPITAL LETTER I WITH OGONEK */
01143    {
01144    0x03cc, 0x0116},             /*                   Eabovedot Ė LATIN CAPITAL LETTER E WITH DOT ABOVE */
01145    {
01146    0x03cf, 0x012a},             /*                     Imacron Ī LATIN CAPITAL LETTER I WITH MACRON */
01147    {
01148    0x03d1, 0x0145},             /*                    Ncedilla Ņ LATIN CAPITAL LETTER N WITH CEDILLA */
01149    {
01150    0x03d2, 0x014c},             /*                     Omacron Ō LATIN CAPITAL LETTER O WITH MACRON */
01151    {
01152    0x03d3, 0x0136},             /*                    Kcedilla Ķ LATIN CAPITAL LETTER K WITH CEDILLA */
01153    {
01154    0x03d9, 0x0172},             /*                     Uogonek Ų LATIN CAPITAL LETTER U WITH OGONEK */
01155    {
01156    0x03dd, 0x0168},             /*                      Utilde Ũ LATIN CAPITAL LETTER U WITH TILDE */
01157    {
01158    0x03de, 0x016a},             /*                     Umacron Ū LATIN CAPITAL LETTER U WITH MACRON */
01159    {
01160    0x03e0, 0x0101},             /*                     amacron ā LATIN SMALL LETTER A WITH MACRON */
01161    {
01162    0x03e7, 0x012f},             /*                     iogonek į LATIN SMALL LETTER I WITH OGONEK */
01163    {
01164    0x03ec, 0x0117},             /*                   eabovedot ė LATIN SMALL LETTER E WITH DOT ABOVE */
01165    {
01166    0x03ef, 0x012b},             /*                     imacron ī LATIN SMALL LETTER I WITH MACRON */
01167    {
01168    0x03f1, 0x0146},             /*                    ncedilla ņ LATIN SMALL LETTER N WITH CEDILLA */
01169    {
01170    0x03f2, 0x014d},             /*                     omacron ō LATIN SMALL LETTER O WITH MACRON */
01171    {
01172    0x03f3, 0x0137},             /*                    kcedilla ķ LATIN SMALL LETTER K WITH CEDILLA */
01173    {
01174    0x03f9, 0x0173},             /*                     uogonek ų LATIN SMALL LETTER U WITH OGONEK */
01175    {
01176    0x03fd, 0x0169},             /*                      utilde ũ LATIN SMALL LETTER U WITH TILDE */
01177    {
01178    0x03fe, 0x016b},             /*                     umacron ū LATIN SMALL LETTER U WITH MACRON */
01179    {
01180    0x047e, 0x203e},             /*                    overline ‾ OVERLINE */
01181    {
01182    0x04a1, 0x3002},             /*               kana_fullstop 。 IDEOGRAPHIC FULL STOP */
01183    {
01184    0x04a2, 0x300c},             /*         kana_openingbracket 「 LEFT CORNER BRACKET */
01185    {
01186    0x04a3, 0x300d},             /*         kana_closingbracket 」 RIGHT CORNER BRACKET */
01187    {
01188    0x04a4, 0x3001},             /*                  kana_comma 、 IDEOGRAPHIC COMMA */
01189    {
01190    0x04a5, 0x30fb},             /*            kana_conjunctive ・ KATAKANA MIDDLE DOT */
01191    {
01192    0x04a6, 0x30f2},             /*                     kana_WO ヲ KATAKANA LETTER WO */
01193    {
01194    0x04a7, 0x30a1},             /*                      kana_a ァ KATAKANA LETTER SMALL A */
01195    {
01196    0x04a8, 0x30a3},             /*                      kana_i ィ KATAKANA LETTER SMALL I */
01197    {
01198    0x04a9, 0x30a5},             /*                      kana_u ゥ KATAKANA LETTER SMALL U */
01199    {
01200    0x04aa, 0x30a7},             /*                      kana_e ェ KATAKANA LETTER SMALL E */
01201    {
01202    0x04ab, 0x30a9},             /*                      kana_o ォ KATAKANA LETTER SMALL O */
01203    {
01204    0x04ac, 0x30e3},             /*                     kana_ya ャ KATAKANA LETTER SMALL YA */
01205    {
01206    0x04ad, 0x30e5},             /*                     kana_yu ュ KATAKANA LETTER SMALL YU */
01207    {
01208    0x04ae, 0x30e7},             /*                     kana_yo ョ KATAKANA LETTER SMALL YO */
01209    {
01210    0x04af, 0x30c3},             /*                    kana_tsu ッ KATAKANA LETTER SMALL TU */
01211    {
01212    0x04b0, 0x30fc},             /*              prolongedsound ー KATAKANA-HIRAGANA PROLONGED SOUND MARK */
01213    {
01214    0x04b1, 0x30a2},             /*                      kana_A ア KATAKANA LETTER A */
01215    {
01216    0x04b2, 0x30a4},             /*                      kana_I イ KATAKANA LETTER I */
01217    {
01218    0x04b3, 0x30a6},             /*                      kana_U ウ KATAKANA LETTER U */
01219    {
01220    0x04b4, 0x30a8},             /*                      kana_E エ KATAKANA LETTER E */
01221    {
01222    0x04b5, 0x30aa},             /*                      kana_O オ KATAKANA LETTER O */
01223    {
01224    0x04b6, 0x30ab},             /*                     kana_KA カ KATAKANA LETTER KA */
01225    {
01226    0x04b7, 0x30ad},             /*                     kana_KI キ KATAKANA LETTER KI */
01227    {
01228    0x04b8, 0x30af},             /*                     kana_KU ク KATAKANA LETTER KU */
01229    {
01230    0x04b9, 0x30b1},             /*                     kana_KE ケ KATAKANA LETTER KE */
01231    {
01232    0x04ba, 0x30b3},             /*                     kana_KO コ KATAKANA LETTER KO */
01233    {
01234    0x04bb, 0x30b5},             /*                     kana_SA サ KATAKANA LETTER SA */
01235    {
01236    0x04bc, 0x30b7},             /*                    kana_SHI シ KATAKANA LETTER SI */
01237    {
01238    0x04bd, 0x30b9},             /*                     kana_SU ス KATAKANA LETTER SU */
01239    {
01240    0x04be, 0x30bb},             /*                     kana_SE セ KATAKANA LETTER SE */
01241    {
01242    0x04bf, 0x30bd},             /*                     kana_SO ソ KATAKANA LETTER SO */
01243    {
01244    0x04c0, 0x30bf},             /*                     kana_TA タ KATAKANA LETTER TA */
01245    {
01246    0x04c1, 0x30c1},             /*                    kana_CHI チ KATAKANA LETTER TI */
01247    {
01248    0x04c2, 0x30c4},             /*                    kana_TSU ツ KATAKANA LETTER TU */
01249    {
01250    0x04c3, 0x30c6},             /*                     kana_TE テ KATAKANA LETTER TE */
01251    {
01252    0x04c4, 0x30c8},             /*                     kana_TO ト KATAKANA LETTER TO */
01253    {
01254    0x04c5, 0x30ca},             /*                     kana_NA ナ KATAKANA LETTER NA */
01255    {
01256    0x04c6, 0x30cb},             /*                     kana_NI ニ KATAKANA LETTER NI */
01257    {
01258    0x04c7, 0x30cc},             /*                     kana_NU ヌ KATAKANA LETTER NU */
01259    {
01260    0x04c8, 0x30cd},             /*                     kana_NE ネ KATAKANA LETTER NE */
01261    {
01262    0x04c9, 0x30ce},             /*                     kana_NO ノ KATAKANA LETTER NO */
01263    {
01264    0x04ca, 0x30cf},             /*                     kana_HA ハ KATAKANA LETTER HA */
01265    {
01266    0x04cb, 0x30d2},             /*                     kana_HI ヒ KATAKANA LETTER HI */
01267    {
01268    0x04cc, 0x30d5},             /*                     kana_FU フ KATAKANA LETTER HU */
01269    {
01270    0x04cd, 0x30d8},             /*                     kana_HE ヘ KATAKANA LETTER HE */
01271    {
01272    0x04ce, 0x30db},             /*                     kana_HO ホ KATAKANA LETTER HO */
01273    {
01274    0x04cf, 0x30de},             /*                     kana_MA マ KATAKANA LETTER MA */
01275    {
01276    0x04d0, 0x30df},             /*                     kana_MI ミ KATAKANA LETTER MI */
01277    {
01278    0x04d1, 0x30e0},             /*                     kana_MU ム KATAKANA LETTER MU */
01279    {
01280    0x04d2, 0x30e1},             /*                     kana_ME メ KATAKANA LETTER ME */
01281    {
01282    0x04d3, 0x30e2},             /*                     kana_MO モ KATAKANA LETTER MO */
01283    {
01284    0x04d4, 0x30e4},             /*                     kana_YA ヤ KATAKANA LETTER YA */
01285    {
01286    0x04d5, 0x30e6},             /*                     kana_YU ユ KATAKANA LETTER YU */
01287    {
01288    0x04d6, 0x30e8},             /*                     kana_YO ヨ KATAKANA LETTER YO */
01289    {
01290    0x04d7, 0x30e9},             /*                     kana_RA ラ KATAKANA LETTER RA */
01291    {
01292    0x04d8, 0x30ea},             /*                     kana_RI リ KATAKANA LETTER RI */
01293    {
01294    0x04d9, 0x30eb},             /*                     kana_RU ル KATAKANA LETTER RU */
01295    {
01296    0x04da, 0x30ec},             /*                     kana_RE レ KATAKANA LETTER RE */
01297    {
01298    0x04db, 0x30ed},             /*                     kana_RO ロ KATAKANA LETTER RO */
01299    {
01300    0x04dc, 0x30ef},             /*                     kana_WA ワ KATAKANA LETTER WA */
01301    {
01302    0x04dd, 0x30f3},             /*                      kana_N ン KATAKANA LETTER N */
01303    {
01304    0x04de, 0x309b},             /*                 voicedsound ゛ KATAKANA-HIRAGANA VOICED SOUND MARK */
01305    {
01306    0x04df, 0x309c},             /*             semivoicedsound ゜ KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK */
01307    {
01308    0x05ac, 0x060c},             /*                Arabic_comma ، ARABIC COMMA */
01309    {
01310    0x05bb, 0x061b},             /*            Arabic_semicolon ؛ ARABIC SEMICOLON */
01311    {
01312    0x05bf, 0x061f},             /*        Arabic_question_mark ؟ ARABIC QUESTION MARK */
01313    {
01314    0x05c1, 0x0621},             /*                Arabic_hamza ء ARABIC LETTER HAMZA */
01315    {
01316    0x05c2, 0x0622},             /*          Arabic_maddaonalef آ ARABIC LETTER ALEF WITH MADDA ABOVE */
01317    {
01318    0x05c3, 0x0623},             /*          Arabic_hamzaonalef أ ARABIC LETTER ALEF WITH HAMZA ABOVE */
01319    {
01320    0x05c4, 0x0624},             /*           Arabic_hamzaonwaw ؤ ARABIC LETTER WAW WITH HAMZA ABOVE */
01321    {
01322    0x05c5, 0x0625},             /*       Arabic_hamzaunderalef إ ARABIC LETTER ALEF WITH HAMZA BELOW */
01323    {
01324    0x05c6, 0x0626},             /*           Arabic_hamzaonyeh ئ ARABIC LETTER YEH WITH HAMZA ABOVE */
01325    {
01326    0x05c7, 0x0627},             /*                 Arabic_alef ا ARABIC LETTER ALEF */
01327    {
01328    0x05c8, 0x0628},             /*                  Arabic_beh ب ARABIC LETTER BEH */
01329    {
01330    0x05c9, 0x0629},             /*           Arabic_tehmarbuta ة ARABIC LETTER TEH MARBUTA */
01331    {
01332    0x05ca, 0x062a},             /*                  Arabic_teh ت ARABIC LETTER TEH */
01333    {
01334    0x05cb, 0x062b},             /*                 Arabic_theh ث ARABIC LETTER THEH */
01335    {
01336    0x05cc, 0x062c},             /*                 Arabic_jeem ج ARABIC LETTER JEEM */
01337    {
01338    0x05cd, 0x062d},             /*                  Arabic_hah ح ARABIC LETTER HAH */
01339    {
01340    0x05ce, 0x062e},             /*                 Arabic_khah خ ARABIC LETTER KHAH */
01341    {
01342    0x05cf, 0x062f},             /*                  Arabic_dal د ARABIC LETTER DAL */
01343    {
01344    0x05d0, 0x0630},             /*                 Arabic_thal ذ ARABIC LETTER THAL */
01345    {
01346    0x05d1, 0x0631},             /*                   Arabic_ra ر ARABIC LETTER REH */
01347    {
01348    0x05d2, 0x0632},             /*                 Arabic_zain ز ARABIC LETTER ZAIN */
01349    {
01350    0x05d3, 0x0633},             /*                 Arabic_seen س ARABIC LETTER SEEN */
01351    {
01352    0x05d4, 0x0634},             /*                Arabic_sheen ش ARABIC LETTER SHEEN */
01353    {
01354    0x05d5, 0x0635},             /*                  Arabic_sad ص ARABIC LETTER SAD */
01355    {
01356    0x05d6, 0x0636},             /*                  Arabic_dad ض ARABIC LETTER DAD */
01357    {
01358    0x05d7, 0x0637},             /*                  Arabic_tah ط ARABIC LETTER TAH */
01359    {
01360    0x05d8, 0x0638},             /*                  Arabic_zah ظ ARABIC LETTER ZAH */
01361    {
01362    0x05d9, 0x0639},             /*                  Arabic_ain ع ARABIC LETTER AIN */
01363    {
01364    0x05da, 0x063a},             /*                Arabic_ghain غ ARABIC LETTER GHAIN */
01365    {
01366    0x05e0, 0x0640},             /*              Arabic_tatweel ـ ARABIC TATWEEL */
01367    {
01368    0x05e1, 0x0641},             /*                  Arabic_feh ف ARABIC LETTER FEH */
01369    {
01370    0x05e2, 0x0642},             /*                  Arabic_qaf ق ARABIC LETTER QAF */
01371    {
01372    0x05e3, 0x0643},             /*                  Arabic_kaf ك ARABIC LETTER KAF */
01373    {
01374    0x05e4, 0x0644},             /*                  Arabic_lam ل ARABIC LETTER LAM */
01375    {
01376    0x05e5, 0x0645},             /*                 Arabic_meem م ARABIC LETTER MEEM */
01377    {
01378    0x05e6, 0x0646},             /*                 Arabic_noon ن ARABIC LETTER NOON */
01379    {
01380    0x05e7, 0x0647},             /*                   Arabic_ha ه ARABIC LETTER HEH */
01381    {
01382    0x05e8, 0x0648},             /*                  Arabic_waw و ARABIC LETTER WAW */
01383    {
01384    0x05e9, 0x0649},             /*          Arabic_alefmaksura ى ARABIC LETTER ALEF MAKSURA */
01385    {
01386    0x05ea, 0x064a},             /*                  Arabic_yeh ي ARABIC LETTER YEH */
01387    {
01388    0x05eb, 0x064b},             /*             Arabic_fathatan ً ARABIC FATHATAN */
01389    {
01390    0x05ec, 0x064c},             /*             Arabic_dammatan ٌ ARABIC DAMMATAN */
01391    {
01392    0x05ed, 0x064d},             /*             Arabic_kasratan ٍ ARABIC KASRATAN */
01393    {
01394    0x05ee, 0x064e},             /*                Arabic_fatha َ ARABIC FATHA */
01395    {
01396    0x05ef, 0x064f},             /*                Arabic_damma ُ ARABIC DAMMA */
01397    {
01398    0x05f0, 0x0650},             /*                Arabic_kasra ِ ARABIC KASRA */
01399    {
01400    0x05f1, 0x0651},             /*               Arabic_shadda ّ ARABIC SHADDA */
01401    {
01402    0x05f2, 0x0652},             /*                Arabic_sukun ْ ARABIC SUKUN */
01403    {
01404    0x06a1, 0x0452},             /*                 Serbian_dje ђ CYRILLIC SMALL LETTER DJE */
01405    {
01406    0x06a2, 0x0453},             /*               Macedonia_gje ѓ CYRILLIC SMALL LETTER GJE */
01407    {
01408    0x06a3, 0x0451},             /*                 Cyrillic_io ё CYRILLIC SMALL LETTER IO */
01409    {
01410    0x06a4, 0x0454},             /*                Ukrainian_ie є CYRILLIC SMALL LETTER UKRAINIAN IE */
01411    {
01412    0x06a5, 0x0455},             /*               Macedonia_dse ѕ CYRILLIC SMALL LETTER DZE */
01413    {
01414    0x06a6, 0x0456},             /*                 Ukrainian_i і CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I */
01415    {
01416    0x06a7, 0x0457},             /*                Ukrainian_yi ї CYRILLIC SMALL LETTER YI */
01417    {
01418    0x06a8, 0x0458},             /*                 Cyrillic_je ј CYRILLIC SMALL LETTER JE */
01419    {
01420    0x06a9, 0x0459},             /*                Cyrillic_lje љ CYRILLIC SMALL LETTER LJE */
01421    {
01422    0x06aa, 0x045a},             /*                Cyrillic_nje њ CYRILLIC SMALL LETTER NJE */
01423    {
01424    0x06ab, 0x045b},             /*                Serbian_tshe ћ CYRILLIC SMALL LETTER TSHE */
01425    {
01426    0x06ac, 0x045c},             /*               Macedonia_kje ќ CYRILLIC SMALL LETTER KJE */
01427    {
01428    0x06ae, 0x045e},             /*         Byelorussian_shortu ў CYRILLIC SMALL LETTER SHORT U */
01429    {
01430    0x06af, 0x045f},             /*               Cyrillic_dzhe џ CYRILLIC SMALL LETTER DZHE */
01431    {
01432    0x06b0, 0x2116},             /*                  numerosign № NUMERO SIGN */
01433    {
01434    0x06b1, 0x0402},             /*                 Serbian_DJE Ђ CYRILLIC CAPITAL LETTER DJE */
01435    {
01436    0x06b2, 0x0403},             /*               Macedonia_GJE Ѓ CYRILLIC CAPITAL LETTER GJE */
01437    {
01438    0x06b3, 0x0401},             /*                 Cyrillic_IO Ё CYRILLIC CAPITAL LETTER IO */
01439    {
01440    0x06b4, 0x0404},             /*                Ukrainian_IE Є CYRILLIC CAPITAL LETTER UKRAINIAN IE */
01441    {
01442    0x06b5, 0x0405},             /*               Macedonia_DSE Ѕ CYRILLIC CAPITAL LETTER DZE */
01443    {
01444    0x06b6, 0x0406},             /*                 Ukrainian_I І CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I */
01445    {
01446    0x06b7, 0x0407},             /*                Ukrainian_YI Ї CYRILLIC CAPITAL LETTER YI */
01447    {
01448    0x06b8, 0x0408},             /*                 Cyrillic_JE Ј CYRILLIC CAPITAL LETTER JE */
01449    {
01450    0x06b9, 0x0409},             /*                Cyrillic_LJE Љ CYRILLIC CAPITAL LETTER LJE */
01451    {
01452    0x06ba, 0x040a},             /*                Cyrillic_NJE Њ CYRILLIC CAPITAL LETTER NJE */
01453    {
01454    0x06bb, 0x040b},             /*                Serbian_TSHE Ћ CYRILLIC CAPITAL LETTER TSHE */
01455    {
01456    0x06bc, 0x040c},             /*               Macedonia_KJE Ќ CYRILLIC CAPITAL LETTER KJE */
01457    {
01458    0x06be, 0x040e},             /*         Byelorussian_SHORTU Ў CYRILLIC CAPITAL LETTER SHORT U */
01459    {
01460    0x06bf, 0x040f},             /*               Cyrillic_DZHE Џ CYRILLIC CAPITAL LETTER DZHE */
01461    {
01462    0x06c0, 0x044e},             /*                 Cyrillic_yu ю CYRILLIC SMALL LETTER YU */
01463    {
01464    0x06c1, 0x0430},             /*                  Cyrillic_a а CYRILLIC SMALL LETTER A */
01465    {
01466    0x06c2, 0x0431},             /*                 Cyrillic_be б CYRILLIC SMALL LETTER BE */
01467    {
01468    0x06c3, 0x0446},             /*                Cyrillic_tse ц CYRILLIC SMALL LETTER TSE */
01469    {
01470    0x06c4, 0x0434},             /*                 Cyrillic_de д CYRILLIC SMALL LETTER DE */
01471    {
01472    0x06c5, 0x0435},             /*                 Cyrillic_ie е CYRILLIC SMALL LETTER IE */
01473    {
01474    0x06c6, 0x0444},             /*                 Cyrillic_ef ф CYRILLIC SMALL LETTER EF */
01475    {
01476    0x06c7, 0x0433},             /*                Cyrillic_ghe г CYRILLIC SMALL LETTER GHE */
01477    {
01478    0x06c8, 0x0445},             /*                 Cyrillic_ha х CYRILLIC SMALL LETTER HA */
01479    {
01480    0x06c9, 0x0438},             /*                  Cyrillic_i и CYRILLIC SMALL LETTER I */
01481    {
01482    0x06ca, 0x0439},             /*             Cyrillic_shorti й CYRILLIC SMALL LETTER SHORT I */
01483    {
01484    0x06cb, 0x043a},             /*                 Cyrillic_ka к CYRILLIC SMALL LETTER KA */
01485    {
01486    0x06cc, 0x043b},             /*                 Cyrillic_el л CYRILLIC SMALL LETTER EL */
01487    {
01488    0x06cd, 0x043c},             /*                 Cyrillic_em м CYRILLIC SMALL LETTER EM */
01489    {
01490    0x06ce, 0x043d},             /*                 Cyrillic_en н CYRILLIC SMALL LETTER EN */
01491    {
01492    0x06cf, 0x043e},             /*                  Cyrillic_o о CYRILLIC SMALL LETTER O */
01493    {
01494    0x06d0, 0x043f},             /*                 Cyrillic_pe п CYRILLIC SMALL LETTER PE */
01495    {
01496    0x06d1, 0x044f},             /*                 Cyrillic_ya я CYRILLIC SMALL LETTER YA */
01497    {
01498    0x06d2, 0x0440},             /*                 Cyrillic_er р CYRILLIC SMALL LETTER ER */
01499    {
01500    0x06d3, 0x0441},             /*                 Cyrillic_es с CYRILLIC SMALL LETTER ES */
01501    {
01502    0x06d4, 0x0442},             /*                 Cyrillic_te т CYRILLIC SMALL LETTER TE */
01503    {
01504    0x06d5, 0x0443},             /*                  Cyrillic_u у CYRILLIC SMALL LETTER U */
01505    {
01506    0x06d6, 0x0436},             /*                Cyrillic_zhe ж CYRILLIC SMALL LETTER ZHE */
01507    {
01508    0x06d7, 0x0432},             /*                 Cyrillic_ve в CYRILLIC SMALL LETTER VE */
01509    {
01510    0x06d8, 0x044c},             /*           Cyrillic_softsign ь CYRILLIC SMALL LETTER SOFT SIGN */
01511    {
01512    0x06d9, 0x044b},             /*               Cyrillic_yeru ы CYRILLIC SMALL LETTER YERU */
01513    {
01514    0x06da, 0x0437},             /*                 Cyrillic_ze з CYRILLIC SMALL LETTER ZE */
01515    {
01516    0x06db, 0x0448},             /*                Cyrillic_sha ш CYRILLIC SMALL LETTER SHA */
01517    {
01518    0x06dc, 0x044d},             /*                  Cyrillic_e э CYRILLIC SMALL LETTER E */
01519    {
01520    0x06dd, 0x0449},             /*              Cyrillic_shcha щ CYRILLIC SMALL LETTER SHCHA */
01521    {
01522    0x06de, 0x0447},             /*                Cyrillic_che ч CYRILLIC SMALL LETTER CHE */
01523    {
01524    0x06df, 0x044a},             /*           Cyrillic_hardsign ъ CYRILLIC SMALL LETTER HARD SIGN */
01525    {
01526    0x06e0, 0x042e},             /*                 Cyrillic_YU Ю CYRILLIC CAPITAL LETTER YU */
01527    {
01528    0x06e1, 0x0410},             /*                  Cyrillic_A А CYRILLIC CAPITAL LETTER A */
01529    {
01530    0x06e2, 0x0411},             /*                 Cyrillic_BE Б CYRILLIC CAPITAL LETTER BE */
01531    {
01532    0x06e3, 0x0426},             /*                Cyrillic_TSE Ц CYRILLIC CAPITAL LETTER TSE */
01533    {
01534    0x06e4, 0x0414},             /*                 Cyrillic_DE Д CYRILLIC CAPITAL LETTER DE */
01535    {
01536    0x06e5, 0x0415},             /*                 Cyrillic_IE Е CYRILLIC CAPITAL LETTER IE */
01537    {
01538    0x06e6, 0x0424},             /*                 Cyrillic_EF Ф CYRILLIC CAPITAL LETTER EF */
01539    {
01540    0x06e7, 0x0413},             /*                Cyrillic_GHE Г CYRILLIC CAPITAL LETTER GHE */
01541    {
01542    0x06e8, 0x0425},             /*                 Cyrillic_HA Х CYRILLIC CAPITAL LETTER HA */
01543    {
01544    0x06e9, 0x0418},             /*                  Cyrillic_I И CYRILLIC CAPITAL LETTER I */
01545    {
01546    0x06ea, 0x0419},             /*             Cyrillic_SHORTI Й CYRILLIC CAPITAL LETTER SHORT I */
01547    {
01548    0x06eb, 0x041a},             /*                 Cyrillic_KA К CYRILLIC CAPITAL LETTER KA */
01549    {
01550    0x06ec, 0x041b},             /*                 Cyrillic_EL Л CYRILLIC CAPITAL LETTER EL */
01551    {
01552    0x06ed, 0x041c},             /*                 Cyrillic_EM М CYRILLIC CAPITAL LETTER EM */
01553    {
01554    0x06ee, 0x041d},             /*                 Cyrillic_EN Н CYRILLIC CAPITAL LETTER EN */
01555    {
01556    0x06ef, 0x041e},             /*                  Cyrillic_O О CYRILLIC CAPITAL LETTER O */
01557    {
01558    0x06f0, 0x041f},             /*                 Cyrillic_PE П CYRILLIC CAPITAL LETTER PE */
01559    {
01560    0x06f1, 0x042f},             /*                 Cyrillic_YA Я CYRILLIC CAPITAL LETTER YA */
01561    {
01562    0x06f2, 0x0420},             /*                 Cyrillic_ER Р CYRILLIC CAPITAL LETTER ER */
01563    {
01564    0x06f3, 0x0421},             /*                 Cyrillic_ES С CYRILLIC CAPITAL LETTER ES */
01565    {
01566    0x06f4, 0x0422},             /*                 Cyrillic_TE Т CYRILLIC CAPITAL LETTER TE */
01567    {
01568    0x06f5, 0x0423},             /*                  Cyrillic_U У CYRILLIC CAPITAL LETTER U */
01569    {
01570    0x06f6, 0x0416},             /*                Cyrillic_ZHE Ж CYRILLIC CAPITAL LETTER ZHE */
01571    {
01572    0x06f7, 0x0412},             /*                 Cyrillic_VE В CYRILLIC CAPITAL LETTER VE */
01573    {
01574    0x06f8, 0x042c},             /*           Cyrillic_SOFTSIGN Ь CYRILLIC CAPITAL LETTER SOFT SIGN */
01575    {
01576    0x06f9, 0x042b},             /*               Cyrillic_YERU Ы CYRILLIC CAPITAL LETTER YERU */
01577    {
01578    0x06fa, 0x0417},             /*                 Cyrillic_ZE З CYRILLIC CAPITAL LETTER ZE */
01579    {
01580    0x06fb, 0x0428},             /*                Cyrillic_SHA Ш CYRILLIC CAPITAL LETTER SHA */
01581    {
01582    0x06fc, 0x042d},             /*                  Cyrillic_E Э CYRILLIC CAPITAL LETTER E */
01583    {
01584    0x06fd, 0x0429},             /*              Cyrillic_SHCHA Щ CYRILLIC CAPITAL LETTER SHCHA */
01585    {
01586    0x06fe, 0x0427},             /*                Cyrillic_CHE Ч CYRILLIC CAPITAL LETTER CHE */
01587    {
01588    0x06ff, 0x042a},             /*           Cyrillic_HARDSIGN Ъ CYRILLIC CAPITAL LETTER HARD SIGN */
01589    {
01590    0x07a1, 0x0386},             /*           Greek_ALPHAaccent Ά GREEK CAPITAL LETTER ALPHA WITH TONOS */
01591    {
01592    0x07a2, 0x0388},             /*         Greek_EPSILONaccent Έ GREEK CAPITAL LETTER EPSILON WITH TONOS */
01593    {
01594    0x07a3, 0x0389},             /*             Greek_ETAaccent Ή GREEK CAPITAL LETTER ETA WITH TONOS */
01595    {
01596    0x07a4, 0x038a},             /*            Greek_IOTAaccent Ί GREEK CAPITAL LETTER IOTA WITH TONOS */
01597    {
01598    0x07a5, 0x03aa},             /*         Greek_IOTAdiaeresis Ϊ GREEK CAPITAL LETTER IOTA WITH DIALYTIKA */
01599    {
01600    0x07a7, 0x038c},             /*         Greek_OMICRONaccent Ό GREEK CAPITAL LETTER OMICRON WITH TONOS */
01601    {
01602    0x07a8, 0x038e},             /*         Greek_UPSILONaccent Ύ GREEK CAPITAL LETTER UPSILON WITH TONOS */
01603    {
01604    0x07a9, 0x03ab},             /*       Greek_UPSILONdieresis Ϋ GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA */
01605    {
01606    0x07ab, 0x038f},             /*           Greek_OMEGAaccent Ώ GREEK CAPITAL LETTER OMEGA WITH TONOS */
01607    {
01608    0x07ae, 0x0385},             /*        Greek_accentdieresis ΅ GREEK DIALYTIKA TONOS */
01609    {
01610    0x07af, 0x2015},             /*              Greek_horizbar ― HORIZONTAL BAR */
01611    {
01612    0x07b1, 0x03ac},             /*           Greek_alphaaccent ά GREEK SMALL LETTER ALPHA WITH TONOS */
01613    {
01614    0x07b2, 0x03ad},             /*         Greek_epsilonaccent έ GREEK SMALL LETTER EPSILON WITH TONOS */
01615    {
01616    0x07b3, 0x03ae},             /*             Greek_etaaccent ή GREEK SMALL LETTER ETA WITH TONOS */
01617    {
01618    0x07b4, 0x03af},             /*            Greek_iotaaccent ί GREEK SMALL LETTER IOTA WITH TONOS */
01619    {
01620    0x07b5, 0x03ca},             /*          Greek_iotadieresis ϊ GREEK SMALL LETTER IOTA WITH DIALYTIKA */
01621    {
01622    0x07b6, 0x0390},             /*    Greek_iotaaccentdieresis ΐ GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS */
01623    {
01624    0x07b7, 0x03cc},             /*         Greek_omicronaccent ό GREEK SMALL LETTER OMICRON WITH TONOS */
01625    {
01626    0x07b8, 0x03cd},             /*         Greek_upsilonaccent ύ GREEK SMALL LETTER UPSILON WITH TONOS */
01627    {
01628    0x07b9, 0x03cb},             /*       Greek_upsilondieresis ϋ GREEK SMALL LETTER UPSILON WITH DIALYTIKA */
01629    {
01630    0x07ba, 0x03b0},             /* Greek_upsilonaccentdieresis ΰ GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS */
01631    {
01632    0x07bb, 0x03ce},             /*           Greek_omegaaccent ώ GREEK SMALL LETTER OMEGA WITH TONOS */
01633    {
01634    0x07c1, 0x0391},             /*                 Greek_ALPHA Α GREEK CAPITAL LETTER ALPHA */
01635    {
01636    0x07c2, 0x0392},             /*                  Greek_BETA Β GREEK CAPITAL LETTER BETA */
01637    {
01638    0x07c3, 0x0393},             /*                 Greek_GAMMA Γ GREEK CAPITAL LETTER GAMMA */
01639    {
01640    0x07c4, 0x0394},             /*                 Greek_DELTA Δ GREEK CAPITAL LETTER DELTA */
01641    {
01642    0x07c5, 0x0395},             /*               Greek_EPSILON Ε GREEK CAPITAL LETTER EPSILON */
01643    {
01644    0x07c6, 0x0396},             /*                  Greek_ZETA Ζ GREEK CAPITAL LETTER ZETA */
01645    {
01646    0x07c7, 0x0397},             /*                   Greek_ETA Η GREEK CAPITAL LETTER ETA */
01647    {
01648    0x07c8, 0x0398},             /*                 Greek_THETA Θ GREEK CAPITAL LETTER THETA */
01649    {
01650    0x07c9, 0x0399},             /*                  Greek_IOTA Ι GREEK CAPITAL LETTER IOTA */
01651    {
01652    0x07ca, 0x039a},             /*                 Greek_KAPPA Κ GREEK CAPITAL LETTER KAPPA */
01653    {
01654    0x07cb, 0x039b},             /*                Greek_LAMBDA Λ GREEK CAPITAL LETTER LAMDA */
01655    {
01656    0x07cc, 0x039c},             /*                    Greek_MU Μ GREEK CAPITAL LETTER MU */
01657    {
01658    0x07cd, 0x039d},             /*                    Greek_NU Ν GREEK CAPITAL LETTER NU */
01659    {
01660    0x07ce, 0x039e},             /*                    Greek_XI Ξ GREEK CAPITAL LETTER XI */
01661    {
01662    0x07cf, 0x039f},             /*               Greek_OMICRON Ο GREEK CAPITAL LETTER OMICRON */
01663    {
01664    0x07d0, 0x03a0},             /*                    Greek_PI Π GREEK CAPITAL LETTER PI */
01665    {
01666    0x07d1, 0x03a1},             /*                   Greek_RHO Ρ GREEK CAPITAL LETTER RHO */
01667    {
01668    0x07d2, 0x03a3},             /*                 Greek_SIGMA Σ GREEK CAPITAL LETTER SIGMA */
01669    {
01670    0x07d4, 0x03a4},             /*                   Greek_TAU Τ GREEK CAPITAL LETTER TAU */
01671    {
01672    0x07d5, 0x03a5},             /*               Greek_UPSILON Υ GREEK CAPITAL LETTER UPSILON */
01673    {
01674    0x07d6, 0x03a6},             /*                   Greek_PHI Φ GREEK CAPITAL LETTER PHI */
01675    {
01676    0x07d7, 0x03a7},             /*                   Greek_CHI Χ GREEK CAPITAL LETTER CHI */
01677    {
01678    0x07d8, 0x03a8},             /*                   Greek_PSI Ψ GREEK CAPITAL LETTER PSI */
01679    {
01680    0x07d9, 0x03a9},             /*                 Greek_OMEGA Ω GREEK CAPITAL LETTER OMEGA */
01681    {
01682    0x07e1, 0x03b1},             /*                 Greek_alpha α GREEK SMALL LETTER ALPHA */
01683    {
01684    0x07e2, 0x03b2},             /*                  Greek_beta β GREEK SMALL LETTER BETA */
01685    {
01686    0x07e3, 0x03b3},             /*                 Greek_gamma γ GREEK SMALL LETTER GAMMA */
01687    {
01688    0x07e4, 0x03b4},             /*                 Greek_delta δ GREEK SMALL LETTER DELTA */
01689    {
01690    0x07e5, 0x03b5},             /*               Greek_epsilon ε GREEK SMALL LETTER EPSILON */
01691    {
01692    0x07e6, 0x03b6},             /*                  Greek_zeta ζ GREEK SMALL LETTER ZETA */
01693    {
01694    0x07e7, 0x03b7},             /*                   Greek_eta η GREEK SMALL LETTER ETA */
01695    {
01696    0x07e8, 0x03b8},             /*                 Greek_theta θ GREEK SMALL LETTER THETA */
01697    {
01698    0x07e9, 0x03b9},             /*                  Greek_iota ι GREEK SMALL LETTER IOTA */
01699    {
01700    0x07ea, 0x03ba},             /*                 Greek_kappa κ GREEK SMALL LETTER KAPPA */
01701    {
01702    0x07eb, 0x03bb},             /*                Greek_lambda λ GREEK SMALL LETTER LAMDA */
01703    {
01704    0x07ec, 0x03bc},             /*                    Greek_mu μ GREEK SMALL LETTER MU */
01705    {
01706    0x07ed, 0x03bd},             /*                    Greek_nu ν GREEK SMALL LETTER NU */
01707    {
01708    0x07ee, 0x03be},             /*                    Greek_xi ξ GREEK SMALL LETTER XI */
01709    {
01710    0x07ef, 0x03bf},             /*               Greek_omicron ο GREEK SMALL LETTER OMICRON */
01711    {
01712    0x07f0, 0x03c0},             /*                    Greek_pi π GREEK SMALL LETTER PI */
01713    {
01714    0x07f1, 0x03c1},             /*                   Greek_rho ρ GREEK SMALL LETTER RHO */
01715    {
01716    0x07f2, 0x03c3},             /*                 Greek_sigma σ GREEK SMALL LETTER SIGMA */
01717    {
01718    0x07f3, 0x03c2},             /*       Greek_finalsmallsigma ς GREEK SMALL LETTER FINAL SIGMA */
01719    {
01720    0x07f4, 0x03c4},             /*                   Greek_tau τ GREEK SMALL LETTER TAU */
01721    {
01722    0x07f5, 0x03c5},             /*               Greek_upsilon υ GREEK SMALL LETTER UPSILON */
01723    {
01724    0x07f6, 0x03c6},             /*                   Greek_phi φ GREEK SMALL LETTER PHI */
01725    {
01726    0x07f7, 0x03c7},             /*                   Greek_chi χ GREEK SMALL LETTER CHI */
01727    {
01728    0x07f8, 0x03c8},             /*                   Greek_psi ψ GREEK SMALL LETTER PSI */
01729    {
01730    0x07f9, 0x03c9},             /*                 Greek_omega ω GREEK SMALL LETTER OMEGA */
01731 /*  0x08a1                               leftradical ? ??? */
01732 /*  0x08a2                            topleftradical ? ??? */
01733 /*  0x08a3                            horizconnector ? ??? */
01734    {
01735    0x08a4, 0x2320},             /*                 topintegral ⌠ TOP HALF INTEGRAL */
01736    {
01737    0x08a5, 0x2321},             /*                 botintegral ⌡ BOTTOM HALF INTEGRAL */
01738    {
01739    0x08a6, 0x2502},             /*               vertconnector │ BOX DRAWINGS LIGHT VERTICAL */
01740 /*  0x08a7                          topleftsqbracket ? ??? */
01741 /*  0x08a8                          botleftsqbracket ? ??? */
01742 /*  0x08a9                         toprightsqbracket ? ??? */
01743 /*  0x08aa                         botrightsqbracket ? ??? */
01744 /*  0x08ab                             topleftparens ? ??? */
01745 /*  0x08ac                             botleftparens ? ??? */
01746 /*  0x08ad                            toprightparens ? ??? */
01747 /*  0x08ae                            botrightparens ? ??? */
01748 /*  0x08af                      leftmiddlecurlybrace ? ??? */
01749 /*  0x08b0                     rightmiddlecurlybrace ? ??? */
01750 /*  0x08b1                          topleftsummation ? ??? */
01751 /*  0x08b2                          botleftsummation ? ??? */
01752 /*  0x08b3                 topvertsummationconnector ? ??? */
01753 /*  0x08b4                 botvertsummationconnector ? ??? */
01754 /*  0x08b5                         toprightsummation ? ??? */
01755 /*  0x08b6                         botrightsummation ? ??? */
01756 /*  0x08b7                      rightmiddlesummation ? ??? */
01757    {
01758    0x08bc, 0x2264},             /*               lessthanequal ≤ LESS-THAN OR EQUAL TO */
01759    {
01760    0x08bd, 0x2260},             /*                    notequal ≠ NOT EQUAL TO */
01761    {
01762    0x08be, 0x2265},             /*            greaterthanequal ≥ GREATER-THAN OR EQUAL TO */
01763    {
01764    0x08bf, 0x222b},             /*                    integral ∫ INTEGRAL */
01765    {
01766    0x08c0, 0x2234},             /*                   therefore ∴ THEREFORE */
01767    {
01768    0x08c1, 0x221d},             /*                   variation ∝ PROPORTIONAL TO */
01769    {
01770    0x08c2, 0x221e},             /*                    infinity ∞ INFINITY */
01771    {
01772    0x08c5, 0x2207},             /*                       nabla ∇ NABLA */
01773    {
01774    0x08c8, 0x2245},             /*                 approximate ≅ APPROXIMATELY EQUAL TO */
01775 /*  0x08c9                              similarequal ? ??? */
01776    {
01777    0x08cd, 0x21d4},             /*                    ifonlyif ⇔ LEFT RIGHT DOUBLE ARROW */
01778    {
01779    0x08ce, 0x21d2},             /*                     implies ⇒ RIGHTWARDS DOUBLE ARROW */
01780    {
01781    0x08cf, 0x2261},             /*                   identical ≡ IDENTICAL TO */
01782    {
01783    0x08d6, 0x221a},             /*                     radical √ SQUARE ROOT */
01784    {
01785    0x08da, 0x2282},             /*                  includedin ⊂ SUBSET OF */
01786    {
01787    0x08db, 0x2283},             /*                    includes ⊃ SUPERSET OF */
01788    {
01789    0x08dc, 0x2229},             /*                intersection ∩ INTERSECTION */
01790    {
01791    0x08dd, 0x222a},             /*                       union ∪ UNION */
01792    {
01793    0x08de, 0x2227},             /*                  logicaland ∧ LOGICAL AND */
01794    {
01795    0x08df, 0x2228},             /*                   logicalor ∨ LOGICAL OR */
01796    {
01797    0x08ef, 0x2202},             /*           partialderivative ∂ PARTIAL DIFFERENTIAL */
01798    {
01799    0x08f6, 0x0192},             /*                    function ƒ LATIN SMALL LETTER F WITH HOOK */
01800    {
01801    0x08fb, 0x2190},             /*                   leftarrow ← LEFTWARDS ARROW */
01802    {
01803    0x08fc, 0x2191},             /*                     uparrow ↑ UPWARDS ARROW */
01804    {
01805    0x08fd, 0x2192},             /*                  rightarrow → RIGHTWARDS ARROW */
01806    {
01807    0x08fe, 0x2193},             /*                   downarrow ↓ DOWNWARDS ARROW */
01808    {
01809    0x09df, 0x2422},             /*                       blank ␢ BLANK SYMBOL */
01810    {
01811    0x09e0, 0x25c6},             /*                soliddiamond ◆ BLACK DIAMOND */
01812    {
01813    0x09e1, 0x2592},             /*                checkerboard ▒ MEDIUM SHADE */
01814    {
01815    0x09e2, 0x2409},             /*                          ht ␉ SYMBOL FOR HORIZONTAL TABULATION */
01816    {
01817    0x09e3, 0x240c},             /*                          ff ␌ SYMBOL FOR FORM FEED */
01818    {
01819    0x09e4, 0x240d},             /*                          cr ␍ SYMBOL FOR CARRIAGE RETURN */
01820    {
01821    0x09e5, 0x240a},             /*                          lf ␊ SYMBOL FOR LINE FEED */
01822    {
01823    0x09e8, 0x2424},             /*                          nl ␤ SYMBOL FOR NEWLINE */
01824    {
01825    0x09e9, 0x240b},             /*                          vt ␋ SYMBOL FOR VERTICAL TABULATION */
01826    {
01827    0x09ea, 0x2518},             /*              lowrightcorner ┘ BOX DRAWINGS LIGHT UP AND LEFT */
01828    {
01829    0x09eb, 0x2510},             /*               uprightcorner ┐ BOX DRAWINGS LIGHT DOWN AND LEFT */
01830    {
01831    0x09ec, 0x250c},             /*                upleftcorner ┌ BOX DRAWINGS LIGHT DOWN AND RIGHT */
01832    {
01833    0x09ed, 0x2514},             /*               lowleftcorner └ BOX DRAWINGS LIGHT UP AND RIGHT */
01834    {
01835    0x09ee, 0x253c},             /*               crossinglines ┼ BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL */
01836 /*  0x09ef                            horizlinescan1 ? ??? */
01837 /*  0x09f0                            horizlinescan3 ? ??? */
01838    {
01839    0x09f1, 0x2500},             /*              horizlinescan5 ─ BOX DRAWINGS LIGHT HORIZONTAL */
01840 /*  0x09f2                            horizlinescan7 ? ??? */
01841 /*  0x09f3                            horizlinescan9 ? ??? */
01842    {
01843    0x09f4, 0x251c},             /*                       leftt ├ BOX DRAWINGS LIGHT VERTICAL AND RIGHT */
01844    {
01845    0x09f5, 0x2524},             /*                      rightt ┤ BOX DRAWINGS LIGHT VERTICAL AND LEFT */
01846    {
01847    0x09f6, 0x2534},             /*                        bott ┴ BOX DRAWINGS LIGHT UP AND HORIZONTAL */
01848    {
01849    0x09f7, 0x252c},             /*                        topt ┬ BOX DRAWINGS LIGHT DOWN AND HORIZONTAL */
01850    {
01851    0x09f8, 0x2502},             /*                     vertbar │ BOX DRAWINGS LIGHT VERTICAL */
01852    {
01853    0x0aa1, 0x2003},             /*                     emspace   EM SPACE */
01854    {
01855    0x0aa2, 0x2002},             /*                     enspace   EN SPACE */
01856    {
01857    0x0aa3, 0x2004},             /*                    em3space   THREE-PER-EM SPACE */
01858    {
01859    0x0aa4, 0x2005},             /*                    em4space   FOUR-PER-EM SPACE */
01860    {
01861    0x0aa5, 0x2007},             /*                  digitspace   FIGURE SPACE */
01862    {
01863    0x0aa6, 0x2008},             /*                  punctspace   PUNCTUATION SPACE */
01864    {
01865    0x0aa7, 0x2009},             /*                   thinspace   THIN SPACE */
01866    {
01867    0x0aa8, 0x200a},             /*                   hairspace   HAIR SPACE */
01868    {
01869    0x0aa9, 0x2014},             /*                      emdash — EM DASH */
01870    {
01871    0x0aaa, 0x2013},             /*                      endash – EN DASH */
01872 /*  0x0aac                               signifblank ? ??? */
01873    {
01874    0x0aae, 0x2026},             /*                    ellipsis … HORIZONTAL ELLIPSIS */
01875 /*  0x0aaf                           doubbaselinedot ? ??? */
01876    {
01877    0x0ab0, 0x2153},             /*                    onethird ⅓ VULGAR FRACTION ONE THIRD */
01878    {
01879    0x0ab1, 0x2154},             /*                   twothirds ⅔ VULGAR FRACTION TWO THIRDS */
01880    {
01881    0x0ab2, 0x2155},             /*                    onefifth ⅕ VULGAR FRACTION ONE FIFTH */
01882    {
01883    0x0ab3, 0x2156},             /*                   twofifths ⅖ VULGAR FRACTION TWO FIFTHS */
01884    {
01885    0x0ab4, 0x2157},             /*                 threefifths ⅗ VULGAR FRACTION THREE FIFTHS */
01886    {
01887    0x0ab5, 0x2158},             /*                  fourfifths ⅘ VULGAR FRACTION FOUR FIFTHS */
01888    {
01889    0x0ab6, 0x2159},             /*                    onesixth ⅙ VULGAR FRACTION ONE SIXTH */
01890    {
01891    0x0ab7, 0x215a},             /*                  fivesixths ⅚ VULGAR FRACTION FIVE SIXTHS */
01892    {
01893    0x0ab8, 0x2105},             /*                      careof ℅ CARE OF */
01894    {
01895    0x0abb, 0x2012},             /*                     figdash ‒ FIGURE DASH */
01896    {
01897    0x0abc, 0x2329},             /*            leftanglebracket 〈 LEFT-POINTING ANGLE BRACKET */
01898    {
01899    0x0abd, 0x002e},             /*                decimalpoint . FULL STOP */
01900    {
01901    0x0abe, 0x232a},             /*           rightanglebracket 〉 RIGHT-POINTING ANGLE BRACKET */
01902 /*  0x0abf                                    marker ? ??? */
01903    {
01904    0x0ac3, 0x215b},             /*                   oneeighth ⅛ VULGAR FRACTION ONE EIGHTH */
01905    {
01906    0x0ac4, 0x215c},             /*                threeeighths ⅜ VULGAR FRACTION THREE EIGHTHS */
01907    {
01908    0x0ac5, 0x215d},             /*                 fiveeighths ⅝ VULGAR FRACTION FIVE EIGHTHS */
01909    {
01910    0x0ac6, 0x215e},             /*                seveneighths ⅞ VULGAR FRACTION SEVEN EIGHTHS */
01911    {
01912    0x0ac9, 0x2122},             /*                   trademark ™ TRADE MARK SIGN */
01913    {
01914    0x0aca, 0x2613},             /*               signaturemark ☓ SALTIRE */
01915 /*  0x0acb                         trademarkincircle ? ??? */
01916    {
01917    0x0acc, 0x25c1},             /*            leftopentriangle ◁ WHITE LEFT-POINTING TRIANGLE */
01918    {
01919    0x0acd, 0x25b7},             /*           rightopentriangle ▷ WHITE RIGHT-POINTING TRIANGLE */
01920    {
01921    0x0ace, 0x25cb},             /*                emopencircle ○ WHITE CIRCLE */
01922    {
01923    0x0acf, 0x25a1},             /*             emopenrectangle □ WHITE SQUARE */
01924    {
01925    0x0ad0, 0x2018},             /*         leftsinglequotemark ‘ LEFT SINGLE QUOTATION MARK */
01926    {
01927    0x0ad1, 0x2019},             /*        rightsinglequotemark ’ RIGHT SINGLE QUOTATION MARK */
01928    {
01929    0x0ad2, 0x201c},             /*         leftdoublequotemark “ LEFT DOUBLE QUOTATION MARK */
01930    {
01931    0x0ad3, 0x201d},             /*        rightdoublequotemark ” RIGHT DOUBLE QUOTATION MARK */
01932    {
01933    0x0ad4, 0x211e},             /*                prescription ℞ PRESCRIPTION TAKE */
01934    {
01935    0x0ad6, 0x2032},             /*                     minutes ′ PRIME */
01936    {
01937    0x0ad7, 0x2033},             /*                     seconds ″ DOUBLE PRIME */
01938    {
01939    0x0ad9, 0x271d},             /*                  latincross ✝ LATIN CROSS */
01940 /*  0x0ada                                  hexagram ? ??? */
01941    {
01942    0x0adb, 0x25ac},             /*            filledrectbullet ▬ BLACK RECTANGLE */
01943    {
01944    0x0adc, 0x25c0},             /*         filledlefttribullet ◀ BLACK LEFT-POINTING TRIANGLE */
01945    {
01946    0x0add, 0x25b6},             /*        filledrighttribullet ▶ BLACK RIGHT-POINTING TRIANGLE */
01947    {
01948    0x0ade, 0x25cf},             /*              emfilledcircle ● BLACK CIRCLE */
01949    {
01950    0x0adf, 0x25a0},             /*                emfilledrect ■ BLACK SQUARE */
01951    {
01952    0x0ae0, 0x25e6},             /*            enopencircbullet ◦ WHITE BULLET */
01953    {
01954    0x0ae1, 0x25ab},             /*          enopensquarebullet ▫ WHITE SMALL SQUARE */
01955    {
01956    0x0ae2, 0x25ad},             /*              openrectbullet ▭ WHITE RECTANGLE */
01957    {
01958    0x0ae3, 0x25b3},             /*             opentribulletup △ WHITE UP-POINTING TRIANGLE */
01959    {
01960    0x0ae4, 0x25bd},             /*           opentribulletdown ▽ WHITE DOWN-POINTING TRIANGLE */
01961    {
01962    0x0ae5, 0x2606},             /*                    openstar ☆ WHITE STAR */
01963    {
01964    0x0ae6, 0x2022},             /*          enfilledcircbullet • BULLET */
01965    {
01966    0x0ae7, 0x25aa},             /*            enfilledsqbullet ▪ BLACK SMALL SQUARE */
01967    {
01968    0x0ae8, 0x25b2},             /*           filledtribulletup ▲ BLACK UP-POINTING TRIANGLE */
01969    {
01970    0x0ae9, 0x25bc},             /*         filledtribulletdown ▼ BLACK DOWN-POINTING TRIANGLE */
01971    {
01972    0x0aea, 0x261c},             /*                 leftpointer ☜ WHITE LEFT POINTING INDEX */
01973    {
01974    0x0aeb, 0x261e},             /*                rightpointer ☞ WHITE RIGHT POINTING INDEX */
01975    {
01976    0x0aec, 0x2663},             /*                        club ♣ BLACK CLUB SUIT */
01977    {
01978    0x0aed, 0x2666},             /*                     diamond ♦ BLACK DIAMOND SUIT */
01979    {
01980    0x0aee, 0x2665},             /*                       heart ♥ BLACK HEART SUIT */
01981    {
01982    0x0af0, 0x2720},             /*                maltesecross ✠ MALTESE CROSS */
01983    {
01984    0x0af1, 0x2020},             /*                      dagger † DAGGER */
01985    {
01986    0x0af2, 0x2021},             /*                doubledagger ‡ DOUBLE DAGGER */
01987    {
01988    0x0af3, 0x2713},             /*                   checkmark ✓ CHECK MARK */
01989    {
01990    0x0af4, 0x2717},             /*                 ballotcross ✗ BALLOT X */
01991    {
01992    0x0af5, 0x266f},             /*                musicalsharp ♯ MUSIC SHARP SIGN */
01993    {
01994    0x0af6, 0x266d},             /*                 musicalflat ♭ MUSIC FLAT SIGN */
01995    {
01996    0x0af7, 0x2642},             /*                  malesymbol ♂ MALE SIGN */
01997    {
01998    0x0af8, 0x2640},             /*                femalesymbol ♀ FEMALE SIGN */
01999    {
02000    0x0af9, 0x260e},             /*                   telephone ☎ BLACK TELEPHONE */
02001    {
02002    0x0afa, 0x2315},             /*           telephonerecorder ⌕ TELEPHONE RECORDER */
02003    {
02004    0x0afb, 0x2117},             /*         phonographcopyright ℗ SOUND RECORDING COPYRIGHT */
02005    {
02006    0x0afc, 0x2038},             /*                       caret ‸ CARET */
02007    {
02008    0x0afd, 0x201a},             /*          singlelowquotemark ‚ SINGLE LOW-9 QUOTATION MARK */
02009    {
02010    0x0afe, 0x201e},             /*          doublelowquotemark „ DOUBLE LOW-9 QUOTATION MARK */
02011 /*  0x0aff                                    cursor ? ??? */
02012    {
02013    0x0ba3, 0x003c},             /*                   leftcaret < LESS-THAN SIGN */
02014    {
02015    0x0ba6, 0x003e},             /*                  rightcaret > GREATER-THAN SIGN */
02016    {
02017    0x0ba8, 0x2228},             /*                   downcaret ∨ LOGICAL OR */
02018    {
02019    0x0ba9, 0x2227},             /*                     upcaret ∧ LOGICAL AND */
02020    {
02021    0x0bc0, 0x00af},             /*                     overbar ¯ MACRON */
02022    {
02023    0x0bc2, 0x22a4},             /*                    downtack ⊤ DOWN TACK */
02024    {
02025    0x0bc3, 0x2229},             /*                      upshoe ∩ INTERSECTION */
02026    {
02027    0x0bc4, 0x230a},             /*                   downstile ⌊ LEFT FLOOR */
02028    {
02029    0x0bc6, 0x005f},             /*                    underbar _ LOW LINE */
02030    {
02031    0x0bca, 0x2218},             /*                         jot ∘ RING OPERATOR */
02032    {
02033    0x0bcc, 0x2395},             /*                        quad ⎕ APL FUNCTIONAL SYMBOL QUAD (Unicode 3.0) */
02034    {
02035    0x0bce, 0x22a5},             /*                      uptack ⊥ UP TACK */
02036    {
02037    0x0bcf, 0x25cb},             /*                      circle ○ WHITE CIRCLE */
02038    {
02039    0x0bd3, 0x2308},             /*                     upstile ⌈ LEFT CEILING */
02040    {
02041    0x0bd6, 0x222a},             /*                    downshoe ∪ UNION */
02042    {
02043    0x0bd8, 0x2283},             /*                   rightshoe ⊃ SUPERSET OF */
02044    {
02045    0x0bda, 0x2282},             /*                    leftshoe ⊂ SUBSET OF */
02046    {
02047    0x0bdc, 0x22a3},             /*                    lefttack ⊣ LEFT TACK */
02048    {
02049    0x0bfc, 0x22a2},             /*                   righttack ⊢ RIGHT TACK */
02050    {
02051    0x0cdf, 0x2017},             /*        hebrew_doublelowline ‗ DOUBLE LOW LINE */
02052    {
02053    0x0ce0, 0x05d0},             /*                hebrew_aleph א HEBREW LETTER ALEF */
02054    {
02055    0x0ce1, 0x05d1},             /*                  hebrew_bet ב HEBREW LETTER BET */
02056    {
02057    0x0ce2, 0x05d2},             /*                hebrew_gimel ג HEBREW LETTER GIMEL */
02058    {
02059    0x0ce3, 0x05d3},             /*                hebrew_dalet ד HEBREW LETTER DALET */
02060    {
02061    0x0ce4, 0x05d4},             /*                   hebrew_he ה HEBREW LETTER HE */
02062    {
02063    0x0ce5, 0x05d5},             /*                  hebrew_waw ו HEBREW LETTER VAV */
02064    {
02065    0x0ce6, 0x05d6},             /*                 hebrew_zain ז HEBREW LETTER ZAYIN */
02066    {
02067    0x0ce7, 0x05d7},             /*                 hebrew_chet ח HEBREW LETTER HET */
02068    {
02069    0x0ce8, 0x05d8},             /*                  hebrew_tet ט HEBREW LETTER TET */
02070    {
02071    0x0ce9, 0x05d9},             /*                  hebrew_yod י HEBREW LETTER YOD */
02072    {
02073    0x0cea, 0x05da},             /*            hebrew_finalkaph ך HEBREW LETTER FINAL KAF */
02074    {
02075    0x0ceb, 0x05db},             /*                 hebrew_kaph כ HEBREW LETTER KAF */
02076    {
02077    0x0cec, 0x05dc},             /*                hebrew_lamed ל HEBREW LETTER LAMED */
02078    {
02079    0x0ced, 0x05dd},             /*             hebrew_finalmem ם HEBREW LETTER FINAL MEM */
02080    {
02081    0x0cee, 0x05de},             /*                  hebrew_mem מ HEBREW LETTER MEM */
02082    {
02083    0x0cef, 0x05df},             /*             hebrew_finalnun ן HEBREW LETTER FINAL NUN */
02084    {
02085    0x0cf0, 0x05e0},             /*                  hebrew_nun נ HEBREW LETTER NUN */
02086    {
02087    0x0cf1, 0x05e1},             /*               hebrew_samech ס HEBREW LETTER SAMEKH */
02088    {
02089    0x0cf2, 0x05e2},             /*                 hebrew_ayin ע HEBREW LETTER AYIN */
02090    {
02091    0x0cf3, 0x05e3},             /*              hebrew_finalpe ף HEBREW LETTER FINAL PE */
02092    {
02093    0x0cf4, 0x05e4},             /*                   hebrew_pe פ HEBREW LETTER PE */
02094    {
02095    0x0cf5, 0x05e5},             /*            hebrew_finalzade ץ HEBREW LETTER FINAL TSADI */
02096    {
02097    0x0cf6, 0x05e6},             /*                 hebrew_zade צ HEBREW LETTER TSADI */
02098    {
02099    0x0cf7, 0x05e7},             /*                 hebrew_qoph ק HEBREW LETTER QOF */
02100    {
02101    0x0cf8, 0x05e8},             /*                 hebrew_resh ר HEBREW LETTER RESH */
02102    {
02103    0x0cf9, 0x05e9},             /*                 hebrew_shin ש HEBREW LETTER SHIN */
02104    {
02105    0x0cfa, 0x05ea},             /*                  hebrew_taw ת HEBREW LETTER TAV */
02106    {
02107    0x0da1, 0x0e01},             /*                  Thai_kokai ก THAI CHARACTER KO KAI */
02108    {
02109    0x0da2, 0x0e02},             /*                Thai_khokhai ข THAI CHARACTER KHO KHAI */
02110    {
02111    0x0da3, 0x0e03},             /*               Thai_khokhuat ฃ THAI CHARACTER KHO KHUAT */
02112    {
02113    0x0da4, 0x0e04},             /*               Thai_khokhwai ค THAI CHARACTER KHO KHWAI */
02114    {
02115    0x0da5, 0x0e05},             /*                Thai_khokhon ฅ THAI CHARACTER KHO KHON */
02116    {
02117    0x0da6, 0x0e06},             /*             Thai_khorakhang ฆ THAI CHARACTER KHO RAKHANG */
02118    {
02119    0x0da7, 0x0e07},             /*                 Thai_ngongu ง THAI CHARACTER NGO NGU */
02120    {
02121    0x0da8, 0x0e08},             /*                Thai_chochan จ THAI CHARACTER CHO CHAN */
02122    {
02123    0x0da9, 0x0e09},             /*               Thai_choching ฉ THAI CHARACTER CHO CHING */
02124    {
02125    0x0daa, 0x0e0a},             /*               Thai_chochang ช THAI CHARACTER CHO CHANG */
02126    {
02127    0x0dab, 0x0e0b},             /*                   Thai_soso ซ THAI CHARACTER SO SO */
02128    {
02129    0x0dac, 0x0e0c},             /*                Thai_chochoe ฌ THAI CHARACTER CHO CHOE */
02130    {
02131    0x0dad, 0x0e0d},             /*                 Thai_yoying ญ THAI CHARACTER YO YING */
02132    {
02133    0x0dae, 0x0e0e},             /*                Thai_dochada ฎ THAI CHARACTER DO CHADA */
02134    {
02135    0x0daf, 0x0e0f},             /*                Thai_topatak ฏ THAI CHARACTER TO PATAK */
02136    {
02137    0x0db0, 0x0e10},             /*                Thai_thothan ฐ THAI CHARACTER THO THAN */
02138    {
02139    0x0db1, 0x0e11},             /*          Thai_thonangmontho ฑ THAI CHARACTER THO NANGMONTHO */
02140    {
02141    0x0db2, 0x0e12},             /*             Thai_thophuthao ฒ THAI CHARACTER THO PHUTHAO */
02142    {
02143    0x0db3, 0x0e13},             /*                  Thai_nonen ณ THAI CHARACTER NO NEN */
02144    {
02145    0x0db4, 0x0e14},             /*                  Thai_dodek ด THAI CHARACTER DO DEK */
02146    {
02147    0x0db5, 0x0e15},             /*                  Thai_totao ต THAI CHARACTER TO TAO */
02148    {
02149    0x0db6, 0x0e16},             /*               Thai_thothung ถ THAI CHARACTER THO THUNG */
02150    {
02151    0x0db7, 0x0e17},             /*              Thai_thothahan ท THAI CHARACTER THO THAHAN */
02152    {
02153    0x0db8, 0x0e18},             /*               Thai_thothong ธ THAI CHARACTER THO THONG */
02154    {
02155    0x0db9, 0x0e19},             /*                   Thai_nonu น THAI CHARACTER NO NU */
02156    {
02157    0x0dba, 0x0e1a},             /*               Thai_bobaimai บ THAI CHARACTER BO BAIMAI */
02158    {
02159    0x0dbb, 0x0e1b},             /*                  Thai_popla ป THAI CHARACTER PO PLA */
02160    {
02161    0x0dbc, 0x0e1c},             /*               Thai_phophung ผ THAI CHARACTER PHO PHUNG */
02162    {
02163    0x0dbd, 0x0e1d},             /*                   Thai_fofa ฝ THAI CHARACTER FO FA */
02164    {
02165    0x0dbe, 0x0e1e},             /*                Thai_phophan พ THAI CHARACTER PHO PHAN */
02166    {
02167    0x0dbf, 0x0e1f},             /*                  Thai_fofan ฟ THAI CHARACTER FO FAN */
02168    {
02169    0x0dc0, 0x0e20},             /*             Thai_phosamphao ภ THAI CHARACTER PHO SAMPHAO */
02170    {
02171    0x0dc1, 0x0e21},             /*                   Thai_moma ม THAI CHARACTER MO MA */
02172    {
02173    0x0dc2, 0x0e22},             /*                  Thai_yoyak ย THAI CHARACTER YO YAK */
02174    {
02175    0x0dc3, 0x0e23},             /*                  Thai_rorua ร THAI CHARACTER RO RUA */
02176    {
02177    0x0dc4, 0x0e24},             /*                     Thai_ru ฤ THAI CHARACTER RU */
02178    {
02179    0x0dc5, 0x0e25},             /*                 Thai_loling ล THAI CHARACTER LO LING */
02180    {
02181    0x0dc6, 0x0e26},             /*                     Thai_lu ฦ THAI CHARACTER LU */
02182    {
02183    0x0dc7, 0x0e27},             /*                 Thai_wowaen ว THAI CHARACTER WO WAEN */
02184    {
02185    0x0dc8, 0x0e28},             /*                 Thai_sosala ศ THAI CHARACTER SO SALA */
02186    {
02187    0x0dc9, 0x0e29},             /*                 Thai_sorusi ษ THAI CHARACTER SO RUSI */
02188    {
02189    0x0dca, 0x0e2a},             /*                  Thai_sosua ส THAI CHARACTER SO SUA */
02190    {
02191    0x0dcb, 0x0e2b},             /*                  Thai_hohip ห THAI CHARACTER HO HIP */
02192    {
02193    0x0dcc, 0x0e2c},             /*                Thai_lochula ฬ THAI CHARACTER LO CHULA */
02194    {
02195    0x0dcd, 0x0e2d},             /*                   Thai_oang อ THAI CHARACTER O ANG */
02196    {
02197    0x0dce, 0x0e2e},             /*               Thai_honokhuk ฮ THAI CHARACTER HO NOKHUK */
02198    {
02199    0x0dcf, 0x0e2f},             /*              Thai_paiyannoi ฯ THAI CHARACTER PAIYANNOI */
02200    {
02201    0x0dd0, 0x0e30},             /*                  Thai_saraa ะ THAI CHARACTER SARA A */
02202    {
02203    0x0dd1, 0x0e31},             /*             Thai_maihanakat ั THAI CHARACTER MAI HAN-AKAT */
02204    {
02205    0x0dd2, 0x0e32},             /*                 Thai_saraaa า THAI CHARACTER SARA AA */
02206    {
02207    0x0dd3, 0x0e33},             /*                 Thai_saraam ำ THAI CHARACTER SARA AM */
02208    {
02209    0x0dd4, 0x0e34},             /*                  Thai_sarai ิ THAI CHARACTER SARA I */
02210    {
02211    0x0dd5, 0x0e35},             /*                 Thai_saraii ี THAI CHARACTER SARA II */
02212    {
02213    0x0dd6, 0x0e36},             /*                 Thai_saraue ึ THAI CHARACTER SARA UE */
02214    {
02215    0x0dd7, 0x0e37},             /*                Thai_sarauee ื THAI CHARACTER SARA UEE */
02216    {
02217    0x0dd8, 0x0e38},             /*                  Thai_sarau ุ THAI CHARACTER SARA U */
02218    {
02219    0x0dd9, 0x0e39},             /*                 Thai_sarauu ู THAI CHARACTER SARA UU */
02220    {
02221    0x0dda, 0x0e3a},             /*                Thai_phinthu ฺ THAI CHARACTER PHINTHU */
02222    {
02223    0x0dde, 0x0e3e},             /*      Thai_maihanakat_maitho ฾ ??? */
02224    {
02225    0x0ddf, 0x0e3f},             /*                   Thai_baht ฿ THAI CURRENCY SYMBOL BAHT */
02226    {
02227    0x0de0, 0x0e40},             /*                  Thai_sarae เ THAI CHARACTER SARA E */
02228    {
02229    0x0de1, 0x0e41},             /*                 Thai_saraae แ THAI CHARACTER SARA AE */
02230    {
02231    0x0de2, 0x0e42},             /*                  Thai_sarao โ THAI CHARACTER SARA O */
02232    {
02233    0x0de3, 0x0e43},             /*          Thai_saraaimaimuan ใ THAI CHARACTER SARA AI MAIMUAN */
02234    {
02235    0x0de4, 0x0e44},             /*         Thai_saraaimaimalai ไ THAI CHARACTER SARA AI MAIMALAI */
02236    {
02237    0x0de5, 0x0e45},             /*            Thai_lakkhangyao ๅ THAI CHARACTER LAKKHANGYAO */
02238    {
02239    0x0de6, 0x0e46},             /*               Thai_maiyamok ๆ THAI CHARACTER MAIYAMOK */
02240    {
02241    0x0de7, 0x0e47},             /*              Thai_maitaikhu ็ THAI CHARACTER MAITAIKHU */
02242    {
02243    0x0de8, 0x0e48},             /*                  Thai_maiek ่ THAI CHARACTER MAI EK */
02244    {
02245    0x0de9, 0x0e49},             /*                 Thai_maitho ้ THAI CHARACTER MAI THO */
02246    {
02247    0x0dea, 0x0e4a},             /*                 Thai_maitri ๊ THAI CHARACTER MAI TRI */
02248    {
02249    0x0deb, 0x0e4b},             /*            Thai_maichattawa ๋ THAI CHARACTER MAI CHATTAWA */
02250    {
02251    0x0dec, 0x0e4c},             /*            Thai_thanthakhat ์ THAI CHARACTER THANTHAKHAT */
02252    {
02253    0x0ded, 0x0e4d},             /*               Thai_nikhahit ํ THAI CHARACTER NIKHAHIT */
02254    {
02255    0x0df0, 0x0e50},             /*                 Thai_leksun ๐ THAI DIGIT ZERO */
02256    {
02257    0x0df1, 0x0e51},             /*                Thai_leknung ๑ THAI DIGIT ONE */
02258    {
02259    0x0df2, 0x0e52},             /*                Thai_leksong ๒ THAI DIGIT TWO */
02260    {
02261    0x0df3, 0x0e53},             /*                 Thai_leksam ๓ THAI DIGIT THREE */
02262    {
02263    0x0df4, 0x0e54},             /*                  Thai_leksi ๔ THAI DIGIT FOUR */
02264    {
02265    0x0df5, 0x0e55},             /*                  Thai_lekha ๕ THAI DIGIT FIVE */
02266    {
02267    0x0df6, 0x0e56},             /*                 Thai_lekhok ๖ THAI DIGIT SIX */
02268    {
02269    0x0df7, 0x0e57},             /*                Thai_lekchet ๗ THAI DIGIT SEVEN */
02270    {
02271    0x0df8, 0x0e58},             /*                Thai_lekpaet ๘ THAI DIGIT EIGHT */
02272    {
02273    0x0df9, 0x0e59},             /*                 Thai_lekkao ๙ THAI DIGIT NINE */
02274    {
02275    0x0ea1, 0x3131},             /*               Hangul_Kiyeog ㄱ HANGUL LETTER KIYEOK */
02276    {
02277    0x0ea2, 0x3132},             /*          Hangul_SsangKiyeog ㄲ HANGUL LETTER SSANGKIYEOK */
02278    {
02279    0x0ea3, 0x3133},             /*           Hangul_KiyeogSios ㄳ HANGUL LETTER KIYEOK-SIOS */
02280    {
02281    0x0ea4, 0x3134},             /*                Hangul_Nieun ㄴ HANGUL LETTER NIEUN */
02282    {
02283    0x0ea5, 0x3135},             /*           Hangul_NieunJieuj ㄵ HANGUL LETTER NIEUN-CIEUC */
02284    {
02285    0x0ea6, 0x3136},             /*           Hangul_NieunHieuh ㄶ HANGUL LETTER NIEUN-HIEUH */
02286    {
02287    0x0ea7, 0x3137},             /*               Hangul_Dikeud ㄷ HANGUL LETTER TIKEUT */
02288    {
02289    0x0ea8, 0x3138},             /*          Hangul_SsangDikeud ㄸ HANGUL LETTER SSANGTIKEUT */
02290    {
02291    0x0ea9, 0x3139},             /*                Hangul_Rieul ㄹ HANGUL LETTER RIEUL */
02292    {
02293    0x0eaa, 0x313a},             /*          Hangul_RieulKiyeog ㄺ HANGUL LETTER RIEUL-KIYEOK */
02294    {
02295    0x0eab, 0x313b},             /*           Hangul_RieulMieum ㄻ HANGUL LETTER RIEUL-MIEUM */
02296    {
02297    0x0eac, 0x313c},             /*           Hangul_RieulPieub ㄼ HANGUL LETTER RIEUL-PIEUP */
02298    {
02299    0x0ead, 0x313d},             /*            Hangul_RieulSios ㄽ HANGUL LETTER RIEUL-SIOS */
02300    {
02301    0x0eae, 0x313e},             /*           Hangul_RieulTieut ㄾ HANGUL LETTER RIEUL-THIEUTH */
02302    {
02303    0x0eaf, 0x313f},             /*          Hangul_RieulPhieuf ㄿ HANGUL LETTER RIEUL-PHIEUPH */
02304    {
02305    0x0eb0, 0x3140},             /*           Hangul_RieulHieuh ㅀ HANGUL LETTER RIEUL-HIEUH */
02306    {
02307    0x0eb1, 0x3141},             /*                Hangul_Mieum ㅁ HANGUL LETTER MIEUM */
02308    {
02309    0x0eb2, 0x3142},             /*                Hangul_Pieub ㅂ HANGUL LETTER PIEUP */
02310    {
02311    0x0eb3, 0x3143},             /*           Hangul_SsangPieub ㅃ HANGUL LETTER SSANGPIEUP */
02312    {
02313    0x0eb4, 0x3144},             /*            Hangul_PieubSios ㅄ HANGUL LETTER PIEUP-SIOS */
02314    {
02315    0x0eb5, 0x3145},             /*                 Hangul_Sios ㅅ HANGUL LETTER SIOS */
02316    {
02317    0x0eb6, 0x3146},             /*            Hangul_SsangSios ㅆ HANGUL LETTER SSANGSIOS */
02318    {
02319    0x0eb7, 0x3147},             /*                Hangul_Ieung ㅇ HANGUL LETTER IEUNG */
02320    {
02321    0x0eb8, 0x3148},             /*                Hangul_Jieuj ㅈ HANGUL LETTER CIEUC */
02322    {
02323    0x0eb9, 0x3149},             /*           Hangul_SsangJieuj ㅉ HANGUL LETTER SSANGCIEUC */
02324    {
02325    0x0eba, 0x314a},             /*                Hangul_Cieuc ㅊ HANGUL LETTER CHIEUCH */
02326    {
02327    0x0ebb, 0x314b},             /*               Hangul_Khieuq ㅋ HANGUL LETTER KHIEUKH */
02328    {
02329    0x0ebc, 0x314c},             /*                Hangul_Tieut ㅌ HANGUL LETTER THIEUTH */
02330    {
02331    0x0ebd, 0x314d},             /*               Hangul_Phieuf ㅍ HANGUL LETTER PHIEUPH */
02332    {
02333    0x0ebe, 0x314e},             /*                Hangul_Hieuh ㅎ HANGUL LETTER HIEUH */
02334    {
02335    0x0ebf, 0x314f},             /*                    Hangul_A ㅏ HANGUL LETTER A */
02336    {
02337    0x0ec0, 0x3150},             /*                   Hangul_AE ㅐ HANGUL LETTER AE */
02338    {
02339    0x0ec1, 0x3151},             /*                   Hangul_YA ㅑ HANGUL LETTER YA */
02340    {
02341    0x0ec2, 0x3152},             /*                  Hangul_YAE ㅒ HANGUL LETTER YAE */
02342    {
02343    0x0ec3, 0x3153},             /*                   Hangul_EO ㅓ HANGUL LETTER EO */
02344    {
02345    0x0ec4, 0x3154},             /*                    Hangul_E ㅔ HANGUL LETTER E */
02346    {
02347    0x0ec5, 0x3155},             /*                  Hangul_YEO ㅕ HANGUL LETTER YEO */
02348    {
02349    0x0ec6, 0x3156},             /*                   Hangul_YE ㅖ HANGUL LETTER YE */
02350    {
02351    0x0ec7, 0x3157},             /*                    Hangul_O ㅗ HANGUL LETTER O */
02352    {
02353    0x0ec8, 0x3158},             /*                   Hangul_WA ㅘ HANGUL LETTER WA */
02354    {
02355    0x0ec9, 0x3159},             /*                  Hangul_WAE ㅙ HANGUL LETTER WAE */
02356    {
02357    0x0eca, 0x315a},             /*                   Hangul_OE ㅚ HANGUL LETTER OE */
02358    {
02359    0x0ecb, 0x315b},             /*                   Hangul_YO ㅛ HANGUL LETTER YO */
02360    {
02361    0x0ecc, 0x315c},             /*                    Hangul_U ㅜ HANGUL LETTER U */
02362    {
02363    0x0ecd, 0x315d},             /*                  Hangul_WEO ㅝ HANGUL LETTER WEO */
02364    {
02365    0x0ece, 0x315e},             /*                   Hangul_WE ㅞ HANGUL LETTER WE */
02366    {
02367    0x0ecf, 0x315f},             /*                   Hangul_WI ㅟ HANGUL LETTER WI */
02368    {
02369    0x0ed0, 0x3160},             /*                   Hangul_YU ㅠ HANGUL LETTER YU */
02370    {
02371    0x0ed1, 0x3161},             /*                   Hangul_EU ㅡ HANGUL LETTER EU */
02372    {
02373    0x0ed2, 0x3162},             /*                   Hangul_YI ㅢ HANGUL LETTER YI */
02374    {
02375    0x0ed3, 0x3163},             /*                    Hangul_I ㅣ HANGUL LETTER I */
02376    {
02377    0x0ed4, 0x11a8},             /*             Hangul_J_Kiyeog ᆨ HANGUL JONGSEONG KIYEOK */
02378    {
02379    0x0ed5, 0x11a9},             /*        Hangul_J_SsangKiyeog ᆩ HANGUL JONGSEONG SSANGKIYEOK */
02380    {
02381    0x0ed6, 0x11aa},             /*         Hangul_J_KiyeogSios ᆪ HANGUL JONGSEONG KIYEOK-SIOS */
02382    {
02383    0x0ed7, 0x11ab},             /*              Hangul_J_Nieun ᆫ HANGUL JONGSEONG NIEUN */
02384    {
02385    0x0ed8, 0x11ac},             /*         Hangul_J_NieunJieuj ᆬ HANGUL JONGSEONG NIEUN-CIEUC */
02386    {
02387    0x0ed9, 0x11ad},             /*         Hangul_J_NieunHieuh ᆭ HANGUL JONGSEONG NIEUN-HIEUH */
02388    {
02389    0x0eda, 0x11ae},             /*             Hangul_J_Dikeud ᆮ HANGUL JONGSEONG TIKEUT */
02390    {
02391    0x0edb, 0x11af},             /*              Hangul_J_Rieul ᆯ HANGUL JONGSEONG RIEUL */
02392    {
02393    0x0edc, 0x11b0},             /*        Hangul_J_RieulKiyeog ᆰ HANGUL JONGSEONG RIEUL-KIYEOK */
02394    {
02395    0x0edd, 0x11b1},             /*         Hangul_J_RieulMieum ᆱ HANGUL JONGSEONG RIEUL-MIEUM */
02396    {
02397    0x0ede, 0x11b2},             /*         Hangul_J_RieulPieub ᆲ HANGUL JONGSEONG RIEUL-PIEUP */
02398    {
02399    0x0edf, 0x11b3},             /*          Hangul_J_RieulSios ᆳ HANGUL JONGSEONG RIEUL-SIOS */
02400    {
02401    0x0ee0, 0x11b4},             /*         Hangul_J_RieulTieut ᆴ HANGUL JONGSEONG RIEUL-THIEUTH */
02402    {
02403    0x0ee1, 0x11b5},             /*        Hangul_J_RieulPhieuf ᆵ HANGUL JONGSEONG RIEUL-PHIEUPH */
02404    {
02405    0x0ee2, 0x11b6},             /*         Hangul_J_RieulHieuh ᆶ HANGUL JONGSEONG RIEUL-HIEUH */
02406    {
02407    0x0ee3, 0x11b7},             /*              Hangul_J_Mieum ᆷ HANGUL JONGSEONG MIEUM */
02408    {
02409    0x0ee4, 0x11b8},             /*              Hangul_J_Pieub ᆸ HANGUL JONGSEONG PIEUP */
02410    {
02411    0x0ee5, 0x11b9},             /*          Hangul_J_PieubSios ᆹ HANGUL JONGSEONG PIEUP-SIOS */
02412    {
02413    0x0ee6, 0x11ba},             /*               Hangul_J_Sios ᆺ HANGUL JONGSEONG SIOS */
02414    {
02415    0x0ee7, 0x11bb},             /*          Hangul_J_SsangSios ᆻ HANGUL JONGSEONG SSANGSIOS */
02416    {
02417    0x0ee8, 0x11bc},             /*              Hangul_J_Ieung ᆼ HANGUL JONGSEONG IEUNG */
02418    {
02419    0x0ee9, 0x11bd},             /*              Hangul_J_Jieuj ᆽ HANGUL JONGSEONG CIEUC */
02420    {
02421    0x0eea, 0x11be},             /*              Hangul_J_Cieuc ᆾ HANGUL JONGSEONG CHIEUCH */
02422    {
02423    0x0eeb, 0x11bf},             /*             Hangul_J_Khieuq ᆿ HANGUL JONGSEONG KHIEUKH */
02424    {
02425    0x0eec, 0x11c0},             /*              Hangul_J_Tieut ᇀ HANGUL JONGSEONG THIEUTH */
02426    {
02427    0x0eed, 0x11c1},             /*             Hangul_J_Phieuf ᇁ HANGUL JONGSEONG PHIEUPH */
02428    {
02429    0x0eee, 0x11c2},             /*              Hangul_J_Hieuh ᇂ HANGUL JONGSEONG HIEUH */
02430    {
02431    0x0eef, 0x316d},             /*     Hangul_RieulYeorinHieuh ㅭ HANGUL LETTER RIEUL-YEORINHIEUH */
02432    {
02433    0x0ef0, 0x3171},             /*    Hangul_SunkyeongeumMieum ㅱ HANGUL LETTER KAPYEOUNMIEUM */
02434    {
02435    0x0ef1, 0x3178},             /*    Hangul_SunkyeongeumPieub ㅸ HANGUL LETTER KAPYEOUNPIEUP */
02436    {
02437    0x0ef2, 0x317f},             /*              Hangul_PanSios ㅿ HANGUL LETTER PANSIOS */
02438 /*  0x0ef3                  Hangul_KkogjiDalrinIeung ? ??? */
02439    {
02440    0x0ef4, 0x3184},             /*   Hangul_SunkyeongeumPhieuf ㆄ HANGUL LETTER KAPYEOUNPHIEUPH */
02441    {
02442    0x0ef5, 0x3186},             /*          Hangul_YeorinHieuh ㆆ HANGUL LETTER YEORINHIEUH */
02443    {
02444    0x0ef6, 0x318d},             /*                Hangul_AraeA ㆍ HANGUL LETTER ARAEA */
02445    {
02446    0x0ef7, 0x318e},             /*               Hangul_AraeAE ㆎ HANGUL LETTER ARAEAE */
02447    {
02448    0x0ef8, 0x11eb},             /*            Hangul_J_PanSios ᇫ HANGUL JONGSEONG PANSIOS */
02449 /*  0x0ef9                Hangul_J_KkogjiDalrinIeung ? ??? */
02450    {
02451    0x0efa, 0x11f9},             /*        Hangul_J_YeorinHieuh ᇹ HANGUL JONGSEONG YEORINHIEUH */
02452    {
02453    0x0eff, 0x20a9},             /*                  Korean_Won ₩ WON SIGN */
02454    {
02455    0x13bc, 0x0152},             /*                          OE Œ LATIN CAPITAL LIGATURE OE */
02456    {
02457    0x13bd, 0x0153},             /*                          oe œ LATIN SMALL LIGATURE OE */
02458    {
02459    0x13be, 0x0178},             /*                  Ydiaeresis Ÿ LATIN CAPITAL LETTER Y WITH DIAERESIS */
02460    {
02461    0x20a0, 0x20a0},             /*                     EcuSign ₠ EURO-CURRENCY SIGN */
02462    {
02463    0x20a1, 0x20a1},             /*                   ColonSign ₡ COLON SIGN */
02464    {
02465    0x20a2, 0x20a2},             /*                CruzeiroSign ₢ CRUZEIRO SIGN */
02466    {
02467    0x20a3, 0x20a3},             /*                  FFrancSign ₣ FRENCH FRANC SIGN */
02468    {
02469    0x20a4, 0x20a4},             /*                    LiraSign ₤ LIRA SIGN */
02470    {
02471    0x20a5, 0x20a5},             /*                    MillSign ₥ MILL SIGN */
02472    {
02473    0x20a6, 0x20a6},             /*                   NairaSign ₦ NAIRA SIGN */
02474    {
02475    0x20a7, 0x20a7},             /*                  PesetaSign ₧ PESETA SIGN */
02476    {
02477    0x20a8, 0x20a8},             /*                   RupeeSign ₨ RUPEE SIGN */
02478    {
02479    0x20a9, 0x20a9},             /*                     WonSign ₩ WON SIGN */
02480    {
02481    0x20aa, 0x20aa},             /*               NewSheqelSign ₪ NEW SHEQEL SIGN */
02482    {
02483    0x20ab, 0x20ab},             /*                    DongSign ₫ DONG SIGN */
02484    {
02485    0x20ac, 0x20ac},             /*                    EuroSign € EURO SIGN */
02486 };
02487 
02488 static guint keyval_to_unicode(guint keysym)
02489 {
02490    int min = 0;
02491    int max = sizeof(k2utab) / sizeof(k2utab[0]) - 1;
02492    int mid;
02493 
02494    /* First check for Latin-1 characters (1:1 mapping) */
02495    if ((keysym >= 0x0020 && keysym <= 0x007e) ||
02496        (keysym >= 0x00a0 && keysym <= 0x00ff))
02497       return keysym;
02498 
02499    /* Also check for directly encoded 24-bit UCS characters */
02500    if ((keysym & 0xff000000) == 0x01000000)
02501       return keysym & 0x00ffffff;
02502 
02503    /* binary search in table */
02504    while (max >= min) {
02505       mid = (min + max) / 2;
02506       if (k2utab[mid].keysym < keysym)
02507          min = mid + 1;
02508       else if (k2utab[mid].keysym > keysym)
02509          max = mid - 1;
02510       else {
02511          /* found it */
02512          return k2utab[mid].ucs;
02513       }
02514    }
02515 
02516    /* No matching Unicode value found */
02517    return -1;
02518 }
02519 
02520 #endif                          /* 0 */
02521 
02522 struct u2k {
02523    unsigned short keysym;
02524    unsigned short ucs;
02525 } u2ktab[] = {
02526    {
02527    0x0abd, 0x002e},             /*                decimalpoint . FULL STOP */
02528    {
02529    0x0ba3, 0x003c},             /*                   leftcaret < LESS-THAN SIGN */
02530    {
02531    0x0ba6, 0x003e},             /*                  rightcaret > GREATER-THAN SIGN */
02532    {
02533    0x0bc6, 0x005f},             /*                    underbar _ LOW LINE */
02534    {
02535    0x0bc0, 0x00af},             /*                     overbar ¯ MACRON */
02536    {
02537    0x03c0, 0x0100},             /*                     Amacron Ā LATIN CAPITAL LETTER A WITH MACRON */
02538    {
02539    0x03e0, 0x0101},             /*                     amacron ā LATIN SMALL LETTER A WITH MACRON */
02540    {
02541    0x01c3, 0x0102},             /*                      Abreve Ă LATIN CAPITAL LETTER A WITH BREVE */
02542    {
02543    0x01e3, 0x0103},             /*                      abreve ă LATIN SMALL LETTER A WITH BREVE */
02544    {
02545    0x01a1, 0x0104},             /*                     Aogonek Ą LATIN CAPITAL LETTER A WITH OGONEK */
02546    {
02547    0x01b1, 0x0105},             /*                     aogonek ą LATIN SMALL LETTER A WITH OGONEK */
02548    {
02549    0x01c6, 0x0106},             /*                      Cacute Ć LATIN CAPITAL LETTER C WITH ACUTE */
02550    {
02551    0x01e6, 0x0107},             /*                      cacute ć LATIN SMALL LETTER C WITH ACUTE */
02552    {
02553    0x02c6, 0x0108},             /*                 Ccircumflex Ĉ LATIN CAPITAL LETTER C WITH CIRCUMFLEX */
02554    {
02555    0x02e6, 0x0109},             /*                 ccircumflex ĉ LATIN SMALL LETTER C WITH CIRCUMFLEX */
02556    {
02557    0x02c5, 0x010a},             /*                   Cabovedot Ċ LATIN CAPITAL LETTER C WITH DOT ABOVE */
02558    {
02559    0x02e5, 0x010b},             /*                   cabovedot ċ LATIN SMALL LETTER C WITH DOT ABOVE */
02560    {
02561    0x01c8, 0x010c},             /*                      Ccaron Č LATIN CAPITAL LETTER C WITH CARON */
02562    {
02563    0x01e8, 0x010d},             /*                      ccaron č LATIN SMALL LETTER C WITH CARON */
02564    {
02565    0x01cf, 0x010e},             /*                      Dcaron Ď LATIN CAPITAL LETTER D WITH CARON */
02566    {
02567    0x01ef, 0x010f},             /*                      dcaron ď LATIN SMALL LETTER D WITH CARON */
02568    {
02569    0x01d0, 0x0110},             /*                     Dstroke Đ LATIN CAPITAL LETTER D WITH STROKE */
02570    {
02571    0x01f0, 0x0111},             /*                     dstroke đ LATIN SMALL LETTER D WITH STROKE */
02572    {
02573    0x03aa, 0x0112},             /*                     Emacron Ē LATIN CAPITAL LETTER E WITH MACRON */
02574    {
02575    0x03ba, 0x0113},             /*                     emacron ē LATIN SMALL LETTER E WITH MACRON */
02576    {
02577    0x03cc, 0x0116},             /*                   Eabovedot Ė LATIN CAPITAL LETTER E WITH DOT ABOVE */
02578    {
02579    0x03ec, 0x0117},             /*                   eabovedot ė LATIN SMALL LETTER E WITH DOT ABOVE */
02580    {
02581    0x01ca, 0x0118},             /*                     Eogonek Ę LATIN CAPITAL LETTER E WITH OGONEK */
02582    {
02583    0x01ea, 0x0119},             /*                     eogonek ę LATIN SMALL LETTER E WITH OGONEK */
02584    {
02585    0x01cc, 0x011a},             /*                      Ecaron Ě LATIN CAPITAL LETTER E WITH CARON */
02586    {
02587    0x01ec, 0x011b},             /*                      ecaron ě LATIN SMALL LETTER E WITH CARON */
02588    {
02589    0x02d8, 0x011c},             /*                 Gcircumflex Ĝ LATIN CAPITAL LETTER G WITH CIRCUMFLEX */
02590    {
02591    0x02f8, 0x011d},             /*                 gcircumflex ĝ LATIN SMALL LETTER G WITH CIRCUMFLEX */
02592    {
02593    0x02ab, 0x011e},             /*                      Gbreve Ğ LATIN CAPITAL LETTER G WITH BREVE */
02594    {
02595    0x02bb, 0x011f},             /*                      gbreve ğ LATIN SMALL LETTER G WITH BREVE */
02596    {
02597    0x02d5, 0x0120},             /*                   Gabovedot Ġ LATIN CAPITAL LETTER G WITH DOT ABOVE */
02598    {
02599    0x02f5, 0x0121},             /*                   gabovedot ġ LATIN SMALL LETTER G WITH DOT ABOVE */
02600    {
02601    0x03ab, 0x0122},             /*                    Gcedilla Ģ LATIN CAPITAL LETTER G WITH CEDILLA */
02602    {
02603    0x03bb, 0x0123},             /*                    gcedilla ģ LATIN SMALL LETTER G WITH CEDILLA */
02604    {
02605    0x02a6, 0x0124},             /*                 Hcircumflex Ĥ LATIN CAPITAL LETTER H WITH CIRCUMFLEX */
02606    {
02607    0x02b6, 0x0125},             /*                 hcircumflex ĥ LATIN SMALL LETTER H WITH CIRCUMFLEX */
02608    {
02609    0x02a1, 0x0126},             /*                     Hstroke Ħ LATIN CAPITAL LETTER H WITH STROKE */
02610    {
02611    0x02b1, 0x0127},             /*                     hstroke ħ LATIN SMALL LETTER H WITH STROKE */
02612    {
02613    0x03a5, 0x0128},             /*                      Itilde Ĩ LATIN CAPITAL LETTER I WITH TILDE */
02614    {
02615    0x03b5, 0x0129},             /*                      itilde ĩ LATIN SMALL LETTER I WITH TILDE */
02616    {
02617    0x03cf, 0x012a},             /*                     Imacron Ī LATIN CAPITAL LETTER I WITH MACRON */
02618    {
02619    0x03ef, 0x012b},             /*                     imacron ī LATIN SMALL LETTER I WITH MACRON */
02620    {
02621    0x03c7, 0x012e},             /*                     Iogonek Į LATIN CAPITAL LETTER I WITH OGONEK */
02622    {
02623    0x03e7, 0x012f},             /*                     iogonek į LATIN SMALL LETTER I WITH OGONEK */
02624    {
02625    0x02a9, 0x0130},             /*                   Iabovedot İ LATIN CAPITAL LETTER I WITH DOT ABOVE */
02626    {
02627    0x02b9, 0x0131},             /*                    idotless ı LATIN SMALL LETTER DOTLESS I */
02628    {
02629    0x02ac, 0x0134},             /*                 Jcircumflex Ĵ LATIN CAPITAL LETTER J WITH CIRCUMFLEX */
02630    {
02631    0x02bc, 0x0135},             /*                 jcircumflex ĵ LATIN SMALL LETTER J WITH CIRCUMFLEX */
02632    {
02633    0x03d3, 0x0136},             /*                    Kcedilla Ķ LATIN CAPITAL LETTER K WITH CEDILLA */
02634    {
02635    0x03f3, 0x0137},             /*                    kcedilla ķ LATIN SMALL LETTER K WITH CEDILLA */
02636    {
02637    0x03a2, 0x0138},             /*                         kra ĸ LATIN SMALL LETTER KRA */
02638    {
02639    0x01c5, 0x0139},             /*                      Lacute Ĺ LATIN CAPITAL LETTER L WITH ACUTE */
02640    {
02641    0x01e5, 0x013a},             /*                      lacute ĺ LATIN SMALL LETTER L WITH ACUTE */
02642    {
02643    0x03a6, 0x013b},             /*                    Lcedilla Ļ LATIN CAPITAL LETTER L WITH CEDILLA */
02644    {
02645    0x03b6, 0x013c},             /*                    lcedilla ļ LATIN SMALL LETTER L WITH CEDILLA */
02646    {
02647    0x01a5, 0x013d},             /*                      Lcaron Ľ LATIN CAPITAL LETTER L WITH CARON */
02648    {
02649    0x01b5, 0x013e},             /*                      lcaron ľ LATIN SMALL LETTER L WITH CARON */
02650    {
02651    0x01a3, 0x0141},             /*                     Lstroke Ł LATIN CAPITAL LETTER L WITH STROKE */
02652    {
02653    0x01b3, 0x0142},             /*                     lstroke ł LATIN SMALL LETTER L WITH STROKE */
02654    {
02655    0x01d1, 0x0143},             /*                      Nacute Ń LATIN CAPITAL LETTER N WITH ACUTE */
02656    {
02657    0x01f1, 0x0144},             /*                      nacute ń LATIN SMALL LETTER N WITH ACUTE */
02658    {
02659    0x03d1, 0x0145},             /*                    Ncedilla Ņ LATIN CAPITAL LETTER N WITH CEDILLA */
02660    {
02661    0x03f1, 0x0146},             /*                    ncedilla ņ LATIN SMALL LETTER N WITH CEDILLA */
02662    {
02663    0x01d2, 0x0147},             /*                      Ncaron Ň LATIN CAPITAL LETTER N WITH CARON */
02664    {
02665    0x01f2, 0x0148},             /*                      ncaron ň LATIN SMALL LETTER N WITH CARON */
02666    {
02667    0x03bd, 0x014a},             /*                         ENG Ŋ LATIN CAPITAL LETTER ENG */
02668    {
02669    0x03bf, 0x014b},             /*                         eng ŋ LATIN SMALL LETTER ENG */
02670    {
02671    0x03d2, 0x014c},             /*                     Omacron Ō LATIN CAPITAL LETTER O WITH MACRON */
02672    {
02673    0x03f2, 0x014d},             /*                     omacron ō LATIN SMALL LETTER O WITH MACRON */
02674    {
02675    0x01d5, 0x0150},             /*                Odoubleacute Ő LATIN CAPITAL LETTER O WITH DOUBLE ACUTE */
02676    {
02677    0x01f5, 0x0151},             /*                odoubleacute ő LATIN SMALL LETTER O WITH DOUBLE ACUTE */
02678    {
02679    0x13bc, 0x0152},             /*                          OE Œ LATIN CAPITAL LIGATURE OE */
02680    {
02681    0x13bd, 0x0153},             /*                          oe œ LATIN SMALL LIGATURE OE */
02682    {
02683    0x01c0, 0x0154},             /*                      Racute Ŕ LATIN CAPITAL LETTER R WITH ACUTE */
02684    {
02685    0x01e0, 0x0155},             /*                      racute ŕ LATIN SMALL LETTER R WITH ACUTE */
02686    {
02687    0x03a3, 0x0156},             /*                    Rcedilla Ŗ LATIN CAPITAL LETTER R WITH CEDILLA */
02688    {
02689    0x03b3, 0x0157},             /*                    rcedilla ŗ LATIN SMALL LETTER R WITH CEDILLA */
02690    {
02691    0x01d8, 0x0158},             /*                      Rcaron Ř LATIN CAPITAL LETTER R WITH CARON */
02692    {
02693    0x01f8, 0x0159},             /*                      rcaron ř LATIN SMALL LETTER R WITH CARON */
02694    {
02695    0x01a6, 0x015a},             /*                      Sacute Ś LATIN CAPITAL LETTER S WITH ACUTE */
02696    {
02697    0x01b6, 0x015b},             /*                      sacute ś LATIN SMALL LETTER S WITH ACUTE */
02698    {
02699    0x02de, 0x015c},             /*                 Scircumflex Ŝ LATIN CAPITAL LETTER S WITH CIRCUMFLEX */
02700    {
02701    0x02fe, 0x015d},             /*                 scircumflex ŝ LATIN SMALL LETTER S WITH CIRCUMFLEX */
02702    {
02703    0x01aa, 0x015e},             /*                    Scedilla Ş LATIN CAPITAL LETTER S WITH CEDILLA */
02704    {
02705    0x01ba, 0x015f},             /*                    scedilla ş LATIN SMALL LETTER S WITH CEDILLA */
02706    {
02707    0x01a9, 0x0160},             /*                      Scaron Š LATIN CAPITAL LETTER S WITH CARON */
02708    {
02709    0x01b9, 0x0161},             /*                      scaron š LATIN SMALL LETTER S WITH CARON */
02710    {
02711    0x01de, 0x0162},             /*                    Tcedilla Ţ LATIN CAPITAL LETTER T WITH CEDILLA */
02712    {
02713    0x01fe, 0x0163},             /*                    tcedilla ţ LATIN SMALL LETTER T WITH CEDILLA */
02714    {
02715    0x01ab, 0x0164},             /*                      Tcaron Ť LATIN CAPITAL LETTER T WITH CARON */
02716    {
02717    0x01bb, 0x0165},             /*                      tcaron ť LATIN SMALL LETTER T WITH CARON */
02718    {
02719    0x03ac, 0x0166},             /*                      Tslash Ŧ LATIN CAPITAL LETTER T WITH STROKE */
02720    {
02721    0x03bc, 0x0167},             /*                      tslash ŧ LATIN SMALL LETTER T WITH STROKE */
02722    {
02723    0x03dd, 0x0168},             /*                      Utilde Ũ LATIN CAPITAL LETTER U WITH TILDE */
02724    {
02725    0x03fd, 0x0169},             /*                      utilde ũ LATIN SMALL LETTER U WITH TILDE */
02726    {
02727    0x03de, 0x016a},             /*                     Umacron Ū LATIN CAPITAL LETTER U WITH MACRON */
02728    {
02729    0x03fe, 0x016b},             /*                     umacron ū LATIN SMALL LETTER U WITH MACRON */
02730    {
02731    0x02dd, 0x016c},             /*                      Ubreve Ŭ LATIN CAPITAL LETTER U WITH BREVE */
02732    {
02733    0x02fd, 0x016d},             /*                      ubreve ŭ LATIN SMALL LETTER U WITH BREVE */
02734    {
02735    0x01d9, 0x016e},             /*                       Uring Ů LATIN CAPITAL LETTER U WITH RING ABOVE */
02736    {
02737    0x01f9, 0x016f},             /*                       uring ů LATIN SMALL LETTER U WITH RING ABOVE */
02738    {
02739    0x01db, 0x0170},             /*                Udoubleacute Ű LATIN CAPITAL LETTER U WITH DOUBLE ACUTE */
02740    {
02741    0x01fb, 0x0171},             /*                udoubleacute ű LATIN SMALL LETTER U WITH DOUBLE ACUTE */
02742    {
02743    0x03d9, 0x0172},             /*                     Uogonek Ų LATIN CAPITAL LETTER U WITH OGONEK */
02744    {
02745    0x03f9, 0x0173},             /*                     uogonek ų LATIN SMALL LETTER U WITH OGONEK */
02746    {
02747    0x13be, 0x0178},             /*                  Ydiaeresis Ÿ LATIN CAPITAL LETTER Y WITH DIAERESIS */
02748    {
02749    0x01ac, 0x0179},             /*                      Zacute Ź LATIN CAPITAL LETTER Z WITH ACUTE */
02750    {
02751    0x01bc, 0x017a},             /*                      zacute ź LATIN SMALL LETTER Z WITH ACUTE */
02752    {
02753    0x01af, 0x017b},             /*                   Zabovedot Ż LATIN CAPITAL LETTER Z WITH DOT ABOVE */
02754    {
02755    0x01bf, 0x017c},             /*                   zabovedot ż LATIN SMALL LETTER Z WITH DOT ABOVE */
02756    {
02757    0x01ae, 0x017d},             /*                      Zcaron Ž LATIN CAPITAL LETTER Z WITH CARON */
02758    {
02759    0x01be, 0x017e},             /*                      zcaron ž LATIN SMALL LETTER Z WITH CARON */
02760    {
02761    0x08f6, 0x0192},             /*                    function ƒ LATIN SMALL LETTER F WITH HOOK */
02762    {
02763    0x01b7, 0x02c7},             /*                       caron ˇ CARON */
02764    {
02765    0x01a2, 0x02d8},             /*                       breve ˘ BREVE */
02766    {
02767    0x01ff, 0x02d9},             /*                    abovedot ˙ DOT ABOVE */
02768    {
02769    0x01b2, 0x02db},             /*                      ogonek ˛ OGONEK */
02770    {
02771    0x01bd, 0x02dd},             /*                 doubleacute ˝ DOUBLE ACUTE ACCENT */
02772    {
02773    0x07ae, 0x0385},             /*        Greek_accentdieresis ΅ GREEK DIALYTIKA TONOS */
02774    {
02775    0x07a1, 0x0386},             /*           Greek_ALPHAaccent Ά GREEK CAPITAL LETTER ALPHA WITH TONOS */
02776    {
02777    0x07a2, 0x0388},             /*         Greek_EPSILONaccent Έ GREEK CAPITAL LETTER EPSILON WITH TONOS */
02778    {
02779    0x07a3, 0x0389},             /*             Greek_ETAaccent Ή GREEK CAPITAL LETTER ETA WITH TONOS */
02780    {
02781    0x07a4, 0x038a},             /*            Greek_IOTAaccent Ί GREEK CAPITAL LETTER IOTA WITH TONOS */
02782    {
02783    0x07a7, 0x038c},             /*         Greek_OMICRONaccent Ό GREEK CAPITAL LETTER OMICRON WITH TONOS */
02784    {
02785    0x07a8, 0x038e},             /*         Greek_UPSILONaccent Ύ GREEK CAPITAL LETTER UPSILON WITH TONOS */
02786    {
02787    0x07ab, 0x038f},             /*           Greek_OMEGAaccent Ώ GREEK CAPITAL LETTER OMEGA WITH TONOS */
02788    {
02789    0x07b6, 0x0390},             /*    Greek_iotaaccentdieresis ΐ GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS */
02790    {
02791    0x07c1, 0x0391},             /*                 Greek_ALPHA Α GREEK CAPITAL LETTER ALPHA */
02792    {
02793    0x07c2, 0x0392},             /*                  Greek_BETA Β GREEK CAPITAL LETTER BETA */
02794    {
02795    0x07c3, 0x0393},             /*                 Greek_GAMMA Γ GREEK CAPITAL LETTER GAMMA */
02796    {
02797    0x07c4, 0x0394},             /*                 Greek_DELTA Δ GREEK CAPITAL LETTER DELTA */
02798    {
02799    0x07c5, 0x0395},             /*               Greek_EPSILON Ε GREEK CAPITAL LETTER EPSILON */
02800    {
02801    0x07c6, 0x0396},             /*                  Greek_ZETA Ζ GREEK CAPITAL LETTER ZETA */
02802    {
02803    0x07c7, 0x0397},             /*                   Greek_ETA Η GREEK CAPITAL LETTER ETA */
02804    {
02805    0x07c8, 0x0398},             /*                 Greek_THETA Θ GREEK CAPITAL LETTER THETA */
02806    {
02807    0x07c9, 0x0399},             /*                  Greek_IOTA Ι GREEK CAPITAL LETTER IOTA */
02808    {
02809    0x07ca, 0x039a},             /*                 Greek_KAPPA Κ GREEK CAPITAL LETTER KAPPA */
02810    {
02811    0x07cb, 0x039b},             /*                Greek_LAMBDA Λ GREEK CAPITAL LETTER LAMDA */
02812    {
02813    0x07cc, 0x039c},             /*                    Greek_MU Μ GREEK CAPITAL LETTER MU */
02814    {
02815    0x07cd, 0x039d},             /*                    Greek_NU Ν GREEK CAPITAL LETTER NU */
02816    {
02817    0x07ce, 0x039e},             /*                    Greek_XI Ξ GREEK CAPITAL LETTER XI */
02818    {
02819    0x07cf, 0x039f},             /*               Greek_OMICRON Ο GREEK CAPITAL LETTER OMICRON */
02820    {
02821    0x07d0, 0x03a0},             /*                    Greek_PI Π GREEK CAPITAL LETTER PI */
02822    {
02823    0x07d1, 0x03a1},             /*                   Greek_RHO Ρ GREEK CAPITAL LETTER RHO */
02824    {
02825    0x07d2, 0x03a3},             /*                 Greek_SIGMA Σ GREEK CAPITAL LETTER SIGMA */
02826    {
02827    0x07d4, 0x03a4},             /*                   Greek_TAU Τ GREEK CAPITAL LETTER TAU */
02828    {
02829    0x07d5, 0x03a5},             /*               Greek_UPSILON Υ GREEK CAPITAL LETTER UPSILON */
02830    {
02831    0x07d6, 0x03a6},             /*                   Greek_PHI Φ GREEK CAPITAL LETTER PHI */
02832    {
02833    0x07d7, 0x03a7},             /*                   Greek_CHI Χ GREEK CAPITAL LETTER CHI */
02834    {
02835    0x07d8, 0x03a8},             /*                   Greek_PSI Ψ GREEK CAPITAL LETTER PSI */
02836    {
02837    0x07d9, 0x03a9},             /*                 Greek_OMEGA Ω GREEK CAPITAL LETTER OMEGA */
02838    {
02839    0x07a5, 0x03aa},             /*         Greek_IOTAdiaeresis Ϊ GREEK CAPITAL LETTER IOTA WITH DIALYTIKA */
02840    {
02841    0x07a9, 0x03ab},             /*       Greek_UPSILONdieresis Ϋ GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA */
02842    {
02843    0x07b1, 0x03ac},             /*           Greek_alphaaccent ά GREEK SMALL LETTER ALPHA WITH TONOS */
02844    {
02845    0x07b2, 0x03ad},             /*         Greek_epsilonaccent έ GREEK SMALL LETTER EPSILON WITH TONOS */
02846    {
02847    0x07b3, 0x03ae},             /*             Greek_etaaccent ή GREEK SMALL LETTER ETA WITH TONOS */
02848    {
02849    0x07b4, 0x03af},             /*            Greek_iotaaccent ί GREEK SMALL LETTER IOTA WITH TONOS */
02850    {
02851    0x07ba, 0x03b0},             /* Greek_upsilonaccentdieresis ΰ GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS */
02852    {
02853    0x07e1, 0x03b1},             /*                 Greek_alpha α GREEK SMALL LETTER ALPHA */
02854    {
02855    0x07e2, 0x03b2},             /*                  Greek_beta β GREEK SMALL LETTER BETA */
02856    {
02857    0x07e3, 0x03b3},             /*                 Greek_gamma γ GREEK SMALL LETTER GAMMA */
02858    {
02859    0x07e4, 0x03b4},             /*                 Greek_delta δ GREEK SMALL LETTER DELTA */
02860    {
02861    0x07e5, 0x03b5},             /*               Greek_epsilon ε GREEK SMALL LETTER EPSILON */
02862    {
02863    0x07e6, 0x03b6},             /*                  Greek_zeta ζ GREEK SMALL LETTER ZETA */
02864    {
02865    0x07e7, 0x03b7},             /*                   Greek_eta η GREEK SMALL LETTER ETA */
02866    {
02867    0x07e8, 0x03b8},             /*                 Greek_theta θ GREEK SMALL LETTER THETA */
02868    {
02869    0x07e9, 0x03b9},             /*                  Greek_iota ι GREEK SMALL LETTER IOTA */
02870    {
02871    0x07ea, 0x03ba},             /*                 Greek_kappa κ GREEK SMALL LETTER KAPPA */
02872    {
02873    0x07eb, 0x03bb},             /*                Greek_lambda λ GREEK SMALL LETTER LAMDA */
02874    {
02875    0x07ec, 0x03bc},             /*                    Greek_mu μ GREEK SMALL LETTER MU */
02876    {
02877    0x07ed, 0x03bd},             /*                    Greek_nu ν GREEK SMALL LETTER NU */
02878    {
02879    0x07ee, 0x03be},             /*                    Greek_xi ξ GREEK SMALL LETTER XI */
02880    {
02881    0x07ef, 0x03bf},             /*               Greek_omicron ο GREEK SMALL LETTER OMICRON */
02882    {
02883    0x07f0, 0x03c0},             /*                    Greek_pi π GREEK SMALL LETTER PI */
02884    {
02885    0x07f1, 0x03c1},             /*                   Greek_rho ρ GREEK SMALL LETTER RHO */
02886    {
02887    0x07f3, 0x03c2},             /*       Greek_finalsmallsigma ς GREEK SMALL LETTER FINAL SIGMA */
02888    {
02889    0x07f2, 0x03c3},             /*                 Greek_sigma σ GREEK SMALL LETTER SIGMA */
02890    {
02891    0x07f4, 0x03c4},             /*                   Greek_tau τ GREEK SMALL LETTER TAU */
02892    {
02893    0x07f5, 0x03c5},             /*               Greek_upsilon υ GREEK SMALL LETTER UPSILON */
02894    {
02895    0x07f6, 0x03c6},             /*                   Greek_phi φ GREEK SMALL LETTER PHI */
02896    {
02897    0x07f7, 0x03c7},             /*                   Greek_chi χ GREEK SMALL LETTER CHI */
02898    {
02899    0x07f8, 0x03c8},             /*                   Greek_psi ψ GREEK SMALL LETTER PSI */
02900    {
02901    0x07f9, 0x03c9},             /*                 Greek_omega ω GREEK SMALL LETTER OMEGA */
02902    {
02903    0x07b5, 0x03ca},             /*          Greek_iotadieresis ϊ GREEK SMALL LETTER IOTA WITH DIALYTIKA */
02904    {
02905    0x07b9, 0x03cb},             /*       Greek_upsilondieresis ϋ GREEK SMALL LETTER UPSILON WITH DIALYTIKA */
02906    {
02907    0x07b7, 0x03cc},             /*         Greek_omicronaccent ό GREEK SMALL LETTER OMICRON WITH TONOS */
02908    {
02909    0x07b8, 0x03cd},             /*         Greek_upsilonaccent ύ GREEK SMALL LETTER UPSILON WITH TONOS */
02910    {
02911    0x07bb, 0x03ce},             /*           Greek_omegaaccent ώ GREEK SMALL LETTER OMEGA WITH TONOS */
02912    {
02913    0x06b3, 0x0401},             /*                 Cyrillic_IO Ё CYRILLIC CAPITAL LETTER IO */
02914    {
02915    0x06b1, 0x0402},             /*                 Serbian_DJE Ђ CYRILLIC CAPITAL LETTER DJE */
02916    {
02917    0x06b2, 0x0403},             /*               Macedonia_GJE Ѓ CYRILLIC CAPITAL LETTER GJE */
02918    {
02919    0x06b4, 0x0404},             /*                Ukrainian_IE Є CYRILLIC CAPITAL LETTER UKRAINIAN IE */
02920    {
02921    0x06b5, 0x0405},             /*               Macedonia_DSE Ѕ CYRILLIC CAPITAL LETTER DZE */
02922    {
02923    0x06b6, 0x0406},             /*                 Ukrainian_I І CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I */
02924    {
02925    0x06b7, 0x0407},             /*                Ukrainian_YI Ї CYRILLIC CAPITAL LETTER YI */
02926    {
02927    0x06b8, 0x0408},             /*                 Cyrillic_JE Ј CYRILLIC CAPITAL LETTER JE */
02928    {
02929    0x06b9, 0x0409},             /*                Cyrillic_LJE Љ CYRILLIC CAPITAL LETTER LJE */
02930    {
02931    0x06ba, 0x040a},             /*                Cyrillic_NJE Њ CYRILLIC CAPITAL LETTER NJE */
02932    {
02933    0x06bb, 0x040b},             /*                Serbian_TSHE Ћ CYRILLIC CAPITAL LETTER TSHE */
02934    {
02935    0x06bc, 0x040c},             /*               Macedonia_KJE Ќ CYRILLIC CAPITAL LETTER KJE */
02936    {
02937    0x06be, 0x040e},             /*         Byelorussian_SHORTU Ў CYRILLIC CAPITAL LETTER SHORT U */
02938    {
02939    0x06bf, 0x040f},             /*               Cyrillic_DZHE Џ CYRILLIC CAPITAL LETTER DZHE */
02940    {
02941    0x06e1, 0x0410},             /*                  Cyrillic_A А CYRILLIC CAPITAL LETTER A */
02942    {
02943    0x06e2, 0x0411},             /*                 Cyrillic_BE Б CYRILLIC CAPITAL LETTER BE */
02944    {
02945    0x06f7, 0x0412},             /*                 Cyrillic_VE В CYRILLIC CAPITAL LETTER VE */
02946    {
02947    0x06e7, 0x0413},             /*                Cyrillic_GHE Г CYRILLIC CAPITAL LETTER GHE */
02948    {
02949    0x06e4, 0x0414},             /*                 Cyrillic_DE Д CYRILLIC CAPITAL LETTER DE */
02950    {
02951    0x06e5, 0x0415},             /*                 Cyrillic_IE Е CYRILLIC CAPITAL LETTER IE */
02952    {
02953    0x06f6, 0x0416},             /*                Cyrillic_ZHE Ж CYRILLIC CAPITAL LETTER ZHE */
02954    {
02955    0x06fa, 0x0417},             /*                 Cyrillic_ZE З CYRILLIC CAPITAL LETTER ZE */
02956    {
02957    0x06e9, 0x0418},             /*                  Cyrillic_I И CYRILLIC CAPITAL LETTER I */
02958    {
02959    0x06ea, 0x0419},             /*             Cyrillic_SHORTI Й CYRILLIC CAPITAL LETTER SHORT I */
02960    {
02961    0x06eb, 0x041a},             /*                 Cyrillic_KA К CYRILLIC CAPITAL LETTER KA */
02962    {
02963    0x06ec, 0x041b},             /*                 Cyrillic_EL Л CYRILLIC CAPITAL LETTER EL */
02964    {
02965    0x06ed, 0x041c},             /*                 Cyrillic_EM М CYRILLIC CAPITAL LETTER EM */
02966    {
02967    0x06ee, 0x041d},             /*                 Cyrillic_EN Н CYRILLIC CAPITAL LETTER EN */
02968    {
02969    0x06ef, 0x041e},             /*                  Cyrillic_O О CYRILLIC CAPITAL LETTER O */
02970    {
02971    0x06f0, 0x041f},             /*                 Cyrillic_PE П CYRILLIC CAPITAL LETTER PE */
02972    {
02973    0x06f2, 0x0420},             /*                 Cyrillic_ER Р CYRILLIC CAPITAL LETTER ER */
02974    {
02975    0x06f3, 0x0421},             /*                 Cyrillic_ES С CYRILLIC CAPITAL LETTER ES */
02976    {
02977    0x06f4, 0x0422},             /*                 Cyrillic_TE Т CYRILLIC CAPITAL LETTER TE */
02978    {
02979    0x06f5, 0x0423},             /*                  Cyrillic_U У CYRILLIC CAPITAL LETTER U */
02980    {
02981    0x06e6, 0x0424},             /*                 Cyrillic_EF Ф CYRILLIC CAPITAL LETTER EF */
02982    {
02983    0x06e8, 0x0425},             /*                 Cyrillic_HA Х CYRILLIC CAPITAL LETTER HA */
02984    {
02985    0x06e3, 0x0426},             /*                Cyrillic_TSE Ц CYRILLIC CAPITAL LETTER TSE */
02986    {
02987    0x06fe, 0x0427},             /*                Cyrillic_CHE Ч CYRILLIC CAPITAL LETTER CHE */
02988    {
02989    0x06fb, 0x0428},             /*                Cyrillic_SHA Ш CYRILLIC CAPITAL LETTER SHA */
02990    {
02991    0x06fd, 0x0429},             /*              Cyrillic_SHCHA Щ CYRILLIC CAPITAL LETTER SHCHA */
02992    {
02993    0x06ff, 0x042a},             /*           Cyrillic_HARDSIGN Ъ CYRILLIC CAPITAL LETTER HARD SIGN */
02994    {
02995    0x06f9, 0x042b},             /*               Cyrillic_YERU Ы CYRILLIC CAPITAL LETTER YERU */
02996    {
02997    0x06f8, 0x042c},             /*           Cyrillic_SOFTSIGN Ь CYRILLIC CAPITAL LETTER SOFT SIGN */
02998    {
02999    0x06fc, 0x042d},             /*                  Cyrillic_E Э CYRILLIC CAPITAL LETTER E */
03000    {
03001    0x06e0, 0x042e},             /*                 Cyrillic_YU Ю CYRILLIC CAPITAL LETTER YU */
03002    {
03003    0x06f1, 0x042f},             /*                 Cyrillic_YA Я CYRILLIC CAPITAL LETTER YA */
03004    {
03005    0x06c1, 0x0430},             /*                  Cyrillic_a а CYRILLIC SMALL LETTER A */
03006    {
03007    0x06c2, 0x0431},             /*                 Cyrillic_be б CYRILLIC SMALL LETTER BE */
03008    {
03009    0x06d7, 0x0432},             /*                 Cyrillic_ve в CYRILLIC SMALL LETTER VE */
03010    {
03011    0x06c7, 0x0433},             /*                Cyrillic_ghe г CYRILLIC SMALL LETTER GHE */
03012    {
03013    0x06c4, 0x0434},             /*                 Cyrillic_de д CYRILLIC SMALL LETTER DE */
03014    {
03015    0x06c5, 0x0435},             /*                 Cyrillic_ie е CYRILLIC SMALL LETTER IE */
03016    {
03017    0x06d6, 0x0436},             /*                Cyrillic_zhe ж CYRILLIC SMALL LETTER ZHE */
03018    {
03019    0x06da, 0x0437},             /*                 Cyrillic_ze з CYRILLIC SMALL LETTER ZE */
03020    {
03021    0x06c9, 0x0438},             /*                  Cyrillic_i и CYRILLIC SMALL LETTER I */
03022    {
03023    0x06ca, 0x0439},             /*             Cyrillic_shorti й CYRILLIC SMALL LETTER SHORT I */
03024    {
03025    0x06cb, 0x043a},             /*                 Cyrillic_ka к CYRILLIC SMALL LETTER KA */
03026    {
03027    0x06cc, 0x043b},             /*                 Cyrillic_el л CYRILLIC SMALL LETTER EL */
03028    {
03029    0x06cd, 0x043c},             /*                 Cyrillic_em м CYRILLIC SMALL LETTER EM */
03030    {
03031    0x06ce, 0x043d},             /*                 Cyrillic_en н CYRILLIC SMALL LETTER EN */
03032    {
03033    0x06cf, 0x043e},             /*                  Cyrillic_o о CYRILLIC SMALL LETTER O */
03034    {
03035    0x06d0, 0x043f},             /*                 Cyrillic_pe п CYRILLIC SMALL LETTER PE */
03036    {
03037    0x06d2, 0x0440},             /*                 Cyrillic_er р CYRILLIC SMALL LETTER ER */
03038    {
03039    0x06d3, 0x0441},             /*                 Cyrillic_es с CYRILLIC SMALL LETTER ES */
03040    {
03041    0x06d4, 0x0442},             /*                 Cyrillic_te т CYRILLIC SMALL LETTER TE */
03042    {
03043    0x06d5, 0x0443},             /*                  Cyrillic_u у CYRILLIC SMALL LETTER U */
03044    {
03045    0x06c6, 0x0444},             /*                 Cyrillic_ef ф CYRILLIC SMALL LETTER EF */
03046    {
03047    0x06c8, 0x0445},             /*                 Cyrillic_ha х CYRILLIC SMALL LETTER HA */
03048    {
03049    0x06c3, 0x0446},             /*                Cyrillic_tse ц CYRILLIC SMALL LETTER TSE */
03050    {
03051    0x06de, 0x0447},             /*                Cyrillic_che ч CYRILLIC SMALL LETTER CHE */
03052    {
03053    0x06db, 0x0448},             /*                Cyrillic_sha ш CYRILLIC SMALL LETTER SHA */
03054    {
03055    0x06dd, 0x0449},             /*              Cyrillic_shcha щ CYRILLIC SMALL LETTER SHCHA */
03056    {
03057    0x06df, 0x044a},             /*           Cyrillic_hardsign ъ CYRILLIC SMALL LETTER HARD SIGN */
03058    {
03059    0x06d9, 0x044b},             /*               Cyrillic_yeru ы CYRILLIC SMALL LETTER YERU */
03060    {
03061    0x06d8, 0x044c},             /*           Cyrillic_softsign ь CYRILLIC SMALL LETTER SOFT SIGN */
03062    {
03063    0x06dc, 0x044d},             /*                  Cyrillic_e э CYRILLIC SMALL LETTER E */
03064    {
03065    0x06c0, 0x044e},             /*                 Cyrillic_yu ю CYRILLIC SMALL LETTER YU */
03066    {
03067    0x06d1, 0x044f},             /*                 Cyrillic_ya я CYRILLIC SMALL LETTER YA */
03068    {
03069    0x06a3, 0x0451},             /*                 Cyrillic_io ё CYRILLIC SMALL LETTER IO */
03070    {
03071    0x06a1, 0x0452},             /*                 Serbian_dje ђ CYRILLIC SMALL LETTER DJE */
03072    {
03073    0x06a2, 0x0453},             /*               Macedonia_gje ѓ CYRILLIC SMALL LETTER GJE */
03074    {
03075    0x06a4, 0x0454},             /*                Ukrainian_ie є CYRILLIC SMALL LETTER UKRAINIAN IE */
03076    {
03077    0x06a5, 0x0455},             /*               Macedonia_dse ѕ CYRILLIC SMALL LETTER DZE */
03078    {
03079    0x06a6, 0x0456},             /*                 Ukrainian_i і CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I */
03080    {
03081    0x06a7, 0x0457},             /*                Ukrainian_yi ї CYRILLIC SMALL LETTER YI */
03082    {
03083    0x06a8, 0x0458},             /*                 Cyrillic_je ј CYRILLIC SMALL LETTER JE */
03084    {
03085    0x06a9, 0x0459},             /*                Cyrillic_lje љ CYRILLIC SMALL LETTER LJE */
03086    {
03087    0x06aa, 0x045a},             /*                Cyrillic_nje њ CYRILLIC SMALL LETTER NJE */
03088    {
03089    0x06ab, 0x045b},             /*                Serbian_tshe ћ CYRILLIC SMALL LETTER TSHE */
03090    {
03091    0x06ac, 0x045c},             /*               Macedonia_kje ќ CYRILLIC SMALL LETTER KJE */
03092    {
03093    0x06ae, 0x045e},             /*         Byelorussian_shortu ў CYRILLIC SMALL LETTER SHORT U */
03094    {
03095    0x06af, 0x045f},             /*               Cyrillic_dzhe џ CYRILLIC SMALL LETTER DZHE */
03096    {
03097    0x0ce0, 0x05d0},             /*                hebrew_aleph א HEBREW LETTER ALEF */
03098    {
03099    0x0ce1, 0x05d1},             /*                  hebrew_bet ב HEBREW LETTER BET */
03100    {
03101    0x0ce2, 0x05d2},             /*                hebrew_gimel ג HEBREW LETTER GIMEL */
03102    {
03103    0x0ce3, 0x05d3},             /*                hebrew_dalet ד HEBREW LETTER DALET */
03104    {
03105    0x0ce4, 0x05d4},             /*                   hebrew_he ה HEBREW LETTER HE */
03106    {
03107    0x0ce5, 0x05d5},             /*                  hebrew_waw ו HEBREW LETTER VAV */
03108    {
03109    0x0ce6, 0x05d6},             /*                 hebrew_zain ז HEBREW LETTER ZAYIN */
03110    {
03111    0x0ce7, 0x05d7},             /*                 hebrew_chet ח HEBREW LETTER HET */
03112    {
03113    0x0ce8, 0x05d8},             /*                  hebrew_tet ט HEBREW LETTER TET */
03114    {
03115    0x0ce9, 0x05d9},             /*                  hebrew_yod י HEBREW LETTER YOD */
03116    {
03117    0x0cea, 0x05da},             /*            hebrew_finalkaph ך HEBREW LETTER FINAL KAF */
03118    {
03119    0x0ceb, 0x05db},             /*                 hebrew_kaph כ HEBREW LETTER KAF */
03120    {
03121    0x0cec, 0x05dc},             /*                hebrew_lamed ל HEBREW LETTER LAMED */
03122    {
03123    0x0ced, 0x05dd},             /*             hebrew_finalmem ם HEBREW LETTER FINAL MEM */
03124    {
03125    0x0cee, 0x05de},             /*                  hebrew_mem מ HEBREW LETTER MEM */
03126    {
03127    0x0cef, 0x05df},             /*             hebrew_finalnun ן HEBREW LETTER FINAL NUN */
03128    {
03129    0x0cf0, 0x05e0},             /*                  hebrew_nun נ HEBREW LETTER NUN */
03130    {
03131    0x0cf1, 0x05e1},             /*               hebrew_samech ס HEBREW LETTER SAMEKH */
03132    {
03133    0x0cf2, 0x05e2},             /*                 hebrew_ayin ע HEBREW LETTER AYIN */
03134    {
03135    0x0cf3, 0x05e3},             /*              hebrew_finalpe ף HEBREW LETTER FINAL PE */
03136    {
03137    0x0cf4, 0x05e4},             /*                   hebrew_pe פ HEBREW LETTER PE */
03138    {
03139    0x0cf5, 0x05e5},             /*            hebrew_finalzade ץ HEBREW LETTER FINAL TSADI */
03140    {
03141    0x0cf6, 0x05e6},             /*                 hebrew_zade צ HEBREW LETTER TSADI */
03142    {
03143    0x0cf7, 0x05e7},             /*                 hebrew_qoph ק HEBREW LETTER QOF */
03144    {
03145    0x0cf8, 0x05e8},             /*                 hebrew_resh ר HEBREW LETTER RESH */
03146    {
03147    0x0cf9, 0x05e9},             /*                 hebrew_shin ש HEBREW LETTER SHIN */
03148    {
03149    0x0cfa, 0x05ea},             /*                  hebrew_taw ת HEBREW LETTER TAV */
03150    {
03151    0x05ac, 0x060c},             /*                Arabic_comma ، ARABIC COMMA */
03152    {
03153    0x05bb, 0x061b},             /*            Arabic_semicolon ؛ ARABIC SEMICOLON */
03154    {
03155    0x05bf, 0x061f},             /*        Arabic_question_mark ؟ ARABIC QUESTION MARK */
03156    {
03157    0x05c1, 0x0621},             /*                Arabic_hamza ء ARABIC LETTER HAMZA */
03158    {
03159    0x05c2, 0x0622},             /*          Arabic_maddaonalef آ ARABIC LETTER ALEF WITH MADDA ABOVE */
03160    {
03161    0x05c3, 0x0623},             /*          Arabic_hamzaonalef أ ARABIC LETTER ALEF WITH HAMZA ABOVE */
03162    {
03163    0x05c4, 0x0624},             /*           Arabic_hamzaonwaw ؤ ARABIC LETTER WAW WITH HAMZA ABOVE */
03164    {
03165    0x05c5, 0x0625},             /*       Arabic_hamzaunderalef إ ARABIC LETTER ALEF WITH HAMZA BELOW */
03166    {
03167    0x05c6, 0x0626},             /*           Arabic_hamzaonyeh ئ ARABIC LETTER YEH WITH HAMZA ABOVE */
03168    {
03169    0x05c7, 0x0627},             /*                 Arabic_alef ا ARABIC LETTER ALEF */
03170    {
03171    0x05c8, 0x0628},             /*                  Arabic_beh ب ARABIC LETTER BEH */
03172    {
03173    0x05c9, 0x0629},             /*           Arabic_tehmarbuta ة ARABIC LETTER TEH MARBUTA */
03174    {
03175    0x05ca, 0x062a},             /*                  Arabic_teh ت ARABIC LETTER TEH */
03176    {
03177    0x05cb, 0x062b},             /*                 Arabic_theh ث ARABIC LETTER THEH */
03178    {
03179    0x05cc, 0x062c},             /*                 Arabic_jeem ج ARABIC LETTER JEEM */
03180    {
03181    0x05cd, 0x062d},             /*                  Arabic_hah ح ARABIC LETTER HAH */
03182    {
03183    0x05ce, 0x062e},             /*                 Arabic_khah خ ARABIC LETTER KHAH */
03184    {
03185    0x05cf, 0x062f},             /*                  Arabic_dal د ARABIC LETTER DAL */
03186    {
03187    0x05d0, 0x0630},             /*                 Arabic_thal ذ ARABIC LETTER THAL */
03188    {
03189    0x05d1, 0x0631},             /*                   Arabic_ra ر ARABIC LETTER REH */
03190    {
03191    0x05d2, 0x0632},             /*                 Arabic_zain ز ARABIC LETTER ZAIN */
03192    {
03193    0x05d3, 0x0633},             /*                 Arabic_seen س ARABIC LETTER SEEN */
03194    {
03195    0x05d4, 0x0634},             /*                Arabic_sheen ش ARABIC LETTER SHEEN */
03196    {
03197    0x05d5, 0x0635},             /*                  Arabic_sad ص ARABIC LETTER SAD */
03198    {
03199    0x05d6, 0x0636},             /*                  Arabic_dad ض ARABIC LETTER DAD */
03200    {
03201    0x05d7, 0x0637},             /*                  Arabic_tah ط ARABIC LETTER TAH */
03202    {
03203    0x05d8, 0x0638},             /*                  Arabic_zah ظ ARABIC LETTER ZAH */
03204    {
03205    0x05d9, 0x0639},             /*                  Arabic_ain ع ARABIC LETTER AIN */
03206    {
03207    0x05da, 0x063a},             /*                Arabic_ghain غ ARABIC LETTER GHAIN */
03208    {
03209    0x05e0, 0x0640},             /*              Arabic_tatweel ـ ARABIC TATWEEL */
03210    {
03211    0x05e1, 0x0641},             /*                  Arabic_feh ف ARABIC LETTER FEH */
03212    {
03213    0x05e2, 0x0642},             /*                  Arabic_qaf ق ARABIC LETTER QAF */
03214    {
03215    0x05e3, 0x0643},             /*                  Arabic_kaf ك ARABIC LETTER KAF */
03216    {
03217    0x05e4, 0x0644},             /*                  Arabic_lam ل ARABIC LETTER LAM */
03218    {
03219    0x05e5, 0x0645},             /*                 Arabic_meem م ARABIC LETTER MEEM */
03220    {
03221    0x05e6, 0x0646},             /*                 Arabic_noon ن ARABIC LETTER NOON */
03222    {
03223    0x05e7, 0x0647},             /*                   Arabic_ha ه ARABIC LETTER HEH */
03224    {
03225    0x05e8, 0x0648},             /*                  Arabic_waw و ARABIC LETTER WAW */
03226    {
03227    0x05e9, 0x0649},             /*          Arabic_alefmaksura ى ARABIC LETTER ALEF MAKSURA */
03228    {
03229    0x05ea, 0x064a},             /*                  Arabic_yeh ي ARABIC LETTER YEH */
03230    {
03231    0x05eb, 0x064b},             /*             Arabic_fathatan ً ARABIC FATHATAN */
03232    {
03233    0x05ec, 0x064c},             /*             Arabic_dammatan ٌ ARABIC DAMMATAN */
03234    {
03235    0x05ed, 0x064d},             /*             Arabic_kasratan ٍ ARABIC KASRATAN */
03236    {
03237    0x05ee, 0x064e},             /*                Arabic_fatha َ ARABIC FATHA */
03238    {
03239    0x05ef, 0x064f},             /*                Arabic_damma ُ ARABIC DAMMA */
03240    {
03241    0x05f0, 0x0650},             /*                Arabic_kasra ِ ARABIC KASRA */
03242    {
03243    0x05f1, 0x0651},             /*               Arabic_shadda ّ ARABIC SHADDA */
03244    {
03245    0x05f2, 0x0652},             /*                Arabic_sukun ْ ARABIC SUKUN */
03246    {
03247    0x0da1, 0x0e01},             /*                  Thai_kokai ก THAI CHARACTER KO KAI */
03248    {
03249    0x0da2, 0x0e02},             /*                Thai_khokhai ข THAI CHARACTER KHO KHAI */
03250    {
03251    0x0da3, 0x0e03},             /*               Thai_khokhuat ฃ THAI CHARACTER KHO KHUAT */
03252    {
03253    0x0da4, 0x0e04},             /*               Thai_khokhwai ค THAI CHARACTER KHO KHWAI */
03254    {
03255    0x0da5, 0x0e05},             /*                Thai_khokhon ฅ THAI CHARACTER KHO KHON */
03256    {
03257    0x0da6, 0x0e06},             /*             Thai_khorakhang ฆ THAI CHARACTER KHO RAKHANG */
03258    {
03259    0x0da7, 0x0e07},             /*                 Thai_ngongu ง THAI CHARACTER NGO NGU */
03260    {
03261    0x0da8, 0x0e08},             /*                Thai_chochan จ THAI CHARACTER CHO CHAN */
03262    {
03263    0x0da9, 0x0e09},             /*               Thai_choching ฉ THAI CHARACTER CHO CHING */
03264    {
03265    0x0daa, 0x0e0a},             /*               Thai_chochang ช THAI CHARACTER CHO CHANG */
03266    {
03267    0x0dab, 0x0e0b},             /*                   Thai_soso ซ THAI CHARACTER SO SO */
03268    {
03269    0x0dac, 0x0e0c},             /*                Thai_chochoe ฌ THAI CHARACTER CHO CHOE */
03270    {
03271    0x0dad, 0x0e0d},             /*                 Thai_yoying ญ THAI CHARACTER YO YING */
03272    {
03273    0x0dae, 0x0e0e},             /*                Thai_dochada ฎ THAI CHARACTER DO CHADA */
03274    {
03275    0x0daf, 0x0e0f},             /*                Thai_topatak ฏ THAI CHARACTER TO PATAK */
03276    {
03277    0x0db0, 0x0e10},             /*                Thai_thothan ฐ THAI CHARACTER THO THAN */
03278    {
03279    0x0db1, 0x0e11},             /*          Thai_thonangmontho ฑ THAI CHARACTER THO NANGMONTHO */
03280    {
03281    0x0db2, 0x0e12},             /*             Thai_thophuthao ฒ THAI CHARACTER THO PHUTHAO */
03282    {
03283    0x0db3, 0x0e13},             /*                  Thai_nonen ณ THAI CHARACTER NO NEN */
03284    {
03285    0x0db4, 0x0e14},             /*                  Thai_dodek ด THAI CHARACTER DO DEK */
03286    {
03287    0x0db5, 0x0e15},             /*                  Thai_totao ต THAI CHARACTER TO TAO */
03288    {
03289    0x0db6, 0x0e16},             /*               Thai_thothung ถ THAI CHARACTER THO THUNG */
03290    {
03291    0x0db7, 0x0e17},             /*              Thai_thothahan ท THAI CHARACTER THO THAHAN */
03292    {
03293    0x0db8, 0x0e18},             /*               Thai_thothong ธ THAI CHARACTER THO THONG */
03294    {
03295    0x0db9, 0x0e19},             /*                   Thai_nonu น THAI CHARACTER NO NU */
03296    {
03297    0x0dba, 0x0e1a},             /*               Thai_bobaimai บ THAI CHARACTER BO BAIMAI */
03298    {
03299    0x0dbb, 0x0e1b},             /*                  Thai_popla ป THAI CHARACTER PO PLA */
03300    {
03301    0x0dbc, 0x0e1c},             /*               Thai_phophung ผ THAI CHARACTER PHO PHUNG */
03302    {
03303    0x0dbd, 0x0e1d},             /*                   Thai_fofa ฝ THAI CHARACTER FO FA */
03304    {
03305    0x0dbe, 0x0e1e},             /*                Thai_phophan พ THAI CHARACTER PHO PHAN */
03306    {
03307    0x0dbf, 0x0e1f},             /*                  Thai_fofan ฟ THAI CHARACTER FO FAN */
03308    {
03309    0x0dc0, 0x0e20},             /*             Thai_phosamphao ภ THAI CHARACTER PHO SAMPHAO */
03310    {
03311    0x0dc1, 0x0e21},             /*                   Thai_moma ม THAI CHARACTER MO MA */
03312    {
03313    0x0dc2, 0x0e22},             /*                  Thai_yoyak ย THAI CHARACTER YO YAK */
03314    {
03315    0x0dc3, 0x0e23},             /*                  Thai_rorua ร THAI CHARACTER RO RUA */
03316    {
03317    0x0dc4, 0x0e24},             /*                     Thai_ru ฤ THAI CHARACTER RU */
03318    {
03319    0x0dc5, 0x0e25},             /*                 Thai_loling ล THAI CHARACTER LO LING */
03320    {
03321    0x0dc6, 0x0e26},             /*                     Thai_lu ฦ THAI CHARACTER LU */
03322    {
03323    0x0dc7, 0x0e27},             /*                 Thai_wowaen ว THAI CHARACTER WO WAEN */
03324    {
03325    0x0dc8, 0x0e28},             /*                 Thai_sosala ศ THAI CHARACTER SO SALA */
03326    {
03327    0x0dc9, 0x0e29},             /*                 Thai_sorusi ษ THAI CHARACTER SO RUSI */
03328    {
03329    0x0dca, 0x0e2a},             /*                  Thai_sosua ส THAI CHARACTER SO SUA */
03330    {
03331    0x0dcb, 0x0e2b},             /*                  Thai_hohip ห THAI CHARACTER HO HIP */
03332    {
03333    0x0dcc, 0x0e2c},             /*                Thai_lochula ฬ THAI CHARACTER LO CHULA */
03334    {
03335    0x0dcd, 0x0e2d},             /*                   Thai_oang อ THAI CHARACTER O ANG */
03336    {
03337    0x0dce, 0x0e2e},             /*               Thai_honokhuk ฮ THAI CHARACTER HO NOKHUK */
03338    {
03339    0x0dcf, 0x0e2f},             /*              Thai_paiyannoi ฯ THAI CHARACTER PAIYANNOI */
03340    {
03341    0x0dd0, 0x0e30},             /*                  Thai_saraa ะ THAI CHARACTER SARA A */
03342    {
03343    0x0dd1, 0x0e31},             /*             Thai_maihanakat ั THAI CHARACTER MAI HAN-AKAT */
03344    {
03345    0x0dd2, 0x0e32},             /*                 Thai_saraaa า THAI CHARACTER SARA AA */
03346    {
03347    0x0dd3, 0x0e33},             /*                 Thai_saraam ำ THAI CHARACTER SARA AM */
03348    {
03349    0x0dd4, 0x0e34},             /*                  Thai_sarai ิ THAI CHARACTER SARA I */
03350    {
03351    0x0dd5, 0x0e35},             /*                 Thai_saraii ี THAI CHARACTER SARA II */
03352    {
03353    0x0dd6, 0x0e36},             /*                 Thai_saraue ึ THAI CHARACTER SARA UE */
03354    {
03355    0x0dd7, 0x0e37},             /*                Thai_sarauee ื THAI CHARACTER SARA UEE */
03356    {
03357    0x0dd8, 0x0e38},             /*                  Thai_sarau ุ THAI CHARACTER SARA U */
03358    {
03359    0x0dd9, 0x0e39},             /*                 Thai_sarauu ู THAI CHARACTER SARA UU */
03360    {
03361    0x0dda, 0x0e3a},             /*                Thai_phinthu ฺ THAI CHARACTER PHINTHU */
03362    {
03363    0x0ddf, 0x0e3f},             /*                   Thai_baht ฿ THAI CURRENCY SYMBOL BAHT */
03364    {
03365    0x0de0, 0x0e40},             /*                  Thai_sarae เ THAI CHARACTER SARA E */
03366    {
03367    0x0de1, 0x0e41},             /*                 Thai_saraae แ THAI CHARACTER SARA AE */
03368    {
03369    0x0de2, 0x0e42},             /*                  Thai_sarao โ THAI CHARACTER SARA O */
03370    {
03371    0x0de3, 0x0e43},             /*          Thai_saraaimaimuan ใ THAI CHARACTER SARA AI MAIMUAN */
03372    {
03373    0x0de4, 0x0e44},             /*         Thai_saraaimaimalai ไ THAI CHARACTER SARA AI MAIMALAI */
03374    {
03375    0x0de5, 0x0e45},             /*            Thai_lakkhangyao ๅ THAI CHARACTER LAKKHANGYAO */
03376    {
03377    0x0de6, 0x0e46},             /*               Thai_maiyamok ๆ THAI CHARACTER MAIYAMOK */
03378    {
03379    0x0de7, 0x0e47},             /*              Thai_maitaikhu ็ THAI CHARACTER MAITAIKHU */
03380    {
03381    0x0de8, 0x0e48},             /*                  Thai_maiek ่ THAI CHARACTER MAI EK */
03382    {
03383    0x0de9, 0x0e49},             /*                 Thai_maitho ้ THAI CHARACTER MAI THO */
03384    {
03385    0x0dea, 0x0e4a},             /*                 Thai_maitri ๊ THAI CHARACTER MAI TRI */
03386    {
03387    0x0deb, 0x0e4b},             /*            Thai_maichattawa ๋ THAI CHARACTER MAI CHATTAWA */
03388    {
03389    0x0dec, 0x0e4c},             /*            Thai_thanthakhat ์ THAI CHARACTER THANTHAKHAT */
03390    {
03391    0x0ded, 0x0e4d},             /*               Thai_nikhahit ํ THAI CHARACTER NIKHAHIT */
03392    {
03393    0x0df0, 0x0e50},             /*                 Thai_leksun ๐ THAI DIGIT ZERO */
03394    {
03395    0x0df1, 0x0e51},             /*                Thai_leknung ๑ THAI DIGIT ONE */
03396    {
03397    0x0df2, 0x0e52},             /*                Thai_leksong ๒ THAI DIGIT TWO */
03398    {
03399    0x0df3, 0x0e53},             /*                 Thai_leksam ๓ THAI DIGIT THREE */
03400    {
03401    0x0df4, 0x0e54},             /*                  Thai_leksi ๔ THAI DIGIT FOUR */
03402    {
03403    0x0df5, 0x0e55},             /*                  Thai_lekha ๕ THAI DIGIT FIVE */
03404    {
03405    0x0df6, 0x0e56},             /*                 Thai_lekhok ๖ THAI DIGIT SIX */
03406    {
03407    0x0df7, 0x0e57},             /*                Thai_lekchet ๗ THAI DIGIT SEVEN */
03408    {
03409    0x0df8, 0x0e58},             /*                Thai_lekpaet ๘ THAI DIGIT EIGHT */
03410    {
03411    0x0df9, 0x0e59},             /*                 Thai_lekkao ๙ THAI DIGIT NINE */
03412    {
03413    0x0ed4, 0x11a8},             /*             Hangul_J_Kiyeog ᆨ HANGUL JONGSEONG KIYEOK */
03414    {
03415    0x0ed5, 0x11a9},             /*        Hangul_J_SsangKiyeog ᆩ HANGUL JONGSEONG SSANGKIYEOK */
03416    {
03417    0x0ed6, 0x11aa},             /*         Hangul_J_KiyeogSios ᆪ HANGUL JONGSEONG KIYEOK-SIOS */
03418    {
03419    0x0ed7, 0x11ab},             /*              Hangul_J_Nieun ᆫ HANGUL JONGSEONG NIEUN */
03420    {
03421    0x0ed8, 0x11ac},             /*         Hangul_J_NieunJieuj ᆬ HANGUL JONGSEONG NIEUN-CIEUC */
03422    {
03423    0x0ed9, 0x11ad},             /*         Hangul_J_NieunHieuh ᆭ HANGUL JONGSEONG NIEUN-HIEUH */
03424    {
03425    0x0eda, 0x11ae},             /*             Hangul_J_Dikeud ᆮ HANGUL JONGSEONG TIKEUT */
03426    {
03427    0x0edb, 0x11af},             /*              Hangul_J_Rieul ᆯ HANGUL JONGSEONG RIEUL */
03428    {
03429    0x0edc, 0x11b0},             /*        Hangul_J_RieulKiyeog ᆰ HANGUL JONGSEONG RIEUL-KIYEOK */
03430    {
03431    0x0edd, 0x11b1},             /*         Hangul_J_RieulMieum ᆱ HANGUL JONGSEONG RIEUL-MIEUM */
03432    {
03433    0x0ede, 0x11b2},             /*         Hangul_J_RieulPieub ᆲ HANGUL JONGSEONG RIEUL-PIEUP */
03434    {
03435    0x0edf, 0x11b3},             /*          Hangul_J_RieulSios ᆳ HANGUL JONGSEONG RIEUL-SIOS */
03436    {
03437    0x0ee0, 0x11b4},             /*         Hangul_J_RieulTieut ᆴ HANGUL JONGSEONG RIEUL-THIEUTH */
03438    {
03439    0x0ee1, 0x11b5},             /*        Hangul_J_RieulPhieuf ᆵ HANGUL JONGSEONG RIEUL-PHIEUPH */
03440    {
03441    0x0ee2, 0x11b6},             /*         Hangul_J_RieulHieuh ᆶ HANGUL JONGSEONG RIEUL-HIEUH */
03442    {
03443    0x0ee3, 0x11b7},             /*              Hangul_J_Mieum ᆷ HANGUL JONGSEONG MIEUM */
03444    {
03445    0x0ee4, 0x11b8},             /*              Hangul_J_Pieub ᆸ HANGUL JONGSEONG PIEUP */
03446    {
03447    0x0ee5, 0x11b9},             /*          Hangul_J_PieubSios ᆹ HANGUL JONGSEONG PIEUP-SIOS */
03448    {
03449    0x0ee6, 0x11ba},             /*               Hangul_J_Sios ᆺ HANGUL JONGSEONG SIOS */
03450    {
03451    0x0ee7, 0x11bb},             /*          Hangul_J_SsangSios ᆻ HANGUL JONGSEONG SSANGSIOS */
03452    {
03453    0x0ee8, 0x11bc},             /*              Hangul_J_Ieung ᆼ HANGUL JONGSEONG IEUNG */
03454    {
03455    0x0ee9, 0x11bd},             /*              Hangul_J_Jieuj ᆽ HANGUL JONGSEONG CIEUC */
03456    {
03457    0x0eea, 0x11be},             /*              Hangul_J_Cieuc ᆾ HANGUL JONGSEONG CHIEUCH */
03458    {
03459    0x0eeb, 0x11bf},             /*             Hangul_J_Khieuq ᆿ HANGUL JONGSEONG KHIEUKH */
03460    {
03461    0x0eec, 0x11c0},             /*              Hangul_J_Tieut ᇀ HANGUL JONGSEONG THIEUTH */
03462    {
03463    0x0eed, 0x11c1},             /*             Hangul_J_Phieuf ᇁ HANGUL JONGSEONG PHIEUPH */
03464    {
03465    0x0eee, 0x11c2},             /*              Hangul_J_Hieuh ᇂ HANGUL JONGSEONG HIEUH */
03466    {
03467    0x0ef8, 0x11eb},             /*            Hangul_J_PanSios ᇫ HANGUL JONGSEONG PANSIOS */
03468    {
03469    0x0efa, 0x11f9},             /*        Hangul_J_YeorinHieuh ᇹ HANGUL JONGSEONG YEORINHIEUH */
03470    {
03471    0x0aa2, 0x2002},             /*                     enspace   EN SPACE */
03472    {
03473    0x0aa1, 0x2003},             /*                     emspace   EM SPACE */
03474    {
03475    0x0aa3, 0x2004},             /*                    em3space   THREE-PER-EM SPACE */
03476    {
03477    0x0aa4, 0x2005},             /*                    em4space   FOUR-PER-EM SPACE */
03478    {
03479    0x0aa5, 0x2007},             /*                  digitspace   FIGURE SPACE */
03480    {
03481    0x0aa6, 0x2008},             /*                  punctspace   PUNCTUATION SPACE */
03482    {
03483    0x0aa7, 0x2009},             /*                   thinspace   THIN SPACE */
03484    {
03485    0x0aa8, 0x200a},             /*                   hairspace   HAIR SPACE */
03486    {
03487    0x0abb, 0x2012},             /*                     figdash ‒ FIGURE DASH */
03488    {
03489    0x0aaa, 0x2013},             /*                      endash – EN DASH */
03490    {
03491    0x0aa9, 0x2014},             /*                      emdash — EM DASH */
03492    {
03493    0x07af, 0x2015},             /*              Greek_horizbar ― HORIZONTAL BAR */
03494    {
03495    0x0cdf, 0x2017},             /*        hebrew_doublelowline ‗ DOUBLE LOW LINE */
03496    {
03497    0x0ad0, 0x2018},             /*         leftsinglequotemark ‘ LEFT SINGLE QUOTATION MARK */
03498    {
03499    0x0ad1, 0x2019},             /*        rightsinglequotemark ’ RIGHT SINGLE QUOTATION MARK */
03500    {
03501    0x0afd, 0x201a},             /*          singlelowquotemark ‚ SINGLE LOW-9 QUOTATION MARK */
03502    {
03503    0x0ad2, 0x201c},             /*         leftdoublequotemark “ LEFT DOUBLE QUOTATION MARK */
03504    {
03505    0x0ad3, 0x201d},             /*        rightdoublequotemark ” RIGHT DOUBLE QUOTATION MARK */
03506    {
03507    0x0afe, 0x201e},             /*          doublelowquotemark „ DOUBLE LOW-9 QUOTATION MARK */
03508    {
03509    0x0af1, 0x2020},             /*                      dagger † DAGGER */
03510    {
03511    0x0af2, 0x2021},             /*                doubledagger ‡ DOUBLE DAGGER */
03512    {
03513    0x0ae6, 0x2022},             /*          enfilledcircbullet • BULLET */
03514    {
03515    0x0aae, 0x2026},             /*                    ellipsis … HORIZONTAL ELLIPSIS */
03516    {
03517    0x0ad6, 0x2032},             /*                     minutes ′ PRIME */
03518    {
03519    0x0ad7, 0x2033},             /*                     seconds ″ DOUBLE PRIME */
03520    {
03521    0x0afc, 0x2038},             /*                       caret ‸ CARET */
03522    {
03523    0x047e, 0x203e},             /*                    overline ‾ OVERLINE */
03524    {
03525    0x20a0, 0x20a0},             /*                     EcuSign ₠ EURO-CURRENCY SIGN */
03526    {
03527    0x20a1, 0x20a1},             /*                   ColonSign ₡ COLON SIGN */
03528    {
03529    0x20a2, 0x20a2},             /*                CruzeiroSign ₢ CRUZEIRO SIGN */
03530    {
03531    0x20a3, 0x20a3},             /*                  FFrancSign ₣ FRENCH FRANC SIGN */
03532    {
03533    0x20a4, 0x20a4},             /*                    LiraSign ₤ LIRA SIGN */
03534    {
03535    0x20a5, 0x20a5},             /*                    MillSign ₥ MILL SIGN */
03536    {
03537    0x20a6, 0x20a6},             /*                   NairaSign ₦ NAIRA SIGN */
03538    {
03539    0x20a7, 0x20a7},             /*                  PesetaSign ₧ PESETA SIGN */
03540    {
03541    0x20a8, 0x20a8},             /*                   RupeeSign ₨ RUPEE SIGN */
03542    {
03543    0x0eff, 0x20a9},             /*                  Korean_Won ₩ WON SIGN */
03544    {
03545    0x20a9, 0x20a9},             /*                     WonSign ₩ WON SIGN */
03546    {
03547    0x20aa, 0x20aa},             /*               NewSheqelSign ₪ NEW SHEQEL SIGN */
03548    {
03549    0x20ab, 0x20ab},             /*                    DongSign ₫ DONG SIGN */
03550    {
03551    0x20ac, 0x20ac},             /*                    EuroSign € EURO SIGN */
03552    {
03553    0x0ab8, 0x2105},             /*                      careof ℅ CARE OF */
03554    {
03555    0x06b0, 0x2116},             /*                  numerosign № NUMERO SIGN */
03556    {
03557    0x0afb, 0x2117},             /*         phonographcopyright ℗ SOUND RECORDING COPYRIGHT */
03558    {
03559    0x0ad4, 0x211e},             /*                prescription ℞ PRESCRIPTION TAKE */
03560    {
03561    0x0ac9, 0x2122},             /*                   trademark ™ TRADE MARK SIGN */
03562    {
03563    0x0ab0, 0x2153},             /*                    onethird ⅓ VULGAR FRACTION ONE THIRD */
03564    {
03565    0x0ab1, 0x2154},             /*                   twothirds ⅔ VULGAR FRACTION TWO THIRDS */
03566    {
03567    0x0ab2, 0x2155},             /*                    onefifth ⅕ VULGAR FRACTION ONE FIFTH */
03568    {
03569    0x0ab3, 0x2156},             /*                   twofifths ⅖ VULGAR FRACTION TWO FIFTHS */
03570    {
03571    0x0ab4, 0x2157},             /*                 threefifths ⅗ VULGAR FRACTION THREE FIFTHS */
03572    {
03573    0x0ab5, 0x2158},             /*                  fourfifths ⅘ VULGAR FRACTION FOUR FIFTHS */
03574    {
03575    0x0ab6, 0x2159},             /*                    onesixth ⅙ VULGAR FRACTION ONE SIXTH */
03576    {
03577    0x0ab7, 0x215a},             /*                  fivesixths ⅚ VULGAR FRACTION FIVE SIXTHS */
03578    {
03579    0x0ac3, 0x215b},             /*                   oneeighth ⅛ VULGAR FRACTION ONE EIGHTH */
03580    {
03581    0x0ac4, 0x215c},             /*                threeeighths ⅜ VULGAR FRACTION THREE EIGHTHS */
03582    {
03583    0x0ac5, 0x215d},             /*                 fiveeighths ⅝ VULGAR FRACTION FIVE EIGHTHS */
03584    {
03585    0x0ac6, 0x215e},             /*                seveneighths ⅞ VULGAR FRACTION SEVEN EIGHTHS */
03586    {
03587    0x08fb, 0x2190},             /*                   leftarrow ← LEFTWARDS ARROW */
03588    {
03589    0x08fc, 0x2191},             /*                     uparrow ↑ UPWARDS ARROW */
03590    {
03591    0x08fd, 0x2192},             /*                  rightarrow → RIGHTWARDS ARROW */
03592    {
03593    0x08fe, 0x2193},             /*                   downarrow ↓ DOWNWARDS ARROW */
03594    {
03595    0x08ce, 0x21d2},             /*                     implies ⇒ RIGHTWARDS DOUBLE ARROW */
03596    {
03597    0x08cd, 0x21d4},             /*                    ifonlyif ⇔ LEFT RIGHT DOUBLE ARROW */
03598    {
03599    0x08ef, 0x2202},             /*           partialderivative ∂ PARTIAL DIFFERENTIAL */
03600    {
03601    0x08c5, 0x2207},             /*                       nabla ∇ NABLA */
03602    {
03603    0x0bca, 0x2218},             /*                         jot ∘ RING OPERATOR */
03604    {
03605    0x08d6, 0x221a},             /*                     radical √ SQUARE ROOT */
03606    {
03607    0x08c1, 0x221d},             /*                   variation ∝ PROPORTIONAL TO */
03608    {
03609    0x08c2, 0x221e},             /*                    infinity ∞ INFINITY */
03610    {
03611    0x08de, 0x2227},             /*                  logicaland ∧ LOGICAL AND */
03612    {
03613    0x0ba9, 0x2227},             /*                     upcaret ∧ LOGICAL AND */
03614    {
03615    0x08df, 0x2228},             /*                   logicalor ∨ LOGICAL OR */
03616    {
03617    0x0ba8, 0x2228},             /*                   downcaret ∨ LOGICAL OR */
03618    {
03619    0x08dc, 0x2229},             /*                intersection ∩ INTERSECTION */
03620    {
03621    0x0bc3, 0x2229},             /*                      upshoe ∩ INTERSECTION */
03622    {
03623    0x08dd, 0x222a},             /*                       union ∪ UNION */
03624    {
03625    0x0bd6, 0x222a},             /*                    downshoe ∪ UNION */
03626    {
03627    0x08bf, 0x222b},             /*                    integral ∫ INTEGRAL */
03628    {
03629    0x08c0, 0x2234},             /*                   therefore ∴ THEREFORE */
03630    {
03631    0x08c8, 0x2245},             /*                 approximate ≅ APPROXIMATELY EQUAL TO */
03632    {
03633    0x08bd, 0x2260},             /*                    notequal ≠ NOT EQUAL TO */
03634    {
03635    0x08cf, 0x2261},             /*                   identical ≡ IDENTICAL TO */
03636    {
03637    0x08bc, 0x2264},             /*               lessthanequal ≤ LESS-THAN OR EQUAL TO */
03638    {
03639    0x08be, 0x2265},             /*            greaterthanequal ≥ GREATER-THAN OR EQUAL TO */
03640    {
03641    0x08da, 0x2282},             /*                  includedin ⊂ SUBSET OF */
03642    {
03643    0x0bda, 0x2282},             /*                    leftshoe ⊂ SUBSET OF */
03644    {
03645    0x08db, 0x2283},             /*                    includes ⊃ SUPERSET OF */
03646    {
03647    0x0bd8, 0x2283},             /*                   rightshoe ⊃ SUPERSET OF */
03648    {
03649    0x0bfc, 0x22a2},             /*                   righttack ⊢ RIGHT TACK */
03650    {
03651    0x0bdc, 0x22a3},             /*                    lefttack ⊣ LEFT TACK */
03652    {
03653    0x0bc2, 0x22a4},             /*                    downtack ⊤ DOWN TACK */
03654    {
03655    0x0bce, 0x22a5},             /*                      uptack ⊥ UP TACK */
03656    {
03657    0x0bd3, 0x2308},             /*                     upstile ⌈ LEFT CEILING */
03658    {
03659    0x0bc4, 0x230a},             /*                   downstile ⌊ LEFT FLOOR */
03660    {
03661    0x0afa, 0x2315},             /*           telephonerecorder ⌕ TELEPHONE RECORDER */
03662    {
03663    0x08a4, 0x2320},             /*                 topintegral ⌠ TOP HALF INTEGRAL */
03664    {
03665    0x08a5, 0x2321},             /*                 botintegral ⌡ BOTTOM HALF INTEGRAL */
03666    {
03667    0x0abc, 0x2329},             /*            leftanglebracket 〈 LEFT-POINTING ANGLE BRACKET */
03668    {
03669    0x0abe, 0x232a},             /*           rightanglebracket 〉 RIGHT-POINTING ANGLE BRACKET */
03670    {
03671    0x0bcc, 0x2395},             /*                        quad ⎕ APL FUNCTIONAL SYMBOL QUAD (Unicode 3.0) */
03672    {
03673    0x09e2, 0x2409},             /*                          ht ␉ SYMBOL FOR HORIZONTAL TABULATION */
03674    {
03675    0x09e5, 0x240a},             /*                          lf ␊ SYMBOL FOR LINE FEED */
03676    {
03677    0x09e9, 0x240b},             /*                          vt ␋ SYMBOL FOR VERTICAL TABULATION */
03678    {
03679    0x09e3, 0x240c},             /*                          ff ␌ SYMBOL FOR FORM FEED */
03680    {
03681    0x09e4, 0x240d},             /*                          cr ␍ SYMBOL FOR CARRIAGE RETURN */
03682    {
03683    0x09df, 0x2422},             /*                       blank ␢ BLANK SYMBOL */
03684    {
03685    0x09e8, 0x2424},             /*                          nl ␤ SYMBOL FOR NEWLINE */
03686    {
03687    0x09f1, 0x2500},             /*              horizlinescan5 ─ BOX DRAWINGS LIGHT HORIZONTAL */
03688    {
03689    0x08a6, 0x2502},             /*               vertconnector │ BOX DRAWINGS LIGHT VERTICAL */
03690    {
03691    0x09f8, 0x2502},             /*                     vertbar │ BOX DRAWINGS LIGHT VERTICAL */
03692    {
03693    0x09ec, 0x250c},             /*                upleftcorner ┌ BOX DRAWINGS LIGHT DOWN AND RIGHT */
03694    {
03695    0x09eb, 0x2510},             /*               uprightcorner ┐ BOX DRAWINGS LIGHT DOWN AND LEFT */
03696    {
03697    0x09ed, 0x2514},             /*               lowleftcorner └ BOX DRAWINGS LIGHT UP AND RIGHT */
03698    {
03699    0x09ea, 0x2518},             /*              lowrightcorner ┘ BOX DRAWINGS LIGHT UP AND LEFT */
03700    {
03701    0x09f4, 0x251c},             /*                       leftt ├ BOX DRAWINGS LIGHT VERTICAL AND RIGHT */
03702    {
03703    0x09f5, 0x2524},             /*                      rightt ┤ BOX DRAWINGS LIGHT VERTICAL AND LEFT */
03704    {
03705    0x09f7, 0x252c},             /*                        topt ┬ BOX DRAWINGS LIGHT DOWN AND HORIZONTAL */
03706    {
03707    0x09f6, 0x2534},             /*                        bott ┴ BOX DRAWINGS LIGHT UP AND HORIZONTAL */
03708    {
03709    0x09ee, 0x253c},             /*               crossinglines ┼ BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL */
03710    {
03711    0x09e1, 0x2592},             /*                checkerboard ▒ MEDIUM SHADE */
03712    {
03713    0x0adf, 0x25a0},             /*                emfilledrect ■ BLACK SQUARE */
03714    {
03715    0x0acf, 0x25a1},             /*             emopenrectangle □ WHITE SQUARE */
03716    {
03717    0x0ae7, 0x25aa},             /*            enfilledsqbullet ▪ BLACK SMALL SQUARE */
03718    {
03719    0x0ae1, 0x25ab},             /*          enopensquarebullet ▫ WHITE SMALL SQUARE */
03720    {
03721    0x0adb, 0x25ac},             /*            filledrectbullet ▬ BLACK RECTANGLE */
03722    {
03723    0x0ae2, 0x25ad},             /*              openrectbullet ▭ WHITE RECTANGLE */
03724    {
03725    0x0ae8, 0x25b2},             /*           filledtribulletup ▲ BLACK UP-POINTING TRIANGLE */
03726    {
03727    0x0ae3, 0x25b3},             /*             opentribulletup △ WHITE UP-POINTING TRIANGLE */
03728    {
03729    0x0add, 0x25b6},             /*        filledrighttribullet ▶ BLACK RIGHT-POINTING TRIANGLE */
03730    {
03731    0x0acd, 0x25b7},             /*           rightopentriangle ▷ WHITE RIGHT-POINTING TRIANGLE */
03732    {
03733    0x0ae9, 0x25bc},             /*         filledtribulletdown ▼ BLACK DOWN-POINTING TRIANGLE */
03734    {
03735    0x0ae4, 0x25bd},             /*           opentribulletdown ▽ WHITE DOWN-POINTING TRIANGLE */
03736    {
03737    0x0adc, 0x25c0},             /*         filledlefttribullet ◀ BLACK LEFT-POINTING TRIANGLE */
03738    {
03739    0x0acc, 0x25c1},             /*            leftopentriangle ◁ WHITE LEFT-POINTING TRIANGLE */
03740    {
03741    0x09e0, 0x25c6},             /*                soliddiamond ◆ BLACK DIAMOND */
03742    {
03743    0x0ace, 0x25cb},             /*                emopencircle ○ WHITE CIRCLE */
03744    {
03745    0x0bcf, 0x25cb},             /*                      circle ○ WHITE CIRCLE */
03746    {
03747    0x0ade, 0x25cf},             /*              emfilledcircle ● BLACK CIRCLE */
03748    {
03749    0x0ae0, 0x25e6},             /*            enopencircbullet ◦ WHITE BULLET */
03750    {
03751    0x0ae5, 0x2606},             /*                    openstar ☆ WHITE STAR */
03752    {
03753    0x0af9, 0x260e},             /*                   telephone ☎ BLACK TELEPHONE */
03754    {
03755    0x0aca, 0x2613},             /*               signaturemark ☓ SALTIRE */
03756    {
03757    0x0aea, 0x261c},             /*                 leftpointer ☜ WHITE LEFT POINTING INDEX */
03758    {
03759    0x0aeb, 0x261e},             /*                rightpointer ☞ WHITE RIGHT POINTING INDEX */
03760    {
03761    0x0af8, 0x2640},             /*                femalesymbol ♀ FEMALE SIGN */
03762    {
03763    0x0af7, 0x2642},             /*                  malesymbol ♂ MALE SIGN */
03764    {
03765    0x0aec, 0x2663},             /*                        club ♣ BLACK CLUB SUIT */
03766    {
03767    0x0aee, 0x2665},             /*                       heart ♥ BLACK HEART SUIT */
03768    {
03769    0x0aed, 0x2666},             /*                     diamond ♦ BLACK DIAMOND SUIT */
03770    {
03771    0x0af6, 0x266d},             /*                 musicalflat ♭ MUSIC FLAT SIGN */
03772    {
03773    0x0af5, 0x266f},             /*                musicalsharp ♯ MUSIC SHARP SIGN */
03774    {
03775    0x0af3, 0x2713},             /*                   checkmark ✓ CHECK MARK */
03776    {
03777    0x0af4, 0x2717},             /*                 ballotcross ✗ BALLOT X */
03778    {
03779    0x0ad9, 0x271d},             /*                  latincross ✝ LATIN CROSS */
03780    {
03781    0x0af0, 0x2720},             /*                maltesecross ✠ MALTESE CROSS */
03782    {
03783    0x04a4, 0x3001},             /*                  kana_comma 、 IDEOGRAPHIC COMMA */
03784    {
03785    0x04a1, 0x3002},             /*               kana_fullstop 。 IDEOGRAPHIC FULL STOP */
03786    {
03787    0x04a2, 0x300c},             /*         kana_openingbracket 「 LEFT CORNER BRACKET */
03788    {
03789    0x04a3, 0x300d},             /*         kana_closingbracket 」 RIGHT CORNER BRACKET */
03790    {
03791    0x04de, 0x309b},             /*                 voicedsound ゛ KATAKANA-HIRAGANA VOICED SOUND MARK */
03792    {
03793    0x04df, 0x309c},             /*             semivoicedsound ゜ KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK */
03794    {
03795    0x04a7, 0x30a1},             /*                      kana_a ァ KATAKANA LETTER SMALL A */
03796    {
03797    0x04b1, 0x30a2},             /*                      kana_A ア KATAKANA LETTER A */
03798    {
03799    0x04a8, 0x30a3},             /*                      kana_i ィ KATAKANA LETTER SMALL I */
03800    {
03801    0x04b2, 0x30a4},             /*                      kana_I イ KATAKANA LETTER I */
03802    {
03803    0x04a9, 0x30a5},             /*                      kana_u ゥ KATAKANA LETTER SMALL U */
03804    {
03805    0x04b3, 0x30a6},             /*                      kana_U ウ KATAKANA LETTER U */
03806    {
03807    0x04aa, 0x30a7},             /*                      kana_e ェ KATAKANA LETTER SMALL E */
03808    {
03809    0x04b4, 0x30a8},             /*                      kana_E エ KATAKANA LETTER E */
03810    {
03811    0x04ab, 0x30a9},             /*                      kana_o ォ KATAKANA LETTER SMALL O */
03812    {
03813    0x04b5, 0x30aa},             /*                      kana_O オ KATAKANA LETTER O */
03814    {
03815    0x04b6, 0x30ab},             /*                     kana_KA カ KATAKANA LETTER KA */
03816    {
03817    0x04b7, 0x30ad},             /*                     kana_KI キ KATAKANA LETTER KI */
03818    {
03819    0x04b8, 0x30af},             /*                     kana_KU ク KATAKANA LETTER KU */
03820    {
03821    0x04b9, 0x30b1},             /*                     kana_KE ケ KATAKANA LETTER KE */
03822    {
03823    0x04ba, 0x30b3},             /*                     kana_KO コ KATAKANA LETTER KO */
03824    {
03825    0x04bb, 0x30b5},             /*                     kana_SA サ KATAKANA LETTER SA */
03826    {
03827    0x04bc, 0x30b7},             /*                    kana_SHI シ KATAKANA LETTER SI */
03828    {
03829    0x04bd, 0x30b9},             /*                     kana_SU ス KATAKANA LETTER SU */
03830    {
03831    0x04be, 0x30bb},             /*                     kana_SE セ KATAKANA LETTER SE */
03832    {
03833    0x04bf, 0x30bd},             /*                     kana_SO ソ KATAKANA LETTER SO */
03834    {
03835    0x04c0, 0x30bf},             /*                     kana_TA タ KATAKANA LETTER TA */
03836    {
03837    0x04c1, 0x30c1},             /*                    kana_CHI チ KATAKANA LETTER TI */
03838    {
03839    0x04af, 0x30c3},             /*                    kana_tsu ッ KATAKANA LETTER SMALL TU */
03840    {
03841    0x04c2, 0x30c4},             /*                    kana_TSU ツ KATAKANA LETTER TU */
03842    {
03843    0x04c3, 0x30c6},             /*                     kana_TE テ KATAKANA LETTER TE */
03844    {
03845    0x04c4, 0x30c8},             /*                     kana_TO ト KATAKANA LETTER TO */
03846    {
03847    0x04c5, 0x30ca},             /*                     kana_NA ナ KATAKANA LETTER NA */
03848    {
03849    0x04c6, 0x30cb},             /*                     kana_NI ニ KATAKANA LETTER NI */
03850    {
03851    0x04c7, 0x30cc},             /*                     kana_NU ヌ KATAKANA LETTER NU */
03852    {
03853    0x04c8, 0x30cd},             /*                     kana_NE ネ KATAKANA LETTER NE */
03854    {
03855    0x04c9, 0x30ce},             /*                     kana_NO ノ KATAKANA LETTER NO */
03856    {
03857    0x04ca, 0x30cf},             /*                     kana_HA ハ KATAKANA LETTER HA */
03858    {
03859    0x04cb, 0x30d2},             /*                     kana_HI ヒ KATAKANA LETTER HI */
03860    {
03861    0x04cc, 0x30d5},             /*                     kana_FU フ KATAKANA LETTER HU */
03862    {
03863    0x04cd, 0x30d8},             /*                     kana_HE ヘ KATAKANA LETTER HE */
03864    {
03865    0x04ce, 0x30db},             /*                     kana_HO ホ KATAKANA LETTER HO */
03866    {
03867    0x04cf, 0x30de},             /*                     kana_MA マ KATAKANA LETTER MA */
03868    {
03869    0x04d0, 0x30df},             /*                     kana_MI ミ KATAKANA LETTER MI */
03870    {
03871    0x04d1, 0x30e0},             /*                     kana_MU ム KATAKANA LETTER MU */
03872    {
03873    0x04d2, 0x30e1},             /*                     kana_ME メ KATAKANA LETTER ME */
03874    {
03875    0x04d3, 0x30e2},             /*                     kana_MO モ KATAKANA LETTER MO */
03876    {
03877    0x04ac, 0x30e3},             /*                     kana_ya ャ KATAKANA LETTER SMALL YA */
03878    {
03879    0x04d4, 0x30e4},             /*                     kana_YA ヤ KATAKANA LETTER YA */
03880    {
03881    0x04ad, 0x30e5},             /*                     kana_yu ュ KATAKANA LETTER SMALL YU */
03882    {
03883    0x04d5, 0x30e6},             /*                     kana_YU ユ KATAKANA LETTER YU */
03884    {
03885    0x04ae, 0x30e7},             /*                     kana_yo ョ KATAKANA LETTER SMALL YO */
03886    {
03887    0x04d6, 0x30e8},             /*                     kana_YO ヨ KATAKANA LETTER YO */
03888    {
03889    0x04d7, 0x30e9},             /*                     kana_RA ラ KATAKANA LETTER RA */
03890    {
03891    0x04d8, 0x30ea},             /*                     kana_RI リ KATAKANA LETTER RI */
03892    {
03893    0x04d9, 0x30eb},             /*                     kana_RU ル KATAKANA LETTER RU */
03894    {
03895    0x04da, 0x30ec},             /*                     kana_RE レ KATAKANA LETTER RE */
03896    {
03897    0x04db, 0x30ed},             /*                     kana_RO ロ KATAKANA LETTER RO */
03898    {
03899    0x04dc, 0x30ef},             /*                     kana_WA ワ KATAKANA LETTER WA */
03900    {
03901    0x04a6, 0x30f2},             /*                     kana_WO ヲ KATAKANA LETTER WO */
03902    {
03903    0x04dd, 0x30f3},             /*                      kana_N ン KATAKANA LETTER N */
03904    {
03905    0x04a5, 0x30fb},             /*            kana_conjunctive ・ KATAKANA MIDDLE DOT */
03906    {
03907    0x04b0, 0x30fc},             /*              prolongedsound ー KATAKANA-HIRAGANA PROLONGED SOUND MARK */
03908    {
03909    0x0ea1, 0x3131},             /*               Hangul_Kiyeog ㄱ HANGUL LETTER KIYEOK */
03910    {
03911    0x0ea2, 0x3132},             /*          Hangul_SsangKiyeog ㄲ HANGUL LETTER SSANGKIYEOK */
03912    {
03913    0x0ea3, 0x3133},             /*           Hangul_KiyeogSios ㄳ HANGUL LETTER KIYEOK-SIOS */
03914    {
03915    0x0ea4, 0x3134},             /*                Hangul_Nieun ㄴ HANGUL LETTER NIEUN */
03916    {
03917    0x0ea5, 0x3135},             /*           Hangul_NieunJieuj ㄵ HANGUL LETTER NIEUN-CIEUC */
03918    {
03919    0x0ea6, 0x3136},             /*           Hangul_NieunHieuh ㄶ HANGUL LETTER NIEUN-HIEUH */
03920    {
03921    0x0ea7, 0x3137},             /*               Hangul_Dikeud ㄷ HANGUL LETTER TIKEUT */
03922    {
03923    0x0ea8, 0x3138},             /*          Hangul_SsangDikeud ㄸ HANGUL LETTER SSANGTIKEUT */
03924    {
03925    0x0ea9, 0x3139},             /*                Hangul_Rieul ㄹ HANGUL LETTER RIEUL */
03926    {
03927    0x0eaa, 0x313a},             /*          Hangul_RieulKiyeog ㄺ HANGUL LETTER RIEUL-KIYEOK */
03928    {
03929    0x0eab, 0x313b},             /*           Hangul_RieulMieum ㄻ HANGUL LETTER RIEUL-MIEUM */
03930    {
03931    0x0eac, 0x313c},             /*           Hangul_RieulPieub ㄼ HANGUL LETTER RIEUL-PIEUP */
03932    {
03933    0x0ead, 0x313d},             /*            Hangul_RieulSios ㄽ HANGUL LETTER RIEUL-SIOS */
03934    {
03935    0x0eae, 0x313e},             /*           Hangul_RieulTieut ㄾ HANGUL LETTER RIEUL-THIEUTH */
03936    {
03937    0x0eaf, 0x313f},             /*          Hangul_RieulPhieuf ㄿ HANGUL LETTER RIEUL-PHIEUPH */
03938    {
03939    0x0eb0, 0x3140},             /*           Hangul_RieulHieuh ㅀ HANGUL LETTER RIEUL-HIEUH */
03940    {
03941    0x0eb1, 0x3141},             /*                Hangul_Mieum ㅁ HANGUL LETTER MIEUM */
03942    {
03943    0x0eb2, 0x3142},             /*                Hangul_Pieub ㅂ HANGUL LETTER PIEUP */
03944    {
03945    0x0eb3, 0x3143},             /*           Hangul_SsangPieub ㅃ HANGUL LETTER SSANGPIEUP */
03946    {
03947    0x0eb4, 0x3144},             /*            Hangul_PieubSios ㅄ HANGUL LETTER PIEUP-SIOS */
03948    {
03949    0x0eb5, 0x3145},             /*                 Hangul_Sios ㅅ HANGUL LETTER SIOS */
03950    {
03951    0x0eb6, 0x3146},             /*            Hangul_SsangSios ㅆ HANGUL LETTER SSANGSIOS */
03952    {
03953    0x0eb7, 0x3147},             /*                Hangul_Ieung ㅇ HANGUL LETTER IEUNG */
03954    {
03955    0x0eb8, 0x3148},             /*                Hangul_Jieuj ㅈ HANGUL LETTER CIEUC */
03956    {
03957    0x0eb9, 0x3149},             /*           Hangul_SsangJieuj ㅉ HANGUL LETTER SSANGCIEUC */
03958    {
03959    0x0eba, 0x314a},             /*                Hangul_Cieuc ㅊ HANGUL LETTER CHIEUCH */
03960    {
03961    0x0ebb, 0x314b},             /*               Hangul_Khieuq ㅋ HANGUL LETTER KHIEUKH */
03962    {
03963    0x0ebc, 0x314c},             /*                Hangul_Tieut ㅌ HANGUL LETTER THIEUTH */
03964    {
03965    0x0ebd, 0x314d},             /*               Hangul_Phieuf ㅍ HANGUL LETTER PHIEUPH */
03966    {
03967    0x0ebe, 0x314e},             /*                Hangul_Hieuh ㅎ HANGUL LETTER HIEUH */
03968    {
03969    0x0ebf, 0x314f},             /*                    Hangul_A ㅏ HANGUL LETTER A */
03970    {
03971    0x0ec0, 0x3150},             /*                   Hangul_AE ㅐ HANGUL LETTER AE */
03972    {
03973    0x0ec1, 0x3151},             /*                   Hangul_YA ㅑ HANGUL LETTER YA */
03974    {
03975    0x0ec2, 0x3152},             /*                  Hangul_YAE ㅒ HANGUL LETTER YAE */
03976    {
03977    0x0ec3, 0x3153},             /*                   Hangul_EO ㅓ HANGUL LETTER EO */
03978    {
03979    0x0ec4, 0x3154},             /*                    Hangul_E ㅔ HANGUL LETTER E */
03980    {
03981    0x0ec5, 0x3155},             /*                  Hangul_YEO ㅕ HANGUL LETTER YEO */
03982    {
03983    0x0ec6, 0x3156},             /*                   Hangul_YE ㅖ HANGUL LETTER YE */
03984    {
03985    0x0ec7, 0x3157},             /*                    Hangul_O ㅗ HANGUL LETTER O */
03986    {
03987    0x0ec8, 0x3158},             /*                   Hangul_WA ㅘ HANGUL LETTER WA */
03988    {
03989    0x0ec9, 0x3159},             /*                  Hangul_WAE ㅙ HANGUL LETTER WAE */
03990    {
03991    0x0eca, 0x315a},             /*                   Hangul_OE ㅚ HANGUL LETTER OE */
03992    {
03993    0x0ecb, 0x315b},             /*                   Hangul_YO ㅛ HANGUL LETTER YO */
03994    {
03995    0x0ecc, 0x315c},             /*                    Hangul_U ㅜ HANGUL LETTER U */
03996    {
03997    0x0ecd, 0x315d},             /*                  Hangul_WEO ㅝ HANGUL LETTER WEO */
03998    {
03999    0x0ece, 0x315e},             /*                   Hangul_WE ㅞ HANGUL LETTER WE */
04000    {
04001    0x0ecf, 0x315f},             /*                   Hangul_WI ㅟ HANGUL LETTER WI */
04002    {
04003    0x0ed0, 0x3160},             /*                   Hangul_YU ㅠ HANGUL LETTER YU */
04004    {
04005    0x0ed1, 0x3161},             /*                   Hangul_EU ㅡ HANGUL LETTER EU */
04006    {
04007    0x0ed2, 0x3162},             /*                   Hangul_YI ㅢ HANGUL LETTER YI */
04008    {
04009    0x0ed3, 0x3163},             /*                    Hangul_I ㅣ HANGUL LETTER I */
04010    {
04011    0x0eef, 0x316d},             /*     Hangul_RieulYeorinHieuh ㅭ HANGUL LETTER RIEUL-YEORINHIEUH */
04012    {
04013    0x0ef0, 0x3171},             /*    Hangul_SunkyeongeumMieum ㅱ HANGUL LETTER KAPYEOUNMIEUM */
04014    {
04015    0x0ef1, 0x3178},             /*    Hangul_SunkyeongeumPieub ㅸ HANGUL LETTER KAPYEOUNPIEUP */
04016    {
04017    0x0ef2, 0x317f},             /*              Hangul_PanSios ㅿ HANGUL LETTER PANSIOS */
04018    {
04019    0x0ef4, 0x3184},             /*   Hangul_SunkyeongeumPhieuf ㆄ HANGUL LETTER KAPYEOUNPHIEUPH */
04020    {
04021    0x0ef5, 0x3186},             /*          Hangul_YeorinHieuh ㆆ HANGUL LETTER YEORINHIEUH */
04022    {
04023    0x0ef6, 0x318d},             /*                Hangul_AraeA ㆍ HANGUL LETTER ARAEA */
04024    {
04025    0x0ef7, 0x318e},             /*               Hangul_AraeAE ㆎ HANGUL LETTER ARAEAE */
04026 };
04027 
04028 static guint unicode_to_keyval(wchar_t ucs)
04029 {
04030    int min = 0;
04031    int max = sizeof(u2ktab) / sizeof(u2ktab[0]) - 1;
04032    int mid;
04033 
04034    /* First check for Latin-1 characters (1:1 mapping) */
04035    if ((ucs >= 0x0020 && ucs <= 0x007e) ||
04036        (ucs >= 0x00a0 && ucs <= 0x00ff))
04037       return ucs;
04038 
04039    /* Binary search in table */
04040    while (max >= min) {
04041       mid = (min + max) / 2;
04042       if (u2ktab[mid].ucs < ucs)
04043          min = mid + 1;
04044       else if (u2ktab[mid].ucs > ucs)
04045          max = mid - 1;
04046       else {
04047          /* found it */
04048          return u2ktab[mid].keysym;
04049       }
04050    }
04051 
04052    /*
04053     * No matching keysym value found, return Unicode value plus 0x01000000
04054     * (a convention introduced in the UTF-8 work on xterm).
04055     */
04056    return ucs | 0x01000000;
04057 }
04058 
04059 static void build_key_event_state(GdkEvent * event)
04060 {
04061    if (GetKeyState(VK_SHIFT) < 0)
04062       event->key.state |= GDK_SHIFT_MASK;
04063    if (GetKeyState(VK_CAPITAL) & 0x1)
04064       event->key.state |= GDK_LOCK_MASK;
04065    if (!is_AltGr_key) {
04066       if (GetKeyState(VK_CONTROL) < 0) {
04067          event->key.state |= GDK_CONTROL_MASK;
04068 #if 0
04069          if (event->key.keyval < ' ')
04070             event->key.keyval += '@';
04071 #endif
04072       }
04073 #if 0
04074       /* We never get here (?) */
04075       else if (event->key.keyval < ' ') {
04076          event->key.state |= GDK_CONTROL_MASK;
04077          event->key.keyval += '@';
04078       }
04079 #endif
04080       if (GetKeyState(VK_MENU) < 0) {
04081          event->key.state |= GDK_MOD1_MASK;
04082       }
04083    }
04084 }
04085 
04086 static gint build_pointer_event_state(MSG * xevent)
04087 {
04088    gint state;
04089 
04090    state = 0;
04091    if (xevent->wParam & MK_CONTROL)
04092       state |= GDK_CONTROL_MASK;
04093    if (xevent->wParam & MK_LBUTTON)
04094       state |= GDK_BUTTON1_MASK;
04095    if (xevent->wParam & MK_MBUTTON)
04096       state |= GDK_BUTTON2_MASK;
04097    if (xevent->wParam & MK_RBUTTON)
04098       state |= GDK_BUTTON3_MASK;
04099    if (xevent->wParam & MK_SHIFT)
04100       state |= GDK_SHIFT_MASK;
04101    if (GetKeyState(VK_MENU) < 0)
04102       state |= GDK_MOD1_MASK;
04103    if (GetKeyState(VK_CAPITAL) & 0x1)
04104       state |= GDK_LOCK_MASK;
04105 
04106    return state;
04107 }
04108 //vo
04109 static gint get_key_value(MSG * xevent)
04110 {
04111    gint ret = GDK_VoidSymbol;
04112 
04113    if (xevent->wParam < 0x20) {
04114       ret = (xevent->wParam + 0x60)  & 0xFF;
04115    } else {
04116       if (xevent->wParam & 0xFF00) {
04117          ret = ((xevent->wParam >> 8) & 0xFF);
04118       } else {
04119          ret = (xevent->wParam & 0xFF);
04120       }
04121    }
04122    return ret;
04123 }
04124 
04125 static void
04126 build_keypress_event(GdkWindowWin32Data * windata,
04127                      GdkEvent * event, MSG * xevent)
04128 {
04129    HIMC hIMC;
04130    gint i, bytecount, ucount, ucleft, len;
04131    guchar buf[100], *bp;
04132    wchar_t wbuf[100], *wcp;
04133 
04134    event->type = GDK_KEY_PRESS;
04135    event->any.type = GDK_KEY_PRESS;
04136    event->key.type = GDK_KEY_PRESS;
04137    event->key.time = xevent->time;
04138    event->key.state = 0;
04139 
04140    if (xevent->message == WM_IME_COMPOSITION) {
04141       hIMC = ImmGetContext(xevent->hwnd);
04142 
04143       bytecount = ImmGetCompositionStringW(hIMC, GCS_RESULTSTR,
04144                                            wbuf, sizeof(wbuf));
04145       ucount = bytecount / 2;
04146    } else {
04147       if (xevent->message == WM_CHAR || xevent->message == WM_SYSCHAR) {
04148          bytecount = MIN((xevent->lParam & 0xFFFF), sizeof(buf));
04149          for (i = 0; i < bytecount; i++)
04150             buf[i] = xevent->wParam;
04151       } else {                  /* WM_IME_CHAR */
04152 
04153          event->key.keyval = GDK_VoidSymbol;
04154          if (xevent->wParam & 0xFF00) {
04155             /* Contrary to some versions of the documentation,
04156              * the lead byte is the most significant byte.
04157              */
04158             buf[0] = ((xevent->wParam >> 8) & 0xFF);
04159             buf[1] = (xevent->wParam & 0xFF);
04160             bytecount = 2;
04161          } else {
04162             buf[0] = (xevent->wParam & 0xFF);
04163             bytecount = 1;
04164          }
04165       }
04166 
04167       /* Convert from the window's current code page
04168        * to Unicode. Then convert to UTF-8.
04169        * We don't handle the surrogate stuff. Should we?
04170        */
04171       ucount = MultiByteToWideChar(windata->charset_info.ciACP,
04172                                    0, buf, bytecount,
04173                                    wbuf, sizeof(wbuf) / sizeof(wbuf[0]));
04174 
04175    }
04176    if (ucount == 0)
04177       event->key.keyval = GDK_VoidSymbol;
04178    else if (xevent->message == WM_CHAR || xevent->message == WM_SYSCHAR)
04179       if (xevent->wParam < ' ') {
04180          event->key.keyval = xevent->wParam + '@';
04181          /* This is needed in case of Alt+nnn or Alt+0nnn (on the numpad)
04182           * where nnn<32
04183           */
04184          event->key.state |= GDK_CONTROL_MASK;
04185       } else
04186          event->key.keyval = unicode_to_keyval(wbuf[0]);
04187 
04188    build_key_event_state(event);
04189 
04190    /* Build UTF-8 string */
04191    ucleft = ucount;
04192    len = 0;
04193    wcp = wbuf;
04194    while (ucleft-- > 0) {
04195       wchar_t c = *wcp++;
04196 
04197       if (c < 0x80)
04198          len += 1;
04199       else if (c < 0x800)
04200          len += 2;
04201       else
04202          len += 3;
04203    }
04204 
04205    event->key.string = g_malloc(len + 1);
04206    event->key.length = len;
04207 
04208    ucleft = ucount;
04209    wcp = wbuf;
04210    bp = event->key.string;
04211    while (ucleft-- > 0) {
04212       int first;
04213       int i;
04214       wchar_t c = *wcp++;
04215 
04216       if (c < 0x80) {
04217          first = 0;
04218          len = 1;
04219       } else if (c < 0x800) {
04220          first = 0xc0;
04221          len = 2;
04222       } else {
04223          first = 0xe0;
04224          len = 3;
04225       }
04226 
04227 #if 1
04228       /* Woo-hoo! */
04229       switch (len) {
04230       case 3:
04231          bp[2] = (c & 0x3f) | 0x80;
04232          c >>= 6;               /* Fall through */
04233       case 2:
04234          bp[1] = (c & 0x3f) | 0x80;
04235          c >>= 6;               /* Fall through */
04236       case 1:
04237          bp[0] = c | first;
04238       }
04239 #else
04240       for (i = len - 1; i > 0; --i) {
04241          bp[i] = (c & 0x3f) | 0x80;
04242          c >>= 6;
04243       }
04244       bp[0] = c | first;
04245 #endif
04246 
04247       bp += len;
04248    }
04249    *bp = 0;
04250 }
04251 
04252 static void
04253 build_keyrelease_event(GdkWindowWin32Data * windata,
04254                        GdkEvent * event, MSG * xevent)
04255 {
04256    guchar buf;
04257    wchar_t wbuf;
04258 
04259    event->type = GDK_KEY_RELEASE;
04260    event->key.type = GDK_KEY_RELEASE;
04261    event->key.time = xevent->time;
04262    event->key.state = 0;
04263 
04264    if (xevent->message == WM_CHAR || xevent->message == WM_SYSCHAR)
04265       if (xevent->wParam < ' ')
04266          event->key.keyval = xevent->wParam + '@';
04267       else {
04268          buf = xevent->wParam;
04269          MultiByteToWideChar(windata->charset_info.ciACP,
04270                              0, &buf, 1, &wbuf, 1);
04271 
04272          event->key.keyval = unicode_to_keyval(wbuf);
04273    } else
04274       event->key.keyval = GDK_VoidSymbol;
04275    build_key_event_state(event);
04276    event->key.string = NULL;
04277    event->key.length = 0;
04278    k_grab_window = 0; //vo
04279 }
04280 
04281 static void print_event_state(gint state)
04282 {
04283    if (state & GDK_SHIFT_MASK)
04284       g_print("SHIFT ");
04285    if (state & GDK_LOCK_MASK)
04286       g_print("LOCK ");
04287    if (state & GDK_CONTROL_MASK)
04288       g_print("CONTROL ");
04289    if (state & GDK_MOD1_MASK)
04290       g_print("MOD1 ");
04291    if (state & GDK_BUTTON1_MASK)
04292       g_print("BUTTON1 ");
04293    if (state & GDK_BUTTON2_MASK)
04294       g_print("BUTTON2 ");
04295    if (state & GDK_BUTTON3_MASK)
04296       g_print("BUTTON3 ");
04297 }
04298 
04299 static void print_event(GdkEvent * event)
04300 {
04301    gchar *escaped, *kvname;
04302 
04303    switch (event->any.type) {
04304    case GDK_NOTHING:
04305       g_print("GDK_NOTHING ");
04306       break;
04307    case GDK_DELETE:
04308       g_print("GDK_DELETE ");
04309       break;
04310    case GDK_DESTROY:
04311       g_print("GDK_DESTROY ");
04312       break;
04313    case GDK_EXPOSE:
04314       g_print("GDK_EXPOSE ");
04315       break;
04316    case GDK_MOTION_NOTIFY:
04317       g_print("GDK_MOTION_NOTIFY ");
04318       break;
04319    case GDK_BUTTON_PRESS:
04320       g_print("GDK_BUTTON_PRESS ");
04321       break;
04322    case GDK_2BUTTON_PRESS:
04323       g_print("GDK_2BUTTON_PRESS ");
04324       break;
04325    case GDK_3BUTTON_PRESS:
04326       g_print("GDK_3BUTTON_PRESS ");
04327       break;
04328    case GDK_BUTTON_RELEASE:
04329       g_print("GDK_BUTTON_RELEASE ");
04330       break;
04331    case GDK_KEY_PRESS:
04332       g_print("GDK_KEY_PRESS ");
04333       break;
04334    case GDK_KEY_RELEASE:
04335       g_print("GDK_KEY_RELEASE ");
04336       break;
04337    case GDK_ENTER_NOTIFY:
04338       g_print("GDK_ENTER_NOTIFY ");
04339       break;
04340    case GDK_LEAVE_NOTIFY:
04341       g_print("GDK_LEAVE_NOTIFY ");
04342       break;
04343    case GDK_FOCUS_CHANGE:
04344       g_print("GDK_FOCUS_CHANGE ");
04345       break;
04346    case GDK_CONFIGURE:
04347       g_print("GDK_CONFIGURE ");
04348       break;
04349    case GDK_MAP:
04350       g_print("GDK_MAP ");
04351       break;
04352    case GDK_UNMAP:
04353       g_print("GDK_UNMAP ");
04354       break;
04355    case GDK_PROPERTY_NOTIFY:
04356       g_print("GDK_PROPERTY_NOTIFY ");
04357       break;
04358    case GDK_SELECTION_CLEAR:
04359       g_print("GDK_SELECTION_CLEAR ");
04360       break;
04361    case GDK_SELECTION_REQUEST:
04362       g_print("GDK_SELECTION_REQUEST ");
04363       break;
04364    case GDK_SELECTION_NOTIFY:
04365       g_print("GDK_SELECTION_NOTIFY ");
04366       break;
04367    case GDK_PROXIMITY_IN:
04368       g_print("GDK_PROXIMITY_IN ");
04369       break;
04370    case GDK_PROXIMITY_OUT:
04371       g_print("GDK_PROXIMITY_OUT ");
04372       break;
04373    case GDK_DRAG_ENTER:
04374       g_print("GDK_DRAG_ENTER ");
04375       break;
04376    case GDK_DRAG_LEAVE:
04377       g_print("GDK_DRAG_LEAVE ");
04378       break;
04379    case GDK_DRAG_MOTION:
04380       g_print("GDK_DRAG_MOTION ");
04381       break;
04382    case GDK_DRAG_STATUS:
04383       g_print("GDK_DRAG_STATUS ");
04384       break;
04385    case GDK_DROP_START:
04386       g_print("GDK_DROP_START ");
04387       break;
04388    case GDK_DROP_FINISHED:
04389       g_print("GDK_DROP_FINISHED ");
04390       break;
04391    case GDK_CLIENT_EVENT:
04392       g_print("GDK_CLIENT_EVENT ");
04393       break;
04394    case GDK_VISIBILITY_NOTIFY:
04395       g_print("GDK_VISIBILITY_NOTIFY ");
04396       break;
04397    case GDK_NO_EXPOSE:
04398       g_print("GDK_NO_EXPOSE ");
04399       break;
04400    case GDK_SCROLL:
04401       g_print("GDK_SCROLL ");
04402       break;
04403    }
04404    g_print("%#x ", GDK_DRAWABLE_XID(event->any.window));
04405 
04406    switch (event->any.type) {
04407    case GDK_EXPOSE:
04408       g_print("%dx%d@+%d+%d %d",
04409               event->expose.area.width,
04410               event->expose.area.height,
04411               event->expose.area.x,
04412               event->expose.area.y, event->expose.count);
04413       break;
04414    case GDK_MOTION_NOTIFY:
04415       g_print("(%.4g,%.4g) %s",
04416               event->motion.x, event->motion.y,
04417               event->motion.is_hint ? "HINT " : "");
04418       print_event_state(event->motion.state);
04419       break;
04420    case GDK_BUTTON_PRESS:
04421    case GDK_2BUTTON_PRESS:
04422    case GDK_3BUTTON_PRESS:
04423    case GDK_BUTTON_RELEASE:
04424       g_print("%d (%.4g,%.4g) ",
04425               event->button.button, event->button.x, event->button.y);
04426       print_event_state(event->button.state);
04427       break;
04428    case GDK_KEY_PRESS:
04429    case GDK_KEY_RELEASE:
04430       if (event->key.length == 0)
04431          escaped = g_strdup("");
04432       else
04433          escaped = g_strescape(event->key.string, NULL);
04434       kvname = gdk_keyval_name(event->key.keyval);
04435       g_print("%s %d:\"%s\" ",
04436               (kvname ? kvname : "??"), event->key.length, escaped);
04437       g_free(escaped);
04438       print_event_state(event->key.state);
04439       break;
04440    case GDK_ENTER_NOTIFY:
04441    case GDK_LEAVE_NOTIFY:
04442       g_print("%s ",
04443               (event->crossing.detail == GDK_NOTIFY_INFERIOR ? "INFERIOR" :
04444                (event->crossing.detail ==
04445                 GDK_NOTIFY_ANCESTOR ? "ANCESTOR" : (event->crossing.
04446                                                     detail ==
04447                                                     GDK_NOTIFY_NONLINEAR ?
04448                                                     "NONLINEAR" :
04449                                                     "???"))));
04450       break;
04451    case GDK_SCROLL:
04452       g_print("%s ",
04453               (event->scroll.direction == GDK_SCROLL_UP ? "UP" :
04454                (event->scroll.direction == GDK_SCROLL_DOWN ? "DOWN" :
04455                 (event->scroll.direction == GDK_SCROLL_LEFT ? "LEFT" :
04456                  (event->scroll.direction == GDK_SCROLL_RIGHT ? "RIGHT" :
04457                   "???")))));
04458       print_event_state(event->scroll.state);
04459       break;
04460    }
04461    g_print("\n");
04462 }
04463 
04464 static void synthesize_crossing_events(GdkWindow * window, MSG * xevent)
04465 {
04466    GdkEvent *event;
04467 
04468    /* If we are not using TrackMouseEvent, generate a leave notify
04469     * event if necessary
04470     */
04471    if (p_TrackMouseEvent == NULL
04472        && curWnd
04473        && (GDK_WINDOW_WIN32DATA(curWnd)->
04474            event_mask & GDK_LEAVE_NOTIFY_MASK)) {
04475       GDK_NOTE(EVENTS, g_print("synthesizing LEAVE_NOTIFY event\n"));
04476 
04477       event = gdk_event_new();
04478       event->type = GDK_LEAVE_NOTIFY;
04479       event->crossing.type = GDK_LEAVE_NOTIFY;
04480       event->crossing.window = curWnd;
04481       gdk_window_ref(event->crossing.window);
04482       event->crossing.subwindow = NULL;
04483       event->crossing.time = xevent->time;
04484       event->crossing.x = curX;
04485       event->crossing.y = curY;
04486       event->crossing.x_root = curXroot;
04487       event->crossing.y_root = curYroot;
04488       event->crossing.mode = GDK_CROSSING_NORMAL;
04489       if (IsChild(GDK_DRAWABLE_XID(curWnd), GDK_DRAWABLE_XID(window)))
04490          event->crossing.detail = GDK_NOTIFY_INFERIOR;
04491       else if (IsChild(GDK_DRAWABLE_XID(window), GDK_DRAWABLE_XID(curWnd)))
04492          event->crossing.detail = GDK_NOTIFY_ANCESTOR;
04493       else
04494          event->crossing.detail = GDK_NOTIFY_NONLINEAR;
04495 
04496       event->crossing.focus = TRUE; /* ??? */
04497 //      event->crossing.state = 0;    /* ??? */
04498       event->crossing.state = build_pointer_event_state(xevent);
04499       gdk_event_queue_append(event);
04500       GDK_NOTE(EVENTS, print_event(event));
04501    }
04502 
04503    if (GDK_WINDOW_WIN32DATA(window)->event_mask & GDK_ENTER_NOTIFY_MASK) {
04504       GDK_NOTE(EVENTS, g_print("synthesizing ENTER_NOTIFY event\n"));
04505 
04506       event = gdk_event_new();
04507       event->type = GDK_ENTER_NOTIFY;
04508       event->crossing.type = GDK_ENTER_NOTIFY;
04509       event->crossing.window = window;
04510       gdk_window_ref(event->crossing.window);
04511       event->crossing.subwindow = NULL;
04512       event->crossing.time = xevent->time;
04513       event->crossing.x = LOWORD(xevent->lParam);
04514       event->crossing.y = HIWORD(xevent->lParam);
04515       event->crossing.x_root = (gfloat) xevent->pt.x;
04516       event->crossing.y_root = (gfloat) xevent->pt.y;
04517       event->crossing.mode = GDK_CROSSING_NORMAL;
04518       if (curWnd
04519           && IsChild(GDK_DRAWABLE_XID(curWnd), GDK_DRAWABLE_XID(window)))
04520          event->crossing.detail = GDK_NOTIFY_ANCESTOR;
04521       else if (curWnd
04522                && IsChild(GDK_DRAWABLE_XID(window),
04523                           GDK_DRAWABLE_XID(curWnd)))
04524          event->crossing.detail = GDK_NOTIFY_INFERIOR;
04525       else
04526          event->crossing.detail = GDK_NOTIFY_NONLINEAR;
04527 
04528       event->crossing.focus = TRUE; /* ??? */
04529 //      event->crossing.state = 0;    /* ??? */
04530       event->crossing.state = build_pointer_event_state(xevent);
04531 
04532       gdk_event_queue_append(event);
04533 
04534       GDK_NOTE(EVENTS, print_event(event));
04535 
04536       if (((GdkWindowPrivate *) window)->extension_events != 0
04537           && gdk_input_vtable.enter_event)
04538          gdk_input_vtable.enter_event(&event->crossing, window);
04539 
04540    }
04541 
04542    if (curWnd)
04543       gdk_window_unref(curWnd);
04544    curWnd = window;
04545    gdk_window_ref(curWnd);
04546 #ifdef USE_TRACKMOUSEEVENT
04547    if (p_TrackMouseEvent != NULL) {
04548       TRACKMOUSEEVENT tme;
04549 
04550       tme.cbSize = sizeof(TRACKMOUSEEVENT);
04551       tme.dwFlags = TME_LEAVE;
04552       tme.hwndTrack = GDK_DRAWABLE_XID(curWnd);
04553       tme.dwHoverTime = HOVER_DEFAULT;
04554 
04555       (*p_TrackMouseEvent) (&tme);
04556    }
04557 #endif
04558 }
04559 
04560 static void
04561 translate_mouse_coords(GdkWindow * window1,
04562                        GdkWindow * window2, MSG * xevent)
04563 {
04564    POINT pt;
04565 
04566    pt.x = LOWORD(xevent->lParam);
04567    pt.y = HIWORD(xevent->lParam);
04568    ClientToScreen(GDK_DRAWABLE_XID(window1), &pt);
04569    ScreenToClient(GDK_DRAWABLE_XID(window2), &pt);
04570    xevent->lParam = MAKELPARAM(pt.x, pt.y);
04571    GDK_NOTE(EVENTS, g_print("...new coords are (%d,%d)\n", pt.x, pt.y));
04572 }
04573 
04574 //vo
04575 static gboolean
04576 is_grabbed_button(GdkWindow **window, gint button, gint mod, guint32 time)
04577 {
04578    GdkWindow *found = NULL;
04579    GdkWindow *sav = *window;
04580 
04581    while (*window) {
04582       if (((GDK_WINDOW_WIN32DATA(*window)->grab_button == 0) ||
04583            (GDK_WINDOW_WIN32DATA(*window)->grab_button == button))
04584          && ((GDK_WINDOW_WIN32DATA(*window)->grab_event_mask & GDK_BUTTON_PRESS_MASK)) //) {
04585          && (GDK_WINDOW_WIN32DATA(*window)->grab_modifiers & mod)) {
04586          found = *window;
04587       }
04588       if (((GdkWindowPrivate *) *window)->parent == gdk_parent_root) break;
04589       *window = ((GdkWindowPrivate *) *window)->parent;
04590    }
04591 
04592    if (found) {
04593       *window = found;
04594       gdk_window_ref(*window);
04595       return TRUE;
04596    } else {
04597       *window = sav;
04598       return FALSE;  
04599    }
04600 }
04601 
04602 //vo
04603 static gboolean
04604 is_grabbed_key(GdkWindow **window, gint keycode, gint mod)
04605 {
04606    GdkWindow *found = NULL;
04607    GdkWindow *sav = *window;
04608 
04609    while (1) {
04610       if (find_key_mod(GDK_WINDOW_WIN32DATA(*window)->grab_keys, keycode, mod)) {
04611          found = *window;
04612       }
04613       if (((GdkWindowPrivate *) *window)->parent == gdk_parent_root) break;
04614       *window = ((GdkWindowPrivate *) *window)->parent;
04615    }
04616 
04617    if (found) {
04618       *window = found;
04619       gdk_window_ref(*window);
04620       return TRUE;
04621    } else {
04622       *window = sav;
04623       return FALSE;  
04624    }
04625 }
04626 
04627 static gboolean
04628 propagate(GdkWindow ** window,
04629           MSG * xevent,
04630           GdkWindow * grab_window,
04631           gboolean grab_owner_events,
04632           gint grab_mask,
04633           gboolean(*doesnt_want_it) (gint mask, MSG * xevent))
04634 {  
04635    gboolean in_propagation = FALSE;
04636 
04637    if (grab_window != NULL && !grab_owner_events) {
04638       /* Event source is grabbed with owner_events FALSE */
04639       GDK_NOTE(EVENTS, g_print("...grabbed, owner_events FALSE, "));
04640       if ((*doesnt_want_it) (grab_mask, xevent)) {
04641          GDK_NOTE(EVENTS, g_print("...grabber doesn't want it\n"));
04642          return FALSE;
04643       } else {
04644          GDK_NOTE(EVENTS, g_print("...sending to grabber %#x\n",
04645                                   GDK_DRAWABLE_XID(grab_window)));
04646          gdk_window_unref(*window);
04647          *window = grab_window;
04648          gdk_window_ref(*window);
04649          return TRUE;
04650       }
04651    }
04652 
04653    while (TRUE) {
04654       if (GDK_DRAWABLE_TYPE(*window) == GDK_WINDOW_FOREIGN) return FALSE;
04655       if ((*doesnt_want_it)
04656           (GDK_WINDOW_WIN32DATA(*window)->event_mask, xevent) ) {
04657          /* Owner doesn't want it, propagate to parent. */
04658          if (((GdkWindowPrivate *) * window)->parent == gdk_parent_root) {
04659             /* No parent; check if grabbed */
04660             if (grab_window != NULL) {
04661                /* Event source is grabbed with owner_events TRUE */
04662                GDK_NOTE(EVENTS, g_print("...undelivered, but grabbed\n"));
04663                if ((*doesnt_want_it) (grab_mask, xevent)) {
04664                   /* Grabber doesn't want it either */
04665                   GDK_NOTE(EVENTS,
04666                            g_print("...grabber doesn't want it\n"));
04667                   return FALSE;
04668                } else {
04669                   /* Grabbed! */
04670                   GDK_NOTE(EVENTS, g_print("...sending to grabber %#x\n",
04671                                            GDK_DRAWABLE_XID(grab_window)));
04672                   gdk_window_unref(*window);
04673                   *window = grab_window;
04674                   gdk_window_ref(*window);
04675                   return TRUE;
04676                }
04677             } else {
04678                GDK_NOTE(EVENTS, g_print("...undelivered\n"));
04679                return FALSE;
04680             }
04681          } else {
04682             gdk_window_unref(*window);
04683             *window = ((GdkWindowPrivate *) * window)->parent;
04684             gdk_window_ref(*window);
04685             GDK_NOTE(EVENTS, g_print("...propagating to %#x\n",
04686                                      GDK_DRAWABLE_XID(*window)));
04687             /* The only branch where we actually continue the loop */
04688             in_propagation = TRUE;
04689          }
04690       } else {
04691          return TRUE;
04692       }
04693    }
04694 }
04695 
04696 static gboolean doesnt_want_key(gint mask, MSG * xevent)
04697 {
04698    return (((xevent->message == WM_KEYUP || xevent->message == WM_SYSKEYUP)
04699             && !(mask & GDK_KEY_RELEASE_MASK))
04700            ||
04701            ((xevent->message == WM_KEYDOWN
04702              || xevent->message == WM_SYSKEYDOWN)
04703             && !(mask & GDK_KEY_PRESS_MASK)));
04704 }
04705 
04706 static gboolean doesnt_want_char(gint mask, MSG * xevent)
04707 {
04708    return !(mask & (GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK));
04709 }
04710 
04711 static gboolean doesnt_want_button_press(gint mask, MSG * xevent)
04712 {
04713    return !(mask & GDK_BUTTON_PRESS_MASK);
04714 }
04715 
04716 static gboolean doesnt_want_button_release(gint mask, MSG * xevent)
04717 {
04718    return !(mask & GDK_BUTTON_RELEASE_MASK);
04719 }
04720 
04721 static gboolean doesnt_want_button_motion(gint mask, MSG * xevent)
04722 {
04723    return !((mask & GDK_POINTER_MOTION_MASK)
04724             || ((xevent->wParam & (MK_LBUTTON | MK_MBUTTON | MK_RBUTTON))
04725                 && (mask & GDK_BUTTON_MOTION_MASK))
04726             || ((xevent->wParam & MK_LBUTTON)
04727                 && (mask & GDK_BUTTON1_MOTION_MASK))
04728             || ((xevent->wParam & MK_MBUTTON)
04729                 && (mask & GDK_BUTTON2_MOTION_MASK))
04730             || ((xevent->wParam & MK_RBUTTON)
04731                 && (mask & GDK_BUTTON3_MOTION_MASK)));
04732 }
04733 
04734 static gboolean doesnt_want_scroll(gint mask, MSG * xevent)
04735 {
04736 #if 0
04737    return !(mask & GDK_SCROLL_MASK);
04738 #else
04739    return !(mask & GDK_BUTTON_PRESS_MASK);
04740 #endif
04741 }
04742 
04743 static char *decode_key_lparam(LPARAM lParam)
04744 {
04745    static char buf[100];
04746    char *p = buf;
04747 
04748    if (HIWORD(lParam) & KF_UP)
04749       p += sprintf(p, "KF_UP ");
04750    if (HIWORD(lParam) & KF_REPEAT)
04751       p += sprintf(p, "KF_REPEAT ");
04752    if (HIWORD(lParam) & KF_ALTDOWN)
04753       p += sprintf(p, "KF_ALTDOWN ");
04754    if (HIWORD(lParam) & KF_EXTENDED)
04755       p += sprintf(p, "KF_EXTENDED ");
04756    p += sprintf(p, "sc%d rep%d", LOBYTE(HIWORD(lParam)), LOWORD(lParam));
04757 
04758    return buf;
04759 }
04760 
04761 static gboolean
04762 gdk_event_translate(GdkEvent * event,
04763                     MSG * xevent,
04764                     gboolean * ret_val_flagp, gint * ret_valp)
04765 {
04766    DWORD pidActWin;
04767    DWORD pidThis;
04768    DWORD dwStyle;
04769    PAINTSTRUCT paintstruct;
04770    HDC hdc;
04771    HDC bgdc;
04772    HGDIOBJ oldbitmap;
04773    HBRUSH hbr;
04774    COLORREF bg;
04775    RECT rect;
04776    POINT pt;
04777    MINMAXINFO *lpmmi;
04778    HWND hwnd;
04779    HCURSOR xcursor;
04780    GdkWindow *window, *orig_window, *newwindow;
04781    GdkColormapPrivateWin32 *colormap_private;
04782    GdkEventMask mask;
04783    GdkPixmap *pixmap;
04784    GdkDrawablePrivate *pixmap_private;
04785    int button;
04786    int i, j, n, k;
04787    gchar buf[256];
04788    gchar *msgname;
04789    gboolean return_val;
04790    gboolean flag;
04791 
04792    return_val = FALSE;
04793 
04794    if (ret_val_flagp)
04795       *ret_val_flagp = FALSE;
04796 
04797    window = gdk_window_lookup(xevent->hwnd);
04798    orig_window = window;
04799 
04800    if (window != NULL)
04801       gdk_window_ref(window);
04802    else {
04803       /* Handle WM_QUIT here ? */
04804       if (xevent->message == WM_QUIT) {
04805          GDK_NOTE(EVENTS, g_print("WM_QUIT: %d\n", xevent->wParam));
04806          exit(xevent->wParam);
04807       } else if (xevent->message == WM_MOVE || xevent->message == WM_SIZE) {
04808          /* It's quite normal to get these messages before we have
04809           * had time to register the window in our lookup table, or
04810           * when the window is being destroyed and we already have
04811           * removed it. Repost the same message to our queue so that
04812           * we will get it later when we are prepared.
04813           */
04814          PostMessage(xevent->hwnd, xevent->message,
04815                      xevent->wParam, xevent->lParam);
04816       }
04817       return FALSE;
04818    }
04819 
04820    if (!GDK_DRAWABLE_DESTROYED(window)) {
04821       /* Check for filters for this window */
04822       GdkFilterReturn result;
04823       event->any.window = window;
04824       result = gdk_event_apply_filters
04825           (xevent, event, ((GdkWindowPrivate *) window)->filters);
04826 
04827       if (result != GDK_FILTER_CONTINUE) {
04828          return (result == GDK_FILTER_TRANSLATE) ? TRUE : FALSE;
04829       }
04830    }
04831 
04832    if (xevent->message == gdk_selection_notify_msg) {
04833       GDK_NOTE(EVENTS, g_print("gdk_selection_notify_msg: %#x\n",
04834                                xevent->hwnd));
04835 
04836       event->type = GDK_SELECTION_NOTIFY;
04837       event->selection.type = GDK_SELECTION_NOTIFY;
04838       event->selection.window = window;
04839       event->selection.selection = xevent->wParam;
04840       event->selection.target = xevent->lParam;
04841       event->selection.property = gdk_selection_property;
04842       event->selection.time = xevent->time;
04843 
04844       return_val = !GDK_DRAWABLE_DESTROYED(window);
04845 
04846       goto bypass_switch;
04847    } else if (xevent->message == gdk_selection_request_msg) {
04848       GDK_NOTE(EVENTS, g_print("gdk_selection_request_msg: %#x\n",
04849                                xevent->hwnd));
04850 
04851       event->type = GDK_SELECTION_REQUEST;
04852       event->selection.type = GDK_SELECTION_REQUEST;
04853       event->selection.window = window;
04854       if (xevent->wParam == gdk_clipboard_atom) {
04855          event->selection.selection = gdk_clipboard_atom;
04856          event->selection.target = GDK_TARGET_STRING;
04857       }
04858       else {
04859          event->selection.selection = xevent->wParam;
04860          event->selection.target = 0x0200; // CF_PRIVATEFIRST
04861       }
04862       event->selection.property = gdk_selection_property;
04863       event->selection.requestor = (guint32) xevent->hwnd;
04864       event->selection.time = xevent->time;
04865 
04866       return_val = !GDK_DRAWABLE_DESTROYED(window);
04867 
04868       goto bypass_switch;
04869    } else if (xevent->message == gdk_selection_clear_msg) {
04870       GDK_NOTE(EVENTS, g_print("gdk_selection_clear_msg: %#x\n",
04871                                xevent->hwnd));
04872 
04873       event->type = GDK_SELECTION_CLEAR;
04874       event->selection.type = GDK_SELECTION_CLEAR;
04875       event->selection.window = window;
04876       event->selection.selection = xevent->wParam;
04877       event->selection.time = xevent->time;
04878 
04879       return_val = !GDK_DRAWABLE_DESTROYED(window);
04880 
04881       goto bypass_switch;
04882    } else if (xevent->message == msh_mousewheel_msg) {
04883       GDK_NOTE(EVENTS, g_print("MSH_MOUSEWHEEL: %#x %d\n",
04884                                xevent->hwnd, xevent->wParam));
04885 
04886       event->type = GDK_SCROLL;
04887       event->scroll.type = GDK_SCROLL;
04888 
04889       /* MSG_MOUSEWHEEL is delivered to the foreground window.  Work
04890        * around that. Also, the position is in screen coordinates, not
04891        * client coordinates as with the button messages.
04892        */
04893       pt.x = LOWORD(xevent->lParam);
04894       pt.y = HIWORD(xevent->lParam);
04895       if ((hwnd = WindowFromPoint(pt)) == NULL)
04896          goto bypass_switch;
04897 
04898       xevent->hwnd = hwnd;
04899       if ((newwindow = gdk_window_lookup(xevent->hwnd)) == NULL)
04900          goto bypass_switch;
04901 
04902       if (newwindow != window) {
04903          gdk_window_unref(window);
04904          window = newwindow;
04905          gdk_window_ref(window);
04906       }
04907 
04908       if (((GdkWindowPrivate *) window)->extension_events != 0
04909           && gdk_input_ignore_core) {
04910          GDK_NOTE(EVENTS, g_print("...ignored\n"));
04911          goto bypass_switch;
04912       }
04913 
04914       if (!propagate(&window, xevent,
04915                      p_grab_window, p_grab_owner_events, p_grab_mask,
04916                      doesnt_want_scroll))
04917          goto bypass_switch;
04918 
04919       ScreenToClient(xevent->hwnd, &pt);
04920       event->button.window = window;
04921       event->scroll.direction = ((int) xevent->wParam > 0) ?
04922           GDK_SCROLL_UP : GDK_SCROLL_DOWN;
04923       event->scroll.window = window;
04924       event->scroll.time = xevent->time;
04925       event->scroll.x = (gint16) pt.x;
04926       event->scroll.y = (gint16) pt.y;
04927       event->scroll.x_root = (gint16) LOWORD(xevent->lParam);
04928       event->scroll.y_root = (gint16) HIWORD(xevent->lParam);
04929       event->scroll.pressure = 0.5;
04930       event->scroll.xtilt = 0;
04931       event->scroll.ytilt = 0;
04932       event->scroll.state = 0;  /* No state information with MSH_MOUSEWHEEL */
04933       event->scroll.source = GDK_SOURCE_MOUSE;
04934       event->scroll.deviceid = GDK_CORE_POINTER;
04935       return_val = !GDK_DRAWABLE_DESTROYED(window);
04936 
04937       goto bypass_switch;
04938    } else {
04939       GList *tmp_list;
04940       GdkFilterReturn result = GDK_FILTER_CONTINUE;
04941 
04942       tmp_list = client_filters;
04943       while (tmp_list) {
04944          GdkClientFilter *filter = tmp_list->data;
04945          if (filter->type == xevent->message) {
04946             GDK_NOTE(EVENTS, g_print("client filter matched\n"));
04947             event->any.window = window;
04948             result = (*filter->function) (xevent, event, filter->data);
04949             switch (result) {
04950             case GDK_FILTER_REMOVE:
04951                return_val = FALSE;
04952                break;
04953 
04954             case GDK_FILTER_TRANSLATE:
04955                return_val = TRUE;
04956                break;
04957 
04958             case GDK_FILTER_CONTINUE:
04959                return_val = TRUE;
04960                event->type = GDK_CLIENT_EVENT;
04961                event->client.type = GDK_CLIENT_EVENT;
04962                event->client.window = window;
04963                event->client.message_type = xevent->message;
04964                event->client.data_format = 0;
04965                event->client.data.l[0] = xevent->wParam;
04966                event->client.data.l[1] = xevent->lParam;
04967                break;
04968             }
04969             goto bypass_switch; /* Ouch */
04970          }
04971          tmp_list = tmp_list->next;
04972       }
04973    }
04974 
04975    switch (xevent->message) {
04976    case WM_INPUTLANGCHANGE:
04977       GDK_NOTE(EVENTS,
04978                g_print("WM_INPUTLANGCHANGE: %#x  charset %d locale %x\n",
04979                        xevent->hwnd, xevent->wParam, xevent->lParam));
04980       GDK_WINDOW_WIN32DATA(window)->input_locale = (HKL) xevent->lParam;
04981       TranslateCharsetInfo((DWORD FAR *) xevent->wParam,
04982                            &GDK_WINDOW_WIN32DATA(window)->charset_info,
04983                            TCI_SRCCHARSET);
04984       break;
04985 
04986    case WM_SYSKEYUP:
04987    case WM_SYSKEYDOWN:
04988       //k_grab_window = 0;   //vo terminate active grab
04989 
04990       GDK_NOTE(EVENTS,
04991                g_print("WM_SYSKEY%s: %#x  %s %#x %s\n",
04992                        (xevent->message == WM_SYSKEYUP ? "UP" : "DOWN"),
04993                        xevent->hwnd,
04994                        (GetKeyNameText(xevent->lParam, buf,
04995                                        sizeof(buf)) > 0 ?
04996                         buf : ""),
04997                        xevent->wParam, decode_key_lparam(xevent->lParam)));
04998 
04999       /* Let the system handle Alt-Tab and Alt-Enter */
05000       if (xevent->wParam == VK_TAB
05001           || xevent->wParam == VK_RETURN || xevent->wParam == VK_F4)
05002          break;
05003       /* If posted without us having keyboard focus, ignore */
05004       if (!(xevent->lParam & 0x20000000))
05005          break;
05006 #if 0
05007       /* don't generate events for just the Alt key */
05008       if (xevent->wParam == VK_MENU)
05009          break;
05010 #endif
05011       /* Jump to code in common with WM_KEYUP and WM_KEYDOWN */
05012       goto keyup_or_down;
05013 
05014    case WM_KEYUP:
05015    case WM_KEYDOWN:
05016       //k_grab_window = 0;   //vo terminate active grab
05017 
05018       GDK_NOTE(EVENTS,
05019                printf("WM_KEY%s: %#x  %s %#x %s\n",
05020                        (xevent->message == WM_KEYUP ? "UP" : "DOWN"),
05021                        xevent->hwnd,
05022                        (GetKeyNameText(xevent->lParam, buf,
05023                                        sizeof(buf)) > 0 ?
05024                         buf : ""),
05025                        xevent->wParam, decode_key_lparam(xevent->lParam)));
05026 
05027       ignore_WM_CHAR = TRUE;
05028 
05029    keyup_or_down:
05030 
05031       event->key.window = window;
05032       switch (xevent->wParam) {
05033       case VK_LBUTTON:
05034          event->key.keyval = GDK_Pointer_Button1;
05035          break;
05036       case VK_RBUTTON:
05037          event->key.keyval = GDK_Pointer_Button3;
05038          break;
05039       case VK_MBUTTON:
05040          event->key.keyval = GDK_Pointer_Button2;
05041          break;
05042       case VK_CANCEL:
05043          event->key.keyval = GDK_Cancel;
05044          break;
05045       case VK_BACK:
05046          event->key.keyval = GDK_BackSpace;
05047          break;
05048       case VK_TAB:
05049          event->key.keyval = (GetKeyState(VK_SHIFT) < 0 ?
05050                               GDK_ISO_Left_Tab : GDK_Tab);
05051          break;
05052       case VK_CLEAR:
05053          event->key.keyval = GDK_Clear;
05054          break;
05055       case VK_RETURN:
05056          event->key.keyval = GDK_Return;
05057          break;
05058       case VK_SHIFT:
05059          /* Don't let Shift auto-repeat */
05060          if (xevent->message == WM_KEYDOWN
05061              && (HIWORD(xevent->lParam) & KF_REPEAT))
05062             ignore_WM_CHAR = FALSE;
05063          else
05064             event->key.keyval = GDK_Shift_L;
05065          break;
05066       case VK_CONTROL:
05067          /* And not Control either */
05068          if (xevent->message == WM_KEYDOWN
05069              && (HIWORD(xevent->lParam) & KF_REPEAT))
05070             ignore_WM_CHAR = FALSE;
05071          else if (HIWORD(xevent->lParam) & KF_EXTENDED)
05072             event->key.keyval = GDK_Control_R;
05073          else
05074             event->key.keyval = GDK_Control_L;
05075          break;
05076       case VK_MENU:
05077          /* And not Alt */
05078          if (xevent->message == WM_KEYDOWN
05079              && (HIWORD(xevent->lParam) & KF_REPEAT)) {
05080             ignore_WM_CHAR = FALSE;
05081          } else if (HIWORD(xevent->lParam) & KF_EXTENDED) {
05082             /* AltGr key comes in as Control+Right Alt */
05083             if (GetKeyState(VK_CONTROL) < 0) {
05084                ignore_WM_CHAR = FALSE;
05085                is_AltGr_key = TRUE;
05086             }
05087             event->key.keyval = GDK_Alt_R;
05088          } else {
05089             event->key.keyval = GDK_Alt_L;
05090             /* This needed in case she types Alt+nnn (on the numpad) */
05091             ignore_WM_CHAR = FALSE;
05092          }
05093          break;
05094       case VK_PAUSE:
05095          event->key.keyval = GDK_Pause;
05096          break;
05097       case VK_CAPITAL:
05098          event->key.keyval = GDK_Caps_Lock;
05099          break;
05100       case VK_ESCAPE:
05101          event->key.keyval = GDK_Escape;
05102          break;
05103       case VK_PRIOR:
05104          event->key.keyval = GDK_Prior;
05105          break;
05106       case VK_NEXT:
05107          event->key.keyval = GDK_Next;
05108          break;
05109       case VK_END:
05110          event->key.keyval = GDK_End;
05111          break;
05112       case VK_HOME:
05113          event->key.keyval = GDK_Home;
05114          break;
05115       case VK_LEFT:
05116          event->key.keyval = GDK_Left;
05117          break;
05118       case VK_UP:
05119          event->key.keyval = GDK_Up;
05120          break;
05121       case VK_RIGHT:
05122          event->key.keyval = GDK_Right;
05123          break;
05124       case VK_DOWN:
05125          event->key.keyval = GDK_Down;
05126          break;
05127       case VK_SELECT:
05128          event->key.keyval = GDK_Select;
05129          break;
05130       case VK_PRINT:
05131          event->key.keyval = GDK_Print;
05132          break;
05133       case VK_EXECUTE:
05134          event->key.keyval = GDK_Execute;
05135          break;
05136       case VK_INSERT:
05137          event->key.keyval = GDK_Insert;
05138          break;
05139       case VK_DELETE:
05140          event->key.keyval = GDK_Delete;
05141          break;
05142       case VK_HELP:
05143          event->key.keyval = GDK_Help;
05144          break;
05145       case VK_NUMPAD0:
05146       case VK_NUMPAD1:
05147       case VK_NUMPAD2:
05148       case VK_NUMPAD3:
05149       case VK_NUMPAD4:
05150       case VK_NUMPAD5:
05151       case VK_NUMPAD6:
05152       case VK_NUMPAD7:
05153       case VK_NUMPAD8:
05154       case VK_NUMPAD9:
05155          /* Apparently applications work better if we just pass numpad digits
05156           * on as real digits? So wait for the WM_CHAR instead.
05157           */
05158          ignore_WM_CHAR = FALSE;
05159          break;
05160       case VK_MULTIPLY:
05161          event->key.keyval = GDK_KP_Multiply;
05162          break;
05163       case VK_ADD:
05164          /* Pass it on as an ASCII plus in WM_CHAR. */
05165          ignore_WM_CHAR = FALSE;
05166          break;
05167       case VK_SEPARATOR:
05168          event->key.keyval = GDK_KP_Separator;
05169          break;
05170       case VK_SUBTRACT:
05171          /* Pass it on as an ASCII minus in WM_CHAR. */
05172          ignore_WM_CHAR = FALSE;
05173          break;
05174       case VK_DECIMAL:
05175          /* The keypad decimal key should also be passed on as the decimal
05176           * sign ('.' or ',' depending on the Windows locale settings,
05177           * apparently). So wait for the WM_CHAR here, also.
05178           */
05179          ignore_WM_CHAR = FALSE;
05180          break;
05181       case VK_DIVIDE:
05182          event->key.keyval = GDK_KP_Divide;
05183          break;
05184       case VK_F1:
05185          event->key.keyval = GDK_F1;
05186          break;
05187       case VK_F2:
05188          event->key.keyval = GDK_F2;
05189          break;
05190       case VK_F3:
05191          event->key.keyval = GDK_F3;
05192          break;
05193       case VK_F4:
05194          event->key.keyval = GDK_F4;
05195          break;
05196       case VK_F5:
05197          event->key.keyval = GDK_F5;
05198          break;
05199       case VK_F6:
05200          event->key.keyval = GDK_F6;
05201          break;
05202       case VK_F7:
05203          event->key.keyval = GDK_F7;
05204          break;
05205       case VK_F8:
05206          event->key.keyval = GDK_F8;
05207          break;
05208       case VK_F9:
05209          event->key.keyval = GDK_F9;
05210          break;
05211       case VK_F10:
05212          event->key.keyval = GDK_F10;
05213          break;
05214       case VK_F11:
05215          event->key.keyval = GDK_F11;
05216          break;
05217       case VK_F12:
05218          event->key.keyval = GDK_F12;
05219          break;
05220       case VK_F13:
05221          event->key.keyval = GDK_F13;
05222          break;
05223       case VK_F14:
05224          event->key.keyval = GDK_F14;
05225          break;
05226       case VK_F15:
05227          event->key.keyval = GDK_F15;
05228          break;
05229       case VK_F16:
05230          event->key.keyval = GDK_F16;
05231          break;
05232       case '0':
05233       case '1':
05234       case '2':
05235       case '3':
05236       case '4':
05237       case '5':
05238       case '6':
05239       case '7':
05240       case '8':
05241       case '9':
05242          if (!is_AltGr_key && (GetKeyState(VK_CONTROL) < 0
05243                                || GetKeyState(VK_MENU) < 0))
05244             /* Control- or Alt- digits won't come in as a WM_CHAR, but
05245              * beware of AltGr-digits, which are used for instance on
05246              * Finnish keyboards.
05247              */
05248             event->key.keyval = GDK_0 + (xevent->wParam - '0');
05249          else
05250             ignore_WM_CHAR = FALSE;
05251          break;
05252       case VK_OEM_PLUS:        /* On my Win98, the '+' key comes in
05253                                  * as VK_OEM_PLUS, etc
05254                                  */
05255       case VK_OEM_COMMA:
05256       case VK_OEM_MINUS:
05257       case VK_OEM_PERIOD:
05258       case VK_OEM_2:
05259       case VK_OEM_4:
05260       case VK_OEM_5:
05261       case VK_OEM_6:
05262          if (!is_AltGr_key && (GetKeyState(VK_CONTROL) < 0
05263                                || GetKeyState(VK_MENU) < 0))
05264             /* Control- or Alt- plus, comma, minus or period won't
05265              * come in as WM_CHAR, but beware of AltGr-plus which is
05266              * backslash on Finnish keyboards
05267              */
05268             /* All these VK_OEM keycodes are the corresponding ASCII
05269              * char + 0x90
05270              */
05271             event->key.keyval = xevent->wParam - 0x90;
05272          else
05273             ignore_WM_CHAR = FALSE;
05274          break;
05275       case VK_OEM_1:
05276          if (!is_AltGr_key && (GetKeyState(VK_CONTROL) < 0
05277                                || GetKeyState(VK_MENU) < 0))
05278             /* ;: on US keyboard */
05279             event->key.keyval = ';';
05280          else
05281             ignore_WM_CHAR = FALSE;
05282          break;
05283       case VK_OEM_3:
05284          if (!is_AltGr_key && (GetKeyState(VK_CONTROL) < 0
05285                                || GetKeyState(VK_MENU) < 0))
05286             /* `~ on US keyboard */
05287             event->key.keyval = '`';
05288          else
05289             ignore_WM_CHAR = FALSE;
05290          break;
05291       case VK_OEM_7:
05292          if (!is_AltGr_key && (GetKeyState(VK_CONTROL) < 0
05293                                || GetKeyState(VK_MENU) < 0))
05294             /* '" on US keyboard */
05295             event->key.keyval = '\'';
05296          else
05297             ignore_WM_CHAR = FALSE;
05298          break;
05299       default:
05300          if (xevent->message == WM_SYSKEYDOWN
05301              || xevent->message == WM_SYSKEYUP)
05302             event->key.keyval = xevent->wParam;
05303          else
05304             ignore_WM_CHAR = FALSE;
05305          break;
05306       }
05307 
05308       if (!ignore_WM_CHAR)
05309          break;
05310 
05311       event->key.state = 0;
05312       if (GetKeyState(VK_SHIFT) < 0)
05313          event->key.state |= GDK_SHIFT_MASK;
05314       if (GetKeyState(VK_CAPITAL) & 0x1)
05315          event->key.state |= GDK_LOCK_MASK;
05316       if (GetKeyState(VK_CONTROL) < 0)
05317          event->key.state |= GDK_CONTROL_MASK;
05318       if (xevent->wParam != VK_MENU && GetKeyState(VK_MENU) < 0)
05319          event->key.state |= GDK_MOD1_MASK;
05320 
05321 
05322       //vo check if key is grabbed 
05323       if (!k_grab_window &&
05324           is_grabbed_key(&window, event->key.keyval, event->key.state)) {
05325          gdk_keyboard_grab(window, GDK_WINDOW_WIN32DATA(window)->grab_key_owner_events, 0);
05326       } else {
05327          POINT pt;
05328          HWND chw;
05329          GdkWindow* other_window = 0;
05330          GetCursorPos(&pt);
05331          chw = WindowFromPoint(pt);
05332          other_window = gdk_window_lookup(chw);
05333          if (other_window && IsChild(xevent->hwnd, chw)) {
05334             gdk_window_unref (window);
05335             gdk_window_ref (other_window);
05336             window = other_window;
05337          }
05338       }
05339 
05340       if (!propagate(&window, xevent, k_grab_window, k_grab_owner_events,
05341                      GDK_ALL_EVENTS_MASK, doesnt_want_key)) {
05342          event->key.state = 0;
05343          break;
05344       }
05345 
05346       is_AltGr_key = FALSE;
05347       event->key.window = window;
05348       event->key.type = ((xevent->message == WM_KEYDOWN || 
05349                           xevent->message == WM_SYSKEYDOWN) ?
05350                           GDK_KEY_PRESS : GDK_KEY_RELEASE);
05351       event->type = event->key.type;
05352       event->key.time = xevent->time;
05353       event->key.string = NULL;
05354       event->key.length = 0;
05355       if (event->key.keyval == GDK_Escape) {
05356          event->key.length = 1;
05357          event->key.string = g_strdup ("\033");
05358       }
05359       else if (event->key.keyval == GDK_Return ||
05360                event->key.keyval == GDK_KP_Enter) {
05361          event->key.length = 1;
05362          event->key.string = g_strdup ("\r");
05363       }
05364       return_val = !GDK_DRAWABLE_DESTROYED(window);
05365       break;
05366 
05367    case WM_IME_COMPOSITION:
05368       if (!use_IME_COMPOSITION)
05369          break;
05370       GDK_NOTE(EVENTS, g_print("WM_IME_COMPOSITION: %#x  %#x\n",
05371                                xevent->hwnd, xevent->lParam));
05372       if (xevent->lParam & GCS_RESULTSTR)
05373          goto wm_char;
05374       break;
05375 
05376    case WM_IME_CHAR:
05377       GDK_NOTE(EVENTS,
05378                g_print("WM_IME_CHAR: %#x  bytes: %#.04x\n",
05379                        xevent->hwnd, xevent->wParam));
05380       goto wm_char;
05381 
05382    case WM_CHAR:
05383    case WM_SYSCHAR:
05384       GDK_NOTE(EVENTS,
05385                g_print("WM_%sCHAR: %#x  %#x %#s %s\n",
05386                        (xevent->message == WM_CHAR ? "" : "SYS"),
05387                        xevent->hwnd, xevent->wParam,
05388                        decode_key_lparam(xevent->lParam),
05389                        (ignore_WM_CHAR ? "ignored" : "")));
05390 
05391       if (ignore_WM_CHAR) {
05392          ignore_WM_CHAR = FALSE;
05393          break;
05394       }
05395 
05396    wm_char:
05397       event->key.state = 0;
05398       if (GetKeyState(VK_SHIFT) < 0)
05399          event->key.state |= GDK_SHIFT_MASK;
05400       if (GetKeyState(VK_CAPITAL) & 0x1)
05401          event->key.state |= GDK_LOCK_MASK;
05402       if (GetKeyState(VK_CONTROL) < 0)
05403          event->key.state |= GDK_CONTROL_MASK;
05404       if (xevent->wParam != VK_MENU && GetKeyState(VK_MENU) < 0)
05405          event->key.state |= GDK_MOD1_MASK;
05406 
05407       event->key.keyval = get_key_value(xevent);
05408 
05409       //vo check if key is grabbed 
05410       if (!k_grab_window &&
05411           is_grabbed_key(&window, event->key.keyval, event->key.state)) {
05412          gdk_keyboard_grab(window, GDK_WINDOW_WIN32DATA(window)->grab_key_owner_events, 0);
05413       } else {
05414          POINT pt;
05415          HWND chw;
05416          GdkWindow* other_window = 0;
05417          GetCursorPos(&pt);
05418          chw = WindowFromPoint(pt);
05419          other_window = gdk_window_lookup(chw);
05420          if (other_window && IsChild(xevent->hwnd, chw)) {
05421             gdk_window_unref (window);
05422             gdk_window_ref (other_window);
05423             window = other_window;
05424          }
05425       }
05426 
05427       if (!propagate(&window, xevent, k_grab_window, k_grab_owner_events,
05428                      GDK_ALL_EVENTS_MASK, doesnt_want_char)) {
05429          break;
05430       }
05431 
05432       event->key.window = window;
05433       return_val = !GDK_DRAWABLE_DESTROYED(window);
05434 
05435       if (return_val && (event->key.window == k_grab_window
05436          || (GDK_WINDOW_WIN32DATA(window)->event_mask & GDK_KEY_RELEASE_MASK))) {
05437          if (window == k_grab_window
05438              || (GDK_WINDOW_WIN32DATA(window)->event_mask & GDK_KEY_PRESS_MASK)) {
05439             /* Append a GDK_KEY_PRESS event to the pushback list
05440              * (from which it will be fetched before the release
05441              * event).
05442              */
05443             GdkEvent *event2 = gdk_event_new();
05444             build_keypress_event(GDK_WINDOW_WIN32DATA(window), event2, xevent);
05445             event2->key.window = window;
05446             gdk_window_ref(window);
05447             gdk_event_queue_append(event2);
05448             GDK_NOTE(EVENTS, print_event(event2));
05449          }
05450          /* Return the key release event.  */
05451          build_keyrelease_event(GDK_WINDOW_WIN32DATA(window), event, xevent);
05452       } else if (window == k_grab_window
05453              || (GDK_WINDOW_WIN32DATA(window)->event_mask & GDK_KEY_RELEASE_MASK)) {
05454          /* Return just the key press event. */
05455          build_keyrelease_event(GDK_WINDOW_WIN32DATA(window), event, xevent);
05456       } else if (return_val
05457                  && (GDK_WINDOW_WIN32DATA(window)->event_mask & GDK_KEY_PRESS_MASK)) {
05458          /* Return just the key press event. */
05459          build_keypress_event(GDK_WINDOW_WIN32DATA(window), event, xevent);
05460       } else {
05461          return_val = FALSE;
05462       }
05463 #if 0                           /* Don't reset is_AltGr_key here. Othewise we can't type several
05464                                  * AltGr-accessed chars while keeping the AltGr pressed down
05465                                  * all the time.
05466                                  */
05467       is_AltGr_key = FALSE;
05468 #endif
05469       break;
05470 
05471    case WM_LBUTTONDOWN:
05472       button = 1;
05473       goto buttondown0;
05474    case WM_MBUTTONDOWN:
05475       button = 2;
05476       goto buttondown0;
05477    case WM_RBUTTONDOWN:
05478       button = 3;
05479 
05480     buttondown0:
05481       GDK_NOTE(EVENTS,
05482                g_print("WM_%cBUTTONDOWN: %#x  (%d,%d)\n",
05483                        " LMR"[button],
05484                        xevent->hwnd,
05485                        LOWORD(xevent->lParam), HIWORD(xevent->lParam)));
05486 
05487       if (((GdkWindowPrivate *) window)->extension_events != 0
05488           && gdk_input_ignore_core) {
05489          GDK_NOTE(EVENTS, g_print("...ignored\n"));
05490          break;
05491       }
05492 
05493       window = find_window_for_pointer_event (window, xevent);
05494 
05495       if (window != curWnd)
05496          synthesize_crossing_events(window, xevent);
05497 
05498       event->type = GDK_BUTTON_PRESS;
05499       event->button.type = GDK_BUTTON_PRESS;
05500 
05501       //vo check if button is grabbed 
05502       if (!p_grab_window &&
05503           is_grabbed_button(&window, button, build_pointer_event_state(xevent), xevent->time)) {
05504          gdk_pointer_grab(window, GDK_WINDOW_WIN32DATA(window)->grab_owner_events,
05505                           GDK_WINDOW_WIN32DATA(window)->grab_event_mask,
05506                           GDK_WINDOW_WIN32DATA(window)->grab_confine,
05507                           GDK_WINDOW_WIN32DATA(window)->grab_cursor, 0);
05508          p_grab_automatic = TRUE;
05509       } else if (!propagate(&window, xevent, p_grab_window, p_grab_owner_events,  p_grab_mask,
05510                      doesnt_want_button_press)) {
05511          break;
05512       }
05513       event->button.window = window;
05514 
05515      /* Emulate X11's automatic active grab */
05516       if (!p_grab_window) {
05517          /* No explicit active grab, let's start one automatically */
05518          gint owner_events =
05519              GDK_WINDOW_WIN32DATA (window)->event_mask
05520              & (GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK);
05521 
05522          GDK_NOTE(EVENTS, g_print("...automatic grab started\n"));
05523          gdk_pointer_grab(window,
05524                           owner_events,
05525                           GDK_WINDOW_WIN32DATA (window)->event_mask,
05526                           NULL, NULL, 0);
05527          p_grab_automatic = TRUE;
05528       }
05529 
05530       event->button.time = xevent->time;
05531       if (window != orig_window)
05532          translate_mouse_coords(orig_window, window, xevent);
05533       event->button.x = curX = (gint16) LOWORD(xevent->lParam);
05534       event->button.y = curY = (gint16) HIWORD(xevent->lParam);
05535       event->button.x_root = xevent->pt.x;
05536       event->button.y_root = xevent->pt.y;
05537       event->button.pressure = 0.5;
05538       event->button.xtilt = 0;
05539       event->button.ytilt = 0;
05540       event->button.state = build_pointer_event_state(xevent);
05541       event->button.button = button;
05542       event->button.source = GDK_SOURCE_MOUSE;
05543       event->button.deviceid = GDK_CORE_POINTER;
05544 
05545       gdk_event_button_generate(event);
05546 
05547       return_val = !GDK_DRAWABLE_DESTROYED(window);
05548       break;
05549 
05550    case WM_LBUTTONUP:
05551       button = 1;
05552       goto buttonup0;
05553    case WM_MBUTTONUP:
05554       button = 2;
05555       goto buttonup0;
05556    case WM_RBUTTONUP:
05557       button = 3;
05558 
05559    buttonup0:
05560       GDK_NOTE(EVENTS,
05561                g_print("WM_%cBUTTONUP: %#x  (%d,%d)\n",
05562                        " LMR"[button],
05563                        xevent->hwnd,
05564                        LOWORD(xevent->lParam), HIWORD(xevent->lParam)));
05565 
05566       window = find_window_for_pointer_event (window, xevent);
05567 
05568       if (((GdkWindowPrivate *) window)->extension_events != 0
05569           && gdk_input_ignore_core) {
05570          GDK_NOTE(EVENTS, g_print("...ignored\n"));
05571          break;
05572       }
05573 
05574       if (window != curWnd)
05575          synthesize_crossing_events(window, xevent);
05576 
05577       event->type = GDK_BUTTON_RELEASE;
05578       event->button.type = GDK_BUTTON_RELEASE;
05579       if (!propagate(&window, xevent,
05580                      p_grab_window, p_grab_owner_events, p_grab_mask,
05581                      doesnt_want_button_release)) {
05582       } else {
05583          if (window != orig_window) {
05584             translate_mouse_coords(orig_window, window, xevent);
05585          }
05586 
05587          event->button.window = window;
05588          event->button.time = xevent->time;
05589          event->button.x = (gint16) LOWORD(xevent->lParam);
05590          event->button.y = (gint16) HIWORD(xevent->lParam);
05591          event->button.x_root = xevent->pt.x;
05592          event->button.y_root = xevent->pt.y;
05593          event->button.pressure = 0.5;
05594          event->button.xtilt = 0;
05595          event->button.ytilt = 0;
05596          event->button.state = build_pointer_event_state(xevent);
05597          event->button.button = button;
05598          event->button.source = GDK_SOURCE_MOUSE;
05599          event->button.deviceid = GDK_CORE_POINTER;
05600 
05601          return_val = !GDK_DRAWABLE_DESTROYED(window);
05602       }
05603 
05604       if (p_grab_window != NULL
05605           && p_grab_automatic
05606           && (xevent->wParam & (MK_LBUTTON | MK_MBUTTON | MK_RBUTTON)) == 0) {
05607          gdk_pointer_ungrab (0);
05608       }
05609       break;
05610 
05611    case WM_MOUSELEAVE:
05612       GDK_NOTE(EVENTS, g_print("WM_MOUSELEAVE: %#x\n", xevent->hwnd));
05613 
05614       if (!(GDK_WINDOW_WIN32DATA(window)->
05615            event_mask & GDK_LEAVE_NOTIFY_MASK))
05616          break;
05617 
05618       event->type = GDK_LEAVE_NOTIFY;
05619       event->crossing.type = GDK_LEAVE_NOTIFY;
05620       event->crossing.window = window;
05621       event->crossing.subwindow = NULL;
05622       event->crossing.time = xevent->time;
05623       event->crossing.x = curX;
05624       event->crossing.y = curY;
05625       event->crossing.x_root = curXroot;
05626       event->crossing.y_root = curYroot;
05627       event->crossing.mode = GDK_CROSSING_NORMAL;
05628       if (curWnd && IsChild(GDK_DRAWABLE_XID(curWnd), 
05629                             GDK_DRAWABLE_XID(window)))
05630          event->crossing.detail = GDK_NOTIFY_INFERIOR;
05631       else if (curWnd && IsChild(GDK_DRAWABLE_XID(window),
05632                                  GDK_DRAWABLE_XID(curWnd)))
05633          event->crossing.detail = GDK_NOTIFY_ANCESTOR;
05634       else
05635          event->crossing.detail = GDK_NOTIFY_NONLINEAR;
05636       event->crossing.focus = TRUE;
05637       event->crossing.state = build_pointer_event_state(xevent);
05638 
05639       if (curWnd) {
05640          gdk_window_unref(curWnd);
05641          curWnd = NULL;
05642       }
05643 
05644       return_val = !GDK_DRAWABLE_DESTROYED(window);
05645       break;
05646 
05647    case WM_MOUSEMOVE:
05648       GDK_NOTE(EVENTS,
05649                g_print("WM_MOUSEMOVE: %#x  %#x (%d,%d)\n",
05650                        xevent->hwnd, xevent->wParam,
05651                        LOWORD(xevent->lParam), HIWORD(xevent->lParam)));
05652 
05653       track_mouse_event(xevent->hwnd);
05654 
05655       window = find_window_for_pointer_event (window, xevent);
05656 
05657       if (window != curWnd)
05658          synthesize_crossing_events(window, xevent);
05659 
05660       if (((GdkWindowPrivate *) window)->extension_events != 0
05661           && gdk_input_ignore_core) {
05662          GDK_NOTE(EVENTS, g_print("...ignored\n"));
05663          break;
05664       }
05665 
05666       event->type = GDK_MOTION_NOTIFY;
05667       event->motion.type = GDK_MOTION_NOTIFY;
05668       if (!propagate(&window, xevent,
05669                      p_grab_window, p_grab_owner_events, p_grab_mask,
05670                      doesnt_want_button_motion))
05671          break;
05672 
05673       event->motion.window = window;
05674       event->motion.time = xevent->time;
05675       if (window != orig_window)
05676          translate_mouse_coords(orig_window, window, xevent);
05677 
05678       if (window == curWnd
05679          && (gint16) LOWORD(xevent->lParam) == curX
05680          && (gint16) HIWORD(xevent->lParam) == curY) break;
05681 
05682       event->motion.x = curX = (gint16) LOWORD(xevent->lParam);
05683       event->motion.y = curY = (gint16) HIWORD(xevent->lParam);
05684       event->motion.x_root = xevent->pt.x;
05685       event->motion.y_root = xevent->pt.y;
05686       curXroot = event->motion.x_root;
05687       curYroot = event->motion.y_root;
05688       event->motion.pressure = 0.5;
05689       event->motion.xtilt = 0;
05690       event->motion.ytilt = 0;
05691       event->motion.state = build_pointer_event_state(xevent);
05692 #if 0
05693       event->motion.is_hint = (p_grab_window != NULL
05694                                && (p_grab_mask &
05695                                    GDK_POINTER_MOTION_HINT_MASK));
05696 #else
05697       event->motion.is_hint = FALSE;
05698 #endif
05699       event->motion.source = GDK_SOURCE_MOUSE;
05700       event->motion.deviceid = GDK_CORE_POINTER;
05701 
05702       return_val = !GDK_DRAWABLE_DESTROYED(window);
05703       break;
05704 
05705    case WM_NCMOUSEMOVE:
05706       GDK_NOTE(EVENTS,
05707                g_print("WM_NCMOUSEMOVE: %#x  x,y: %d %d\n",
05708                        xevent->hwnd,
05709                        LOWORD(xevent->lParam), HIWORD(xevent->lParam)));
05710       if (p_TrackMouseEvent == NULL
05711           && curWnd != NULL
05712           && (GDK_WINDOW_WIN32DATA(curWnd)->
05713               event_mask & GDK_LEAVE_NOTIFY_MASK)) {
05714          GDK_NOTE(EVENTS, g_print("...synthesizing LEAVE_NOTIFY event\n"));
05715 
05716          event->type = GDK_LEAVE_NOTIFY;
05717          event->crossing.type = GDK_LEAVE_NOTIFY;
05718          event->crossing.window = curWnd;
05719          event->crossing.subwindow = NULL;
05720          event->crossing.time = xevent->time;
05721          event->crossing.x = curX;
05722          event->crossing.y = curY;
05723          event->crossing.x_root = curXroot;
05724          event->crossing.y_root = curYroot;
05725          event->crossing.mode = GDK_CROSSING_NORMAL;
05726          event->crossing.detail = GDK_NOTIFY_NONLINEAR;
05727 
05728          event->crossing.focus = TRUE; /* ??? */
05729          event->crossing.state = 0;    /* ??? */
05730          return_val = TRUE;
05731       }
05732 
05733       if (curWnd) {
05734          gdk_window_unref(curWnd);
05735          curWnd = NULL;
05736       }
05737 
05738       break;
05739 
05740    case WM_MOUSEWHEEL:
05741       GDK_NOTE(EVENTS, g_print("WM_MOUSEWHEEL: %#x %d\n",
05742                                xevent->hwnd, HIWORD(xevent->wParam)));
05743 
05744       event->type = GDK_SCROLL;
05745       event->scroll.type = GDK_SCROLL;
05746 
05747       /* WM_MOUSEWHEEL seems to be delivered to the focus window Work
05748        * around that, we want it to the window that the mouse is
05749        * in. Also, the position is in screen coordinates, not client
05750        * coordinates as with the button messages. I love the
05751        * consistency of Windows.
05752        */
05753       pt.x = LOWORD(xevent->lParam);
05754       pt.y = HIWORD(xevent->lParam);
05755       if ((hwnd = WindowFromPoint(pt)) == NULL)
05756          break;
05757 
05758       xevent->hwnd = hwnd;
05759       if ((newwindow = gdk_window_lookup(xevent->hwnd)) == NULL)
05760          break;
05761 
05762       if (newwindow != window) {
05763          gdk_window_unref(window);
05764          window = newwindow;
05765          gdk_window_ref(window);
05766       }
05767 
05768       if (((GdkWindowPrivate *) window)->extension_events != 0
05769           && gdk_input_ignore_core) {
05770          GDK_NOTE(EVENTS, g_print("...ignored\n"));
05771          break;
05772       }
05773 
05774       //vo check if button is grabbed 
05775       if (!p_grab_window && 
05776           is_grabbed_button(&window, 0, GDK_ALL_EVENTS_MASK, xevent->time)) {
05777       /* // bb removed 17.09.04 : side effects !
05778           gdk_pointer_grab(window, GDK_WINDOW_WIN32DATA(window)->grab_owner_events,
05779                           GDK_WINDOW_WIN32DATA(window)->grab_event_mask,
05780                           GDK_WINDOW_WIN32DATA(window)->grab_confine,
05781                           GDK_WINDOW_WIN32DATA(window)->grab_cursor, 0);
05782          p_grab_automatic = TRUE;
05783       */
05784       } else if (!propagate(&window, xevent,
05785                      p_grab_window, p_grab_owner_events, p_grab_mask,
05786                      doesnt_want_scroll)) {
05787          break;
05788       }
05789 
05790       ScreenToClient(xevent->hwnd, &pt);
05791       event->button.window = window;
05792       event->scroll.direction = (((short) HIWORD(xevent->wParam)) > 0) ?
05793           GDK_SCROLL_UP : GDK_SCROLL_DOWN;
05794       event->scroll.window = window;
05795       event->scroll.time = xevent->time;
05796       event->scroll.x = (gint16) pt.x;
05797       event->scroll.y = (gint16) pt.y;
05798       event->scroll.x_root = (gint16) LOWORD(xevent->lParam);
05799       event->scroll.y_root = (gint16) HIWORD(xevent->lParam);
05800       event->scroll.pressure = 0.5;
05801       event->scroll.xtilt = 0;
05802       event->scroll.ytilt = 0;
05803       event->scroll.state = build_pointer_event_state(xevent);
05804       event->scroll.source = GDK_SOURCE_MOUSE;
05805       event->scroll.deviceid = GDK_CORE_POINTER;
05806       return_val = !GDK_DRAWABLE_DESTROYED(window);
05807 
05808       break;
05809 
05810 #ifdef USE_TRACKMOUSEEVENT
05811    case WM_MOUSELEAVE:
05812       GDK_NOTE(EVENTS, g_print("WM_MOUSELEAVE: %#x\n", xevent->hwnd));
05813 
05814       if (!
05815           (GDK_WINDOW_WIN32DATA(window)->
05816            event_mask & GDK_LEAVE_NOTIFY_MASK))
05817          break;
05818 
05819       event->type = GDK_LEAVE_NOTIFY;
05820       event->crossing.type = GDK_LEAVE_NOTIFY;
05821       event->crossing.window = window;
05822       event->crossing.subwindow = NULL;
05823       event->crossing.time = xevent->time;
05824       event->crossing.x = curX;
05825       event->crossing.y = curY;
05826       event->crossing.x_root = curXroot;
05827       event->crossing.y_root = curYroot;
05828       event->crossing.mode = GDK_CROSSING_NORMAL;
05829       if (curWnd
05830           && IsChild(GDK_DRAWABLE_XID(curWnd), GDK_DRAWABLE_XID(window)))
05831          event->crossing.detail = GDK_NOTIFY_INFERIOR;
05832       else if (curWnd
05833                && IsChild(GDK_DRAWABLE_XID(window),
05834                           GDK_DRAWABLE_XID(curWnd)))
05835          event->crossing.detail = GDK_NOTIFY_ANCESTOR;
05836       else
05837          event->crossing.detail = GDK_NOTIFY_NONLINEAR;
05838 
05839       event->crossing.focus = TRUE; /* ??? */
05840       event->crossing.state = 0;    /* ??? */
05841 
05842       if (curWnd) {
05843          gdk_window_unref(curWnd);
05844          curWnd = NULL;
05845       }
05846 
05847       return_val = !GDK_DRAWABLE_DESTROYED(window);
05848       break;
05849 #endif
05850 
05851    case WM_SETFOCUS:
05852    case WM_KILLFOCUS:
05853       GDK_NOTE(EVENTS, g_print("WM_%sFOCUS: %#x\n",
05854                                (xevent->message == WM_SETFOCUS ?
05855                                 "SET" : "KILL"), xevent->hwnd));
05856       if (!
05857           (GDK_WINDOW_WIN32DATA(window)->
05858            event_mask & GDK_FOCUS_CHANGE_MASK))
05859          break;
05860 
05861       event->type = GDK_FOCUS_CHANGE;
05862       event->focus_change.type = GDK_FOCUS_CHANGE;
05863       event->focus_change.window = window;
05864       event->focus_change.in = (xevent->message == WM_SETFOCUS);
05865       return_val = !GDK_DRAWABLE_DESTROYED(window);
05866       break;
05867 
05868    case WM_ERASEBKGND:
05869       GDK_NOTE(EVENTS, g_print("WM_ERASEBKGND: %#x  dc %#x\n",
05870                                xevent->hwnd, xevent->wParam));
05871 
05872       if (GDK_DRAWABLE_DESTROYED(window))
05873          break;
05874 
05875       colormap_private =
05876           (GdkColormapPrivateWin32 *) ((GdkWindowPrivate *) window)->
05877           drawable.colormap;
05878       hdc = (HDC) xevent->wParam;
05879       if (colormap_private && colormap_private->xcolormap->rc_palette) {
05880          int k;
05881 
05882          if (SelectPalette(hdc, colormap_private->xcolormap->palette,
05883                            FALSE) == NULL)
05884             WIN32_GDI_FAILED("SelectPalette");
05885          if ((k = RealizePalette(hdc)) == GDI_ERROR)
05886             WIN32_GDI_FAILED("RealizePalette");
05887 #if 0
05888          g_print("WM_ERASEBKGND: selected %#x, realized %d colors\n",
05889                  colormap_private->xcolormap->palette, k);
05890 #endif
05891       }
05892       *ret_val_flagp = TRUE;
05893       *ret_valp = 1;
05894 
05895       if (GDK_WINDOW_WIN32DATA(window)->bg_type ==
05896           GDK_WIN32_BG_TRANSPARENT)
05897          break;
05898 
05899       if (GDK_WINDOW_WIN32DATA(window)->bg_type ==
05900           GDK_WIN32_BG_PARENT_RELATIVE) {
05901          /* If this window should have the same background as the
05902           * parent, fetch the parent. (And if the same goes for
05903           * the parent, fetch the grandparent, etc.)
05904           */
05905          while (window
05906                 && GDK_WINDOW_WIN32DATA(window)->bg_type ==
05907                 GDK_WIN32_BG_PARENT_RELATIVE) {
05908             gdk_window_unref(window);
05909             window = ((GdkWindowPrivate *) window)->parent;
05910             gdk_window_ref(window);
05911          }
05912       }
05913 
05914       if (GDK_WINDOW_WIN32DATA(window)->bg_type == GDK_WIN32_BG_PIXEL) {
05915          bg = gdk_colormap_color(colormap_private,
05916                                  GDK_WINDOW_WIN32DATA(window)->bg_pixel);
05917 
05918          GetClipBox(hdc, &rect);
05919          GDK_NOTE(EVENTS,
05920                   g_print("...%dx%d@+%d+%d BG_PIXEL %.06x\n",
05921                           rect.right - rect.left,
05922                           rect.bottom - rect.top,
05923                           rect.left, rect.top, bg));
05924          hbr = CreateSolidBrush(bg);
05925 #if 0
05926          g_print("...CreateSolidBrush (%.08x) = %.08x\n", bg, hbr);
05927 #endif
05928          if (!FillRect(hdc, &rect, hbr))
05929             WIN32_GDI_FAILED("FillRect");
05930          DeleteObject(hbr);
05931       } else if (GDK_WINDOW_WIN32DATA(window)->bg_type ==
05932                  GDK_WIN32_BG_PIXMAP) {
05933          pixmap = GDK_WINDOW_WIN32DATA(window)->bg_pixmap;
05934          pixmap_private = (GdkDrawablePrivate *) pixmap;
05935          GetClipBox(hdc, &rect);
05936 
05937          if (pixmap_private->width <= 8 && pixmap_private->height <= 8) {
05938             GDK_NOTE(EVENTS, g_print("...small pixmap, using brush\n"));
05939             hbr = CreatePatternBrush(GDK_DRAWABLE_XID(pixmap));
05940             if (!FillRect(hdc, &rect, hbr))
05941                WIN32_GDI_FAILED("FillRect");
05942             DeleteObject(hbr);
05943          } else {
05944             GDK_NOTE(EVENTS,
05945                      g_print("...blitting pixmap %#x (%dx%d) "
05946                              "all over the place,\n"
05947                              "...clip box = %dx%d@+%d+%d\n",
05948                              GDK_DRAWABLE_XID(pixmap),
05949                              pixmap_private->width, pixmap_private->height,
05950                              rect.right - rect.left,
05951                              rect.bottom - rect.top, rect.left, rect.top));
05952 
05953             if (!(bgdc = CreateCompatibleDC(hdc))) {
05954                WIN32_GDI_FAILED("CreateCompatibleDC");
05955                break;
05956             }
05957             if (!
05958                 (oldbitmap =
05959                  SelectObject(bgdc, GDK_DRAWABLE_XID(pixmap)))) {
05960                WIN32_GDI_FAILED("SelectObject");
05961                DeleteDC(bgdc);
05962                break;
05963             }
05964             i = 0;
05965             while (i < rect.right) {
05966                j = 0;
05967                while (j < rect.bottom) {
05968                   if (i + pixmap_private->width >= rect.left
05969                       && j + pixmap_private->height >= rect.top) {
05970                      if (!BitBlt(hdc, i, j,
05971                                  pixmap_private->width,
05972                                  pixmap_private->height, bgdc, 0, 0,
05973                                  SRCCOPY)) {
05974                         WIN32_GDI_FAILED("BitBlt");
05975                         goto loopexit;
05976                      }
05977                   }
05978                   j += pixmap_private->height;
05979                }
05980                i += pixmap_private->width;
05981             }
05982           loopexit:
05983             SelectObject(bgdc, oldbitmap);
05984             DeleteDC(bgdc);
05985          }
05986       } else {
05987          GDK_NOTE(EVENTS, g_print("...BLACK_BRUSH (?)\n"));
05988          hbr = GetStockObject(BLACK_BRUSH);
05989          GetClipBox(hdc, &rect);
05990          if (!FillRect(hdc, &rect, hbr))
05991             WIN32_GDI_FAILED("FillRect");
05992       }
05993       break;
05994 
05995    case WM_PAINT:
05996       hdc = BeginPaint(xevent->hwnd, &paintstruct);
05997 
05998       GDK_NOTE(EVENTS,
05999                g_print("WM_PAINT: %#x  %dx%d@+%d+%d %s dc %#x\n",
06000                        xevent->hwnd,
06001                        paintstruct.rcPaint.right -
06002                        paintstruct.rcPaint.left,
06003                        paintstruct.rcPaint.bottom -
06004                        paintstruct.rcPaint.top, paintstruct.rcPaint.left,
06005                        paintstruct.rcPaint.top,
06006                        (paintstruct.fErase ? "erase" : ""), hdc));
06007 
06008       EndPaint(xevent->hwnd, &paintstruct);
06009 
06010       if (!(GDK_WINDOW_WIN32DATA(window)->event_mask & GDK_EXPOSURE_MASK))
06011          break;
06012 
06013       event->type = GDK_EXPOSE;
06014       event->expose.type = GDK_EXPOSE;
06015       event->expose.window = window;
06016       event->expose.area.x = paintstruct.rcPaint.left;
06017       event->expose.area.y = paintstruct.rcPaint.top;
06018       event->expose.area.width =
06019           paintstruct.rcPaint.right - paintstruct.rcPaint.left;
06020       event->expose.area.height =
06021           paintstruct.rcPaint.bottom - paintstruct.rcPaint.top;
06022       event->expose.count = 0;
06023 
06024       return_val = !GDK_DRAWABLE_DESTROYED(window);
06025       if (return_val) {
06026          GList *list = gdk_queued_events;
06027          while (list != NULL) {
06028             if ((((GdkEvent *) list->data)->any.type == GDK_EXPOSE) &&
06029                 (((GdkEvent *) list->data)->any.window == window) &&
06030                 !(((GdkEventPrivate *) list->data)->
06031                   flags & GDK_EVENT_PENDING))
06032                ((GdkEvent *) list->data)->expose.count++;
06033 
06034             list = list->next;
06035          }
06036       }
06037       break;
06038 
06039    case WM_SETCURSOR:
06040       GDK_NOTE(EVENTS, g_print("WM_SETCURSOR: %#x %#x %#x\n",
06041                                xevent->hwnd,
06042                                LOWORD(xevent->lParam),
06043                                HIWORD(xevent->lParam)));
06044 
06045       if (LOWORD(xevent->lParam) != HTCLIENT)
06046          break;
06047 
06048       if (p_grab_window != NULL && p_grab_cursor != NULL)
06049          xcursor = p_grab_cursor;
06050       else if (!GDK_DRAWABLE_DESTROYED(window))
06051          xcursor = GDK_WINDOW_WIN32DATA(window)->xcursor;
06052       else
06053          xcursor = NULL;
06054    
06055       /*if (p_grab_cursor != NULL) { //vo
06056          DestroyCursor (p_grab_cursor);
06057          p_grab_cursor = NULL;
06058       }*/
06059 
06060       if (xcursor != NULL) {
06061          GDK_NOTE(EVENTS, g_print("...SetCursor(%#x)\n", xcursor));
06062          SetCursor(xcursor);
06063          *ret_val_flagp = TRUE;
06064          *ret_valp = TRUE;
06065       }
06066       break;
06067 
06068    case WM_SHOWWINDOW:
06069       GDK_NOTE(EVENTS, g_print("WM_SHOWWINDOW: %#x  %d\n",
06070                                xevent->hwnd, xevent->wParam));
06071 
06072       if (!(GDK_WINDOW_WIN32DATA(window)->event_mask & GDK_STRUCTURE_MASK))
06073          break;
06074 
06075       event->any.type = (xevent->wParam ? GDK_MAP : GDK_UNMAP);
06076       event->any.window = window;
06077       event->type = event->any.type;
06078 
06079       if (event->any.type == GDK_UNMAP && p_grab_window == window)
06080          gdk_pointer_ungrab(xevent->time);
06081 
06082       if (event->any.type == GDK_UNMAP && k_grab_window == window)
06083          gdk_keyboard_ungrab(xevent->time);
06084 
06085       return_val = !GDK_DRAWABLE_DESTROYED(window);
06086       break;
06087 
06088    case WM_SIZE:
06089       GDK_NOTE(EVENTS,
06090                g_print("WM_SIZE: %#x  %s %dx%d\n",
06091                        xevent->hwnd,
06092                        (xevent->wParam == SIZE_MAXHIDE ? "MAXHIDE" :
06093                         (xevent->wParam == SIZE_MAXIMIZED ? "MAXIMIZED" :
06094                          (xevent->wParam == SIZE_MAXSHOW ? "MAXSHOW" :
06095                           (xevent->wParam == SIZE_MINIMIZED ? "MINIMIZED" :
06096                            (xevent->wParam ==
06097                             SIZE_RESTORED ? "RESTORED" : "?"))))),
06098                        LOWORD(xevent->lParam), HIWORD(xevent->lParam)));
06099 
06100       if (!(GDK_WINDOW_WIN32DATA(window)->event_mask & GDK_STRUCTURE_MASK))
06101          break;
06102 
06103       if (xevent->wParam == SIZE_MINIMIZED) {
06104          event->any.type = GDK_UNMAP;
06105          event->any.window = window;
06106          event->type = GDK_UNMAP;
06107 
06108          if (p_grab_window == window)
06109             gdk_pointer_ungrab(xevent->time);
06110 
06111          if (k_grab_window == window)
06112             gdk_keyboard_ungrab(xevent->time);
06113 
06114          return_val = !GDK_DRAWABLE_DESTROYED(window);
06115       } else if ((xevent->wParam == SIZE_RESTORED
06116                   || xevent->wParam == SIZE_MAXIMIZED)
06117 #if 1
06118                  && GDK_DRAWABLE_TYPE(window) != GDK_WINDOW_CHILD
06119 #endif
06120           ) {
06121          if (LOWORD(xevent->lParam) == 0)
06122             break;
06123 
06124          event->type = GDK_CONFIGURE;
06125          event->configure.type = GDK_CONFIGURE;
06126          event->configure.window = window;
06127          pt.x = 0;
06128          pt.y = 0;
06129          ClientToScreen(xevent->hwnd, &pt);
06130          event->configure.x = pt.x;
06131          event->configure.y = pt.y;
06132          event->configure.width = LOWORD(xevent->lParam);
06133          event->configure.height = HIWORD(xevent->lParam);
06134          ((GdkWindowPrivate *) window)->x = event->configure.x;
06135          ((GdkWindowPrivate *) window)->y = event->configure.y;
06136          ((GdkWindowPrivate *) window)->drawable.width =
06137              event->configure.width;
06138          ((GdkWindowPrivate *) window)->drawable.height =
06139              event->configure.height;
06140          if (((GdkWindowPrivate *) window)->resize_count > 1)
06141             ((GdkWindowPrivate *) window)->resize_count -= 1;
06142 
06143          return_val = !GDK_DRAWABLE_DESTROYED(window);
06144          if (return_val
06145              && ((GdkWindowPrivate *) window)->extension_events != 0
06146              && gdk_input_vtable.configure_event)
06147             gdk_input_vtable.configure_event(&event->configure, window);
06148       } else if ((xevent->wParam == SIZE_RESTORED
06149                   || xevent->wParam == SIZE_MAXIMIZED)
06150                  && GDK_DRAWABLE_TYPE(window) == GDK_WINDOW_CHILD) {
06151          event->type = GDK_CONFIGURE;
06152          event->configure.type = GDK_CONFIGURE;
06153          event->configure.window = window;
06154          GetClientRect(xevent->hwnd, &rect);
06155          event->configure.x = rect.left;
06156          event->configure.y = rect.top;
06157          event->configure.width = rect.right;
06158          event->configure.height = rect.bottom;
06159          ((GdkWindowPrivate *) window)->x = event->configure.x;
06160          ((GdkWindowPrivate *) window)->y = event->configure.y;
06161          ((GdkWindowPrivate *) window)->drawable.width =
06162              event->configure.width;
06163          ((GdkWindowPrivate *) window)->drawable.height =
06164              event->configure.height;
06165 
06166          return_val = !GDK_DRAWABLE_DESTROYED(window);
06167       }
06168       break;
06169 
06170    case WM_GETMINMAXINFO:
06171       GDK_NOTE(EVENTS, g_print("WM_GETMINMAXINFO: %#x\n", xevent->hwnd));
06172 
06173       lpmmi = (MINMAXINFO *) xevent->lParam;
06174       if (GDK_WINDOW_WIN32DATA(window)->hint_flags & GDK_HINT_MIN_SIZE) {
06175          lpmmi->ptMinTrackSize.x =
06176              GDK_WINDOW_WIN32DATA(window)->hint_min_width;
06177          lpmmi->ptMinTrackSize.y =
06178              GDK_WINDOW_WIN32DATA(window)->hint_min_height;
06179       }
06180       if (GDK_WINDOW_WIN32DATA(window)->hint_flags & GDK_HINT_MAX_SIZE) {
06181          lpmmi->ptMaxTrackSize.x =
06182              GDK_WINDOW_WIN32DATA(window)->hint_max_width;
06183          lpmmi->ptMaxTrackSize.y =
06184              GDK_WINDOW_WIN32DATA(window)->hint_max_height;
06185 
06186          lpmmi->ptMaxSize.x = GDK_WINDOW_WIN32DATA(window)->hint_max_width;
06187          lpmmi->ptMaxSize.y =
06188              GDK_WINDOW_WIN32DATA(window)->hint_max_height;
06189       }
06190       break;
06191 
06192    case WM_MOVE:
06193       GDK_NOTE(EVENTS, g_print("WM_MOVE: %#x  (%d,%d)\n",
06194                                xevent->hwnd,
06195                                LOWORD(xevent->lParam),
06196                                HIWORD(xevent->lParam)));
06197 
06198       if (!(GDK_WINDOW_WIN32DATA(window)->event_mask & GDK_STRUCTURE_MASK))
06199          break;
06200 
06201       if (GDK_DRAWABLE_TYPE(window) != GDK_WINDOW_CHILD
06202           && !IsIconic(xevent->hwnd)
06203           && IsWindowVisible(xevent->hwnd)) {
06204          event->type = GDK_CONFIGURE;
06205          event->configure.type = GDK_CONFIGURE;
06206          event->configure.window = window;
06207          event->configure.x = LOWORD(xevent->lParam);
06208          event->configure.y = HIWORD(xevent->lParam);
06209          GetClientRect(xevent->hwnd, &rect);
06210          event->configure.width = rect.right;
06211          event->configure.height = rect.bottom;
06212          ((GdkWindowPrivate *) window)->x = event->configure.x;
06213          ((GdkWindowPrivate *) window)->y = event->configure.y;
06214          ((GdkWindowPrivate *) window)->drawable.width =
06215              event->configure.width;
06216          ((GdkWindowPrivate *) window)->drawable.height =
06217              event->configure.height;
06218 
06219          return_val = !GDK_DRAWABLE_DESTROYED(window);
06220       }
06221       break;
06222 
06223    case WM_CLOSE:
06224       GDK_NOTE(EVENTS, g_print("WM_CLOSE: %#x\n", xevent->hwnd));
06225 
06226       event->type = GDK_DELETE;
06227       event->any.type = GDK_DELETE;
06228       event->any.window = window;
06229 
06230       return_val = !GDK_DRAWABLE_DESTROYED(window);
06231       break;
06232 
06233 #if 0
06234       /* No, don't use delayed rendering after all. It works only if the
06235        * delayed SetClipboardData is called from the WindowProc, it
06236        * seems. (The #else part below is test code for that. It succeeds
06237        * in setting the clipboard data. But if I call SetClipboardData
06238        * in gdk_property_change (as a consequence of the
06239        * GDK_SELECTION_REQUEST event), it fails.  I deduce that this is
06240        * because delayed rendering requires that SetClipboardData is
06241        * called in the window procedure.)
06242        */
06243    case WM_RENDERFORMAT:
06244    case WM_RENDERALLFORMATS:
06245       flag = FALSE;
06246       GDK_NOTE(EVENTS, flag = TRUE);
06247       if (flag)
06248          g_print("WM_%s: %#x %#x (%s)\n",
06249                  (xevent->message == WM_RENDERFORMAT ? "RENDERFORMAT" :
06250                   "RENDERALLFORMATS"),
06251                  xevent->hwnd,
06252                  xevent->wParam,
06253                  (xevent->wParam == CF_TEXT ? "CF_TEXT" :
06254                   (xevent->wParam == CF_DIB ? "CF_DIB" :
06255                    (xevent->wParam == CF_UNICODETEXT ? "CF_UNICODETEXT" :
06256                     (GetClipboardFormatName
06257                      (xevent->wParam, buf, sizeof(buf)), buf)))));
06258 
06259 #if 0
06260       event->selection.type = GDK_SELECTION_REQUEST;
06261       event->selection.window = window;
06262       event->selection.selection = gdk_clipboard_atom;
06263       if (xevent->wParam == CF_TEXT)
06264          event->selection.target = GDK_TARGET_STRING;
06265       else {
06266          GetClipboardFormatName(xevent->wParam, buf, sizeof(buf));
06267          event->selection.target = gdk_atom_intern(buf, FALSE);
06268       }
06269       event->selection.property = gdk_selection_property;
06270       event->selection.requestor = (guint32) xevent->hwnd;
06271       event->selection.time = xevent->time;
06272       return_val = !GDK_DRAWABLE_DESTROYED(window);
06273 #else
06274       /* Test code, to see if SetClipboardData works when called from
06275        * the window procedure.
06276        */
06277       {
06278          HGLOBAL hdata = GlobalAlloc(GMEM_MOVEABLE | GMEM_DDESHARE, 10);
06279          char *ptr = GlobalLock(hdata);
06280          strcpy(ptr, "Huhhaa");
06281          GlobalUnlock(hdata);
06282          if (!SetClipboardData(CF_TEXT, hdata))
06283             WIN32_API_FAILED("SetClipboardData");
06284       }
06285       *ret_valp = 0;
06286       *ret_val_flagp = TRUE;
06287       return_val = FALSE;
06288 #endif
06289       break;
06290 #endif                          /* No delayed rendering */
06291 
06292    case WM_DROPFILES:
06293       {
06294          DWORD i, len;
06295          char tmp[256];
06296          char uri[256];
06297          HDROP hDrop;
06298          HGLOBAL hdata;
06299          char *ptr;
06300          POINT pt;
06301          GdkAtom *types;
06302          GdkEvent *event0, *event1, *event2;
06303 
06304          hDrop = (HDROP)xevent->wParam;
06305          types = calloc(sizeof(GdkAtom), 3);
06306          types[0] = gdk_atom_intern("text/uri-list", FALSE);
06307          types[1] = types[2] = 0;
06308          event0 = gdk_event_new();
06309          event0->type = GDK_CLIENT_EVENT;
06310          event0->any.window = window;
06311          event0->client.type = GDK_CLIENT_EVENT;
06312          event0->client.window = window;
06313          event0->client.message_type = gdk_atom_intern("XdndEnter", TRUE);
06314          event0->client.data_format = 0;
06315          event0->client.data.l[0] = (long)window;
06316          event0->client.data.l[1] = 0;
06317          event0->client.data.l[2] = (long)*types;
06318          event0->client.data.l[3] = 0;
06319          event0->client.data.l[4] = 0;
06320          gdk_window_ref(window);
06321          gdk_event_queue_append(event0);
06322 
06323          DragQueryPoint(hDrop, &pt);
06324          MapWindowPoints(xevent->hwnd, NULL, &pt, 1);
06325          event1 = gdk_event_new();
06326          event1->any.window = window;
06327          event1->type = GDK_CLIENT_EVENT;
06328          event1->client.type = GDK_CLIENT_EVENT;
06329          event1->client.window = window;
06330          event1->client.message_type = gdk_atom_intern("XdndPosition", TRUE);
06331          event1->client.data_format = 0;
06332          event1->client.data.l[0] = (long)window;
06333          event1->client.data.l[1] = 0;
06334          event1->client.data.l[2] = (long)(pt.y | (pt.x << 16));
06335          event1->client.data.l[3] = 0; // time
06336          event1->client.data.l[4] = 0; // action
06337          gdk_window_ref(window);
06338          gdk_event_queue_append(event1);
06339 
06340          event2 = gdk_event_new();
06341          event2->any.window = window;
06342          event2->type = GDK_CLIENT_EVENT;
06343          event2->client.type = GDK_CLIENT_EVENT;
06344          event2->client.window = window;
06345          event2->client.message_type = gdk_atom_intern("XdndDrop", TRUE);
06346          event2->client.data_format = 0;
06347          event2->client.data.l[0] = 0;
06348          if (OpenClipboard(xevent->hwnd)) {
06349             DragQueryFile(hDrop, 0, tmp, 256);
06350             sprintf(uri, "file://%s\r\n", tmp);
06351             len = strlen(uri);
06352              // Do anything with the data...
06353             hdata = GlobalAlloc(GMEM_MOVEABLE | GMEM_DDESHARE, len+1);
06354             ptr = (char *)GlobalLock(hdata);
06355             for (i = 0; i < len; i++) {
06356                ptr[i] = uri[i];
06357             }
06358             ptr[len] = '\0';
06359             GlobalUnlock(hdata);
06360             SetClipboardData(CF_PRIVATEFIRST, hdata);
06361             CloseClipboard();
06362          }
06363          DragFinish(hDrop);
06364          gdk_window_ref(window);
06365          gdk_event_queue_append(event2);
06366          return_val = FALSE;
06367       }
06368       break;
06369 
06370    case WM_DESTROY:
06371       GDK_NOTE(EVENTS, g_print("WM_DESTROY: %#x\n", xevent->hwnd));
06372 
06373       event->type = GDK_DESTROY;
06374       event->any.type = GDK_DESTROY;
06375       event->any.window = window;
06376       if (window != NULL && window == curWnd) {
06377          gdk_window_unref(curWnd);
06378          curWnd = NULL;
06379       }
06380 
06381       if (p_grab_window == window)
06382          gdk_pointer_ungrab(xevent->time);
06383 
06384       if (k_grab_window == window)
06385          gdk_keyboard_ungrab(xevent->time);
06386 
06387       return_val = 1;           //window != NULL && !GDK_DRAWABLE_DESTROYED (window); // bb change
06388 
06389       if (window != NULL)
06390          gdk_window_destroy_notify(window);
06391 
06392       break;
06393 
06394 #ifdef HAVE_WINTAB
06395       /* Handle WINTAB events here, as we know that gdkinput.c will
06396        * use the fixed WT_DEFBASE as lcMsgBase, and we thus can use the
06397        * constants as case labels.
06398        */
06399    case WT_PACKET:
06400       GDK_NOTE(EVENTS, g_print("WT_PACKET: %#x %d %#x\n",
06401                                xevent->hwnd,
06402                                xevent->wParam, xevent->lParam));
06403       goto wintab;
06404 
06405    case WT_CSRCHANGE:
06406       GDK_NOTE(EVENTS, g_print("WT_CSRCHANGE: %#x %d %#x\n",
06407                                xevent->hwnd,
06408                                xevent->wParam, xevent->lParam));
06409       goto wintab;
06410 
06411    case WT_PROXIMITY:
06412       GDK_NOTE(EVENTS, g_print("WT_PROXIMITY: %#x %#x %d %d\n",
06413                                xevent->hwnd, xevent->wParam,
06414                                LOWORD(xevent->lParam),
06415                                HIWORD(xevent->lParam)));
06416       /* Fall through */
06417     wintab:
06418       event->any.window = window;
06419       return_val = gdk_input_vtable.other_event(event, xevent);
06420       break;
06421 #endif
06422 
06423    default:
06424       GDK_NOTE(EVENTS, g_print("%s: %#x %#x %#x\n",
06425                                gdk_win32_message_name(xevent->message),
06426                                xevent->hwnd,
06427                                xevent->wParam, xevent->lParam));
06428    }
06429 
06430  bypass_switch:
06431 
06432    if (return_val) {
06433       if (event->any.window)
06434          gdk_window_ref(event->any.window);
06435       if (((event->any.type == GDK_ENTER_NOTIFY) ||
06436            (event->any.type == GDK_LEAVE_NOTIFY)) &&
06437           (event->crossing.subwindow != NULL))
06438          gdk_window_ref(event->crossing.subwindow);
06439 
06440       GDK_NOTE(EVENTS, print_event(event));
06441    } else {
06442       /* Mark this event as having no resources to be freed */
06443       event->any.window = NULL;
06444       event->any.type = GDK_NOTHING;
06445       event->type = GDK_NOTHING;
06446    }
06447 
06448    if (window)
06449       gdk_window_unref(window);
06450 
06451    return return_val;
06452 }
06453 
06454 void gdk_events_queue(void)
06455 {
06456    GList *node;
06457    GdkEvent *event;
06458    MSG msg;
06459    LRESULT lres;
06460 
06461    while (!gdk_event_queue_find_first()
06462           && PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) {
06463       GDK_NOTE(EVENTS, g_print("PeekMessage: %#x %#x\n",
06464                                msg.hwnd,
06465                                gdk_win32_message_name(msg.message)));
06466 
06467       if (paimmmpo == NULL
06468           || (paimmmpo->lpVtbl->OnTranslateMessage) (paimmmpo,
06469                                                      &msg) != S_OK)
06470          TranslateMessage(&msg);
06471 
06472       DispatchMessage(&msg);
06473    }
06474 }
06475 
06476 static gboolean gdk_event_prepare(GSource * source, gint * timeout)
06477 {
06478    MSG msg;
06479    gboolean retval;
06480 
06481    GDK_THREADS_ENTER();
06482 
06483    *timeout = -1;
06484 
06485    retval = (gdk_event_queue_find_first() != NULL)
06486        || PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE);
06487 
06488    GDK_THREADS_LEAVE();
06489 
06490    return retval;
06491 }
06492 
06493 static gboolean gdk_event_check(GSource * source)
06494 {
06495    MSG msg;
06496    gboolean retval;
06497 
06498    GDK_THREADS_ENTER();
06499 
06500    if (event_poll_fd.revents & G_IO_IN)
06501       retval = (gdk_event_queue_find_first() != NULL)
06502           || PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE);
06503    else
06504       retval = FALSE;
06505 
06506    GDK_THREADS_LEAVE();
06507 
06508    return retval;
06509 }
06510 
06511 static gboolean
06512 gdk_event_dispatch(GSource * source,
06513                    GSourceFunc callback, gpointer user_data)
06514 {
06515    GdkEvent *event;
06516 
06517    GDK_THREADS_ENTER();
06518 
06519    gdk_events_queue();
06520    event = gdk_event_unqueue();
06521 
06522    if (event) {
06523       if (gdk_event_func)
06524          (*gdk_event_func) (event, gdk_event_data);
06525 
06526       gdk_event_free(event);
06527    }
06528 
06529    GDK_THREADS_LEAVE();
06530 
06531    return TRUE;
06532 }
06533 
06534 /* Sends a ClientMessage to all toplevel client windows */
06535 gboolean gdk_event_send_client_message(GdkEvent * event, guint32 xid)
06536 {
06537    /* XXX */
06538    return FALSE;
06539 }
06540 
06541 void gdk_event_send_clientmessage_toall(GdkEvent * event)
06542 {
06543    /* XXX */
06544 }
06545 
06546 void gdk_flush(void)
06547 {
06548    GdiFlush();
06549 }
06550 
06551 #ifdef G_ENABLE_DEBUG
06552 
06553 gchar *gdk_win32_message_name(UINT msg)
06554 {
06555    static gchar bfr[100];
06556 
06557    switch (msg) {
06558 #define CASE(x) case x: return #x
06559       CASE(WM_NULL);
06560       CASE(WM_CREATE);
06561       CASE(WM_DESTROY);
06562       CASE(WM_MOVE);
06563       CASE(WM_SIZE);
06564       CASE(WM_ACTIVATE);
06565       CASE(WM_SETFOCUS);
06566       CASE(WM_KILLFOCUS);
06567       CASE(WM_ENABLE);
06568       CASE(WM_SETREDRAW);
06569       CASE(WM_SETTEXT);
06570       CASE(WM_GETTEXT);
06571       CASE(WM_GETTEXTLENGTH);
06572       CASE(WM_PAINT);
06573       CASE(WM_CLOSE);
06574       CASE(WM_QUERYENDSESSION);
06575       CASE(WM_QUERYOPEN);
06576       CASE(WM_ENDSESSION);
06577       CASE(WM_QUIT);
06578       CASE(WM_ERASEBKGND);
06579       CASE(WM_SYSCOLORCHANGE);
06580       CASE(WM_SHOWWINDOW);
06581       CASE(WM_WININICHANGE);
06582       CASE(WM_DEVMODECHANGE);
06583       CASE(WM_ACTIVATEAPP);
06584       CASE(WM_FONTCHANGE);
06585       CASE(WM_TIMECHANGE);
06586       CASE(WM_CANCELMODE);
06587       CASE(WM_SETCURSOR);
06588       CASE(WM_MOUSEACTIVATE);
06589       CASE(WM_CHILDACTIVATE);
06590       CASE(WM_QUEUESYNC);
06591       CASE(WM_GETMINMAXINFO);
06592       CASE(WM_PAINTICON);
06593       CASE(WM_ICONERASEBKGND);
06594       CASE(WM_NEXTDLGCTL);
06595       CASE(WM_SPOOLERSTATUS);
06596       CASE(WM_DRAWITEM);
06597       CASE(WM_MEASUREITEM);
06598       CASE(WM_DELETEITEM);
06599       CASE(WM_VKEYTOITEM);
06600       CASE(WM_CHARTOITEM);
06601       CASE(WM_SETFONT);
06602       CASE(WM_GETFONT);
06603       CASE(WM_SETHOTKEY);
06604       CASE(WM_GETHOTKEY);
06605       CASE(WM_QUERYDRAGICON);
06606       CASE(WM_COMPAREITEM);
06607       CASE(WM_GETOBJECT);
06608       CASE(WM_COMPACTING);
06609       CASE(WM_WINDOWPOSCHANGING);
06610       CASE(WM_WINDOWPOSCHANGED);
06611       CASE(WM_POWER);
06612       CASE(WM_COPYDATA);
06613       CASE(WM_CANCELJOURNAL);
06614       CASE(WM_NOTIFY);
06615       CASE(WM_INPUTLANGCHANGEREQUEST);
06616       CASE(WM_INPUTLANGCHANGE);
06617       CASE(WM_TCARD);
06618       CASE(WM_HELP);
06619       CASE(WM_USERCHANGED);
06620       CASE(WM_NOTIFYFORMAT);
06621       CASE(WM_CONTEXTMENU);
06622       CASE(WM_STYLECHANGING);
06623       CASE(WM_STYLECHANGED);
06624       CASE(WM_DISPLAYCHANGE);
06625       CASE(WM_GETICON);
06626       CASE(WM_SETICON);
06627       CASE(WM_NCCREATE);
06628       CASE(WM_NCDESTROY);
06629       CASE(WM_NCCALCSIZE);
06630       CASE(WM_NCHITTEST);
06631       CASE(WM_NCPAINT);
06632       CASE(WM_NCACTIVATE);
06633       CASE(WM_GETDLGCODE);
06634       CASE(WM_SYNCPAINT);
06635       CASE(WM_NCMOUSEMOVE);
06636       CASE(WM_NCLBUTTONDOWN);
06637       CASE(WM_NCLBUTTONUP);
06638       CASE(WM_NCLBUTTONDBLCLK);
06639       CASE(WM_NCRBUTTONDOWN);
06640       CASE(WM_NCRBUTTONUP);
06641       CASE(WM_NCRBUTTONDBLCLK);
06642       CASE(WM_NCMBUTTONDOWN);
06643       CASE(WM_NCMBUTTONUP);
06644       CASE(WM_NCMBUTTONDBLCLK);
06645       CASE(WM_NCXBUTTONDOWN);
06646       CASE(WM_NCXBUTTONUP);
06647       CASE(WM_NCXBUTTONDBLCLK);
06648       CASE(WM_KEYDOWN);
06649       CASE(WM_KEYUP);
06650       CASE(WM_CHAR);
06651       CASE(WM_DEADCHAR);
06652       CASE(WM_SYSKEYDOWN);
06653       CASE(WM_SYSKEYUP);
06654       CASE(WM_SYSCHAR);
06655       CASE(WM_SYSDEADCHAR);
06656       CASE(WM_KEYLAST);
06657       CASE(WM_IME_STARTCOMPOSITION);
06658       CASE(WM_IME_ENDCOMPOSITION);
06659       CASE(WM_IME_COMPOSITION);
06660       CASE(WM_INITDIALOG);
06661       CASE(WM_COMMAND);
06662       CASE(WM_SYSCOMMAND);
06663       CASE(WM_TIMER);
06664       CASE(WM_HSCROLL);
06665       CASE(WM_VSCROLL);
06666       CASE(WM_INITMENU);
06667       CASE(WM_INITMENUPOPUP);
06668       CASE(WM_MENUSELECT);
06669       CASE(WM_MENUCHAR);
06670       CASE(WM_ENTERIDLE);
06671       CASE(WM_MENURBUTTONUP);
06672       CASE(WM_MENUDRAG);
06673       CASE(WM_MENUGETOBJECT);
06674       CASE(WM_UNINITMENUPOPUP);
06675       CASE(WM_MENUCOMMAND);
06676       CASE(WM_CHANGEUISTATE);
06677       CASE(WM_UPDATEUISTATE);
06678       CASE(WM_QUERYUISTATE);
06679       CASE(WM_CTLCOLORMSGBOX);
06680       CASE(WM_CTLCOLOREDIT);
06681       CASE(WM_CTLCOLORLISTBOX);
06682       CASE(WM_CTLCOLORBTN);
06683       CASE(WM_CTLCOLORDLG);
06684       CASE(WM_CTLCOLORSCROLLBAR);
06685       CASE(WM_CTLCOLORSTATIC);
06686       CASE(WM_MOUSEMOVE);
06687       CASE(WM_LBUTTONDOWN);
06688       CASE(WM_LBUTTONUP);
06689       CASE(WM_LBUTTONDBLCLK);
06690       CASE(WM_RBUTTONDOWN);
06691       CASE(WM_RBUTTONUP);
06692       CASE(WM_RBUTTONDBLCLK);
06693       CASE(WM_MBUTTONDOWN);
06694       CASE(WM_MBUTTONUP);
06695       CASE(WM_MBUTTONDBLCLK);
06696       CASE(WM_MOUSEWHEEL);
06697       CASE(WM_XBUTTONDOWN);
06698       CASE(WM_XBUTTONUP);
06699       CASE(WM_XBUTTONDBLCLK);
06700       CASE(WM_PARENTNOTIFY);
06701       CASE(WM_ENTERMENULOOP);
06702       CASE(WM_EXITMENULOOP);
06703       CASE(WM_NEXTMENU);
06704       CASE(WM_SIZING);
06705       CASE(WM_CAPTURECHANGED);
06706       CASE(WM_MOVING);
06707       CASE(WM_POWERBROADCAST);
06708       CASE(WM_DEVICECHANGE);
06709       CASE(WM_MDICREATE);
06710       CASE(WM_MDIDESTROY);
06711       CASE(WM_MDIACTIVATE);
06712       CASE(WM_MDIRESTORE);
06713       CASE(WM_MDINEXT);
06714       CASE(WM_MDIMAXIMIZE);
06715       CASE(WM_MDITILE);
06716       CASE(WM_MDICASCADE);
06717       CASE(WM_MDIICONARRANGE);
06718       CASE(WM_MDIGETACTIVE);
06719       CASE(WM_MDISETMENU);
06720       CASE(WM_ENTERSIZEMOVE);
06721       CASE(WM_EXITSIZEMOVE);
06722       CASE(WM_DROPFILES);
06723       CASE(WM_MDIREFRESHMENU);
06724       CASE(WM_IME_SETCONTEXT);
06725       CASE(WM_IME_NOTIFY);
06726       CASE(WM_IME_CONTROL);
06727       CASE(WM_IME_COMPOSITIONFULL);
06728       CASE(WM_IME_SELECT);
06729       CASE(WM_IME_CHAR);
06730       CASE(WM_IME_REQUEST);
06731       CASE(WM_IME_KEYDOWN);
06732       CASE(WM_IME_KEYUP);
06733       CASE(WM_MOUSEHOVER);
06734       CASE(WM_MOUSELEAVE);
06735       CASE(WM_NCMOUSEHOVER);
06736       CASE(WM_NCMOUSELEAVE);
06737       CASE(WM_CUT);
06738       CASE(WM_COPY);
06739       CASE(WM_PASTE);
06740       CASE(WM_CLEAR);
06741       CASE(WM_UNDO);
06742       CASE(WM_RENDERFORMAT);
06743       CASE(WM_RENDERALLFORMATS);
06744       CASE(WM_DESTROYCLIPBOARD);
06745       CASE(WM_DRAWCLIPBOARD);
06746       CASE(WM_PAINTCLIPBOARD);
06747       CASE(WM_VSCROLLCLIPBOARD);
06748       CASE(WM_SIZECLIPBOARD);
06749       CASE(WM_ASKCBFORMATNAME);
06750       CASE(WM_CHANGECBCHAIN);
06751       CASE(WM_HSCROLLCLIPBOARD);
06752       CASE(WM_QUERYNEWPALETTE);
06753       CASE(WM_PALETTEISCHANGING);
06754       CASE(WM_PALETTECHANGED);
06755       CASE(WM_HOTKEY);
06756       CASE(WM_PRINT);
06757       CASE(WM_PRINTCLIENT);
06758       CASE(WM_APPCOMMAND);
06759       CASE(WM_HANDHELDFIRST);
06760       CASE(WM_HANDHELDLAST);
06761       CASE(WM_AFXFIRST);
06762       CASE(WM_AFXLAST);
06763       CASE(WM_PENWINFIRST);
06764       CASE(WM_PENWINLAST);
06765       CASE(WM_APP);
06766 #undef CASE
06767    default:
06768       if (msg >= WM_HANDHELDFIRST && msg <= WM_HANDHELDLAST)
06769          sprintf(bfr, "WM_HANDHELDFIRST+%d", msg - WM_HANDHELDFIRST);
06770       else if (msg >= WM_AFXFIRST && msg <= WM_AFXLAST)
06771          sprintf(bfr, "WM_AFXFIRST+%d", msg - WM_AFXFIRST);
06772       else if (msg >= WM_PENWINFIRST && msg <= WM_PENWINLAST)
06773          sprintf(bfr, "WM_PENWINFIRST+%d", msg - WM_PENWINFIRST);
06774       else if (msg >= WM_USER && msg <= 0x7FFF)
06775          sprintf(bfr, "WM_USER+%d", msg - WM_USER);
06776       else if (msg >= 0xC000 && msg <= 0xFFFF)
06777          sprintf(bfr, "reg-%#x", msg);
06778       else
06779          sprintf(bfr, "unk-%#x", msg);
06780       return bfr;
06781    }
06782    g_assert_not_reached();
06783 }
06784 
06785 #endif                          /* G_ENABLE_DEBUG */

Generated on Tue Jul 5 14:14:39 2011 for ROOT_528-00b_version by  doxygen 1.5.1