Saturday, March 22, 2014

Compton Comes to Debian

(EDIT: This is also excellent for LXDE in case any of you got the impression this was for Openbox only.)

No, not the city, the compositor. Compton is a compositor program, like xcompmgr or cairo-compmgr, that adds effects to your desktop such as shadows and transparency. In fact, Compton is actually a sequel to xcompmgr that aims to improve and expand on the original with a whole host of bug fixes and new features, in particular adjusting window opacity.

Adjusting window opacity--for example, making all background windows transparent--is a feature I've been wanting for a long time. On OS X, there used to be an input manager called SetAlphaValue that did this, but it only worked for Cocoa windows and didn't work for the Finder or iTunes. For Linux, XFCE has had its own built-in compositor for awhile, and it's probably the only thing that's tempted me to switch, but I'm determined to be an Openbox loyalist. Xcompmgr is what we were stuck with, until Compton came along. The only problem was it wasn't in Debian's repositories, and for some excellent reason which is now completely lost to me, I never tried compiling it. But I don't have to dwell on my laziness anymore, because Compton has now arrived. It's now in the Jessie and Sid repositories, which I just noticed a week ago.

So after installing it, what do you do with it? Well, like xcompmgr, you can input all the settings from the command line (-cCf -D1 -t -8 -l -13 -r 10 -o .4), but with Compton you can also put all that junk in ~/.config/compton.conf and just enter "compton -b" in your autostart file (the -b daemonizes it). Here's my compton.conf:

# Shadow
# Enable client-side shadows on windows.
shadow = true;
# Avoid drawing shadows on dock/panel windows.
no-dock-shadow = true;
# Don't draw shadows on DND windows.
no-dnd-shadow = false;
# Zero the part of the shadow's mask behind
# the window (experimental).
clear-shadow = true;
# The blur radius for shadows. (default 12)
shadow-radius = 7;
# The left offset for shadows. (default -15)
shadow-offset-x = -11;
# The top offset for shadows. (default -15)
shadow-offset-y = -8;
# The translucency for shadows. (default .75)
shadow-opacity = 0.5;

# The shadow exclude options are helpful if you
# have shadows enabled. Due to the way compton
# draws its shadows, certain applications will
# have visual glitches (most applications are
# fine, only apps that do weird things with
# xshapes or argb are affected).
# This list includes all the affected apps I
# found in my testing. The "! name~=''" part
# excludes shadows on any "Unknown" windows,
# this prevents a visual glitch with the XFWM
# alt tab switcher (also prevents shadows on
# Openbox menu, so I commented it out).

shadow-exclude = [
# "! name~=''",
"name = 'Notification'",
"name = 'Plank'",
"name = 'Docky'",
"name *= 'Firefox'",
"name *= 'VLC'",
"name *= 'Chrome'",
"name *= 'Chromium'",
"class_g = 'Conky'",
"class_g = 'Kupfer'",
"class_g = 'Synapse'",
"class_g ?= 'Notify-osd'",
"class_g ?= 'Cairo-dock'",
"class_g ?= 'Xfce4-notifyd'",
"class_g ?= 'Xfce4-power-manager'"

# Opacity
# The opacity for menus. (default 1.0)
menu-opacity = 0.94;
# Default opacity of inactive windows.
# (0.0 - 1.0)
inactive-opacity = 0.6;
# Exclude applications from opacity.
focus-exclude = [
"name *= 'mplayer2'",
"name *= 'VLC'",
"class_g = 'XScreenSaver'"

# XRender backend: Step size for alpha pictures.
# Increasing it may result in less X resource
# usage, though some of your effects may become
# disabled.
alpha-step = 0.04;

# This prevents opacity being ignored for some
# apps. For example without this enabled
# xfce4-notifyd is 100% opacity no matter what.
detect-client-opacity = true;

# Keeps Openbox OSD focused.
mark-ovredir-focused = true;

# Limit Compton to repaint at most once every
# 1 /refresh_rate second to boost performance.
# Incompatible with certain VSync methods.
sw-opti = true;

# Unredirect all windows if a full-screen
# opaque window is detected, to maximize
# performance for full-screen windows.
# This option prevented my Openbox desktop from
# loading when put in my autostart file, so I
# commented it out.
#unredir-if-possible = true;

Basically, this creates subtle shadows around windows and menus and makes all background windows transparent. Also, menus are slightly transparent. There are some glitches as not every application draws windows exactly the same, but as you can see, you can enter exclusion rules for both shadows and opacity if any are giving you problems. The excluded applications are from sample compton.conf files I copied and pasted from the web (obviously I'm not using Chrome), but I've added the opacity exclusions for my screensaver and video players. Also I found a couple of Openbox-specific glitches that are noted in the comments.

So, looks good, you say? But what about performance? Surely this luxurious fanciness slows your desktop to a crawl, does it not? Well, I don't have 3d acceleration on this laptop, so I have to use the XRender backend instead of glx. And even then, performance is good. Menus and window switching are slightly less responsive, but not enough to be annoying. CPU usage increases, but it's only momentary. All-in-all I give Compton an A+ and think maybe it's time for a Jessie upgrade on all my computers.


  1. Are those screenshots straight outta Compton?

    I gotta say, it was a good day.

    1. Saw the police and they rolled right past me.

  2. If only this would be back-ported to Debian 7.x/Wheezy/stable...

  3. Kind of off-topic, but are you running your 1.5 Ghz Powerbook without 3D acceleration? I ask because, after days of tinkering, I finally got acceleration on my Powerbook (same as yours). All I did was follow the steps in the Configuration part of your outline, but added "radeon.modeset=1", as well as the other kernel arguments you mentioned, to yaboot.conf. I get no suspend, and I have to turn up the brightness once I reach GDM on boot (I'm running MintPPC 11), but I've now got full acceleration. My xorg.conf is pretty bare as well; just enabling EXA and setting DRI mode. Just thought I'd mention this in case you wanted to give it a try...

    1. I run it without 3D acceleration because I prefer to have suspend, and the radeon driver gives excellent 2D performance and video playback. When I try to enable 3D, it's hit and miss, probably because I forget that radeon.modeset=1 option. It's funny when I follow my own instructions and I can't get it working. I'll have to add that to my guide.