From 49511ec5745080650a94fad38e50990a20b519f1 Mon Sep 17 00:00:00 2001 From: Peter Wang Date: Tue, 14 Dec 2010 09:01:25 +1100 Subject: [PATCH] Separate character inputs from physical key down events, which we have known for a long time was a design flaw. This change essentially makes it so: - KEY_DOWN loses unichar and modifiers fields - KEY_REPEAT is replaced by KEY_CHAR, which is sent for all character input, not just auto-repeats --- demos/speed/a4_aux.c | 9 ++++----- docs/src/refman/events.txt | 20 ++++++++++++-------- examples/ex_audio_simple.c | 6 ++---- examples/ex_display_options.c | 3 +-- examples/ex_draw_bitmap.c | 3 +-- examples/ex_filter.c | 1 - examples/ex_gldepth.c | 1 - examples/ex_keyboard_events.c | 35 +++++++---------------------------- examples/ex_logo.c | 6 +++--- examples/ex_prim.c | 3 +-- examples/ex_rotate.c | 2 +- examples/ex_scale.c | 2 +- examples/ex_stream_seek.c | 3 +-- examples/ex_subbitmap.c | 2 +- examples/nihgui.cpp | 3 +-- include/allegro5/events.h | 2 +- python/ex_draw_bitmap.py | 3 +-- src/macosx/keybd.m | 18 +++++++++++++----- src/win/wkeyboard.c | 19 +++++++++++++++---- src/x/xkeyboard.c | 25 +++++++++++++++++-------- 20 files changed, 83 insertions(+), 83 deletions(-) diff --git a/demos/speed/a4_aux.c b/demos/speed/a4_aux.c index 4cd8eed..382bcd1 100644 --- a/demos/speed/a4_aux.c +++ b/demos/speed/a4_aux.c @@ -142,17 +142,16 @@ void poll_input() case ALLEGRO_EVENT_KEY_DOWN: key[event.keyboard.keycode] = 1; - add_key(&event.keyboard); - break; - - case ALLEGRO_EVENT_KEY_REPEAT: - add_key(&event.keyboard); break; case ALLEGRO_EVENT_KEY_UP: key[event.keyboard.keycode] = 0; break; + case ALLEGRO_EVENT_KEY_CHAR: + add_key(&event.keyboard); + break; + case ALLEGRO_EVENT_JOYSTICK_BUTTON_DOWN: if (event.joystick.button == 0) joy_b1 = 1; diff --git a/docs/src/refman/events.txt b/docs/src/refman/events.txt index 0fc8277..a5f4442 100644 --- a/docs/src/refman/events.txt +++ b/docs/src/refman/events.txt @@ -44,22 +44,26 @@ ALLEGRO_EVENT_JOYSTICK_CONFIGURATION ALLEGRO_EVENT_KEY_DOWN : A keyboard key was pressed. : - keyboard.keycode, - - keyboard.unichar, - - keyboard.modifiers, - keyboard.display. -ALLEGRO_EVENT_KEY\_REPEAT -: A typed character auto-repeated. -: - keyboard.keycode (ALLEGRO\_KEY\_\*), - - keyboard.unichar (unicode character), - - keyboard.modifiers (ALLEGRO\_KEYMOD\_\*), - - keyboard.display. + Note: this event is about the physical keys being press on the keyboard. + Look for ALLEGRO_EVENT_KEY_CHAR events for character input. ALLEGRO_EVENT_KEY_UP : A keyboard key was released. : - keyboard.keycode, - keyboard.display. +ALLEGRO_EVENT_KEY_CHAR +: A character was typed on the keyboard, or a character was auto-repeated. +: - keyboard.keycode, + - keyboard.unichar (unicode character), + - keyboard.modifiers (ALLEGRO\_KEYMOD\_\*), + - keyboard.display. + + Note: this event is also generated for non-visible "characters", such as + arrow keys. In that case, the unichar field will be negative. + ALLEGRO_EVENT_MOUSE_AXES : One or more mouse axis values changed. : - mouse.x, diff --git a/examples/ex_audio_simple.c b/examples/ex_audio_simple.c index 3ff5af9..2a0db91 100644 --- a/examples/ex_audio_simple.c +++ b/examples/ex_audio_simple.c @@ -74,13 +74,11 @@ Restart: while (true) { al_wait_for_event(event_queue, &event); - if (event.type == ALLEGRO_EVENT_KEY_DOWN || - event.type == ALLEGRO_EVENT_KEY_REPEAT) { + if (event.type == ALLEGRO_EVENT_KEY_CHAR) { if (event.keyboard.keycode == ALLEGRO_KEY_ESCAPE) { break; } - - if (event.keyboard.keycode == ALLEGRO_KEY_SPACE) { + if (event.keyboard.unichar == ' ') { al_stop_samples(); } diff --git a/examples/ex_display_options.c b/examples/ex_display_options.c index db76ddf..7445b58 100644 --- a/examples/ex_display_options.c +++ b/examples/ex_display_options.c @@ -255,8 +255,7 @@ int main(void) old_flags |= f; } } - if (event.type == ALLEGRO_EVENT_KEY_DOWN || - event.type == ALLEGRO_EVENT_KEY_REPEAT) { + if (event.type == ALLEGRO_EVENT_KEY_CHAR) { int change; if (event.keyboard.keycode == ALLEGRO_KEY_ESCAPE) break; diff --git a/examples/ex_draw_bitmap.c b/examples/ex_draw_bitmap.c index dbfe993..24cd55d 100644 --- a/examples/ex_draw_bitmap.c +++ b/examples/ex_draw_bitmap.c @@ -313,8 +313,7 @@ int main(void) al_wait_for_event(queue, &event); switch (event.type) { - case ALLEGRO_EVENT_KEY_DOWN: - case ALLEGRO_EVENT_KEY_REPEAT: + case ALLEGRO_EVENT_KEY_CHAR: /* includes repeats */ if (event.keyboard.keycode == ALLEGRO_KEY_ESCAPE) done = true; else if (event.keyboard.keycode == ALLEGRO_KEY_UP) { diff --git a/examples/ex_filter.c b/examples/ex_filter.c index 2bedbd7..ae8310c 100644 --- a/examples/ex_filter.c +++ b/examples/ex_filter.c @@ -173,7 +173,6 @@ int main(void) al_wait_for_event(queue, &event); switch (event.type) { case ALLEGRO_EVENT_KEY_DOWN: - case ALLEGRO_EVENT_KEY_REPEAT: if (event.keyboard.keycode == ALLEGRO_KEY_ESCAPE) done = true; if (event.keyboard.keycode == ALLEGRO_KEY_SPACE) diff --git a/examples/ex_gldepth.c b/examples/ex_gldepth.c index 27a764e..aae0560 100644 --- a/examples/ex_gldepth.c +++ b/examples/ex_gldepth.c @@ -220,7 +220,6 @@ int main(void) goto done; case ALLEGRO_EVENT_KEY_DOWN: - case ALLEGRO_EVENT_KEY_REPEAT: if(event.keyboard.keycode == ALLEGRO_KEY_ESCAPE) goto done; keyboard(event.keyboard.keycode); diff --git a/examples/ex_keyboard_events.c b/examples/ex_keyboard_events.c index caea9fb..f8689dc 100644 --- a/examples/ex_keyboard_events.c +++ b/examples/ex_keyboard_events.c @@ -64,45 +64,24 @@ static void main_loop(void) switch (event.type) { /* ALLEGRO_EVENT_KEY_DOWN - a keyboard key was pressed. - * The three keyboard event fields we use here are: - * - * keycode -- an integer constant representing the key, e.g. - * AL_KEY_ESCAPE; - * - * unichar -- the Unicode character being typed, if any. This can - * depend on the modifier keys and previous keys that were - * pressed, e.g. for accents. - * - * modifiers -- a bitmask containing the state of Shift/Ctrl/Alt, etc. - * keys. */ case ALLEGRO_EVENT_KEY_DOWN: if (event.keyboard.keycode == ALLEGRO_KEY_ESCAPE) { return; } - log_key("KEY_DOWN ", - event.keyboard.keycode, - event.keyboard.unichar, - event.keyboard.modifiers); + log_key("KEY_DOWN ", event.keyboard.keycode, 0, 0); break; - /* ALLEGRO_EVENT_KEY_REPEAT - a keyboard key was held down long enough to - * 'repeat'. This is a useful event if you are working on something - * that requires typed input. The repeat rate should be determined - * by the operating environment the program is running in. + /* ALLEGRO_EVENT_KEY_UP - a keyboard key was released. */ - case ALLEGRO_EVENT_KEY_REPEAT: - log_key("KEY_REPEAT", - event.keyboard.keycode, - event.keyboard.unichar, - event.keyboard.modifiers); + case ALLEGRO_EVENT_KEY_UP: + log_key("KEY_UP ", event.keyboard.keycode, 0, 0); break; - /* ALLEGRO_EVENT_KEY_UP - a keyboard key was released. - * Note that the unichar field is unused for this event. + /* ALLEGRO_EVENT_KEY_CHAR - a character was typed or repeated. */ - case ALLEGRO_EVENT_KEY_UP: - log_key("KEY_UP ", + case ALLEGRO_EVENT_KEY_CHAR: + log_key("KEY_CHAR ", event.keyboard.keycode, event.keyboard.unichar, event.keyboard.modifiers); diff --git a/examples/ex_logo.c b/examples/ex_logo.c index 8e15e22..fb91485 100644 --- a/examples/ex_logo.c +++ b/examples/ex_logo.c @@ -442,10 +442,10 @@ int main(void) al_wait_for_event(queue, &event); if (event.type == ALLEGRO_EVENT_DISPLAY_CLOSE) break; - if (event.type == ALLEGRO_EVENT_KEY_DOWN || - event.type == ALLEGRO_EVENT_KEY_REPEAT) { - if (event.keyboard.keycode == ALLEGRO_KEY_ESCAPE) + if (event.type == ALLEGRO_EVENT_KEY_CHAR) { + if (event.keyboard.keycode == ALLEGRO_KEY_ESCAPE) { quit = true; + } else if (event.keyboard.keycode == ALLEGRO_KEY_ENTER) { if (editing) { regenerate = true; diff --git a/examples/ex_prim.c b/examples/ex_prim.c index 9028cca..258f0da 100644 --- a/examples/ex_prim.c +++ b/examples/ex_prim.c @@ -617,8 +617,7 @@ int main(void) done = true; break; } - case ALLEGRO_EVENT_KEY_DOWN: - case ALLEGRO_EVENT_KEY_REPEAT: { + case ALLEGRO_EVENT_KEY_CHAR: { switch (key_event.keyboard.keycode) { case ALLEGRO_KEY_ESCAPE: { done = true; diff --git a/examples/ex_rotate.c b/examples/ex_rotate.c index 809ad6b..aa89e73 100644 --- a/examples/ex_rotate.c +++ b/examples/ex_rotate.c @@ -83,7 +83,7 @@ int main(void) while (true) { if (al_get_next_event(queue, &event)) { - if (event.type == ALLEGRO_EVENT_KEY_DOWN) { + if (event.type == ALLEGRO_EVENT_KEY_CHAR) { if (event.keyboard.keycode == ALLEGRO_KEY_ESCAPE) break; if (event.keyboard.unichar == ' ') { diff --git a/examples/ex_scale.c b/examples/ex_scale.c index c0800bb..2850d5b 100644 --- a/examples/ex_scale.c +++ b/examples/ex_scale.c @@ -84,7 +84,7 @@ int main(void) while (true) { if (al_get_next_event(queue, &event)) { - if (event.type == ALLEGRO_EVENT_KEY_DOWN) { + if (event.type == ALLEGRO_EVENT_KEY_CHAR) { if (event.keyboard.keycode == ALLEGRO_KEY_ESCAPE) break; if (event.keyboard.unichar == ' ') { diff --git a/examples/ex_stream_seek.c b/examples/ex_stream_seek.c index 1ea9d17..09eefbd 100644 --- a/examples/ex_stream_seek.c +++ b/examples/ex_stream_seek.c @@ -180,8 +180,7 @@ static void event_handler(const ALLEGRO_EVENT * event) break; /* Was a key pressed? */ - case ALLEGRO_EVENT_KEY_DOWN: - case ALLEGRO_EVENT_KEY_REPEAT: + case ALLEGRO_EVENT_KEY_CHAR: if (event->keyboard.keycode == ALLEGRO_KEY_LEFT) { double pos = al_get_audio_stream_position_secs(music_stream); pos -= 5.0; diff --git a/examples/ex_subbitmap.c b/examples/ex_subbitmap.c index 4679e6b..cfad268 100644 --- a/examples/ex_subbitmap.c +++ b/examples/ex_subbitmap.c @@ -239,7 +239,7 @@ int main(int argc, const char *argv[]) if (event.type == ALLEGRO_EVENT_DISPLAY_CLOSE) { break; } - if (event.type == ALLEGRO_EVENT_KEY_DOWN) { + if (event.type == ALLEGRO_EVENT_KEY_CHAR) { if (event.keyboard.keycode == ALLEGRO_KEY_ESCAPE) { break; } diff --git a/examples/nihgui.cpp b/examples/nihgui.cpp index 99c3425..bf7e300 100644 --- a/examples/nihgui.cpp +++ b/examples/nihgui.cpp @@ -182,8 +182,7 @@ void Dialog::run_step(bool block) this->request_quit(); break; - case ALLEGRO_EVENT_KEY_DOWN: - case ALLEGRO_EVENT_KEY_REPEAT: + case ALLEGRO_EVENT_KEY_CHAR: on_key_down(event.keyboard); break; diff --git a/include/allegro5/events.h b/include/allegro5/events.h index 0bac81d..04d6e20 100644 --- a/include/allegro5/events.h +++ b/include/allegro5/events.h @@ -20,7 +20,7 @@ enum ALLEGRO_EVENT_JOYSTICK_CONFIGURATION = 4, ALLEGRO_EVENT_KEY_DOWN = 10, - ALLEGRO_EVENT_KEY_REPEAT = 11, + ALLEGRO_EVENT_KEY_CHAR = 11, ALLEGRO_EVENT_KEY_UP = 12, ALLEGRO_EVENT_MOUSE_AXES = 20, diff --git a/python/ex_draw_bitmap.py b/python/ex_draw_bitmap.py index 2841067..9d72692 100755 --- a/python/ex_draw_bitmap.py +++ b/python/ex_draw_bitmap.py @@ -275,8 +275,7 @@ def main(): al_wait_for_event(queue, byref(event)) - if event.type in [ALLEGRO_EVENT_KEY_DOWN, - ALLEGRO_EVENT_KEY_REPEAT]: + if event.type == ALLEGRO_EVENT_KEY_CHAR: if event.keyboard.keycode == ALLEGRO_KEY_ESCAPE: done = True elif event.keyboard.keycode == ALLEGRO_KEY_UP: diff --git a/src/macosx/keybd.m b/src/macosx/keybd.m index 2f83954..9aaf5a9 100644 --- a/src/macosx/keybd.m +++ b/src/macosx/keybd.m @@ -80,17 +80,25 @@ static void _handle_key_press(ALLEGRO_DISPLAY* dpy, int unicode, int scancode, i _al_event_source_lock(&keyboard.es); { /* Generate the press event if necessary. */ - type = is_repeat ? ALLEGRO_EVENT_KEY_REPEAT : ALLEGRO_EVENT_KEY_DOWN; if (_al_event_source_needs_to_generate_event(&keyboard.es)) { ALLEGRO_EVENT event; - event.keyboard.type = type; + event.keyboard.type = ALLEGRO_EVENT_KEY_DOWN; event.keyboard.timestamp = al_get_time(); event.keyboard.display = dpy; event.keyboard.keycode = scancode; - event.keyboard.unichar = unicode; - event.keyboard.modifiers = modifiers; - _al_event_source_emit_event(&keyboard.es, &event); + event.keyboard.unichar = 0; + event.keyboard.modifiers = 0; + if (!is_repeat) { + _al_event_source_emit_event(&keyboard.es, &event); + } + + { + event.keyboard.type = ALLEGRO_EVENT_KEY_CHAR; + event.keyboard.unichar = unichar; + event.keyboard.modifiers = modifiers; + _al_event_source_emit_event(&keyboard.es, &event); + } } } /* Maintain the kbdstate array. */ diff --git a/src/win/wkeyboard.c b/src/win/wkeyboard.c index fc3efb7..0b0f40f 100644 --- a/src/win/wkeyboard.c +++ b/src/win/wkeyboard.c @@ -303,15 +303,26 @@ void _al_win_kbd_handle_key_press(int scode, int vcode, bool repeated, if (!_al_event_source_needs_to_generate_event(&the_keyboard.es)) return; - event.keyboard.type = repeated ? ALLEGRO_EVENT_KEY_REPEAT : ALLEGRO_EVENT_KEY_DOWN; + event.keyboard.type = ALLEGRO_EVENT_KEY_DOWN; event.keyboard.timestamp = al_get_time(); event.keyboard.display = (void*)win_disp; event.keyboard.keycode = my_code; - event.keyboard.unichar = ccode; - event.keyboard.modifiers = modifiers; + event.keyboard.unichar = 0; + event.keyboard.modifiers = 0; _al_event_source_lock(&the_keyboard.es); - _al_event_source_emit_event(&the_keyboard.es, &event); + + if (!repeated) { + _al_event_source_emit_event(&the_keyboard.es, &event); + } + + { + event.keyboard.type = ALLEGRO_EVENT_KEY_CHAR; + event.keyboard.unichar = ccode; + event.keyboard.modifiers = modifiers; + _al_event_source_emit_event(&the_keyboard.es, &event); + } + _al_event_source_unlock(&the_keyboard.es); } diff --git a/src/x/xkeyboard.c b/src/x/xkeyboard.c index 391ec34..577c168 100644 --- a/src/x/xkeyboard.c +++ b/src/x/xkeyboard.c @@ -964,7 +964,6 @@ static void handle_key_press(int mycode, int unichar, unsigned int modifiers, ALLEGRO_DISPLAY *display) { bool is_repeat; - ALLEGRO_EVENT_TYPE type; is_repeat = (last_press_code == mycode); last_press_code = mycode; @@ -974,17 +973,27 @@ static void handle_key_press(int mycode, int unichar, unsigned int modifiers, /* Update the key_down array. */ _AL_KEYBOARD_STATE_SET_KEY_DOWN(the_keyboard.state, mycode); - /* Generate the press event if necessary. */ - type = is_repeat ? ALLEGRO_EVENT_KEY_REPEAT : ALLEGRO_EVENT_KEY_DOWN; + /* Generate the events if necessary. */ if (_al_event_source_needs_to_generate_event(&the_keyboard.parent.es)) { ALLEGRO_EVENT event; - event.keyboard.type = type; + + event.keyboard.type = ALLEGRO_EVENT_KEY_DOWN; event.keyboard.timestamp = al_get_time(); event.keyboard.display = display; - event.keyboard.keycode = mycode; - event.keyboard.unichar = unichar; - event.keyboard.modifiers = modifiers; - _al_event_source_emit_event(&the_keyboard.parent.es, &event); + event.keyboard.keycode = mycode; + event.keyboard.unichar = 0; + event.keyboard.modifiers = 0; + + if (!is_repeat) { + _al_event_source_emit_event(&the_keyboard.parent.es, &event); + } + + { + event.keyboard.type = ALLEGRO_EVENT_KEY_CHAR; + event.keyboard.unichar = unichar; + event.keyboard.modifiers = modifiers; + _al_event_source_emit_event(&the_keyboard.parent.es, &event); + } } } _al_event_source_unlock(&the_keyboard.parent.es); -- 1.7.3.2