Run XMonad's startup hook only on initial startup

As mentionned in the FAQ, the startupHook is run each time xmonad is restarted with MOD+Q.

Also from a software point of view, it seems important that a restart is not different than a stop followed by a start. Thus there is no way to differentiate a start from a restart from within Xmonad. Hence each time Xmonad is started, it will launch the startupHook

To run programs on startup, they propose to use the usual manner by adding them to .xsession or .Xinitrc.

In your case you can just put

~/.xmonad/autostart

at the end of your .Xinitrc file.


One very slightly dodgy workaround if you're using Ubuntu, and possibly other Debian-based systems, and have installed XMonad via your package manager (which doesn't actually help the person who asked the initial question, but might help others):

Add whatever programs you want to launch to ~/.xmonad/xmonad-session-rc, as if it were a bash script (you don't need to make it executable).

Explanation

In Ubuntu, XMonad is launched from the login screen thanks to /usr/share/xsessions/xmonad.desktop. The program executed by this is not xmonad itself, but the bash script xmonad-session (present at /usr/bin/xmonad), which sources .xmonad/xmonad-session-rc and hence the contents of that file will be executed when you first log in to xmonad.

The workaround is slightly dodgy, as I think that the purpose of the xmonad-session-rc file was to set environment variables, not run programs, but I'm not certain.


If you use xmonad-contrib, simply import Xmonad.Util.SpawnOnce and then use spawnOnce instead of spawn in your startup hook.

Tags:

Startup

Xmonad