Thank you, Mirekm!
I added it to /usr/kde/3.5/share/config/kdm/Xsetup, and now the screen resolution is correct as soon as kdm starts. The fonts are unfortunately still chosen for the panel until I login and out again, but I can live with that.
In case anyone has a similar need: Here is the script I use for selecting the output. I call it as toggle-video.py --sane from Xsetup. Without --sane, it is supposed to turn an external display on or off (for presentations), but I have not yet had the chance to test that part.
Code: Select all
#!/usr/bin/python
import sys
import os
import commands
from syslog import syslog, openlog
def get_output_state(line):
words = line.split()
if words[1] == "disconnected":
conn = False
elif words[1] == "connected":
conn = True
else:
syslog("Cannot parse line: " + line)
sys.exit(1)
active = (len(words) > 2)
return (words[0], conn, active)
def activate(device):
syslog('Activating output device '+device)
cmd = 'xrandr --output '+device+' --auto'
(stat, info) = commands.getstatusoutput(cmd)
if stat:
syslog("Activating %s failed:" % (device,))
syslog(info)
sys.exit(1)
def deactivate(device):
syslog('Deactivating output device '+device)
cmd = 'xrandr --output '+device+' --off'
(stat, info) = commands.getstatusoutput(cmd)
if stat:
syslog("Deactivating %s failed:" % (device,))
syslog(info)
sys.exit(1)
# Write to syslog under the script name
openlog(os.path.basename(sys.argv[0]))
sanearg = False
if (len(sys.argv) >= 2):
sanearg = (sys.argv[1] == '--sane')
if not sanearg:
syslog("Unknown command line argument.")
print >> sys.stderr, "Unknown command line argument."
sys.exit(1)
query = 'xrandr -q'
(stat, info) = commands.getstatusoutput(query)
if stat:
syslog('Command failed: '+query)
syslog(info)
sys.exit(1)
connected = {}
turnedon = {}
for line in info.split('\n'):
if line.startswith('Screen 0:'):
pass
elif line.startswith('Screen'):
syslog('Giving up: xrandr reports more than one screen: '+line)
sys.exit(1)
elif line.startswith('VGA'):
(name, conn, on) = get_output_state(line)
projector = name
connected[name] = conn
turnedon[name] = on
elif line.startswith('DVI'):
(name, conn, on) = get_output_state(line)
extscreen = name
connected[name] = conn
turnedon[name] = on
elif line.startswith('PANEL'):
(name, conn, on) = get_output_state(line)
panel = name
connected[name] = conn
turnedon[name] = on
elif line.startswith(' '):
pass
else:
syslog('Giving up: unknown line from xrandr: '+line)
sys.exit(1)
syslog("Projector: Connected: %s Active: %s" % (connected[projector],
turnedon[projector]))
syslog("Ext. display: Connected: %s Active: %s" % (connected[extscreen],
turnedon[extscreen]))
syslog("Panel: Connected: %s Active: %s" % (connected[panel],
turnedon[panel]))
if (sanearg):
# Set a sane system: ext. screen if connected, otherwise panel
if connected[extscreen]:
if not turnedon[extscreen]:
activate(extscreen)
if turnedon[panel]:
deactivate(panel)
if connected[projector] and not turnedon[projector]:
activate(projector)
else:
# Toggle projector if connected
if connected[extscreen] and turnedon[extscreen]:
normal = extscreen
else:
normal = panel
if connected[projector]:
# Cycle throug (normal) -> (normal+projector) -> (projector)
if turnedon[normal] and not turnedon[projector]:
activate(projector)
elif turnedon[normal] and turnedon[projector]:
deactivate(normal)
else:
# Presumably only the projector is active, but who knows...
if not turnedon[normal]:
activate(normal)
if turnedon[projector]:
deactivate(projector)
else:
# Connector is not connected. Turn on ext. screen or panel
if connected[extscreen]:
if not turnedon[extscreen]:
activate(extscreen)
if turnedon[panel]:
deactivate(panel)
else:
if not turnedon[panel]:
activate(panel)
if turnedon[projector]:
deactivate(projector)