xinitrc
Related articles
The ~/.xinitrc
file is a shell script read by xinit
and by its front-end startx
. It is mainly used to execute desktop environments, window managers and other programs when starting the X server (e.g., starting daemons and setting environment variables). The xinit
program starts the X Window System server and works as first client program on systems that are not using a display manager.
One of the main functions of ~/.xinitrc
is to dictate which client for the X Window System is invoked with startx
or xinit
programs on a per-user basis. There exists numerous additional specifications and commands that may also be added to ~/.xinitrc
as you further customize your system.
Most DMs also source the similar xprofile before xinit.
Contents
Getting started
/etc/skel/
contains files and directories to provide sane defaults for newly created user accounts. (The name skel is derived from the word skeleton, because the files it contains form the basic structure for users' home directories.) The xorg-xinit package will populate /etc/skel
with a framework .xinitrc
file.
Copy the sample /etc/skel/.xinitrc
file to your home directory:
$ cp /etc/skel/.xinitrc ~
Now, edit ~/.xinitrc
and uncomment the line that corresponds to your DE/WM. For example, if you want to test your basic X configuration (mouse, keyboard, graphics resolution), you can simply use xterm:
#!/bin/sh # # ~/.xinitrc # # Executed by startx (run your window manager from here) if [ -d /etc/X11/xinit/xinitrc.d ]; then for f in /etc/X11/xinit/xinitrc.d/*; do [ -x "$f" ] && . "$f" done unset f fi # exec gnome-session # exec startkde # exec startxfce4 # exec wmaker # exec icewm # exec blackbox # exec fluxbox # exec openbox-session # exec cinnamon-session # ...or the Window Manager of your choice exec xterm
After editing ~/.xinitrc
properly, it's time to run X. To run X as a non-root user, issue:
$ startx
or
$ xinit -- :1 -nolisten tcp vt$XDG_VTNR
Your DE/WM of choice should now start up. You are now free to test your keyboard with its layout, moving your mouse around and of course enjoy the view.
Configuration
When a display manager is not used, it is important to keep in mind that the life of the X session starts and ends with ~/.xinitrc
. This means that once the script quits, X quits regardless of whether you still have running programs (including your window manager). Therefore it's important that the window manager quitting and X quitting should coincide. This is easily achieved by running the window manager as the last program in the script.
Following is a simple ~/.xinitrc
file example, including some startup programs:
~/.xinitrc
#!/bin/sh if [ -d /etc/X11/xinit/xinitrc.d ]; then for f in /etc/X11/xinit/xinitrc.d/*; do [ -x "$f" ] && . "$f" done unset f fi xrdb -merge ~/.Xresources # update x resources db xscreensaver -no-splash & # starts screensaver daemon xsetroot -cursor_name left_ptr & # sets the cursor icon sh ~/.fehbg & # sets the background image exec openbox-session # starts the window manager
Note that in the example above, programs such as xscreensaver
, xsetroot
and sh
are run in the background (&
suffix added). Otherwise, the script would halt and wait for each program and daemons to exit before executing openbox-session
. Also note that openbox-session
is not backgrounded. This ensures that the script will not quit until openbox does.
Prepending the window manager openbox-session
with exec
is recommended as it replaces the current process with that process, so the script will stop running and X won't exit even if the process forks into the background.
Tips and tricks
Override xinitrc from command line
If you have a working ~/.xinitrc
, but just want to try other WM/DE, you can run it by issuing startx
followed by the path to the window manager:
$ startx /full/path/to/window-manager
Note that the full path is required. Optionally, you can also override /etc/X11/xinit/xserverrc
file (which stores the default X server options) with custom options by appending them after --
, e.g.:
$ startx /usr/bin/enlightenment -- -nolisten tcp -br +bs -dpi 96 vt$XDG_VTNR
or
$ xinit /usr/bin/enlightenment -- -nolisten tcp -br +bs -dpi 96 vt$XDG_VTNR
See also man startx
.
Making a DE/WM choice
If you are frequently switching between different DEs/WMs, it is recommended to either use a Display manager or add code to .xinitrc
. The code described next consists of a simple few lines, which will take the argument and load the desired desktop environment or window manager.
The following example ~/.xinitrc
shows how to start a particular DE/WM with an argument:
~/.xinitrc
#!/bin/sh # # ~/.xinitrc # # Executed by startx (run your window manager from here) if [ -d /etc/X11/xinit/xinitrc.d ]; then for f in /etc/X11/xinit/xinitrc.d/*; do [ -x "$f" ] && . "$f" done unset f fi # Here Xfce is kept as default session=${1:-xfce} case $session in awesome ) exec awesome;; bspwm ) exec bspwm;; catwm ) exec catwm;; cinnamon ) exec cinnamon-session;; dwm ) exec dwm;; enlightenment ) exec enlightenment_start;; ede ) exec startede;; fluxbox ) exec startfluxbox;; gnome ) exec gnome-session;; gnome-classic ) exec gnome-session --session=gnome-classic;; i3|i3wm ) exec i3;; icewm ) exec icewm-session;; jwm ) exec jwm;; kde ) exec startkde;; mate ) exec mate-session;; monster|monsterwm ) exec monsterwm;; notion ) exec notion;; openbox ) exec openbox-session;; unity ) exec unity;; xfce|xfce4 ) exec startxfce4;; xmonad ) exec xmonad;; # No known session, try to run it as command *) exec $1;; esac
Then copy the /etc/X11/xinit/xserverrc
file into your home directory:
$ cp /etc/X11/xinit/xserverrc ~/.xserverrc
After that, you can easily start a particular DE/WM by passing an argument, e.g.:
$ xinit $ xinit gnome $ xinit kde $ xinit wmaker
or
$ startx $ startx ~/.xinitrc gnome $ startx ~/.xinitrc kde $ startx ~/.xinitrc wmaker
Starting applications without a window manager
It is possible to start only specific applications without a window manager, although most likely this is only useful with a single application shown in full-screen mode. For example:
~/.xinitrc
exec chromium
With this method you need to set each application window's geometry through its own configuration files, if possible at all.
See also Display manager#Starting applications without a window manager.