When I resume, scripts in /etc/pm/sleep.d/ are run, but they run as root, without knowledge of my screen and username. It might work if I would hard code my username and export the default DISPLAY :0 in these scripts, but that feels like a very ugly hack.

Scripts in ~/.config/autostart/xyz.desktop, run after login, but they don't run after merely unlocking the screen after resume.

Is there a way to run scripts after unlocking the screen after a resume?

(Replace SCREEN_LOCKED and SCREEN_UNLOCKED with the actions you want to perform.)

Using xrandr 1>/dev/null 2>1 as the action on unlocking fixed my problem that monitor resolutions/positions were not being correctly restored on screen unlocking (xrandr seems to cause a re-reading of screen settings). I added this line as a background task in my .bash_profile (strictly it might be better as a desktop file in ~/.config/autostart, since that only runs when you start gnome):

You can run a script using start-stop-daemon. start-stop-daemon can fork the thread running as different uid and gid, hence solving your problem.

What you need to do is to write a job script placed in system PATH like /usr/bin, and to create an extra daemon script in /etc/pm/sleep.d. Matching pm-suspend action like 'resume' or 'thaw' the daemon script commits the job script via 'start-stop-daemon --start $ARGs --name nm-rtvt--exec /usr/bin/job_script', where 'ARGs' could be '--chuid 1001:1001' or just '--user your_username'.

And for integrity, you might as well want the daemon script to stop the damon named 'nm-rtvt' before suspend via 'start-stop-daemon --stop <...>', matching pm-suspend action like 'suspend' or 'hibernate'.

For details, man start-stop-daemon. And there are many other examples in /etc/init.d of daemon scripts.