diff --git a/.config/blacklayer/blacklayer b/.config/blacklayer/blacklayer new file mode 100644 index 0000000..e69879f Binary files /dev/null and b/.config/blacklayer/blacklayer differ diff --git a/.config/blacklayer/blacklayer-worker.sh b/.config/blacklayer/blacklayer-worker.sh new file mode 100644 index 0000000..e8d912d --- /dev/null +++ b/.config/blacklayer/blacklayer-worker.sh @@ -0,0 +1,82 @@ +#!/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" +WAYBAR_BIN="/usr/bin/waybar" +WAYBAR_CONFIG_DIR="$HOME/.config/waybar" + + +# ------------------------- +# 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 + pkill -f "waybar.*$MONITOR_NAME" 2>/dev/null + + "$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/.config/blacklayer/call-blacklayer.sh b/.config/blacklayer/call-blacklayer.sh new file mode 100644 index 0000000..288141f --- /dev/null +++ b/.config/blacklayer/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/.config/blacklayer/event-driven.sh b/.config/blacklayer/event-driven.sh new file mode 100644 index 0000000..0490ee0 --- /dev/null +++ b/.config/blacklayer/event-driven.sh @@ -0,0 +1,35 @@ +#!/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" + +WAYBAR_BIN="/usr/bin/waybar" +WAYBAR_CONFIG_DIR="$HOME/.config/waybar" +WAYBAR_CONFIG="$WAYBAR_CONFIG_DIR/config-$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 + # Blacklayer kapat + pkill -f "$BLACKLAYER_BIN $MONITOR" >/dev/null 2>&1 + echo "false" > "$STATE_FILE" + + # Waybar tekrar aç + if [ -f "$WAYBAR_CONFIG" ]; then + "$WAYBAR_BIN" -c "$WAYBAR_CONFIG" >/dev/null 2>&1 & + fi + + exit 0 + fi +done diff --git a/.config/blacklayer/generate-waybar-configs.sh b/.config/blacklayer/generate-waybar-configs.sh new file mode 100644 index 0000000..ebc177e --- /dev/null +++ b/.config/blacklayer/generate-waybar-configs.sh @@ -0,0 +1,29 @@ +#!/usr/bin/env bash +set -e + +WAYBAR_DIR="$HOME/.config/waybar" +BASE_CONFIG="$WAYBAR_DIR/config" + +if [ ! -f "$BASE_CONFIG" ]; then + echo "[error] base config not found" + exit 1 +fi + +command -v hyprctl >/dev/null || { + echo "[error] hyprctl not found" + exit 1 +} + +MONITORS=$(hyprctl -j monitors | jq -r '.[].name') + +for MONITOR in $MONITORS; do + TARGET="$WAYBAR_DIR/config-$MONITOR" + + { + echo '{' + echo " \"output\": [\"$MONITOR\"]," + sed '1s/^{//' "$BASE_CONFIG" + } > "$TARGET" + + echo "[ok] generated $TARGET for $MONITOR" +done diff --git a/.config/blacklayer/start-waybars.sh b/.config/blacklayer/start-waybars.sh new file mode 100644 index 0000000..010596b --- /dev/null +++ b/.config/blacklayer/start-waybars.sh @@ -0,0 +1,14 @@ +#!/usr/bin/env bash + +# Ortam değişkenleri +export XDG_RUNTIME_DIR="/run/user/$(id -u)" +export WAYLAND_DISPLAY="wayland-1" + +WAYBAR_BIN="/usr/bin/waybar" +CONFIG_DIR="$HOME/.config/waybar" + +# Tüm config-* dosyalarını al +for CONFIG in "$CONFIG_DIR"/config-*; do + echo "[waybar] starting with $CONFIG" + "$WAYBAR_BIN" -c "$CONFIG" & +done