mirror of
https://github.com/hyprwm/hyprland-plugins.git
synced 2024-11-24 11:15:58 +01:00
all: chase hyprland
This commit is contained in:
parent
e0cad229c3
commit
8571aa9bad
5 changed files with 27 additions and 47 deletions
|
@ -13,11 +13,9 @@
|
||||||
// Methods
|
// Methods
|
||||||
inline CFunctionHook* g_pMouseMotionHook = nullptr;
|
inline CFunctionHook* g_pMouseMotionHook = nullptr;
|
||||||
inline CFunctionHook* g_pSurfaceSizeHook = nullptr;
|
inline CFunctionHook* g_pSurfaceSizeHook = nullptr;
|
||||||
inline CFunctionHook* g_pSurfaceDamageHook = nullptr;
|
|
||||||
inline CFunctionHook* g_pWLSurfaceDamageHook = nullptr;
|
inline CFunctionHook* g_pWLSurfaceDamageHook = nullptr;
|
||||||
typedef void (*origMotion)(CSeatManager*, uint32_t, const Vector2D&);
|
typedef void (*origMotion)(CSeatManager*, uint32_t, const Vector2D&);
|
||||||
typedef void (*origSurfaceSize)(CXWaylandSurface*, const CBox&);
|
typedef void (*origSurfaceSize)(CXWaylandSurface*, const CBox&);
|
||||||
typedef void (*origSurfaceDamage)(wlr_surface*, pixman_region32_t*);
|
|
||||||
typedef CRegion (*origWLSurfaceDamage)(CWLSurface*);
|
typedef CRegion (*origWLSurfaceDamage)(CWLSurface*);
|
||||||
|
|
||||||
// Do NOT change this function.
|
// Do NOT change this function.
|
||||||
|
@ -51,7 +49,7 @@ void hkSetWindowSize(CXWaylandSurface* surface, const CBox& box) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
const auto SURF = surface->surface;
|
const auto SURF = surface->surface.lock();
|
||||||
const auto PWINDOW = g_pCompositor->getWindowFromSurface(SURF);
|
const auto PWINDOW = g_pCompositor->getWindowFromSurface(SURF);
|
||||||
|
|
||||||
CBox newBox = box;
|
CBox newBox = box;
|
||||||
|
@ -60,28 +58,12 @@ void hkSetWindowSize(CXWaylandSurface* surface, const CBox& box) {
|
||||||
newBox.w = **RESX;
|
newBox.w = **RESX;
|
||||||
newBox.h = **RESY;
|
newBox.h = **RESY;
|
||||||
|
|
||||||
CWLSurface::surfaceFromWlr(SURF)->m_bFillIgnoreSmall = true;
|
CWLSurface::fromResource(SURF)->m_bFillIgnoreSmall = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
(*(origSurfaceSize)g_pSurfaceSizeHook->m_pOriginal)(surface, newBox);
|
(*(origSurfaceSize)g_pSurfaceSizeHook->m_pOriginal)(surface, newBox);
|
||||||
}
|
}
|
||||||
|
|
||||||
void hkSurfaceDamage(wlr_surface* surface, pixman_region32_t* damage) {
|
|
||||||
(*(origSurfaceDamage)g_pSurfaceDamageHook->m_pOriginal)(surface, damage);
|
|
||||||
|
|
||||||
static auto* const PCLASS = (Hyprlang::STRING const*)HyprlandAPI::getConfigValue(PHANDLE, "plugin:csgo-vulkan-fix:class")->getDataStaticPtr();
|
|
||||||
|
|
||||||
const auto SURF = CWLSurface::surfaceFromWlr(surface);
|
|
||||||
|
|
||||||
if (SURF && SURF->exists() && SURF->getWindow() && SURF->getWindow()->m_szInitialClass == *PCLASS) {
|
|
||||||
const auto PMONITOR = g_pCompositor->getMonitorFromID(SURF->getWindow()->m_iMonitorID);
|
|
||||||
if (PMONITOR)
|
|
||||||
g_pHyprRenderer->damageMonitor(PMONITOR);
|
|
||||||
else
|
|
||||||
g_pHyprRenderer->damageWindow(SURF->getWindow());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
CRegion hkWLSurfaceDamage(CWLSurface* thisptr) {
|
CRegion hkWLSurfaceDamage(CWLSurface* thisptr) {
|
||||||
const auto RG = (*(origWLSurfaceDamage)g_pWLSurfaceDamageHook->m_pOriginal)(thisptr);
|
const auto RG = (*(origWLSurfaceDamage)g_pWLSurfaceDamageHook->m_pOriginal)(thisptr);
|
||||||
|
|
||||||
|
@ -126,11 +108,6 @@ APICALL EXPORT PLUGIN_DESCRIPTION_INFO PLUGIN_INIT(HANDLE handle) {
|
||||||
}
|
}
|
||||||
success = success && g_pSurfaceSizeHook;
|
success = success && g_pSurfaceSizeHook;
|
||||||
|
|
||||||
FNS = HyprlandAPI::findFunctionsByName(PHANDLE, "wlr_surface_get_effective_damage");
|
|
||||||
success = success && !FNS.empty();
|
|
||||||
if (success)
|
|
||||||
g_pSurfaceDamageHook = HyprlandAPI::createFunctionHook(PHANDLE, FNS[0].address, (void*)::hkSurfaceDamage);
|
|
||||||
|
|
||||||
FNS = HyprlandAPI::findFunctionsByName(PHANDLE, "logicalDamage");
|
FNS = HyprlandAPI::findFunctionsByName(PHANDLE, "logicalDamage");
|
||||||
for (auto& r : FNS) {
|
for (auto& r : FNS) {
|
||||||
if (!r.demangled.contains("CWLSurface"))
|
if (!r.demangled.contains("CWLSurface"))
|
||||||
|
@ -143,7 +120,6 @@ APICALL EXPORT PLUGIN_DESCRIPTION_INFO PLUGIN_INIT(HANDLE handle) {
|
||||||
success = success && g_pWLSurfaceDamageHook->hook();
|
success = success && g_pWLSurfaceDamageHook->hook();
|
||||||
success = success && g_pMouseMotionHook->hook();
|
success = success && g_pMouseMotionHook->hook();
|
||||||
success = success && g_pSurfaceSizeHook->hook();
|
success = success && g_pSurfaceSizeHook->hook();
|
||||||
success = success && g_pSurfaceDamageHook->hook();
|
|
||||||
|
|
||||||
if (success)
|
if (success)
|
||||||
HyprlandAPI::addNotification(PHANDLE, "[csgo-vulkan-fix] Initialized successfully! (Anything version)", CColor{0.2, 1.0, 0.2, 1.0}, 5000);
|
HyprlandAPI::addNotification(PHANDLE, "[csgo-vulkan-fix] Initialized successfully! (Anything version)", CColor{0.2, 1.0, 0.2, 1.0}, 5000);
|
||||||
|
|
|
@ -17,6 +17,9 @@ CHyprBar::CHyprBar(PHLWINDOW pWindow) : IHyprWindowDecoration(pWindow) {
|
||||||
|
|
||||||
m_pMouseMoveCallback =
|
m_pMouseMoveCallback =
|
||||||
HyprlandAPI::registerCallbackDynamic(PHANDLE, "mouseMove", [&](void* self, SCallbackInfo& info, std::any param) { onMouseMove(std::any_cast<Vector2D>(param)); });
|
HyprlandAPI::registerCallbackDynamic(PHANDLE, "mouseMove", [&](void* self, SCallbackInfo& info, std::any param) { onMouseMove(std::any_cast<Vector2D>(param)); });
|
||||||
|
|
||||||
|
m_pTextTex = makeShared<CTexture>();
|
||||||
|
m_pButtonsTex = makeShared<CTexture>();
|
||||||
}
|
}
|
||||||
|
|
||||||
CHyprBar::~CHyprBar() {
|
CHyprBar::~CHyprBar() {
|
||||||
|
@ -134,7 +137,7 @@ void CHyprBar::onMouseMove(Vector2D coords) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void CHyprBar::renderText(CTexture& out, const std::string& text, const CColor& color, const Vector2D& bufferSize, const float scale, const int fontSize) {
|
void CHyprBar::renderText(SP<CTexture> out, const std::string& text, const CColor& color, const Vector2D& bufferSize, const float scale, const int fontSize) {
|
||||||
const auto CAIROSURFACE = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, bufferSize.x, bufferSize.y);
|
const auto CAIROSURFACE = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, bufferSize.x, bufferSize.y);
|
||||||
const auto CAIRO = cairo_create(CAIROSURFACE);
|
const auto CAIRO = cairo_create(CAIROSURFACE);
|
||||||
|
|
||||||
|
@ -174,8 +177,8 @@ void CHyprBar::renderText(CTexture& out, const std::string& text, const CColor&
|
||||||
|
|
||||||
// copy the data to an OpenGL texture we have
|
// copy the data to an OpenGL texture we have
|
||||||
const auto DATA = cairo_image_surface_get_data(CAIROSURFACE);
|
const auto DATA = cairo_image_surface_get_data(CAIROSURFACE);
|
||||||
out.allocate();
|
out->allocate();
|
||||||
glBindTexture(GL_TEXTURE_2D, out.m_iTexID);
|
glBindTexture(GL_TEXTURE_2D, out->m_iTexID);
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
|
||||||
|
|
||||||
|
@ -260,8 +263,8 @@ void CHyprBar::renderBarTitle(const Vector2D& bufferSize, const float scale) {
|
||||||
|
|
||||||
// copy the data to an OpenGL texture we have
|
// copy the data to an OpenGL texture we have
|
||||||
const auto DATA = cairo_image_surface_get_data(CAIROSURFACE);
|
const auto DATA = cairo_image_surface_get_data(CAIROSURFACE);
|
||||||
m_tTextTex.allocate();
|
m_pTextTex->allocate();
|
||||||
glBindTexture(GL_TEXTURE_2D, m_tTextTex.m_iTexID);
|
glBindTexture(GL_TEXTURE_2D, m_pTextTex->m_iTexID);
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
|
||||||
|
|
||||||
|
@ -323,8 +326,8 @@ void CHyprBar::renderBarButtons(const Vector2D& bufferSize, const float scale) {
|
||||||
|
|
||||||
// copy the data to an OpenGL texture we have
|
// copy the data to an OpenGL texture we have
|
||||||
const auto DATA = cairo_image_surface_get_data(CAIROSURFACE);
|
const auto DATA = cairo_image_surface_get_data(CAIROSURFACE);
|
||||||
m_tButtonsTex.allocate();
|
m_pButtonsTex->allocate();
|
||||||
glBindTexture(GL_TEXTURE_2D, m_tButtonsTex.m_iTexID);
|
glBindTexture(GL_TEXTURE_2D, m_pButtonsTex->m_iTexID);
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
|
||||||
|
|
||||||
|
@ -355,7 +358,7 @@ void CHyprBar::renderBarButtonsText(CBox* barBox, const float scale, const float
|
||||||
auto drawButton = [&](SHyprButton& button) -> void {
|
auto drawButton = [&](SHyprButton& button) -> void {
|
||||||
const auto scaledButtonSize = button.size * scale;
|
const auto scaledButtonSize = button.size * scale;
|
||||||
|
|
||||||
if (button.iconTex.m_iTexID == 0 /* icon is not rendered */ && !button.icon.empty()) {
|
if (button.iconTex->m_iTexID == 0 /* icon is not rendered */ && !button.icon.empty()) {
|
||||||
// render icon
|
// render icon
|
||||||
const Vector2D BUFSIZE = {scaledButtonSize, scaledButtonSize};
|
const Vector2D BUFSIZE = {scaledButtonSize, scaledButtonSize};
|
||||||
|
|
||||||
|
@ -364,7 +367,7 @@ void CHyprBar::renderBarButtonsText(CBox* barBox, const float scale, const float
|
||||||
renderText(button.iconTex, button.icon, LIGHT ? CColor(0xFFFFFFFF) : CColor(0xFF000000), BUFSIZE, scale, button.size * 0.62);
|
renderText(button.iconTex, button.icon, LIGHT ? CColor(0xFFFFFFFF) : CColor(0xFF000000), BUFSIZE, scale, button.size * 0.62);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (button.iconTex.m_iTexID == 0)
|
if (button.iconTex->m_iTexID == 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
CBox pos = {barBox->x + (BUTTONSRIGHT ? barBox->width - offset - scaledButtonSize : offset), barBox->y + (barBox->height - scaledButtonSize) / 2.0, scaledButtonSize,
|
CBox pos = {barBox->x + (BUTTONSRIGHT ? barBox->width - offset - scaledButtonSize : offset), barBox->y + (barBox->height - scaledButtonSize) / 2.0, scaledButtonSize,
|
||||||
|
@ -458,7 +461,7 @@ void CHyprBar::draw(CMonitor* pMonitor, float a) {
|
||||||
g_pHyprOpenGL->renderRect(&titleBarBox, color, scaledRounding);
|
g_pHyprOpenGL->renderRect(&titleBarBox, color, scaledRounding);
|
||||||
|
|
||||||
// render title
|
// render title
|
||||||
if (**PENABLETITLE && (m_szLastTitle != PWINDOW->m_szTitle || m_bWindowSizeChanged || m_tTextTex.m_iTexID == 0)) {
|
if (**PENABLETITLE && (m_szLastTitle != PWINDOW->m_szTitle || m_bWindowSizeChanged || m_pTextTex->m_iTexID == 0)) {
|
||||||
m_szLastTitle = PWINDOW->m_szTitle;
|
m_szLastTitle = PWINDOW->m_szTitle;
|
||||||
renderBarTitle(BARBUF, pMonitor->scale);
|
renderBarTitle(BARBUF, pMonitor->scale);
|
||||||
}
|
}
|
||||||
|
@ -474,14 +477,14 @@ void CHyprBar::draw(CMonitor* pMonitor, float a) {
|
||||||
|
|
||||||
CBox textBox = {titleBarBox.x, titleBarBox.y, (int)BARBUF.x, (int)BARBUF.y};
|
CBox textBox = {titleBarBox.x, titleBarBox.y, (int)BARBUF.x, (int)BARBUF.y};
|
||||||
if (**PENABLETITLE)
|
if (**PENABLETITLE)
|
||||||
g_pHyprOpenGL->renderTexture(m_tTextTex, &textBox, a);
|
g_pHyprOpenGL->renderTexture(m_pTextTex, &textBox, a);
|
||||||
|
|
||||||
if (m_bButtonsDirty || m_bWindowSizeChanged) {
|
if (m_bButtonsDirty || m_bWindowSizeChanged) {
|
||||||
renderBarButtons(BARBUF, pMonitor->scale);
|
renderBarButtons(BARBUF, pMonitor->scale);
|
||||||
m_bButtonsDirty = false;
|
m_bButtonsDirty = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
g_pHyprOpenGL->renderTexture(m_tButtonsTex, &textBox, a);
|
g_pHyprOpenGL->renderTexture(m_pButtonsTex, &textBox, a);
|
||||||
|
|
||||||
g_pHyprOpenGL->scissor((CBox*)nullptr);
|
g_pHyprOpenGL->scissor((CBox*)nullptr);
|
||||||
|
|
||||||
|
|
|
@ -43,8 +43,8 @@ class CHyprBar : public IHyprWindowDecoration {
|
||||||
|
|
||||||
CBox m_bAssignedBox;
|
CBox m_bAssignedBox;
|
||||||
|
|
||||||
CTexture m_tTextTex;
|
SP<CTexture> m_pTextTex;
|
||||||
CTexture m_tButtonsTex;
|
SP<CTexture> m_pButtonsTex;
|
||||||
|
|
||||||
bool m_bWindowSizeChanged = false;
|
bool m_bWindowSizeChanged = false;
|
||||||
bool m_bHidden = false;
|
bool m_bHidden = false;
|
||||||
|
@ -52,7 +52,7 @@ class CHyprBar : public IHyprWindowDecoration {
|
||||||
Vector2D cursorRelativeToBar();
|
Vector2D cursorRelativeToBar();
|
||||||
|
|
||||||
void renderBarTitle(const Vector2D& bufferSize, const float scale);
|
void renderBarTitle(const Vector2D& bufferSize, const float scale);
|
||||||
void renderText(CTexture& out, const std::string& text, const CColor& color, const Vector2D& bufferSize, const float scale, const int fontSize);
|
void renderText(SP<CTexture> out, const std::string& text, const CColor& color, const Vector2D& bufferSize, const float scale, const int fontSize);
|
||||||
void renderBarButtons(const Vector2D& bufferSize, const float scale);
|
void renderBarButtons(const Vector2D& bufferSize, const float scale);
|
||||||
void renderBarButtonsText(CBox* barBox, const float scale, const float a);
|
void renderBarButtonsText(CBox* barBox, const float scale, const float a);
|
||||||
void onMouseDown(SCallbackInfo& info, IPointer::SButtonEvent e);
|
void onMouseDown(SCallbackInfo& info, IPointer::SButtonEvent e);
|
||||||
|
|
|
@ -1,15 +1,16 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <hyprland/src/plugins/PluginAPI.hpp>
|
#include <hyprland/src/plugins/PluginAPI.hpp>
|
||||||
|
#include <hyprland/src/render/Texture.hpp>
|
||||||
|
|
||||||
inline HANDLE PHANDLE = nullptr;
|
inline HANDLE PHANDLE = nullptr;
|
||||||
|
|
||||||
struct SHyprButton {
|
struct SHyprButton {
|
||||||
std::string cmd = "";
|
std::string cmd = "";
|
||||||
CColor col = CColor(0, 0, 0, 0);
|
CColor col = CColor(0, 0, 0, 0);
|
||||||
float size = 10;
|
float size = 10;
|
||||||
std::string icon = "";
|
std::string icon = "";
|
||||||
CTexture iconTex;
|
SP<CTexture> iconTex = makeShared<CTexture>();
|
||||||
};
|
};
|
||||||
|
|
||||||
class CHyprBar;
|
class CHyprBar;
|
||||||
|
|
|
@ -88,7 +88,7 @@ void onRenderStage(eRenderStage stage) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void onCommitSubsurface(CSubsurface* thisptr) {
|
void onCommitSubsurface(CSubsurface* thisptr) {
|
||||||
const auto PWINDOW = thisptr->m_sWLSurface.getWindow();
|
const auto PWINDOW = thisptr->m_pWLSurface->getWindow();
|
||||||
|
|
||||||
if (!PWINDOW || std::find_if(bgWindows.begin(), bgWindows.end(), [PWINDOW](const auto& ref) { return ref.lock() == PWINDOW; }) == bgWindows.end()) {
|
if (!PWINDOW || std::find_if(bgWindows.begin(), bgWindows.end(), [PWINDOW](const auto& ref) { return ref.lock() == PWINDOW; }) == bgWindows.end()) {
|
||||||
((origCommitSubsurface)subsurfaceHook->m_pOriginal)(thisptr);
|
((origCommitSubsurface)subsurfaceHook->m_pOriginal)(thisptr);
|
||||||
|
|
Loading…
Reference in a new issue