mirror of
https://github.com/hyprwm/hyprcursor.git
synced 2025-12-20 20:20:02 +01:00
Compare commits
No commits in common. "main" and "v0.1.11" have entirely different histories.
14 changed files with 68 additions and 161 deletions
101
.clang-tidy
101
.clang-tidy
|
|
@ -1,101 +0,0 @@
|
||||||
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
|
|
||||||
|
|
@ -20,16 +20,6 @@ set(LIBDIR ${CMAKE_INSTALL_FULL_LIBDIR})
|
||||||
configure_file(hyprcursor.pc.in hyprcursor.pc @ONLY)
|
configure_file(hyprcursor.pc.in hyprcursor.pc @ONLY)
|
||||||
|
|
||||||
set(CMAKE_CXX_STANDARD 23)
|
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)
|
find_package(PkgConfig REQUIRED)
|
||||||
pkg_check_modules(
|
pkg_check_modules(
|
||||||
|
|
@ -73,6 +63,13 @@ set_target_properties(
|
||||||
|
|
||||||
target_link_libraries(hyprcursor PkgConfig::deps)
|
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 $<$<COMPILE_LANGUAGE:CXX>:-std=gnu++2b
|
||||||
|
-D__cpp_concepts=202002L> -Wno-builtin-macro-redefined)
|
||||||
|
endif()
|
||||||
|
|
||||||
# hyprcursor-util
|
# hyprcursor-util
|
||||||
file(
|
file(
|
||||||
GLOB_RECURSE
|
GLOB_RECURSE
|
||||||
|
|
|
||||||
10
README.md
10
README.md
|
|
@ -37,6 +37,16 @@ It provides C and C++ bindings.
|
||||||
|
|
||||||
For both C and C++, see `tests/`.
|
For both C and C++, see `tests/`.
|
||||||
|
|
||||||
|
## TODO
|
||||||
|
|
||||||
|
Library:
|
||||||
|
- [x] Support animated cursors
|
||||||
|
- [x] Support SVG cursors
|
||||||
|
|
||||||
|
Util:
|
||||||
|
- [ ] Support compiling a theme with X
|
||||||
|
- [x] Support decompiling animated cursors
|
||||||
|
|
||||||
## Building
|
## Building
|
||||||
|
|
||||||
### Deps:
|
### Deps:
|
||||||
|
|
|
||||||
2
VERSION
2
VERSION
|
|
@ -1 +1 @@
|
||||||
0.1.13
|
0.1.11
|
||||||
|
|
|
||||||
|
|
@ -58,7 +58,6 @@ hotspot_y = 0.0 # this goes 0 - 1
|
||||||
# Define what cursor images this one should override.
|
# Define what cursor images this one should override.
|
||||||
# What this means is that a request for a cursor name e.g. "arrow"
|
# What this means is that a request for a cursor name e.g. "arrow"
|
||||||
# will instead use this one, even if this one is named something else.
|
# will instead use this one, even if this one is named something else.
|
||||||
# There is no unified list for all the available cursor names but this wayland list could be used as a reference https://gitlab.freedesktop.org/wayland/wayland-protocols/-/blob/main/staging/cursor-shape/cursor-shape-v1.xml#L71 for wayland specific cursors.
|
|
||||||
define_override = arrow
|
define_override = arrow
|
||||||
define_override = default
|
define_override = default
|
||||||
|
|
||||||
|
|
|
||||||
18
flake.lock
generated
18
flake.lock
generated
|
|
@ -11,11 +11,11 @@
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1749145882,
|
"lastModified": 1734364628,
|
||||||
"narHash": "sha256-qr0KXeczF8Sma3Ae7+dR2NHhvG7YeLBJv19W4oMu6ZE=",
|
"narHash": "sha256-ii8fzJfI953n/EmIxVvq64ZAwhvwuuPHWfGd61/mJG8=",
|
||||||
"owner": "hyprwm",
|
"owner": "hyprwm",
|
||||||
"repo": "hyprlang",
|
"repo": "hyprlang",
|
||||||
"rev": "1bfb84f54d50c7ae6558c794d3cfd5f6a7e6e676",
|
"rev": "16e59c1eb13d9fb6de066f54e7555eb5e8a4aba5",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
|
|
@ -36,11 +36,11 @@
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1749135356,
|
"lastModified": 1733502241,
|
||||||
"narHash": "sha256-Q8mAKMDsFbCEuq7zoSlcTuxgbIBVhfIYpX0RjE32PS0=",
|
"narHash": "sha256-KAUNC4Dgq8WQjYov5auBw/usaHixhacvb7cRDd0AG/k=",
|
||||||
"owner": "hyprwm",
|
"owner": "hyprwm",
|
||||||
"repo": "hyprutils",
|
"repo": "hyprutils",
|
||||||
"rev": "e36db00dfb3a3d3fdcc4069cb292ff60d2699ccb",
|
"rev": "104117aed6dd68561be38b50f218190aa47f2cd8",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
|
|
@ -51,11 +51,11 @@
|
||||||
},
|
},
|
||||||
"nixpkgs": {
|
"nixpkgs": {
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1748929857,
|
"lastModified": 1734119587,
|
||||||
"narHash": "sha256-lcZQ8RhsmhsK8u7LIFsJhsLh/pzR9yZ8yqpTzyGdj+Q=",
|
"narHash": "sha256-AKU6qqskl0yf2+JdRdD0cfxX4b9x3KKV5RqA6wijmPM=",
|
||||||
"owner": "NixOS",
|
"owner": "NixOS",
|
||||||
"repo": "nixpkgs",
|
"repo": "nixpkgs",
|
||||||
"rev": "c2a03962b8e24e669fb37b7df10e7c79531ff1a4",
|
"rev": "3566ab7246670a43abd2ffa913cc62dad9cdf7d5",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
|
|
|
||||||
|
|
@ -16,12 +16,12 @@
|
||||||
#define ZIP_LENGTH_TO_END -1
|
#define ZIP_LENGTH_TO_END -1
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
enum eOperation : uint8_t {
|
enum eOperation {
|
||||||
OPERATION_CREATE = 0,
|
OPERATION_CREATE = 0,
|
||||||
OPERATION_EXTRACT = 1,
|
OPERATION_EXTRACT = 1,
|
||||||
};
|
};
|
||||||
|
|
||||||
static eHyprcursorResizeAlgo explicitResizeAlgo = HC_RESIZE_INVALID;
|
eHyprcursorResizeAlgo explicitResizeAlgo = HC_RESIZE_INVALID;
|
||||||
|
|
||||||
struct XCursorConfigEntry {
|
struct XCursorConfigEntry {
|
||||||
int size = 0, hotspotX = 0, hotspotY = 0, delay = 0;
|
int size = 0, hotspotX = 0, hotspotY = 0, delay = 0;
|
||||||
|
|
@ -119,7 +119,7 @@ static std::optional<std::string> createCursorThemeFromPath(const std::string& p
|
||||||
return "couldn't parse meta: " + *PARSERESULT2;
|
return "couldn't parse meta: " + *PARSERESULT2;
|
||||||
|
|
||||||
for (auto& i : meta.parsedData.definedSizes) {
|
for (auto& i : meta.parsedData.definedSizes) {
|
||||||
SHAPE->images.push_back(SCursorImage{.filename = i.file, .size = i.size, .delay = i.delayMs});
|
SHAPE->images.push_back(SCursorImage{i.file, i.size, i.delayMs});
|
||||||
}
|
}
|
||||||
|
|
||||||
SHAPE->overrides = meta.parsedData.overrides;
|
SHAPE->overrides = meta.parsedData.overrides;
|
||||||
|
|
@ -388,7 +388,7 @@ int main(int argc, char** argv, char** envp) {
|
||||||
eOperation op = OPERATION_CREATE;
|
eOperation op = OPERATION_CREATE;
|
||||||
std::string path = "", out = "";
|
std::string path = "", out = "";
|
||||||
|
|
||||||
for (int i = 1; i < argc; ++i) {
|
for (size_t i = 1; i < argc; ++i) {
|
||||||
std::string arg = argv[i];
|
std::string arg = argv[i];
|
||||||
|
|
||||||
if (arg == "-v" || arg == "--version") {
|
if (arg == "-v" || arg == "--version") {
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include <cstdlib>
|
#include <stdlib.h>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
#include "shared.h"
|
#include "shared.h"
|
||||||
|
|
@ -114,7 +114,7 @@ namespace Hyprcursor {
|
||||||
|
|
||||||
SCursorShapeData data;
|
SCursorShapeData data;
|
||||||
|
|
||||||
for (int i = 0; i < size; ++i) {
|
for (size_t i = 0; i < size; ++i) {
|
||||||
SCursorImageData image;
|
SCursorImageData image;
|
||||||
image.delay = images[i]->delay;
|
image.delay = images[i]->delay;
|
||||||
image.size = images[i]->size;
|
image.size = images[i]->size;
|
||||||
|
|
@ -197,4 +197,4 @@ namespace Hyprcursor {
|
||||||
friend class CHyprcursorImplementation;
|
friend class CHyprcursorImplementation;
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
@ -38,7 +38,7 @@ CVarList::CVarList(const std::string& in, const size_t lastArgNo, const char del
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
pos += s.size() + 1;
|
pos += s.size() + 1;
|
||||||
m_vArgs.emplace_back(removeBeginEndSpacesTabs(s.data()));
|
m_vArgs.emplace_back(removeBeginEndSpacesTabs(std::string_view{s}.data()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -51,4 +51,4 @@ std::string CVarList::join(const std::string& joiner, size_t from, size_t to) co
|
||||||
}
|
}
|
||||||
|
|
||||||
return rolling;
|
return rolling;
|
||||||
}
|
}
|
||||||
|
|
@ -2,7 +2,6 @@
|
||||||
#include "internalSharedTypes.hpp"
|
#include "internalSharedTypes.hpp"
|
||||||
#include "internalDefines.hpp"
|
#include "internalDefines.hpp"
|
||||||
#include <array>
|
#include <array>
|
||||||
#include <cstddef>
|
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
#include <cstdio>
|
#include <cstdio>
|
||||||
#include <filesystem>
|
#include <filesystem>
|
||||||
|
|
@ -97,7 +96,7 @@ static std::string getFirstTheme(PHYPRCURSORLOGFUNC logfn) {
|
||||||
}
|
}
|
||||||
|
|
||||||
for (auto& dir : systemThemeDirs) {
|
for (auto& dir : systemThemeDirs) {
|
||||||
const auto& FULLPATH = dir;
|
const auto FULLPATH = dir;
|
||||||
if (!pathAccessible(FULLPATH)) {
|
if (!pathAccessible(FULLPATH)) {
|
||||||
Debug::log(HC_LOG_TRACE, logfn, "Skipping path {} because it's inaccessible.", FULLPATH);
|
Debug::log(HC_LOG_TRACE, logfn, "Skipping path {} because it's inaccessible.", FULLPATH);
|
||||||
continue;
|
continue;
|
||||||
|
|
@ -176,7 +175,7 @@ static std::string getFullPathForThemeName(const std::string& name, PHYPRCURSORL
|
||||||
}
|
}
|
||||||
|
|
||||||
for (auto& dir : systemThemeDirs) {
|
for (auto& dir : systemThemeDirs) {
|
||||||
const auto& FULLPATH = dir;
|
const auto FULLPATH = dir;
|
||||||
if (!pathAccessible(FULLPATH)) {
|
if (!pathAccessible(FULLPATH)) {
|
||||||
Debug::log(HC_LOG_TRACE, logfn, "Skipping path {} because it's inaccessible.", FULLPATH);
|
Debug::log(HC_LOG_TRACE, logfn, "Skipping path {} because it's inaccessible.", FULLPATH);
|
||||||
continue;
|
continue;
|
||||||
|
|
@ -218,19 +217,23 @@ static std::string getFullPathForThemeName(const std::string& name, PHYPRCURSORL
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
|
|
||||||
SManagerOptions::SManagerOptions() : logFn(nullptr), allowDefaultFallback(true) {
|
SManagerOptions::SManagerOptions() {
|
||||||
;
|
logFn = nullptr;
|
||||||
|
allowDefaultFallback = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
CHyprcursorManager::CHyprcursorManager(const char* themeName_) {
|
CHyprcursorManager::CHyprcursorManager(const char* themeName_) {
|
||||||
init(themeName_);
|
init(themeName_);
|
||||||
}
|
}
|
||||||
|
|
||||||
CHyprcursorManager::CHyprcursorManager(const char* themeName_, PHYPRCURSORLOGFUNC fn) : logFn(fn) {
|
CHyprcursorManager::CHyprcursorManager(const char* themeName_, PHYPRCURSORLOGFUNC fn) {
|
||||||
|
logFn = fn;
|
||||||
init(themeName_);
|
init(themeName_);
|
||||||
}
|
}
|
||||||
|
|
||||||
CHyprcursorManager::CHyprcursorManager(const char* themeName_, SManagerOptions options) : allowDefaultFallback(options.allowDefaultFallback), logFn(options.logFn) {
|
CHyprcursorManager::CHyprcursorManager(const char* themeName_, SManagerOptions options) {
|
||||||
|
logFn = options.logFn;
|
||||||
|
allowDefaultFallback = options.allowDefaultFallback;
|
||||||
init(themeName_);
|
init(themeName_);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -281,7 +284,8 @@ void CHyprcursorManager::init(const char* themeName_) {
|
||||||
}
|
}
|
||||||
|
|
||||||
CHyprcursorManager::~CHyprcursorManager() {
|
CHyprcursorManager::~CHyprcursorManager() {
|
||||||
delete impl;
|
if (impl)
|
||||||
|
delete impl;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CHyprcursorManager::valid() {
|
bool CHyprcursorManager::valid() {
|
||||||
|
|
@ -496,7 +500,7 @@ bool CHyprcursorManager::loadThemeStyle(const SCursorStyleInfo& info) {
|
||||||
|
|
||||||
Debug::log(HC_LOG_TRACE, logFn, "loadThemeStyle: png shape {} has {} frames", shape->directory, FRAMES.size());
|
Debug::log(HC_LOG_TRACE, logFn, "loadThemeStyle: png shape {} has {} frames", shape->directory, FRAMES.size());
|
||||||
|
|
||||||
const int PIXELSIDE = std::round(info.size / shape->nominalSize);
|
const int PIXELSIDE = std::round(leader->side / shape->nominalSize);
|
||||||
|
|
||||||
Debug::log(HC_LOG_TRACE, logFn, "loadThemeStyle: png shape has nominal {:.2f}, pixel size will be {}x", shape->nominalSize, PIXELSIDE);
|
Debug::log(HC_LOG_TRACE, logFn, "loadThemeStyle: png shape has nominal {:.2f}, pixel size will be {}x", shape->nominalSize, PIXELSIDE);
|
||||||
|
|
||||||
|
|
@ -504,7 +508,7 @@ bool CHyprcursorManager::loadThemeStyle(const SCursorStyleInfo& info) {
|
||||||
auto& newImage = impl->loadedShapes[shape.get()].images.emplace_back(std::make_unique<SLoadedCursorImage>());
|
auto& newImage = impl->loadedShapes[shape.get()].images.emplace_back(std::make_unique<SLoadedCursorImage>());
|
||||||
newImage->artificial = true;
|
newImage->artificial = true;
|
||||||
newImage->side = PIXELSIDE;
|
newImage->side = PIXELSIDE;
|
||||||
newImage->artificialData = new char[static_cast<unsigned long>(PIXELSIDE * PIXELSIDE * 4)];
|
newImage->artificialData = new char[PIXELSIDE * PIXELSIDE * 4];
|
||||||
newImage->cairoSurface = cairo_image_surface_create_for_data((unsigned char*)newImage->artificialData, CAIRO_FORMAT_ARGB32, PIXELSIDE, 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;
|
newImage->delay = f->delay;
|
||||||
|
|
||||||
|
|
@ -545,7 +549,7 @@ bool CHyprcursorManager::loadThemeStyle(const SCursorStyleInfo& info) {
|
||||||
auto& newImage = impl->loadedShapes[shape.get()].images.emplace_back(std::make_unique<SLoadedCursorImage>());
|
auto& newImage = impl->loadedShapes[shape.get()].images.emplace_back(std::make_unique<SLoadedCursorImage>());
|
||||||
newImage->artificial = true;
|
newImage->artificial = true;
|
||||||
newImage->side = PIXELSIDE;
|
newImage->side = PIXELSIDE;
|
||||||
newImage->artificialData = new char[static_cast<unsigned long>(PIXELSIDE * PIXELSIDE * 4)];
|
newImage->artificialData = new char[PIXELSIDE * PIXELSIDE * 4];
|
||||||
newImage->cairoSurface = cairo_image_surface_create_for_data((unsigned char*)newImage->artificialData, CAIRO_FORMAT_ARGB32, PIXELSIDE, 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;
|
newImage->delay = f->delay;
|
||||||
|
|
||||||
|
|
@ -568,14 +572,12 @@ bool CHyprcursorManager::loadThemeStyle(const SCursorStyleInfo& info) {
|
||||||
|
|
||||||
if (!rsvg_handle_render_document(handle, PCAIRO, &rect, &error)) {
|
if (!rsvg_handle_render_document(handle, PCAIRO, &rect, &error)) {
|
||||||
Debug::log(HC_LOG_ERR, logFn, "Failed rendering svg: {}", error->message);
|
Debug::log(HC_LOG_ERR, logFn, "Failed rendering svg: {}", error->message);
|
||||||
g_object_unref(handle);
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// done
|
// done
|
||||||
cairo_surface_flush(newImage->cairoSurface);
|
cairo_surface_flush(newImage->cairoSurface);
|
||||||
cairo_destroy(PCAIRO);
|
cairo_destroy(PCAIRO);
|
||||||
g_object_unref(handle);
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
Debug::log(HC_LOG_ERR, logFn, "Invalid shapetype in loadThemeStyle");
|
Debug::log(HC_LOG_ERR, logFn, "Invalid shapetype in loadThemeStyle");
|
||||||
|
|
@ -685,9 +687,9 @@ std::optional<std::string> CHyprcursorImplementation::loadTheme() {
|
||||||
|
|
||||||
zip_file_t* meta_file = zip_fopen_index(zip, index, ZIP_FL_UNCHANGED);
|
zip_file_t* meta_file = zip_fopen_index(zip, index, ZIP_FL_UNCHANGED);
|
||||||
|
|
||||||
char* buffer = new char[static_cast<unsigned long>(1024 * 1024)]; /* 1MB should be more than enough */
|
char* buffer = new char[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);
|
zip_fclose(meta_file);
|
||||||
|
|
||||||
|
|
@ -707,7 +709,7 @@ std::optional<std::string> CHyprcursorImplementation::loadTheme() {
|
||||||
return "cursor" + cursor.path().string() + "failed to parse meta: " + *METAPARSERESULT;
|
return "cursor" + cursor.path().string() + "failed to parse meta: " + *METAPARSERESULT;
|
||||||
|
|
||||||
for (auto& i : meta.parsedData.definedSizes) {
|
for (auto& i : meta.parsedData.definedSizes) {
|
||||||
SHAPE->images.push_back(SCursorImage{.filename = i.file, .size = i.size, .delay = i.delayMs});
|
SHAPE->images.push_back(SCursorImage{i.file, i.size, i.delayMs});
|
||||||
}
|
}
|
||||||
|
|
||||||
SHAPE->overrides = meta.parsedData.overrides;
|
SHAPE->overrides = meta.parsedData.overrides;
|
||||||
|
|
@ -751,8 +753,8 @@ std::optional<std::string> CHyprcursorImplementation::loadTheme() {
|
||||||
IMAGE->data = new char[sb.size + 1];
|
IMAGE->data = new char[sb.size + 1];
|
||||||
IMAGE->dataLen = sb.size + 1;
|
IMAGE->dataLen = sb.size + 1;
|
||||||
} else {
|
} else {
|
||||||
IMAGE->data = new char[static_cast<unsigned long>(1024 * 1024)]; /* 1MB should be more than enough, again. This probably should be in the spec. */
|
IMAGE->data = new char[1024 * 1024]; /* 1MB should be more than enough, again. This probably should be in the spec. */
|
||||||
IMAGE->dataLen = static_cast<size_t>(1024 * 1024);
|
IMAGE->dataLen = 1024 * 1024;
|
||||||
}
|
}
|
||||||
|
|
||||||
IMAGE->dataLen = zip_fread(image_file, IMAGE->data, IMAGE->dataLen - 1);
|
IMAGE->dataLen = zip_fread(image_file, IMAGE->data, IMAGE->dataLen - 1);
|
||||||
|
|
|
||||||
|
|
@ -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) {
|
void hyprcursor_cursor_image_data_free(hyprcursor_cursor_image_data** data, int size) {
|
||||||
for (int i = 0; i < size; ++i) {
|
for (size_t i = 0; i < size; ++i) {
|
||||||
free(data[i]);
|
free(data[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -49,7 +49,7 @@ void hyprcursor_style_done(hyprcursor_manager_t* manager, hyprcursor_cursor_styl
|
||||||
const auto MGR = (CHyprcursorManager*)manager;
|
const auto MGR = (CHyprcursorManager*)manager;
|
||||||
SCursorStyleInfo info;
|
SCursorStyleInfo info;
|
||||||
info.size = info_.size;
|
info.size = info_.size;
|
||||||
MGR->cursorSurfaceStyleDone(info);
|
return MGR->cursorSurfaceStyleDone(info);
|
||||||
}
|
}
|
||||||
|
|
||||||
void hyprcursor_register_logging_function(struct hyprcursor_manager_t* manager, PHYPRCURSORLOGFUNC fn) {
|
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->images;
|
||||||
delete data;
|
delete data;
|
||||||
}
|
}
|
||||||
|
|
@ -8,9 +8,9 @@
|
||||||
|
|
||||||
#include "VarList.hpp"
|
#include "VarList.hpp"
|
||||||
|
|
||||||
static CMeta* currentMeta = nullptr;
|
CMeta* currentMeta = nullptr;
|
||||||
|
|
||||||
CMeta::CMeta(const std::string& rawdata_, bool hyprlang_ /* false for toml */, bool dataIsPath) : dataPath(dataIsPath), hyprlang(hyprlang_), rawdata(rawdata_) {
|
CMeta::CMeta(const std::string& rawdata_, bool hyprlang_ /* false for toml */, bool dataIsPath) : rawdata(rawdata_), hyprlang(hyprlang_), dataPath(dataIsPath) {
|
||||||
if (!dataIsPath)
|
if (!dataIsPath)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
|
@ -87,8 +87,8 @@ static Hyprlang::CParseResult parseDefineSize(const char* C, const char* V) {
|
||||||
CMeta::SDefinedSize size;
|
CMeta::SDefinedSize size;
|
||||||
|
|
||||||
if (RHS.contains(",")) {
|
if (RHS.contains(",")) {
|
||||||
const auto LL = removeBeginEndSpacesTabs(RHS.substr(0, RHS.find(',')));
|
const auto LL = removeBeginEndSpacesTabs(RHS.substr(0, RHS.find(",")));
|
||||||
const auto RR = removeBeginEndSpacesTabs(RHS.substr(RHS.find(',') + 1));
|
const auto RR = removeBeginEndSpacesTabs(RHS.substr(RHS.find(",") + 1));
|
||||||
|
|
||||||
try {
|
try {
|
||||||
size.delayMs = std::stoull(RR);
|
size.delayMs = std::stoull(RR);
|
||||||
|
|
@ -130,7 +130,7 @@ static Hyprlang::CParseResult parseOverride(const char* C, const char* V) {
|
||||||
CVarList overrides(VALUE, 0, ';');
|
CVarList overrides(VALUE, 0, ';');
|
||||||
|
|
||||||
for (const auto& o : overrides) {
|
for (const auto& o : overrides) {
|
||||||
currentMeta->parsedData.overrides.push_back(o);
|
currentMeta->parsedData.overrides.push_back(VALUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
|
|
|
||||||
|
|
@ -15,7 +15,7 @@ in {
|
||||||
inputs.hyprlang.overlays.default
|
inputs.hyprlang.overlays.default
|
||||||
(final: prev: {
|
(final: prev: {
|
||||||
hyprcursor = prev.callPackage ./default.nix {
|
hyprcursor = prev.callPackage ./default.nix {
|
||||||
stdenv = prev.gcc15Stdenv;
|
stdenv = prev.gcc14Stdenv;
|
||||||
version = version + "+date=" + (mkDate (inputs.self.lastModifiedDate or "19700101")) + "_" + (inputs.self.shortRev or "dirty");
|
version = version + "+date=" + (mkDate (inputs.self.lastModifiedDate or "19700101")) + "_" + (inputs.self.shortRev or "dirty");
|
||||||
inherit (final) hyprlang;
|
inherit (final) hyprlang;
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -43,10 +43,10 @@ int main(int argc, char** argv) {
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
printf("left_ptr images: %ld\n", shapeData->len);
|
printf("left_ptr images: %d\n", shapeData->len);
|
||||||
|
|
||||||
for (size_t i = 0; i < shapeData->len; ++i) {
|
for (size_t i = 0; i < shapeData->len; ++i) {
|
||||||
printf("left_ptr image size: %ld\n", shapeData->images[i].len);
|
printf("left_ptr image size: %d\n", shapeData->images[i].len);
|
||||||
}
|
}
|
||||||
|
|
||||||
hyprcursor_raw_shape_data_free(shapeData);
|
hyprcursor_raw_shape_data_free(shapeData);
|
||||||
|
|
@ -76,4 +76,4 @@ int main(int argc, char** argv) {
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
Loading…
Add table
Reference in a new issue