Compare commits
14
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b1ef587dd2
|
||
|
|
9ad94f1e3e
|
||
|
|
856c78c380
|
||
|
|
0c4e8e805a
|
||
|
|
18c474669b
|
||
|
|
5eb84285a4
|
||
|
|
02fb847268 | ||
|
|
a96211a5b5
|
||
|
|
cbb108a6dd
|
||
|
|
9f9d09bc5b
|
||
|
|
a2326dc641
|
||
|
|
b4f0239e2a
|
||
|
|
fd938d4e47
|
||
|
|
c5dfb306dd
|
@@ -18,7 +18,7 @@ jobs:
|
|||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
- name: Install Docker CLI
|
- name: Install Docker CLI
|
||||||
run: apk add --no-cache docker-cli
|
run: apk add --no-cache docker-cli docker-cli-buildx
|
||||||
|
|
||||||
- name: Login to registry
|
- name: Login to registry
|
||||||
run: echo "${{ secrets.REGISTRY_TOKEN }}" | docker login git.aramjonghu.dev --username aramjonghu --password-stdin
|
run: echo "${{ secrets.REGISTRY_TOKEN }}" | docker login git.aramjonghu.dev --username aramjonghu --password-stdin
|
||||||
|
|||||||
@@ -20,28 +20,10 @@ jobs:
|
|||||||
-exec clang-format -i --style=file {} +
|
-exec clang-format -i --style=file {} +
|
||||||
git diff --exit-code && echo "clang-format: passed"
|
git diff --exit-code && echo "clang-format: passed"
|
||||||
|
|
||||||
build:
|
build & lint:
|
||||||
runs-on: alpine
|
runs-on: alpine
|
||||||
container:
|
container:
|
||||||
image: git.aramjonghu.dev/aramjonghu/zshell-ci:latest
|
image: git.aramjonghu.dev/aramjonghu/zshell-ci:latest
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: Checkout
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
with:
|
|
||||||
fetch-depth: 0
|
|
||||||
|
|
||||||
- name: Configure
|
|
||||||
run: cmake -B build -G Ninja -DENABLE_MODULES=plugin -DCMAKE_BUILD_TYPE=Release
|
|
||||||
|
|
||||||
- name: Build
|
|
||||||
run: ninja -C build
|
|
||||||
|
|
||||||
clang-tidy:
|
|
||||||
runs-on: alpine
|
|
||||||
container:
|
|
||||||
image: git.aramjonghu.dev/aramjonghu/zshell-ci:latest
|
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
@@ -58,5 +40,7 @@ jobs:
|
|||||||
run: |
|
run: |
|
||||||
sed -i 's/-mno-direct-extern-access //g' build/compile_commands.json
|
sed -i 's/-mno-direct-extern-access //g' build/compile_commands.json
|
||||||
set -o pipefail
|
set -o pipefail
|
||||||
run-clang-tidy -p build -j $(nproc) -header-filter="Plugins/.*" 2>&1 | \
|
run-clang-tidy -p build -j "$(nproc)" \
|
||||||
grep -v 'Suppressed\|non-user\|non-system\|unknown argument.*mno-direct\|Found compiler error\|warnings generated\.\|^Use -header-filter'
|
-source-filter="^$(pwd)/Plugins/" \
|
||||||
|
-header-filter=".*Plugins/.*" \
|
||||||
|
-removed-arg=-mno-direct-extern-access
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ on:
|
|||||||
pull_request:
|
pull_request:
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
fmt:
|
fmt & lint:
|
||||||
runs-on: alpine
|
runs-on: alpine
|
||||||
container: node:26-alpine
|
container: node:26-alpine
|
||||||
|
|
||||||
@@ -24,20 +24,6 @@ jobs:
|
|||||||
else
|
else
|
||||||
echo "No JS/TS files found"
|
echo "No JS/TS files found"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
lint:
|
|
||||||
runs-on: alpine
|
|
||||||
container: node:26-alpine
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: Checkout
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
|
|
||||||
- name: Install tools
|
|
||||||
run: |
|
|
||||||
apk add --no-cache \
|
|
||||||
git
|
|
||||||
|
|
||||||
- name: ESLint
|
- name: ESLint
|
||||||
run: |
|
run: |
|
||||||
if [ -n "$(find . \( -iname "*.js" -o -iname "*.jsx" -o -iname "*.ts" -o -iname "*.tsx" -o -iname "*.mjs" -o -iname "*.cjs" \) -print -quit)" ]; then
|
if [ -n "$(find . \( -iname "*.js" -o -iname "*.jsx" -o -iname "*.ts" -o -iname "*.tsx" -o -iname "*.mjs" -o -iname "*.cjs" \) -print -quit)" ]; then
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ on:
|
|||||||
pull_request:
|
pull_request:
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
static:
|
fmt & lint:
|
||||||
runs-on: debian
|
runs-on: debian
|
||||||
container: node:26-trixie-slim
|
container: node:26-trixie-slim
|
||||||
|
|
||||||
@@ -33,7 +33,7 @@ jobs:
|
|||||||
. .venv/bin/activate
|
. .venv/bin/activate
|
||||||
ruff check .
|
ruff check .
|
||||||
|
|
||||||
verify:
|
test & nuitka build:
|
||||||
if: always()
|
if: always()
|
||||||
runs-on: debian
|
runs-on: debian
|
||||||
container: node:26-trixie-slim
|
container: node:26-trixie-slim
|
||||||
|
|||||||
+21
-86
@@ -3,8 +3,9 @@ name: Rust
|
|||||||
on:
|
on:
|
||||||
pull_request:
|
pull_request:
|
||||||
|
|
||||||
|
# jobs can be separated if we integrate tests
|
||||||
jobs:
|
jobs:
|
||||||
build:
|
build, clippy & fmt:
|
||||||
runs-on: alpine
|
runs-on: alpine
|
||||||
container: node:26-alpine
|
container: node:26-alpine
|
||||||
env:
|
env:
|
||||||
@@ -34,7 +35,9 @@ jobs:
|
|||||||
apk add --no-cache \
|
apk add --no-cache \
|
||||||
git \
|
git \
|
||||||
cargo \
|
cargo \
|
||||||
rust
|
rust \
|
||||||
|
rust-clippy \
|
||||||
|
rustfmt
|
||||||
|
|
||||||
- name: Cargo check
|
- name: Cargo check
|
||||||
run: |
|
run: |
|
||||||
@@ -50,90 +53,6 @@ jobs:
|
|||||||
else
|
else
|
||||||
echo "No Rust project found"
|
echo "No Rust project found"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
fmt:
|
|
||||||
runs-on: alpine
|
|
||||||
container: node:26-alpine
|
|
||||||
env:
|
|
||||||
CARGO_HOME: ${{ github.workspace }}/.cargo
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: Checkout
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
|
|
||||||
- name: Cache cargo packages
|
|
||||||
uses: actions/cache@v4
|
|
||||||
env:
|
|
||||||
cache-name: cache-cargo-packages
|
|
||||||
with:
|
|
||||||
path: |
|
|
||||||
.cargo/registry
|
|
||||||
.cargo/git
|
|
||||||
target
|
|
||||||
key: rust-fmt-${{ runner.os }}-${{ env.cache-name }}-${{ hashFiles('**/Cargo.lock') }}
|
|
||||||
restore-keys: |
|
|
||||||
rust-${{ runner.os }}-build-${{ env.cache-name }}-
|
|
||||||
rust-${{ runner.os }}-build-
|
|
||||||
rust-
|
|
||||||
|
|
||||||
- name: Install tools
|
|
||||||
run: |
|
|
||||||
apk add --no-cache \
|
|
||||||
git \
|
|
||||||
cargo \
|
|
||||||
rust \
|
|
||||||
rustfmt
|
|
||||||
|
|
||||||
- name: Format check
|
|
||||||
run: |
|
|
||||||
if [ -n "$(find . -name "Cargo.toml" -print -quit)" ]; then
|
|
||||||
status=0
|
|
||||||
for manifest in $(find . -name "Cargo.toml"); do
|
|
||||||
cargo fmt --manifest-path "$manifest" --check && \
|
|
||||||
echo "$manifest: formatting OK" || \
|
|
||||||
{ echo "$manifest: needs formatting"; status=1; }
|
|
||||||
done
|
|
||||||
exit $status
|
|
||||||
elif [ -n "$(find . -name "*.rs" -print -quit)" ]; then
|
|
||||||
echo "Rust files found but no Cargo.toml"
|
|
||||||
exit 1
|
|
||||||
else
|
|
||||||
echo "No Rust project found"
|
|
||||||
fi
|
|
||||||
|
|
||||||
clippy:
|
|
||||||
runs-on: alpine
|
|
||||||
container: node:26-alpine
|
|
||||||
env:
|
|
||||||
CARGO_HOME: ${{ github.workspace }}/.cargo
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: Checkout
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
|
|
||||||
- name: Cache cargo packages
|
|
||||||
uses: actions/cache@v4
|
|
||||||
env:
|
|
||||||
cache-name: cache-cargo-packages
|
|
||||||
with:
|
|
||||||
path: |
|
|
||||||
.cargo/registry
|
|
||||||
.cargo/git
|
|
||||||
target
|
|
||||||
key: rust-clippy-${{ runner.os }}-${{ env.cache-name }}-${{ hashFiles('**/Cargo.lock') }}
|
|
||||||
restore-keys: |
|
|
||||||
rust-${{ runner.os }}-build-${{ env.cache-name }}-
|
|
||||||
rust-${{ runner.os }}-build-
|
|
||||||
rust-
|
|
||||||
|
|
||||||
- name: Install tools
|
|
||||||
run: |
|
|
||||||
apk add --no-cache \
|
|
||||||
git \
|
|
||||||
cargo \
|
|
||||||
rust \
|
|
||||||
rust-clippy
|
|
||||||
|
|
||||||
- name: Clippy
|
- name: Clippy
|
||||||
run: |
|
run: |
|
||||||
if [ -n "$(find . -name "Cargo.toml" -print -quit)" ]; then
|
if [ -n "$(find . -name "Cargo.toml" -print -quit)" ]; then
|
||||||
@@ -150,3 +69,19 @@ jobs:
|
|||||||
else
|
else
|
||||||
echo "No Rust project found"
|
echo "No Rust project found"
|
||||||
fi
|
fi
|
||||||
|
- name: Format check
|
||||||
|
run: |
|
||||||
|
if [ -n "$(find . -name "Cargo.toml" -print -quit)" ]; then
|
||||||
|
status=0
|
||||||
|
for manifest in $(find . -name "Cargo.toml"); do
|
||||||
|
cargo fmt --manifest-path "$manifest" --check && \
|
||||||
|
echo "$manifest: formatting OK" || \
|
||||||
|
{ echo "$manifest: needs formatting"; status=1; }
|
||||||
|
done
|
||||||
|
exit $status
|
||||||
|
elif [ -n "$(find . -name "*.rs" -print -quit)" ]; then
|
||||||
|
echo "Rust files found but no Cargo.toml"
|
||||||
|
exit 1
|
||||||
|
else
|
||||||
|
echo "No Rust project found"
|
||||||
|
fi
|
||||||
|
|||||||
+22
-10
@@ -1,23 +1,35 @@
|
|||||||
**/__pycache__/
|
|
||||||
./result/
|
./result/
|
||||||
.pyre/
|
.pyre/
|
||||||
.cache/
|
|
||||||
.venv/
|
|
||||||
.qmlls.ini
|
|
||||||
build/
|
|
||||||
compile_commands.json
|
|
||||||
testpython
|
|
||||||
pkg/
|
pkg/
|
||||||
*.tar.*
|
*.tar.*
|
||||||
uv.lock
|
|
||||||
.qtcreator/
|
|
||||||
dist/
|
dist/
|
||||||
**/target/
|
**/target/
|
||||||
**/test-plugins/
|
**/test-plugins/
|
||||||
**/Charts/
|
**/Charts/
|
||||||
network-dev/
|
network-dev/
|
||||||
**/zshell.build/
|
|
||||||
**/zshell.dist/
|
**/zshell.dist/
|
||||||
|
|
||||||
|
# Qml
|
||||||
|
.qtcreator/
|
||||||
|
.qmlls.ini
|
||||||
|
|
||||||
|
# CMake compile artifacts
|
||||||
|
.cache/
|
||||||
|
compile_commands.json
|
||||||
|
build/
|
||||||
|
|
||||||
|
# Python
|
||||||
|
uv.lock
|
||||||
|
testpython
|
||||||
|
.venv/
|
||||||
|
**/__pycache__/
|
||||||
|
|
||||||
|
# Nuitka compile
|
||||||
|
**/zshell.pyi
|
||||||
|
**/zshell.cpython-*
|
||||||
|
**/zshell.build/
|
||||||
|
|
||||||
|
# Agents stuff
|
||||||
.opencode/
|
.opencode/
|
||||||
run-agent.sh
|
run-agent.sh
|
||||||
AGENTS.md
|
AGENTS.md
|
||||||
|
|||||||
@@ -60,11 +60,15 @@ class BlobInvertedRect : public BlobShape {
|
|||||||
void setOuterRadius(qreal v);
|
void setOuterRadius(qreal v);
|
||||||
|
|
||||||
// Per-corner outer radii. -1 falls back to outerRadius (mirrors BlobRect).
|
// Per-corner outer radii. -1 falls back to outerRadius (mirrors BlobRect).
|
||||||
[[nodiscard]] qreal outerTopLeftRadius() const { return m_outerTopLeftRadius; }
|
[[nodiscard]] qreal outerTopLeftRadius() const {
|
||||||
|
return m_outerTopLeftRadius;
|
||||||
|
}
|
||||||
|
|
||||||
void setOuterTopLeftRadius(qreal v);
|
void setOuterTopLeftRadius(qreal v);
|
||||||
|
|
||||||
[[nodiscard]] qreal outerTopRightRadius() const { return m_outerTopRightRadius; }
|
[[nodiscard]] qreal outerTopRightRadius() const {
|
||||||
|
return m_outerTopRightRadius;
|
||||||
|
}
|
||||||
|
|
||||||
void setOuterTopRightRadius(qreal v);
|
void setOuterTopRightRadius(qreal v);
|
||||||
|
|
||||||
|
|||||||
@@ -240,8 +240,7 @@ void BlobShape::updatePolish() {
|
|||||||
m_cachedInvertedRadius = 0;
|
m_cachedInvertedRadius = 0;
|
||||||
memset(m_cachedInvertedOuter, 0, sizeof(m_cachedInvertedOuter));
|
memset(m_cachedInvertedOuter, 0, sizeof(m_cachedInvertedOuter));
|
||||||
memset(m_cachedInvertedInner, 0, sizeof(m_cachedInvertedInner));
|
memset(m_cachedInvertedInner, 0, sizeof(m_cachedInvertedInner));
|
||||||
memset(
|
memset(m_cachedInvertedOuterRadii, 0, sizeof(m_cachedInvertedOuterRadii));
|
||||||
m_cachedInvertedOuterRadii, 0, sizeof(m_cachedInvertedOuterRadii));
|
|
||||||
|
|
||||||
auto* inv = m_group->invertedRect();
|
auto* inv = m_group->invertedRect();
|
||||||
if (inv) {
|
if (inv) {
|
||||||
|
|||||||
@@ -14,10 +14,9 @@
|
|||||||
#include <hyprland/src/plugins/PluginAPI.hpp>
|
#include <hyprland/src/plugins/PluginAPI.hpp>
|
||||||
#include <hyprland/src/render/OpenGL.hpp>
|
#include <hyprland/src/render/OpenGL.hpp>
|
||||||
#include <hyprland/src/render/Renderer.hpp>
|
#include <hyprland/src/render/Renderer.hpp>
|
||||||
#include <hyprland/src/render/Context.hpp>
|
|
||||||
#undef private
|
#undef private
|
||||||
|
|
||||||
#include <hyprland/src/ipc/s2/S2.hpp>
|
#include <hyprland/src/managers/EventManager.hpp>
|
||||||
|
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#include <lua.h>
|
#include <lua.h>
|
||||||
@@ -28,7 +27,6 @@ extern "C" {
|
|||||||
|
|
||||||
using ZShell::services::kelvinToGain;
|
using ZShell::services::kelvinToGain;
|
||||||
|
|
||||||
using Render::CRenderContext;
|
|
||||||
using Render::IFramebuffer;
|
using Render::IFramebuffer;
|
||||||
using Render::GL::CHyprOpenGLImpl;
|
using Render::GL::CHyprOpenGLImpl;
|
||||||
using Render::GL::g_pHyprOpenGL;
|
using Render::GL::g_pHyprOpenGL;
|
||||||
@@ -151,14 +149,25 @@ static bool gainIsNeutral(const std::array<float, 3>& gain) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static CFunctionHook* g_pBeginHook = nullptr;
|
static CFunctionHook* g_pBeginHook = nullptr;
|
||||||
using origBegin = bool (*)(
|
using origBegin = void (*)(
|
||||||
CHyprOpenGLImpl*,
|
CHyprOpenGLImpl*,
|
||||||
CRenderContext&,
|
|
||||||
PHLMONITOR,
|
PHLMONITOR,
|
||||||
const CRegion&,
|
const CRegion&,
|
||||||
SP<IFramebuffer>,
|
SP<IFramebuffer>,
|
||||||
std::optional<CRegion>);
|
std::optional<CRegion>);
|
||||||
|
|
||||||
|
static CFunctionHook* g_pSaveMirrorHook = nullptr;
|
||||||
|
using origSaveMirror = bool (*)(CHyprOpenGLImpl*, const CBox&);
|
||||||
|
|
||||||
|
static bool hkSaveBufferForMirror(CHyprOpenGLImpl* thisptr, const CBox& box) {
|
||||||
|
const bool saved = thisptr->m_applyFinalShader;
|
||||||
|
thisptr->m_applyFinalShader = false;
|
||||||
|
const bool result = (*reinterpret_cast<origSaveMirror>(
|
||||||
|
g_pSaveMirrorHook->m_original))(thisptr, box);
|
||||||
|
thisptr->m_applyFinalShader = saved;
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
static void installShader() {
|
static void installShader() {
|
||||||
auto* gl = g_pHyprOpenGL.get();
|
auto* gl = g_pHyprOpenGL.get();
|
||||||
if (!gl) return;
|
if (!gl) return;
|
||||||
@@ -189,33 +198,34 @@ static void setUniformGain(const std::array<float, 3>& gain) {
|
|||||||
shader->setUniformFloat3(SHADER_TINT, gain[0], gain[1], gain[2]);
|
shader->setUniformFloat3(SHADER_TINT, gain[0], gain[1], gain[2]);
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool hkBegin(
|
static void hkBegin(
|
||||||
CHyprOpenGLImpl* thisptr,
|
CHyprOpenGLImpl* thisptr,
|
||||||
CRenderContext& ctx,
|
|
||||||
PHLMONITOR mon,
|
PHLMONITOR mon,
|
||||||
const CRegion& damage,
|
const CRegion& damage,
|
||||||
SP<IFramebuffer> fb,
|
SP<IFramebuffer> fb,
|
||||||
std::optional<CRegion> finalDamage) {
|
std::optional<CRegion> finalDamage) {
|
||||||
const bool ok = (*reinterpret_cast<origBegin>(
|
(*reinterpret_cast<origBegin>(
|
||||||
g_pBeginHook->m_original))(thisptr, ctx, mon, damage, fb, finalDamage);
|
g_pBeginHook->m_original))(thisptr, mon, damage, fb, finalDamage);
|
||||||
if (!ok) return false;
|
|
||||||
|
|
||||||
if (fb) ctx.m_data.blockScreenShader = true;
|
if (fb) {
|
||||||
|
auto* renderer = g_pHyprRenderer.get();
|
||||||
|
if (renderer) renderer->m_renderData.blockScreenShader = true;
|
||||||
|
}
|
||||||
|
|
||||||
if (!g_active) return true;
|
if (!g_active) return;
|
||||||
|
|
||||||
auto* gl = g_pHyprOpenGL.get();
|
auto* gl = g_pHyprOpenGL.get();
|
||||||
if (!gl) return true;
|
if (!gl) return;
|
||||||
|
|
||||||
if (gl->m_finalScreenShader.get() && gl->m_finalScreenShader->program() < 1)
|
if (gl->m_finalScreenShader.get() && gl->m_finalScreenShader->program() < 1)
|
||||||
installShader();
|
installShader();
|
||||||
if (!gl->m_finalScreenShader.get() ||
|
if (!gl->m_finalScreenShader.get() ||
|
||||||
gl->m_finalScreenShader->program() < 1)
|
gl->m_finalScreenShader->program() < 1)
|
||||||
return true;
|
return;
|
||||||
|
|
||||||
if (g_transition.active) {
|
if (g_transition.active) {
|
||||||
auto* monPtr = mon.get();
|
auto* monPtr = mon.get();
|
||||||
if (!monPtr) return true;
|
if (!monPtr) return;
|
||||||
const float elapsed =
|
const float elapsed =
|
||||||
std::chrono::duration<float>(
|
std::chrono::duration<float>(
|
||||||
std::chrono::steady_clock::now() - g_transition.start)
|
std::chrono::steady_clock::now() - g_transition.start)
|
||||||
@@ -255,7 +265,6 @@ static bool hkBegin(
|
|||||||
} else if (g_uniformMode) {
|
} else if (g_uniformMode) {
|
||||||
setUniformGain(g_currentGain);
|
setUniformGain(g_currentGain);
|
||||||
}
|
}
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static constexpr int KELVIN_MIN = 2000;
|
static constexpr int KELVIN_MIN = 2000;
|
||||||
@@ -324,10 +333,9 @@ static int luaNightlightState(lua_State* L) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void postStateEvent(bool enabled, bool animating) {
|
static void postStateEvent(bool enabled, bool animating) {
|
||||||
auto& sock = IPC::Socket2::sock();
|
if (!g_pEventManager) return;
|
||||||
if (!sock) return;
|
g_pEventManager->postEvent(
|
||||||
sock->postEvent(
|
SHyprIPCEvent{
|
||||||
IPC::Socket2::SEvent{
|
|
||||||
.event = "zshell-nightlight",
|
.event = "zshell-nightlight",
|
||||||
.data = std::format(
|
.data = std::format(
|
||||||
"{},{},{},{}",
|
"{},{},{},{}",
|
||||||
@@ -369,6 +377,31 @@ APICALL EXPORT PLUGIN_DESCRIPTION_INFO PLUGIN_INIT(HANDLE handle) {
|
|||||||
throw std::runtime_error("[zshell-nightlight] version mismatch");
|
throw std::runtime_error("[zshell-nightlight] version mismatch");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static const auto SAVEMIRROR_METHODS =
|
||||||
|
HyprlandAPI::findFunctionsByName(PHANDLE, "saveBufferForMirror");
|
||||||
|
const SFunctionMatch* saveMirrorTarget = findExactMethod(
|
||||||
|
SAVEMIRROR_METHODS,
|
||||||
|
manglePrefix("CHyprOpenGLImpl", "saveBufferForMirror"));
|
||||||
|
|
||||||
|
if (saveMirrorTarget) {
|
||||||
|
g_pSaveMirrorHook = HyprlandAPI::createFunctionHook(
|
||||||
|
PHANDLE,
|
||||||
|
saveMirrorTarget->address,
|
||||||
|
reinterpret_cast<void*>(&hkSaveBufferForMirror));
|
||||||
|
if (g_pSaveMirrorHook && g_pSaveMirrorHook->hook())
|
||||||
|
dlog(
|
||||||
|
"saveBufferForMirror hook installed: " +
|
||||||
|
saveMirrorTarget->signature);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!g_pSaveMirrorHook)
|
||||||
|
HyprlandAPI::addNotification(
|
||||||
|
PHANDLE,
|
||||||
|
"[zshell-nightlight] WARNING: couldn't hook saveBufferForMirror — "
|
||||||
|
"captures may still show the nightlight",
|
||||||
|
CHyprColor{1.f, 0.6f, 0.2f, 1.f},
|
||||||
|
8000);
|
||||||
|
|
||||||
static const auto METHODS =
|
static const auto METHODS =
|
||||||
HyprlandAPI::findFunctionsByName(PHANDLE, "begin");
|
HyprlandAPI::findFunctionsByName(PHANDLE, "begin");
|
||||||
const SFunctionMatch* target =
|
const SFunctionMatch* target =
|
||||||
|
|||||||
+25
-53
@@ -1,56 +1,28 @@
|
|||||||
FROM archlinux:latest
|
FROM archlinux:latest
|
||||||
|
|
||||||
RUN pacman -Syyu --noconfirm
|
RUN pacman -Syu --noconfirm \
|
||||||
|
&& pacman -S --needed --noconfirm \
|
||||||
|
base-devel cmake ninja clang lld nodejs tree-sitter \
|
||||||
|
jkqtplotter cmark-gfm git wayland-protocols ffmpeg mpv \
|
||||||
|
qt6-base qt6-declarative qt6-shadertools qt6-5compat \
|
||||||
|
qt6-canvaspainter qt6-wayland qt5-wayland \
|
||||||
|
libqalculate pipewire aubio cava lm_sensors glib2 \
|
||||||
|
&& pacman -Scc --noconfirm
|
||||||
|
|
||||||
# Build toolchain
|
RUN pacman -Syu --noconfirm \
|
||||||
RUN pacman -S --noconfirm \
|
&& pacman -S --needed --noconfirm \
|
||||||
base-devel \
|
sudo meson autoconf-archive python-tqdm \
|
||||||
cmake \
|
&& useradd -m builder \
|
||||||
ninja \
|
&& printf '%s\n' 'builder ALL=(ALL) NOPASSWD: ALL' > /etc/sudoers.d/builder \
|
||||||
clang \
|
&& chmod 0440 /etc/sudoers.d/builder \
|
||||||
lld \
|
&& for i in 1 2 3 4 5; do \
|
||||||
nodejs \
|
rm -rf /tmp/libcava; \
|
||||||
tree-sitter \
|
if git clone --depth 1 https://aur.archlinux.org/libcava.git /tmp/libcava; then break; fi; \
|
||||||
jkqtplotter \
|
sleep 5; \
|
||||||
cmark-gfm \
|
done \
|
||||||
git
|
&& test -d /tmp/libcava/.git \
|
||||||
|
&& chown -R builder:builder /tmp/libcava \
|
||||||
# Qt6
|
&& su builder -c "cd /tmp/libcava && makepkg -si --noconfirm" \
|
||||||
RUN pacman -S --noconfirm \
|
&& rm -rf /tmp/libcava /etc/sudoers.d/builder \
|
||||||
qt6-base \
|
&& userdel -r builder \
|
||||||
qt6-declarative \
|
&& pacman -Scc --noconfirm
|
||||||
qt6-shadertools \
|
|
||||||
qt6-5compat \
|
|
||||||
qt6-canvaspainter
|
|
||||||
|
|
||||||
# Project-specific dependencies
|
|
||||||
RUN pacman -S --noconfirm \
|
|
||||||
libqalculate \
|
|
||||||
pipewire \
|
|
||||||
aubio \
|
|
||||||
cava \
|
|
||||||
lm_sensors \
|
|
||||||
glib2
|
|
||||||
|
|
||||||
# AUR: libcava (provides development headers for cava)
|
|
||||||
RUN pacman -Syu --noconfirm && \
|
|
||||||
pacman -S --needed --noconfirm \
|
|
||||||
sudo \
|
|
||||||
meson \
|
|
||||||
autoconf-archive \
|
|
||||||
python-tqdm && \
|
|
||||||
useradd -m builder && \
|
|
||||||
echo "builder ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers
|
|
||||||
|
|
||||||
RUN for i in 1 2 3 4 5; do \
|
|
||||||
rm -rf /tmp/libcava && \
|
|
||||||
git clone --depth 1 https://aur.archlinux.org/libcava.git /tmp/libcava && \
|
|
||||||
break || sleep 5; \
|
|
||||||
done && \
|
|
||||||
test -d /tmp/libcava/.git && \
|
|
||||||
chown -R builder /tmp/libcava
|
|
||||||
|
|
||||||
RUN su builder -c "cd /tmp/libcava && makepkg -si --noconfirm" && \
|
|
||||||
rm -rf /tmp/libcava && \
|
|
||||||
userdel -r builder && \
|
|
||||||
sed -i '/^builder/d' /etc/sudoers
|
|
||||||
|
|||||||
@@ -0,0 +1,106 @@
|
|||||||
|
BUILD ?= cmake -B build -G Ninja
|
||||||
|
NONUITKA ?= cmake -S . -B build -G Ninja -DCMAKE_BUILD_TYPE=Release -DENABLE_MODULES="plugin;shell;m3shapes"
|
||||||
|
NINJA ?= ninja -C build
|
||||||
|
COMPILE ?= $(BUILD) && $(NINJA)
|
||||||
|
INSTALL ?= $(BUILD) && $(NINJA) && sudo ninja -C build install
|
||||||
|
|
||||||
|
CPPFMT ?= find . \( -name '*.cpp' -o -name '*.h' -o -name '*.hpp' \) -not -path './build/*' -exec clang-format -i --style=file {} +
|
||||||
|
CPPLINT ?= run-clang-tidy -p build -j "$$(nproc)" -source-filter="^$$(pwd)/Plugins/" -header-filter=".*Plugins/.*" -removed-arg=-mno-direct-extern-access
|
||||||
|
|
||||||
|
NUITKA ?= nuitka --module --include-package=zshell cli/src/zshell/ --output-dir=cli/
|
||||||
|
|
||||||
|
.DEFAULT_GOAL := help
|
||||||
|
|
||||||
|
# string is misaligned to align when run in terminal
|
||||||
|
help:
|
||||||
|
@echo "build cmake builds into build directory"
|
||||||
|
@echo "install cmake builds, compiles and installs into filesystem"
|
||||||
|
@echo "compile cmake builds and compiles C++ code"
|
||||||
|
@echo "cpp-fmt format C++ code with clang-format"
|
||||||
|
@echo "cpp-lint lint check C++ code with clang-tidy"
|
||||||
|
@echo "cpp-compile similar to make compile, but excludes Nuitka from compiling python"
|
||||||
|
@echo "py-fmt format Python code with ruff"
|
||||||
|
@echo "py-lint lint check Python code with ruff"
|
||||||
|
@echo "py-check lsp and typecheck all Python code using Basedpyright"
|
||||||
|
@echo "py-test run all Python tests using Pytest"
|
||||||
|
@echo "py-compile compiles Python code using Nuitka"
|
||||||
|
@echo "rs-compile compiles Rust code"
|
||||||
|
@echo "rs-format formats Rust code with Rustfmt"
|
||||||
|
@echo "rs-lint lint check Rust code with Clippy"
|
||||||
|
@echo "rs-test runs all Rust tests"
|
||||||
|
@echo "qml-fmt format QML code with qmlformat"
|
||||||
|
@echo "check-cpp runs all C++ checks"
|
||||||
|
@echo "check-py runs all Python checks"
|
||||||
|
@echo "check-rs runs all Rust checks"
|
||||||
|
|
||||||
|
build:
|
||||||
|
$(BUILD)
|
||||||
|
|
||||||
|
install:
|
||||||
|
$(INSTALL)
|
||||||
|
|
||||||
|
compile:
|
||||||
|
$(COMPILE)
|
||||||
|
|
||||||
|
# C++
|
||||||
|
cpp-fmt:
|
||||||
|
$(CPPFMT)
|
||||||
|
|
||||||
|
cpp-lint:
|
||||||
|
$(CPPLINT)
|
||||||
|
|
||||||
|
cpp-compile:
|
||||||
|
$(NONUITKA)
|
||||||
|
|
||||||
|
# Python
|
||||||
|
py-fmt:
|
||||||
|
ruff format --check
|
||||||
|
|
||||||
|
py-lint:
|
||||||
|
ruff check ./cli
|
||||||
|
|
||||||
|
py-check:
|
||||||
|
basedpyright
|
||||||
|
|
||||||
|
py-test:
|
||||||
|
python -m pytest ./cli/tests/ -v
|
||||||
|
|
||||||
|
# Want to use gcc, clang or zig C compiler instead? Output directory?
|
||||||
|
py-compile:
|
||||||
|
$(NUITKA)
|
||||||
|
|
||||||
|
# Rust
|
||||||
|
rs-compile:
|
||||||
|
cd ./zshell-img-tools/ && cargo run
|
||||||
|
|
||||||
|
rs-fmt:
|
||||||
|
cd ./zshell-img-tools/ && cargo fmt && echo "formatted!"
|
||||||
|
|
||||||
|
rs-lint:
|
||||||
|
cd ./zshell-img-tools/ && cargo clippy
|
||||||
|
|
||||||
|
rs-test:
|
||||||
|
cd ./zshell-img-tools/ && cargo test
|
||||||
|
|
||||||
|
# Qml
|
||||||
|
qml-fmt:
|
||||||
|
find -name '*.qml' -exec /usr/lib/qt6/bin/qmlformat -i {} +
|
||||||
|
|
||||||
|
# Full checks
|
||||||
|
check-cpp:
|
||||||
|
$(MAKE) cpp-fmt
|
||||||
|
$(MAKE) cpp-lint
|
||||||
|
$(MAKE) compile
|
||||||
|
|
||||||
|
check-rs:
|
||||||
|
$(MAKE) rs-fmt
|
||||||
|
$(MAKE) rs-lint
|
||||||
|
$(MAKE) rs-test
|
||||||
|
$(MAKE) rs-compile
|
||||||
|
|
||||||
|
check-py:
|
||||||
|
$(MAKE) py-fmt
|
||||||
|
$(MAKE) py-lint
|
||||||
|
$(MAKE) py-test
|
||||||
|
$(MAKE) py-check
|
||||||
|
$(MAKE) py-compile
|
||||||
Reference in New Issue
Block a user