Fixing multiple monitor position in Ubuntu Gnome 14.04
Upon switching to Gnome 3/Shell I found that my two monitor positions were not persisting after reboot, or even after suspending. N. Bernaerts wrote an excellent post on how to fix this, complete with a dynamic script that fixes your monitor positions based on your monitors.xml. I have made a minor extension to this script that also handles correcting the primary monitor flag. For me, the display manager was not only reversing the left/right positions of the monitors, but was also setting the wrong one to be primary. Here are instructions, summarized from N. Bernaerts’ site for fixing these issues.
- 
    Setup a clean configuration, as you want it by deleting your old monitors.xmlfile and starting fresh with a new one, created using the Gnome display settings tool.rm ~/.config/monitors.xml gnome-control-centerNow go to Displays, and change the positions to how you would like them. 
- 
    Open ~/.config/monitors.xmlin an editor and make sure the display you want to be primary has a “yes” for the primary flag.
- 
    Install the libxml2-utilspackage if not already installed.sudo apt-get install libxml2-utils
- 
    Copy and paste the below script (or download it using wget) to a directory on your path and make it executable. sudo wget -O /usr/local/sbin/update-monitor-position /assets/files/update-monitor-position chmod +x /usr/local/sbin/update-monitor-position
- 
    Use the System - Startup Applications toolto addupdate-monitor-positionso that it runs when you login.
- 
    Reboot your machine and now your configuration should persist! 
#!/bin/bash
# -------------------------------------------------
#  Get monitors configuration from monitor.xml and apply it for current user session.
#  In case of multiple definitions in monitor.xml only first one is used.
#
#  See http://bernaerts.dyndns.org/linux/74-ubuntu/309-ubuntu-dual-display-monitor-position-lost
#  for instructions
#
#  Revision history :
#    19/04/2014, V1.0 - Creation by N. Bernaerts
#    10/07/2014, V1.1 - Wait 5 seconds for X to fully initialize
#    30/07/2014, V1.2 - K. Callenberg added handling of primary monitor setting
# -------------------------------------------------
# get number of declared monitors
NUM=$(xmllint --xpath 'count(//monitors/configuration['1']/output)' $HOME/.config/monitors.xml)
# loop thru declared monitors to create the command line parameters
for (( i=1; i<=$NUM; i++)); do
  # get attributes of current monitor (name and x & y positions)
  NAME=$(xmllint --xpath 'string(//monitors/configuration['1']/output['$i']/@name)' $HOME/.config/monitors.xml 2>NULL)
  POS_X=$(xmllint --xpath '//monitors/configuration['1']/output['$i']/x/text()' $HOME/.config/monitors.xml 2>NULL)
  POS_Y=$(xmllint --xpath '//monitors/configuration['1']/output['$i']/y/text()' $HOME/.config/monitors.xml 2>NULL)
  PRIMARY=$(xmllint --xpath '//monitors/configuration['1']/output['$i']/primary/text()' $HOME/.config/monitors.xml 2>NULL)
  # if position is defined for current monitor, add its position to command line parameters
  if [ "$PRIMARY" == "yes" ] ; then
      [ -n "$POS_X" ] && PARAM_ARR=("${PARAM_ARR[@]}" "--output" "$NAME" "--primary" "--pos" "${POS_X}x${POS_Y}")
  else
      [ -n "$POS_X" ] && PARAM_ARR=("${PARAM_ARR[@]}" "--output" "$NAME" "--pos" "${POS_X}x${POS_Y}")
  fi
done
# wait for 5 seconds (for X to finish initialisation)
sleep 5
#echo "${PARAM_ARR[@]}"
# position all monitors
xrandr "${PARAM_ARR[@]}"