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.