r/o

f1208672a04dcc75e212b227ac6b345b37a27aec parent cc20ca8a

authored by Yuki Izumi <yuki@kivikakk.ee> 10 years ago
committed by Yuki Izumi <yuki@kivikakk.ee> 10 years ago

Shifted keys.

TODO | 1 -
main.c | 2 +-
qb.c | 53 ++++++++++++++++++++++++++++++++++++++++++++++++-----
3 files changed, 49 insertions(+), 7 deletions(-)
diff --git a/TODO b/TODO
index b739bea..0ab0984 100644
--- a/TODO
+++ b/TODO
@@ -1,5 +1,4 @@
* model a text editor
- * shifted keys
* newlines, backspace
* virtual space entry
* scrolling
diff --git a/main.c b/main.c
index bf12774..73e8e11 100644
--- a/main.c
+++ b/main.c
@@ -61,7 +61,7 @@ void loop(void) {
qb_keypress(event.key.keysym.sym, event.key.keysym.mod);
keydown_tick = SDL_GetTicks();
keydown_sym = event.key.keysym.sym;
- keydown_mod = event.key.keysym.sym;
+ keydown_mod = event.key.keysym.mod;
typematic_on = 0;
break;
diff --git a/qb.c b/qb.c
index 2ca387f..0fd4f66 100644
--- a/qb.c
+++ b/qb.c
@@ -11,6 +11,30 @@ int cursor_y = 0;
int total_lines = 1;
int qb_running = 1;
+static SDL_Keycode shift_table[][2] = {
+ {SDLK_QUOTE, SDLK_QUOTEDBL},
+ {SDLK_COMMA, SDLK_LESS},
+ {SDLK_MINUS, SDLK_UNDERSCORE},
+ {SDLK_PERIOD, SDLK_GREATER},
+ {SDLK_SLASH, SDLK_QUESTION},
+ {SDLK_0, SDLK_RIGHTPAREN},
+ {SDLK_1, SDLK_EXCLAIM},
+ {SDLK_2, SDLK_AT},
+ {SDLK_3, SDLK_HASH},
+ {SDLK_4, SDLK_DOLLAR},
+ {SDLK_5, SDLK_PERCENT},
+ {SDLK_6, SDLK_CARET},
+ {SDLK_7, SDLK_AMPERSAND},
+ {SDLK_8, SDLK_ASTERISK},
+ {SDLK_9, SDLK_LEFTPAREN},
+ {SDLK_SEMICOLON, SDLK_COLON},
+ {SDLK_LEFTBRACKET, '{'},
+ {SDLK_BACKSLASH, '|'},
+ {SDLK_RIGHTBRACKET, '}'},
+ {SDLK_BACKQUOTE, '~'},
+ {SDLK_EQUALS, SDLK_PLUS},
+};
+
static doc_line_t *create_doc_line(void) {
doc_line_t *d = malloc(sizeof(*d));
memset(d, 0, sizeof(*d));
@@ -51,6 +75,29 @@ static void insert_character(doc_line_t *d, int offset, char c) {
++d->stored;
}
+static char get_character(SDL_Keycode sym, Uint16 mod) {
+ if (sym >= SDLK_a && sym <= SDLK_z) {
+ if (mod & (KMOD_SHIFT | KMOD_CAPS)) {
+ return (char) (sym - ('a' - 'A'));
+ }
+ return (char) sym;
+ }
+
+ if (mod & KMOD_SHIFT) {
+ for (int i = 0; i < sizeof(shift_table); ++i) {
+ if (shift_table[i][0] == sym) {
+ return shift_table[i][1];
+ }
+ }
+ }
+
+ return (char) sym;
+}
+
+static int is_printable_key(SDL_Keycode sym) {
+ return sym >= SDLK_SPACE && sym <= SDLK_z;
+}
+
void qb_init(void) {
active_doc = create_doc_line();
active_doc->line = strdup("10 PRINT \"LOL\"");
@@ -67,10 +114,6 @@ void qb_init(void) {
qb_render();
}
-static int is_printable_key(SDL_Keycode sym) {
- return sym >= SDLK_SPACE && sym <= SDLK_z;
-}
-
void qb_keypress(SDL_Keycode sym, Uint16 mod) {
if (sym == SDLK_ESCAPE) {
qb_running = 0;
@@ -89,7 +132,7 @@ void qb_keypress(SDL_Keycode sym, Uint16 mod) {
insert_character(
get_current_doc_line(),
cursor_x,
- (char) sym);
+ get_character(sym, mod));
++cursor_x;
}