hrev48964 adds 1 changeset to branch 'master' old head: 1aaa0c2142c6c843e93bd1ee8edd4c7ea6256559 new head: 6257ef92467bd4ca7d9d0d115a5510ea7c044d98 overview: http://cgit.haiku-os.org/haiku/log/?qt=range&q=6257ef92467b+%5E1aaa0c2142c6 ---------------------------------------------------------------------------- 6257ef92467b: Network: let add-ons replace themselves by name. * Ie. an add-on "Super duper service" in ~/config will override one with the same name in /system (and non-packaged in packaged, etc.). * Fixed size of the scroller to ignore the content size vertically. [ Axel Dörfler <axeld@xxxxxxxxxxxxxxxx> ] ---------------------------------------------------------------------------- Revision: hrev48964 Commit: 6257ef92467bd4ca7d9d0d115a5510ea7c044d98 URL: http://cgit.haiku-os.org/haiku/commit/?id=6257ef92467b Author: Axel Dörfler <axeld@xxxxxxxxxxxxxxxx> Date: Tue Mar 31 12:45:17 2015 UTC ---------------------------------------------------------------------------- 1 file changed, 66 insertions(+), 53 deletions(-) src/preferences/network/NetworkWindow.cpp | 119 ++++++++++++++------------ ---------------------------------------------------------------------------- diff --git a/src/preferences/network/NetworkWindow.cpp b/src/preferences/network/NetworkWindow.cpp index 5cc11ef..8aad195 100644 --- a/src/preferences/network/NetworkWindow.cpp +++ b/src/preferences/network/NetworkWindow.cpp @@ -126,6 +126,7 @@ NetworkWindow::NetworkWindow() BScrollView* scrollView = new BScrollView("ScrollView", fListView, 0, false, true); + scrollView->SetExplicitMinSize(BSize(B_SIZE_UNSET, 42)); fAddOnShellView = new BView("add-on shell", 0, new BGroupLayout(B_VERTICAL)); @@ -349,6 +350,11 @@ NetworkWindow::_ScanAddOns() BPathFinder::FindPaths(B_FIND_PATH_ADD_ONS_DIRECTORY, "Network Settings", paths); + // Collect add-on paths by name, so that each name will only be + // loaded once. + typedef std::map<BString, BPath> PathMap; + PathMap addOnMap; + for (int32 i = 0; i < paths.CountStrings(); i++) { BDirectory directory(paths.StringAt(i)); BEntry entry; @@ -357,72 +363,79 @@ NetworkWindow::_ScanAddOns() if (entry.GetPath(&path) != B_OK) continue; - image_id image = load_add_on(path.Path()); - if (image < 0) { - printf("Failed to load %s addon: %s.\n", path.Path(), - strerror(image)); - continue; - } + if (addOnMap.find(path.Leaf()) == addOnMap.end()) + addOnMap.insert(std::pair<BString, BPath>(path.Leaf(), path)); + } + } - BNetworkSettingsAddOn* (*instantiateAddOn)(image_id image, - BNetworkSettings& settings); - - status_t status = get_image_symbol(image, - "instantiate_network_settings_add_on", - B_SYMBOL_TYPE_TEXT, (void**)&instantiateAddOn); - if (status != B_OK) { - // No "addon instantiate function" symbol found in this addon - printf("No symbol \"instantiate_network_settings_add_on\" " - "found in %s addon: not a network setup addon!\n", - path.Path()); - unload_add_on(image); - continue; - } + for (PathMap::const_iterator iterator = addOnMap.begin(); + iterator != addOnMap.end(); iterator++) { + const BPath& path = iterator->second; - BNetworkSettingsAddOn* addOn = instantiateAddOn(image, fSettings); - if (addOn == NULL) { - unload_add_on(image); - continue; - } + image_id image = load_add_on(path.Path()); + if (image < 0) { + printf("Failed to load %s addon: %s.\n", path.Path(), + strerror(image)); + continue; + } - fAddOns.AddItem(addOn); - - // Per interface items - ItemMap::const_iterator iterator = fInterfaceItemMap.begin(); - for (; iterator != fInterfaceItemMap.end(); iterator++) { - const BString& interface = iterator->first; - BListItem* interfaceItem = iterator->second; - - uint32 cookie = 0; - while (true) { - BNetworkSettingsItem* item = addOn->CreateNextInterfaceItem( - cookie, interface.String()); - if (item == NULL) - break; - - fSettingsMap[item->ListItem()] = item; - fListView->AddUnder(item->ListItem(), interfaceItem); - } - fListView->SortItemsUnder(interfaceItem, true, - NetworkWindow::_CompareListItems); - } + BNetworkSettingsAddOn* (*instantiateAddOn)(image_id image, + BNetworkSettings& settings); + + status_t status = get_image_symbol(image, + "instantiate_network_settings_add_on", + B_SYMBOL_TYPE_TEXT, (void**)&instantiateAddOn); + if (status != B_OK) { + // No "addon instantiate function" symbol found in this addon + printf("No symbol \"instantiate_network_settings_add_on\" found " + "in %s addon: not a network setup addon!\n", path.Path()); + unload_add_on(image); + continue; + } + + BNetworkSettingsAddOn* addOn = instantiateAddOn(image, fSettings); + if (addOn == NULL) { + unload_add_on(image); + continue; + } + + fAddOns.AddItem(addOn); + + // Per interface items + ItemMap::const_iterator iterator = fInterfaceItemMap.begin(); + for (; iterator != fInterfaceItemMap.end(); iterator++) { + const BString& interface = iterator->first; + BListItem* interfaceItem = iterator->second; - // Generic items uint32 cookie = 0; while (true) { - BNetworkSettingsItem* item = addOn->CreateNextItem(cookie); + BNetworkSettingsItem* item = addOn->CreateNextInterfaceItem( + cookie, interface.String()); if (item == NULL) break; fSettingsMap[item->ListItem()] = item; - fListView->AddUnder(item->ListItem(), - _ListItemFor(item->Type())); + fListView->AddUnder(item->ListItem(), interfaceItem); } + fListView->SortItemsUnder(interfaceItem, true, + NetworkWindow::_CompareListItems); + } - _SortItemsUnder(fServicesItem); - _SortItemsUnder(fDialUpItem); - _SortItemsUnder(fOtherItem); + // Generic items + uint32 cookie = 0; + while (true) { + BNetworkSettingsItem* item = addOn->CreateNextItem(cookie); + if (item == NULL) + break; + + fSettingsMap[item->ListItem()] = item; + fListView->AddUnder(item->ListItem(), + _ListItemFor(item->Type())); } + + _SortItemsUnder(fServicesItem); + _SortItemsUnder(fDialUpItem); + _SortItemsUnder(fOtherItem); } fListView->SortItemsUnder(NULL, true,