diff options
author | Raymaekers Luca <luca@spacehb.net> | 2025-07-24 12:11:53 +0200 |
---|---|---|
committer | Raymaekers Luca <luca@spacehb.net> | 2025-07-24 12:11:53 +0200 |
commit | b426303de34dc4a54a4d078568418767832d8b15 (patch) | |
tree | 1d058979ebed174962b568228238db4400320a97 /code | |
parent | e7dc403c36d5958238691578610d442a27ecc943 (diff) |
checkpoint
Diffstat (limited to 'code')
-rwxr-xr-x | code/build.sh | 2 | ||||
-rw-r--r-- | code/handmade.h | 2 | ||||
-rw-r--r-- | code/handmade_platform.h | 275 | ||||
m--------- | code/libs/linuxhmh | 0 | ||||
-rw-r--r-- | code/linux_handmade.cpp | 1489 | ||||
-rw-r--r-- | code/linux_handmade.h | 91 | ||||
-rw-r--r-- | code/x11_key_to_keysym.c | 51 | ||||
-rw-r--r-- | code/x11_keysym_convert.c | 2048 |
8 files changed, 2 insertions, 3956 deletions
diff --git a/code/build.sh b/code/build.sh index 6cc9240..e6c0b5f 100755 --- a/code/build.sh +++ b/code/build.sh @@ -12,4 +12,4 @@ printf 'handmade.cpp\n' g++ $CompilerFlags $WarningFlags -shared -o ../build/handmade.so handmade.cpp printf 'linux_handmade.cpp\n' -g++ $CompilerFlags $WarningFlags -o ../build/linux_handmade linux_handmade.cpp -lasound -lm -lX11 -lXfixes +g++ $CompilerFlags $WarningFlags -o ../build/linux_handmade libs/linuxhmh/linux_handmade.cpp -lasound -lm -lX11 -lXfixes diff --git a/code/handmade.h b/code/handmade.h index 699167f..06f8922 100644 --- a/code/handmade.h +++ b/code/handmade.h @@ -7,7 +7,7 @@ $Notice: (C) Copyright 2014 by Molly Rocket, Inc. All Rights Reserved. $ ======================================================================== */ -#include "handmade_platform.h" +#include "libs/linuxhmh/handmade_platform.h" #include "handmade_math.h" #include "libs/stb_truetype.h" diff --git a/code/handmade_platform.h b/code/handmade_platform.h deleted file mode 100644 index e241b28..0000000 --- a/code/handmade_platform.h +++ /dev/null @@ -1,275 +0,0 @@ -/* date = May 12th 2025 10:53 am */ - -#ifndef HANDMADE_PLATFORM_H -#define HANDMADE_PLATFORM_H - -#ifdef __cplusplus -extern "C" { -#endif - - /* - NOTE(casey): - - HANDMADE_INTERNAL: - 0 - Build for public release - 1 - Build for developer only - - HANDMADE_SLOW: - 0 - Not slow code allowed! - 1 - Slow code welcome. - */ - -#include <stdint.h> -#include <stddef.h> - -#if !defined(COMPILER_MSVC) -#define COMPILER_MSVC 0 -#endif - -#if !defined(COMPILER_LLVM) -#define COMPILER_LLVM 0 -#endif - -#if !defined(COMPILER_GNU) -#define COMPILER_GNU 0 -#endif - -#if !COMPILER_MSVC && !COMPILER_LLVM && !COMPILER_GNU -#if _MSC_VER -#undef COMPILER_MSVC -#define COMPILER_MSVC 1 -#elif __GNUC__ -#undef COMPILER_GNU -#define COMPILER_GNU 1 -#else - // TODO(casey): More compilerz!!! -#endif -#endif - -#define internal static -#define local_persist static -#define global_variable static - -#define Pi32 3.14159265359f - -#if HANDMADE_SLOW - // TODO(casey): Complete assertion macro - don't worry everyone! -#define Assert(Expression) if(!(Expression)) {*(int *)0 = 0;} -#else -#define Assert(Expression) -#endif - -#define NullExpression { int X = 4; } - -#define Kilobytes(Value) ((Value)*1024LL) -#define Megabytes(Value) (Kilobytes(Value)*1024LL) -#define Gigabytes(Value) (Megabytes(Value)*1024LL) -#define Terabytes(Value) (Gigabytes(Value)*1024LL) - -#define ArrayCount(Array) (sizeof(Array) / sizeof((Array)[0])) - // TODO(casey): swap, min, max ... macros??? - - typedef int8_t s8; - typedef int16_t s16; - typedef int32_t s32; - typedef int64_t s64; - typedef s32 b32; - - typedef uint8_t u8; - typedef uint16_t u16; - typedef uint32_t u32; - typedef uint64_t u64; - - typedef size_t memory_index; - typedef s32 rune; - - typedef float r32; - typedef double r64; - - typedef struct thread_context - { - int Placeholder; - } thread_context; - - /* - NOTE(casey): Services that the platform layer provides to the game - */ - /* IMPORTANT(casey): - - These are NOT for doing anything in the shipping game - they are - blocking and the write doesn't protect against lost data! - */ - typedef struct debug_read_file_result - { - u32 ContentsSize; - void *Contents; - } debug_read_file_result; - -#define DEBUG_PLATFORM_FREE_FILE_MEMORY(name) void name(thread_context *Thread, void *Memory, u64 MemorySize) - typedef DEBUG_PLATFORM_FREE_FILE_MEMORY(debug_platform_free_file_memory); - -#define DEBUG_PLATFORM_READ_ENTIRE_FILE(name) debug_read_file_result name(thread_context *Thread, char *FileName) - typedef DEBUG_PLATFORM_READ_ENTIRE_FILE(debug_platform_read_entire_file); - -#define DEBUG_PLATFORM_WRITE_ENTIRE_FILE(name) b32 name(thread_context *Thread, char *FileName, u32 MemorySize, void *Memory) - typedef DEBUG_PLATFORM_WRITE_ENTIRE_FILE(debug_platform_write_entire_file); - -#define PLATFORM_RUN_COMMAND_AND_GET_OUTPUT(name) b32 name(thread_context *Thread, char *OutputBuffer, char *Command[]) - typedef PLATFORM_RUN_COMMAND_AND_GET_OUTPUT(platform_run_command_and_get_output); - - /* - NOTE(casey): Services that the game provides to the platform layer. - (this may expand in the future - sound on separate thread, etc.) - */ - - // FOUR THINGS - timing, controller/keyboard input, bitmap buffer to use, sound buffer to use - - // TODO(casey): In the future, rendering _specifically_ will become a three-tiered abstraction!!! - typedef struct game_offscreen_buffer - { - // NOTE(casey): Pixels are alwasy 32-bits wide, Memory Order BB GG RR XX - void *Memory; - s32 Width; - s32 Height; - s32 Pitch; - s32 BytesPerPixel; - } game_offscreen_buffer; - - typedef struct game_sound_output_buffer - { - int SamplesPerSecond; - int SampleCount; - s16 *Samples; - } game_sound_output_buffer; - - typedef struct game_text_button - { - rune Codepoint; - b32 Control; - b32 Shift; - b32 Alt; - } game_text_button; - - typedef struct game_button_state - { - int HalfTransitionCount; - b32 EndedDown; - } game_button_state; - - typedef struct game_controller_input - { - b32 IsConnected; - - struct - { - u32 TextInputCount; - game_text_button TextInputBuffer[64]; - - // TODO(luca): Generate code for keys that are not characters like Return, Backspace, etc. - } Keyboard; - - b32 IsAnalog; - r32 StickAverageX; - r32 StickAverageY; - - union - { - game_button_state Buttons[12]; - struct - { - game_button_state MoveUp; - game_button_state MoveDown; - game_button_state MoveLeft; - game_button_state MoveRight; - - game_button_state ActionUp; - game_button_state ActionDown; - game_button_state ActionLeft; - game_button_state ActionRight; - - game_button_state LeftShoulder; - game_button_state RightShoulder; - - game_button_state Back; - game_button_state Start; - - // NOTE(casey): All buttons must be added above this line - - game_button_state Terminator; - }; - }; - } game_controller_input; - - typedef enum - { - PlatformMouseButton_Left = 0, - PlatformMouseButton_Right, - PlatformMouseButton_Middle, - PlatformMouseButton_Count - } platform_mouse_buttons; - - typedef struct game_input - { - game_button_state MouseButtons[PlatformMouseButton_Count]; - s32 MouseX, MouseY, MouseZ; - - r32 dtForFrame; - - game_controller_input Controllers[5]; - } game_input; - - inline b32 WasPressed(game_button_state State) - { - b32 Result = ((State.HalfTransitionCount > 1) || - (State.HalfTransitionCount == 1 && State.EndedDown)); - return Result; - } - - typedef struct game_memory - { - b32 IsInitialized; - - memory_index PermanentStorageSize; - void *PermanentStorage; // NOTE(casey): REQUIRED to be cleared to zero at startup - - memory_index TransientStorageSize; - void *TransientStorage; // NOTE(casey): REQUIRED to be cleared to zero at startup - - debug_platform_free_file_memory *DEBUGPlatformFreeFileMemory; - debug_platform_read_entire_file *DEBUGPlatformReadEntireFile; - debug_platform_write_entire_file *DEBUGPlatformWriteEntireFile; - platform_run_command_and_get_output *PlatformRunCommandAndGetOutput; - } game_memory; - -#define GAME_UPDATE_AND_RENDER(name) void name(thread_context *Thread, game_memory *Memory, game_input *Input, game_offscreen_buffer *Buffer) - typedef GAME_UPDATE_AND_RENDER(game_update_and_render); - - // NOTE(casey): At the moment, this has to be a very fast function, it cannot be - // more than a millisecond or so. - // TODO(casey): Reduce the pressure on this function's performance by measuring it - // or asking about it, etc. -#define GAME_GET_SOUND_SAMPLES(name) void name(thread_context *Thread, game_memory *Memory, game_sound_output_buffer *SoundBuffer) - typedef GAME_GET_SOUND_SAMPLES(game_get_sound_samples); - - inline u32 - SafeTruncateUInt64(u64 Value) - { - // TODO(casey): Defines for maximum values - Assert(Value <= 0xFFFFFFFF); - u32 Result = (u32)Value; - return(Result); - } - - inline game_controller_input *GetController(game_input *Input, int unsigned ControllerIndex) - { - Assert(ControllerIndex < ArrayCount(Input->Controllers)); - - game_controller_input *Result = &Input->Controllers[ControllerIndex]; - return(Result); - } - -#endif //HANDMADE_PLATFORM_H - -#ifdef __cplusplus -} -#endif diff --git a/code/libs/linuxhmh b/code/libs/linuxhmh new file mode 160000 +Subproject 54a7548645e145ca1cb80bb8d51baf7532d499d diff --git a/code/linux_handmade.cpp b/code/linux_handmade.cpp deleted file mode 100644 index 0ed3b1d..0000000 --- a/code/linux_handmade.cpp +++ /dev/null @@ -1,1489 +0,0 @@ -#include <stdio.h> -#include <string.h> -#include <x86intrin.h> -#include <dlfcn.h> -#include <fcntl.h> - -#include <unistd.h> -#include <dirent.h> -#include <sys/mman.h> -#include <sys/stat.h> -#include <sys/wait.h> -#include <signal.h> -#include <linux/limits.h> -#include <linux/input.h> -#include <alsa/asoundlib.h> -#include <X11/Xlib.h> -#include <X11/Xutil.h> -#include <X11/keysymdef.h> -#include <X11/extensions/Xrandr.h> - -#include "handmade_platform.h" -#include "linux_handmade.h" - -#include "x11_keysym_convert.c" - -#define true 1 -#define false 0 - -#define ALSA_RECOVER_SILENT true -#define MAX_PLAYER_COUNT 4 - -#ifdef Assert -#undef Assert -#define Assert(Expression) \ -if(!(Expression)) \ -{ \ -raise(SIGTRAP); \ -} -#endif - -// NOTE(luca): Bits are layed out over multiple bytes. This macro checks which byte the bit will be set in. -#define IsEvdevBitSet(Bit, Array) (Array[(Bit) / 8] & (1 << ((Bit) % 8))) -#define BytesNeededForBits(Bits) ((Bits + 7) / 8) - -global_variable b32 GlobalRunning; -global_variable b32 GlobalPaused; - -void MemCpy(char *Dest, char *Source, size_t Count) -{ - while(Count--) *Dest++ = *Source++; -} - -void MemSet(char *Dest, char Value, size_t Count) -{ - while(Count--) *Dest++ = Value; -} - -int StrLen(char *String) -{ - size_t Result = 0; - - while(*String++) Result++; - - return Result; -} - -void CatStrings(size_t SourceACount, char *SourceA, - size_t SourceBCount, char *SourceB, - size_t DestCount, char *Dest) -{ - for(size_t Index = 0; - Index < SourceACount; - Index++) - { - *Dest++ = *SourceA++; - } - - for(size_t Index = 0; - Index < SourceBCount; - Index++) - { - *Dest++ = *SourceB++; - } -} - -internal rune -ConvertUTF8StringToRune(u8 UTF8String[4]) -{ - rune Codepoint = 0; - - if((UTF8String[0] & 0x80) == 0x00) - { - Codepoint = UTF8String[0]; - } - else if((UTF8String[0] & 0xE0) == 0xC0) - { - Codepoint = ( - ((UTF8String[0] & 0x1F) << 6*1) | - ((UTF8String[1] & 0x3F) << 6*0) - ); - } - else if((UTF8String[0] & 0xF0) == 0xE0) - { - Codepoint = ( - ((UTF8String[0] & 0x0F) << 6*2) | - ((UTF8String[1] & 0x3F) << 6*1) | - ((UTF8String[2] & 0x3F) << 6*0) - ); - } - else if((UTF8String[0] & 0xF8) == 0xF8) - { - Codepoint = ( - ((UTF8String[0] & 0x0E) << 6*3) | - ((UTF8String[1] & 0x3F) << 6*2) | - ((UTF8String[2] & 0x3F) << 6*1) | - ((UTF8String[3] & 0x3F) << 6*0) - ); - } - else - { - Assert(0); - } - - return Codepoint; -} - -struct linux_init_alsa_result -{ - snd_pcm_t *PCMHandle; - snd_pcm_hw_params_t *PCMParams; -}; - -internal linux_init_alsa_result LinuxInitALSA() -{ - linux_init_alsa_result Result = {}; - - int PCMResult = 0; - if((PCMResult = snd_pcm_open(&Result.PCMHandle, "default", - SND_PCM_STREAM_PLAYBACK, 0)) == 0) - { - snd_pcm_hw_params_alloca(&Result.PCMParams); - snd_pcm_hw_params_any(Result.PCMHandle, Result.PCMParams); - u32 ChannelCount = 2; - u32 SampleRate = 48000; - - if((PCMResult = snd_pcm_hw_params_set_access(Result.PCMHandle, Result.PCMParams, SND_PCM_ACCESS_RW_INTERLEAVED)) < 0) - { - // TODO(luca): Logging - // snd_strerror(pcm) - } - if((PCMResult = snd_pcm_hw_params_set_format(Result.PCMHandle, Result.PCMParams, SND_PCM_FORMAT_S16_LE)) < 0) - { - // TODO(luca): Logging - } - if((PCMResult = snd_pcm_hw_params_set_channels(Result.PCMHandle, Result.PCMParams, ChannelCount)) < 0) - { - // TODO(luca): Logging - } - if((PCMResult = snd_pcm_hw_params_set_rate_near(Result.PCMHandle, Result.PCMParams, &SampleRate, 0)) < 0) - { - // TODO(luca): Logging - } - if((PCMResult = snd_pcm_nonblock(Result.PCMHandle, 1)) < 0) - { - // TODO(luca): Logging - } - if((PCMResult = snd_pcm_reset(Result.PCMHandle)) < 0) - { - // TODO(luca): Logging - } - if((PCMResult = snd_pcm_hw_params(Result.PCMHandle, Result.PCMParams)) < 0) - { - // TODO(luca): Logging - } - - } - else - { - // TODO(luca): Logging - } - - return Result; -} - -internal void LinuxGetAxisInfo(linux_gamepad *GamePad, linux_gamepad_axes_enum Axis, int AbsAxis) -{ - input_absinfo AxesInfo = {}; - if(ioctl(GamePad->File, EVIOCGABS(AbsAxis), &AxesInfo) != -1) - { - GamePad->Axes[Axis].Minimum = AxesInfo.minimum; - GamePad->Axes[Axis].Maximum = AxesInfo.maximum; - GamePad->Axes[Axis].Fuzz = AxesInfo.fuzz; - GamePad->Axes[Axis].Flat = AxesInfo.flat; - } -} - -internal void LinuxOpenGamePad(char *FilePath, linux_gamepad *GamePad) -{ - GamePad->File = open(FilePath, O_RDWR|O_NONBLOCK); - - if(GamePad->File != -1) - { - int Version = 0; - int IsCompatible = true; - - // TODO(luca): Check versions - ioctl(GamePad->File, EVIOCGVERSION, &Version); - ioctl(GamePad->File, EVIOCGNAME(sizeof(GamePad->Name)), GamePad->Name); - - char SupportedEventBits[BytesNeededForBits(EV_MAX)] = {}; - if(ioctl(GamePad->File, EVIOCGBIT(0, sizeof(SupportedEventBits)), SupportedEventBits) != -1) - { - if(!IsEvdevBitSet(EV_ABS, SupportedEventBits)) - { - // TODO(luca): Logging - IsCompatible = false; - } - if(!IsEvdevBitSet(EV_KEY, SupportedEventBits)) - { - // TODO(luca): Logging - IsCompatible = false; - } - } - - char SupportedKeyBits[BytesNeededForBits(KEY_MAX)] = {}; - if(ioctl(GamePad->File, EVIOCGBIT(EV_KEY , sizeof(SupportedKeyBits)), SupportedKeyBits) != -1) - { - if(!IsEvdevBitSet(BTN_GAMEPAD, SupportedKeyBits)) - { - // TODO(luca): Logging - IsCompatible = false; - } - } - - GamePad->SupportsRumble = IsEvdevBitSet(EV_FF, SupportedEventBits); - - if(IsCompatible) - { - // NOTE(luca): Map evdev axes to my enum. - LinuxGetAxisInfo(GamePad, LSTICKX, ABS_X); - LinuxGetAxisInfo(GamePad, LSTICKY, ABS_Y); - LinuxGetAxisInfo(GamePad, RSTICKX, ABS_RX); - LinuxGetAxisInfo(GamePad, RSTICKY, ABS_RY); - LinuxGetAxisInfo(GamePad, LSHOULDER, ABS_Z); - LinuxGetAxisInfo(GamePad, RSHOULDER, ABS_RZ); - LinuxGetAxisInfo(GamePad, DPADX, ABS_HAT0X); - LinuxGetAxisInfo(GamePad, DPADY, ABS_HAT0Y); - - MemCpy(GamePad->FilePath, FilePath, StrLen(FilePath)); - } - else - { - close(GamePad->File); - *GamePad = {}; - GamePad->File = -1; - } - } -} - -// TODO(luca): Make this work in the case of multiple displays. -internal r32 LinuxGetMonitorRefreshRate(Display *DisplayHandle, Window RootWindow) -{ - r32 Result = 0; - - void *LibraryHandle = dlopen("libXrandr.so.2", RTLD_NOW); - - if(LibraryHandle) - { - typedef XRRScreenResources *xrr_get_screen_resources(Display *Display, Window Window); - typedef XRRCrtcInfo *xrr_get_crtc_info(Display* Display, XRRScreenResources *Resources, RRCrtc Crtc); - - xrr_get_screen_resources *XRRGetScreenResources = (xrr_get_screen_resources *)dlsym(LibraryHandle, "XRRGetScreenResources"); - xrr_get_crtc_info *XRRGetCrtcInfo = (xrr_get_crtc_info *)dlsym(LibraryHandle, "XRRGetCrtcInfo"); - - XRRScreenResources *ScreenResources = XRRGetScreenResources(DisplayHandle, RootWindow); - - RRMode ActiveModeID = 0; - for(int CRTCIndex = 0; - CRTCIndex< ScreenResources->ncrtc; - CRTCIndex++) - { - XRRCrtcInfo *CRTCInfo = XRRGetCrtcInfo(DisplayHandle, ScreenResources, ScreenResources->crtcs[CRTCIndex]); - if(CRTCInfo->mode) - { - ActiveModeID = CRTCInfo->mode; - } - } - - r32 ActiveRate = 0; - for(int ModeIndex = 0; - ModeIndex < ScreenResources->nmode; - ModeIndex++) - { - XRRModeInfo ModeInfo = ScreenResources->modes[ModeIndex]; - if(ModeInfo.id == ActiveModeID) - { - Assert(ActiveRate == 0); - Result = (r32)ModeInfo.dotClock / ((r32)ModeInfo.hTotal * (r32)ModeInfo.vTotal); - } - } - - dlclose(LibraryHandle); - } - - return Result; -} - -internal void LinuxBuildFileNameFromExecutable(char *Dest, linux_state *State, char *FileName) -{ - char *Path = State->ExecutablePath; - - size_t LastSlash = 0; - for(char *Scan = Path; - *Scan; - Scan++) - { - if(*Scan == '/') - { - LastSlash = Scan - Path; - } - } - - for(size_t Index = 0; - Index < LastSlash + 1; - Index++) - { - *Dest++ = *Path++; - } - - while(*FileName) - *Dest++ = *FileName++; -} - -GAME_UPDATE_AND_RENDER(LinuxGameUpdateAndRenderStub) {} -GAME_GET_SOUND_SAMPLES(LinuxGameGetSoundSamplesStub) {} - -internal linux_game_code LinuxLoadGameCode(char *LibraryPath) -{ - linux_game_code Result = {}; - - Result.LibraryHandle = dlopen(LibraryPath, RTLD_NOW); - if(Result.LibraryHandle) - { - Result.UpdateAndRender = (game_update_and_render *)dlsym(Result.LibraryHandle, "GameUpdateAndRender"); - Result.GetSoundSamples = (game_get_sound_samples *)dlsym(Result.LibraryHandle, "GameGetSoundSamples"); - } - else - { - Result.UpdateAndRender = (game_update_and_render *)LinuxGameUpdateAndRenderStub; - Result.GetSoundSamples = (game_get_sound_samples *)LinuxGameGetSoundSamplesStub; - } - - return Result; -} - -internal void LinuxUnloadGameCode(linux_game_code *Game) -{ - if(Game->LibraryHandle) - { - dlclose(Game->LibraryHandle); - } -} - -internal void LinuxProcessKeyPress(game_button_state *ButtonState, b32 IsDown) -{ - if(ButtonState->EndedDown != IsDown) - { - ButtonState->EndedDown = IsDown; - ButtonState->HalfTransitionCount++; - } -} - -internal void LinuxBeginRecordingInput(linux_state *State, int SlotIndex) -{ - char FileName[64]; - sprintf(FileName, "loop_edit_%d.hmi", SlotIndex); - - int File = open(FileName, O_WRONLY|O_CREAT|O_TRUNC|O_APPEND, 0600); - if(State->InputRecordingFile != -1) - { - int BytesWritten = write(File, State->GameMemoryBlock, State->TotalSize); - if(BytesWritten != -1 && - BytesWritten == (int)State->TotalSize) - { - State->InputRecordingFile = File; - State->InputRecordingIndex = SlotIndex; - } - else - { - // TODO(luca): Logging - } - } - else - { - // TODO(luca): Logging - } - -} - -internal void LinuxEndRecordingInput(linux_state *State, int SlotIndex) -{ - Assert(State->InputRecordingIndex); - Assert(State->InputRecordingFile != -1); - - State->InputRecordingIndex = 0; - - if(close(State->InputRecordingFile) == -1) - { - State->InputRecordingFile = -1; - } - else - { - // TODO(luca): Logging - } - -} - -internal void LinuxBeginInputPlayBack(linux_state *State, int SlotIndex) -{ - char FileName[64]; - sprintf(FileName, "loop_edit_%d.hmi", SlotIndex); - - int File = open(FileName, O_RDONLY, 0400); - if(File != -1) - { - State->InputPlayingFile = File; - - int BytesRead = read(State->InputPlayingFile, State->GameMemoryBlock, State->TotalSize); - if(BytesRead != -1) - { - State->InputPlayingIndex = SlotIndex; - } - else - { - // TODO(luca): Logging - } - } - else - { - // TODO(luca): Logging - } - -} - -internal void LinuxEndInputPlayBack(linux_state *State) -{ - Assert(State->InputPlayingIndex); - Assert(State->InputPlayingFile != -1); - - if(close(State->InputPlayingFile) != -1) - { - State->InputPlayingFile = -1; - } - else - { - // TODO(luca): Logging - } - - State->InputPlayingIndex = 0; -} - -internal void LinuxRecordInput(linux_state *State, game_input *Input) -{ - int BytesWritten = write(State->InputRecordingFile, Input, sizeof(*Input)); - if(BytesWritten != -1 && - BytesWritten == (int)sizeof(*Input)) - { - } - else - { - // TODO: Logging - } - -} - -internal void LinuxPlayBackInput(linux_state *State, game_input *Input) -{ - int BytesRead = read(State->InputPlayingFile, Input, sizeof(*Input)); - if(BytesRead != -1) - { - if(BytesRead == 0) - { - int PlayingIndex = State->InputPlayingIndex; - LinuxEndInputPlayBack(State); - LinuxBeginInputPlayBack(State, PlayingIndex); - read(State->InputPlayingFile, Input, sizeof(*Input)); - } - } - -} - -internal void LinuxHideCursor(Display *DisplayHandle, Window WindowHandle) -{ - XColor black = {}; - char NoData[8] = {}; - - Pixmap BitmapNoData = XCreateBitmapFromData(DisplayHandle, WindowHandle, NoData, 8, 8); - Cursor InvisibleCursor = XCreatePixmapCursor(DisplayHandle, BitmapNoData, BitmapNoData, - &black, &black, 0, 0); - XDefineCursor(DisplayHandle, WindowHandle, InvisibleCursor); - XFreeCursor(DisplayHandle, InvisibleCursor); - XFreePixmap(DisplayHandle, BitmapNoData); -} - -internal void LinuxShowCursor(Display *DisplayHandle, Window WindowHandle) -{ - XUndefineCursor(DisplayHandle, WindowHandle); -} - -internal void LinuxProcessPendingMessages(Display *DisplayHandle, Window WindowHandle, - XIC InputContext, Atom WM_DELETE_WINDOW, linux_state *State, game_controller_input *KeyboardController) -{ - XEvent WindowEvent = {}; - while(XPending(DisplayHandle) > 0) - { - XNextEvent(DisplayHandle, &WindowEvent); - b32 FilteredEvent = XFilterEvent(&WindowEvent, WindowHandle); - if(FilteredEvent) - { - Assert(WindowEvent.type == KeyPress || WindowEvent.type == KeyRelease); - } - - switch(WindowEvent.type) - { - case KeyPress: - case KeyRelease: - { - //- How text input works - // The needs: - // 1. Preserve game buttons, so that we can switch between a "game mode" or - // "text input mode". - // 2. Text input using the input method of the user which should allow for utf8 characters. - // 3. Hotkey support. Eg. quickly navigating text. - // 3 will be supported by 2 for code reuse. - // - // We are going to send a buffer text button presses to the game layer, this solves these - // issues: - // - Pressing the same key multiple times in one frame. - // - Having modifiers be specific to each key press. - // - Not having to create a button record for each possible character in the structure. - // - Key events come in one at a time in the event loop, thus we need to have a buffer for - // multiple keys pressed on a single frame. - // - // We store a count along the buffer and in the buffer we store the utf8 codepoint and its - // modifiers. - // The app code is responsible for traversing this buffer and applying the logic. - - // The problem of input methods and hotkeys: - // Basically the problem is that if we allow the input method and combo's that could be - // filtered by the input method it won't seem consistent to the user. - // So we don't allow key bound to the input method to have an effect and we only pass key - // inputs that have not been filtered. - // - // In the platform layer we handle the special case were the input methods creates non- - // printable characters and we decompose those key inputs since non-printable characters - // have no use anymore. - - // Extra: - // - I refuse to check which keys bind to what modifiers. It's not important. - - // - Handy resources: - // - https://www.coderstool.com/unicode-text-converter - // - man Compose(5). - // - https://en.wikipedia.org/wiki/Control_key#History - - KeySym Symbol = XLookupKeysym(&WindowEvent.xkey, 0); - b32 IsDown = (WindowEvent.type == KeyPress); - - // TODO(luca): Refresh mappings. - // NOTE(luca): Only KeyPress events see man page of Xutf8LookupString(). And skip filtered events for text input, but keep them for controller. - if(IsDown && !FilteredEvent) - { - rune Codepoint = 'e'; - u8 LookupBuffer[4] = {}; - Status LookupStatus = {}; - - s32 BytesLookepdUp = Xutf8LookupString(InputContext, &WindowEvent.xkey, - (char *)&LookupBuffer, ArrayCount(LookupBuffer), - 0, &LookupStatus); - Assert(LookupStatus != XBufferOverflow); - Assert(BytesLookepdUp <= 4); - - if(LookupStatus!= XLookupNone && - LookupStatus!= XLookupKeySym) - { - if(BytesLookepdUp) - { - Assert(KeyboardController->Keyboard.TextInputCount < ArrayCount(KeyboardController->Keyboard.TextInputBuffer)); - - Codepoint = ConvertUTF8StringToRune(LookupBuffer); - - // NOTE(luca): Input methods might produce non printable characters (< ' '). If this - // happens we try to "decompose" the key input. - if(Codepoint < ' ' && Codepoint >= 0) - { - if(Symbol >= XK_space) - { - Codepoint = (char)(' ' + (Symbol - XK_space)); - } - } - - - if(Codepoint >= ' ' || Codepoint < 0) - { - game_text_button *TextButton = &KeyboardController->Keyboard.TextInputBuffer[KeyboardController->Keyboard.TextInputCount++]; - TextButton->Codepoint = Codepoint; - TextButton->Shift = (WindowEvent.xkey.state & ShiftMask); - TextButton->Control = (WindowEvent.xkey.state & ControlMask); - TextButton->Alt = (WindowEvent.xkey.state & Mod1Mask); -#if 0 - printf("%d bytes '%c' %d (%c|%c|%c)\n", - BytesLookepdUp, - ((Codepoint >= ' ') ? (char)Codepoint : '\0'), - Codepoint, - ((WindowEvent.xkey.state & ShiftMask) ? 'S' : ' '), - ((WindowEvent.xkey.state & ControlMask) ? 'C' : ' '), - ((WindowEvent.xkey.state & Mod1Mask) ? 'A' : ' ')); -#endif - } - else - { - // TODO(luca): Logging - } - - } - } - } - - if(0) {} - else if(Symbol == XK_w) - { - LinuxProcessKeyPress(&KeyboardController->MoveUp, IsDown); - } - else if(Symbol == XK_a) - { - LinuxProcessKeyPress(&KeyboardController->MoveLeft, IsDown); - } - else if(Symbol == XK_r) - { - LinuxProcessKeyPress(&KeyboardController->MoveDown, IsDown); - } - else if(Symbol == XK_s) - { - LinuxProcessKeyPress(&KeyboardController->MoveRight, IsDown); - } - else if(Symbol == XK_Up) - { - LinuxProcessKeyPress(&KeyboardController->ActionUp, IsDown); - } - else if(Symbol == XK_Left) - { - LinuxProcessKeyPress(&KeyboardController->ActionLeft, IsDown); - } - else if(Symbol == XK_Down) - { - LinuxProcessKeyPress(&KeyboardController->ActionDown, IsDown); - } - else if(Symbol == XK_Right) - { - LinuxProcessKeyPress(&KeyboardController->ActionRight, IsDown); - } - else if(Symbol == XK_space) - { - LinuxProcessKeyPress(&KeyboardController->Start, IsDown); - } - else if((WindowEvent.xkey.state & Mod1Mask) && - (Symbol == XK_p)) - { - if(IsDown) - { - GlobalPaused = !GlobalPaused; - } - } - else if((WindowEvent.xkey.state & Mod1Mask) && - (Symbol == XK_l)) - { - if(IsDown) - { - if(State->InputPlayingIndex == 0) - { - if(State->InputRecordingIndex == 0) - { - LinuxBeginRecordingInput(State, 1); - } - else - { - LinuxEndRecordingInput(State, 1); - LinuxBeginInputPlayBack(State, 1); - } - } - else - { - // NOTE(luca) Reset buttons so they aren't held. - // TODO(luca): Check if still needed since we clear halftransition counts. - for(u32 ButtonIndex = 0; - ButtonIndex < ArrayCount(KeyboardController->Buttons); - ButtonIndex++) - { - KeyboardController->Buttons[ButtonIndex] = {}; - } - LinuxEndInputPlayBack(State); - } - } - } - else if((WindowEvent.xkey.state & Mod1Mask) && - (Symbol == XK_F4)) - { - GlobalRunning = false; - } - - } break; - case DestroyNotify: - { - XDestroyWindowEvent *Event = (XDestroyWindowEvent *)&WindowEvent; - if(Event->window == WindowHandle) - { - GlobalRunning = false; - } - } break; - - case ClientMessage: - { - XClientMessageEvent *Event = (XClientMessageEvent *)&WindowEvent; - if((Atom)Event->data.l[0] == WM_DELETE_WINDOW) - { - XDestroyWindow(DisplayHandle, WindowHandle); - GlobalRunning = false; - } - } break; - - case EnterNotify: - { - //LinuxHideCursor(DisplayHandle, WindowHandle); - } break; - - case LeaveNotify: - { - //LinuxShowCursor(DisplayHandle, WindowHandle); - } break; - } - } -} - -internal void LinuxSetSizeHint(Display *DisplayHandle, Window WindowHandle, - int MinWidth, int MinHeight, - int MaxWidth, int MaxHeight) -{ - XSizeHints Hints = {}; - if(MinWidth > 0 && MinHeight > 0) Hints.flags |= PMinSize; - if(MaxWidth > 0 && MaxHeight > 0) Hints.flags |= PMaxSize; - - Hints.min_width = MinWidth; - Hints.min_height = MinHeight; - Hints.max_width = MaxWidth; - Hints.max_height = MaxHeight; - - XSetWMNormalHints(DisplayHandle, WindowHandle, &Hints); -} - -DEBUG_PLATFORM_READ_ENTIRE_FILE(DEBUGPlatformReadEntireFile) -{ - debug_read_file_result Result = {}; - - int File = open(FileName, O_RDONLY); - if(File != -1) - { - struct stat FileStats = {}; - fstat(File, &FileStats); - Result.ContentsSize = FileStats.st_size; - Result.Contents = mmap(0, FileStats.st_size, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_PRIVATE, File, 0); - - close(File); - } - - return Result; -} - -PLATFORM_RUN_COMMAND_AND_GET_OUTPUT(PlatformRunCommandAndGetOutput) -{ - int Result = 0; - - int HandlesLink[2] = {0}; - int WaitStatus = 0; - pid_t ChildPID = 0; - int Ret = 0; - - char *FilePath = Command[0]; - int AccessMode = F_OK | X_OK; - Ret = access(FilePath, AccessMode); - - if(Ret == 0) - { - Ret = pipe(HandlesLink); - if(Ret != -1) - { - ChildPID = fork(); - if(ChildPID != -1) - { - if(ChildPID == 0) - { - dup2(HandlesLink[1], STDOUT_FILENO); - execve(Command[0], Command, 0); - } - else - { - wait(&WaitStatus); - - Result = read(HandlesLink[0], OutputBuffer, 4096); - if(Result == -1) - { - Result = 0; - } - } - - } - else - { - // TODO: Logging - } - } - else - { - // TODO: Logging - } - } - else - { - // TODO: Logging - } - - return Result; -} - -DEBUG_PLATFORM_FREE_FILE_MEMORY(DEBUGPlatformFreeFileMemory) -{ - munmap(Memory, MemorySize); -} - -DEBUG_PLATFORM_WRITE_ENTIRE_FILE(DEBUGPlatformWriteEntireFile) -{ - b32 Result = false; - - int FD = open(FileName, O_CREAT|O_WRONLY|O_TRUNC, 00600); - if(FD != -1) - { - if(write(FD, Memory, MemorySize) != MemorySize) - { - Result = true; - } - - close(FD); - } - - return Result; -} - -internal struct timespec LinuxGetLastWriteTime(char *FilePath) -{ - struct timespec Result = {}; - - struct stat LibraryFileStats = {}; - if(!stat(FilePath, &LibraryFileStats)) - { - Result = LibraryFileStats.st_mtim; - } - - return Result; -} - -internal struct timespec LinuxGetWallClock() -{ - struct timespec Counter = {}; - clock_gettime(CLOCK_MONOTONIC, &Counter); - return Counter; -} - -internal s64 LinuxGetNSecondsElapsed(struct timespec Start, struct timespec End) -{ - s64 Result = 0; - Result = ((s64)End.tv_sec*1000000000 + (s64)End.tv_nsec) - ((s64)Start.tv_sec*1000000000 + (s64)Start.tv_nsec); - return Result; -} - -internal r32 LinuxGetSecondsElapsed(struct timespec Start, struct timespec End) -{ - r32 Result = 0; - Result = LinuxGetNSecondsElapsed(Start, End)/1000.0f/1000.0f/1000.0f; - - return Result; -} - -internal r32 LinuxNormalizeAxisValue(s32 Value, linux_gamepad_axis Axis) -{ - r32 Result = 0; - if(Value) - { - // ((value - min / max) - 0.5) * 2 - r32 Normalized = ((r32)((r32)(Value - Axis.Minimum) / (r32)(Axis.Maximum - Axis.Minimum)) - 0.5f)*2; - Result = Normalized; - } - Assert(Result <= 1.0f && Result >= -1.0f); - - return Result; -} - -void LinuxDebugVerticalLine(game_offscreen_buffer *Buffer, int X, int Y, u32 Color) -{ - int Height = 32; - - if(X <= Buffer->Width && X >= 0 && - Y <= Buffer->Height - Height && Y <= 0) - { - u8 *Row = (u8 *)Buffer->Memory + Y*Buffer->Pitch + X*Buffer->BytesPerPixel; - while(Height--) - { - *(u32 *)Row = Color; - Row += Buffer->Pitch; - } - } -} - -int main(int ArgC, char *Args[]) -{ - // NOTE(luca): Change to executable's current directory such that file paths are relative to that in the game code. - char *ExePath = Args[0]; - int Length = StrLen(ExePath); - char ExecutableDirPath[Length]; - int LastSlash = 0; - for(int At = 0; - At < Length; - At++) - { - if(ExePath[At] == '/') - { - LastSlash = At; - } - } - MemCpy(ExecutableDirPath, ExePath, LastSlash); - ExecutableDirPath[LastSlash] = 0; - if(chdir(ExecutableDirPath) == -1) - { - // TODO(luca): Logging - } - - Display *DisplayHandle = XOpenDisplay(0); - - if(DisplayHandle) - { - Window RootWindow = XDefaultRootWindow(DisplayHandle); - int Screen = XDefaultScreen(DisplayHandle); - int Width = 1920/2; - int Height = 1080/2; - int ScreenBitDepth = 24; - XVisualInfo WindowVisualInfo = {}; - if(XMatchVisualInfo(DisplayHandle, Screen, ScreenBitDepth, TrueColor, &WindowVisualInfo)) - { - XSetWindowAttributes WindowAttributes = {}; - WindowAttributes.bit_gravity = StaticGravity; -#if HANDMADE_INTERNAL - WindowAttributes.background_pixel = 0xFF00FF; -#endif - WindowAttributes.colormap = XCreateColormap(DisplayHandle, RootWindow, WindowVisualInfo.visual, AllocNone); - WindowAttributes.event_mask = (StructureNotifyMask | - KeyPressMask | KeyReleaseMask | - EnterWindowMask | LeaveWindowMask); - u64 WindowAttributeMask = CWBitGravity | CWBackPixel | CWColormap | CWEventMask; - - Window WindowHandle = XCreateWindow(DisplayHandle, RootWindow, - 1920 - Width - 10, 10, - Width, Height, - 0, - WindowVisualInfo.depth, InputOutput, - WindowVisualInfo.visual, WindowAttributeMask, &WindowAttributes); - if(WindowHandle) - { - XStoreName(DisplayHandle, WindowHandle, "Handmade Window"); - LinuxSetSizeHint(DisplayHandle, WindowHandle, Width, Height, Width, Height); - - Atom WM_DELETE_WINDOW = XInternAtom(DisplayHandle, "WM_DELETE_WINDOW", False); - if(!XSetWMProtocols(DisplayHandle, WindowHandle, &WM_DELETE_WINDOW, 1)) - { - // TODO(luca): Logging - } - - XClassHint ClassHint = {}; - ClassHint.res_name = "Handmade Window"; - ClassHint.res_class = "Handmade Window"; - XSetClassHint(DisplayHandle, WindowHandle, &ClassHint); - - XSetLocaleModifiers(""); - - XIM InputMethod = XOpenIM(DisplayHandle, 0, 0, 0); - if(!InputMethod){ - XSetLocaleModifiers("@im=none"); - InputMethod = XOpenIM(DisplayHandle, 0, 0, 0); - } - XIC InputContext = XCreateIC(InputMethod, - XNInputStyle, XIMPreeditNothing | XIMStatusNothing, - XNClientWindow, WindowHandle, - XNFocusWindow, WindowHandle, - NULL); - XSetICFocus(InputContext); - - int BitsPerPixel = 32; - int BytesPerPixel = BitsPerPixel/8; - int WindowBufferSize = Width*Height*BytesPerPixel; - char *WindowBuffer = (char *)malloc(WindowBufferSize); - - XImage *WindowImage = XCreateImage(DisplayHandle, WindowVisualInfo.visual, WindowVisualInfo.depth, ZPixmap, 0, WindowBuffer, Width, Height, BitsPerPixel, 0); - GC DefaultGC = DefaultGC(DisplayHandle, Screen); - - linux_state LinuxState = {}; - MemCpy(LinuxState.ExecutablePath, Args[0], strlen(Args[0])); - - char LibraryFullPath[] = "handmade.so"; - linux_game_code Game = LinuxLoadGameCode(LibraryFullPath); - Game.LibraryLastWriteTime = LinuxGetLastWriteTime(LibraryFullPath); - - game_memory GameMemory = {}; - - GameMemory.PermanentStorageSize = Megabytes(64); - GameMemory.TransientStorageSize = Gigabytes(1); - GameMemory.DEBUGPlatformReadEntireFile = DEBUGPlatformReadEntireFile; - GameMemory.DEBUGPlatformFreeFileMemory = DEBUGPlatformFreeFileMemory; - GameMemory.DEBUGPlatformWriteEntireFile = DEBUGPlatformWriteEntireFile; - GameMemory.PlatformRunCommandAndGetOutput = PlatformRunCommandAndGetOutput; - -#if HANDMADE_INTERNAL - void *BaseAddress = (void *)Terabytes(2); -#else - void *BaseAddress = 0; -#endif - // TODO(casey): TransientStorage needs to be broken into game transient and cache transient - LinuxState.TotalSize = GameMemory.PermanentStorageSize + GameMemory.TransientStorageSize; - LinuxState.GameMemoryBlock = mmap(BaseAddress, LinuxState.TotalSize, PROT_READ|PROT_WRITE, MAP_ANONYMOUS|MAP_SHARED, -1, 0); - GameMemory.PermanentStorage = LinuxState.GameMemoryBlock; - GameMemory.TransientStorage = (u8 *)GameMemory.PermanentStorage + GameMemory.PermanentStorageSize; - - game_input Input[2] = {}; - game_input *NewInput = &Input[0]; - game_input *OldInput = &Input[1]; - - linux_gamepad GamePads[MAX_PLAYER_COUNT] = {}; - for(int GamePadIndex = 0; - GamePadIndex < MAX_PLAYER_COUNT; - GamePadIndex++) - { - GamePads[GamePadIndex].File = -1; - } - - char EventDirectoryName[] = "/dev/input/"; - DIR *EventDirectory = opendir(EventDirectoryName); - struct dirent *Entry = 0; - int GamePadIndex = 0; - while((Entry = readdir(EventDirectory))) - { - if(!strncmp(Entry->d_name, "event", sizeof("event") - 1)) - { - char FilePath[PATH_MAX] = {}; - CatStrings(sizeof(EventDirectoryName) - 1, EventDirectoryName, - StrLen(Entry->d_name), Entry->d_name, - sizeof(FilePath) - 1, FilePath); - if(GamePadIndex < MAX_PLAYER_COUNT) - { - linux_gamepad *GamePadAt = &GamePads[GamePadIndex]; - LinuxOpenGamePad(FilePath, GamePadAt); - if(GamePadAt->File != -1) - { -#if 0 - for(int AxesIndex = 0; - AxesIndex < AXES_COUNT; - AxesIndex++) - { - linux_gamepad_axis Axis = GamePadAt->Axes[AxesIndex]; - printf("min: %d, max: %d, fuzz: %d, flat: %d\n", Axis.Minimum, Axis.Maximum, Axis.Fuzz, Axis.Flat); - } -#endif - GamePadIndex++; - } - } - else - { - // TODO(luca): Logging - } - } - } - - game_offscreen_buffer OffscreenBuffer = {}; - OffscreenBuffer.Memory = WindowBuffer; - OffscreenBuffer.Width = Width; - OffscreenBuffer.Height = Height; - OffscreenBuffer.BytesPerPixel = BytesPerPixel; - OffscreenBuffer.Pitch = Width*BytesPerPixel; - - int LastFramesWritten = 0; - unsigned int SampleRate, ChannelCount, PeriodTime, SampleCount; - snd_pcm_status_t *PCMStatus = 0; - snd_pcm_t* PCMHandle = 0; - snd_pcm_hw_params_t *PCMParams = 0; - snd_pcm_uframes_t PeriodSize = 0; - snd_pcm_uframes_t PCMBufferSize = 0; - - linux_init_alsa_result ALSAInit = LinuxInitALSA(); - PCMHandle = ALSAInit.PCMHandle; - PCMParams = ALSAInit.PCMParams; - snd_pcm_hw_params_get_channels(PCMParams, &ChannelCount); - snd_pcm_hw_params_get_rate(PCMParams, &SampleRate, 0); - snd_pcm_hw_params_get_period_size(PCMParams, &PeriodSize, 0); - snd_pcm_hw_params_get_period_time(PCMParams, &PeriodTime, NULL); - snd_pcm_hw_params_get_buffer_size(PCMParams, &PCMBufferSize); - snd_pcm_status_malloc(&PCMStatus); - -#if 0 - { - Assert(0); - u32 Value, Result; - snd_pcm_uframes_t Frames; - Result = snd_pcm_hw_params_get_buffer_time_min(PCMParams, &Value, 0); - Result = snd_pcm_hw_params_get_buffer_size_min(PCMParams, &Frames); - Frames = PCMBufferSize/2; - Result = snd_pcm_hw_params_set_period_size_near(PCMHandle, PCMParams, &Frames, 0); - Result = snd_pcm_hw_params_get_period_size(PCMParams, &PeriodSize, 0); - } -#endif - - - char AudioSamples[PCMBufferSize]; - u64 Periods = 2; - u32 BytesPerSample = (sizeof(s16)*ChannelCount); - -#if 1 - r32 GameUpdateHz = 60; -#else - r32 GameUpdateHz = LinuxGetMonitorRefreshRate(DisplayHandle, RootWindow); -#endif - - thread_context ThreadContext = {}; - - XMapWindow(DisplayHandle, WindowHandle); - XFlush(DisplayHandle); - - struct timespec LastCounter = LinuxGetWallClock(); - struct timespec FlipWallClock = LinuxGetWallClock(); - r32 TargetSecondsPerFrame = 1.0f / GameUpdateHz; - - GlobalRunning = true; - - u64 LastCycleCount = __rdtsc(); - while(GlobalRunning) - { - NewInput->dtForFrame = TargetSecondsPerFrame; - -#if HANDMADE_SLOW - // NOTE(luca): Because gcc will first create an empty file and then write into it we skip trying to reload when the file is empty. - struct stat FileStats = {}; - stat(LibraryFullPath, &FileStats); - if(FileStats.st_size) - { - s64 SecondsElapsed = LinuxGetNSecondsElapsed(Game.LibraryLastWriteTime, FileStats.st_mtim) / 1000/1000; - if(SecondsElapsed > 0) - { - LinuxUnloadGameCode(&Game); - Game = LinuxLoadGameCode(LibraryFullPath); - Game.LibraryLastWriteTime = FileStats.st_mtim; - } - } -#endif - - game_controller_input *OldKeyboardController = GetController(OldInput, 0); - game_controller_input *NewKeyboardController = GetController(NewInput, 0); - NewKeyboardController->IsConnected = true; - - NewKeyboardController->Keyboard.TextInputCount = 0; - for(u32 ButtonIndex = 0; - ButtonIndex < ArrayCount(NewKeyboardController->Buttons); - ButtonIndex++) - { - NewKeyboardController->Buttons[ButtonIndex].HalfTransitionCount = 0; - } - - LinuxProcessPendingMessages(DisplayHandle, WindowHandle, InputContext, WM_DELETE_WINDOW, - &LinuxState, NewKeyboardController); - - // TODO(luca): Use buttonpress/release events instead so we query this less frequently. - s32 MouseX = 0, MouseY = 0, MouseZ = 0; // TODO(luca): Support mousewheel? - u32 MouseMask = 0; - u64 Ignored; - if(XQueryPointer(DisplayHandle, WindowHandle, - &Ignored, &Ignored, (int *)&Ignored, (int *)&Ignored, - &MouseX, &MouseY, &MouseMask)) - { - if(MouseX <= OffscreenBuffer.Width && - MouseX >= 0 && - MouseY <= OffscreenBuffer.Height && - MouseY >= 0) - { - NewInput->MouseY = MouseY; - NewInput->MouseX = MouseX; - - for(u32 ButtonIndex = 0; - ButtonIndex < PlatformMouseButton_Count; - ButtonIndex++) - { - NewInput->MouseButtons[ButtonIndex].EndedDown = OldInput->MouseButtons[ButtonIndex].EndedDown; - NewInput->MouseButtons[ButtonIndex].HalfTransitionCount = 0; - } - - LinuxProcessKeyPress(&NewInput->MouseButtons[PlatformMouseButton_Left], (MouseMask & Button1Mask)); - LinuxProcessKeyPress(&NewInput->MouseButtons[PlatformMouseButton_Middle], (MouseMask & Button2Mask)); - LinuxProcessKeyPress(&NewInput->MouseButtons[PlatformMouseButton_Right], (MouseMask & Button3Mask)); - } - } - - for(int GamePadIndex = 0; - GamePadIndex < MAX_PLAYER_COUNT; - GamePadIndex++) - { - linux_gamepad *GamePadAt = &GamePads[GamePadIndex]; - - if(GamePadAt->File != -1) - { - game_controller_input *OldController = GetController(OldInput, 0); - game_controller_input *NewController = GetController(NewInput, 0); - - // TODO(luca): Cross frame values!!! - struct input_event InputEvents[64] = {}; - int BytesRead = 0; - - BytesRead = read(GamePadAt->File, InputEvents, sizeof(InputEvents)); - if(BytesRead != -1) - { - for(u32 EventIndex = 0; - EventIndex < ArrayCount(InputEvents); - EventIndex++) - { - struct input_event EventAt = InputEvents[EventIndex]; - - switch(EventAt.type) - { - case EV_KEY: - { - b32 IsDown = EventAt.value; - if(0) {} - else if(EventAt.code == BTN_A) - { - NewController->ActionDown.EndedDown = IsDown; - } - else if(EventAt.code == BTN_B) - { - NewController->ActionRight.EndedDown = IsDown; - } - else if(EventAt.code == BTN_X) - { - NewController->ActionLeft.EndedDown = IsDown; - } - else if(EventAt.code == BTN_Y) - { - NewController->ActionUp.EndedDown = IsDown; - } - else if(EventAt.code == BTN_START) - { - NewController->Start.EndedDown = IsDown; - } - else if(EventAt.code == BTN_BACK) - { - NewController->Back.EndedDown = IsDown; - } - } break; - - case EV_ABS: - { - if(0) {} - else if(EventAt.code == ABS_X) - { - NewController->IsAnalog = true; - - NewController->StickAverageX = LinuxNormalizeAxisValue(EventAt.value, GamePadAt->Axes[LSTICKX]); - } - else if(EventAt.code == ABS_Y) - { - NewController->StickAverageY = -1.0f * LinuxNormalizeAxisValue(EventAt.value, GamePadAt->Axes[LSTICKY]); - } - else if(EventAt.code == ABS_HAT0X) - { - NewController->StickAverageX = EventAt.value; - NewController->IsAnalog = false; - } - else if(EventAt.code == ABS_HAT0Y) - { - NewController->StickAverageY = -EventAt.value; - NewController->IsAnalog = false; - } - } break; -#if 0 - if(EventAt.type) printf("%d %d %d\n", EventAt.type, EventAt.code, EventAt.value); -#endif - } - } - } - } - } - - if(!GlobalPaused) - { - if(LinuxState.InputRecordingIndex) - { - LinuxRecordInput(&LinuxState, NewInput); - } - if(LinuxState.InputPlayingIndex) - { - LinuxPlayBackInput(&LinuxState, NewInput); - } - - // NOTE(luca): Clear buffer - MemSet(WindowBuffer, 0, WindowBufferSize); - if(Game.UpdateAndRender) - { - Game.UpdateAndRender(&ThreadContext, &GameMemory, NewInput, &OffscreenBuffer); - } - - /* NOTE(luca): How sound works - -Check the delay -Check the available frames in buffer - -1. Too few audio frames in buffer for current frame. --> Add more - -2. Too many frames available --> Add less / drain? - -3. Fill first time? --> Check delay --> Maybe we should do this every frame? --> Output needed frames to not have lag, this means to output maybe two frames? - -TODO -- check if delay never changes -- check if buffersize never changes --> cache these values -*/ - - - r32 SamplesToWrite = 0; - local_persist b32 AudioFillFirstTime = true; - - r32 SingleFrameOfAudioFrames = TargetSecondsPerFrame*SampleRate; - - if(AudioFillFirstTime) - { - struct timespec WorkCounter = LinuxGetWallClock(); - r32 WorkSecondsElapsed = LinuxGetSecondsElapsed(LastCounter, WorkCounter); - r32 SecondsLeftUntilFlip = TargetSecondsPerFrame - WorkSecondsElapsed; - - if(SecondsLeftUntilFlip > 0) - { - SamplesToWrite = SampleRate*(TargetSecondsPerFrame + SecondsLeftUntilFlip); - } - else - { - SamplesToWrite = SingleFrameOfAudioFrames; - } - - AudioFillFirstTime = false; - } - else - { - SamplesToWrite = SingleFrameOfAudioFrames; - } - - - game_sound_output_buffer SoundBuffer = {}; - SoundBuffer.SamplesPerSecond = SampleRate; - SoundBuffer.SampleCount = SamplesToWrite; - SoundBuffer.Samples = (s16 *)AudioSamples; - - if(Game.GetSoundSamples) - { - Game.GetSoundSamples(&ThreadContext, &GameMemory, &SoundBuffer); - } - -#if 0 - snd_pcm_sframes_t AvailableFrames = 0; - snd_pcm_sframes_t DelayFrames; - - //snd_pcm_avail_update(PCMHandle); - AvailableFrames = snd_pcm_avail(PCMHandle); - snd_pcm_delay(PCMHandle, &DelayFrames); - - //printf("PeriodSize: %lu, PeriodTime: %d, BufferSize: %lu\n", PeriodSize, PeriodTime, PCMBufferSize); - printf("BeingWritten: %lu, Avail: %ld, Delay: %ld, ToWrite: %d\n", PCMBufferSize - AvailableFrames, AvailableFrames, DelayFrames, (s32)SamplesToWrite); -#endif - - LastFramesWritten = snd_pcm_writei(PCMHandle, SoundBuffer.Samples, SoundBuffer.SampleCount); - - if(LastFramesWritten < 0) - { - // TODO(luca): Logging - // NOTE(luca): We might want to silence in case of overruns ahead of time. We also probably want to handle latency differently here. - snd_pcm_recover(PCMHandle, LastFramesWritten, ALSA_RECOVER_SILENT); - - // underrun - if(LastFramesWritten == -EPIPE) - { - AudioFillFirstTime = true; - } - - } - } - -#if 0 - printf("Expected: %d, Delay: %4d, Being written: %5lu, Written: %d, Ptr: %lu\n", - (int)SamplesToWrite, DelayFrames, PCMBufferSize - AvailableFrames, LastFramesWritten, PCMSoundStatus->hw_ptr); -#endif - - struct timespec WorkCounter = LinuxGetWallClock(); - r32 SecondsElapsedForFrame = LinuxGetSecondsElapsed(LastCounter, WorkCounter); - if(SecondsElapsedForFrame < TargetSecondsPerFrame) - { - - s64 SleepUS = (s64)((TargetSecondsPerFrame - 0.001 - SecondsElapsedForFrame)*1000000.0f); - if(SleepUS > 0) - { - usleep(SleepUS); - } - else - { - // TODO(luca): Logging - } - - r32 TestSecondsElapsedForFrame = (r32)(LinuxGetSecondsElapsed(LastCounter, LinuxGetWallClock())); - if(TestSecondsElapsedForFrame < TargetSecondsPerFrame) - { - // TODO(luca): Log missed sleep - } - - // NOTE(luca): This is to help against sleep granularity. - while(SecondsElapsedForFrame < TargetSecondsPerFrame) - { - SecondsElapsedForFrame = LinuxGetSecondsElapsed(LastCounter, LinuxGetWallClock()); - } - } - else - { - // TODO(luca): Log missed frame rate! - } - - struct timespec EndCounter = LinuxGetWallClock(); - r32 MSPerFrame = (r32)(LinuxGetNSecondsElapsed(LastCounter, EndCounter)/1000000.f); - LastCounter = EndCounter; - - XPutImage(DisplayHandle, WindowHandle, DefaultGC, WindowImage, 0, 0, - 0, 0, - Width, Height); - FlipWallClock = LinuxGetWallClock(); - - game_input *TempInput = NewInput; - NewInput = OldInput; - TempInput = NewInput; - -#if 0 - u64 EndCycleCount = __rdtsc(); - u64 CyclesElapsed = EndCycleCount - LastCycleCount; - LastCycleCount = EndCycleCount; - - r64 FPS = 0; - r64 MCPF = (r64)(CyclesElapsed/(1000.0f*1000.0f)); - printf("%.2fms/f %.2ff/s %.2fmc/f\n", MSPerFrame, FPS, MCPF); -#endif - - } - - } - else - { - // TODO: Log this bad WindowHandle - } - } - else - { - // TODO: Log this could not match visual info - } - } - else - { - // TODO: Log could not get x connection - } - return 0; -} diff --git a/code/linux_handmade.h b/code/linux_handmade.h deleted file mode 100644 index f85320e..0000000 --- a/code/linux_handmade.h +++ /dev/null @@ -1,91 +0,0 @@ -/* date = April 15th 2025 4:50 pm */ - -#ifndef LINUX_HANDMADE_H -#define LINUX_HANDMADE_H - -struct linux_game_code -{ - game_update_and_render *UpdateAndRender; - game_get_sound_samples *GetSoundSamples; - - void *LibraryHandle; - struct timespec LibraryLastWriteTime; -}; - -enum linux_gamepad_axes_enum -{ - LSTICKX, - LSTICKY, - RSTICKX, - RSTICKY, - LSHOULDER, - RSHOULDER, - DPADX, - DPADY, - AXES_COUNT -}; - -struct linux_gamepad_axis -{ - s32 Minimum; - s32 Maximum; - s32 Fuzz; - s32 Flat; -}; - -struct linux_gamepad -{ - int File; - char FilePath[PATH_MAX]; - - char Name[256]; - int SupportsRumble; - linux_gamepad_axis Axes[AXES_COUNT]; -}; - -struct linux_replay_buffer -{ - int FD; - char FileName[PATH_MAX]; - void *MemoryBlock; -}; -struct linux_state -{ - int InputPlayingIndex; - int InputRecordingIndex; - int InputPlayingFile; - int InputRecordingFile; - - linux_replay_buffer ReplayBuffers[4]; - - char ExecutablePath[PATH_MAX]; - - size_t TotalSize; - void *GameMemoryBlock; -}; - -// --------------------------------------------------------------------------------------- -// IMPORTANT(luca): Copy Pasted from alsa-lib; This is a hack to access the hw_ptr and to -// understand what alsa-lib functions are doing internally better through the debugger. -typedef struct { unsigned char pad[sizeof(time_t) - sizeof(int)]; } __time_pad; -typedef struct -{ - snd_pcm_state_t state; /* stream state */ - __time_pad pad1; /* align to timespec */ - struct timespec trigger_tstamp; /* time when stream was started/stopped/paused */ - struct timespec tstamp; /* reference timestamp */ - snd_pcm_uframes_t appl_ptr; /* appl ptr */ - snd_pcm_uframes_t hw_ptr; /* hw ptr */ - snd_pcm_sframes_t delay; /* current delay in frames */ - snd_pcm_uframes_t avail; /* number of frames available */ - snd_pcm_uframes_t avail_max; /* max frames available on hw since last status */ - snd_pcm_uframes_t overrange; /* count of ADC (capture) overrange detections from last status */ - snd_pcm_state_t suspended_state; /* suspended stream state */ - __u32 audio_tstamp_data; /* needed for 64-bit alignment, used for configs/report to/from userspace */ - struct timespec audio_tstamp; /* sample counter, wall clock, PHC or on-demand sync'ed */ - struct timespec driver_tstamp; /* useful in case reference system tstamp is reported with delay */ - __u32 audio_tstamp_accuracy; /* in ns units, only valid if indicated in audio_tstamp_data */ - unsigned char reserved[52-2*sizeof(struct timespec)]; /* must be filled with zero */ -} sound_status; - -#endif //LINUX_HANDMADE_H diff --git a/code/x11_key_to_keysym.c b/code/x11_key_to_keysym.c deleted file mode 100644 index 57c8841..0000000 --- a/code/x11_key_to_keysym.c +++ /dev/null @@ -1,51 +0,0 @@ -@table(Name, KeySym) KeyboardButtons -{ - { Return XK_Return } - { Delete XK_Delete } - { BackSpace XK_BackSpace } - { Home XK_KP_Home } - { End XK_KP_End } - { PageUp XK_KP_Prior } - { PageDown XK_KP_Next } - { Control XK_Control_L } - { Shift XK_Shift_L } - { Alt XK_Alt_L } - { Insert XK_Insert } - { Escape XK_Escape } - { Up XK_Up } - { Down XK_Down } - { Left XK_Left } - { Right XK_Right } - { F1 XK_F1 } - { F2 XK_F2 } - { F3 XK_F3 } - { F4 XK_F4 } - { F5 XK_F5 } - { F6 XK_F6 } - { F7 XK_F7 } - { F8 XK_F8 } - { F9 XK_F9 } - { F10 XK_F10 } - { F11 XK_F11 } - { F12 XK_F12 } -} - - -if(0) {} -@expand(KeyboardButtons k) -`if\(Symbol == $(k.KeySym)\) -{ - LinuxProcessKeyPress\(&KeyboardController->Keyboard.$(k.Name), IsDown\); -}` - -@expand(KeyboardButtons k) -`game_button_state $(k.Name)` - -typedef enum -{ -@expand(KeyboardButtons k) ` PlatformKeyboardButton_$(k.Name),` - PlatformKeyboardButton_Count -} platform_keyboard_buttons; - -@count(KeyboardButtons) - diff --git a/code/x11_keysym_convert.c b/code/x11_keysym_convert.c deleted file mode 100644 index f05289d..0000000 --- a/code/x11_keysym_convert.c +++ /dev/null @@ -1,2048 +0,0 @@ -#define XK_MISCELLANY -#define XK_XKB_KEYS -#define XK_3270 -#define XK_LATIN1 -#define XK_LATIN2 -#define XK_LATIN3 -#define XK_LATIN4 -#define XK_LATIN8 -#define XK_LATIN9 -#define XK_KATAKANA -#define XK_ARABIC -#define XK_CYRILLIC -#define XK_GREEK -#define XK_TECHNICAL -#define XK_SPECIAL -#define XK_PUBLISHING -#define XK_APL -#define XK_HEBREW -#define XK_THAI -#define XK_KOREAN -#define XK_ARMENIAN -#define XK_GEORGIAN -#define XK_CAUCASUS -#define XK_VIETNAMESE -#define XK_CURRENCY -#define XK_MATHEMATICAL -#define XK_BRAILLE -#define XK_SINHALA - -#include <X11/keysymdef.h> - -internal char * -LinuxReturnStringForSymbol(KeySym Symbol) -{ - switch(Symbol) - { - case XK_VoidSymbol: return "VoidSymbol"; break; - case XK_BackSpace: return "BackSpace"; break; - case XK_Tab: return "Tab"; break; - case XK_Linefeed: return "Linefeed"; break; - case XK_Clear: return "Clear"; break; - case XK_Return: return "Return"; break; - case XK_Pause: return "Pause"; break; - case XK_Scroll_Lock: return "Scroll_Lock"; break; - case XK_Sys_Req: return "Sys_Req"; break; - case XK_Escape: return "Escape"; break; - case XK_Delete: return "Delete"; break; - case XK_Multi_key: return "Multi_key"; break; - case XK_Codeinput: return "Codeinput"; break; - case XK_SingleCandidate: return "SingleCandidate"; break; - case XK_MultipleCandidate: return "MultipleCandidate"; break; - case XK_PreviousCandidate: return "PreviousCandidate"; break; - case XK_Kanji: return "Kanji"; break; - case XK_Muhenkan: return "Muhenkan"; break; - case XK_Henkan_Mode: return "Henkan_Mode"; break; - case XK_Romaji: return "Romaji"; break; - case XK_Hiragana: return "Hiragana"; break; - case XK_Katakana: return "Katakana"; break; - case XK_Hiragana_Katakana: return "Hiragana_Katakana"; break; - case XK_Zenkaku: return "Zenkaku"; break; - case XK_Hankaku: return "Hankaku"; break; - case XK_Zenkaku_Hankaku: return "Zenkaku_Hankaku"; break; - case XK_Touroku: return "Touroku"; break; - case XK_Massyo: return "Massyo"; break; - case XK_Kana_Lock: return "Kana_Lock"; break; - case XK_Kana_Shift: return "Kana_Shift"; break; - case XK_Eisu_Shift: return "Eisu_Shift"; break; - case XK_Eisu_toggle: return "Eisu_toggle"; break; - case XK_Home: return "Home"; break; - case XK_Left: return "Left"; break; - case XK_Up: return "Up"; break; - case XK_Right: return "Right"; break; - case XK_Down: return "Down"; break; - case XK_Prior: return "Prior"; break; - case XK_Next: return "Next"; break; - case XK_End: return "End"; break; - case XK_Begin: return "Begin"; break; - case XK_Select: return "Select"; break; - case XK_Print: return "Print"; break; - case XK_Execute: return "Execute"; break; - case XK_Insert: return "Insert"; break; - case XK_Undo: return "Undo"; break; - case XK_Redo: return "Redo"; break; - case XK_Menu: return "Menu"; break; - case XK_Find: return "Find"; break; - case XK_Cancel: return "Cancel"; break; - case XK_Help: return "Help"; break; - case XK_Break: return "Break"; break; - case XK_Mode_switch: return "Mode_switch"; break; - case XK_Num_Lock: return "Num_Lock"; break; - case XK_KP_Space: return "KP_Space"; break; - case XK_KP_Tab: return "KP_Tab"; break; - case XK_KP_Enter: return "KP_Enter"; break; - case XK_KP_F1: return "KP_F1"; break; - case XK_KP_F2: return "KP_F2"; break; - case XK_KP_F3: return "KP_F3"; break; - case XK_KP_F4: return "KP_F4"; break; - case XK_KP_Home: return "KP_Home"; break; - case XK_KP_Left: return "KP_Left"; break; - case XK_KP_Up: return "KP_Up"; break; - case XK_KP_Right: return "KP_Right"; break; - case XK_KP_Down: return "KP_Down"; break; - case XK_KP_Prior: return "KP_Prior"; break; - case XK_KP_Next: return "KP_Next"; break; - case XK_KP_End: return "KP_End"; break; - case XK_KP_Begin: return "KP_Begin"; break; - case XK_KP_Insert: return "KP_Insert"; break; - case XK_KP_Delete: return "KP_Delete"; break; - case XK_KP_Equal: return "KP_Equal"; break; - case XK_KP_Multiply: return "KP_Multiply"; break; - case XK_KP_Add: return "KP_Add"; break; - case XK_KP_Separator: return "KP_Separator"; break; - case XK_KP_Subtract: return "KP_Subtract"; break; - case XK_KP_Decimal: return "KP_Decimal"; break; - case XK_KP_Divide: return "KP_Divide"; break; - case XK_KP_0: return "KP_0"; break; - case XK_KP_1: return "KP_1"; break; - case XK_KP_2: return "KP_2"; break; - case XK_KP_3: return "KP_3"; break; - case XK_KP_4: return "KP_4"; break; - case XK_KP_5: return "KP_5"; break; - case XK_KP_6: return "KP_6"; break; - case XK_KP_7: return "KP_7"; break; - case XK_KP_8: return "KP_8"; break; - case XK_KP_9: return "KP_9"; break; - case XK_F1: return "F1"; break; - case XK_F2: return "F2"; break; - case XK_F3: return "F3"; break; - case XK_F4: return "F4"; break; - case XK_F5: return "F5"; break; - case XK_F6: return "F6"; break; - case XK_F7: return "F7"; break; - case XK_F8: return "F8"; break; - case XK_F9: return "F9"; break; - case XK_F10: return "F10"; break; - case XK_F11: return "F11"; break; - case XK_F12: return "F12"; break; - case XK_F13: return "F13"; break; - case XK_F14: return "F14"; break; - case XK_F15: return "F15"; break; - case XK_F16: return "F16"; break; - case XK_F17: return "F17"; break; - case XK_F18: return "F18"; break; - case XK_F19: return "F19"; break; - case XK_F20: return "F20"; break; - case XK_F21: return "F21"; break; - case XK_F22: return "F22"; break; - case XK_F23: return "F23"; break; - case XK_F24: return "F24"; break; - case XK_F25: return "F25"; break; - case XK_F26: return "F26"; break; - case XK_F27: return "F27"; break; - case XK_F28: return "F28"; break; - case XK_F29: return "F29"; break; - case XK_F30: return "F30"; break; - case XK_F31: return "F31"; break; - case XK_F32: return "F32"; break; - case XK_F33: return "F33"; break; - case XK_F34: return "F34"; break; - case XK_F35: return "F35"; break; - case XK_Shift_L: return "Shift_L"; break; - case XK_Shift_R: return "Shift_R"; break; - case XK_Control_L: return "Control_L"; break; - case XK_Control_R: return "Control_R"; break; - case XK_Caps_Lock: return "Caps_Lock"; break; - case XK_Shift_Lock: return "Shift_Lock"; break; - case XK_Meta_L: return "Meta_L"; break; - case XK_Meta_R: return "Meta_R"; break; - case XK_Alt_L: return "Alt_L"; break; - case XK_Alt_R: return "Alt_R"; break; - case XK_Super_L: return "Super_L"; break; - case XK_Super_R: return "Super_R"; break; - case XK_Hyper_L: return "Hyper_L"; break; - case XK_Hyper_R: return "Hyper_R"; break; - case XK_ISO_Lock: return "ISO_Lock"; break; - case XK_ISO_Level2_Latch: return "ISO_Level2_Latch"; break; - case XK_ISO_Level3_Shift: return "ISO_Level3_Shift"; break; - case XK_ISO_Level3_Latch: return "ISO_Level3_Latch"; break; - case XK_ISO_Level3_Lock: return "ISO_Level3_Lock"; break; - case XK_ISO_Level5_Shift: return "ISO_Level5_Shift"; break; - case XK_ISO_Level5_Latch: return "ISO_Level5_Latch"; break; - case XK_ISO_Level5_Lock: return "ISO_Level5_Lock"; break; - case XK_ISO_Group_Latch: return "ISO_Group_Latch"; break; - case XK_ISO_Group_Lock: return "ISO_Group_Lock"; break; - case XK_ISO_Next_Group: return "ISO_Next_Group"; break; - case XK_ISO_Next_Group_Lock: return "ISO_Next_Group_Lock"; break; - case XK_ISO_Prev_Group: return "ISO_Prev_Group"; break; - case XK_ISO_Prev_Group_Lock: return "ISO_Prev_Group_Lock"; break; - case XK_ISO_First_Group: return "ISO_First_Group"; break; - case XK_ISO_First_Group_Lock: return "ISO_First_Group_Lock"; break; - case XK_ISO_Last_Group: return "ISO_Last_Group"; break; - case XK_ISO_Last_Group_Lock: return "ISO_Last_Group_Lock"; break; - case XK_ISO_Left_Tab: return "ISO_Left_Tab"; break; - case XK_ISO_Move_Line_Up: return "ISO_Move_Line_Up"; break; - case XK_ISO_Move_Line_Down: return "ISO_Move_Line_Down"; break; - case XK_ISO_Partial_Line_Up: return "ISO_Partial_Line_Up"; break; - case XK_ISO_Partial_Line_Down: return "ISO_Partial_Line_Down"; break; - case XK_ISO_Partial_Space_Left: return "ISO_Partial_Space_Left"; break; - case XK_ISO_Partial_Space_Right: return "ISO_Partial_Space_Right"; break; - case XK_ISO_Set_Margin_Left: return "ISO_Set_Margin_Left"; break; - case XK_ISO_Set_Margin_Right: return "ISO_Set_Margin_Right"; break; - case XK_ISO_Release_Margin_Left: return "ISO_Release_Margin_Left"; break; - case XK_ISO_Release_Margin_Right: return "ISO_Release_Margin_Right"; break; - case XK_ISO_Release_Both_Margins: return "ISO_Release_Both_Margins"; break; - case XK_ISO_Fast_Cursor_Left: return "ISO_Fast_Cursor_Left"; break; - case XK_ISO_Fast_Cursor_Right: return "ISO_Fast_Cursor_Right"; break; - case XK_ISO_Fast_Cursor_Up: return "ISO_Fast_Cursor_Up"; break; - case XK_ISO_Fast_Cursor_Down: return "ISO_Fast_Cursor_Down"; break; - case XK_ISO_Continuous_Underline: return "ISO_Continuous_Underline"; break; - case XK_ISO_Discontinuous_Underline: return "ISO_Discontinuous_Underline"; break; - case XK_ISO_Emphasize: return "ISO_Emphasize"; break; - case XK_ISO_Center_Object: return "ISO_Center_Object"; break; - case XK_ISO_Enter: return "ISO_Enter"; break; - case XK_dead_grave: return "dead_grave"; break; - case XK_dead_acute: return "dead_acute"; break; - case XK_dead_circumflex: return "dead_circumflex"; break; - case XK_dead_tilde: return "dead_tilde"; break; - case XK_dead_macron: return "dead_macron"; break; - case XK_dead_breve: return "dead_breve"; break; - case XK_dead_abovedot: return "dead_abovedot"; break; - case XK_dead_diaeresis: return "dead_diaeresis"; break; - case XK_dead_abovering: return "dead_abovering"; break; - case XK_dead_doubleacute: return "dead_doubleacute"; break; - case XK_dead_caron: return "dead_caron"; break; - case XK_dead_cedilla: return "dead_cedilla"; break; - case XK_dead_ogonek: return "dead_ogonek"; break; - case XK_dead_iota: return "dead_iota"; break; - case XK_dead_voiced_sound: return "dead_voiced_sound"; break; - case XK_dead_semivoiced_sound: return "dead_semivoiced_sound"; break; - case XK_dead_belowdot: return "dead_belowdot"; break; - case XK_dead_hook: return "dead_hook"; break; - case XK_dead_horn: return "dead_horn"; break; - case XK_dead_stroke: return "dead_stroke"; break; - case XK_dead_abovecomma: return "dead_abovecomma"; break; - case XK_dead_abovereversedcomma: return "dead_abovereversedcomma"; break; - case XK_dead_doublegrave: return "dead_doublegrave"; break; - case XK_dead_belowring: return "dead_belowring"; break; - case XK_dead_belowmacron: return "dead_belowmacron"; break; - case XK_dead_belowcircumflex: return "dead_belowcircumflex"; break; - case XK_dead_belowtilde: return "dead_belowtilde"; break; - case XK_dead_belowbreve: return "dead_belowbreve"; break; - case XK_dead_belowdiaeresis: return "dead_belowdiaeresis"; break; - case XK_dead_invertedbreve: return "dead_invertedbreve"; break; - case XK_dead_belowcomma: return "dead_belowcomma"; break; - case XK_dead_currency: return "dead_currency"; break; - case XK_dead_lowline: return "dead_lowline"; break; - case XK_dead_aboveverticalline: return "dead_aboveverticalline"; break; - case XK_dead_belowverticalline: return "dead_belowverticalline"; break; - case XK_dead_longsolidusoverlay: return "dead_longsolidusoverlay"; break; - case XK_dead_a: return "dead_a"; break; - case XK_dead_A: return "dead_A"; break; - case XK_dead_e: return "dead_e"; break; - case XK_dead_E: return "dead_E"; break; - case XK_dead_i: return "dead_i"; break; - case XK_dead_I: return "dead_I"; break; - case XK_dead_o: return "dead_o"; break; - case XK_dead_O: return "dead_O"; break; - case XK_dead_u: return "dead_u"; break; - case XK_dead_U: return "dead_U"; break; - case XK_dead_small_schwa: return "dead_small_schwa"; break; - case XK_dead_capital_schwa: return "dead_capital_schwa"; break; - case XK_dead_greek: return "dead_greek"; break; - case XK_dead_hamza: return "dead_hamza"; break; - case XK_First_Virtual_Screen: return "First_Virtual_Screen"; break; - case XK_Prev_Virtual_Screen: return "Prev_Virtual_Screen"; break; - case XK_Next_Virtual_Screen: return "Next_Virtual_Screen"; break; - case XK_Last_Virtual_Screen: return "Last_Virtual_Screen"; break; - case XK_Terminate_Server: return "Terminate_Server"; break; - case XK_AccessX_Enable: return "AccessX_Enable"; break; - case XK_AccessX_Feedback_Enable: return "AccessX_Feedback_Enable"; break; - case XK_RepeatKeys_Enable: return "RepeatKeys_Enable"; break; - case XK_SlowKeys_Enable: return "SlowKeys_Enable"; break; - case XK_BounceKeys_Enable: return "BounceKeys_Enable"; break; - case XK_StickyKeys_Enable: return "StickyKeys_Enable"; break; - case XK_MouseKeys_Enable: return "MouseKeys_Enable"; break; - case XK_MouseKeys_Accel_Enable: return "MouseKeys_Accel_Enable"; break; - case XK_Overlay1_Enable: return "Overlay1_Enable"; break; - case XK_Overlay2_Enable: return "Overlay2_Enable"; break; - case XK_AudibleBell_Enable: return "AudibleBell_Enable"; break; - case XK_Pointer_Left: return "Pointer_Left"; break; - case XK_Pointer_Right: return "Pointer_Right"; break; - case XK_Pointer_Up: return "Pointer_Up"; break; - case XK_Pointer_Down: return "Pointer_Down"; break; - case XK_Pointer_UpLeft: return "Pointer_UpLeft"; break; - case XK_Pointer_UpRight: return "Pointer_UpRight"; break; - case XK_Pointer_DownLeft: return "Pointer_DownLeft"; break; - case XK_Pointer_DownRight: return "Pointer_DownRight"; break; - case XK_Pointer_Button_Dflt: return "Pointer_Button_Dflt"; break; - case XK_Pointer_Button1: return "Pointer_Button1"; break; - case XK_Pointer_Button2: return "Pointer_Button2"; break; - case XK_Pointer_Button3: return "Pointer_Button3"; break; - case XK_Pointer_Button4: return "Pointer_Button4"; break; - case XK_Pointer_Button5: return "Pointer_Button5"; break; - case XK_Pointer_DblClick_Dflt: return "Pointer_DblClick_Dflt"; break; - case XK_Pointer_DblClick1: return "Pointer_DblClick1"; break; - case XK_Pointer_DblClick2: return "Pointer_DblClick2"; break; - case XK_Pointer_DblClick3: return "Pointer_DblClick3"; break; - case XK_Pointer_DblClick4: return "Pointer_DblClick4"; break; - case XK_Pointer_DblClick5: return "Pointer_DblClick5"; break; - case XK_Pointer_Drag_Dflt: return "Pointer_Drag_Dflt"; break; - case XK_Pointer_Drag1: return "Pointer_Drag1"; break; - case XK_Pointer_Drag2: return "Pointer_Drag2"; break; - case XK_Pointer_Drag3: return "Pointer_Drag3"; break; - case XK_Pointer_Drag4: return "Pointer_Drag4"; break; - case XK_Pointer_Drag5: return "Pointer_Drag5"; break; - case XK_Pointer_EnableKeys: return "Pointer_EnableKeys"; break; - case XK_Pointer_Accelerate: return "Pointer_Accelerate"; break; - case XK_Pointer_DfltBtnNext: return "Pointer_DfltBtnNext"; break; - case XK_Pointer_DfltBtnPrev: return "Pointer_DfltBtnPrev"; break; - case XK_ch: return "ch"; break; - case XK_Ch: return "Ch"; break; - case XK_CH: return "CH"; break; - case XK_c_h: return "c_h"; break; - case XK_C_h: return "C_h"; break; - case XK_C_H: return "C_H"; break; - case XK_3270_Duplicate: return "3270_Duplicate"; break; - case XK_3270_FieldMark: return "3270_FieldMark"; break; - case XK_3270_Right2: return "3270_Right2"; break; - case XK_3270_Left2: return "3270_Left2"; break; - case XK_3270_BackTab: return "3270_BackTab"; break; - case XK_3270_EraseEOF: return "3270_EraseEOF"; break; - case XK_3270_EraseInput: return "3270_EraseInput"; break; - case XK_3270_Reset: return "3270_Reset"; break; - case XK_3270_Quit: return "3270_Quit"; break; - case XK_3270_PA1: return "3270_PA1"; break; - case XK_3270_PA2: return "3270_PA2"; break; - case XK_3270_PA3: return "3270_PA3"; break; - case XK_3270_Test: return "3270_Test"; break; - case XK_3270_Attn: return "3270_Attn"; break; - case XK_3270_CursorBlink: return "3270_CursorBlink"; break; - case XK_3270_AltCursor: return "3270_AltCursor"; break; - case XK_3270_KeyClick: return "3270_KeyClick"; break; - case XK_3270_Jump: return "3270_Jump"; break; - case XK_3270_Ident: return "3270_Ident"; break; - case XK_3270_Rule: return "3270_Rule"; break; - case XK_3270_Copy: return "3270_Copy"; break; - case XK_3270_Play: return "3270_Play"; break; - case XK_3270_Setup: return "3270_Setup"; break; - case XK_3270_Record: return "3270_Record"; break; - case XK_3270_ChangeScreen: return "3270_ChangeScreen"; break; - case XK_3270_DeleteWord: return "3270_DeleteWord"; break; - case XK_3270_ExSelect: return "3270_ExSelect"; break; - case XK_3270_CursorSelect: return "3270_CursorSelect"; break; - case XK_3270_PrintScreen: return "3270_PrintScreen"; break; - case XK_3270_Enter: return "3270_Enter"; break; - case XK_space: return "space"; break; - case XK_exclam: return "exclam"; break; - case XK_quotedbl: return "quotedbl"; break; - case XK_numbersign: return "numbersign"; break; - case XK_dollar: return "dollar"; break; - case XK_percent: return "percent"; break; - case XK_ampersand: return "ampersand"; break; - case XK_apostrophe: return "apostrophe"; break; - case XK_parenleft: return "parenleft"; break; - case XK_parenright: return "parenright"; break; - case XK_asterisk: return "asterisk"; break; - case XK_plus: return "plus"; break; - case XK_comma: return "comma"; break; - case XK_minus: return "minus"; break; - case XK_period: return "period"; break; - case XK_slash: return "slash"; break; - case XK_0: return "0"; break; - case XK_1: return "1"; break; - case XK_2: return "2"; break; - case XK_3: return "3"; break; - case XK_4: return "4"; break; - case XK_5: return "5"; break; - case XK_6: return "6"; break; - case XK_7: return "7"; break; - case XK_8: return "8"; break; - case XK_9: return "9"; break; - case XK_colon: return "colon"; break; - case XK_semicolon: return "semicolon"; break; - case XK_less: return "less"; break; - case XK_equal: return "equal"; break; - case XK_greater: return "greater"; break; - case XK_question: return "question"; break; - case XK_at: return "at"; break; - case XK_A: return "A"; break; - case XK_B: return "B"; break; - case XK_C: return "C"; break; - case XK_D: return "D"; break; - case XK_E: return "E"; break; - case XK_F: return "F"; break; - case XK_G: return "G"; break; - case XK_H: return "H"; break; - case XK_I: return "I"; break; - case XK_J: return "J"; break; - case XK_K: return "K"; break; - case XK_L: return "L"; break; - case XK_M: return "M"; break; - case XK_N: return "N"; break; - case XK_O: return "O"; break; - case XK_P: return "P"; break; - case XK_Q: return "Q"; break; - case XK_R: return "R"; break; - case XK_S: return "S"; break; - case XK_T: return "T"; break; - case XK_U: return "U"; break; - case XK_V: return "V"; break; - case XK_W: return "W"; break; - case XK_X: return "X"; break; - case XK_Y: return "Y"; break; - case XK_Z: return "Z"; break; - case XK_bracketleft: return "bracketleft"; break; - case XK_backslash: return "backslash"; break; - case XK_bracketright: return "bracketright"; break; - case XK_asciicircum: return "asciicircum"; break; - case XK_underscore: return "underscore"; break; - case XK_grave: return "grave"; break; - case XK_a: return "a"; break; - case XK_b: return "b"; break; - case XK_c: return "c"; break; - case XK_d: return "d"; break; - case XK_e: return "e"; break; - case XK_f: return "f"; break; - case XK_g: return "g"; break; - case XK_h: return "h"; break; - case XK_i: return "i"; break; - case XK_j: return "j"; break; - case XK_k: return "k"; break; - case XK_l: return "l"; break; - case XK_m: return "m"; break; - case XK_n: return "n"; break; - case XK_o: return "o"; break; - case XK_p: return "p"; break; - case XK_q: return "q"; break; - case XK_r: return "r"; break; - case XK_s: return "s"; break; - case XK_t: return "t"; break; - case XK_u: return "u"; break; - case XK_v: return "v"; break; - case XK_w: return "w"; break; - case XK_x: return "x"; break; - case XK_y: return "y"; break; - case XK_z: return "z"; break; - case XK_braceleft: return "braceleft"; break; - case XK_bar: return "bar"; break; - case XK_braceright: return "braceright"; break; - case XK_asciitilde: return "asciitilde"; break; - case XK_nobreakspace: return "nobreakspace"; break; - case XK_exclamdown: return "exclamdown"; break; - case XK_cent: return "cent"; break; - case XK_sterling: return "sterling"; break; - case XK_currency: return "currency"; break; - case XK_yen: return "yen"; break; - case XK_brokenbar: return "brokenbar"; break; - case XK_section: return "section"; break; - case XK_diaeresis: return "diaeresis"; break; - case XK_copyright: return "copyright"; break; - case XK_ordfeminine: return "ordfeminine"; break; - case XK_guillemotleft: return "guillemotleft"; break; - case XK_notsign: return "notsign"; break; - case XK_hyphen: return "hyphen"; break; - case XK_registered: return "registered"; break; - case XK_macron: return "macron"; break; - case XK_degree: return "degree"; break; - case XK_plusminus: return "plusminus"; break; - case XK_twosuperior: return "twosuperior"; break; - case XK_threesuperior: return "threesuperior"; break; - case XK_acute: return "acute"; break; - case XK_mu: return "mu"; break; - case XK_paragraph: return "paragraph"; break; - case XK_periodcentered: return "periodcentered"; break; - case XK_cedilla: return "cedilla"; break; - case XK_onesuperior: return "onesuperior"; break; - case XK_masculine: return "masculine"; break; - case XK_guillemotright: return "guillemotright"; break; - case XK_onequarter: return "onequarter"; break; - case XK_onehalf: return "onehalf"; break; - case XK_threequarters: return "threequarters"; break; - case XK_questiondown: return "questiondown"; break; - case XK_Agrave: return "Agrave"; break; - case XK_Aacute: return "Aacute"; break; - case XK_Acircumflex: return "Acircumflex"; break; - case XK_Atilde: return "Atilde"; break; - case XK_Adiaeresis: return "Adiaeresis"; break; - case XK_Aring: return "Aring"; break; - case XK_AE: return "AE"; break; - case XK_Ccedilla: return "Ccedilla"; break; - case XK_Egrave: return "Egrave"; break; - case XK_Eacute: return "Eacute"; break; - case XK_Ecircumflex: return "Ecircumflex"; break; - case XK_Ediaeresis: return "Ediaeresis"; break; - case XK_Igrave: return "Igrave"; break; - case XK_Iacute: return "Iacute"; break; - case XK_Icircumflex: return "Icircumflex"; break; - case XK_Idiaeresis: return "Idiaeresis"; break; - case XK_ETH: return "ETH"; break; - case XK_Ntilde: return "Ntilde"; break; - case XK_Ograve: return "Ograve"; break; - case XK_Oacute: return "Oacute"; break; - case XK_Ocircumflex: return "Ocircumflex"; break; - case XK_Otilde: return "Otilde"; break; - case XK_Odiaeresis: return "Odiaeresis"; break; - case XK_multiply: return "multiply"; break; - case XK_Oslash: return "Oslash"; break; - case XK_Ugrave: return "Ugrave"; break; - case XK_Uacute: return "Uacute"; break; - case XK_Ucircumflex: return "Ucircumflex"; break; - case XK_Udiaeresis: return "Udiaeresis"; break; - case XK_Yacute: return "Yacute"; break; - case XK_THORN: return "THORN"; break; - case XK_ssharp: return "ssharp"; break; - case XK_agrave: return "agrave"; break; - case XK_aacute: return "aacute"; break; - case XK_acircumflex: return "acircumflex"; break; - case XK_atilde: return "atilde"; break; - case XK_adiaeresis: return "adiaeresis"; break; - case XK_aring: return "aring"; break; - case XK_ae: return "ae"; break; - case XK_ccedilla: return "ccedilla"; break; - case XK_egrave: return "egrave"; break; - case XK_eacute: return "eacute"; break; - case XK_ecircumflex: return "ecircumflex"; break; - case XK_ediaeresis: return "ediaeresis"; break; - case XK_igrave: return "igrave"; break; - case XK_iacute: return "iacute"; break; - case XK_icircumflex: return "icircumflex"; break; - case XK_idiaeresis: return "idiaeresis"; break; - case XK_eth: return "eth"; break; - case XK_ntilde: return "ntilde"; break; - case XK_ograve: return "ograve"; break; - case XK_oacute: return "oacute"; break; - case XK_ocircumflex: return "ocircumflex"; break; - case XK_otilde: return "otilde"; break; - case XK_odiaeresis: return "odiaeresis"; break; - case XK_division: return "division"; break; - case XK_oslash: return "oslash"; break; - case XK_ugrave: return "ugrave"; break; - case XK_uacute: return "uacute"; break; - case XK_ucircumflex: return "ucircumflex"; break; - case XK_udiaeresis: return "udiaeresis"; break; - case XK_yacute: return "yacute"; break; - case XK_thorn: return "thorn"; break; - case XK_ydiaeresis: return "ydiaeresis"; break; - case XK_Aogonek: return "Aogonek"; break; - case XK_breve: return "breve"; break; - case XK_Lstroke: return "Lstroke"; break; - case XK_Lcaron: return "Lcaron"; break; - case XK_Sacute: return "Sacute"; break; - case XK_Scaron: return "Scaron"; break; - case XK_Tcaron: return "Tcaron"; break; - case XK_Zacute: return "Zacute"; break; - case XK_Zcaron: return "Zcaron"; break; - case XK_Zabovedot: return "Zabovedot"; break; - case XK_aogonek: return "aogonek"; break; - case XK_ogonek: return "ogonek"; break; - case XK_lstroke: return "lstroke"; break; - case XK_lcaron: return "lcaron"; break; - case XK_sacute: return "sacute"; break; - case XK_caron: return "caron"; break; - case XK_scaron: return "scaron"; break; - case XK_scedilla: return "scedilla"; break; - case XK_tcaron: return "tcaron"; break; - case XK_zacute: return "zacute"; break; - case XK_doubleacute: return "doubleacute"; break; - case XK_zcaron: return "zcaron"; break; - case XK_zabovedot: return "zabovedot"; break; - case XK_Racute: return "Racute"; break; - case XK_Abreve: return "Abreve"; break; - case XK_Lacute: return "Lacute"; break; - case XK_Cacute: return "Cacute"; break; - case XK_Ccaron: return "Ccaron"; break; - case XK_Eogonek: return "Eogonek"; break; - case XK_Ecaron: return "Ecaron"; break; - case XK_Dcaron: return "Dcaron"; break; - case XK_Dstroke: return "Dstroke"; break; - case XK_Nacute: return "Nacute"; break; - case XK_Ncaron: return "Ncaron"; break; - case XK_Odoubleacute: return "Odoubleacute"; break; - case XK_Rcaron: return "Rcaron"; break; - case XK_Uring: return "Uring"; break; - case XK_Udoubleacute: return "Udoubleacute"; break; - case XK_Tcedilla: return "Tcedilla"; break; - case XK_racute: return "racute"; break; - case XK_abreve: return "abreve"; break; - case XK_lacute: return "lacute"; break; - case XK_cacute: return "cacute"; break; - case XK_ccaron: return "ccaron"; break; - case XK_eogonek: return "eogonek"; break; - case XK_ecaron: return "ecaron"; break; - case XK_dcaron: return "dcaron"; break; - case XK_dstroke: return "dstroke"; break; - case XK_nacute: return "nacute"; break; - case XK_ncaron: return "ncaron"; break; - case XK_odoubleacute: return "odoubleacute"; break; - case XK_rcaron: return "rcaron"; break; - case XK_uring: return "uring"; break; - case XK_udoubleacute: return "udoubleacute"; break; - case XK_tcedilla: return "tcedilla"; break; - case XK_abovedot: return "abovedot"; break; - case XK_Hstroke: return "Hstroke"; break; - case XK_Hcircumflex: return "Hcircumflex"; break; - case XK_Iabovedot: return "Iabovedot"; break; - case XK_Gbreve: return "Gbreve"; break; - case XK_Jcircumflex: return "Jcircumflex"; break; - case XK_hstroke: return "hstroke"; break; - case XK_hcircumflex: return "hcircumflex"; break; - case XK_idotless: return "idotless"; break; - case XK_gbreve: return "gbreve"; break; - case XK_jcircumflex: return "jcircumflex"; break; - case XK_Cabovedot: return "Cabovedot"; break; - case XK_Ccircumflex: return "Ccircumflex"; break; - case XK_Gabovedot: return "Gabovedot"; break; - case XK_Gcircumflex: return "Gcircumflex"; break; - case XK_Ubreve: return "Ubreve"; break; - case XK_Scircumflex: return "Scircumflex"; break; - case XK_cabovedot: return "cabovedot"; break; - case XK_ccircumflex: return "ccircumflex"; break; - case XK_gabovedot: return "gabovedot"; break; - case XK_gcircumflex: return "gcircumflex"; break; - case XK_ubreve: return "ubreve"; break; - case XK_scircumflex: return "scircumflex"; break; - case XK_kra: return "kra"; break; - case XK_Rcedilla: return "Rcedilla"; break; - case XK_Itilde: return "Itilde"; break; - case XK_Lcedilla: return "Lcedilla"; break; - case XK_Emacron: return "Emacron"; break; - case XK_Gcedilla: return "Gcedilla"; break; - case XK_Tslash: return "Tslash"; break; - case XK_rcedilla: return "rcedilla"; break; - case XK_itilde: return "itilde"; break; - case XK_lcedilla: return "lcedilla"; break; - case XK_emacron: return "emacron"; break; - case XK_gcedilla: return "gcedilla"; break; - case XK_tslash: return "tslash"; break; - case XK_ENG: return "ENG"; break; - case XK_eng: return "eng"; break; - case XK_Amacron: return "Amacron"; break; - case XK_Iogonek: return "Iogonek"; break; - case XK_Eabovedot: return "Eabovedot"; break; - case XK_Imacron: return "Imacron"; break; - case XK_Ncedilla: return "Ncedilla"; break; - case XK_Omacron: return "Omacron"; break; - case XK_Kcedilla: return "Kcedilla"; break; - case XK_Uogonek: return "Uogonek"; break; - case XK_Utilde: return "Utilde"; break; - case XK_Umacron: return "Umacron"; break; - case XK_amacron: return "amacron"; break; - case XK_iogonek: return "iogonek"; break; - case XK_eabovedot: return "eabovedot"; break; - case XK_imacron: return "imacron"; break; - case XK_ncedilla: return "ncedilla"; break; - case XK_omacron: return "omacron"; break; - case XK_kcedilla: return "kcedilla"; break; - case XK_uogonek: return "uogonek"; break; - case XK_utilde: return "utilde"; break; - case XK_umacron: return "umacron"; break; - case XK_Wcircumflex: return "Wcircumflex"; break; - case XK_wcircumflex: return "wcircumflex"; break; - case XK_Ycircumflex: return "Ycircumflex"; break; - case XK_ycircumflex: return "ycircumflex"; break; - case XK_Babovedot: return "Babovedot"; break; - case XK_babovedot: return "babovedot"; break; - case XK_Dabovedot: return "Dabovedot"; break; - case XK_dabovedot: return "dabovedot"; break; - case XK_Fabovedot: return "Fabovedot"; break; - case XK_fabovedot: return "fabovedot"; break; - case XK_Mabovedot: return "Mabovedot"; break; - case XK_mabovedot: return "mabovedot"; break; - case XK_Pabovedot: return "Pabovedot"; break; - case XK_pabovedot: return "pabovedot"; break; - case XK_Sabovedot: return "Sabovedot"; break; - case XK_sabovedot: return "sabovedot"; break; - case XK_Tabovedot: return "Tabovedot"; break; - case XK_tabovedot: return "tabovedot"; break; - case XK_Wgrave: return "Wgrave"; break; - case XK_wgrave: return "wgrave"; break; - case XK_Wacute: return "Wacute"; break; - case XK_wacute: return "wacute"; break; - case XK_Wdiaeresis: return "Wdiaeresis"; break; - case XK_wdiaeresis: return "wdiaeresis"; break; - case XK_Ygrave: return "Ygrave"; break; - case XK_ygrave: return "ygrave"; break; - case XK_OE: return "OE"; break; - case XK_oe: return "oe"; break; - case XK_Ydiaeresis: return "Ydiaeresis"; break; - case XK_overline: return "overline"; break; - case XK_kana_fullstop: return "kana_fullstop"; break; - case XK_kana_openingbracket: return "kana_openingbracket"; break; - case XK_kana_closingbracket: return "kana_closingbracket"; break; - case XK_kana_comma: return "kana_comma"; break; - case XK_kana_conjunctive: return "kana_conjunctive"; break; - case XK_kana_WO: return "kana_WO"; break; - case XK_kana_a: return "kana_a"; break; - case XK_kana_i: return "kana_i"; break; - case XK_kana_u: return "kana_u"; break; - case XK_kana_e: return "kana_e"; break; - case XK_kana_o: return "kana_o"; break; - case XK_kana_ya: return "kana_ya"; break; - case XK_kana_yu: return "kana_yu"; break; - case XK_kana_yo: return "kana_yo"; break; - case XK_kana_tsu: return "kana_tsu"; break; - case XK_prolongedsound: return "prolongedsound"; break; - case XK_kana_A: return "kana_A"; break; - case XK_kana_I: return "kana_I"; break; - case XK_kana_U: return "kana_U"; break; - case XK_kana_E: return "kana_E"; break; - case XK_kana_O: return "kana_O"; break; - case XK_kana_KA: return "kana_KA"; break; - case XK_kana_KI: return "kana_KI"; break; - case XK_kana_KU: return "kana_KU"; break; - case XK_kana_KE: return "kana_KE"; break; - case XK_kana_KO: return "kana_KO"; break; - case XK_kana_SA: return "kana_SA"; break; - case XK_kana_SHI: return "kana_SHI"; break; - case XK_kana_SU: return "kana_SU"; break; - case XK_kana_SE: return "kana_SE"; break; - case XK_kana_SO: return "kana_SO"; break; - case XK_kana_TA: return "kana_TA"; break; - case XK_kana_CHI: return "kana_CHI"; break; - case XK_kana_TSU: return "kana_TSU"; break; - case XK_kana_TE: return "kana_TE"; break; - case XK_kana_TO: return "kana_TO"; break; - case XK_kana_NA: return "kana_NA"; break; - case XK_kana_NI: return "kana_NI"; break; - case XK_kana_NU: return "kana_NU"; break; - case XK_kana_NE: return "kana_NE"; break; - case XK_kana_NO: return "kana_NO"; break; - case XK_kana_HA: return "kana_HA"; break; - case XK_kana_HI: return "kana_HI"; break; - case XK_kana_FU: return "kana_FU"; break; - case XK_kana_HE: return "kana_HE"; break; - case XK_kana_HO: return "kana_HO"; break; - case XK_kana_MA: return "kana_MA"; break; - case XK_kana_MI: return "kana_MI"; break; - case XK_kana_MU: return "kana_MU"; break; - case XK_kana_ME: return "kana_ME"; break; - case XK_kana_MO: return "kana_MO"; break; - case XK_kana_YA: return "kana_YA"; break; - case XK_kana_YU: return "kana_YU"; break; - case XK_kana_YO: return "kana_YO"; break; - case XK_kana_RA: return "kana_RA"; break; - case XK_kana_RI: return "kana_RI"; break; - case XK_kana_RU: return "kana_RU"; break; - case XK_kana_RE: return "kana_RE"; break; - case XK_kana_RO: return "kana_RO"; break; - case XK_kana_WA: return "kana_WA"; break; - case XK_kana_N: return "kana_N"; break; - case XK_voicedsound: return "voicedsound"; break; - case XK_semivoicedsound: return "semivoicedsound"; break; - case XK_Farsi_0: return "Farsi_0"; break; - case XK_Farsi_1: return "Farsi_1"; break; - case XK_Farsi_2: return "Farsi_2"; break; - case XK_Farsi_3: return "Farsi_3"; break; - case XK_Farsi_4: return "Farsi_4"; break; - case XK_Farsi_5: return "Farsi_5"; break; - case XK_Farsi_6: return "Farsi_6"; break; - case XK_Farsi_7: return "Farsi_7"; break; - case XK_Farsi_8: return "Farsi_8"; break; - case XK_Farsi_9: return "Farsi_9"; break; - case XK_Arabic_percent: return "Arabic_percent"; break; - case XK_Arabic_superscript_alef: return "Arabic_superscript_alef"; break; - case XK_Arabic_tteh: return "Arabic_tteh"; break; - case XK_Arabic_peh: return "Arabic_peh"; break; - case XK_Arabic_tcheh: return "Arabic_tcheh"; break; - case XK_Arabic_ddal: return "Arabic_ddal"; break; - case XK_Arabic_rreh: return "Arabic_rreh"; break; - case XK_Arabic_comma: return "Arabic_comma"; break; - case XK_Arabic_fullstop: return "Arabic_fullstop"; break; - case XK_Arabic_0: return "Arabic_0"; break; - case XK_Arabic_1: return "Arabic_1"; break; - case XK_Arabic_2: return "Arabic_2"; break; - case XK_Arabic_3: return "Arabic_3"; break; - case XK_Arabic_4: return "Arabic_4"; break; - case XK_Arabic_5: return "Arabic_5"; break; - case XK_Arabic_6: return "Arabic_6"; break; - case XK_Arabic_7: return "Arabic_7"; break; - case XK_Arabic_8: return "Arabic_8"; break; - case XK_Arabic_9: return "Arabic_9"; break; - case XK_Arabic_semicolon: return "Arabic_semicolon"; break; - case XK_Arabic_question_mark: return "Arabic_question_mark"; break; - case XK_Arabic_hamza: return "Arabic_hamza"; break; - case XK_Arabic_maddaonalef: return "Arabic_maddaonalef"; break; - case XK_Arabic_hamzaonalef: return "Arabic_hamzaonalef"; break; - case XK_Arabic_hamzaonwaw: return "Arabic_hamzaonwaw"; break; - case XK_Arabic_hamzaunderalef: return "Arabic_hamzaunderalef"; break; - case XK_Arabic_hamzaonyeh: return "Arabic_hamzaonyeh"; break; - case XK_Arabic_alef: return "Arabic_alef"; break; - case XK_Arabic_beh: return "Arabic_beh"; break; - case XK_Arabic_tehmarbuta: return "Arabic_tehmarbuta"; break; - case XK_Arabic_teh: return "Arabic_teh"; break; - case XK_Arabic_theh: return "Arabic_theh"; break; - case XK_Arabic_jeem: return "Arabic_jeem"; break; - case XK_Arabic_hah: return "Arabic_hah"; break; - case XK_Arabic_khah: return "Arabic_khah"; break; - case XK_Arabic_dal: return "Arabic_dal"; break; - case XK_Arabic_thal: return "Arabic_thal"; break; - case XK_Arabic_ra: return "Arabic_ra"; break; - case XK_Arabic_zain: return "Arabic_zain"; break; - case XK_Arabic_seen: return "Arabic_seen"; break; - case XK_Arabic_sheen: return "Arabic_sheen"; break; - case XK_Arabic_sad: return "Arabic_sad"; break; - case XK_Arabic_dad: return "Arabic_dad"; break; - case XK_Arabic_tah: return "Arabic_tah"; break; - case XK_Arabic_zah: return "Arabic_zah"; break; - case XK_Arabic_ain: return "Arabic_ain"; break; - case XK_Arabic_ghain: return "Arabic_ghain"; break; - case XK_Arabic_tatweel: return "Arabic_tatweel"; break; - case XK_Arabic_feh: return "Arabic_feh"; break; - case XK_Arabic_qaf: return "Arabic_qaf"; break; - case XK_Arabic_kaf: return "Arabic_kaf"; break; - case XK_Arabic_lam: return "Arabic_lam"; break; - case XK_Arabic_meem: return "Arabic_meem"; break; - case XK_Arabic_noon: return "Arabic_noon"; break; - case XK_Arabic_ha: return "Arabic_ha"; break; - case XK_Arabic_waw: return "Arabic_waw"; break; - case XK_Arabic_alefmaksura: return "Arabic_alefmaksura"; break; - case XK_Arabic_yeh: return "Arabic_yeh"; break; - case XK_Arabic_fathatan: return "Arabic_fathatan"; break; - case XK_Arabic_dammatan: return "Arabic_dammatan"; break; - case XK_Arabic_kasratan: return "Arabic_kasratan"; break; - case XK_Arabic_fatha: return "Arabic_fatha"; break; - case XK_Arabic_damma: return "Arabic_damma"; break; - case XK_Arabic_kasra: return "Arabic_kasra"; break; - case XK_Arabic_shadda: return "Arabic_shadda"; break; - case XK_Arabic_sukun: return "Arabic_sukun"; break; - case XK_Arabic_madda_above: return "Arabic_madda_above"; break; - case XK_Arabic_hamza_above: return "Arabic_hamza_above"; break; - case XK_Arabic_hamza_below: return "Arabic_hamza_below"; break; - case XK_Arabic_jeh: return "Arabic_jeh"; break; - case XK_Arabic_veh: return "Arabic_veh"; break; - case XK_Arabic_keheh: return "Arabic_keheh"; break; - case XK_Arabic_gaf: return "Arabic_gaf"; break; - case XK_Arabic_noon_ghunna: return "Arabic_noon_ghunna"; break; - case XK_Arabic_heh_doachashmee: return "Arabic_heh_doachashmee"; break; - case XK_Farsi_yeh: return "Farsi_yeh"; break; - case XK_Arabic_yeh_baree: return "Arabic_yeh_baree"; break; - case XK_Arabic_heh_goal: return "Arabic_heh_goal"; break; - case XK_Cyrillic_GHE_bar: return "Cyrillic_GHE_bar"; break; - case XK_Cyrillic_ghe_bar: return "Cyrillic_ghe_bar"; break; - case XK_Cyrillic_ZHE_descender: return "Cyrillic_ZHE_descender"; break; - case XK_Cyrillic_zhe_descender: return "Cyrillic_zhe_descender"; break; - case XK_Cyrillic_KA_descender: return "Cyrillic_KA_descender"; break; - case XK_Cyrillic_ka_descender: return "Cyrillic_ka_descender"; break; - case XK_Cyrillic_KA_vertstroke: return "Cyrillic_KA_vertstroke"; break; - case XK_Cyrillic_ka_vertstroke: return "Cyrillic_ka_vertstroke"; break; - case XK_Cyrillic_EN_descender: return "Cyrillic_EN_descender"; break; - case XK_Cyrillic_en_descender: return "Cyrillic_en_descender"; break; - case XK_Cyrillic_U_straight: return "Cyrillic_U_straight"; break; - case XK_Cyrillic_u_straight: return "Cyrillic_u_straight"; break; - case XK_Cyrillic_U_straight_bar: return "Cyrillic_U_straight_bar"; break; - case XK_Cyrillic_u_straight_bar: return "Cyrillic_u_straight_bar"; break; - case XK_Cyrillic_HA_descender: return "Cyrillic_HA_descender"; break; - case XK_Cyrillic_ha_descender: return "Cyrillic_ha_descender"; break; - case XK_Cyrillic_CHE_descender: return "Cyrillic_CHE_descender"; break; - case XK_Cyrillic_che_descender: return "Cyrillic_che_descender"; break; - case XK_Cyrillic_CHE_vertstroke: return "Cyrillic_CHE_vertstroke"; break; - case XK_Cyrillic_che_vertstroke: return "Cyrillic_che_vertstroke"; break; - case XK_Cyrillic_SHHA: return "Cyrillic_SHHA"; break; - case XK_Cyrillic_shha: return "Cyrillic_shha"; break; - case XK_Cyrillic_SCHWA: return "Cyrillic_SCHWA"; break; - case XK_Cyrillic_schwa: return "Cyrillic_schwa"; break; - case XK_Cyrillic_I_macron: return "Cyrillic_I_macron"; break; - case XK_Cyrillic_i_macron: return "Cyrillic_i_macron"; break; - case XK_Cyrillic_O_bar: return "Cyrillic_O_bar"; break; - case XK_Cyrillic_o_bar: return "Cyrillic_o_bar"; break; - case XK_Cyrillic_U_macron: return "Cyrillic_U_macron"; break; - case XK_Cyrillic_u_macron: return "Cyrillic_u_macron"; break; - case XK_Serbian_dje: return "Serbian_dje"; break; - case XK_Macedonia_gje: return "Macedonia_gje"; break; - case XK_Cyrillic_io: return "Cyrillic_io"; break; - case XK_Ukrainian_ie: return "Ukrainian_ie"; break; - case XK_Macedonia_dse: return "Macedonia_dse"; break; - case XK_Ukrainian_i: return "Ukrainian_i"; break; - case XK_Ukrainian_yi: return "Ukrainian_yi"; break; - case XK_Cyrillic_je: return "Cyrillic_je"; break; - case XK_Cyrillic_lje: return "Cyrillic_lje"; break; - case XK_Cyrillic_nje: return "Cyrillic_nje"; break; - case XK_Serbian_tshe: return "Serbian_tshe"; break; - case XK_Macedonia_kje: return "Macedonia_kje"; break; - case XK_Ukrainian_ghe_with_upturn: return "Ukrainian_ghe_with_upturn"; break; - case XK_Byelorussian_shortu: return "Byelorussian_shortu"; break; - case XK_Cyrillic_dzhe: return "Cyrillic_dzhe"; break; - case XK_numerosign: return "numerosign"; break; - case XK_Serbian_DJE: return "Serbian_DJE"; break; - case XK_Macedonia_GJE: return "Macedonia_GJE"; break; - case XK_Cyrillic_IO: return "Cyrillic_IO"; break; - case XK_Ukrainian_IE: return "Ukrainian_IE"; break; - case XK_Macedonia_DSE: return "Macedonia_DSE"; break; - case XK_Ukrainian_I: return "Ukrainian_I"; break; - case XK_Ukrainian_YI: return "Ukrainian_YI"; break; - case XK_Cyrillic_JE: return "Cyrillic_JE"; break; - case XK_Cyrillic_LJE: return "Cyrillic_LJE"; break; - case XK_Cyrillic_NJE: return "Cyrillic_NJE"; break; - case XK_Serbian_TSHE: return "Serbian_TSHE"; break; - case XK_Macedonia_KJE: return "Macedonia_KJE"; break; - case XK_Ukrainian_GHE_WITH_UPTURN: return "Ukrainian_GHE_WITH_UPTURN"; break; - case XK_Byelorussian_SHORTU: return "Byelorussian_SHORTU"; break; - case XK_Cyrillic_DZHE: return "Cyrillic_DZHE"; break; - case XK_Cyrillic_yu: return "Cyrillic_yu"; break; - case XK_Cyrillic_a: return "Cyrillic_a"; break; - case XK_Cyrillic_be: return "Cyrillic_be"; break; - case XK_Cyrillic_tse: return "Cyrillic_tse"; break; - case XK_Cyrillic_de: return "Cyrillic_de"; break; - case XK_Cyrillic_ie: return "Cyrillic_ie"; break; - case XK_Cyrillic_ef: return "Cyrillic_ef"; break; - case XK_Cyrillic_ghe: return "Cyrillic_ghe"; break; - case XK_Cyrillic_ha: return "Cyrillic_ha"; break; - case XK_Cyrillic_i: return "Cyrillic_i"; break; - case XK_Cyrillic_shorti: return "Cyrillic_shorti"; break; - case XK_Cyrillic_ka: return "Cyrillic_ka"; break; - case XK_Cyrillic_el: return "Cyrillic_el"; break; - case XK_Cyrillic_em: return "Cyrillic_em"; break; - case XK_Cyrillic_en: return "Cyrillic_en"; break; - case XK_Cyrillic_o: return "Cyrillic_o"; break; - case XK_Cyrillic_pe: return "Cyrillic_pe"; break; - case XK_Cyrillic_ya: return "Cyrillic_ya"; break; - case XK_Cyrillic_er: return "Cyrillic_er"; break; - case XK_Cyrillic_es: return "Cyrillic_es"; break; - case XK_Cyrillic_te: return "Cyrillic_te"; break; - case XK_Cyrillic_u: return "Cyrillic_u"; break; - case XK_Cyrillic_zhe: return "Cyrillic_zhe"; break; - case XK_Cyrillic_ve: return "Cyrillic_ve"; break; - case XK_Cyrillic_softsign: return "Cyrillic_softsign"; break; - case XK_Cyrillic_yeru: return "Cyrillic_yeru"; break; - case XK_Cyrillic_ze: return "Cyrillic_ze"; break; - case XK_Cyrillic_sha: return "Cyrillic_sha"; break; - case XK_Cyrillic_e: return "Cyrillic_e"; break; - case XK_Cyrillic_shcha: return "Cyrillic_shcha"; break; - case XK_Cyrillic_che: return "Cyrillic_che"; break; - case XK_Cyrillic_hardsign: return "Cyrillic_hardsign"; break; - case XK_Cyrillic_YU: return "Cyrillic_YU"; break; - case XK_Cyrillic_A: return "Cyrillic_A"; break; - case XK_Cyrillic_BE: return "Cyrillic_BE"; break; - case XK_Cyrillic_TSE: return "Cyrillic_TSE"; break; - case XK_Cyrillic_DE: return "Cyrillic_DE"; break; - case XK_Cyrillic_IE: return "Cyrillic_IE"; break; - case XK_Cyrillic_EF: return "Cyrillic_EF"; break; - case XK_Cyrillic_GHE: return "Cyrillic_GHE"; break; - case XK_Cyrillic_HA: return "Cyrillic_HA"; break; - case XK_Cyrillic_I: return "Cyrillic_I"; break; - case XK_Cyrillic_SHORTI: return "Cyrillic_SHORTI"; break; - case XK_Cyrillic_KA: return "Cyrillic_KA"; break; - case XK_Cyrillic_EL: return "Cyrillic_EL"; break; - case XK_Cyrillic_EM: return "Cyrillic_EM"; break; - case XK_Cyrillic_EN: return "Cyrillic_EN"; break; - case XK_Cyrillic_O: return "Cyrillic_O"; break; - case XK_Cyrillic_PE: return "Cyrillic_PE"; break; - case XK_Cyrillic_YA: return "Cyrillic_YA"; break; - case XK_Cyrillic_ER: return "Cyrillic_ER"; break; - case XK_Cyrillic_ES: return "Cyrillic_ES"; break; - case XK_Cyrillic_TE: return "Cyrillic_TE"; break; - case XK_Cyrillic_U: return "Cyrillic_U"; break; - case XK_Cyrillic_ZHE: return "Cyrillic_ZHE"; break; - case XK_Cyrillic_VE: return "Cyrillic_VE"; break; - case XK_Cyrillic_SOFTSIGN: return "Cyrillic_SOFTSIGN"; break; - case XK_Cyrillic_YERU: return "Cyrillic_YERU"; break; - case XK_Cyrillic_ZE: return "Cyrillic_ZE"; break; - case XK_Cyrillic_SHA: return "Cyrillic_SHA"; break; - case XK_Cyrillic_E: return "Cyrillic_E"; break; - case XK_Cyrillic_SHCHA: return "Cyrillic_SHCHA"; break; - case XK_Cyrillic_CHE: return "Cyrillic_CHE"; break; - case XK_Cyrillic_HARDSIGN: return "Cyrillic_HARDSIGN"; break; - case XK_Greek_ALPHAaccent: return "Greek_ALPHAaccent"; break; - case XK_Greek_EPSILONaccent: return "Greek_EPSILONaccent"; break; - case XK_Greek_ETAaccent: return "Greek_ETAaccent"; break; - case XK_Greek_IOTAaccent: return "Greek_IOTAaccent"; break; - case XK_Greek_IOTAdieresis: return "Greek_IOTAdieresis"; break; - case XK_Greek_OMICRONaccent: return "Greek_OMICRONaccent"; break; - case XK_Greek_UPSILONaccent: return "Greek_UPSILONaccent"; break; - case XK_Greek_UPSILONdieresis: return "Greek_UPSILONdieresis"; break; - case XK_Greek_OMEGAaccent: return "Greek_OMEGAaccent"; break; - case XK_Greek_accentdieresis: return "Greek_accentdieresis"; break; - case XK_Greek_horizbar: return "Greek_horizbar"; break; - case XK_Greek_alphaaccent: return "Greek_alphaaccent"; break; - case XK_Greek_epsilonaccent: return "Greek_epsilonaccent"; break; - case XK_Greek_etaaccent: return "Greek_etaaccent"; break; - case XK_Greek_iotaaccent: return "Greek_iotaaccent"; break; - case XK_Greek_iotadieresis: return "Greek_iotadieresis"; break; - case XK_Greek_iotaaccentdieresis: return "Greek_iotaaccentdieresis"; break; - case XK_Greek_omicronaccent: return "Greek_omicronaccent"; break; - case XK_Greek_upsilonaccent: return "Greek_upsilonaccent"; break; - case XK_Greek_upsilondieresis: return "Greek_upsilondieresis"; break; - case XK_Greek_upsilonaccentdieresis: return "Greek_upsilonaccentdieresis"; break; - case XK_Greek_omegaaccent: return "Greek_omegaaccent"; break; - case XK_Greek_ALPHA: return "Greek_ALPHA"; break; - case XK_Greek_BETA: return "Greek_BETA"; break; - case XK_Greek_GAMMA: return "Greek_GAMMA"; break; - case XK_Greek_DELTA: return "Greek_DELTA"; break; - case XK_Greek_EPSILON: return "Greek_EPSILON"; break; - case XK_Greek_ZETA: return "Greek_ZETA"; break; - case XK_Greek_ETA: return "Greek_ETA"; break; - case XK_Greek_THETA: return "Greek_THETA"; break; - case XK_Greek_IOTA: return "Greek_IOTA"; break; - case XK_Greek_KAPPA: return "Greek_KAPPA"; break; - case XK_Greek_LAMDA: return "Greek_LAMDA"; break; - case XK_Greek_MU: return "Greek_MU"; break; - case XK_Greek_NU: return "Greek_NU"; break; - case XK_Greek_XI: return "Greek_XI"; break; - case XK_Greek_OMICRON: return "Greek_OMICRON"; break; - case XK_Greek_PI: return "Greek_PI"; break; - case XK_Greek_RHO: return "Greek_RHO"; break; - case XK_Greek_SIGMA: return "Greek_SIGMA"; break; - case XK_Greek_TAU: return "Greek_TAU"; break; - case XK_Greek_UPSILON: return "Greek_UPSILON"; break; - case XK_Greek_PHI: return "Greek_PHI"; break; - case XK_Greek_CHI: return "Greek_CHI"; break; - case XK_Greek_PSI: return "Greek_PSI"; break; - case XK_Greek_OMEGA: return "Greek_OMEGA"; break; - case XK_Greek_alpha: return "Greek_alpha"; break; - case XK_Greek_beta: return "Greek_beta"; break; - case XK_Greek_gamma: return "Greek_gamma"; break; - case XK_Greek_delta: return "Greek_delta"; break; - case XK_Greek_epsilon: return "Greek_epsilon"; break; - case XK_Greek_zeta: return "Greek_zeta"; break; - case XK_Greek_eta: return "Greek_eta"; break; - case XK_Greek_theta: return "Greek_theta"; break; - case XK_Greek_iota: return "Greek_iota"; break; - case XK_Greek_kappa: return "Greek_kappa"; break; - case XK_Greek_lamda: return "Greek_lamda"; break; - case XK_Greek_mu: return "Greek_mu"; break; - case XK_Greek_nu: return "Greek_nu"; break; - case XK_Greek_xi: return "Greek_xi"; break; - case XK_Greek_omicron: return "Greek_omicron"; break; - case XK_Greek_pi: return "Greek_pi"; break; - case XK_Greek_rho: return "Greek_rho"; break; - case XK_Greek_sigma: return "Greek_sigma"; break; - case XK_Greek_finalsmallsigma: return "Greek_finalsmallsigma"; break; - case XK_Greek_tau: return "Greek_tau"; break; - case XK_Greek_upsilon: return "Greek_upsilon"; break; - case XK_Greek_phi: return "Greek_phi"; break; - case XK_Greek_chi: return "Greek_chi"; break; - case XK_Greek_psi: return "Greek_psi"; break; - case XK_Greek_omega: return "Greek_omega"; break; - case XK_leftradical: return "leftradical"; break; - case XK_topleftradical: return "topleftradical"; break; - case XK_horizconnector: return "horizconnector"; break; - case XK_topintegral: return "topintegral"; break; - case XK_botintegral: return "botintegral"; break; - case XK_vertconnector: return "vertconnector"; break; - case XK_topleftsqbracket: return "topleftsqbracket"; break; - case XK_botleftsqbracket: return "botleftsqbracket"; break; - case XK_toprightsqbracket: return "toprightsqbracket"; break; - case XK_botrightsqbracket: return "botrightsqbracket"; break; - case XK_topleftparens: return "topleftparens"; break; - case XK_botleftparens: return "botleftparens"; break; - case XK_toprightparens: return "toprightparens"; break; - case XK_botrightparens: return "botrightparens"; break; - case XK_leftmiddlecurlybrace: return "leftmiddlecurlybrace"; break; - case XK_rightmiddlecurlybrace: return "rightmiddlecurlybrace"; break; - case XK_topleftsummation: return "topleftsummation"; break; - case XK_botleftsummation: return "botleftsummation"; break; - case XK_topvertsummationconnector: return "topvertsummationconnector"; break; - case XK_botvertsummationconnector: return "botvertsummationconnector"; break; - case XK_toprightsummation: return "toprightsummation"; break; - case XK_botrightsummation: return "botrightsummation"; break; - case XK_rightmiddlesummation: return "rightmiddlesummation"; break; - case XK_lessthanequal: return "lessthanequal"; break; - case XK_notequal: return "notequal"; break; - case XK_greaterthanequal: return "greaterthanequal"; break; - case XK_integral: return "integral"; break; - case XK_therefore: return "therefore"; break; - case XK_variation: return "variation"; break; - case XK_infinity: return "infinity"; break; - case XK_nabla: return "nabla"; break; - case XK_approximate: return "approximate"; break; - case XK_similarequal: return "similarequal"; break; - case XK_ifonlyif: return "ifonlyif"; break; - case XK_implies: return "implies"; break; - case XK_identical: return "identical"; break; - case XK_radical: return "radical"; break; - case XK_includedin: return "includedin"; break; - case XK_includes: return "includes"; break; - case XK_intersection: return "intersection"; break; - case XK_union: return "union"; break; - case XK_logicaland: return "logicaland"; break; - case XK_logicalor: return "logicalor"; break; - case XK_partialderivative: return "partialderivative"; break; - case XK_function: return "function"; break; - case XK_leftarrow: return "leftarrow"; break; - case XK_uparrow: return "uparrow"; break; - case XK_rightarrow: return "rightarrow"; break; - case XK_downarrow: return "downarrow"; break; - case XK_blank: return "blank"; break; - case XK_soliddiamond: return "soliddiamond"; break; - case XK_checkerboard: return "checkerboard"; break; - case XK_ht: return "ht"; break; - case XK_ff: return "ff"; break; - case XK_cr: return "cr"; break; - case XK_lf: return "lf"; break; - case XK_nl: return "nl"; break; - case XK_vt: return "vt"; break; - case XK_lowrightcorner: return "lowrightcorner"; break; - case XK_uprightcorner: return "uprightcorner"; break; - case XK_upleftcorner: return "upleftcorner"; break; - case XK_lowleftcorner: return "lowleftcorner"; break; - case XK_crossinglines: return "crossinglines"; break; - case XK_horizlinescan1: return "horizlinescan1"; break; - case XK_horizlinescan3: return "horizlinescan3"; break; - case XK_horizlinescan5: return "horizlinescan5"; break; - case XK_horizlinescan7: return "horizlinescan7"; break; - case XK_horizlinescan9: return "horizlinescan9"; break; - case XK_leftt: return "leftt"; break; - case XK_rightt: return "rightt"; break; - case XK_bott: return "bott"; break; - case XK_topt: return "topt"; break; - case XK_vertbar: return "vertbar"; break; - case XK_emspace: return "emspace"; break; - case XK_enspace: return "enspace"; break; - case XK_em3space: return "em3space"; break; - case XK_em4space: return "em4space"; break; - case XK_digitspace: return "digitspace"; break; - case XK_punctspace: return "punctspace"; break; - case XK_thinspace: return "thinspace"; break; - case XK_hairspace: return "hairspace"; break; - case XK_emdash: return "emdash"; break; - case XK_endash: return "endash"; break; - case XK_signifblank: return "signifblank"; break; - case XK_ellipsis: return "ellipsis"; break; - case XK_doubbaselinedot: return "doubbaselinedot"; break; - case XK_onethird: return "onethird"; break; - case XK_twothirds: return "twothirds"; break; - case XK_onefifth: return "onefifth"; break; - case XK_twofifths: return "twofifths"; break; - case XK_threefifths: return "threefifths"; break; - case XK_fourfifths: return "fourfifths"; break; - case XK_onesixth: return "onesixth"; break; - case XK_fivesixths: return "fivesixths"; break; - case XK_careof: return "careof"; break; - case XK_figdash: return "figdash"; break; - case XK_leftanglebracket: return "leftanglebracket"; break; - case XK_decimalpoint: return "decimalpoint"; break; - case XK_rightanglebracket: return "rightanglebracket"; break; - case XK_marker: return "marker"; break; - case XK_oneeighth: return "oneeighth"; break; - case XK_threeeighths: return "threeeighths"; break; - case XK_fiveeighths: return "fiveeighths"; break; - case XK_seveneighths: return "seveneighths"; break; - case XK_trademark: return "trademark"; break; - case XK_signaturemark: return "signaturemark"; break; - case XK_trademarkincircle: return "trademarkincircle"; break; - case XK_leftopentriangle: return "leftopentriangle"; break; - case XK_rightopentriangle: return "rightopentriangle"; break; - case XK_emopencircle: return "emopencircle"; break; - case XK_emopenrectangle: return "emopenrectangle"; break; - case XK_leftsinglequotemark: return "leftsinglequotemark"; break; - case XK_rightsinglequotemark: return "rightsinglequotemark"; break; - case XK_leftdoublequotemark: return "leftdoublequotemark"; break; - case XK_rightdoublequotemark: return "rightdoublequotemark"; break; - case XK_prescription: return "prescription"; break; - case XK_permille: return "permille"; break; - case XK_minutes: return "minutes"; break; - case XK_seconds: return "seconds"; break; - case XK_latincross: return "latincross"; break; - case XK_hexagram: return "hexagram"; break; - case XK_filledrectbullet: return "filledrectbullet"; break; - case XK_filledlefttribullet: return "filledlefttribullet"; break; - case XK_filledrighttribullet: return "filledrighttribullet"; break; - case XK_emfilledcircle: return "emfilledcircle"; break; - case XK_emfilledrect: return "emfilledrect"; break; - case XK_enopencircbullet: return "enopencircbullet"; break; - case XK_enopensquarebullet: return "enopensquarebullet"; break; - case XK_openrectbullet: return "openrectbullet"; break; - case XK_opentribulletup: return "opentribulletup"; break; - case XK_opentribulletdown: return "opentribulletdown"; break; - case XK_openstar: return "openstar"; break; - case XK_enfilledcircbullet: return "enfilledcircbullet"; break; - case XK_enfilledsqbullet: return "enfilledsqbullet"; break; - case XK_filledtribulletup: return "filledtribulletup"; break; - case XK_filledtribulletdown: return "filledtribulletdown"; break; - case XK_leftpointer: return "leftpointer"; break; - case XK_rightpointer: return "rightpointer"; break; - case XK_club: return "club"; break; - case XK_diamond: return "diamond"; break; - case XK_heart: return "heart"; break; - case XK_maltesecross: return "maltesecross"; break; - case XK_dagger: return "dagger"; break; - case XK_doubledagger: return "doubledagger"; break; - case XK_checkmark: return "checkmark"; break; - case XK_ballotcross: return "ballotcross"; break; - case XK_musicalsharp: return "musicalsharp"; break; - case XK_musicalflat: return "musicalflat"; break; - case XK_malesymbol: return "malesymbol"; break; - case XK_femalesymbol: return "femalesymbol"; break; - case XK_telephone: return "telephone"; break; - case XK_telephonerecorder: return "telephonerecorder"; break; - case XK_phonographcopyright: return "phonographcopyright"; break; - case XK_caret: return "caret"; break; - case XK_singlelowquotemark: return "singlelowquotemark"; break; - case XK_doublelowquotemark: return "doublelowquotemark"; break; - case XK_cursor: return "cursor"; break; - case XK_leftcaret: return "leftcaret"; break; - case XK_rightcaret: return "rightcaret"; break; - case XK_downcaret: return "downcaret"; break; - case XK_upcaret: return "upcaret"; break; - case XK_overbar: return "overbar"; break; - case XK_downtack: return "downtack"; break; - case XK_upshoe: return "upshoe"; break; - case XK_downstile: return "downstile"; break; - case XK_underbar: return "underbar"; break; - case XK_jot: return "jot"; break; - case XK_quad: return "quad"; break; - case XK_uptack: return "uptack"; break; - case XK_circle: return "circle"; break; - case XK_upstile: return "upstile"; break; - case XK_downshoe: return "downshoe"; break; - case XK_rightshoe: return "rightshoe"; break; - case XK_leftshoe: return "leftshoe"; break; - case XK_lefttack: return "lefttack"; break; - case XK_righttack: return "righttack"; break; - case XK_hebrew_doublelowline: return "hebrew_doublelowline"; break; - case XK_hebrew_aleph: return "hebrew_aleph"; break; - case XK_hebrew_bet: return "hebrew_bet"; break; - case XK_hebrew_gimel: return "hebrew_gimel"; break; - case XK_hebrew_dalet: return "hebrew_dalet"; break; - case XK_hebrew_he: return "hebrew_he"; break; - case XK_hebrew_waw: return "hebrew_waw"; break; - case XK_hebrew_zain: return "hebrew_zain"; break; - case XK_hebrew_chet: return "hebrew_chet"; break; - case XK_hebrew_tet: return "hebrew_tet"; break; - case XK_hebrew_yod: return "hebrew_yod"; break; - case XK_hebrew_finalkaph: return "hebrew_finalkaph"; break; - case XK_hebrew_kaph: return "hebrew_kaph"; break; - case XK_hebrew_lamed: return "hebrew_lamed"; break; - case XK_hebrew_finalmem: return "hebrew_finalmem"; break; - case XK_hebrew_mem: return "hebrew_mem"; break; - case XK_hebrew_finalnun: return "hebrew_finalnun"; break; - case XK_hebrew_nun: return "hebrew_nun"; break; - case XK_hebrew_samech: return "hebrew_samech"; break; - case XK_hebrew_ayin: return "hebrew_ayin"; break; - case XK_hebrew_finalpe: return "hebrew_finalpe"; break; - case XK_hebrew_pe: return "hebrew_pe"; break; - case XK_hebrew_finalzade: return "hebrew_finalzade"; break; - case XK_hebrew_zade: return "hebrew_zade"; break; - case XK_hebrew_qoph: return "hebrew_qoph"; break; - case XK_hebrew_resh: return "hebrew_resh"; break; - case XK_hebrew_shin: return "hebrew_shin"; break; - case XK_hebrew_taw: return "hebrew_taw"; break; - case XK_Thai_kokai: return "Thai_kokai"; break; - case XK_Thai_khokhai: return "Thai_khokhai"; break; - case XK_Thai_khokhuat: return "Thai_khokhuat"; break; - case XK_Thai_khokhwai: return "Thai_khokhwai"; break; - case XK_Thai_khokhon: return "Thai_khokhon"; break; - case XK_Thai_khorakhang: return "Thai_khorakhang"; break; - case XK_Thai_ngongu: return "Thai_ngongu"; break; - case XK_Thai_chochan: return "Thai_chochan"; break; - case XK_Thai_choching: return "Thai_choching"; break; - case XK_Thai_chochang: return "Thai_chochang"; break; - case XK_Thai_soso: return "Thai_soso"; break; - case XK_Thai_chochoe: return "Thai_chochoe"; break; - case XK_Thai_yoying: return "Thai_yoying"; break; - case XK_Thai_dochada: return "Thai_dochada"; break; - case XK_Thai_topatak: return "Thai_topatak"; break; - case XK_Thai_thothan: return "Thai_thothan"; break; - case XK_Thai_thonangmontho: return "Thai_thonangmontho"; break; - case XK_Thai_thophuthao: return "Thai_thophuthao"; break; - case XK_Thai_nonen: return "Thai_nonen"; break; - case XK_Thai_dodek: return "Thai_dodek"; break; - case XK_Thai_totao: return "Thai_totao"; break; - case XK_Thai_thothung: return "Thai_thothung"; break; - case XK_Thai_thothahan: return "Thai_thothahan"; break; - case XK_Thai_thothong: return "Thai_thothong"; break; - case XK_Thai_nonu: return "Thai_nonu"; break; - case XK_Thai_bobaimai: return "Thai_bobaimai"; break; - case XK_Thai_popla: return "Thai_popla"; break; - case XK_Thai_phophung: return "Thai_phophung"; break; - case XK_Thai_fofa: return "Thai_fofa"; break; - case XK_Thai_phophan: return "Thai_phophan"; break; - case XK_Thai_fofan: return "Thai_fofan"; break; - case XK_Thai_phosamphao: return "Thai_phosamphao"; break; - case XK_Thai_moma: return "Thai_moma"; break; - case XK_Thai_yoyak: return "Thai_yoyak"; break; - case XK_Thai_rorua: return "Thai_rorua"; break; - case XK_Thai_ru: return "Thai_ru"; break; - case XK_Thai_loling: return "Thai_loling"; break; - case XK_Thai_lu: return "Thai_lu"; break; - case XK_Thai_wowaen: return "Thai_wowaen"; break; - case XK_Thai_sosala: return "Thai_sosala"; break; - case XK_Thai_sorusi: return "Thai_sorusi"; break; - case XK_Thai_sosua: return "Thai_sosua"; break; - case XK_Thai_hohip: return "Thai_hohip"; break; - case XK_Thai_lochula: return "Thai_lochula"; break; - case XK_Thai_oang: return "Thai_oang"; break; - case XK_Thai_honokhuk: return "Thai_honokhuk"; break; - case XK_Thai_paiyannoi: return "Thai_paiyannoi"; break; - case XK_Thai_saraa: return "Thai_saraa"; break; - case XK_Thai_maihanakat: return "Thai_maihanakat"; break; - case XK_Thai_saraaa: return "Thai_saraaa"; break; - case XK_Thai_saraam: return "Thai_saraam"; break; - case XK_Thai_sarai: return "Thai_sarai"; break; - case XK_Thai_saraii: return "Thai_saraii"; break; - case XK_Thai_saraue: return "Thai_saraue"; break; - case XK_Thai_sarauee: return "Thai_sarauee"; break; - case XK_Thai_sarau: return "Thai_sarau"; break; - case XK_Thai_sarauu: return "Thai_sarauu"; break; - case XK_Thai_phinthu: return "Thai_phinthu"; break; - case XK_Thai_maihanakat_maitho: return "Thai_maihanakat_maitho"; break; - case XK_Thai_baht: return "Thai_baht"; break; - case XK_Thai_sarae: return "Thai_sarae"; break; - case XK_Thai_saraae: return "Thai_saraae"; break; - case XK_Thai_sarao: return "Thai_sarao"; break; - case XK_Thai_saraaimaimuan: return "Thai_saraaimaimuan"; break; - case XK_Thai_saraaimaimalai: return "Thai_saraaimaimalai"; break; - case XK_Thai_lakkhangyao: return "Thai_lakkhangyao"; break; - case XK_Thai_maiyamok: return "Thai_maiyamok"; break; - case XK_Thai_maitaikhu: return "Thai_maitaikhu"; break; - case XK_Thai_maiek: return "Thai_maiek"; break; - case XK_Thai_maitho: return "Thai_maitho"; break; - case XK_Thai_maitri: return "Thai_maitri"; break; - case XK_Thai_maichattawa: return "Thai_maichattawa"; break; - case XK_Thai_thanthakhat: return "Thai_thanthakhat"; break; - case XK_Thai_nikhahit: return "Thai_nikhahit"; break; - case XK_Thai_leksun: return "Thai_leksun"; break; - case XK_Thai_leknung: return "Thai_leknung"; break; - case XK_Thai_leksong: return "Thai_leksong"; break; - case XK_Thai_leksam: return "Thai_leksam"; break; - case XK_Thai_leksi: return "Thai_leksi"; break; - case XK_Thai_lekha: return "Thai_lekha"; break; - case XK_Thai_lekhok: return "Thai_lekhok"; break; - case XK_Thai_lekchet: return "Thai_lekchet"; break; - case XK_Thai_lekpaet: return "Thai_lekpaet"; break; - case XK_Thai_lekkao: return "Thai_lekkao"; break; - case XK_Hangul: return "Hangul"; break; - case XK_Hangul_Start: return "Hangul_Start"; break; - case XK_Hangul_End: return "Hangul_End"; break; - case XK_Hangul_Hanja: return "Hangul_Hanja"; break; - case XK_Hangul_Jamo: return "Hangul_Jamo"; break; - case XK_Hangul_Romaja: return "Hangul_Romaja"; break; - case XK_Hangul_Jeonja: return "Hangul_Jeonja"; break; - case XK_Hangul_Banja: return "Hangul_Banja"; break; - case XK_Hangul_PreHanja: return "Hangul_PreHanja"; break; - case XK_Hangul_PostHanja: return "Hangul_PostHanja"; break; - case XK_Hangul_Special: return "Hangul_Special"; break; - case XK_Hangul_Kiyeog: return "Hangul_Kiyeog"; break; - case XK_Hangul_SsangKiyeog: return "Hangul_SsangKiyeog"; break; - case XK_Hangul_KiyeogSios: return "Hangul_KiyeogSios"; break; - case XK_Hangul_Nieun: return "Hangul_Nieun"; break; - case XK_Hangul_NieunJieuj: return "Hangul_NieunJieuj"; break; - case XK_Hangul_NieunHieuh: return "Hangul_NieunHieuh"; break; - case XK_Hangul_Dikeud: return "Hangul_Dikeud"; break; - case XK_Hangul_SsangDikeud: return "Hangul_SsangDikeud"; break; - case XK_Hangul_Rieul: return "Hangul_Rieul"; break; - case XK_Hangul_RieulKiyeog: return "Hangul_RieulKiyeog"; break; - case XK_Hangul_RieulMieum: return "Hangul_RieulMieum"; break; - case XK_Hangul_RieulPieub: return "Hangul_RieulPieub"; break; - case XK_Hangul_RieulSios: return "Hangul_RieulSios"; break; - case XK_Hangul_RieulTieut: return "Hangul_RieulTieut"; break; - case XK_Hangul_RieulPhieuf: return "Hangul_RieulPhieuf"; break; - case XK_Hangul_RieulHieuh: return "Hangul_RieulHieuh"; break; - case XK_Hangul_Mieum: return "Hangul_Mieum"; break; - case XK_Hangul_Pieub: return "Hangul_Pieub"; break; - case XK_Hangul_SsangPieub: return "Hangul_SsangPieub"; break; - case XK_Hangul_PieubSios: return "Hangul_PieubSios"; break; - case XK_Hangul_Sios: return "Hangul_Sios"; break; - case XK_Hangul_SsangSios: return "Hangul_SsangSios"; break; - case XK_Hangul_Ieung: return "Hangul_Ieung"; break; - case XK_Hangul_Jieuj: return "Hangul_Jieuj"; break; - case XK_Hangul_SsangJieuj: return "Hangul_SsangJieuj"; break; - case XK_Hangul_Cieuc: return "Hangul_Cieuc"; break; - case XK_Hangul_Khieuq: return "Hangul_Khieuq"; break; - case XK_Hangul_Tieut: return "Hangul_Tieut"; break; - case XK_Hangul_Phieuf: return "Hangul_Phieuf"; break; - case XK_Hangul_Hieuh: return "Hangul_Hieuh"; break; - case XK_Hangul_A: return "Hangul_A"; break; - case XK_Hangul_AE: return "Hangul_AE"; break; - case XK_Hangul_YA: return "Hangul_YA"; break; - case XK_Hangul_YAE: return "Hangul_YAE"; break; - case XK_Hangul_EO: return "Hangul_EO"; break; - case XK_Hangul_E: return "Hangul_E"; break; - case XK_Hangul_YEO: return "Hangul_YEO"; break; - case XK_Hangul_YE: return "Hangul_YE"; break; - case XK_Hangul_O: return "Hangul_O"; break; - case XK_Hangul_WA: return "Hangul_WA"; break; - case XK_Hangul_WAE: return "Hangul_WAE"; break; - case XK_Hangul_OE: return "Hangul_OE"; break; - case XK_Hangul_YO: return "Hangul_YO"; break; - case XK_Hangul_U: return "Hangul_U"; break; - case XK_Hangul_WEO: return "Hangul_WEO"; break; - case XK_Hangul_WE: return "Hangul_WE"; break; - case XK_Hangul_WI: return "Hangul_WI"; break; - case XK_Hangul_YU: return "Hangul_YU"; break; - case XK_Hangul_EU: return "Hangul_EU"; break; - case XK_Hangul_YI: return "Hangul_YI"; break; - case XK_Hangul_I: return "Hangul_I"; break; - case XK_Hangul_J_Kiyeog: return "Hangul_J_Kiyeog"; break; - case XK_Hangul_J_SsangKiyeog: return "Hangul_J_SsangKiyeog"; break; - case XK_Hangul_J_KiyeogSios: return "Hangul_J_KiyeogSios"; break; - case XK_Hangul_J_Nieun: return "Hangul_J_Nieun"; break; - case XK_Hangul_J_NieunJieuj: return "Hangul_J_NieunJieuj"; break; - case XK_Hangul_J_NieunHieuh: return "Hangul_J_NieunHieuh"; break; - case XK_Hangul_J_Dikeud: return "Hangul_J_Dikeud"; break; - case XK_Hangul_J_Rieul: return "Hangul_J_Rieul"; break; - case XK_Hangul_J_RieulKiyeog: return "Hangul_J_RieulKiyeog"; break; - case XK_Hangul_J_RieulMieum: return "Hangul_J_RieulMieum"; break; - case XK_Hangul_J_RieulPieub: return "Hangul_J_RieulPieub"; break; - case XK_Hangul_J_RieulSios: return "Hangul_J_RieulSios"; break; - case XK_Hangul_J_RieulTieut: return "Hangul_J_RieulTieut"; break; - case XK_Hangul_J_RieulPhieuf: return "Hangul_J_RieulPhieuf"; break; - case XK_Hangul_J_RieulHieuh: return "Hangul_J_RieulHieuh"; break; - case XK_Hangul_J_Mieum: return "Hangul_J_Mieum"; break; - case XK_Hangul_J_Pieub: return "Hangul_J_Pieub"; break; - case XK_Hangul_J_PieubSios: return "Hangul_J_PieubSios"; break; - case XK_Hangul_J_Sios: return "Hangul_J_Sios"; break; - case XK_Hangul_J_SsangSios: return "Hangul_J_SsangSios"; break; - case XK_Hangul_J_Ieung: return "Hangul_J_Ieung"; break; - case XK_Hangul_J_Jieuj: return "Hangul_J_Jieuj"; break; - case XK_Hangul_J_Cieuc: return "Hangul_J_Cieuc"; break; - case XK_Hangul_J_Khieuq: return "Hangul_J_Khieuq"; break; - case XK_Hangul_J_Tieut: return "Hangul_J_Tieut"; break; - case XK_Hangul_J_Phieuf: return "Hangul_J_Phieuf"; break; - case XK_Hangul_J_Hieuh: return "Hangul_J_Hieuh"; break; - case XK_Hangul_RieulYeorinHieuh: return "Hangul_RieulYeorinHieuh"; break; - case XK_Hangul_SunkyeongeumMieum: return "Hangul_SunkyeongeumMieum"; break; - case XK_Hangul_SunkyeongeumPieub: return "Hangul_SunkyeongeumPieub"; break; - case XK_Hangul_PanSios: return "Hangul_PanSios"; break; - case XK_Hangul_KkogjiDalrinIeung: return "Hangul_KkogjiDalrinIeung"; break; - case XK_Hangul_SunkyeongeumPhieuf: return "Hangul_SunkyeongeumPhieuf"; break; - case XK_Hangul_YeorinHieuh: return "Hangul_YeorinHieuh"; break; - case XK_Hangul_AraeA: return "Hangul_AraeA"; break; - case XK_Hangul_AraeAE: return "Hangul_AraeAE"; break; - case XK_Hangul_J_PanSios: return "Hangul_J_PanSios"; break; - case XK_Hangul_J_KkogjiDalrinIeung: return "Hangul_J_KkogjiDalrinIeung"; break; - case XK_Hangul_J_YeorinHieuh: return "Hangul_J_YeorinHieuh"; break; - case XK_Korean_Won: return "Korean_Won"; break; - case XK_Armenian_ligature_ew: return "Armenian_ligature_ew"; break; - case XK_Armenian_full_stop: return "Armenian_full_stop"; break; - case XK_Armenian_separation_mark: return "Armenian_separation_mark"; break; - case XK_Armenian_hyphen: return "Armenian_hyphen"; break; - case XK_Armenian_exclam: return "Armenian_exclam"; break; - case XK_Armenian_accent: return "Armenian_accent"; break; - case XK_Armenian_question: return "Armenian_question"; break; - case XK_Armenian_AYB: return "Armenian_AYB"; break; - case XK_Armenian_ayb: return "Armenian_ayb"; break; - case XK_Armenian_BEN: return "Armenian_BEN"; break; - case XK_Armenian_ben: return "Armenian_ben"; break; - case XK_Armenian_GIM: return "Armenian_GIM"; break; - case XK_Armenian_gim: return "Armenian_gim"; break; - case XK_Armenian_DA: return "Armenian_DA"; break; - case XK_Armenian_da: return "Armenian_da"; break; - case XK_Armenian_YECH: return "Armenian_YECH"; break; - case XK_Armenian_yech: return "Armenian_yech"; break; - case XK_Armenian_ZA: return "Armenian_ZA"; break; - case XK_Armenian_za: return "Armenian_za"; break; - case XK_Armenian_E: return "Armenian_E"; break; - case XK_Armenian_e: return "Armenian_e"; break; - case XK_Armenian_AT: return "Armenian_AT"; break; - case XK_Armenian_at: return "Armenian_at"; break; - case XK_Armenian_TO: return "Armenian_TO"; break; - case XK_Armenian_to: return "Armenian_to"; break; - case XK_Armenian_ZHE: return "Armenian_ZHE"; break; - case XK_Armenian_zhe: return "Armenian_zhe"; break; - case XK_Armenian_INI: return "Armenian_INI"; break; - case XK_Armenian_ini: return "Armenian_ini"; break; - case XK_Armenian_LYUN: return "Armenian_LYUN"; break; - case XK_Armenian_lyun: return "Armenian_lyun"; break; - case XK_Armenian_KHE: return "Armenian_KHE"; break; - case XK_Armenian_khe: return "Armenian_khe"; break; - case XK_Armenian_TSA: return "Armenian_TSA"; break; - case XK_Armenian_tsa: return "Armenian_tsa"; break; - case XK_Armenian_KEN: return "Armenian_KEN"; break; - case XK_Armenian_ken: return "Armenian_ken"; break; - case XK_Armenian_HO: return "Armenian_HO"; break; - case XK_Armenian_ho: return "Armenian_ho"; break; - case XK_Armenian_DZA: return "Armenian_DZA"; break; - case XK_Armenian_dza: return "Armenian_dza"; break; - case XK_Armenian_GHAT: return "Armenian_GHAT"; break; - case XK_Armenian_ghat: return "Armenian_ghat"; break; - case XK_Armenian_TCHE: return "Armenian_TCHE"; break; - case XK_Armenian_tche: return "Armenian_tche"; break; - case XK_Armenian_MEN: return "Armenian_MEN"; break; - case XK_Armenian_men: return "Armenian_men"; break; - case XK_Armenian_HI: return "Armenian_HI"; break; - case XK_Armenian_hi: return "Armenian_hi"; break; - case XK_Armenian_NU: return "Armenian_NU"; break; - case XK_Armenian_nu: return "Armenian_nu"; break; - case XK_Armenian_SHA: return "Armenian_SHA"; break; - case XK_Armenian_sha: return "Armenian_sha"; break; - case XK_Armenian_VO: return "Armenian_VO"; break; - case XK_Armenian_vo: return "Armenian_vo"; break; - case XK_Armenian_CHA: return "Armenian_CHA"; break; - case XK_Armenian_cha: return "Armenian_cha"; break; - case XK_Armenian_PE: return "Armenian_PE"; break; - case XK_Armenian_pe: return "Armenian_pe"; break; - case XK_Armenian_JE: return "Armenian_JE"; break; - case XK_Armenian_je: return "Armenian_je"; break; - case XK_Armenian_RA: return "Armenian_RA"; break; - case XK_Armenian_ra: return "Armenian_ra"; break; - case XK_Armenian_SE: return "Armenian_SE"; break; - case XK_Armenian_se: return "Armenian_se"; break; - case XK_Armenian_VEV: return "Armenian_VEV"; break; - case XK_Armenian_vev: return "Armenian_vev"; break; - case XK_Armenian_TYUN: return "Armenian_TYUN"; break; - case XK_Armenian_tyun: return "Armenian_tyun"; break; - case XK_Armenian_RE: return "Armenian_RE"; break; - case XK_Armenian_re: return "Armenian_re"; break; - case XK_Armenian_TSO: return "Armenian_TSO"; break; - case XK_Armenian_tso: return "Armenian_tso"; break; - case XK_Armenian_VYUN: return "Armenian_VYUN"; break; - case XK_Armenian_vyun: return "Armenian_vyun"; break; - case XK_Armenian_PYUR: return "Armenian_PYUR"; break; - case XK_Armenian_pyur: return "Armenian_pyur"; break; - case XK_Armenian_KE: return "Armenian_KE"; break; - case XK_Armenian_ke: return "Armenian_ke"; break; - case XK_Armenian_O: return "Armenian_O"; break; - case XK_Armenian_o: return "Armenian_o"; break; - case XK_Armenian_FE: return "Armenian_FE"; break; - case XK_Armenian_fe: return "Armenian_fe"; break; - case XK_Armenian_apostrophe: return "Armenian_apostrophe"; break; - case XK_Georgian_an: return "Georgian_an"; break; - case XK_Georgian_ban: return "Georgian_ban"; break; - case XK_Georgian_gan: return "Georgian_gan"; break; - case XK_Georgian_don: return "Georgian_don"; break; - case XK_Georgian_en: return "Georgian_en"; break; - case XK_Georgian_vin: return "Georgian_vin"; break; - case XK_Georgian_zen: return "Georgian_zen"; break; - case XK_Georgian_tan: return "Georgian_tan"; break; - case XK_Georgian_in: return "Georgian_in"; break; - case XK_Georgian_kan: return "Georgian_kan"; break; - case XK_Georgian_las: return "Georgian_las"; break; - case XK_Georgian_man: return "Georgian_man"; break; - case XK_Georgian_nar: return "Georgian_nar"; break; - case XK_Georgian_on: return "Georgian_on"; break; - case XK_Georgian_par: return "Georgian_par"; break; - case XK_Georgian_zhar: return "Georgian_zhar"; break; - case XK_Georgian_rae: return "Georgian_rae"; break; - case XK_Georgian_san: return "Georgian_san"; break; - case XK_Georgian_tar: return "Georgian_tar"; break; - case XK_Georgian_un: return "Georgian_un"; break; - case XK_Georgian_phar: return "Georgian_phar"; break; - case XK_Georgian_khar: return "Georgian_khar"; break; - case XK_Georgian_ghan: return "Georgian_ghan"; break; - case XK_Georgian_qar: return "Georgian_qar"; break; - case XK_Georgian_shin: return "Georgian_shin"; break; - case XK_Georgian_chin: return "Georgian_chin"; break; - case XK_Georgian_can: return "Georgian_can"; break; - case XK_Georgian_jil: return "Georgian_jil"; break; - case XK_Georgian_cil: return "Georgian_cil"; break; - case XK_Georgian_char: return "Georgian_char"; break; - case XK_Georgian_xan: return "Georgian_xan"; break; - case XK_Georgian_jhan: return "Georgian_jhan"; break; - case XK_Georgian_hae: return "Georgian_hae"; break; - case XK_Georgian_he: return "Georgian_he"; break; - case XK_Georgian_hie: return "Georgian_hie"; break; - case XK_Georgian_we: return "Georgian_we"; break; - case XK_Georgian_har: return "Georgian_har"; break; - case XK_Georgian_hoe: return "Georgian_hoe"; break; - case XK_Georgian_fi: return "Georgian_fi"; break; - case XK_Xabovedot: return "Xabovedot"; break; - case XK_Ibreve: return "Ibreve"; break; - case XK_Zstroke: return "Zstroke"; break; - case XK_Gcaron: return "Gcaron"; break; - case XK_Ocaron: return "Ocaron"; break; - case XK_Obarred: return "Obarred"; break; - case XK_xabovedot: return "xabovedot"; break; - case XK_ibreve: return "ibreve"; break; - case XK_zstroke: return "zstroke"; break; - case XK_gcaron: return "gcaron"; break; - case XK_ocaron: return "ocaron"; break; - case XK_obarred: return "obarred"; break; - case XK_SCHWA: return "SCHWA"; break; - case XK_schwa: return "schwa"; break; - case XK_EZH: return "EZH"; break; - case XK_ezh: return "ezh"; break; - case XK_Lbelowdot: return "Lbelowdot"; break; - case XK_lbelowdot: return "lbelowdot"; break; - case XK_Abelowdot: return "Abelowdot"; break; - case XK_abelowdot: return "abelowdot"; break; - case XK_Ahook: return "Ahook"; break; - case XK_ahook: return "ahook"; break; - case XK_Acircumflexacute: return "Acircumflexacute"; break; - case XK_acircumflexacute: return "acircumflexacute"; break; - case XK_Acircumflexgrave: return "Acircumflexgrave"; break; - case XK_acircumflexgrave: return "acircumflexgrave"; break; - case XK_Acircumflexhook: return "Acircumflexhook"; break; - case XK_acircumflexhook: return "acircumflexhook"; break; - case XK_Acircumflextilde: return "Acircumflextilde"; break; - case XK_acircumflextilde: return "acircumflextilde"; break; - case XK_Acircumflexbelowdot: return "Acircumflexbelowdot"; break; - case XK_acircumflexbelowdot: return "acircumflexbelowdot"; break; - case XK_Abreveacute: return "Abreveacute"; break; - case XK_abreveacute: return "abreveacute"; break; - case XK_Abrevegrave: return "Abrevegrave"; break; - case XK_abrevegrave: return "abrevegrave"; break; - case XK_Abrevehook: return "Abrevehook"; break; - case XK_abrevehook: return "abrevehook"; break; - case XK_Abrevetilde: return "Abrevetilde"; break; - case XK_abrevetilde: return "abrevetilde"; break; - case XK_Abrevebelowdot: return "Abrevebelowdot"; break; - case XK_abrevebelowdot: return "abrevebelowdot"; break; - case XK_Ebelowdot: return "Ebelowdot"; break; - case XK_ebelowdot: return "ebelowdot"; break; - case XK_Ehook: return "Ehook"; break; - case XK_ehook: return "ehook"; break; - case XK_Etilde: return "Etilde"; break; - case XK_etilde: return "etilde"; break; - case XK_Ecircumflexacute: return "Ecircumflexacute"; break; - case XK_ecircumflexacute: return "ecircumflexacute"; break; - case XK_Ecircumflexgrave: return "Ecircumflexgrave"; break; - case XK_ecircumflexgrave: return "ecircumflexgrave"; break; - case XK_Ecircumflexhook: return "Ecircumflexhook"; break; - case XK_ecircumflexhook: return "ecircumflexhook"; break; - case XK_Ecircumflextilde: return "Ecircumflextilde"; break; - case XK_ecircumflextilde: return "ecircumflextilde"; break; - case XK_Ecircumflexbelowdot: return "Ecircumflexbelowdot"; break; - case XK_ecircumflexbelowdot: return "ecircumflexbelowdot"; break; - case XK_Ihook: return "Ihook"; break; - case XK_ihook: return "ihook"; break; - case XK_Ibelowdot: return "Ibelowdot"; break; - case XK_ibelowdot: return "ibelowdot"; break; - case XK_Obelowdot: return "Obelowdot"; break; - case XK_obelowdot: return "obelowdot"; break; - case XK_Ohook: return "Ohook"; break; - case XK_ohook: return "ohook"; break; - case XK_Ocircumflexacute: return "Ocircumflexacute"; break; - case XK_ocircumflexacute: return "ocircumflexacute"; break; - case XK_Ocircumflexgrave: return "Ocircumflexgrave"; break; - case XK_ocircumflexgrave: return "ocircumflexgrave"; break; - case XK_Ocircumflexhook: return "Ocircumflexhook"; break; - case XK_ocircumflexhook: return "ocircumflexhook"; break; - case XK_Ocircumflextilde: return "Ocircumflextilde"; break; - case XK_ocircumflextilde: return "ocircumflextilde"; break; - case XK_Ocircumflexbelowdot: return "Ocircumflexbelowdot"; break; - case XK_ocircumflexbelowdot: return "ocircumflexbelowdot"; break; - case XK_Ohornacute: return "Ohornacute"; break; - case XK_ohornacute: return "ohornacute"; break; - case XK_Ohorngrave: return "Ohorngrave"; break; - case XK_ohorngrave: return "ohorngrave"; break; - case XK_Ohornhook: return "Ohornhook"; break; - case XK_ohornhook: return "ohornhook"; break; - case XK_Ohorntilde: return "Ohorntilde"; break; - case XK_ohorntilde: return "ohorntilde"; break; - case XK_Ohornbelowdot: return "Ohornbelowdot"; break; - case XK_ohornbelowdot: return "ohornbelowdot"; break; - case XK_Ubelowdot: return "Ubelowdot"; break; - case XK_ubelowdot: return "ubelowdot"; break; - case XK_Uhook: return "Uhook"; break; - case XK_uhook: return "uhook"; break; - case XK_Uhornacute: return "Uhornacute"; break; - case XK_uhornacute: return "uhornacute"; break; - case XK_Uhorngrave: return "Uhorngrave"; break; - case XK_uhorngrave: return "uhorngrave"; break; - case XK_Uhornhook: return "Uhornhook"; break; - case XK_uhornhook: return "uhornhook"; break; - case XK_Uhorntilde: return "Uhorntilde"; break; - case XK_uhorntilde: return "uhorntilde"; break; - case XK_Uhornbelowdot: return "Uhornbelowdot"; break; - case XK_uhornbelowdot: return "uhornbelowdot"; break; - case XK_Ybelowdot: return "Ybelowdot"; break; - case XK_ybelowdot: return "ybelowdot"; break; - case XK_Yhook: return "Yhook"; break; - case XK_yhook: return "yhook"; break; - case XK_Ytilde: return "Ytilde"; break; - case XK_ytilde: return "ytilde"; break; - case XK_Ohorn: return "Ohorn"; break; - case XK_ohorn: return "ohorn"; break; - case XK_Uhorn: return "Uhorn"; break; - case XK_uhorn: return "uhorn"; break; - case XK_combining_tilde: return "combining_tilde"; break; - case XK_combining_grave: return "combining_grave"; break; - case XK_combining_acute: return "combining_acute"; break; - case XK_combining_hook: return "combining_hook"; break; - case XK_combining_belowdot: return "combining_belowdot"; break; - case XK_EcuSign: return "EcuSign"; break; - case XK_ColonSign: return "ColonSign"; break; - case XK_CruzeiroSign: return "CruzeiroSign"; break; - case XK_FFrancSign: return "FFrancSign"; break; - case XK_LiraSign: return "LiraSign"; break; - case XK_MillSign: return "MillSign"; break; - case XK_NairaSign: return "NairaSign"; break; - case XK_PesetaSign: return "PesetaSign"; break; - case XK_RupeeSign: return "RupeeSign"; break; - case XK_WonSign: return "WonSign"; break; - case XK_NewSheqelSign: return "NewSheqelSign"; break; - case XK_DongSign: return "DongSign"; break; - case XK_EuroSign: return "EuroSign"; break; - case XK_zerosuperior: return "zerosuperior"; break; - case XK_foursuperior: return "foursuperior"; break; - case XK_fivesuperior: return "fivesuperior"; break; - case XK_sixsuperior: return "sixsuperior"; break; - case XK_sevensuperior: return "sevensuperior"; break; - case XK_eightsuperior: return "eightsuperior"; break; - case XK_ninesuperior: return "ninesuperior"; break; - case XK_zerosubscript: return "zerosubscript"; break; - case XK_onesubscript: return "onesubscript"; break; - case XK_twosubscript: return "twosubscript"; break; - case XK_threesubscript: return "threesubscript"; break; - case XK_foursubscript: return "foursubscript"; break; - case XK_fivesubscript: return "fivesubscript"; break; - case XK_sixsubscript: return "sixsubscript"; break; - case XK_sevensubscript: return "sevensubscript"; break; - case XK_eightsubscript: return "eightsubscript"; break; - case XK_ninesubscript: return "ninesubscript"; break; - case XK_partdifferential: return "partdifferential"; break; - case XK_emptyset: return "emptyset"; break; - case XK_elementof: return "elementof"; break; - case XK_notelementof: return "notelementof"; break; - case XK_containsas: return "containsas"; break; - case XK_squareroot: return "squareroot"; break; - case XK_cuberoot: return "cuberoot"; break; - case XK_fourthroot: return "fourthroot"; break; - case XK_dintegral: return "dintegral"; break; - case XK_tintegral: return "tintegral"; break; - case XK_because: return "because"; break; - case XK_approxeq: return "approxeq"; break; - case XK_notapproxeq: return "notapproxeq"; break; - case XK_notidentical: return "notidentical"; break; - case XK_stricteq: return "stricteq"; break; - case XK_braille_dot_1: return "braille_dot_1"; break; - case XK_braille_dot_2: return "braille_dot_2"; break; - case XK_braille_dot_3: return "braille_dot_3"; break; - case XK_braille_dot_4: return "braille_dot_4"; break; - case XK_braille_dot_5: return "braille_dot_5"; break; - case XK_braille_dot_6: return "braille_dot_6"; break; - case XK_braille_dot_7: return "braille_dot_7"; break; - case XK_braille_dot_8: return "braille_dot_8"; break; - case XK_braille_dot_9: return "braille_dot_9"; break; - case XK_braille_dot_10: return "braille_dot_10"; break; - case XK_braille_blank: return "braille_blank"; break; - case XK_braille_dots_1: return "braille_dots_1"; break; - case XK_braille_dots_2: return "braille_dots_2"; break; - case XK_braille_dots_12: return "braille_dots_12"; break; - case XK_braille_dots_3: return "braille_dots_3"; break; - case XK_braille_dots_13: return "braille_dots_13"; break; - case XK_braille_dots_23: return "braille_dots_23"; break; - case XK_braille_dots_123: return "braille_dots_123"; break; - case XK_braille_dots_4: return "braille_dots_4"; break; - case XK_braille_dots_14: return "braille_dots_14"; break; - case XK_braille_dots_24: return "braille_dots_24"; break; - case XK_braille_dots_124: return "braille_dots_124"; break; - case XK_braille_dots_34: return "braille_dots_34"; break; - case XK_braille_dots_134: return "braille_dots_134"; break; - case XK_braille_dots_234: return "braille_dots_234"; break; - case XK_braille_dots_1234: return "braille_dots_1234"; break; - case XK_braille_dots_5: return "braille_dots_5"; break; - case XK_braille_dots_15: return "braille_dots_15"; break; - case XK_braille_dots_25: return "braille_dots_25"; break; - case XK_braille_dots_125: return "braille_dots_125"; break; - case XK_braille_dots_35: return "braille_dots_35"; break; - case XK_braille_dots_135: return "braille_dots_135"; break; - case XK_braille_dots_235: return "braille_dots_235"; break; - case XK_braille_dots_1235: return "braille_dots_1235"; break; - case XK_braille_dots_45: return "braille_dots_45"; break; - case XK_braille_dots_145: return "braille_dots_145"; break; - case XK_braille_dots_245: return "braille_dots_245"; break; - case XK_braille_dots_1245: return "braille_dots_1245"; break; - case XK_braille_dots_345: return "braille_dots_345"; break; - case XK_braille_dots_1345: return "braille_dots_1345"; break; - case XK_braille_dots_2345: return "braille_dots_2345"; break; - case XK_braille_dots_12345: return "braille_dots_12345"; break; - case XK_braille_dots_6: return "braille_dots_6"; break; - case XK_braille_dots_16: return "braille_dots_16"; break; - case XK_braille_dots_26: return "braille_dots_26"; break; - case XK_braille_dots_126: return "braille_dots_126"; break; - case XK_braille_dots_36: return "braille_dots_36"; break; - case XK_braille_dots_136: return "braille_dots_136"; break; - case XK_braille_dots_236: return "braille_dots_236"; break; - case XK_braille_dots_1236: return "braille_dots_1236"; break; - case XK_braille_dots_46: return "braille_dots_46"; break; - case XK_braille_dots_146: return "braille_dots_146"; break; - case XK_braille_dots_246: return "braille_dots_246"; break; - case XK_braille_dots_1246: return "braille_dots_1246"; break; - case XK_braille_dots_346: return "braille_dots_346"; break; - case XK_braille_dots_1346: return "braille_dots_1346"; break; - case XK_braille_dots_2346: return "braille_dots_2346"; break; - case XK_braille_dots_12346: return "braille_dots_12346"; break; - case XK_braille_dots_56: return "braille_dots_56"; break; - case XK_braille_dots_156: return "braille_dots_156"; break; - case XK_braille_dots_256: return "braille_dots_256"; break; - case XK_braille_dots_1256: return "braille_dots_1256"; break; - case XK_braille_dots_356: return "braille_dots_356"; break; - case XK_braille_dots_1356: return "braille_dots_1356"; break; - case XK_braille_dots_2356: return "braille_dots_2356"; break; - case XK_braille_dots_12356: return "braille_dots_12356"; break; - case XK_braille_dots_456: return "braille_dots_456"; break; - case XK_braille_dots_1456: return "braille_dots_1456"; break; - case XK_braille_dots_2456: return "braille_dots_2456"; break; - case XK_braille_dots_12456: return "braille_dots_12456"; break; - case XK_braille_dots_3456: return "braille_dots_3456"; break; - case XK_braille_dots_13456: return "braille_dots_13456"; break; - case XK_braille_dots_23456: return "braille_dots_23456"; break; - case XK_braille_dots_123456: return "braille_dots_123456"; break; - case XK_braille_dots_7: return "braille_dots_7"; break; - case XK_braille_dots_17: return "braille_dots_17"; break; - case XK_braille_dots_27: return "braille_dots_27"; break; - case XK_braille_dots_127: return "braille_dots_127"; break; - case XK_braille_dots_37: return "braille_dots_37"; break; - case XK_braille_dots_137: return "braille_dots_137"; break; - case XK_braille_dots_237: return "braille_dots_237"; break; - case XK_braille_dots_1237: return "braille_dots_1237"; break; - case XK_braille_dots_47: return "braille_dots_47"; break; - case XK_braille_dots_147: return "braille_dots_147"; break; - case XK_braille_dots_247: return "braille_dots_247"; break; - case XK_braille_dots_1247: return "braille_dots_1247"; break; - case XK_braille_dots_347: return "braille_dots_347"; break; - case XK_braille_dots_1347: return "braille_dots_1347"; break; - case XK_braille_dots_2347: return "braille_dots_2347"; break; - case XK_braille_dots_12347: return "braille_dots_12347"; break; - case XK_braille_dots_57: return "braille_dots_57"; break; - case XK_braille_dots_157: return "braille_dots_157"; break; - case XK_braille_dots_257: return "braille_dots_257"; break; - case XK_braille_dots_1257: return "braille_dots_1257"; break; - case XK_braille_dots_357: return "braille_dots_357"; break; - case XK_braille_dots_1357: return "braille_dots_1357"; break; - case XK_braille_dots_2357: return "braille_dots_2357"; break; - case XK_braille_dots_12357: return "braille_dots_12357"; break; - case XK_braille_dots_457: return "braille_dots_457"; break; - case XK_braille_dots_1457: return "braille_dots_1457"; break; - case XK_braille_dots_2457: return "braille_dots_2457"; break; - case XK_braille_dots_12457: return "braille_dots_12457"; break; - case XK_braille_dots_3457: return "braille_dots_3457"; break; - case XK_braille_dots_13457: return "braille_dots_13457"; break; - case XK_braille_dots_23457: return "braille_dots_23457"; break; - case XK_braille_dots_123457: return "braille_dots_123457"; break; - case XK_braille_dots_67: return "braille_dots_67"; break; - case XK_braille_dots_167: return "braille_dots_167"; break; - case XK_braille_dots_267: return "braille_dots_267"; break; - case XK_braille_dots_1267: return "braille_dots_1267"; break; - case XK_braille_dots_367: return "braille_dots_367"; break; - case XK_braille_dots_1367: return "braille_dots_1367"; break; - case XK_braille_dots_2367: return "braille_dots_2367"; break; - case XK_braille_dots_12367: return "braille_dots_12367"; break; - case XK_braille_dots_467: return "braille_dots_467"; break; - case XK_braille_dots_1467: return "braille_dots_1467"; break; - case XK_braille_dots_2467: return "braille_dots_2467"; break; - case XK_braille_dots_12467: return "braille_dots_12467"; break; - case XK_braille_dots_3467: return "braille_dots_3467"; break; - case XK_braille_dots_13467: return "braille_dots_13467"; break; - case XK_braille_dots_23467: return "braille_dots_23467"; break; - case XK_braille_dots_123467: return "braille_dots_123467"; break; - case XK_braille_dots_567: return "braille_dots_567"; break; - case XK_braille_dots_1567: return "braille_dots_1567"; break; - case XK_braille_dots_2567: return "braille_dots_2567"; break; - case XK_braille_dots_12567: return "braille_dots_12567"; break; - case XK_braille_dots_3567: return "braille_dots_3567"; break; - case XK_braille_dots_13567: return "braille_dots_13567"; break; - case XK_braille_dots_23567: return "braille_dots_23567"; break; - case XK_braille_dots_123567: return "braille_dots_123567"; break; - case XK_braille_dots_4567: return "braille_dots_4567"; break; - case XK_braille_dots_14567: return "braille_dots_14567"; break; - case XK_braille_dots_24567: return "braille_dots_24567"; break; - case XK_braille_dots_124567: return "braille_dots_124567"; break; - case XK_braille_dots_34567: return "braille_dots_34567"; break; - case XK_braille_dots_134567: return "braille_dots_134567"; break; - case XK_braille_dots_234567: return "braille_dots_234567"; break; - case XK_braille_dots_1234567: return "braille_dots_1234567"; break; - case XK_braille_dots_8: return "braille_dots_8"; break; - case XK_braille_dots_18: return "braille_dots_18"; break; - case XK_braille_dots_28: return "braille_dots_28"; break; - case XK_braille_dots_128: return "braille_dots_128"; break; - case XK_braille_dots_38: return "braille_dots_38"; break; - case XK_braille_dots_138: return "braille_dots_138"; break; - case XK_braille_dots_238: return "braille_dots_238"; break; - case XK_braille_dots_1238: return "braille_dots_1238"; break; - case XK_braille_dots_48: return "braille_dots_48"; break; - case XK_braille_dots_148: return "braille_dots_148"; break; - case XK_braille_dots_248: return "braille_dots_248"; break; - case XK_braille_dots_1248: return "braille_dots_1248"; break; - case XK_braille_dots_348: return "braille_dots_348"; break; - case XK_braille_dots_1348: return "braille_dots_1348"; break; - case XK_braille_dots_2348: return "braille_dots_2348"; break; - case XK_braille_dots_12348: return "braille_dots_12348"; break; - case XK_braille_dots_58: return "braille_dots_58"; break; - case XK_braille_dots_158: return "braille_dots_158"; break; - case XK_braille_dots_258: return "braille_dots_258"; break; - case XK_braille_dots_1258: return "braille_dots_1258"; break; - case XK_braille_dots_358: return "braille_dots_358"; break; - case XK_braille_dots_1358: return "braille_dots_1358"; break; - case XK_braille_dots_2358: return "braille_dots_2358"; break; - case XK_braille_dots_12358: return "braille_dots_12358"; break; - case XK_braille_dots_458: return "braille_dots_458"; break; - case XK_braille_dots_1458: return "braille_dots_1458"; break; - case XK_braille_dots_2458: return "braille_dots_2458"; break; - case XK_braille_dots_12458: return "braille_dots_12458"; break; - case XK_braille_dots_3458: return "braille_dots_3458"; break; - case XK_braille_dots_13458: return "braille_dots_13458"; break; - case XK_braille_dots_23458: return "braille_dots_23458"; break; - case XK_braille_dots_123458: return "braille_dots_123458"; break; - case XK_braille_dots_68: return "braille_dots_68"; break; - case XK_braille_dots_168: return "braille_dots_168"; break; - case XK_braille_dots_268: return "braille_dots_268"; break; - case XK_braille_dots_1268: return "braille_dots_1268"; break; - case XK_braille_dots_368: return "braille_dots_368"; break; - case XK_braille_dots_1368: return "braille_dots_1368"; break; - case XK_braille_dots_2368: return "braille_dots_2368"; break; - case XK_braille_dots_12368: return "braille_dots_12368"; break; - case XK_braille_dots_468: return "braille_dots_468"; break; - case XK_braille_dots_1468: return "braille_dots_1468"; break; - case XK_braille_dots_2468: return "braille_dots_2468"; break; - case XK_braille_dots_12468: return "braille_dots_12468"; break; - case XK_braille_dots_3468: return "braille_dots_3468"; break; - case XK_braille_dots_13468: return "braille_dots_13468"; break; - case XK_braille_dots_23468: return "braille_dots_23468"; break; - case XK_braille_dots_123468: return "braille_dots_123468"; break; - case XK_braille_dots_568: return "braille_dots_568"; break; - case XK_braille_dots_1568: return "braille_dots_1568"; break; - case XK_braille_dots_2568: return "braille_dots_2568"; break; - case XK_braille_dots_12568: return "braille_dots_12568"; break; - case XK_braille_dots_3568: return "braille_dots_3568"; break; - case XK_braille_dots_13568: return "braille_dots_13568"; break; - case XK_braille_dots_23568: return "braille_dots_23568"; break; - case XK_braille_dots_123568: return "braille_dots_123568"; break; - case XK_braille_dots_4568: return "braille_dots_4568"; break; - case XK_braille_dots_14568: return "braille_dots_14568"; break; - case XK_braille_dots_24568: return "braille_dots_24568"; break; - case XK_braille_dots_124568: return "braille_dots_124568"; break; - case XK_braille_dots_34568: return "braille_dots_34568"; break; - case XK_braille_dots_134568: return "braille_dots_134568"; break; - case XK_braille_dots_234568: return "braille_dots_234568"; break; - case XK_braille_dots_1234568: return "braille_dots_1234568"; break; - case XK_braille_dots_78: return "braille_dots_78"; break; - case XK_braille_dots_178: return "braille_dots_178"; break; - case XK_braille_dots_278: return "braille_dots_278"; break; - case XK_braille_dots_1278: return "braille_dots_1278"; break; - case XK_braille_dots_378: return "braille_dots_378"; break; - case XK_braille_dots_1378: return "braille_dots_1378"; break; - case XK_braille_dots_2378: return "braille_dots_2378"; break; - case XK_braille_dots_12378: return "braille_dots_12378"; break; - case XK_braille_dots_478: return "braille_dots_478"; break; - case XK_braille_dots_1478: return "braille_dots_1478"; break; - case XK_braille_dots_2478: return "braille_dots_2478"; break; - case XK_braille_dots_12478: return "braille_dots_12478"; break; - case XK_braille_dots_3478: return "braille_dots_3478"; break; - case XK_braille_dots_13478: return "braille_dots_13478"; break; - case XK_braille_dots_23478: return "braille_dots_23478"; break; - case XK_braille_dots_123478: return "braille_dots_123478"; break; - case XK_braille_dots_578: return "braille_dots_578"; break; - case XK_braille_dots_1578: return "braille_dots_1578"; break; - case XK_braille_dots_2578: return "braille_dots_2578"; break; - case XK_braille_dots_12578: return "braille_dots_12578"; break; - case XK_braille_dots_3578: return "braille_dots_3578"; break; - case XK_braille_dots_13578: return "braille_dots_13578"; break; - case XK_braille_dots_23578: return "braille_dots_23578"; break; - case XK_braille_dots_123578: return "braille_dots_123578"; break; - case XK_braille_dots_4578: return "braille_dots_4578"; break; - case XK_braille_dots_14578: return "braille_dots_14578"; break; - case XK_braille_dots_24578: return "braille_dots_24578"; break; - case XK_braille_dots_124578: return "braille_dots_124578"; break; - case XK_braille_dots_34578: return "braille_dots_34578"; break; - case XK_braille_dots_134578: return "braille_dots_134578"; break; - case XK_braille_dots_234578: return "braille_dots_234578"; break; - case XK_braille_dots_1234578: return "braille_dots_1234578"; break; - case XK_braille_dots_678: return "braille_dots_678"; break; - case XK_braille_dots_1678: return "braille_dots_1678"; break; - case XK_braille_dots_2678: return "braille_dots_2678"; break; - case XK_braille_dots_12678: return "braille_dots_12678"; break; - case XK_braille_dots_3678: return "braille_dots_3678"; break; - case XK_braille_dots_13678: return "braille_dots_13678"; break; - case XK_braille_dots_23678: return "braille_dots_23678"; break; - case XK_braille_dots_123678: return "braille_dots_123678"; break; - case XK_braille_dots_4678: return "braille_dots_4678"; break; - case XK_braille_dots_14678: return "braille_dots_14678"; break; - case XK_braille_dots_24678: return "braille_dots_24678"; break; - case XK_braille_dots_124678: return "braille_dots_124678"; break; - case XK_braille_dots_34678: return "braille_dots_34678"; break; - case XK_braille_dots_134678: return "braille_dots_134678"; break; - case XK_braille_dots_234678: return "braille_dots_234678"; break; - case XK_braille_dots_1234678: return "braille_dots_1234678"; break; - case XK_braille_dots_5678: return "braille_dots_5678"; break; - case XK_braille_dots_15678: return "braille_dots_15678"; break; - case XK_braille_dots_25678: return "braille_dots_25678"; break; - case XK_braille_dots_125678: return "braille_dots_125678"; break; - case XK_braille_dots_35678: return "braille_dots_35678"; break; - case XK_braille_dots_135678: return "braille_dots_135678"; break; - case XK_braille_dots_235678: return "braille_dots_235678"; break; - case XK_braille_dots_1235678: return "braille_dots_1235678"; break; - case XK_braille_dots_45678: return "braille_dots_45678"; break; - case XK_braille_dots_145678: return "braille_dots_145678"; break; - case XK_braille_dots_245678: return "braille_dots_245678"; break; - case XK_braille_dots_1245678: return "braille_dots_1245678"; break; - case XK_braille_dots_345678: return "braille_dots_345678"; break; - case XK_braille_dots_1345678: return "braille_dots_1345678"; break; - case XK_braille_dots_2345678: return "braille_dots_2345678"; break; - case XK_braille_dots_12345678: return "braille_dots_12345678"; break; - case XK_Sinh_ng: return "Sinh_ng"; break; - case XK_Sinh_h2: return "Sinh_h2"; break; - case XK_Sinh_a: return "Sinh_a"; break; - case XK_Sinh_aa: return "Sinh_aa"; break; - case XK_Sinh_ae: return "Sinh_ae"; break; - case XK_Sinh_aee: return "Sinh_aee"; break; - case XK_Sinh_i: return "Sinh_i"; break; - case XK_Sinh_ii: return "Sinh_ii"; break; - case XK_Sinh_u: return "Sinh_u"; break; - case XK_Sinh_uu: return "Sinh_uu"; break; - case XK_Sinh_ri: return "Sinh_ri"; break; - case XK_Sinh_rii: return "Sinh_rii"; break; - case XK_Sinh_lu: return "Sinh_lu"; break; - case XK_Sinh_luu: return "Sinh_luu"; break; - case XK_Sinh_e: return "Sinh_e"; break; - case XK_Sinh_ee: return "Sinh_ee"; break; - case XK_Sinh_ai: return "Sinh_ai"; break; - case XK_Sinh_o: return "Sinh_o"; break; - case XK_Sinh_oo: return "Sinh_oo"; break; - case XK_Sinh_au: return "Sinh_au"; break; - case XK_Sinh_ka: return "Sinh_ka"; break; - case XK_Sinh_kha: return "Sinh_kha"; break; - case XK_Sinh_ga: return "Sinh_ga"; break; - case XK_Sinh_gha: return "Sinh_gha"; break; - case XK_Sinh_ng2: return "Sinh_ng2"; break; - case XK_Sinh_nga: return "Sinh_nga"; break; - case XK_Sinh_ca: return "Sinh_ca"; break; - case XK_Sinh_cha: return "Sinh_cha"; break; - case XK_Sinh_ja: return "Sinh_ja"; break; - case XK_Sinh_jha: return "Sinh_jha"; break; - case XK_Sinh_nya: return "Sinh_nya"; break; - case XK_Sinh_jnya: return "Sinh_jnya"; break; - case XK_Sinh_nja: return "Sinh_nja"; break; - case XK_Sinh_tta: return "Sinh_tta"; break; - case XK_Sinh_ttha: return "Sinh_ttha"; break; - case XK_Sinh_dda: return "Sinh_dda"; break; - case XK_Sinh_ddha: return "Sinh_ddha"; break; - case XK_Sinh_nna: return "Sinh_nna"; break; - case XK_Sinh_ndda: return "Sinh_ndda"; break; - case XK_Sinh_tha: return "Sinh_tha"; break; - case XK_Sinh_thha: return "Sinh_thha"; break; - case XK_Sinh_dha: return "Sinh_dha"; break; - case XK_Sinh_dhha: return "Sinh_dhha"; break; - case XK_Sinh_na: return "Sinh_na"; break; - case XK_Sinh_ndha: return "Sinh_ndha"; break; - case XK_Sinh_pa: return "Sinh_pa"; break; - case XK_Sinh_pha: return "Sinh_pha"; break; - case XK_Sinh_ba: return "Sinh_ba"; break; - case XK_Sinh_bha: return "Sinh_bha"; break; - case XK_Sinh_ma: return "Sinh_ma"; break; - case XK_Sinh_mba: return "Sinh_mba"; break; - case XK_Sinh_ya: return "Sinh_ya"; break; - case XK_Sinh_ra: return "Sinh_ra"; break; - case XK_Sinh_la: return "Sinh_la"; break; - case XK_Sinh_va: return "Sinh_va"; break; - case XK_Sinh_sha: return "Sinh_sha"; break; - case XK_Sinh_ssha: return "Sinh_ssha"; break; - case XK_Sinh_sa: return "Sinh_sa"; break; - case XK_Sinh_ha: return "Sinh_ha"; break; - case XK_Sinh_lla: return "Sinh_lla"; break; - case XK_Sinh_fa: return "Sinh_fa"; break; - case XK_Sinh_al: return "Sinh_al"; break; - case XK_Sinh_aa2: return "Sinh_aa2"; break; - case XK_Sinh_ae2: return "Sinh_ae2"; break; - case XK_Sinh_aee2: return "Sinh_aee2"; break; - case XK_Sinh_i2: return "Sinh_i2"; break; - case XK_Sinh_ii2: return "Sinh_ii2"; break; - case XK_Sinh_u2: return "Sinh_u2"; break; - case XK_Sinh_uu2: return "Sinh_uu2"; break; - case XK_Sinh_ru2: return "Sinh_ru2"; break; - case XK_Sinh_e2: return "Sinh_e2"; break; - case XK_Sinh_ee2: return "Sinh_ee2"; break; - case XK_Sinh_ai2: return "Sinh_ai2"; break; - case XK_Sinh_o2: return "Sinh_o2"; break; - case XK_Sinh_oo2: return "Sinh_oo2"; break; - case XK_Sinh_au2: return "Sinh_au2"; break; - case XK_Sinh_lu2: return "Sinh_lu2"; break; - case XK_Sinh_ruu2: return "Sinh_ruu2"; break; - case XK_Sinh_luu2: return "Sinh_luu2"; break; - case XK_Sinh_kunddaliya: return "Sinh_kunddaliya"; break; - default: return ""; break; - } -} |