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