aboutsummaryrefslogblamecommitdiffstats
path: root/xorg-xrandr/setres/__main__.py.gpp
blob: f79433901b246b89c490024ad3375fd2d38550d8 (plain) (tree)



















































                                                                                                     
                                                       



                                                                                                                  
                                                            





































































































































































































































































                                                                                                            
#!/usr/bin/env python3

import sys, os, pwd
from subprocess import Popen, PIPE

from get import *
from set import *

args     = sys.argv[1:]
home     = os.environ['HOME']     if 'HOME'     in os.environ else pwd.getpwuid(os.getuid()).pw_dir
session_ = os.environ['SESSION_'] if 'SESSION_' in os.environ else ''
hostname = os.uname().nodename.lower()

t = lambda lopt, sopt : any(arg in args for arg in (lopt, '-' + lopt, '--' + lopt, sopt, '-' + sopt))

mirror  = t('mirror',  'm')
swap    = t('swap',    's')
tv      = t('tv',      't')
wide    = t('wide',    'w')
crt     = t('crt',     'c')
large   = t('large',   'l')
single  = t('single',  '1')
pretend = t('pretend', 'P')

[screen] = get_setup()
ok = False

if pretend:
    def apply_setup(display):
        print(repr(display.to_xrandr()))
        return True

phonies = []



### Configurations

if hostname == 'zenith':
    prime           = screen['DisplayPort-1' if not swap else 'DisplayPort-1']
    sec             = screen['DisplayPort-0' if not swap else 'DisplayPort-0']
    embed           = None

    prime_alt       = None
    sec_alt         = None

    prime.want_mode = '1920x1200'
    sec.want_mode   = '1920x1200'

    sec_position    = 'left'

%%>hostname="$(hostname | tr '[A-Z]' '[a-z]')"
%%>file="${HOME}/.dotfiles/.private/setres/${hostname}"
%%>if test -r "${file}"; then
elif hostname == '%%{hostname}':
    connectors      = {con.edid: con.name for con in screen.connectors if con.connected and con.edid and con.name}

%%>sed 's/^[[:space:]]*\([^[:space:]]\)/    \1/' < "${file}"

    primes          = [(home_prime, '1920x1200'),
                       (work_prime, '1920x1080')]

    secs            = [(home_sec, '1920x1200', 'left'),
                       (work_sec, '1920x1080', 'right')]

    prime           = None
    prime_res       = None
    for edid, res in primes:
        if edid in connectors:
            prime, prime_res = screen[connectors[edid]], res

    sec             = None
    sec_res         = None
    sec_position    = 'left'
    for edid, res, pos in secs:
        if edid in connectors:
            sec, sec_res, sec_position = screen[connectors[edid]], res, pos

    embed           = screen[connectors[embed]] if embed in connectors else screen['eDP-1']

    phonies         = [screen[name] for edid, name in connectors.items() if edid not in (prime, sec, embed)]

    if swap:
        (prime, sec) = (sec, prime)

    prime_alt       = None
    sec_alt         = None

    if prime is not None:
        prime.want_mode = prime_res
    if sec is not None:
        sec.want_mode   = sec_res
    if embed is not None:
        embed.want_mode = '1920x1200'
%%>fi

else:
    print('%s: no configurations found for this machine (%s)' % (sys.argv[0], hostname),
          file = sys.stderr)
    sys.exit(1)

if prime is not None and not prime.connected and prime_alt is not None:
    prime, prime_alt = prime_alt, prime
if sec is not None and not sec.connected and sec_alt is not None:
    sec, sec_alt = sec_alt, sec


if large:
    prime.want_mode = '1792x1344'
    sec.want_mode   = '1792x1344'

if crt:
    prime.want_mode = '800x600'
    sec.want_mode   = '800x600'

if wide:
    prime.want_mode = '1920x1080'
    sec.want_mode   = '1920x1080'

if tv:
    sec.want_mode   = '1920x1080'


if prime is not None:
    prime.want_rate = prime.best_rate(prime.want_mode)
if sec is not None:
    sec.want_rate = sec.best_rate(sec.want_mode)
if embed is not None:
    embed.want_rate = embed.best_rate(embed.want_mode)




if '+prime' in args:
    prime.connected = True
if '+sec' in args:
    sec.connected = True
if '+embed' in args:
    embed.connected = True

if '-prime' in args:
    prime.connected = False
if '-sec' in args:
    sec.connected = False
if '-embed' in args:
    embed.connected = False




### Apply

if prime is not None and prime.connected and sec is not None and sec.connected and not single:
    display = Display()
    ok = True

    output = Output(prime.name)
    display.outputs.append(output)
    output.mode = prime.want_mode
    output.rate = prime.want_rate
    output.primary = True
    output.relpos  = None
    output.relto   = None

    output = Output(sec.name)
    display.outputs.append(output)
    output.mode = sec.want_mode
    output.rate = sec.want_rate
    output.primary = False
    output.relpos  = (sec_position + '-of') if not mirror else 'same-as'
    output.relto   = prime.name

    if embed is not None:
        output = Output(embed.name)
        display.outputs.append(output)
        if embed.want_mode == prime.want_mode:
            output.mode = embed.want_mode
            output.rate = embed.want_rate
            output.primary = False
            output.off = False
            output.relpos = 'same-as'
            output.relto  = prime.name
        else:
            output.off = True


elif prime is not None and prime.connected:
    display = Display()
    ok = True

    output = Output(prime.name)
    display.outputs.append(output)
    output.mode = prime.want_mode
    output.rate = prime.want_rate
    output.primary = True

    if sec is not None:
        output = Output(sec.name)
        display.outputs.append(output)
        output.off = True

    if embed is not None:
        output = Output(embed.name)
        display.outputs.append(output)
        if embed.want_mode == prime.want_mode:
            output.mode = embed.want_mode
            output.rate = embed.want_rate
            output.primary = False
            output.off = False
            output.relpos = 'same-as'
            output.relto  = prime.name
        else:
            output.off = True


elif sec is not None and sec.connected:
    display = Display()
    ok = True

    output = Output(sec.name)
    display.outputs.append(output)
    output.mode = sec.want_mode
    output.rate = sec.want_rate
    output.primary = True

    if prime is not None:
        output = Output(prime.name)
        display.outputs.append(output)
        output.off = True

    if embed is not None:
        output = Output(embed.name)
        display.outputs.append(output)
        if embed.want_mode == sec.want_mode:
            output.mode = embed.want_mode
            output.rate = embed.want_rate
            output.primary = False
            output.off = False
            output.relpos = 'same-as'
            output.relto  = sec.name
        else:
            output.off = True


elif embed is None or not embed.connected:
    print('%s: don\'t know how to configure' % sys.argv[0], file = sys.stderr)


else:
    display = Display()
    ok = True

    output = Output(embed.name)
    display.outputs.append(output)
    output.mode = embed.want_mode
    output.rate = embed.want_rate
    output.primary = True

    if prime is not None:
        output = Output(prime.name)
        display.outputs.append(output)
        output.off = True

    if sec is not None:
        output = Output(sec.name)
        display.outputs.append(output)
        output.off = True


if ok:
    if prime_alt is not None:
        output = Output(prime_alt.name)
        display.outputs.append(output)
        output.off = True

    if sec_alt is not None:
        output = Output(sec_alt.name)
        display.outputs.append(output)
        output.off = True

    for phony in phonies:
        output = Output(phony.name)
        display.outputs.append(output)
        output.off = True

    ok = apply_setup(display)



### Epilogue

if not ok:
    sys.exit(1)
if pretend:
    sys.exit(0)

reschargs = []
for output in (prime, sec):
    if output is not None:
        output = screen[output.name]
        reschargs.extend(output.size)
        reschargs.extend(output.position)
[screen] = get_setup()
prime = screen[True]
if prime.position[0] > 0:
    print(prime.position[0], flush = True)

file = '%s/.config/resolution-changed' % home
if os.path.exists(file):
    try:
        os.execlp(file, file, *reschargs)
    except:
        pass

for file in ('%s/.config/background.%s' % (home, session_), '%s/.config/background' % home):
    if os.path.exists(file):
        try:
            os.execlp('xwallpaper', 'xwallpaper', '--zoom', file)
        except:
            pass