diff --git a/.clang-tidy b/.clang-tidy new file mode 100644 index 0000000..f0dfdf1 --- /dev/null +++ b/.clang-tidy @@ -0,0 +1,101 @@ +WarningsAsErrors: '*' +HeaderFilterRegex: '.*\.hpp' +FormatStyle: file +Checks: > + -*, + bugprone-*, + -bugprone-easily-swappable-parameters, + -bugprone-forward-declararion-namespace, + -bugprone-forward-declararion-namespace, + -bugprone-macro-parentheses, + -bugprone-narrowing-conversions, + -bugprone-branch-clone, + -bugprone-assignment-in-if-condition, + concurrency-*, + -concurrency-mt-unsafe, + cppcoreguidelines-*, + -cppcoreguidelines-owning-memory, + -cppcoreguidelines-avoid-magic-numbers, + -cppcoreguidelines-pro-bounds-constant-array-index, + -cppcoreguidelines-avoid-const-or-ref-data-members, + -cppcoreguidelines-non-private-member-variables-in-classes, + -cppcoreguidelines-avoid-goto, + -cppcoreguidelines-pro-bounds-array-to-pointer-decay, + -cppcoreguidelines-avoid-do-while, + -cppcoreguidelines-avoid-non-const-global-variables, + -cppcoreguidelines-special-member-functions, + -cppcoreguidelines-explicit-virtual-functions, + -cppcoreguidelines-avoid-c-arrays, + -cppcoreguidelines-pro-bounds-pointer-arithmetic, + -cppcoreguidelines-narrowing-conversions, + -cppcoreguidelines-pro-type-union-access, + -cppcoreguidelines-pro-type-member-init, + -cppcoreguidelines-macro-usage, + -cppcoreguidelines-macro-to-enum, + -cppcoreguidelines-init-variables, + -cppcoreguidelines-pro-type-cstyle-cast, + -cppcoreguidelines-pro-type-vararg, + -cppcoreguidelines-pro-type-reinterpret-cast, + google-global-names-in-headers, + -google-readability-casting, + google-runtime-operator, + misc-*, + -misc-unused-parameters, + -misc-no-recursion, + -misc-non-private-member-variables-in-classes, + -misc-include-cleaner, + -misc-use-anonymous-namespace, + -misc-const-correctness, + modernize-*, + -modernize-return-braced-init-list, + -modernize-use-trailing-return-type, + -modernize-use-using, + -modernize-use-override, + -modernize-avoid-c-arrays, + -modernize-macro-to-enum, + -modernize-loop-convert, + -modernize-use-nodiscard, + -modernize-pass-by-value, + -modernize-use-auto, + performance-*, + -performance-avoid-endl, + -performance-unnecessary-value-param, + portability-std-allocator-const, + readability-*, + -readability-function-cognitive-complexity, + -readability-function-size, + -readability-identifier-length, + -readability-magic-numbers, + -readability-uppercase-literal-suffix, + -readability-braces-around-statements, + -readability-redundant-access-specifiers, + -readability-else-after-return, + -readability-container-data-pointer, + -readability-implicit-bool-conversion, + -readability-avoid-nested-conditional-operator, + -readability-redundant-member-init, + -readability-redundant-string-init, + -readability-avoid-const-params-in-decls, + -readability-named-parameter, + -readability-convert-member-functions-to-static, + -readability-qualified-auto, + -readability-make-member-function-const, + -readability-isolate-declaration, + -readability-inconsistent-declaration-parameter-name, + -clang-diagnostic-error, + +CheckOptions: + performance-for-range-copy.WarnOnAllAutoCopies: true + performance-inefficient-string-concatenation.StrictMode: true + readability-braces-around-statements.ShortStatementLines: 0 + readability-identifier-naming.ClassCase: CamelCase + readability-identifier-naming.ClassIgnoredRegexp: I.* + readability-identifier-naming.ClassPrefix: C # We can't use regex here?!?!?!? + readability-identifier-naming.EnumCase: CamelCase + readability-identifier-naming.EnumPrefix: e + readability-identifier-naming.EnumConstantCase: UPPER_CASE + readability-identifier-naming.FunctionCase: camelBack + readability-identifier-naming.NamespaceCase: CamelCase + readability-identifier-naming.NamespacePrefix: N + readability-identifier-naming.StructPrefix: S + readability-identifier-naming.StructCase: CamelCase diff --git a/CMakeLists.txt b/CMakeLists.txt index 3438cf9..c1474c7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -20,6 +20,16 @@ set(LIBDIR ${CMAKE_INSTALL_FULL_LIBDIR}) configure_file(hyprcursor.pc.in hyprcursor.pc @ONLY) set(CMAKE_CXX_STANDARD 23) +add_compile_options( + -Wall + -Wextra + -Wpedantic + -Wno-unused-parameter + -Wno-unused-value + -Wno-missing-field-initializers + -Wno-narrowing + -Wno-pointer-arith) +set(CMAKE_EXPORT_COMPILE_COMMANDS TRUE) find_package(PkgConfig REQUIRED) pkg_check_modules( @@ -63,13 +73,6 @@ set_target_properties( target_link_libraries(hyprcursor PkgConfig::deps) -if(CMAKE_CXX_COMPILER_ID MATCHES "Clang") - # for std::expected. probably evil. Arch's clang is very outdated tho... - target_compile_options( - hyprcursor PUBLIC $<$:-std=gnu++2b - -D__cpp_concepts=202002L> -Wno-builtin-macro-redefined) -endif() - # hyprcursor-util file( GLOB_RECURSE diff --git a/VERSION b/VERSION index 20f4951..0e24a92 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.1.11 +0.1.12 diff --git a/flake.lock b/flake.lock index 52511f1..f4fec33 100644 --- a/flake.lock +++ b/flake.lock @@ -11,11 +11,11 @@ ] }, "locked": { - "lastModified": 1734364628, - "narHash": "sha256-ii8fzJfI953n/EmIxVvq64ZAwhvwuuPHWfGd61/mJG8=", + "lastModified": 1737634606, + "narHash": "sha256-W7W87Cv6wqZ9PHegI6rH1+ve3zJPiyevMFf0/HwdbCQ=", "owner": "hyprwm", "repo": "hyprlang", - "rev": "16e59c1eb13d9fb6de066f54e7555eb5e8a4aba5", + "rev": "f41271d35cc0f370d300413d756c2677f386af9d", "type": "github" }, "original": { @@ -36,11 +36,11 @@ ] }, "locked": { - "lastModified": 1733502241, - "narHash": "sha256-KAUNC4Dgq8WQjYov5auBw/usaHixhacvb7cRDd0AG/k=", + "lastModified": 1737632363, + "narHash": "sha256-X9I8POSlHxBVjD0fiX1O2j7U9Zi1+4rIkrsyHP0uHXY=", "owner": "hyprwm", "repo": "hyprutils", - "rev": "104117aed6dd68561be38b50f218190aa47f2cd8", + "rev": "006620eb29d54ea9086538891404c78563d1bae1", "type": "github" }, "original": { @@ -51,11 +51,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1734119587, - "narHash": "sha256-AKU6qqskl0yf2+JdRdD0cfxX4b9x3KKV5RqA6wijmPM=", + "lastModified": 1737469691, + "narHash": "sha256-nmKOgAU48S41dTPIXAq0AHZSehWUn6ZPrUKijHAMmIk=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "3566ab7246670a43abd2ffa913cc62dad9cdf7d5", + "rev": "9e4d5190a9482a1fb9d18adf0bdb83c6e506eaab", "type": "github" }, "original": { diff --git a/hyprcursor-util/src/main.cpp b/hyprcursor-util/src/main.cpp index 97e6573..78218dd 100644 --- a/hyprcursor-util/src/main.cpp +++ b/hyprcursor-util/src/main.cpp @@ -16,12 +16,12 @@ #define ZIP_LENGTH_TO_END -1 #endif -enum eOperation { +enum eOperation : uint8_t { OPERATION_CREATE = 0, OPERATION_EXTRACT = 1, }; -eHyprcursorResizeAlgo explicitResizeAlgo = HC_RESIZE_INVALID; +static eHyprcursorResizeAlgo explicitResizeAlgo = HC_RESIZE_INVALID; struct XCursorConfigEntry { int size = 0, hotspotX = 0, hotspotY = 0, delay = 0; @@ -119,7 +119,7 @@ static std::optional createCursorThemeFromPath(const std::string& p return "couldn't parse meta: " + *PARSERESULT2; for (auto& i : meta.parsedData.definedSizes) { - SHAPE->images.push_back(SCursorImage{i.file, i.size, i.delayMs}); + SHAPE->images.push_back(SCursorImage{.filename = i.file, .size = i.size, .delay = i.delayMs}); } SHAPE->overrides = meta.parsedData.overrides; @@ -388,7 +388,7 @@ int main(int argc, char** argv, char** envp) { eOperation op = OPERATION_CREATE; std::string path = "", out = ""; - for (size_t i = 1; i < argc; ++i) { + for (int i = 1; i < argc; ++i) { std::string arg = argv[i]; if (arg == "-v" || arg == "--version") { diff --git a/include/hyprcursor/hyprcursor.hpp b/include/hyprcursor/hyprcursor.hpp index 2be1bf3..6de2f57 100644 --- a/include/hyprcursor/hyprcursor.hpp +++ b/include/hyprcursor/hyprcursor.hpp @@ -1,7 +1,7 @@ #pragma once #include -#include +#include #include #include "shared.h" @@ -114,7 +114,7 @@ namespace Hyprcursor { SCursorShapeData data; - for (size_t i = 0; i < size; ++i) { + for (int i = 0; i < size; ++i) { SCursorImageData image; image.delay = images[i]->delay; image.size = images[i]->size; @@ -197,4 +197,4 @@ namespace Hyprcursor { friend class CHyprcursorImplementation; }; -} \ No newline at end of file +} diff --git a/libhyprcursor/VarList.cpp b/libhyprcursor/VarList.cpp index 4a81de0..0b3ced7 100644 --- a/libhyprcursor/VarList.cpp +++ b/libhyprcursor/VarList.cpp @@ -38,7 +38,7 @@ CVarList::CVarList(const std::string& in, const size_t lastArgNo, const char del break; } pos += s.size() + 1; - m_vArgs.emplace_back(removeBeginEndSpacesTabs(std::string_view{s}.data())); + m_vArgs.emplace_back(removeBeginEndSpacesTabs(s.data())); } } @@ -51,4 +51,4 @@ std::string CVarList::join(const std::string& joiner, size_t from, size_t to) co } return rolling; -} \ No newline at end of file +} diff --git a/libhyprcursor/hyprcursor.cpp b/libhyprcursor/hyprcursor.cpp index 42aed3e..edb0673 100644 --- a/libhyprcursor/hyprcursor.cpp +++ b/libhyprcursor/hyprcursor.cpp @@ -2,6 +2,7 @@ #include "internalSharedTypes.hpp" #include "internalDefines.hpp" #include +#include #include #include #include @@ -96,7 +97,7 @@ static std::string getFirstTheme(PHYPRCURSORLOGFUNC logfn) { } for (auto& dir : systemThemeDirs) { - const auto FULLPATH = dir; + const auto& FULLPATH = dir; if (!pathAccessible(FULLPATH)) { Debug::log(HC_LOG_TRACE, logfn, "Skipping path {} because it's inaccessible.", FULLPATH); continue; @@ -175,7 +176,7 @@ static std::string getFullPathForThemeName(const std::string& name, PHYPRCURSORL } for (auto& dir : systemThemeDirs) { - const auto FULLPATH = dir; + const auto& FULLPATH = dir; if (!pathAccessible(FULLPATH)) { Debug::log(HC_LOG_TRACE, logfn, "Skipping path {} because it's inaccessible.", FULLPATH); continue; @@ -217,23 +218,19 @@ static std::string getFullPathForThemeName(const std::string& name, PHYPRCURSORL return ""; } -SManagerOptions::SManagerOptions() { - logFn = nullptr; - allowDefaultFallback = true; +SManagerOptions::SManagerOptions() : logFn(nullptr), allowDefaultFallback(true) { + ; } CHyprcursorManager::CHyprcursorManager(const char* themeName_) { init(themeName_); } -CHyprcursorManager::CHyprcursorManager(const char* themeName_, PHYPRCURSORLOGFUNC fn) { - logFn = fn; +CHyprcursorManager::CHyprcursorManager(const char* themeName_, PHYPRCURSORLOGFUNC fn) : logFn(fn) { init(themeName_); } -CHyprcursorManager::CHyprcursorManager(const char* themeName_, SManagerOptions options) { - logFn = options.logFn; - allowDefaultFallback = options.allowDefaultFallback; +CHyprcursorManager::CHyprcursorManager(const char* themeName_, SManagerOptions options) : allowDefaultFallback(options.allowDefaultFallback), logFn(options.logFn) { init(themeName_); } @@ -284,8 +281,7 @@ void CHyprcursorManager::init(const char* themeName_) { } CHyprcursorManager::~CHyprcursorManager() { - if (impl) - delete impl; + delete impl; } bool CHyprcursorManager::valid() { @@ -508,7 +504,7 @@ bool CHyprcursorManager::loadThemeStyle(const SCursorStyleInfo& info) { auto& newImage = impl->loadedShapes[shape.get()].images.emplace_back(std::make_unique()); newImage->artificial = true; newImage->side = PIXELSIDE; - newImage->artificialData = new char[PIXELSIDE * PIXELSIDE * 4]; + newImage->artificialData = new char[static_cast(PIXELSIDE * PIXELSIDE * 4)]; newImage->cairoSurface = cairo_image_surface_create_for_data((unsigned char*)newImage->artificialData, CAIRO_FORMAT_ARGB32, PIXELSIDE, PIXELSIDE, PIXELSIDE * 4); newImage->delay = f->delay; @@ -549,7 +545,7 @@ bool CHyprcursorManager::loadThemeStyle(const SCursorStyleInfo& info) { auto& newImage = impl->loadedShapes[shape.get()].images.emplace_back(std::make_unique()); newImage->artificial = true; newImage->side = PIXELSIDE; - newImage->artificialData = new char[PIXELSIDE * PIXELSIDE * 4]; + newImage->artificialData = new char[static_cast(PIXELSIDE * PIXELSIDE * 4)]; newImage->cairoSurface = cairo_image_surface_create_for_data((unsigned char*)newImage->artificialData, CAIRO_FORMAT_ARGB32, PIXELSIDE, PIXELSIDE, PIXELSIDE * 4); newImage->delay = f->delay; @@ -572,12 +568,14 @@ bool CHyprcursorManager::loadThemeStyle(const SCursorStyleInfo& info) { if (!rsvg_handle_render_document(handle, PCAIRO, &rect, &error)) { Debug::log(HC_LOG_ERR, logFn, "Failed rendering svg: {}", error->message); + g_object_unref(handle); return false; } // done cairo_surface_flush(newImage->cairoSurface); cairo_destroy(PCAIRO); + g_object_unref(handle); } } else { Debug::log(HC_LOG_ERR, logFn, "Invalid shapetype in loadThemeStyle"); @@ -687,9 +685,9 @@ std::optional CHyprcursorImplementation::loadTheme() { zip_file_t* meta_file = zip_fopen_index(zip, index, ZIP_FL_UNCHANGED); - char* buffer = new char[1024 * 1024]; /* 1MB should be more than enough */ + char* buffer = new char[static_cast(1024 * 1024)]; /* 1MB should be more than enough */ - int readBytes = zip_fread(meta_file, buffer, 1024 * 1024 - 1); + int readBytes = zip_fread(meta_file, buffer, (1024 * 1024) - 1); zip_fclose(meta_file); @@ -709,7 +707,7 @@ std::optional CHyprcursorImplementation::loadTheme() { return "cursor" + cursor.path().string() + "failed to parse meta: " + *METAPARSERESULT; for (auto& i : meta.parsedData.definedSizes) { - SHAPE->images.push_back(SCursorImage{i.file, i.size, i.delayMs}); + SHAPE->images.push_back(SCursorImage{.filename = i.file, .size = i.size, .delay = i.delayMs}); } SHAPE->overrides = meta.parsedData.overrides; @@ -753,8 +751,8 @@ std::optional CHyprcursorImplementation::loadTheme() { IMAGE->data = new char[sb.size + 1]; IMAGE->dataLen = sb.size + 1; } else { - IMAGE->data = new char[1024 * 1024]; /* 1MB should be more than enough, again. This probably should be in the spec. */ - IMAGE->dataLen = 1024 * 1024; + IMAGE->data = new char[static_cast(1024 * 1024)]; /* 1MB should be more than enough, again. This probably should be in the spec. */ + IMAGE->dataLen = static_cast(1024 * 1024); } IMAGE->dataLen = zip_fread(image_file, IMAGE->data, IMAGE->dataLen - 1); diff --git a/libhyprcursor/hyprcursor_c.cpp b/libhyprcursor/hyprcursor_c.cpp index 764031d..2895bcd 100644 --- a/libhyprcursor/hyprcursor_c.cpp +++ b/libhyprcursor/hyprcursor_c.cpp @@ -38,7 +38,7 @@ struct SCursorImageData** hyprcursor_get_cursor_image_data(struct hyprcursor_man } void hyprcursor_cursor_image_data_free(hyprcursor_cursor_image_data** data, int size) { - for (size_t i = 0; i < size; ++i) { + for (int i = 0; i < size; ++i) { free(data[i]); } @@ -49,7 +49,7 @@ void hyprcursor_style_done(hyprcursor_manager_t* manager, hyprcursor_cursor_styl const auto MGR = (CHyprcursorManager*)manager; SCursorStyleInfo info; info.size = info_.size; - return MGR->cursorSurfaceStyleDone(info); + MGR->cursorSurfaceStyleDone(info); } void hyprcursor_register_logging_function(struct hyprcursor_manager_t* manager, PHYPRCURSORLOGFUNC fn) { @@ -71,4 +71,4 @@ CAPI void hyprcursor_raw_shape_data_free(hyprcursor_cursor_raw_shape_data* data) delete[] data->images; delete data; -} \ No newline at end of file +} diff --git a/libhyprcursor/meta.cpp b/libhyprcursor/meta.cpp index b841adb..8db0c54 100644 --- a/libhyprcursor/meta.cpp +++ b/libhyprcursor/meta.cpp @@ -8,9 +8,9 @@ #include "VarList.hpp" -CMeta* currentMeta = nullptr; +static CMeta* currentMeta = nullptr; -CMeta::CMeta(const std::string& rawdata_, bool hyprlang_ /* false for toml */, bool dataIsPath) : rawdata(rawdata_), hyprlang(hyprlang_), dataPath(dataIsPath) { +CMeta::CMeta(const std::string& rawdata_, bool hyprlang_ /* false for toml */, bool dataIsPath) : dataPath(dataIsPath), hyprlang(hyprlang_), rawdata(rawdata_) { if (!dataIsPath) return; @@ -87,8 +87,8 @@ static Hyprlang::CParseResult parseDefineSize(const char* C, const char* V) { CMeta::SDefinedSize size; if (RHS.contains(",")) { - const auto LL = removeBeginEndSpacesTabs(RHS.substr(0, RHS.find(","))); - const auto RR = removeBeginEndSpacesTabs(RHS.substr(RHS.find(",") + 1)); + const auto LL = removeBeginEndSpacesTabs(RHS.substr(0, RHS.find(','))); + const auto RR = removeBeginEndSpacesTabs(RHS.substr(RHS.find(',') + 1)); try { size.delayMs = std::stoull(RR); @@ -130,7 +130,7 @@ static Hyprlang::CParseResult parseOverride(const char* C, const char* V) { CVarList overrides(VALUE, 0, ';'); for (const auto& o : overrides) { - currentMeta->parsedData.overrides.push_back(VALUE); + currentMeta->parsedData.overrides.push_back(o); } return result; diff --git a/tests/c_test.c b/tests/c_test.c index 9b975b9..31a4e0b 100644 --- a/tests/c_test.c +++ b/tests/c_test.c @@ -43,10 +43,10 @@ int main(int argc, char** argv) { return 1; } - printf("left_ptr images: %d\n", shapeData->len); + printf("left_ptr images: %ld\n", shapeData->len); for (size_t i = 0; i < shapeData->len; ++i) { - printf("left_ptr image size: %d\n", shapeData->images[i].len); + printf("left_ptr image size: %ld\n", shapeData->images[i].len); } hyprcursor_raw_shape_data_free(shapeData); @@ -76,4 +76,4 @@ int main(int argc, char** argv) { } return 0; -} \ No newline at end of file +}