Skip to content

Instantly share code, notes, and snippets.

@cgmb
Created August 19, 2015 19:47
Show Gist options
  • Save cgmb/42e9955971ca2b5df803 to your computer and use it in GitHub Desktop.
Save cgmb/42e9955971ca2b5df803 to your computer and use it in GitHub Desktop.
AntTweakBar's TwGetKeyCode SSCCE
#include <assert.h>
#include <ctype.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#define _stricmp strcasecmp
#define _strdup strdup
typedef enum ETwKeyModifier
{
TW_KMOD_NONE = 0x0000, // same codes as SDL keysym.mod
TW_KMOD_SHIFT = 0x0003,
TW_KMOD_CTRL = 0x00c0,
TW_KMOD_ALT = 0x0100,
TW_KMOD_META = 0x0c00
} TwKeyModifier;
typedef enum EKeySpecial
{
TW_KEY_BACKSPACE = '\b',
TW_KEY_TAB = '\t',
TW_KEY_CLEAR = 0x0c,
TW_KEY_RETURN = '\r',
TW_KEY_PAUSE = 0x13,
TW_KEY_ESCAPE = 0x1b,
TW_KEY_SPACE = ' ',
TW_KEY_DELETE = 0x7f,
TW_KEY_UP = 273, // same codes and order as SDL 1.2 keysym.sym
TW_KEY_DOWN,
TW_KEY_RIGHT,
TW_KEY_LEFT,
TW_KEY_INSERT,
TW_KEY_HOME,
TW_KEY_END,
TW_KEY_PAGE_UP,
TW_KEY_PAGE_DOWN,
TW_KEY_F1,
TW_KEY_F2,
TW_KEY_F3,
TW_KEY_F4,
TW_KEY_F5,
TW_KEY_F6,
TW_KEY_F7,
TW_KEY_F8,
TW_KEY_F9,
TW_KEY_F10,
TW_KEY_F11,
TW_KEY_F12,
TW_KEY_F13,
TW_KEY_F14,
TW_KEY_F15,
TW_KEY_LAST
} TwKeySpecial;
bool TwGetKeyCode(int *_Code, int *_Modif, const char *_String)
{
assert(_Code!=NULL && _Modif!=NULL);
bool Ok = true;
*_Modif = TW_KMOD_NONE;
*_Code = 0;
size_t Start = strlen(_String)-1;
if( Start<0 )
return false;
while( Start>0 && _String[Start-1]!='+' )
--Start;
while( _String[Start]==' ' || _String[Start]=='\t' )
++Start;
char *CodeStr = _strdup(_String+Start);
for( size_t i=strlen(CodeStr)-1; i>=0; ++i )
if( CodeStr[i]==' ' || CodeStr[i]=='\t' )
CodeStr[i] = '\0';
else
break;
/*
if( strstr(_String, "SHIFT")!=NULL || strstr(_String, "shift")!=NULL )
*_Modif |= TW_KMOD_SHIFT;
if( strstr(_String, "CTRL")!=NULL || strstr(_String, "ctrl")!=NULL )
*_Modif |= TW_KMOD_CTRL;
if( strstr(_String, "META")!=NULL || strstr(_String, "meta")!=NULL )
*_Modif |= TW_KMOD_META;
if( strstr(_String, "ALTGR")!=NULL || strstr(_String, "altgr")!=NULL )
((void)(0)); // *_Modif |= TW_KMOD_ALTGR;
else // ALT and ALTGR are exclusive
if( strstr(_String, "ALT")!=NULL || strstr(_String, "alt")!=NULL )
*_Modif |= TW_KMOD_ALT;
*/
char *up = _strdup(_String);
// _strupr(up);
for( char *upch=up; *upch!='\0'; ++upch )
*upch = (char)toupper(*upch);
if( strstr(up, "SHIFT")!=NULL )
*_Modif |= TW_KMOD_SHIFT;
if( strstr(up, "CTRL")!=NULL )
*_Modif |= TW_KMOD_CTRL;
if( strstr(up, "META")!=NULL )
*_Modif |= TW_KMOD_META;
if( strstr(up, "ALTGR")!=NULL )
((void)(0)); // *_Modif |= TW_KMOD_ALTGR;
else // ALT and ALTGR are exclusive
if( strstr(up, "ALT")!=NULL )
*_Modif |= TW_KMOD_ALT;
free(up);
if( strlen(CodeStr)==1 )
*_Code = (unsigned char)(CodeStr[0]);
else if( _stricmp(CodeStr, "backspace")==0 || _stricmp(CodeStr, "bs")==0 )
*_Code = TW_KEY_BACKSPACE;
else if( _stricmp(CodeStr, "tab")==0 )
*_Code = TW_KEY_TAB;
else if( _stricmp(CodeStr, "clear")==0 || _stricmp(CodeStr, "clr")==0 )
*_Code = TW_KEY_CLEAR;
else if( _stricmp(CodeStr, "return")==0 || _stricmp(CodeStr, "ret")==0 )
*_Code = TW_KEY_RETURN;
else if( _stricmp(CodeStr, "pause")==0 )
*_Code = TW_KEY_PAUSE;
else if( _stricmp(CodeStr, "escape")==0 || _stricmp(CodeStr, "esc")==0 )
*_Code = TW_KEY_ESCAPE;
else if( _stricmp(CodeStr, "space")==0 )
*_Code = TW_KEY_SPACE;
else if( _stricmp(CodeStr, "delete")==0 || _stricmp(CodeStr, "del")==0 )
*_Code = TW_KEY_DELETE;
/*
else if( strlen(CodeStr)==4 && CodeStr[3]>='0' && CodeStr[3]<='9' && (strstr(CodeStr, "pad")==CodeStr || strstr(CodeStr, "PAD")==CodeStr) )
*_Code = TW_KEY_PAD_0 + CodeStr[3]-'0';
else if( _stricmp(CodeStr, "pad.")==0 )
*_Code = TW_KEY_PAD_PERIOD;
else if( _stricmp(CodeStr, "pad/")==0 )
*_Code = TW_KEY_PAD_DIVIDE;
else if( _stricmp(CodeStr, "pad*")==0 )
*_Code = TW_KEY_PAD_MULTIPLY;
else if( _stricmp(CodeStr, "pad+")==0 )
*_Code = TW_KEY_PAD_PLUS;
else if( _stricmp(CodeStr, "pad-")==0 )
*_Code = TW_KEY_PAD_MINUS;
else if( _stricmp(CodeStr, "padenter")==0 )
*_Code = TW_KEY_PAD_ENTER;
else if( _stricmp(CodeStr, "pad=")==0 )
*_Code = TW_KEY_PAD_EQUALS;
*/
else if( _stricmp(CodeStr, "up")==0 )
*_Code = TW_KEY_UP;
else if( _stricmp(CodeStr, "down")==0 )
*_Code = TW_KEY_DOWN;
else if( _stricmp(CodeStr, "right")==0 )
*_Code = TW_KEY_RIGHT;
else if( _stricmp(CodeStr, "left")==0 )
*_Code = TW_KEY_LEFT;
else if( _stricmp(CodeStr, "insert")==0 || _stricmp(CodeStr, "ins")==0 )
*_Code = TW_KEY_INSERT;
else if( _stricmp(CodeStr, "home")==0 )
*_Code = TW_KEY_HOME;
else if( _stricmp(CodeStr, "end")==0 )
*_Code = TW_KEY_END;
else if( _stricmp(CodeStr, "pgup")==0 )
*_Code = TW_KEY_PAGE_UP;
else if( _stricmp(CodeStr, "pgdown")==0 )
*_Code = TW_KEY_PAGE_DOWN;
else if( (strlen(CodeStr)==2 || strlen(CodeStr)==3) && (CodeStr[0]=='f' || CodeStr[0]=='F') )
{
int n = 0;
if( sscanf(CodeStr+1, "%d", &n)==1 && n>0 && n<16 )
*_Code = TW_KEY_F1 + n-1;
else
Ok = false;
}
free(CodeStr);
return Ok;
}
int main() {
int code = 0;
int modif = 0;
const char* string = "v";
return TwGetKeyCode(&code, &modif, string);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment