int32 CAsynchronousPopUpMenu::ThreadFunc(void *data) { wait_thread_info *info = reinterpret_cast<wait_thread_info *>(data); BMessenger *messenger = info->popupMenu->notifyTarget; // send notification message, before menu is displayed. if(messenger) { BMessage openNotify(MSG_MENU_BEGINNING); AddTime(&openNotify, "when", system_time()); openNotify.AddPointer("source", info->popupMenu); messenger->SendMessage(&openNotify); } BMenuItem *item = NULL; // call SYNCHRONOUS version of Go() and wait until the // the function returns. if(info->clickToOpenRect == BRect(-1,-1,-1,-1)) { // No clickToOpenRect supplied. item = info->popupMenu->Go(info->screenPoint, true, info->openAnyway, false); } else { item = info->popupMenu->Go(info->screenPoint, true, info->openAnyway, info->clickToOpenRect, false); } // Menu was closed. Send notification message. if(messenger) { BMessage closeNotify(MSG_MENU_ENDED); AddTime(&closeNotify, "when", system_time()); closeNotify.AddPointer("source", info->popupMenu); closeNotify.AddPointer("sel_item", item); messenger->SendMessage(&closeNotify); } // If autoDelete flag is set delete popup menu. if(info->autoDelete) { delete info->popupMenu; } delete info; return 0; }
NixNotifyPlugin::~NixNotifyPlugin() { closeNotify(-1); }