Jelajahi Sumber

Haiku: handle the quit request message

Kostadin Damyanov 10 tahun lalu
induk
melakukan
93ac4ace0a

+ 13 - 19
platform/haiku/haiku_direct_window.cpp

@@ -2,7 +2,7 @@
 #include "haiku_direct_window.h"
 
 HaikuDirectWindow::HaikuDirectWindow(BRect p_frame)
-   : BDirectWindow(p_frame, "Godot", B_TITLED_WINDOW, 0)
+   : BDirectWindow(p_frame, "Godot", B_TITLED_WINDOW, B_QUIT_ON_WINDOW_CLOSE)
 {
 	last_mouse_pos_valid = false;
 	last_buttons_state = 0;
@@ -33,10 +33,13 @@ void HaikuDirectWindow::SetInput(InputDefault* p_input) {
 	input = p_input;
 }
 
+void HaikuDirectWindow::SetMainLoop(MainLoop* p_main_loop) {
+	main_loop = p_main_loop;
+}
+
 bool HaikuDirectWindow::QuitRequested() {
-	view->EnableDirectMode(false);
-	be_app->PostMessage(B_QUIT_REQUESTED);
-	return true;
+	main_loop->notification(MainLoop::NOTIFICATION_WM_QUIT_REQUEST);
+	return false;
 }
 
 void HaikuDirectWindow::DirectConnected(direct_buffer_info* info) {
@@ -44,24 +47,15 @@ void HaikuDirectWindow::DirectConnected(direct_buffer_info* info) {
 	view->EnableDirectMode(true);
 }
 
-void HaikuDirectWindow::MessageReceived(BMessage* message)
-{
+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;
+			Sync();
 
-		case B_INVALIDATE:
-			ERR_PRINT("WINDOW B_INVALIDATE");
-			//Main::force_redraw();
+			if (Main::iteration() == true) {
+				view->EnableDirectMode(false);
+				Quit();
+			}
 			break;
 
 		default:

+ 2 - 0
platform/haiku/haiku_direct_window.h

@@ -18,6 +18,7 @@ private:
 	uint32 last_buttons_state;
 	int last_button_mask;
 
+	MainLoop* main_loop;
 	InputDefault* input;
 	HaikuGLView* view;
 	BMessageRunner* update_runner;
@@ -35,6 +36,7 @@ public:
 	void StartMessageRunner();
 	void StopMessageRunner();
 	void SetInput(InputDefault* p_input);
+	void SetMainLoop(MainLoop* p_main_loop);
 	virtual bool QuitRequested();
 	virtual void DirectConnected(direct_buffer_info* info);
 	virtual void MessageReceived(BMessage* message);

+ 3 - 0
platform/haiku/os_haiku.cpp

@@ -29,6 +29,7 @@ void OS_Haiku::run() {
 		}
 	}
 	*/
+	
 
 	app->Run();
 	window->StopMessageRunner();
@@ -142,6 +143,7 @@ void OS_Haiku::finalize() {
 void OS_Haiku::set_main_loop(MainLoop* p_main_loop) {
 	main_loop = p_main_loop;
 	input->set_main_loop(p_main_loop);
+	window->SetMainLoop(p_main_loop);
 }
 
 MainLoop* OS_Haiku::get_main_loop() const {
@@ -154,6 +156,7 @@ void OS_Haiku::delete_main_loop() {
 	}
 
 	main_loop = NULL;
+	window->SetMainLoop(NULL);
 }
 
 void OS_Haiku::release_rendering_thread() {