39 lines
		
	
	
	
		
			1.1 KiB
		
	
	
	
		
			Ruby
		
	
	
		
			Executable file
		
	
	
	
	
			
		
		
	
	
			39 lines
		
	
	
	
		
			1.1 KiB
		
	
	
	
		
			Ruby
		
	
	
		
			Executable file
		
	
	
	
	
| #!/usr/bin/env ruby
 | |
| 
 | |
| require 'xrandr'
 | |
| require 'dmenu'
 | |
| 
 | |
| menu = Dmenu.new
 | |
| menu.case_insensitive = true
 | |
| menu.lines = 20
 | |
| 
 | |
| outputs = Xrandr::Parser.new.parse[1].group_by(&:connected)
 | |
| 
 | |
| menu.items = (outputs[true] + outputs[false]).map{
 | |
|   |o| Dmenu::Item.new(o.name + (o.connected ? ' (connected)' : ''), o)
 | |
| }
 | |
| menu.prompt = "output:"
 | |
| output = menu.run.value
 | |
| 
 | |
| menu.items = output.modes.map{
 | |
|   |mode|Dmenu::Item.new(mode.resolution, {mode: mode.resolution})
 | |
| }
 | |
| menu.items << Dmenu::Item.new("off", {off: true})
 | |
| 
 | |
| menu.prompt = "Current resolution: #{output.resolution}"
 | |
| mode = menu.run.value
 | |
| 
 | |
| unless mode[:off]
 | |
|   menu.items = [:"left-of", :"right-of", :"above", :"below"].flat_map{|dir|
 | |
|     outputs[true].reject{|o| o == output}.map{|out| [dir,out]}
 | |
|   }.map{|setting|
 | |
|     Dmenu::Item.new(setting[0].to_s.gsub('-',' ') + " " + setting[1].name,
 | |
|                     {setting[0] => setting[1].name})
 | |
|   }
 | |
|   menu.items << Dmenu::Item.new("don't change", {})
 | |
|   menu.prompt = "Select position:"
 | |
|   mode.merge! menu.run.value
 | |
| end
 | |
| control = Xrandr::Control.new
 | |
| control.configure(output, mode)
 | |
| control.apply!
 | 
