void TBarApp::FetchAppIcon(BarTeamInfo* barInfo) { int32 width = IconSize(); int32 index = (width - kMinimumIconSize) / kIconSizeInterval; // first look in the icon cache barInfo->icon = barInfo->iconCache[index]; if (barInfo->icon != NULL) return; // icon wasn't in cache, get it from be_roster and cache it app_info appInfo; icon_size size = width >= 31 ? B_LARGE_ICON : B_MINI_ICON; BBitmap* icon = new BBitmap(IconRect(), kIconColorSpace); if (be_roster->GetAppInfo(barInfo->sig, &appInfo) == B_OK) { // fetch the app icon BFile file(&appInfo.ref, B_READ_ONLY); BAppFileInfo appMime(&file); if (appMime.GetIcon(icon, size) == B_OK) { delete barInfo->iconCache[index]; barInfo->iconCache[index] = barInfo->icon = icon; return; } } // couldn't find the app icon // fetch the generic 3 boxes icon and cache it BMimeType defaultAppMime; defaultAppMime.SetTo(B_APP_MIME_TYPE); if (defaultAppMime.GetIcon(icon, size) == B_OK) { delete barInfo->iconCache[index]; barInfo->iconCache[index] = barInfo->icon = icon; return; } // couldn't find generic 3 boxes icon // fill with transparent uint8* iconBits = (uint8*)icon->Bits(); if (icon->ColorSpace() == B_RGBA32) { int32 i = 0; while (i < icon->BitsLength()) { iconBits[i++] = B_TRANSPARENT_32_BIT.red; iconBits[i++] = B_TRANSPARENT_32_BIT.green; iconBits[i++] = B_TRANSPARENT_32_BIT.blue; iconBits[i++] = B_TRANSPARENT_32_BIT.alpha; } } else { // Assume B_CMAP8 for (int32 i = 0; i < icon->BitsLength(); i++) iconBits[i] = B_TRANSPARENT_MAGIC_CMAP8; } delete barInfo->iconCache[index]; barInfo->iconCache[index] = barInfo->icon = icon; }
void TBarApp::FetchAppIcon(const char* signature, BBitmap* icon) { app_info appInfo; icon_size size = icon->Bounds().IntegerHeight() >= 32 ? B_LARGE_ICON : B_MINI_ICON; if (be_roster->GetAppInfo(signature, &appInfo) == B_OK) { // fetch the app icon BFile file(&appInfo.ref, B_READ_ONLY); BAppFileInfo appMime(&file); if (appMime.GetIcon(icon, size) == B_OK) return; } // couldn't find the app icon // fetch the generic 3 boxes icon BMimeType defaultAppMime; defaultAppMime.SetTo(B_APP_MIME_TYPE); if (defaultAppMime.GetIcon(icon, size) == B_OK) return; // couldn't find generic 3 boxes icon // fill with transparent uint8* iconBits = (uint8*)icon->Bits(); if (icon->ColorSpace() == B_RGBA32) { int32 i = 0; while (i < icon->BitsLength()) { iconBits[i++] = B_TRANSPARENT_32_BIT.red; iconBits[i++] = B_TRANSPARENT_32_BIT.green; iconBits[i++] = B_TRANSPARENT_32_BIT.blue; iconBits[i++] = B_TRANSPARENT_32_BIT.alpha; } } else { // Assume B_CMAP8 for (int32 i = 0; i < icon->BitsLength(); i++) iconBits[i] = B_TRANSPARENT_MAGIC_CMAP8; } }
void TBarApp::AddTeam(team_id team, uint32 flags, const char* sig, entry_ref* ref) { if ((flags & B_BACKGROUND_APP) != 0 || strcasecmp(sig, kDeskbarSignature) == 0) { // don't add if a background app or Deskbar itself return; } BAutolock autolock(sSubscriberLock); if (!autolock.IsLocked()) return; // have we already seen this team, is this another instance of // a known app? BarTeamInfo* multiLaunchTeam = NULL; int32 teamCount = sBarTeamInfoList.CountItems(); for (int32 i = 0; i < teamCount; i++) { BarTeamInfo* barInfo = (BarTeamInfo*)sBarTeamInfoList.ItemAt(i); if (barInfo->teams->HasItem((void*)(addr_t)team)) return; if (strcasecmp(barInfo->sig, sig) == 0) multiLaunchTeam = barInfo; } if (multiLaunchTeam != NULL) { multiLaunchTeam->teams->AddItem((void*)(addr_t)team); int32 subsCount = sSubscribers.CountItems(); if (subsCount > 0) { BMessage message(kAddTeam); message.AddInt32("team", team); message.AddString("sig", multiLaunchTeam->sig); for (int32 i = 0; i < subsCount; i++) ((BMessenger*)sSubscribers.ItemAt(i))->SendMessage(&message); } return; } BFile file(ref, B_READ_ONLY); BAppFileInfo appMime(&file); BString name; if (!gLocalizedNamePreferred || BLocaleRoster::Default()->GetLocalizedFileName(name, *ref) != B_OK) { name = ref->name; } BarTeamInfo* barInfo = new BarTeamInfo(new BList(), flags, strdup(sig), NULL, strdup(name.String())); FetchAppIcon(barInfo); barInfo->teams->AddItem((void*)(addr_t)team); sBarTeamInfoList.AddItem(barInfo); if (fSettings.expandNewTeams) fBarView->AddExpandedItem(sig); int32 subsCount = sSubscribers.CountItems(); if (subsCount > 0) { for (int32 i = 0; i < subsCount; i++) { BMessenger* messenger = (BMessenger*)sSubscribers.ItemAt(i); BMessage message(B_SOME_APP_LAUNCHED); BList* tList = new BList(*(barInfo->teams)); message.AddPointer("teams", tList); BBitmap* icon = new BBitmap(barInfo->icon); ASSERT(icon); message.AddPointer("icon", icon); message.AddInt32("flags", static_cast<int32>(barInfo->flags)); message.AddString("name", barInfo->name); message.AddString("sig", barInfo->sig); messenger->SendMessage(&message); } } }
void TBarApp::AddTeam(team_id team, uint32 flags, const char* sig, entry_ref* ref) { BAutolock autolock(sSubscriberLock); if (!autolock.IsLocked()) return; // have we already seen this team, is this another instance of // a known app? BarTeamInfo* multiLaunchTeam = NULL; int32 teamCount = sBarTeamInfoList.CountItems(); for (int32 i = 0; i < teamCount; i++) { BarTeamInfo* barInfo = (BarTeamInfo*)sBarTeamInfoList.ItemAt(i); if (barInfo->teams->HasItem((void*)team)) return; if (strcasecmp(barInfo->sig, sig) == 0) multiLaunchTeam = barInfo; } if (multiLaunchTeam != NULL) { multiLaunchTeam->teams->AddItem((void*)team); int32 subsCount = sSubscribers.CountItems(); if (subsCount > 0) { BMessage message(kAddTeam); message.AddInt32("team", team); message.AddString("sig", multiLaunchTeam->sig); for (int32 i = 0; i < subsCount; i++) ((BMessenger*)sSubscribers.ItemAt(i))->SendMessage(&message); } return; } BFile file(ref, B_READ_ONLY); BAppFileInfo appMime(&file); BString name; if (!gLocalizedNamePreferred || BLocaleRoster::Default()->GetLocalizedFileName(name, *ref) != B_OK) name = ref->name; BarTeamInfo* barInfo = new BarTeamInfo(new BList(), flags, strdup(sig), new BBitmap(kIconRect, kIconFormat), strdup(name.String())); barInfo->teams->AddItem((void*)team); if (appMime.GetIcon(barInfo->icon, B_MINI_ICON) != B_OK) appMime.GetTrackerIcon(barInfo->icon, B_MINI_ICON); sBarTeamInfoList.AddItem(barInfo); int32 subsCount = sSubscribers.CountItems(); if (subsCount > 0) { for (int32 i = 0; i < subsCount; i++) { BMessenger* messenger = (BMessenger*)sSubscribers.ItemAt(i); BMessage message(B_SOME_APP_LAUNCHED); BList* tList = new BList(*(barInfo->teams)); message.AddPointer("teams", tList); BBitmap* icon = new BBitmap(barInfo->icon); ASSERT(icon); message.AddPointer("icon", icon); message.AddInt32("flags", static_cast<int32>(barInfo->flags)); message.AddString("name", barInfo->name); message.AddString("sig", barInfo->sig); messenger->SendMessage(&message); } } }