1{%MainUnit customdrawnwsforms.pp}
2
3// redefines:
4// The version from FreePascal crash except in FPC 2.7.1+ from 10 Dec 2011 +
5function XmbLookupString(p1: PXIC; ev: PXKeyPressedEvent; str: PChar; len: longword; ks: PKeySym; stat: PStatus): longint; cdecl; external;
6function Xutf8LookupString(p1: PXIC; ev: PXKeyPressedEvent; str: PChar; len: longword; ks: PKeySym; stat: PStatus): longint; cdecl; external;
7
8{ TCDWSCustomForm }
9
10class procedure TCDWSCustomForm.UpdateMotifWMHints(const AWinControl: TWinControl; CanMaximize: Boolean);
11type
12  PMotifWmHints = ^TMotifWmHints;
13  TMotifWmHints = packed record
14    Flags, Functions, Decorations: LongWord;
15    InputMode: LongInt;
16    Status: LongWord;
17  end;
18const
19  MWM_HINTS_FUNCTIONS = 1;
20  MWM_HINTS_DECORATIONS = 2;
21  FuncAll = 1;
22  FuncResize = 2;
23  FuncMove = 4;
24  FuncMinimize = 8;
25  FuncMaximize = 16;
26  FuncClose = 32;
27  DecorAll = 1;
28  DecorBorder = 2;
29  DecorResizeH = 4;
30  DecorTitle = 8;
31  DecorMenu = 16;
32  DecorMinimize = 32;
33  DecorMaximize = 64;
34var
35  PropType: TAtom;
36  PropFormat: LongInt;
37  PropItemCount, PropBytesAfter: LongWord;
38  Hints: PMotifWmHints;
39  NewHints: TMotifWmHints;
40  lWindow: TWindow;
41  lWindowInfo: TX11WindowInfo;
42begin
43  lWindowInfo := TX11WindowInfo(AWinControl.Handle);
44  lWindow := lWindowInfo.Window;
45
46  if CDWidgetSet.FWMHints = 0 then
47    CDWidgetSet.FWMHints :=
48      XInternAtom(CDWidgetSet.FDisplay, '_MOTIF_WM_HINTS', False);
49
50  XGetWindowProperty(CDWidgetSet.FDisplay, lWindow,
51    CDWidgetSet.FWMHints, 0, 5, False, AnyPropertyType, @PropType,
52    @PropFormat, @PropItemCount, @PropBytesAfter, @Hints);
53
54  NewHints.Flags := MWM_HINTS_FUNCTIONS or MWM_HINTS_DECORATIONS;
55  NewHints.Functions := FuncResize or FuncMove or FuncMinimize or FuncClose;
56
57  if {(woToolWindow in WindowOptions) or (woWindow in WindowOptions) or
58   (woPopup in WindowOptions)}True then
59    NewHints.Decorations := DecorBorder or DecorTitle or DecorMenu or DecorMinimize
60  else
61    NewHints.Decorations := 0;
62  if CanMaximize then
63  begin
64    NewHints.Functions := NewHints.Functions or FuncMaximize;
65    NewHints.Decorations := NewHints.Decorations or DecorMaximize;
66  end;
67
68  if Assigned(Hints) then
69  begin
70    Hints^.Flags := Hints^.Flags or NewHints.Flags;
71    Hints^.Decorations := NewHints.Decorations;
72    Hints^.Functions := NewHints.Functions;
73  end else
74    Hints := @NewHints;
75
76  XChangeProperty(CDWidgetSet.FDisplay, lWindow,
77    CDWidgetSet.FWMHints, CDWidgetSet.FWMHints,
78    32, PropModeReplace, Pointer(Hints), 5);
79  if Hints <> @NewHints then
80    XFree(Hints);
81end;
82
83class procedure TCDWSCustomForm.SetPosition(const AWinControl: TWinControl; const APosition: TPoint);
84var
85  Supplied: PtrInt;
86  SizeHints: PXSizeHints;
87
88  dx, dy: integer;
89  lx, ly: integer;
90  cw : PWindow;
91  lWindow: TWindow;
92  lWindowInfo: TX11WindowInfo;
93begin
94  lWindowInfo := TX11WindowInfo(AWinControl.Handle);
95  lWindow := lWindowInfo.Window;
96
97  if AWinControl.Parent = nil then
98  begin
99    {$Note This doesn't work yet. I want to position a new window relative to
100      another window. Used for popup windows, like the TComboBox dropdown. }
101    {$IFDEF DEBUG} writeln('SetPosition with no Parent'); {$ENDIF}
102    lx := APosition.x;
103    ly := APosition.y;
104
105    {---------------------------------------------------------------------------
106    We must not call XTranslate:
107    if applied to the root window, this makes X crazy, because it attempts
108    to translate the coordinates to themselves.
109    If applied to another window, it's wrong, because window position has already
110    been determined by LCL
111    ---------------------------------------------------------------------------}
112    {XTranslateCoordinates(CDWidgetSet.FDisplay, lWindow,
113        XDefaultRootWindow(CDWidgetSet.FDisplay),
114        lx, ly, @dx, @dy, @cw);
115    lx := dx;
116    ly := dy;}
117  end
118  else
119  begin
120    {$IFDEF DEBUG} writeln('SetPosition inside parent'); {$ENDIF}
121    lx := APosition.x;
122    ly := APosition.y;
123  end;
124  {$IFDEF DEBUG} Writeln(Format('was (%d,%d) and is now (%d,%d)', [APosition.x, APosition.y, lx, ly])); {$ENDIF}
125
126  SizeHints := XAllocSizeHints;
127  XGetWMNormalHints(CDWidgetSet.FDisplay, lWindow, SizeHints, @Supplied);
128  SizeHints^.flags := SizeHints^.flags or PPosition;
129  SizeHints^.x := lx;
130  SizeHints^.y := ly;
131  XSetWMNormalHints(CDWidgetSet.FDisplay, lWindow, SizeHints);
132  XFree(SizeHints);
133  XMoveWindow(CDWidgetSet.FDisplay, lWindow, lx, ly);
134end;
135
136class procedure TCDWSCustomForm.SetSize(const AWinControl: TWinControl; const ASize: TSize);
137var
138  ChangeMask: Cardinal;
139  Changes: TXWindowChanges;
140  lWindow: TWindow;
141  lWindowInfo: TX11WindowInfo;
142begin
143  lWindowInfo := TX11WindowInfo(AWinControl.Handle);
144  lWindow := lWindowInfo.Window;
145
146  ChangeMask := CWWidth or CWHeight;
147  Changes.Width := ASize.cx;
148  Changes.Height := ASize.cy;
149
150  if ChangeMask <> 0 then
151    XConfigureWindow(CDWidgetSet.FDisplay, lWindow, ChangeMask, @Changes);
152end;
153
154class procedure TCDWSCustomForm.SetMinMaxSize(const AWinControl: TWinControl; const AMinSize, AMaxSize: TSize);
155var
156  Supplied: PtrInt;
157  SizeHints: PXSizeHints;
158  CanMaximize: Boolean;
159  lWindow: TWindow;
160  lWindowInfo: TX11WindowInfo;
161begin
162  lWindowInfo := TX11WindowInfo(AWinControl.Handle);
163  lWindow := lWindowInfo.Window;
164
165  CanMaximize := (AMaxSize.cx = 0) or (AMaxSize.cy = 0) or
166    (AMaxSize.cx > AMinSize.cx) or (AMaxSize.cy > AMinSize.cy);
167  UpdateMotifWMHints(AWinControl, CanMaximize);
168
169  SizeHints := XAllocSizeHints;
170  XGetWMNormalHints(CDWidgetSet.FDisplay, lWindow, SizeHints, @Supplied);
171  with SizeHints^ do
172  begin
173    if (AMinSize.cx > 0) or (AMinSize.cy > 0) then
174    begin
175      flags := flags or PMinSize;
176      min_width := AMinSize.cx;
177      min_height := AMinSize.cy;
178    end else
179      flags := flags and not PMinSize;
180
181    if (AMaxSize.cx > 0) or (AMaxSize.cy > 0) then
182    begin
183      flags := flags or PMaxSize;
184      if AMaxSize.cx > 0 then
185        max_width := AMaxSize.cx
186      else
187        max_width := 32767;
188      if AMaxSize.cy > 0 then
189        max_height := AMaxSize.cy
190      else
191        max_height := 32767;
192    end else
193      flags := flags and not PMaxSize;
194  end;
195
196  XSetWMNormalHints(CDWidgetSet.FDisplay, lWindow, SizeHints);
197  XFree(SizeHints);
198end;
199
200class procedure TCDWSCustomForm.CreateX11Canvas(AWindowInfo: TX11WindowInfo);
201var
202  DummyWnd: PWindow;
203  DummyInt: LongInt;
204  GCValues: XLib.TXGCValues;
205  FWidth, FHeight: Integer;
206begin
207  XGetGeometry(CDWidgetSet.FDisplay, AWindowInfo.Window, @DummyWnd, @DummyInt, @DummyInt,
208    @FWidth, @FHeight, @DummyInt, @DummyInt);
209
210  GCValues.graphics_exposures := 0;
211  AWindowInfo.GC := XCreateGC(CDWidgetSet.FDisplay, AWindowInfo.Window, GCGraphicsExposures, @GCValues);
212  {$ifdef CD_X11_SmartPaint}
213  AWindowInfo.Valid:= False; // Need Paint
214  AWindowInfo.Moved:= False; // And not move
215  {$endif}
216//  if not Assigned(GC) then
217//    raise EX11Error.Create(SGCCreationFailed);
218
219//  XSetLineAttributes(GFApplication.Handle, GC, 0,
220//    LineSolid, CapNotLast, JoinMiter);
221
222//  FFont := AFont;
223//  FXftDraw := XftDrawCreate(CDWidgetSet.FDisplay, AWindowInfo.Window,
224//    XDefaultVisual(CDWidgetSet.FDisplay, XDefaultScreen(CDWidgetSet.FDisplay)),
225//    XDefaultColormap(CDWidgetSet.FDisplay, XDefaultScreen(CDWidgetSet.FDisplay)));
226
227//  FRegion := XCreateRegion;
228//  Resized(Width, Height);	// Set up a proper clipping region
229
230  //
231
232{  XGetWindowAttributes(CDWidgetSet.FDisplay, AWindowInfo.Window, @Attr);
233  FVisual := Attr.Visual;
234
235  case Attr.Depth of
236    1: PixelFormat.FormatType := ftMono;
237    4: PixelFormat.FormatType := ftPal4;
238    8: PixelFormat.FormatType := ftPal8;
239    16: PixelFormat.FormatType := ftRGB16;
240    24: PixelFormat.FormatType := ftRGB24;
241    32: PixelFormat.FormatType := ftRGB32;
242    else
243      raise EX11Error.CreateFmt(SWindowUnsupportedPixelFormat, [Attr.Depth]);
244  end;
245
246  if Attr.Depth >= 16 then
247  begin
248    PixelFormat.RedMask   := Visual^.red_mask;
249    PixelFormat.GreenMask := Visual^.green_mask;
250    PixelFormat.BlueMask  := Visual^.blue_mask;
251  end;}
252end;
253
254(*
255 * Error handling.
256 */
257static int ErrorFlag = 0;
258  static int HandleXError( Display *dpy, XErrorEvent *event )
259  {
260      ErrorFlag = 1;
261      return 0;
262  *)
263
264{
265 There are 2 ways to put an image into a X11 Window which everyone uses, even OpenGL:
266
267 XPutImage and XShmPutImage
268
269 Because XPutImage is so slow as to be unusable, we will always try to use XShmPutImage
270}
271class procedure TCDWSCustomForm.DrawRawImageToGC(ARawImage: TRawImage;
272  ADestWindowInfo: TX11WindowInfo; ADestX, ADestY, ADestWidth, ADestHeight: Integer);
273var
274  UsePutImage: Boolean = False;
275  major, minor, ignore: cint;
276  {$IFDEF VerboseCDPaintProfiler}
277  lTimeStart: TDateTime;
278  {$ENDIF}
279  pixmaps: cint;
280begin
281  {$IFDEF VerboseCDPaintProfiler}
282  lTimeStart := NowUTC();
283  {$ENDIF}
284
285  // First check if XShm is available
286  UsePutImage := True;
287{  if not XQueryExtension(CDWidgetSet.FDisplay, 'MIT-SHM', @ignore, @ignore, @ignore) then UsePutImage := True
288  else if not XShmQueryVersion(CDWidgetSet.FDisplay, @major, @minor, @pixmaps) then UsePutImage := True;
289  if pixmaps <> 2 then UsePutImage := True;}
290
291  if UsePutImage then DrawRawImageToGC_XPutImage(ARawImage, ADestWindowInfo, ADestX, ADestY, ADestWidth, ADestHeight)
292  else DrawRawImageToGC_XShmPutImage(ARawImage, ADestWindowInfo, ADestX, ADestY, ADestWidth, ADestHeight);
293
294  {$IFDEF VerboseCDPaintProfiler}
295  DebugLn(Format('[TCDWSCustomForm.DrawRawImageToGC] Paint duration: %d ms', [DateTimeToMilliseconds(NowUTC() - lTimeStart)]));
296  {$ENDIF}
297end;
298
299// XShm tutorial:
300// http://personales.mundivia.es/jap/xshm.htm
301class function TCDWSCustomForm.alloc_xshm_image(dpy: PDisplay; vis: PVisual;
302  width, height, depth: Integer; out shminfo: TXShmSegmentInfo): PXImage;
303var
304  img: XLib.PXImage;
305  ctx: TGC;
306begin
307  Result := nil;
308
309  {
310  * We have to do a _lot_ of error checking here to be sure we can
311  * really use the XSHM extension.  It seems different servers trigger
312  * errors at different points if the extension won't work.  Therefore
313  * we have to be very careful...
314  }
315
316  img := XShmCreateImage(dpy, vis, depth,
317                        ZPixmap, nil, @shminfo,
318                        width, height );
319  if (img = nil) then
320  begin
321   DebugLn('XShmCreateImage failed!');
322   Exit;
323  end;
324
325(*  shminfo.shmid := shmget( IPC_PRIVATE, img^.bytes_per_line
326  		       * img->height, IPC_CREAT or 0777 );
327  if (shminfo.shmid < 0) then
328  begin
329   DebugLn('error in shmget. alloc_back_buffer: Shared memory error (shmget), disabling.');
330   XDestroyImage( img );
331   //c->shm = 0;
332   Exit;
333  end;
334
335  img^.data := shmat( shminfo.shmid, 0, 0 );
336  shminfo.shmaddr := img^.data;
337  (*   if (shminfo.shmaddr == (char * ) -1) {
338    perror("alloc_back_buffer");
339    XDestroyImage( img );
340    img = NULL;
341    printf("shmat failed\n");
342    return NULL;
343  }
344
345  shminfo.readOnly = False;
346  ErrorFlag = 0;
347  XSetErrorHandler( HandleXError );
348  // This may trigger the X protocol error we're ready to catch: */
349  XShmAttach( dpy, &shminfo );
350  XSync( dpy, False );
351
352  if (ErrorFlag) {
353    /* we are on a remote display, this error is normal, don't print it */
354    XFlush( dpy );
355    ErrorFlag = 0;
356    XDestroyImage( img );
357    shmdt( shminfo.shmaddr );
358    shmctl( shminfo.shmid, IPC_RMID, 0 );
359    return NULL;
360  }
361
362  shmctl( shminfo.shmid, IPC_RMID, 0 ); // nobody else needs it*)*)
363
364(*#ifdef OPTIONAL_PART
365   /* An error may still occur upon the first XShmPutImage.  So it's a */
366   /* good idea to test it here.  However, we need a window to put the */
367   /* image into, etc.... */
368   gc = XCreateGC( dpy, window, 0, NULL );
369   XShmPutImage( dpy, window, gc,
370  	       img, 0, 0, 0, 0, 1, 1 /*one pixel*/, False );
371   XSync( dpy, False );
372   XFreeGC( dpy, gc );
373   XSetErrorHandler( NULL );
374   if (ErrorFlag) {
375      XFlush( dpy );
376      ErrorFlag = 0;
377      XDestroyImage( img );
378      shmdt( shminfo.shmaddr );
379      shmctl( shminfo.shmid, IPC_RMID, 0 );
380      return NULL;
381   }
382#endif*)
383
384  Result := img;
385end;
386
387class procedure TCDWSCustomForm.destroy_xshm_image(img: PXImage; var shminfo: TXShmSegmentInfo);
388begin
389   XShmDetach(CDWidgetSet.FDisplay, @shminfo );
390   XDestroyImage( img );
391//   shmdt( shminfo.shmaddr );
392end;
393
394class procedure TCDWSCustomForm.DrawRawImageToGC_XShmPutImage(ARawImage: TRawImage;
395  ADestWindowInfo: TX11WindowInfo; ADestX, ADestY, ADestWidth, ADestHeight: Integer);
396var
397  img: XLib.PXImage;
398  shminfo: TXShmSegmentInfo;
399begin
400  // make shared XImage
401  img := alloc_xshm_image(CDWidgetSet.FDisplay, ADestWindowInfo.Attr.visual, ADestWidth, ADestHeight, ADestWindowInfo.ColorDepth, shminfo);
402  if (img = nil) then
403  begin
404    DebugLn('[TCDWSCustomForm.DrawRawImageToGC_XShmPutImage] couldn''t allocate shared XImage');
405    Exit;
406  end;
407
408  // Now you can render into the img->data buffer
409  // ???
410
411  // Draw the image in the window
412  XShmPutImage(CDWidgetSet.FDisplay, ADestWindowInfo.Window, ADestWindowInfo.GC,
413    img, 0, 0, ADestX, ADestY, ADestWidth, ADestHeight, False);
414
415  // Destroy image
416  destroy_xshm_image(img, shminfo);
417end;
418
419class procedure TCDWSCustomForm.DrawRawImageToGC_XPutImage(ARawImage: TRawImage;
420  ADestWindowInfo: TX11WindowInfo; ADestX, ADestY, ADestWidth, ADestHeight: Integer);
421var
422  Image: XLib.PXImage;
423  XImage: XLib.TXImage;
424  lScanlineSize: cint;
425  lScreen: cint;
426  lVisual: PVisual;
427  lDepth: cint;
428begin
429  lScanlineSize := (ADestWindowInfo.Canvas.Width*ADestWindowInfo.ColorDepth) div 8;
430  lScreen := DefaultScreen(CDWidgetSet.FDisplay);
431  lVisual := {DefaultVisual(CDWidgetSet.FDisplay, lScreen); //} ADestWindowInfo.Attr.Visual;
432  lDepth := ADestWindowInfo.ColorDepth;
433
434  XImage.Width := ADestWidth;
435  XImage.Height := ADestHeight;
436  XImage.xoffset        := 0;
437  XImage.obdata         := #0;
438  XImage.byte_order     := LSBFirst;
439  XImage.bitmap_bit_order := MSBFirst;
440  XImage.bitmap_pad     := 32;
441  XImage.bytes_per_line := 0;
442
443  {     if acolordepth = 1 then
444       begin
445         format         := XYBitmap;
446         bitmap_unit    := 8;
447         depth          := 1;
448         bits_per_pixel := 1;
449         red_mask       := 1;
450         green_mask     := 0;
451         blue_mask      := 0;
452       end
453      else
454    begin}
455  XImage.format      := ZPixmap;
456  XImage.bitmap_unit := 32;
457
458  // only truecolor 24/32 displays supported now, otherwise color conversion required!
459  // this must be match for the display !!!
460  XImage.depth := ADestWindowInfo.ColorDepth;
461  XImage.bits_per_pixel := 24;
462
463  // Pixel mask
464  XImage.red_mask   := lVisual^.red_mask;
465  XImage.green_mask := lVisual^.green_mask;
466  XImage.blue_mask  := lVisual^.blue_mask;
467
468  XImage.Data := PChar(ARawImage.Data);
469
470  XInitImage(@XImage);
471
472// Create a native Image
473// No idea why but using XCreateImage it ends up using a format which I have no idea which is,
474// and the missmatch criples the image, XInitImage works fine
475//  Image := XCreateImage(CDWidgetSet.FDisplay, lVisual,
476//    lDepth, ZPixmap, 0, PChar(ARawImage.Data),
477//    ADestWidth, ADestHeight, 8, 0);
478
479  {$IFDEF VerboseCDForms}
480    DebugLn(Format('[TCDWSCustomForm.DrawRawImageToGC_XPutImage] XImage=%x Data=%x'
481      + ' ColorDepth:%d Width=%d Height=%d ScanlineSize=%d'
482      + ' red_mask=%x green_mask=%x blue_mask=%x',
483      [PtrInt(Image), PtrInt(ARawImage.Data), lDepth,
484       ADestWidth, ADestHeight, lScanlineSize,
485       XImage.red_mask, XImage.green_mask, XImage.blue_mask]));
486  {$ENDIF}
487
488  // Note that XPutImage is slow
489  XPutImage(CDWidgetSet.FDisplay, ADestWindowInfo.Window, ADestWindowInfo.GC,
490    @XImage, 0, 0, ADestX, ADestY, ADestWidth, ADestHeight);
491
492  // Free the native image -> Used only together with XCreateImage
493//  Image.data := nil;
494//  XDestroyImage(Image);
495end;
496
497class procedure TCDWSCustomForm.EvKeyPressed(const AWinControl: TWinControl;
498  AWindowInfo: TX11WindowInfo; var Event: TXKeyEvent);
499var
500  lKey: Word;
501  lForm: TCDForm;
502  KeySym: TKeySym;
503  lCurString: String;
504  lCurChar: TUTF8Char;
505  i: Integer;
506  lEndComposing: Boolean;
507begin
508  lForm := TCDForm(AWinControl.Handle);
509  KeySym := StartComposing(Event);
510  lKey := X11KeyToLCLKey(KeySym);
511  CDWidgetset.LastKeySym := KeySym;
512  CDWidgetset.LastKey := lKey;
513  CDWidgetSet.ShiftState := CDWidgetSet.XStateToLCLState(Event.state);
514
515  CallbackKeyDown(lForm, lKey);
516
517  // EndComposing embedded here
518  lEndComposing := CDWidgetset.ComposeStatus <> XLookupNone;
519  lEndComposing := lEndComposing and ((Event.state and (ControlMask or Mod1Mask)) = 0);
520  if lEndComposing then
521  begin
522    for i := 1 to UTF8Length(CDWidgetset.ComposeBuffer) do
523    begin
524      lCurString := CDWidgetset.ComposeBuffer;
525      lCurString := UTF8Copy(lCurString, i, 1);
526      lCurChar := lCurString;
527      CallbackKeyChar(lForm, 0, lCurChar);
528    end;
529  end;
530end;
531
532class procedure TCDWSCustomForm.EvKeyReleased(const AWinControl: TWinControl;
533  AWindowInfo: TX11WindowInfo; var Event: TXKeyEvent);
534var
535  lKey: Word;
536  lForm: TCDForm;
537begin
538  // Send back the last pressed key as a KeyUp event
539  lForm := TCDForm(AWinControl.Handle);
540
541  lKey := CDWidgetset.LastKey;
542  CDWidgetSet.ShiftState := CDWidgetSet.XStateToLCLState(Event.state);
543  CallbackKeyUp(lForm, lKey);
544
545  // Do not call EndComposing, as this would generate duplicate KeyChar events!}
546end;
547
548class procedure TCDWSCustomForm.EvMousePressed(const AWinControl: TWinControl; AWindowInfo: TX11WindowInfo;
549  var Event: TXButtonEvent);
550var
551  lForm: TCDForm;
552  MouseButton: TMouseButton;
553begin
554  lForm := TCDForm(AWinControl.Handle);
555  if XButtonToMouseButton(Event.button, MouseButton) then
556  begin
557    CallbackMouseDown(lForm, Event.x, Event.y, MouseButton, []);
558  end
559  else
560  begin
561{   if Event.button = 4 then Sum := -1
562   else Sum := 1;
563
564   // Check for other mouse wheel messages in the queue
565   while XCheckTypedWindowEvent(GFApplication.Handle,
566    WindowEntry.Handle, X.ButtonPress, @NewEvent) do
567   begin
568   if NewEvent.xbutton.Button = 4 then Dec(Sum)
569     else if NewEvent.xbutton.Button = 5 then Inc(Sum)
570     else
571     begin
572       XPutBackEvent(GFApplication.Handle, @NewEvent);
573       break;
574     end;
575   end;
576
577   WindowEntry.EvMouseWheel(
578    Sum, Point(XEvent.xbutton.x, XEvent.xbutton.y));}
579  end;
580end;
581
582class procedure TCDWSCustomForm.EvMouseReleased(const AWinControl: TWinControl; AWindowInfo: TX11WindowInfo;
583  var Event: TXButtonEvent);
584var
585  lForm: TCDForm;
586  MouseButton: TMouseButton;
587begin
588  lForm := TCDForm(AWinControl.Handle);
589  XButtonToMouseButton(Event.button, MouseButton);
590
591  { Release events are only for mouse buttons, and not mouse wheel moviments }
592  if (Event.button >= 1) and (Event.button <= 3) then
593  begin
594    CallbackMouseUp(lForm, Event.x, Event.y, MouseButton, []);
595  end;
596end;
597
598class procedure TCDWSCustomForm.EvMouseEnter(const AWinControl: TWinControl; AWindowInfo: TX11WindowInfo);
599begin
600end;
601
602class procedure TCDWSCustomForm.EvMouseLeave(const AWinControl: TWinControl; AWindowInfo: TX11WindowInfo);
603begin
604end;
605
606class procedure TCDWSCustomForm.EvMouseMove(const AWinControl: TWinControl; AWindowInfo: TX11WindowInfo;
607  var Event: TXMotionEvent);
608var
609  lForm: TCDForm;
610{  lTarget: TWinControl;
611  lEventPos: TPoint;}
612begin
613  lForm := TCDForm(AWinControl.Handle);
614  CallbackMouseMove(lForm, Event.x, Event.y, []);
615{  lTarget := FindControlWhichReceivedEvent(TCustomForm(AWinControl), AWindowInfo.Children, Event.x, Event.y);
616
617  lEventPos := FormPosToControlPos(lTarget, Event.x, Event.y);
618
619  LCLSendMouseMoveMsg(lTarget, lEventPos.x, lEventPos.y, []);}
620end;
621
622// Top-level windows receive LM_ACTIVATE while constrols receive LM_SETFOCUS
623// See http://blogs.msdn.com/b/jfoscoding/archive/2006/08/02/686141.aspx
624// Here we have 1 handle per window, so the X11 backend should only send LM_ACTIVATE
625class procedure TCDWSCustomForm.EvFocusIn(const AWinControl: TWinControl; AWindowInfo: TX11WindowInfo);
626begin
627  LCLSendActivateMsg(AWinControl, WA_ACTIVE, false);
628end;
629
630class procedure TCDWSCustomForm.EvFocusOut(const AWinControl: TWinControl; AWindowInfo: TX11WindowInfo);
631begin
632  LCLSendActivateMsg(AWinControl, WA_INACTIVE, false);
633end;
634
635class procedure TCDWSCustomForm.EvPaint(const AWinControl: TWinControl; AWindowInfo: TX11WindowInfo);
636var
637  lWidth, lHeight: Integer;
638  lBitmap, lMask: HBITMAP;
639  lRawImage: TRawImage;
640  Event: TXClientMessageEvent;
641  reslt: Integer;
642  {$IFDEF VerboseCDPaintProfiler}
643  lTimeStart, lCDTimeEnd, lNativeTimeStart: TDateTime;
644  lTimeSend: Integer;
645  {$ENDIF}
646begin
647  {$IFDEF VerboseCDPaintProfiler}
648  lTimeStart := NowUTC();
649  {$ENDIF}
650  {$IFDEF VerboseCDForms}
651    DebugLn(Format('[TCDWSCustomForm.EvPaint] AWindowInfo: %x', [PtrInt(AWindowInfo)]));
652  {$ENDIF}
653  if (AWinControl = nil) or (AWindowInfo = nil) then Exit;
654
655  lWidth := Round(AWinControl.width);
656  lHeight := Round(AWinControl.height);
657
658  // Prepare the non-native image and canvas
659  {$IFDEF VerboseCDForms}
660    DebugLn(Format('[TCDWSCustomForm.EvPaint] Visual: Red-Mask: %x Green-Mask: %x Blue-Mask: %x'
661      + ' bits_per_rgb=%d c_class=%d',
662      [AWindowInfo.Attr.visual^.red_mask, AWindowInfo.Attr.visual^.green_mask, AWindowInfo.Attr.visual^.blue_mask,
663       AWindowInfo.Attr.Visual^.bits_per_rgb, AWindowInfo.Attr.Visual^.c_class]));
664   { c_class values:
665   StaticGray = 0;
666   GrayScale = 1;
667   StaticColor = 2;
668   PseudoColor = 3;
669   TrueColor = 4;
670   DirectColor = 5;}
671  {$ENDIF}
672
673  {$ifdef CD_X11_SmartPaint}
674  if AWindowInfo.InvalidateRequestedInAnyControl then AWindowInfo.Valid:= False;
675  if (not AWindowInfo.Moved) or (not AWindowInfo.Valid) then begin // we're here just because a Move. We don't need to repaint
676    UpdateControlLazImageAndCanvas(AWindowInfo.Image, AWindowInfo.Canvas, lWidth, lHeight, clfBGR24);
677    RenderForm(AWindowInfo.Image, AWindowInfo.Canvas, TCustomForm(AWinControl));
678  end;
679  {$else}
680  UpdateControlLazImageAndCanvas(AWindowInfo.Image, AWindowInfo.Canvas, lWidth, lHeight, clfBGR24);
681
682  RenderForm(AWindowInfo.Image, AWindowInfo.Canvas, TCustomForm(AWinControl));
683  {$endif}
684
685  {$IFDEF VerboseCDPaintProfiler}
686  lCDTimeEnd := NowUTC();
687  lNativeTimeStart := NowUTC();
688  {$ENDIF}
689
690  {$ifdef CD_X11_NewNativePaint}
691  // if not already done, send a message to X
692  if CDWidgetSet.CheckInvalidateWindowForX(AWindowInfo.Window) then
693  begin
694    FillChar(Event,sizeof(Event),0);
695    Event._type:= ClientMessage;
696    Event.display:=CDWidgetSet.FDisplay;
697    Event.window:=AWindowInfo.Window;
698    Event.message_type:= CDWidgetSet.FWMPaint;
699    Event.format:= 32; // Must hold a culong for TXID
700    Event.data.l[0]:= AWindowInfo.Window;
701    {$IFDEF VerboseCDPaintProfiler}
702    Event.data.l[1]:= DateTimeToMilliseconds(Now());
703    {$ENDIF}
704    reslt := XSendEvent(CDWidgetSet.FDisplay,AWindowInfo.Window,{Propagate=}True,0,@Event);
705    // Painting will carried out from main event loop
706  end;
707  {$else}
708  // Now render it into the control
709  AWindowInfo.Image.GetRawImage(lRawImage);
710  DrawRawImageToGC(lRawImage, AWindowInfo, 0, 0, lWidth, lHeight);
711  {$endif}
712
713  {$IFDEF VerboseCDPaintProfiler}
714  DebugLn(Format('[TCDWSCustomForm.EvPaint] Total Paint duration: %d ms of this CustomDrawn: %d ms Native: %d',
715    [DateTimeToMilliseconds(NowUTC() - lTimeStart),
716     DateTimeToMilliseconds(lCDTimeEnd - lTimeStart),
717     DateTimeToMilliseconds(NowUTC() - lNativeTimeStart)
718    ]));
719  {$ENDIF}
720end;
721
722class procedure TCDWSCustomForm.EvPaintEx(const AWinControl: TWinControl;
723  AWindowInfo: TX11WindowInfo);
724var
725  lWidth, lHeight: Integer;
726  lRawImage: TRawImage;
727  reslt: integer;
728begin
729  lWidth := Round(AWinControl.width);
730  lHeight := Round(AWinControl.height);
731  AWindowInfo.Image.GetRawImage(lRawImage);
732  DrawRawImageToGC(lRawImage, AWindowInfo, 0, 0, lWidth, lHeight);
733end;
734
735class procedure TCDWSCustomForm.EvConfigureNotify(const AWinControl: TWinControl; AWindowInfo: TX11WindowInfo;
736  var Event: TXConfigureEvent);
737begin
738  // Without this while, it will get stuck in a loop resizing endlessly
739  while XCheckTypedWindowEvent(CDWidgetset.FDisplay, AWindowInfo.Window, X.ConfigureNotify, @Event) do;
740
741  {$ifdef VerboseCDEvents}
742  DebugLn(Format('LCL-CustomDrawn-X11: X11 event received: %s X=%d Y=%d', [GetXEventName(Event._type), Event.x, Event.y]));
743  {$endif}
744
745  // Move event
746  if (Event.x <> AWinControl.Left) or (Event.y <> AWinControl.Top) then
747  begin
748    {$ifdef CD_X11_SmartPaint}
749    AWindowInfo.Moved:= True; // doesn't need full painting
750    {$endif}
751    LCLSendMoveMsg(AWinControl, Event.x, Event.y);
752  end;
753  // Size event
754  if (Event.Width <> AWinControl.Width) or (Event.Height <> AWinControl.Height) then
755  begin
756    {$ifdef CD_X11_SmartPaint}
757    AWindowInfo.Valid:= False; // Needs full Painting
758    {$endif}
759    //SIZENORMAL, SIZEICONIC, SIZEFULLSCREEN, SIZEZOOMSHOW, SIZEZOOMHIDE.
760    LCLSendSizeMsg(AWinControl, Event.Width, Event.Height, SIZENORMAL);
761
762    //    TX11Canvas(Canvas).Resized(ClientWidth, ClientHeight); seams unnecessary here
763  end;
764end;
765
766class procedure TCDWSCustomForm.EvClientMessage(const AWinControl: TWinControl;
767  AWindowInfo: TX11WindowInfo; var Event: TXClientMessageEvent);
768begin
769  if Event.message_type = CDWidgetset.FWMProtocols then
770  begin
771    if Event.Data.l[0] = CDWidgetset.FWMDeleteWindow then
772    begin
773      // Message results : 0 - do nothing, 1 - destroy window (felipe: is this comment correct? taken from lcl-cocoa)
774      {--------------------------------------------------------
775      LCLSendCloseQueryMsg sends the message to TCustomForm.WMCloseQuery which
776      performs the close actions (query included) and always returns 0
777      No way to know here if the close action will actually be performed.
778      -----------------------------------------------------------------------}
779      LCLSendCloseQueryMsg(AWinControl);
780      {----------------------------------------------------------------------
781      No need to call LCLSendCloseUpMsg, because the form has already been closed,
782      if allowed by CanClose.
783      We can't ask X to destroy the window, because we don't know if CanClose was
784      true or false. Here we're just told by X that someone tried to close the
785      window, using WM functions. Moreover there are still hanging X events
786      to process. Either we implement AppTerminate, or we take yhe lazy
787      path and let the window be destroyed by the WM when the application terminates.
788      --------------------------------------------------------------------------}
789      (*if {CanClose} True then // CanClose is returning false -> ToDo: find out why
790      begin
791        LCLSendCloseUpMsg(AWinControl);
792        XDestroyWindow(CDWidgetset.FDisplay, AWinControl.Handle);
793      end;*)
794    end
795    else
796      DebugLn(Format('LCL-CustomDrawn-X11: Unknown client protocol message: %d', [Event.Data.l[0]]));
797  end
798  else
799    DebugLn(Format('LCL-CustomDrawn-X11: Unknown client message: %d', [Event.message_type]));
800end;
801
802class function TCDWSCustomForm.StartComposing(const Event: TXKeyEvent): TKeySym;
803var
804  len: integer;
805begin
806  SetLength(CDWidgetset.ComposeBuffer, 20);
807  // Xutf8LookupString returns the size of FComposeBuffer in bytes.
808  len := Xutf8LookupString(CDWidgetset.InputContext, @Event, @CDWidgetset.ComposeBuffer[1],
809      Length(CDWidgetset.ComposeBuffer), @Result, @CDWidgetset.ComposeStatus);
810  SetLength(CDWidgetset.ComposeBuffer, len);
811
812  {$ifdef VerboseCDText}
813  case CDWidgetset.ComposeStatus of
814    XBufferOverflow: DebugLn('[TCDWSCustomForm.StartComposing] Status=XBufferOverflow');
815    XLookupNone: DebugLn('[TCDWSCustomForm.StartComposing] Status=XLookupNone');
816    XLookupChars: DebugLn('[TCDWSCustomForm.StartComposing] Status=XLookupChars');
817    XLookupKeySymVal: DebugLn('[TCDWSCustomForm.StartComposing] Status=XLookupKeySym');
818    XLookupBoth: DebugLn('[TCDWSCustomForm.StartComposing] Status=XLookupBoth');
819  end;
820  {$endif}
821
822  // if overflow occured, then previous SetLength() would have fixed the buffer
823  // size, so run Xutf8LookupString again to read correct value.
824  if CDWidgetset.ComposeStatus = XBufferOverflow then
825    Xutf8LookupString(CDWidgetset.InputContext, @Event, @CDWidgetset.ComposeBuffer[1],
826      Length(CDWidgetset.ComposeBuffer), @Result, @CDWidgetset.ComposeStatus);
827end;
828
829// The Key table is in http://www.cl.cam.ac.uk/~mgk25/ucs/keysyms.txt
830class function TCDWSCustomForm.X11KeyToLCLKey(AX11Key: TKeySym): Word;
831begin
832  case AX11Key of
833    $20: Result := VK_SPACE;
834{ 0x0021   U0021   .   # exclam
835 0x0022   U0022   .   # quotedbl
836 0x0023   U0023   .   # numbersign
837 0x0024   U0024   .   # dollar
838 0x0025   U0025   .   # percent
839 0x0026   U0026   .   # ampersand
840 0x0027   U0027   .   # apostrophe
841 0x0027   U0027   .   # quoteright	/* deprecated */
842 0x0028   U0028   .   # parenleft
843 0x0029   U0029   .   # parenright
844 0x002a   U002a   .   # asterisk
845 0x002b   U002b   .   # plus
846 0x002c   U002c   .   # comma
847 0x002d   U002d   .   # minus
848 0x002e   U002e   .   # period
849 0x002f   U002f   .   # slash}
850    $0030: Result := VK_0;
851    $0031: Result := VK_1;
852    $0032: Result := VK_2;
853    $0033: Result := VK_3;
854    $0034: Result := VK_4;
855    $0035: Result := VK_5;
856    $0036: Result := VK_6;
857    $0037: Result := VK_7;
858    $0038: Result := VK_8;
859    $0039: Result := VK_9;
860{ 0x003a   U003a   .   # colon
861 0x003b   U003b   .   # semicolon
862 0x003c   U003c   .   # less
863 0x003d   U003d   .   # equal
864 0x003e   U003e   .   # greater
865 0x003f   U003f   .   # question
866 0x0040   U0040   .   # at      }
867    $41: Result := VK_A;
868    $42: Result := VK_B;
869    $43: Result := VK_C;
870    $44: Result := VK_D;
871    $45: Result := VK_E;
872    $46: Result := VK_F;
873    $47: Result := VK_G;
874    $48: Result := VK_H;
875    $49: Result := VK_I;
876    $4A: Result := VK_J;
877    $4B: Result := VK_K;
878    $4C: Result := VK_L;
879    $4D: Result := VK_M;
880    $4E: Result := VK_N;
881    $4F: Result := VK_O;
882    $50: Result := VK_P;
883    $51: Result := VK_Q;
884    $52: Result := VK_R;
885    $53: Result := VK_S;
886    $54: Result := VK_T;
887    $55: Result := VK_U;
888    $56: Result := VK_V;
889    $57: Result := VK_W;
890    $58: Result := VK_X;
891    $59: Result := VK_Y;
892    $5A: Result := VK_Z;
893{ 0x005b   U005b   .   # bracketleft
894 0x005c   U005c   .   # backslash
895 0x005d   U005d   .   # bracketright
896 0x005e   U005e   .   # asciicircum
897 0x005f   U005f   .   # underscore
898 0x0060   U0060   .   # grave
899 0x0060   U0060   .   # quoteleft	/* deprecated */ }
900    $61: Result := VK_A;
901    $62: Result := VK_B;
902    $63: Result := VK_C;
903    $64: Result := VK_D;
904    $65: Result := VK_E;
905    $66: Result := VK_F;
906    $67: Result := VK_G;
907    $68: Result := VK_H;
908    $69: Result := VK_I;
909    $6A: Result := VK_J;
910    $6B: Result := VK_K;
911    $6C: Result := VK_L;
912    $6D: Result := VK_M;
913    $6E: Result := VK_N;
914    $6F: Result := VK_O;
915    $70: Result := VK_P;
916    $71: Result := VK_Q;
917    $72: Result := VK_R;
918    $73: Result := VK_S;
919    $74: Result := VK_T;
920    $75: Result := VK_U;
921    $76: Result := VK_V;
922    $77: Result := VK_W;
923    $78: Result := VK_X;
924    $79: Result := VK_Y;
925    $7A: Result := VK_Z;
926{    0x007b   U007b   .   # braceleft
927    0x007c   U007c   .   # bar
928    0x007d   U007d   .   # braceright
929    0x007e   U007e   .   # asciitilde
930    0x00a0   U00a0   .   # nobreakspace
931    0x00a1   U00a1   .   # exclamdown
932    0x00a2   U00a2   .   # cent
933    0x00a3   U00a3   .   # sterling
934    0x00a4   U00a4   .   # currency
935    0x00a5   U00a5   .   # yen
936    0x00a6   U00a6   .   # brokenbar
937    0x00a7   U00a7   .   # section
938    0x00a8   U00a8   .   # diaeresis
939    0x00a9   U00a9   .   # copyright
940    0x00aa   U00aa   .   # ordfeminine
941    0x00ab   U00ab   .   # guillemotleft	/* left angle quotation mark */
942    0x00ac   U00ac   .   # notsign
943    0x00ad   U00ad   .   # hyphen
944    0x00ae   U00ae   .   # registered
945    0x00af   U00af   .   # macron
946    0x00b0   U00b0   .   # degree
947    0x00b1   U00b1   .   # plusminus
948    0x00b2   U00b2   .   # twosuperior
949    0x00b3   U00b3   .   # threesuperior
950    0x00b4   U00b4   .   # acute
951    0x00b5   U00b5   .   # mu
952    0x00b6   U00b6   .   # paragraph
953    0x00b7   U00b7   .   # periodcentered
954    0x00b8   U00b8   .   # cedilla
955    0x00b9   U00b9   .   # onesuperior
956    0x00ba   U00ba   .   # masculine
957    0x00bb   U00bb   .   # guillemotright	/* right angle quotation mark */
958    0x00bc   U00bc   .   # onequarter
959    0x00bd   U00bd   .   # onehalf
960    0x00be   U00be   .   # threequarters
961    0x00bf   U00bf   .   # questiondown
962    0x00c0   U00c0   .   # Agrave
963    0x00c1   U00c1   .   # Aacute
964    0x00c2   U00c2   .   # Acircumflex
965    0x00c3   U00c3   .   # Atilde
966    0x00c4   U00c4   .   # Adiaeresis
967    0x00c5   U00c5   .   # Aring
968    0x00c6   U00c6   .   # AE
969    0x00c7   U00c7   .   # Ccedilla
970    0x00c8   U00c8   .   # Egrave
971    0x00c9   U00c9   .   # Eacute
972    0x00ca   U00ca   .   # Ecircumflex
973    0x00cb   U00cb   .   # Ediaeresis
974    0x00cc   U00cc   .   # Igrave
975    0x00cd   U00cd   .   # Iacute
976    0x00ce   U00ce   .   # Icircumflex
977    0x00cf   U00cf   .   # Idiaeresis
978    0x00d0   U00d0   .   # ETH
979    0x00d0   U00d0   .   # Eth	/* deprecated */
980    0x00d1   U00d1   .   # Ntilde
981    0x00d2   U00d2   .   # Ograve
982    0x00d3   U00d3   .   # Oacute
983    0x00d4   U00d4   .   # Ocircumflex
984    0x00d5   U00d5   .   # Otilde
985    0x00d6   U00d6   .   # Odiaeresis
986    0x00d7   U00d7   .   # multiply
987    0x00d8   U00d8   .   # Ooblique
988    0x00d9   U00d9   .   # Ugrave
989    0x00da   U00da   .   # Uacute
990    0x00db   U00db   .   # Ucircumflex
991    0x00dc   U00dc   .   # Udiaeresis
992    0x00dd   U00dd   .   # Yacute
993    0x00de   U00de   .   # THORN
994    0x00de   U00de   .   # Thorn	/* deprecated */
995    0x00df   U00df   .   # ssharp
996    0x00e0   U00e0   .   # agrave
997    0x00e1   U00e1   .   # aacute
998    0x00e2   U00e2   .   # acircumflex
999    0x00e3   U00e3   .   # atilde
1000    0x00e4   U00e4   .   # adiaeresis
1001    0x00e5   U00e5   .   # aring
1002    0x00e6   U00e6   .   # ae
1003    0x00e7   U00e7   .   # ccedilla
1004    0x00e8   U00e8   .   # egrave
1005    0x00e9   U00e9   .   # eacute
1006    0x00ea   U00ea   .   # ecircumflex
1007    0x00eb   U00eb   .   # ediaeresis
1008    0x00ec   U00ec   .   # igrave
1009    0x00ed   U00ed   .   # iacute
1010    0x00ee   U00ee   .   # icircumflex
1011    0x00ef   U00ef   .   # idiaeresis
1012    0x00f0   U00f0   .   # eth
1013    0x00f1   U00f1   .   # ntilde
1014    0x00f2   U00f2   .   # ograve
1015    0x00f3   U00f3   .   # oacute
1016    0x00f4   U00f4   .   # ocircumflex
1017    0x00f5   U00f5   .   # otilde
1018    0x00f6   U00f6   .   # odiaeresis
1019    0x00f7   U00f7   .   # division
1020    0x00f8   U00f8   .   # oslash
1021    0x00f9   U00f9   .   # ugrave
1022    0x00fa   U00fa   .   # uacute
1023    0x00fb   U00fb   .   # ucircumflex
1024    0x00fc   U00fc   .   # udiaeresis
1025    0x00fd   U00fd   .   # yacute
1026    0x00fe   U00fe   .   # thorn
1027    0x00ff   U00ff   .   # ydiaeresis
1028    0x01a1   U0104   .   # Aogonek
1029    0x01a2   U02d8   .   # breve
1030    0x01a3   U0141   .   # Lstroke
1031    0x01a5   U013d   .   # Lcaron
1032    0x01a6   U015a   .   # Sacute
1033    0x01a9   U0160   .   # Scaron
1034    0x01aa   U015e   .   # Scedilla
1035    0x01ab   U0164   .   # Tcaron
1036    0x01ac   U0179   .   # Zacute
1037    0x01ae   U017d   .   # Zcaron
1038    0x01af   U017b   .   # Zabovedot
1039    0x01b1   U0105   .   # aogonek
1040    0x01b2   U02db   .   # ogonek
1041    0x01b3   U0142   .   # lstroke
1042    0x01b5   U013e   .   # lcaron
1043    0x01b6   U015b   .   # sacute
1044    0x01b7   U02c7   .   # caron
1045    0x01b9   U0161   .   # scaron
1046    0x01ba   U015f   .   # scedilla
1047    0x01bb   U0165   .   # tcaron
1048    0x01bc   U017a   .   # zacute
1049    0x01bd   U02dd   .   # doubleacute
1050    0x01be   U017e   .   # zcaron
1051    0x01bf   U017c   .   # zabovedot
1052    0x01c0   U0154   .   # Racute
1053    0x01c3   U0102   .   # Abreve
1054    0x01c5   U0139   .   # Lacute
1055    0x01c6   U0106   .   # Cacute
1056    0x01c8   U010c   .   # Ccaron
1057    0x01ca   U0118   .   # Eogonek
1058    0x01cc   U011a   .   # Ecaron
1059    0x01cf   U010e   .   # Dcaron
1060    0x01d0   U0110   .   # Dstroke
1061    0x01d1   U0143   .   # Nacute
1062    0x01d2   U0147   .   # Ncaron
1063    0x01d5   U0150   .   # Odoubleacute
1064    0x01d8   U0158   .   # Rcaron
1065    0x01d9   U016e   .   # Uring
1066    0x01db   U0170   .   # Udoubleacute
1067    0x01de   U0162   .   # Tcedilla
1068    0x01e0   U0155   .   # racute
1069    0x01e3   U0103   .   # abreve
1070    0x01e5   U013a   .   # lacute
1071    0x01e6   U0107   .   # cacute
1072    0x01e8   U010d   .   # ccaron
1073    0x01ea   U0119   .   # eogonek
1074    0x01ec   U011b   .   # ecaron
1075    0x01ef   U010f   .   # dcaron
1076    0x01f0   U0111   .   # dstroke
1077    0x01f1   U0144   .   # nacute
1078    0x01f2   U0148   .   # ncaron
1079    0x01f5   U0151   .   # odoubleacute
1080    0x01f8   U0159   .   # rcaron
1081    0x01f9   U016f   .   # uring
1082    0x01fb   U0171   .   # udoubleacute
1083    0x01fe   U0163   .   # tcedilla
1084    0x01ff   U02d9   .   # abovedot
1085    0x02a1   U0126   .   # Hstroke
1086    0x02a6   U0124   .   # Hcircumflex
1087    0x02a9   U0130   .   # Iabovedot
1088    0x02ab   U011e   .   # Gbreve
1089    0x02ac   U0134   .   # Jcircumflex
1090    0x02b1   U0127   .   # hstroke
1091    0x02b6   U0125   .   # hcircumflex
1092    0x02b9   U0131   .   # idotless
1093    0x02bb   U011f   .   # gbreve
1094    0x02bc   U0135   .   # jcircumflex
1095    0x02c5   U010a   .   # Cabovedot
1096    0x02c6   U0108   .   # Ccircumflex
1097    0x02d5   U0120   .   # Gabovedot
1098    0x02d8   U011c   .   # Gcircumflex
1099    0x02dd   U016c   .   # Ubreve
1100    0x02de   U015c   .   # Scircumflex
1101    0x02e5   U010b   .   # cabovedot
1102    0x02e6   U0109   .   # ccircumflex
1103    0x02f5   U0121   .   # gabovedot
1104    0x02f8   U011d   .   # gcircumflex
1105    0x02fd   U016d   .   # ubreve
1106    0x02fe   U015d   .   # scircumflex
1107    0x03a2   U0138   .   # kra
1108    0x03a3   U0156   .   # Rcedilla
1109    0x03a5   U0128   .   # Itilde
1110    0x03a6   U013b   .   # Lcedilla
1111    0x03aa   U0112   .   # Emacron
1112    0x03ab   U0122   .   # Gcedilla
1113    0x03ac   U0166   .   # Tslash
1114    0x03b3   U0157   .   # rcedilla
1115    0x03b5   U0129   .   # itilde
1116    0x03b6   U013c   .   # lcedilla
1117    0x03ba   U0113   .   # emacron
1118    0x03bb   U0123   .   # gcedilla
1119    0x03bc   U0167   .   # tslash
1120    0x03bd   U014a   .   # ENG
1121    0x03bf   U014b   .   # eng
1122    0x03c0   U0100   .   # Amacron
1123    0x03c7   U012e   .   # Iogonek
1124    0x03cc   U0116   .   # Eabovedot
1125    0x03cf   U012a   .   # Imacron
1126    0x03d1   U0145   .   # Ncedilla
1127    0x03d2   U014c   .   # Omacron
1128    0x03d3   U0136   .   # Kcedilla
1129    0x03d9   U0172   .   # Uogonek
1130    0x03dd   U0168   .   # Utilde
1131    0x03de   U016a   .   # Umacron
1132    0x03e0   U0101   .   # amacron
1133    0x03e7   U012f   .   # iogonek
1134    0x03ec   U0117   .   # eabovedot
1135    0x03ef   U012b   .   # imacron
1136    0x03f1   U0146   .   # ncedilla
1137    0x03f2   U014d   .   # omacron
1138    0x03f3   U0137   .   # kcedilla
1139    0x03f9   U0173   .   # uogonek
1140    0x03fd   U0169   .   # utilde
1141    0x03fe   U016b   .   # umacron
1142    0x047e   U203e   .   # overline
1143    0x04a1   U3002   .   # kana_fullstop
1144    0x04a2   U300c   .   # kana_openingbracket
1145    0x04a3   U300d   .   # kana_closingbracket
1146    0x04a4   U3001   .   # kana_comma
1147    0x04a5   U30fb   .   # kana_conjunctive
1148    0x04a6   U30f2   .   # kana_WO
1149    0x04a7   U30a1   .   # kana_a
1150    0x04a8   U30a3   .   # kana_i
1151    0x04a9   U30a5   .   # kana_u
1152    0x04aa   U30a7   .   # kana_e
1153    0x04ab   U30a9   .   # kana_o
1154    0x04ac   U30e3   .   # kana_ya
1155    0x04ad   U30e5   .   # kana_yu
1156    0x04ae   U30e7   .   # kana_yo
1157    0x04af   U30c3   .   # kana_tsu
1158    0x04b0   U30fc   .   # prolongedsound
1159    0x04b1   U30a2   .   # kana_A
1160    0x04b2   U30a4   .   # kana_I
1161    0x04b3   U30a6   .   # kana_U
1162    0x04b4   U30a8   .   # kana_E
1163    0x04b5   U30aa   .   # kana_O
1164    0x04b6   U30ab   .   # kana_KA
1165    0x04b7   U30ad   .   # kana_KI
1166    0x04b8   U30af   .   # kana_KU
1167    0x04b9   U30b1   .   # kana_KE
1168    0x04ba   U30b3   .   # kana_KO
1169    0x04bb   U30b5   .   # kana_SA
1170    0x04bc   U30b7   .   # kana_SHI
1171    0x04bd   U30b9   .   # kana_SU
1172    0x04be   U30bb   .   # kana_SE
1173    0x04bf   U30bd   .   # kana_SO
1174    0x04c0   U30bf   .   # kana_TA
1175    0x04c1   U30c1   .   # kana_CHI
1176    0x04c2   U30c4   .   # kana_TSU
1177    0x04c3   U30c6   .   # kana_TE
1178    0x04c4   U30c8   .   # kana_TO
1179    0x04c5   U30ca   .   # kana_NA
1180    0x04c6   U30cb   .   # kana_NI
1181    0x04c7   U30cc   .   # kana_NU
1182    0x04c8   U30cd   .   # kana_NE
1183    0x04c9   U30ce   .   # kana_NO
1184    0x04ca   U30cf   .   # kana_HA
1185    0x04cb   U30d2   .   # kana_HI
1186    0x04cc   U30d5   .   # kana_FU
1187    0x04cd   U30d8   .   # kana_HE
1188    0x04ce   U30db   .   # kana_HO
1189    0x04cf   U30de   .   # kana_MA
1190    0x04d0   U30df   .   # kana_MI
1191    0x04d1   U30e0   .   # kana_MU
1192    0x04d2   U30e1   .   # kana_ME
1193    0x04d3   U30e2   .   # kana_MO
1194    0x04d4   U30e4   .   # kana_YA
1195    0x04d5   U30e6   .   # kana_YU
1196    0x04d6   U30e8   .   # kana_YO
1197    0x04d7   U30e9   .   # kana_RA
1198    0x04d8   U30ea   .   # kana_RI
1199    0x04d9   U30eb   .   # kana_RU
1200    0x04da   U30ec   .   # kana_RE
1201    0x04db   U30ed   .   # kana_RO
1202    0x04dc   U30ef   .   # kana_WA
1203    0x04dd   U30f3   .   # kana_N
1204    0x04de   U309b   .   # voicedsound
1205    0x04df   U309c   .   # semivoicedsound
1206    0x05ac   U060c   .   # Arabic_comma
1207    0x05bb   U061b   .   # Arabic_semicolon
1208    0x05bf   U061f   .   # Arabic_question_mark
1209    0x05c1   U0621   .   # Arabic_hamza
1210    0x05c2   U0622   .   # Arabic_maddaonalef
1211    0x05c3   U0623   .   # Arabic_hamzaonalef
1212    0x05c4   U0624   .   # Arabic_hamzaonwaw
1213    0x05c5   U0625   .   # Arabic_hamzaunderalef
1214    0x05c6   U0626   .   # Arabic_hamzaonyeh
1215    0x05c7   U0627   .   # Arabic_alef
1216    0x05c8   U0628   .   # Arabic_beh
1217    0x05c9   U0629   .   # Arabic_tehmarbuta
1218    0x05ca   U062a   .   # Arabic_teh
1219    0x05cb   U062b   .   # Arabic_theh
1220    0x05cc   U062c   .   # Arabic_jeem
1221    0x05cd   U062d   .   # Arabic_hah
1222    0x05ce   U062e   .   # Arabic_khah
1223    0x05cf   U062f   .   # Arabic_dal
1224    0x05d0   U0630   .   # Arabic_thal
1225    0x05d1   U0631   .   # Arabic_ra
1226    0x05d2   U0632   .   # Arabic_zain
1227    0x05d3   U0633   .   # Arabic_seen
1228    0x05d4   U0634   .   # Arabic_sheen
1229    0x05d5   U0635   .   # Arabic_sad
1230    0x05d6   U0636   .   # Arabic_dad
1231    0x05d7   U0637   .   # Arabic_tah
1232    0x05d8   U0638   .   # Arabic_zah
1233    0x05d9   U0639   .   # Arabic_ain
1234    0x05da   U063a   .   # Arabic_ghain
1235    0x05e0   U0640   .   # Arabic_tatweel
1236    0x05e1   U0641   .   # Arabic_feh
1237    0x05e2   U0642   .   # Arabic_qaf
1238    0x05e3   U0643   .   # Arabic_kaf
1239    0x05e4   U0644   .   # Arabic_lam
1240    0x05e5   U0645   .   # Arabic_meem
1241    0x05e6   U0646   .   # Arabic_noon
1242    0x05e7   U0647   .   # Arabic_ha
1243    0x05e8   U0648   .   # Arabic_waw
1244    0x05e9   U0649   .   # Arabic_alefmaksura
1245    0x05ea   U064a   .   # Arabic_yeh
1246    0x05eb   U064b   .   # Arabic_fathatan
1247    0x05ec   U064c   .   # Arabic_dammatan
1248    0x05ed   U064d   .   # Arabic_kasratan
1249    0x05ee   U064e   .   # Arabic_fatha
1250    0x05ef   U064f   .   # Arabic_damma
1251    0x05f0   U0650   .   # Arabic_kasra
1252    0x05f1   U0651   .   # Arabic_shadda
1253    0x05f2   U0652   .   # Arabic_sukun
1254    0x06a1   U0452   .   # Serbian_dje
1255    0x06a2   U0453   .   # Macedonia_gje
1256    0x06a3   U0451   .   # Cyrillic_io
1257    0x06a4   U0454   .   # Ukrainian_ie
1258    0x06a5   U0455   .   # Macedonia_dse
1259    0x06a6   U0456   .   # Ukrainian_i
1260    0x06a7   U0457   .   # Ukrainian_yi
1261    0x06a8   U0458   .   # Cyrillic_je
1262    0x06a9   U0459   .   # Cyrillic_lje
1263    0x06aa   U045a   .   # Cyrillic_nje
1264    0x06ab   U045b   .   # Serbian_tshe
1265    0x06ac   U045c   .   # Macedonia_kje
1266    0x06ae   U045e   .   # Byelorussian_shortu
1267    0x06af   U045f   .   # Cyrillic_dzhe
1268    0x06b0   U2116   .   # numerosign
1269    0x06b1   U0402   .   # Serbian_DJE
1270    0x06b2   U0403   .   # Macedonia_GJE
1271    0x06b3   U0401   .   # Cyrillic_IO
1272    0x06b4   U0404   .   # Ukrainian_IE
1273    0x06b5   U0405   .   # Macedonia_DSE
1274    0x06b6   U0406   .   # Ukrainian_I
1275    0x06b7   U0407   .   # Ukrainian_YI
1276    0x06b8   U0408   .   # Cyrillic_JE
1277    0x06b9   U0409   .   # Cyrillic_LJE
1278    0x06ba   U040a   .   # Cyrillic_NJE
1279    0x06bb   U040b   .   # Serbian_TSHE
1280    0x06bc   U040c   .   # Macedonia_KJE
1281    0x06be   U040e   .   # Byelorussian_SHORTU
1282    0x06bf   U040f   .   # Cyrillic_DZHE
1283    0x06c0   U044e   .   # Cyrillic_yu
1284    0x06c1   U0430   .   # Cyrillic_a
1285    0x06c2   U0431   .   # Cyrillic_be
1286    0x06c3   U0446   .   # Cyrillic_tse
1287    0x06c4   U0434   .   # Cyrillic_de
1288    0x06c5   U0435   .   # Cyrillic_ie
1289    0x06c6   U0444   .   # Cyrillic_ef
1290    0x06c7   U0433   .   # Cyrillic_ghe
1291    0x06c8   U0445   .   # Cyrillic_ha
1292    0x06c9   U0438   .   # Cyrillic_i
1293    0x06ca   U0439   .   # Cyrillic_shorti
1294    0x06cb   U043a   .   # Cyrillic_ka
1295    0x06cc   U043b   .   # Cyrillic_el
1296    0x06cd   U043c   .   # Cyrillic_em
1297    0x06ce   U043d   .   # Cyrillic_en
1298    0x06cf   U043e   .   # Cyrillic_o
1299    0x06d0   U043f   .   # Cyrillic_pe
1300    0x06d1   U044f   .   # Cyrillic_ya
1301    0x06d2   U0440   .   # Cyrillic_er
1302    0x06d3   U0441   .   # Cyrillic_es
1303    0x06d4   U0442   .   # Cyrillic_te
1304    0x06d5   U0443   .   # Cyrillic_u
1305    0x06d6   U0436   .   # Cyrillic_zhe
1306    0x06d7   U0432   .   # Cyrillic_ve
1307    0x06d8   U044c   .   # Cyrillic_softsign
1308    0x06d9   U044b   .   # Cyrillic_yeru
1309    0x06da   U0437   .   # Cyrillic_ze
1310    0x06db   U0448   .   # Cyrillic_sha
1311    0x06dc   U044d   .   # Cyrillic_e
1312    0x06dd   U0449   .   # Cyrillic_shcha
1313    0x06de   U0447   .   # Cyrillic_che
1314    0x06df   U044a   .   # Cyrillic_hardsign
1315    0x06e0   U042e   .   # Cyrillic_YU
1316    0x06e1   U0410   .   # Cyrillic_A
1317    0x06e2   U0411   .   # Cyrillic_BE
1318    0x06e3   U0426   .   # Cyrillic_TSE
1319    0x06e4   U0414   .   # Cyrillic_DE
1320    0x06e5   U0415   .   # Cyrillic_IE
1321    0x06e6   U0424   .   # Cyrillic_EF
1322    0x06e7   U0413   .   # Cyrillic_GHE
1323    0x06e8   U0425   .   # Cyrillic_HA
1324    0x06e9   U0418   .   # Cyrillic_I
1325    0x06ea   U0419   .   # Cyrillic_SHORTI
1326    0x06eb   U041a   .   # Cyrillic_KA
1327    0x06ec   U041b   .   # Cyrillic_EL
1328    0x06ed   U041c   .   # Cyrillic_EM
1329    0x06ee   U041d   .   # Cyrillic_EN
1330    0x06ef   U041e   .   # Cyrillic_O
1331    0x06f0   U041f   .   # Cyrillic_PE
1332    0x06f1   U042f   .   # Cyrillic_YA
1333    0x06f2   U0420   .   # Cyrillic_ER
1334    0x06f3   U0421   .   # Cyrillic_ES
1335    0x06f4   U0422   .   # Cyrillic_TE
1336    0x06f5   U0423   .   # Cyrillic_U
1337    0x06f6   U0416   .   # Cyrillic_ZHE
1338    0x06f7   U0412   .   # Cyrillic_VE
1339    0x06f8   U042c   .   # Cyrillic_SOFTSIGN
1340    0x06f9   U042b   .   # Cyrillic_YERU
1341    0x06fa   U0417   .   # Cyrillic_ZE
1342    0x06fb   U0428   .   # Cyrillic_SHA
1343    0x06fc   U042d   .   # Cyrillic_E
1344    0x06fd   U0429   .   # Cyrillic_SHCHA
1345    0x06fe   U0427   .   # Cyrillic_CHE
1346    0x06ff   U042a   .   # Cyrillic_HARDSIGN
1347    0x07a1   U0386   .   # Greek_ALPHAaccent
1348    0x07a2   U0388   .   # Greek_EPSILONaccent
1349    0x07a3   U0389   .   # Greek_ETAaccent
1350    0x07a4   U038a   .   # Greek_IOTAaccent
1351    0x07a5   U03aa   .   # Greek_IOTAdiaeresis
1352    0x07a7   U038c   .   # Greek_OMICRONaccent
1353    0x07a8   U038e   .   # Greek_UPSILONaccent
1354    0x07a9   U03ab   .   # Greek_UPSILONdieresis
1355    0x07ab   U038f   .   # Greek_OMEGAaccent
1356    0x07ae   U0385   .   # Greek_accentdieresis
1357    0x07af   U2015   .   # Greek_horizbar
1358    0x07b1   U03ac   .   # Greek_alphaaccent
1359    0x07b2   U03ad   .   # Greek_epsilonaccent
1360    0x07b3   U03ae   .   # Greek_etaaccent
1361    0x07b4   U03af   .   # Greek_iotaaccent
1362    0x07b5   U03ca   .   # Greek_iotadieresis
1363    0x07b6   U0390   .   # Greek_iotaaccentdieresis
1364    0x07b7   U03cc   .   # Greek_omicronaccent
1365    0x07b8   U03cd   .   # Greek_upsilonaccent
1366    0x07b9   U03cb   .   # Greek_upsilondieresis
1367    0x07ba   U03b0   .   # Greek_upsilonaccentdieresis
1368    0x07bb   U03ce   .   # Greek_omegaaccent
1369    0x07c1   U0391   .   # Greek_ALPHA
1370    0x07c2   U0392   .   # Greek_BETA
1371    0x07c3   U0393   .   # Greek_GAMMA
1372    0x07c4   U0394   .   # Greek_DELTA
1373    0x07c5   U0395   .   # Greek_EPSILON
1374    0x07c6   U0396   .   # Greek_ZETA
1375    0x07c7   U0397   .   # Greek_ETA
1376    0x07c8   U0398   .   # Greek_THETA
1377    0x07c9   U0399   .   # Greek_IOTA
1378    0x07ca   U039a   .   # Greek_KAPPA
1379    0x07cb   U039b   .   # Greek_LAMBDA
1380    0x07cb   U039b   .   # Greek_LAMDA
1381    0x07cc   U039c   .   # Greek_MU
1382    0x07cd   U039d   .   # Greek_NU
1383    0x07ce   U039e   .   # Greek_XI
1384    0x07cf   U039f   .   # Greek_OMICRON
1385    0x07d0   U03a0   .   # Greek_PI
1386    0x07d1   U03a1   .   # Greek_RHO
1387    0x07d2   U03a3   .   # Greek_SIGMA
1388    0x07d4   U03a4   .   # Greek_TAU
1389    0x07d5   U03a5   .   # Greek_UPSILON
1390    0x07d6   U03a6   .   # Greek_PHI
1391    0x07d7   U03a7   .   # Greek_CHI
1392    0x07d8   U03a8   .   # Greek_PSI
1393    0x07d9   U03a9   .   # Greek_OMEGA
1394    0x07e1   U03b1   .   # Greek_alpha
1395    0x07e2   U03b2   .   # Greek_beta
1396    0x07e3   U03b3   .   # Greek_gamma
1397    0x07e4   U03b4   .   # Greek_delta
1398    0x07e5   U03b5   .   # Greek_epsilon
1399    0x07e6   U03b6   .   # Greek_zeta
1400    0x07e7   U03b7   .   # Greek_eta
1401    0x07e8   U03b8   .   # Greek_theta
1402    0x07e9   U03b9   .   # Greek_iota
1403    0x07ea   U03ba   .   # Greek_kappa
1404    0x07eb   U03bb   .   # Greek_lambda
1405    0x07ec   U03bc   .   # Greek_mu
1406    0x07ed   U03bd   .   # Greek_nu
1407    0x07ee   U03be   .   # Greek_xi
1408    0x07ef   U03bf   .   # Greek_omicron
1409    0x07f0   U03c0   .   # Greek_pi
1410    0x07f1   U03c1   .   # Greek_rho
1411    0x07f2   U03c3   .   # Greek_sigma
1412    0x07f3   U03c2   .   # Greek_finalsmallsigma
1413    0x07f4   U03c4   .   # Greek_tau
1414    0x07f5   U03c5   .   # Greek_upsilon
1415    0x07f6   U03c6   .   # Greek_phi
1416    0x07f7   U03c7   .   # Greek_chi
1417    0x07f8   U03c8   .   # Greek_psi
1418    0x07f9   U03c9   .   # Greek_omega
1419    0x08a1   U23b7   .   # leftradical
1420    0x08a2   U250c   d   # topleftradical
1421    0x08a3   U2500   d   # horizconnector
1422    0x08a4   U2320   .   # topintegral
1423    0x08a5   U2321   .   # botintegral
1424    0x08a6   U2502   d   # vertconnector
1425    0x08a7   U23a1   .   # topleftsqbracket
1426    0x08a8   U23a3   .   # botleftsqbracket
1427    0x08a9   U23a4   .   # toprightsqbracket
1428    0x08aa   U23a6   .   # botrightsqbracket
1429    0x08ab   U239b   .   # topleftparens
1430    0x08ac   U239d   .   # botleftparens
1431    0x08ad   U239e   .   # toprightparens
1432    0x08ae   U23a0   .   # botrightparens
1433    0x08af   U23a8   .   # leftmiddlecurlybrace
1434    0x08b0   U23ac   .   # rightmiddlecurlybrace
1435    0x08b1   U0000   o   # topleftsummation
1436    0x08b2   U0000   o   # botleftsummation
1437    0x08b3   U0000   o   # topvertsummationconnector
1438    0x08b4   U0000   o   # botvertsummationconnector
1439    0x08b5   U0000   o   # toprightsummation
1440    0x08b6   U0000   o   # botrightsummation
1441    0x08b7   U0000   o   # rightmiddlesummation
1442    0x08bc   U2264   .   # lessthanequal
1443    0x08bd   U2260   .   # notequal
1444    0x08be   U2265   .   # greaterthanequal
1445    0x08bf   U222b   .   # integral
1446    0x08c0   U2234   .   # therefore
1447    0x08c1   U221d   .   # variation
1448    0x08c2   U221e   .   # infinity
1449    0x08c5   U2207   .   # nabla
1450    0x08c8   U223c   .   # approximate
1451    0x08c9   U2243   .   # similarequal
1452    0x08cd   U21d4   .   # ifonlyif
1453    0x08ce   U21d2   .   # implies
1454    0x08cf   U2261   .   # identical
1455    0x08d6   U221a   .   # radical
1456    0x08da   U2282   .   # includedin
1457    0x08db   U2283   .   # includes
1458    0x08dc   U2229   .   # intersection
1459    0x08dd   U222a   .   # union
1460    0x08de   U2227   .   # logicaland
1461    0x08df   U2228   .   # logicalor
1462    0x08ef   U2202   .   # partialderivative
1463    0x08f6   U0192   .   # function
1464    0x08fb   U2190   .   # leftarrow
1465    0x08fc   U2191   .   # uparrow
1466    0x08fd   U2192   .   # rightarrow
1467    0x08fe   U2193   .   # downarrow
1468    0x09df   U0000   o   # blank
1469    0x09e0   U25c6   .   # soliddiamond
1470    0x09e1   U2592   .   # checkerboard
1471    0x09e2   U2409   .   # ht
1472    0x09e3   U240c   .   # ff
1473    0x09e4   U240d   .   # cr
1474    0x09e5   U240a   .   # lf
1475    0x09e8   U2424   .   # nl
1476    0x09e9   U240b   .   # vt
1477    0x09ea   U2518   .   # lowrightcorner
1478    0x09eb   U2510   .   # uprightcorner
1479    0x09ec   U250c   .   # upleftcorner
1480    0x09ed   U2514   .   # lowleftcorner
1481    0x09ee   U253c   .   # crossinglines
1482    0x09ef   U23ba   .   # horizlinescan1
1483    0x09f0   U23bb   .   # horizlinescan3
1484    0x09f1   U2500   .   # horizlinescan5
1485    0x09f2   U23bc   .   # horizlinescan7
1486    0x09f3   U23bd   .   # horizlinescan9
1487    0x09f4   U251c   .   # leftt
1488    0x09f5   U2524   .   # rightt
1489    0x09f6   U2534   .   # bott
1490    0x09f7   U252c   .   # topt
1491    0x09f8   U2502   .   # vertbar
1492    0x0aa1   U2003   .   # emspace
1493    0x0aa2   U2002   .   # enspace
1494    0x0aa3   U2004   .   # em3space
1495    0x0aa4   U2005   .   # em4space
1496    0x0aa5   U2007   .   # digitspace
1497    0x0aa6   U2008   .   # punctspace
1498    0x0aa7   U2009   .   # thinspace
1499    0x0aa8   U200a   .   # hairspace
1500    0x0aa9   U2014   .   # emdash
1501    0x0aaa   U2013   .   # endash
1502    0x0aac   U2423   o   # signifblank
1503    0x0aae   U2026   .   # ellipsis
1504    0x0aaf   U2025   .   # doubbaselinedot
1505    0x0ab0   U2153   .   # onethird
1506    0x0ab1   U2154   .   # twothirds
1507    0x0ab2   U2155   .   # onefifth
1508    0x0ab3   U2156   .   # twofifths
1509    0x0ab4   U2157   .   # threefifths
1510    0x0ab5   U2158   .   # fourfifths
1511    0x0ab6   U2159   .   # onesixth
1512    0x0ab7   U215a   .   # fivesixths
1513    0x0ab8   U2105   .   # careof
1514    0x0abb   U2012   .   # figdash
1515    0x0abc   U27e8   o   # leftanglebracket
1516    0x0abd   U002e   o   # decimalpoint
1517    0x0abe   U27e9   o   # rightanglebracket
1518    0x0abf   U0000   o   # marker
1519    0x0ac3   U215b   .   # oneeighth
1520    0x0ac4   U215c   .   # threeeighths
1521    0x0ac5   U215d   .   # fiveeighths
1522    0x0ac6   U215e   .   # seveneighths
1523    0x0ac9   U2122   .   # trademark
1524    0x0aca   U2613   o   # signaturemark
1525    0x0acb   U0000   o   # trademarkincircle
1526    0x0acc   U25c1   o   # leftopentriangle
1527    0x0acd   U25b7   o   # rightopentriangle
1528    0x0ace   U25cb   o   # emopencircle
1529    0x0acf   U25af   o   # emopenrectangle
1530    0x0ad0   U2018   .   # leftsinglequotemark
1531    0x0ad1   U2019   .   # rightsinglequotemark
1532    0x0ad2   U201c   .   # leftdoublequotemark
1533    0x0ad3   U201d   .   # rightdoublequotemark
1534    0x0ad4   U211e   .   # prescription
1535    0x0ad6   U2032   .   # minutes
1536    0x0ad7   U2033   .   # seconds
1537    0x0ad9   U271d   .   # latincross
1538    0x0ada   U0000   o   # hexagram
1539    0x0adb   U25ac   o   # filledrectbullet
1540    0x0adc   U25c0   o   # filledlefttribullet
1541    0x0add   U25b6   o   # filledrighttribullet
1542    0x0ade   U25cf   o   # emfilledcircle
1543    0x0adf   U25ae   o   # emfilledrect
1544    0x0ae0   U25e6   o   # enopencircbullet
1545    0x0ae1   U25ab   o   # enopensquarebullet
1546    0x0ae2   U25ad   o   # openrectbullet
1547    0x0ae3   U25b3   o   # opentribulletup
1548    0x0ae4   U25bd   o   # opentribulletdown
1549    0x0ae5   U2606   o   # openstar
1550    0x0ae6   U2022   o   # enfilledcircbullet
1551    0x0ae7   U25aa   o   # enfilledsqbullet
1552    0x0ae8   U25b2   o   # filledtribulletup
1553    0x0ae9   U25bc   o   # filledtribulletdown
1554    0x0aea   U261c   o   # leftpointer
1555    0x0aeb   U261e   o   # rightpointer
1556    0x0aec   U2663   .   # club
1557    0x0aed   U2666   .   # diamond
1558    0x0aee   U2665   .   # heart
1559    0x0af0   U2720   .   # maltesecross
1560    0x0af1   U2020   .   # dagger
1561    0x0af2   U2021   .   # doubledagger
1562    0x0af3   U2713   .   # checkmark
1563    0x0af4   U2717   .   # ballotcross
1564    0x0af5   U266f   .   # musicalsharp
1565    0x0af6   U266d   .   # musicalflat
1566    0x0af7   U2642   .   # malesymbol
1567    0x0af8   U2640   .   # femalesymbol
1568    0x0af9   U260e   .   # telephone
1569    0x0afa   U2315   .   # telephonerecorder
1570    0x0afb   U2117   .   # phonographcopyright
1571    0x0afc   U2038   .   # caret
1572    0x0afd   U201a   .   # singlelowquotemark
1573    0x0afe   U201e   .   # doublelowquotemark
1574    0x0aff   U0000   o   # cursor
1575    0x0ba3   U003c   d   # leftcaret
1576    0x0ba6   U003e   d   # rightcaret
1577    0x0ba8   U2228   d   # downcaret
1578    0x0ba9   U2227   d   # upcaret
1579    0x0bc0   U00af   d   # overbar
1580    0x0bc2   U22a5   .   # downtack
1581    0x0bc3   U2229   d   # upshoe
1582    0x0bc4   U230a   .   # downstile
1583    0x0bc6   U005f   d   # underbar
1584    0x0bca   U2218   .   # jot
1585    0x0bcc   U2395   .   # quad
1586    0x0bce   U22a4   .   # uptack
1587    0x0bcf   U25cb   .   # circle
1588    0x0bd3   U2308   .   # upstile
1589    0x0bd6   U222a   d   # downshoe
1590    0x0bd8   U2283   d   # rightshoe
1591    0x0bda   U2282   d   # leftshoe
1592    0x0bdc   U22a2   .   # lefttack
1593    0x0bfc   U22a3   .   # righttack
1594    0x0cdf   U2017   .   # hebrew_doublelowline
1595    0x0ce0   U05d0   .   # hebrew_aleph
1596    0x0ce1   U05d1   .   # hebrew_bet
1597    0x0ce1   U05d1   .   # hebrew_beth  /* deprecated */
1598    0x0ce2   U05d2   .   # hebrew_gimel
1599    0x0ce2   U05d2   .   # hebrew_gimmel  /* deprecated */
1600    0x0ce3   U05d3   .   # hebrew_dalet
1601    0x0ce3   U05d3   .   # hebrew_daleth  /* deprecated */
1602    0x0ce4   U05d4   .   # hebrew_he
1603    0x0ce5   U05d5   .   # hebrew_waw
1604    0x0ce6   U05d6   .   # hebrew_zain
1605    0x0ce6   U05d6   .   # hebrew_zayin  /* deprecated */
1606    0x0ce7   U05d7   .   # hebrew_chet
1607    0x0ce7   U05d7   .   # hebrew_het  /* deprecated */
1608    0x0ce8   U05d8   .   # hebrew_tet
1609    0x0ce8   U05d8   .   # hebrew_teth  /* deprecated */
1610    0x0ce9   U05d9   .   # hebrew_yod
1611    0x0cea   U05da   .   # hebrew_finalkaph
1612    0x0ceb   U05db   .   # hebrew_kaph
1613    0x0cec   U05dc   .   # hebrew_lamed
1614    0x0ced   U05dd   .   # hebrew_finalmem
1615    0x0cee   U05de   .   # hebrew_mem
1616    0x0cef   U05df   .   # hebrew_finalnun
1617    0x0cf0   U05e0   .   # hebrew_nun
1618    0x0cf1   U05e1   .   # hebrew_samech
1619    0x0cf1   U05e1   .   # hebrew_samekh  /* deprecated */
1620    0x0cf2   U05e2   .   # hebrew_ayin
1621    0x0cf3   U05e3   .   # hebrew_finalpe
1622    0x0cf4   U05e4   .   # hebrew_pe
1623    0x0cf5   U05e5   .   # hebrew_finalzade
1624    0x0cf5   U05e5   .   # hebrew_finalzadi  /* deprecated */
1625    0x0cf6   U05e6   .   # hebrew_zade
1626    0x0cf6   U05e6   .   # hebrew_zadi  /* deprecated */
1627    0x0cf7   U05e7   .   # hebrew_kuf  /* deprecated */
1628    0x0cf7   U05e7   .   # hebrew_qoph
1629    0x0cf8   U05e8   .   # hebrew_resh
1630    0x0cf9   U05e9   .   # hebrew_shin
1631    0x0cfa   U05ea   .   # hebrew_taf  /* deprecated */
1632    0x0cfa   U05ea   .   # hebrew_taw
1633    0x0da1   U0e01   .   # Thai_kokai
1634    0x0da2   U0e02   .   # Thai_khokhai
1635    0x0da3   U0e03   .   # Thai_khokhuat
1636    0x0da4   U0e04   .   # Thai_khokhwai
1637    0x0da5   U0e05   .   # Thai_khokhon
1638    0x0da6   U0e06   .   # Thai_khorakhang
1639    0x0da7   U0e07   .   # Thai_ngongu
1640    0x0da8   U0e08   .   # Thai_chochan
1641    0x0da9   U0e09   .   # Thai_choching
1642    0x0daa   U0e0a   .   # Thai_chochang
1643    0x0dab   U0e0b   .   # Thai_soso
1644    0x0dac   U0e0c   .   # Thai_chochoe
1645    0x0dad   U0e0d   .   # Thai_yoying
1646    0x0dae   U0e0e   .   # Thai_dochada
1647    0x0daf   U0e0f   .   # Thai_topatak
1648    0x0db0   U0e10   .   # Thai_thothan
1649    0x0db1   U0e11   .   # Thai_thonangmontho
1650    0x0db2   U0e12   .   # Thai_thophuthao
1651    0x0db3   U0e13   .   # Thai_nonen
1652    0x0db4   U0e14   .   # Thai_dodek
1653    0x0db5   U0e15   .   # Thai_totao
1654    0x0db6   U0e16   .   # Thai_thothung
1655    0x0db7   U0e17   .   # Thai_thothahan
1656    0x0db8   U0e18   .   # Thai_thothong
1657    0x0db9   U0e19   .   # Thai_nonu
1658    0x0dba   U0e1a   .   # Thai_bobaimai
1659    0x0dbb   U0e1b   .   # Thai_popla
1660    0x0dbc   U0e1c   .   # Thai_phophung
1661    0x0dbd   U0e1d   .   # Thai_fofa
1662    0x0dbe   U0e1e   .   # Thai_phophan
1663    0x0dbf   U0e1f   .   # Thai_fofan
1664    0x0dc0   U0e20   .   # Thai_phosamphao
1665    0x0dc1   U0e21   .   # Thai_moma
1666    0x0dc2   U0e22   .   # Thai_yoyak
1667    0x0dc3   U0e23   .   # Thai_rorua
1668    0x0dc4   U0e24   .   # Thai_ru
1669    0x0dc5   U0e25   .   # Thai_loling
1670    0x0dc6   U0e26   .   # Thai_lu
1671    0x0dc7   U0e27   .   # Thai_wowaen
1672    0x0dc8   U0e28   .   # Thai_sosala
1673    0x0dc9   U0e29   .   # Thai_sorusi
1674    0x0dca   U0e2a   .   # Thai_sosua
1675    0x0dcb   U0e2b   .   # Thai_hohip
1676    0x0dcc   U0e2c   .   # Thai_lochula
1677    0x0dcd   U0e2d   .   # Thai_oang
1678    0x0dce   U0e2e   .   # Thai_honokhuk
1679    0x0dcf   U0e2f   .   # Thai_paiyannoi
1680    0x0dd0   U0e30   .   # Thai_saraa
1681    0x0dd1   U0e31   .   # Thai_maihanakat
1682    0x0dd2   U0e32   .   # Thai_saraaa
1683    0x0dd3   U0e33   .   # Thai_saraam
1684    0x0dd4   U0e34   .   # Thai_sarai
1685    0x0dd5   U0e35   .   # Thai_saraii
1686    0x0dd6   U0e36   .   # Thai_saraue
1687    0x0dd7   U0e37   .   # Thai_sarauee
1688    0x0dd8   U0e38   .   # Thai_sarau
1689    0x0dd9   U0e39   .   # Thai_sarauu
1690    0x0dda   U0e3a   .   # Thai_phinthu
1691    0x0dde   U0000   o   # Thai_maihanakat_maitho
1692    0x0ddf   U0e3f   .   # Thai_baht
1693    0x0de0   U0e40   .   # Thai_sarae
1694    0x0de1   U0e41   .   # Thai_saraae
1695    0x0de2   U0e42   .   # Thai_sarao
1696    0x0de3   U0e43   .   # Thai_saraaimaimuan
1697    0x0de4   U0e44   .   # Thai_saraaimaimalai
1698    0x0de5   U0e45   .   # Thai_lakkhangyao
1699    0x0de6   U0e46   .   # Thai_maiyamok
1700    0x0de7   U0e47   .   # Thai_maitaikhu
1701    0x0de8   U0e48   .   # Thai_maiek
1702    0x0de9   U0e49   .   # Thai_maitho
1703    0x0dea   U0e4a   .   # Thai_maitri
1704    0x0deb   U0e4b   .   # Thai_maichattawa
1705    0x0dec   U0e4c   .   # Thai_thanthakhat
1706    0x0ded   U0e4d   .   # Thai_nikhahit
1707    0x0df0   U0e50   .   # Thai_leksun
1708    0x0df1   U0e51   .   # Thai_leknung
1709    0x0df2   U0e52   .   # Thai_leksong
1710    0x0df3   U0e53   .   # Thai_leksam
1711    0x0df4   U0e54   .   # Thai_leksi
1712    0x0df5   U0e55   .   # Thai_lekha
1713    0x0df6   U0e56   .   # Thai_lekhok
1714    0x0df7   U0e57   .   # Thai_lekchet
1715    0x0df8   U0e58   .   # Thai_lekpaet
1716    0x0df9   U0e59   .   # Thai_lekkao
1717    0x0ea1   U3131   f   # Hangul_Kiyeog
1718    0x0ea2   U3132   f   # Hangul_SsangKiyeog
1719    0x0ea3   U3133   f   # Hangul_KiyeogSios
1720    0x0ea4   U3134   f   # Hangul_Nieun
1721    0x0ea5   U3135   f   # Hangul_NieunJieuj
1722    0x0ea6   U3136   f   # Hangul_NieunHieuh
1723    0x0ea7   U3137   f   # Hangul_Dikeud
1724    0x0ea8   U3138   f   # Hangul_SsangDikeud
1725    0x0ea9   U3139   f   # Hangul_Rieul
1726    0x0eaa   U313a   f   # Hangul_RieulKiyeog
1727    0x0eab   U313b   f   # Hangul_RieulMieum
1728    0x0eac   U313c   f   # Hangul_RieulPieub
1729    0x0ead   U313d   f   # Hangul_RieulSios
1730    0x0eae   U313e   f   # Hangul_RieulTieut
1731    0x0eaf   U313f   f   # Hangul_RieulPhieuf
1732    0x0eb0   U3140   f   # Hangul_RieulHieuh
1733    0x0eb1   U3141   f   # Hangul_Mieum
1734    0x0eb2   U3142   f   # Hangul_Pieub
1735    0x0eb3   U3143   f   # Hangul_SsangPieub
1736    0x0eb4   U3144   f   # Hangul_PieubSios
1737    0x0eb5   U3145   f   # Hangul_Sios
1738    0x0eb6   U3146   f   # Hangul_SsangSios
1739    0x0eb7   U3147   f   # Hangul_Ieung
1740    0x0eb8   U3148   f   # Hangul_Jieuj
1741    0x0eb9   U3149   f   # Hangul_SsangJieuj
1742    0x0eba   U314a   f   # Hangul_Cieuc
1743    0x0ebb   U314b   f   # Hangul_Khieuq
1744    0x0ebc   U314c   f   # Hangul_Tieut
1745    0x0ebd   U314d   f   # Hangul_Phieuf
1746    0x0ebe   U314e   f   # Hangul_Hieuh
1747    0x0ebf   U314f   f   # Hangul_A
1748    0x0ec0   U3150   f   # Hangul_AE
1749    0x0ec1   U3151   f   # Hangul_YA
1750    0x0ec2   U3152   f   # Hangul_YAE
1751    0x0ec3   U3153   f   # Hangul_EO
1752    0x0ec4   U3154   f   # Hangul_E
1753    0x0ec5   U3155   f   # Hangul_YEO
1754    0x0ec6   U3156   f   # Hangul_YE
1755    0x0ec7   U3157   f   # Hangul_O
1756    0x0ec8   U3158   f   # Hangul_WA
1757    0x0ec9   U3159   f   # Hangul_WAE
1758    0x0eca   U315a   f   # Hangul_OE
1759    0x0ecb   U315b   f   # Hangul_YO
1760    0x0ecc   U315c   f   # Hangul_U
1761    0x0ecd   U315d   f   # Hangul_WEO
1762    0x0ece   U315e   f   # Hangul_WE
1763    0x0ecf   U315f   f   # Hangul_WI
1764    0x0ed0   U3160   f   # Hangul_YU
1765    0x0ed1   U3161   f   # Hangul_EU
1766    0x0ed2   U3162   f   # Hangul_YI
1767    0x0ed3   U3163   f   # Hangul_I
1768    0x0ed4   U11a8   f   # Hangul_J_Kiyeog
1769    0x0ed5   U11a9   f   # Hangul_J_SsangKiyeog
1770    0x0ed6   U11aa   f   # Hangul_J_KiyeogSios
1771    0x0ed7   U11ab   f   # Hangul_J_Nieun
1772    0x0ed8   U11ac   f   # Hangul_J_NieunJieuj
1773    0x0ed9   U11ad   f   # Hangul_J_NieunHieuh
1774    0x0eda   U11ae   f   # Hangul_J_Dikeud
1775    0x0edb   U11af   f   # Hangul_J_Rieul
1776    0x0edc   U11b0   f   # Hangul_J_RieulKiyeog
1777    0x0edd   U11b1   f   # Hangul_J_RieulMieum
1778    0x0ede   U11b2   f   # Hangul_J_RieulPieub
1779    0x0edf   U11b3   f   # Hangul_J_RieulSios
1780    0x0ee0   U11b4   f   # Hangul_J_RieulTieut
1781    0x0ee1   U11b5   f   # Hangul_J_RieulPhieuf
1782    0x0ee2   U11b6   f   # Hangul_J_RieulHieuh
1783    0x0ee3   U11b7   f   # Hangul_J_Mieum
1784    0x0ee4   U11b8   f   # Hangul_J_Pieub
1785    0x0ee5   U11b9   f   # Hangul_J_PieubSios
1786    0x0ee6   U11ba   f   # Hangul_J_Sios
1787    0x0ee7   U11bb   f   # Hangul_J_SsangSios
1788    0x0ee8   U11bc   f   # Hangul_J_Ieung
1789    0x0ee9   U11bd   f   # Hangul_J_Jieuj
1790    0x0eea   U11be   f   # Hangul_J_Cieuc
1791    0x0eeb   U11bf   f   # Hangul_J_Khieuq
1792    0x0eec   U11c0   f   # Hangul_J_Tieut
1793    0x0eed   U11c1   f   # Hangul_J_Phieuf
1794    0x0eee   U11c2   f   # Hangul_J_Hieuh
1795    0x0eef   U316d   f   # Hangul_RieulYeorinHieuh
1796    0x0ef0   U3171   f   # Hangul_SunkyeongeumMieum
1797    0x0ef1   U3178   f   # Hangul_SunkyeongeumPieub
1798    0x0ef2   U317f   f   # Hangul_PanSios
1799    0x0ef3   U3181   f   # Hangul_KkogjiDalrinIeung
1800    0x0ef4   U3184   f   # Hangul_SunkyeongeumPhieuf
1801    0x0ef5   U3186   f   # Hangul_YeorinHieuh
1802    0x0ef6   U318d   f   # Hangul_AraeA
1803    0x0ef7   U318e   f   # Hangul_AraeAE
1804    0x0ef8   U11eb   f   # Hangul_J_PanSios
1805    0x0ef9   U11f0   f   # Hangul_J_KkogjiDalrinIeung
1806    0x0efa   U11f9   f   # Hangul_J_YeorinHieuh
1807    0x0eff   U20a9   o   # Korean_Won
1808    0x13bc   U0152   .   # OE
1809    0x13bd   U0153   .   # oe
1810    0x13be   U0178   .   # Ydiaeresis
1811    0x20a0   U20a0   u   # EcuSign
1812    0x20a1   U20a1   u   # ColonSign
1813    0x20a2   U20a2   u   # CruzeiroSign
1814    0x20a3   U20a3   u   # FFrancSign
1815    0x20a4   U20a4   u   # LiraSign
1816    0x20a5   U20a5   u   # MillSign
1817    0x20a6   U20a6   u   # NairaSign
1818    0x20a7   U20a7   u   # PesetaSign
1819    0x20a8   U20a8   u   # RupeeSign
1820    0x20a9   U20a9   u   # WonSign
1821    0x20aa   U20aa   u   # NewSheqelSign
1822    0x20ab   U20ab   u   # DongSign
1823    0x20ac   U20ac   .   # EuroSign
1824    0xfd01   U0000   f   # 3270_Duplicate
1825    0xfd02   U0000   f   # 3270_FieldMark
1826    0xfd03   U0000   f   # 3270_Right2
1827    0xfd04   U0000   f   # 3270_Left2
1828    0xfd05   U0000   f   # 3270_BackTab
1829    0xfd06   U0000   f   # 3270_EraseEOF
1830    0xfd07   U0000   f   # 3270_EraseInput
1831    0xfd08   U0000   f   # 3270_Reset
1832    0xfd09   U0000   f   # 3270_Quit
1833    0xfd0a   U0000   f   # 3270_PA1
1834    0xfd0b   U0000   f   # 3270_PA2
1835    0xfd0c   U0000   f   # 3270_PA3
1836    0xfd0d   U0000   f   # 3270_Test
1837    0xfd0e   U0000   f   # 3270_Attn
1838    0xfd0f   U0000   f   # 3270_CursorBlink
1839    0xfd10   U0000   f   # 3270_AltCursor
1840    0xfd11   U0000   f   # 3270_KeyClick
1841    0xfd12   U0000   f   # 3270_Jump
1842    0xfd13   U0000   f   # 3270_Ident
1843    0xfd14   U0000   f   # 3270_Rule
1844    0xfd15   U0000   f   # 3270_Copy
1845    0xfd16   U0000   f   # 3270_Play
1846    0xfd17   U0000   f   # 3270_Setup
1847    0xfd18   U0000   f   # 3270_Record
1848    0xfd19   U0000   f   # 3270_ChangeScreen
1849    0xfd1a   U0000   f   # 3270_DeleteWord
1850    0xfd1b   U0000   f   # 3270_ExSelect
1851    0xfd1c   U0000   f   # 3270_CursorSelect
1852    0xfd1d   U0000   f   # 3270_PrintScreen
1853    0xfd1e   U0000   f   # 3270_Enter
1854    0xfe01   U0000   f   # ISO_Lock
1855    0xfe02   U0000   f   # ISO_Level2_Latch}
1856    $FE03: Result := VK_RMENU; // ISO_Level3_Shift
1857    {0xfe04   U0000   f   # ISO_Level3_Latch
1858    0xfe05   U0000   f   # ISO_Level3_Lock
1859    0xfe06   U0000   f   # ISO_Group_Latch
1860    0xfe07   U0000   f   # ISO_Group_Lock
1861    0xfe08   U0000   f   # ISO_Next_Group
1862    0xfe09   U0000   f   # ISO_Next_Group_Lock
1863    0xfe0a   U0000   f   # ISO_Prev_Group
1864    0xfe0b   U0000   f   # ISO_Prev_Group_Lock
1865    0xfe0c   U0000   f   # ISO_First_Group
1866    0xfe0d   U0000   f   # ISO_First_Group_Lock
1867    0xfe0e   U0000   f   # ISO_Last_Group
1868    0xfe0f   U0000   f   # ISO_Last_Group_Lock
1869    0xfe20   U0000   f   # ISO_Left_Tab
1870    0xfe21   U0000   f   # ISO_Move_Line_Up
1871    0xfe22   U0000   f   # ISO_Move_Line_Down
1872    0xfe23   U0000   f   # ISO_Partial_Line_Up
1873    0xfe24   U0000   f   # ISO_Partial_Line_Down
1874    0xfe25   U0000   f   # ISO_Partial_Space_Left
1875    0xfe26   U0000   f   # ISO_Partial_Space_Right
1876    0xfe27   U0000   f   # ISO_Set_Margin_Left
1877    0xfe28   U0000   f   # ISO_Set_Margin_Right
1878    0xfe29   U0000   f   # ISO_Release_Margin_Left
1879    0xfe2a   U0000   f   # ISO_Release_Margin_Right
1880    0xfe2b   U0000   f   # ISO_Release_Both_Margins
1881    0xfe2c   U0000   f   # ISO_Fast_Cursor_Left
1882    0xfe2d   U0000   f   # ISO_Fast_Cursor_Right
1883    0xfe2e   U0000   f   # ISO_Fast_Cursor_Up
1884    0xfe2f   U0000   f   # ISO_Fast_Cursor_Down
1885    0xfe30   U0000   f   # ISO_Continuous_Underline
1886    0xfe31   U0000   f   # ISO_Discontinuous_Underline
1887    0xfe32   U0000   f   # ISO_Emphasize
1888    0xfe33   U0000   f   # ISO_Center_Object
1889    0xfe34   U0000   f   # ISO_Enter
1890    0xfe50   U0300   f   # dead_grave
1891    0xfe51   U0301   f   # dead_acute
1892    0xfe52   U0302   f   # dead_circumflex
1893    0xfe53   U0303   f   # dead_tilde
1894    0xfe54   U0304   f   # dead_macron
1895    0xfe55   U0306   f   # dead_breve
1896    0xfe56   U0307   f   # dead_abovedot
1897    0xfe57   U0308   f   # dead_diaeresis
1898    0xfe58   U030a   f   # dead_abovering
1899    0xfe59   U030b   f   # dead_doubleacute
1900    0xfe5a   U030c   f   # dead_caron
1901    0xfe5b   U0327   f   # dead_cedilla
1902    0xfe5c   U0328   f   # dead_ogonek
1903    0xfe5d   U0345   f   # dead_iota
1904    0xfe5e   U3099   f   # dead_voiced_sound
1905    0xfe5f   U309a   f   # dead_semivoiced_sound
1906    0xfe70   U0000   f   # AccessX_Enable
1907    0xfe71   U0000   f   # AccessX_Feedback_Enable
1908    0xfe72   U0000   f   # RepeatKeys_Enable
1909    0xfe73   U0000   f   # SlowKeys_Enable
1910    0xfe74   U0000   f   # BounceKeys_Enable
1911    0xfe75   U0000   f   # StickyKeys_Enable
1912    0xfe76   U0000   f   # MouseKeys_Enable
1913    0xfe77   U0000   f   # MouseKeys_Accel_Enable
1914    0xfe78   U0000   f   # Overlay1_Enable
1915    0xfe79   U0000   f   # Overlay2_Enable
1916    0xfe7a   U0000   f   # AudibleBell_Enable
1917    0xfed0   U0000   f   # First_Virtual_Screen
1918    0xfed1   U0000   f   # Prev_Virtual_Screen
1919    0xfed2   U0000   f   # Next_Virtual_Screen
1920    0xfed4   U0000   f   # Last_Virtual_Screen
1921    0xfed5   U0000   f   # Terminate_Server
1922    0xfee0   U0000   f   # Pointer_Left
1923    0xfee1   U0000   f   # Pointer_Right
1924    0xfee2   U0000   f   # Pointer_Up
1925    0xfee3   U0000   f   # Pointer_Down
1926    0xfee4   U0000   f   # Pointer_UpLeft
1927    0xfee5   U0000   f   # Pointer_UpRight
1928    0xfee6   U0000   f   # Pointer_DownLeft
1929    0xfee7   U0000   f   # Pointer_DownRight
1930    0xfee8   U0000   f   # Pointer_Button_Dflt
1931    0xfee9   U0000   f   # Pointer_Button1
1932    0xfeea   U0000   f   # Pointer_Button2
1933    0xfeeb   U0000   f   # Pointer_Button3
1934    0xfeec   U0000   f   # Pointer_Button4
1935    0xfeed   U0000   f   # Pointer_Button5
1936    0xfeee   U0000   f   # Pointer_DblClick_Dflt
1937    0xfeef   U0000   f   # Pointer_DblClick1
1938    0xfef0   U0000   f   # Pointer_DblClick2
1939    0xfef1   U0000   f   # Pointer_DblClick3
1940    0xfef2   U0000   f   # Pointer_DblClick4
1941    0xfef3   U0000   f   # Pointer_DblClick5
1942    0xfef4   U0000   f   # Pointer_Drag_Dflt
1943    0xfef5   U0000   f   # Pointer_Drag1
1944    0xfef6   U0000   f   # Pointer_Drag2
1945    0xfef7   U0000   f   # Pointer_Drag3
1946    0xfef8   U0000   f   # Pointer_Drag4
1947    0xfef9   U0000   f   # Pointer_EnableKeys
1948    0xfefa   U0000   f   # Pointer_Accelerate
1949    0xfefb   U0000   f   # Pointer_DfltBtnNext
1950    0xfefc   U0000   f   # Pointer_DfltBtnPrev
1951    0xfefd   U0000   f   # Pointer_Drag5}
1952    $FF08: Result := VK_BACK; // BackSpace	/* back space, back char */
1953    $FF09: Result := VK_TAB;
1954//    0xff0a   U000a   f   # Linefeed	/* Linefeed, LF */
1955    $FF0B: Result := VK_CLEAR;
1956    $FF0D: Result := VK_RETURN; // Return, enter */
1957{    0xff13   U0013   f   # Pause	/* Pause, hold */
1958    0xff14   U0014   f   # Scroll_Lock
1959    0xff15   U0015   f   # Sys_Req}
1960    $FF1B: Result := VK_ESCAPE;
1961{    0xff20   U0000   f   # Multi_key
1962    0xff21   U0000   f   # Kanji
1963    0xff22   U0000   f   # Muhenkan
1964    0xff23   U0000   f   # Henkan_Mode
1965    0xff24   U0000   f   # Romaji
1966    0xff25   U0000   f   # Hiragana
1967    0xff26   U0000   f   # Katakana
1968    0xff27   U0000   f   # Hiragana_Katakana
1969    0xff28   U0000   f   # Zenkaku
1970    0xff29   U0000   f   # Hankaku
1971    0xff2a   U0000   f   # Zenkaku_Hankaku
1972    0xff2b   U0000   f   # Touroku
1973    0xff2c   U0000   f   # Massyo
1974    0xff2d   U0000   f   # Kana_Lock
1975    0xff2e   U0000   f   # Kana_Shift
1976    0xff2f   U0000   f   # Eisu_Shift
1977    0xff30   U0000   f   # Eisu_toggle
1978    0xff31   U0000   f   # Hangul
1979    0xff32   U0000   f   # Hangul_Start
1980    0xff33   U0000   f   # Hangul_End
1981    0xff34   U0000   f   # Hangul_Hanja
1982    0xff35   U0000   f   # Hangul_Jamo
1983    0xff36   U0000   f   # Hangul_Romaja
1984    0xff37   U0000   f   # Codeinput
1985    0xff38   U0000   f   # Hangul_Jeonja
1986    0xff39   U0000   f   # Hangul_Banja
1987    0xff3a   U0000   f   # Hangul_PreHanja
1988    0xff3b   U0000   f   # Hangul_PostHanja
1989    0xff3c   U0000   f   # SingleCandidate
1990    0xff3d   U0000   f   # MultipleCandidate
1991    0xff3e   U0000   f   # PreviousCandidate
1992    0xff3f   U0000   f   # Hangul_Special}
1993    $FF50: Result := VK_HOME;
1994    $FF51: Result := VK_LEFT;
1995    $FF52: Result := VK_UP;
1996    $FF53: Result := VK_RIGHT;
1997    $FF54: Result := VK_DOWN;
1998    $FF55: Result := VK_PRIOR;
1999    $FF56: Result := VK_NEXT;
2000    $ff57: Result := VK_END;
2001{    0xff58   U0000   f   # Begin
2002    0xff60   U0000   f   # Select
2003    0xff61   U0000   f   # Print
2004    0xff62   U0000   f   # Execute
2005    0xff63   U0000   f   # Insert
2006    0xff65   U0000   f   # Undo
2007    0xff66   U0000   f   # Redo
2008    0xff67   U0000   f   # Menu
2009    0xff68   U0000   f   # Find
2010    0xff69   U0000   f   # Cancel
2011    0xff6a   U0000   f   # Help
2012    0xff6b   U0000   f   # Break
2013    0xff7e   U0000   f   # Mode_switch}
2014    $FF7F: Result := VK_NUMLOCK;
2015//    0xff7f   U0000   f   # Num_Lock
2016    $FF80: Result := VK_SPACE;
2017    $FF89: Result := VK_TAB;
2018    $FF8D: Result := VK_RETURN; // KP_Enter	/* enter */
2019{    0xff91   U0000   f   # KP_F1
2020    0xff92   U0000   f   # KP_F2
2021    0xff93   U0000   f   # KP_F3
2022    0xff94   U0000   f   # KP_F4
2023    0xff95   U0000   f   # KP_Home
2024    0xff96   U0000   f   # KP_Left
2025    0xff97   U0000   f   # KP_Up
2026    0xff98   U0000   f   # KP_Right
2027    0xff99   U0000   f   # KP_Down
2028    0xff9a   U0000   f   # KP_Prior
2029    0xff9b   U0000   f   # KP_Next
2030    0xff9c   U0000   f   # KP_End
2031    0xff9d   U0000   f   # KP_Begin
2032    0xff9e   U0000   f   # KP_Insert
2033    0xff9f   U0000   f   # KP_Delete
2034    0xffaa   U002a   f   # KP_Multiply
2035    0xffab   U002b   f   # KP_Add
2036    0xffac   U002c   f   # KP_Separator	/* separator, often comma */
2037    0xffad   U002d   f   # KP_Subtract
2038    0xffae   U002e   f   # KP_Decimal
2039    0xffaf   U002f   f   # KP_Divide
2040    0xffb0   U0030   f   # KP_0
2041    0xffb1   U0031   f   # KP_1
2042    0xffb2   U0032   f   # KP_2
2043    0xffb3   U0033   f   # KP_3
2044    0xffb4   U0034   f   # KP_4
2045    0xffb5   U0035   f   # KP_5
2046    0xffb6   U0036   f   # KP_6
2047    0xffb7   U0037   f   # KP_7
2048    0xffb8   U0038   f   # KP_8
2049    0xffb9   U0039   f   # KP_9
2050    0xffbd   U003d   f   # KP_Equal	/* equals */}
2051    $FFBE: Result := VK_F1;
2052    $FFBF: Result := VK_F2;
2053    $FFC0: Result := VK_F3;
2054    $FFC1: Result := VK_F4;
2055    $FFC2: Result := VK_F5;
2056    $FFC3: Result := VK_F6;
2057    $FFC4: Result := VK_F7;
2058    $FFC5: Result := VK_F8;
2059    $FFC6: Result := VK_F9;
2060    $FFC7: Result := VK_F10;
2061    $FFC8: Result := VK_F11;
2062    $FFC9: Result := VK_F12;
2063{    0xffca   U0000   f   # F13
2064    0xffcb   U0000   f   # F14
2065    0xffcc   U0000   f   # F15
2066    0xffcd   U0000   f   # F16
2067    0xffce   U0000   f   # F17
2068    0xffcf   U0000   f   # F18
2069    0xffd0   U0000   f   # F19
2070    0xffd1   U0000   f   # F20
2071    0xffd2   U0000   f   # F21
2072    0xffd3   U0000   f   # F22
2073    0xffd4   U0000   f   # F23
2074    0xffd5   U0000   f   # F24
2075    0xffd6   U0000   f   # F25
2076    0xffd7   U0000   f   # F26
2077    0xffd8   U0000   f   # F27
2078    0xffd9   U0000   f   # F28
2079    0xffda   U0000   f   # F29
2080    0xffdb   U0000   f   # F30
2081    0xffdc   U0000   f   # F31
2082    0xffdd   U0000   f   # F32
2083    0xffde   U0000   f   # F33
2084    0xffdf   U0000   f   # F34
2085    0xffe0   U0000   f   # F35}
2086    $FFE1: Result := VK_LSHIFT;
2087    $FFE2: Result := VK_RSHIFT;
2088    $FFE3: Result := VK_LCONTROL;
2089    $FFE4: Result := VK_RCONTROL;
2090{    0xffe5   U0000   f   # Caps_Lock
2091    0xffe6   U0000   f   # Shift_Lock
2092    0xffe7   U0000   f   # Meta_L
2093    0xffe8   U0000   f   # Meta_R}
2094    $FFE9: Result := VK_LMENU;
2095    {0xffea   U0000   f   # Alt_R
2096    0xffeb   U0000   f   # Super_L
2097    0xffec   U0000   f   # Super_R
2098    0xffed   U0000   f   # Hyper_L
2099    0xffee   U0000   f   # Hyper_R
2100    0xffff   U0000   f   # Delete }
2101    $FFFF: Result := VK_DELETE;
2102{    0xffffff U0000   f   # VoidSymbol
2103
2104    # Various XFree86 extensions since X11R6.4
2105    # http://cvsweb.xfree86.org/cvsweb/xc/include/keysymdef.h
2106
2107    # KOI8-U support (Aleksey Novodvorsky, 1999-05-30)
2108    # http://cvsweb.xfree86.org/cvsweb/xc/include/keysymdef.h.diff?r1=1.4&r2=1.5
2109    # Used in XFree86's /usr/lib/X11/xkb/symbols/ua mappings
2110
2111    0x06ad   U0491   .   # Ukrainian_ghe_with_upturn
2112    0x06bd   U0490   .   # Ukrainian_GHE_WITH_UPTURN
2113
2114    # Support for armscii-8, ibm-cp1133, mulelao-1, viscii1.1-1,
2115    # tcvn-5712, georgian-academy, georgian-ps
2116    # (#2843, Pablo Saratxaga <pablo@mandrakesoft.com>, 1999-06-06)
2117    # http://cvsweb.xfree86.org/cvsweb/xc/include/keysymdef.h.diff?r1=1.6&r2=1.7
2118
2119    # Armenian
2120    # (not used in any XFree86 4.4 kbd layouts, where /usr/lib/X11/xkb/symbols/am
2121    # uses directly Unicode-mapped hexadecimal values instead)
2122    0x14a1   U0000   r   # Armenian_eternity
2123    0x14a2   U0587   u   # Armenian_ligature_ew
2124    0x14a3   U0589   u   # Armenian_verjaket
2125    0x14a4   U0029   r   # Armenian_parenright
2126    0x14a5   U0028   r   # Armenian_parenleft
2127    0x14a6   U00bb   r   # Armenian_guillemotright
2128    0x14a7   U00ab   r   # Armenian_guillemotleft
2129    0x14a8   U2014   r   # Armenian_em_dash
2130    0x14a9   U002e   r   # Armenian_mijaket
2131    0x14aa   U055d   u   # Armenian_but
2132    0x14ab   U002c   r   # Armenian_comma
2133    0x14ac   U2013   r   # Armenian_en_dash
2134    0x14ad   U058a   u   # Armenian_yentamna
2135    0x14ae   U2026   r   # Armenian_ellipsis
2136    0x14af   U055c   u   # Armenian_amanak
2137    0x14b0   U055b   u   # Armenian_shesht
2138    0x14b1   U055e   u   # Armenian_paruyk
2139    0x14b2   U0531   u   # Armenian_AYB
2140    0x14b3   U0561   u   # Armenian_ayb
2141    0x14b4   U0532   u   # Armenian_BEN
2142    0x14b5   U0562   u   # Armenian_ben
2143    0x14b6   U0533   u   # Armenian_GIM
2144    0x14b7   U0563   u   # Armenian_gim
2145    0x14b8   U0534   u   # Armenian_DA
2146    0x14b9   U0564   u   # Armenian_da
2147    0x14ba   U0535   u   # Armenian_YECH
2148    0x14bb   U0565   u   # Armenian_yech
2149    0x14bc   U0536   u   # Armenian_ZA
2150    0x14bd   U0566   u   # Armenian_za
2151    0x14be   U0537   u   # Armenian_E
2152    0x14bf   U0567   u   # Armenian_e
2153    0x14c0   U0538   u   # Armenian_AT
2154    0x14c1   U0568   u   # Armenian_at
2155    0x14c2   U0539   u   # Armenian_TO
2156    0x14c3   U0569   u   # Armenian_to
2157    0x14c4   U053a   u   # Armenian_ZHE
2158    0x14c5   U056a   u   # Armenian_zhe
2159    0x14c6   U053b   u   # Armenian_INI
2160    0x14c7   U056b   u   # Armenian_ini
2161    0x14c8   U053c   u   # Armenian_LYUN
2162    0x14c9   U056c   u   # Armenian_lyun
2163    0x14ca   U053d   u   # Armenian_KHE
2164    0x14cb   U056d   u   # Armenian_khe
2165    0x14cc   U053e   u   # Armenian_TSA
2166    0x14cd   U056e   u   # Armenian_tsa
2167    0x14ce   U053f   u   # Armenian_KEN
2168    0x14cf   U056f   u   # Armenian_ken
2169    0x14d0   U0540   u   # Armenian_HO
2170    0x14d1   U0570   u   # Armenian_ho
2171    0x14d2   U0541   u   # Armenian_DZA
2172    0x14d3   U0571   u   # Armenian_dza
2173    0x14d4   U0542   u   # Armenian_GHAT
2174    0x14d5   U0572   u   # Armenian_ghat
2175    0x14d6   U0543   u   # Armenian_TCHE
2176    0x14d7   U0573   u   # Armenian_tche
2177    0x14d8   U0544   u   # Armenian_MEN
2178    0x14d9   U0574   u   # Armenian_men
2179    0x14da   U0545   u   # Armenian_HI
2180    0x14db   U0575   u   # Armenian_hi
2181    0x14dc   U0546   u   # Armenian_NU
2182    0x14dd   U0576   u   # Armenian_nu
2183    0x14de   U0547   u   # Armenian_SHA
2184    0x14df   U0577   u   # Armenian_sha
2185    0x14e0   U0548   u   # Armenian_VO
2186    0x14e1   U0578   u   # Armenian_vo
2187    0x14e2   U0549   u   # Armenian_CHA
2188    0x14e3   U0579   u   # Armenian_cha
2189    0x14e4   U054a   u   # Armenian_PE
2190    0x14e5   U057a   u   # Armenian_pe
2191    0x14e6   U054b   u   # Armenian_JE
2192    0x14e7   U057b   u   # Armenian_je
2193    0x14e8   U054c   u   # Armenian_RA
2194    0x14e9   U057c   u   # Armenian_ra
2195    0x14ea   U054d   u   # Armenian_SE
2196    0x14eb   U057d   u   # Armenian_se
2197    0x14ec   U054e   u   # Armenian_VEV
2198    0x14ed   U057e   u   # Armenian_vev
2199    0x14ee   U054f   u   # Armenian_TYUN
2200    0x14ef   U057f   u   # Armenian_tyun
2201    0x14f0   U0550   u   # Armenian_RE
2202    0x14f1   U0580   u   # Armenian_re
2203    0x14f2   U0551   u   # Armenian_TSO
2204    0x14f3   U0581   u   # Armenian_tso
2205    0x14f4   U0552   u   # Armenian_VYUN
2206    0x14f5   U0582   u   # Armenian_vyun
2207    0x14f6   U0553   u   # Armenian_PYUR
2208    0x14f7   U0583   u   # Armenian_pyur
2209    0x14f8   U0554   u   # Armenian_KE
2210    0x14f9   U0584   u   # Armenian_ke
2211    0x14fa   U0555   u   # Armenian_O
2212    0x14fb   U0585   u   # Armenian_o
2213    0x14fc   U0556   u   # Armenian_FE
2214    0x14fd   U0586   u   # Armenian_fe
2215    0x14fe   U055a   u   # Armenian_apostrophe
2216    0x14ff   U00a7   r   # Armenian_section_sign
2217
2218    # Gregorian
2219    # (not used in any XFree86 4.4 kbd layouts, were /usr/lib/X11/xkb/symbols/ge_*
2220    # uses directly Unicode-mapped hexadecimal values instead)
2221    0x15d0   U10d0   u   # Georgian_an
2222    0x15d1   U10d1   u   # Georgian_ban
2223    0x15d2   U10d2   u   # Georgian_gan
2224    0x15d3   U10d3   u   # Georgian_don
2225    0x15d4   U10d4   u   # Georgian_en
2226    0x15d5   U10d5   u   # Georgian_vin
2227    0x15d6   U10d6   u   # Georgian_zen
2228    0x15d7   U10d7   u   # Georgian_tan
2229    0x15d8   U10d8   u   # Georgian_in
2230    0x15d9   U10d9   u   # Georgian_kan
2231    0x15da   U10da   u   # Georgian_las
2232    0x15db   U10db   u   # Georgian_man
2233    0x15dc   U10dc   u   # Georgian_nar
2234    0x15dd   U10dd   u   # Georgian_on
2235    0x15de   U10de   u   # Georgian_par
2236    0x15df   U10df   u   # Georgian_zhar
2237    0x15e0   U10e0   u   # Georgian_rae
2238    0x15e1   U10e1   u   # Georgian_san
2239    0x15e2   U10e2   u   # Georgian_tar
2240    0x15e3   U10e3   u   # Georgian_un
2241    0x15e4   U10e4   u   # Georgian_phar
2242    0x15e5   U10e5   u   # Georgian_khar
2243    0x15e6   U10e6   u   # Georgian_ghan
2244    0x15e7   U10e7   u   # Georgian_qar
2245    0x15e8   U10e8   u   # Georgian_shin
2246    0x15e9   U10e9   u   # Georgian_chin
2247    0x15ea   U10ea   u   # Georgian_can
2248    0x15eb   U10eb   u   # Georgian_jil
2249    0x15ec   U10ec   u   # Georgian_cil
2250    0x15ed   U10ed   u   # Georgian_char
2251    0x15ee   U10ee   u   # Georgian_xan
2252    0x15ef   U10ef   u   # Georgian_jhan
2253    0x15f0   U10f0   u   # Georgian_hae
2254    0x15f1   U10f1   u   # Georgian_he
2255    0x15f2   U10f2   u   # Georgian_hie
2256    0x15f3   U10f3   u   # Georgian_we
2257    0x15f4   U10f4   u   # Georgian_har
2258    0x15f5   U10f5   u   # Georgian_hoe
2259    0x15f6   U10f6   u   # Georgian_fi
2260
2261    # Pablo Saratxaga's i18n updates for XFree86 that are used in Mandrake 7.2.
2262    # (#4195, Pablo Saratxaga <pablo@mandrakesoft.com>, 2000-10-27)
2263    # http://cvsweb.xfree86.org/cvsweb/xc/include/keysymdef.h.diff?r1=1.9&r2=1.10
2264
2265    # Latin-8
2266    # (the *abovedot keysyms are used in /usr/lib/X11/xkb/symbols/ie)
2267    0x12a1   U1e02   u   # Babovedot
2268    0x12a2   U1e03   u   # babovedot
2269    0x12a6   U1e0a   u   # Dabovedot
2270    0x12a8   U1e80   u   # Wgrave
2271    0x12aa   U1e82   u   # Wacute
2272    0x12ab   U1e0b   u   # dabovedot
2273    0x12ac   U1ef2   u   # Ygrave
2274    0x12b0   U1e1e   u   # Fabovedot
2275    0x12b1   U1e1f   u   # fabovedot
2276    0x12b4   U1e40   u   # Mabovedot
2277    0x12b5   U1e41   u   # mabovedot
2278    0x12b7   U1e56   u   # Pabovedot
2279    0x12b8   U1e81   u   # wgrave
2280    0x12b9   U1e57   u   # pabovedot
2281    0x12ba   U1e83   u   # wacute
2282    0x12bb   U1e60   u   # Sabovedot
2283    0x12bc   U1ef3   u   # ygrave
2284    0x12bd   U1e84   u   # Wdiaeresis
2285    0x12be   U1e85   u   # wdiaeresis
2286    0x12bf   U1e61   u   # sabovedot
2287    0x12d0   U0174   u   # Wcircumflex
2288    0x12d7   U1e6a   u   # Tabovedot
2289    0x12de   U0176   u   # Ycircumflex
2290    0x12f0   U0175   u   # wcircumflex
2291    0x12f7   U1e6b   u   # tabovedot
2292    0x12fe   U0177   u   # ycircumflex
2293
2294    # Arabic
2295    # (of these, in XFree86 4.4 only Arabic_superscript_alef, Arabic_madda_above,
2296    # Arabic_hamza_* are actually used, e.g. in /usr/lib/X11/xkb/symbols/syr)
2297    0x0590   U06f0   u   # Farsi_0
2298    0x0591   U06f1   u   # Farsi_1
2299    0x0592   U06f2   u   # Farsi_2
2300    0x0593   U06f3   u   # Farsi_3
2301    0x0594   U06f4   u   # Farsi_4
2302    0x0595   U06f5   u   # Farsi_5
2303    0x0596   U06f6   u   # Farsi_6
2304    0x0597   U06f7   u   # Farsi_7
2305    0x0598   U06f8   u   # Farsi_8
2306    0x0599   U06f9   u   # Farsi_9
2307    0x05a5   U066a   u   # Arabic_percent
2308    0x05a6   U0670   u   # Arabic_superscript_alef
2309    0x05a7   U0679   u   # Arabic_tteh
2310    0x05a8   U067e   u   # Arabic_peh
2311    0x05a9   U0686   u   # Arabic_tcheh
2312    0x05aa   U0688   u   # Arabic_ddal
2313    0x05ab   U0691   u   # Arabic_rreh
2314    0x05ae   U06d4   u   # Arabic_fullstop
2315    0x05b0   U0660   u   # Arabic_0
2316    0x05b1   U0661   u   # Arabic_1
2317    0x05b2   U0662   u   # Arabic_2
2318    0x05b3   U0663   u   # Arabic_3
2319    0x05b4   U0664   u   # Arabic_4
2320    0x05b5   U0665   u   # Arabic_5
2321    0x05b6   U0666   u   # Arabic_6
2322    0x05b7   U0667   u   # Arabic_7
2323    0x05b8   U0668   u   # Arabic_8
2324    0x05b9   U0669   u   # Arabic_9
2325    0x05f3   U0653   u   # Arabic_madda_above
2326    0x05f4   U0654   u   # Arabic_hamza_above
2327    0x05f5   U0655   u   # Arabic_hamza_below
2328    0x05f6   U0698   u   # Arabic_jeh
2329    0x05f7   U06a4   u   # Arabic_veh
2330    0x05f8   U06a9   u   # Arabic_keheh
2331    0x05f9   U06af   u   # Arabic_gaf
2332    0x05fa   U06ba   u   # Arabic_noon_ghunna
2333    0x05fb   U06be   u   # Arabic_heh_doachashmee
2334    0x05fc   U06cc   u   # Farsi_yeh
2335    0x05fd   U06d2   u   # Arabic_yeh_baree
2336    0x05fe   U06c1   u   # Arabic_heh_goal
2337
2338    # Cyrillic
2339    # (none of these are actually used in any XFree86 4.4 kbd layouts)
2340    0x0680   U0492   u   # Cyrillic_GHE_bar
2341    0x0681   U0496   u   # Cyrillic_ZHE_descender
2342    0x0682   U049a   u   # Cyrillic_KA_descender
2343    0x0683   U049c   u   # Cyrillic_KA_vertstroke
2344    0x0684   U04a2   u   # Cyrillic_EN_descender
2345    0x0685   U04ae   u   # Cyrillic_U_straight
2346    0x0686   U04b0   u   # Cyrillic_U_straight_bar
2347    0x0687   U04b2   u   # Cyrillic_HA_descender
2348    0x0688   U04b6   u   # Cyrillic_CHE_descender
2349    0x0689   U04b8   u   # Cyrillic_CHE_vertstroke
2350    0x068a   U04ba   u   # Cyrillic_SHHA
2351    0x068c   U04d8   u   # Cyrillic_SCHWA
2352    0x068d   U04e2   u   # Cyrillic_I_macron
2353    0x068e   U04e8   u   # Cyrillic_O_bar
2354    0x068f   U04ee   u   # Cyrillic_U_macron
2355    0x0690   U0493   u   # Cyrillic_ghe_bar
2356    0x0691   U0497   u   # Cyrillic_zhe_descender
2357    0x0692   U049b   u   # Cyrillic_ka_descender
2358    0x0693   U049d   u   # Cyrillic_ka_vertstroke
2359    0x0694   U04a3   u   # Cyrillic_en_descender
2360    0x0695   U04af   u   # Cyrillic_u_straight
2361    0x0696   U04b1   u   # Cyrillic_u_straight_bar
2362    0x0697   U04b3   u   # Cyrillic_ha_descender
2363    0x0698   U04b7   u   # Cyrillic_che_descender
2364    0x0699   U04b9   u   # Cyrillic_che_vertstroke
2365    0x069a   U04bb   u   # Cyrillic_shha
2366    0x069c   U04d9   u   # Cyrillic_schwa
2367    0x069d   U04e3   u   # Cyrillic_i_macron
2368    0x069e   U04e9   u   # Cyrillic_o_bar
2369    0x069f   U04ef   u   # Cyrillic_u_macron
2370
2371    # Caucasus
2372    # (of these, in XFree86 4.4 only Gcaron, gcaron are actually used,
2373    # e.g. in /usr/lib/X11/xkb/symbols/sapmi; the lack of Unicode
2374    # equivalents for the others suggests that they are bogus)
2375    0x16a2   U0000   r   # Ccedillaabovedot
2376    0x16a3   U1e8a   u   # Xabovedot
2377    0x16a5   U0000   r   # Qabovedot
2378    0x16a6   U012c   u   # Ibreve
2379    0x16a7   U0000   r   # IE
2380    0x16a8   U0000   r   # UO
2381    0x16a9   U01b5   u   # Zstroke
2382    0x16aa   U01e6   u   # Gcaron
2383    0x16af   U019f   u   # Obarred
2384    0x16b2   U0000   r   # ccedillaabovedot
2385    0x16b3   U1e8b   u   # xabovedot
2386    0x16b4   U0000   r   # Ocaron
2387    0x16b5   U0000   r   # qabovedot
2388    0x16b6   U012d   u   # ibreve
2389    0x16b7   U0000   r   # ie
2390    0x16b8   U0000   r   # uo
2391    0x16b9   U01b6   u   # zstroke
2392    0x16ba   U01e7   u   # gcaron
2393    0x16bd   U01d2   u   # ocaron
2394    0x16bf   U0275   u   # obarred
2395    0x16c6   U018f   u   # SCHWA
2396    0x16f6   U0259   u   # schwa
2397
2398    # Inupiak, Guarani
2399    # (none of these are actually used in any XFree86 4.4 kbd layouts,
2400    # and the lack of Unicode equivalents suggests that they are bogus)
2401    0x16d1   U1e36   u   # Lbelowdot
2402    0x16d2   U0000   r   # Lstrokebelowdot
2403    0x16d3   U0000   r   # Gtilde
2404    0x16e1   U1e37   u   # lbelowdot
2405    0x16e2   U0000   r   # lstrokebelowdot
2406    0x16e3   U0000   r   # gtilde
2407
2408    # Vietnamese
2409    # (none of these are actually used in any XFree86 4.4 kbd layouts; they are
2410    # also pointless, as Vietnamese input methods use dead accent keys + ASCII keys)
2411    0x1ea0   U1ea0   u   # Abelowdot
2412    0x1ea1   U1ea1   u   # abelowdot
2413    0x1ea2   U1ea2   u   # Ahook
2414    0x1ea3   U1ea3   u   # ahook
2415    0x1ea4   U1ea4   u   # Acircumflexacute
2416    0x1ea5   U1ea5   u   # acircumflexacute
2417    0x1ea6   U1ea6   u   # Acircumflexgrave
2418    0x1ea7   U1ea7   u   # acircumflexgrave
2419    0x1ea8   U1ea8   u   # Acircumflexhook
2420    0x1ea9   U1ea9   u   # acircumflexhook
2421    0x1eaa   U1eaa   u   # Acircumflextilde
2422    0x1eab   U1eab   u   # acircumflextilde
2423    0x1eac   U1eac   u   # Acircumflexbelowdot
2424    0x1ead   U1ead   u   # acircumflexbelowdot
2425    0x1eae   U1eae   u   # Abreveacute
2426    0x1eaf   U1eaf   u   # abreveacute
2427    0x1eb0   U1eb0   u   # Abrevegrave
2428    0x1eb1   U1eb1   u   # abrevegrave
2429    0x1eb2   U1eb2   u   # Abrevehook
2430    0x1eb3   U1eb3   u   # abrevehook
2431    0x1eb4   U1eb4   u   # Abrevetilde
2432    0x1eb5   U1eb5   u   # abrevetilde
2433    0x1eb6   U1eb6   u   # Abrevebelowdot
2434    0x1eb7   U1eb7   u   # abrevebelowdot
2435    0x1eb8   U1eb8   u   # Ebelowdot
2436    0x1eb9   U1eb9   u   # ebelowdot
2437    0x1eba   U1eba   u   # Ehook
2438    0x1ebb   U1ebb   u   # ehook
2439    0x1ebc   U1ebc   u   # Etilde
2440    0x1ebd   U1ebd   u   # etilde
2441    0x1ebe   U1ebe   u   # Ecircumflexacute
2442    0x1ebf   U1ebf   u   # ecircumflexacute
2443    0x1ec0   U1ec0   u   # Ecircumflexgrave
2444    0x1ec1   U1ec1   u   # ecircumflexgrave
2445    0x1ec2   U1ec2   u   # Ecircumflexhook
2446    0x1ec3   U1ec3   u   # ecircumflexhook
2447    0x1ec4   U1ec4   u   # Ecircumflextilde
2448    0x1ec5   U1ec5   u   # ecircumflextilde
2449    0x1ec6   U1ec6   u   # Ecircumflexbelowdot
2450    0x1ec7   U1ec7   u   # ecircumflexbelowdot
2451    0x1ec8   U1ec8   u   # Ihook
2452    0x1ec9   U1ec9   u   # ihook
2453    0x1eca   U1eca   u   # Ibelowdot
2454    0x1ecb   U1ecb   u   # ibelowdot
2455    0x1ecc   U1ecc   u   # Obelowdot
2456    0x1ecd   U1ecd   u   # obelowdot
2457    0x1ece   U1ece   u   # Ohook
2458    0x1ecf   U1ecf   u   # ohook
2459    0x1ed0   U1ed0   u   # Ocircumflexacute
2460    0x1ed1   U1ed1   u   # ocircumflexacute
2461    0x1ed2   U1ed2   u   # Ocircumflexgrave
2462    0x1ed3   U1ed3   u   # ocircumflexgrave
2463    0x1ed4   U1ed4   u   # Ocircumflexhook
2464    0x1ed5   U1ed5   u   # ocircumflexhook
2465    0x1ed6   U1ed6   u   # Ocircumflextilde
2466    0x1ed7   U1ed7   u   # ocircumflextilde
2467    0x1ed8   U1ed8   u   # Ocircumflexbelowdot
2468    0x1ed9   U1ed9   u   # ocircumflexbelowdot
2469    0x1eda   U1eda   u   # Ohornacute
2470    0x1edb   U1edb   u   # ohornacute
2471    0x1edc   U1edc   u   # Ohorngrave
2472    0x1edd   U1edd   u   # ohorngrave
2473    0x1ede   U1ede   u   # Ohornhook
2474    0x1edf   U1edf   u   # ohornhook
2475    0x1ee0   U1ee0   u   # Ohorntilde
2476    0x1ee1   U1ee1   u   # ohorntilde
2477    0x1ee2   U1ee2   u   # Ohornbelowdot
2478    0x1ee3   U1ee3   u   # ohornbelowdot
2479    0x1ee4   U1ee4   u   # Ubelowdot
2480    0x1ee5   U1ee5   u   # ubelowdot
2481    0x1ee6   U1ee6   u   # Uhook
2482    0x1ee7   U1ee7   u   # uhook
2483    0x1ee8   U1ee8   u   # Uhornacute
2484    0x1ee9   U1ee9   u   # uhornacute
2485    0x1eea   U1eea   u   # Uhorngrave
2486    0x1eeb   U1eeb   u   # uhorngrave
2487    0x1eec   U1eec   u   # Uhornhook
2488    0x1eed   U1eed   u   # uhornhook
2489    0x1eee   U1eee   u   # Uhorntilde
2490    0x1eef   U1eef   u   # uhorntilde
2491    0x1ef0   U1ef0   u   # Uhornbelowdot
2492    0x1ef1   U1ef1   u   # uhornbelowdot
2493    0x1ef4   U1ef4   u   # Ybelowdot
2494    0x1ef5   U1ef5   u   # ybelowdot
2495    0x1ef6   U1ef6   u   # Yhook
2496    0x1ef7   U1ef7   u   # yhook
2497    0x1ef8   U1ef8   u   # Ytilde
2498    0x1ef9   U1ef9   u   # ytilde
2499
2500    0x1efa   U01a0   u   # Ohorn
2501    0x1efb   U01a1   u   # ohorn
2502    0x1efc   U01af   u   # Uhorn
2503    0x1efd   U01b0   u   # uhorn
2504
2505    # (Unicode combining characters have no direct equivalence with
2506    # keysyms, where dead keys are defined instead)
2507    0x1e9f   U0303   r   # combining_tilde
2508    0x1ef2   U0300   r   # combining_grave
2509    0x1ef3   U0301   r   # combining_acute
2510    0x1efe   U0309   r   # combining_hook
2511    0x1eff   U0323   r   # combining_belowdot
2512
2513    # These probably should be added to the X11 standard properly,
2514    # as they could be of use for Vietnamese input methods.
2515    0xfe60   U0323   f   # dead_belowdot
2516    0xfe61   U0309   f   # dead_hook
2517    0xfe62   U031b   f   # dead_horn}
2518  else
2519    Result := 0;
2520  end;
2521  if Result = 0 then DebugLn('[X11KeyToLCLKey] Unknown KeySym: $' + IntToHex(AX11Key, 4));
2522end;
2523
2524class function TCDWSCustomForm.DoCreateHandle(const AWinControl: TWinControl;
2525  const AParams: TCreateParams): TLCLIntfHandle;
2526begin
2527end;
2528
2529class procedure TCDWSCustomForm.DoShowHide(const AWinControl: TWinControl);
2530begin
2531end;
2532
2533{------------------------------------------------------------------------------
2534  Method: TCDWSCustomForm.CreateHandle
2535  Params:  None
2536  Returns: Nothing
2537
2538  Creates a Windows CE Form, initializes it according to it´s properties and shows it
2539 ------------------------------------------------------------------------------}
2540class function TCDWSCustomForm.CreateHandle(const AWinControl: TWinControl;
2541  const AParams: TCreateParams): TLCLIntfHandle;
2542const
2543  WindowHints: TXWMHints = (
2544    flags: InputHint or StateHint or WindowGroupHint;
2545    input: 1;
2546    initial_state: NormalState;
2547    icon_pixmap: 0;
2548    icon_window: 0;
2549    icon_x: 0;
2550    icon_y: 0;
2551    icon_mask: 0;
2552    window_group: 0;
2553  );
2554var
2555  Colormap: TColormap;
2556  Attr: TXSetWindowAttributes;
2557  SizeHints: TXSizeHints;
2558  ClassHint: PXClassHint;
2559  lParentHandle: X.TWindow;
2560  mask: longword;
2561  lWindowInfo: TX11WindowInfo;
2562  lWindow: TWindow;
2563  AForm: TCustomForm absolute AWinControl;
2564begin
2565  {$ifdef VerboseCDForms}
2566  DebugLn(Format(':>[TCDWSCustomForm.CreateHandle] AWinControl=%x Name=%s: %s',
2567    [PtrInt(AWinControl), AWinControl.Name, AWinControl.ClassName]));
2568  {$endif}
2569  Colormap := XDefaultColormap(CDWidgetSet.FDisplay, XDefaultScreen(CDWidgetSet.FDisplay));
2570  Attr.Colormap := Colormap;
2571
2572  SizeHints.flags     := XUtil.PSize;
2573  SizeHints.x         := 0; // If it doesnt start with zero, setting bounds later on fails, no idea why
2574  SizeHints.y         := 0;
2575  SizeHints.width     := 200;
2576  SizeHints.height    := 200;
2577
2578  { Make sure we use the correct parent handle }
2579{  if FParent <> nil then
2580    lParentHandle := TX11Window(FParent).Handle
2581  else}
2582    lParentHandle := XDefaultRootWindow(CDWidgetSet.FDisplay);
2583
2584  { setup attributes and masks }
2585  if (AForm.BorderStyle in [bsNone, bsToolWindow]) then
2586  begin
2587    Attr.Override_Redirect := 1;    // this removes window borders
2588    mask := CWOverrideRedirect;// or CWColormap;
2589  end
2590{  else if (woPopup in WindowOptions) then
2591  begin
2592    Attr.Override_Redirect := True;    // this removes window borders
2593    Attr.save_under := True;
2594    mask := CWOverrideRedirect or CWSaveUnder;
2595  end}
2596  else
2597  begin
2598    Attr.Override_Redirect := 0;
2599    mask := CWColormap;
2600  end;
2601
2602  lWindow := XCreateWindow(
2603    CDWidgetSet.FDisplay,
2604    lParentHandle,                      // parent
2605    SizeHints.x, SizeHints.x,           // position (top, left)
2606    SizeHints.width, SizeHints.height,  // default size (width, height)
2607    0,                                  // border size
2608    CopyFromParent,                     // depth
2609    InputOutput,                        // class
2610    XDefaultVisual(CDWidgetSet.FDisplay, XDefaultScreen(CDWidgetSet.FDisplay)),  // visual
2611    mask,
2612    @Attr);
2613
2614  if lWindow = 0 then
2615    raise Exception.Create('[TCDWSCustomForm.CreateHandle] Window creation failed');
2616
2617  XSelectInput(CDWidgetSet.FDisplay, lWindow, KeyPressMask or KeyReleaseMask
2618    or ButtonPressMask or ButtonReleaseMask
2619    or EnterWindowMask or LeaveWindowMask
2620    or ButtonMotionMask or PointerMotionMask
2621    or ExposureMask
2622    or FocusChangeMask
2623    or StructureNotifyMask
2624//    or PropertyChangeMask
2625    );
2626
2627//  if (not (woX11SkipWMHints in WindowOptions)) and (woWindow in WindowOptions) then
2628//  begin
2629    XSetStandardProperties(CDWidgetSet.FDisplay, lWindow, nil, nil, 0,
2630     argv, argc, @SizeHints);
2631
2632    XSetWMNormalHints(CDWidgetSet.FDisplay, lWindow, @SizeHints);
2633
2634    WindowHints.flags := WindowGroupHint;
2635    WindowHints.window_group := CDWidgetSet.LeaderWindow;
2636    XSetWMHints(CDWidgetSet.FDisplay, lWindow, @WindowHints);
2637
2638    XChangeProperty(CDWidgetSet.FDisplay, lWindow, CDWidgetSet.ClientLeaderAtom, 33, 32,
2639     PropModeReplace, @CDWidgetSet.LeaderWindow, 1);
2640
2641     // We want to get a Client Message when the user tries to close this window
2642    if CDWidgetSet.FWMProtocols = 0 then
2643     CDWidgetSet.FWMProtocols := XInternAtom(CDWidgetSet.FDisplay, 'WM_PROTOCOLS', False);
2644    if CDWidgetSet.FWMDeleteWindow = 0 then
2645     CDWidgetSet.FWMDeleteWindow := XInternAtom(CDWidgetSet.FDisplay, 'WM_DELETE_WINDOW', False);
2646    {$ifdef CD_X11_NewNativePaint}
2647    // Client Message for Paint Event
2648    if CDWidgetSet.FWMPaint = 0 then
2649      CDWidgetSet.FWMPaint := XInternAtom(CDWidgetSet.FDisplay, 'WM_PAINT', False);
2650    {$endif}
2651
2652     // send close event instead of quitting the whole application...
2653     XSetWMProtocols(CDWidgetSet.FDisplay, lWindow, @CDWidgetSet.FWMDeleteWindow, 1);
2654//   end;
2655
2656  { Child windows do not appear until parent (lParentHandle) is mapped }
2657//  if FParent <> nil then
2658//    XMapSubwindows(CDWidgetSet.FDisplay, lParentHandle);
2659
2660  // for modal windows, this is necessary
2661//  if (woModal in WindowOptions) then
2662//    XSetTransientForHint(GFApplication.Handle, Handle, Handle);
2663
2664  // Add the window to the list of windows
2665  lWindowInfo := TX11WindowInfo.Create;
2666  lWindowInfo.Window := lWindow;
2667  lWindowInfo.LCLForm := TCustomForm(AWinControl);
2668  XGetWindowAttributes(CDWidgetSet.FDisplay, lWindow, @lWindowInfo.Attr);
2669  lWindowInfo.Colormap := XDefaultColormap(CDWidgetSet.FDisplay, XDefaultScreen(CDWidgetSet.FDisplay));
2670  lWindowInfo.ColorDepth := lWindowInfo.Attr.depth;
2671  CreateX11Canvas(lWindowInfo);
2672  Result := TLCLIntfHandle(lWindowInfo);
2673
2674  {$ifdef CD_X11_NewNativePaint}
2675  CDWidgetSet.XWindowList.AddObject('New',TObject(lWindowInfo));
2676  {$endif}
2677
2678  {$ifdef VerboseCDForms}
2679  DebugLn(Format(':<[TCDWSCustomForm.CreateHandle] Result=%x',
2680    [Result]));
2681  {$endif}
2682end;
2683
2684class procedure TCDWSCustomForm.DestroyHandle(const AWinControl: TWinControl);
2685begin
2686
2687end;
2688
2689class procedure TCDWSCustomForm.SetBorderIcons(const AForm: TCustomForm;
2690 const ABorderIcons: TBorderIcons);
2691begin
2692end;
2693
2694class procedure TCDWSCustomForm.SetFormBorderStyle(const AForm: TCustomForm;
2695          const AFormBorderStyle: TFormBorderStyle);
2696begin
2697  RecreateWnd(AForm);
2698end;
2699
2700class procedure TCDWSCustomForm.SetBounds(const AWinControl: TWinControl;
2701    const ALeft, ATop, AWidth, AHeight: Integer);
2702begin
2703  {$ifdef VerboseCDForms}
2704  DebugLn(Format('[TCDWSCustomForm.SetBounds] AWinControl=%x ALeft=%d ATop=%d AWidth=%d AHeight=%d',
2705    [PtrInt(AWinControl), ALeft, ATop, AWidth, AHeight]));
2706  {$endif}
2707  SetPosition(AWinControl, Point(ALeft, ATop));
2708  SetSize(AWinControl, Size(AWidth, AHeight));
2709end;
2710
2711class procedure TCDWSCustomForm.SetIcon(const AForm: TCustomForm; const Small, Big: HICON);
2712begin
2713end;
2714
2715class procedure TCDWSCustomForm.SetShowInTaskbar(const AForm: TCustomForm;
2716  const AValue: TShowInTaskbar);
2717begin
2718end;
2719
2720class procedure TCDWSCustomForm.ShowModal(const ACustomForm: TCustomForm);
2721begin
2722end;
2723
2724class procedure TCDWSCustomForm.ShowHide(const AWinControl: TWinControl);
2725var
2726  lIndex: Integer;
2727  lWindow: TWindow;
2728  lWindowInfo: TX11WindowInfo;
2729begin
2730  lWindowInfo := TX11WindowInfo(AWinControl.Handle);
2731  lWindow := lWindowInfo.Window;
2732
2733  if AWinControl.Visible then
2734  begin
2735    {$ifdef VerboseCDForms}
2736    DebugLn(Format('[TCDWSCustomForm.ShowHide] Visible=True AWinControl=%x Handle=%x',
2737      [PtrInt(AWinControl), PtrInt(AWinControl.Handle)]));
2738    {$endif}
2739    XMapRaised(CDWidgetSet.FDisplay, lWindow);
2740  end
2741  else
2742  begin
2743    {$ifdef VerboseCDForms}
2744    DebugLn(Format('[TCDWSCustomForm.ShowHide] Visible=False AWinControl=%x', [PtrInt(AWinControl)]));
2745    {$endif}
2746    XUnmapWindow(CDWidgetSet.FDisplay, lWindow);
2747    // Don't remove it here, wait for a X11 Destroy event
2748    {---------------------------------------------------------------------------
2749    We will never get an X11 event, if we don't tell X11 to unmap the window!
2750    Even if the WM attempts to close the window, it's the application which
2751    triggers the actual operation. If CanClose is false, it doesn't do it.
2752    ---------------------------------------------------------------------------}
2753  end;
2754end;
2755
2756class function TCDWSCustomForm.GetText(const AWinControl: TWinControl; var AText: String): Boolean;
2757var
2758  s: PChar;
2759  lWindow: TWindow;
2760  lWindowInfo: TX11WindowInfo;
2761begin
2762  lWindowInfo := TX11WindowInfo(AWinControl.Handle);
2763  lWindow := lWindowInfo.Window;
2764
2765  XFetchName(CDWidgetSet.FDisplay, lWindow, @s);
2766  AText := s;
2767  XFree(s);
2768end;
2769
2770class function TCDWSCustomForm.GetTextLen(const AWinControl: TWinControl; var ALength: Integer): Boolean;
2771var
2772  lText: string;
2773begin
2774  Result := GetText(AWinControl, lText);
2775  ALength := Length(lText);
2776end;
2777
2778class procedure TCDWSCustomForm.SetText(const AWinControl: TWinControl; const AText: String);
2779var
2780  tp: TXTextProperty;
2781  lWindow: TWindow;
2782  lWindowInfo: TX11WindowInfo;
2783begin
2784  lWindowInfo := TX11WindowInfo(AWinControl.Handle);
2785  lWindow := lWindowInfo.Window;
2786
2787  tp.value    := PCUChar(AText);
2788  tp.encoding := XA_WM_NAME;
2789  tp.format   := 8;
2790  tp.nitems   := UTF8Length(AText);
2791
2792  XSetWMName(CDWidgetSet.FDisplay, lWindow, @tp);
2793  XStoreName(CDWidgetSet.FDisplay, lWindow, PChar(AText));
2794  XSetIconName(CDWidgetSet.FDisplay, lWindow, PChar(AText));
2795  XSetWMIconName(CDWidgetSet.FDisplay, lWindow, @tp);
2796end;
2797
2798class function TCDWSCustomForm.GetClientBounds(const AWincontrol: TWinControl; var ARect: TRect): Boolean;
2799begin
2800end;
2801
2802class function TCDWSCustomForm.GetClientRect(const AWincontrol: TWinControl; var ARect: TRect): Boolean;
2803begin
2804end;
2805
2806
2807