+++
title = "Ideas from my Development Setup: Clipboard"
date = "2020-10-07"
author = "Ceda EI"
tags = ["xorg", "linux", "development"]
keywords = ["xorg", "linux", "development"]
description = "Things with clipboards: Implicit copying and swapping"
showFullContent = false
+++


## Ideas

The clipboard is a basic yet integral part of every environment. Over time, I
have had quite a few ideas regarding clipboards. I have implemented the
following ideas currently:

### Clipboard Swap

Inspired by vim's registers, I thought about implementing something similar on
a system level for Xorg. My current implementation basically swaps the contents
of the clipboard with another clipboard. Currently, the workflow looks
something like this.

- Copy text `abc`: Writes `abc` to the main clipboard.
- Press ``` Ctrl+` ```: Swaps content of hidden clipboard with main clipboard.
- Copy text `def`: Writes `def` to the main clipboard.
- Paste with `Ctrl+v`: Pastes text `def` as expected.
- Press ``` Ctrl+` ```: Swaps content of hidden clipboard with main clipboard.
- Paste: Pastes text `abc`.

### Implicit Copying

Some time ago, a realization hit me that I practically always select text for
the sake of copying or cutting it. Cutting is just copying and then deleting
that text. So everytime I select text, it is for copying it. Due to this, I
implemented implicit copying where text is copied just by selecting it.  So,
the workflow for copying is reduced from select, ctrl+c, paste to select, paste
while the workflow for cutting is same.

## Clipboards in Xorg

In Xorg, clipboards are called selections. Xorg has three selections:
Primary, Secondary and Clipboard.

- Primary: Whenever text is selected, it is copied into primary selection. You
  can paste contents of the primary selection by pressing middle mouse button
  in most applications.
- Secondary: There is no consensus on what this is supposed to be used for and
  hence it is used by practically nothing.
- Clipboard: This is the selection that practically every application interacts
  with. Ctrl-C and Ctrl-V are commonly bound to writing to this clipboard.

## Implementation

Secondary selection is the perfect selection to swap the contents of Clipboard
selection with. It is practically never used so nothing will overwrite the
contents of secondary selection.

Here is the `clip_swap.sh` which I have bound to ``` Ctrl+` ``` in my i3
config.

```bash
#!/usr/bin/env bash

x=$(xclip -selection secondary -out)
xclip -selection clipboard -out | xclip -selection secondary
echo "$x" | xclip -selection clipboard
```

For implementing implicit copying, I basically needed a daemon that watched for
changes in primary selection and copies them over to clipboard selection. Here
are the contents of `clip_syncd.sh`

```bash
#!/usr/bin/env bash
# Daemon to synchronize PRIMARY selection with CLIPBOARD selection

old=""
while :; do
	new=$(xclip -selection primary -out) || { sleep 0.5; continue; }
	if [[ $new != "$old" ]]; then
		xclip -selection primary -out | xclip -selection clipboard -in
		old="$new"
	fi
	sleep 0.5
done
```
