
NB: This is a repost on this blog of a post made on nixers.net
We often hear discussions about X configuration files and their roles. Namely: xinitrc,xserverrc,xresources,xdefaults,xprofile,xsession,xmodmap. So let’s try to clear up this mumbo jumbo of words.
There’s roughly two ways to start your X environment, one is via xinit and the other is via a display manager (fancy login screen). Depending on which one you use, different configuration files will be loaded.
If starting via xinit, or startx which is a wrapper over xinit,
then the ~/.xinitrc will be loaded, and if not present will load the
global /etc/X11/xinit/xinitrc. This will run all the lines found in it,
interpreted by /bin/sh and will stop at the last one. The X session will
stop when that last program terminates.
If using the globally available xinitrc it will include in an alphabetical
order sub-xinitrc found in the /etc/X11/xinit/xinitrc.d/.
That globally available xinitrc loads two more configurations:
- Xresources, found in
~/.Xresourcesor/etc/X11/xinit/.Xresources which consists of the key/value pair accessible for all X clients, the resources. xinit executesxrdb -merge ~/.Xresourcesor xrdb with the global one. - Xmodmap, locally in
~/.Xmodmapand globally in/etc/X11/xinit/.Xmodmap. This will runxmodmap $thefile. So in theory instead of having all those xmodmap lines that we find so commonly in the .xinitrc file (I’m guilty of this too) we can separate them into a .Xmodmap file instead.
xinit/startx will finally start the X server, it does it by executing a script found in ~/.xserverrc or globally /etc/X11/xinit/xserverrc. This consists of simply:
exec /usr/bin/X -nolisten tcp "$@"However, replacing this xserverrc allows us to start X in different ways.
What about initiating a graphical session from the display manager.
Instead of xinitrc the file loaded at login will be the Xsession
file. So similar to xinitrc we have globally a default located at
/etc/X11/Xsession.options along with a directory of sub-xsessions to
be loaded in /etc/X11/Xsession.d. Also similar to xinit the default
Xsession will load the Xresources. As for local configs there are many
of them depending on what the type of session, I quote:
If the user has a
~/.xsessionrcfile, read it. (used by all sessions types)
If a specific session was selected in the DM (GDM, KDM, WDM, LightDM, …) , run it.
Otherwise, if the user has a~/.xsessionor~/.Xsessionfile, run it.
Otherwise, if the/usr/bin/x-session-managercommand exists, run it.
Otherwise, if the/usr/bin/x-window-managercommand exists, run it.
Otherwise, if the/usr/bin/x-terminal-emulatorcommand exists, run it.
Some specific display manager include in their default Xsession an extra configuration called Xprofile.
For example:
- GDM -
/etc/gdm/Xsession - LightDM -
/etc/lightdm/Xsession - LXDM -
/etc/lxdm/Xsession - SDDM -
/usr/share/sddm/scripts/Xsession
Otherwise, if you want the Xprofile, you have to source the file manually from startx/xinit or XDM or any other display manager.
Now for something unrelated, Xdefaults is the old version of Xresources.
The way it was done in the old days is that Xdefaults was read every single time a client program (Xlib) was started, unlike Xresources which have properties stored in the root window/resource manager (think xrdb). So that means the old method, Xdefaults, couldn’t be used over the network because you needed direct access to the file.
Now that gets a bit complicated because there could be multiple Xdefaults
files found in different ways other than ~/.Xdefaults.
I quote:
There also is the
$XENVIRONMENTvariable, which defaults to~/.Xdefaults-hostname($XENVIRONMENT/.Xdefaults) if not set. This is used in the same way as.Xdefaults, but is always read regardless of whetherRESOURCE_MANAGERis present. You can use.Xdefaults-hostnamefiles to keep some settings machine-specific while using xrdb for the global ones
The fourth location is the directory pointed to by the
$XAPPLRESDIRenvironment variable. (Oddly, if the variable is not set,$HOMEis used as the default.) When a program is started, it looks if any of the following files exist (the file name being the same as the program’s class name):
$XAPPLRESDIR/$LC_CTYPE/XTerm
$XAPPLRESDIR/language/XTerm
$XAPPLRESDIR/XTerm
The fifth location is the system-wide “app-defaults” directories. Again, the app-defaults directories are checked on program startup if they have a file named after the program. For example, XTerm (on Arch Linux) uses:
/etc/X11/$LC_CTYPE/app-defaults/XTerm
/etc/X11/language/app-defaults/XTerm
/etc/X11/app-defaults/XTerm
/usr/share/X11/$LC_CTYPE/app-defaults/XTerm
/usr/share/X11/language/app-defaults/XTerm
/usr/share/X11/app-defaults/XTermThe app-defaults files are usually installed into
/usr/sharealong with the program itself; administrator overrides would go to/etc.
I hope that helps clear things up.
References:
- https://wiki.archlinux.org/index.php/Xinit
- https://wiki.archlinux.org/index.php/X_resources
- https://wiki.debian.org/Xsession
- https://wiki.archlinux.org/index.php/Xprofile
- https://superuser.com/questions/243914/what-is-the-difference-between-xresources-and-xdefaults#243916
If you want to have a more in depth discussion I'm always available by email or irc.
We can discuss and argue about what you like and dislike, about new ideas to consider, opinions, etc..
If you don't feel like "having a discussion" or are intimidated by emails
then you can simply say something small in the comment sections below
and/or share it with your friends.