toggle_external_display.rb 1.8 KB

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