96 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			Plaintext
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			96 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			Plaintext
		
	
	
		
			Executable File
		
	
	
	
	
| #!/usr/bin/env nu
 | |
| 
 | |
| # default view: only main screen
 | |
| def "main d" [] {
 | |
|     let res = main | where name == $env.PRIMARY_SCREEN | get resolutions | get 0 | get 0
 | |
|     xrandr --output $env.PRIMARY_SCREEN --mode $res --primary --output $env.SECONDARY_SCREEN --off --output HDMI-0 --off
 | |
| }
 | |
| 
 | |
| # bureau view: both screens side to side
 | |
| def "main b" [] {
 | |
|     let res = main | where name == $env.PRIMARY_SCREEN | get resolutions | get 0 | get 0
 | |
|     xrandr --output $env.PRIMARY_SCREEN --mode $res --primary --output $env.SECONDARY_SCREEN --mode 1920x1080 --right-of $env.PRIMARY_SCREEN --output HDMI-0 --off
 | |
| }
 | |
| 
 | |
| 
 | |
| # television view: only TV on (720p so that menus are readable)
 | |
| def "main t" [] {
 | |
|     xrandr --output $env.PRIMARY_SCREEN --off --output $env.SECONDARY_SCREEN --off --output HDMI-0 --mode 1280x720 --primary
 | |
| }
 | |
| 
 | |
| # stream view: only secondary screen
 | |
| def "main s" [] {
 | |
|     xrandr --output $env.SECONDARY_SCREEN --mode 1920x1080 --primary --output $env.PRIMARY_SCREEN --off
 | |
| }
 | |
| 
 | |
| # laptop view: only secondary screen
 | |
| def "main l" [] {
 | |
|     xrandr --output $env.SECONDARY_SCREEN --mode 1920x1080 --primary --output $env.PRIMARY_SCREEN --off
 | |
| }
 | |
| 
 | |
| def main [] {
 | |
|     mut output = []
 | |
|     mut current_screen = {
 | |
|         name: ""
 | |
|         connected: false
 | |
|         on: false
 | |
|         primary: false
 | |
|         resolution: null
 | |
|         position: null
 | |
|         resolutions: []
 | |
|     }
 | |
| 
 | |
|     let lines = ^xrandr | lines
 | |
|     let length = $lines | length
 | |
| 
 | |
|     # We skip the first line
 | |
|     for i in 1..<$length {
 | |
| 
 | |
|         let line = $lines | get $i
 | |
|         let split = $line | split row -r '\s+'
 | |
| 
 | |
|         # This will be true whether the screen is connected or not
 | |
|         if $line =~ "connected" {
 | |
| 
 | |
|             if $current_screen.name != "" {
 | |
|                 $output = ($output | append $current_screen)
 | |
|                 $current_screen.resolutions = []
 | |
|                 $current_screen.on = false
 | |
|                 $current_screen.resolution = null
 | |
|                 $current_screen.position = null
 | |
|             }
 | |
| 
 | |
|             $current_screen.name = ($split | get 0)
 | |
|             $current_screen.connected = (($split | get 1) != "disconnected")
 | |
|             $current_screen.primary = (($split | get 2) == "primary")
 | |
| 
 | |
|             let resolution = if $current_screen.primary {
 | |
|                 ($split | get 3 | split column -c '+' | get column1 | get 0)
 | |
|             } else {
 | |
|                 ($split | get 2 | split column -c '+' | get column1 | get 0)
 | |
|             }
 | |
| 
 | |
|             if not ($resolution | str starts-with "(") {
 | |
|                 $current_screen.on = true
 | |
|                 $current_screen.resolution = $resolution
 | |
| 
 | |
|                 $current_screen.position = if $current_screen.primary {
 | |
|                     ($split | get 3 | split column -c '+' | each { "+" + $in.column2 + "+" + $in.column3 } | get 0)
 | |
|                 } else {
 | |
|                     ($split | get 2 | split column -c '+' | each { "+" + $in.column2 + "+" + $in.column3 } | get 0)
 | |
|                 }
 | |
|             }
 | |
| 
 | |
| 
 | |
|         } else {
 | |
|             $current_screen.resolutions = ($current_screen.resolutions | append ($split | get 1))
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     if $current_screen.name != "" {
 | |
|         $output = ($output | append $current_screen)
 | |
|     }
 | |
| 
 | |
|     $output
 | |
| }
 |