Mittwoch, Februar 04, 2009

VT Changes und der Wahnsinn mit Multiusersystemen

Also:
Meine Freundin und ich benutzen denselben Computer mit jeweils eigenen Accounts. Das ist eine tolle Sache. Linux beherrscht dieses schoene schnelle umschalten zwischen den verschiedenen Konsolen ueber CTRL-ALT-Fn, wobei n die Konsolennummer ist. Ich benutze Konsole 7, sie die 8.

Frueher gabs da immer Probleme, weil meine Session sehr haeufig beim Switch abgestuertzt ist. Das war ein Problem mit dem NVidia-Treiber und besteht nicht mehr seit NVIDIA-Linux-x86-177.82-pkg1.run als Treiber laeuft. (Der Dateiname ist der Name der Installerdatei von nvidia.com).

Nun noergelt ein Bekannter staendig, dass mein auto-away im Gajim (Jabber-Client in python, gajim.org) nicht funktioniert.

Das liegt daran, dass gajim in der Version, die ich benutze (0.11.4), das ist (as of this writing) die aktuelle aus Debian/Lenny, den idle-status des Benutzers ueber ein X-Interface zu ermitteln, das eigentlich fuer den Screensaver gedacht ist, und nicht funktioniert, wenn der XServer-Prozess, der den Gajim beherbergt, grade nicht angezeigt wird (sondern der andere XServer.).

Dafuer hab ich mir jetzt ein Skript gebaut, dass feststellt, ob umgeschaltet wurde, und entsprechend den Gajim-Status updatet. Das hab ich dann nach ~/.kde/Autostart/ verlinkt und jetzt scheint das einigermassen zu funktionieren.

Da ist allerdings noch zu erwaehnen, dass man, um festzustellen, welche Konsole grade angezeigt wird, das Tool fgconsole benutzen muss. Dieses Tool funktioniert aber nur, wenn man auch die Rechte auf dieser Konsole hat. D.h. bei XServern eben grade nicht. Da war ich allerdings faul, und hab fgconsole auf suid root gesetzt

GANZ fuerchterliche Technik.

Falls es jemanden interessiert, warum ich nicht die Gajim-Version von gajim.org benutze: Die funktioniert bei mir nicht. Ich weiss auch nicht warum.


#!/bin/bash
# written 2009 by mokrates

MINEVT=`fgconsole`
CURVT=`fgconsole`
GAJIM_STATUS_FILE=`tempfile`

while true; do
sleep 5
VT=`fgconsole`
if [ "$CURVT" != "$VT" ]; then
CURVT=$VT
if [ "`gajim-remote check_gajim_running`" = "True" ]; then
if [ "$CURVT" != "$MINEVT" ]; then
rm -f $GAJIM_STATUS_FILE
for i in `gajim-remote list_accounts`; do
echo $i `gajim-remote get_status $i` \
x"`gajim-remote get_status_message $i`" >> $GAJIM_STATUS_FILE
done
cat $GAJIM_STATUS_FILE | while read ACC STATUS MESG; do
if [ "$STATUS" != "offline" ]; then
gajim-remote change_status away "away for vt switch" "$ACC"
fi
done
echo 'switched to away'
else # CURVT == MINEVT
cat $GAJIM_STATUS_FILE | while read ACC STATUS MESG; do
gajim-remote change_status "$STATUS" "${MESG:1}" "$ACC"
done
echo 'switched back'
fi
fi
fi
done

Keine Kommentare: