Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
96 changes: 96 additions & 0 deletions .clang-tidy
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
Checks: >
-*,
bugprone-*,
-bugprone-easily-swappable-parameters,
-bugprone-narrowing-conversions,
cppcoreguidelines-*,
-cppcoreguidelines-avoid-magic-numbers,
-cppcoreguidelines-avoid-non-const-global-variables,
-cppcoreguidelines-non-private-member-variables-in-classes,
-cppcoreguidelines-pro-bounds-array-to-pointer-decay,
-cppcoreguidelines-pro-bounds-constant-array-index,
-cppcoreguidelines-pro-bounds-pointer-arithmetic,
-cppcoreguidelines-pro-type-vararg,
-cppcoreguidelines-owning-memory,
modernize-*,
-modernize-use-trailing-return-type,
-modernize-avoid-c-arrays,
performance-*,
readability-*,
-readability-identifier-length,
-readability-magic-numbers,
-readability-named-parameter,
-readability-function-cognitive-complexity,
misc-*,
-misc-non-private-member-variables-in-classes,
-misc-no-recursion,
-misc-include-cleaner,
portability-*

WarningsAsErrors: ''
HeaderFilterRegex: '^src/.*\.(h|hpp)$'
FormatStyle: file

CheckOptions:
- key: readability-identifier-naming.NamespaceCase
value: CamelCase
- key: readability-identifier-naming.ClassCase
value: CamelCase
- key: readability-identifier-naming.StructCase
value: CamelCase
- key: readability-identifier-naming.UnionCase
value: CamelCase
- key: readability-identifier-naming.EnumCase
value: CamelCase
- key: readability-identifier-naming.EnumConstantCase
value: CamelCase
- key: readability-identifier-naming.TypeAliasCase
value: CamelCase
- key: readability-identifier-naming.TypedefCase
value: CamelCase
- key: readability-identifier-naming.FunctionCase
value: CamelCase
- key: readability-identifier-naming.MethodCase
value: CamelCase
- key: readability-identifier-naming.MemberCase
value: CamelCase
- key: readability-identifier-naming.PublicMemberCase
value: CamelCase
- key: readability-identifier-naming.ProtectedMemberCase
value: CamelCase
- key: readability-identifier-naming.PrivateMemberCase
value: CamelCase
- key: readability-identifier-naming.ParameterCase
value: camelBack
- key: readability-identifier-naming.LocalVariableCase
value: camelBack
- key: readability-identifier-naming.VariableCase
value: camelBack
- key: readability-identifier-naming.StaticVariableCase
value: camelBack
- key: readability-identifier-naming.ConstexprVariableCase
value: CamelCase
- key: readability-identifier-naming.ConstantCase
value: CamelCase
- key: readability-identifier-naming.GlobalConstantCase
value: CamelCase
- key: readability-identifier-naming.StaticConstantCase
value: CamelCase
- key: readability-identifier-naming.ClassConstantCase
value: CamelCase
- key: readability-identifier-naming.MacroDefinitionCase
value: UPPER_CASE
- key: readability-identifier-naming.TemplateParameterCase
value: CamelCase
- key: readability-implicit-bool-conversion.AllowIntegerConditions
value: true
- key: readability-implicit-bool-conversion.AllowPointerConditions
value: true
- key: modernize-use-default-member-init.UseAssignment
value: true
- key: modernize-use-override.IgnoreDestructors
value: true
- key: cppcoreguidelines-special-member-functions.AllowSoleDefaultDtor
value: true
- key: cppcoreguidelines-special-member-functions.AllowMissingMoveFunctions
value: true
3 changes: 3 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -132,10 +132,12 @@ add_library(coredeck_core STATIC
src/core/emulator_console.cpp
src/core/file_dialog.cpp
src/core/log_buffer.cpp
src/core/log_filter.cpp
src/core/options.cpp
src/core/paths.cpp
src/core/process.cpp
src/core/sdk.cpp
src/core/skin.cpp
src/core/system_image.cpp
src/core/utilities.cpp
src/core/version_check.cpp
Expand Down Expand Up @@ -189,6 +191,7 @@ add_executable(${PROJECT_NAME}
src/gui/windows/onboarding.cpp
src/gui/windows/preferences.cpp
src/gui/windows/sdk_banner.cpp
src/gui/windows/skin.cpp
src/gui/windows/storage.cpp
src/gui/windows/update.cpp
src/gui/application.cpp
Expand Down
10 changes: 10 additions & 0 deletions src/core/avd.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -190,6 +190,10 @@ namespace CoreDeck {
avd.GpuMode = it->second;
}

if (auto it = config.find("skin.name"); it != config.end()) {
avd.SkinName = it->second;
}

return avd;
}

Expand Down Expand Up @@ -255,6 +259,12 @@ namespace CoreDeck {
file << "hw.gpu.mode=" << data.GpuMode << "\n";
file << "hw.gpu.enabled=yes\n";
}
if (!data.SkinName.empty()) {
file << "skin.name=" << data.SkinName << "\n";
if (!data.SkinPath.empty()) {
file << "skin.path=" << data.SkinPath << "\n";
}
}
}
}

Expand Down
3 changes: 3 additions & 0 deletions src/core/avd.h
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ namespace CoreDeck {
std::string GpuMode;
std::string Arch;
std::string Path;
std::string SkinName;
};

struct AvdCreationData {
Expand All @@ -42,6 +43,8 @@ namespace CoreDeck {
std::string RamSize;
std::string SdCardSize;
std::string GpuMode;
std::string SkinName;
std::string SkinPath;
};

std::vector<AvdInfo> LoadAvds(const std::vector<std::string> &avdNames);
Expand Down
78 changes: 78 additions & 0 deletions src/core/log_filter.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
//
// Created by AbdulMuaz Aqeel on 06/05/2026.
//

#include <regex>

#include "log_filter.h"
#include "utilities.h"

namespace CoreDeck {
static void AppendLine(std::string &out, const std::string &line) {
out.append(line);
out.push_back('\n');
}

static void CollectSubstringMatches(const std::string &line, const std::size_t &lineStart, const std::string &needle, const bool &caseSensitive, std::vector<LogMatch> &out) {
if (needle.empty()) return;

const std::string haystack = caseSensitive ? line : LowerCopy(line);
const std::string pattern = caseSensitive ? needle : LowerCopy(needle);

std::size_t pos = 0;
while ((pos = haystack.find(pattern, pos)) != std::string::npos) {
LogMatch m;
m.StartOffset = lineStart + pos;
m.EndOffset = m.StartOffset + pattern.size();
out.push_back(m);
pos += pattern.size();
}
}

static void CollectRegexMatches(const std::string &line, const std::size_t lineStart, const std::regex &re, std::vector<LogMatch> &out) {
const auto end = std::sregex_iterator{};
for (auto it = std::sregex_iterator(line.begin(), line.end(), re); it != end; ++it) {
if (it->length() == 0) continue;
LogMatch m;
m.StartOffset = lineStart + static_cast<std::size_t>(it->position());
m.EndOffset = m.StartOffset + static_cast<std::size_t>(it->length());
out.push_back(m);
}
}


LogFilterResult FilterLog(const std::vector<std::string> &lines, const LogFilterOptions &options) {
LogFilterResult result;
result.Joined.reserve(lines.size() * 80);

const bool hasQuery = !options.Query.empty();

std::regex compiled;
if (hasQuery && options.UseRegex) {
try {
auto flags = std::regex::ECMAScript;
if (!options.CaseSensitive) flags |= std::regex::icase;
compiled = std::regex(options.Query, flags);
} catch (const std::regex_error &e) {
result.RegexValid = false;
result.RegexError = e.what();
}
}

const bool collectMatches = hasQuery && (options.UseRegex ? result.RegexValid : true);

for (const auto &line: lines) {
const std::size_t lineStart = result.Joined.size();
if (collectMatches) {
if (options.UseRegex) {
CollectRegexMatches(line, lineStart, compiled, result.Matches);
} else {
CollectSubstringMatches(line, lineStart, options.Query, options.CaseSensitive, result.Matches);
}
}
AppendLine(result.Joined, line);
}

return result;
}
}
34 changes: 34 additions & 0 deletions src/core/log_filter.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
//
// Created by AbdulMuaz Aqeel on 06/05/2026.
//

#ifndef COREDECK_LOG_FILTER_H
#define COREDECK_LOG_FILTER_H

#include <cstddef>
#include <string>
#include <vector>

namespace CoreDeck {
struct LogFilterOptions {
std::string Query;
bool UseRegex = false;
bool CaseSensitive = false;
};

struct LogMatch {
std::size_t StartOffset = 0;
std::size_t EndOffset = 0;
};

struct LogFilterResult {
std::string Joined;
std::vector<LogMatch> Matches;
bool RegexValid = true;
std::string RegexError;
};

LogFilterResult FilterLog(const std::vector<std::string> &lines, const LogFilterOptions &options);
}

#endif // COREDECK_LOG_FILTER_H
Loading
Loading