toggle_external_display.rb 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. #!/usr/bin/env ruby
  2. xrandr = `xrandr`.to_s
  3. @common_monitors = { '3440x1440' => 'right', '2560x1440' => 'left' }
  4. @audio_enabled_monitors = [ '3440x1440' ]
  5. @restart_conky = ARGV.include?('--restart-conky') || system('pgrep openbox -u $USER >/dev/null')
  6. @internal_monitor = xrandr.match(/((LVDS|eDP)\d*) connected/)[1]
  7. def restart_background
  8. system "$HOME/.conkyinit --restart >/dev/null 2>&1" if @restart_conky
  9. system "(sleep 1 && $HOME/.fehbg) &"
  10. end
  11. def disable_monitor(external_monitor)
  12. system "xrandr --output #{external_monitor} --off --output #{@internal_monitor} --auto --scale 1.0x1.0"
  13. system "rm $HOME/.asoundrc 2>/dev/null"
  14. restart_background
  15. end
  16. def enable_mirror(external_monitor, resolution)
  17. system "xrandr --output #{external_monitor} --mode #{resolution} --same-as #{@internal_monitor} --output #{@internal_monitor} --scale-from #{resolution}"
  18. restart_background
  19. end
  20. def enable_multihead(external_monitor, resolution, side)
  21. system "xrandr --output #{external_monitor} --mode #{resolution} --#{side}-of #{@internal_monitor}"
  22. if @audio_enabled_monitors.include? resolution
  23. asoundrc = `cat $DOTFILES/.notebook`.strip
  24. system "ln -sf $DOTFILES/asound/asoundrc-#{asoundrc} $HOME/.asoundrc"
  25. end
  26. restart_background
  27. end
  28. if xrandr =~ /((HDMI|[^e]DP)(\d*)) (dis)?connected \d+x\d+/
  29. disable_monitor($1.strip)
  30. elsif xrandr =~ /((HDMI|[^e]DP)(\d*)) connected/
  31. ext_mon = $1.strip
  32. resolutions = xrandr.sub(/.*#{ext_mon}.*?\n/m, '').scan(/\d{1,4}x\d{1,4}.*?(?=\s)/)
  33. resolutions = resolutions.sort_by { |res| x, y = res.split(/[^\d]/).map(&:to_f); -x*y }
  34. unless (common_resolutions = resolutions & @common_monitors.keys).empty?
  35. resolution = common_resolutions.first
  36. enable_multihead(ext_mon, resolution, @common_monitors[resolution])
  37. else
  38. enable_mirror(ext_mon, resolutions.first)
  39. end
  40. system 'awesome-client "awesome.restart()"'
  41. system 'synclientconf.sh'
  42. end