mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-05-28 12:45:21 +02:00
2718 lines
96 KiB
PHP
2718 lines
96 KiB
PHP
{$MainForm customdrawnwsforms.pp}
|
||
|
||
// redefines:
|
||
// The version from FreePascal crash except in FPC 2.7.1+ from 10 Dec 2011 +
|
||
function XmbLookupString(p1: PXIC; ev: PXKeyPressedEvent; str: PChar; len: longword; ks: PKeySym; stat: PStatus): longint; cdecl; external;
|
||
function Xutf8LookupString(p1: PXIC; ev: PXKeyPressedEvent; str: PChar; len: longword; ks: PKeySym; stat: PStatus): longint; cdecl; external;
|
||
|
||
{ TCDWSCustomForm }
|
||
|
||
class procedure TCDWSCustomForm.UpdateMotifWMHints(const AWinControl: TWinControl; CanMaximize: Boolean);
|
||
type
|
||
PMotifWmHints = ^TMotifWmHints;
|
||
TMotifWmHints = packed record
|
||
Flags, Functions, Decorations: LongWord;
|
||
InputMode: LongInt;
|
||
Status: LongWord;
|
||
end;
|
||
const
|
||
MWM_HINTS_FUNCTIONS = 1;
|
||
MWM_HINTS_DECORATIONS = 2;
|
||
FuncAll = 1;
|
||
FuncResize = 2;
|
||
FuncMove = 4;
|
||
FuncMinimize = 8;
|
||
FuncMaximize = 16;
|
||
FuncClose = 32;
|
||
DecorAll = 1;
|
||
DecorBorder = 2;
|
||
DecorResizeH = 4;
|
||
DecorTitle = 8;
|
||
DecorMenu = 16;
|
||
DecorMinimize = 32;
|
||
DecorMaximize = 64;
|
||
var
|
||
PropType: TAtom;
|
||
PropFormat: LongInt;
|
||
PropItemCount, PropBytesAfter: LongWord;
|
||
Hints: PMotifWmHints;
|
||
NewHints: TMotifWmHints;
|
||
lWindow: TWindow;
|
||
lWindowInfo: TX11WindowInfo;
|
||
begin
|
||
lWindowInfo := TX11WindowInfo(AWinControl.Handle);
|
||
lWindow := lWindowInfo.Window;
|
||
|
||
if CDWidgetSet.FWMHints = 0 then
|
||
CDWidgetSet.FWMHints :=
|
||
XInternAtom(CDWidgetSet.FDisplay, '_MOTIF_WM_HINTS', False);
|
||
|
||
XGetWindowProperty(CDWidgetSet.FDisplay, lWindow,
|
||
CDWidgetSet.FWMHints, 0, 5, False, AnyPropertyType, @PropType,
|
||
@PropFormat, @PropItemCount, @PropBytesAfter, @Hints);
|
||
|
||
NewHints.Flags := MWM_HINTS_FUNCTIONS or MWM_HINTS_DECORATIONS;
|
||
NewHints.Functions := FuncResize or FuncMove or FuncMinimize or FuncClose;
|
||
|
||
if {(woToolWindow in WindowOptions) or (woWindow in WindowOptions) or
|
||
(woPopup in WindowOptions)}True then
|
||
NewHints.Decorations := DecorBorder or DecorTitle or DecorMenu or DecorMinimize
|
||
else
|
||
NewHints.Decorations := 0;
|
||
if CanMaximize then
|
||
begin
|
||
NewHints.Functions := NewHints.Functions or FuncMaximize;
|
||
NewHints.Decorations := NewHints.Decorations or DecorMaximize;
|
||
end;
|
||
|
||
if Assigned(Hints) then
|
||
begin
|
||
Hints^.Flags := Hints^.Flags or NewHints.Flags;
|
||
Hints^.Decorations := NewHints.Decorations;
|
||
Hints^.Functions := NewHints.Functions;
|
||
end else
|
||
Hints := @NewHints;
|
||
|
||
XChangeProperty(CDWidgetSet.FDisplay, lWindow,
|
||
CDWidgetSet.FWMHints, CDWidgetSet.FWMHints,
|
||
32, PropModeReplace, Pointer(Hints), 5);
|
||
if Hints <> @NewHints then
|
||
XFree(Hints);
|
||
end;
|
||
|
||
class procedure TCDWSCustomForm.SetPosition(const AWinControl: TWinControl; const APosition: TPoint);
|
||
var
|
||
Supplied: PtrInt;
|
||
SizeHints: PXSizeHints;
|
||
|
||
dx, dy: integer;
|
||
lx, ly: integer;
|
||
cw : PWindow;
|
||
lWindow: TWindow;
|
||
lWindowInfo: TX11WindowInfo;
|
||
begin
|
||
lWindowInfo := TX11WindowInfo(AWinControl.Handle);
|
||
lWindow := lWindowInfo.Window;
|
||
|
||
if AWinControl.Parent = nil then
|
||
begin
|
||
{$Note This doesn't work yet. I want to position a new window relative to
|
||
another window. Used for popup windows, like the TComboBox dropdown. }
|
||
{$IFDEF DEBUG} writeln('SetPosition with no Parent'); {$ENDIF}
|
||
lx := APosition.x;
|
||
ly := APosition.y;
|
||
|
||
XTranslateCoordinates(CDWidgetSet.FDisplay, lWindow,
|
||
XDefaultRootWindow(CDWidgetSet.FDisplay),
|
||
lx, ly, @dx, @dy, @cw);
|
||
lx := dx;
|
||
ly := dy;
|
||
end
|
||
else
|
||
begin
|
||
{$IFDEF DEBUG} writeln('SetPosition inside parent'); {$ENDIF}
|
||
lx := APosition.x;
|
||
ly := APosition.y;
|
||
end;
|
||
{$IFDEF DEBUG} Writeln(Format('was (%d,%d) and is now (%d,%d)', [APosition.x, APosition.y, lx, ly])); {$ENDIF}
|
||
|
||
SizeHints := XAllocSizeHints;
|
||
XGetWMNormalHints(CDWidgetSet.FDisplay, lWindow, SizeHints, @Supplied);
|
||
SizeHints^.flags := SizeHints^.flags or PPosition;
|
||
SizeHints^.x := lx;
|
||
SizeHints^.y := ly;
|
||
XSetWMNormalHints(CDWidgetSet.FDisplay, lWindow, SizeHints);
|
||
XFree(SizeHints);
|
||
XMoveWindow(CDWidgetSet.FDisplay, lWindow, lx, ly);
|
||
end;
|
||
|
||
class procedure TCDWSCustomForm.SetSize(const AWinControl: TWinControl; const ASize: TSize);
|
||
var
|
||
ChangeMask: Cardinal;
|
||
Changes: TXWindowChanges;
|
||
lWindow: TWindow;
|
||
lWindowInfo: TX11WindowInfo;
|
||
begin
|
||
lWindowInfo := TX11WindowInfo(AWinControl.Handle);
|
||
lWindow := lWindowInfo.Window;
|
||
|
||
ChangeMask := CWWidth or CWHeight;
|
||
Changes.Width := ASize.cx;
|
||
Changes.Height := ASize.cy;
|
||
|
||
if ChangeMask <> 0 then
|
||
XConfigureWindow(CDWidgetSet.FDisplay, lWindow, ChangeMask, @Changes);
|
||
end;
|
||
|
||
class procedure TCDWSCustomForm.SetMinMaxSize(const AWinControl: TWinControl; const AMinSize, AMaxSize: TSize);
|
||
var
|
||
Supplied: PtrInt;
|
||
SizeHints: PXSizeHints;
|
||
CanMaximize: Boolean;
|
||
lWindow: TWindow;
|
||
lWindowInfo: TX11WindowInfo;
|
||
begin
|
||
lWindowInfo := TX11WindowInfo(AWinControl.Handle);
|
||
lWindow := lWindowInfo.Window;
|
||
|
||
CanMaximize := (AMaxSize.cx = 0) or (AMaxSize.cy = 0) or
|
||
(AMaxSize.cx > AMinSize.cx) or (AMaxSize.cy > AMinSize.cy);
|
||
UpdateMotifWMHints(AWinControl, CanMaximize);
|
||
|
||
SizeHints := XAllocSizeHints;
|
||
XGetWMNormalHints(CDWidgetSet.FDisplay, lWindow, SizeHints, @Supplied);
|
||
with SizeHints^ do
|
||
begin
|
||
if (AMinSize.cx > 0) or (AMinSize.cy > 0) then
|
||
begin
|
||
flags := flags or PMinSize;
|
||
min_width := AMinSize.cx;
|
||
min_height := AMinSize.cy;
|
||
end else
|
||
flags := flags and not PMinSize;
|
||
|
||
if (AMaxSize.cx > 0) or (AMaxSize.cy > 0) then
|
||
begin
|
||
flags := flags or PMaxSize;
|
||
if AMaxSize.cx > 0 then
|
||
max_width := AMaxSize.cx
|
||
else
|
||
max_width := 32767;
|
||
if AMaxSize.cy > 0 then
|
||
max_height := AMaxSize.cy
|
||
else
|
||
max_height := 32767;
|
||
end else
|
||
flags := flags and not PMaxSize;
|
||
end;
|
||
|
||
XSetWMNormalHints(CDWidgetSet.FDisplay, lWindow, SizeHints);
|
||
XFree(SizeHints);
|
||
end;
|
||
|
||
class procedure TCDWSCustomForm.CreateX11Canvas(AWindowInfo: TX11WindowInfo);
|
||
var
|
||
DummyWnd: PWindow;
|
||
DummyInt: LongInt;
|
||
GCValues: XLib.TXGCValues;
|
||
FWidth, FHeight: Integer;
|
||
begin
|
||
XGetGeometry(CDWidgetSet.FDisplay, AWindowInfo.Window, @DummyWnd, @DummyInt, @DummyInt,
|
||
@FWidth, @FHeight, @DummyInt, @DummyInt);
|
||
|
||
GCValues.graphics_exposures := 0;
|
||
AWindowInfo.GC := XCreateGC(CDWidgetSet.FDisplay, AWindowInfo.Window, GCGraphicsExposures, @GCValues);
|
||
// if not Assigned(GC) then
|
||
// raise EX11Error.Create(SGCCreationFailed);
|
||
|
||
// XSetLineAttributes(GFApplication.Handle, GC, 0,
|
||
// LineSolid, CapNotLast, JoinMiter);
|
||
|
||
// FFont := AFont;
|
||
// FXftDraw := XftDrawCreate(CDWidgetSet.FDisplay, AWindowInfo.Window,
|
||
// XDefaultVisual(CDWidgetSet.FDisplay, XDefaultScreen(CDWidgetSet.FDisplay)),
|
||
// XDefaultColormap(CDWidgetSet.FDisplay, XDefaultScreen(CDWidgetSet.FDisplay)));
|
||
|
||
// FRegion := XCreateRegion;
|
||
// Resized(Width, Height); // Set up a proper clipping region
|
||
|
||
//
|
||
|
||
{ XGetWindowAttributes(CDWidgetSet.FDisplay, AWindowInfo.Window, @Attr);
|
||
FVisual := Attr.Visual;
|
||
|
||
case Attr.Depth of
|
||
1: PixelFormat.FormatType := ftMono;
|
||
4: PixelFormat.FormatType := ftPal4;
|
||
8: PixelFormat.FormatType := ftPal8;
|
||
16: PixelFormat.FormatType := ftRGB16;
|
||
24: PixelFormat.FormatType := ftRGB24;
|
||
32: PixelFormat.FormatType := ftRGB32;
|
||
else
|
||
raise EX11Error.CreateFmt(SWindowUnsupportedPixelFormat, [Attr.Depth]);
|
||
end;
|
||
|
||
if Attr.Depth >= 16 then
|
||
begin
|
||
PixelFormat.RedMask := Visual^.red_mask;
|
||
PixelFormat.GreenMask := Visual^.green_mask;
|
||
PixelFormat.BlueMask := Visual^.blue_mask;
|
||
end;}
|
||
end;
|
||
|
||
(*
|
||
* Error handling.
|
||
*/
|
||
static int ErrorFlag = 0;
|
||
static int HandleXError( Display *dpy, XErrorEvent *event )
|
||
{
|
||
ErrorFlag = 1;
|
||
return 0;
|
||
*)
|
||
|
||
{
|
||
There are 2 ways to put an image into a X11 Window which everyone uses, even OpenGL:
|
||
|
||
XPutImage and XShmPutImage
|
||
|
||
Because XPutImage is so slow as to be unusable, we will always try to use XShmPutImage
|
||
}
|
||
class procedure TCDWSCustomForm.DrawRawImageToGC(ARawImage: TRawImage;
|
||
ADestWindowInfo: TX11WindowInfo; ADestX, ADestY, ADestWidth, ADestHeight: Integer);
|
||
var
|
||
UsePutImage: Boolean = False;
|
||
major, minor, ignore: cint;
|
||
{$IFDEF VerboseCDPaintProfiler}
|
||
lTimeStart: TDateTime;
|
||
{$ENDIF}
|
||
pixmaps: cint;
|
||
begin
|
||
{$IFDEF VerboseCDPaintProfiler}
|
||
lTimeStart := NowUTC();
|
||
{$ENDIF}
|
||
|
||
// First check if XShm is available
|
||
UsePutImage := True;
|
||
{ if not XQueryExtension(CDWidgetSet.FDisplay, 'MIT-SHM', @ignore, @ignore, @ignore) then UsePutImage := True
|
||
else if not XShmQueryVersion(CDWidgetSet.FDisplay, @major, @minor, @pixmaps) then UsePutImage := True;
|
||
if pixmaps <> 2 then UsePutImage := True;}
|
||
|
||
if UsePutImage then DrawRawImageToGC_XPutImage(ARawImage, ADestWindowInfo, ADestX, ADestY, ADestWidth, ADestHeight)
|
||
else DrawRawImageToGC_XShmPutImage(ARawImage, ADestWindowInfo, ADestX, ADestY, ADestWidth, ADestHeight);
|
||
|
||
{$IFDEF VerboseCDPaintProfiler}
|
||
DebugLn(Format('[TCDWSCustomForm.DrawRawImageToGC] Paint duration: %d ms', [DateTimeToMilliseconds(NowUTC() - lTimeStart)]));
|
||
{$ENDIF}
|
||
end;
|
||
|
||
// XShm tutorial:
|
||
// http://personales.mundivia.es/jap/xshm.htm
|
||
class function TCDWSCustomForm.alloc_xshm_image(dpy: PDisplay; vis: PVisual;
|
||
width, height, depth: Integer; out shminfo: TXShmSegmentInfo): PXImage;
|
||
var
|
||
img: XLib.PXImage;
|
||
ctx: TGC;
|
||
begin
|
||
Result := nil;
|
||
|
||
{
|
||
* We have to do a _lot_ of error checking here to be sure we can
|
||
* really use the XSHM extension. It seems different servers trigger
|
||
* errors at different points if the extension won't work. Therefore
|
||
* we have to be very careful...
|
||
}
|
||
|
||
img := XShmCreateImage(dpy, vis, depth,
|
||
ZPixmap, nil, @shminfo,
|
||
width, height );
|
||
if (img = nil) then
|
||
begin
|
||
DebugLn('XShmCreateImage failed!');
|
||
Exit;
|
||
end;
|
||
|
||
(* shminfo.shmid := shmget( IPC_PRIVATE, img^.bytes_per_line
|
||
* img->height, IPC_CREAT or 0777 );
|
||
if (shminfo.shmid < 0) then
|
||
begin
|
||
DebugLn('error in shmget. alloc_back_buffer: Shared memory error (shmget), disabling.');
|
||
XDestroyImage( img );
|
||
//c->shm = 0;
|
||
Exit;
|
||
end;
|
||
|
||
img^.data := shmat( shminfo.shmid, 0, 0 );
|
||
shminfo.shmaddr := img^.data;
|
||
(* if (shminfo.shmaddr == (char * ) -1) {
|
||
perror("alloc_back_buffer");
|
||
XDestroyImage( img );
|
||
img = NULL;
|
||
printf("shmat failed\n");
|
||
return NULL;
|
||
}
|
||
|
||
shminfo.readOnly = False;
|
||
ErrorFlag = 0;
|
||
XSetErrorHandler( HandleXError );
|
||
// This may trigger the X protocol error we're ready to catch: */
|
||
XShmAttach( dpy, &shminfo );
|
||
XSync( dpy, False );
|
||
|
||
if (ErrorFlag) {
|
||
/* we are on a remote display, this error is normal, don't print it */
|
||
XFlush( dpy );
|
||
ErrorFlag = 0;
|
||
XDestroyImage( img );
|
||
shmdt( shminfo.shmaddr );
|
||
shmctl( shminfo.shmid, IPC_RMID, 0 );
|
||
return NULL;
|
||
}
|
||
|
||
shmctl( shminfo.shmid, IPC_RMID, 0 ); // nobody else needs it*)*)
|
||
|
||
(*#ifdef OPTIONAL_PART
|
||
/* An error may still occur upon the first XShmPutImage. So it's a */
|
||
/* good idea to test it here. However, we need a window to put the */
|
||
/* image into, etc.... */
|
||
gc = XCreateGC( dpy, window, 0, NULL );
|
||
XShmPutImage( dpy, window, gc,
|
||
img, 0, 0, 0, 0, 1, 1 /*one pixel*/, False );
|
||
XSync( dpy, False );
|
||
XFreeGC( dpy, gc );
|
||
XSetErrorHandler( NULL );
|
||
if (ErrorFlag) {
|
||
XFlush( dpy );
|
||
ErrorFlag = 0;
|
||
XDestroyImage( img );
|
||
shmdt( shminfo.shmaddr );
|
||
shmctl( shminfo.shmid, IPC_RMID, 0 );
|
||
return NULL;
|
||
}
|
||
#endif*)
|
||
|
||
Result := img;
|
||
end;
|
||
|
||
class procedure TCDWSCustomForm.destroy_xshm_image(img: PXImage; var shminfo: TXShmSegmentInfo);
|
||
begin
|
||
XShmDetach(CDWidgetSet.FDisplay, @shminfo );
|
||
XDestroyImage( img );
|
||
// shmdt( shminfo.shmaddr );
|
||
end;
|
||
|
||
class procedure TCDWSCustomForm.DrawRawImageToGC_XShmPutImage(ARawImage: TRawImage;
|
||
ADestWindowInfo: TX11WindowInfo; ADestX, ADestY, ADestWidth, ADestHeight: Integer);
|
||
var
|
||
img: XLib.PXImage;
|
||
shminfo: TXShmSegmentInfo;
|
||
begin
|
||
// make shared XImage
|
||
img := alloc_xshm_image(CDWidgetSet.FDisplay, ADestWindowInfo.Attr.visual, ADestWidth, ADestHeight, ADestWindowInfo.ColorDepth, shminfo);
|
||
if (img = nil) then
|
||
begin
|
||
DebugLn('[TCDWSCustomForm.DrawRawImageToGC_XShmPutImage] couldn''t allocate shared XImage');
|
||
Exit;
|
||
end;
|
||
|
||
// Now you can render into the img->data buffer
|
||
// ???
|
||
|
||
// Draw the image in the window
|
||
XShmPutImage(CDWidgetSet.FDisplay, ADestWindowInfo.Window, ADestWindowInfo.GC,
|
||
img, 0, 0, ADestX, ADestY, ADestWidth, ADestHeight, False);
|
||
|
||
// Destroy image
|
||
destroy_xshm_image(img, shminfo);
|
||
end;
|
||
|
||
class procedure TCDWSCustomForm.DrawRawImageToGC_XPutImage(ARawImage: TRawImage;
|
||
ADestWindowInfo: TX11WindowInfo; ADestX, ADestY, ADestWidth, ADestHeight: Integer);
|
||
var
|
||
Image: XLib.PXImage;
|
||
XImage: XLib.TXImage;
|
||
lScanlineSize: cint;
|
||
lScreen: cint;
|
||
lVisual: PVisual;
|
||
lDepth: cint;
|
||
begin
|
||
lScanlineSize := (ADestWindowInfo.Canvas.Width*ADestWindowInfo.ColorDepth) div 8;
|
||
lScreen := DefaultScreen(CDWidgetSet.FDisplay);
|
||
lVisual := {DefaultVisual(CDWidgetSet.FDisplay, lScreen); //} ADestWindowInfo.Attr.Visual;
|
||
lDepth := ADestWindowInfo.ColorDepth;
|
||
|
||
XImage.Width := ADestWidth;
|
||
XImage.Height := ADestHeight;
|
||
XImage.xoffset := 0;
|
||
XImage.obdata := #0;
|
||
XImage.byte_order := LSBFirst;
|
||
XImage.bitmap_bit_order := MSBFirst;
|
||
XImage.bitmap_pad := 32;
|
||
XImage.bytes_per_line := 0;
|
||
|
||
{ if acolordepth = 1 then
|
||
begin
|
||
format := XYBitmap;
|
||
bitmap_unit := 8;
|
||
depth := 1;
|
||
bits_per_pixel := 1;
|
||
red_mask := 1;
|
||
green_mask := 0;
|
||
blue_mask := 0;
|
||
end
|
||
else
|
||
begin}
|
||
XImage.format := ZPixmap;
|
||
XImage.bitmap_unit := 32;
|
||
|
||
// only truecolor 24/32 displays supported now, otherwise color conversion required!
|
||
// this must be match for the display !!!
|
||
XImage.depth := ADestWindowInfo.ColorDepth;
|
||
XImage.bits_per_pixel := 24;
|
||
|
||
// Pixel mask
|
||
XImage.red_mask := lVisual^.red_mask;
|
||
XImage.green_mask := lVisual^.green_mask;
|
||
XImage.blue_mask := lVisual^.blue_mask;
|
||
|
||
XImage.Data := PChar(ARawImage.Data);
|
||
|
||
XInitImage(@XImage);
|
||
|
||
// Create a native Image
|
||
// No idea why but using XCreateImage it ends up using a format which I have no idea which is,
|
||
// and the missmatch criples the image, XInitImage works fine
|
||
// Image := XCreateImage(CDWidgetSet.FDisplay, lVisual,
|
||
// lDepth, ZPixmap, 0, PChar(ARawImage.Data),
|
||
// ADestWidth, ADestHeight, 8, 0);
|
||
|
||
{$IFDEF VerboseCDForms}
|
||
DebugLn(Format('[TCDWSCustomForm.DrawRawImageToGC_XPutImage] XImage=%x Data=%x'
|
||
+ ' ColorDepth:%d Width=%d Height=%d ScanlineSize=%d'
|
||
+ ' red_mask=%x green_mask=%x blue_mask=%x',
|
||
[PtrInt(Image), PtrInt(ARawImage.Data), lDepth,
|
||
ADestWidth, ADestHeight, lScanlineSize,
|
||
XImage.red_mask, XImage.green_mask, XImage.blue_mask]));
|
||
{$ENDIF}
|
||
|
||
// Note that XPutImage is slow
|
||
XPutImage(CDWidgetSet.FDisplay, ADestWindowInfo.Window, ADestWindowInfo.GC,
|
||
@XImage, 0, 0, ADestX, ADestY, ADestWidth, ADestHeight);
|
||
|
||
// Free the native image -> Used only together with XCreateImage
|
||
// Image.data := nil;
|
||
// XDestroyImage(Image);
|
||
end;
|
||
|
||
class procedure TCDWSCustomForm.EvKeyPressed(const AWinControl: TWinControl;
|
||
AWindowInfo: TX11WindowInfo; var Event: TXKeyEvent);
|
||
var
|
||
lKey: Word;
|
||
lForm: TCDForm;
|
||
KeySym: TKeySym;
|
||
lCurString: String;
|
||
lCurChar: TUTF8Char;
|
||
i: Integer;
|
||
lEndComposing: Boolean;
|
||
begin
|
||
lForm := TCDForm(AWinControl.Handle);
|
||
KeySym := StartComposing(Event);
|
||
lKey := X11KeyToLCLKey(KeySym);
|
||
CDWidgetset.LastKeySym := KeySym;
|
||
CDWidgetset.LastKey := lKey;
|
||
|
||
CallbackKeyDown(lForm, lKey);
|
||
|
||
// EndComposing embedded here
|
||
lEndComposing := CDWidgetset.ComposeStatus <> XLookupNone;
|
||
lEndComposing := lEndComposing and ((Event.state and (ControlMask or Mod1Mask)) = 0);
|
||
if lEndComposing then
|
||
begin
|
||
for i := 1 to UTF8Length(CDWidgetset.ComposeBuffer) do
|
||
begin
|
||
lCurString := CDWidgetset.ComposeBuffer;
|
||
lCurString := UTF8Copy(lCurString, i, 1);
|
||
lCurChar := lCurString;
|
||
CallbackKeyChar(lForm, 0, lCurChar);
|
||
end;
|
||
end;
|
||
end;
|
||
|
||
class procedure TCDWSCustomForm.EvKeyReleased(const AWinControl: TWinControl;
|
||
AWindowInfo: TX11WindowInfo; var Event: TXKeyEvent);
|
||
var
|
||
lKey: Word;
|
||
lForm: TCDForm;
|
||
begin
|
||
// Send back the last pressed key as a KeyUp event
|
||
lForm := TCDForm(AWinControl.Handle);
|
||
|
||
lKey := CDWidgetset.LastKey;
|
||
CallbackKeyUp(lForm, lKey);
|
||
|
||
// Do not call EndComposing, as this would generate duplicate KeyChar events!}
|
||
end;
|
||
|
||
class procedure TCDWSCustomForm.EvMousePressed(const AWinControl: TWinControl; AWindowInfo: TX11WindowInfo;
|
||
var Event: TXButtonEvent);
|
||
var
|
||
lForm: TCDForm;
|
||
MouseButton: TMouseButton;
|
||
begin
|
||
lForm := TCDForm(AWinControl.Handle);
|
||
if XButtonToMouseButton(Event.button, MouseButton) then
|
||
begin
|
||
CallbackMouseDown(lForm, Event.x, Event.y, MouseButton, []);
|
||
end
|
||
else
|
||
begin
|
||
{ if Event.button = 4 then Sum := -1
|
||
else Sum := 1;
|
||
|
||
// Check for other mouse wheel messages in the queue
|
||
while XCheckTypedWindowEvent(GFApplication.Handle,
|
||
WindowEntry.Handle, X.ButtonPress, @NewEvent) do
|
||
begin
|
||
if NewEvent.xbutton.Button = 4 then Dec(Sum)
|
||
else if NewEvent.xbutton.Button = 5 then Inc(Sum)
|
||
else
|
||
begin
|
||
XPutBackEvent(GFApplication.Handle, @NewEvent);
|
||
break;
|
||
end;
|
||
end;
|
||
|
||
WindowEntry.EvMouseWheel(
|
||
Sum, Point(XEvent.xbutton.x, XEvent.xbutton.y));}
|
||
end;
|
||
end;
|
||
|
||
class procedure TCDWSCustomForm.EvMouseReleased(const AWinControl: TWinControl; AWindowInfo: TX11WindowInfo;
|
||
var Event: TXButtonEvent);
|
||
var
|
||
lForm: TCDForm;
|
||
MouseButton: TMouseButton;
|
||
begin
|
||
lForm := TCDForm(AWinControl.Handle);
|
||
XButtonToMouseButton(Event.button, MouseButton);
|
||
|
||
{ Release events are only for mouse buttons, and not mouse wheel moviments }
|
||
if (Event.button >= 1) and (Event.button <= 3) then
|
||
begin
|
||
CallbackMouseUp(lForm, Event.x, Event.y, MouseButton, []);
|
||
end;
|
||
end;
|
||
|
||
class procedure TCDWSCustomForm.EvMouseEnter(const AWinControl: TWinControl; AWindowInfo: TX11WindowInfo);
|
||
begin
|
||
end;
|
||
|
||
class procedure TCDWSCustomForm.EvMouseLeave(const AWinControl: TWinControl; AWindowInfo: TX11WindowInfo);
|
||
begin
|
||
end;
|
||
|
||
class procedure TCDWSCustomForm.EvMouseMove(const AWinControl: TWinControl; AWindowInfo: TX11WindowInfo;
|
||
var Event: TXMotionEvent);
|
||
var
|
||
lForm: TCDForm;
|
||
{ lTarget: TWinControl;
|
||
lEventPos: TPoint;}
|
||
begin
|
||
lForm := TCDForm(AWinControl.Handle);
|
||
CallbackMouseMove(lForm, Event.x, Event.y, []);
|
||
{ lTarget := FindControlWhichReceivedEvent(TCustomForm(AWinControl), AWindowInfo.Children, Event.x, Event.y);
|
||
|
||
lEventPos := FormPosToControlPos(lTarget, Event.x, Event.y);
|
||
|
||
LCLSendMouseMoveMsg(lTarget, lEventPos.x, lEventPos.y, []);}
|
||
end;
|
||
|
||
// Top-level windows receive LM_ACTIVATE while constrols receive LM_SETFOCUS
|
||
// See http://blogs.msdn.com/b/jfoscoding/archive/2006/08/02/686141.aspx
|
||
// Here we have 1 handle per window, so the X11 backend should only send LM_ACTIVATE
|
||
class procedure TCDWSCustomForm.EvFocusIn(const AWinControl: TWinControl; AWindowInfo: TX11WindowInfo);
|
||
begin
|
||
LCLSendActivateMsg(AWinControl, WA_ACTIVE, false);
|
||
end;
|
||
|
||
class procedure TCDWSCustomForm.EvFocusOut(const AWinControl: TWinControl; AWindowInfo: TX11WindowInfo);
|
||
begin
|
||
LCLSendActivateMsg(AWinControl, WA_INACTIVE, false);
|
||
end;
|
||
|
||
class procedure TCDWSCustomForm.EvPaint(const AWinControl: TWinControl; AWindowInfo: TX11WindowInfo);
|
||
var
|
||
lWidth, lHeight: Integer;
|
||
lBitmap, lMask: HBITMAP;
|
||
lRawImage: TRawImage;
|
||
{$IFDEF VerboseCDPaintProfiler}
|
||
lTimeStart, lCDTimeEnd, lNativeTimeStart: TDateTime;
|
||
{$ENDIF}
|
||
begin
|
||
{$IFDEF VerboseCDPaintProfiler}
|
||
lTimeStart := NowUTC();
|
||
{$ENDIF}
|
||
{$IFDEF VerboseCDForms}
|
||
DebugLn(Format('[TCDWSCustomForm.EvPaint] AWindowInfo: %x', [PtrInt(AWindowInfo)]));
|
||
{$ENDIF}
|
||
if (AWinControl = nil) or (AWindowInfo = nil) then Exit;
|
||
|
||
lWidth := Round(AWinControl.width);
|
||
lHeight := Round(AWinControl.height);
|
||
|
||
// Prepare the non-native image and canvas
|
||
{$IFDEF VerboseCDForms}
|
||
DebugLn(Format('[TCDWSCustomForm.EvPaint] Visual: Red-Mask: %x Green-Mask: %x Blue-Mask: %x'
|
||
+ ' bits_per_rgb=%d c_class=%d',
|
||
[AWindowInfo.Attr.visual^.red_mask, AWindowInfo.Attr.visual^.green_mask, AWindowInfo.Attr.visual^.blue_mask,
|
||
AWindowInfo.Attr.Visual^.bits_per_rgb, AWindowInfo.Attr.Visual^.c_class]));
|
||
{ c_class values:
|
||
StaticGray = 0;
|
||
GrayScale = 1;
|
||
StaticColor = 2;
|
||
PseudoColor = 3;
|
||
TrueColor = 4;
|
||
DirectColor = 5;}
|
||
{$ENDIF}
|
||
UpdateControlLazImageAndCanvas(AWindowInfo.Image, AWindowInfo.Canvas, lWidth, lHeight, clfBGR24);
|
||
|
||
RenderForm(AWindowInfo.Image, AWindowInfo.Canvas, TCustomForm(AWinControl));
|
||
|
||
{$IFDEF VerboseCDPaintProfiler}
|
||
lCDTimeEnd := NowUTC();
|
||
lNativeTimeStart := NowUTC();
|
||
{$ENDIF}
|
||
|
||
// Now render it into the control
|
||
AWindowInfo.Image.GetRawImage(lRawImage);
|
||
DrawRawImageToGC(lRawImage, AWindowInfo, 0, 0, lWidth, lHeight);
|
||
|
||
{$IFDEF VerboseCDPaintProfiler}
|
||
DebugLn(Format('[TCDWSCustomForm.EvPaint] Total Paint duration: %d ms of this CustomDrawn: %d ms Native: %d',
|
||
[DateTimeToMilliseconds(NowUTC() - lTimeStart),
|
||
DateTimeToMilliseconds(lCDTimeEnd - lTimeStart),
|
||
DateTimeToMilliseconds(NowUTC() - lNativeTimeStart)
|
||
]));
|
||
{$ENDIF}
|
||
end;
|
||
|
||
class procedure TCDWSCustomForm.EvConfigureNotify(const AWinControl: TWinControl; AWindowInfo: TX11WindowInfo;
|
||
var Event: TXConfigureEvent);
|
||
begin
|
||
// Without this while, it will get stuck in a loop resizing endlessly
|
||
while XCheckTypedWindowEvent(CDWidgetset.FDisplay, AWindowInfo.Window, X.ConfigureNotify, @Event) do;
|
||
|
||
{$ifdef VerboseCDEvents}
|
||
DebugLn(Format('LCL-CustomDrawn-X11: X11 event received: %s X=%d Y=%d', [GetXEventName(Event._type), Event.x, Event.y]));
|
||
{$endif}
|
||
|
||
// Move event
|
||
if (Event.x <> AWinControl.Left) or (Event.y <> AWinControl.Top) then
|
||
begin
|
||
LCLSendMoveMsg(AWinControl, Event.x, Event.y);
|
||
end;
|
||
// Size event
|
||
if (Event.Width <> AWinControl.Width) or (Event.Height <> AWinControl.Height) then
|
||
begin
|
||
//SIZENORMAL, SIZEICONIC, SIZEFULLSCREEN, SIZEZOOMSHOW, SIZEZOOMHIDE.
|
||
LCLSendSizeMsg(AWinControl, Event.Width, Event.Height, SIZENORMAL);
|
||
|
||
// TX11Canvas(Canvas).Resized(ClientWidth, ClientHeight); seams unnecessary here
|
||
end;
|
||
end;
|
||
|
||
class procedure TCDWSCustomForm.EvClientMessage(const AWinControl: TWinControl;
|
||
AWindowInfo: TX11WindowInfo; var Event: TXClientMessageEvent);
|
||
var
|
||
CanClose: Boolean;
|
||
begin
|
||
if Event.message_type = CDWidgetset.FWMProtocols then
|
||
begin
|
||
if Event.Data.l[0] = CDWidgetset.FWMDeleteWindow then
|
||
begin
|
||
// Message results : 0 - do nothing, 1 - destroy window (felipe: is this comment correct? taken from lcl-cocoa)
|
||
CanClose:=LCLSendCloseQueryMsg(AWinControl)>0;
|
||
if {CanClose} True then // CanClose is returning false -> ToDo: find out why
|
||
begin
|
||
LCLSendCloseUpMsg(AWinControl);
|
||
XDestroyWindow(CDWidgetset.FDisplay, AWinControl.Handle);
|
||
end;
|
||
end
|
||
else
|
||
DebugLn(Format('LCL-CustomDrawn-X11: Unknown client protocol message: %d', [Event.Data.l[0]]));
|
||
end
|
||
else
|
||
DebugLn(Format('LCL-CustomDrawn-X11: Unknown client message: %d', [Event.message_type]));
|
||
end;
|
||
|
||
class function TCDWSCustomForm.StartComposing(const Event: TXKeyEvent): TKeySym;
|
||
var
|
||
len: integer;
|
||
begin
|
||
SetLength(CDWidgetset.ComposeBuffer, 20);
|
||
// Xutf8LookupString returns the size of FComposeBuffer in bytes.
|
||
len := Xutf8LookupString(CDWidgetset.InputContext, @Event, @CDWidgetset.ComposeBuffer[1],
|
||
Length(CDWidgetset.ComposeBuffer), @Result, @CDWidgetset.ComposeStatus);
|
||
SetLength(CDWidgetset.ComposeBuffer, len);
|
||
|
||
{$ifdef VerboseCDText}
|
||
case CDWidgetset.ComposeStatus of
|
||
XBufferOverflow: DebugLn('[TCDWSCustomForm.StartComposing] Status=XBufferOverflow');
|
||
XLookupNone: DebugLn('[TCDWSCustomForm.StartComposing] Status=XLookupNone');
|
||
XLookupChars: DebugLn('[TCDWSCustomForm.StartComposing] Status=XLookupChars');
|
||
XLookupKeySymVal: DebugLn('[TCDWSCustomForm.StartComposing] Status=XLookupKeySym');
|
||
XLookupBoth: DebugLn('[TCDWSCustomForm.StartComposing] Status=XLookupBoth');
|
||
end;
|
||
{$endif}
|
||
|
||
// if overflow occured, then previous SetLength() would have fixed the buffer
|
||
// size, so run Xutf8LookupString again to read correct value.
|
||
if CDWidgetset.ComposeStatus = XBufferOverflow then
|
||
Xutf8LookupString(CDWidgetset.InputContext, @Event, @CDWidgetset.ComposeBuffer[1],
|
||
Length(CDWidgetset.ComposeBuffer), @Result, @CDWidgetset.ComposeStatus);
|
||
end;
|
||
|
||
// The Key table is in http://www.cl.cam.ac.uk/~mgk25/ucs/keysyms.txt
|
||
class function TCDWSCustomForm.X11KeyToLCLKey(AX11Key: TKeySym): Word;
|
||
begin
|
||
case AX11Key of
|
||
$20: Result := VK_SPACE;
|
||
{ 0x0021 U0021 . # exclam
|
||
0x0022 U0022 . # quotedbl
|
||
0x0023 U0023 . # numbersign
|
||
0x0024 U0024 . # dollar
|
||
0x0025 U0025 . # percent
|
||
0x0026 U0026 . # ampersand
|
||
0x0027 U0027 . # apostrophe
|
||
0x0027 U0027 . # quoteright /* deprecated */
|
||
0x0028 U0028 . # parenleft
|
||
0x0029 U0029 . # parenright
|
||
0x002a U002a . # asterisk
|
||
0x002b U002b . # plus
|
||
0x002c U002c . # comma
|
||
0x002d U002d . # minus
|
||
0x002e U002e . # period
|
||
0x002f U002f . # slash}
|
||
$0030: Result := VK_0;
|
||
$0031: Result := VK_1;
|
||
$0032: Result := VK_2;
|
||
$0033: Result := VK_3;
|
||
$0034: Result := VK_4;
|
||
$0035: Result := VK_5;
|
||
$0036: Result := VK_6;
|
||
$0037: Result := VK_7;
|
||
$0038: Result := VK_8;
|
||
$0039: Result := VK_9;
|
||
{ 0x003a U003a . # colon
|
||
0x003b U003b . # semicolon
|
||
0x003c U003c . # less
|
||
0x003d U003d . # equal
|
||
0x003e U003e . # greater
|
||
0x003f U003f . # question
|
||
0x0040 U0040 . # at }
|
||
$41: Result := VK_A;
|
||
$42: Result := VK_B;
|
||
$43: Result := VK_C;
|
||
$44: Result := VK_D;
|
||
$45: Result := VK_E;
|
||
$46: Result := VK_F;
|
||
$47: Result := VK_G;
|
||
$48: Result := VK_H;
|
||
$49: Result := VK_I;
|
||
$4A: Result := VK_J;
|
||
$4B: Result := VK_K;
|
||
$4C: Result := VK_L;
|
||
$4D: Result := VK_M;
|
||
$4E: Result := VK_N;
|
||
$4F: Result := VK_O;
|
||
$50: Result := VK_P;
|
||
$51: Result := VK_Q;
|
||
$52: Result := VK_R;
|
||
$53: Result := VK_S;
|
||
$54: Result := VK_T;
|
||
$55: Result := VK_U;
|
||
$56: Result := VK_V;
|
||
$57: Result := VK_W;
|
||
$58: Result := VK_X;
|
||
$59: Result := VK_Y;
|
||
$5A: Result := VK_Z;
|
||
{ 0x005b U005b . # bracketleft
|
||
0x005c U005c . # backslash
|
||
0x005d U005d . # bracketright
|
||
0x005e U005e . # asciicircum
|
||
0x005f U005f . # underscore
|
||
0x0060 U0060 . # grave
|
||
0x0060 U0060 . # quoteleft /* deprecated */ }
|
||
$61: Result := VK_A;
|
||
$62: Result := VK_B;
|
||
$63: Result := VK_C;
|
||
$64: Result := VK_D;
|
||
$65: Result := VK_E;
|
||
$66: Result := VK_F;
|
||
$67: Result := VK_G;
|
||
$68: Result := VK_H;
|
||
$69: Result := VK_I;
|
||
$6A: Result := VK_J;
|
||
$6B: Result := VK_K;
|
||
$6C: Result := VK_L;
|
||
$6D: Result := VK_M;
|
||
$6E: Result := VK_N;
|
||
$6F: Result := VK_O;
|
||
$70: Result := VK_P;
|
||
$71: Result := VK_Q;
|
||
$72: Result := VK_R;
|
||
$73: Result := VK_S;
|
||
$74: Result := VK_T;
|
||
$75: Result := VK_U;
|
||
$76: Result := VK_V;
|
||
$77: Result := VK_W;
|
||
$78: Result := VK_X;
|
||
$79: Result := VK_Y;
|
||
$7A: Result := VK_Z;
|
||
{ 0x007b U007b . # braceleft
|
||
0x007c U007c . # bar
|
||
0x007d U007d . # braceright
|
||
0x007e U007e . # asciitilde
|
||
0x00a0 U00a0 . # nobreakspace
|
||
0x00a1 U00a1 . # exclamdown
|
||
0x00a2 U00a2 . # cent
|
||
0x00a3 U00a3 . # sterling
|
||
0x00a4 U00a4 . # currency
|
||
0x00a5 U00a5 . # yen
|
||
0x00a6 U00a6 . # brokenbar
|
||
0x00a7 U00a7 . # section
|
||
0x00a8 U00a8 . # diaeresis
|
||
0x00a9 U00a9 . # copyright
|
||
0x00aa U00aa . # ordfeminine
|
||
0x00ab U00ab . # guillemotleft /* left angle quotation mark */
|
||
0x00ac U00ac . # notsign
|
||
0x00ad U00ad . # hyphen
|
||
0x00ae U00ae . # registered
|
||
0x00af U00af . # macron
|
||
0x00b0 U00b0 . # degree
|
||
0x00b1 U00b1 . # plusminus
|
||
0x00b2 U00b2 . # twosuperior
|
||
0x00b3 U00b3 . # threesuperior
|
||
0x00b4 U00b4 . # acute
|
||
0x00b5 U00b5 . # mu
|
||
0x00b6 U00b6 . # paragraph
|
||
0x00b7 U00b7 . # periodcentered
|
||
0x00b8 U00b8 . # cedilla
|
||
0x00b9 U00b9 . # onesuperior
|
||
0x00ba U00ba . # masculine
|
||
0x00bb U00bb . # guillemotright /* right angle quotation mark */
|
||
0x00bc U00bc . # onequarter
|
||
0x00bd U00bd . # onehalf
|
||
0x00be U00be . # threequarters
|
||
0x00bf U00bf . # questiondown
|
||
0x00c0 U00c0 . # Agrave
|
||
0x00c1 U00c1 . # Aacute
|
||
0x00c2 U00c2 . # Acircumflex
|
||
0x00c3 U00c3 . # Atilde
|
||
0x00c4 U00c4 . # Adiaeresis
|
||
0x00c5 U00c5 . # Aring
|
||
0x00c6 U00c6 . # AE
|
||
0x00c7 U00c7 . # Ccedilla
|
||
0x00c8 U00c8 . # Egrave
|
||
0x00c9 U00c9 . # Eacute
|
||
0x00ca U00ca . # Ecircumflex
|
||
0x00cb U00cb . # Ediaeresis
|
||
0x00cc U00cc . # Igrave
|
||
0x00cd U00cd . # Iacute
|
||
0x00ce U00ce . # Icircumflex
|
||
0x00cf U00cf . # Idiaeresis
|
||
0x00d0 U00d0 . # ETH
|
||
0x00d0 U00d0 . # Eth /* deprecated */
|
||
0x00d1 U00d1 . # Ntilde
|
||
0x00d2 U00d2 . # Ograve
|
||
0x00d3 U00d3 . # Oacute
|
||
0x00d4 U00d4 . # Ocircumflex
|
||
0x00d5 U00d5 . # Otilde
|
||
0x00d6 U00d6 . # Odiaeresis
|
||
0x00d7 U00d7 . # multiply
|
||
0x00d8 U00d8 . # Ooblique
|
||
0x00d9 U00d9 . # Ugrave
|
||
0x00da U00da . # Uacute
|
||
0x00db U00db . # Ucircumflex
|
||
0x00dc U00dc . # Udiaeresis
|
||
0x00dd U00dd . # Yacute
|
||
0x00de U00de . # THORN
|
||
0x00de U00de . # Thorn /* deprecated */
|
||
0x00df U00df . # ssharp
|
||
0x00e0 U00e0 . # agrave
|
||
0x00e1 U00e1 . # aacute
|
||
0x00e2 U00e2 . # acircumflex
|
||
0x00e3 U00e3 . # atilde
|
||
0x00e4 U00e4 . # adiaeresis
|
||
0x00e5 U00e5 . # aring
|
||
0x00e6 U00e6 . # ae
|
||
0x00e7 U00e7 . # ccedilla
|
||
0x00e8 U00e8 . # egrave
|
||
0x00e9 U00e9 . # eacute
|
||
0x00ea U00ea . # ecircumflex
|
||
0x00eb U00eb . # ediaeresis
|
||
0x00ec U00ec . # igrave
|
||
0x00ed U00ed . # iacute
|
||
0x00ee U00ee . # icircumflex
|
||
0x00ef U00ef . # idiaeresis
|
||
0x00f0 U00f0 . # eth
|
||
0x00f1 U00f1 . # ntilde
|
||
0x00f2 U00f2 . # ograve
|
||
0x00f3 U00f3 . # oacute
|
||
0x00f4 U00f4 . # ocircumflex
|
||
0x00f5 U00f5 . # otilde
|
||
0x00f6 U00f6 . # odiaeresis
|
||
0x00f7 U00f7 . # division
|
||
0x00f8 U00f8 . # oslash
|
||
0x00f9 U00f9 . # ugrave
|
||
0x00fa U00fa . # uacute
|
||
0x00fb U00fb . # ucircumflex
|
||
0x00fc U00fc . # udiaeresis
|
||
0x00fd U00fd . # yacute
|
||
0x00fe U00fe . # thorn
|
||
0x00ff U00ff . # ydiaeresis
|
||
0x01a1 U0104 . # Aogonek
|
||
0x01a2 U02d8 . # breve
|
||
0x01a3 U0141 . # Lstroke
|
||
0x01a5 U013d . # Lcaron
|
||
0x01a6 U015a . # Sacute
|
||
0x01a9 U0160 . # Scaron
|
||
0x01aa U015e . # Scedilla
|
||
0x01ab U0164 . # Tcaron
|
||
0x01ac U0179 . # Zacute
|
||
0x01ae U017d . # Zcaron
|
||
0x01af U017b . # Zabovedot
|
||
0x01b1 U0105 . # aogonek
|
||
0x01b2 U02db . # ogonek
|
||
0x01b3 U0142 . # lstroke
|
||
0x01b5 U013e . # lcaron
|
||
0x01b6 U015b . # sacute
|
||
0x01b7 U02c7 . # caron
|
||
0x01b9 U0161 . # scaron
|
||
0x01ba U015f . # scedilla
|
||
0x01bb U0165 . # tcaron
|
||
0x01bc U017a . # zacute
|
||
0x01bd U02dd . # doubleacute
|
||
0x01be U017e . # zcaron
|
||
0x01bf U017c . # zabovedot
|
||
0x01c0 U0154 . # Racute
|
||
0x01c3 U0102 . # Abreve
|
||
0x01c5 U0139 . # Lacute
|
||
0x01c6 U0106 . # Cacute
|
||
0x01c8 U010c . # Ccaron
|
||
0x01ca U0118 . # Eogonek
|
||
0x01cc U011a . # Ecaron
|
||
0x01cf U010e . # Dcaron
|
||
0x01d0 U0110 . # Dstroke
|
||
0x01d1 U0143 . # Nacute
|
||
0x01d2 U0147 . # Ncaron
|
||
0x01d5 U0150 . # Odoubleacute
|
||
0x01d8 U0158 . # Rcaron
|
||
0x01d9 U016e . # Uring
|
||
0x01db U0170 . # Udoubleacute
|
||
0x01de U0162 . # Tcedilla
|
||
0x01e0 U0155 . # racute
|
||
0x01e3 U0103 . # abreve
|
||
0x01e5 U013a . # lacute
|
||
0x01e6 U0107 . # cacute
|
||
0x01e8 U010d . # ccaron
|
||
0x01ea U0119 . # eogonek
|
||
0x01ec U011b . # ecaron
|
||
0x01ef U010f . # dcaron
|
||
0x01f0 U0111 . # dstroke
|
||
0x01f1 U0144 . # nacute
|
||
0x01f2 U0148 . # ncaron
|
||
0x01f5 U0151 . # odoubleacute
|
||
0x01f8 U0159 . # rcaron
|
||
0x01f9 U016f . # uring
|
||
0x01fb U0171 . # udoubleacute
|
||
0x01fe U0163 . # tcedilla
|
||
0x01ff U02d9 . # abovedot
|
||
0x02a1 U0126 . # Hstroke
|
||
0x02a6 U0124 . # Hcircumflex
|
||
0x02a9 U0130 . # Iabovedot
|
||
0x02ab U011e . # Gbreve
|
||
0x02ac U0134 . # Jcircumflex
|
||
0x02b1 U0127 . # hstroke
|
||
0x02b6 U0125 . # hcircumflex
|
||
0x02b9 U0131 . # idotless
|
||
0x02bb U011f . # gbreve
|
||
0x02bc U0135 . # jcircumflex
|
||
0x02c5 U010a . # Cabovedot
|
||
0x02c6 U0108 . # Ccircumflex
|
||
0x02d5 U0120 . # Gabovedot
|
||
0x02d8 U011c . # Gcircumflex
|
||
0x02dd U016c . # Ubreve
|
||
0x02de U015c . # Scircumflex
|
||
0x02e5 U010b . # cabovedot
|
||
0x02e6 U0109 . # ccircumflex
|
||
0x02f5 U0121 . # gabovedot
|
||
0x02f8 U011d . # gcircumflex
|
||
0x02fd U016d . # ubreve
|
||
0x02fe U015d . # scircumflex
|
||
0x03a2 U0138 . # kra
|
||
0x03a3 U0156 . # Rcedilla
|
||
0x03a5 U0128 . # Itilde
|
||
0x03a6 U013b . # Lcedilla
|
||
0x03aa U0112 . # Emacron
|
||
0x03ab U0122 . # Gcedilla
|
||
0x03ac U0166 . # Tslash
|
||
0x03b3 U0157 . # rcedilla
|
||
0x03b5 U0129 . # itilde
|
||
0x03b6 U013c . # lcedilla
|
||
0x03ba U0113 . # emacron
|
||
0x03bb U0123 . # gcedilla
|
||
0x03bc U0167 . # tslash
|
||
0x03bd U014a . # ENG
|
||
0x03bf U014b . # eng
|
||
0x03c0 U0100 . # Amacron
|
||
0x03c7 U012e . # Iogonek
|
||
0x03cc U0116 . # Eabovedot
|
||
0x03cf U012a . # Imacron
|
||
0x03d1 U0145 . # Ncedilla
|
||
0x03d2 U014c . # Omacron
|
||
0x03d3 U0136 . # Kcedilla
|
||
0x03d9 U0172 . # Uogonek
|
||
0x03dd U0168 . # Utilde
|
||
0x03de U016a . # Umacron
|
||
0x03e0 U0101 . # amacron
|
||
0x03e7 U012f . # iogonek
|
||
0x03ec U0117 . # eabovedot
|
||
0x03ef U012b . # imacron
|
||
0x03f1 U0146 . # ncedilla
|
||
0x03f2 U014d . # omacron
|
||
0x03f3 U0137 . # kcedilla
|
||
0x03f9 U0173 . # uogonek
|
||
0x03fd U0169 . # utilde
|
||
0x03fe U016b . # umacron
|
||
0x047e U203e . # overline
|
||
0x04a1 U3002 . # kana_fullstop
|
||
0x04a2 U300c . # kana_openingbracket
|
||
0x04a3 U300d . # kana_closingbracket
|
||
0x04a4 U3001 . # kana_comma
|
||
0x04a5 U30fb . # kana_conjunctive
|
||
0x04a6 U30f2 . # kana_WO
|
||
0x04a7 U30a1 . # kana_a
|
||
0x04a8 U30a3 . # kana_i
|
||
0x04a9 U30a5 . # kana_u
|
||
0x04aa U30a7 . # kana_e
|
||
0x04ab U30a9 . # kana_o
|
||
0x04ac U30e3 . # kana_ya
|
||
0x04ad U30e5 . # kana_yu
|
||
0x04ae U30e7 . # kana_yo
|
||
0x04af U30c3 . # kana_tsu
|
||
0x04b0 U30fc . # prolongedsound
|
||
0x04b1 U30a2 . # kana_A
|
||
0x04b2 U30a4 . # kana_I
|
||
0x04b3 U30a6 . # kana_U
|
||
0x04b4 U30a8 . # kana_E
|
||
0x04b5 U30aa . # kana_O
|
||
0x04b6 U30ab . # kana_KA
|
||
0x04b7 U30ad . # kana_KI
|
||
0x04b8 U30af . # kana_KU
|
||
0x04b9 U30b1 . # kana_KE
|
||
0x04ba U30b3 . # kana_KO
|
||
0x04bb U30b5 . # kana_SA
|
||
0x04bc U30b7 . # kana_SHI
|
||
0x04bd U30b9 . # kana_SU
|
||
0x04be U30bb . # kana_SE
|
||
0x04bf U30bd . # kana_SO
|
||
0x04c0 U30bf . # kana_TA
|
||
0x04c1 U30c1 . # kana_CHI
|
||
0x04c2 U30c4 . # kana_TSU
|
||
0x04c3 U30c6 . # kana_TE
|
||
0x04c4 U30c8 . # kana_TO
|
||
0x04c5 U30ca . # kana_NA
|
||
0x04c6 U30cb . # kana_NI
|
||
0x04c7 U30cc . # kana_NU
|
||
0x04c8 U30cd . # kana_NE
|
||
0x04c9 U30ce . # kana_NO
|
||
0x04ca U30cf . # kana_HA
|
||
0x04cb U30d2 . # kana_HI
|
||
0x04cc U30d5 . # kana_FU
|
||
0x04cd U30d8 . # kana_HE
|
||
0x04ce U30db . # kana_HO
|
||
0x04cf U30de . # kana_MA
|
||
0x04d0 U30df . # kana_MI
|
||
0x04d1 U30e0 . # kana_MU
|
||
0x04d2 U30e1 . # kana_ME
|
||
0x04d3 U30e2 . # kana_MO
|
||
0x04d4 U30e4 . # kana_YA
|
||
0x04d5 U30e6 . # kana_YU
|
||
0x04d6 U30e8 . # kana_YO
|
||
0x04d7 U30e9 . # kana_RA
|
||
0x04d8 U30ea . # kana_RI
|
||
0x04d9 U30eb . # kana_RU
|
||
0x04da U30ec . # kana_RE
|
||
0x04db U30ed . # kana_RO
|
||
0x04dc U30ef . # kana_WA
|
||
0x04dd U30f3 . # kana_N
|
||
0x04de U309b . # voicedsound
|
||
0x04df U309c . # semivoicedsound
|
||
0x05ac U060c . # Arabic_comma
|
||
0x05bb U061b . # Arabic_semicolon
|
||
0x05bf U061f . # Arabic_question_mark
|
||
0x05c1 U0621 . # Arabic_hamza
|
||
0x05c2 U0622 . # Arabic_maddaonalef
|
||
0x05c3 U0623 . # Arabic_hamzaonalef
|
||
0x05c4 U0624 . # Arabic_hamzaonwaw
|
||
0x05c5 U0625 . # Arabic_hamzaunderalef
|
||
0x05c6 U0626 . # Arabic_hamzaonyeh
|
||
0x05c7 U0627 . # Arabic_alef
|
||
0x05c8 U0628 . # Arabic_beh
|
||
0x05c9 U0629 . # Arabic_tehmarbuta
|
||
0x05ca U062a . # Arabic_teh
|
||
0x05cb U062b . # Arabic_theh
|
||
0x05cc U062c . # Arabic_jeem
|
||
0x05cd U062d . # Arabic_hah
|
||
0x05ce U062e . # Arabic_khah
|
||
0x05cf U062f . # Arabic_dal
|
||
0x05d0 U0630 . # Arabic_thal
|
||
0x05d1 U0631 . # Arabic_ra
|
||
0x05d2 U0632 . # Arabic_zain
|
||
0x05d3 U0633 . # Arabic_seen
|
||
0x05d4 U0634 . # Arabic_sheen
|
||
0x05d5 U0635 . # Arabic_sad
|
||
0x05d6 U0636 . # Arabic_dad
|
||
0x05d7 U0637 . # Arabic_tah
|
||
0x05d8 U0638 . # Arabic_zah
|
||
0x05d9 U0639 . # Arabic_ain
|
||
0x05da U063a . # Arabic_ghain
|
||
0x05e0 U0640 . # Arabic_tatweel
|
||
0x05e1 U0641 . # Arabic_feh
|
||
0x05e2 U0642 . # Arabic_qaf
|
||
0x05e3 U0643 . # Arabic_kaf
|
||
0x05e4 U0644 . # Arabic_lam
|
||
0x05e5 U0645 . # Arabic_meem
|
||
0x05e6 U0646 . # Arabic_noon
|
||
0x05e7 U0647 . # Arabic_ha
|
||
0x05e8 U0648 . # Arabic_waw
|
||
0x05e9 U0649 . # Arabic_alefmaksura
|
||
0x05ea U064a . # Arabic_yeh
|
||
0x05eb U064b . # Arabic_fathatan
|
||
0x05ec U064c . # Arabic_dammatan
|
||
0x05ed U064d . # Arabic_kasratan
|
||
0x05ee U064e . # Arabic_fatha
|
||
0x05ef U064f . # Arabic_damma
|
||
0x05f0 U0650 . # Arabic_kasra
|
||
0x05f1 U0651 . # Arabic_shadda
|
||
0x05f2 U0652 . # Arabic_sukun
|
||
0x06a1 U0452 . # Serbian_dje
|
||
0x06a2 U0453 . # Macedonia_gje
|
||
0x06a3 U0451 . # Cyrillic_io
|
||
0x06a4 U0454 . # Ukrainian_ie
|
||
0x06a5 U0455 . # Macedonia_dse
|
||
0x06a6 U0456 . # Ukrainian_i
|
||
0x06a7 U0457 . # Ukrainian_yi
|
||
0x06a8 U0458 . # Cyrillic_je
|
||
0x06a9 U0459 . # Cyrillic_lje
|
||
0x06aa U045a . # Cyrillic_nje
|
||
0x06ab U045b . # Serbian_tshe
|
||
0x06ac U045c . # Macedonia_kje
|
||
0x06ae U045e . # Byelorussian_shortu
|
||
0x06af U045f . # Cyrillic_dzhe
|
||
0x06b0 U2116 . # numerosign
|
||
0x06b1 U0402 . # Serbian_DJE
|
||
0x06b2 U0403 . # Macedonia_GJE
|
||
0x06b3 U0401 . # Cyrillic_IO
|
||
0x06b4 U0404 . # Ukrainian_IE
|
||
0x06b5 U0405 . # Macedonia_DSE
|
||
0x06b6 U0406 . # Ukrainian_I
|
||
0x06b7 U0407 . # Ukrainian_YI
|
||
0x06b8 U0408 . # Cyrillic_JE
|
||
0x06b9 U0409 . # Cyrillic_LJE
|
||
0x06ba U040a . # Cyrillic_NJE
|
||
0x06bb U040b . # Serbian_TSHE
|
||
0x06bc U040c . # Macedonia_KJE
|
||
0x06be U040e . # Byelorussian_SHORTU
|
||
0x06bf U040f . # Cyrillic_DZHE
|
||
0x06c0 U044e . # Cyrillic_yu
|
||
0x06c1 U0430 . # Cyrillic_a
|
||
0x06c2 U0431 . # Cyrillic_be
|
||
0x06c3 U0446 . # Cyrillic_tse
|
||
0x06c4 U0434 . # Cyrillic_de
|
||
0x06c5 U0435 . # Cyrillic_ie
|
||
0x06c6 U0444 . # Cyrillic_ef
|
||
0x06c7 U0433 . # Cyrillic_ghe
|
||
0x06c8 U0445 . # Cyrillic_ha
|
||
0x06c9 U0438 . # Cyrillic_i
|
||
0x06ca U0439 . # Cyrillic_shorti
|
||
0x06cb U043a . # Cyrillic_ka
|
||
0x06cc U043b . # Cyrillic_el
|
||
0x06cd U043c . # Cyrillic_em
|
||
0x06ce U043d . # Cyrillic_en
|
||
0x06cf U043e . # Cyrillic_o
|
||
0x06d0 U043f . # Cyrillic_pe
|
||
0x06d1 U044f . # Cyrillic_ya
|
||
0x06d2 U0440 . # Cyrillic_er
|
||
0x06d3 U0441 . # Cyrillic_es
|
||
0x06d4 U0442 . # Cyrillic_te
|
||
0x06d5 U0443 . # Cyrillic_u
|
||
0x06d6 U0436 . # Cyrillic_zhe
|
||
0x06d7 U0432 . # Cyrillic_ve
|
||
0x06d8 U044c . # Cyrillic_softsign
|
||
0x06d9 U044b . # Cyrillic_yeru
|
||
0x06da U0437 . # Cyrillic_ze
|
||
0x06db U0448 . # Cyrillic_sha
|
||
0x06dc U044d . # Cyrillic_e
|
||
0x06dd U0449 . # Cyrillic_shcha
|
||
0x06de U0447 . # Cyrillic_che
|
||
0x06df U044a . # Cyrillic_hardsign
|
||
0x06e0 U042e . # Cyrillic_YU
|
||
0x06e1 U0410 . # Cyrillic_A
|
||
0x06e2 U0411 . # Cyrillic_BE
|
||
0x06e3 U0426 . # Cyrillic_TSE
|
||
0x06e4 U0414 . # Cyrillic_DE
|
||
0x06e5 U0415 . # Cyrillic_IE
|
||
0x06e6 U0424 . # Cyrillic_EF
|
||
0x06e7 U0413 . # Cyrillic_GHE
|
||
0x06e8 U0425 . # Cyrillic_HA
|
||
0x06e9 U0418 . # Cyrillic_I
|
||
0x06ea U0419 . # Cyrillic_SHORTI
|
||
0x06eb U041a . # Cyrillic_KA
|
||
0x06ec U041b . # Cyrillic_EL
|
||
0x06ed U041c . # Cyrillic_EM
|
||
0x06ee U041d . # Cyrillic_EN
|
||
0x06ef U041e . # Cyrillic_O
|
||
0x06f0 U041f . # Cyrillic_PE
|
||
0x06f1 U042f . # Cyrillic_YA
|
||
0x06f2 U0420 . # Cyrillic_ER
|
||
0x06f3 U0421 . # Cyrillic_ES
|
||
0x06f4 U0422 . # Cyrillic_TE
|
||
0x06f5 U0423 . # Cyrillic_U
|
||
0x06f6 U0416 . # Cyrillic_ZHE
|
||
0x06f7 U0412 . # Cyrillic_VE
|
||
0x06f8 U042c . # Cyrillic_SOFTSIGN
|
||
0x06f9 U042b . # Cyrillic_YERU
|
||
0x06fa U0417 . # Cyrillic_ZE
|
||
0x06fb U0428 . # Cyrillic_SHA
|
||
0x06fc U042d . # Cyrillic_E
|
||
0x06fd U0429 . # Cyrillic_SHCHA
|
||
0x06fe U0427 . # Cyrillic_CHE
|
||
0x06ff U042a . # Cyrillic_HARDSIGN
|
||
0x07a1 U0386 . # Greek_ALPHAaccent
|
||
0x07a2 U0388 . # Greek_EPSILONaccent
|
||
0x07a3 U0389 . # Greek_ETAaccent
|
||
0x07a4 U038a . # Greek_IOTAaccent
|
||
0x07a5 U03aa . # Greek_IOTAdiaeresis
|
||
0x07a7 U038c . # Greek_OMICRONaccent
|
||
0x07a8 U038e . # Greek_UPSILONaccent
|
||
0x07a9 U03ab . # Greek_UPSILONdieresis
|
||
0x07ab U038f . # Greek_OMEGAaccent
|
||
0x07ae U0385 . # Greek_accentdieresis
|
||
0x07af U2015 . # Greek_horizbar
|
||
0x07b1 U03ac . # Greek_alphaaccent
|
||
0x07b2 U03ad . # Greek_epsilonaccent
|
||
0x07b3 U03ae . # Greek_etaaccent
|
||
0x07b4 U03af . # Greek_iotaaccent
|
||
0x07b5 U03ca . # Greek_iotadieresis
|
||
0x07b6 U0390 . # Greek_iotaaccentdieresis
|
||
0x07b7 U03cc . # Greek_omicronaccent
|
||
0x07b8 U03cd . # Greek_upsilonaccent
|
||
0x07b9 U03cb . # Greek_upsilondieresis
|
||
0x07ba U03b0 . # Greek_upsilonaccentdieresis
|
||
0x07bb U03ce . # Greek_omegaaccent
|
||
0x07c1 U0391 . # Greek_ALPHA
|
||
0x07c2 U0392 . # Greek_BETA
|
||
0x07c3 U0393 . # Greek_GAMMA
|
||
0x07c4 U0394 . # Greek_DELTA
|
||
0x07c5 U0395 . # Greek_EPSILON
|
||
0x07c6 U0396 . # Greek_ZETA
|
||
0x07c7 U0397 . # Greek_ETA
|
||
0x07c8 U0398 . # Greek_THETA
|
||
0x07c9 U0399 . # Greek_IOTA
|
||
0x07ca U039a . # Greek_KAPPA
|
||
0x07cb U039b . # Greek_LAMBDA
|
||
0x07cb U039b . # Greek_LAMDA
|
||
0x07cc U039c . # Greek_MU
|
||
0x07cd U039d . # Greek_NU
|
||
0x07ce U039e . # Greek_XI
|
||
0x07cf U039f . # Greek_OMICRON
|
||
0x07d0 U03a0 . # Greek_PI
|
||
0x07d1 U03a1 . # Greek_RHO
|
||
0x07d2 U03a3 . # Greek_SIGMA
|
||
0x07d4 U03a4 . # Greek_TAU
|
||
0x07d5 U03a5 . # Greek_UPSILON
|
||
0x07d6 U03a6 . # Greek_PHI
|
||
0x07d7 U03a7 . # Greek_CHI
|
||
0x07d8 U03a8 . # Greek_PSI
|
||
0x07d9 U03a9 . # Greek_OMEGA
|
||
0x07e1 U03b1 . # Greek_alpha
|
||
0x07e2 U03b2 . # Greek_beta
|
||
0x07e3 U03b3 . # Greek_gamma
|
||
0x07e4 U03b4 . # Greek_delta
|
||
0x07e5 U03b5 . # Greek_epsilon
|
||
0x07e6 U03b6 . # Greek_zeta
|
||
0x07e7 U03b7 . # Greek_eta
|
||
0x07e8 U03b8 . # Greek_theta
|
||
0x07e9 U03b9 . # Greek_iota
|
||
0x07ea U03ba . # Greek_kappa
|
||
0x07eb U03bb . # Greek_lambda
|
||
0x07ec U03bc . # Greek_mu
|
||
0x07ed U03bd . # Greek_nu
|
||
0x07ee U03be . # Greek_xi
|
||
0x07ef U03bf . # Greek_omicron
|
||
0x07f0 U03c0 . # Greek_pi
|
||
0x07f1 U03c1 . # Greek_rho
|
||
0x07f2 U03c3 . # Greek_sigma
|
||
0x07f3 U03c2 . # Greek_finalsmallsigma
|
||
0x07f4 U03c4 . # Greek_tau
|
||
0x07f5 U03c5 . # Greek_upsilon
|
||
0x07f6 U03c6 . # Greek_phi
|
||
0x07f7 U03c7 . # Greek_chi
|
||
0x07f8 U03c8 . # Greek_psi
|
||
0x07f9 U03c9 . # Greek_omega
|
||
0x08a1 U23b7 . # leftradical
|
||
0x08a2 U250c d # topleftradical
|
||
0x08a3 U2500 d # horizconnector
|
||
0x08a4 U2320 . # topintegral
|
||
0x08a5 U2321 . # botintegral
|
||
0x08a6 U2502 d # vertconnector
|
||
0x08a7 U23a1 . # topleftsqbracket
|
||
0x08a8 U23a3 . # botleftsqbracket
|
||
0x08a9 U23a4 . # toprightsqbracket
|
||
0x08aa U23a6 . # botrightsqbracket
|
||
0x08ab U239b . # topleftparens
|
||
0x08ac U239d . # botleftparens
|
||
0x08ad U239e . # toprightparens
|
||
0x08ae U23a0 . # botrightparens
|
||
0x08af U23a8 . # leftmiddlecurlybrace
|
||
0x08b0 U23ac . # rightmiddlecurlybrace
|
||
0x08b1 U0000 o # topleftsummation
|
||
0x08b2 U0000 o # botleftsummation
|
||
0x08b3 U0000 o # topvertsummationconnector
|
||
0x08b4 U0000 o # botvertsummationconnector
|
||
0x08b5 U0000 o # toprightsummation
|
||
0x08b6 U0000 o # botrightsummation
|
||
0x08b7 U0000 o # rightmiddlesummation
|
||
0x08bc U2264 . # lessthanequal
|
||
0x08bd U2260 . # notequal
|
||
0x08be U2265 . # greaterthanequal
|
||
0x08bf U222b . # integral
|
||
0x08c0 U2234 . # therefore
|
||
0x08c1 U221d . # variation
|
||
0x08c2 U221e . # infinity
|
||
0x08c5 U2207 . # nabla
|
||
0x08c8 U223c . # approximate
|
||
0x08c9 U2243 . # similarequal
|
||
0x08cd U21d4 . # ifonlyif
|
||
0x08ce U21d2 . # implies
|
||
0x08cf U2261 . # identical
|
||
0x08d6 U221a . # radical
|
||
0x08da U2282 . # includedin
|
||
0x08db U2283 . # includes
|
||
0x08dc U2229 . # intersection
|
||
0x08dd U222a . # union
|
||
0x08de U2227 . # logicaland
|
||
0x08df U2228 . # logicalor
|
||
0x08ef U2202 . # partialderivative
|
||
0x08f6 U0192 . # function
|
||
0x08fb U2190 . # leftarrow
|
||
0x08fc U2191 . # uparrow
|
||
0x08fd U2192 . # rightarrow
|
||
0x08fe U2193 . # downarrow
|
||
0x09df U0000 o # blank
|
||
0x09e0 U25c6 . # soliddiamond
|
||
0x09e1 U2592 . # checkerboard
|
||
0x09e2 U2409 . # ht
|
||
0x09e3 U240c . # ff
|
||
0x09e4 U240d . # cr
|
||
0x09e5 U240a . # lf
|
||
0x09e8 U2424 . # nl
|
||
0x09e9 U240b . # vt
|
||
0x09ea U2518 . # lowrightcorner
|
||
0x09eb U2510 . # uprightcorner
|
||
0x09ec U250c . # upleftcorner
|
||
0x09ed U2514 . # lowleftcorner
|
||
0x09ee U253c . # crossinglines
|
||
0x09ef U23ba . # horizlinescan1
|
||
0x09f0 U23bb . # horizlinescan3
|
||
0x09f1 U2500 . # horizlinescan5
|
||
0x09f2 U23bc . # horizlinescan7
|
||
0x09f3 U23bd . # horizlinescan9
|
||
0x09f4 U251c . # leftt
|
||
0x09f5 U2524 . # rightt
|
||
0x09f6 U2534 . # bott
|
||
0x09f7 U252c . # topt
|
||
0x09f8 U2502 . # vertbar
|
||
0x0aa1 U2003 . # emspace
|
||
0x0aa2 U2002 . # enspace
|
||
0x0aa3 U2004 . # em3space
|
||
0x0aa4 U2005 . # em4space
|
||
0x0aa5 U2007 . # digitspace
|
||
0x0aa6 U2008 . # punctspace
|
||
0x0aa7 U2009 . # thinspace
|
||
0x0aa8 U200a . # hairspace
|
||
0x0aa9 U2014 . # emdash
|
||
0x0aaa U2013 . # endash
|
||
0x0aac U2423 o # signifblank
|
||
0x0aae U2026 . # ellipsis
|
||
0x0aaf U2025 . # doubbaselinedot
|
||
0x0ab0 U2153 . # onethird
|
||
0x0ab1 U2154 . # twothirds
|
||
0x0ab2 U2155 . # onefifth
|
||
0x0ab3 U2156 . # twofifths
|
||
0x0ab4 U2157 . # threefifths
|
||
0x0ab5 U2158 . # fourfifths
|
||
0x0ab6 U2159 . # onesixth
|
||
0x0ab7 U215a . # fivesixths
|
||
0x0ab8 U2105 . # careof
|
||
0x0abb U2012 . # figdash
|
||
0x0abc U27e8 o # leftanglebracket
|
||
0x0abd U002e o # decimalpoint
|
||
0x0abe U27e9 o # rightanglebracket
|
||
0x0abf U0000 o # marker
|
||
0x0ac3 U215b . # oneeighth
|
||
0x0ac4 U215c . # threeeighths
|
||
0x0ac5 U215d . # fiveeighths
|
||
0x0ac6 U215e . # seveneighths
|
||
0x0ac9 U2122 . # trademark
|
||
0x0aca U2613 o # signaturemark
|
||
0x0acb U0000 o # trademarkincircle
|
||
0x0acc U25c1 o # leftopentriangle
|
||
0x0acd U25b7 o # rightopentriangle
|
||
0x0ace U25cb o # emopencircle
|
||
0x0acf U25af o # emopenrectangle
|
||
0x0ad0 U2018 . # leftsinglequotemark
|
||
0x0ad1 U2019 . # rightsinglequotemark
|
||
0x0ad2 U201c . # leftdoublequotemark
|
||
0x0ad3 U201d . # rightdoublequotemark
|
||
0x0ad4 U211e . # prescription
|
||
0x0ad6 U2032 . # minutes
|
||
0x0ad7 U2033 . # seconds
|
||
0x0ad9 U271d . # latincross
|
||
0x0ada U0000 o # hexagram
|
||
0x0adb U25ac o # filledrectbullet
|
||
0x0adc U25c0 o # filledlefttribullet
|
||
0x0add U25b6 o # filledrighttribullet
|
||
0x0ade U25cf o # emfilledcircle
|
||
0x0adf U25ae o # emfilledrect
|
||
0x0ae0 U25e6 o # enopencircbullet
|
||
0x0ae1 U25ab o # enopensquarebullet
|
||
0x0ae2 U25ad o # openrectbullet
|
||
0x0ae3 U25b3 o # opentribulletup
|
||
0x0ae4 U25bd o # opentribulletdown
|
||
0x0ae5 U2606 o # openstar
|
||
0x0ae6 U2022 o # enfilledcircbullet
|
||
0x0ae7 U25aa o # enfilledsqbullet
|
||
0x0ae8 U25b2 o # filledtribulletup
|
||
0x0ae9 U25bc o # filledtribulletdown
|
||
0x0aea U261c o # leftpointer
|
||
0x0aeb U261e o # rightpointer
|
||
0x0aec U2663 . # club
|
||
0x0aed U2666 . # diamond
|
||
0x0aee U2665 . # heart
|
||
0x0af0 U2720 . # maltesecross
|
||
0x0af1 U2020 . # dagger
|
||
0x0af2 U2021 . # doubledagger
|
||
0x0af3 U2713 . # checkmark
|
||
0x0af4 U2717 . # ballotcross
|
||
0x0af5 U266f . # musicalsharp
|
||
0x0af6 U266d . # musicalflat
|
||
0x0af7 U2642 . # malesymbol
|
||
0x0af8 U2640 . # femalesymbol
|
||
0x0af9 U260e . # telephone
|
||
0x0afa U2315 . # telephonerecorder
|
||
0x0afb U2117 . # phonographcopyright
|
||
0x0afc U2038 . # caret
|
||
0x0afd U201a . # singlelowquotemark
|
||
0x0afe U201e . # doublelowquotemark
|
||
0x0aff U0000 o # cursor
|
||
0x0ba3 U003c d # leftcaret
|
||
0x0ba6 U003e d # rightcaret
|
||
0x0ba8 U2228 d # downcaret
|
||
0x0ba9 U2227 d # upcaret
|
||
0x0bc0 U00af d # overbar
|
||
0x0bc2 U22a5 . # downtack
|
||
0x0bc3 U2229 d # upshoe
|
||
0x0bc4 U230a . # downstile
|
||
0x0bc6 U005f d # underbar
|
||
0x0bca U2218 . # jot
|
||
0x0bcc U2395 . # quad
|
||
0x0bce U22a4 . # uptack
|
||
0x0bcf U25cb . # circle
|
||
0x0bd3 U2308 . # upstile
|
||
0x0bd6 U222a d # downshoe
|
||
0x0bd8 U2283 d # rightshoe
|
||
0x0bda U2282 d # leftshoe
|
||
0x0bdc U22a2 . # lefttack
|
||
0x0bfc U22a3 . # righttack
|
||
0x0cdf U2017 . # hebrew_doublelowline
|
||
0x0ce0 U05d0 . # hebrew_aleph
|
||
0x0ce1 U05d1 . # hebrew_bet
|
||
0x0ce1 U05d1 . # hebrew_beth /* deprecated */
|
||
0x0ce2 U05d2 . # hebrew_gimel
|
||
0x0ce2 U05d2 . # hebrew_gimmel /* deprecated */
|
||
0x0ce3 U05d3 . # hebrew_dalet
|
||
0x0ce3 U05d3 . # hebrew_daleth /* deprecated */
|
||
0x0ce4 U05d4 . # hebrew_he
|
||
0x0ce5 U05d5 . # hebrew_waw
|
||
0x0ce6 U05d6 . # hebrew_zain
|
||
0x0ce6 U05d6 . # hebrew_zayin /* deprecated */
|
||
0x0ce7 U05d7 . # hebrew_chet
|
||
0x0ce7 U05d7 . # hebrew_het /* deprecated */
|
||
0x0ce8 U05d8 . # hebrew_tet
|
||
0x0ce8 U05d8 . # hebrew_teth /* deprecated */
|
||
0x0ce9 U05d9 . # hebrew_yod
|
||
0x0cea U05da . # hebrew_finalkaph
|
||
0x0ceb U05db . # hebrew_kaph
|
||
0x0cec U05dc . # hebrew_lamed
|
||
0x0ced U05dd . # hebrew_finalmem
|
||
0x0cee U05de . # hebrew_mem
|
||
0x0cef U05df . # hebrew_finalnun
|
||
0x0cf0 U05e0 . # hebrew_nun
|
||
0x0cf1 U05e1 . # hebrew_samech
|
||
0x0cf1 U05e1 . # hebrew_samekh /* deprecated */
|
||
0x0cf2 U05e2 . # hebrew_ayin
|
||
0x0cf3 U05e3 . # hebrew_finalpe
|
||
0x0cf4 U05e4 . # hebrew_pe
|
||
0x0cf5 U05e5 . # hebrew_finalzade
|
||
0x0cf5 U05e5 . # hebrew_finalzadi /* deprecated */
|
||
0x0cf6 U05e6 . # hebrew_zade
|
||
0x0cf6 U05e6 . # hebrew_zadi /* deprecated */
|
||
0x0cf7 U05e7 . # hebrew_kuf /* deprecated */
|
||
0x0cf7 U05e7 . # hebrew_qoph
|
||
0x0cf8 U05e8 . # hebrew_resh
|
||
0x0cf9 U05e9 . # hebrew_shin
|
||
0x0cfa U05ea . # hebrew_taf /* deprecated */
|
||
0x0cfa U05ea . # hebrew_taw
|
||
0x0da1 U0e01 . # Thai_kokai
|
||
0x0da2 U0e02 . # Thai_khokhai
|
||
0x0da3 U0e03 . # Thai_khokhuat
|
||
0x0da4 U0e04 . # Thai_khokhwai
|
||
0x0da5 U0e05 . # Thai_khokhon
|
||
0x0da6 U0e06 . # Thai_khorakhang
|
||
0x0da7 U0e07 . # Thai_ngongu
|
||
0x0da8 U0e08 . # Thai_chochan
|
||
0x0da9 U0e09 . # Thai_choching
|
||
0x0daa U0e0a . # Thai_chochang
|
||
0x0dab U0e0b . # Thai_soso
|
||
0x0dac U0e0c . # Thai_chochoe
|
||
0x0dad U0e0d . # Thai_yoying
|
||
0x0dae U0e0e . # Thai_dochada
|
||
0x0daf U0e0f . # Thai_topatak
|
||
0x0db0 U0e10 . # Thai_thothan
|
||
0x0db1 U0e11 . # Thai_thonangmontho
|
||
0x0db2 U0e12 . # Thai_thophuthao
|
||
0x0db3 U0e13 . # Thai_nonen
|
||
0x0db4 U0e14 . # Thai_dodek
|
||
0x0db5 U0e15 . # Thai_totao
|
||
0x0db6 U0e16 . # Thai_thothung
|
||
0x0db7 U0e17 . # Thai_thothahan
|
||
0x0db8 U0e18 . # Thai_thothong
|
||
0x0db9 U0e19 . # Thai_nonu
|
||
0x0dba U0e1a . # Thai_bobaimai
|
||
0x0dbb U0e1b . # Thai_popla
|
||
0x0dbc U0e1c . # Thai_phophung
|
||
0x0dbd U0e1d . # Thai_fofa
|
||
0x0dbe U0e1e . # Thai_phophan
|
||
0x0dbf U0e1f . # Thai_fofan
|
||
0x0dc0 U0e20 . # Thai_phosamphao
|
||
0x0dc1 U0e21 . # Thai_moma
|
||
0x0dc2 U0e22 . # Thai_yoyak
|
||
0x0dc3 U0e23 . # Thai_rorua
|
||
0x0dc4 U0e24 . # Thai_ru
|
||
0x0dc5 U0e25 . # Thai_loling
|
||
0x0dc6 U0e26 . # Thai_lu
|
||
0x0dc7 U0e27 . # Thai_wowaen
|
||
0x0dc8 U0e28 . # Thai_sosala
|
||
0x0dc9 U0e29 . # Thai_sorusi
|
||
0x0dca U0e2a . # Thai_sosua
|
||
0x0dcb U0e2b . # Thai_hohip
|
||
0x0dcc U0e2c . # Thai_lochula
|
||
0x0dcd U0e2d . # Thai_oang
|
||
0x0dce U0e2e . # Thai_honokhuk
|
||
0x0dcf U0e2f . # Thai_paiyannoi
|
||
0x0dd0 U0e30 . # Thai_saraa
|
||
0x0dd1 U0e31 . # Thai_maihanakat
|
||
0x0dd2 U0e32 . # Thai_saraaa
|
||
0x0dd3 U0e33 . # Thai_saraam
|
||
0x0dd4 U0e34 . # Thai_sarai
|
||
0x0dd5 U0e35 . # Thai_saraii
|
||
0x0dd6 U0e36 . # Thai_saraue
|
||
0x0dd7 U0e37 . # Thai_sarauee
|
||
0x0dd8 U0e38 . # Thai_sarau
|
||
0x0dd9 U0e39 . # Thai_sarauu
|
||
0x0dda U0e3a . # Thai_phinthu
|
||
0x0dde U0000 o # Thai_maihanakat_maitho
|
||
0x0ddf U0e3f . # Thai_baht
|
||
0x0de0 U0e40 . # Thai_sarae
|
||
0x0de1 U0e41 . # Thai_saraae
|
||
0x0de2 U0e42 . # Thai_sarao
|
||
0x0de3 U0e43 . # Thai_saraaimaimuan
|
||
0x0de4 U0e44 . # Thai_saraaimaimalai
|
||
0x0de5 U0e45 . # Thai_lakkhangyao
|
||
0x0de6 U0e46 . # Thai_maiyamok
|
||
0x0de7 U0e47 . # Thai_maitaikhu
|
||
0x0de8 U0e48 . # Thai_maiek
|
||
0x0de9 U0e49 . # Thai_maitho
|
||
0x0dea U0e4a . # Thai_maitri
|
||
0x0deb U0e4b . # Thai_maichattawa
|
||
0x0dec U0e4c . # Thai_thanthakhat
|
||
0x0ded U0e4d . # Thai_nikhahit
|
||
0x0df0 U0e50 . # Thai_leksun
|
||
0x0df1 U0e51 . # Thai_leknung
|
||
0x0df2 U0e52 . # Thai_leksong
|
||
0x0df3 U0e53 . # Thai_leksam
|
||
0x0df4 U0e54 . # Thai_leksi
|
||
0x0df5 U0e55 . # Thai_lekha
|
||
0x0df6 U0e56 . # Thai_lekhok
|
||
0x0df7 U0e57 . # Thai_lekchet
|
||
0x0df8 U0e58 . # Thai_lekpaet
|
||
0x0df9 U0e59 . # Thai_lekkao
|
||
0x0ea1 U3131 f # Hangul_Kiyeog
|
||
0x0ea2 U3132 f # Hangul_SsangKiyeog
|
||
0x0ea3 U3133 f # Hangul_KiyeogSios
|
||
0x0ea4 U3134 f # Hangul_Nieun
|
||
0x0ea5 U3135 f # Hangul_NieunJieuj
|
||
0x0ea6 U3136 f # Hangul_NieunHieuh
|
||
0x0ea7 U3137 f # Hangul_Dikeud
|
||
0x0ea8 U3138 f # Hangul_SsangDikeud
|
||
0x0ea9 U3139 f # Hangul_Rieul
|
||
0x0eaa U313a f # Hangul_RieulKiyeog
|
||
0x0eab U313b f # Hangul_RieulMieum
|
||
0x0eac U313c f # Hangul_RieulPieub
|
||
0x0ead U313d f # Hangul_RieulSios
|
||
0x0eae U313e f # Hangul_RieulTieut
|
||
0x0eaf U313f f # Hangul_RieulPhieuf
|
||
0x0eb0 U3140 f # Hangul_RieulHieuh
|
||
0x0eb1 U3141 f # Hangul_Mieum
|
||
0x0eb2 U3142 f # Hangul_Pieub
|
||
0x0eb3 U3143 f # Hangul_SsangPieub
|
||
0x0eb4 U3144 f # Hangul_PieubSios
|
||
0x0eb5 U3145 f # Hangul_Sios
|
||
0x0eb6 U3146 f # Hangul_SsangSios
|
||
0x0eb7 U3147 f # Hangul_Ieung
|
||
0x0eb8 U3148 f # Hangul_Jieuj
|
||
0x0eb9 U3149 f # Hangul_SsangJieuj
|
||
0x0eba U314a f # Hangul_Cieuc
|
||
0x0ebb U314b f # Hangul_Khieuq
|
||
0x0ebc U314c f # Hangul_Tieut
|
||
0x0ebd U314d f # Hangul_Phieuf
|
||
0x0ebe U314e f # Hangul_Hieuh
|
||
0x0ebf U314f f # Hangul_A
|
||
0x0ec0 U3150 f # Hangul_AE
|
||
0x0ec1 U3151 f # Hangul_YA
|
||
0x0ec2 U3152 f # Hangul_YAE
|
||
0x0ec3 U3153 f # Hangul_EO
|
||
0x0ec4 U3154 f # Hangul_E
|
||
0x0ec5 U3155 f # Hangul_YEO
|
||
0x0ec6 U3156 f # Hangul_YE
|
||
0x0ec7 U3157 f # Hangul_O
|
||
0x0ec8 U3158 f # Hangul_WA
|
||
0x0ec9 U3159 f # Hangul_WAE
|
||
0x0eca U315a f # Hangul_OE
|
||
0x0ecb U315b f # Hangul_YO
|
||
0x0ecc U315c f # Hangul_U
|
||
0x0ecd U315d f # Hangul_WEO
|
||
0x0ece U315e f # Hangul_WE
|
||
0x0ecf U315f f # Hangul_WI
|
||
0x0ed0 U3160 f # Hangul_YU
|
||
0x0ed1 U3161 f # Hangul_EU
|
||
0x0ed2 U3162 f # Hangul_YI
|
||
0x0ed3 U3163 f # Hangul_I
|
||
0x0ed4 U11a8 f # Hangul_J_Kiyeog
|
||
0x0ed5 U11a9 f # Hangul_J_SsangKiyeog
|
||
0x0ed6 U11aa f # Hangul_J_KiyeogSios
|
||
0x0ed7 U11ab f # Hangul_J_Nieun
|
||
0x0ed8 U11ac f # Hangul_J_NieunJieuj
|
||
0x0ed9 U11ad f # Hangul_J_NieunHieuh
|
||
0x0eda U11ae f # Hangul_J_Dikeud
|
||
0x0edb U11af f # Hangul_J_Rieul
|
||
0x0edc U11b0 f # Hangul_J_RieulKiyeog
|
||
0x0edd U11b1 f # Hangul_J_RieulMieum
|
||
0x0ede U11b2 f # Hangul_J_RieulPieub
|
||
0x0edf U11b3 f # Hangul_J_RieulSios
|
||
0x0ee0 U11b4 f # Hangul_J_RieulTieut
|
||
0x0ee1 U11b5 f # Hangul_J_RieulPhieuf
|
||
0x0ee2 U11b6 f # Hangul_J_RieulHieuh
|
||
0x0ee3 U11b7 f # Hangul_J_Mieum
|
||
0x0ee4 U11b8 f # Hangul_J_Pieub
|
||
0x0ee5 U11b9 f # Hangul_J_PieubSios
|
||
0x0ee6 U11ba f # Hangul_J_Sios
|
||
0x0ee7 U11bb f # Hangul_J_SsangSios
|
||
0x0ee8 U11bc f # Hangul_J_Ieung
|
||
0x0ee9 U11bd f # Hangul_J_Jieuj
|
||
0x0eea U11be f # Hangul_J_Cieuc
|
||
0x0eeb U11bf f # Hangul_J_Khieuq
|
||
0x0eec U11c0 f # Hangul_J_Tieut
|
||
0x0eed U11c1 f # Hangul_J_Phieuf
|
||
0x0eee U11c2 f # Hangul_J_Hieuh
|
||
0x0eef U316d f # Hangul_RieulYeorinHieuh
|
||
0x0ef0 U3171 f # Hangul_SunkyeongeumMieum
|
||
0x0ef1 U3178 f # Hangul_SunkyeongeumPieub
|
||
0x0ef2 U317f f # Hangul_PanSios
|
||
0x0ef3 U3181 f # Hangul_KkogjiDalrinIeung
|
||
0x0ef4 U3184 f # Hangul_SunkyeongeumPhieuf
|
||
0x0ef5 U3186 f # Hangul_YeorinHieuh
|
||
0x0ef6 U318d f # Hangul_AraeA
|
||
0x0ef7 U318e f # Hangul_AraeAE
|
||
0x0ef8 U11eb f # Hangul_J_PanSios
|
||
0x0ef9 U11f0 f # Hangul_J_KkogjiDalrinIeung
|
||
0x0efa U11f9 f # Hangul_J_YeorinHieuh
|
||
0x0eff U20a9 o # Korean_Won
|
||
0x13bc U0152 . # OE
|
||
0x13bd U0153 . # oe
|
||
0x13be U0178 . # Ydiaeresis
|
||
0x20a0 U20a0 u # EcuSign
|
||
0x20a1 U20a1 u # ColonSign
|
||
0x20a2 U20a2 u # CruzeiroSign
|
||
0x20a3 U20a3 u # FFrancSign
|
||
0x20a4 U20a4 u # LiraSign
|
||
0x20a5 U20a5 u # MillSign
|
||
0x20a6 U20a6 u # NairaSign
|
||
0x20a7 U20a7 u # PesetaSign
|
||
0x20a8 U20a8 u # RupeeSign
|
||
0x20a9 U20a9 u # WonSign
|
||
0x20aa U20aa u # NewSheqelSign
|
||
0x20ab U20ab u # DongSign
|
||
0x20ac U20ac . # EuroSign
|
||
0xfd01 U0000 f # 3270_Duplicate
|
||
0xfd02 U0000 f # 3270_FieldMark
|
||
0xfd03 U0000 f # 3270_Right2
|
||
0xfd04 U0000 f # 3270_Left2
|
||
0xfd05 U0000 f # 3270_BackTab
|
||
0xfd06 U0000 f # 3270_EraseEOF
|
||
0xfd07 U0000 f # 3270_EraseInput
|
||
0xfd08 U0000 f # 3270_Reset
|
||
0xfd09 U0000 f # 3270_Quit
|
||
0xfd0a U0000 f # 3270_PA1
|
||
0xfd0b U0000 f # 3270_PA2
|
||
0xfd0c U0000 f # 3270_PA3
|
||
0xfd0d U0000 f # 3270_Test
|
||
0xfd0e U0000 f # 3270_Attn
|
||
0xfd0f U0000 f # 3270_CursorBlink
|
||
0xfd10 U0000 f # 3270_AltCursor
|
||
0xfd11 U0000 f # 3270_KeyClick
|
||
0xfd12 U0000 f # 3270_Jump
|
||
0xfd13 U0000 f # 3270_Ident
|
||
0xfd14 U0000 f # 3270_Rule
|
||
0xfd15 U0000 f # 3270_Copy
|
||
0xfd16 U0000 f # 3270_Play
|
||
0xfd17 U0000 f # 3270_Setup
|
||
0xfd18 U0000 f # 3270_Record
|
||
0xfd19 U0000 f # 3270_ChangeScreen
|
||
0xfd1a U0000 f # 3270_DeleteWord
|
||
0xfd1b U0000 f # 3270_ExSelect
|
||
0xfd1c U0000 f # 3270_CursorSelect
|
||
0xfd1d U0000 f # 3270_PrintScreen
|
||
0xfd1e U0000 f # 3270_Enter
|
||
0xfe01 U0000 f # ISO_Lock
|
||
0xfe02 U0000 f # ISO_Level2_Latch
|
||
0xfe03 U0000 f # ISO_Level3_Shift
|
||
0xfe04 U0000 f # ISO_Level3_Latch
|
||
0xfe05 U0000 f # ISO_Level3_Lock
|
||
0xfe06 U0000 f # ISO_Group_Latch
|
||
0xfe07 U0000 f # ISO_Group_Lock
|
||
0xfe08 U0000 f # ISO_Next_Group
|
||
0xfe09 U0000 f # ISO_Next_Group_Lock
|
||
0xfe0a U0000 f # ISO_Prev_Group
|
||
0xfe0b U0000 f # ISO_Prev_Group_Lock
|
||
0xfe0c U0000 f # ISO_First_Group
|
||
0xfe0d U0000 f # ISO_First_Group_Lock
|
||
0xfe0e U0000 f # ISO_Last_Group
|
||
0xfe0f U0000 f # ISO_Last_Group_Lock
|
||
0xfe20 U0000 f # ISO_Left_Tab
|
||
0xfe21 U0000 f # ISO_Move_Line_Up
|
||
0xfe22 U0000 f # ISO_Move_Line_Down
|
||
0xfe23 U0000 f # ISO_Partial_Line_Up
|
||
0xfe24 U0000 f # ISO_Partial_Line_Down
|
||
0xfe25 U0000 f # ISO_Partial_Space_Left
|
||
0xfe26 U0000 f # ISO_Partial_Space_Right
|
||
0xfe27 U0000 f # ISO_Set_Margin_Left
|
||
0xfe28 U0000 f # ISO_Set_Margin_Right
|
||
0xfe29 U0000 f # ISO_Release_Margin_Left
|
||
0xfe2a U0000 f # ISO_Release_Margin_Right
|
||
0xfe2b U0000 f # ISO_Release_Both_Margins
|
||
0xfe2c U0000 f # ISO_Fast_Cursor_Left
|
||
0xfe2d U0000 f # ISO_Fast_Cursor_Right
|
||
0xfe2e U0000 f # ISO_Fast_Cursor_Up
|
||
0xfe2f U0000 f # ISO_Fast_Cursor_Down
|
||
0xfe30 U0000 f # ISO_Continuous_Underline
|
||
0xfe31 U0000 f # ISO_Discontinuous_Underline
|
||
0xfe32 U0000 f # ISO_Emphasize
|
||
0xfe33 U0000 f # ISO_Center_Object
|
||
0xfe34 U0000 f # ISO_Enter
|
||
0xfe50 U0300 f # dead_grave
|
||
0xfe51 U0301 f # dead_acute
|
||
0xfe52 U0302 f # dead_circumflex
|
||
0xfe53 U0303 f # dead_tilde
|
||
0xfe54 U0304 f # dead_macron
|
||
0xfe55 U0306 f # dead_breve
|
||
0xfe56 U0307 f # dead_abovedot
|
||
0xfe57 U0308 f # dead_diaeresis
|
||
0xfe58 U030a f # dead_abovering
|
||
0xfe59 U030b f # dead_doubleacute
|
||
0xfe5a U030c f # dead_caron
|
||
0xfe5b U0327 f # dead_cedilla
|
||
0xfe5c U0328 f # dead_ogonek
|
||
0xfe5d U0345 f # dead_iota
|
||
0xfe5e U3099 f # dead_voiced_sound
|
||
0xfe5f U309a f # dead_semivoiced_sound
|
||
0xfe70 U0000 f # AccessX_Enable
|
||
0xfe71 U0000 f # AccessX_Feedback_Enable
|
||
0xfe72 U0000 f # RepeatKeys_Enable
|
||
0xfe73 U0000 f # SlowKeys_Enable
|
||
0xfe74 U0000 f # BounceKeys_Enable
|
||
0xfe75 U0000 f # StickyKeys_Enable
|
||
0xfe76 U0000 f # MouseKeys_Enable
|
||
0xfe77 U0000 f # MouseKeys_Accel_Enable
|
||
0xfe78 U0000 f # Overlay1_Enable
|
||
0xfe79 U0000 f # Overlay2_Enable
|
||
0xfe7a U0000 f # AudibleBell_Enable
|
||
0xfed0 U0000 f # First_Virtual_Screen
|
||
0xfed1 U0000 f # Prev_Virtual_Screen
|
||
0xfed2 U0000 f # Next_Virtual_Screen
|
||
0xfed4 U0000 f # Last_Virtual_Screen
|
||
0xfed5 U0000 f # Terminate_Server
|
||
0xfee0 U0000 f # Pointer_Left
|
||
0xfee1 U0000 f # Pointer_Right
|
||
0xfee2 U0000 f # Pointer_Up
|
||
0xfee3 U0000 f # Pointer_Down
|
||
0xfee4 U0000 f # Pointer_UpLeft
|
||
0xfee5 U0000 f # Pointer_UpRight
|
||
0xfee6 U0000 f # Pointer_DownLeft
|
||
0xfee7 U0000 f # Pointer_DownRight
|
||
0xfee8 U0000 f # Pointer_Button_Dflt
|
||
0xfee9 U0000 f # Pointer_Button1
|
||
0xfeea U0000 f # Pointer_Button2
|
||
0xfeeb U0000 f # Pointer_Button3
|
||
0xfeec U0000 f # Pointer_Button4
|
||
0xfeed U0000 f # Pointer_Button5
|
||
0xfeee U0000 f # Pointer_DblClick_Dflt
|
||
0xfeef U0000 f # Pointer_DblClick1
|
||
0xfef0 U0000 f # Pointer_DblClick2
|
||
0xfef1 U0000 f # Pointer_DblClick3
|
||
0xfef2 U0000 f # Pointer_DblClick4
|
||
0xfef3 U0000 f # Pointer_DblClick5
|
||
0xfef4 U0000 f # Pointer_Drag_Dflt
|
||
0xfef5 U0000 f # Pointer_Drag1
|
||
0xfef6 U0000 f # Pointer_Drag2
|
||
0xfef7 U0000 f # Pointer_Drag3
|
||
0xfef8 U0000 f # Pointer_Drag4
|
||
0xfef9 U0000 f # Pointer_EnableKeys
|
||
0xfefa U0000 f # Pointer_Accelerate
|
||
0xfefb U0000 f # Pointer_DfltBtnNext
|
||
0xfefc U0000 f # Pointer_DfltBtnPrev
|
||
0xfefd U0000 f # Pointer_Drag5}
|
||
$FF08: Result := VK_BACK; // BackSpace /* back space, back char */
|
||
$FF09: Result := VK_TAB;
|
||
// 0xff0a U000a f # Linefeed /* Linefeed, LF */
|
||
$FF0B: Result := VK_CLEAR;
|
||
$FF0D: Result := VK_RETURN; // Return, enter */
|
||
{ 0xff13 U0013 f # Pause /* Pause, hold */
|
||
0xff14 U0014 f # Scroll_Lock
|
||
0xff15 U0015 f # Sys_Req}
|
||
$FF1B: Result := VK_ESCAPE;
|
||
{ 0xff20 U0000 f # Multi_key
|
||
0xff21 U0000 f # Kanji
|
||
0xff22 U0000 f # Muhenkan
|
||
0xff23 U0000 f # Henkan_Mode
|
||
0xff24 U0000 f # Romaji
|
||
0xff25 U0000 f # Hiragana
|
||
0xff26 U0000 f # Katakana
|
||
0xff27 U0000 f # Hiragana_Katakana
|
||
0xff28 U0000 f # Zenkaku
|
||
0xff29 U0000 f # Hankaku
|
||
0xff2a U0000 f # Zenkaku_Hankaku
|
||
0xff2b U0000 f # Touroku
|
||
0xff2c U0000 f # Massyo
|
||
0xff2d U0000 f # Kana_Lock
|
||
0xff2e U0000 f # Kana_Shift
|
||
0xff2f U0000 f # Eisu_Shift
|
||
0xff30 U0000 f # Eisu_toggle
|
||
0xff31 U0000 f # Hangul
|
||
0xff32 U0000 f # Hangul_Start
|
||
0xff33 U0000 f # Hangul_End
|
||
0xff34 U0000 f # Hangul_Hanja
|
||
0xff35 U0000 f # Hangul_Jamo
|
||
0xff36 U0000 f # Hangul_Romaja
|
||
0xff37 U0000 f # Codeinput
|
||
0xff38 U0000 f # Hangul_Jeonja
|
||
0xff39 U0000 f # Hangul_Banja
|
||
0xff3a U0000 f # Hangul_PreHanja
|
||
0xff3b U0000 f # Hangul_PostHanja
|
||
0xff3c U0000 f # SingleCandidate
|
||
0xff3d U0000 f # MultipleCandidate
|
||
0xff3e U0000 f # PreviousCandidate
|
||
0xff3f U0000 f # Hangul_Special}
|
||
$FF50: Result := VK_HOME;
|
||
$FF51: Result := VK_LEFT;
|
||
$FF52: Result := VK_UP;
|
||
$FF53: Result := VK_RIGHT;
|
||
$FF54: Result := VK_DOWN;
|
||
$FF55: Result := VK_PRIOR;
|
||
$FF56: Result := VK_NEXT;
|
||
{ 0xff57 U0000 f # End
|
||
0xff58 U0000 f # Begin
|
||
0xff60 U0000 f # Select
|
||
0xff61 U0000 f # Print
|
||
0xff62 U0000 f # Execute
|
||
0xff63 U0000 f # Insert
|
||
0xff65 U0000 f # Undo
|
||
0xff66 U0000 f # Redo
|
||
0xff67 U0000 f # Menu
|
||
0xff68 U0000 f # Find
|
||
0xff69 U0000 f # Cancel
|
||
0xff6a U0000 f # Help
|
||
0xff6b U0000 f # Break
|
||
0xff7e U0000 f # Mode_switch}
|
||
$FF7F: Result := VK_NUMLOCK;
|
||
// 0xff7f U0000 f # Num_Lock
|
||
$FF80: Result := VK_SPACE;
|
||
$FF89: Result := VK_TAB;
|
||
$FF8D: Result := VK_RETURN; // KP_Enter /* enter */
|
||
{ 0xff91 U0000 f # KP_F1
|
||
0xff92 U0000 f # KP_F2
|
||
0xff93 U0000 f # KP_F3
|
||
0xff94 U0000 f # KP_F4
|
||
0xff95 U0000 f # KP_Home
|
||
0xff96 U0000 f # KP_Left
|
||
0xff97 U0000 f # KP_Up
|
||
0xff98 U0000 f # KP_Right
|
||
0xff99 U0000 f # KP_Down
|
||
0xff9a U0000 f # KP_Prior
|
||
0xff9b U0000 f # KP_Next
|
||
0xff9c U0000 f # KP_End
|
||
0xff9d U0000 f # KP_Begin
|
||
0xff9e U0000 f # KP_Insert
|
||
0xff9f U0000 f # KP_Delete
|
||
0xffaa U002a f # KP_Multiply
|
||
0xffab U002b f # KP_Add
|
||
0xffac U002c f # KP_Separator /* separator, often comma */
|
||
0xffad U002d f # KP_Subtract
|
||
0xffae U002e f # KP_Decimal
|
||
0xffaf U002f f # KP_Divide
|
||
0xffb0 U0030 f # KP_0
|
||
0xffb1 U0031 f # KP_1
|
||
0xffb2 U0032 f # KP_2
|
||
0xffb3 U0033 f # KP_3
|
||
0xffb4 U0034 f # KP_4
|
||
0xffb5 U0035 f # KP_5
|
||
0xffb6 U0036 f # KP_6
|
||
0xffb7 U0037 f # KP_7
|
||
0xffb8 U0038 f # KP_8
|
||
0xffb9 U0039 f # KP_9
|
||
0xffbd U003d f # KP_Equal /* equals */}
|
||
$FFBE: Result := VK_F1;
|
||
$FFBF: Result := VK_F2;
|
||
$FFC0: Result := VK_F3;
|
||
$FFC1: Result := VK_F4;
|
||
$FFC2: Result := VK_F5;
|
||
$FFC3: Result := VK_F6;
|
||
$FFC4: Result := VK_F7;
|
||
$FFC5: Result := VK_F8;
|
||
$FFC6: Result := VK_F9;
|
||
$FFC7: Result := VK_F10;
|
||
$FFC8: Result := VK_F11;
|
||
$FFC9: Result := VK_F12;
|
||
{ 0xffca U0000 f # F13
|
||
0xffcb U0000 f # F14
|
||
0xffcc U0000 f # F15
|
||
0xffcd U0000 f # F16
|
||
0xffce U0000 f # F17
|
||
0xffcf U0000 f # F18
|
||
0xffd0 U0000 f # F19
|
||
0xffd1 U0000 f # F20
|
||
0xffd2 U0000 f # F21
|
||
0xffd3 U0000 f # F22
|
||
0xffd4 U0000 f # F23
|
||
0xffd5 U0000 f # F24
|
||
0xffd6 U0000 f # F25
|
||
0xffd7 U0000 f # F26
|
||
0xffd8 U0000 f # F27
|
||
0xffd9 U0000 f # F28
|
||
0xffda U0000 f # F29
|
||
0xffdb U0000 f # F30
|
||
0xffdc U0000 f # F31
|
||
0xffdd U0000 f # F32
|
||
0xffde U0000 f # F33
|
||
0xffdf U0000 f # F34
|
||
0xffe0 U0000 f # F35}
|
||
$FFE1: Result := VK_LSHIFT;
|
||
$FFE2: Result := VK_RSHIFT;
|
||
$FFE3: Result := VK_LCONTROL;
|
||
$FFE4: Result := VK_RCONTROL;
|
||
{ 0xffe5 U0000 f # Caps_Lock
|
||
0xffe6 U0000 f # Shift_Lock
|
||
0xffe7 U0000 f # Meta_L
|
||
0xffe8 U0000 f # Meta_R
|
||
0xffe9 U0000 f # Alt_L
|
||
0xffea U0000 f # Alt_R
|
||
0xffeb U0000 f # Super_L
|
||
0xffec U0000 f # Super_R
|
||
0xffed U0000 f # Hyper_L
|
||
0xffee U0000 f # Hyper_R
|
||
0xffff U0000 f # Delete
|
||
$FFFF: Result := VK_DEL; }
|
||
{ 0xffffff U0000 f # VoidSymbol
|
||
|
||
# Various XFree86 extensions since X11R6.4
|
||
# http://cvsweb.xfree86.org/cvsweb/xc/include/keysymdef.h
|
||
|
||
# KOI8-U support (Aleksey Novodvorsky, 1999-05-30)
|
||
# http://cvsweb.xfree86.org/cvsweb/xc/include/keysymdef.h.diff?r1=1.4&r2=1.5
|
||
# Used in XFree86's /usr/lib/X11/xkb/symbols/ua mappings
|
||
|
||
0x06ad U0491 . # Ukrainian_ghe_with_upturn
|
||
0x06bd U0490 . # Ukrainian_GHE_WITH_UPTURN
|
||
|
||
# Support for armscii-8, ibm-cp1133, mulelao-1, viscii1.1-1,
|
||
# tcvn-5712, georgian-academy, georgian-ps
|
||
# (#2843, Pablo Saratxaga <pablo@mandrakesoft.com>, 1999-06-06)
|
||
# http://cvsweb.xfree86.org/cvsweb/xc/include/keysymdef.h.diff?r1=1.6&r2=1.7
|
||
|
||
# Armenian
|
||
# (not used in any XFree86 4.4 kbd layouts, where /usr/lib/X11/xkb/symbols/am
|
||
# uses directly Unicode-mapped hexadecimal values instead)
|
||
0x14a1 U0000 r # Armenian_eternity
|
||
0x14a2 U0587 u # Armenian_ligature_ew
|
||
0x14a3 U0589 u # Armenian_verjaket
|
||
0x14a4 U0029 r # Armenian_parenright
|
||
0x14a5 U0028 r # Armenian_parenleft
|
||
0x14a6 U00bb r # Armenian_guillemotright
|
||
0x14a7 U00ab r # Armenian_guillemotleft
|
||
0x14a8 U2014 r # Armenian_em_dash
|
||
0x14a9 U002e r # Armenian_mijaket
|
||
0x14aa U055d u # Armenian_but
|
||
0x14ab U002c r # Armenian_comma
|
||
0x14ac U2013 r # Armenian_en_dash
|
||
0x14ad U058a u # Armenian_yentamna
|
||
0x14ae U2026 r # Armenian_ellipsis
|
||
0x14af U055c u # Armenian_amanak
|
||
0x14b0 U055b u # Armenian_shesht
|
||
0x14b1 U055e u # Armenian_paruyk
|
||
0x14b2 U0531 u # Armenian_AYB
|
||
0x14b3 U0561 u # Armenian_ayb
|
||
0x14b4 U0532 u # Armenian_BEN
|
||
0x14b5 U0562 u # Armenian_ben
|
||
0x14b6 U0533 u # Armenian_GIM
|
||
0x14b7 U0563 u # Armenian_gim
|
||
0x14b8 U0534 u # Armenian_DA
|
||
0x14b9 U0564 u # Armenian_da
|
||
0x14ba U0535 u # Armenian_YECH
|
||
0x14bb U0565 u # Armenian_yech
|
||
0x14bc U0536 u # Armenian_ZA
|
||
0x14bd U0566 u # Armenian_za
|
||
0x14be U0537 u # Armenian_E
|
||
0x14bf U0567 u # Armenian_e
|
||
0x14c0 U0538 u # Armenian_AT
|
||
0x14c1 U0568 u # Armenian_at
|
||
0x14c2 U0539 u # Armenian_TO
|
||
0x14c3 U0569 u # Armenian_to
|
||
0x14c4 U053a u # Armenian_ZHE
|
||
0x14c5 U056a u # Armenian_zhe
|
||
0x14c6 U053b u # Armenian_INI
|
||
0x14c7 U056b u # Armenian_ini
|
||
0x14c8 U053c u # Armenian_LYUN
|
||
0x14c9 U056c u # Armenian_lyun
|
||
0x14ca U053d u # Armenian_KHE
|
||
0x14cb U056d u # Armenian_khe
|
||
0x14cc U053e u # Armenian_TSA
|
||
0x14cd U056e u # Armenian_tsa
|
||
0x14ce U053f u # Armenian_KEN
|
||
0x14cf U056f u # Armenian_ken
|
||
0x14d0 U0540 u # Armenian_HO
|
||
0x14d1 U0570 u # Armenian_ho
|
||
0x14d2 U0541 u # Armenian_DZA
|
||
0x14d3 U0571 u # Armenian_dza
|
||
0x14d4 U0542 u # Armenian_GHAT
|
||
0x14d5 U0572 u # Armenian_ghat
|
||
0x14d6 U0543 u # Armenian_TCHE
|
||
0x14d7 U0573 u # Armenian_tche
|
||
0x14d8 U0544 u # Armenian_MEN
|
||
0x14d9 U0574 u # Armenian_men
|
||
0x14da U0545 u # Armenian_HI
|
||
0x14db U0575 u # Armenian_hi
|
||
0x14dc U0546 u # Armenian_NU
|
||
0x14dd U0576 u # Armenian_nu
|
||
0x14de U0547 u # Armenian_SHA
|
||
0x14df U0577 u # Armenian_sha
|
||
0x14e0 U0548 u # Armenian_VO
|
||
0x14e1 U0578 u # Armenian_vo
|
||
0x14e2 U0549 u # Armenian_CHA
|
||
0x14e3 U0579 u # Armenian_cha
|
||
0x14e4 U054a u # Armenian_PE
|
||
0x14e5 U057a u # Armenian_pe
|
||
0x14e6 U054b u # Armenian_JE
|
||
0x14e7 U057b u # Armenian_je
|
||
0x14e8 U054c u # Armenian_RA
|
||
0x14e9 U057c u # Armenian_ra
|
||
0x14ea U054d u # Armenian_SE
|
||
0x14eb U057d u # Armenian_se
|
||
0x14ec U054e u # Armenian_VEV
|
||
0x14ed U057e u # Armenian_vev
|
||
0x14ee U054f u # Armenian_TYUN
|
||
0x14ef U057f u # Armenian_tyun
|
||
0x14f0 U0550 u # Armenian_RE
|
||
0x14f1 U0580 u # Armenian_re
|
||
0x14f2 U0551 u # Armenian_TSO
|
||
0x14f3 U0581 u # Armenian_tso
|
||
0x14f4 U0552 u # Armenian_VYUN
|
||
0x14f5 U0582 u # Armenian_vyun
|
||
0x14f6 U0553 u # Armenian_PYUR
|
||
0x14f7 U0583 u # Armenian_pyur
|
||
0x14f8 U0554 u # Armenian_KE
|
||
0x14f9 U0584 u # Armenian_ke
|
||
0x14fa U0555 u # Armenian_O
|
||
0x14fb U0585 u # Armenian_o
|
||
0x14fc U0556 u # Armenian_FE
|
||
0x14fd U0586 u # Armenian_fe
|
||
0x14fe U055a u # Armenian_apostrophe
|
||
0x14ff U00a7 r # Armenian_section_sign
|
||
|
||
# Gregorian
|
||
# (not used in any XFree86 4.4 kbd layouts, were /usr/lib/X11/xkb/symbols/ge_*
|
||
# uses directly Unicode-mapped hexadecimal values instead)
|
||
0x15d0 U10d0 u # Georgian_an
|
||
0x15d1 U10d1 u # Georgian_ban
|
||
0x15d2 U10d2 u # Georgian_gan
|
||
0x15d3 U10d3 u # Georgian_don
|
||
0x15d4 U10d4 u # Georgian_en
|
||
0x15d5 U10d5 u # Georgian_vin
|
||
0x15d6 U10d6 u # Georgian_zen
|
||
0x15d7 U10d7 u # Georgian_tan
|
||
0x15d8 U10d8 u # Georgian_in
|
||
0x15d9 U10d9 u # Georgian_kan
|
||
0x15da U10da u # Georgian_las
|
||
0x15db U10db u # Georgian_man
|
||
0x15dc U10dc u # Georgian_nar
|
||
0x15dd U10dd u # Georgian_on
|
||
0x15de U10de u # Georgian_par
|
||
0x15df U10df u # Georgian_zhar
|
||
0x15e0 U10e0 u # Georgian_rae
|
||
0x15e1 U10e1 u # Georgian_san
|
||
0x15e2 U10e2 u # Georgian_tar
|
||
0x15e3 U10e3 u # Georgian_un
|
||
0x15e4 U10e4 u # Georgian_phar
|
||
0x15e5 U10e5 u # Georgian_khar
|
||
0x15e6 U10e6 u # Georgian_ghan
|
||
0x15e7 U10e7 u # Georgian_qar
|
||
0x15e8 U10e8 u # Georgian_shin
|
||
0x15e9 U10e9 u # Georgian_chin
|
||
0x15ea U10ea u # Georgian_can
|
||
0x15eb U10eb u # Georgian_jil
|
||
0x15ec U10ec u # Georgian_cil
|
||
0x15ed U10ed u # Georgian_char
|
||
0x15ee U10ee u # Georgian_xan
|
||
0x15ef U10ef u # Georgian_jhan
|
||
0x15f0 U10f0 u # Georgian_hae
|
||
0x15f1 U10f1 u # Georgian_he
|
||
0x15f2 U10f2 u # Georgian_hie
|
||
0x15f3 U10f3 u # Georgian_we
|
||
0x15f4 U10f4 u # Georgian_har
|
||
0x15f5 U10f5 u # Georgian_hoe
|
||
0x15f6 U10f6 u # Georgian_fi
|
||
|
||
# Pablo Saratxaga's i18n updates for XFree86 that are used in Mandrake 7.2.
|
||
# (#4195, Pablo Saratxaga <pablo@mandrakesoft.com>, 2000-10-27)
|
||
# http://cvsweb.xfree86.org/cvsweb/xc/include/keysymdef.h.diff?r1=1.9&r2=1.10
|
||
|
||
# Latin-8
|
||
# (the *abovedot keysyms are used in /usr/lib/X11/xkb/symbols/ie)
|
||
0x12a1 U1e02 u # Babovedot
|
||
0x12a2 U1e03 u # babovedot
|
||
0x12a6 U1e0a u # Dabovedot
|
||
0x12a8 U1e80 u # Wgrave
|
||
0x12aa U1e82 u # Wacute
|
||
0x12ab U1e0b u # dabovedot
|
||
0x12ac U1ef2 u # Ygrave
|
||
0x12b0 U1e1e u # Fabovedot
|
||
0x12b1 U1e1f u # fabovedot
|
||
0x12b4 U1e40 u # Mabovedot
|
||
0x12b5 U1e41 u # mabovedot
|
||
0x12b7 U1e56 u # Pabovedot
|
||
0x12b8 U1e81 u # wgrave
|
||
0x12b9 U1e57 u # pabovedot
|
||
0x12ba U1e83 u # wacute
|
||
0x12bb U1e60 u # Sabovedot
|
||
0x12bc U1ef3 u # ygrave
|
||
0x12bd U1e84 u # Wdiaeresis
|
||
0x12be U1e85 u # wdiaeresis
|
||
0x12bf U1e61 u # sabovedot
|
||
0x12d0 U0174 u # Wcircumflex
|
||
0x12d7 U1e6a u # Tabovedot
|
||
0x12de U0176 u # Ycircumflex
|
||
0x12f0 U0175 u # wcircumflex
|
||
0x12f7 U1e6b u # tabovedot
|
||
0x12fe U0177 u # ycircumflex
|
||
|
||
# Arabic
|
||
# (of these, in XFree86 4.4 only Arabic_superscript_alef, Arabic_madda_above,
|
||
# Arabic_hamza_* are actually used, e.g. in /usr/lib/X11/xkb/symbols/syr)
|
||
0x0590 U06f0 u # Farsi_0
|
||
0x0591 U06f1 u # Farsi_1
|
||
0x0592 U06f2 u # Farsi_2
|
||
0x0593 U06f3 u # Farsi_3
|
||
0x0594 U06f4 u # Farsi_4
|
||
0x0595 U06f5 u # Farsi_5
|
||
0x0596 U06f6 u # Farsi_6
|
||
0x0597 U06f7 u # Farsi_7
|
||
0x0598 U06f8 u # Farsi_8
|
||
0x0599 U06f9 u # Farsi_9
|
||
0x05a5 U066a u # Arabic_percent
|
||
0x05a6 U0670 u # Arabic_superscript_alef
|
||
0x05a7 U0679 u # Arabic_tteh
|
||
0x05a8 U067e u # Arabic_peh
|
||
0x05a9 U0686 u # Arabic_tcheh
|
||
0x05aa U0688 u # Arabic_ddal
|
||
0x05ab U0691 u # Arabic_rreh
|
||
0x05ae U06d4 u # Arabic_fullstop
|
||
0x05b0 U0660 u # Arabic_0
|
||
0x05b1 U0661 u # Arabic_1
|
||
0x05b2 U0662 u # Arabic_2
|
||
0x05b3 U0663 u # Arabic_3
|
||
0x05b4 U0664 u # Arabic_4
|
||
0x05b5 U0665 u # Arabic_5
|
||
0x05b6 U0666 u # Arabic_6
|
||
0x05b7 U0667 u # Arabic_7
|
||
0x05b8 U0668 u # Arabic_8
|
||
0x05b9 U0669 u # Arabic_9
|
||
0x05f3 U0653 u # Arabic_madda_above
|
||
0x05f4 U0654 u # Arabic_hamza_above
|
||
0x05f5 U0655 u # Arabic_hamza_below
|
||
0x05f6 U0698 u # Arabic_jeh
|
||
0x05f7 U06a4 u # Arabic_veh
|
||
0x05f8 U06a9 u # Arabic_keheh
|
||
0x05f9 U06af u # Arabic_gaf
|
||
0x05fa U06ba u # Arabic_noon_ghunna
|
||
0x05fb U06be u # Arabic_heh_doachashmee
|
||
0x05fc U06cc u # Farsi_yeh
|
||
0x05fd U06d2 u # Arabic_yeh_baree
|
||
0x05fe U06c1 u # Arabic_heh_goal
|
||
|
||
# Cyrillic
|
||
# (none of these are actually used in any XFree86 4.4 kbd layouts)
|
||
0x0680 U0492 u # Cyrillic_GHE_bar
|
||
0x0681 U0496 u # Cyrillic_ZHE_descender
|
||
0x0682 U049a u # Cyrillic_KA_descender
|
||
0x0683 U049c u # Cyrillic_KA_vertstroke
|
||
0x0684 U04a2 u # Cyrillic_EN_descender
|
||
0x0685 U04ae u # Cyrillic_U_straight
|
||
0x0686 U04b0 u # Cyrillic_U_straight_bar
|
||
0x0687 U04b2 u # Cyrillic_HA_descender
|
||
0x0688 U04b6 u # Cyrillic_CHE_descender
|
||
0x0689 U04b8 u # Cyrillic_CHE_vertstroke
|
||
0x068a U04ba u # Cyrillic_SHHA
|
||
0x068c U04d8 u # Cyrillic_SCHWA
|
||
0x068d U04e2 u # Cyrillic_I_macron
|
||
0x068e U04e8 u # Cyrillic_O_bar
|
||
0x068f U04ee u # Cyrillic_U_macron
|
||
0x0690 U0493 u # Cyrillic_ghe_bar
|
||
0x0691 U0497 u # Cyrillic_zhe_descender
|
||
0x0692 U049b u # Cyrillic_ka_descender
|
||
0x0693 U049d u # Cyrillic_ka_vertstroke
|
||
0x0694 U04a3 u # Cyrillic_en_descender
|
||
0x0695 U04af u # Cyrillic_u_straight
|
||
0x0696 U04b1 u # Cyrillic_u_straight_bar
|
||
0x0697 U04b3 u # Cyrillic_ha_descender
|
||
0x0698 U04b7 u # Cyrillic_che_descender
|
||
0x0699 U04b9 u # Cyrillic_che_vertstroke
|
||
0x069a U04bb u # Cyrillic_shha
|
||
0x069c U04d9 u # Cyrillic_schwa
|
||
0x069d U04e3 u # Cyrillic_i_macron
|
||
0x069e U04e9 u # Cyrillic_o_bar
|
||
0x069f U04ef u # Cyrillic_u_macron
|
||
|
||
# Caucasus
|
||
# (of these, in XFree86 4.4 only Gcaron, gcaron are actually used,
|
||
# e.g. in /usr/lib/X11/xkb/symbols/sapmi; the lack of Unicode
|
||
# equivalents for the others suggests that they are bogus)
|
||
0x16a2 U0000 r # Ccedillaabovedot
|
||
0x16a3 U1e8a u # Xabovedot
|
||
0x16a5 U0000 r # Qabovedot
|
||
0x16a6 U012c u # Ibreve
|
||
0x16a7 U0000 r # IE
|
||
0x16a8 U0000 r # UO
|
||
0x16a9 U01b5 u # Zstroke
|
||
0x16aa U01e6 u # Gcaron
|
||
0x16af U019f u # Obarred
|
||
0x16b2 U0000 r # ccedillaabovedot
|
||
0x16b3 U1e8b u # xabovedot
|
||
0x16b4 U0000 r # Ocaron
|
||
0x16b5 U0000 r # qabovedot
|
||
0x16b6 U012d u # ibreve
|
||
0x16b7 U0000 r # ie
|
||
0x16b8 U0000 r # uo
|
||
0x16b9 U01b6 u # zstroke
|
||
0x16ba U01e7 u # gcaron
|
||
0x16bd U01d2 u # ocaron
|
||
0x16bf U0275 u # obarred
|
||
0x16c6 U018f u # SCHWA
|
||
0x16f6 U0259 u # schwa
|
||
|
||
# Inupiak, Guarani
|
||
# (none of these are actually used in any XFree86 4.4 kbd layouts,
|
||
# and the lack of Unicode equivalents suggests that they are bogus)
|
||
0x16d1 U1e36 u # Lbelowdot
|
||
0x16d2 U0000 r # Lstrokebelowdot
|
||
0x16d3 U0000 r # Gtilde
|
||
0x16e1 U1e37 u # lbelowdot
|
||
0x16e2 U0000 r # lstrokebelowdot
|
||
0x16e3 U0000 r # gtilde
|
||
|
||
# Vietnamese
|
||
# (none of these are actually used in any XFree86 4.4 kbd layouts; they are
|
||
# also pointless, as Vietnamese input methods use dead accent keys + ASCII keys)
|
||
0x1ea0 U1ea0 u # Abelowdot
|
||
0x1ea1 U1ea1 u # abelowdot
|
||
0x1ea2 U1ea2 u # Ahook
|
||
0x1ea3 U1ea3 u # ahook
|
||
0x1ea4 U1ea4 u # Acircumflexacute
|
||
0x1ea5 U1ea5 u # acircumflexacute
|
||
0x1ea6 U1ea6 u # Acircumflexgrave
|
||
0x1ea7 U1ea7 u # acircumflexgrave
|
||
0x1ea8 U1ea8 u # Acircumflexhook
|
||
0x1ea9 U1ea9 u # acircumflexhook
|
||
0x1eaa U1eaa u # Acircumflextilde
|
||
0x1eab U1eab u # acircumflextilde
|
||
0x1eac U1eac u # Acircumflexbelowdot
|
||
0x1ead U1ead u # acircumflexbelowdot
|
||
0x1eae U1eae u # Abreveacute
|
||
0x1eaf U1eaf u # abreveacute
|
||
0x1eb0 U1eb0 u # Abrevegrave
|
||
0x1eb1 U1eb1 u # abrevegrave
|
||
0x1eb2 U1eb2 u # Abrevehook
|
||
0x1eb3 U1eb3 u # abrevehook
|
||
0x1eb4 U1eb4 u # Abrevetilde
|
||
0x1eb5 U1eb5 u # abrevetilde
|
||
0x1eb6 U1eb6 u # Abrevebelowdot
|
||
0x1eb7 U1eb7 u # abrevebelowdot
|
||
0x1eb8 U1eb8 u # Ebelowdot
|
||
0x1eb9 U1eb9 u # ebelowdot
|
||
0x1eba U1eba u # Ehook
|
||
0x1ebb U1ebb u # ehook
|
||
0x1ebc U1ebc u # Etilde
|
||
0x1ebd U1ebd u # etilde
|
||
0x1ebe U1ebe u # Ecircumflexacute
|
||
0x1ebf U1ebf u # ecircumflexacute
|
||
0x1ec0 U1ec0 u # Ecircumflexgrave
|
||
0x1ec1 U1ec1 u # ecircumflexgrave
|
||
0x1ec2 U1ec2 u # Ecircumflexhook
|
||
0x1ec3 U1ec3 u # ecircumflexhook
|
||
0x1ec4 U1ec4 u # Ecircumflextilde
|
||
0x1ec5 U1ec5 u # ecircumflextilde
|
||
0x1ec6 U1ec6 u # Ecircumflexbelowdot
|
||
0x1ec7 U1ec7 u # ecircumflexbelowdot
|
||
0x1ec8 U1ec8 u # Ihook
|
||
0x1ec9 U1ec9 u # ihook
|
||
0x1eca U1eca u # Ibelowdot
|
||
0x1ecb U1ecb u # ibelowdot
|
||
0x1ecc U1ecc u # Obelowdot
|
||
0x1ecd U1ecd u # obelowdot
|
||
0x1ece U1ece u # Ohook
|
||
0x1ecf U1ecf u # ohook
|
||
0x1ed0 U1ed0 u # Ocircumflexacute
|
||
0x1ed1 U1ed1 u # ocircumflexacute
|
||
0x1ed2 U1ed2 u # Ocircumflexgrave
|
||
0x1ed3 U1ed3 u # ocircumflexgrave
|
||
0x1ed4 U1ed4 u # Ocircumflexhook
|
||
0x1ed5 U1ed5 u # ocircumflexhook
|
||
0x1ed6 U1ed6 u # Ocircumflextilde
|
||
0x1ed7 U1ed7 u # ocircumflextilde
|
||
0x1ed8 U1ed8 u # Ocircumflexbelowdot
|
||
0x1ed9 U1ed9 u # ocircumflexbelowdot
|
||
0x1eda U1eda u # Ohornacute
|
||
0x1edb U1edb u # ohornacute
|
||
0x1edc U1edc u # Ohorngrave
|
||
0x1edd U1edd u # ohorngrave
|
||
0x1ede U1ede u # Ohornhook
|
||
0x1edf U1edf u # ohornhook
|
||
0x1ee0 U1ee0 u # Ohorntilde
|
||
0x1ee1 U1ee1 u # ohorntilde
|
||
0x1ee2 U1ee2 u # Ohornbelowdot
|
||
0x1ee3 U1ee3 u # ohornbelowdot
|
||
0x1ee4 U1ee4 u # Ubelowdot
|
||
0x1ee5 U1ee5 u # ubelowdot
|
||
0x1ee6 U1ee6 u # Uhook
|
||
0x1ee7 U1ee7 u # uhook
|
||
0x1ee8 U1ee8 u # Uhornacute
|
||
0x1ee9 U1ee9 u # uhornacute
|
||
0x1eea U1eea u # Uhorngrave
|
||
0x1eeb U1eeb u # uhorngrave
|
||
0x1eec U1eec u # Uhornhook
|
||
0x1eed U1eed u # uhornhook
|
||
0x1eee U1eee u # Uhorntilde
|
||
0x1eef U1eef u # uhorntilde
|
||
0x1ef0 U1ef0 u # Uhornbelowdot
|
||
0x1ef1 U1ef1 u # uhornbelowdot
|
||
0x1ef4 U1ef4 u # Ybelowdot
|
||
0x1ef5 U1ef5 u # ybelowdot
|
||
0x1ef6 U1ef6 u # Yhook
|
||
0x1ef7 U1ef7 u # yhook
|
||
0x1ef8 U1ef8 u # Ytilde
|
||
0x1ef9 U1ef9 u # ytilde
|
||
|
||
0x1efa U01a0 u # Ohorn
|
||
0x1efb U01a1 u # ohorn
|
||
0x1efc U01af u # Uhorn
|
||
0x1efd U01b0 u # uhorn
|
||
|
||
# (Unicode combining characters have no direct equivalence with
|
||
# keysyms, where dead keys are defined instead)
|
||
0x1e9f U0303 r # combining_tilde
|
||
0x1ef2 U0300 r # combining_grave
|
||
0x1ef3 U0301 r # combining_acute
|
||
0x1efe U0309 r # combining_hook
|
||
0x1eff U0323 r # combining_belowdot
|
||
|
||
# These probably should be added to the X11 standard properly,
|
||
# as they could be of use for Vietnamese input methods.
|
||
0xfe60 U0323 f # dead_belowdot
|
||
0xfe61 U0309 f # dead_hook
|
||
0xfe62 U031b f # dead_horn}
|
||
else
|
||
Result := 0;
|
||
end;
|
||
|
||
if Result = 0 then DebugLn('[X11KeyToLCLKey] Unknown KeySym: $' + IntToHex(AX11Key, 4));
|
||
end;
|
||
|
||
class function TCDWSCustomForm.DoCreateHandle(const AWinControl: TWinControl;
|
||
const AParams: TCreateParams): TLCLIntfHandle;
|
||
begin
|
||
end;
|
||
|
||
class procedure TCDWSCustomForm.DoShowHide(const AWinControl: TWinControl);
|
||
begin
|
||
end;
|
||
|
||
{------------------------------------------------------------------------------
|
||
Method: TCDWSCustomForm.CreateHandle
|
||
Params: None
|
||
Returns: Nothing
|
||
|
||
Creates a Windows CE Form, initializes it according to it´s properties and shows it
|
||
------------------------------------------------------------------------------}
|
||
class function TCDWSCustomForm.CreateHandle(const AWinControl: TWinControl;
|
||
const AParams: TCreateParams): TLCLIntfHandle;
|
||
const
|
||
WindowHints: TXWMHints = (
|
||
flags: InputHint or StateHint or WindowGroupHint;
|
||
input: 1;
|
||
initial_state: NormalState;
|
||
icon_pixmap: 0;
|
||
icon_window: 0;
|
||
icon_x: 0;
|
||
icon_y: 0;
|
||
icon_mask: 0;
|
||
window_group: 0;
|
||
);
|
||
var
|
||
Colormap: TColormap;
|
||
Attr: TXSetWindowAttributes;
|
||
SizeHints: TXSizeHints;
|
||
ClassHint: PXClassHint;
|
||
lParentHandle: X.TWindow;
|
||
mask: longword;
|
||
lWindowInfo: TX11WindowInfo;
|
||
lWindow: TWindow;
|
||
AForm: TCustomForm absolute AWinControl;
|
||
begin
|
||
{$ifdef VerboseCDForms}
|
||
DebugLn(Format(':>[TCDWSCustomForm.CreateHandle] AWinControl=%x Name=%s: %s',
|
||
[PtrInt(AWinControl), AWinControl.Name, AWinControl.ClassName]));
|
||
{$endif}
|
||
Colormap := XDefaultColormap(CDWidgetSet.FDisplay, XDefaultScreen(CDWidgetSet.FDisplay));
|
||
Attr.Colormap := Colormap;
|
||
|
||
SizeHints.flags := XUtil.PSize;
|
||
SizeHints.x := 0; // If it doesnt start with zero, setting bounds later on fails, no idea why
|
||
SizeHints.y := 0;
|
||
SizeHints.width := 200;
|
||
SizeHints.height := 200;
|
||
|
||
{ Make sure we use the correct parent handle }
|
||
{ if FParent <> nil then
|
||
lParentHandle := TX11Window(FParent).Handle
|
||
else}
|
||
lParentHandle := XDefaultRootWindow(CDWidgetSet.FDisplay);
|
||
|
||
{ setup attributes and masks }
|
||
if (AForm.BorderStyle in [bsNone, bsToolWindow]) then
|
||
begin
|
||
Attr.Override_Redirect := 1; // this removes window borders
|
||
mask := CWOverrideRedirect;// or CWColormap;
|
||
end
|
||
{ else if (woPopup in WindowOptions) then
|
||
begin
|
||
Attr.Override_Redirect := True; // this removes window borders
|
||
Attr.save_under := True;
|
||
mask := CWOverrideRedirect or CWSaveUnder;
|
||
end}
|
||
else
|
||
begin
|
||
Attr.Override_Redirect := 0;
|
||
mask := CWColormap;
|
||
end;
|
||
|
||
lWindow := XCreateWindow(
|
||
CDWidgetSet.FDisplay,
|
||
lParentHandle, // parent
|
||
SizeHints.x, SizeHints.x, // position (top, left)
|
||
SizeHints.width, SizeHints.height, // default size (width, height)
|
||
0, // border size
|
||
CopyFromParent, // depth
|
||
InputOutput, // class
|
||
XDefaultVisual(CDWidgetSet.FDisplay, XDefaultScreen(CDWidgetSet.FDisplay)), // visual
|
||
mask,
|
||
@Attr);
|
||
|
||
if lWindow = 0 then
|
||
raise Exception.Create('[TCDWSCustomForm.CreateHandle] Window creation failed');
|
||
|
||
XSelectInput(CDWidgetSet.FDisplay, lWindow, KeyPressMask or KeyReleaseMask
|
||
or ButtonPressMask or ButtonReleaseMask
|
||
or EnterWindowMask or LeaveWindowMask
|
||
or ButtonMotionMask or PointerMotionMask
|
||
or ExposureMask
|
||
or FocusChangeMask
|
||
or StructureNotifyMask
|
||
// or PropertyChangeMask
|
||
);
|
||
|
||
// if (not (woX11SkipWMHints in WindowOptions)) and (woWindow in WindowOptions) then
|
||
// begin
|
||
XSetStandardProperties(CDWidgetSet.FDisplay, lWindow, nil, nil, 0,
|
||
argv, argc, @SizeHints);
|
||
|
||
XSetWMNormalHints(CDWidgetSet.FDisplay, lWindow, @SizeHints);
|
||
|
||
WindowHints.flags := WindowGroupHint;
|
||
WindowHints.window_group := CDWidgetSet.LeaderWindow;
|
||
XSetWMHints(CDWidgetSet.FDisplay, lWindow, @WindowHints);
|
||
|
||
XChangeProperty(CDWidgetSet.FDisplay, lWindow, CDWidgetSet.ClientLeaderAtom, 33, 32,
|
||
PropModeReplace, @CDWidgetSet.LeaderWindow, 1);
|
||
|
||
// We want to get a Client Message when the user tries to close this window
|
||
if CDWidgetSet.FWMProtocols = 0 then
|
||
CDWidgetSet.FWMProtocols := XInternAtom(CDWidgetSet.FDisplay, 'WM_PROTOCOLS', False);
|
||
if CDWidgetSet.FWMDeleteWindow = 0 then
|
||
CDWidgetSet.FWMDeleteWindow := XInternAtom(CDWidgetSet.FDisplay, 'WM_DELETE_WINDOW', False);
|
||
|
||
// send close event instead of quitting the whole application...
|
||
XSetWMProtocols(CDWidgetSet.FDisplay, lWindow, @CDWidgetSet.FWMDeleteWindow, 1);
|
||
// end;
|
||
|
||
{ Child windows do not appear until parent (lParentHandle) is mapped }
|
||
// if FParent <> nil then
|
||
// XMapSubwindows(CDWidgetSet.FDisplay, lParentHandle);
|
||
|
||
// for modal windows, this is necessary
|
||
// if (woModal in WindowOptions) then
|
||
// XSetTransientForHint(GFApplication.Handle, Handle, Handle);
|
||
|
||
// Add the window to the list of windows
|
||
lWindowInfo := TX11WindowInfo.Create;
|
||
lWindowInfo.Window := lWindow;
|
||
lWindowInfo.LCLForm := TCustomForm(AWinControl);
|
||
XGetWindowAttributes(CDWidgetSet.FDisplay, lWindow, @lWindowInfo.Attr);
|
||
lWindowInfo.Colormap := XDefaultColormap(CDWidgetSet.FDisplay, XDefaultScreen(CDWidgetSet.FDisplay));
|
||
lWindowInfo.ColorDepth := lWindowInfo.Attr.depth;
|
||
CreateX11Canvas(lWindowInfo);
|
||
Result := TLCLIntfHandle(lWindowInfo);
|
||
|
||
{$ifdef VerboseCDForms}
|
||
DebugLn(Format(':<[TCDWSCustomForm.CreateHandle] Result=%x',
|
||
[Result]));
|
||
{$endif}
|
||
end;
|
||
|
||
class procedure TCDWSCustomForm.DestroyHandle(const AWinControl: TWinControl);
|
||
begin
|
||
|
||
end;
|
||
|
||
class procedure TCDWSCustomForm.SetBorderIcons(const AForm: TCustomForm;
|
||
const ABorderIcons: TBorderIcons);
|
||
begin
|
||
end;
|
||
|
||
class procedure TCDWSCustomForm.SetFormBorderStyle(const AForm: TCustomForm;
|
||
const AFormBorderStyle: TFormBorderStyle);
|
||
begin
|
||
RecreateWnd(AForm);
|
||
end;
|
||
|
||
class procedure TCDWSCustomForm.SetBounds(const AWinControl: TWinControl;
|
||
const ALeft, ATop, AWidth, AHeight: Integer);
|
||
begin
|
||
{$ifdef VerboseCDForms}
|
||
DebugLn(Format('[TCDWSCustomForm.SetBounds] AWinControl=%x ALeft=%d ATop=%d AWidth=%d AHeight=%d',
|
||
[PtrInt(AWinControl), ALeft, ATop, AWidth, AHeight]));
|
||
{$endif}
|
||
SetPosition(AWinControl, Point(ALeft, ATop));
|
||
SetSize(AWinControl, Size(AWidth, AHeight));
|
||
end;
|
||
|
||
class procedure TCDWSCustomForm.SetIcon(const AForm: TCustomForm; const Small, Big: HICON);
|
||
begin
|
||
end;
|
||
|
||
class procedure TCDWSCustomForm.SetShowInTaskbar(const AForm: TCustomForm;
|
||
const AValue: TShowInTaskbar);
|
||
begin
|
||
end;
|
||
|
||
class procedure TCDWSCustomForm.ShowModal(const ACustomForm: TCustomForm);
|
||
begin
|
||
end;
|
||
|
||
class procedure TCDWSCustomForm.ShowHide(const AWinControl: TWinControl);
|
||
var
|
||
lIndex: Integer;
|
||
lWindow: TWindow;
|
||
lWindowInfo: TX11WindowInfo;
|
||
begin
|
||
lWindowInfo := TX11WindowInfo(AWinControl.Handle);
|
||
lWindow := lWindowInfo.Window;
|
||
|
||
if AWinControl.Visible then
|
||
begin
|
||
{$ifdef VerboseCDForms}
|
||
DebugLn(Format('[TCDWSCustomForm.ShowHide] Visible=True AWinControl=%x Handle=%x',
|
||
[PtrInt(AWinControl), PtrInt(AWinControl.Handle)]));
|
||
{$endif}
|
||
XMapRaised(CDWidgetSet.FDisplay, lWindow);
|
||
end
|
||
else
|
||
begin
|
||
{$ifdef VerboseCDForms}
|
||
DebugLn(Format('[TCDWSCustomForm.ShowHide] Visible=False AWinControl=%x', [PtrInt(AWinControl)]));
|
||
{$endif}
|
||
// Don't remove it here, wait for a X11 Destroy event
|
||
end;
|
||
end;
|
||
|
||
class function TCDWSCustomForm.GetText(const AWinControl: TWinControl; var AText: String): Boolean;
|
||
var
|
||
s: PChar;
|
||
lWindow: TWindow;
|
||
lWindowInfo: TX11WindowInfo;
|
||
begin
|
||
lWindowInfo := TX11WindowInfo(AWinControl.Handle);
|
||
lWindow := lWindowInfo.Window;
|
||
|
||
XFetchName(CDWidgetSet.FDisplay, lWindow, @s);
|
||
AText := s;
|
||
XFree(s);
|
||
end;
|
||
|
||
class function TCDWSCustomForm.GetTextLen(const AWinControl: TWinControl; var ALength: Integer): Boolean;
|
||
var
|
||
lText: string;
|
||
begin
|
||
Result := GetText(AWinControl, lText);
|
||
ALength := Length(lText);
|
||
end;
|
||
|
||
class procedure TCDWSCustomForm.SetText(const AWinControl: TWinControl; const AText: String);
|
||
var
|
||
tp: TXTextProperty;
|
||
lWindow: TWindow;
|
||
lWindowInfo: TX11WindowInfo;
|
||
begin
|
||
lWindowInfo := TX11WindowInfo(AWinControl.Handle);
|
||
lWindow := lWindowInfo.Window;
|
||
|
||
tp.value := PCUChar(AText);
|
||
tp.encoding := XA_WM_NAME;
|
||
tp.format := 8;
|
||
tp.nitems := UTF8Length(AText);
|
||
|
||
XSetWMName(CDWidgetSet.FDisplay, lWindow, @tp);
|
||
XStoreName(CDWidgetSet.FDisplay, lWindow, PChar(AText));
|
||
XSetIconName(CDWidgetSet.FDisplay, lWindow, PChar(AText));
|
||
XSetWMIconName(CDWidgetSet.FDisplay, lWindow, @tp);
|
||
end;
|
||
|
||
class function TCDWSCustomForm.GetClientBounds(const AWincontrol: TWinControl; var ARect: TRect): Boolean;
|
||
begin
|
||
end;
|
||
|
||
class function TCDWSCustomForm.GetClientRect(const AWincontrol: TWinControl; var ARect: TRect): Boolean;
|
||
begin
|
||
end;
|
||
|
||
|