diff options
-rw-r--r-- | platform/haiku/haiku_direct_window.cpp | 71 | ||||
-rw-r--r-- | platform/haiku/haiku_direct_window.h | 2 |
2 files changed, 51 insertions, 22 deletions
diff --git a/platform/haiku/haiku_direct_window.cpp b/platform/haiku/haiku_direct_window.cpp index 9c0696bc42..6ff4369087 100644 --- a/platform/haiku/haiku_direct_window.cpp +++ b/platform/haiku/haiku_direct_window.cpp @@ -39,7 +39,7 @@ bool HaikuDirectWindow::QuitRequested() { } void HaikuDirectWindow::DirectConnected(direct_buffer_info* info) { - view->DirectConnected(info); + view->DirectConnected(info); view->EnableDirectMode(true); } @@ -49,21 +49,21 @@ void HaikuDirectWindow::MessageReceived(BMessage* message) case REDRAW_MSG: //ERR_PRINT("iteration 1"); Main::iteration(); - + //if (NeedsUpdate()) { // ERR_PRINT("NEEDS UPDATE"); // Main::force_redraw(); //} - + //ERR_PRINT("iteration 2"); break; - + case B_INVALIDATE: ERR_PRINT("WINDOW B_INVALIDATE"); //Main::force_redraw(); break; - default: + default: BDirectWindow::MessageReceived(message); } } @@ -92,6 +92,7 @@ void HaikuDirectWindow::DispatchMouseButton(BMessage* message) { return; } + uint32 modifiers = message->FindInt32("modifiers"); uint32 buttons = message->FindInt32("buttons"); uint32 button = buttons ^ last_buttons_state; last_buttons_state = buttons; @@ -101,15 +102,14 @@ void HaikuDirectWindow::DispatchMouseButton(BMessage* message) { // event.xbutton.x=last_mouse_pos.x; // event.xbutton.y=last_mouse_pos.y; //} - + InputEvent mouse_event; mouse_event.ID = ++event_id; mouse_event.type = InputEvent::MOUSE_BUTTON; mouse_event.device = 0; - // TODO: implement the modifier state getters - //mouse_event.mouse_button.mod = get_key_modifier_state(event.xbutton.state); - //mouse_event.mouse_button.button_mask = get_mouse_button_state(event.xbutton.state); + mouse_event.mouse_button.mod = GetKeyModifierState(modifiers); + mouse_event.mouse_button.button_mask = GetMouseButtonState(buttons); mouse_event.mouse_button.x = where.x; mouse_event.mouse_button.y = where.y; mouse_event.mouse_button.global_x = where.x; @@ -118,30 +118,27 @@ void HaikuDirectWindow::DispatchMouseButton(BMessage* message) { switch (button) { default: case B_PRIMARY_MOUSE_BUTTON: - ERR_PRINT("PRIMARY"); mouse_event.mouse_button.button_index = 1; break; case B_SECONDARY_MOUSE_BUTTON: - ERR_PRINT("SECONDARY"); mouse_event.mouse_button.button_index = 2; break; case B_TERTIARY_MOUSE_BUTTON: - ERR_PRINT("MIDDLE"); mouse_event.mouse_button.button_index = 3; break; } - + mouse_event.mouse_button.pressed = (message->what == B_MOUSE_DOWN); if (message->what == B_MOUSE_DOWN && mouse_event.mouse_button.button_index == 1) { int32 clicks = message->FindInt32("clicks"); - + if (clicks > 1) { mouse_event.mouse_button.doubleclick=true; } - } + } input->parse_input_event(mouse_event); } @@ -151,12 +148,14 @@ void HaikuDirectWindow::DispatchMouseMoved(BMessage* message) { if (message->FindPoint("where", &where) != B_OK) { return; } - + Point2i pos(where.x, where.y); - + uint32 modifiers = message->FindInt32("modifiers"); + uint32 buttons = message->FindInt32("buttons"); + if (!last_mouse_pos_valid) { - last_mouse_pos=pos; - last_mouse_pos_valid=true; + last_mouse_pos = pos; + last_mouse_pos_valid = true; } Point2i rel = pos - last_mouse_pos; @@ -166,9 +165,8 @@ void HaikuDirectWindow::DispatchMouseMoved(BMessage* message) { motion_event.type = InputEvent::MOUSE_MOTION; motion_event.device = 0; - // TODO: implement the modifier state getters - //motion_event.mouse_motion.mod = get_key_modifier_state(event.xmotion.state); - //motion_event.mouse_motion.button_mask = get_mouse_button_state(event.xmotion.state); + motion_event.mouse_motion.mod = GetKeyModifierState(modifiers); + motion_event.mouse_motion.button_mask = GetMouseButtonState(buttons); motion_event.mouse_motion.x = pos.x; motion_event.mouse_motion.y = pos.y; input->set_mouse_pos(pos); @@ -184,3 +182,32 @@ void HaikuDirectWindow::DispatchMouseMoved(BMessage* message) { input->parse_input_event(motion_event); } + +inline InputModifierState HaikuDirectWindow::GetKeyModifierState(uint32 p_state) { + InputModifierState state; + + state.shift = (p_state & B_SHIFT_KEY) != 0; + state.control = (p_state & B_CONTROL_KEY) != 0; + state.alt = (p_state & B_OPTION_KEY) != 0; + state.meta = (p_state & B_COMMAND_KEY) != 0; + + return state; +} + +inline unsigned int HaikuDirectWindow::GetMouseButtonState(uint32 p_state) { + unsigned int state = 0; + + if (p_state & B_PRIMARY_MOUSE_BUTTON) { + state |= 1 << 0; + } + + if (p_state & B_SECONDARY_MOUSE_BUTTON) { + state |= 1 << 1; + } + + if (p_state & B_TERTIARY_MOUSE_BUTTON) { + state |= 1 << 2; + } + + return state; +} diff --git a/platform/haiku/haiku_direct_window.h b/platform/haiku/haiku_direct_window.h index 19ea987e76..bb0ef43da0 100644 --- a/platform/haiku/haiku_direct_window.h +++ b/platform/haiku/haiku_direct_window.h @@ -23,6 +23,8 @@ private: void DispatchMouseButton(BMessage* message); void DispatchMouseMoved(BMessage* message); + inline InputModifierState GetKeyModifierState(uint32 p_state); + inline unsigned int GetMouseButtonState(uint32 p_state); public: HaikuDirectWindow(BRect p_frame); |