/* Function: al_emit_user_event */ bool al_emit_user_event(ALLEGRO_EVENT_SOURCE *src, ALLEGRO_EVENT *event, void (*dtor)(ALLEGRO_USER_EVENT *)) { size_t num_queues; bool rc; ASSERT(src); ASSERT(event); ASSERT(ALLEGRO_EVENT_TYPE_IS_USER(event->any.type)); if (dtor) { ALLEGRO_USER_EVENT_DESCRIPTOR *descr = al_malloc(sizeof(*descr)); descr->refcount = 0; descr->dtor = dtor; event->user.__internal__descr = descr; } else { event->user.__internal__descr = NULL; } _al_event_source_lock(src); { ALLEGRO_EVENT_SOURCE_REAL *rsrc = (ALLEGRO_EVENT_SOURCE_REAL *)src; num_queues = _al_vector_size(&rsrc->queues); if (num_queues > 0) { event->user.timestamp = al_get_time(); _al_event_source_emit_event(src, event); rc = true; } else { rc = false; } } _al_event_source_unlock(src); if (dtor && !rc) { dtor(&event->user); al_free(event->user.__internal__descr); } return rc; }
void Framework::run_loop() { al_start_timer(primary_timer); while(!shutdown_program || Display::displays.empty()) { ALLEGRO_EVENT this_event, next_event; al_wait_for_event(event_queue, &this_event); current_event = &this_event; time_now = this_event.any.timestamp; get_instance()->motions.update(time_now); Screen::on_events(current_event); switch(this_event.type) { case ALLEGRO_EVENT_TIMER: if (this_event.timer.source == primary_timer) Screen::primary_timer_funcs(); else Screen::timer_funcs(); while (al_peek_next_event(event_queue, &next_event) && next_event.type == ALLEGRO_EVENT_TIMER && next_event.timer.source == this_event.timer.source) al_drop_next_event(event_queue); break; case ALLEGRO_EVENT_KEY_DOWN: if (Framework::current_event->keyboard.keycode == ALLEGRO_KEY_LSHIFT || Framework::current_event->keyboard.keycode == ALLEGRO_KEY_RSHIFT) Framework::key_shift++; if (Framework::current_event->keyboard.keycode == ALLEGRO_KEY_ALT || Framework::current_event->keyboard.keycode == ALLEGRO_KEY_ALTGR) Framework::key_alt++; if (Framework::current_event->keyboard.keycode == ALLEGRO_KEY_RCTRL || Framework::current_event->keyboard.keycode == ALLEGRO_KEY_LCTRL) Framework::key_ctrl++; if (current_event->keyboard.keycode == ALLEGRO_KEY_F1) drawing_profiler_graph = !drawing_profiler_graph; // toggle the profiler graph with F1 Screen::key_down_funcs(); break; case ALLEGRO_EVENT_KEY_UP: if (Framework::current_event->keyboard.keycode == ALLEGRO_KEY_LSHIFT || Framework::current_event->keyboard.keycode == ALLEGRO_KEY_RSHIFT) Framework::key_shift--; if (Framework::current_event->keyboard.keycode == ALLEGRO_KEY_ALT || Framework::current_event->keyboard.keycode == ALLEGRO_KEY_ALTGR) Framework::key_alt--; if (Framework::current_event->keyboard.keycode == ALLEGRO_KEY_RCTRL || Framework::current_event->keyboard.keycode == ALLEGRO_KEY_LCTRL) Framework::key_ctrl--; Screen::key_up_funcs(); break; case ALLEGRO_EVENT_KEY_CHAR: Screen::key_char_funcs(); break; case ALLEGRO_EVENT_MOUSE_BUTTON_UP: Screen::mouse_up_funcs(); break; case ALLEGRO_EVENT_MOUSE_BUTTON_DOWN: Screen::mouse_down_funcs(); break; case ALLEGRO_EVENT_MOUSE_WARPED: Screen::mouse_warp_funcs(); break; case ALLEGRO_EVENT_MOUSE_AXES: Screen::mouse_axes_funcs(); break; case ALLEGRO_EVENT_JOYSTICK_BUTTON_DOWN: Screen::joy_button_down_funcs(); break; case ALLEGRO_EVENT_JOYSTICK_BUTTON_UP: Screen::joy_button_up_funcs(); break; case ALLEGRO_EVENT_JOYSTICK_AXIS: Screen::joy_axis_funcs(); break; case ALLEGRO_EVENT_MOUSE_ENTER_DISPLAY: case ALLEGRO_EVENT_MOUSE_LEAVE_DISPLAY: // currently ignored break; case ALLEGRO_EVENT_DISPLAY_SWITCH_OUT: Screen::display_switch_out_funcs(); break; case ALLEGRO_EVENT_DISPLAY_SWITCH_IN: Screen::display_switch_in_funcs(); break; case ALLEGRO_EVENT_NATIVE_DIALOG_CLOSE: //Screen::display_switch_in_funcs(); if (textlog) close_log_window(); break; case ALLEGRO_EVENT_JOYSTICK_CONFIGURATION: std::cout << "a joystick was added/removed" << std::endl; al_reconfigure_joysticks(); // note: a bug in allegro causes a crash when al_get_joystick(0) if there // are 0 joysticks. So this extra check has been added to prevent // the crash from occuring, though it should be corrected in future // versions when this bug in allegro is fixed. joystick = (al_get_num_joysticks() == 0) ? NULL : al_get_joystick(0); Screen::joy_config_funcs(); break; case ALLEGRO_EVENT_MENU_CLICK: Screen::native_menu_click_funcs(); break; case ALLEGRO_EVENT_DISPLAY_CLOSE: { Display *this_display = Display::find_display(this_event.display.source); if (this_display) this_display->display_close_func(); } break; default: if (ALLEGRO_EVENT_TYPE_IS_USER(this_event.type)) Screen::user_event_funcs(); else std::cout << "uncaught event [" << this_event.type << "]" << std::endl; break; } } }