In this post, I'll demonstrate adding a new meta-key combination, Windows-Shift-S to select and copy part of a screen, format the data so any program can use it, and copy the image to the system clipboard. The end result will be the same meta-key that Windows 10 uses to capture screens, and the result will be ready to paste -- no intermediate step leaving the result in mtpaint.
Capturing the image in a format that was usable by all my programs turned out to be trickier than I thought. At first, I thought I could send the output of scrot to xclip. This works for LibreOffice Writer and Gmail, but it didn't work for Blogger. Hence,it was time to take a deeper dive into this process. The 'net being the 'net, there's often someone who's run into the same problem. In this case, artfulrobot (their handle) on askubuntu.com provided a solution that I'm going to work with here.
In this post, I'll discuss using scrot, base64, and xclip to add Snipping Tool functionality to Lubuntu. We'll start by making sure we have all three programs installed, then we'll test invoking them from the command line, and finally we'll map them to meta-keys in the Openbox window manager.
First, make sure these the tools are installed on your system. Base64 should be installedd on Lubuntu, but you may need to install scrot and xclip yourself. Open a terminal window, and try executing xclip and scrot; if they load, everything is good. If you get a message like:
The program 'xclip' is currently not installed. You can install it by typing: sudo apt install xclip
If you get that message, go ahead and install the tool using apt:
sudo apt install xclip
Now you should have all three tools installed. There are a lot of moving parts, so let's start with the solution and work backwards. If you haven't read the previous post, I suggest you browse it now.
First, edit the openbox configuration file using vi or your favorite text editor:
tom@dv8000:~$ cd .config/openbox/ tom@dv8000:~/.config/openbox$ ls -l total 36 -rw-r--r-- 1 tom tom 33058 Jan 23 14:06 lubuntu-rc.xml tom@dv8000:~/.config/openbox$ cp lubuntu-rc.xml lubuntu-rc.xml.safe tom@dv8000:~/.config/openbox$ vi lubuntu-rc.xml
The command we need to execute this time is a bit too complicated to include directly in the openbox configuration file, so we'll wrap it in a simple shell script on line 394. The easiest place to put the shell script is in your home directory until you're satisfied with it. In my case, that's /home/tom; I'll name the shell script ScrotIt, a meshing of SnipIt and scrot. Using your editor, add lines 390 through 397, substituting your home directory for /home/tom:
384 <!-- Windows-s key to select screen and copy to mtpaint --> 385 <keybind key="W-s"> 386 <action name="Execute"> 387 <command> scrot -s -e 'mtpaint $f ' /tmp/ScrotSave.png </command> 388 </action> 389 </keybind> 390 <!-- Windows-Shift-s to select screen and copy to xclip --> 391 <keybind key="W-S-s"> 392 <action name="Execute"> 393 <command> 394 /home/tom/ScrotIt 395 </command> 396 </action> 397 </keybind>
After you added the new keybinding, save the file and refresh openbox with your changes:
openbox --reconfigure
Next, edit the script ScrotIt using your favorite editor, and add the following lines:
1 #!/bin/bash 2 scrot -s /tmp/scrotSave.png && \ 3 echo "<img src='data:image/png;base64,"\ 4 $(base64 -w0 /tmp/scrotSave.png)\ 5 "' />" | 6 xclip -selection clipboard -t text/html
Let's walk through the code and see what's happening:
- Line 2 runs the scrot command, saving the output in /tmp/scrotSave
- Lines 3 thru 5 build an ASCII string with the image
- Line 3 starts an <img> tag, and the source is a data URI. The MIME type is image/png, and it will be base64-encoded.
- Line 4 runs the base64 command, encoding the image data as an ASCII character string. The bash $( ) construction executes base64 and returns the output as a string to the script running the command
- Line 5 closes the <img> tag we started in line 3. The shell concatenates the string in line 3, the output of base64 in line 4, and the closing tag string in line 5 into one long string.
- Finally, on line 5 the output of the echo command that started on line 3 is piped to xclip on line 6. xclip takes the output and leaves it in the system clipboard, ready for pasting.
The last step is to make the script executable and test it. After typing in the ScrotIt command on the second line and pressing enter, ScrotIt will wait until you select an area of your screen.
tom@dv8000:~$ chmod +x ScrotIt tom@dv8000:~$ ./ScrotIt
Select an area of your screen and paste it into an application that supports images, like your word processor or mail program (but not a text editor like vi). I copied and pasted the following image into blogger:
If all went well, now try it with the Windows-Shift-S meta-key combination that you defined for openbox. After selecting an area of your screen with your mouse, you should be able to paste it into your document.
Using these tools, you can select, copy, and paste from your screen into documents as easily with Linux as you can with Windows 10.
References:
In addition to the Unix man pages for scrot, base64, and xclip, I found the following web pages to be useful.
https://wiki.archlinux.org/index.php/openbox#Keybinds
https://askubuntu.com/questions/759651/how-to-copy-an-image-to-the-clipboard-from-a-file-using-command-line
https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/Data_URIs