summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--platform/haiku/haiku_direct_window.cpp71
-rw-r--r--platform/haiku/haiku_direct_window.h2
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);