Files
fenrir/tools/clipboard_sync.sh

105 lines
3.2 KiB
Bash
Executable File

#!/bin/bash
# Fenrir X11 Clipboard Sync
# Synchronizes between X11 clipboard and Fenrir clipboard file
# Prevents loops using checksums and timestamps
# Check for root privileges
if [[ $(whoami) != "root" ]]; then
echo "Error: This script must be run as root to access Fenrir's clipboard file"
echo "Run with: sudo DISPLAY=:0 ./clipboard_sync.sh"
exit 1
fi
FENRIR_CLIPBOARD_FILE="${1:-/tmp/fenrirClipboard}"
STATE_FILE="/var/tmp/.fenrir_clipboard_state"
# Simple state tracking without complex locking
get_file_checksum() {
if [[ -f "$FENRIR_CLIPBOARD_FILE" ]]; then
md5sum "$FENRIR_CLIPBOARD_FILE" 2>/dev/null | cut -d' ' -f1
else
echo ""
fi
}
get_clipboard_checksum() {
xclip -o -selection clipboard 2>/dev/null | md5sum | cut -d' ' -f1
}
# Initialize state
rm -f "$STATE_FILE" 2>/dev/null
echo "Starting Fenrir clipboard sync..."
echo "Monitoring file: $FENRIR_CLIPBOARD_FILE"
# Check dependencies
if ! command -v xclip >/dev/null 2>&1; then
echo "Error: xclip is required but not installed"
echo "Install with: sudo apt install xclip"
exit 1
fi
if ! command -v inotifywait >/dev/null 2>&1; then
echo "Error: inotify-tools is required but not installed"
echo "Install with: sudo apt install inotify-tools"
exit 1
fi
# Create clipboard file if it doesn't exist
touch "$FENRIR_CLIPBOARD_FILE"
echo "Starting Fenrir clipboard sync..."
while true; do
# Read last state
if [[ -f "$STATE_FILE" ]]; then
read -r LAST_FILE_CHECKSUM LAST_CLIPBOARD_CHECKSUM LAST_UPDATE_TIME < "$STATE_FILE"
else
LAST_FILE_CHECKSUM=""
LAST_CLIPBOARD_CHECKSUM=""
LAST_UPDATE_TIME="0"
fi
# Get current checksums
CURRENT_FILE_CHECKSUM=$(get_file_checksum)
CURRENT_CLIPBOARD_CHECKSUM=$(get_clipboard_checksum)
CURRENT_TIME=$(date +%s)
# Skip update if we just made one (prevent immediate loops)
TIME_SINCE_LAST=$((CURRENT_TIME - LAST_UPDATE_TIME))
if [[ $TIME_SINCE_LAST -lt 3 ]]; then
sleep 1
continue
fi
# Clipboard changed
if [[ "$CURRENT_CLIPBOARD_CHECKSUM" != "$LAST_CLIPBOARD_CHECKSUM" ]]; then
echo "X11 clipboard changed, updating file..."
if xclip -o -selection clipboard > "$FENRIR_CLIPBOARD_FILE" 2>/dev/null; then
CURRENT_FILE_CHECKSUM=$(get_file_checksum)
echo "$CURRENT_FILE_CHECKSUM $CURRENT_CLIPBOARD_CHECKSUM $CURRENT_TIME" > "$STATE_FILE"
echo "File updated successfully"
else
echo "Failed to update file from clipboard"
fi
sleep 1
continue
fi
# File changed
if [[ "$CURRENT_FILE_CHECKSUM" != "$LAST_FILE_CHECKSUM" ]]; then
echo "Fenrir clipboard file changed, updating X11 clipboard..."
if cat "$FENRIR_CLIPBOARD_FILE" | xclip -i -selection clipboard 2>/dev/null; then
CURRENT_CLIPBOARD_CHECKSUM=$(get_clipboard_checksum)
echo "$CURRENT_FILE_CHECKSUM $CURRENT_CLIPBOARD_CHECKSUM $CURRENT_TIME" > "$STATE_FILE"
echo "X11 clipboard updated successfully"
else
echo "Failed to update clipboard from file"
fi
sleep 1
continue
fi
sleep 1
done