Files
amiwm-neo/kbdlexer.l
James Le Cuirot 5823492992 Adjust yacc builds to support the original yacc (as opposed to bison)
yacc doesn't support the arguments we've been giving to bison. byacc was
also tested.
2023-10-08 22:15:32 +01:00

147 lines
3.8 KiB
Plaintext

%option noyywrap
%{
#include <X11/Xmu/CharSet.h>
#include <string.h>
#include "libami.h"
#include "kbdmodule.tab.h"
unsigned char *inptr;
extern char *progname;
#ifdef FLEX_SCANNER
#undef YY_INPUT
#define YY_INPUT(buf,result,size) ((result) = doinput((buf),(size)))
int doinput (char *buf, int size)
{
int l=strlen((char *)inptr);
if(l>size) l=size;
if(l>0) {
memcpy(buf, inptr, l);
inptr+=l;
}
return l;
}
#endif
static void k_rotscreens(Window w)
{
Window root;
int x, y;
unsigned int width, height, bw, d;
if(XGetGeometry(md_display(), w, &root, &x, &y, &width, &height, &bw, &d))
md_rotate_screen(root);
}
typedef void (*mdfuncp)(Window);
int parse_keyword(char *str, YYSTYPE *val)
{
struct { char *name; mdfuncp func; } functab[] = {
{ "back", (mdfuncp)md_back },
{ "front", (mdfuncp)md_front },
{ "iconify", (mdfuncp)md_iconify },
{ "lowerwindow", (mdfuncp)md_rotate_window_lower },
{ "raisewindow", (mdfuncp)md_rotate_window_raise },
{ "rotatescreens", (mdfuncp)k_rotscreens },
{ "rotatewindow", (mdfuncp)md_rotate_window_desktop },
};
#define N_FUNC (sizeof(functab)/sizeof(functab[0]))
struct { char *name; int token, num; } kwtab[] = {
{ "all", WHEREABOUTS, IN_ANYTHING_MASK },
{ "b1", MODIFIER, Button1Mask },
{ "b2", MODIFIER, Button2Mask },
{ "b3", MODIFIER, Button3Mask },
{ "b4", MODIFIER, Button4Mask },
{ "b5", MODIFIER, Button5Mask },
{ "button1", MODIFIER, Button1Mask },
{ "button2", MODIFIER, Button2Mask },
{ "button3", MODIFIER, Button3Mask },
{ "button4", MODIFIER, Button4Mask },
{ "button5", MODIFIER, Button5Mask },
{ "control", MODIFIER, ControlMask },
{ "frame", WHEREABOUTS, IN_FRAME_MASK },
{ "icon", WHEREABOUTS, IN_ICON_MASK },
{ "lock", MODIFIER, LockMask },
{ "m", META, 0 },
{ "m1", MODIFIER, Mod1Mask },
{ "m2", MODIFIER, Mod2Mask },
{ "m3", MODIFIER, Mod3Mask },
{ "m4", MODIFIER, Mod4Mask },
{ "m5", MODIFIER, Mod5Mask },
{ "meta", META, 0 },
{ "mod1", MODIFIER, Mod1Mask },
{ "mod2", MODIFIER, Mod2Mask },
{ "mod3", MODIFIER, Mod3Mask },
{ "mod4", MODIFIER, Mod4Mask },
{ "mod5", MODIFIER, Mod5Mask },
{ "root", WHEREABOUTS, IN_ROOT_MASK },
{ "shift", MODIFIER, ShiftMask },
{ "window", WHEREABOUTS, IN_WINDOW_MASK },
};
#define N_KW (sizeof(kwtab)/sizeof(kwtab[0]))
int l=0, h=N_FUNC-1;
XmuCopyISOLatin1Lowered (str, str);
while(h>=l) {
int i=(h+l)>>1, c=strcmp(str, functab[i].name);
if(!c) {
val->function=functab[i].func;
return FUNCTION;
} else if(c>=0)
l=i+1;
else
h=i-1;
}
l=0; h=N_KW-1;
while(h>=l) {
int i=(h+l)>>1, c=strcmp(str, kwtab[i].name);
if(!c) {
val->num=kwtab[i].num;
return kwtab[i].token;
} else if(c>=0)
l=i+1;
else
h=i-1;
}
return ERRORTOKEN;
}
%}
%%
\#[^\n]*\n { ; }
\<[^\n\>]*\> { *((char*)strchr(yytext, '>'))=0;
yylval.keysym=XStringToKeysym(yytext+1);
if(yylval.keysym == 0) {
fprintf(stderr, "%s: ignoring unknown keysym: %s\n",
progname, yytext+1);
} else
return KEYSYM;
}
[a-zA-Z0-9]+ { int token = parse_keyword(yytext, &yylval);
if(token == ERRORTOKEN) {
fprintf(stderr, "%s: ignoring unknown keyword: %s\n",
progname, yytext);
} else
return token;
}
\: { return COLON; }
\| { return BAR; }
[\r\n\t ] { ; }
. { fprintf(stderr, "%s: illegal character \"%s\" ignored\n",
progname, yytext); }
%%
#undef input
#define input() ((*inptr)?(*inptr++):0)
#undef unput
#define unput(c) (*--inptr=c)