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

239
src/backend/haiku.cc Normal file
View file

@ -0,0 +1,239 @@
#include <Mw/Milsko.h>
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;
if(rc.left == MwDEFAULT) left = (scr->Frame().Width() - rc.Width()) / 2;
if(rc.top == MwDEFAULT) top = (scr->Frame().Height() - rc.Height()) / 2;
rc = BRect(BPoint(left, top), BSize(rc.Width(), rc.Height()));
this->window = new BWindow(rc, "Milsko", B_TITLED_WINDOW, 0);
this->window->Show();
handle->haiku.view = new MwView(this->window->Bounds(), B_FOLLOW_ALL_SIDES, B_WILL_DRAW);
this->window->AddChild(handle->haiku.view);
this->locker = new BLocker();
delete scr;
}
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));
BRect rc(BPoint(x, y), BSize(width, height));
MwLLCreateCommon(r);
r->common.copy_buffer = 1;
r->common.type = MwLLBackendHaiku;
r->haiku.parent = parent;
if(parent == NULL) {
struct app_param* p = (struct app_param*)malloc(sizeof(*p));
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) {
top = top->haiku.parent;
}
r->haiku.app = NULL;
r->haiku.view = new MwView(rc, B_FOLLOW_NONE, B_WILL_DRAW);
parent->haiku.view->AddChild(r->haiku.view);
}
return r;
}
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;
for(i = 0; i < points_count; i++) {
p[i] = BPoint(points[i].x, points[i].y);
}
handle->haiku.view->FillPolygon(p, points_count);
free(p);
}
void MwLLLineImpl(MwLL handle, MwPoint* points, MwLLColor color) {}
void MwLLBeginDrawImpl(MwLL handle) {}
void MwLLEndDrawImpl(MwLL handle) {}
MwLLColor MwLLAllocColorImpl(MwLL handle, int r, int g, int b) {
MwLLColor c = (MwLLColor)malloc(sizeof(*c));
MwLLColorUpdate(handle, c, r, g, b);
return c;
}
void MwLLColorUpdateImpl(MwLL handle, MwLLColor c, int r, int g, int b) {
c->common.red = r;
c->common.green = g;
c->common.blue = b;
}
void MwLLFreeColorImpl(MwLLColor color) {}
void MwLLGetXYWHImpl(MwLL handle, int* x, int* y, unsigned int* w, unsigned int* h) {}
void MwLLSetXYImpl(MwLL handle, int x, int y) {}
void MwLLSetWHImpl(MwLL handle, int w, int h) {}
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;
}
void MwLLNextEventImpl(MwLL handle) {}
MwLLPixmap MwLLCreatePixmapImpl(MwLL handle, unsigned char* data, int width, int height) {
MwLLPixmap r = (MwLLPixmap)malloc(sizeof(*r));
r->common.raw = (unsigned char*)malloc(4 * width * height);
memcpy(r->common.raw, data, 4 * width * height);
r->common.width = width;
r->common.height = height;
MwLLPixmapUpdate(r);
return r;
return r;
}
void MwLLPixmapUpdateImpl(MwLLPixmap pixmap) {}
void MwLLDestroyPixmapImpl(MwLLPixmap pixmap) {
free(pixmap->common.raw);
free(pixmap);
}
void MwLLDrawPixmapImpl(MwLL handle, MwRect* rect, MwLLPixmap pixmap) {}
void MwLLSetIconImpl(MwLL handle, MwLLPixmap pixmap) {}
void MwLLForceRenderImpl(MwLL handle) {}
void MwLLSetCursorImpl(MwLL handle, MwCursor* image, MwCursor* mask) {}
void MwLLDetachImpl(MwLL handle, MwPoint* point) {}
void MwLLShowImpl(MwLL handle, int show) {}
void MwLLSetSizeHintsImpl(MwLL handle, int minx, int miny, int maxx, int maxy) {}
void MwLLMakeBorderlessImpl(MwLL handle, int toggle) {}
void MwLLMakeToolWindowImpl(MwLL handle) {}
void MwLLMakePopupImpl(MwLL handle, MwLL parent) {}
void MwLLBeginStateChangeImpl(MwLL handle) {}
void MwLLEndStateChangeImpl(MwLL handle) {}
void MwLLFocusImpl(MwLL handle) {}
void MwLLGrabPointerImpl(MwLL handle, int toggle) {}
void MwLLSetClipboardImpl(MwLL handle, const char* text, int clipboard_type) {}
void MwLLGetClipboardImpl(MwLL handle, int clipboard_type) {}
void MwLLGetCursorCoordImpl(MwLL handle, MwPoint* point) {}
void MwLLGetScreenSizeImpl(MwLL handle, MwRect* rect) {}
void MwLLSetDarkThemeImpl(MwLL handle, int toggle) {
(void)handle;
(void)toggle;
}
MwBool MwLLDoModernImpl(MwLL handle) {
(void)handle;
return MwTRUE;
}
int MwLLHaikuCallInitImpl() {
return 0;
}
#include "call.c"
CALL(Haiku);