diff --git a/AK/AKString.h b/AK/AKString.h index a9ad132c573..65abb9e10fc 100644 --- a/AK/AKString.h +++ b/AK/AKString.h @@ -74,6 +74,8 @@ public: const char* characters() const { return m_impl ? m_impl->characters() : nullptr; } char operator[](ssize_t i) const { ASSERT(m_impl); return (*m_impl)[i]; } + bool ends_with(const String&) const; + bool operator==(const String&) const; bool operator!=(const String& other) const { return !(*this == other); } bool operator<(const String&) const; diff --git a/AK/String.cpp b/AK/String.cpp index 7aa31c5581c..5892e7ee5ee 100644 --- a/AK/String.cpp +++ b/AK/String.cpp @@ -126,4 +126,15 @@ String String::format(const char* fmt, ...) return builder.to_string(); } +bool String::ends_with(const String& str) const +{ + if (str.is_empty()) + return true; + if (is_empty()) + return false; + if (str.length() > length()) + return false; + return !memcmp(characters() + (length() - str.length()), str.characters(), str.length()); +} + } diff --git a/Applications/FileManager/DirectoryTableModel.cpp b/Applications/FileManager/DirectoryTableModel.cpp index 82aba2f8c8f..6cae3a9d83c 100644 --- a/Applications/FileManager/DirectoryTableModel.cpp +++ b/Applications/FileManager/DirectoryTableModel.cpp @@ -236,6 +236,16 @@ void DirectoryTableModel::activate(const GModelIndex& index) return; } + if (path.string().ends_with(".png")) { + if (fork() == 0) { + int rc = execl("/bin/qs", "/bin/qs", path.string().characters(), nullptr); + if (rc < 0) + perror("exec"); + ASSERT_NOT_REACHED(); + } + return; + } + if (fork() == 0) { int rc = execl("/bin/TextEditor", "/bin/TextEditor", path.string().characters(), nullptr); if (rc < 0)