diff --git a/src/kits/tracker/ContainerWindow.cpp b/src/kits/tracker/ContainerWindow.cpp index 01971580ad..f654139800 100644 --- a/src/kits/tracker/ContainerWindow.cpp +++ b/src/kits/tracker/ContainerWindow.cpp @@ -2897,52 +2897,53 @@ BContainerWindow::EachAddOn(bool (*eachAddOn)(const Model*, const char*, void* passThru, BStringList& mimeTypes, BMenu* menu) { AutoLock > lock(fAddOnsList); - if (lock.IsLocked()) { - for (int i = fAddOnsList->CountItems() - 1; i >= 0; i--) { - struct AddOnShortcut* item = fAddOnsList->ItemAt(i); - bool primary = false; + if (!lock.IsLocked()) + return; - if (mimeTypes.CountStrings() > 0) { - BFile file(item->model->EntryRef(), B_READ_ONLY); - if (file.InitCheck() == B_OK) { - BAppFileInfo info(&file); - if (info.InitCheck() == B_OK) { - bool secondary = true; + for (int i = fAddOnsList->CountItems() - 1; i >= 0; i--) { + struct AddOnShortcut* item = fAddOnsList->ItemAt(i); + bool primary = false; - // does this add-on has types set at all? - BMessage message; - if (info.GetSupportedTypes(&message) == B_OK) { - type_code typeCode; - int32 count; - if (message.GetInfo("types", &typeCode, - &count) == B_OK) { - secondary = false; - } + if (mimeTypes.CountStrings() > 0) { + BFile file(item->model->EntryRef(), B_READ_ONLY); + if (file.InitCheck() == B_OK) { + BAppFileInfo info(&file); + if (info.InitCheck() == B_OK) { + bool secondary = true; + + // does this add-on has types set at all? + BMessage message; + if (info.GetSupportedTypes(&message) == B_OK) { + type_code typeCode; + int32 count; + if (message.GetInfo("types", &typeCode, + &count) == B_OK) { + secondary = false; } - - // check all supported types if it has some set - if (!secondary) { - for (int32 i = mimeTypes.CountStrings(); - !primary && i-- > 0;) { - BString type = mimeTypes.StringAt(i); - if (info.IsSupportedType(type.String())) { - BMimeType mimeType(type.String()); - if (info.Supports(&mimeType)) - primary = true; - else - secondary = true; - } - } - } - - if (!secondary && !primary) - continue; } + + // check all supported types if it has some set + if (!secondary) { + for (int32 i = mimeTypes.CountStrings(); + !primary && i-- > 0;) { + BString type = mimeTypes.StringAt(i); + if (info.IsSupportedType(type.String())) { + BMimeType mimeType(type.String()); + if (info.Supports(&mimeType)) + primary = true; + else + secondary = true; + } + } + } + + if (!secondary && !primary) + continue; } } - ((eachAddOn)(item->model, item->model->Name(), item->key, - item->modifiers, primary, passThru, this, menu)); } + ((eachAddOn)(item->model, item->model->Name(), item->key, + item->modifiers, primary, passThru, this, menu)); } } diff --git a/src/kits/tracker/ContainerWindow.h b/src/kits/tracker/ContainerWindow.h index 74b540106e..7103307b76 100644 --- a/src/kits/tracker/ContainerWindow.h +++ b/src/kits/tracker/ContainerWindow.h @@ -186,14 +186,7 @@ public: static bool DefaultStateSourceNode(const char* name, BNode* result, bool createNew = false, bool createFolder = true); - // add-on iteration - void EachAddOn(bool (*)(const Model*, const char*, uint32 shortcut, - uint32 modifiers, bool primary, void*, BContainerWindow*, BMenu*), - void*, BStringList&, BMenu*); - BMessage* AddOnMessage(int32); - entry_ref GetCurrentDirRef(); - BPopUpMenu* ContextMenu(); // drag&drop support @@ -274,11 +267,12 @@ protected: BHandler* ResolveSpecifier(BMessage*, int32, BMessage*, int32, const char*); - bool EachAddOn(BPath &path, - bool (*)(const Model*, const char*, uint32, bool, void*), - BObjectList*, void*, BStringList&); void LoadAddOn(BMessage*); + void EachAddOn(bool (*)(const Model*, const char*, uint32 shortcut, + uint32 modifiers, bool primary, void*, BContainerWindow*, BMenu*), + void*, BStringList&, BMenu*); +protected: LockingList* fWindowList; uint32 fOpenFlags; bool fUsesLayout; diff --git a/src/kits/tracker/DeskWindow.cpp b/src/kits/tracker/DeskWindow.cpp index c3142b7163..225183a003 100644 --- a/src/kits/tracker/DeskWindow.cpp +++ b/src/kits/tracker/DeskWindow.cpp @@ -263,24 +263,23 @@ void BDeskWindow::InitAddOnsList(bool update) { AutoLock > lock(fAddOnsList); - if (lock.IsLocked()) { - if (update) { - for (int i = fAddOnsList->CountItems() - 1; i >= 0; i--) { - AddOnShortcut* item = fAddOnsList->ItemAt(i); - RemoveShortcut(item->key, B_OPTION_KEY | B_COMMAND_KEY); - } - fAddOnsList->MakeEmpty(true); - } + if (!lock.IsLocked()) + return; - BStringList addOnPaths; - BPathFinder::FindPaths(B_FIND_PATH_ADD_ONS_DIRECTORY, "Tracker", - addOnPaths); - int32 count = addOnPaths.CountStrings(); - for (int32 i = 0; i < count; i++) { - LoadAddOnDir(BDirectory(addOnPaths.StringAt(i)), this, - fAddOnsList); + if (update) { + for (int i = fAddOnsList->CountItems() - 1; i >= 0; i--) { + AddOnShortcut* item = fAddOnsList->ItemAt(i); + RemoveShortcut(item->key, B_OPTION_KEY | B_COMMAND_KEY); } + fAddOnsList->MakeEmpty(true); } + + BStringList addOnPaths; + BPathFinder::FindPaths(B_FIND_PATH_ADD_ONS_DIRECTORY, "Tracker", + addOnPaths); + int32 count = addOnPaths.CountStrings(); + for (int32 i = 0; i < count; i++) + LoadAddOnDir(BDirectory(addOnPaths.StringAt(i)), this, fAddOnsList); } @@ -288,87 +287,88 @@ void BDeskWindow::ApplyShortcutPreferences(bool update) { AutoLock > lock(fAddOnsList); - if (lock.IsLocked()) { - if (!update) { - BPath path; - if (find_directory(B_USER_SETTINGS_DIRECTORY, &path) == B_OK) { - BPathMonitor::StartWatching(path.Path(), - B_WATCH_STAT | B_WATCH_FILES_ONLY, this); - path.Append(kShortcutsSettings); - fShortcutsSettings = new char[strlen(path.Path()) + 1]; - strcpy(fShortcutsSettings, path.Path()); + if (!lock.IsLocked()) + return; + + if (!update) { + BPath path; + if (find_directory(B_USER_SETTINGS_DIRECTORY, &path) == B_OK) { + BPathMonitor::StartWatching(path.Path(), + B_WATCH_STAT | B_WATCH_FILES_ONLY, this); + path.Append(kShortcutsSettings); + fShortcutsSettings = new char[strlen(path.Path()) + 1]; + strcpy(fShortcutsSettings, path.Path()); + } + } + + fAddOnsList->EachElement(RevertToDefault, this); + + BFile shortcutSettings(fShortcutsSettings, B_READ_ONLY); + BMessage fileMsg; + if (shortcutSettings.InitCheck() != B_OK + || fileMsg.Unflatten(&shortcutSettings) != B_OK) { + fNodeRef = NULL; + return; + } + shortcutSettings.GetNodeRef(fNodeRef); + + int32 i = 0; + BMessage message; + while (fileMsg.FindMessage("spec", i++, &message) == B_OK) { + int32 key; + if (message.FindInt32("key", &key) != B_OK) + continue; + + // only handle shortcuts referring add-ons + BString command; + if (message.FindString("command", &command) != B_OK) + continue; + + bool isInAddOns = false; + + BStringList addOnPaths; + BPathFinder::FindPaths(B_FIND_PATH_ADD_ONS_DIRECTORY, + "Tracker/", addOnPaths); + for (int32 i = 0; i < addOnPaths.CountStrings(); i++) { + if (command.StartsWith(addOnPaths.StringAt(i))) { + isInAddOns = true; + break; } } - fAddOnsList->EachElement(RevertToDefault, this); + if (!isInAddOns) + continue; - BFile shortcutSettings(fShortcutsSettings, B_READ_ONLY); - BMessage fileMsg; - if (shortcutSettings.InitCheck() != B_OK - || fileMsg.Unflatten(&shortcutSettings) != B_OK) { - fNodeRef = NULL; - return; - } - shortcutSettings.GetNodeRef(fNodeRef); + BEntry entry(command); + if (entry.InitCheck() != B_OK) + continue; - int32 i = 0; - BMessage message; - while (fileMsg.FindMessage("spec", i++, &message) == B_OK) { - int32 key; - if (message.FindInt32("key", &key) == B_OK) { - // only handle shortcuts referring add-ons - BString command; - if (message.FindString("command", &command) != B_OK) - continue; + const char* shortcut = GetKeyName(key); + if (strlen(shortcut) != 1) + continue; - bool isInAddOns = false; + uint32 modifiers = B_COMMAND_KEY; + // it's required by interface kit to at least + // have B_COMMAND_KEY + int32 value; + if (message.FindInt32("mcidx", 0, &value) == B_OK) + modifiers |= (value != 0 ? B_SHIFT_KEY : 0); - BStringList addOnPaths; - BPathFinder::FindPaths(B_FIND_PATH_ADD_ONS_DIRECTORY, - "Tracker/", addOnPaths); - for (int32 i = 0; i < addOnPaths.CountStrings(); i++) { - if (command.StartsWith(addOnPaths.StringAt(i))) { - isInAddOns = true; - break; - } - } + if (message.FindInt32("mcidx", 1, &value) == B_OK) + modifiers |= (value != 0 ? B_CONTROL_KEY : 0); - if (!isInAddOns) - continue; + if (message.FindInt32("mcidx", 3, &value) == B_OK) + modifiers |= (value != 0 ? B_OPTION_KEY : 0); - BEntry entry(command); - if (entry.InitCheck() != B_OK) - continue; + Model model(&entry); + AddOnShortcut* item = fAddOnsList->EachElement(FindElement, &model); + if (item != NULL) { + if (item->key != '\0') + RemoveShortcut(item->key, item->modifiers); - const char* shortcut = GetKeyName(key); - if (strlen(shortcut) != 1) - continue; - - uint32 modifiers = B_COMMAND_KEY; - // it's required by interface kit to at least - // have B_COMMAND_KEY - int32 value; - if (message.FindInt32("mcidx", 0, &value) == B_OK) - modifiers |= (value != 0 ? B_SHIFT_KEY : 0); - - if (message.FindInt32("mcidx", 1, &value) == B_OK) - modifiers |= (value != 0 ? B_CONTROL_KEY : 0); - - if (message.FindInt32("mcidx", 3, &value) == B_OK) - modifiers |= (value != 0 ? B_OPTION_KEY : 0); - - Model model(&entry); - AddOnShortcut* item = fAddOnsList->EachElement(FindElement, - &model); - if (item != NULL) { - if (item->key != '\0') - RemoveShortcut(item->key, item->modifiers); - - item->key = shortcut[0]; - item->modifiers = modifiers; - AddOneShortcut(&model, item->key, item->modifiers, this); - } - } + item->key = shortcut[0]; + item->modifiers = modifiers; + AddOneShortcut(&model, item->key, item->modifiers, this); } } }