105 lines
3.2 KiB
Bash
Executable File
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 |