diff options
| author | bh <qn+git@epicurus.dev> | 2025-12-05 21:55:47 +0800 |
|---|---|---|
| committer | bh <qn+git@epicurus.dev> | 2025-12-05 21:55:47 +0800 |
| commit | a17456cf8418c9f8b8cdba47d11a6c4a7e6abede (patch) | |
| tree | 789be6accc181022bc815dff63c97c184b96e929 /rofi/.config | |
| parent | fd6695cc6782535d30b40b0aa255ca5f3e0769f3 (diff) | |
Added more dotfiles
Diffstat (limited to 'rofi/.config')
28 files changed, 4226 insertions, 0 deletions
diff --git a/rofi/.config/rofi/.bak/.clipboard-launcher-enhanced.sh.bak b/rofi/.config/rofi/.bak/.clipboard-launcher-enhanced.sh.bak new file mode 100755 index 0000000..5d39f5b --- /dev/null +++ b/rofi/.config/rofi/.bak/.clipboard-launcher-enhanced.sh.bak @@ -0,0 +1,206 @@ +#!/usr/bin/env bash +#============================================================================== +# Enhanced greenclip launcher with image thumbnail support +#============================================================================== +# This script provides an enhanced clipboard manager interface using rofi +# and greenclip, with support for image thumbnails and text truncation. +# +# Features: +# - Displays clipboard history from greenclip +# - Shows thumbnails for copied images +# - Truncates long text entries for better readability +# - Preserves original content when pasting (fixes display vs. actual content) +# +# Requirements: +# - rofi (with script mode support) +# - greenclip (clipboard manager daemon) +# - xclip (for clipboard operations) +#============================================================================== + +# Directory where greenclip caches image files +# NOTE: This should match your greenclip.toml image_cache_directory setting +IMGDIR="/tmp/greenclip" + +#------------------------------------------------------------------------------ +# clipboard_mode() - Main function that provides rofi script mode interface +#------------------------------------------------------------------------------ +# This function is called by rofi in two different contexts: +# +# 1. ROFI_RETV=0 (Initial call): Generate and display the menu items +# - Reads clipboard history from greenclip +# - Formats items with icons and thumbnails +# - Preserves original content in the 'info' field +# +# 2. ROFI_RETV=1 (Item selected): User selected an item +# - Returns the ORIGINAL content (from ROFI_INFO) for pasting +# - NOT the modified display text (from $1) +#------------------------------------------------------------------------------ +clipboard_mode() { + if [ "$ROFI_RETV" = "0" ]; then + #---------------------------------------------------------------------- + # INITIAL CALL - Build the clipboard menu + #---------------------------------------------------------------------- + + # Read clipboard history from greenclip, process line by line + greenclip print | while IFS= read -r line; do + + # Store original line for later retrieval (crucial for correct pasting) + original_content="$line" + + #------------------------------------------------------------------ + # IMAGE DETECTION - Check if this entry might be an image + #------------------------------------------------------------------ + # Greenclip stores copied images as files in IMGDIR + # We detect them by checking for short clipboard entries that might + # be image placeholders, then matching against cached image files + #------------------------------------------------------------------ + + image_found=0 # Flag to track if we found a matching image + + if [ -d "$IMGDIR" ]; then + # Iterate through image files in the cache directory + # NOTE: Using a for loop instead of while to avoid subshell issues + for img in "$IMGDIR"/*.png "$IMGDIR"/*.jpg "$IMGDIR"/*.jpeg; do + # Skip if no files match the glob pattern + [ -f "$img" ] || continue + + imgname=$(basename "$img") + + # Heuristic: Short lines (<50 chars) might be image placeholders + # This is a simple detection method and may need refinement + if [ ${#line} -lt 50 ] && [ -f "$img" ]; then + # Format for rofi with thumbnail support: + # display_text \0 icon \x1f icon_path \0 info \x1f original_content + # + # Breaking down the format: + # - display_text: What the user sees (with emoji and filename) + # - \0icon\x1f: Separator + icon field marker + # - thumbnail://path: Tells rofi to show image thumbnail + # - \0info\x1f: Separator + info field marker + # - original_content: The ACTUAL content to paste (preserved here!) + printf '%s\0icon\x1fthumbnail://%s\0info\x1f%s\n' \ + "🖼️ Image: $imgname" \ + "$img" \ + "$original_content" + + image_found=1 + break # Found matching image, stop searching + fi + done + fi + + # Skip to next clipboard entry if we already handled this as an image + # FIXED: Previously used 'continue 2' which could skip entries + [ $image_found -eq 1 ] && continue + + #------------------------------------------------------------------ + # TEXT ENTRY - Format regular clipboard text entries + #------------------------------------------------------------------ + + # Truncate long text for better display in the menu + # But preserve original content in the info field for pasting + if [ ${#line} -gt 100 ]; then + # Display truncated version with ellipsis + display_text="${line:0:100}..." + + # Format: display_text \0 info \x1f original_content + # The info field contains the FULL original text for pasting + printf '%s\0info\x1f%s\n' "$display_text" "$original_content" + else + # Short enough to display as-is, but still use info field + # for consistency (makes the selection handler simpler) + printf '%s\0info\x1f%s\n' "$line" "$original_content" + fi + done + else + #---------------------------------------------------------------------- + # ITEM SELECTED - User chose an item from the menu + #---------------------------------------------------------------------- + # CRITICAL FIX: Output $ROFI_INFO (original content) NOT $1 (display text) + # + # - $1 contains the display text (e.g., "Some long text..." or "🖼️ Image: ...") + # - $ROFI_INFO contains the original content we stored in the info field + # - This ensures we paste the actual clipboard content, not the modified display + #---------------------------------------------------------------------- + + echo "$ROFI_INFO" + + # OLD BUGGY CODE (commented out for reference): + # echo "$1" + # This would paste the DISPLAY text instead of the ORIGINAL content! + # For example, pasting "Some long text..." instead of the full text, + # or pasting "🖼️ Image: file.png" instead of the actual image data. + fi +} + +#============================================================================== +# Export functions and variables for rofi script mode +#============================================================================== +# These exports make the function and variables available when rofi +# calls this script as a subprocess +export -f clipboard_mode +export IMGDIR + +#============================================================================== +# SCRIPT ENTRY POINT +#============================================================================== +# This script has two execution modes: +# +# 1. Direct execution (user runs the script): +# - ROFI_RETV is empty/unset +# - Script launches rofi with itself as the data source +# +# 2. Called by rofi (rofi script mode): +# - ROFI_RETV is set (0 for initial, 1+ for selection) +# - Script provides menu items or processes selection +#============================================================================== + +# OLD CODE (commented out - caused rofi-in-rofi infinite recursion bug) +# This version didn't check if it was being called by rofi, so it would +# launch rofi again, which would call the script again, creating an infinite loop +# +# # Launch rofi with custom script mode +# rofi -modi "clipboard:$0" \ +# -show clipboard \ +# -run-command 'echo -n {cmd} | xclip -selection clipboard' \ +# -theme ~/.config/rofi/clipboard.rasi +# +# # If running in script mode (called by rofi) +# if [ -n "$ROFI_RETV" ]; then +# clipboard_mode "$@" +# fi + +#------------------------------------------------------------------------------ +# FIXED CODE - Prevents rofi-in-rofi recursion bug +#------------------------------------------------------------------------------ +# Check ROFI_RETV to determine execution context +if [ -z "$ROFI_RETV" ]; then + #-------------------------------------------------------------------------- + # MODE 1: Direct execution by user + #-------------------------------------------------------------------------- + # Launch rofi with this script as the clipboard data provider + # + # Parameters explained: + # -modi "clipboard:$0" : Register this script as a rofi mode named "clipboard" + # -show clipboard : Open rofi showing the clipboard mode + # -run-command '...' : What to do with the selected item + # {cmd} is replaced with the script's output (from ROFI_INFO) + # The output is piped to xclip to copy to system clipboard + # -theme ... : Custom theme file for appearance + #-------------------------------------------------------------------------- + rofi -modi "clipboard:$0" \ + -show clipboard \ + -run-command 'echo -n {cmd} | xclip -selection clipboard' \ + -theme ~/.config/rofi/clipboard.rasi +else + #-------------------------------------------------------------------------- + # MODE 2: Called by rofi (script mode) + #-------------------------------------------------------------------------- + # Rofi is calling us to either: + # - Get the list of menu items (ROFI_RETV=0) + # - Process a user selection (ROFI_RETV=1) + # + # The clipboard_mode function handles both cases + #-------------------------------------------------------------------------- + clipboard_mode "$@" +fi diff --git a/rofi/.config/rofi/.bak/.clipboard-launcher.sh.backup b/rofi/.config/rofi/.bak/.clipboard-launcher.sh.backup new file mode 100755 index 0000000..5f81f0e --- /dev/null +++ b/rofi/.config/rofi/.bak/.clipboard-launcher.sh.backup @@ -0,0 +1,60 @@ +#!/usr/bin/env bash +#============================================================================== +# Simple Greenclip Clipboard Manager Launcher +#============================================================================== +# This is a straightforward wrapper around greenclip that provides a +# clipboard history interface using rofi. +# +# Features: +# - Simple, reliable clipboard history +# - No modifications to clipboard content +# - No image thumbnail support (use enhanced version for that) +# - Minimal overhead and complexity +# +# Usage: +# ./clipboard-launcher.sh +# +# Requirements: +# - rofi (launcher/menu application) +# - greenclip (clipboard manager daemon - must be running) +# - xclip (for clipboard operations) +# +# How it works: +# 1. User runs this script +# 2. Rofi displays clipboard history from greenclip +# 3. User selects an item +# 4. Selected text is copied to system clipboard via xclip +# 5. User can paste normally (Ctrl+V) +#============================================================================== + +#------------------------------------------------------------------------------ +# Launch rofi with greenclip integration +#------------------------------------------------------------------------------ +# Parameters explained: +# +# -modi "clipboard:greenclip print" +# Register a rofi mode called "clipboard" that uses "greenclip print" +# to generate the menu items. Greenclip print outputs clipboard history. +# +# -show clipboard +# Open rofi showing the clipboard mode we just registered +# +# -run-command 'echo -n {cmd} | xclip -selection clipboard' +# When user selects an item: +# - {cmd} is replaced with the selected clipboard entry +# - Echo it (without newline: -n flag) to xclip +# - This copies it to the system clipboard +# - User can then paste it anywhere +# +# PREVIOUS BUGGY VERSION (commented out): +# # -run-command '{cmd}' +# This would try to EXECUTE the clipboard content as a command, +# which doesn't paste it and could be dangerous! +# +# -theme ~/.config/rofi/clipboard.rasi +# Use custom theme for consistent appearance +#------------------------------------------------------------------------------ +rofi -modi "clipboard:greenclip print" \ + -show clipboard \ + -run-command 'echo -n {cmd} | xclip -selection clipboard' \ + -theme ~/.config/rofi/clipboard.rasi diff --git a/rofi/.config/rofi/.bak/.clipboard-rasi.backup b/rofi/.config/rofi/.bak/.clipboard-rasi.backup new file mode 100644 index 0000000..fbf37b6 --- /dev/null +++ b/rofi/.config/rofi/.bak/.clipboard-rasi.backup @@ -0,0 +1,148 @@ +/******************************************************* + * CLIPBOARD MANAGER (GREENCLIP) + *******************************************************/ + + +configuration { + font: "Noto Sans Regular 10"; + show-icons: true; + icon-theme: "Qogir"; + display-clipboard: " "; + disable-history: false; + sidebar-mode: false; + kb-cancel: "Super+c,Escape"; +} + + +@import "~/.config/rofi/config.rasi" +/* Insert theme modifications after this */ + +window { + background-color: @background; + border: 0; + padding: 30; + width: 50%; +} +listview { + lines: 8; + columns: 1; +} +mainbox { + border: 0; + padding: 0; +} +message { + border: 2px 0px 0px; + border-color: @separatorcolor; + padding: 1px; +} +textbox { + text-color: @foreground; +} +listview { + fixed-height: 0; + border: 8px 0px 0px; + border-color: @separatorcolor; + /* spacing: 8px; */ + spacing: 2px; /* More condensed spacing */ + scrollbar: true; + padding: 2px 0px 0px; +} +element { + border: 0; + /* padding: 5px; */ + padding: 2px; /* More condensed padding */ + orientation: horizontal; +} +element-icon { + /* size: 2em; */ + size: 1.5em; /* Smaller icon for condensed view */ + /* padding: 0 10px 0 0; */ + padding: 0 5px 0 0; /* Less padding between icon and text */ +} +element-text { + background-color: inherit; + text-color: inherit; + vertical-align: 0.5; +} +element.normal.normal { + background-color: @normal-background; + text-color: @normal-foreground; +} +element.normal.urgent { + background-color: @urgent-background; + text-color: @urgent-foreground; +} +element.normal.active { + background-color: @active-background; + text-color: @active-foreground; +} +element.selected.normal { + background-color: @selected-normal-background; + text-color: @selected-normal-foreground; +} +element.selected.urgent { + background-color: @selected-urgent-background; + text-color: @selected-urgent-foreground; +} +element.selected.active { + background-color: @selected-active-background; + text-color: @selected-active-foreground; +} +element.alternate.normal { + background-color: @alternate-normal-background; + text-color: @alternate-normal-foreground; +} +element.alternate.urgent { + background-color: @alternate-urgent-background; + text-color: @alternate-urgent-foreground; +} +element.alternate.active { + background-color: @alternate-active-background; + text-color: @alternate-active-foreground; +} +scrollbar { + width: 4px; + border: 0; + handle-color: @normal-foreground; + handle-width: 8px; + padding: 0; +} +mode-switcher { + border: 2px 0px 0px; + border-color: @separatorcolor; +} +button { + spacing: 0; + text-color: @normal-foreground; +} +button.selected { + background-color: @selected-normal-background; + text-color: @selected-normal-foreground; +} +inputbar { + spacing: 0; + text-color: @normal-foreground; + padding: 1px; +} +case-indicator { + spacing: 0; + text-color: @normal-foreground; +} +entry { + spacing: 0; + text-color: @normal-foreground; +} +prompt { + spacing: 0; + text-color: @normal-foreground; +} +inputbar { + children: [ prompt,textbox-prompt-colon,entry,case-indicator ]; +} +textbox-prompt-colon { + expand: false; + str: ""; + margin: 0px 0.3em 0em 0em; + text-color: @normal-foreground; +} diff --git a/rofi/.config/rofi/.bak/.clipboard.rasi.bak b/rofi/.config/rofi/.bak/.clipboard.rasi.bak new file mode 100644 index 0000000..fbf37b6 --- /dev/null +++ b/rofi/.config/rofi/.bak/.clipboard.rasi.bak @@ -0,0 +1,148 @@ +/******************************************************* + * CLIPBOARD MANAGER (GREENCLIP) + *******************************************************/ + + +configuration { + font: "Noto Sans Regular 10"; + show-icons: true; + icon-theme: "Qogir"; + display-clipboard: " "; + disable-history: false; + sidebar-mode: false; + kb-cancel: "Super+c,Escape"; +} + + +@import "~/.config/rofi/config.rasi" +/* Insert theme modifications after this */ + +window { + background-color: @background; + border: 0; + padding: 30; + width: 50%; +} +listview { + lines: 8; + columns: 1; +} +mainbox { + border: 0; + padding: 0; +} +message { + border: 2px 0px 0px; + border-color: @separatorcolor; + padding: 1px; +} +textbox { + text-color: @foreground; +} +listview { + fixed-height: 0; + border: 8px 0px 0px; + border-color: @separatorcolor; + /* spacing: 8px; */ + spacing: 2px; /* More condensed spacing */ + scrollbar: true; + padding: 2px 0px 0px; +} +element { + border: 0; + /* padding: 5px; */ + padding: 2px; /* More condensed padding */ + orientation: horizontal; +} +element-icon { + /* size: 2em; */ + size: 1.5em; /* Smaller icon for condensed view */ + /* padding: 0 10px 0 0; */ + padding: 0 5px 0 0; /* Less padding between icon and text */ +} +element-text { + background-color: inherit; + text-color: inherit; + vertical-align: 0.5; +} +element.normal.normal { + background-color: @normal-background; + text-color: @normal-foreground; +} +element.normal.urgent { + background-color: @urgent-background; + text-color: @urgent-foreground; +} +element.normal.active { + background-color: @active-background; + text-color: @active-foreground; +} +element.selected.normal { + background-color: @selected-normal-background; + text-color: @selected-normal-foreground; +} +element.selected.urgent { + background-color: @selected-urgent-background; + text-color: @selected-urgent-foreground; +} +element.selected.active { + background-color: @selected-active-background; + text-color: @selected-active-foreground; +} +element.alternate.normal { + background-color: @alternate-normal-background; + text-color: @alternate-normal-foreground; +} +element.alternate.urgent { + background-color: @alternate-urgent-background; + text-color: @alternate-urgent-foreground; +} +element.alternate.active { + background-color: @alternate-active-background; + text-color: @alternate-active-foreground; +} +scrollbar { + width: 4px; + border: 0; + handle-color: @normal-foreground; + handle-width: 8px; + padding: 0; +} +mode-switcher { + border: 2px 0px 0px; + border-color: @separatorcolor; +} +button { + spacing: 0; + text-color: @normal-foreground; +} +button.selected { + background-color: @selected-normal-background; + text-color: @selected-normal-foreground; +} +inputbar { + spacing: 0; + text-color: @normal-foreground; + padding: 1px; +} +case-indicator { + spacing: 0; + text-color: @normal-foreground; +} +entry { + spacing: 0; + text-color: @normal-foreground; +} +prompt { + spacing: 0; + text-color: @normal-foreground; +} +inputbar { + children: [ prompt,textbox-prompt-colon,entry,case-indicator ]; +} +textbox-prompt-colon { + expand: false; + str: ""; + margin: 0px 0.3em 0em 0em; + text-color: @normal-foreground; +} diff --git a/rofi/.config/rofi/.bak/bak/clipboard-launcher.sh.20251203_221032 b/rofi/.config/rofi/.bak/bak/clipboard-launcher.sh.20251203_221032 new file mode 100755 index 0000000..235caf0 --- /dev/null +++ b/rofi/.config/rofi/.bak/bak/clipboard-launcher.sh.20251203_221032 @@ -0,0 +1,114 @@ +#!/usr/bin/env bash +#============================================================================== +# Safe Clipboard Launcher - Crash-Free Version +#============================================================================== +# FIXES: +# - Skips images with missing files (prevents crashes) +# - Only shows images that actually exist +# - Safer error handling +# - No thumbnails for now (simpler, more stable) +#============================================================================== + +# Directory where greenclip stores image files +IMGDIR="/tmp/greenclip" + +#------------------------------------------------------------------------------ +# clipboard_mode() - Handles rofi script mode SAFELY +#------------------------------------------------------------------------------ +clipboard_mode() { + if [ "$ROFI_RETV" = "0" ]; then + #---------------------------------------------------------------------- + # Show clipboard entries - SKIP BROKEN IMAGES + #---------------------------------------------------------------------- + greenclip print | while IFS= read -r line; do + + # Check if this is an image entry + if [[ "$line" =~ ^image/png ]]; then + # Extract hash (handles both "image/png HASH" and "image/png Zen HASH") + hash=$(echo "$line" | awk '{print $NF}') + imgfile="$IMGDIR/${hash}.png" + + # IMPORTANT: Only show image if file actually exists + # This prevents crashes from missing files + if [ -f "$imgfile" ]; then + # Show image entry (no thumbnail to keep it simple and stable) + # Store original line in info field + printf '[IMAGE] %s\0info\x1f%s\n' "$(basename "$imgfile")" "$line" + fi + # If file doesn't exist: SKIP IT (don't show at all) + # This prevents clicking on broken images + + else + # Regular text entry - show as-is + printf '%s\0info\x1f%s\n' "$line" "$line" + fi + done + + else + #---------------------------------------------------------------------- + # Handle selection SAFELY + #---------------------------------------------------------------------- + selection="$ROFI_INFO" + + # Safety check: exit if nothing selected + [ -z "$selection" ] && exit 0 + + if [[ "$selection" =~ ^image/png ]]; then + # Image selected - copy with extra safety checks + hash=$(echo "$selection" | awk '{print $NF}') + imgfile="$IMGDIR/${hash}.png" + + # Double-check file exists and is readable + if [ -f "$imgfile" ] && [ -r "$imgfile" ]; then + # Copy image safely + xclip -selection clipboard -t image/png -i "$imgfile" 2>/dev/null + exit_code=$? + if [ $exit_code -ne 0 ]; then + # xclip failed - notify user if possible + command -v dunstify &>/dev/null && dunstify -u critical "Clipboard Error" "Failed to copy image" + fi + fi + else + # Text selected - copy safely + echo -n "$selection" | xclip -selection clipboard 2>/dev/null + fi + + # Always exit cleanly + exit 0 + fi +} + +# Export for rofi script mode +export -f clipboard_mode +export IMGDIR + +#------------------------------------------------------------------------------ +# Main entry point - with safety check +#------------------------------------------------------------------------------ +if [ -z "$ROFI_RETV" ]; then + # Launch rofi + rofi -modi "clipboard:$0" \ + -show clipboard \ + -theme ~/.config/rofi/clipboard.rasi +else + # Handle rofi request + clipboard_mode "$@" +fi + +#============================================================================== +# OLD VERSIONS (kept for reference) +#============================================================================== + +# VERSION WITH THUMBNAILS (caused crashes): +# The thumbnail:// protocol might be causing rofi to crash +# when trying to load missing image files +# +# if [ -f "$imgfile" ]; then +# printf 'Image: %s\0icon\x1fthumbnail://%s\0info\x1f%s\n' \ +# "$(basename "$imgfile")" \ +# "$imgfile" \ +# "$line" +# fi + +# SIMPLE DMENU VERSION (no images at all): +# greenclip print | rofi -dmenu -i -p " " -theme ~/.config/rofi/clipboard.rasi | xclip -selection clipboard diff --git a/rofi/.config/rofi/.bak/bak/clipboard.rasi.20251203_221213 b/rofi/.config/rofi/.bak/bak/clipboard.rasi.20251203_221213 new file mode 100644 index 0000000..347d825 --- /dev/null +++ b/rofi/.config/rofi/.bak/bak/clipboard.rasi.20251203_221213 @@ -0,0 +1,197 @@ +/******************************************************* + * CLIPBOARD MANAGER - With Images + *******************************************************/ +/* + * Clipboard theme with nice padding and image support + * - Normal font (10pt) + * - Comfortable padding (like rofidmenu) + * - Icons and images enabled + * - Clean and simple + */ + +configuration { + font: "Noto Sans Regular 10"; + show-icons: true; /* Enable icons for images */ + icon-theme: "Qogir"; + display-clipboard: " "; /* Clipboard icon restored */ + disable-history: false; + sidebar-mode: false; + kb-cancel: "Super+c,Escape"; +} + +/* Import base theme */ +@import "~/.config/rofi/config.rasi" + +/* Window - comfortable padding like rofidmenu */ +window { + background-color: @background; + border: 0; + padding: 30; /* Nice padding like rofidmenu */ + width: 50%; +} + +mainbox { + border: 0; + padding: 0; +} + +/* List view - balanced spacing */ +listview { + lines: 10; /* Show 10 entries */ + columns: 1; + fixed-height: 0; + border: 8px 0px 0px; /* Like rofidmenu */ + border-color: @separatorcolor; + scrollbar: true; + padding: 2px 0px 0px; + spacing: 4px; /* Comfortable spacing */ +} + +/* Element - comfortable padding */ +element { + border: 0; + padding: 3px; /* Comfortable padding */ +} + +/* Icon configuration for images */ +element-icon { + size: 2em; /* Good size for image thumbnails */ + padding: 0 6px 0 0; /* Space between icon and text */ +} + +element-text { + background-color: inherit; + text-color: inherit; + vertical-align: 0.5; +} + +/* Element states */ +element.normal.normal { + background-color: @normal-background; + text-color: @normal-foreground; +} + +element.selected.normal { + background-color: @selected-normal-background; + text-color: @selected-normal-foreground; +} + +element.alternate.normal { + background-color: @alternate-normal-background; + text-color: @alternate-normal-foreground; +} + +element.normal.urgent { + background-color: @urgent-background; + text-color: @urgent-foreground; +} + +element.selected.urgent { + background-color: @selected-urgent-background; + text-color: @selected-urgent-foreground; +} + +element.alternate.urgent { + background-color: @alternate-urgent-background; + text-color: @alternate-urgent-foreground; +} + +element.normal.active { + background-color: @active-background; + text-color: @active-foreground; +} + +element.selected.active { + background-color: @selected-active-background; + text-color: @selected-active-foreground; +} + +element.alternate.active { + background-color: @alternate-active-background; + text-color: @alternate-active-foreground; +} + +/* Scrollbar */ +scrollbar { + width: 4px; /* Like rofidmenu */ + border: 0; + handle-color: @normal-foreground; + handle-width: 8px; + padding: 0; +} + +/* Input bar */ +inputbar { + spacing: 0; + text-color: @normal-foreground; + padding: 1px; + children: [ prompt,textbox-prompt-colon,entry,case-indicator ]; +} + +prompt { + spacing: 0; + text-color: @normal-foreground; +} + +textbox-prompt-colon { + expand: false; + str: ""; + margin: 0px 0.3em 0em 0em; + text-color: @normal-foreground; +} + +entry { + spacing: 0; + text-color: @normal-foreground; +} + +case-indicator { + spacing: 0; + text-color: @normal-foreground; +} + +message { + border: 2px 0px 0px; + border-color: @separatorcolor; + padding: 1px; +} + +textbox { + text-color: @foreground; +} + +mode-switcher { + border: 2px 0px 0px; + border-color: @separatorcolor; +} + +button { + spacing: 0; + text-color: @normal-foreground; +} + +button.selected { + background-color: @selected-normal-background; + text-color: @selected-normal-foreground; +} + +/*------------------------------------------------------- + * PREVIOUS CONFIGURATIONS (commented for reference) + *------------------------------------------------------- + * + * Ultra-compact version had: + * - Font: 8pt + * - Window padding: 10px + * - List lines: 12 + * - Element padding: 1px vertical + * - Spacing: 1px + * - Icons: disabled + * + * Current comfortable version: + * - Font: 10pt + * - Window padding: 30px (like rofidmenu) + * - List lines: 10 + * - Element padding: 3px + * - Spacing: 4px + * - Icons: enabled for images + */ diff --git a/rofi/.config/rofi/.bak/bak2/clipboard.rasi.20251203_221807 b/rofi/.config/rofi/.bak/bak2/clipboard.rasi.20251203_221807 new file mode 100644 index 0000000..bcccfff --- /dev/null +++ b/rofi/.config/rofi/.bak/bak2/clipboard.rasi.20251203_221807 @@ -0,0 +1,201 @@ +/******************************************************* + * CLIPBOARD MANAGER - With Images + *******************************************************/ +/* + * Clipboard theme with nice padding and image support + * - Normal font (10pt) + * - Comfortable padding (like rofidmenu) + * - Icons and images enabled + * - Clean and simple + */ + +configuration { + font: "Noto Sans Regular 10"; + show-icons: true; /* Enable icons for images */ + icon-theme: "Qogir"; + display-clipboard: " "; /* Clipboard icon restored */ + disable-history: false; + sidebar-mode: false; + kb-cancel: "Super+c,Escape"; +} + +/* Import base theme */ +@import "~/.config/rofi/config.rasi" + +/* Window - comfortable padding like rofidmenu */ +window { + background-color: @background; + border: 0; + padding: 30; /* Nice padding like rofidmenu */ + width: 50%; +} + +mainbox { + border: 0; + padding: 0; +} + +/* List view - compact vertical spacing */ +listview { + lines: 10; /* Show 10 entries */ + columns: 1; + fixed-height: 0; + border: 8px 0px 0px; /* Like rofidmenu */ + border-color: @separatorcolor; + scrollbar: true; + padding: 2px 0px 0px; + spacing: 2px; /* Reduced: was 4px, now 2px */ +} + +/* Element - compact vertical padding */ +element { + border: 0; + padding: 1px 3px; /* Reduced vertical: 1px top/bottom, 3px left/right (was 3px all) */ +} + +/* Icon configuration for images */ +element-icon { + size: 2em; /* Good size for image thumbnails */ + padding: 0 6px 0 0; /* Space between icon and text */ +} + +element-text { + background-color: inherit; + text-color: inherit; + vertical-align: 0.5; +} + +/* Element states */ +element.normal.normal { + background-color: @normal-background; + text-color: @normal-foreground; +} + +element.selected.normal { + background-color: @selected-normal-background; + text-color: @selected-normal-foreground; +} + +element.alternate.normal { + background-color: @alternate-normal-background; + text-color: @alternate-normal-foreground; +} + +element.normal.urgent { + background-color: @urgent-background; + text-color: @urgent-foreground; +} + +element.selected.urgent { + background-color: @selected-urgent-background; + text-color: @selected-urgent-foreground; +} + +element.alternate.urgent { + background-color: @alternate-urgent-background; + text-color: @alternate-urgent-foreground; +} + +element.normal.active { + background-color: @active-background; + text-color: @active-foreground; +} + +element.selected.active { + background-color: @selected-active-background; + text-color: @selected-active-foreground; +} + +element.alternate.active { + background-color: @alternate-active-background; + text-color: @alternate-active-foreground; +} + +/* Scrollbar */ +scrollbar { + width: 4px; /* Like rofidmenu */ + border: 0; + handle-color: @normal-foreground; + handle-width: 8px; + padding: 0; +} + +/* Input bar */ +inputbar { + spacing: 0; + text-color: @normal-foreground; + padding: 1px; + children: [ prompt,textbox-prompt-colon,entry,case-indicator ]; +} + +prompt { + spacing: 0; + text-color: @normal-foreground; +} + +textbox-prompt-colon { + expand: false; + str: ""; + margin: 0px 0.3em 0em 0em; + text-color: @normal-foreground; +} + +entry { + spacing: 0; + text-color: @normal-foreground; +} + +case-indicator { + spacing: 0; + text-color: @normal-foreground; +} + +message { + border: 2px 0px 0px; + border-color: @separatorcolor; + padding: 1px; +} + +textbox { + text-color: @foreground; +} + +mode-switcher { + border: 2px 0px 0px; + border-color: @separatorcolor; +} + +button { + spacing: 0; + text-color: @normal-foreground; +} + +button.selected { + background-color: @selected-normal-background; + text-color: @selected-normal-foreground; +} + +/*------------------------------------------------------- + * PREVIOUS CONFIGURATIONS (commented for reference) + *------------------------------------------------------- + * + * Ultra-compact version had: + * - Font: 8pt + * - Window padding: 10px + * - List lines: 12 + * - Element padding: 1px vertical + * - Spacing: 1px + * - Icons: disabled + * + * Comfortable version had: + * - Element padding: 3px all sides + * - Spacing: 4px + * + * Current version (compact vertical): + * - Font: 10pt + * - Window padding: 30px (like rofidmenu) + * - List lines: 10 + * - Element padding: 1px vertical, 3px horizontal + * - Spacing: 2px (smaller vertical gaps) + * - Icons: enabled for images + */ diff --git a/rofi/.config/rofi/.bak/clipboard-launcher-enhanced.sh.20251128_191045 b/rofi/.config/rofi/.bak/clipboard-launcher-enhanced.sh.20251128_191045 new file mode 100755 index 0000000..0c1589a --- /dev/null +++ b/rofi/.config/rofi/.bak/clipboard-launcher-enhanced.sh.20251128_191045 @@ -0,0 +1,278 @@ +#!/usr/bin/env bash +#============================================================================== +# Enhanced Greenclip Clipboard Manager with Image Support +#============================================================================== +# This script provides a fully-functional clipboard manager using rofi and +# greenclip, with proper support for both text and images. +# +# Features: +# - Displays clipboard history from greenclip +# - Shows image thumbnails for copied images +# - Truncates long text for readability +# - Properly pastes both text AND images back to clipboard +# - Handles greenclip's image format: "image/png Zen [hash]" +# +# Requirements: +# - rofi (with script mode and thumbnail support) +# - greenclip (clipboard manager daemon must be running) +# - xclip (for clipboard operations) +# - Image files stored in /tmp/greenclip/ (configured in greenclip.toml) +# +# How Greenclip Stores Images: +# 1. Text entries: Stored as-is in clipboard history +# 2. Image entries: Stored as "image/png Zen [hash]" in history +# 3. Actual PNG files: Saved to /tmp/greenclip/[hash].png +# 4. This script: Detects images, shows thumbnails, and restores them properly +#============================================================================== + +# Directory where greenclip caches image files +# IMPORTANT: This must match image_cache_directory in ~/.config/greenclip.toml +IMGDIR="/tmp/greenclip" + +# Maximum text length to display before truncating +MAX_TEXT_LENGTH=100 + +#------------------------------------------------------------------------------ +# clipboard_mode() - Main rofi script mode handler +#------------------------------------------------------------------------------ +# Called by rofi in two contexts: +# +# Context 1: ROFI_RETV=0 (Initial call) +# - Generate the menu items from greenclip history +# - Detect image vs text entries +# - Format with thumbnails and truncation +# - Store original content in info field for later retrieval +# +# Context 2: ROFI_RETV=1 (User selected item) +# - Receive selection via $ROFI_INFO +# - Determine if it's an image or text +# - Copy to clipboard appropriately (file for images, text for text) +#------------------------------------------------------------------------------ +clipboard_mode() { + if [ "$ROFI_RETV" = "0" ]; then + #---------------------------------------------------------------------- + # CONTEXT 1: Generate Menu Items + #---------------------------------------------------------------------- + + # Read clipboard history line by line from greenclip + greenclip print | while IFS= read -r line; do + + #------------------------------------------------------------------ + # IMAGE DETECTION AND DISPLAY + #------------------------------------------------------------------ + # Greenclip outputs image entries in format: "image/png Zen [hash]" + # We need to: + # 1. Detect these entries (starts with "image/") + # 2. Extract the hash/ID + # 3. Find the corresponding PNG file in IMGDIR + # 4. Display with thumbnail icon + #------------------------------------------------------------------ + + if [[ "$line" =~ ^image/png ]]; then + # This is an image entry! + + # Extract the hash from "image/png Zen [hash]" + # The hash is the last field (may be negative number) + hash=$(echo "$line" | awk '{print $NF}') + + # Construct the image file path + # Note: greenclip saves as [hash].png or [-hash].png + imgfile="$IMGDIR/${hash}.png" + + # Check if image file exists + if [ -f "$imgfile" ]; then + # Get just the filename for display + imgname=$(basename "$imgfile") + + # Display format for rofi: + # [display text] \0 icon \x1f [thumbnail path] \0 info \x1f [original line] + # + # Components: + # - Display: "🖼️ Image: filename.png" (what user sees) + # - Icon: thumbnail://path (shows image preview) + # - Info: original greenclip line (used for restoration) + printf '🖼️ Image: %s\0icon\x1fthumbnail://%s\0info\x1f%s\n' \ + "$imgname" \ + "$imgfile" \ + "$line" + else + # Image file not found, show as broken/missing + # Still preserve the original line in case file appears later + printf '🖼️ Image (missing): %s\0info\x1f%s\n' \ + "$hash" \ + "$line" + fi + + # Done processing this image entry, move to next line + continue + fi + + #------------------------------------------------------------------ + # TEXT ENTRY DISPLAY + #------------------------------------------------------------------ + # For regular text clipboard entries: + # 1. Truncate if too long (for display) + # 2. Preserve full original text in info field (for pasting) + #------------------------------------------------------------------ + + if [ ${#line} -gt $MAX_TEXT_LENGTH ]; then + # Text is long - truncate for display but preserve original + display_text="${line:0:$MAX_TEXT_LENGTH}..." + + # Format: [truncated text] \0 info \x1f [full original text] + # User sees truncated version, but pastes full version + printf '%s\0info\x1f%s\n' "$display_text" "$line" + else + # Text is short - can display as-is + # Still use info field for consistency in selection handling + printf '%s\0info\x1f%s\n' "$line" "$line" + fi + done + + else + #---------------------------------------------------------------------- + # CONTEXT 2: Handle User Selection + #---------------------------------------------------------------------- + # User selected an item. $ROFI_INFO contains the original content + # we stored in the info field during menu generation. + # + # We need to: + # 1. Check if selection is an image or text + # 2. For images: Copy the PNG file to clipboard + # 3. For text: Copy the text to clipboard + #---------------------------------------------------------------------- + + selection="$ROFI_INFO" + + #---------------------------------------------------------------------- + # IMAGE SELECTION HANDLING + #---------------------------------------------------------------------- + # Check if selected item is an image entry (starts with "image/png") + #---------------------------------------------------------------------- + if [[ "$selection" =~ ^image/png ]]; then + # This is an image! Extract hash and copy the actual PNG file + + # Parse hash from "image/png Zen [hash]" + hash=$(echo "$selection" | awk '{print $NF}') + + # Construct image file path + imgfile="$IMGDIR/${hash}.png" + + # Verify image file exists before copying + if [ -f "$imgfile" ]; then + # Copy the actual PNG file to clipboard as image data + # -selection clipboard: Use the standard clipboard (Ctrl+V) + # -t image/png: Set clipboard type to PNG image + # -i: Read from file + xclip -selection clipboard -t image/png -i "$imgfile" + + # Exit successfully - image is now in clipboard + exit 0 + else + # Image file not found - show error notification if dunstify available + if command -v dunstify &> /dev/null; then + dunstify -u critical "Clipboard Error" "Image file not found: $imgfile" + fi + # Exit with error code + exit 1 + fi + else + #------------------------------------------------------------------ + # TEXT SELECTION HANDLING + #------------------------------------------------------------------ + # This is regular text - copy to clipboard as text + #------------------------------------------------------------------ + + # Copy text directly to clipboard using xclip + # -selection clipboard: Use standard clipboard (Ctrl+V) + # -i: Read from stdin + # Using echo -n to avoid adding newline + echo -n "$selection" | xclip -selection clipboard + + # Exit successfully - text is now in clipboard + exit 0 + fi + fi +} + +#============================================================================== +# Export for rofi script mode +#============================================================================== +# Make function and variables available when rofi spawns this script +export -f clipboard_mode +export IMGDIR +export MAX_TEXT_LENGTH + +#============================================================================== +# MAIN SCRIPT ENTRY POINT +#============================================================================== +# Two execution modes based on ROFI_RETV environment variable: +# +# MODE 1: Direct execution (ROFI_RETV is unset/empty) +# - User ran this script from command line or keybind +# - Launch rofi with this script as the clipboard provider +# - Rofi will then call this script again in MODE 2 +# +# MODE 2: Called by rofi (ROFI_RETV is set) +# - Rofi is calling us to get menu items or handle selection +# - Call clipboard_mode() function to handle the request +#============================================================================== + +if [ -z "$ROFI_RETV" ]; then + #-------------------------------------------------------------------------- + # MODE 1: Launch rofi + #-------------------------------------------------------------------------- + + # Launch rofi with this script as the data source for "clipboard" mode + # + # Rofi parameters: + # -modi "clipboard:$0" + # Register "clipboard" mode that runs this script for data + # + # -show clipboard + # Display the clipboard mode immediately + # + # NO -run-command needed! + # The script handles clipboard copying internally for both text and images + # When user selects an item, rofi calls the script with ROFI_RETV=1 + # The script then copies to clipboard directly and exits + # + # -theme ... + # Custom theme file for visual styling + #-------------------------------------------------------------------------- + + rofi -modi "clipboard:$0" \ + -show clipboard \ + -theme ~/.config/rofi/clipboard.rasi + + # NOTE: All clipboard operations are handled inside clipboard_mode() + # when ROFI_RETV=1 (selection mode). No post-processing needed here. + +else + #-------------------------------------------------------------------------- + # MODE 2: Provide data to rofi or handle selection + #-------------------------------------------------------------------------- + + # Rofi is calling us - hand off to clipboard_mode function + clipboard_mode "$@" +fi + +#============================================================================== +# OLD/ALTERNATIVE APPROACHES (Commented out for reference) +#============================================================================== +# +# APPROACH 1: Using -run-command with xclip for text +# This was the old approach that didn't handle images properly: +# +# rofi -modi "clipboard:$0" \ +# -show clipboard \ +# -run-command 'echo -n {cmd} | xclip -selection clipboard' \ +# -theme ~/.config/rofi/clipboard.rasi +# +# PROBLEM: This pipes ALL selections (including "image/png Zen [hash]" text) +# to xclip as text, which doesn't restore the actual image to clipboard. +# +# SOLUTION: Handle image copying inside the script, before rofi's -run-command, +# by detecting image format and using xclip with -t image/png and the file. +# +#============================================================================== diff --git a/rofi/.config/rofi/.bak/clipboard-launcher-enhanced.sh.20251203_223308 b/rofi/.config/rofi/.bak/clipboard-launcher-enhanced.sh.20251203_223308 new file mode 100755 index 0000000..0c1589a --- /dev/null +++ b/rofi/.config/rofi/.bak/clipboard-launcher-enhanced.sh.20251203_223308 @@ -0,0 +1,278 @@ +#!/usr/bin/env bash +#============================================================================== +# Enhanced Greenclip Clipboard Manager with Image Support +#============================================================================== +# This script provides a fully-functional clipboard manager using rofi and +# greenclip, with proper support for both text and images. +# +# Features: +# - Displays clipboard history from greenclip +# - Shows image thumbnails for copied images +# - Truncates long text for readability +# - Properly pastes both text AND images back to clipboard +# - Handles greenclip's image format: "image/png Zen [hash]" +# +# Requirements: +# - rofi (with script mode and thumbnail support) +# - greenclip (clipboard manager daemon must be running) +# - xclip (for clipboard operations) +# - Image files stored in /tmp/greenclip/ (configured in greenclip.toml) +# +# How Greenclip Stores Images: +# 1. Text entries: Stored as-is in clipboard history +# 2. Image entries: Stored as "image/png Zen [hash]" in history +# 3. Actual PNG files: Saved to /tmp/greenclip/[hash].png +# 4. This script: Detects images, shows thumbnails, and restores them properly +#============================================================================== + +# Directory where greenclip caches image files +# IMPORTANT: This must match image_cache_directory in ~/.config/greenclip.toml +IMGDIR="/tmp/greenclip" + +# Maximum text length to display before truncating +MAX_TEXT_LENGTH=100 + +#------------------------------------------------------------------------------ +# clipboard_mode() - Main rofi script mode handler +#------------------------------------------------------------------------------ +# Called by rofi in two contexts: +# +# Context 1: ROFI_RETV=0 (Initial call) +# - Generate the menu items from greenclip history +# - Detect image vs text entries +# - Format with thumbnails and truncation +# - Store original content in info field for later retrieval +# +# Context 2: ROFI_RETV=1 (User selected item) +# - Receive selection via $ROFI_INFO +# - Determine if it's an image or text +# - Copy to clipboard appropriately (file for images, text for text) +#------------------------------------------------------------------------------ +clipboard_mode() { + if [ "$ROFI_RETV" = "0" ]; then + #---------------------------------------------------------------------- + # CONTEXT 1: Generate Menu Items + #---------------------------------------------------------------------- + + # Read clipboard history line by line from greenclip + greenclip print | while IFS= read -r line; do + + #------------------------------------------------------------------ + # IMAGE DETECTION AND DISPLAY + #------------------------------------------------------------------ + # Greenclip outputs image entries in format: "image/png Zen [hash]" + # We need to: + # 1. Detect these entries (starts with "image/") + # 2. Extract the hash/ID + # 3. Find the corresponding PNG file in IMGDIR + # 4. Display with thumbnail icon + #------------------------------------------------------------------ + + if [[ "$line" =~ ^image/png ]]; then + # This is an image entry! + + # Extract the hash from "image/png Zen [hash]" + # The hash is the last field (may be negative number) + hash=$(echo "$line" | awk '{print $NF}') + + # Construct the image file path + # Note: greenclip saves as [hash].png or [-hash].png + imgfile="$IMGDIR/${hash}.png" + + # Check if image file exists + if [ -f "$imgfile" ]; then + # Get just the filename for display + imgname=$(basename "$imgfile") + + # Display format for rofi: + # [display text] \0 icon \x1f [thumbnail path] \0 info \x1f [original line] + # + # Components: + # - Display: "🖼️ Image: filename.png" (what user sees) + # - Icon: thumbnail://path (shows image preview) + # - Info: original greenclip line (used for restoration) + printf '🖼️ Image: %s\0icon\x1fthumbnail://%s\0info\x1f%s\n' \ + "$imgname" \ + "$imgfile" \ + "$line" + else + # Image file not found, show as broken/missing + # Still preserve the original line in case file appears later + printf '🖼️ Image (missing): %s\0info\x1f%s\n' \ + "$hash" \ + "$line" + fi + + # Done processing this image entry, move to next line + continue + fi + + #------------------------------------------------------------------ + # TEXT ENTRY DISPLAY + #------------------------------------------------------------------ + # For regular text clipboard entries: + # 1. Truncate if too long (for display) + # 2. Preserve full original text in info field (for pasting) + #------------------------------------------------------------------ + + if [ ${#line} -gt $MAX_TEXT_LENGTH ]; then + # Text is long - truncate for display but preserve original + display_text="${line:0:$MAX_TEXT_LENGTH}..." + + # Format: [truncated text] \0 info \x1f [full original text] + # User sees truncated version, but pastes full version + printf '%s\0info\x1f%s\n' "$display_text" "$line" + else + # Text is short - can display as-is + # Still use info field for consistency in selection handling + printf '%s\0info\x1f%s\n' "$line" "$line" + fi + done + + else + #---------------------------------------------------------------------- + # CONTEXT 2: Handle User Selection + #---------------------------------------------------------------------- + # User selected an item. $ROFI_INFO contains the original content + # we stored in the info field during menu generation. + # + # We need to: + # 1. Check if selection is an image or text + # 2. For images: Copy the PNG file to clipboard + # 3. For text: Copy the text to clipboard + #---------------------------------------------------------------------- + + selection="$ROFI_INFO" + + #---------------------------------------------------------------------- + # IMAGE SELECTION HANDLING + #---------------------------------------------------------------------- + # Check if selected item is an image entry (starts with "image/png") + #---------------------------------------------------------------------- + if [[ "$selection" =~ ^image/png ]]; then + # This is an image! Extract hash and copy the actual PNG file + + # Parse hash from "image/png Zen [hash]" + hash=$(echo "$selection" | awk '{print $NF}') + + # Construct image file path + imgfile="$IMGDIR/${hash}.png" + + # Verify image file exists before copying + if [ -f "$imgfile" ]; then + # Copy the actual PNG file to clipboard as image data + # -selection clipboard: Use the standard clipboard (Ctrl+V) + # -t image/png: Set clipboard type to PNG image + # -i: Read from file + xclip -selection clipboard -t image/png -i "$imgfile" + + # Exit successfully - image is now in clipboard + exit 0 + else + # Image file not found - show error notification if dunstify available + if command -v dunstify &> /dev/null; then + dunstify -u critical "Clipboard Error" "Image file not found: $imgfile" + fi + # Exit with error code + exit 1 + fi + else + #------------------------------------------------------------------ + # TEXT SELECTION HANDLING + #------------------------------------------------------------------ + # This is regular text - copy to clipboard as text + #------------------------------------------------------------------ + + # Copy text directly to clipboard using xclip + # -selection clipboard: Use standard clipboard (Ctrl+V) + # -i: Read from stdin + # Using echo -n to avoid adding newline + echo -n "$selection" | xclip -selection clipboard + + # Exit successfully - text is now in clipboard + exit 0 + fi + fi +} + +#============================================================================== +# Export for rofi script mode +#============================================================================== +# Make function and variables available when rofi spawns this script +export -f clipboard_mode +export IMGDIR +export MAX_TEXT_LENGTH + +#============================================================================== +# MAIN SCRIPT ENTRY POINT +#============================================================================== +# Two execution modes based on ROFI_RETV environment variable: +# +# MODE 1: Direct execution (ROFI_RETV is unset/empty) +# - User ran this script from command line or keybind +# - Launch rofi with this script as the clipboard provider +# - Rofi will then call this script again in MODE 2 +# +# MODE 2: Called by rofi (ROFI_RETV is set) +# - Rofi is calling us to get menu items or handle selection +# - Call clipboard_mode() function to handle the request +#============================================================================== + +if [ -z "$ROFI_RETV" ]; then + #-------------------------------------------------------------------------- + # MODE 1: Launch rofi + #-------------------------------------------------------------------------- + + # Launch rofi with this script as the data source for "clipboard" mode + # + # Rofi parameters: + # -modi "clipboard:$0" + # Register "clipboard" mode that runs this script for data + # + # -show clipboard + # Display the clipboard mode immediately + # + # NO -run-command needed! + # The script handles clipboard copying internally for both text and images + # When user selects an item, rofi calls the script with ROFI_RETV=1 + # The script then copies to clipboard directly and exits + # + # -theme ... + # Custom theme file for visual styling + #-------------------------------------------------------------------------- + + rofi -modi "clipboard:$0" \ + -show clipboard \ + -theme ~/.config/rofi/clipboard.rasi + + # NOTE: All clipboard operations are handled inside clipboard_mode() + # when ROFI_RETV=1 (selection mode). No post-processing needed here. + +else + #-------------------------------------------------------------------------- + # MODE 2: Provide data to rofi or handle selection + #-------------------------------------------------------------------------- + + # Rofi is calling us - hand off to clipboard_mode function + clipboard_mode "$@" +fi + +#============================================================================== +# OLD/ALTERNATIVE APPROACHES (Commented out for reference) +#============================================================================== +# +# APPROACH 1: Using -run-command with xclip for text +# This was the old approach that didn't handle images properly: +# +# rofi -modi "clipboard:$0" \ +# -show clipboard \ +# -run-command 'echo -n {cmd} | xclip -selection clipboard' \ +# -theme ~/.config/rofi/clipboard.rasi +# +# PROBLEM: This pipes ALL selections (including "image/png Zen [hash]" text) +# to xclip as text, which doesn't restore the actual image to clipboard. +# +# SOLUTION: Handle image copying inside the script, before rofi's -run-command, +# by detecting image format and using xclip with -t image/png and the file. +# +#============================================================================== diff --git a/rofi/.config/rofi/.bak/clipboard-launcher-enhanced.sh.20251203_223628 b/rofi/.config/rofi/.bak/clipboard-launcher-enhanced.sh.20251203_223628 new file mode 100755 index 0000000..0c1589a --- /dev/null +++ b/rofi/.config/rofi/.bak/clipboard-launcher-enhanced.sh.20251203_223628 @@ -0,0 +1,278 @@ +#!/usr/bin/env bash +#============================================================================== +# Enhanced Greenclip Clipboard Manager with Image Support +#============================================================================== +# This script provides a fully-functional clipboard manager using rofi and +# greenclip, with proper support for both text and images. +# +# Features: +# - Displays clipboard history from greenclip +# - Shows image thumbnails for copied images +# - Truncates long text for readability +# - Properly pastes both text AND images back to clipboard +# - Handles greenclip's image format: "image/png Zen [hash]" +# +# Requirements: +# - rofi (with script mode and thumbnail support) +# - greenclip (clipboard manager daemon must be running) +# - xclip (for clipboard operations) +# - Image files stored in /tmp/greenclip/ (configured in greenclip.toml) +# +# How Greenclip Stores Images: +# 1. Text entries: Stored as-is in clipboard history +# 2. Image entries: Stored as "image/png Zen [hash]" in history +# 3. Actual PNG files: Saved to /tmp/greenclip/[hash].png +# 4. This script: Detects images, shows thumbnails, and restores them properly +#============================================================================== + +# Directory where greenclip caches image files +# IMPORTANT: This must match image_cache_directory in ~/.config/greenclip.toml +IMGDIR="/tmp/greenclip" + +# Maximum text length to display before truncating +MAX_TEXT_LENGTH=100 + +#------------------------------------------------------------------------------ +# clipboard_mode() - Main rofi script mode handler +#------------------------------------------------------------------------------ +# Called by rofi in two contexts: +# +# Context 1: ROFI_RETV=0 (Initial call) +# - Generate the menu items from greenclip history +# - Detect image vs text entries +# - Format with thumbnails and truncation +# - Store original content in info field for later retrieval +# +# Context 2: ROFI_RETV=1 (User selected item) +# - Receive selection via $ROFI_INFO +# - Determine if it's an image or text +# - Copy to clipboard appropriately (file for images, text for text) +#------------------------------------------------------------------------------ +clipboard_mode() { + if [ "$ROFI_RETV" = "0" ]; then + #---------------------------------------------------------------------- + # CONTEXT 1: Generate Menu Items + #---------------------------------------------------------------------- + + # Read clipboard history line by line from greenclip + greenclip print | while IFS= read -r line; do + + #------------------------------------------------------------------ + # IMAGE DETECTION AND DISPLAY + #------------------------------------------------------------------ + # Greenclip outputs image entries in format: "image/png Zen [hash]" + # We need to: + # 1. Detect these entries (starts with "image/") + # 2. Extract the hash/ID + # 3. Find the corresponding PNG file in IMGDIR + # 4. Display with thumbnail icon + #------------------------------------------------------------------ + + if [[ "$line" =~ ^image/png ]]; then + # This is an image entry! + + # Extract the hash from "image/png Zen [hash]" + # The hash is the last field (may be negative number) + hash=$(echo "$line" | awk '{print $NF}') + + # Construct the image file path + # Note: greenclip saves as [hash].png or [-hash].png + imgfile="$IMGDIR/${hash}.png" + + # Check if image file exists + if [ -f "$imgfile" ]; then + # Get just the filename for display + imgname=$(basename "$imgfile") + + # Display format for rofi: + # [display text] \0 icon \x1f [thumbnail path] \0 info \x1f [original line] + # + # Components: + # - Display: "🖼️ Image: filename.png" (what user sees) + # - Icon: thumbnail://path (shows image preview) + # - Info: original greenclip line (used for restoration) + printf '🖼️ Image: %s\0icon\x1fthumbnail://%s\0info\x1f%s\n' \ + "$imgname" \ + "$imgfile" \ + "$line" + else + # Image file not found, show as broken/missing + # Still preserve the original line in case file appears later + printf '🖼️ Image (missing): %s\0info\x1f%s\n' \ + "$hash" \ + "$line" + fi + + # Done processing this image entry, move to next line + continue + fi + + #------------------------------------------------------------------ + # TEXT ENTRY DISPLAY + #------------------------------------------------------------------ + # For regular text clipboard entries: + # 1. Truncate if too long (for display) + # 2. Preserve full original text in info field (for pasting) + #------------------------------------------------------------------ + + if [ ${#line} -gt $MAX_TEXT_LENGTH ]; then + # Text is long - truncate for display but preserve original + display_text="${line:0:$MAX_TEXT_LENGTH}..." + + # Format: [truncated text] \0 info \x1f [full original text] + # User sees truncated version, but pastes full version + printf '%s\0info\x1f%s\n' "$display_text" "$line" + else + # Text is short - can display as-is + # Still use info field for consistency in selection handling + printf '%s\0info\x1f%s\n' "$line" "$line" + fi + done + + else + #---------------------------------------------------------------------- + # CONTEXT 2: Handle User Selection + #---------------------------------------------------------------------- + # User selected an item. $ROFI_INFO contains the original content + # we stored in the info field during menu generation. + # + # We need to: + # 1. Check if selection is an image or text + # 2. For images: Copy the PNG file to clipboard + # 3. For text: Copy the text to clipboard + #---------------------------------------------------------------------- + + selection="$ROFI_INFO" + + #---------------------------------------------------------------------- + # IMAGE SELECTION HANDLING + #---------------------------------------------------------------------- + # Check if selected item is an image entry (starts with "image/png") + #---------------------------------------------------------------------- + if [[ "$selection" =~ ^image/png ]]; then + # This is an image! Extract hash and copy the actual PNG file + + # Parse hash from "image/png Zen [hash]" + hash=$(echo "$selection" | awk '{print $NF}') + + # Construct image file path + imgfile="$IMGDIR/${hash}.png" + + # Verify image file exists before copying + if [ -f "$imgfile" ]; then + # Copy the actual PNG file to clipboard as image data + # -selection clipboard: Use the standard clipboard (Ctrl+V) + # -t image/png: Set clipboard type to PNG image + # -i: Read from file + xclip -selection clipboard -t image/png -i "$imgfile" + + # Exit successfully - image is now in clipboard + exit 0 + else + # Image file not found - show error notification if dunstify available + if command -v dunstify &> /dev/null; then + dunstify -u critical "Clipboard Error" "Image file not found: $imgfile" + fi + # Exit with error code + exit 1 + fi + else + #------------------------------------------------------------------ + # TEXT SELECTION HANDLING + #------------------------------------------------------------------ + # This is regular text - copy to clipboard as text + #------------------------------------------------------------------ + + # Copy text directly to clipboard using xclip + # -selection clipboard: Use standard clipboard (Ctrl+V) + # -i: Read from stdin + # Using echo -n to avoid adding newline + echo -n "$selection" | xclip -selection clipboard + + # Exit successfully - text is now in clipboard + exit 0 + fi + fi +} + +#============================================================================== +# Export for rofi script mode +#============================================================================== +# Make function and variables available when rofi spawns this script +export -f clipboard_mode +export IMGDIR +export MAX_TEXT_LENGTH + +#============================================================================== +# MAIN SCRIPT ENTRY POINT +#============================================================================== +# Two execution modes based on ROFI_RETV environment variable: +# +# MODE 1: Direct execution (ROFI_RETV is unset/empty) +# - User ran this script from command line or keybind +# - Launch rofi with this script as the clipboard provider +# - Rofi will then call this script again in MODE 2 +# +# MODE 2: Called by rofi (ROFI_RETV is set) +# - Rofi is calling us to get menu items or handle selection +# - Call clipboard_mode() function to handle the request +#============================================================================== + +if [ -z "$ROFI_RETV" ]; then + #-------------------------------------------------------------------------- + # MODE 1: Launch rofi + #-------------------------------------------------------------------------- + + # Launch rofi with this script as the data source for "clipboard" mode + # + # Rofi parameters: + # -modi "clipboard:$0" + # Register "clipboard" mode that runs this script for data + # + # -show clipboard + # Display the clipboard mode immediately + # + # NO -run-command needed! + # The script handles clipboard copying internally for both text and images + # When user selects an item, rofi calls the script with ROFI_RETV=1 + # The script then copies to clipboard directly and exits + # + # -theme ... + # Custom theme file for visual styling + #-------------------------------------------------------------------------- + + rofi -modi "clipboard:$0" \ + -show clipboard \ + -theme ~/.config/rofi/clipboard.rasi + + # NOTE: All clipboard operations are handled inside clipboard_mode() + # when ROFI_RETV=1 (selection mode). No post-processing needed here. + +else + #-------------------------------------------------------------------------- + # MODE 2: Provide data to rofi or handle selection + #-------------------------------------------------------------------------- + + # Rofi is calling us - hand off to clipboard_mode function + clipboard_mode "$@" +fi + +#============================================================================== +# OLD/ALTERNATIVE APPROACHES (Commented out for reference) +#============================================================================== +# +# APPROACH 1: Using -run-command with xclip for text +# This was the old approach that didn't handle images properly: +# +# rofi -modi "clipboard:$0" \ +# -show clipboard \ +# -run-command 'echo -n {cmd} | xclip -selection clipboard' \ +# -theme ~/.config/rofi/clipboard.rasi +# +# PROBLEM: This pipes ALL selections (including "image/png Zen [hash]" text) +# to xclip as text, which doesn't restore the actual image to clipboard. +# +# SOLUTION: Handle image copying inside the script, before rofi's -run-command, +# by detecting image format and using xclip with -t image/png and the file. +# +#============================================================================== diff --git a/rofi/.config/rofi/.bak/clipboard-launcher.sh.20251128_191045 b/rofi/.config/rofi/.bak/clipboard-launcher.sh.20251128_191045 new file mode 100755 index 0000000..b26ad74 --- /dev/null +++ b/rofi/.config/rofi/.bak/clipboard-launcher.sh.20251128_191045 @@ -0,0 +1,25 @@ +#!/usr/bin/env bash +#============================================================================== +# Ultra-Simple Clipboard Launcher +#============================================================================== +# Displays greenclip clipboard history in rofi +# When you select an item, it copies to clipboard +# No images, no complexity, just works. +#============================================================================== + +# Simple approach: pipe greenclip history to rofi, then to xclip +greenclip print | rofi -dmenu -i -p " " -theme ~/.config/rofi/clipboard.rasi | xclip -selection clipboard + +# How it works: +# 1. greenclip print - Get all clipboard history +# 2. rofi -dmenu -i -p "..." - Show in rofi, case-insensitive search +# 3. User selects item +# 4. xclip -selection clipboard - Copy selection to clipboard + +#============================================================================== +# OLD VERSION (commented out - was more complex) +#============================================================================== +# rofi -modi "clipboard:greenclip print" \ +# -show clipboard \ +# -run-command 'echo -n {cmd} | xclip -selection clipboard' \ +# -theme ~/.config/rofi/clipboard.rasi diff --git a/rofi/.config/rofi/.bak/clipboard-launcher.sh.20251128_191729 b/rofi/.config/rofi/.bak/clipboard-launcher.sh.20251128_191729 new file mode 100755 index 0000000..f8bad9d --- /dev/null +++ b/rofi/.config/rofi/.bak/clipboard-launcher.sh.20251128_191729 @@ -0,0 +1,65 @@ +#!/usr/bin/env bash +#============================================================================== +# Simple Clipboard Launcher with Image Support +#============================================================================== +# Displays greenclip clipboard history in rofi +# Handles both text and images +# Simple and clean - no unnecessary complexity +#============================================================================== + +# Directory where greenclip stores image files +IMGDIR="/tmp/greenclip" + +# Show clipboard history in rofi and capture selection +selection=$(greenclip print | rofi -dmenu -i -p " " -theme ~/.config/rofi/clipboard.rasi) + +# Exit if nothing selected (user pressed Escape) +[ -z "$selection" ] && exit 0 + +#============================================================================== +# Handle the selection - check if image or text +#============================================================================== + +if [[ "$selection" =~ ^image/png ]]; then + #-------------------------------------------------------------------------- + # IMAGE HANDLING - Simple approach + #-------------------------------------------------------------------------- + # Greenclip stores images as: "image/png Zen [hash]" + # Extract the hash and copy the actual PNG file + + # Extract hash (last word in the line) + hash=$(echo "$selection" | awk '{print $NF}') + + # Construct image file path + imgfile="$IMGDIR/${hash}.png" + + # Copy image file to clipboard if it exists + if [ -f "$imgfile" ]; then + xclip -selection clipboard -t image/png -i "$imgfile" + else + # Image file not found - show notification if dunstify available + if command -v dunstify &> /dev/null; then + dunstify -u normal "Clipboard" "Image file not found" + fi + fi +else + #-------------------------------------------------------------------------- + # TEXT HANDLING - Simple approach + #-------------------------------------------------------------------------- + # Just copy the text to clipboard + + echo -n "$selection" | xclip -selection clipboard +fi + +#============================================================================== +# OLD VERSIONS (commented out for reference) +#============================================================================== + +# VERSION 1: Ultra-simple (no image support) +# greenclip print | rofi -dmenu -i -p " " -theme ~/.config/rofi/clipboard.rasi | xclip -selection clipboard + +# VERSION 2: Using rofi modi (was more complex and buggy) +# rofi -modi "clipboard:greenclip print" \ +# -show clipboard \ +# -run-command 'echo -n {cmd} | xclip -selection clipboard' \ +# -theme ~/.config/rofi/clipboard.rasi diff --git a/rofi/.config/rofi/.bak/clipboard-launcher.sh.20251128_192345 b/rofi/.config/rofi/.bak/clipboard-launcher.sh.20251128_192345 new file mode 100755 index 0000000..7961bb6 --- /dev/null +++ b/rofi/.config/rofi/.bak/clipboard-launcher.sh.20251128_192345 @@ -0,0 +1,109 @@ +#!/usr/bin/env bash +#============================================================================== +# Simple Clipboard Launcher with Image Thumbnails +#============================================================================== +# Shows clipboard history with image thumbnails +# Simple script mode implementation - easy to understand and debug +#============================================================================== + +# Directory where greenclip stores image files +IMGDIR="/tmp/greenclip" + +#------------------------------------------------------------------------------ +# clipboard_mode() - Handles rofi script mode +#------------------------------------------------------------------------------ +# Two modes: +# 1. ROFI_RETV=0: Show menu items (with thumbnails for images) +# 2. ROFI_RETV=1: Handle selection (copy to clipboard) +#------------------------------------------------------------------------------ +clipboard_mode() { + if [ "$ROFI_RETV" = "0" ]; then + #---------------------------------------------------------------------- + # Show clipboard entries + #---------------------------------------------------------------------- + greenclip print | while IFS= read -r line; do + + # Check if this is an image entry + if [[ "$line" =~ ^image/png ]]; then + # Extract hash from "image/png Zen [hash]" + hash=$(echo "$line" | awk '{print $NF}') + imgfile="$IMGDIR/${hash}.png" + + # Show with thumbnail if file exists + if [ -f "$imgfile" ]; then + # Format: display_text \0 icon \x1f thumbnail://path \0 info \x1f original_line + # Display: Keep original text simple + # Icon: Show thumbnail + # Info: Store original line for later + printf 'Image: %s\0icon\x1fthumbnail://%s\0info\x1f%s\n' \ + "$(basename "$imgfile")" \ + "$imgfile" \ + "$line" + else + # Image file missing - show without thumbnail + printf '%s\0info\x1f%s\n' "$line" "$line" + fi + else + # Regular text entry - show as-is + # Store in info field for consistent handling + printf '%s\0info\x1f%s\n' "$line" "$line" + fi + done + + else + #---------------------------------------------------------------------- + # Handle selection - copy to clipboard + #---------------------------------------------------------------------- + # $ROFI_INFO contains the original greenclip line + selection="$ROFI_INFO" + + if [[ "$selection" =~ ^image/png ]]; then + # Copy image file to clipboard + hash=$(echo "$selection" | awk '{print $NF}') + imgfile="$IMGDIR/${hash}.png" + + if [ -f "$imgfile" ]; then + xclip -selection clipboard -t image/png -i "$imgfile" + fi + else + # Copy text to clipboard + echo -n "$selection" | xclip -selection clipboard + fi + fi +} + +# Export function for rofi script mode +export -f clipboard_mode +export IMGDIR + +#------------------------------------------------------------------------------ +# Main entry point +#------------------------------------------------------------------------------ +if [ -z "$ROFI_RETV" ]; then + # User running script directly - launch rofi + rofi -modi "clipboard:$0" \ + -show clipboard \ + -theme ~/.config/rofi/clipboard.rasi +else + # Rofi calling script - handle request + clipboard_mode "$@" +fi + +#============================================================================== +# OLD VERSIONS (commented for reference) +#============================================================================== + +# VERSION 1: Simple dmenu without thumbnails (worked for selection) +# IMGDIR="/tmp/greenclip" +# selection=$(greenclip print | rofi -dmenu -i -p " " -theme ~/.config/rofi/clipboard.rasi) +# [ -z "$selection" ] && exit 0 +# if [[ "$selection" =~ ^image/png ]]; then +# hash=$(echo "$selection" | awk '{print $NF}') +# imgfile="$IMGDIR/${hash}.png" +# [ -f "$imgfile" ] && xclip -selection clipboard -t image/png -i "$imgfile" +# else +# echo -n "$selection" | xclip -selection clipboard +# fi + +# VERSION 2: Complex version with lots of features (was buggy) +# [See clipboard-launcher-enhanced.sh for reference] diff --git a/rofi/.config/rofi/.bak/clipboard-launcher.sh.20251203_222516 b/rofi/.config/rofi/.bak/clipboard-launcher.sh.20251203_222516 new file mode 100755 index 0000000..3331159 --- /dev/null +++ b/rofi/.config/rofi/.bak/clipboard-launcher.sh.20251203_222516 @@ -0,0 +1,58 @@ +#!/usr/bin/env bash +#============================================================================== +# Ultra-Simple Text-Only Clipboard Launcher +#============================================================================== +# NO images, NO thumbnails, NO script mode - just text clipboard +# This is the absolute simplest version that should never crash +#============================================================================== + +# Simple one-liner: show greenclip history, copy selection to clipboard +greenclip print | rofi -dmenu -i -p " " -theme ~/.config/rofi/clipboard.rasi | xclip -selection clipboard + +#============================================================================== +# OLD COMPLEX VERSIONS (commented out - they caused crashes) +#============================================================================== + +# VERSION WITH SCRIPT MODE (was crashing): +# IMGDIR="/tmp/greenclip" +# +# clipboard_mode() { +# if [ "$ROFI_RETV" = "0" ]; then +# greenclip print | while IFS= read -r line; do +# if [[ "$line" =~ ^image/png ]]; then +# hash=$(echo "$line" | awk '{print $NF}') +# imgfile="$IMGDIR/${hash}.png" +# if [ -f "$imgfile" ]; then +# printf '[IMAGE] %s\0info\x1f%s\n' "$(basename "$imgfile")" "$line" +# fi +# else +# printf '%s\0info\x1f%s\n' "$line" "$line" +# fi +# done +# else +# selection="$ROFI_INFO" +# [ -z "$selection" ] && exit 0 +# if [[ "$selection" =~ ^image/png ]]; then +# hash=$(echo "$selection" | awk '{print $NF}') +# imgfile="$IMGDIR/${hash}.png" +# if [ -f "$imgfile" ] && [ -r "$imgfile" ]; then +# xclip -selection clipboard -t image/png -i "$imgfile" 2>/dev/null +# fi +# else +# echo -n "$selection" | xclip -selection clipboard 2>/dev/null +# fi +# exit 0 +# fi +# } +# +# export -f clipboard_mode +# export IMGDIR +# +# if [ -z "$ROFI_RETV" ]; then +# rofi -modi "clipboard:$0" -show clipboard -theme ~/.config/rofi/clipboard.rasi +# else +# clipboard_mode "$@" +# fi + +# VERSION WITH THUMBNAILS (crashed even more): +# [See backup files for reference] diff --git a/rofi/.config/rofi/.bak/clipboard-launcher.sh.20251203_222912 b/rofi/.config/rofi/.bak/clipboard-launcher.sh.20251203_222912 new file mode 100755 index 0000000..1084295 --- /dev/null +++ b/rofi/.config/rofi/.bak/clipboard-launcher.sh.20251203_222912 @@ -0,0 +1,59 @@ +#!/usr/bin/env bash +#============================================================================== +# Ultra-Simple Text-Only Clipboard Launcher +#============================================================================== +# NO images, NO thumbnails, NO script mode - just text clipboard +# This is the absolute simplest version that should never crash +#============================================================================== + +# Simple one-liner: show greenclip history, copy selection to clipboard +# -p " " sets the prompt with clipboard icon +greenclip print | rofi -dmenu -i -p " " -theme ~/.config/rofi/clipboard.rasi | xclip -selection clipboard + +#============================================================================== +# OLD COMPLEX VERSIONS (commented out - they caused crashes) +#============================================================================== + +# VERSION WITH SCRIPT MODE (was crashing): +# IMGDIR="/tmp/greenclip" +# +# clipboard_mode() { +# if [ "$ROFI_RETV" = "0" ]; then +# greenclip print | while IFS= read -r line; do +# if [[ "$line" =~ ^image/png ]]; then +# hash=$(echo "$line" | awk '{print $NF}') +# imgfile="$IMGDIR/${hash}.png" +# if [ -f "$imgfile" ]; then +# printf '[IMAGE] %s\0info\x1f%s\n' "$(basename "$imgfile")" "$line" +# fi +# else +# printf '%s\0info\x1f%s\n' "$line" "$line" +# fi +# done +# else +# selection="$ROFI_INFO" +# [ -z "$selection" ] && exit 0 +# if [[ "$selection" =~ ^image/png ]]; then +# hash=$(echo "$selection" | awk '{print $NF}') +# imgfile="$IMGDIR/${hash}.png" +# if [ -f "$imgfile" ] && [ -r "$imgfile" ]; then +# xclip -selection clipboard -t image/png -i "$imgfile" 2>/dev/null +# fi +# else +# echo -n "$selection" | xclip -selection clipboard 2>/dev/null +# fi +# exit 0 +# fi +# } +# +# export -f clipboard_mode +# export IMGDIR +# +# if [ -z "$ROFI_RETV" ]; then +# rofi -modi "clipboard:$0" -show clipboard -theme ~/.config/rofi/clipboard.rasi +# else +# clipboard_mode "$@" +# fi + +# VERSION WITH THUMBNAILS (crashed even more): +# [See backup files for reference] diff --git a/rofi/.config/rofi/.bak/clipboard.rasi.20251128_191045 b/rofi/.config/rofi/.bak/clipboard.rasi.20251128_191045 new file mode 100644 index 0000000..fc9ae01 --- /dev/null +++ b/rofi/.config/rofi/.bak/clipboard.rasi.20251128_191045 @@ -0,0 +1,187 @@ +/******************************************************* + * CLIPBOARD MANAGER - Simple & Compact + *******************************************************/ +/* + * Ultra-compact theme for text-only clipboard + * - Small font (8pt) + * - Minimal padding + * - No images + * - Shows more entries + */ + +configuration { + font: "Noto Sans Regular 10"; /* Smaller font */ + show-icons: false; /* No icons for compact view */ + display-clipboard: " "; + disable-history: false; + sidebar-mode: false; + kb-cancel: "Super+c,Escape"; +} + +/* Import base theme */ +@import "~/.config/rofi/config.rasi" + +/* Window - compact with minimal padding */ +window { + background-color: @background; + border: 0; + padding: 10; /* Minimal padding (was 30) */ + width: 50%; +} + +mainbox { + border: 0; + padding: 0; +} + +/* List view - show more entries, minimal spacing */ +listview { + lines: 12; /* Show more entries (was 8) */ + columns: 1; + fixed-height: 0; + border: 4px 0px 0px; /* Thinner border (was 8px) */ + border-color: @separatorcolor; + scrollbar: true; + padding: 0; /* No padding */ + spacing: 1px; /* Minimal spacing (was 2px) */ +} + +/* Element - minimal vertical padding */ +element { + border: 0; + padding: 1px 4px; /* Very compact: 1px vertical, 4px horizontal */ +} + +/* No icons, but keep config for compatibility */ +/* element-icon { */ +/* size: 0em; */ +/* padding: 0; */ +/* } */ + +element-text { + background-color: inherit; + text-color: inherit; + vertical-align: 0.5; +} + +/* Element states */ +element.normal.normal { + background-color: @normal-background; + text-color: @normal-foreground; +} + +element.selected.normal { + background-color: @selected-normal-background; + text-color: @selected-normal-foreground; +} + +element.alternate.normal { + background-color: @alternate-normal-background; + text-color: @alternate-normal-foreground; +} + +element.normal.urgent { + background-color: @urgent-background; + text-color: @urgent-foreground; +} + +element.selected.urgent { + background-color: @selected-urgent-background; + text-color: @selected-urgent-foreground; +} + +element.alternate.urgent { + background-color: @alternate-urgent-background; + text-color: @alternate-urgent-foreground; +} + +element.normal.active { + background-color: @active-background; + text-color: @active-foreground; +} + +element.selected.active { + background-color: @selected-active-background; + text-color: @selected-active-foreground; +} + +element.alternate.active { + background-color: @alternate-active-background; + text-color: @alternate-active-foreground; +} + +/* Thin scrollbar */ +scrollbar { + width: 3px; /* Thinner (was 4px) */ + border: 0; + handle-color: @normal-foreground; + handle-width: 6px; + padding: 0; +} + +/* Input bar - minimal padding */ +inputbar { + spacing: 0; + text-color: @normal-foreground; + padding: 0; /* No padding (was 1px) */ + children: [ prompt,textbox-prompt-colon,entry,case-indicator ]; +} + +prompt { + spacing: 0; + text-color: @normal-foreground; +} + +textbox-prompt-colon { + expand: false; + str: ""; + margin: 0px 0.3em 0em 0em; + text-color: @normal-foreground; +} + +entry { + spacing: 0; + text-color: @normal-foreground; +} + +case-indicator { + spacing: 0; + text-color: @normal-foreground; +} + +message { + border: 2px 0px 0px; + border-color: @separatorcolor; + padding: 1px; +} + +textbox { + text-color: @foreground; +} + +mode-switcher { + border: 2px 0px 0px; + border-color: @separatorcolor; +} + +button { + spacing: 0; + text-color: @normal-foreground; +} + +button.selected { + background-color: @selected-normal-background; + text-color: @selected-normal-foreground; +} + +/*------------------------------------------------------- + * OLD CONFIGURATION (commented out for reference) + *------------------------------------------------------- + * Previous version had: + * - Font: 10pt (now 8pt) + * - Window padding: 30px (now 10px) + * - List lines: 8 (now 12) + * - Element padding: 2px (now 1px vertical) + * - Spacing: 2px (now 1px) + * - Icons enabled (now disabled) + */ diff --git a/rofi/.config/rofi/.bak/clipboard.rasi.20251128_191729 b/rofi/.config/rofi/.bak/clipboard.rasi.20251128_191729 new file mode 100644 index 0000000..347d825 --- /dev/null +++ b/rofi/.config/rofi/.bak/clipboard.rasi.20251128_191729 @@ -0,0 +1,197 @@ +/******************************************************* + * CLIPBOARD MANAGER - With Images + *******************************************************/ +/* + * Clipboard theme with nice padding and image support + * - Normal font (10pt) + * - Comfortable padding (like rofidmenu) + * - Icons and images enabled + * - Clean and simple + */ + +configuration { + font: "Noto Sans Regular 10"; + show-icons: true; /* Enable icons for images */ + icon-theme: "Qogir"; + display-clipboard: " "; /* Clipboard icon restored */ + disable-history: false; + sidebar-mode: false; + kb-cancel: "Super+c,Escape"; +} + +/* Import base theme */ +@import "~/.config/rofi/config.rasi" + +/* Window - comfortable padding like rofidmenu */ +window { + background-color: @background; + border: 0; + padding: 30; /* Nice padding like rofidmenu */ + width: 50%; +} + +mainbox { + border: 0; + padding: 0; +} + +/* List view - balanced spacing */ +listview { + lines: 10; /* Show 10 entries */ + columns: 1; + fixed-height: 0; + border: 8px 0px 0px; /* Like rofidmenu */ + border-color: @separatorcolor; + scrollbar: true; + padding: 2px 0px 0px; + spacing: 4px; /* Comfortable spacing */ +} + +/* Element - comfortable padding */ +element { + border: 0; + padding: 3px; /* Comfortable padding */ +} + +/* Icon configuration for images */ +element-icon { + size: 2em; /* Good size for image thumbnails */ + padding: 0 6px 0 0; /* Space between icon and text */ +} + +element-text { + background-color: inherit; + text-color: inherit; + vertical-align: 0.5; +} + +/* Element states */ +element.normal.normal { + background-color: @normal-background; + text-color: @normal-foreground; +} + +element.selected.normal { + background-color: @selected-normal-background; + text-color: @selected-normal-foreground; +} + +element.alternate.normal { + background-color: @alternate-normal-background; + text-color: @alternate-normal-foreground; +} + +element.normal.urgent { + background-color: @urgent-background; + text-color: @urgent-foreground; +} + +element.selected.urgent { + background-color: @selected-urgent-background; + text-color: @selected-urgent-foreground; +} + +element.alternate.urgent { + background-color: @alternate-urgent-background; + text-color: @alternate-urgent-foreground; +} + +element.normal.active { + background-color: @active-background; + text-color: @active-foreground; +} + +element.selected.active { + background-color: @selected-active-background; + text-color: @selected-active-foreground; +} + +element.alternate.active { + background-color: @alternate-active-background; + text-color: @alternate-active-foreground; +} + +/* Scrollbar */ +scrollbar { + width: 4px; /* Like rofidmenu */ + border: 0; + handle-color: @normal-foreground; + handle-width: 8px; + padding: 0; +} + +/* Input bar */ +inputbar { + spacing: 0; + text-color: @normal-foreground; + padding: 1px; + children: [ prompt,textbox-prompt-colon,entry,case-indicator ]; +} + +prompt { + spacing: 0; + text-color: @normal-foreground; +} + +textbox-prompt-colon { + expand: false; + str: ""; + margin: 0px 0.3em 0em 0em; + text-color: @normal-foreground; +} + +entry { + spacing: 0; + text-color: @normal-foreground; +} + +case-indicator { + spacing: 0; + text-color: @normal-foreground; +} + +message { + border: 2px 0px 0px; + border-color: @separatorcolor; + padding: 1px; +} + +textbox { + text-color: @foreground; +} + +mode-switcher { + border: 2px 0px 0px; + border-color: @separatorcolor; +} + +button { + spacing: 0; + text-color: @normal-foreground; +} + +button.selected { + background-color: @selected-normal-background; + text-color: @selected-normal-foreground; +} + +/*------------------------------------------------------- + * PREVIOUS CONFIGURATIONS (commented for reference) + *------------------------------------------------------- + * + * Ultra-compact version had: + * - Font: 8pt + * - Window padding: 10px + * - List lines: 12 + * - Element padding: 1px vertical + * - Spacing: 1px + * - Icons: disabled + * + * Current comfortable version: + * - Font: 10pt + * - Window padding: 30px (like rofidmenu) + * - List lines: 10 + * - Element padding: 3px + * - Spacing: 4px + * - Icons: enabled for images + */ diff --git a/rofi/.config/rofi/.bak/clipboard.rasi.20251128_192345 b/rofi/.config/rofi/.bak/clipboard.rasi.20251128_192345 new file mode 100644 index 0000000..347d825 --- /dev/null +++ b/rofi/.config/rofi/.bak/clipboard.rasi.20251128_192345 @@ -0,0 +1,197 @@ +/******************************************************* + * CLIPBOARD MANAGER - With Images + *******************************************************/ +/* + * Clipboard theme with nice padding and image support + * - Normal font (10pt) + * - Comfortable padding (like rofidmenu) + * - Icons and images enabled + * - Clean and simple + */ + +configuration { + font: "Noto Sans Regular 10"; + show-icons: true; /* Enable icons for images */ + icon-theme: "Qogir"; + display-clipboard: " "; /* Clipboard icon restored */ + disable-history: false; + sidebar-mode: false; + kb-cancel: "Super+c,Escape"; +} + +/* Import base theme */ +@import "~/.config/rofi/config.rasi" + +/* Window - comfortable padding like rofidmenu */ +window { + background-color: @background; + border: 0; + padding: 30; /* Nice padding like rofidmenu */ + width: 50%; +} + +mainbox { + border: 0; + padding: 0; +} + +/* List view - balanced spacing */ +listview { + lines: 10; /* Show 10 entries */ + columns: 1; + fixed-height: 0; + border: 8px 0px 0px; /* Like rofidmenu */ + border-color: @separatorcolor; + scrollbar: true; + padding: 2px 0px 0px; + spacing: 4px; /* Comfortable spacing */ +} + +/* Element - comfortable padding */ +element { + border: 0; + padding: 3px; /* Comfortable padding */ +} + +/* Icon configuration for images */ +element-icon { + size: 2em; /* Good size for image thumbnails */ + padding: 0 6px 0 0; /* Space between icon and text */ +} + +element-text { + background-color: inherit; + text-color: inherit; + vertical-align: 0.5; +} + +/* Element states */ +element.normal.normal { + background-color: @normal-background; + text-color: @normal-foreground; +} + +element.selected.normal { + background-color: @selected-normal-background; + text-color: @selected-normal-foreground; +} + +element.alternate.normal { + background-color: @alternate-normal-background; + text-color: @alternate-normal-foreground; +} + +element.normal.urgent { + background-color: @urgent-background; + text-color: @urgent-foreground; +} + +element.selected.urgent { + background-color: @selected-urgent-background; + text-color: @selected-urgent-foreground; +} + +element.alternate.urgent { + background-color: @alternate-urgent-background; + text-color: @alternate-urgent-foreground; +} + +element.normal.active { + background-color: @active-background; + text-color: @active-foreground; +} + +element.selected.active { + background-color: @selected-active-background; + text-color: @selected-active-foreground; +} + +element.alternate.active { + background-color: @alternate-active-background; + text-color: @alternate-active-foreground; +} + +/* Scrollbar */ +scrollbar { + width: 4px; /* Like rofidmenu */ + border: 0; + handle-color: @normal-foreground; + handle-width: 8px; + padding: 0; +} + +/* Input bar */ +inputbar { + spacing: 0; + text-color: @normal-foreground; + padding: 1px; + children: [ prompt,textbox-prompt-colon,entry,case-indicator ]; +} + +prompt { + spacing: 0; + text-color: @normal-foreground; +} + +textbox-prompt-colon { + expand: false; + str: ""; + margin: 0px 0.3em 0em 0em; + text-color: @normal-foreground; +} + +entry { + spacing: 0; + text-color: @normal-foreground; +} + +case-indicator { + spacing: 0; + text-color: @normal-foreground; +} + +message { + border: 2px 0px 0px; + border-color: @separatorcolor; + padding: 1px; +} + +textbox { + text-color: @foreground; +} + +mode-switcher { + border: 2px 0px 0px; + border-color: @separatorcolor; +} + +button { + spacing: 0; + text-color: @normal-foreground; +} + +button.selected { + background-color: @selected-normal-background; + text-color: @selected-normal-foreground; +} + +/*------------------------------------------------------- + * PREVIOUS CONFIGURATIONS (commented for reference) + *------------------------------------------------------- + * + * Ultra-compact version had: + * - Font: 8pt + * - Window padding: 10px + * - List lines: 12 + * - Element padding: 1px vertical + * - Spacing: 1px + * - Icons: disabled + * + * Current comfortable version: + * - Font: 10pt + * - Window padding: 30px (like rofidmenu) + * - List lines: 10 + * - Element padding: 3px + * - Spacing: 4px + * - Icons: enabled for images + */ diff --git a/rofi/.config/rofi/.bak/clipboard.rasi.20251203_222142 b/rofi/.config/rofi/.bak/clipboard.rasi.20251203_222142 new file mode 100644 index 0000000..d9490af --- /dev/null +++ b/rofi/.config/rofi/.bak/clipboard.rasi.20251203_222142 @@ -0,0 +1,201 @@ +/******************************************************* + * CLIPBOARD MANAGER - With Images + *******************************************************/ +/* + * Clipboard theme with nice padding and image support + * - Normal font (10pt) + * - Comfortable padding (like rofidmenu) + * - Icons and images enabled + * - Clean and simple + */ + +configuration { + font: "Noto Sans Regular 10"; + show-icons: true; /* Enable icons for images */ + icon-theme: "Qogir"; + display-clipboard: " "; /* Clipboard icon restored */ + disable-history: false; + sidebar-mode: false; + kb-cancel: "Super+c,Escape"; +} + +/* Import base theme */ +@import "~/.config/rofi/config.rasi" + +/* Window - comfortable padding like rofidmenu */ +window { + background-color: @background; + border: 0; + padding: 30; /* Nice padding like rofidmenu */ + width: 50%; +} + +mainbox { + border: 0; + padding: 0; +} + +/* List view - compact vertical spacing */ +listview { + lines: 10; /* Show 10 entries */ + columns: 1; + fixed-height: 0; + border: 8px 0px 0px; /* Like rofidmenu */ + border-color: @separatorcolor; + scrollbar: true; + padding: 2px 0px 0px; + spacing: 2px; /* Reduced: was 4px, now 2px */ +} + +/* Element - minimal height (no vertical padding) */ +element { + border: 0; + padding: 0px 3px; /* No vertical padding: 0px top/bottom, 3px left/right */ +} + +/* Icon configuration for images */ +element-icon { + size: 2em; /* Good size for image thumbnails */ + padding: 0 6px 0 0; /* Space between icon and text */ +} + +element-text { + background-color: inherit; + text-color: inherit; + vertical-align: 0.5; +} + +/* Element states */ +element.normal.normal { + background-color: @normal-background; + text-color: @normal-foreground; +} + +element.selected.normal { + background-color: @selected-normal-background; + text-color: @selected-normal-foreground; +} + +element.alternate.normal { + background-color: @alternate-normal-background; + text-color: @alternate-normal-foreground; +} + +element.normal.urgent { + background-color: @urgent-background; + text-color: @urgent-foreground; +} + +element.selected.urgent { + background-color: @selected-urgent-background; + text-color: @selected-urgent-foreground; +} + +element.alternate.urgent { + background-color: @alternate-urgent-background; + text-color: @alternate-urgent-foreground; +} + +element.normal.active { + background-color: @active-background; + text-color: @active-foreground; +} + +element.selected.active { + background-color: @selected-active-background; + text-color: @selected-active-foreground; +} + +element.alternate.active { + background-color: @alternate-active-background; + text-color: @alternate-active-foreground; +} + +/* Scrollbar */ +scrollbar { + width: 4px; /* Like rofidmenu */ + border: 0; + handle-color: @normal-foreground; + handle-width: 8px; + padding: 0; +} + +/* Input bar */ +inputbar { + spacing: 0; + text-color: @normal-foreground; + padding: 1px; + children: [ prompt,textbox-prompt-colon,entry,case-indicator ]; +} + +prompt { + spacing: 0; + text-color: @normal-foreground; +} + +textbox-prompt-colon { + expand: false; + str: ""; + margin: 0px 0.3em 0em 0em; + text-color: @normal-foreground; +} + +entry { + spacing: 0; + text-color: @normal-foreground; +} + +case-indicator { + spacing: 0; + text-color: @normal-foreground; +} + +message { + border: 2px 0px 0px; + border-color: @separatorcolor; + padding: 1px; +} + +textbox { + text-color: @foreground; +} + +mode-switcher { + border: 2px 0px 0px; + border-color: @separatorcolor; +} + +button { + spacing: 0; + text-color: @normal-foreground; +} + +button.selected { + background-color: @selected-normal-background; + text-color: @selected-normal-foreground; +} + +/*------------------------------------------------------- + * PREVIOUS CONFIGURATIONS (commented for reference) + *------------------------------------------------------- + * + * Ultra-compact version had: + * - Font: 8pt + * - Window padding: 10px + * - List lines: 12 + * - Element padding: 1px vertical + * - Spacing: 1px + * - Icons: disabled + * + * Comfortable version had: + * - Element padding: 3px all sides + * - Spacing: 4px + * + * Current version (compact vertical): + * - Font: 10pt + * - Window padding: 30px (like rofidmenu) + * - List lines: 10 + * - Element padding: 1px vertical, 3px horizontal + * - Spacing: 2px (smaller vertical gaps) + * - Icons: enabled for images + */ diff --git a/rofi/.config/rofi/clipboard-launcher-enhanced.sh b/rofi/.config/rofi/clipboard-launcher-enhanced.sh new file mode 100755 index 0000000..bdee2ec --- /dev/null +++ b/rofi/.config/rofi/clipboard-launcher-enhanced.sh @@ -0,0 +1,281 @@ +#!/usr/bin/env bash +#============================================================================== +# Enhanced Greenclip Clipboard Manager with Image Support +#============================================================================== +# This script provides a fully-functional clipboard manager using rofi and +# greenclip, with proper support for both text and images. +# +# Features: +# - Displays clipboard history from greenclip +# - Shows image thumbnails for copied images +# - Truncates long text for readability +# - Properly pastes both text AND images back to clipboard +# - Handles greenclip's image format: "image/png Zen [hash]" +# +# Requirements: +# - rofi (with script mode and thumbnail support) +# - greenclip (clipboard manager daemon must be running) +# - xsel (for clipboard operations - prevents rofi freeze issues) +# - Image files stored in /tmp/greenclip/ (configured in greenclip.toml) +# +# How Greenclip Stores Images: +# 1. Text entries: Stored as-is in clipboard history +# 2. Image entries: Stored as "image/png Zen [hash]" in history +# 3. Actual PNG files: Saved to /tmp/greenclip/[hash].png +# 4. This script: Detects images, shows thumbnails, and restores them properly +#============================================================================== + +# Directory where greenclip caches image files +# IMPORTANT: This must match image_cache_directory in ~/.config/greenclip.toml +IMGDIR="/tmp/greenclip" + +# Maximum text length to display before truncating +MAX_TEXT_LENGTH=100 + +#------------------------------------------------------------------------------ +# clipboard_mode() - Main rofi script mode handler +#------------------------------------------------------------------------------ +# Called by rofi in two contexts: +# +# Context 1: ROFI_RETV=0 (Initial call) +# - Generate the menu items from greenclip history +# - Detect image vs text entries +# - Format with thumbnails and truncation +# - Store original content in info field for later retrieval +# +# Context 2: ROFI_RETV=1 (User selected item) +# - Receive selection via $ROFI_INFO +# - Determine if it's an image or text +# - Copy to clipboard appropriately (file for images, text for text) +#------------------------------------------------------------------------------ +clipboard_mode() { + if [ "$ROFI_RETV" = "0" ]; then + #---------------------------------------------------------------------- + # CONTEXT 1: Generate Menu Items + #---------------------------------------------------------------------- + + # Read clipboard history line by line from greenclip + greenclip print | while IFS= read -r line; do + + #------------------------------------------------------------------ + # IMAGE DETECTION AND DISPLAY + #------------------------------------------------------------------ + # Greenclip outputs image entries in format: "image/png Zen [hash]" + # We need to: + # 1. Detect these entries (starts with "image/") + # 2. Extract the hash/ID + # 3. Find the corresponding PNG file in IMGDIR + # 4. Display with thumbnail icon + #------------------------------------------------------------------ + + if [[ "$line" =~ ^image/png ]]; then + # This is an image entry! + + # Extract the hash from "image/png Zen [hash]" + # The hash is the last field (may be negative number) + hash=$(echo "$line" | awk '{print $NF}') + + # Construct the image file path + # Note: greenclip saves as [hash].png or [-hash].png + imgfile="$IMGDIR/${hash}.png" + + # Check if image file exists + if [ -f "$imgfile" ]; then + # Get just the filename for display + imgname=$(basename "$imgfile") + + # Display format for rofi: + # [display text] \0 icon \x1f [thumbnail path] \0 info \x1f [original line] + # + # Components: + # - Display: "🖼️ Image: filename.png" (what user sees) + # - Icon: thumbnail://path (shows image preview) + # - Info: original greenclip line (used for restoration) + # printf '🖼️ Image: %s\0icon\x1fthumbnail://%s\0info\x1f%s\n' \ + printf ' IMAGE: %s\0icon\x1fthumbnail://%s\0info\x1f%s\n' \ + "$imgname" \ + "$imgfile" \ + "$line" + else + # Image file not found, show as broken/missing + # Still preserve the original line in case file appears later + # printf '🖼️ Image (missing): %s\0info\x1f%s\n' \ + printf ' IMAGE (MISSING): %s\0info\x1f%s\n' \ + "$hash" \ + "$line" + fi + + # Done processing this image entry, move to next line + continue + fi + + #------------------------------------------------------------------ + # TEXT ENTRY DISPLAY + #------------------------------------------------------------------ + # For regular text clipboard entries: + # 1. Truncate if too long (for display) + # 2. Preserve full original text in info field (for pasting) + #------------------------------------------------------------------ + + if [ ${#line} -gt $MAX_TEXT_LENGTH ]; then + # Text is long - truncate for display but preserve original + display_text="${line:0:$MAX_TEXT_LENGTH}..." + + # Format: [truncated text] \0 info \x1f [full original text] + # User sees truncated version, but pastes full version + printf '%s\0info\x1f%s\n' "$display_text" "$line" + else + # Text is short - can display as-is + # Still use info field for consistency in selection handling + printf '%s\0info\x1f%s\n' "$line" "$line" + fi + done + + else + #---------------------------------------------------------------------- + # CONTEXT 2: Handle User Selection + #---------------------------------------------------------------------- + # User selected an item. $ROFI_INFO contains the original content + # we stored in the info field during menu generation. + # + # We need to: + # 1. Check if selection is an image or text + # 2. For images: Copy the PNG file to clipboard + # 3. For text: Copy the text to clipboard + #---------------------------------------------------------------------- + + selection="$ROFI_INFO" + + #---------------------------------------------------------------------- + # IMAGE SELECTION HANDLING + #---------------------------------------------------------------------- + # Check if selected item is an image entry (starts with "image/png") + #---------------------------------------------------------------------- + if [[ "$selection" =~ ^image/png ]]; then + # This is an image! Extract hash and copy the actual PNG file + + # Parse hash from "image/png Zen [hash]" + hash=$(echo "$selection" | awk '{print $NF}') + + # Construct image file path + imgfile="$IMGDIR/${hash}.png" + + # Verify image file exists before copying + if [ -f "$imgfile" ]; then + # Copy the actual PNG file to clipboard as image data + # Using xsel instead of xclip to prevent rofi freeze issues + # -b: Use clipboard (equivalent to --clipboard) + # -i: Read from stdin/file + xsel --clipboard --input < "$imgfile" + + # Exit successfully - image is now in clipboard + exit 0 + else + # Image file not found - show error notification if dunstify available + if command -v dunstify &> /dev/null; then + dunstify -u critical "Clipboard Error" "Image file not found: $imgfile" + fi + # Exit with error code + exit 1 + fi + else + #------------------------------------------------------------------ + # TEXT SELECTION HANDLING + #------------------------------------------------------------------ + # This is regular text - copy to clipboard as text + #------------------------------------------------------------------ + + # Copy text directly to clipboard using xsel + # Using xsel instead of xclip to prevent rofi freeze issues + # -b: Use clipboard (equivalent to --clipboard) + # -i: Read from stdin + # Using echo -n to avoid adding newline + echo -n "$selection" | xsel --clipboard --input + + # Exit successfully - text is now in clipboard + exit 0 + fi + fi +} + +#============================================================================== +# Export for rofi script mode +#============================================================================== +# Make function and variables available when rofi spawns this script +export -f clipboard_mode +export IMGDIR +export MAX_TEXT_LENGTH + +#============================================================================== +# MAIN SCRIPT ENTRY POINT +#============================================================================== +# Two execution modes based on ROFI_RETV environment variable: +# +# MODE 1: Direct execution (ROFI_RETV is unset/empty) +# - User ran this script from command line or keybind +# - Launch rofi with this script as the clipboard provider +# - Rofi will then call this script again in MODE 2 +# +# MODE 2: Called by rofi (ROFI_RETV is set) +# - Rofi is calling us to get menu items or handle selection +# - Call clipboard_mode() function to handle the request +#============================================================================== + +if [ -z "$ROFI_RETV" ]; then + #-------------------------------------------------------------------------- + # MODE 1: Launch rofi + #-------------------------------------------------------------------------- + + # Launch rofi with this script as the data source for "clipboard" mode + # + # Rofi parameters: + # -modi "clipboard:$0" + # Register "clipboard" mode that runs this script for data + # + # -show clipboard + # Display the clipboard mode immediately + # + # NO -run-command needed! + # The script handles clipboard copying internally for both text and images + # When user selects an item, rofi calls the script with ROFI_RETV=1 + # The script then copies to clipboard directly and exits + # + # -theme ... + # Custom theme file for visual styling + #-------------------------------------------------------------------------- + + rofi -modi "clipboard:$0" \ + -show clipboard \ + -theme ~/.config/rofi/clipboard.rasi + + # NOTE: All clipboard operations are handled inside clipboard_mode() + # when ROFI_RETV=1 (selection mode). No post-processing needed here. + +else + #-------------------------------------------------------------------------- + # MODE 2: Provide data to rofi or handle selection + #-------------------------------------------------------------------------- + + # Rofi is calling us - hand off to clipboard_mode function + clipboard_mode "$@" +fi + +#============================================================================== +# OLD/ALTERNATIVE APPROACHES (Commented out for reference) +#============================================================================== +# +# APPROACH 1: Using -run-command with xclip for text +# This was the old approach that didn't handle images properly: +# +# rofi -modi "clipboard:$0" \ +# -show clipboard \ +# -run-command 'echo -n {cmd} | xclip -selection clipboard' \ +# -theme ~/.config/rofi/clipboard.rasi +# +# PROBLEM: This pipes ALL selections (including "image/png Zen [hash]" text) +# to xclip as text, which doesn't restore the actual image to clipboard. +# +# SOLUTION: Handle image copying inside the script, before rofi's -run-command, +# by detecting image format and using xclip with -t image/png and the file. +# +#============================================================================== diff --git a/rofi/.config/rofi/clipboard-launcher.sh b/rofi/.config/rofi/clipboard-launcher.sh new file mode 100755 index 0000000..c223fe9 --- /dev/null +++ b/rofi/.config/rofi/clipboard-launcher.sh @@ -0,0 +1,59 @@ +#!/usr/bin/env bash +#============================================================================== +# Ultra-Simple Text-Only Clipboard Launcher +#============================================================================== +# NO images, NO thumbnails, NO script mode - just text clipboard +# This is the absolute simplest version that should never crash +#============================================================================== + +# Simple one-liner: show greenclip history, copy selection to clipboard +# -p "" sets the prompt with clipboard icon +greenclip print | rofi -dmenu -i -p "" -theme ~/.config/rofi/clipboard.rasi | xclip -selection clipboard + +#============================================================================== +# OLD COMPLEX VERSIONS (commented out - they caused crashes) +#============================================================================== + +# VERSION WITH SCRIPT MODE (was crashing): +# IMGDIR="/tmp/greenclip" +# +# clipboard_mode() { +# if [ "$ROFI_RETV" = "0" ]; then +# greenclip print | while IFS= read -r line; do +# if [[ "$line" =~ ^image/png ]]; then +# hash=$(echo "$line" | awk '{print $NF}') +# imgfile="$IMGDIR/${hash}.png" +# if [ -f "$imgfile" ]; then +# printf '[IMAGE] %s\0info\x1f%s\n' "$(basename "$imgfile")" "$line" +# fi +# else +# printf '%s\0info\x1f%s\n' "$line" "$line" +# fi +# done +# else +# selection="$ROFI_INFO" +# [ -z "$selection" ] && exit 0 +# if [[ "$selection" =~ ^image/png ]]; then +# hash=$(echo "$selection" | awk '{print $NF}') +# imgfile="$IMGDIR/${hash}.png" +# if [ -f "$imgfile" ] && [ -r "$imgfile" ]; then +# xclip -selection clipboard -t image/png -i "$imgfile" 2>/dev/null +# fi +# else +# echo -n "$selection" | xclip -selection clipboard 2>/dev/null +# fi +# exit 0 +# fi +# } +# +# export -f clipboard_mode +# export IMGDIR +# +# if [ -z "$ROFI_RETV" ]; then +# rofi -modi "clipboard:$0" -show clipboard -theme ~/.config/rofi/clipboard.rasi +# else +# clipboard_mode "$@" +# fi + +# VERSION WITH THUMBNAILS (crashed even more): +# [See backup files for reference] diff --git a/rofi/.config/rofi/clipboard.rasi b/rofi/.config/rofi/clipboard.rasi new file mode 100644 index 0000000..6ec4a1b --- /dev/null +++ b/rofi/.config/rofi/clipboard.rasi @@ -0,0 +1,201 @@ +/******************************************************* + * CLIPBOARD MANAGER - With Images + *******************************************************/ +/* + * Clipboard theme with nice padding and image support + * - Normal font (10pt) + * - Comfortable padding (like rofidmenu) + * - Icons and images enabled + * - Clean and simple + */ + +configuration { + font: "Noto Sans Nerd Font 10"; + show-icons: true; /* Enable icons for images */ + icon-theme: "Qogir"; + display-clipboard: ""; /* Clipboard icon restored */ + disable-history: false; + sidebar-mode: false; + kb-cancel: "Super+c,Escape"; +} + +/* Import base theme */ +@import "~/.config/rofi/config.rasi" + +/* Window - comfortable padding like rofidmenu */ +window { + background-color: @background; + border: 0; + padding: 30; /* Nice padding like rofidmenu */ + width: 50%; +} + +mainbox { + border: 0; + padding: 0; +} + +/* List view - compact vertical spacing */ +listview { + lines: 10; /* Show 10 entries */ + columns: 1; + fixed-height: 0; + border: 8px 0px 0px; /* Like rofidmenu */ + border-color: @separatorcolor; + scrollbar: true; + padding: 2px 0px 0px; + spacing: 0px; /* Reduced: was 4px, now 2px */ +} + +/* Element - minimal height (no vertical padding) */ +element { + border: 0; + padding: -1px 3px; /* No vertical padding: 0px top/bottom, 3px left/right, negative if you want it to be thin */ +} + +/* Icon configuration for images */ +element-icon { + size: 2em; /* Good size for image thumbnails */ + padding: 0 6px 0 0; /* Space between icon and text */ +} + +element-text { + background-color: inherit; + text-color: inherit; + vertical-align: 0.5; +} + +/* Element states */ +element.normal.normal { + background-color: @normal-background; + text-color: @normal-foreground; +} + +element.selected.normal { + background-color: @selected-normal-background; + text-color: @selected-normal-foreground; +} + +element.alternate.normal { + background-color: @alternate-normal-background; + text-color: @alternate-normal-foreground; +} + +element.normal.urgent { + background-color: @urgent-background; + text-color: @urgent-foreground; +} + +element.selected.urgent { + background-color: @selected-urgent-background; + text-color: @selected-urgent-foreground; +} + +element.alternate.urgent { + background-color: @alternate-urgent-background; + text-color: @alternate-urgent-foreground; +} + +element.normal.active { + background-color: @active-background; + text-color: @active-foreground; +} + +element.selected.active { + background-color: @selected-active-background; + text-color: @selected-active-foreground; +} + +element.alternate.active { + background-color: @alternate-active-background; + text-color: @alternate-active-foreground; +} + +/* Scrollbar */ +scrollbar { + width: 4px; /* Like rofidmenu */ + border: 0; + handle-color: @normal-foreground; + handle-width: 8px; + padding: 0; +} + +/* Input bar */ +inputbar { + spacing: 0; + text-color: @normal-foreground; + padding: 1px; + children: [ prompt,textbox-prompt-colon,entry,case-indicator ]; +} + +prompt { + spacing: 0; + text-color: @normal-foreground; +} + +textbox-prompt-colon { + expand: false; + str: ""; + margin: 0px 0.3em 0em 0em; + text-color: @normal-foreground; +} + +entry { + spacing: 0; + text-color: @normal-foreground; +} + +case-indicator { + spacing: 0; + text-color: @normal-foreground; +} + +message { + border: 2px 0px 0px; + border-color: @separatorcolor; + padding: 1px; +} + +textbox { + text-color: @foreground; +} + +mode-switcher { + border: 2px 0px 0px; + border-color: @separatorcolor; +} + +button { + spacing: 0; + text-color: @normal-foreground; +} + +button.selected { + background-color: @selected-normal-background; + text-color: @selected-normal-foreground; +} + +/*------------------------------------------------------- + * PREVIOUS CONFIGURATIONS (commented for reference) + *------------------------------------------------------- + * + * Ultra-compact version had: + * - Font: 8pt + * - Window padding: 10px + * - List lines: 12 + * - Element padding: 1px vertical + * - Spacing: 1px + * - Icons: disabled + * + * Comfortable version had: + * - Element padding: 3px all sides + * - Spacing: 4px + * + * Current version (compact vertical): + * - Font: 10pt + * - Window padding: 30px (like rofidmenu) + * - List lines: 10 + * - Element padding: 1px vertical, 3px horizontal + * - Spacing: 2px (smaller vertical gaps) + * - Icons: enabled for images + */ diff --git a/rofi/.config/rofi/config.rasi b/rofi/.config/rofi/config.rasi new file mode 100644 index 0000000..35599fc --- /dev/null +++ b/rofi/.config/rofi/config.rasi @@ -0,0 +1 @@ + @theme "/home/bh/.config/rofi/theal.rasi" diff --git a/rofi/.config/rofi/power-profiles.rasi b/rofi/.config/rofi/power-profiles.rasi new file mode 100644 index 0000000..f7c7755 --- /dev/null +++ b/rofi/.config/rofi/power-profiles.rasi @@ -0,0 +1,122 @@ +/******************************************************* + * ROFI configs i3 powermenu for EndeavourOS + * Maintainer: joekamprad [joekamprad //a_t// endeavouros.com] + *******************************************************/ +configuration { + font: "Noto Sans Regular 10"; + show-icons: false; + icon-theme: "Qogir"; + scroll-method: 0; + disable-history: false; + fullscreen: false; + hide-scrollbar: true; + sidebar-mode: false; +} + +@import "~/.config/rofi/config.rasi" +/* Insert theme modifications after this */ + + +window { + background-color: @background; + border: 0; + padding: 10; + transparency: "real"; + width: 170px; + location: east; + /*y-offset: 18;*/ + /*x-offset: 850;*/ +} +listview { + lines: 4; + columns: 1; +} +element { + border: 0; + padding: 1px; +} +element-text { + background-color: inherit; + text-color: inherit; +} +element.normal.normal { + background-color: @normal-background; + text-color: @normal-foreground; +} +element.normal.urgent { + background-color: @urgent-background; + text-color: @urgent-foreground; +} +element.normal.active { + background-color: @active-background; + text-color: @active-foreground; +} +element.selected.normal { + background-color: @selected-normal-background; + text-color: @selected-normal-foreground; +} +element.selected.urgent { + background-color: @selected-urgent-background; + text-color: @selected-urgent-foreground; +} +element.selected.active { + background-color: @selected-active-background; + text-color: @selected-active-foreground; +} +element.alternate.normal { + background-color: @alternate-normal-background; + text-color: @alternate-normal-foreground; +} +element.alternate.urgent { + background-color: @alternate-urgent-background; + text-color: @alternate-urgent-foreground; +} +element.alternate.active { + background-color: @alternate-active-background; + text-color: @alternate-active-foreground; +} +scrollbar { + width: 4px; + border: 0; + handle-color: @normal-foreground; + handle-width: 8px; + padding: 0; +} +mode-switcher { + border: 2px 0px 0px; + border-color: @separatorcolor; +} +button { + spacing: 0; + text-color: @normal-foreground; +} +button.selected { + background-color: @selected-normal-background; + text-color: @selected-normal-foreground; +} +inputbar { + spacing: 0; + text-color: @normal-foreground; + padding: 1px; +} +case-indicator { + spacing: 0; + text-color: @normal-foreground; +} +entry { + spacing: 0; + text-color: @normal-foreground; +} +prompt { + spacing: 0; + text-color: @normal-foreground; +} +inputbar { + children: [ prompt,textbox-prompt-colon,entry,case-indicator ]; +} +textbox-prompt-colon { + expand: false; + str: "Set Power Profile:"; + margin: 0px 0.3em 0em 0em; + text-color: @normal-foreground; +} diff --git a/rofi/.config/rofi/powermenu.rasi b/rofi/.config/rofi/powermenu.rasi new file mode 100644 index 0000000..8470a69 --- /dev/null +++ b/rofi/.config/rofi/powermenu.rasi @@ -0,0 +1,125 @@ +/******************************************************* + * ROFI configs i3 powermenu for EndeavourOS + * Maintainer: joekamprad [joekamprad //a_t// endeavouros.com] + *******************************************************/ +configuration { + font: "Noto Sans Regular 10"; + show-icons: false; + icon-theme: "Qogir"; + scroll-method: 0; + disable-history: false; + sidebar-mode: false; +} + +@import "~/.config/rofi/config.rasi" +/* Insert theme modifications after this */ + +window { + background-color: @background; + border: 0; + padding: 10; + transparency: "real"; + width: 120px; + location: east; + /*y-offset: 18;*/ + /*x-offset: 850;*/ +} +listview { + lines: 7; + columns: 1; + scrollbar: false; +} +element { + border: 0; + padding: 1px; +} +element-text { + background-color: inherit; + text-color: inherit; +} +element.normal.normal { + background-color: @normal-background; + text-color: @normal-foreground; +} +element.normal.urgent { + background-color: @urgent-background; + text-color: @urgent-foreground; +} +element.normal.active { + background-color: @active-background; + text-color: @active-foreground; +} +element.selected.normal { + background-color: @selected-normal-background; + text-color: @selected-normal-foreground; +} +element.selected.urgent { + background-color: @selected-urgent-background; + text-color: @selected-urgent-foreground; +} +element.selected.active { + background-color: @selected-active-background; + text-color: @selected-active-foreground; +} +element.alternate.normal { + background-color: @alternate-normal-background; + text-color: @alternate-normal-foreground; +} +element.alternate.urgent { + background-color: @alternate-urgent-background; + text-color: @alternate-urgent-foreground; +} +element.alternate.active { + background-color: @alternate-active-background; + text-color: @alternate-active-foreground; +} +scrollbar { + width: 4px; + border: 0; + handle-color: @normal-foreground; + handle-width: 8px; + padding: 0; +} +mode-switcher { + border: 2px 0px 0px; + border-color: @separatorcolor; +} +button { + spacing: 0; + text-color: @normal-foreground; +} +button.selected { + background-color: @selected-normal-background; + text-color: @selected-normal-foreground; +} +inputbar { + spacing: 0; + text-color: @normal-foreground; + padding: 1px; +} +case-indicator { + spacing: 0; + text-color: @normal-foreground; +} +entry { + spacing: 0; + text-color: @normal-foreground; +} +prompt { + spacing: 0; + text-color: @normal-foreground; +} +inputbar { + children: [ prompt,textbox-prompt-colon,entry,case-indicator ]; +} +textbox-prompt-colon { + expand: false; + str: ":"; + margin: 0px 0.3em 0em 0em; + text-color: @normal-foreground; +} + +/*removes the text input line*/ +mainbox { + children: [listview]; +} diff --git a/rofi/.config/rofi/rofidmenu.rasi b/rofi/.config/rofi/rofidmenu.rasi new file mode 100644 index 0000000..b989a42 --- /dev/null +++ b/rofi/.config/rofi/rofidmenu.rasi @@ -0,0 +1,142 @@ +/******************************************************* + * APP LAUNCHER + *******************************************************/ + + +configuration { + //font: "Noto Sans Regular 10"; + font: "Noto Sans Nerd Font 10"; + show-icons: true; + icon-theme: "Qogir"; + // display-drun: "软件"; + display-drun: ""; + drun-display-format: "{name}"; + scroll-method: 0; + disable-history: false; + sidebar-mode: false; + kb-cancel: "Super+c"; +} + + +@import "~/.config/rofi/config.rasi" +/* Insert theme modifications after this */ + +window { + background-color: @background; + border: 0; + padding: 30; +} +listview { + lines: 10; + columns: 3; +} +mainbox { + border: 0; + padding: 0; +} +message { + border: 2px 0px 0px; + border-color: @separatorcolor; + padding: 1px; +} +textbox { + text-color: @foreground; +} +listview { + fixed-height: 0; + border: 8px 0px 0px; + border-color: @separatorcolor; + spacing: 8px; + scrollbar: false; + padding: 2px 0px 0px; +} +element { + border: 0; + padding: 1px; +} +element-text { + background-color: inherit; + text-color: inherit; +} +element.normal.normal { + background-color: @normal-background; + text-color: @normal-foreground; +} +element.normal.urgent { + background-color: @urgent-background; + text-color: @urgent-foreground; +} +element.normal.active { + background-color: @active-background; + text-color: @active-foreground; +} +element.selected.normal { + background-color: @selected-normal-background; + text-color: @selected-normal-foreground; +} +element.selected.urgent { + background-color: @selected-urgent-background; + text-color: @selected-urgent-foreground; +} +element.selected.active { + background-color: @selected-active-background; + text-color: @selected-active-foreground; +} +element.alternate.normal { + background-color: @alternate-normal-background; + text-color: @alternate-normal-foreground; +} +element.alternate.urgent { + background-color: @alternate-urgent-background; + text-color: @alternate-urgent-foreground; +} +element.alternate.active { + background-color: @alternate-active-background; + text-color: @alternate-active-foreground; +} +scrollbar { + width: 4px; + border: 0; + handle-color: @normal-foreground; + handle-width: 8px; + padding: 0; +} +mode-switcher { + border: 2px 0px 0px; + border-color: @separatorcolor; +} +button { + spacing: 0; + text-color: @normal-foreground; +} +button.selected { + background-color: @selected-normal-background; + text-color: @selected-normal-foreground; +} +inputbar { + spacing: 0; + text-color: @normal-foreground; + padding: 1px; +} +case-indicator { + spacing: 0; + text-color: @normal-foreground; +} +entry { + spacing: 0; + text-color: @normal-foreground; +} +prompt { + spacing: 0; + text-color: @normal-foreground; +} +inputbar { + children: [ prompt,textbox-prompt-colon,entry,case-indicator ]; +} +textbox-prompt-colon { + expand: false; + // str: ":"; + str: ""; + margin: 0px 0.3em 0em 0em; + text-color: @normal-foreground; +} diff --git a/rofi/.config/rofi/rofikeyhint.rasi b/rofi/.config/rofi/rofikeyhint.rasi new file mode 100644 index 0000000..9f9805a --- /dev/null +++ b/rofi/.config/rofi/rofikeyhint.rasi @@ -0,0 +1,138 @@ +/******************************************************* + * ROFI configs i3 keyhint-menu for EndeavourOS + * Maintainer: joekamprad [joekamprad //a_t// endeavouros.com] + *******************************************************/ +configuration { + font: "Noto Sans Regular 10"; + show-icons: false; + icon-theme: "Qogir"; + display-drun: "KeyHint"; + drun-display-format: "{name}"; + scroll-method: 0; + disable-history: false; + fullscreen: false; + hide-scrollbar: true; + sidebar-mode: false; +} + +@import "~/.config/rofi/config.rasi" +/* Insert theme modifications after this */ + +window { + background-color: @background; + border: 0; + padding: 30; +} +listview { + lines: 10; + columns: 1; +} +mainbox { + border: 0; + padding: 0; +} +message { + border: 2px 0px 0px; + border-color: @separatorcolor; + padding: 1px; +} +textbox { + text-color: @foreground; +} +listview { + fixed-height: 0; + border: 8px 0px 0px; + border-color: @separatorcolor; + spacing: 8px; + scrollbar: false; + padding: 2px 0px 0px; +} +element { + border: 0; + padding: 1px; +} +element-text { + background-color: inherit; + text-color: inherit; +} +element.normal.normal { + background-color: @normal-background; + text-color: @normal-foreground; +} +element.normal.urgent { + background-color: @urgent-background; + text-color: @urgent-foreground; +} +element.normal.active { + background-color: @active-background; + text-color: @active-foreground; +} +element.selected.normal { + background-color: @selected-normal-background; + text-color: @selected-normal-foreground; +} +element.selected.urgent { + background-color: @selected-urgent-background; + text-color: @selected-urgent-foreground; +} +element.selected.active { + background-color: @selected-active-background; + text-color: @selected-active-foreground; +} +element.alternate.normal { + background-color: @alternate-normal-background; + text-color: @alternate-normal-foreground; +} +element.alternate.urgent { + background-color: @alternate-urgent-background; + text-color: @alternate-urgent-foreground; +} +element.alternate.active { + background-color: @alternate-active-background; + text-color: @alternate-active-foreground; +} +scrollbar { + width: 4px; + border: 0; + handle-color: @normal-foreground; + handle-width: 8px; + padding: 0; +} +mode-switcher { + border: 2px 0px 0px; + border-color: @separatorcolor; +} +button { + spacing: 0; + text-color: @normal-foreground; +} +button.selected { + background-color: @selected-normal-background; + text-color: @selected-normal-foreground; +} +inputbar { + spacing: 0; + text-color: @normal-foreground; + padding: 1px; +} +case-indicator { + spacing: 0; + text-color: @normal-foreground; +} +entry { + spacing: 0; + text-color: @normal-foreground; +} +prompt { + spacing: 0; + text-color: @normal-foreground; +} +inputbar { + children: [ prompt,textbox-prompt-colon,entry,case-indicator ]; +} +textbox-prompt-colon { + expand: false; + str: ":"; + margin: 0px 0.3em 0em 0em; + text-color: @normal-foreground; +} diff --git a/rofi/.config/rofi/theal.rasi b/rofi/.config/rofi/theal.rasi new file mode 100644 index 0000000..a4a852e --- /dev/null +++ b/rofi/.config/rofi/theal.rasi @@ -0,0 +1,151 @@ +/******************************************************* + * CYAN THEME FOR ROFI + * by BH + *******************************************************/ + +* { + selected-normal-foreground: rgba(0, 255, 180, 100%); /* More cyanish light spring green */ + foreground: rgba(138, 255, 255, 100%); /* #8affff */ + normal-foreground: @foreground; + alternate-normal-background: rgba(45, 48, 59, 1%); + red: rgba(220, 50, 47, 100%); + selected-urgent-foreground: rgba(0, 255, 180, 100%); /* More cyanish light spring green */ + blue: rgba(38, 139, 210, 100%); + urgent-foreground: rgba(204, 102, 102, 100%); + alternate-urgent-background: rgba(75, 81, 96, 90%); + active-foreground: rgba(101, 172, 255, 100%); + lightbg: rgba(238, 232, 213, 100%); + selected-active-foreground: rgba(0, 255, 180, 100%); /* More cyanish light spring green */ + alternate-active-background: rgba(45, 48, 59, 88%); + background: rgba(0, 54, 54, 60%); /* #003636 */ + alternate-normal-foreground: @foreground; + normal-background: rgba(45, 48, 59, 1%); + lightfg: rgba(88, 104, 117, 100%); + selected-normal-background: rgba(0, 42, 42, 80%); /* Darker teal */ + border-color: rgba(124, 131, 137, 100%); + spacing: 2; + separatorcolor: rgba(45, 48, 59, 1%); + urgent-background: rgba(45, 48, 59, 15%); + selected-urgent-background: rgba(0, 42, 42, 80%); /* Darker teal */ + alternate-urgent-foreground: @urgent-foreground; + background-color: rgba(0, 0, 0, 0%); + alternate-active-foreground: @active-foreground; + active-background: rgba(29, 31, 33, 17%); + selected-active-background: rgba(0, 42, 42, 80%); /* Darker teal */ +} + + +window { + background-color: @background; + border: 1; + padding: 5; +} +mainbox { + border: 0; + padding: 0; +} +message { + border: 2px 0px 0px ; + border-color: @separatorcolor; + padding: 1px ; +} +textbox { + text-color: @foreground; +} +listview { + fixed-height: 0; + border: 2px 0px 0px ; + border-color: @separatorcolor; + spacing: 2px ; + scrollbar: true; + padding: 2px 0px 0px ; +} +element { + border: 0; + padding: 1px ; +} +element-text { + background-color: inherit; + text-color: inherit; +} +element.normal.normal { + background-color: @normal-background; + text-color: @normal-foreground; +} +element.normal.urgent { + background-color: @urgent-background; + text-color: @urgent-foreground; +} +element.normal.active { + background-color: @active-background; + text-color: @active-foreground; +} +element.selected.normal { + background-color: @selected-normal-background; + text-color: @selected-normal-foreground; +} +element.selected.urgent { + background-color: @selected-urgent-background; + text-color: @selected-urgent-foreground; +} +element.selected.active { + background-color: @selected-active-background; + text-color: @selected-active-foreground; +} +element.alternate.normal { + background-color: @alternate-normal-background; + text-color: @alternate-normal-foreground; +} +element.alternate.urgent { + background-color: @alternate-urgent-background; + text-color: @alternate-urgent-foreground; +} +element.alternate.active { + background-color: @alternate-active-background; + text-color: @alternate-active-foreground; +} +scrollbar { + width: 4px ; + border: 0; + handle-color: @normal-foreground; + handle-width: 8px ; + padding: 0; +} +mode-switcher { + border: 2px 0px 0px ; + border-color: @separatorcolor; +} +button { + spacing: 0; + text-color: @normal-foreground; +} +button.selected { + background-color: @selected-normal-background; + text-color: @selected-normal-foreground; +} +inputbar { + spacing: 0; + text-color: @normal-foreground; + padding: 1px ; +} +case-indicator { + spacing: 0; + text-color: @normal-foreground; +} +entry { + spacing: 0; + text-color: @normal-foreground; +} +prompt { + spacing: 0; + text-color: @normal-foreground; +} +inputbar { + children: [ prompt,textbox-prompt-colon,entry,case-indicator ]; +} +textbox-prompt-colon { + expand: false; + str: ":"; + margin: 0px 0.3em 0em 0em ; + text-color: @normal-foreground; +} |
