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 504295e..32c1c02 100644 --- a/include/Mw/LowLevel/Haiku.h +++ b/include/Mw/LowLevel/Haiku.h @@ -21,8 +21,6 @@ class MwWindow; class MwApplication : public BApplication { public: - MwWindow* window; - MwApplication(MwRect rc, MwLL handle); ~MwApplication(); @@ -70,6 +68,7 @@ typedef BBitmap MwBBitmap; #else typedef void MwApplication; typedef void MwView; +typedef void MwWindow; typedef void MwBBitmap; #endif @@ -91,11 +90,14 @@ enum BVIEW_MW_WHAT { BVIEW_MW_LINE, BVIEW_MW_BITMAP, BVIEW_MW_RENDER, + BVIEW_MW_RAISE, BVIEW_MW_GET_MOUSE }; enum BWIN_MW_WHAT { - BWIN_MW_SET_TITLE = 0 + BWIN_MW_DESTROY = 0, + BWIN_MW_SET_TITLE, + BWIN_MW_SET_TYPE }; enum MwLLHAIKU_EVENT { @@ -135,6 +137,8 @@ union _MwLLHaikuEvent { struct _MwLLHaiku { struct _MwLLCommon common; + int type; + int x; int y; int width; @@ -142,6 +146,7 @@ struct _MwLLHaiku { MwLL parent; MwApplication* app; + MwWindow* window; MwView* view; thread_id app_thread; int force_render; diff --git a/src/backend/haiku.cc b/src/backend/haiku.cc index 03c755b..57914ba 100644 --- a/src/backend/haiku.cc +++ b/src/backend/haiku.cc @@ -19,18 +19,17 @@ MwApplication::MwApplication(MwRect rc, MwLL handle) rc2 = BRect(rc.x, rc.y, rc.x + rc.width - 1, rc.y + rc.height - 1); - this->window = new MwWindow(rc2, B_TITLED_WINDOW, 0); - this->window->Show(); + handle->haiku.window = new MwWindow(rc2, B_TITLED_WINDOW, 0); + handle->haiku.window->Show(); - handle->haiku.view = new MwView(handle, this->window->Bounds(), B_FOLLOW_ALL_SIDES, B_WILL_DRAW); + handle->haiku.view = new MwView(handle, handle->haiku.window->Bounds(), B_FOLLOW_ALL_SIDES, B_WILL_DRAW); - this->window->AddChild(handle->haiku.view); + handle->haiku.window->AddChild(handle->haiku.view); delete scr; } MwApplication::~MwApplication() { - delete this->window; } void MwApplication::MessageReceived(BMessage* message) { @@ -76,7 +75,35 @@ void MwView::MessageReceived(BMessage* message) { } case BVIEW_MW_DETACH: { - this->RemoveSelf(); + BRect rc; + BPoint point; + + if(message->FindPoint("view-point", &point) != B_OK) break; + + point = this->ConvertToScreen(this->ConvertFromParent(point)); + + rc.left = point.x; + rc.top = point.y; + rc.right = rc.left + this->handle->haiku.width - 1; + rc.bottom = rc.top + this->handle->haiku.height - 1; + + if(this->Parent() != NULL) { + this->RemoveSelf(); + } + + this->handle->haiku.parent = NULL; + + this->handle->haiku.window = new MwWindow(rc, B_TITLED_WINDOW, 0); + this->handle->haiku.window->Show(); + + this->MoveTo(0, 0); + this->ResizeTo(this->handle->haiku.width, this->handle->haiku.height); + this->SetResizingMode(B_FOLLOW_ALL_SIDES); + this->handle->haiku.window->AddChild(this); + + while(this->Window() != this->handle->haiku.window); + + MwLLForceRender(this->handle); break; } case BVIEW_MW_RESIZE: @@ -86,10 +113,10 @@ void MwView::MessageReceived(BMessage* message) { if(message->FindInt32("view-width", &width) != B_OK) break; if(message->FindInt32("view-height", &height) != B_OK) break; - if(this->handle->haiku.app == NULL) { + if(this->handle->haiku.window == NULL) { this->ResizeTo(width - 1, height - 1); } else { - this->Window()->ResizeTo(width - 1, height - 1); + this->handle->haiku.window->ResizeTo(width - 1, height - 1); this->ResizeTo(width - 1, height - 1); } this->Draw(BRect(0, 0, 0, 0)); @@ -178,6 +205,14 @@ void MwView::MessageReceived(BMessage* message) { this->Invalidate(); break; } + case BVIEW_MW_RAISE: + { + BView* v = this->Parent(); + + this->RemoveSelf(); + v->AddChild(this); + break; + } case BVIEW_MW_GET_MOUSE: { BPoint* p; @@ -205,7 +240,7 @@ void MwView::PostMessage(BMessage* message) { copy.AddPointer("window-view", this); - top->haiku.app->window->PostMessage(©); + top->haiku.window->PostMessage(©); } void MwView::PostMessage(uint32 command) { @@ -223,7 +258,7 @@ status_t MwView::SendMessage(BMessage* message) { copy.AddPointer("window-view", this); - return BMessenger(top->haiku.app->window).SendMessage(©, &reply); + return BMessenger(top->haiku.window).SendMessage(©, &reply); } status_t MwView::SendMessage(uint32 command) { @@ -355,6 +390,12 @@ void MwWindow::MessageReceived(BMessage* message) { } switch(message->what) { + case BVIEW_MW_DESTROY: + { + this->Quit(); + delete this; + break; + } case BWIN_MW_SET_TITLE: { const char* title; @@ -364,6 +405,19 @@ void MwWindow::MessageReceived(BMessage* message) { this->SetTitle(title); break; } + case BWIN_MW_SET_TYPE: + { + int type; + + if(message->FindInt32("window-type", &type) != B_OK) break; + + this->SetType((window_type)type); + + if(type == B_UNTYPED_WINDOW) { + this->SetLook(B_NO_BORDER_WINDOW_LOOK); + } + break; + } default: { BWindow::MessageReceived(message); @@ -443,23 +497,27 @@ MwLL MwLLCreateImpl(MwLL parent, int x, int y, int width, int height) { p->rc = mrc; p->handle = r; - r->haiku.app = NULL; - r->haiku.view = NULL; + r->haiku.app = NULL; + r->haiku.window = NULL; + r->haiku.view = NULL; r->haiku.app_thread = spawn_thread(app_thread, NULL, B_NORMAL_PRIORITY, p); resume_thread(r->haiku.app_thread); - while(r->haiku.app == NULL || r->haiku.app->window == NULL || r->haiku.view == NULL) MwTimeSleep(10); + while(r->haiku.app == NULL || r->haiku.window == NULL || r->haiku.view == 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(r, rc, B_FOLLOW_NONE, B_WILL_DRAW); + r->haiku.app = NULL; + r->haiku.window = NULL; + r->haiku.view = new MwView(r, rc, B_FOLLOW_NONE, B_WILL_DRAW); parent->haiku.view->AddChild(r->haiku.view); + + r->haiku.view->SendMessage(BVIEW_MW_RAISE); } r->haiku.x = x; @@ -482,6 +540,8 @@ void MwLLDestroyImpl(MwLL handle) { wait_for_thread(handle->haiku.app_thread, &exit_value); delete handle->haiku.app; + } else if(handle->haiku.window != NULL) { + handle->haiku.window->PostMessage(BWIN_MW_DESTROY); } free(handle); @@ -579,7 +639,7 @@ void MwLLSetTitleImpl(MwLL handle, const char* title) { msg.AddString("window-title", title); - handle->haiku.app->window->PostMessage(&msg); + handle->haiku.window->PostMessage(&msg); } int MwLLPendingImpl(MwLL handle) { @@ -699,7 +759,15 @@ void MwLLForceRenderImpl(MwLL handle) { void MwLLSetCursorImpl(MwLL handle, MwCursor* image, MwCursor* mask) {} -void MwLLDetachImpl(MwLL handle, MwPoint* point) {} +void MwLLDetachImpl(MwLL handle, MwPoint* point) { + BMessage msg(BVIEW_MW_DETACH); + + msg.AddPoint("view-point", BPoint(point->x, point->y)); + + handle->haiku.view->PostMessage(&msg); + + while(handle->haiku.window == NULL); +} void MwLLShowImpl(MwLL handle, int show) { if(show) { @@ -713,13 +781,23 @@ void MwLLSetSizeHintsImpl(MwLL handle, int minx, int miny, int maxx, int maxy) { void MwLLMakeBorderlessImpl(MwLL handle, int toggle) {} -void MwLLMakeToolWindowImpl(MwLL handle) {} +void MwLLMakeToolWindowImpl(MwLL handle) { + handle->haiku.type = B_UNTYPED_WINDOW; +} void MwLLMakePopupImpl(MwLL handle, MwLL parent) {} -void MwLLBeginStateChangeImpl(MwLL handle) {} +void MwLLBeginStateChangeImpl(MwLL handle) { + handle->haiku.type = handle->haiku.window == NULL ? B_TITLED_WINDOW : handle->haiku.window->Type(); +} -void MwLLEndStateChangeImpl(MwLL handle) {} +void MwLLEndStateChangeImpl(MwLL handle) { + BMessage msg(BWIN_MW_SET_TYPE); + + msg.AddInt32("window-type", handle->haiku.type); + + BMessenger(handle->haiku.window).SendMessage(&msg); +} void MwLLFocusImpl(MwLL handle) {} @@ -766,7 +844,7 @@ MwBool MwLLDoModernImpl(MwLL handle) { } static void MwLLRaiseImpl(MwLL handle) { - (void)handle; + handle->haiku.view->SendMessage(BVIEW_MW_RAISE); } int MwLLHaikuCallInitImpl() { diff --git a/src/widget/calendar.c b/src/widget/calendar.c index 887bb83..84f5d4b 100644 --- a/src/widget/calendar.c +++ b/src/widget/calendar.c @@ -10,16 +10,16 @@ static int wcreate(MwWidget handle) { } static void draw(MwWidget handle) { - MwLLColor c = MwParseColor(handle, MwGetText(handle, MwNbackground)); - MwLLColor cb = MwParseColor(handle, "#fff"); + MwLLColor c = MwParseColor(handle, MwGetText(handle, MwNbackground)); + MwLLColor cb = MwParseColor(handle, "#fff"); MwLLColor cb_g = MwParseColor(handle, "#666"); - MwLLColor ct = MwParseColor(handle, "#000"); + MwLLColor ct = MwParseColor(handle, "#000"); MwRect r, r2, r3; MwPoint p[4]; - int h = 64; + int h = 64; int pw = h / 16; /* parallelogram width */ int ph = pw * 3; /* parallelogram height */ - int gh = h / 32; /* gray area height */ + int gh = h / 32; /* gray area height */ char buf[3]; r.x = 0; @@ -34,9 +34,9 @@ static void draw(MwWidget handle) { r2.y = (r.height - r2.height - ph - gh) / 2; MwDrawRect(handle, &r2, cb); - r3.x = r2.x; - r3.y = r2.y + r2.height; - r3.width = r2.width; + r3.x = r2.x; + r3.y = r2.y + r2.height; + r3.width = r2.width; r3.height = ph + gh; MwDrawRect(handle, &r3, cb_g); diff --git a/src/widget/listbox.c b/src/widget/listbox.c index 72fa743..9ef2cb5 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;