00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #include "config.h"
00029
00030
00031
00032
00033
00034
00035
00036
00037
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
00070
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
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
00106
00107
00108 static GdkWindow *p_grab_window = NULL;
00109
00110
00111
00112 static GdkWindow *k_grab_window = NULL;
00113
00114
00115
00116 static GList *client_filters;
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;
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;
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
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
00193 PostMessage(NULL, gdk_ping_msg, 0, 0);
00194 return FALSE;
00195 }
00196 } else if (event.event.any.type == GDK_EXPOSE) {
00197
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
00215
00216 PostMessage(NULL, gdk_ping_msg, 0, 0);
00217
00218 return FALSE;
00219 }
00220 }
00221 #endif
00222 eventp = gdk_event_new();
00223 *((GdkEventPrivate *) eventp) = event;
00224
00225
00226
00227
00228
00229
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
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
00293
00294
00295
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
00342
00343
00344
00345
00346 use_IME_COMPOSITION = TRUE;
00347 }
00348 }
00349
00350
00351
00352
00353
00354
00355
00356
00357
00358
00359
00360
00361
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
00377
00378
00379
00380
00381
00382
00383
00384
00385
00386
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
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
00455
00456
00457
00458
00459
00460
00461
00462
00463
00464
00465
00466
00467
00468
00469
00470
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
00544
00545
00546
00547
00548
00549
00550
00551
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
00577
00578
00579
00580
00581
00582
00583
00584
00585
00586
00587
00588
00589 gint gdk_pointer_is_grabbed(void)
00590 {
00591 return p_grab_window != NULL;
00592 }
00593
00594
00595
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
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;
00628 GDK_WINDOW_WIN32DATA(window)->grab_event_mask = 0;
00629 }
00630
00631
00632 typedef struct {
00633 gint key;
00634 gint mod;
00635 } _Gdk_key_mod;
00636
00637
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
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
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
00724
00725
00726
00727
00728
00729
00730
00731
00732
00733
00734
00735
00736
00737
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
00814
00815
00816
00817
00818
00819
00820
00821
00822
00823
00824
00825
00826
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
00857
00858
00859
00860
00861
00862
00863
00864
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
00942
00943
00944
00945 #if 0
00946
00947 struct k2u {
00948 unsigned short keysym;
00949 unsigned short ucs;
00950 } k2utab[] = {
00951 {
00952 0x01a1, 0x0104},
00953 {
00954 0x01a2, 0x02d8},
00955 {
00956 0x01a3, 0x0141},
00957 {
00958 0x01a5, 0x013d},
00959 {
00960 0x01a6, 0x015a},
00961 {
00962 0x01a9, 0x0160},
00963 {
00964 0x01aa, 0x015e},
00965 {
00966 0x01ab, 0x0164},
00967 {
00968 0x01ac, 0x0179},
00969 {
00970 0x01ae, 0x017d},
00971 {
00972 0x01af, 0x017b},
00973 {
00974 0x01b1, 0x0105},
00975 {
00976 0x01b2, 0x02db},
00977 {
00978 0x01b3, 0x0142},
00979 {
00980 0x01b5, 0x013e},
00981 {
00982 0x01b6, 0x015b},
00983 {
00984 0x01b7, 0x02c7},
00985 {
00986 0x01b9, 0x0161},
00987 {
00988 0x01ba, 0x015f},
00989 {
00990 0x01bb, 0x0165},
00991 {
00992 0x01bc, 0x017a},
00993 {
00994 0x01bd, 0x02dd},
00995 {
00996 0x01be, 0x017e},
00997 {
00998 0x01bf, 0x017c},
00999 {
01000 0x01c0, 0x0154},
01001 {
01002 0x01c3, 0x0102},
01003 {
01004 0x01c5, 0x0139},
01005 {
01006 0x01c6, 0x0106},
01007 {
01008 0x01c8, 0x010c},
01009 {
01010 0x01ca, 0x0118},
01011 {
01012 0x01cc, 0x011a},
01013 {
01014 0x01cf, 0x010e},
01015 {
01016 0x01d0, 0x0110},
01017 {
01018 0x01d1, 0x0143},
01019 {
01020 0x01d2, 0x0147},
01021 {
01022 0x01d5, 0x0150},
01023 {
01024 0x01d8, 0x0158},
01025 {
01026 0x01d9, 0x016e},
01027 {
01028 0x01db, 0x0170},
01029 {
01030 0x01de, 0x0162},
01031 {
01032 0x01e0, 0x0155},
01033 {
01034 0x01e3, 0x0103},
01035 {
01036 0x01e5, 0x013a},
01037 {
01038 0x01e6, 0x0107},
01039 {
01040 0x01e8, 0x010d},
01041 {
01042 0x01ea, 0x0119},
01043 {
01044 0x01ec, 0x011b},
01045 {
01046 0x01ef, 0x010f},
01047 {
01048 0x01f0, 0x0111},
01049 {
01050 0x01f1, 0x0144},
01051 {
01052 0x01f2, 0x0148},
01053 {
01054 0x01f5, 0x0151},
01055 {
01056 0x01f8, 0x0159},
01057 {
01058 0x01f9, 0x016f},
01059 {
01060 0x01fb, 0x0171},
01061 {
01062 0x01fe, 0x0163},
01063 {
01064 0x01ff, 0x02d9},
01065 {
01066 0x02a1, 0x0126},
01067 {
01068 0x02a6, 0x0124},
01069 {
01070 0x02a9, 0x0130},
01071 {
01072 0x02ab, 0x011e},
01073 {
01074 0x02ac, 0x0134},
01075 {
01076 0x02b1, 0x0127},
01077 {
01078 0x02b6, 0x0125},
01079 {
01080 0x02b9, 0x0131},
01081 {
01082 0x02bb, 0x011f},
01083 {
01084 0x02bc, 0x0135},
01085 {
01086 0x02c5, 0x010a},
01087 {
01088 0x02c6, 0x0108},
01089 {
01090 0x02d5, 0x0120},
01091 {
01092 0x02d8, 0x011c},
01093 {
01094 0x02dd, 0x016c},
01095 {
01096 0x02de, 0x015c},
01097 {
01098 0x02e5, 0x010b},
01099 {
01100 0x02e6, 0x0109},
01101 {
01102 0x02f5, 0x0121},
01103 {
01104 0x02f8, 0x011d},
01105 {
01106 0x02fd, 0x016d},
01107 {
01108 0x02fe, 0x015d},
01109 {
01110 0x03a2, 0x0138},
01111 {
01112 0x03a3, 0x0156},
01113 {
01114 0x03a5, 0x0128},
01115 {
01116 0x03a6, 0x013b},
01117 {
01118 0x03aa, 0x0112},
01119 {
01120 0x03ab, 0x0122},
01121 {
01122 0x03ac, 0x0166},
01123 {
01124 0x03b3, 0x0157},
01125 {
01126 0x03b5, 0x0129},
01127 {
01128 0x03b6, 0x013c},
01129 {
01130 0x03ba, 0x0113},
01131 {
01132 0x03bb, 0x0123},
01133 {
01134 0x03bc, 0x0167},
01135 {
01136 0x03bd, 0x014a},
01137 {
01138 0x03bf, 0x014b},
01139 {
01140 0x03c0, 0x0100},
01141 {
01142 0x03c7, 0x012e},
01143 {
01144 0x03cc, 0x0116},
01145 {
01146 0x03cf, 0x012a},
01147 {
01148 0x03d1, 0x0145},
01149 {
01150 0x03d2, 0x014c},
01151 {
01152 0x03d3, 0x0136},
01153 {
01154 0x03d9, 0x0172},
01155 {
01156 0x03dd, 0x0168},
01157 {
01158 0x03de, 0x016a},
01159 {
01160 0x03e0, 0x0101},
01161 {
01162 0x03e7, 0x012f},
01163 {
01164 0x03ec, 0x0117},
01165 {
01166 0x03ef, 0x012b},
01167 {
01168 0x03f1, 0x0146},
01169 {
01170 0x03f2, 0x014d},
01171 {
01172 0x03f3, 0x0137},
01173 {
01174 0x03f9, 0x0173},
01175 {
01176 0x03fd, 0x0169},
01177 {
01178 0x03fe, 0x016b},
01179 {
01180 0x047e, 0x203e},
01181 {
01182 0x04a1, 0x3002},
01183 {
01184 0x04a2, 0x300c},
01185 {
01186 0x04a3, 0x300d},
01187 {
01188 0x04a4, 0x3001},
01189 {
01190 0x04a5, 0x30fb},
01191 {
01192 0x04a6, 0x30f2},
01193 {
01194 0x04a7, 0x30a1},
01195 {
01196 0x04a8, 0x30a3},
01197 {
01198 0x04a9, 0x30a5},
01199 {
01200 0x04aa, 0x30a7},
01201 {
01202 0x04ab, 0x30a9},
01203 {
01204 0x04ac, 0x30e3},
01205 {
01206 0x04ad, 0x30e5},
01207 {
01208 0x04ae, 0x30e7},
01209 {
01210 0x04af, 0x30c3},
01211 {
01212 0x04b0, 0x30fc},
01213 {
01214 0x04b1, 0x30a2},
01215 {
01216 0x04b2, 0x30a4},
01217 {
01218 0x04b3, 0x30a6},
01219 {
01220 0x04b4, 0x30a8},
01221 {
01222 0x04b5, 0x30aa},
01223 {
01224 0x04b6, 0x30ab},
01225 {
01226 0x04b7, 0x30ad},
01227 {
01228 0x04b8, 0x30af},
01229 {
01230 0x04b9, 0x30b1},
01231 {
01232 0x04ba, 0x30b3},
01233 {
01234 0x04bb, 0x30b5},
01235 {
01236 0x04bc, 0x30b7},
01237 {
01238 0x04bd, 0x30b9},
01239 {
01240 0x04be, 0x30bb},
01241 {
01242 0x04bf, 0x30bd},
01243 {
01244 0x04c0, 0x30bf},
01245 {
01246 0x04c1, 0x30c1},
01247 {
01248 0x04c2, 0x30c4},
01249 {
01250 0x04c3, 0x30c6},
01251 {
01252 0x04c4, 0x30c8},
01253 {
01254 0x04c5, 0x30ca},
01255 {
01256 0x04c6, 0x30cb},
01257 {
01258 0x04c7, 0x30cc},
01259 {
01260 0x04c8, 0x30cd},
01261 {
01262 0x04c9, 0x30ce},
01263 {
01264 0x04ca, 0x30cf},
01265 {
01266 0x04cb, 0x30d2},
01267 {
01268 0x04cc, 0x30d5},
01269 {
01270 0x04cd, 0x30d8},
01271 {
01272 0x04ce, 0x30db},
01273 {
01274 0x04cf, 0x30de},
01275 {
01276 0x04d0, 0x30df},
01277 {
01278 0x04d1, 0x30e0},
01279 {
01280 0x04d2, 0x30e1},
01281 {
01282 0x04d3, 0x30e2},
01283 {
01284 0x04d4, 0x30e4},
01285 {
01286 0x04d5, 0x30e6},
01287 {
01288 0x04d6, 0x30e8},
01289 {
01290 0x04d7, 0x30e9},
01291 {
01292 0x04d8, 0x30ea},
01293 {
01294 0x04d9, 0x30eb},
01295 {
01296 0x04da, 0x30ec},
01297 {
01298 0x04db, 0x30ed},
01299 {
01300 0x04dc, 0x30ef},
01301 {
01302 0x04dd, 0x30f3},
01303 {
01304 0x04de, 0x309b},
01305 {
01306 0x04df, 0x309c},
01307 {
01308 0x05ac, 0x060c},
01309 {
01310 0x05bb, 0x061b},
01311 {
01312 0x05bf, 0x061f},
01313 {
01314 0x05c1, 0x0621},
01315 {
01316 0x05c2, 0x0622},
01317 {
01318 0x05c3, 0x0623},
01319 {
01320 0x05c4, 0x0624},
01321 {
01322 0x05c5, 0x0625},
01323 {
01324 0x05c6, 0x0626},
01325 {
01326 0x05c7, 0x0627},
01327 {
01328 0x05c8, 0x0628},
01329 {
01330 0x05c9, 0x0629},
01331 {
01332 0x05ca, 0x062a},
01333 {
01334 0x05cb, 0x062b},
01335 {
01336 0x05cc, 0x062c},
01337 {
01338 0x05cd, 0x062d},
01339 {
01340 0x05ce, 0x062e},
01341 {
01342 0x05cf, 0x062f},
01343 {
01344 0x05d0, 0x0630},
01345 {
01346 0x05d1, 0x0631},
01347 {
01348 0x05d2, 0x0632},
01349 {
01350 0x05d3, 0x0633},
01351 {
01352 0x05d4, 0x0634},
01353 {
01354 0x05d5, 0x0635},
01355 {
01356 0x05d6, 0x0636},
01357 {
01358 0x05d7, 0x0637},
01359 {
01360 0x05d8, 0x0638},
01361 {
01362 0x05d9, 0x0639},
01363 {
01364 0x05da, 0x063a},
01365 {
01366 0x05e0, 0x0640},
01367 {
01368 0x05e1, 0x0641},
01369 {
01370 0x05e2, 0x0642},
01371 {
01372 0x05e3, 0x0643},
01373 {
01374 0x05e4, 0x0644},
01375 {
01376 0x05e5, 0x0645},
01377 {
01378 0x05e6, 0x0646},
01379 {
01380 0x05e7, 0x0647},
01381 {
01382 0x05e8, 0x0648},
01383 {
01384 0x05e9, 0x0649},
01385 {
01386 0x05ea, 0x064a},
01387 {
01388 0x05eb, 0x064b},
01389 {
01390 0x05ec, 0x064c},
01391 {
01392 0x05ed, 0x064d},
01393 {
01394 0x05ee, 0x064e},
01395 {
01396 0x05ef, 0x064f},
01397 {
01398 0x05f0, 0x0650},
01399 {
01400 0x05f1, 0x0651},
01401 {
01402 0x05f2, 0x0652},
01403 {
01404 0x06a1, 0x0452},
01405 {
01406 0x06a2, 0x0453},
01407 {
01408 0x06a3, 0x0451},
01409 {
01410 0x06a4, 0x0454},
01411 {
01412 0x06a5, 0x0455},
01413 {
01414 0x06a6, 0x0456},
01415 {
01416 0x06a7, 0x0457},
01417 {
01418 0x06a8, 0x0458},
01419 {
01420 0x06a9, 0x0459},
01421 {
01422 0x06aa, 0x045a},
01423 {
01424 0x06ab, 0x045b},
01425 {
01426 0x06ac, 0x045c},
01427 {
01428 0x06ae, 0x045e},
01429 {
01430 0x06af, 0x045f},
01431 {
01432 0x06b0, 0x2116},
01433 {
01434 0x06b1, 0x0402},
01435 {
01436 0x06b2, 0x0403},
01437 {
01438 0x06b3, 0x0401},
01439 {
01440 0x06b4, 0x0404},
01441 {
01442 0x06b5, 0x0405},
01443 {
01444 0x06b6, 0x0406},
01445 {
01446 0x06b7, 0x0407},
01447 {
01448 0x06b8, 0x0408},
01449 {
01450 0x06b9, 0x0409},
01451 {
01452 0x06ba, 0x040a},
01453 {
01454 0x06bb, 0x040b},
01455 {
01456 0x06bc, 0x040c},
01457 {
01458 0x06be, 0x040e},
01459 {
01460 0x06bf, 0x040f},
01461 {
01462 0x06c0, 0x044e},
01463 {
01464 0x06c1, 0x0430},
01465 {
01466 0x06c2, 0x0431},
01467 {
01468 0x06c3, 0x0446},
01469 {
01470 0x06c4, 0x0434},
01471 {
01472 0x06c5, 0x0435},
01473 {
01474 0x06c6, 0x0444},
01475 {
01476 0x06c7, 0x0433},
01477 {
01478 0x06c8, 0x0445},
01479 {
01480 0x06c9, 0x0438},
01481 {
01482 0x06ca, 0x0439},
01483 {
01484 0x06cb, 0x043a},
01485 {
01486 0x06cc, 0x043b},
01487 {
01488 0x06cd, 0x043c},
01489 {
01490 0x06ce, 0x043d},
01491 {
01492 0x06cf, 0x043e},
01493 {
01494 0x06d0, 0x043f},
01495 {
01496 0x06d1, 0x044f},
01497 {
01498 0x06d2, 0x0440},
01499 {
01500 0x06d3, 0x0441},
01501 {
01502 0x06d4, 0x0442},
01503 {
01504 0x06d5, 0x0443},
01505 {
01506 0x06d6, 0x0436},
01507 {
01508 0x06d7, 0x0432},
01509 {
01510 0x06d8, 0x044c},
01511 {
01512 0x06d9, 0x044b},
01513 {
01514 0x06da, 0x0437},
01515 {
01516 0x06db, 0x0448},
01517 {
01518 0x06dc, 0x044d},
01519 {
01520 0x06dd, 0x0449},
01521 {
01522 0x06de, 0x0447},
01523 {
01524 0x06df, 0x044a},
01525 {
01526 0x06e0, 0x042e},
01527 {
01528 0x06e1, 0x0410},
01529 {
01530 0x06e2, 0x0411},
01531 {
01532 0x06e3, 0x0426},
01533 {
01534 0x06e4, 0x0414},
01535 {
01536 0x06e5, 0x0415},
01537 {
01538 0x06e6, 0x0424},
01539 {
01540 0x06e7, 0x0413},
01541 {
01542 0x06e8, 0x0425},
01543 {
01544 0x06e9, 0x0418},
01545 {
01546 0x06ea, 0x0419},
01547 {
01548 0x06eb, 0x041a},
01549 {
01550 0x06ec, 0x041b},
01551 {
01552 0x06ed, 0x041c},
01553 {
01554 0x06ee, 0x041d},
01555 {
01556 0x06ef, 0x041e},
01557 {
01558 0x06f0, 0x041f},
01559 {
01560 0x06f1, 0x042f},
01561 {
01562 0x06f2, 0x0420},
01563 {
01564 0x06f3, 0x0421},
01565 {
01566 0x06f4, 0x0422},
01567 {
01568 0x06f5, 0x0423},
01569 {
01570 0x06f6, 0x0416},
01571 {
01572 0x06f7, 0x0412},
01573 {
01574 0x06f8, 0x042c},
01575 {
01576 0x06f9, 0x042b},
01577 {
01578 0x06fa, 0x0417},
01579 {
01580 0x06fb, 0x0428},
01581 {
01582 0x06fc, 0x042d},
01583 {
01584 0x06fd, 0x0429},
01585 {
01586 0x06fe, 0x0427},
01587 {
01588 0x06ff, 0x042a},
01589 {
01590 0x07a1, 0x0386},
01591 {
01592 0x07a2, 0x0388},
01593 {
01594 0x07a3, 0x0389},
01595 {
01596 0x07a4, 0x038a},
01597 {
01598 0x07a5, 0x03aa},
01599 {
01600 0x07a7, 0x038c},
01601 {
01602 0x07a8, 0x038e},
01603 {
01604 0x07a9, 0x03ab},
01605 {
01606 0x07ab, 0x038f},
01607 {
01608 0x07ae, 0x0385},
01609 {
01610 0x07af, 0x2015},
01611 {
01612 0x07b1, 0x03ac},
01613 {
01614 0x07b2, 0x03ad},
01615 {
01616 0x07b3, 0x03ae},
01617 {
01618 0x07b4, 0x03af},
01619 {
01620 0x07b5, 0x03ca},
01621 {
01622 0x07b6, 0x0390},
01623 {
01624 0x07b7, 0x03cc},
01625 {
01626 0x07b8, 0x03cd},
01627 {
01628 0x07b9, 0x03cb},
01629 {
01630 0x07ba, 0x03b0},
01631 {
01632 0x07bb, 0x03ce},
01633 {
01634 0x07c1, 0x0391},
01635 {
01636 0x07c2, 0x0392},
01637 {
01638 0x07c3, 0x0393},
01639 {
01640 0x07c4, 0x0394},
01641 {
01642 0x07c5, 0x0395},
01643 {
01644 0x07c6, 0x0396},
01645 {
01646 0x07c7, 0x0397},
01647 {
01648 0x07c8, 0x0398},
01649 {
01650 0x07c9, 0x0399},
01651 {
01652 0x07ca, 0x039a},
01653 {
01654 0x07cb, 0x039b},
01655 {
01656 0x07cc, 0x039c},
01657 {
01658 0x07cd, 0x039d},
01659 {
01660 0x07ce, 0x039e},
01661 {
01662 0x07cf, 0x039f},
01663 {
01664 0x07d0, 0x03a0},
01665 {
01666 0x07d1, 0x03a1},
01667 {
01668 0x07d2, 0x03a3},
01669 {
01670 0x07d4, 0x03a4},
01671 {
01672 0x07d5, 0x03a5},
01673 {
01674 0x07d6, 0x03a6},
01675 {
01676 0x07d7, 0x03a7},
01677 {
01678 0x07d8, 0x03a8},
01679 {
01680 0x07d9, 0x03a9},
01681 {
01682 0x07e1, 0x03b1},
01683 {
01684 0x07e2, 0x03b2},
01685 {
01686 0x07e3, 0x03b3},
01687 {
01688 0x07e4, 0x03b4},
01689 {
01690 0x07e5, 0x03b5},
01691 {
01692 0x07e6, 0x03b6},
01693 {
01694 0x07e7, 0x03b7},
01695 {
01696 0x07e8, 0x03b8},
01697 {
01698 0x07e9, 0x03b9},
01699 {
01700 0x07ea, 0x03ba},
01701 {
01702 0x07eb, 0x03bb},
01703 {
01704 0x07ec, 0x03bc},
01705 {
01706 0x07ed, 0x03bd},
01707 {
01708 0x07ee, 0x03be},
01709 {
01710 0x07ef, 0x03bf},
01711 {
01712 0x07f0, 0x03c0},
01713 {
01714 0x07f1, 0x03c1},
01715 {
01716 0x07f2, 0x03c3},
01717 {
01718 0x07f3, 0x03c2},
01719 {
01720 0x07f4, 0x03c4},
01721 {
01722 0x07f5, 0x03c5},
01723 {
01724 0x07f6, 0x03c6},
01725 {
01726 0x07f7, 0x03c7},
01727 {
01728 0x07f8, 0x03c8},
01729 {
01730 0x07f9, 0x03c9},
01731
01732
01733
01734 {
01735 0x08a4, 0x2320},
01736 {
01737 0x08a5, 0x2321},
01738 {
01739 0x08a6, 0x2502},
01740
01741
01742
01743
01744
01745
01746
01747
01748
01749
01750
01751
01752
01753
01754
01755
01756
01757 {
01758 0x08bc, 0x2264},
01759 {
01760 0x08bd, 0x2260},
01761 {
01762 0x08be, 0x2265},
01763 {
01764 0x08bf, 0x222b},
01765 {
01766 0x08c0, 0x2234},
01767 {
01768 0x08c1, 0x221d},
01769 {
01770 0x08c2, 0x221e},
01771 {
01772 0x08c5, 0x2207},
01773 {
01774 0x08c8, 0x2245},
01775
01776 {
01777 0x08cd, 0x21d4},
01778 {
01779 0x08ce, 0x21d2},
01780 {
01781 0x08cf, 0x2261},
01782 {
01783 0x08d6, 0x221a},
01784 {
01785 0x08da, 0x2282},
01786 {
01787 0x08db, 0x2283},
01788 {
01789 0x08dc, 0x2229},
01790 {
01791 0x08dd, 0x222a},
01792 {
01793 0x08de, 0x2227},
01794 {
01795 0x08df, 0x2228},
01796 {
01797 0x08ef, 0x2202},
01798 {
01799 0x08f6, 0x0192},
01800 {
01801 0x08fb, 0x2190},
01802 {
01803 0x08fc, 0x2191},
01804 {
01805 0x08fd, 0x2192},
01806 {
01807 0x08fe, 0x2193},
01808 {
01809 0x09df, 0x2422},
01810 {
01811 0x09e0, 0x25c6},
01812 {
01813 0x09e1, 0x2592},
01814 {
01815 0x09e2, 0x2409},
01816 {
01817 0x09e3, 0x240c},
01818 {
01819 0x09e4, 0x240d},
01820 {
01821 0x09e5, 0x240a},
01822 {
01823 0x09e8, 0x2424},
01824 {
01825 0x09e9, 0x240b},
01826 {
01827 0x09ea, 0x2518},
01828 {
01829 0x09eb, 0x2510},
01830 {
01831 0x09ec, 0x250c},
01832 {
01833 0x09ed, 0x2514},
01834 {
01835 0x09ee, 0x253c},
01836
01837
01838 {
01839 0x09f1, 0x2500},
01840
01841
01842 {
01843 0x09f4, 0x251c},
01844 {
01845 0x09f5, 0x2524},
01846 {
01847 0x09f6, 0x2534},
01848 {
01849 0x09f7, 0x252c},
01850 {
01851 0x09f8, 0x2502},
01852 {
01853 0x0aa1, 0x2003},
01854 {
01855 0x0aa2, 0x2002},
01856 {
01857 0x0aa3, 0x2004},
01858 {
01859 0x0aa4, 0x2005},
01860 {
01861 0x0aa5, 0x2007},
01862 {
01863 0x0aa6, 0x2008},
01864 {
01865 0x0aa7, 0x2009},
01866 {
01867 0x0aa8, 0x200a},
01868 {
01869 0x0aa9, 0x2014},
01870 {
01871 0x0aaa, 0x2013},
01872
01873 {
01874 0x0aae, 0x2026},
01875
01876 {
01877 0x0ab0, 0x2153},
01878 {
01879 0x0ab1, 0x2154},
01880 {
01881 0x0ab2, 0x2155},
01882 {
01883 0x0ab3, 0x2156},
01884 {
01885 0x0ab4, 0x2157},
01886 {
01887 0x0ab5, 0x2158},
01888 {
01889 0x0ab6, 0x2159},
01890 {
01891 0x0ab7, 0x215a},
01892 {
01893 0x0ab8, 0x2105},
01894 {
01895 0x0abb, 0x2012},
01896 {
01897 0x0abc, 0x2329},
01898 {
01899 0x0abd, 0x002e},
01900 {
01901 0x0abe, 0x232a},
01902
01903 {
01904 0x0ac3, 0x215b},
01905 {
01906 0x0ac4, 0x215c},
01907 {
01908 0x0ac5, 0x215d},
01909 {
01910 0x0ac6, 0x215e},
01911 {
01912 0x0ac9, 0x2122},
01913 {
01914 0x0aca, 0x2613},
01915
01916 {
01917 0x0acc, 0x25c1},
01918 {
01919 0x0acd, 0x25b7},
01920 {
01921 0x0ace, 0x25cb},
01922 {
01923 0x0acf, 0x25a1},
01924 {
01925 0x0ad0, 0x2018},
01926 {
01927 0x0ad1, 0x2019},
01928 {
01929 0x0ad2, 0x201c},
01930 {
01931 0x0ad3, 0x201d},
01932 {
01933 0x0ad4, 0x211e},
01934 {
01935 0x0ad6, 0x2032},
01936 {
01937 0x0ad7, 0x2033},
01938 {
01939 0x0ad9, 0x271d},
01940
01941 {
01942 0x0adb, 0x25ac},
01943 {
01944 0x0adc, 0x25c0},
01945 {
01946 0x0add, 0x25b6},
01947 {
01948 0x0ade, 0x25cf},
01949 {
01950 0x0adf, 0x25a0},
01951 {
01952 0x0ae0, 0x25e6},
01953 {
01954 0x0ae1, 0x25ab},
01955 {
01956 0x0ae2, 0x25ad},
01957 {
01958 0x0ae3, 0x25b3},
01959 {
01960 0x0ae4, 0x25bd},
01961 {
01962 0x0ae5, 0x2606},
01963 {
01964 0x0ae6, 0x2022},
01965 {
01966 0x0ae7, 0x25aa},
01967 {
01968 0x0ae8, 0x25b2},
01969 {
01970 0x0ae9, 0x25bc},
01971 {
01972 0x0aea, 0x261c},
01973 {
01974 0x0aeb, 0x261e},
01975 {
01976 0x0aec, 0x2663},
01977 {
01978 0x0aed, 0x2666},
01979 {
01980 0x0aee, 0x2665},
01981 {
01982 0x0af0, 0x2720},
01983 {
01984 0x0af1, 0x2020},
01985 {
01986 0x0af2, 0x2021},
01987 {
01988 0x0af3, 0x2713},
01989 {
01990 0x0af4, 0x2717},
01991 {
01992 0x0af5, 0x266f},
01993 {
01994 0x0af6, 0x266d},
01995 {
01996 0x0af7, 0x2642},
01997 {
01998 0x0af8, 0x2640},
01999 {
02000 0x0af9, 0x260e},
02001 {
02002 0x0afa, 0x2315},
02003 {
02004 0x0afb, 0x2117},
02005 {
02006 0x0afc, 0x2038},
02007 {
02008 0x0afd, 0x201a},
02009 {
02010 0x0afe, 0x201e},
02011
02012 {
02013 0x0ba3, 0x003c},
02014 {
02015 0x0ba6, 0x003e},
02016 {
02017 0x0ba8, 0x2228},
02018 {
02019 0x0ba9, 0x2227},
02020 {
02021 0x0bc0, 0x00af},
02022 {
02023 0x0bc2, 0x22a4},
02024 {
02025 0x0bc3, 0x2229},
02026 {
02027 0x0bc4, 0x230a},
02028 {
02029 0x0bc6, 0x005f},
02030 {
02031 0x0bca, 0x2218},
02032 {
02033 0x0bcc, 0x2395},
02034 {
02035 0x0bce, 0x22a5},
02036 {
02037 0x0bcf, 0x25cb},
02038 {
02039 0x0bd3, 0x2308},
02040 {
02041 0x0bd6, 0x222a},
02042 {
02043 0x0bd8, 0x2283},
02044 {
02045 0x0bda, 0x2282},
02046 {
02047 0x0bdc, 0x22a3},
02048 {
02049 0x0bfc, 0x22a2},
02050 {
02051 0x0cdf, 0x2017},
02052 {
02053 0x0ce0, 0x05d0},
02054 {
02055 0x0ce1, 0x05d1},
02056 {
02057 0x0ce2, 0x05d2},
02058 {
02059 0x0ce3, 0x05d3},
02060 {
02061 0x0ce4, 0x05d4},
02062 {
02063 0x0ce5, 0x05d5},
02064 {
02065 0x0ce6, 0x05d6},
02066 {
02067 0x0ce7, 0x05d7},
02068 {
02069 0x0ce8, 0x05d8},
02070 {
02071 0x0ce9, 0x05d9},
02072 {
02073 0x0cea, 0x05da},
02074 {
02075 0x0ceb, 0x05db},
02076 {
02077 0x0cec, 0x05dc},
02078 {
02079 0x0ced, 0x05dd},
02080 {
02081 0x0cee, 0x05de},
02082 {
02083 0x0cef, 0x05df},
02084 {
02085 0x0cf0, 0x05e0},
02086 {
02087 0x0cf1, 0x05e1},
02088 {
02089 0x0cf2, 0x05e2},
02090 {
02091 0x0cf3, 0x05e3},
02092 {
02093 0x0cf4, 0x05e4},
02094 {
02095 0x0cf5, 0x05e5},
02096 {
02097 0x0cf6, 0x05e6},
02098 {
02099 0x0cf7, 0x05e7},
02100 {
02101 0x0cf8, 0x05e8},
02102 {
02103 0x0cf9, 0x05e9},
02104 {
02105 0x0cfa, 0x05ea},
02106 {
02107 0x0da1, 0x0e01},
02108 {
02109 0x0da2, 0x0e02},
02110 {
02111 0x0da3, 0x0e03},
02112 {
02113 0x0da4, 0x0e04},
02114 {
02115 0x0da5, 0x0e05},
02116 {
02117 0x0da6, 0x0e06},
02118 {
02119 0x0da7, 0x0e07},
02120 {
02121 0x0da8, 0x0e08},
02122 {
02123 0x0da9, 0x0e09},
02124 {
02125 0x0daa, 0x0e0a},
02126 {
02127 0x0dab, 0x0e0b},
02128 {
02129 0x0dac, 0x0e0c},
02130 {
02131 0x0dad, 0x0e0d},
02132 {
02133 0x0dae, 0x0e0e},
02134 {
02135 0x0daf, 0x0e0f},
02136 {
02137 0x0db0, 0x0e10},
02138 {
02139 0x0db1, 0x0e11},
02140 {
02141 0x0db2, 0x0e12},
02142 {
02143 0x0db3, 0x0e13},
02144 {
02145 0x0db4, 0x0e14},
02146 {
02147 0x0db5, 0x0e15},
02148 {
02149 0x0db6, 0x0e16},
02150 {
02151 0x0db7, 0x0e17},
02152 {
02153 0x0db8, 0x0e18},
02154 {
02155 0x0db9, 0x0e19},
02156 {
02157 0x0dba, 0x0e1a},
02158 {
02159 0x0dbb, 0x0e1b},
02160 {
02161 0x0dbc, 0x0e1c},
02162 {
02163 0x0dbd, 0x0e1d},
02164 {
02165 0x0dbe, 0x0e1e},
02166 {
02167 0x0dbf, 0x0e1f},
02168 {
02169 0x0dc0, 0x0e20},
02170 {
02171 0x0dc1, 0x0e21},
02172 {
02173 0x0dc2, 0x0e22},
02174 {
02175 0x0dc3, 0x0e23},
02176 {
02177 0x0dc4, 0x0e24},
02178 {
02179 0x0dc5, 0x0e25},
02180 {
02181 0x0dc6, 0x0e26},
02182 {
02183 0x0dc7, 0x0e27},
02184 {
02185 0x0dc8, 0x0e28},
02186 {
02187 0x0dc9, 0x0e29},
02188 {
02189 0x0dca, 0x0e2a},
02190 {
02191 0x0dcb, 0x0e2b},
02192 {
02193 0x0dcc, 0x0e2c},
02194 {
02195 0x0dcd, 0x0e2d},
02196 {
02197 0x0dce, 0x0e2e},
02198 {
02199 0x0dcf, 0x0e2f},
02200 {
02201 0x0dd0, 0x0e30},
02202 {
02203 0x0dd1, 0x0e31},
02204 {
02205 0x0dd2, 0x0e32},
02206 {
02207 0x0dd3, 0x0e33},
02208 {
02209 0x0dd4, 0x0e34},
02210 {
02211 0x0dd5, 0x0e35},
02212 {
02213 0x0dd6, 0x0e36},
02214 {
02215 0x0dd7, 0x0e37},
02216 {
02217 0x0dd8, 0x0e38},
02218 {
02219 0x0dd9, 0x0e39},
02220 {
02221 0x0dda, 0x0e3a},
02222 {
02223 0x0dde, 0x0e3e},
02224 {
02225 0x0ddf, 0x0e3f},
02226 {
02227 0x0de0, 0x0e40},
02228 {
02229 0x0de1, 0x0e41},
02230 {
02231 0x0de2, 0x0e42},
02232 {
02233 0x0de3, 0x0e43},
02234 {
02235 0x0de4, 0x0e44},
02236 {
02237 0x0de5, 0x0e45},
02238 {
02239 0x0de6, 0x0e46},
02240 {
02241 0x0de7, 0x0e47},
02242 {
02243 0x0de8, 0x0e48},
02244 {
02245 0x0de9, 0x0e49},
02246 {
02247 0x0dea, 0x0e4a},
02248 {
02249 0x0deb, 0x0e4b},
02250 {
02251 0x0dec, 0x0e4c},
02252 {
02253 0x0ded, 0x0e4d},
02254 {
02255 0x0df0, 0x0e50},
02256 {
02257 0x0df1, 0x0e51},
02258 {
02259 0x0df2, 0x0e52},
02260 {
02261 0x0df3, 0x0e53},
02262 {
02263 0x0df4, 0x0e54},
02264 {
02265 0x0df5, 0x0e55},
02266 {
02267 0x0df6, 0x0e56},
02268 {
02269 0x0df7, 0x0e57},
02270 {
02271 0x0df8, 0x0e58},
02272 {
02273 0x0df9, 0x0e59},
02274 {
02275 0x0ea1, 0x3131},
02276 {
02277 0x0ea2, 0x3132},
02278 {
02279 0x0ea3, 0x3133},
02280 {
02281 0x0ea4, 0x3134},
02282 {
02283 0x0ea5, 0x3135},
02284 {
02285 0x0ea6, 0x3136},
02286 {
02287 0x0ea7, 0x3137},
02288 {
02289 0x0ea8, 0x3138},
02290 {
02291 0x0ea9, 0x3139},
02292 {
02293 0x0eaa, 0x313a},
02294 {
02295 0x0eab, 0x313b},
02296 {
02297 0x0eac, 0x313c},
02298 {
02299 0x0ead, 0x313d},
02300 {
02301 0x0eae, 0x313e},
02302 {
02303 0x0eaf, 0x313f},
02304 {
02305 0x0eb0, 0x3140},
02306 {
02307 0x0eb1, 0x3141},
02308 {
02309 0x0eb2, 0x3142},
02310 {
02311 0x0eb3, 0x3143},
02312 {
02313 0x0eb4, 0x3144},
02314 {
02315 0x0eb5, 0x3145},
02316 {
02317 0x0eb6, 0x3146},
02318 {
02319 0x0eb7, 0x3147},
02320 {
02321 0x0eb8, 0x3148},
02322 {
02323 0x0eb9, 0x3149},
02324 {
02325 0x0eba, 0x314a},
02326 {
02327 0x0ebb, 0x314b},
02328 {
02329 0x0ebc, 0x314c},
02330 {
02331 0x0ebd, 0x314d},
02332 {
02333 0x0ebe, 0x314e},
02334 {
02335 0x0ebf, 0x314f},
02336 {
02337 0x0ec0, 0x3150},
02338 {
02339 0x0ec1, 0x3151},
02340 {
02341 0x0ec2, 0x3152},
02342 {
02343 0x0ec3, 0x3153},
02344 {
02345 0x0ec4, 0x3154},
02346 {
02347 0x0ec5, 0x3155},
02348 {
02349 0x0ec6, 0x3156},
02350 {
02351 0x0ec7, 0x3157},
02352 {
02353 0x0ec8, 0x3158},
02354 {
02355 0x0ec9, 0x3159},
02356 {
02357 0x0eca, 0x315a},
02358 {
02359 0x0ecb, 0x315b},
02360 {
02361 0x0ecc, 0x315c},
02362 {
02363 0x0ecd, 0x315d},
02364 {
02365 0x0ece, 0x315e},
02366 {
02367 0x0ecf, 0x315f},
02368 {
02369 0x0ed0, 0x3160},
02370 {
02371 0x0ed1, 0x3161},
02372 {
02373 0x0ed2, 0x3162},
02374 {
02375 0x0ed3, 0x3163},
02376 {
02377 0x0ed4, 0x11a8},
02378 {
02379 0x0ed5, 0x11a9},
02380 {
02381 0x0ed6, 0x11aa},
02382 {
02383 0x0ed7, 0x11ab},
02384 {
02385 0x0ed8, 0x11ac},
02386 {
02387 0x0ed9, 0x11ad},
02388 {
02389 0x0eda, 0x11ae},
02390 {
02391 0x0edb, 0x11af},
02392 {
02393 0x0edc, 0x11b0},
02394 {
02395 0x0edd, 0x11b1},
02396 {
02397 0x0ede, 0x11b2},
02398 {
02399 0x0edf, 0x11b3},
02400 {
02401 0x0ee0, 0x11b4},
02402 {
02403 0x0ee1, 0x11b5},
02404 {
02405 0x0ee2, 0x11b6},
02406 {
02407 0x0ee3, 0x11b7},
02408 {
02409 0x0ee4, 0x11b8},
02410 {
02411 0x0ee5, 0x11b9},
02412 {
02413 0x0ee6, 0x11ba},
02414 {
02415 0x0ee7, 0x11bb},
02416 {
02417 0x0ee8, 0x11bc},
02418 {
02419 0x0ee9, 0x11bd},
02420 {
02421 0x0eea, 0x11be},
02422 {
02423 0x0eeb, 0x11bf},
02424 {
02425 0x0eec, 0x11c0},
02426 {
02427 0x0eed, 0x11c1},
02428 {
02429 0x0eee, 0x11c2},
02430 {
02431 0x0eef, 0x316d},
02432 {
02433 0x0ef0, 0x3171},
02434 {
02435 0x0ef1, 0x3178},
02436 {
02437 0x0ef2, 0x317f},
02438
02439 {
02440 0x0ef4, 0x3184},
02441 {
02442 0x0ef5, 0x3186},
02443 {
02444 0x0ef6, 0x318d},
02445 {
02446 0x0ef7, 0x318e},
02447 {
02448 0x0ef8, 0x11eb},
02449
02450 {
02451 0x0efa, 0x11f9},
02452 {
02453 0x0eff, 0x20a9},
02454 {
02455 0x13bc, 0x0152},
02456 {
02457 0x13bd, 0x0153},
02458 {
02459 0x13be, 0x0178},
02460 {
02461 0x20a0, 0x20a0},
02462 {
02463 0x20a1, 0x20a1},
02464 {
02465 0x20a2, 0x20a2},
02466 {
02467 0x20a3, 0x20a3},
02468 {
02469 0x20a4, 0x20a4},
02470 {
02471 0x20a5, 0x20a5},
02472 {
02473 0x20a6, 0x20a6},
02474 {
02475 0x20a7, 0x20a7},
02476 {
02477 0x20a8, 0x20a8},
02478 {
02479 0x20a9, 0x20a9},
02480 {
02481 0x20aa, 0x20aa},
02482 {
02483 0x20ab, 0x20ab},
02484 {
02485 0x20ac, 0x20ac},
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
02495 if ((keysym >= 0x0020 && keysym <= 0x007e) ||
02496 (keysym >= 0x00a0 && keysym <= 0x00ff))
02497 return keysym;
02498
02499
02500 if ((keysym & 0xff000000) == 0x01000000)
02501 return keysym & 0x00ffffff;
02502
02503
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
02512 return k2utab[mid].ucs;
02513 }
02514 }
02515
02516
02517 return -1;
02518 }
02519
02520 #endif
02521
02522 struct u2k {
02523 unsigned short keysym;
02524 unsigned short ucs;
02525 } u2ktab[] = {
02526 {
02527 0x0abd, 0x002e},
02528 {
02529 0x0ba3, 0x003c},
02530 {
02531 0x0ba6, 0x003e},
02532 {
02533 0x0bc6, 0x005f},
02534 {
02535 0x0bc0, 0x00af},
02536 {
02537 0x03c0, 0x0100},
02538 {
02539 0x03e0, 0x0101},
02540 {
02541 0x01c3, 0x0102},
02542 {
02543 0x01e3, 0x0103},
02544 {
02545 0x01a1, 0x0104},
02546 {
02547 0x01b1, 0x0105},
02548 {
02549 0x01c6, 0x0106},
02550 {
02551 0x01e6, 0x0107},
02552 {
02553 0x02c6, 0x0108},
02554 {
02555 0x02e6, 0x0109},
02556 {
02557 0x02c5, 0x010a},
02558 {
02559 0x02e5, 0x010b},
02560 {
02561 0x01c8, 0x010c},
02562 {
02563 0x01e8, 0x010d},
02564 {
02565 0x01cf, 0x010e},
02566 {
02567 0x01ef, 0x010f},
02568 {
02569 0x01d0, 0x0110},
02570 {
02571 0x01f0, 0x0111},
02572 {
02573 0x03aa, 0x0112},
02574 {
02575 0x03ba, 0x0113},
02576 {
02577 0x03cc, 0x0116},
02578 {
02579 0x03ec, 0x0117},
02580 {
02581 0x01ca, 0x0118},
02582 {
02583 0x01ea, 0x0119},
02584 {
02585 0x01cc, 0x011a},
02586 {
02587 0x01ec, 0x011b},
02588 {
02589 0x02d8, 0x011c},
02590 {
02591 0x02f8, 0x011d},
02592 {
02593 0x02ab, 0x011e},
02594 {
02595 0x02bb, 0x011f},
02596 {
02597 0x02d5, 0x0120},
02598 {
02599 0x02f5, 0x0121},
02600 {
02601 0x03ab, 0x0122},
02602 {
02603 0x03bb, 0x0123},
02604 {
02605 0x02a6, 0x0124},
02606 {
02607 0x02b6, 0x0125},
02608 {
02609 0x02a1, 0x0126},
02610 {
02611 0x02b1, 0x0127},
02612 {
02613 0x03a5, 0x0128},
02614 {
02615 0x03b5, 0x0129},
02616 {
02617 0x03cf, 0x012a},
02618 {
02619 0x03ef, 0x012b},
02620 {
02621 0x03c7, 0x012e},
02622 {
02623 0x03e7, 0x012f},
02624 {
02625 0x02a9, 0x0130},
02626 {
02627 0x02b9, 0x0131},
02628 {
02629 0x02ac, 0x0134},
02630 {
02631 0x02bc, 0x0135},
02632 {
02633 0x03d3, 0x0136},
02634 {
02635 0x03f3, 0x0137},
02636 {
02637 0x03a2, 0x0138},
02638 {
02639 0x01c5, 0x0139},
02640 {
02641 0x01e5, 0x013a},
02642 {
02643 0x03a6, 0x013b},
02644 {
02645 0x03b6, 0x013c},
02646 {
02647 0x01a5, 0x013d},
02648 {
02649 0x01b5, 0x013e},
02650 {
02651 0x01a3, 0x0141},
02652 {
02653 0x01b3, 0x0142},
02654 {
02655 0x01d1, 0x0143},
02656 {
02657 0x01f1, 0x0144},
02658 {
02659 0x03d1, 0x0145},
02660 {
02661 0x03f1, 0x0146},
02662 {
02663 0x01d2, 0x0147},
02664 {
02665 0x01f2, 0x0148},
02666 {
02667 0x03bd, 0x014a},
02668 {
02669 0x03bf, 0x014b},
02670 {
02671 0x03d2, 0x014c},
02672 {
02673 0x03f2, 0x014d},
02674 {
02675 0x01d5, 0x0150},
02676 {
02677 0x01f5, 0x0151},
02678 {
02679 0x13bc, 0x0152},
02680 {
02681 0x13bd, 0x0153},
02682 {
02683 0x01c0, 0x0154},
02684 {
02685 0x01e0, 0x0155},
02686 {
02687 0x03a3, 0x0156},
02688 {
02689 0x03b3, 0x0157},
02690 {
02691 0x01d8, 0x0158},
02692 {
02693 0x01f8, 0x0159},
02694 {
02695 0x01a6, 0x015a},
02696 {
02697 0x01b6, 0x015b},
02698 {
02699 0x02de, 0x015c},
02700 {
02701 0x02fe, 0x015d},
02702 {
02703 0x01aa, 0x015e},
02704 {
02705 0x01ba, 0x015f},
02706 {
02707 0x01a9, 0x0160},
02708 {
02709 0x01b9, 0x0161},
02710 {
02711 0x01de, 0x0162},
02712 {
02713 0x01fe, 0x0163},
02714 {
02715 0x01ab, 0x0164},
02716 {
02717 0x01bb, 0x0165},
02718 {
02719 0x03ac, 0x0166},
02720 {
02721 0x03bc, 0x0167},
02722 {
02723 0x03dd, 0x0168},
02724 {
02725 0x03fd, 0x0169},
02726 {
02727 0x03de, 0x016a},
02728 {
02729 0x03fe, 0x016b},
02730 {
02731 0x02dd, 0x016c},
02732 {
02733 0x02fd, 0x016d},
02734 {
02735 0x01d9, 0x016e},
02736 {
02737 0x01f9, 0x016f},
02738 {
02739 0x01db, 0x0170},
02740 {
02741 0x01fb, 0x0171},
02742 {
02743 0x03d9, 0x0172},
02744 {
02745 0x03f9, 0x0173},
02746 {
02747 0x13be, 0x0178},
02748 {
02749 0x01ac, 0x0179},
02750 {
02751 0x01bc, 0x017a},
02752 {
02753 0x01af, 0x017b},
02754 {
02755 0x01bf, 0x017c},
02756 {
02757 0x01ae, 0x017d},
02758 {
02759 0x01be, 0x017e},
02760 {
02761 0x08f6, 0x0192},
02762 {
02763 0x01b7, 0x02c7},
02764 {
02765 0x01a2, 0x02d8},
02766 {
02767 0x01ff, 0x02d9},
02768 {
02769 0x01b2, 0x02db},
02770 {
02771 0x01bd, 0x02dd},
02772 {
02773 0x07ae, 0x0385},
02774 {
02775 0x07a1, 0x0386},
02776 {
02777 0x07a2, 0x0388},
02778 {
02779 0x07a3, 0x0389},
02780 {
02781 0x07a4, 0x038a},
02782 {
02783 0x07a7, 0x038c},
02784 {
02785 0x07a8, 0x038e},
02786 {
02787 0x07ab, 0x038f},
02788 {
02789 0x07b6, 0x0390},
02790 {
02791 0x07c1, 0x0391},
02792 {
02793 0x07c2, 0x0392},
02794 {
02795 0x07c3, 0x0393},
02796 {
02797 0x07c4, 0x0394},
02798 {
02799 0x07c5, 0x0395},
02800 {
02801 0x07c6, 0x0396},
02802 {
02803 0x07c7, 0x0397},
02804 {
02805 0x07c8, 0x0398},
02806 {
02807 0x07c9, 0x0399},
02808 {
02809 0x07ca, 0x039a},
02810 {
02811 0x07cb, 0x039b},
02812 {
02813 0x07cc, 0x039c},
02814 {
02815 0x07cd, 0x039d},
02816 {
02817 0x07ce, 0x039e},
02818 {
02819 0x07cf, 0x039f},
02820 {
02821 0x07d0, 0x03a0},
02822 {
02823 0x07d1, 0x03a1},
02824 {
02825 0x07d2, 0x03a3},
02826 {
02827 0x07d4, 0x03a4},
02828 {
02829 0x07d5, 0x03a5},
02830 {
02831 0x07d6, 0x03a6},
02832 {
02833 0x07d7, 0x03a7},
02834 {
02835 0x07d8, 0x03a8},
02836 {
02837 0x07d9, 0x03a9},
02838 {
02839 0x07a5, 0x03aa},
02840 {
02841 0x07a9, 0x03ab},
02842 {
02843 0x07b1, 0x03ac},
02844 {
02845 0x07b2, 0x03ad},
02846 {
02847 0x07b3, 0x03ae},
02848 {
02849 0x07b4, 0x03af},
02850 {
02851 0x07ba, 0x03b0},
02852 {
02853 0x07e1, 0x03b1},
02854 {
02855 0x07e2, 0x03b2},
02856 {
02857 0x07e3, 0x03b3},
02858 {
02859 0x07e4, 0x03b4},
02860 {
02861 0x07e5, 0x03b5},
02862 {
02863 0x07e6, 0x03b6},
02864 {
02865 0x07e7, 0x03b7},
02866 {
02867 0x07e8, 0x03b8},
02868 {
02869 0x07e9, 0x03b9},
02870 {
02871 0x07ea, 0x03ba},
02872 {
02873 0x07eb, 0x03bb},
02874 {
02875 0x07ec, 0x03bc},
02876 {
02877 0x07ed, 0x03bd},
02878 {
02879 0x07ee, 0x03be},
02880 {
02881 0x07ef, 0x03bf},
02882 {
02883 0x07f0, 0x03c0},
02884 {
02885 0x07f1, 0x03c1},
02886 {
02887 0x07f3, 0x03c2},
02888 {
02889 0x07f2, 0x03c3},
02890 {
02891 0x07f4, 0x03c4},
02892 {
02893 0x07f5, 0x03c5},
02894 {
02895 0x07f6, 0x03c6},
02896 {
02897 0x07f7, 0x03c7},
02898 {
02899 0x07f8, 0x03c8},
02900 {
02901 0x07f9, 0x03c9},
02902 {
02903 0x07b5, 0x03ca},
02904 {
02905 0x07b9, 0x03cb},
02906 {
02907 0x07b7, 0x03cc},
02908 {
02909 0x07b8, 0x03cd},
02910 {
02911 0x07bb, 0x03ce},
02912 {
02913 0x06b3, 0x0401},
02914 {
02915 0x06b1, 0x0402},
02916 {
02917 0x06b2, 0x0403},
02918 {
02919 0x06b4, 0x0404},
02920 {
02921 0x06b5, 0x0405},
02922 {
02923 0x06b6, 0x0406},
02924 {
02925 0x06b7, 0x0407},
02926 {
02927 0x06b8, 0x0408},
02928 {
02929 0x06b9, 0x0409},
02930 {
02931 0x06ba, 0x040a},
02932 {
02933 0x06bb, 0x040b},
02934 {
02935 0x06bc, 0x040c},
02936 {
02937 0x06be, 0x040e},
02938 {
02939 0x06bf, 0x040f},
02940 {
02941 0x06e1, 0x0410},
02942 {
02943 0x06e2, 0x0411},
02944 {
02945 0x06f7, 0x0412},
02946 {
02947 0x06e7, 0x0413},
02948 {
02949 0x06e4, 0x0414},
02950 {
02951 0x06e5, 0x0415},
02952 {
02953 0x06f6, 0x0416},
02954 {
02955 0x06fa, 0x0417},
02956 {
02957 0x06e9, 0x0418},
02958 {
02959 0x06ea, 0x0419},
02960 {
02961 0x06eb, 0x041a},
02962 {
02963 0x06ec, 0x041b},
02964 {
02965 0x06ed, 0x041c},
02966 {
02967 0x06ee, 0x041d},
02968 {
02969 0x06ef, 0x041e},
02970 {
02971 0x06f0, 0x041f},
02972 {
02973 0x06f2, 0x0420},
02974 {
02975 0x06f3, 0x0421},
02976 {
02977 0x06f4, 0x0422},
02978 {
02979 0x06f5, 0x0423},
02980 {
02981 0x06e6, 0x0424},
02982 {
02983 0x06e8, 0x0425},
02984 {
02985 0x06e3, 0x0426},
02986 {
02987 0x06fe, 0x0427},
02988 {
02989 0x06fb, 0x0428},
02990 {
02991 0x06fd, 0x0429},
02992 {
02993 0x06ff, 0x042a},
02994 {
02995 0x06f9, 0x042b},
02996 {
02997 0x06f8, 0x042c},
02998 {
02999 0x06fc, 0x042d},
03000 {
03001 0x06e0, 0x042e},
03002 {
03003 0x06f1, 0x042f},
03004 {
03005 0x06c1, 0x0430},
03006 {
03007 0x06c2, 0x0431},
03008 {
03009 0x06d7, 0x0432},
03010 {
03011 0x06c7, 0x0433},
03012 {
03013 0x06c4, 0x0434},
03014 {
03015 0x06c5, 0x0435},
03016 {
03017 0x06d6, 0x0436},
03018 {
03019 0x06da, 0x0437},
03020 {
03021 0x06c9, 0x0438},
03022 {
03023 0x06ca, 0x0439},
03024 {
03025 0x06cb, 0x043a},
03026 {
03027 0x06cc, 0x043b},
03028 {
03029 0x06cd, 0x043c},
03030 {
03031 0x06ce, 0x043d},
03032 {
03033 0x06cf, 0x043e},
03034 {
03035 0x06d0, 0x043f},
03036 {
03037 0x06d2, 0x0440},
03038 {
03039 0x06d3, 0x0441},
03040 {
03041 0x06d4, 0x0442},
03042 {
03043 0x06d5, 0x0443},
03044 {
03045 0x06c6, 0x0444},
03046 {
03047 0x06c8, 0x0445},
03048 {
03049 0x06c3, 0x0446},
03050 {
03051 0x06de, 0x0447},
03052 {
03053 0x06db, 0x0448},
03054 {
03055 0x06dd, 0x0449},
03056 {
03057 0x06df, 0x044a},
03058 {
03059 0x06d9, 0x044b},
03060 {
03061 0x06d8, 0x044c},
03062 {
03063 0x06dc, 0x044d},
03064 {
03065 0x06c0, 0x044e},
03066 {
03067 0x06d1, 0x044f},
03068 {
03069 0x06a3, 0x0451},
03070 {
03071 0x06a1, 0x0452},
03072 {
03073 0x06a2, 0x0453},
03074 {
03075 0x06a4, 0x0454},
03076 {
03077 0x06a5, 0x0455},
03078 {
03079 0x06a6, 0x0456},
03080 {
03081 0x06a7, 0x0457},
03082 {
03083 0x06a8, 0x0458},
03084 {
03085 0x06a9, 0x0459},
03086 {
03087 0x06aa, 0x045a},
03088 {
03089 0x06ab, 0x045b},
03090 {
03091 0x06ac, 0x045c},
03092 {
03093 0x06ae, 0x045e},
03094 {
03095 0x06af, 0x045f},
03096 {
03097 0x0ce0, 0x05d0},
03098 {
03099 0x0ce1, 0x05d1},
03100 {
03101 0x0ce2, 0x05d2},
03102 {
03103 0x0ce3, 0x05d3},
03104 {
03105 0x0ce4, 0x05d4},
03106 {
03107 0x0ce5, 0x05d5},
03108 {
03109 0x0ce6, 0x05d6},
03110 {
03111 0x0ce7, 0x05d7},
03112 {
03113 0x0ce8, 0x05d8},
03114 {
03115 0x0ce9, 0x05d9},
03116 {
03117 0x0cea, 0x05da},
03118 {
03119 0x0ceb, 0x05db},
03120 {
03121 0x0cec, 0x05dc},
03122 {
03123 0x0ced, 0x05dd},
03124 {
03125 0x0cee, 0x05de},
03126 {
03127 0x0cef, 0x05df},
03128 {
03129 0x0cf0, 0x05e0},
03130 {
03131 0x0cf1, 0x05e1},
03132 {
03133 0x0cf2, 0x05e2},
03134 {
03135 0x0cf3, 0x05e3},
03136 {
03137 0x0cf4, 0x05e4},
03138 {
03139 0x0cf5, 0x05e5},
03140 {
03141 0x0cf6, 0x05e6},
03142 {
03143 0x0cf7, 0x05e7},
03144 {
03145 0x0cf8, 0x05e8},
03146 {
03147 0x0cf9, 0x05e9},
03148 {
03149 0x0cfa, 0x05ea},
03150 {
03151 0x05ac, 0x060c},
03152 {
03153 0x05bb, 0x061b},
03154 {
03155 0x05bf, 0x061f},
03156 {
03157 0x05c1, 0x0621},
03158 {
03159 0x05c2, 0x0622},
03160 {
03161 0x05c3, 0x0623},
03162 {
03163 0x05c4, 0x0624},
03164 {
03165 0x05c5, 0x0625},
03166 {
03167 0x05c6, 0x0626},
03168 {
03169 0x05c7, 0x0627},
03170 {
03171 0x05c8, 0x0628},
03172 {
03173 0x05c9, 0x0629},
03174 {
03175 0x05ca, 0x062a},
03176 {
03177 0x05cb, 0x062b},
03178 {
03179 0x05cc, 0x062c},
03180 {
03181 0x05cd, 0x062d},
03182 {
03183 0x05ce, 0x062e},
03184 {
03185 0x05cf, 0x062f},
03186 {
03187 0x05d0, 0x0630},
03188 {
03189 0x05d1, 0x0631},
03190 {
03191 0x05d2, 0x0632},
03192 {
03193 0x05d3, 0x0633},
03194 {
03195 0x05d4, 0x0634},
03196 {
03197 0x05d5, 0x0635},
03198 {
03199 0x05d6, 0x0636},
03200 {
03201 0x05d7, 0x0637},
03202 {
03203 0x05d8, 0x0638},
03204 {
03205 0x05d9, 0x0639},
03206 {
03207 0x05da, 0x063a},
03208 {
03209 0x05e0, 0x0640},
03210 {
03211 0x05e1, 0x0641},
03212 {
03213 0x05e2, 0x0642},
03214 {
03215 0x05e3, 0x0643},
03216 {
03217 0x05e4, 0x0644},
03218 {
03219 0x05e5, 0x0645},
03220 {
03221 0x05e6, 0x0646},
03222 {
03223 0x05e7, 0x0647},
03224 {
03225 0x05e8, 0x0648},
03226 {
03227 0x05e9, 0x0649},
03228 {
03229 0x05ea, 0x064a},
03230 {
03231 0x05eb, 0x064b},
03232 {
03233 0x05ec, 0x064c},
03234 {
03235 0x05ed, 0x064d},
03236 {
03237 0x05ee, 0x064e},
03238 {
03239 0x05ef, 0x064f},
03240 {
03241 0x05f0, 0x0650},
03242 {
03243 0x05f1, 0x0651},
03244 {
03245 0x05f2, 0x0652},
03246 {
03247 0x0da1, 0x0e01},
03248 {
03249 0x0da2, 0x0e02},
03250 {
03251 0x0da3, 0x0e03},
03252 {
03253 0x0da4, 0x0e04},
03254 {
03255 0x0da5, 0x0e05},
03256 {
03257 0x0da6, 0x0e06},
03258 {
03259 0x0da7, 0x0e07},
03260 {
03261 0x0da8, 0x0e08},
03262 {
03263 0x0da9, 0x0e09},
03264 {
03265 0x0daa, 0x0e0a},
03266 {
03267 0x0dab, 0x0e0b},
03268 {
03269 0x0dac, 0x0e0c},
03270 {
03271 0x0dad, 0x0e0d},
03272 {
03273 0x0dae, 0x0e0e},
03274 {
03275 0x0daf, 0x0e0f},
03276 {
03277 0x0db0, 0x0e10},
03278 {
03279 0x0db1, 0x0e11},
03280 {
03281 0x0db2, 0x0e12},
03282 {
03283 0x0db3, 0x0e13},
03284 {
03285 0x0db4, 0x0e14},
03286 {
03287 0x0db5, 0x0e15},
03288 {
03289 0x0db6, 0x0e16},
03290 {
03291 0x0db7, 0x0e17},
03292 {
03293 0x0db8, 0x0e18},
03294 {
03295 0x0db9, 0x0e19},
03296 {
03297 0x0dba, 0x0e1a},
03298 {
03299 0x0dbb, 0x0e1b},
03300 {
03301 0x0dbc, 0x0e1c},
03302 {
03303 0x0dbd, 0x0e1d},
03304 {
03305 0x0dbe, 0x0e1e},
03306 {
03307 0x0dbf, 0x0e1f},
03308 {
03309 0x0dc0, 0x0e20},
03310 {
03311 0x0dc1, 0x0e21},
03312 {
03313 0x0dc2, 0x0e22},
03314 {
03315 0x0dc3, 0x0e23},
03316 {
03317 0x0dc4, 0x0e24},
03318 {
03319 0x0dc5, 0x0e25},
03320 {
03321 0x0dc6, 0x0e26},
03322 {
03323 0x0dc7, 0x0e27},
03324 {
03325 0x0dc8, 0x0e28},
03326 {
03327 0x0dc9, 0x0e29},
03328 {
03329 0x0dca, 0x0e2a},
03330 {
03331 0x0dcb, 0x0e2b},
03332 {
03333 0x0dcc, 0x0e2c},
03334 {
03335 0x0dcd, 0x0e2d},
03336 {
03337 0x0dce, 0x0e2e},
03338 {
03339 0x0dcf, 0x0e2f},
03340 {
03341 0x0dd0, 0x0e30},
03342 {
03343 0x0dd1, 0x0e31},
03344 {
03345 0x0dd2, 0x0e32},
03346 {
03347 0x0dd3, 0x0e33},
03348 {
03349 0x0dd4, 0x0e34},
03350 {
03351 0x0dd5, 0x0e35},
03352 {
03353 0x0dd6, 0x0e36},
03354 {
03355 0x0dd7, 0x0e37},
03356 {
03357 0x0dd8, 0x0e38},
03358 {
03359 0x0dd9, 0x0e39},
03360 {
03361 0x0dda, 0x0e3a},
03362 {
03363 0x0ddf, 0x0e3f},
03364 {
03365 0x0de0, 0x0e40},
03366 {
03367 0x0de1, 0x0e41},
03368 {
03369 0x0de2, 0x0e42},
03370 {
03371 0x0de3, 0x0e43},
03372 {
03373 0x0de4, 0x0e44},
03374 {
03375 0x0de5, 0x0e45},
03376 {
03377 0x0de6, 0x0e46},
03378 {
03379 0x0de7, 0x0e47},
03380 {
03381 0x0de8, 0x0e48},
03382 {
03383 0x0de9, 0x0e49},
03384 {
03385 0x0dea, 0x0e4a},
03386 {
03387 0x0deb, 0x0e4b},
03388 {
03389 0x0dec, 0x0e4c},
03390 {
03391 0x0ded, 0x0e4d},
03392 {
03393 0x0df0, 0x0e50},
03394 {
03395 0x0df1, 0x0e51},
03396 {
03397 0x0df2, 0x0e52},
03398 {
03399 0x0df3, 0x0e53},
03400 {
03401 0x0df4, 0x0e54},
03402 {
03403 0x0df5, 0x0e55},
03404 {
03405 0x0df6, 0x0e56},
03406 {
03407 0x0df7, 0x0e57},
03408 {
03409 0x0df8, 0x0e58},
03410 {
03411 0x0df9, 0x0e59},
03412 {
03413 0x0ed4, 0x11a8},
03414 {
03415 0x0ed5, 0x11a9},
03416 {
03417 0x0ed6, 0x11aa},
03418 {
03419 0x0ed7, 0x11ab},
03420 {
03421 0x0ed8, 0x11ac},
03422 {
03423 0x0ed9, 0x11ad},
03424 {
03425 0x0eda, 0x11ae},
03426 {
03427 0x0edb, 0x11af},
03428 {
03429 0x0edc, 0x11b0},
03430 {
03431 0x0edd, 0x11b1},
03432 {
03433 0x0ede, 0x11b2},
03434 {
03435 0x0edf, 0x11b3},
03436 {
03437 0x0ee0, 0x11b4},
03438 {
03439 0x0ee1, 0x11b5},
03440 {
03441 0x0ee2, 0x11b6},
03442 {
03443 0x0ee3, 0x11b7},
03444 {
03445 0x0ee4, 0x11b8},
03446 {
03447 0x0ee5, 0x11b9},
03448 {
03449 0x0ee6, 0x11ba},
03450 {
03451 0x0ee7, 0x11bb},
03452 {
03453 0x0ee8, 0x11bc},
03454 {
03455 0x0ee9, 0x11bd},
03456 {
03457 0x0eea, 0x11be},
03458 {
03459 0x0eeb, 0x11bf},
03460 {
03461 0x0eec, 0x11c0},
03462 {
03463 0x0eed, 0x11c1},
03464 {
03465 0x0eee, 0x11c2},
03466 {
03467 0x0ef8, 0x11eb},
03468 {
03469 0x0efa, 0x11f9},
03470 {
03471 0x0aa2, 0x2002},
03472 {
03473 0x0aa1, 0x2003},
03474 {
03475 0x0aa3, 0x2004},
03476 {
03477 0x0aa4, 0x2005},
03478 {
03479 0x0aa5, 0x2007},
03480 {
03481 0x0aa6, 0x2008},
03482 {
03483 0x0aa7, 0x2009},
03484 {
03485 0x0aa8, 0x200a},
03486 {
03487 0x0abb, 0x2012},
03488 {
03489 0x0aaa, 0x2013},
03490 {
03491 0x0aa9, 0x2014},
03492 {
03493 0x07af, 0x2015},
03494 {
03495 0x0cdf, 0x2017},
03496 {
03497 0x0ad0, 0x2018},
03498 {
03499 0x0ad1, 0x2019},
03500 {
03501 0x0afd, 0x201a},
03502 {
03503 0x0ad2, 0x201c},
03504 {
03505 0x0ad3, 0x201d},
03506 {
03507 0x0afe, 0x201e},
03508 {
03509 0x0af1, 0x2020},
03510 {
03511 0x0af2, 0x2021},
03512 {
03513 0x0ae6, 0x2022},
03514 {
03515 0x0aae, 0x2026},
03516 {
03517 0x0ad6, 0x2032},
03518 {
03519 0x0ad7, 0x2033},
03520 {
03521 0x0afc, 0x2038},
03522 {
03523 0x047e, 0x203e},
03524 {
03525 0x20a0, 0x20a0},
03526 {
03527 0x20a1, 0x20a1},
03528 {
03529 0x20a2, 0x20a2},
03530 {
03531 0x20a3, 0x20a3},
03532 {
03533 0x20a4, 0x20a4},
03534 {
03535 0x20a5, 0x20a5},
03536 {
03537 0x20a6, 0x20a6},
03538 {
03539 0x20a7, 0x20a7},
03540 {
03541 0x20a8, 0x20a8},
03542 {
03543 0x0eff, 0x20a9},
03544 {
03545 0x20a9, 0x20a9},
03546 {
03547 0x20aa, 0x20aa},
03548 {
03549 0x20ab, 0x20ab},
03550 {
03551 0x20ac, 0x20ac},
03552 {
03553 0x0ab8, 0x2105},
03554 {
03555 0x06b0, 0x2116},
03556 {
03557 0x0afb, 0x2117},
03558 {
03559 0x0ad4, 0x211e},
03560 {
03561 0x0ac9, 0x2122},
03562 {
03563 0x0ab0, 0x2153},
03564 {
03565 0x0ab1, 0x2154},
03566 {
03567 0x0ab2, 0x2155},
03568 {
03569 0x0ab3, 0x2156},
03570 {
03571 0x0ab4, 0x2157},
03572 {
03573 0x0ab5, 0x2158},
03574 {
03575 0x0ab6, 0x2159},
03576 {
03577 0x0ab7, 0x215a},
03578 {
03579 0x0ac3, 0x215b},
03580 {
03581 0x0ac4, 0x215c},
03582 {
03583 0x0ac5, 0x215d},
03584 {
03585 0x0ac6, 0x215e},
03586 {
03587 0x08fb, 0x2190},
03588 {
03589 0x08fc, 0x2191},
03590 {
03591 0x08fd, 0x2192},
03592 {
03593 0x08fe, 0x2193},
03594 {
03595 0x08ce, 0x21d2},
03596 {
03597 0x08cd, 0x21d4},
03598 {
03599 0x08ef, 0x2202},
03600 {
03601 0x08c5, 0x2207},
03602 {
03603 0x0bca, 0x2218},
03604 {
03605 0x08d6, 0x221a},
03606 {
03607 0x08c1, 0x221d},
03608 {
03609 0x08c2, 0x221e},
03610 {
03611 0x08de, 0x2227},
03612 {
03613 0x0ba9, 0x2227},
03614 {
03615 0x08df, 0x2228},
03616 {
03617 0x0ba8, 0x2228},
03618 {
03619 0x08dc, 0x2229},
03620 {
03621 0x0bc3, 0x2229},
03622 {
03623 0x08dd, 0x222a},
03624 {
03625 0x0bd6, 0x222a},
03626 {
03627 0x08bf, 0x222b},
03628 {
03629 0x08c0, 0x2234},
03630 {
03631 0x08c8, 0x2245},
03632 {
03633 0x08bd, 0x2260},
03634 {
03635 0x08cf, 0x2261},
03636 {
03637 0x08bc, 0x2264},
03638 {
03639 0x08be, 0x2265},
03640 {
03641 0x08da, 0x2282},
03642 {
03643 0x0bda, 0x2282},
03644 {
03645 0x08db, 0x2283},
03646 {
03647 0x0bd8, 0x2283},
03648 {
03649 0x0bfc, 0x22a2},
03650 {
03651 0x0bdc, 0x22a3},
03652 {
03653 0x0bc2, 0x22a4},
03654 {
03655 0x0bce, 0x22a5},
03656 {
03657 0x0bd3, 0x2308},
03658 {
03659 0x0bc4, 0x230a},
03660 {
03661 0x0afa, 0x2315},
03662 {
03663 0x08a4, 0x2320},
03664 {
03665 0x08a5, 0x2321},
03666 {
03667 0x0abc, 0x2329},
03668 {
03669 0x0abe, 0x232a},
03670 {
03671 0x0bcc, 0x2395},
03672 {
03673 0x09e2, 0x2409},
03674 {
03675 0x09e5, 0x240a},
03676 {
03677 0x09e9, 0x240b},
03678 {
03679 0x09e3, 0x240c},
03680 {
03681 0x09e4, 0x240d},
03682 {
03683 0x09df, 0x2422},
03684 {
03685 0x09e8, 0x2424},
03686 {
03687 0x09f1, 0x2500},
03688 {
03689 0x08a6, 0x2502},
03690 {
03691 0x09f8, 0x2502},
03692 {
03693 0x09ec, 0x250c},
03694 {
03695 0x09eb, 0x2510},
03696 {
03697 0x09ed, 0x2514},
03698 {
03699 0x09ea, 0x2518},
03700 {
03701 0x09f4, 0x251c},
03702 {
03703 0x09f5, 0x2524},
03704 {
03705 0x09f7, 0x252c},
03706 {
03707 0x09f6, 0x2534},
03708 {
03709 0x09ee, 0x253c},
03710 {
03711 0x09e1, 0x2592},
03712 {
03713 0x0adf, 0x25a0},
03714 {
03715 0x0acf, 0x25a1},
03716 {
03717 0x0ae7, 0x25aa},
03718 {
03719 0x0ae1, 0x25ab},
03720 {
03721 0x0adb, 0x25ac},
03722 {
03723 0x0ae2, 0x25ad},
03724 {
03725 0x0ae8, 0x25b2},
03726 {
03727 0x0ae3, 0x25b3},
03728 {
03729 0x0add, 0x25b6},
03730 {
03731 0x0acd, 0x25b7},
03732 {
03733 0x0ae9, 0x25bc},
03734 {
03735 0x0ae4, 0x25bd},
03736 {
03737 0x0adc, 0x25c0},
03738 {
03739 0x0acc, 0x25c1},
03740 {
03741 0x09e0, 0x25c6},
03742 {
03743 0x0ace, 0x25cb},
03744 {
03745 0x0bcf, 0x25cb},
03746 {
03747 0x0ade, 0x25cf},
03748 {
03749 0x0ae0, 0x25e6},
03750 {
03751 0x0ae5, 0x2606},
03752 {
03753 0x0af9, 0x260e},
03754 {
03755 0x0aca, 0x2613},
03756 {
03757 0x0aea, 0x261c},
03758 {
03759 0x0aeb, 0x261e},
03760 {
03761 0x0af8, 0x2640},
03762 {
03763 0x0af7, 0x2642},
03764 {
03765 0x0aec, 0x2663},
03766 {
03767 0x0aee, 0x2665},
03768 {
03769 0x0aed, 0x2666},
03770 {
03771 0x0af6, 0x266d},
03772 {
03773 0x0af5, 0x266f},
03774 {
03775 0x0af3, 0x2713},
03776 {
03777 0x0af4, 0x2717},
03778 {
03779 0x0ad9, 0x271d},
03780 {
03781 0x0af0, 0x2720},
03782 {
03783 0x04a4, 0x3001},
03784 {
03785 0x04a1, 0x3002},
03786 {
03787 0x04a2, 0x300c},
03788 {
03789 0x04a3, 0x300d},
03790 {
03791 0x04de, 0x309b},
03792 {
03793 0x04df, 0x309c},
03794 {
03795 0x04a7, 0x30a1},
03796 {
03797 0x04b1, 0x30a2},
03798 {
03799 0x04a8, 0x30a3},
03800 {
03801 0x04b2, 0x30a4},
03802 {
03803 0x04a9, 0x30a5},
03804 {
03805 0x04b3, 0x30a6},
03806 {
03807 0x04aa, 0x30a7},
03808 {
03809 0x04b4, 0x30a8},
03810 {
03811 0x04ab, 0x30a9},
03812 {
03813 0x04b5, 0x30aa},
03814 {
03815 0x04b6, 0x30ab},
03816 {
03817 0x04b7, 0x30ad},
03818 {
03819 0x04b8, 0x30af},
03820 {
03821 0x04b9, 0x30b1},
03822 {
03823 0x04ba, 0x30b3},
03824 {
03825 0x04bb, 0x30b5},
03826 {
03827 0x04bc, 0x30b7},
03828 {
03829 0x04bd, 0x30b9},
03830 {
03831 0x04be, 0x30bb},
03832 {
03833 0x04bf, 0x30bd},
03834 {
03835 0x04c0, 0x30bf},
03836 {
03837 0x04c1, 0x30c1},
03838 {
03839 0x04af, 0x30c3},
03840 {
03841 0x04c2, 0x30c4},
03842 {
03843 0x04c3, 0x30c6},
03844 {
03845 0x04c4, 0x30c8},
03846 {
03847 0x04c5, 0x30ca},
03848 {
03849 0x04c6, 0x30cb},
03850 {
03851 0x04c7, 0x30cc},
03852 {
03853 0x04c8, 0x30cd},
03854 {
03855 0x04c9, 0x30ce},
03856 {
03857 0x04ca, 0x30cf},
03858 {
03859 0x04cb, 0x30d2},
03860 {
03861 0x04cc, 0x30d5},
03862 {
03863 0x04cd, 0x30d8},
03864 {
03865 0x04ce, 0x30db},
03866 {
03867 0x04cf, 0x30de},
03868 {
03869 0x04d0, 0x30df},
03870 {
03871 0x04d1, 0x30e0},
03872 {
03873 0x04d2, 0x30e1},
03874 {
03875 0x04d3, 0x30e2},
03876 {
03877 0x04ac, 0x30e3},
03878 {
03879 0x04d4, 0x30e4},
03880 {
03881 0x04ad, 0x30e5},
03882 {
03883 0x04d5, 0x30e6},
03884 {
03885 0x04ae, 0x30e7},
03886 {
03887 0x04d6, 0x30e8},
03888 {
03889 0x04d7, 0x30e9},
03890 {
03891 0x04d8, 0x30ea},
03892 {
03893 0x04d9, 0x30eb},
03894 {
03895 0x04da, 0x30ec},
03896 {
03897 0x04db, 0x30ed},
03898 {
03899 0x04dc, 0x30ef},
03900 {
03901 0x04a6, 0x30f2},
03902 {
03903 0x04dd, 0x30f3},
03904 {
03905 0x04a5, 0x30fb},
03906 {
03907 0x04b0, 0x30fc},
03908 {
03909 0x0ea1, 0x3131},
03910 {
03911 0x0ea2, 0x3132},
03912 {
03913 0x0ea3, 0x3133},
03914 {
03915 0x0ea4, 0x3134},
03916 {
03917 0x0ea5, 0x3135},
03918 {
03919 0x0ea6, 0x3136},
03920 {
03921 0x0ea7, 0x3137},
03922 {
03923 0x0ea8, 0x3138},
03924 {
03925 0x0ea9, 0x3139},
03926 {
03927 0x0eaa, 0x313a},
03928 {
03929 0x0eab, 0x313b},
03930 {
03931 0x0eac, 0x313c},
03932 {
03933 0x0ead, 0x313d},
03934 {
03935 0x0eae, 0x313e},
03936 {
03937 0x0eaf, 0x313f},
03938 {
03939 0x0eb0, 0x3140},
03940 {
03941 0x0eb1, 0x3141},
03942 {
03943 0x0eb2, 0x3142},
03944 {
03945 0x0eb3, 0x3143},
03946 {
03947 0x0eb4, 0x3144},
03948 {
03949 0x0eb5, 0x3145},
03950 {
03951 0x0eb6, 0x3146},
03952 {
03953 0x0eb7, 0x3147},
03954 {
03955 0x0eb8, 0x3148},
03956 {
03957 0x0eb9, 0x3149},
03958 {
03959 0x0eba, 0x314a},
03960 {
03961 0x0ebb, 0x314b},
03962 {
03963 0x0ebc, 0x314c},
03964 {
03965 0x0ebd, 0x314d},
03966 {
03967 0x0ebe, 0x314e},
03968 {
03969 0x0ebf, 0x314f},
03970 {
03971 0x0ec0, 0x3150},
03972 {
03973 0x0ec1, 0x3151},
03974 {
03975 0x0ec2, 0x3152},
03976 {
03977 0x0ec3, 0x3153},
03978 {
03979 0x0ec4, 0x3154},
03980 {
03981 0x0ec5, 0x3155},
03982 {
03983 0x0ec6, 0x3156},
03984 {
03985 0x0ec7, 0x3157},
03986 {
03987 0x0ec8, 0x3158},
03988 {
03989 0x0ec9, 0x3159},
03990 {
03991 0x0eca, 0x315a},
03992 {
03993 0x0ecb, 0x315b},
03994 {
03995 0x0ecc, 0x315c},
03996 {
03997 0x0ecd, 0x315d},
03998 {
03999 0x0ece, 0x315e},
04000 {
04001 0x0ecf, 0x315f},
04002 {
04003 0x0ed0, 0x3160},
04004 {
04005 0x0ed1, 0x3161},
04006 {
04007 0x0ed2, 0x3162},
04008 {
04009 0x0ed3, 0x3163},
04010 {
04011 0x0eef, 0x316d},
04012 {
04013 0x0ef0, 0x3171},
04014 {
04015 0x0ef1, 0x3178},
04016 {
04017 0x0ef2, 0x317f},
04018 {
04019 0x0ef4, 0x3184},
04020 {
04021 0x0ef5, 0x3186},
04022 {
04023 0x0ef6, 0x318d},
04024 {
04025 0x0ef7, 0x318e},
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
04035 if ((ucs >= 0x0020 && ucs <= 0x007e) ||
04036 (ucs >= 0x00a0 && ucs <= 0x00ff))
04037 return ucs;
04038
04039
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
04048 return u2ktab[mid].keysym;
04049 }
04050 }
04051
04052
04053
04054
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
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
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 {
04152
04153 event->key.keyval = GDK_VoidSymbol;
04154 if (xevent->wParam & 0xFF00) {
04155
04156
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
04168
04169
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
04182
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
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
04229 switch (len) {
04230 case 3:
04231 bp[2] = (c & 0x3f) | 0x80;
04232 c >>= 6;
04233 case 2:
04234 bp[1] = (c & 0x3f) | 0x80;
04235 c >>= 6;
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;
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
04469
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
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
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
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
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
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
04658 if (((GdkWindowPrivate *) * window)->parent == gdk_parent_root) {
04659
04660 if (grab_window != NULL) {
04661
04662 GDK_NOTE(EVENTS, g_print("...undelivered, but grabbed\n"));
04663 if ((*doesnt_want_it) (grab_mask, xevent)) {
04664
04665 GDK_NOTE(EVENTS,
04666 g_print("...grabber doesn't want it\n"));
04667 return FALSE;
04668 } else {
04669
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
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
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
04809
04810
04811
04812
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
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;
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
04890
04891
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;
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;
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
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
05000 if (xevent->wParam == VK_TAB
05001 || xevent->wParam == VK_RETURN || xevent->wParam == VK_F4)
05002 break;
05003
05004 if (!(xevent->lParam & 0x20000000))
05005 break;
05006 #if 0
05007
05008 if (xevent->wParam == VK_MENU)
05009 break;
05010 #endif
05011
05012 goto keyup_or_down;
05013
05014 case WM_KEYUP:
05015 case WM_KEYDOWN:
05016
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
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
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
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
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
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
05156
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
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
05172 ignore_WM_CHAR = FALSE;
05173 break;
05174 case VK_DECIMAL:
05175
05176
05177
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
05245
05246
05247
05248 event->key.keyval = GDK_0 + (xevent->wParam - '0');
05249 else
05250 ignore_WM_CHAR = FALSE;
05251 break;
05252 case VK_OEM_PLUS:
05253
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
05265
05266
05267
05268
05269
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
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
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
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
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
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
05440
05441
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
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
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
05459 build_keypress_event(GDK_WINDOW_WIN32DATA(window), event, xevent);
05460 } else {
05461 return_val = FALSE;
05462 }
05463 #if 0
05464
05465
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
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
05516 if (!p_grab_window) {
05517
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
05748
05749
05750
05751
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
05775 if (!p_grab_window &&
05776 is_grabbed_button(&window, 0, GDK_ALL_EVENTS_MASK, xevent->time)) {
05777
05778
05779
05780
05781
05782
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
05902
05903
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
06056
06057
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
06235
06236
06237
06238
06239
06240
06241
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
06275
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
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;
06336 event1->client.data.l[4] = 0;
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
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;
06388
06389 if (window != NULL)
06390 gdk_window_destroy_notify(window);
06391
06392 break;
06393
06394 #ifdef HAVE_WINTAB
06395
06396
06397
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
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
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
06535 gboolean gdk_event_send_client_message(GdkEvent * event, guint32 xid)
06536 {
06537
06538 return FALSE;
06539 }
06540
06541 void gdk_event_send_clientmessage_toall(GdkEvent * event)
06542 {
06543
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