static int cdactivate(cdCtxCanvas *ctxcanvas) { BView* view = ctxcanvas->view; BLooper* looper = view->Looper(); const char* ln = ""; if (looper != NULL) { ln = looper->Name(); } printf("CD Activate view %p (%s), looper is %s\n", view, view->Name(), ln); BRect rect = view->Bounds(); ctxcanvas->canvas->w = (int)(rect.Width()); ctxcanvas->canvas->h = (int)(rect.Height()); ctxcanvas->canvas->w_mm = ((double)ctxcanvas->canvas->w) / ctxcanvas->canvas->xres; ctxcanvas->canvas->h_mm = ((double)ctxcanvas->canvas->h) / ctxcanvas->canvas->yres; if (ctxcanvas->canvas->use_matrix) ctxcanvas->canvas->cxTransform(ctxcanvas, ctxcanvas->canvas->matrix); return CD_OK; }
BHandler* BApplication::ResolveSpecifier(BMessage* message, int32 index, BMessage* specifier, int32 what, const char* property) { BPropertyInfo propInfo(sPropertyInfo); status_t err = B_OK; uint32 data; if (propInfo.FindMatch(message, 0, specifier, what, property, &data) >= 0) { switch (data) { case kWindowByIndex: { int32 index; err = specifier->FindInt32("index", &index); if (err != B_OK) break; if (what == B_REVERSE_INDEX_SPECIFIER) index = CountWindows() - index; BWindow* window = WindowAt(index); if (window != NULL) { message->PopSpecifier(); BMessenger(window).SendMessage(message); } else err = B_BAD_INDEX; break; } case kWindowByName: { const char* name; err = specifier->FindString("name", &name); if (err != B_OK) break; for (int32 i = 0;; i++) { BWindow* window = WindowAt(i); if (window == NULL) { err = B_NAME_NOT_FOUND; break; } if (window->Title() != NULL && !strcmp(window->Title(), name)) { message->PopSpecifier(); BMessenger(window).SendMessage(message); break; } } break; } case kLooperByIndex: { int32 index; err = specifier->FindInt32("index", &index); if (err != B_OK) break; if (what == B_REVERSE_INDEX_SPECIFIER) index = CountLoopers() - index; BLooper* looper = LooperAt(index); if (looper != NULL) { message->PopSpecifier(); BMessenger(looper).SendMessage(message); } else err = B_BAD_INDEX; break; } case kLooperByID: // TODO: implement getting looper by ID! break; case kLooperByName: { const char* name; err = specifier->FindString("name", &name); if (err != B_OK) break; for (int32 i = 0;; i++) { BLooper* looper = LooperAt(i); if (looper == NULL) { err = B_NAME_NOT_FOUND; break; } if (looper->Name() != NULL && strcmp(looper->Name(), name) == 0) { message->PopSpecifier(); BMessenger(looper).SendMessage(message); break; } } break; } case kApplication: return this; } } else { return BLooper::ResolveSpecifier(message, index, specifier, what, property); } if (err != B_OK) { BMessage reply(B_MESSAGE_NOT_UNDERSTOOD); reply.AddInt32("error", err); reply.AddString("message", strerror(err)); message->SendReply(&reply); } return NULL; }
bool BApplication::ScriptReceived(BMessage* message, int32 index, BMessage* specifier, int32 what, const char* property) { BMessage reply(B_REPLY); status_t err = B_BAD_SCRIPT_SYNTAX; switch (message->what) { case B_GET_PROPERTY: if (strcmp("Loopers", property) == 0) { int32 count = CountLoopers(); err = B_OK; for (int32 i=0; err == B_OK && i<count; i++) { BMessenger messenger(LooperAt(i)); err = reply.AddMessenger("result", messenger); } } else if (strcmp("Windows", property) == 0) { int32 count = CountWindows(); err = B_OK; for (int32 i=0; err == B_OK && i<count; i++) { BMessenger messenger(WindowAt(i)); err = reply.AddMessenger("result", messenger); } } else if (strcmp("Window", property) == 0) { switch (what) { case B_INDEX_SPECIFIER: case B_REVERSE_INDEX_SPECIFIER: { int32 index = -1; err = specifier->FindInt32("index", &index); if (err != B_OK) break; if (what == B_REVERSE_INDEX_SPECIFIER) index = CountWindows() - index; err = B_BAD_INDEX; BWindow* window = WindowAt(index); if (window == NULL) break; BMessenger messenger(window); err = reply.AddMessenger("result", messenger); break; } case B_NAME_SPECIFIER: { const char* name; err = specifier->FindString("name", &name); if (err != B_OK) break; err = B_NAME_NOT_FOUND; for (int32 i = 0; i < CountWindows(); i++) { BWindow* window = WindowAt(i); if (window && window->Name() != NULL && !strcmp(window->Name(), name)) { BMessenger messenger(window); err = reply.AddMessenger("result", messenger); break; } } break; } } } else if (strcmp("Looper", property) == 0) { switch (what) { case B_INDEX_SPECIFIER: case B_REVERSE_INDEX_SPECIFIER: { int32 index = -1; err = specifier->FindInt32("index", &index); if (err != B_OK) break; if (what == B_REVERSE_INDEX_SPECIFIER) index = CountLoopers() - index; err = B_BAD_INDEX; BLooper* looper = LooperAt(index); if (looper == NULL) break; BMessenger messenger(looper); err = reply.AddMessenger("result", messenger); break; } case B_NAME_SPECIFIER: { const char* name; err = specifier->FindString("name", &name); if (err != B_OK) break; err = B_NAME_NOT_FOUND; for (int32 i = 0; i < CountLoopers(); i++) { BLooper* looper = LooperAt(i); if (looper != NULL && looper->Name() && strcmp(looper->Name(), name) == 0) { BMessenger messenger(looper); err = reply.AddMessenger("result", messenger); break; } } break; } case B_ID_SPECIFIER: { // TODO debug_printf("Looper's ID specifier used but not implemented.\n"); break; } } } else if (strcmp("Name", property) == 0) err = reply.AddString("result", Name()); break; case B_COUNT_PROPERTIES: if (strcmp("Looper", property) == 0) err = reply.AddInt32("result", CountLoopers()); else if (strcmp("Window", property) == 0) err = reply.AddInt32("result", CountWindows()); break; } if (err == B_BAD_SCRIPT_SYNTAX) return false; if (err < B_OK) { reply.what = B_MESSAGE_NOT_UNDERSTOOD; reply.AddString("message", strerror(err)); } reply.AddInt32("error", err); message->SendReply(&reply); return true; }