32 comments

[ 5.8 ms ] story [ 26.6 ms ] thread
May I ask what desktop environment you use, and what you usually use this for?

I ask because a good DE should remember the settings pertaining to each monitor configuration (display positions of course, but also things like panels placed in secondary monitors). I've been using Plasma (KDE) for about a year and it handles this reasonably well.

Lots of people don't use any "desktop environment." I just use ratpoison, for example.
Well, call it a "window manager" then, it still should handle this. But that's just my opinion of the responsibilities of WMs/DEs/whatever you call them, and I understand that some don't.
No, handling screen layout isn't the window manager's responsibility. That's what external tools like xrandr and its various GUIs are for.
I agree that good software should do this but unfortunately multi-monitor configuration software isn't always very good. My Ubuntu 15.10 system with Unity desktop decides to move the taskbar/dock thing to the other monitor every time I turn the other monitor on in the morning. There is nothing in the Screen Display GUI that seems to allow me to stop this from happening. Out of frustration I've resorted to running the xrandr command a few times (once is sometimes not enough!) to fix it each time. This tool would at least automate the task for me and seems useful.
My laptop running i3 is often moved between a dock on my desk and used as a regular laptop, I have to say I've been looking to write something like this but it fell by the wayside. Very useful IMO
Gnome doesn't do this. Without fail, every time, it puts the dock on the wrong external display. Every. Time.
feel your frustration , I just never take mine of the dock cause i can't be arsed anymore.
This issue is the very reason I use KDE Plasma, I never came across another DE that handled multi-monitors correctly.
I use dwm on my laptop, and I have 2 external monitors.

Every morning I had to make an xrandr call when I plugged them, and another one at the end of the day when I unplugged them to make my window manager aware of my screen layout.

I was tired so I automated the thing.

I have a little python script to do a similar thing:

https://github.com/larkery/nix-session/blob/master/scripts/d...

This remembers the randr state that's associated with plugged in displays by their EDID and the ACPI lid switch. When you change the randr state, it remembers it, and when you change what displays are connected or open the laptop lid, it loads a previously remembered state if there is one. The state saving and loading is done by arandr, which handles the resolution, position, and choice of primary output.

I used a bash script to do this, until I got a laptop that has only a mini-display port. Now I don't/can't connect to anything :(
Why? you would've needed a cable anyway, so not owning the right one is no excuse, (m)DP can connect to pretty much anything using cheap _passive_ adapter cables.
For reference, there's also autorandr [1] and x-on-resize [2].

[1] https://github.com/wertarbyte/autorandr

[2] http://keithp.com/blogs/x-on-resize/

I am not sure if I just overlooked something, but autorandr doesn't seem to stay in the background and wait for a change but needs to be called manually, is that correct? While saving profiles can be useful if you do that a lot, that task is easily solved by writing the xrandr command used into a shellscript.

x-on-resize looks like a good alternative to xoutputd though. It's probably worth to take a closer look at it and use the one whose code is simpler and easier to read.

Thank you for those links, I actually tried to find something like this before implementing my own solution. I guess I didn't search enough.
This is exactly what I needed, gonna put it in my window manager startup script. I already wrote a dock and undock script for my laptop a while ago, which I still had to run manually, so this is the perfect addition to that script. Though I had some problems compiling it. For others who want to try it: On some systems (gentoo here) flex replaces lex and you need to use -lfl to link it, even though lex seems to be ususally a symlink to flex, there is no symlink for the libraries. Also on some distributions yacc doesn't seem to come with liby anymore, just remove the -ly from cflags.

TL;DR: Replace "LDADD+= -ll -ly -lX11 -lXrandr" with "LDADD+= -lfl -lX11 -lXrandr" to make it compile on Gentoo. Make sure yacc and flex are emerged.

Thank you for your comment, I tested on Debian jessie, and OpenBSD only. I will try to make the build more compatible to other distro/OS.
For those on Mac, Slate will do the same thing: https://github.com/jigish/slate
Actually for those on the Mac, OS X will do the same thing. It tries to at least (not 100% reliable).
"xoutputd is a daemon that monitors the connection state of outputs and then executes commands based on defined rules."

I'm not aware of anything built in to OS X that allows you to execute scripts to perform custom actions when displays are connected/disconnected. OS X just tries to replicate the last layout you had.

* Plugged into your desk monitor? You can have Slate hide Steam and put MacVim & iTerm side by side. * Plugged into your TV? You can have Slate run a script to make sure your Plex server is up and then full-screen your browser. * Etc.

Sadly, Slate hasn't been updated in three years and recent El Capitan releases has broken it for certain applications, most importantly iTerm2.
KDE does this automatically. I'd guess there is similar functionality for other DEs too.
The MATE DE seems to handle this pretty well too.
As an i3wm user I couldn't be happier
I'm glad it is useful for someone else.
As an i3wm user I couldn't be happier