haiku
All checks were successful
pyrite-dev/milsko/pipeline/head This commit looks good

This commit is contained in:
Nishi 2026-04-28 12:59:25 +00:00
commit f2f901dc05
8 changed files with 97 additions and 59 deletions

2
configure vendored
View file

@ -273,7 +273,7 @@ foreach my $l (@library_targets) {
$s =~ s/$o$/.m/; $s =~ s/$o$/.m/;
} }
elsif ($l =~ /haiku/) { elsif ($l =~ /haiku/) {
$s =~ s/$o$/.cxx/; $s =~ s/$o$/.cc/;
$compiler = "CXX"; $compiler = "CXX";
} }
else { else {

View file

@ -16,35 +16,36 @@ extern "C" {
#ifdef __cplusplus #ifdef __cplusplus
class MwApplication : public BApplication { class MwApplication : public BApplication {
private:
void ReadyToRun();
public: public:
BWindow* window; BWindow* window;
int ready;
BLocker* locker; BLocker* locker;
MwApplication(BRect rc, MwLL handle); MwApplication(BRect rc, MwLL handle);
~MwApplication(); ~MwApplication();
void Pulse(); void MessageReceived(BMessage* message);
}; };
class MwView : public BView { class MwView : public BView {
public: public:
MwView(MwApplication* app, BRect rc, uint32 resizing, uint32 flags); MwView(BRect rc, uint32 resizing, uint32 flags);
}; };
#else #else
typedef void MwApplication; typedef void MwApplication;
typedef void MwView; typedef void MwView;
#endif #endif
enum B_MW_WHAT {
B_MW_DESTROY = 0
};
struct _MwLLHaiku { struct _MwLLHaiku {
struct _MwLLCommon common; struct _MwLLCommon common;
MwLL parent; MwLL parent;
MwApplication* app; MwApplication* app;
MwView* view; MwView* view;
thread_id app_thread;
}; };
struct _MwLLHaikuColor { struct _MwLLHaikuColor {

View file

@ -68,6 +68,7 @@
#include <Screen.h> #include <Screen.h>
#include <Application.h> #include <Application.h>
#include <Locker.h> #include <Locker.h>
#include <OS.h>
#endif #endif
#ifdef __APPLE__ #ifdef __APPLE__

View file

@ -97,7 +97,7 @@ if (grep(/^cocoa$/, @backends) || param_get("gnustep")) {
if (grep(/^haiku$/, @backends)) { if (grep(/^haiku$/, @backends)) {
add_cflags("-DUSE_HAIKU"); add_cflags("-DUSE_HAIKU");
new_object("src/backend/haiku.cxx"); new_object("src/backend/haiku.cc");
add_libs("-lbe"); add_libs("-lbe");
} }

View file

@ -1,18 +1,6 @@
#include <Mw/Milsko.h> #include <Mw/Milsko.h>
MwView::MwView(MwApplication* app, BRect rc, uint32 resizing, uint32 flags) : BView(rc, NULL, resizing, flags) { MwView::MwView(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");
} }
MwApplication::MwApplication(BRect rc, MwLL handle) : BApplication("application/milsko-generic") { MwApplication::MwApplication(BRect rc, MwLL handle) : BApplication("application/milsko-generic") {
@ -27,11 +15,10 @@ MwApplication::MwApplication(BRect rc, MwLL handle) : BApplication("application/
this->window = new BWindow(rc, "Milsko", B_TITLED_WINDOW, 0); this->window = new BWindow(rc, "Milsko", B_TITLED_WINDOW, 0);
this->window->Show(); 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->window->AddChild(handle->haiku.view);
this->ready = 0;
this->locker = new BLocker(); this->locker = new BLocker();
delete scr; delete scr;
@ -42,6 +29,35 @@ MwApplication::~MwApplication(){
delete this->locker; 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 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)); BRect rc(BPoint(x, y), BSize(width, height));
@ -54,9 +70,17 @@ MwLL MwLLCreateImpl(MwLL parent, int x, int y, int width, int height) {
r->haiku.parent = parent; r->haiku.parent = parent;
if(parent == NULL) { if(parent == NULL) {
r->haiku.app = new MwApplication(rc, r); struct app_param* p = (struct app_param*)malloc(sizeof(*p));
//r->haiku.app->Run(); 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 { } else {
MwLL top = r; MwLL top = r;
while(top->haiku.parent != NULL) { while(top->haiku.parent != NULL) {
@ -64,7 +88,7 @@ MwLL MwLLCreateImpl(MwLL parent, int x, int y, int width, int height) {
} }
r->haiku.app = NULL; r->haiku.app = NULL;
r->haiku.view = new MwView(top->haiku.app, rc, B_FOLLOW_NONE, B_WILL_DRAW); r->haiku.view = new MwView(rc, B_FOLLOW_NONE, B_WILL_DRAW);
parent->haiku.view->AddChild(r->haiku.view); parent->haiku.view->AddChild(r->haiku.view);
} }
@ -75,6 +99,16 @@ MwLL MwLLCreateImpl(MwLL parent, int x, int y, int width, int height) {
void MwLLDestroyImpl(MwLL handle) { void MwLLDestroyImpl(MwLL handle) {
MwLLDestroyCommon(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); free(handle);
} }
@ -95,9 +129,7 @@ void MwLLLineImpl(MwLL handle, MwPoint* points, MwLLColor color) {}
void MwLLBeginDrawImpl(MwLL handle) {} void MwLLBeginDrawImpl(MwLL handle) {}
void MwLLEndDrawImpl(MwLL handle) { void MwLLEndDrawImpl(MwLL handle) {}
new BMessage(B_PULSE);
}
MwLLColor MwLLAllocColorImpl(MwLL handle, int r, int g, int b) { MwLLColor MwLLAllocColorImpl(MwLL handle, int r, int g, int b) {
MwLLColor c = (MwLLColor)malloc(sizeof(*c)); 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 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) { int MwLLPendingImpl(MwLL handle) {
return 0; return 0;