aboutsummaryrefslogtreecommitdiff
path: root/config/ratpoison/clipboard
blob: 093a6d1e801df9cad275fad714c6400b8fd526f9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
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 ~/.config/ratpoison/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