Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/bin/bash
- # Script, das bei einem Dualmonitor-Setup mit xinerama oder xrandr, also einem großen
- # logischen Desktop über beide Monitore, den Focus zwischen den Monitoren wechselt.
- # D.h. wenn das aktive Fenster auf Monitor X ist, wird zum obersten Fenster auf Monitor Y gewechselt.
- #
- # Das Script benötigt wmctrl, xprop und bash
- # Man muss die Horizontale Auflösung des linken Bildschirms vorgeben (4 Zeilen weiter unten in H_SPLIT)
- # (C) 2009 by caedes (metalcaedes ... gmail ... com - Feel free to use, change and redistribute this.
- # ab dieser x koordinate fängt der 2. (rechte) screen an
- H_SPLIT=1680
- ########################################################
- ## ab hier sollte normalerweise nichts zu ändern sein ##
- ########################################################
- # desktop-id vom aktuellen desktop (dezimal) - der aktuelle wird mit "*" markiert, deshalb danach greppen
- DESKTOP=$( wmctrl -d | grep "*" | cut -c 1-2 )
- # aktives fenster - kriegen wir als hex von xprop, unwichten kram wegschneiden
- TMP=$(xprop -root | grep "_NET_ACTIVE_WINDOW(WINDOW)" | cut -c 40-49)
- # als dezimal-zahl (damit vergleichen als zahl später klappt)
- let ACTIVE_WIN=$(echo $TMP)
- # bei \n splitten, statt bei irgendnem whitespace
- IFS_ORIG=$IFS
- IFS_NL="
- "
- IFS=$IFS_NL
- # Alle Fenster ; Format pro Zeile/Arrayeintrag:
- # <window_id in hex> <desktop_id> <X> <Y> <Width> <Height> <client_machine> <title>
- ALL_WINDOWS=( $(wmctrl -l -G) )
- IFS=$IFS_ORIG
- # reihenfolge der fenster aller dektops von unten nach oben als hex-zahlen
- # kommt als liste von hex-zahlen getrennt mit kommata (die wir gleich rausschneiden)
- TMP=$( xprop -root | grep "_NET_CLIENT_LIST_STACKING(WINDOW)" | cut -c 48-)
- WINDOW_STACK=( ${TMP//","/""} )
- # auf welchen screen soll gewechselt werden? (0 links 1 rechts)
- SCREEN=0
- # SCREEN bestimmen: aktives fenster in $ALL_WINDOWS suchen und x-koordinate checken
- for i in $(seq 0 $((${#ALL_WINDOWS[@]} - 1))) ; do
- cur_win=( ${ALL_WINDOWS[$i]} )
- # von hex in dec umwandeln zum vergleichen..
- let cur_win_id=${cur_win[0]}
- # falls wir beim akiven fenster sind..
- if [ $cur_win_id -eq $ACTIVE_WIN ]; then
- # wenn das fenster auf dem linken screen beginnt wollen wir eins vom rechten
- if [ ${cur_win[2]} -lt $H_SPLIT ] ; then
- SCREEN=1
- else
- # und umgekehrt
- SCREEN=0
- fi
- fi
- done
- # fenster auf diesem desktop auf dem anderen screen (zu denen wechseln wir potentiell
- # format: array von dezimalen werten
- declare -a POT_WINS
- # POT_WINS füllen -> durch alle fenster gehen
- let j=0
- for i in $(seq 0 $((${#ALL_WINDOWS[@]} - 1))) ; do
- #echo ${ALL_WINDOWS[$i]}
- cur_win=( ${ALL_WINDOWS[$i]} )
- # falls das fenster auf diesem desktop liegt
- if [ ${cur_win[1]} -eq $DESKTOP ]; then
- # window id in dezimal umwandeln..
- let cur_win_id=${cur_win[0]}
- #echo $cur_win_id
- # falls wir auf den linken screen wechseln wollen
- if [ $SCREEN -eq 0 ]; then
- # falls das fenster auf dem linken screen liegt
- if [ ${cur_win[2]} -lt $H_SPLIT ] ; then
- POT_WINS[$j]=$cur_win_id
- j=$j+1
- #echo "kommt in die liste"
- fi
- else # falls es auf dem rechten wechseln wollen..
- # und das fenster da auch liegt
- if [ ${cur_win[2]} -ge $H_SPLIT ] ; then
- POT_WINS[$j]=$cur_win_id
- j=$j+1
- #echo "kommt in die liste"
- fi
- fi
- fi
- done
- # den fenster stack rückwärts durchgehen (das oberste fenster ist hinten)
- for i in $(seq $((${#WINDOW_STACK[@]} - 1)) -1 0) ; do
- let dec_win=${WINDOW_STACK[$i]}
- #echo $dec_win
- # check, ob das aktuelle fenster aus dem stack zu den potentiellen zum hervorheben gehört..
- for win in ${POT_WINS[@]}; do
- if [ $dec_win -eq $win ] ; then
- # echo "$win passt"
- # wir haben ein fenster gefunden, das möglichst weit oben ist und auf dem
- # gewünschten screen des aktuellen desktops liegt..
- # das fenster in den vordergrund holen
- wmctrl -i -a $win
- # und script beenden
- exit 0
- fi
- done
- done
- exit 1
Add Comment
Please, Sign In to add comment