diff --git a/src/portmanager.cpp b/src/portmanager.cpp index 1bae4f3..ff90d74 100644 --- a/src/portmanager.cpp +++ b/src/portmanager.cpp @@ -274,7 +274,30 @@ Port *PortManager::FindPort(jack_port_t *port) static bool BaseSortPredicate(const Base *lhs, const Base *rhs) { - return lhs->m_name < rhs->m_name; + const char *a = lhs->m_name.c_str(); + const char *b = rhs->m_name.c_str(); + size_t len = std::max(lhs->m_name.length(), rhs->m_name.length()); + + for (size_t p = 0; p < len; p++) { + char ac = (p < lhs->m_name.length()) ? a[p] : '\0'; + char bc = (p < rhs->m_name.length()) ? b[p] : '\0'; + + if (ac >= '0' && ac <= '9' && bc >= '0' && bc <= '9') { + // Numeric sort + long int av = strtol(&a[p], NULL, 0); + long int bv = strtol(&b[p], NULL, 0); + if (av != bv) { + return av < bv; + } + } else { + // Alphabetic sort + if (ac != bc) { + return ac < bc; + } + } + } + + return false; } void PortManager::Sort()