Allegro.cc - Online Community

Allegro.cc Forums » Programming Questions » Question about ALLEGRO_EVENT_KEY_CHAR

Credits go to Edgar Reynaldo for helping out!
This thread is locked; no one can reply to it. rss feed Print
Question about ALLEGRO_EVENT_KEY_CHAR
Bob Keane
Member #7,342
June 2006

I am playing with ALLEGRO_EVENT_KEY_CHAR and having some success. However, When typing characters, it draws the character twice. Here is the code:

#SelectExpand
1#include "allegro5/allegro.h" 2#include "allegro5/allegro_image.h" 3#include "allegro5/allegro_primitives.h" 4#include <stdio.h> 5#include <allegro5/allegro_font.h> 6#include <allegro5/allegro_ttf.h> 7#define white al_map_rgb(255,255,255) 8#define black al_map_rgb(0,0,0) 9#define line_size 2 10bool done = false; 11bool redraw = false; 12 13int main(int argc, char **argv){ 14 15 ALLEGRO_DISPLAY *display = NULL; 16 ALLEGRO_EVENT_QUEUE *event_queue = NULL; 17 ALLEGRO_USTR *input; 18 input = al_ustr_new(""); 19 20 21 if(!al_init()) { 22 fprintf(stderr, "failed to initialize allegro!\n"); 23 return -1; 24 } 25 26 display = al_create_display(640, 480); 27 if(!display) { 28 fprintf(stderr, "failed to create display!\n"); 29 return -1; 30 } 31 32 event_queue = al_create_event_queue(); 33 if(!event_queue) { 34 fprintf(stderr, "failed to create event_queue!\n"); 35 al_destroy_display(display); 36 return -1; 37 } 38 39 if(!al_install_keyboard()) { 40 fprintf(stderr, "failed to initialize the keyboard!\n"); 41 return -1; 42 } 43 44 ALLEGRO_FONT *font = al_create_builtin_font(); 45 46 if (!font){ 47 fprintf(stderr, "Could not create font.\n"); 48 return -1; 49 } 50 51 al_register_event_source(event_queue, al_get_display_event_source(display)); 52 53 al_register_event_source(event_queue, al_get_keyboard_event_source()); 54 55 al_clear_to_color(black); 56 57 al_flip_display(); 58 59 while(!done) 60 { 61 ALLEGRO_EVENT ev; 62 ALLEGRO_TIMEOUT timeout; 63 al_init_timeout(&timeout, 0.06); 64 int position = 0; 65 66 bool get_event = al_wait_for_event_until(event_queue, &ev, &timeout); 67 68 if(get_event && ev.type == ALLEGRO_EVENT_DISPLAY_CLOSE) { 69 done = true; 70 } 71 72 if(get_event && ev.keyboard.keycode == ALLEGRO_KEY_ESCAPE) 73 done = true; 74 75 if(ev.type == ALLEGRO_EVENT_KEY_CHAR){ 76 al_ustr_append_chr(input, ev.keyboard.unichar); 77 redraw = true; 78 } 79 80 if(!al_event_queue_is_empty(&ev) && redraw){ 81 redraw = false; 82 al_draw_textf(font, white, 10, 30, 0, "%s", al_cstr(input)); 83 al_flip_display();} 84 }// end of while loop 85 86// fprintf(stderr, "You entered %u", al_cstr(input)); 87 88 al_destroy_display(display); 89 al_destroy_event_queue(event_queue); 90 91 return 0; 92}

I suspect either my loop is faulty, or allegro_event_key_char reads pressing and releasing the key is read as two keystrokes. Which is the case?

By reading this sig, I, the reader, agree to render my soul to Bob Keane. I, the reader, understand this is a legally binding contract and freely render my soul.
"Love thy neighbor as much as you love yourself means be nice to the people next door. Everyone else can go to hell. Missy Cooper.
The advantage to learning something on your own is that there is no one there to tell you something can't be done.

Edgar Reynaldo
Major Reynaldo
May 2007
avatar

You are ignoring your get event variable in the line that checks were a character event. This means the next time you wait and there's time out as mist it will repeat the character. Sorry I'm on my phone some of this may not make sense.

Bob Keane
Member #7,342
June 2006

That was it. The line should be:

 if(get_event && ev.type == ALLEGRO_EVENT_KEY_CHAR){
       al_ustr_append_chr(input, ev.keyboard.unichar);
       redraw = true;
       }

Thanks.

By reading this sig, I, the reader, agree to render my soul to Bob Keane. I, the reader, understand this is a legally binding contract and freely render my soul.
"Love thy neighbor as much as you love yourself means be nice to the people next door. Everyone else can go to hell. Missy Cooper.
The advantage to learning something on your own is that there is no one there to tell you something can't be done.

Go to: