static void on_mouse_button_down(struct glwin *win, int button, int x, int y) { g_mouse_down[button -1] = true; g_dx[button - 1] = x; g_dy[button - 1] = y; on_mouse_move(win, x, y); }
afx_msg void kWindow::OnMouseMove( UINT fl, CPoint pt) { kPoint p(pt.x,pt.y); on_mouse_move(p,fl); if(IsWindow(m_hWnd)) CWnd::OnMouseMove(fl,pt); }
bool TopWindow::on_event(const SDL_Event &event) { switch (event.type) { Window *w; case SDL_VIDEOEXPOSE: invalidated_lock.Lock(); invalidated = false; invalidated_lock.Unlock(); expose(); return true; case SDL_KEYDOWN: w = get_focused_window(); if (w == NULL) w = this; return w->on_key_down(event.key.keysym.sym); case SDL_KEYUP: w = get_focused_window(); if (w == NULL) w = this; return w->on_key_up(event.key.keysym.sym); case SDL_MOUSEMOTION: // XXX keys return on_mouse_move(event.motion.x, event.motion.y, 0); case SDL_MOUSEBUTTONDOWN: if (event.button.button == SDL_BUTTON_WHEELUP) return on_mouse_wheel(event.button.x, event.button.y, 1); else if (event.button.button == SDL_BUTTON_WHEELDOWN) return on_mouse_wheel(event.button.x, event.button.y, -1); static PeriodClock double_click; return double_click.check_always_update(300) ? on_mouse_down(event.button.x, event.button.y) : on_mouse_double(event.button.x, event.button.y); case SDL_MOUSEBUTTONUP: if (event.button.button == SDL_BUTTON_WHEELUP || event.button.button == SDL_BUTTON_WHEELDOWN) /* the wheel has already been handled in SDL_MOUSEBUTTONDOWN */ return false; return on_mouse_up(event.button.x, event.button.y); case SDL_QUIT: return on_close(); } return false; }
void RadialMenu::on_process_message(CL_GUIMessage &msg) { if (msg.is_type(CL_GUIMessage_Input::get_type_name())) { CL_GUIMessage_Input input = msg; CL_InputEvent input_event = input.get_event(); if (input_event.type == CL_InputEvent::pointer_moved) on_mouse_move(input_event); else if (input_event.type == CL_InputEvent::released && input_event.id == CL_MOUSE_LEFT) on_mouse_lbutton_up(input_event); } }
// widget developer functions: void UIWidget::mouse_axes_func(float x, float y, float dx, float dy) { if (disabled) return; // start by transforming the coordinates for the children local_mouse_x = x; local_mouse_y = y; float tmdx = dx; float tmdy = dy; surface_area->placement.transform_coordinates(&local_mouse_x, &local_mouse_y); surface_area->placement.transform_coordinates(&tmdx, &tmdy); UIWidget *parent = static_cast<UIWidget *>(get_parent()); if (parent && parent->mouse_is_blocked) mouse_is_blocked = true; else mouse_is_blocked = false; //for (int i=(int)children.size()-1; i>=0; i--) //children[i]->mouse_axes_func(local_mouse_x, local_mouse_y, dx, dy); // I'm not sure why these are dx/dy, but it works correctly this way for (auto &child : ElementID::recast_collection<UIWidget>(get_children())) child->mouse_axes_func(local_mouse_x, local_mouse_y, dx, dy); // I'm not sure why these are dx/dy, but it works correctly this way // then proceed with the execution of the function if (surface_area) { bool mouse_over_now = surface_area->collides(x, y); if (parent && parent->mouse_is_blocked) mouse_over_now = false; if (mouse_over_now && !mouse_over) on_mouse_enter(); else if (!mouse_over_now && mouse_over) on_mouse_leave(); mouse_over = mouse_over_now; if (parent && mouse_over) parent->mouse_is_blocked = true; } on_mouse_move(x, y, dx, dy); // TODO I think this needs to be the translated coordinates, and maybe even should be on the on_drag() call below as well if (mouse_down_on_over) { dragging = true; on_drag(x, y, dx, dy); } if (Framework::current_event->mouse.dz != 0 || Framework::current_event->mouse.dw != 0) on_mouse_wheel(); }
bool TopWindow::on_event(const SDL_Event &event) { switch (event.type) { case SDL_MOUSEMOTION: // XXX keys return on_mouse_move(event.motion.x, event.motion.y, 0); case SDL_MOUSEBUTTONDOWN: return on_mouse_down(event.button.x, event.button.y); case SDL_MOUSEBUTTONUP: return on_mouse_up(event.button.x, event.button.y); } return false; }
void CL_ListViewHeader_Impl::on_process_message(CL_GUIMessage &msg) { if (msg.is_type(CL_GUIMessage_Input::get_type_name())) { CL_GUIMessage_Input input = msg; CL_InputEvent input_event = input.get_event(); if (input_event.type == CL_InputEvent::pointer_moved) on_mouse_move(input, input_event); else if (input_event.type == CL_InputEvent::pressed && input_event.id == CL_MOUSE_LEFT) on_mouse_lbutton_down(input, input_event); else if (input_event.type == CL_InputEvent::released && input_event.id == CL_MOUSE_LEFT) on_mouse_lbutton_up(input, input_event); } else if (msg.is_type(CL_GUIMessage_Pointer::get_type_name())) { CL_GUIMessage_Pointer pointer = msg; if (pointer.get_pointer_type() == CL_GUIMessage_Pointer::pointer_leave) on_mouse_leave(); else if (pointer.get_pointer_type() == CL_GUIMessage_Pointer::pointer_enter) on_mouse_enter(); } }
static void on_mouse_button_up(struct glwin *win, int button, int x, int y) { if (g_mouse_down[0] && button == 1) { struct quaternion next; quaternion_mul(&q_delta, &q_cur, &next); q_cur = next; q_delta.x = 0; q_delta.y = 0; q_delta.z = 0; q_delta.w = 1; need_redraw(g_L); } if (g_mouse_down[2] && button == 3) { g_offset[0] += g_offset_next[0]; g_offset[1] += g_offset_next[1]; g_offset[2] += g_offset_next[2]; g_offset_next[0] = 0; g_offset_next[1] = 0; g_offset_next[2] = 0; need_redraw(g_L); } g_mouse_down[button -1] = false; on_mouse_move(win, x, y); }
void View::on_left_mouse_up(int x, int y) { scaling = dragging = scale_dragging = false; on_mouse_move(x, y); }
bool window::dispatch_event ( XEvent& evt ) { switch ( evt.type ) { case Expose: exposed(); break; case ButtonPress: if ( evt.xbutton.button & Button2 ) on_right_button_down ( evt.xbutton.x, evt.xbutton.y ); else if ( evt.xbutton.button & Button1 ) on_left_button_down ( evt.xbutton.x, evt.xbutton.y ); break; case ButtonRelease: if ( evt.xbutton.button & Button2 ) on_right_button_up ( evt.xbutton.x, evt.xbutton.y ); else if ( evt.xbutton.button & Button1 ) on_left_button_up ( evt.xbutton.x, evt.xbutton.y ); break; case EnterNotify: on_mouse_enter ( evt.xcrossing.x, evt.xcrossing.y ); break; case LeaveNotify: on_mouse_exit ( evt.xcrossing.x, evt.xcrossing.y ); break; case MotionNotify: on_mouse_move ( evt.xmotion.x, evt.xmotion.y ); break; case FocusIn: on_got_focus(); break; case FocusOut: on_lost_focus(); break; case KeyPress: case KeyRelease: { character cp; KeySym keysym; XComposeStatus status; int count = XLookupString ( &evt.xkey, cp.text, character::MAX_CHAR_TEXT, &keysym, &status ); cp.text[count] = 0; if ( evt.type == KeyPress ) on_key_press ( cp ); else on_key_release ( cp ); } break; case MapNotify: state = WINDOW_SHOWN; shown(); break; case UnmapNotify: state = WINDOW_HIDDEN; hidden(); break; case ConfigureNotify: //XClearWindow ( env, hwnd ); //XFlush ( env ); position_changed(); break; case ClientMessage: { if ( atomDelete == (Atom)evt.xclient.data.l[0] ) destroy(); break; } } return true; }
//------------------------------------------------------------------------ int platform_support::run() { SDL_Event event; bool ev_flag = false; for(;;) { if(m_specific->m_update_flag) { on_draw(); update_window(); m_specific->m_update_flag = false; } ev_flag = false; if(m_wait_mode) { SDL_WaitEvent(&event); ev_flag = true; } else { if(SDL_PollEvent(&event)) { ev_flag = true; } else { on_idle(); } } if(ev_flag) { if(event.type == SDL_QUIT) { break; } int y; unsigned flags = 0; switch (event.type) { case SDL_VIDEORESIZE: if(!init(event.resize.w, event.resize.h, m_window_flags)) return false; on_resize(m_rbuf_window.width(), m_rbuf_window.height()); trans_affine_resizing(event.resize.w, event.resize.h); m_specific->m_update_flag = true; break; case SDL_KEYDOWN: { flags = 0; if(event.key.keysym.mod & KMOD_SHIFT) flags |= kbd_shift; if(event.key.keysym.mod & KMOD_CTRL) flags |= kbd_ctrl; bool left = false; bool up = false; bool right = false; bool down = false; switch(event.key.keysym.sym) { case key_left: left = true; break; case key_up: up = true; break; case key_right: right = true; break; case key_down: down = true; break; } if(m_ctrls.on_arrow_keys(left, right, down, up)) { on_ctrl_change(); force_redraw(); } else { on_key(m_specific->m_cur_x, m_specific->m_cur_y, event.key.keysym.sym, flags); } } break; case SDL_MOUSEMOTION: y = m_flip_y ? m_rbuf_window.height() - event.motion.y : event.motion.y; m_specific->m_cur_x = event.motion.x; m_specific->m_cur_y = y; flags = 0; if(event.motion.state & SDL_BUTTON(1)) flags |= mouse_left; if(event.motion.state & SDL_BUTTON(3)) flags |= mouse_right; if(m_ctrls.on_mouse_move(m_specific->m_cur_x, m_specific->m_cur_y, (flags & mouse_left) != 0)) { on_ctrl_change(); force_redraw(); } else { on_mouse_move(m_specific->m_cur_x, m_specific->m_cur_y, flags); } SDL_Event eventtrash; while (SDL_PeepEvents(&eventtrash, 1, SDL_GETEVENT, SDL_EVENTMASK(SDL_MOUSEMOTION))!=0){;} break; case SDL_MOUSEBUTTONDOWN: y = m_flip_y ? m_rbuf_window.height() - event.motion.y : event.motion.y; m_specific->m_cur_x = event.motion.x; m_specific->m_cur_y = y; flags = 0; if(event.button.button == SDL_BUTTON_LEFT) flags = mouse_left; if(event.button.button == SDL_BUTTON_RIGHT) flags = mouse_right; if(flags & mouse_left) { if(m_ctrls.on_mouse_button_down(m_specific->m_cur_x, m_specific->m_cur_y)) { m_ctrls.set_cur(m_specific->m_cur_x, m_specific->m_cur_y); on_ctrl_change(); force_redraw(); } else { if(m_ctrls.in_rect(m_specific->m_cur_x, m_specific->m_cur_y)) { if(m_ctrls.set_cur(m_specific->m_cur_x, m_specific->m_cur_y)) { on_ctrl_change(); force_redraw(); } } else { on_mouse_button_down(m_specific->m_cur_x, m_specific->m_cur_y, flags); } } } if(flags & mouse_right) { on_mouse_button_down(m_specific->m_cur_x, m_specific->m_cur_y, flags); } break; case SDL_MOUSEBUTTONUP: y = m_flip_y ? m_rbuf_window.height() - event.motion.y : event.motion.y; m_specific->m_cur_x = event.motion.x; m_specific->m_cur_y = y; flags = 0; if(m_ctrls.on_mouse_button_up(m_specific->m_cur_x, m_specific->m_cur_y)) { on_ctrl_change(); force_redraw(); } on_mouse_button_up(m_specific->m_cur_x, m_specific->m_cur_y, flags); break; } } } return 0; }
LRESULT Window::on_message(HWND _hWnd, UINT message, WPARAM wParam, LPARAM lParam) { if (IsEmbedded() && !IsAltair()) { /* some older iPaqs such as the H3900 send only WM_KEYUP for VK_APP*, but never VK_KEYDOWN; the hx4700 has an additional set of undocumented key codes (0xca..0xcd) for the APP keys, but sends WM_KEYUP/VK_APP* additionally; the following rules hopefully catch all of these obscurities */ if (message == WM_KEYUP && wParam >= 0x80) /* convert to WM_KEYDOWN to make all handlers catch it */ message = WM_KEYDOWN; else if (message == WM_KEYDOWN && wParam >= 0x80) /* ignore the real WM_KEYDOWN, just in case it really happens */ return 0; } switch (message) { case WM_CREATE: on_create(); return 0; case WM_DESTROY: on_destroy(); return 0; case WM_CLOSE: if (on_close()) /* true returned: message was handled */ return 0; break; case WM_SIZE: on_resize(LOWORD(lParam), HIWORD(lParam)); return 0; case WM_MOUSEMOVE: if (on_mouse_move(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam), wParam)) return 0; break; case WM_LBUTTONDOWN: if (on_mouse_down(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam))) { /* true returned: message was handled */ ResetDisplayTimeOut(); return 0; } break; case WM_LBUTTONUP: if (on_mouse_up(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam))) { /* true returned: message was handled */ ResetDisplayTimeOut(); return 0; } break; case WM_LBUTTONDBLCLK: if (!double_clicks) /* instead of disabling CS_DBLCLKS (which would affect all instances of a window class), we just translate WM_LBUTTONDBLCLK to WM_LBUTTONDOWN here; this even works for built-in window class such as BUTTON */ return on_message(_hWnd, WM_LBUTTONDOWN, wParam, lParam); if (on_mouse_double(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam))) { /* true returned: message was handled */ ResetDisplayTimeOut(); return 0; } break; #ifdef WM_MOUSEWHEEL case WM_MOUSEWHEEL: if (on_mouse_wheel(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam), GET_WHEEL_DELTA_WPARAM(wParam))) { /* true returned: message was handled */ ResetDisplayTimeOut(); return 0; } break; #endif case WM_KEYDOWN: if (on_key_down(::TranscodeKey(wParam))) { /* true returned: message was handled */ ResetDisplayTimeOut(); return 0; } break; case WM_KEYUP: if (on_key_up(::TranscodeKey(wParam))) { /* true returned: message was handled */ ResetDisplayTimeOut(); return 0; } break; case WM_COMMAND: if (on_command(LOWORD(wParam), HIWORD(wParam))) { /* true returned: message was handled */ ResetDisplayTimeOut(); return 0; } break; case WM_CANCELMODE: if (on_cancel_mode()) return 0; break; case WM_SETFOCUS: on_setfocus(); return 0; case WM_KILLFOCUS: on_killfocus(); return 0; case WM_TIMER: if (on_timer(*(WindowTimer *)wParam)) return 0; break; case WM_PAINT: if (custom_painting) { PaintCanvas canvas(*this); on_paint(canvas, canvas.get_dirty()); return 0; } break; case WM_GETDLGCODE: if (on_key_check(wParam)) return DLGC_WANTMESSAGE; break; } if (message >= WM_USER && message <= 0x7FFF && on_user(message - WM_USER)) return 0; return on_unhandled_message(_hWnd, message, wParam, lParam); }
App::App() { // We support all display targets, in order listed here clan::OpenGLTarget::set_current(); // Set the window description clan::DisplayWindowDescription desc_window; desc_window.set_title("Layered Window Example"); desc_window.set_popup_window(); desc_window.set_allow_resize(false); desc_window.set_layered(true); desc_window.show_caption(false); desc_window.set_size(clan::Size(600, 600), false); // Open the windows window = clan::DisplayWindow(desc_window); sc.connect(window.sig_window_close(), [=](){on_window_close(); }); sc.connect(window.get_mouse().sig_key_down(), clan::bind_member(this, &App::on_mouse_down)); sc.connect(window.get_mouse().sig_key_dblclk(), clan::bind_member(this, &App::on_mouse_down)); sc.connect(window.get_mouse().sig_key_up(), clan::bind_member(this, &App::on_mouse_up)); sc.connect(window.get_mouse().sig_pointer_move(), [&](const clan::InputEvent &input){on_mouse_move(input, window); }); sc.connect(window.sig_lost_focus(), clan::bind_member(this, &App::on_lost_focus)); sc.connect(window.get_keyboard().sig_key_up(), clan::bind_member(this, &App::on_input_up)); canvas = clan::Canvas(window); // Get the graphics clan::FontDescription font_desc; font_desc.set_height(48); font_desc.set_subpixel(false); font_large = clan::Font("tahoma", font_desc); font_desc.set_height(30); font_small = clan::Font("tahoma", font_desc); tux = clan::Sprite(canvas, "round_tux.png"); tux_radius = tux.get_width() / 2; rock = clan::Image(canvas, "rock.png"); clan::BlendStateDescription blend_desc; blend_desc.enable_blending(false); blend_state_off = clan::BlendState(canvas, blend_desc); game_time.reset(); }
LRESULT Window::on_message(HWND _hWnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_CREATE: return on_create() ? 0 : -1; break; case WM_DESTROY: if (on_destroy()) return 0; break; case WM_CLOSE: if (on_close()) /* true returned: message was handled */ return 0; break; case WM_SIZE: if (on_resize(LOWORD(lParam), HIWORD(lParam))) return 0; break; case WM_MOUSEMOVE: if (on_mouse_move(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam), wParam)) return 0; break; case WM_LBUTTONDOWN: XCSoarInterface::InterfaceTimeoutReset(); if (on_mouse_down(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam))) { /* true returned: message was handled */ ResetDisplayTimeOut(); return 0; } break; case WM_LBUTTONUP: XCSoarInterface::InterfaceTimeoutReset(); if (on_mouse_up(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam))) { /* true returned: message was handled */ ResetDisplayTimeOut(); return 0; } break; case WM_LBUTTONDBLCLK: XCSoarInterface::InterfaceTimeoutReset(); if (on_mouse_double(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam))) { /* true returned: message was handled */ ResetDisplayTimeOut(); return 0; } break; #ifdef WM_MOUSEWHEEL case WM_MOUSEWHEEL: XCSoarInterface::InterfaceTimeoutReset(); if (on_mouse_wheel(GET_WHEEL_DELTA_WPARAM(wParam))) { /* true returned: message was handled */ ResetDisplayTimeOut(); return 0; } break; #endif case WM_KEYDOWN: XCSoarInterface::InterfaceTimeoutReset(); if (on_key_down(wParam)) { /* true returned: message was handled */ ResetDisplayTimeOut(); return 0; } break; case WM_KEYUP: XCSoarInterface::InterfaceTimeoutReset(); if (on_key_up(wParam)) { /* true returned: message was handled */ ResetDisplayTimeOut(); return 0; } break; case WM_COMMAND: XCSoarInterface::InterfaceTimeoutReset(); if (on_command(LOWORD(wParam), HIWORD(wParam))) { /* true returned: message was handled */ ResetDisplayTimeOut(); return 0; } break; case WM_SETFOCUS: if (on_setfocus()) return 0; break; case WM_KILLFOCUS: if (on_killfocus()) return 0; break; case WM_TIMER: if (on_timer(wParam)) return 0; break; } if (message >= WM_USER && message <= 0x7FFF && on_user(message - WM_USER)) return 0; return on_unhandled_message(_hWnd, message, wParam, lParam); }
void CL_ListView_Impl::on_process_message(CL_GUIMessage &msg) { if (msg.is_type(CL_GUIMessage_Input::get_type_name())) { CL_GUIMessage_Input input = msg; CL_InputEvent input_event = input.get_event(); if (input_event.type == CL_InputEvent::pointer_moved) { on_mouse_move(input, input_event); } else if (input_event.type == CL_InputEvent::pressed && input_event.id == CL_MOUSE_LEFT) { on_mouse_lbutton_down(input, input_event); msg.set_consumed(); } else if (input_event.type == CL_InputEvent::pressed && input_event.id == CL_MOUSE_WHEEL_UP) { scrollbar->set_position(scrollbar->get_position()-scrollbar->get_line_step()); on_scroll(); msg.set_consumed(); } else if (input_event.type == CL_InputEvent::pressed && input_event.id == CL_MOUSE_WHEEL_DOWN) { scrollbar->set_position(scrollbar->get_position() + scrollbar->get_line_step()); on_scroll(); msg.set_consumed(); } else if (input_event.type == CL_InputEvent::released && input_event.id == CL_MOUSE_LEFT) { on_mouse_lbutton_up(input, input_event); msg.set_consumed(); } else if (input_event.type == CL_InputEvent::doubleclick && input_event.id == CL_MOUSE_LEFT) { on_mouse_lbutton_doubleclick(input, input_event); msg.set_consumed(); } else if (input_event.type == CL_InputEvent::pressed && input_event.id == CL_MOUSE_RIGHT) { on_mouse_rbutton_down(input, input_event); msg.set_consumed(); } else if (input_event.type == CL_InputEvent::released && input_event.id == CL_MOUSE_RIGHT) { on_mouse_rbutton_up(input, input_event); msg.set_consumed(); } else if (input_event.type == CL_InputEvent::pressed && input_event.device.get_type() == CL_InputDevice::keyboard) { bool consumed = on_keyboard_pressed(input_event); if (consumed) msg.set_consumed(); } else if (input_event.type == CL_InputEvent::released && input_event.device.get_type() == CL_InputDevice::keyboard) { bool consumed = on_keyboard_released(input_event); if (consumed) msg.set_consumed(); } } else if (msg.is_type(CL_GUIMessage_Pointer::get_type_name())) { CL_GUIMessage_Pointer pointer = msg; if (pointer.get_pointer_type() == CL_GUIMessage_Pointer::pointer_leave) on_mouse_leave(); else if (pointer.get_pointer_type() == CL_GUIMessage_Pointer::pointer_enter) on_mouse_enter(); } else if (msg.is_type(CL_GUIMessage_FocusChange::get_type_name())) { CL_GUIMessage_FocusChange fc = msg; if (fc.get_focus_type() == CL_GUIMessage_FocusChange::gained_focus) { // .. } else { if (just_launched_lineedit) just_launched_lineedit = false; else cancel_edit(); } listview->request_repaint(); } }
void Screen::process_event (const SDL_Event& event) { Control* under_cursor; Control* par; switch (event.type) { case SDL_KEYDOWN: on_key_pressed (event.key); break; case SDL_MOUSEBUTTONDOWN: under_cursor = control_at_pos (event.button.x, event.button.y); on_mouse_button (event.button); if (event.button.button == SDL_BUTTON_LEFT) { be_clicked = under_cursor; if (be_clicked->is_focusable ()) be_clicked->grab_focus (); } break; case SDL_MOUSEBUTTONUP: under_cursor = control_at_pos (event.button.x, event.button.y); on_mouse_button (event.button); if (event.button.button == SDL_BUTTON_LEFT) { par = under_cursor; while (par != popup && par != NULL) { par = par->get_parent (); } if (under_cursor == be_clicked) { be_clicked->on_clicked (); } if (par == NULL) { remove_popup (!(under_cursor->is_focusable () && under_cursor->is_focused ())); } be_clicked = NULL; } break; case SDL_MOUSEMOTION: under_cursor = control_at_pos (event.motion.x, event.motion.y); set_mouse_target (under_cursor); on_mouse_move (event.motion); break; case SDL_ACTIVEEVENT: switch (event.active.state) { case SDL_APPMOUSEFOCUS: if (event.active.gain) { int x, y; SDL_GetMouseState (&x, &y); under_cursor = control_at_pos (x, y); set_mouse_target (under_cursor); } else { set_mouse_target (NULL); } break; } break; case E_SHOW_POPUP: remove_popup (false); add_popup (static_cast<Control*> (event.user.data1), static_cast<Control*> (event.user.data2)); break; case E_HIDE_POPUP: remove_popup (true); break; } }
//------------------------------------------------------------------------ int platform_support::run() { SDL_Event event; bool ev_flag = false; for(;;) { if(m_specific->m_update_flag) { on_draw(); update_window(); m_specific->m_update_flag = false; } ev_flag = false; if(m_wait_mode) { SDL_WaitEvent(&event); ev_flag = true; } else { if(SDL_PollEvent(&event)) { ev_flag = true; } else { on_idle(); } } if(ev_flag) { if(event.type == SDL_QUIT) { break; } int y; unsigned flags = 0; switch (event.type) { int event_x; int event_y; case SDL_WINDOWEVENT: switch (event.window.event) { case SDL_WINDOWEVENT_RESIZED: ERROR_PRINT("SDL_WINDOWEVENT_RESIZED %d,%d\n", event.window.data1, event.window.data2); #ifndef __ANDROID__ if(!init(event.window.data1, event.window.data2, m_window_flags)) return false; on_resize(m_rbuf_window.width(), m_rbuf_window.height()); trans_affine_resizing(event.window.data1, event.window.data2); #endif m_specific->m_update_flag = true; break; default: DEBUG_PRINT("unknown win event type %d\n", event.window.event); break; } break; case SDL_APP_DIDENTERFOREGROUND: DEBUG_PRINT("SDL_APP_DIDENTERFOREGROUND"); enter_foreground(); break; case SDL_APP_WILLENTERFOREGROUND: DEBUG_PRINT("SDL_APP_WILLENTERFOREGROUND"); break; case SDL_APP_DIDENTERBACKGROUND: DEBUG_PRINT("SDL_APP_DIDENTERBACKGROUND"); enter_background(); break; case SDL_APP_WILLENTERBACKGROUND: DEBUG_PRINT("SDL_APP_WILLENTERBACKGROUND"); break; case SDL_KEYDOWN: { flags = 0; if(event.key.keysym.mod & KMOD_SHIFT) flags |= kbd_shift; if(event.key.keysym.mod & KMOD_CTRL) flags |= kbd_ctrl; bool left = false; bool up = false; bool right = false; bool down = false; switch(event.key.keysym.sym) { case key_left: left = true; break; case key_up: up = true; break; case key_right: right = true; break; case key_down: down = true; break; } if(m_ctrls.on_arrow_keys(left, right, down, up)) { on_ctrl_change(); force_redraw(); } else { on_key(m_specific->m_cur_x, m_specific->m_cur_y, event.key.keysym.sym, flags); } } break; case SDL_MOUSEMOTION: event_x = (double)event.button.x*width_factor; event_y = (double)event.button.y*hight_factor; y = m_flip_y ? m_rbuf_window.height() - event_y : event_y; m_specific->m_cur_x = event_x; m_specific->m_cur_y = y; flags = 0; if(event.motion.state & SDL_BUTTON_LMASK) flags |= mouse_left; if(event.motion.state & SDL_BUTTON_RMASK) flags |= mouse_right; if(m_ctrls.on_mouse_move(m_specific->m_cur_x, m_specific->m_cur_y, (flags & mouse_left) != 0)) { on_ctrl_change(); force_redraw(); } else { on_mouse_move(m_specific->m_cur_x, m_specific->m_cur_y, flags); } SDL_Event eventtrash; while (SDL_PeepEvents(&eventtrash, 1, SDL_GETEVENT, SDL_MOUSEMOTION, SDL_MOUSEMOTION)!=0){;} break; case SDL_MOUSEBUTTONDOWN: event_x = (double)event.button.x*width_factor; event_y = (double)event.button.y*hight_factor; DEBUG_PRINT("mouse down: %d,%d %d,%d\n", event.button.x,event.button.y, event_x,event_y); y = m_flip_y ? m_rbuf_window.height() - event_y : event_y; m_specific->m_cur_x = event_x; m_specific->m_cur_y = y; flags = 0; DEBUG_PRINT("mouse down: %d,%d w %d,%d\n", event_x,y, m_rbuf_window.width(), m_rbuf_window.height()); switch(event.button.button) { case SDL_BUTTON_LEFT: { flags = mouse_left; if(m_ctrls.on_mouse_button_down(m_specific->m_cur_x, m_specific->m_cur_y)) { m_ctrls.set_cur(m_specific->m_cur_x, m_specific->m_cur_y); on_ctrl_change(); force_redraw(); } else { if(m_ctrls.in_rect(m_specific->m_cur_x, m_specific->m_cur_y)) { if(m_ctrls.set_cur(m_specific->m_cur_x, m_specific->m_cur_y)) { on_ctrl_change(); force_redraw(); } } else { on_mouse_button_down(m_specific->m_cur_x, m_specific->m_cur_y, flags); } } } break; case SDL_BUTTON_RIGHT: DEBUG_PRINT("SDL_BUTTON_RIGHT"); flags = mouse_right; on_mouse_button_down(m_specific->m_cur_x, m_specific->m_cur_y, flags); break; } //switch(event.button.button) break; case SDL_MOUSEBUTTONUP: event_x = (double)event.button.x*width_factor; event_y = (double)event.button.y*hight_factor; y = m_flip_y ? m_rbuf_window.height() - event_y : event_y; m_specific->m_cur_x = event_x; m_specific->m_cur_y = y; flags = 0; if(m_ctrls.on_mouse_button_up(m_specific->m_cur_x, m_specific->m_cur_y)) { on_ctrl_change(); force_redraw(); } on_mouse_button_up(m_specific->m_cur_x, m_specific->m_cur_y, flags); break; case SDL_MOUSEWHEEL: break; case SDL_FINGERDOWN: case SDL_FINGERUP: case SDL_FINGERMOTION: DEBUG_PRINT("Finger: x=%f, y=%f dx=%f, dy=%f, %d\n", event.tfinger.x, event.tfinger.y, event.tfinger.dx, event.tfinger.dy, (int)event.tfinger.fingerId); on_touch_event( event.tfinger.x, m_flip_y ? 1-event.tfinger.y: event.tfinger.y, event.tfinger.dx, event.tfinger.dy, (int)event.tfinger.fingerId, !(event.type == SDL_FINGERUP)); break; case SDL_MULTIGESTURE: DEBUG_PRINT("Multi Gesture: x = %f, y = %f, dAng = %f, dR = %f numDownTouch = %i\n", event.mgesture.x, event.mgesture.y, event.mgesture.dTheta, event.mgesture.dDist, event.mgesture.numFingers); on_multi_gesture( event.mgesture.x, event.mgesture.y, event.mgesture.dTheta, event.mgesture.dDist, event.mgesture.numFingers); break; default: DEBUG_PRINT("unknown event type %d\n", event.type); break; } } } return 0; }