diff options
author | Kostadin Damyanov <maxmight@gmail.com> | 2015-06-16 21:52:24 +0300 |
---|---|---|
committer | Kostadin Damyanov <maxmight@gmail.com> | 2015-06-16 21:52:24 +0300 |
commit | 1505d65ac9ec9f44195e961f0089343aabe3de79 (patch) | |
tree | 2403f0d581fb8f93fae6055ccd49dec3eaa7cea9 /platform/haiku | |
parent | 8df3e30abd06ce8d51e6b1ad696aabf97ea9f178 (diff) |
Haiku: handle mouse movement and click events
Diffstat (limited to 'platform/haiku')
-rw-r--r-- | platform/haiku/context_gl_haiku.cpp | 27 | ||||
-rw-r--r-- | platform/haiku/context_gl_haiku.h | 4 | ||||
-rw-r--r-- | platform/haiku/haiku_direct_window.cpp | 177 | ||||
-rw-r--r-- | platform/haiku/haiku_direct_window.h | 26 | ||||
-rw-r--r-- | platform/haiku/haiku_gl_view.cpp | 45 | ||||
-rw-r--r-- | platform/haiku/haiku_gl_view.h | 20 | ||||
-rw-r--r-- | platform/haiku/os_haiku.cpp | 29 | ||||
-rw-r--r-- | platform/haiku/os_haiku.h | 2 |
8 files changed, 227 insertions, 103 deletions
diff --git a/platform/haiku/context_gl_haiku.cpp b/platform/haiku/context_gl_haiku.cpp index 5c82b187b3..8cb1adc360 100644 --- a/platform/haiku/context_gl_haiku.cpp +++ b/platform/haiku/context_gl_haiku.cpp @@ -2,18 +2,11 @@ #if defined(OPENGL_ENABLED) || defined(LEGACYGL_ENABLED) -ContextGL_Haiku::ContextGL_Haiku(HaikuDirectWindow** p_window, OS::VideoMode& p_default_video_mode) { - video_mode = p_default_video_mode; - - uint32 type = BGL_RGB|BGL_DOUBLE|BGL_DEPTH; +ContextGL_Haiku::ContextGL_Haiku(HaikuDirectWindow* p_window) { + window = p_window; - BRect windowRect; - windowRect.Set(50, 50, 800, 600); - - window = new HaikuDirectWindow(windowRect); + uint32 type = BGL_RGB | BGL_DOUBLE | BGL_DEPTH; view = new HaikuGLView(window->Bounds(), type); - - *p_window = window; } ContextGL_Haiku::~ContextGL_Haiku() { @@ -24,18 +17,18 @@ Error ContextGL_Haiku::initialize() { window->AddChild(view); view->LockGL(); window->SetHaikuGLView(view); - window->InitMessageRunner(); - window->Show(); return OK; } void ContextGL_Haiku::release_current() { - ERR_PRINT("release_current() NOT IMPLEMENTED"); + //ERR_PRINT("release_current() NOT IMPLEMENTED"); + view->UnlockGL(); } void ContextGL_Haiku::make_current() { - ERR_PRINT("make_current() NOT IMPLEMENTED"); + view->LockGL(); + //ERR_PRINT("make_current() NOT IMPLEMENTED"); } void ContextGL_Haiku::swap_buffers() { @@ -43,13 +36,11 @@ void ContextGL_Haiku::swap_buffers() { } int ContextGL_Haiku::get_window_width() { - // TODO: implement - return 800; + return window->Bounds().IntegerWidth(); } int ContextGL_Haiku::get_window_height() { - // TODO: implement - return 600; + return window->Bounds().IntegerHeight(); } #endif diff --git a/platform/haiku/context_gl_haiku.h b/platform/haiku/context_gl_haiku.h index 16efa8f61d..e37fe14970 100644 --- a/platform/haiku/context_gl_haiku.h +++ b/platform/haiku/context_gl_haiku.h @@ -3,7 +3,6 @@ #if defined(OPENGL_ENABLED) || defined(LEGACYGL_ENABLED) -#include "os/os.h" #include "drivers/gl_context/context_gl.h" #include "haiku_direct_window.h" @@ -13,10 +12,9 @@ class ContextGL_Haiku : public ContextGL { private: HaikuGLView* view; HaikuDirectWindow* window; - OS::VideoMode video_mode; public: - ContextGL_Haiku(HaikuDirectWindow** p_window, OS::VideoMode& default_video_mode); + ContextGL_Haiku(HaikuDirectWindow* p_window); ~ContextGL_Haiku(); virtual Error initialize(); diff --git a/platform/haiku/haiku_direct_window.cpp b/platform/haiku/haiku_direct_window.cpp index e7f2718278..9c0696bc42 100644 --- a/platform/haiku/haiku_direct_window.cpp +++ b/platform/haiku/haiku_direct_window.cpp @@ -1,45 +1,186 @@ +#include "main/main.h" #include "haiku_direct_window.h" HaikuDirectWindow::HaikuDirectWindow(BRect p_frame) : BDirectWindow(p_frame, "Godot", B_TITLED_WINDOW, 0) { - // TODO: formatting - float minWidth = 0.0f; - float maxWidth = 0.0f; - float minHeight = 0.0f; - float maxHeight = 0.0f; - - GetSizeLimits(&minWidth, &maxWidth, &minHeight, &maxHeight); - SetSizeLimits(50.0f, maxWidth, 50.0f, maxHeight); + last_mouse_pos_valid = false; + last_buttons_state = 0; } -HaikuDirectWindow::~HaikuDirectWindow() -{ - delete update_runner; +HaikuDirectWindow::~HaikuDirectWindow() { + if (update_runner) { + delete update_runner; + } } void HaikuDirectWindow::SetHaikuGLView(HaikuGLView* p_view) { view = p_view; } -void HaikuDirectWindow::InitMessageRunner() { - update_runner = new BMessageRunner(BMessenger(view), +void HaikuDirectWindow::StartMessageRunner() { + update_runner = new BMessageRunner(BMessenger(this), new BMessage(REDRAW_MSG), 1000000/60 /* 60 fps */); } +void HaikuDirectWindow::StopMessageRunner() { + delete update_runner; +} -bool HaikuDirectWindow::QuitRequested() -{ +void HaikuDirectWindow::SetInput(InputDefault* p_input) { + input = p_input; +} + +bool HaikuDirectWindow::QuitRequested() { view->EnableDirectMode(false); be_app->PostMessage(B_QUIT_REQUESTED); return true; } - -void HaikuDirectWindow::DirectConnected(direct_buffer_info *info) -{ +void HaikuDirectWindow::DirectConnected(direct_buffer_info* info) { view->DirectConnected(info); view->EnableDirectMode(true); } +void HaikuDirectWindow::MessageReceived(BMessage* message) +{ + switch (message->what) { + 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: + BDirectWindow::MessageReceived(message); + } +} + +void HaikuDirectWindow::DispatchMessage(BMessage* message, BHandler* handler) { + switch (message->what) { + case B_MOUSE_DOWN: + case B_MOUSE_UP: + DispatchMouseButton(message); + break; + + case B_MOUSE_MOVED: + DispatchMouseMoved(message); + break; + + default: + BDirectWindow::DispatchMessage(message, handler); + } +} + +void HaikuDirectWindow::DispatchMouseButton(BMessage* message) { + message->PrintToStream(); + + BPoint where; + if (message->FindPoint("where", &where) != B_OK) { + return; + } + + uint32 buttons = message->FindInt32("buttons"); + uint32 button = buttons ^ last_buttons_state; + last_buttons_state = buttons; + + // TODO: implement the mouse_mode checks + //if (mouse_mode == MOUSE_MODE_CAPTURED) { + // 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.x = where.x; + mouse_event.mouse_button.y = where.y; + mouse_event.mouse_button.global_x = where.x; + mouse_event.mouse_button.global_y = where.y; + + 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); +} + +void HaikuDirectWindow::DispatchMouseMoved(BMessage* message) { + BPoint where; + if (message->FindPoint("where", &where) != B_OK) { + return; + } + + Point2i pos(where.x, where.y); + + if (!last_mouse_pos_valid) { + last_mouse_pos=pos; + last_mouse_pos_valid=true; + } + + Point2i rel = pos - last_mouse_pos; + + InputEvent motion_event; + motion_event.ID = ++event_id; + 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.x = pos.x; + motion_event.mouse_motion.y = pos.y; + input->set_mouse_pos(pos); + motion_event.mouse_motion.global_x = pos.x; + motion_event.mouse_motion.global_y = pos.y; + motion_event.mouse_motion.speed_x = input->get_mouse_speed().x; + motion_event.mouse_motion.speed_y = input->get_mouse_speed().y; + + motion_event.mouse_motion.relative_x = rel.x; + motion_event.mouse_motion.relative_y = rel.y; + + last_mouse_pos=pos; + + input->parse_input_event(motion_event); +} diff --git a/platform/haiku/haiku_direct_window.h b/platform/haiku/haiku_direct_window.h index 450ea64296..19ea987e76 100644 --- a/platform/haiku/haiku_direct_window.h +++ b/platform/haiku/haiku_direct_window.h @@ -4,24 +4,38 @@ #include <kernel/image.h> // needed for image_id #include <DirectWindow.h> +#include "os/input.h" #include "haiku_gl_view.h" #define REDRAW_MSG 'rdrw' class HaikuDirectWindow : public BDirectWindow { +private: + unsigned int event_id; + Point2i last_mouse_pos; + bool last_mouse_pos_valid; + uint32 last_buttons_state; + + InputDefault* input; + HaikuGLView* view; + BMessageRunner* update_runner; + + void DispatchMouseButton(BMessage* message); + void DispatchMouseMoved(BMessage* message); + public: HaikuDirectWindow(BRect p_frame); ~HaikuDirectWindow(); void SetHaikuGLView(HaikuGLView* p_view); - void InitMessageRunner(); + void StartMessageRunner(); + void StopMessageRunner(); + void SetInput(InputDefault* p_input); virtual bool QuitRequested(); - virtual void DirectConnected(direct_buffer_info *info); - -private: - HaikuGLView* view; - BMessageRunner* update_runner; + virtual void DirectConnected(direct_buffer_info* info); + virtual void MessageReceived(BMessage* message); + virtual void DispatchMessage(BMessage* message, BHandler* handler); }; #endif diff --git a/platform/haiku/haiku_gl_view.cpp b/platform/haiku/haiku_gl_view.cpp index 61a0120656..8adab96a87 100644 --- a/platform/haiku/haiku_gl_view.cpp +++ b/platform/haiku/haiku_gl_view.cpp @@ -1,54 +1,31 @@ +#include "main/main.h" #include "haiku_gl_view.h" HaikuGLView::HaikuGLView(BRect frame, uint32 type) - : BGLView(frame, "SampleGLView", B_FOLLOW_ALL_SIDES, 0, type), rotate(0) + : BGLView(frame, "SampleGLView", B_FOLLOW_ALL_SIDES, 0, type) { - width = frame.right-frame.left; - height = frame.bottom-frame.top; } -void HaikuGLView::AttachedToWindow(void) -{ +void HaikuGLView::AttachedToWindow(void) { LockGL(); BGLView::AttachedToWindow(); UnlockGL(); MakeFocus(); } -void HaikuGLView::FrameResized(float newWidth, float newHeight) -{ -} - -void HaikuGLView::gDraw(float rotation) -{ -} - -void HaikuGLView::gReshape(int width, int height) -{ -} - -void HaikuGLView::Render(void) -{ - LockGL(); - SwapBuffers(); - UnlockGL(); +void HaikuGLView::Draw(BRect updateRect) { + Main::force_redraw(); } -void HaikuGLView::MessageReceived(BMessage * msg) +void HaikuGLView::MessageReceived(BMessage* msg) { + // TODO: remove if not needed switch (msg->what) { - case 'rdrw': - Render(); - /* Rotate a bit more */ - rotate++; - break; - - default: - BGLView::MessageReceived(msg); + default: + BGLView::MessageReceived(msg); } } -void HaikuGLView::KeyDown(const char *bytes, int32 numBytes) -{ - +void HaikuGLView::MouseMoved (BPoint where, uint32 code, const BMessage *dragMessage) { + ERR_PRINT("MouseMoved()"); } diff --git a/platform/haiku/haiku_gl_view.h b/platform/haiku/haiku_gl_view.h index 44d05fa27f..78ebb513a8 100644 --- a/platform/haiku/haiku_gl_view.h +++ b/platform/haiku/haiku_gl_view.h @@ -7,21 +7,11 @@ class HaikuGLView : public BGLView { public: - HaikuGLView(BRect frame, uint32 type); - virtual void AttachedToWindow(void); - virtual void FrameResized(float newWidth, float newHeight); - virtual void MessageReceived(BMessage * msg); - virtual void KeyDown(const char* bytes, int32 numBytes); - - void Render(void); - -private: - void gDraw(float rotation = 0); - void gReshape(int width, int height); - - float width; - float height; - float rotate; + HaikuGLView(BRect frame, uint32 type); + virtual void AttachedToWindow(void); + virtual void MessageReceived(BMessage* msg); + virtual void MouseMoved (BPoint where, uint32 code, const BMessage *dragMessage); + virtual void Draw(BRect updateRect); }; #endif diff --git a/platform/haiku/os_haiku.cpp b/platform/haiku/os_haiku.cpp index bf96cf1716..193927238d 100644 --- a/platform/haiku/os_haiku.cpp +++ b/platform/haiku/os_haiku.cpp @@ -17,6 +17,8 @@ void OS_Haiku::run() { } main_loop->init(); + window->Show(); + window->StartMessageRunner(); /* while (true) { @@ -29,6 +31,7 @@ void OS_Haiku::run() { */ app->Run(); + window->StopMessageRunner(); delete app; main_loop->finish(); @@ -56,8 +59,13 @@ void OS_Haiku::initialize(const VideoMode& p_desired, int p_video_driver, int p_ app = new HaikuApplication(); + BRect frame; + frame.Set(50, 50, 50 + current_video_mode.width - 1, 50 + current_video_mode.height - 1); + + window = new HaikuDirectWindow(frame); + #if defined(OPENGL_ENABLED) || defined(LEGACYGL_ENABLED) - context_gl = memnew(ContextGL_Haiku(&window, current_video_mode)); + context_gl = memnew(ContextGL_Haiku(window)); context_gl->initialize(); rasterizer = memnew(RasterizerGLES2); @@ -67,9 +75,9 @@ void OS_Haiku::initialize(const VideoMode& p_desired, int p_video_driver, int p_ ERR_FAIL_COND(!visual_server); - if (get_render_thread_mode() != RENDER_THREAD_UNSAFE) { - visual_server = memnew(VisualServerWrapMT(visual_server, get_render_thread_mode() == RENDER_SEPARATE_THREAD)); - } + //if (get_render_thread_mode() != RENDER_THREAD_UNSAFE) { + // visual_server = memnew(VisualServerWrapMT(visual_server, get_render_thread_mode() == RENDER_SEPARATE_THREAD)); + //} visual_server->init(); @@ -92,6 +100,9 @@ void OS_Haiku::initialize(const VideoMode& p_desired, int p_video_driver, int p_ spatial_sound_server->init(); spatial_sound_2d_server = memnew(SpatialSound2DServerSW); spatial_sound_2d_server->init(); + + input = memnew(InputDefault); + window->SetInput(input); } void OS_Haiku::finalize() { @@ -121,6 +132,8 @@ void OS_Haiku::finalize() { physics_2d_server->finish(); memdelete(physics_2d_server); + memdelete(input); + #if defined(OPENGL_ENABLED) || defined(LEGACYGL_ENABLED) memdelete(context_gl); #endif @@ -128,9 +141,7 @@ void OS_Haiku::finalize() { void OS_Haiku::set_main_loop(MainLoop* p_main_loop) { main_loop = p_main_loop; - - // TODO: enable - //input->set_main_loop(p_main_loop); + input->set_main_loop(p_main_loop); } MainLoop* OS_Haiku::get_main_loop() const { @@ -146,11 +157,11 @@ void OS_Haiku::delete_main_loop() { } void OS_Haiku::release_rendering_thread() { - ERR_PRINT("release_rendering_thread() NOT IMPLEMENTED"); + context_gl->release_current(); } void OS_Haiku::make_rendering_thread() { - ERR_PRINT("make_rendering_thread() NOT IMPLEMENTED"); + context_gl->make_current(); } bool OS_Haiku::can_draw() const { diff --git a/platform/haiku/os_haiku.h b/platform/haiku/os_haiku.h index 938983347c..b741ae7da0 100644 --- a/platform/haiku/os_haiku.h +++ b/platform/haiku/os_haiku.h @@ -1,6 +1,7 @@ #ifndef OS_HAIKU_H #define OS_HAIKU_H +#include "os/input.h" #include "drivers/unix/os_unix.h" #include "servers/visual_server.h" #include "servers/visual/rasterizer.h" @@ -22,6 +23,7 @@ private: HaikuApplication* app; HaikuDirectWindow* window; MainLoop* main_loop; + InputDefault* input; Rasterizer* rasterizer; VisualServer* visual_server; VideoMode current_video_mode; |