From 04d2993fc2c8705584e72c80ea25b312ad60e9ff Mon Sep 17 00:00:00 2001 From: Aki Goto Date: Sun, 31 Mar 2013 21:52:09 +0900 Subject: [PATCH] Add Control and Alt --- Makefile | 3 + gamepad.c | 31 +++++++++-- gamepad.h | 7 +++ keymap.c | 148 +++++++++++++++++++++++++++----------------------- keymap.h | 14 ++--- main.c | 15 ++++- multibutton.c | 29 ++++++++++ multibutton.h | 7 +++ 8 files changed, 173 insertions(+), 81 deletions(-) diff --git a/Makefile b/Makefile index f4eaa3d..a6e4cc3 100644 --- a/Makefile +++ b/Makefile @@ -1,3 +1,6 @@ +# Released into the public domain +# by Aki Goto + all: padkey clean: diff --git a/gamepad.c b/gamepad.c index 19ae5a4..e9bdecb 100644 --- a/gamepad.c +++ b/gamepad.c @@ -1,3 +1,8 @@ +/* + * Released into the public domain + * by Aki Goto + */ + #include #include "gamepad.h" @@ -115,10 +120,28 @@ void Gamepad_initialize(struct Gamepad *this) this->buttons[ButtonId_X].shift = &this->buttons[ButtonId_DOWN]; this->buttons[ButtonId_Y].shift = &this->buttons[ButtonId_DOWN]; - Button_setDevice(&this->buttons[ButtonId_UP], ButtonType_NEGATIVE_AXIS, 1); - Button_setDevice(&this->buttons[ButtonId_DOWN], ButtonType_POSITIVE_AXIS, 1); - Button_setDevice(&this->buttons[ButtonId_LEFT], ButtonType_NEGATIVE_AXIS, 0); - Button_setDevice(&this->buttons[ButtonId_RIGHT], ButtonType_POSITIVE_AXIS, 0); + this->buttons[ButtonId_UP].control = &this->buttons[ButtonId_Y]; + this->buttons[ButtonId_DOWN].control = &this->buttons[ButtonId_Y]; + this->buttons[ButtonId_LEFT].control = &this->buttons[ButtonId_Y]; + this->buttons[ButtonId_RIGHT].control = &this->buttons[ButtonId_Y]; + this->buttons[ButtonId_A].control = &this->buttons[ButtonId_LEFT]; + this->buttons[ButtonId_B].control = &this->buttons[ButtonId_LEFT]; + this->buttons[ButtonId_X].control = &this->buttons[ButtonId_LEFT]; + this->buttons[ButtonId_Y].control = &this->buttons[ButtonId_LEFT]; + + this->buttons[ButtonId_UP].alt = &this->buttons[ButtonId_A]; + this->buttons[ButtonId_DOWN].alt = &this->buttons[ButtonId_A]; + this->buttons[ButtonId_LEFT].alt = &this->buttons[ButtonId_A]; + this->buttons[ButtonId_RIGHT].alt = &this->buttons[ButtonId_A]; + this->buttons[ButtonId_A].alt = &this->buttons[ButtonId_RIGHT]; + this->buttons[ButtonId_B].alt = &this->buttons[ButtonId_RIGHT]; + this->buttons[ButtonId_X].alt = &this->buttons[ButtonId_RIGHT]; + this->buttons[ButtonId_Y].alt = &this->buttons[ButtonId_RIGHT]; + + Button_setDevice(&this->buttons[ButtonId_UP], ButtonType_NEGATIVE_AXIS, 5); + Button_setDevice(&this->buttons[ButtonId_DOWN], ButtonType_POSITIVE_AXIS, 5); + Button_setDevice(&this->buttons[ButtonId_LEFT], ButtonType_NEGATIVE_AXIS, 4); + Button_setDevice(&this->buttons[ButtonId_RIGHT], ButtonType_POSITIVE_AXIS, 4); Button_setDevice(&this->buttons[ButtonId_A], ButtonType_BUTTON, 0); Button_setDevice(&this->buttons[ButtonId_B], ButtonType_BUTTON, 1); Button_setDevice(&this->buttons[ButtonId_X], ButtonType_BUTTON, 2); diff --git a/gamepad.h b/gamepad.h index b2a0e45..3d41d26 100644 --- a/gamepad.h +++ b/gamepad.h @@ -1,3 +1,8 @@ +/* + * Released into the public domain + * by Aki Goto + */ + #ifndef GAMEPAD_H #define GAMEPAD_H @@ -29,6 +34,8 @@ struct Button { int type; int number; struct Button *shift; + struct Button *control; + struct Button *alt; int prev; int current; }; diff --git a/keymap.c b/keymap.c index 8a47b6e..adb4259 100644 --- a/keymap.c +++ b/keymap.c @@ -1,98 +1,112 @@ +/* + * Released into the public domain + * by Aki Goto + */ + #include #include "keymap.h" +#define UP ButtonId_UP +#define DOWN ButtonId_DOWN +#define LEFT ButtonId_LEFT +#define RIGHT ButtonId_RIGHT +#define A ButtonId_A +#define B ButtonId_B +#define X ButtonId_X +#define Y ButtonId_Y + static void set(struct Keymap *this, int first, int second, int keyCode) { int index; index = first * 8 + second; - this->keyCode[index].keyCode = keyCode; + this->keyCode[index] = keyCode; } void Keymap_initialize(struct Keymap *this) { - set(this, ButtonId_UP, ButtonId_UP, XK_Escape); - set(this, ButtonId_UP, ButtonId_DOWN, XK_grave); - set(this, ButtonId_UP, ButtonId_LEFT, 0); - set(this, ButtonId_UP, ButtonId_RIGHT, 0); + set(this, UP, UP, XK_Escape); + set(this, UP, DOWN, XK_grave); + set(this, UP, LEFT, 0); + set(this, UP, RIGHT, 0); - set(this, ButtonId_DOWN, ButtonId_UP, 0); - set(this, ButtonId_DOWN, ButtonId_DOWN, XK_space); - set(this, ButtonId_DOWN, ButtonId_LEFT, 0); - set(this, ButtonId_DOWN, ButtonId_RIGHT, 0); + set(this, DOWN, UP, 0); + set(this, DOWN, DOWN, XK_space); + set(this, DOWN, LEFT, 0); + set(this, DOWN, RIGHT, 0); - set(this, ButtonId_LEFT, ButtonId_UP, 0); - set(this, ButtonId_LEFT, ButtonId_DOWN, 0); - set(this, ButtonId_LEFT, ButtonId_LEFT, XK_Tab); - set(this, ButtonId_LEFT, ButtonId_RIGHT, 0); + set(this, LEFT, UP, 0); + set(this, LEFT, DOWN, 0); + set(this, LEFT, LEFT, XK_Tab); + set(this, LEFT, RIGHT, 0); - set(this, ButtonId_B, ButtonId_A, XK_minus); - set(this, ButtonId_B, ButtonId_B, XK_BackSpace); - set(this, ButtonId_B, ButtonId_X, XK_equal); - set(this, ButtonId_B, ButtonId_Y, XK_apostrophe); + set(this, B, A, XK_minus); + set(this, B, B, XK_BackSpace); + set(this, B, X, XK_equal); + set(this, B, Y, XK_apostrophe); - set(this, ButtonId_X, ButtonId_A, 0); - set(this, ButtonId_X, ButtonId_B, 0); - set(this, ButtonId_X, ButtonId_X, XK_space); - set(this, ButtonId_X, ButtonId_Y, 0); + set(this, X, A, 0); + set(this, X, B, 0); + set(this, X, X, XK_space); + set(this, X, Y, 0); - set(this, ButtonId_Y, ButtonId_A, XK_backslash); - set(this, ButtonId_Y, ButtonId_B, XK_bracketleft); - set(this, ButtonId_Y, ButtonId_X, XK_bracketright); - set(this, ButtonId_Y, ButtonId_Y, XK_Return); + set(this, Y, A, XK_backslash); + set(this, Y, B, XK_bracketleft); + set(this, Y, X, XK_bracketright); + set(this, Y, Y, XK_Return); - set(this, ButtonId_LEFT, ButtonId_Y, XK_1); - set(this, ButtonId_DOWN, ButtonId_Y, XK_2); - set(this, ButtonId_UP, ButtonId_Y, XK_3); - set(this, ButtonId_RIGHT, ButtonId_Y, XK_4); - set(this, ButtonId_RIGHT, ButtonId_LEFT, XK_5); + set(this, LEFT, Y, XK_1); + set(this, DOWN, Y, XK_2); + set(this, UP, Y, XK_3); + set(this, RIGHT, Y, XK_4); + set(this, RIGHT, LEFT, XK_5); - set(this, ButtonId_A, ButtonId_Y, XK_6); - set(this, ButtonId_A, ButtonId_LEFT, XK_7); - set(this, ButtonId_B, ButtonId_LEFT, XK_8); - set(this, ButtonId_X, ButtonId_LEFT, XK_9); - set(this, ButtonId_Y, ButtonId_LEFT, XK_0); + set(this, A, Y, XK_6); + set(this, A, LEFT, XK_7); + set(this, B, LEFT, XK_8); + set(this, X, LEFT, XK_9); + set(this, Y, LEFT, XK_0); - set(this, ButtonId_LEFT, ButtonId_B, XK_q); - set(this, ButtonId_DOWN, ButtonId_B, XK_w); - set(this, ButtonId_UP, ButtonId_B, XK_e); - set(this, ButtonId_RIGHT, ButtonId_B, XK_r); - set(this, ButtonId_RIGHT, ButtonId_UP, XK_t); + set(this, LEFT, B, XK_q); + set(this, DOWN, B, XK_w); + set(this, UP, B, XK_e); + set(this, RIGHT, B, XK_r); + set(this, RIGHT, UP, XK_t); - set(this, ButtonId_A, ButtonId_B, XK_y); - set(this, ButtonId_A, ButtonId_UP, XK_u); - set(this, ButtonId_B, ButtonId_UP, XK_i); - set(this, ButtonId_X, ButtonId_UP, XK_o); - set(this, ButtonId_Y, ButtonId_UP, XK_p); + set(this, A, B, XK_y); + set(this, A, UP, XK_u); + set(this, B, UP, XK_i); + set(this, X, UP, XK_o); + set(this, Y, UP, XK_p); - set(this, ButtonId_LEFT, ButtonId_A, XK_a); - set(this, ButtonId_DOWN, ButtonId_A, XK_s); - set(this, ButtonId_UP, ButtonId_A, XK_d); - set(this, ButtonId_RIGHT, ButtonId_A, XK_f); - set(this, ButtonId_RIGHT, ButtonId_RIGHT, XK_g); + set(this, LEFT, A, XK_a); + set(this, DOWN, A, XK_s); + set(this, UP, A, XK_d); + set(this, RIGHT, A, XK_f); + set(this, RIGHT, RIGHT, XK_g); - set(this, ButtonId_A, ButtonId_A, XK_h); - set(this, ButtonId_A, ButtonId_RIGHT, XK_j); - set(this, ButtonId_B, ButtonId_RIGHT, XK_k); - set(this, ButtonId_X, ButtonId_RIGHT, XK_l); - set(this, ButtonId_Y, ButtonId_RIGHT, XK_semicolon); + set(this, A, A, XK_h); + set(this, A, RIGHT, XK_j); + set(this, B, RIGHT, XK_k); + set(this, X, RIGHT, XK_l); + set(this, Y, RIGHT, XK_semicolon); - set(this, ButtonId_LEFT, ButtonId_X, XK_z); - set(this, ButtonId_DOWN, ButtonId_X, XK_x); - set(this, ButtonId_UP, ButtonId_X, XK_c); - set(this, ButtonId_RIGHT, ButtonId_X, XK_v); - set(this, ButtonId_RIGHT, ButtonId_DOWN, XK_b); + set(this, LEFT, X, XK_z); + set(this, DOWN, X, XK_x); + set(this, UP, X, XK_c); + set(this, RIGHT, X, XK_v); + set(this, RIGHT, DOWN, XK_b); - set(this, ButtonId_A, ButtonId_X, XK_n); - set(this, ButtonId_A, ButtonId_DOWN, XK_m); - set(this, ButtonId_B, ButtonId_DOWN, XK_comma); - set(this, ButtonId_X, ButtonId_DOWN, XK_period); - set(this, ButtonId_Y, ButtonId_DOWN, XK_slash); + set(this, A, X, XK_n); + set(this, A, DOWN, XK_m); + set(this, B, DOWN, XK_comma); + set(this, X, DOWN, XK_period); + set(this, Y, DOWN, XK_slash); } -struct KeyCode *Keymap_get(struct Keymap *this, struct Code *code) +int Keymap_get(struct Keymap *this, struct Code *code) { int index; index = code->first * 8 + code->second; - return &this->keyCode[index]; + return this->keyCode[index]; } diff --git a/keymap.h b/keymap.h index 94e8d11..80f65ca 100644 --- a/keymap.h +++ b/keymap.h @@ -1,18 +1,18 @@ +/* + * Released into the public domain + * by Aki Goto + */ + #ifndef KEYMAP_H #define KEYMAP_H #include "multibutton.h" -struct KeyCode { - int modifier; - int keyCode; -}; - struct Keymap { - struct KeyCode keyCode[8 * 8]; + int keyCode[8 * 8]; }; extern void Keymap_initialize(struct Keymap *this); -extern struct KeyCode *Keymap_get(struct Keymap *this, struct Code *code); +extern int Keymap_get(struct Keymap *this, struct Code *code); #endif diff --git a/main.c b/main.c index 6cbe9d4..44a4983 100644 --- a/main.c +++ b/main.c @@ -1,3 +1,8 @@ +/* + * Released into the public domain + * by Aki Goto + */ + #include #include #include @@ -86,7 +91,7 @@ int main(int argc, char **argv) MultiButton_update(&multiButton, &event); MultiButton_generate(&multiButton); if (multiButton.available) { - struct KeyCode *keyCode; + int keyCode; int state; keyCode = Keymap_get(&keymap, &multiButton.code); @@ -96,12 +101,16 @@ int main(int argc, char **argv) state = 0; } else if (multiButton.code.modifier == Modifier_SHIFT) { state |= ShiftMask; + } else if (multiButton.code.modifier == Modifier_CONTROL) { + state |= ControlMask; + } else if (multiButton.code.modifier == Modifier_ALT) { + state |= Mod1Mask; } else { state = 0; } - keyEvent = createKeyEvent(KeyPress, display, window, root, state, keyCode->keyCode); + keyEvent = createKeyEvent(KeyPress, display, window, root, state, keyCode); XSendEvent(keyEvent.display, keyEvent.window, True, KeyPressMask, (XEvent *)&keyEvent); - keyEvent = createKeyEvent(KeyRelease, display, window, root, state, keyCode->keyCode); + keyEvent = createKeyEvent(KeyRelease, display, window, root, state, keyCode); XSendEvent(keyEvent.display, keyEvent.window, True, KeyPressMask, (XEvent *)&keyEvent); XFlush(display); } diff --git a/multibutton.c b/multibutton.c index 6e563ac..6555748 100644 --- a/multibutton.c +++ b/multibutton.c @@ -1,3 +1,8 @@ +/* + * Released into the public domain + * by Aki Goto + */ + #include "multibutton.h" void MultiButton_initialize(struct MultiButton *this, struct Gamepad *gamepad) @@ -77,6 +82,30 @@ void MultiButton_generate(struct MultiButton *this) this->sequence[this->sequenceSize] = this->buttons[i]; this->sequenceSize++; } + } else if (this->list[0] == this->buttons[i]->control && Button_isHolded(this->buttons[i]->control)) { + int k; + + this->modifier = Modifier_CONTROL; + for (k = 1; k < this->size; k++) { + this->list[k - 1] = this->list[k]; + } + this->size--; + if (this->sequenceSize < 8) { + this->sequence[this->sequenceSize] = this->buttons[i]; + this->sequenceSize++; + } + } else if (this->list[0] == this->buttons[i]->alt && Button_isHolded(this->buttons[i]->alt)) { + int k; + + this->modifier = Modifier_ALT; + for (k = 1; k < this->size; k++) { + this->list[k - 1] = this->list[k]; + } + this->size--; + if (this->sequenceSize < 8) { + this->sequence[this->sequenceSize] = this->buttons[i]; + this->sequenceSize++; + } } else { this->code.modifier = this->modifier; this->code.first = this->list[0]->id; diff --git a/multibutton.h b/multibutton.h index ee963d9..d6611d6 100644 --- a/multibutton.h +++ b/multibutton.h @@ -1,3 +1,8 @@ +/* + * Released into the public domain + * by Aki Goto + */ + #ifndef MULTIBUTTON_H #define MULTIBUTTON_H @@ -6,6 +11,8 @@ enum { Modifier_NONE, Modifier_SHIFT, + Modifier_CONTROL, + Modifier_ALT, }; struct Code {