diff options
Diffstat (limited to 'tools/clipboard')
-rwxr-xr-x | tools/clipboard | 106 |
1 files changed, 106 insertions, 0 deletions
diff --git a/tools/clipboard b/tools/clipboard new file mode 100755 index 0000000..79ad150 --- /dev/null +++ b/tools/clipboard @@ -0,0 +1,106 @@ +#!/bin/bash +# +# Clipboard menu +# +# usage: +# clipboard init - clear all buffers +# clipboard menu_paste - pop up a menu to select which buffer to paste +# clipboard menu_set - pop up a menu to select which buffer to save +# the current X selection to +# clipboard paste N - N is buffer 1-9 +# clipboard set N - N is buffer 1-9 +# clipboard push - stack/queue push (push to buffer 1) +# clipboard pop - stack pop (last in first out - pop from buffer 1) +# clipboard pop_queue - queue pop (first in first out - pop from top of stack) +# +# Current stack depth is held in slot 10, and slot 0 is used as temp space for +# stack rotation. +# +command=$1 +option=$2 +source ~/.colors + +function entries() { + # title entry + if [ $command = menu_paste ]; then + echo -n "\"Paste from slot:\" /bin/true " + else + echo -n "\"Yank to slot:\" /bin/true " + fi + + for i in $(seq 1 9); do + repr=$(xcb -p $i | tr '\n$*?"'\''' ' ' | cut --bytes 1-59) + if [ $command = menu_paste ]; then + cmd_item="$0 paste $i" + else + cmd_item="$0 set $i" + fi + #printf '%q %q ' $i "$repr" "$cmd_item" +# echo -n "\"$i: $repr\" \"$cmd_item\" " + echo -n "\"$i:$repr \" \"$cmd_item\" " + done +} + +function menu() { + echo ~/.tools/ratmenu -label "\"clipboard $command\"" \ + -style dreary -fg \"$COLOR11\" -bg \"$COLOR0\" -io 2 $(entries) | sh +} + +function get_stack_depth() { + stack_depth=$(xcb -p 10) + echo "stack_depth=$stack_depth" >/dev/stderr +} + +function set_stack_depth() { + echo "setting stack_depth=$1" >/dev/stderr + echo $1 | xcb -n 11 -s 10 +} + +function increment_stack_depth() { + get_stack_depth + set_stack_depth $[ $stack_depth + 1 ] +} + +function decrement_stack_depth() { + get_stack_depth + set_stack_depth $[ $stack_depth - 1 ] +} + +if [ $command = init ]; then + # Clear all buffers + xcb -n 10 -s 0-9 </dev/null + set_stack_depth 0 +elif [ $command = menu_paste -o $command = menu_set ]; then + menu +elif [ $command = paste ]; then + xcb -p $option | xclip + ~/bin/paste + +elif [ $command = set ]; then + xclip -o | xcb -n 10 -s $option +elif [ $command = push ]; then + get_stack_depth + if [ $stack_depth -lt 9 ]; then + xcb -n 10 -r 1 + $0 set 1 + increment_stack_depth + fi +elif [ $command = pop ]; then + get_stack_depth + if [ $stack_depth -gt 0 ]; then + $0 paste 1 + # Clear buffer 0 so that rotation won't put its contents into spot 9 + xcb -n 10 -s 0 < /dev/null + xcb -n 10 -r -1 + decrement_stack_depth + fi +elif [ $command = pop_queue ]; then + get_stack_depth + if [ $stack_depth -gt 0 ]; then + $0 paste $stack_depth + # Clear buffer at top of stack + xcb -n 10 -s $stack_depth < /dev/null + decrement_stack_depth + fi +fi + |