From e8e2785900b8b82f42466ddfb8ceaf4e4259a0aa Mon Sep 17 00:00:00 2001 From: FURK4NGG <105324908+FURK4NGG@users.noreply.github.com> Date: Sun, 18 Jan 2026 16:13:51 +0300 Subject: [PATCH] Add files via upload --- blacklayer | Bin 0 -> 16712 bytes blacklayer-worker.sh | 78 +++++++++++++++++++++++++++++++++++++++++++ blacklayer.conf | 16 +++++++++ call-blacklayer.sh | 45 +++++++++++++++++++++++++ event-driven.sh | 24 +++++++++++++ 5 files changed, 163 insertions(+) create mode 100644 blacklayer create mode 100644 blacklayer-worker.sh create mode 100644 blacklayer.conf create mode 100644 call-blacklayer.sh create mode 100644 event-driven.sh diff --git a/blacklayer b/blacklayer new file mode 100644 index 0000000000000000000000000000000000000000..cee182d890e6b3ad6be111da54b075c6ec27006f GIT binary patch literal 16712 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 literal 0 HcmV?d00001 diff --git a/blacklayer-worker.sh b/blacklayer-worker.sh new file mode 100644 index 0000000..f50fd72 --- /dev/null +++ b/blacklayer-worker.sh @@ -0,0 +1,78 @@ +#!/usr/bin/env bash + +BASE_DIR="$HOME/.config/blacklayer" +CONF_FILE="$BASE_DIR/blacklayer.conf" +[ -f "$CONF_FILE" ] && source "$CONF_FILE" + +# ------------------------- +# .conf dan gelen degerler/Default değerler +# ------------------------- +LOOP_INTERVAL="${LOOP_INTERVAL:-60}" +COUNT_THRESHOLD="${COUNT_THRESHOLD:-5}" +WAYLAND_DISPLAY="${WAYLAND_DISPLAY:-wayland-1}" +EVENT_POLL_INTERVAL="${EVENT_POLL_INTERVAL:-3}" +EVENT_DRIVEN="${EVENT_DRIVEN:-$HOME/.config/blacklayer/event-driven.sh}" + +BLACKLAYER_BIN="$BASE_DIR/blacklayer" +COUNT_FILE="$BASE_DIR/.blacklayer_count" +STATE_DIR="$BASE_DIR/.blacklayer_state" + + +# ------------------------- +# Sonsuz döngü +# ------------------------- +while true; do + export XDG_RUNTIME_DIR="/run/user/$(id -u)" + [ -z "$HYPRLAND_INSTANCE_SIGNATURE" ] && \ + export HYPRLAND_INSTANCE_SIGNATURE="$(ls "$XDG_RUNTIME_DIR/hypr/" 2>/dev/null | head -n1)" + export WAYLAND_DISPLAY + + + mkdir -p "$STATE_DIR" + [ ! -f "$COUNT_FILE" ] && echo "0" > "$COUNT_FILE" + chmod 600 "$STATE_DIR"/* 2>/dev/null || true + + JSON="$(hyprctl -j monitors 2>/dev/null)" + echo "$JSON" | jq empty >/dev/null 2>&1 || { sleep "$LOOP_INTERVAL"; continue; } + + # ------------------------- + # Focused kontrol ve state update + # ------------------------- + echo "$JSON" | jq -r '.[] | .name + " " + (.focused|tostring)' | while read -r MONITOR_NAME FOCUSED; do + STATE_FILE="$STATE_DIR/$MONITOR_NAME" + [ ! -f "$STATE_FILE" ] && echo "false" > "$STATE_FILE" + ISWORKING=$(<"$STATE_FILE") + [ "$FOCUSED" = "true" ] && echo "true" > "$STATE_FILE" + done + + # ------------------------- + # Count artır + # ------------------------- + COUNT=$(<"$COUNT_FILE") + COUNT=$((COUNT + 1)) + echo "$COUNT" > "$COUNT_FILE" + + # ------------------------- + # 5. çağrıda blacklayer açma + # ------------------------- + if [ "$COUNT" -ge "$COUNT_THRESHOLD" ]; then + echo "$JSON" | jq -r '.[] | .name' | while read -r MONITOR_NAME; do + STATE_FILE="$STATE_DIR/$MONITOR_NAME" + ISWORKING=$(<"$STATE_FILE") + + if [ "$ISWORKING" = "false" ] && ! pgrep -f "$BLACKLAYER_BIN $MONITOR_NAME" >/dev/null 2>&1; then + "$BLACKLAYER_BIN" "$MONITOR_NAME" & + nohup bash -c "$EVENT_DRIVEN $MONITOR_NAME $EVENT_POLL_INTERVAL" >/dev/null 2>&1 & + echo "true" > "$STATE_FILE" + fi + done + + # 5. okumadan sonra tüm state ve count sıfırlama + echo "0" > "$COUNT_FILE" + for STATE in "$STATE_DIR"/*; do + echo "false" > "$STATE" + done + fi + + sleep "$LOOP_INTERVAL" +done diff --git a/blacklayer.conf b/blacklayer.conf new file mode 100644 index 0000000..2f5fdf4 --- /dev/null +++ b/blacklayer.conf @@ -0,0 +1,16 @@ +# Blacklayer configuration + +# Call-blacklayer script loop interval (seconds) +LOOP_INTERVAL=60 + +# Event-driven script poll interval (seconds) +EVENT_POLL_INTERVAL=3 + +# 5. tetiklemede blacklayer aç (count threshold) +COUNT_THRESHOLD=5 + +# Wayland display +WAYLAND_DISPLAY=wayland-1 + +# Hyprland instance signature (opsiyonel, default conf yerine runtime) +# HYPRLAND_INSTANCE_SIGNATURE= diff --git a/call-blacklayer.sh b/call-blacklayer.sh new file mode 100644 index 0000000..288141f --- /dev/null +++ b/call-blacklayer.sh @@ -0,0 +1,45 @@ +#!/usr/bin/env bash + +# ------------------------- +# Base paths (EN BAŞTA) +# ------------------------- +BASE_DIR="$HOME/.config/blacklayer" +PID_FILE="$BASE_DIR/blacklayer_worker.pid" +STATE_DIR="$BASE_DIR/blacklayer_state" +COUNT_FILE="$BASE_DIR/blacklayer_count" + +WORKER="$BASE_DIR/blacklayer-worker.sh" +BLACKLAYER_BIN="$BASE_DIR/blacklayer" + +# Dizini garanti altına al +mkdir -p "$STATE_DIR" + +# ------------------------- +# Worker çalışıyorsa → KAPAT +# ------------------------- +if [ -f "$PID_FILE" ] && kill -0 "$(cat "$PID_FILE")" 2>/dev/null; then + notify-send "Blacklayer" "blacklayer is stopping" + echo "[blacklayer] stopping..." + + # Worker'ı kapat + kill "$(cat "$PID_FILE")" 2>/dev/null + rm -f "$PID_FILE" + + # Tüm blacklayer processlerini kapat + pkill -f "$BLACKLAYER_BIN" 2>/dev/null + + # State & count temizliği + rm -rf "$STATE_DIR" + rm -f "$COUNT_FILE" + + exit 0 +fi + +# ------------------------- +# Çalışmıyorsa → BAŞLAT +# ------------------------- +notify-send "Blacklayer" "blacklayer is starting" +echo "[blacklayer] starting..." + +nohup bash "$WORKER" >/dev/null 2>&1 & +echo $! > "$PID_FILE" diff --git a/event-driven.sh b/event-driven.sh new file mode 100644 index 0000000..540cf93 --- /dev/null +++ b/event-driven.sh @@ -0,0 +1,24 @@ +#!/usr/bin/env bash +# Kullanım: event-driven.sh +MONITOR="$1" +POLL_INTERVAL="${2:-3}" # default 3s +[ -z "$MONITOR" ] && { echo "Monitor arg missing"; exit 1; } + +BASE_DIR="$HOME/.config/blacklayer" +BLACKLAYER_BIN="$BASE_DIR/blacklayer" +STATE_DIR="$BASE_DIR/.blacklayer_state" +STATE_FILE="$STATE_DIR/$MONITOR" + +while true; do + sleep "$POLL_INTERVAL" + + JSON="$(hyprctl -j monitors 2>/dev/null)" + echo "$JSON" | jq empty >/dev/null 2>&1 || continue + + FOCUSED=$(echo "$JSON" | jq -r ".[] | select(.name==\"$MONITOR\") | .focused") + if [ "$FOCUSED" = "true" ]; then + pkill -f "$BLACKLAYER_BIN $MONITOR" >/dev/null 2>&1 + echo "false" > "$STATE_FILE" + exit 0 + fi +done