int32 MouseWatcher(void* data) { BMessenger* TheMessenger = (BMessenger*)data; BPoint PreviousPos; uint32 PreviousButtons; bool FirstCheck = true; BMessage MessageToSend; MessageToSend.AddPoint("where",BPoint(0,0)); MessageToSend.AddInt32("buttons",0); MessageToSend.AddInt32("modifiers",0); while(true) { if (!TheMessenger->LockTarget()) { delete TheMessenger; return 0; // window is dead so exit } BLooper *TheLooper; BView* TheView = (BView*)TheMessenger->Target(&TheLooper); BPoint Where; uint32 Buttons; TheView->GetMouse(&Where,&Buttons,false); if(FirstCheck) { PreviousPos = Where; PreviousButtons = Buttons; FirstCheck = false; } bool Send = false; if(Buttons != PreviousButtons || Buttons == 0 || Where != PreviousPos) { if(Buttons == 0) MessageToSend.what = MW_MOUSE_UP; else if(Buttons != PreviousButtons) MessageToSend.what = MW_MOUSE_DOWN; else MessageToSend.what = MW_MOUSE_MOVED; MessageToSend.ReplacePoint("where",Where); MessageToSend.ReplaceInt32("buttons",Buttons); MessageToSend.ReplaceInt32("modifiers",modifiers()); Send = true; } TheLooper->Unlock(); if(Send) TheMessenger->SendMessage(&MessageToSend); if(Buttons == 0) { //Button was released delete TheMessenger; return 0; } snooze(50000); } }
static BRect CallerFrame(BMessenger& caller) { BRect rect; if (caller.LockTarget()) { BLooper* looper; caller.Target(&looper); BWindow* window = dynamic_cast<BWindow*>(looper); if (window) rect = window->Frame(); looper->Unlock(); } return rect; }
int32 MouseDragOrPopupWatcher(void* data) { BMessenger* TheMessenger = (BMessenger*)data; BPoint StartPos; uint32 StartButtons = 0; bigtime_t StartTime = 0; bool FirstCheck = true; BMessage MessageToSend; MessageToSend.AddPoint("where",BPoint(0,0)); MessageToSend.AddInt32("buttons",0); MessageToSend.AddInt32("modifiers",0); bigtime_t PopupTime; if(get_click_speed(&PopupTime) != B_OK) return 0; PopupTime *= 2; while(true) { if (!TheMessenger->LockTarget()) { delete TheMessenger; return 0; // window is dead so exit } BLooper *TheLooper; BView* TheView = (BView*)TheMessenger->Target(&TheLooper); BPoint Where; uint32 Buttons; bigtime_t Time = system_time(); TheView->GetMouse(&Where,&Buttons,false); if(FirstCheck) { StartPos = Where; StartButtons = Buttons; StartTime = Time; FirstCheck = false; } bool Send = false; if(Buttons == 0 || Buttons != StartButtons) { //Changed or released MessageToSend.what = MW_MOUSE_CLICK; Send = true; } else if(Where.x < StartPos.x-1.0 || Where.x > StartPos.x+1.0 || Where.y < StartPos.y-1.0 || Where.y > StartPos.y+1.0) { MessageToSend.what = MW_MOUSE_DRAG; Send = true; } else if(Time >= StartTime + PopupTime) { MessageToSend.what = MW_MOUSE_POPUP; Send = true; } TheLooper->Unlock(); if(Send) { MessageToSend.ReplacePoint("where",StartPos); MessageToSend.ReplaceInt32("buttons",Buttons); MessageToSend.ReplaceInt32("modifiers",modifiers()); TheMessenger->SendMessage(&MessageToSend); delete TheMessenger; return 0; } snooze(50000); } }
/*! \brief Tracker add-on entry */ extern "C" void process_refs(entry_ref dir, BMessage* refs, void* /*reserved*/) { status_t status; BAlert *alert; BMessenger msgr; BPoseView *view = NULL; BMessage poseViewBackup; BMessage poseViewColumnBackup; uint32 poseViewModeBackup; BString windowTitleBackup; refs->PrintToStream(); status = refs->FindMessenger("TrackerViewToken", &msgr); if (status < B_OK) { Error(view, status); return; } status = B_ERROR; if (!msgr.LockTarget()) { Error(view, status); return; } status = B_BAD_HANDLER; view = dynamic_cast<BPoseView *>(msgr.Target(NULL)); if (!view) { Error(view, status); return; } if (dynamic_cast<BWindow *>(view->Looper()) == NULL) { Error(view, status, true); return; } windowTitleBackup = view->Window()->Title(); view->SaveColumnState(poseViewColumnBackup); view->SaveState(poseViewBackup); view->SetDragEnabled(false); view->SetSelectionRectEnabled(false); view->SetPoseEditing(false); poseViewModeBackup = view->ViewMode(); view->SetViewMode(kIconMode); view->ShowBarberPole(); view->UnlockLooper(); alert = new BAlert("Error", "IconVader:\nClick on the icons to get points." "\nAvoid symlinks!", "OK"); alert->SetFlags(alert->Flags() | B_CLOSE_ON_ESCAPE); alert->Go(); int32 score = 0; int32 count = 300; while (count--) { status = B_ERROR; if (!msgr.LockTarget()) { Error(view, status); return; } BPose *pose; for (int32 i = 0; (pose = view->PoseAtIndex(i)); i++) { if (pose->IsSelected()) { if (pose->TargetModel()->IsFile()) score++; if (pose->TargetModel()->IsDirectory()) score+=2; if (pose->TargetModel()->IsSymLink()) score-=10; pose->Select(false); } #ifdef __HAIKU__ BPoint location = pose->Location(view); #else BPoint location = pose->Location(); #endif location.x += ((rand() % 20) - 10); location.y += ((rand() % 20) - 10); #ifdef __HAIKU__ pose->SetLocation(location, view); #else pose->SetLocation(location); #endif } view->CheckPoseVisibility(); view->Invalidate(); BString str("Score: "); str << score; view->Window()->SetTitle(str.String()); view->UnlockLooper(); snooze(100000); } BString scoreStr("You scored "); scoreStr << score << " points!"; alert = new BAlert("Error", scoreStr.String(), "Cool!"); alert->SetFlags(alert->Flags() | B_CLOSE_ON_ESCAPE); alert->Go(); status = B_ERROR; if (!msgr.LockTarget()) { Error(view, status); return; } /* status = B_BAD_HANDLER; view = dynamic_cast<BPoseView *>(msgr.Target(NULL)); if (!view) goto err1; */ view->HideBarberPole(); view->SetViewMode(poseViewModeBackup); view->RestoreState(poseViewBackup); view->RestoreColumnState(poseViewColumnBackup); view->Window()->SetTitle(windowTitleBackup.String()); /* BMessage('_RRC') { TrackerViewToken = BMessenger(port=32004, team=591, target=direct:0x131) } */ //be_roster->Launch("application/x-vnd.haiku-filetypes", refs); view->UnlockLooper(); return; }