This commit is contained in:
parent
6a5ad2cd8c
commit
f2f901dc05
8 changed files with 97 additions and 59 deletions
2
configure
vendored
2
configure
vendored
|
|
@ -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 {
|
||||||
|
|
|
||||||
|
|
@ -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 {
|
||||||
|
|
|
||||||
|
|
@ -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__
|
||||||
|
|
|
||||||
|
|
@ -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");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
Loading…
Add table
Add a link
Reference in a new issue