]> git.donarmstrong.com Git - deb_pkgs/autorandr.git/blobdiff - autorandr
detect primary screen and save to config.
[deb_pkgs/autorandr.git] / autorandr
index 3e04be781ef5721cb12076fa9ad6e123510a2e64..89d5e25609a6310ff514f304fa9c115bb681767d 100755 (executable)
--- a/autorandr
+++ b/autorandr
@@ -6,23 +6,23 @@
 #
 # How to use:
 #
-# Save your current display configuration and setup with
-# autorandr --save mobile
+# Save your current display configuration and setup with:
+#  $ autorandr --save mobile
 #
-# Connect an additional display, configure your setup and save it
-# autorand --save docked
+# Connect an additional display, configure your setup and save it:
+#  $ autorandr --save docked
 #
 # Now autorandr can detect which hardware setup is active:
-# # autorandr
-# mobile
-# docked (detected)
+#  $ autorandr
+#    mobile
+#    docked (detected)
 #
 # To automatically reload your setup, just append --change to the command line
 #
 # To manually load a profile, you can use the --load <profile> option.
 #
 # autorandr tries to avoid reloading an identical configuration. To force the
-# configuration, apply --force.
+# (re)configuration, apply --force.
 #
 # To prevent a profile from being loaded, place a script call "block" in its
 # directory. The script is evaluated before the screen setup is inspected, and
 # --default <profile>
 #
 # Another script called "postswitch "can be placed in the directory
-# ~/.auto-disper as well as in all profile directories: The scripts are
-# executed after a mode switch has taken place and can notify window managers
-# or other applications about it.
+# ~/.autorandr as well as in all profile directories: The scripts are executed
+# after a mode switch has taken place and can notify window managers or other
+# applications about it.
+#
+#
+# While the script uses xrandr by defult, calling it by the name "autodisper"
+# or "auto-disper" forces it to use the "disper" utility, which is useful for
+# controlling nvidia chipsets. The formats for fingerprinting the current setup
+# and saving/loading the current configuration are adjusted accordingly.
 
 XRANDR=/usr/bin/xrandr
+DISPER=/usr/bin/disper
 PROFILES=~/.autorandr/
 CONFIG=~/.autorandr.conf
 
@@ -48,8 +55,22 @@ DEFAULT_PROFILE=""
 SAVE_PROFILE=""
 
 FP_METHODS="setup_fp_xrandr_edid setup_fp_sysfs_edid"
+CURRENT_CFG_METHOD="current_cfg_xrandr"
+LOAD_METHOD="load_cfg_xrandr"
+
+SCRIPTNAME="$(basename $0)"
+# when called as autodisper/auto-disper, we assume different defaults
+if [ "$SCRIPTNAME" = "auto-disper" ] || [ "$SCRIPTNAME" = "autodisper" ]; then
+       echo "Assuming disper defaults..." >&2
+       FP_METHODS="setup_fp_disper"
+       CURRENT_CFG_METHOD="current_cfg_disper"
+       LOAD_METHOD="load_cfg_disper"
+fi
 
-test -f $CONFIG && . $CONFIG 
+if [ -f $CONFIG ]; then
+       echo "Loading configuration from '$CONFIG'" >&2
+       . $CONFIG
+fi
 
 setup_fp_xrandr_edid() {
        $XRANDR -q --verbose | awk '
@@ -63,6 +84,8 @@ setup_fp_sysfs_edid() {
        $XRANDR -q > /dev/null
        # hash the EDIDs of all _connected_ devices
        for P in /sys/class/drm/card*-*/; do
+               # nothing found
+               [ ! -d "$P" ] && continue
                if grep -q "^connected$" < "${P}status"; then
                        echo -n "$(basename "$P") "
                        md5sum ${P}edid | awk '{print $1}'
@@ -70,11 +93,17 @@ setup_fp_sysfs_edid() {
        done
 }
 
+setup_fp_disper() {
+       $DISPER -l | grep '^display '
+}
+
 setup_fp() {
        local FP="";
        for M in $FP_METHODS; do
                FP="$($M)"
-               [ -n "$FP" ] && break;
+               if [ -n "$FP" ]; then
+                       break
+               fi
        done
        if [ -z "$FP" ]; then
                echo "Unable to fingerprint display configuration" >&2
@@ -83,21 +112,35 @@ setup_fp() {
        echo "$FP"
 }
 
-
-current_cfg() {
-       $XRANDR -q | awk '
-       /^[^ ]+ disconnected / {
-        print "output "$1;
-               print "off";
-       }
-       /^[^ ]+ connected / {
+current_cfg_xrandr() {
+       local PRIMARY_SETUP=$(xdpyinfo -ext XINERAMA|awk '/^  head #0:/ {printf $3 $5}')
+       $XRANDR -q | awk -v primary_setup=${PRIMARY_SETUP} '
+       # display is connected and has a mode
+       /^[^ ]+ connected [^(]/ {
                split($3, A, "+");
                print "output "$1;
                print "mode "A[1];
                print "pos "A[2]"x"A[3];
+               if (A[1] A[2] "," A[3] == primary_setup)
+                       print "primary";
+               next;
+       }
+       # disconnected or disabled displays
+       /^[^ ]+ (dis)?connected / {
+               print "output "$1;
+               print "off";
+               next;
        }'
 }
 
+current_cfg_disper() {
+       $DISPER -p
+}
+
+current_cfg() {
+       $CURRENT_CFG_METHOD;
+}
+
 blocked() {
        local PROFILE="$1"
        [ ! -x "$PROFILES/$PROFILE/block" ] && return 1
@@ -115,11 +158,20 @@ config_equal() {
        fi
 }
 
+load_cfg_xrandr() {
+       sed 's!^!--!' "$1" | xargs $XRANDR
+}
+
+load_cfg_disper() {
+       $DISPER -i < "$1"
+}
+
 load() {
        local PROFILE="$1"
-       if [ -e "$PROFILES/$PROFILE/config" ] ; then
+       local CONF="$PROFILES/$PROFILE/config"
+       if [ -e "$CONF" ] ; then
                echo " -> loading profile $PROFILE"
-               sed 's!^!--!' "$PROFILES/$PROFILE/config" | xargs xrandr
+               $LOAD_METHOD "$CONF"
 
                [ -x "$PROFILES/$PROFILE/postswitch" ] && \
                        "$PROFILES/$PROFILE/postswitch" "$PROFILE"
@@ -130,15 +182,15 @@ load() {
 
 help() {
        cat <<EOH
-Usage: autorandr action [profile-name]
+Usage: $SCRIPTNAME [options]
 
 -h, --help             get this small help
 -c, --change           reload current setup
 -s, --save <profile>   save your current setup to profile <profile>
 -l, --load <profile>   load profile <profile>
---force                        force loading of a profile
 -d, --default <profile> make profile <profile> the default profile 
---fingerprint          fingerprints your actual config 
+--force                        force (re)loading of a profile
+--fingerprint          fingerprint your current hardware setup
 
  To prevent a profile from being loaded, place a script call "block" in its
  directory. The script is evaluated before the screen setup is inspected, and
@@ -147,11 +199,14 @@ Usage: autorandr action [profile-name]
 
  If no suitable profile can be identified, the current configuration is kept.
  To change this behaviour and switch to a fallback configuration, specify
- --default <profile>
+ --default <profile>.
 
  Another script called "postswitch "can be placed in the directory
- ~/.auto-disper as well as in all profile directories: The scripts are
- executed after a mode switch has taken place and can notify window managers
+ ~/.autorandr as well as in any profile directories: The scripts are executed
+ after a mode switch has taken place and can notify window managers.
+
+ When called by the name "autodisper" or "auto-disper", the script uses "disper"
+ instead of "xrandr" to detect, configure and save the display configuration.
 
 EOH
        exit
@@ -181,7 +236,7 @@ if [ -n "$SAVE_PROFILE" ]; then
        echo "Saving current configuration as profile '${SAVE_PROFILE}'"
        mkdir -p "$PROFILES/$SAVE_PROFILE"
        echo "$CURRENT_SETUP" > "$PROFILES/$SAVE_PROFILE/setup"
-       current_cfg > "$PROFILES/$SAVE_PROFILE/config"
+       $CURRENT_CFG_METHOD > "$PROFILES/$SAVE_PROFILE/config"
        exit 0
 fi