Estimated reading time: 3 minutes
Sharing Xresources between systems¶
In amongst the rants in our watercooler channel at work comes this question:
So then, how do custom settings in
Xresources
work if you share your home directory between machines?
The question arises from a much larger topic concerning keeping your home directory in a git repository. The issue Carl is having is that he needs to use different options on different machines and doesn’t relish the idea of having to pull and rebase branches just to keep files in sync. Of course, he doesn’t have to do that and that is the point of this tip.
Basic conditionals¶
With great foresight the authors of xrdb decided that our Xresources
file
should be preprocessed before it is used, the default preprocessor is
cpp. On most of our systems at work, and likely most Linux systems
in general, cpp is GNU cpp. Don’t worry about the size of the
manual though, the interesting features are easy to understand and use. Let’s
look at trimmed example from my configuration file:
#ifndef FIXED_FONT
#define FIXED_FONT xft:Inconsolata:pixelsize=14:antialias=false
#endif
#ifndef BOLD_FIXED_FONT
#define BOLD_FIXED_FONT FIXED_FONT:bold
#endif
urxvt.font: FIXED_FONT
urxvt.boldFont: BOLD_FIXED_FONT
irssi.font: FIXED_FONT
This small snippet sets a couple of default fonts that we can reference
throughout our resource file as FIXED_FONT
and BOLD_FIXED_FONT
. This
way we can easily change the value in one place and it trickles down to all our
programs. Or we can define different options at runtime by specifying values
to xrdb, such as xrdb -DFIXED_FONT=xft:Monospace:pixelsize=10
.
And don’t worry, cpp is smart enough to cope with the use =
in
our definition.
Per system conditionals¶
On one system I use Inconsolata is not installed, so the configuration above
wouldn’t work on it. xrdb gives us a way around the problem though,
it defines a set of symbols we can use including one to test the system’s
hostname
. nebula
, the system that doesn’t have Inconsolata, does have
terminus and I can use that on there with a couple of small changes.
#ifndef FIXED_FONT
#ifdef SRVR_nebula
#define FIXED_FONT xft:Terminus:pixelsize=14:antialias=false
#else
#define FIXED_FONT xft:Inconsolata:pixelsize=14:antialias=false
#endif
#endif
Note
As we’re using X11’s xrdb it is network aware, it defines
SRVR_name
for the X
server name and CLNT_name
for the
client name. Using these it is easy to configure systems where the server
and clients are on different machines.
Conditionals for server options¶
You can also change configured settings based on the extensions loaded in to the
server, for example to disable the screensaver in muxi
if the DPMS extension is supported we’d test for
EXT_DPMS
:
#ifdef EXT_DPMS
muxi.screensaver: false
#endif
Testing your resource files¶
When you’re testing your own ~/.Xresources
file you can use the
-n
option with xrdb, it tells xrdb to dump the
settings as they would be used instead of updating the resource database. This
makes it easy to check if our conditional statements are working correctly
without having to open and close applications constantly. You can also define
and cancel symbol definitions with the -D
and -U
options
for xrdb, this allows you to test your modifications that rely on
symbols that are normally exported by xrdb.
Using a more featureful preprocessor¶
You can also choose a different preprocessor if cpp isn’t up to your
needs by specifying a -cpp option to xrdb. The only
caveat is that must accept -D
for defines, -U
for symbol
cancelling and -I
for include paths. An example that does fit these
restrictions is m4, and it might be a good choice if you wish to do more
advanced things in your configuration file such as fancy filtering or the use
of loops for defining colour tables.
Authenticate this page by pasting this signature into Keybase.
Have a suggestion or see a typo? Edit this page