#!/bin/bash # Copyright (C) 2015 Beniamine, David # Author: Beniamine, David # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . timeout=10 DEBUG=true interaction=true echo "" > /var/log/vp.log log(){ if $DEBUG then echo "$@" | tee -a /var/log/vp.log fi } log "starting VP $(date)" # Get rights to access display user=$(who | grep -v "root" | head -n 1 | cut -d ' ' -f 1) if [ ! -z "$user" ] then export DISPLAY=:0 export LC_ALL="fr_FR.utf8" export XAUTHORITY="/home/$user/.Xauthority" fi DIR=$(realpath $(dirname $0)) # show max between two res max_res(){ [ -z "$2" ] && echo $1 && return first=$(echo $1 | sed 's/x/*/' | bc) second=$(echo $2 | sed 's/x/*/' | bc) [ $first -ge $second ] && echo $1 || echo $2 } # Default main screens (external VGA or internal screen) MAIN_SCREENS="DP-3 VGA-1 LVDS-1 eDP1" # auto detect main screen for m in $MAIN_SCREENS do if [ ! -z "$(xrandr | grep " connected" | grep $m)" ] then MAIN_SCREEN=$m break fi done if [ -z "$MAIN_SCREEN" ] then # No main screen : use the first connected MAIN_SCREEN=$(xrandr | grep " connected" | head -n 1 | cut -d ' ' -f 1) fi log "MAIN_SCREEN '$MAIN_SCREEN'" screens=$(xrandr | grep " connected" | cut -f 1 -d ' ' \ | sed -e 's/ /\n/g' | grep -v "\<$MAIN_SCREEN\>") log "SCREENS '$screens'" log "all '$screens$MAIN_SCREEN'" log "cat '$(cat /tmp/vp-screens)'" if [ -z "$screens$MAIN_SCREEN" ] then log "noscreens exiting on $(date)" exit elif [ "$screens$MAIN_SCREEN" == "$(cat /tmp/vp-screens)" ] then log "no changes exiting on $(date)" exit fi echo "$screens$MAIN_SCREEN" > /tmp/vp-screens clone(){ # Auto detect best resolution for m in $(xrandr | awk -v pattern="^$MAIN_SCREEN" '/^.* connected/{IN=0} $0 ~ pattern {IN=1} /^ /{if(IN==1){print $1}}') do # echo "testing mode $m" OTHERS=$(xrandr | awk -v pattern="^$MAIN_SCREEN" '/^.* connected/{IN=1} $0 ~ pattern {IN=0} {if(IN==1){print $1}}') if [ -z "$OTHERS" ] then # one screen look for best common resolution mode=$(max_res $m $mode) else # Several screen look for best common resolution for line in $OTHERS do # echo "line $line" if [[ $line =~ [0-9]* ]] then # New mode if [ "$line" == "$m" ] then found=1 fi else # New screen if [ "$found" == 0 ] then break fi found=0 fi # echo "Found ? $found" done if [ "$found" == 1 ] then mode="$m" break fi fi done # echo "mode $mode" # Primary screen cmd="xrandr --output $MAIN_SCREEN --auto --mode $mode --rotate normal --primary" log "command $cmd" # Add all connected as copy prev_s=$MAIN_SCREEN for s in $(echo -e $screens) do cmd="$cmd --output $s --auto --mode $mode --same-as $prev_s --rotate normal" prev_s="$s" done log "command after all outputs $cmd" # Disable all disconnected screens screens=$(xrandr | grep " disconnected" | cut -f 1 -d ' ' ) for s in $(echo -e $screens) do cmd="$cmd --output $s --off" done log "command after all offs $cmd" run_xrandr_cmd $cmd } extend(){ log "I should extend screens on $1" case $1 in "gauche") placement="--left-of" ;; "droite") placement="--right-of" ;; "haut") placement="--above" ;; "bas") placement="--below" ;; esac cmd="xrandr --output $MAIN_SCREEN --primary --auto" log $cmd for s in $screens do cmd="$cmd --output $s $placement $MAIN_SCREEN --auto" log $cmd done run_xrandr_cmd $cmd } run_xrandr_cmd(){ # Actually do stuff old_cmd=$(cat /tmp/vp) new_cmd="$@" timeout echo $new_cmd > /tmp/vp $new_cmd log "Runned $new_cmd" if $interaction then zenity --question --title "Configuration des écrans" \ --text "La configuration des écrans vous convient-elle ?" \ --timeout=$timeout code=$? else code=1 fi if [ $code != 0 ] then log "Restoring old command : $old_cmd" $old_cmd fi log "exiting on $(date)" } if [ -z "$screens" ] then interaction=false fi if $interaction then choice=$(zenity --entry --title "Écran connecté" \ --text "Selection du mode d'affichage" \ --entry-text "Clone" 'Écrans étendus à droite' 'Écrans étendus à gauche' \ 'Écrans étendus en haut' 'Écrans étendus en bas' \ --timeout $timeout) code=$? else code=5 fi log "Choice '$choice' / code $code" if [ -z "$choice" ] then if [ "$code" -eq 1 ] then # give up exit else # timeout log "timeout" clone fi elif [ "$choice" == "Clone" ] then clone else extend $(echo $choice | cut -d ' ' -f 4) fi