mirror of
https://github.com/virtcode/hypr-dynamic-cursors
synced 2025-09-19 16:13:21 +02:00
fix: fix damage issues
This commit is contained in:
parent
9a9830034c
commit
facfa7f356
4 changed files with 38 additions and 3 deletions
|
@ -13,7 +13,7 @@
|
||||||
#include "cursor.hpp"
|
#include "cursor.hpp"
|
||||||
#include "renderer.hpp"
|
#include "renderer.hpp"
|
||||||
|
|
||||||
void CDynamicCursors::render(CPointerManager* pointers, SP<CMonitor> pMonitor, timespec* now, CRegion& damage, std::optional<Vector2D> overridePos) {
|
void CDynamicCursors::renderSoftware(CPointerManager* pointers, SP<CMonitor> pMonitor, timespec* now, CRegion& damage, std::optional<Vector2D> overridePos) {
|
||||||
|
|
||||||
if (!pointers->hasCursor())
|
if (!pointers->hasCursor())
|
||||||
return;
|
return;
|
||||||
|
@ -38,11 +38,33 @@ void CDynamicCursors::render(CPointerManager* pointers, SP<CMonitor> pMonitor, t
|
||||||
return;
|
return;
|
||||||
|
|
||||||
box.scale(pMonitor->scale);
|
box.scale(pMonitor->scale);
|
||||||
|
|
||||||
|
// we rotate the cursor by our calculated amount
|
||||||
box.rot = this->calculate(&pointers->pointerPos);
|
box.rot = this->calculate(&pointers->pointerPos);
|
||||||
|
|
||||||
|
// now pass the hotspot to rotate around
|
||||||
renderCursorTextureInternalWithDamage(texture, &box, &damage, 1.F, pointers->currentCursorImage.hotspot);
|
renderCursorTextureInternalWithDamage(texture, &box, &damage, 1.F, pointers->currentCursorImage.hotspot);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CDynamicCursors::damageSoftware(CPointerManager* pointers) {
|
||||||
|
|
||||||
|
// we damage a 3x3 area around the cursor, to accomodate for all possible hotspots and rotations
|
||||||
|
Vector2D size = pointers->currentCursorImage.size / pointers->currentCursorImage.scale;
|
||||||
|
CBox b = CBox{pointers->pointerPos, size * 3}.translate(-(pointers->currentCursorImage.hotspot + size));
|
||||||
|
|
||||||
|
static auto PNOHW = CConfigValue<Hyprlang::INT>("cursor:no_hardware_cursors");
|
||||||
|
|
||||||
|
for (auto& mw : pointers->monitorStates) {
|
||||||
|
if (mw->monitor.expired())
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if ((mw->softwareLocks > 0 || mw->hardwareFailed || *PNOHW) && b.overlaps({mw->monitor->vecPosition, mw->monitor->vecSize})) {
|
||||||
|
g_pHyprRenderer->damageBox(&b, mw->monitor->shouldSkipScheduleFrameOnMouseEvent());
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
double CDynamicCursors::calculate(Vector2D* pos) {
|
double CDynamicCursors::calculate(Vector2D* pos) {
|
||||||
static auto* const* PLENGTH = (Hyprlang::INT* const*)HyprlandAPI::getConfigValue(PHANDLE, CONFIG_LENGTH)->getDataStaticPtr();
|
static auto* const* PLENGTH = (Hyprlang::INT* const*)HyprlandAPI::getConfigValue(PHANDLE, CONFIG_LENGTH)->getDataStaticPtr();
|
||||||
|
|
||||||
|
|
|
@ -7,7 +7,9 @@ class CDynamicCursors;
|
||||||
class CDynamicCursors {
|
class CDynamicCursors {
|
||||||
public:
|
public:
|
||||||
/* hook on renderSoftwareCursorsFor */
|
/* hook on renderSoftwareCursorsFor */
|
||||||
void render(CPointerManager* pointers, SP<CMonitor> pMonitor, timespec* now, CRegion& damage, std::optional<Vector2D> overridePos);
|
void renderSoftware(CPointerManager* pointers, SP<CMonitor> pMonitor, timespec* now, CRegion& damage, std::optional<Vector2D> overridePos);
|
||||||
|
/* hook on damageIfSoftware*/
|
||||||
|
void damageSoftware(CPointerManager* pointers);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
// calculates the current angle of the cursor
|
// calculates the current angle of the cursor
|
||||||
|
|
12
src/main.cpp
12
src/main.cpp
|
@ -11,7 +11,13 @@
|
||||||
typedef void (*origRenderSofwareCursorsFor)(void*, SP<CMonitor>, timespec*, CRegion&, std::optional<Vector2D>);
|
typedef void (*origRenderSofwareCursorsFor)(void*, SP<CMonitor>, timespec*, CRegion&, std::optional<Vector2D>);
|
||||||
inline CFunctionHook* g_pRenderSoftwareCursorsForHook = nullptr;
|
inline CFunctionHook* g_pRenderSoftwareCursorsForHook = nullptr;
|
||||||
void hkRenderSoftwareCursorsFor(void* thisptr, SP<CMonitor> pMonitor, timespec* now, CRegion& damage, std::optional<Vector2D> overridePos) {
|
void hkRenderSoftwareCursorsFor(void* thisptr, SP<CMonitor> pMonitor, timespec* now, CRegion& damage, std::optional<Vector2D> overridePos) {
|
||||||
g_pDynamicCursors->render((CPointerManager*) thisptr, pMonitor, now, damage, overridePos);
|
g_pDynamicCursors->renderSoftware((CPointerManager*) thisptr, pMonitor, now, damage, overridePos);
|
||||||
|
}
|
||||||
|
|
||||||
|
typedef void (*origDamageIfSoftware)(void*);
|
||||||
|
inline CFunctionHook* g_pDamageIfSoftwareHook = nullptr;
|
||||||
|
void hkDamageIfSoftware(void* thisptr) {
|
||||||
|
g_pDynamicCursors->damageSoftware((CPointerManager*) thisptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
APICALL EXPORT PLUGIN_DESCRIPTION_INFO PLUGIN_INIT(HANDLE handle) {
|
APICALL EXPORT PLUGIN_DESCRIPTION_INFO PLUGIN_INIT(HANDLE handle) {
|
||||||
|
@ -31,6 +37,10 @@ APICALL EXPORT PLUGIN_DESCRIPTION_INFO PLUGIN_INIT(HANDLE handle) {
|
||||||
g_pRenderSoftwareCursorsForHook = HyprlandAPI::createFunctionHook(PHANDLE, RENDER_SOFTWARE_CURSORS_FOR_METHODS[0].address, (void*) &hkRenderSoftwareCursorsFor);
|
g_pRenderSoftwareCursorsForHook = HyprlandAPI::createFunctionHook(PHANDLE, RENDER_SOFTWARE_CURSORS_FOR_METHODS[0].address, (void*) &hkRenderSoftwareCursorsFor);
|
||||||
g_pRenderSoftwareCursorsForHook->hook();
|
g_pRenderSoftwareCursorsForHook->hook();
|
||||||
|
|
||||||
|
static const auto DAMAGE_IF_SOFTWARE_METHODS = HyprlandAPI::findFunctionsByName(PHANDLE, "damageIfSoftware");
|
||||||
|
g_pDamageIfSoftwareHook = HyprlandAPI::createFunctionHook(PHANDLE, DAMAGE_IF_SOFTWARE_METHODS[0].address, (void*) &hkDamageIfSoftware);
|
||||||
|
g_pDamageIfSoftwareHook->hook();
|
||||||
|
|
||||||
HyprlandAPI::addConfigValue(PHANDLE, CONFIG_LENGTH, Hyprlang::INT{20});
|
HyprlandAPI::addConfigValue(PHANDLE, CONFIG_LENGTH, Hyprlang::INT{20});
|
||||||
|
|
||||||
return {"dynamic-cursors", "The most stupid cursor plugin.", "Virt", "1.1"};
|
return {"dynamic-cursors", "The most stupid cursor plugin.", "Virt", "1.1"};
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
#include "globals.hpp"
|
#include "globals.hpp"
|
||||||
|
#include <GLES2/gl2.h>
|
||||||
|
|
||||||
#define private public
|
#define private public
|
||||||
#include <hyprland/src/render/OpenGL.hpp>
|
#include <hyprland/src/render/OpenGL.hpp>
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue