From f2f901dc056326ac57a3d80a0ad8fff1db3ef4a0 Mon Sep 17 00:00:00 2001 From: Nishi Date: Tue, 28 Apr 2026 12:59:25 +0000 Subject: [PATCH] haiku --- configure | 2 +- examples/vkdemos/vulkan.c | 4 +- include/Mw/LowLevel/Haiku.h | 31 +++++---- include/Mw/MachDep.h | 1 + pl/rules.pl | 2 +- src/backend/{haiku.cxx => haiku.cc} | 104 +++++++++++++++++++--------- src/widget/listbox.c | 6 +- src/widget/scrollbar.c | 6 +- 8 files changed, 97 insertions(+), 59 deletions(-) rename src/backend/{haiku.cxx => haiku.cc} (68%) diff --git a/configure b/configure index 24f80a4..a29cb7e 100755 --- a/configure +++ b/configure @@ -273,7 +273,7 @@ foreach my $l (@library_targets) { $s =~ s/$o$/.m/; } elsif ($l =~ /haiku/) { - $s =~ s/$o$/.cxx/; + $s =~ s/$o$/.cc/; $compiler = "CXX"; } else { diff --git a/examples/vkdemos/vulkan.c b/examples/vkdemos/vulkan.c index 2d03030..9dfa311 100644 --- a/examples/vkdemos/vulkan.c +++ b/examples/vkdemos/vulkan.c @@ -264,8 +264,8 @@ void vulkan_setup(MwWidget handle) { swapchainCreateInfo.imageExtent = (VkExtent2D){.width = ow, .height = oh}, swapchainCreateInfo.imageArrayLayers = 1, swapchainCreateInfo.imageUsage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | - VK_IMAGE_USAGE_TRANSFER_DST_BIT | - VK_IMAGE_USAGE_SAMPLED_BIT; + VK_IMAGE_USAGE_TRANSFER_DST_BIT | + VK_IMAGE_USAGE_SAMPLED_BIT; // th is how we specify no transformation. swapchainCreateInfo.preTransform = VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR; swapchainCreateInfo.compositeAlpha = VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR; diff --git a/include/Mw/LowLevel/Haiku.h b/include/Mw/LowLevel/Haiku.h index d6ed9af..8ea6abe 100644 --- a/include/Mw/LowLevel/Haiku.h +++ b/include/Mw/LowLevel/Haiku.h @@ -16,35 +16,36 @@ extern "C" { #ifdef __cplusplus class MwApplication : public BApplication { - private: - void ReadyToRun(); + public: + BWindow* window; + BLocker* locker; - public: - BWindow* window; - int ready; - BLocker* locker; + MwApplication(BRect rc, MwLL handle); + ~MwApplication(); - MwApplication(BRect rc, MwLL handle); - ~MwApplication(); - - void Pulse(); + void MessageReceived(BMessage* message); }; class MwView : public BView { - public: - MwView(MwApplication* app, BRect rc, uint32 resizing, uint32 flags); + public: + MwView(BRect rc, uint32 resizing, uint32 flags); }; #else typedef void MwApplication; typedef void MwView; #endif +enum B_MW_WHAT { + B_MW_DESTROY = 0 +}; + struct _MwLLHaiku { struct _MwLLCommon common; - MwLL parent; + MwLL parent; MwApplication* app; - MwView* view; + MwView* view; + thread_id app_thread; }; struct _MwLLHaikuColor { @@ -55,7 +56,7 @@ struct _MwLLHaikuPixmap { struct _MwLLCommonPixmap common; }; -MWDECL int MwLLHaikuCallInit(void); +MWDECL int MwLLHaikuCallInit(void); #ifdef __cplusplus } diff --git a/include/Mw/MachDep.h b/include/Mw/MachDep.h index ecc7bc0..99245fb 100644 --- a/include/Mw/MachDep.h +++ b/include/Mw/MachDep.h @@ -68,6 +68,7 @@ #include #include #include +#include #endif #ifdef __APPLE__ diff --git a/pl/rules.pl b/pl/rules.pl index b117d5f..6d78115 100644 --- a/pl/rules.pl +++ b/pl/rules.pl @@ -97,7 +97,7 @@ if (grep(/^cocoa$/, @backends) || param_get("gnustep")) { if (grep(/^haiku$/, @backends)) { add_cflags("-DUSE_HAIKU"); - new_object("src/backend/haiku.cxx"); + new_object("src/backend/haiku.cc"); add_libs("-lbe"); } diff --git a/src/backend/haiku.cxx b/src/backend/haiku.cc similarity index 68% rename from src/backend/haiku.cxx rename to src/backend/haiku.cc index e54434a..2dd5d11 100644 --- a/src/backend/haiku.cxx +++ b/src/backend/haiku.cc @@ -1,24 +1,12 @@ #include -MwView::MwView(MwApplication* app, BRect rc, uint32 resizing, uint32 flags) : BView(rc, NULL, resizing, flags) { - app->PostMessage(new BMessage(B_PULSE)); - - this->SetViewColor(rand() % 256, 0, 0); - printf("?\n"); -} - -void MwApplication::ReadyToRun(){ - this->ready = 1; -} - -void MwApplication::Pulse(){ - printf("!\n"); +MwView::MwView(BRect rc, uint32 resizing, uint32 flags) : BView(rc, NULL, resizing, flags) { } MwApplication::MwApplication(BRect rc, MwLL handle) : BApplication("application/milsko-generic") { - BScreen* scr = new BScreen(); - float left = rc.left; - float top = rc.top; + BScreen* scr = new BScreen(); + float left = rc.left; + float top = rc.top; if(rc.left == MwDEFAULT) left = (scr->Frame().Width() - rc.Width()) / 2; if(rc.top == MwDEFAULT) top = (scr->Frame().Height() - rc.Height()) / 2; @@ -27,23 +15,51 @@ MwApplication::MwApplication(BRect rc, MwLL handle) : BApplication("application/ this->window = new BWindow(rc, "Milsko", B_TITLED_WINDOW, 0); this->window->Show(); - handle->haiku.view = new MwView(this, this->window->Bounds(), B_FOLLOW_ALL_SIDES, B_WILL_DRAW); + handle->haiku.view = new MwView(this->window->Bounds(), B_FOLLOW_ALL_SIDES, B_WILL_DRAW); this->window->AddChild(handle->haiku.view); - this->ready = 0; this->locker = new BLocker(); delete scr; } -MwApplication::~MwApplication(){ +MwApplication::~MwApplication() { delete this->window; delete this->locker; } +void MwApplication::MessageReceived(BMessage* message) { + switch(message->what) { + case B_MW_DESTROY: { + this->Quit(); + break; + } + default: { + BLooper::MessageReceived(message); + break; + } + } +} + +struct app_param { + BRect rc; + MwLL handle; +}; + +static int32 app_thread(void* data) { + struct app_param* r = (struct app_param*)data; + + r->handle->haiku.app = new MwApplication(r->rc, r->handle); + r->handle->haiku.app->Run(); + + free(r); + + return 0; +} + MwLL MwLLCreateImpl(MwLL parent, int x, int y, int width, int height) { - MwLL r = (MwLL)malloc(sizeof(*r)); + MwLL r = (MwLL)malloc(sizeof(*r)); BRect rc(BPoint(x, y), BSize(width, height)); MwLLCreateCommon(r); @@ -53,18 +69,26 @@ MwLL MwLLCreateImpl(MwLL parent, int x, int y, int width, int height) { r->haiku.parent = parent; - if(parent == NULL){ - r->haiku.app = new MwApplication(rc, r); + if(parent == NULL) { + struct app_param* p = (struct app_param*)malloc(sizeof(*p)); - //r->haiku.app->Run(); - }else{ + r->haiku.app = NULL; + + p->rc = rc; + p->handle = r; + + r->haiku.app_thread = spawn_thread(app_thread, NULL, B_NORMAL_PRIORITY, p); + resume_thread(r->haiku.app_thread); + + while(r->haiku.app == NULL) MwTimeSleep(10); + } else { MwLL top = r; - while(top->haiku.parent != NULL){ + while(top->haiku.parent != NULL) { top = top->haiku.parent; } - r->haiku.app = NULL; - r->haiku.view = new MwView(top->haiku.app, rc, B_FOLLOW_NONE, B_WILL_DRAW); + r->haiku.app = NULL; + r->haiku.view = new MwView(rc, B_FOLLOW_NONE, B_WILL_DRAW); parent->haiku.view->AddChild(r->haiku.view); } @@ -75,14 +99,24 @@ MwLL MwLLCreateImpl(MwLL parent, int x, int y, int width, int height) { void MwLLDestroyImpl(MwLL handle) { MwLLDestroyCommon(handle); + if(handle->haiku.app != NULL) { + status_t exit_value; + + handle->haiku.app->PostMessage(B_MW_DESTROY); + wait_for_thread(handle->haiku.app_thread, &exit_value); + + delete handle->haiku.app; + } + delete handle->haiku.view; + free(handle); } void MwLLPolygonImpl(MwLL handle, MwPoint* points, int points_count, MwLLColor color) { BPoint* p = (BPoint*)malloc(sizeof(*p) * points_count); - int i; + int i; - for(i = 0; i < points_count; i++){ + for(i = 0; i < points_count; i++) { p[i] = BPoint(points[i].x, points[i].y); } @@ -95,9 +129,7 @@ void MwLLLineImpl(MwLL handle, MwPoint* points, MwLLColor color) {} void MwLLBeginDrawImpl(MwLL handle) {} -void MwLLEndDrawImpl(MwLL handle) { - new BMessage(B_PULSE); -} +void MwLLEndDrawImpl(MwLL handle) {} MwLLColor MwLLAllocColorImpl(MwLL handle, int r, int g, int b) { MwLLColor c = (MwLLColor)malloc(sizeof(*c)); @@ -119,7 +151,11 @@ void MwLLSetXYImpl(MwLL handle, int x, int y) {} void MwLLSetWHImpl(MwLL handle, int w, int h) {} -void MwLLSetTitleImpl(MwLL handle, const char* title) {} +void MwLLSetTitleImpl(MwLL handle, const char* title) { + if(handle->haiku.app == NULL) return; + + handle->haiku.app->window->SetTitle(title); +} int MwLLPendingImpl(MwLL handle) { return 0; @@ -128,7 +164,7 @@ int MwLLPendingImpl(MwLL handle) { void MwLLNextEventImpl(MwLL handle) {} MwLLPixmap MwLLCreatePixmapImpl(MwLL handle, unsigned char* data, int width, int height) { - MwLLPixmap r = (MwLLPixmap)malloc(sizeof(*r)); + MwLLPixmap r = (MwLLPixmap)malloc(sizeof(*r)); r->common.raw = (unsigned char*)malloc(4 * width * height); memcpy(r->common.raw, data, 4 * width * height); diff --git a/src/widget/listbox.c b/src/widget/listbox.c index 80ceb08..3eba969 100644 --- a/src/widget/listbox.c +++ b/src/widget/listbox.c @@ -420,8 +420,8 @@ static void redrawIfNeeded(MwWidget handle, int row) { static int mwListBoxSetImpl(MwWidget handle, int row, int col, const char* text) { MwListBox lb = handle->internal; MwListBoxEntry entry; - char* t = text == NULL ? NULL : MwStringDuplicate(text); - int new = 0; + char* t = text == NULL ? NULL : MwStringDuplicate(text); + int new = 0; if(row == -1) row = arrlen(lb->list); entry.name = NULL; @@ -449,7 +449,7 @@ static int mwListBoxSetImpl(MwWidget handle, int row, int col, const char* text) static void mwListBoxSetIconImpl(MwWidget handle, int index, MwLLPixmap icon) { MwListBox lb = handle->internal; MwListBoxEntry entry; - int new = 0; + int new = 0; if(index == -1) index = arrlen(lb->list); entry.name = NULL; diff --git a/src/widget/scrollbar.c b/src/widget/scrollbar.c index 98a050d..17f38fd 100644 --- a/src/widget/scrollbar.c +++ b/src/widget/scrollbar.c @@ -58,9 +58,9 @@ static void draw(MwWidget handle) { MwLLColor base = MwParseColor(handle, MwGetText(handle, MwNbackground)); MwLLColor dark = MwLightenColor(handle, base, -64, -64, -64); MwScrollBar scr = handle->internal; - int or ; - int uy, dy, ux, dx; - MwLLPixmap bgpx = MwGetVoid(handle, MwNbackgroundPixmap); + int or; + int uy, dy, ux, dx; + MwLLPixmap bgpx = MwGetVoid(handle, MwNbackgroundPixmap); r.x = 0; r.y = 0;