aboutsummaryrefslogblamecommitdiffstats
path: root/xorg-xrandr/setres/__main__.py
blob: 26f6f652d96acfe5b0a8cdae8f9470096f79fa3f (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



### Configurations


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

    prime_alt       = None
    sec_alt         = None

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


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

if not prime.connected and prime_alt is not None:
    prime, prime_alt = prime_alt, prime
if 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.connected 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  = 'left-of' if not mirror else 'same-as'
    output.relto   = prime.name

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


elif 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

    output = Output(sec.name)
    display.outputs.append(output)
    output.off = True

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


elif 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

    output = Output(prime.name)
    display.outputs.append(output)
    output.off = True

    if embed is not None:
        output = Output(embed.name)
        display.outputs.append(output)
        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

    output = Output(prime.name)
    display.outputs.append(output)
    output.off = True

    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

    ok = apply_setup(display)



### Epilogue

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

[screen] = get_setup()
prime = screen[True]
if prime.position[0] > 0:
    print(prime.position[0], flush = True)

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