bool speech_dialog::key_press(const SDL_Event& event) { static int last_mouse = 0; if(text_char_ == num_chars() && options_.empty() == false) { if(event.type == SDL_KEYDOWN) { if(event.key.keysym.scancode == get_keycode(controls::CONTROL_UP)) { move_up(); } else if(event.key.keysym.scancode == get_keycode(controls::CONTROL_DOWN)) { move_down(); } else if(event.key.keysym.sym == SDLK_RETURN || event.key.keysym.sym == SDLK_SPACE || event.key.keysym.scancode == get_keycode(controls::CONTROL_JUMP) || event.key.keysym.scancode == get_keycode(controls::CONTROL_TONGUE)) { return true; } } #if defined(__ANDROID__) // XXX: todo #elif TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE || TARGET_BLACKBERRY if(event.type == SDL_MOUSEBUTTONDOWN) { last_mouse = event.button.which; handle_mouse_move(event.button.x, event.button.y); } if (event.type == SDL_MOUSEMOTION) { if (event.motion.which == last_mouse) handle_mouse_move(event.motion.x, event.motion.y); } if (event.type == SDL_MOUSEBUTTONUP) { if (event.motion.which == last_mouse) { last_mouse = -1; return handle_mouse_move(event.motion.x, event.motion.y); } } #endif return false; } else if (event.type != SDL_KEYDOWN && event.type != SDL_MOUSEBUTTONDOWN) { return false; // only keydown and mousebuttondown should be handled by the rest of the function } return scroll_text(); }
void MCScreenDC::handle_touch(MCEventTouchPhase p_phase, void *p_touch, int32_t p_timestamp, int32_t p_x, int32_t p_y) { switch(p_phase) { case kMCEventTouchPhaseBegan: if (m_mouse_touch == nil) { m_mouse_touch = p_touch; handle_mouse_press(p_timestamp, 0, p_x, p_y, 0, kMCMousePressStateDown); } process_touch(kMCEventTouchPhaseBegan, p_touch, p_timestamp, p_x, p_y); p_phase = kMCEventTouchPhaseMoved; break; case kMCEventTouchPhaseEnded: if (m_mouse_touch == p_touch) { handle_mouse_press(p_timestamp, 0, p_x, p_y, 0, kMCMousePressStateUp); m_mouse_touch = nil; } break; case kMCEventTouchPhaseMoved: if (m_mouse_touch == p_touch) handle_mouse_move(p_timestamp, 0, p_x, p_y); process_touch(kMCEventTouchPhaseMoved, p_touch, p_timestamp, p_x, p_y); break; case kMCEventTouchPhaseCancelled: if (m_mouse_touch == p_touch) { handle_mouse_press(p_timestamp, 0, p_x, p_y, 0, kMCMousePressStateRelease); m_mouse_touch = nil; } break; default: break; } process_touch(p_phase, p_touch, p_timestamp, p_x, p_y); }
void ui_run() { SDL_Event e; quit = false; while(!quit) { ui_render(true); while(SDL_PollEvent(&e) != 0) { if (midi_command_event != (Uint32) -1 && e.type == midi_command_event) { struct midi_event * me = e.user.data1; switch (me->type) { case MIDI_EVENT_SLIDER: set_slider_to(me->slider.index, me->slider.value, me->snap); break; case MIDI_EVENT_KEY:; SDL_KeyboardEvent fakekeyev; memset(&fakekeyev, 0, sizeof fakekeyev); fakekeyev.type = SDL_KEYDOWN; fakekeyev.state = SDL_PRESSED; fakekeyev.keysym.sym = me->key.keycode[0]; handle_key(&fakekeyev); break; } free(e.user.data1); free(e.user.data2); continue; } switch(e.type) { case SDL_QUIT: quit = true; break; case SDL_KEYDOWN: handle_key(&e.key); break; case SDL_MOUSEMOTION: mx = e.motion.x; my = e.motion.y; handle_mouse_move(); break; case SDL_MOUSEBUTTONDOWN: mx = e.button.x; my = e.button.y; switch(e.button.button) { case SDL_BUTTON_LEFT: handle_mouse_down(); break; } break; case SDL_MOUSEBUTTONUP: mx = e.button.x; my = e.button.y; switch(e.button.button) { case SDL_BUTTON_LEFT: handle_mouse_up(); break; } break; case SDL_TEXTINPUT: handle_text(e.text.text); break; } } for(int i=0; i<N_DECKS; i++) { deck_render(&deck[i]); } crossfader_render(&crossfader, deck[left_deck_selector].tex_output, deck[right_deck_selector].tex_output); ui_render(false); render_readback(&render); SDL_GL_SwapWindow(window); double cur_t = SDL_GetTicks(); double dt = cur_t - l_t; if(dt > 0) time += dt / 1000; l_t = cur_t; } }
static void application_handle_message(union message* msg) { /** * 如果是桌面程序 那么首先将消息发给桌面的回调函数处理 **/ if(global_application.application_type & APPLICATION_TYPE_DESKTOP) { if(global_application.desktop_msg_handler != NULL) { global_application.desktop_msg_handler(global_application.desktop_ptr, msg); } } switch(msg->base.type) { case MESSAGE_TYPE_KEYBD_PRESS: handle_keybd_press(msg); break; case MESSAGE_TYPE_KEYBD_RELEASE: handle_keybd_release(msg); break; case MESSAGE_TYPE_KEYBD_CLICK: handle_keybd_click(msg); break; case MESSAGE_TYPE_MOUSE_MOVE: handle_mouse_move(msg); break; case MESSAGE_TYPE_MOUSE_PRESS: handle_mouse_press(msg); break; case MESSAGE_TYPE_MOUSE_RELEASE: handle_mouse_release(msg); break; case MESSAGE_TYPE_MOUSE_SINGLE_CLICK: handle_mouse_single_click(msg); break; case MESSAGE_TYPE_MOUSE_DOUBLE_CLICK: handle_mouse_double_click(msg); break; case MESSAGE_TYPE_WIDGET_REPAINT: handle_widget_repaint(msg); break; case MESSAGE_TYPE_WIDGET_MOVE: handle_widget_move(msg); break; case MESSAGE_TYPE_WIDGET_RESIZE: handle_widget_resize(msg); break; case MESSAGE_TYPE_WINDOW_ACTIVATE: handle_window_activate(msg); break; case MESSAGE_TYPE_WINDOW_DEACTIVATE: handle_window_deactivate(msg); break; case MESSAGE_TYPE_WINDOW_MINIMIZE: handle_window_minimize(msg); break; case MESSAGE_TYPE_WINDOW_MAXIMIZE: handle_window_maximize(msg); break; case MESSAGE_TYPE_WINDOW_RESTORE: handle_window_restore(msg); break; case MESSAGE_TYPE_WINDOW_CANCEL: handle_window_cancel(msg); break; default: application_widgets_for_each_increament(do_find_window, msg); break; } }