#include 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);