summaryrefslogtreecommitdiff
path: root/platform/haiku
diff options
context:
space:
mode:
authorKostadin Damyanov <maxmight@gmail.com>2015-07-02 18:41:32 +0300
committerKostadin Damyanov <maxmight@gmail.com>2015-07-02 18:41:32 +0300
commit77e78cdb200b08a079b9d4047ea99227874ff3e1 (patch)
treefdef222f373e27c5821f3b38b2204d9ace148d0b /platform/haiku
parente0e54ea7d456c0fabd8f3f9b2667a69ff520f852 (diff)
Haiku: gl context locking
Diffstat (limited to 'platform/haiku')
-rw-r--r--platform/haiku/context_gl_haiku.cpp3
-rw-r--r--platform/haiku/haiku_direct_window.cpp42
-rw-r--r--platform/haiku/haiku_direct_window.h12
-rw-r--r--platform/haiku/os_haiku.cpp23
4 files changed, 62 insertions, 18 deletions
diff --git a/platform/haiku/context_gl_haiku.cpp b/platform/haiku/context_gl_haiku.cpp
index 8cb1adc360..21107a52a4 100644
--- a/platform/haiku/context_gl_haiku.cpp
+++ b/platform/haiku/context_gl_haiku.cpp
@@ -15,20 +15,17 @@ ContextGL_Haiku::~ContextGL_Haiku() {
Error ContextGL_Haiku::initialize() {
window->AddChild(view);
- view->LockGL();
window->SetHaikuGLView(view);
return OK;
}
void ContextGL_Haiku::release_current() {
- //ERR_PRINT("release_current() NOT IMPLEMENTED");
view->UnlockGL();
}
void ContextGL_Haiku::make_current() {
view->LockGL();
- //ERR_PRINT("make_current() NOT IMPLEMENTED");
}
void ContextGL_Haiku::swap_buffers() {
diff --git a/platform/haiku/haiku_direct_window.cpp b/platform/haiku/haiku_direct_window.cpp
index 8c8069af49..e400d70108 100644
--- a/platform/haiku/haiku_direct_window.cpp
+++ b/platform/haiku/haiku_direct_window.cpp
@@ -23,7 +23,7 @@ void HaikuDirectWindow::SetHaikuGLView(HaikuGLView* p_view) {
void HaikuDirectWindow::StartMessageRunner() {
update_runner = new BMessageRunner(BMessenger(this),
- new BMessage(REDRAW_MSG), 1000000/60 /* 60 fps */);
+ new BMessage(REDRAW_MSG), 1000000/30 /* 30 fps */);
}
void HaikuDirectWindow::StopMessageRunner() {
@@ -68,15 +68,31 @@ void HaikuDirectWindow::DispatchMessage(BMessage* message, BHandler* handler) {
switch (message->what) {
case B_MOUSE_DOWN:
case B_MOUSE_UP:
- DispatchMouseButton(message);
+ HandleMouseButton(message);
break;
case B_MOUSE_MOVED:
- DispatchMouseMoved(message);
+ HandleMouseMoved(message);
break;
case B_MOUSE_WHEEL_CHANGED:
- DispatchMouseWheelChanged(message);
+ HandleMouseWheelChanged(message);
+ break;
+
+ case B_WINDOW_RESIZED:
+ HandleWindowResized(message);
+ //view->UnlockGL();
+ //BDirectWindow::DispatchMessage(message, handler);
+ //view->LockGL();
+ break;
+
+ case LOCKGL_MSG:
+ ERR_PRINT("LOCKGL");
+ view->LockGL();
+ break;
+
+ case UNLOCKGL_MSG:
+ view->UnlockGL();
break;
default:
@@ -84,7 +100,7 @@ void HaikuDirectWindow::DispatchMessage(BMessage* message, BHandler* handler) {
}
}
-void HaikuDirectWindow::DispatchMouseButton(BMessage* message) {
+void HaikuDirectWindow::HandleMouseButton(BMessage* message) {
message->PrintToStream();
BPoint where;
@@ -143,7 +159,7 @@ void HaikuDirectWindow::DispatchMouseButton(BMessage* message) {
input->parse_input_event(mouse_event);
}
-void HaikuDirectWindow::DispatchMouseMoved(BMessage* message) {
+void HaikuDirectWindow::HandleMouseMoved(BMessage* message) {
BPoint where;
if (message->FindPoint("where", &where) != B_OK) {
return;
@@ -183,7 +199,7 @@ void HaikuDirectWindow::DispatchMouseMoved(BMessage* message) {
input->parse_input_event(motion_event);
}
-void HaikuDirectWindow::DispatchMouseWheelChanged(BMessage* message) {
+void HaikuDirectWindow::HandleMouseWheelChanged(BMessage* message) {
float wheel_delta_y = 0;
if (message->FindFloat("be:wheel_delta_y", &wheel_delta_y) != B_OK) {
return;
@@ -210,6 +226,18 @@ void HaikuDirectWindow::DispatchMouseWheelChanged(BMessage* message) {
input->parse_input_event(mouse_event);
}
+void HaikuDirectWindow::HandleWindowResized(BMessage* message) {
+ int32 width = 0;
+ int32 height = 0;
+
+ if ((message->FindInt32("width", &width) != B_OK) || (message->FindInt32("height", &height) != B_OK)) {
+ return;
+ }
+
+ current_video_mode->width = width;
+ current_video_mode->height = height;
+}
+
inline InputModifierState HaikuDirectWindow::GetKeyModifierState(uint32 p_state) {
last_key_modifier_state = p_state;
InputModifierState state;
diff --git a/platform/haiku/haiku_direct_window.h b/platform/haiku/haiku_direct_window.h
index 5355ab4dd4..3667eb24d1 100644
--- a/platform/haiku/haiku_direct_window.h
+++ b/platform/haiku/haiku_direct_window.h
@@ -5,9 +5,12 @@
#include <DirectWindow.h>
#include "os/input.h"
+#include "core/os/os.h"
#include "haiku_gl_view.h"
#define REDRAW_MSG 'rdrw'
+#define LOCKGL_MSG 'glck'
+#define UNLOCKGL_MSG 'ulck'
class HaikuDirectWindow : public BDirectWindow
{
@@ -18,15 +21,17 @@ private:
uint32 last_buttons_state;
uint32 last_key_modifier_state;
int last_button_mask;
+ OS::VideoMode* current_video_mode;
MainLoop* main_loop;
InputDefault* input;
HaikuGLView* view;
BMessageRunner* update_runner;
- void DispatchMouseButton(BMessage* message);
- void DispatchMouseMoved(BMessage* message);
- void DispatchMouseWheelChanged(BMessage* message);
+ void HandleMouseButton(BMessage* message);
+ void HandleMouseMoved(BMessage* message);
+ void HandleMouseWheelChanged(BMessage* message);
+ void HandleWindowResized(BMessage* message);
inline InputModifierState GetKeyModifierState(uint32 p_state);
inline int GetMouseButtonState(uint32 p_state);
@@ -39,6 +44,7 @@ public:
void StopMessageRunner();
void SetInput(InputDefault* p_input);
void SetMainLoop(MainLoop* p_main_loop);
+ inline void SetVideoMode(OS::VideoMode* video_mode) { current_video_mode = video_mode; };
virtual bool QuitRequested();
virtual void DirectConnected(direct_buffer_info* info);
virtual void MessageReceived(BMessage* message);
diff --git a/platform/haiku/os_haiku.cpp b/platform/haiku/os_haiku.cpp
index b4b7877038..2c29260281 100644
--- a/platform/haiku/os_haiku.cpp
+++ b/platform/haiku/os_haiku.cpp
@@ -20,11 +20,21 @@ void OS_Haiku::run() {
}
main_loop->init();
+ context_gl->release_current();
+
+ // TODO: clean up
+ BMessenger* bms = new BMessenger(window);
+ BMessage* msg = new BMessage();
+ bms->SendMessage(LOCKGL_MSG, msg);
+
window->StartMessageRunner();
app->Run();
window->StopMessageRunner();
delete app;
+
+ delete bms;
+ delete msg;
main_loop->finish();
}
@@ -54,6 +64,7 @@ void OS_Haiku::initialize(const VideoMode& p_desired, int p_video_driver, int p_
frame.Set(50, 50, 50 + current_video_mode.width - 1, 50 + current_video_mode.height - 1);
window = new HaikuDirectWindow(frame);
+ window->SetVideoMode(&current_video_mode);
if (current_video_mode.fullscreen) {
window->SetFullScreen(true);
@@ -68,6 +79,7 @@ void OS_Haiku::initialize(const VideoMode& p_desired, int p_video_driver, int p_
#if defined(OPENGL_ENABLED) || defined(LEGACYGL_ENABLED)
context_gl = memnew(ContextGL_Haiku(window));
context_gl->initialize();
+ context_gl->make_current();
rasterizer = memnew(RasterizerGLES2);
#endif
@@ -81,6 +93,10 @@ void OS_Haiku::initialize(const VideoMode& p_desired, int p_video_driver, int p_
// visual_server = memnew(VisualServerWrapMT(visual_server, get_render_thread_mode() == RENDER_SEPARATE_THREAD));
//}
+ input = memnew(InputDefault);
+ window->SetInput(input);
+
+ window->Show();
visual_server->init();
physics_server = memnew(PhysicsServerSW);
@@ -104,10 +120,6 @@ 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);
- window->Show();
}
void OS_Haiku::finalize() {
@@ -266,10 +278,11 @@ void OS_Haiku::set_window_resizable(bool p_enabled) {
}
window->SetFlags(flags);
+ current_video_mode.resizable = p_enabled;
}
bool OS_Haiku::is_window_resizable() const {
- return !(window->Flags() & B_NOT_RESIZABLE);
+ return current_video_mode.resizable;
}
void OS_Haiku::set_window_minimized(bool p_enabled) {