nushell/bin/x

128 lines
4.2 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 screens = main
let secondary_screen_connected = $screens | where name == $env.SECONDARY_SCREEN | get 0 | get connected
if not $secondary_screen_connected {
notify-send "Couldn't set screen" "Secondary screen disconnected"
return
}
let res = $screens | 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 $env.SECONDARY_SCREEN_POSITION $env.PRIMARY_SCREEN --output HDMI-0 --off
}
# television view: only TV on (720p so that menus are readable)
def "main t" [] {
let screens = main
let secondary_screen_connected = $screens | where name == "HDMI-0" | get 0 | get connected
if not $secondary_screen_connected {
notify-send "Couldn't set screen" "TV disconnected"
return
}
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" [] {
let screens = main
let secondary_screen_connected = $screens | where name == $env.SECONDARY_SCREEN | get 0 | get connected
if not $secondary_screen_connected {
notify-send "Couldn't set screen" "Secondary screen disconnected"
return
}
xrandr --output $env.SECONDARY_SCREEN --mode 1920x1080 --primary --output $env.PRIMARY_SCREEN --off
}
# laptop view: only secondary screen
def "main l" [] {
let screens = main
let secondary_screen_connected = $screens | where name == $env.SECONDARY_SCREEN | get 0 | get connected
if not $secondary_screen_connected {
notify-send "Couldn't set screen" "Secondary screen disconnected"
return
}
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
}