Guest User

Untitled

a guest
Apr 24th, 2018
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Bash 3.93 KB | None | 0 0
  1. #!/bin/bash
  2. # Script, das bei einem Dualmonitor-Setup mit xinerama oder xrandr, also einem großen
  3. # logischen Desktop über beide Monitore, den Focus zwischen den Monitoren wechselt.
  4. # D.h. wenn das aktive Fenster auf Monitor X ist, wird zum obersten Fenster auf Monitor Y gewechselt.
  5. #
  6. # Das Script benötigt wmctrl, xprop und bash
  7. # Man muss die Horizontale Auflösung des linken Bildschirms vorgeben (4 Zeilen weiter unten in H_SPLIT)
  8. # (C) 2009 by caedes (metalcaedes ... gmail ... com - Feel free to use, change and redistribute this.
  9.  
  10. # ab dieser x koordinate fängt der 2. (rechte) screen an
  11. H_SPLIT=1680
  12.  
  13. ########################################################
  14. ## ab hier sollte normalerweise nichts zu ändern sein ##
  15. ########################################################
  16.  
  17. # desktop-id vom aktuellen desktop (dezimal) - der aktuelle wird mit "*" markiert, deshalb danach greppen
  18. DESKTOP=$( wmctrl -d | grep "*" | cut -c 1-2 )
  19.  
  20. # aktives fenster - kriegen wir als hex von xprop, unwichten kram wegschneiden
  21. TMP=$(xprop -root | grep "_NET_ACTIVE_WINDOW(WINDOW)" | cut -c 40-49)
  22. # als dezimal-zahl (damit vergleichen als zahl später klappt)
  23. let ACTIVE_WIN=$(echo $TMP)
  24.  
  25. # bei \n splitten, statt bei irgendnem whitespace
  26. IFS_ORIG=$IFS
  27. IFS_NL="
  28. "
  29. IFS=$IFS_NL
  30.  
  31. # Alle Fenster ; Format pro Zeile/Arrayeintrag:
  32. # <window_id in hex> <desktop_id> <X> <Y> <Width> <Height> <client_machine> <title>
  33. ALL_WINDOWS=( $(wmctrl -l -G) )
  34.  
  35. IFS=$IFS_ORIG
  36.  
  37. # reihenfolge der fenster aller dektops von unten nach oben als hex-zahlen
  38. # kommt als liste von hex-zahlen getrennt mit kommata (die wir gleich rausschneiden)
  39. TMP=$( xprop -root | grep "_NET_CLIENT_LIST_STACKING(WINDOW)" | cut -c 48-)
  40. WINDOW_STACK=( ${TMP//","/""} )
  41.  
  42. # auf welchen screen soll gewechselt werden? (0 links 1 rechts)
  43. SCREEN=0
  44.  
  45. # SCREEN bestimmen: aktives fenster in $ALL_WINDOWS suchen und x-koordinate checken
  46. for i in $(seq 0 $((${#ALL_WINDOWS[@]} - 1))) ; do
  47.     cur_win=( ${ALL_WINDOWS[$i]} )
  48.     # von hex in dec umwandeln zum vergleichen..
  49.     let cur_win_id=${cur_win[0]}
  50.     # falls wir beim akiven fenster sind..
  51.     if [ $cur_win_id -eq $ACTIVE_WIN ]; then
  52.         # wenn das fenster auf dem linken screen beginnt wollen wir eins vom rechten
  53.         if [ ${cur_win[2]}  -lt $H_SPLIT  ] ; then
  54.             SCREEN=1
  55.         else
  56.             # und umgekehrt
  57.             SCREEN=0
  58.         fi
  59.        
  60.     fi
  61. done
  62.  
  63.  
  64.  
  65. # fenster auf diesem desktop auf dem anderen screen (zu denen wechseln wir potentiell
  66. # format: array von dezimalen werten
  67. declare -a POT_WINS
  68.  
  69. # POT_WINS füllen -> durch alle fenster gehen
  70. let j=0
  71. for i in $(seq 0 $((${#ALL_WINDOWS[@]} - 1))) ; do
  72.     #echo ${ALL_WINDOWS[$i]}
  73.     cur_win=( ${ALL_WINDOWS[$i]} )
  74.    
  75.     # falls das fenster auf diesem desktop liegt
  76.     if [ ${cur_win[1]} -eq $DESKTOP ]; then
  77.         # window id in dezimal umwandeln..
  78.         let cur_win_id=${cur_win[0]}
  79.         #echo $cur_win_id
  80.         # falls wir auf den linken screen wechseln wollen
  81.         if [ $SCREEN -eq 0 ]; then
  82.             # falls das fenster auf dem linken screen liegt
  83.             if [ ${cur_win[2]} -lt $H_SPLIT ] ; then
  84.                 POT_WINS[$j]=$cur_win_id
  85.                 j=$j+1
  86.                 #echo "kommt in die liste"
  87.             fi
  88.         else # falls es auf dem rechten wechseln wollen..
  89.             # und  das fenster da auch liegt
  90.             if [ ${cur_win[2]} -ge $H_SPLIT ] ; then
  91.                 POT_WINS[$j]=$cur_win_id
  92.                 j=$j+1
  93.                 #echo "kommt in die liste"
  94.             fi
  95.         fi
  96.     fi
  97. done
  98.  
  99. # den fenster stack rückwärts durchgehen (das oberste fenster ist hinten)
  100. for i in $(seq $((${#WINDOW_STACK[@]} - 1)) -1 0) ; do
  101.     let dec_win=${WINDOW_STACK[$i]}
  102.    
  103.     #echo $dec_win
  104.     # check, ob das aktuelle fenster aus dem stack zu den potentiellen zum hervorheben gehört..
  105.     for win in ${POT_WINS[@]}; do
  106.        
  107.         if [ $dec_win -eq $win ] ; then
  108.             # echo "$win passt"
  109.             # wir haben ein fenster gefunden, das möglichst weit oben ist und auf dem
  110.             # gewünschten screen des aktuellen desktops liegt..
  111.             # das fenster in den vordergrund holen
  112.             wmctrl -i -a $win
  113.             # und script beenden
  114.             exit 0
  115.         fi
  116.     done
  117.    
  118. done
  119.  
  120. exit 1
Add Comment
Please, Sign In to add comment