X-Git-Url: https://git.distorted.org.uk/~mdw/profile/blobdiff_plain/5587cf4f528512164052d11e12196416a490e30e..bfdee8c36e31700e3c744c68489cc8de2c4e2c12:/dot/xinitrc diff --git a/dot/xinitrc b/dot/xinitrc index 750bc9e..87e5bbd 100755 --- a/dot/xinitrc +++ b/dot/xinitrc @@ -25,6 +25,33 @@ run () { esac } +manage () { + local when=$(date +%s) now + local fail=0 rc report + + while :; do + "$@"; rc=$? + case $rc in + 0) info "manage $1: successful exit"; break ;; + 143) info "manage $1: terminated"; break ;; + esac + now=$(date +%s) + report="rc = $rc" + if (( $now - $when > 5 )); then + fail=0 + else + report="$report, early failure" + fail=$(( $fail + 1 )) + if (( $fail >= 5 )); then + info "manage $1: exit ($report), giving up after $fail failures" + break + fi + fi + info "manage $1: exit ($report), restarting" + when=$now + done +} + ## Program choice pick_program () { local what=$1; shift @@ -71,6 +98,13 @@ EOF done ###-------------------------------------------------------------------------- +### Preliminary hook. + +if [ -r $HOME/.xinitrc-prehook ]; then + . $HOME/.xinitrc-prehook +fi + +###-------------------------------------------------------------------------- ### Iniitial settings. ## Assume X sessions are secure. @@ -87,18 +121,21 @@ initialize () { run init xrdb -override $HOME/.Xdefaults ## Random xsettery. - run init xset b 10 2000 50 + run init xset b 5 2000 50 run init xset r rate 500 50 run init xset m 2 1 ## Key mappings. - xmodmap -e 'keysym BackSpace = BackSpace BackSpace' + xmodmap $HOME/.xmodmap + if [ -r $HOME/.xmodmap-local ]; then + xmodmap $HOME/.xmodmap-local + fi } ###-------------------------------------------------------------------------- ### Start a window manager. -wm=$(pick_program window-manager enlightenment e16 twm) +wm=$(pick_program window-manager e16 compiz enlightenment e17 twm) wmopts="" case "$wm,$vnc" in enlightenment,yes | e16,yes) @@ -107,7 +144,7 @@ case "$wm,$vnc" in esac start-e16 () { - run bginit $wm $wmopts + run bginit manage $wm $wmopts win=nil for i in $(seq 10); do sleep 1 @@ -133,7 +170,7 @@ start-window-manager () { start-$wm $wmopts ;; *) - run bginit $wm $wmopts + run bginit manage $wm $wmopts ;; esac } @@ -144,8 +181,22 @@ start-window-manager () { start-clients-local () { :; } start-clients () { + ## Gnome session. - case $vnc in no) run bginit gnome-session ;; esac + case "$vnc,$(xfce4-session --version 2>&1),$(gnome-session --version 2>&1)" + in + no,xfce4-session*) + run bginit xfce4-session + ;; + no,*,gnome-session\ 2.3[2-9].* | \ + no,*,gnome-session\ 2.4[0-9].* | \ + no,*,gnome-session\ 2.[1-9][0-9][0-9]*) + run bginit gnome-session --session mdw + ;; + no,*,gnome-session*) + run bginit gnome-session + ;; + esac ## Local clients. start-clients-local @@ -204,7 +255,7 @@ declare -i \ start-emacs () { GDK_NATIVE_WINDOWS=1 run bgclients noip \ - $emacs -geometry ${emacsx}x${emacsy}+0+0 + $emacs -bg black -geometry ${emacsx}x${emacsy}+0+0 } ## Now place some xterms. @@ -300,7 +351,7 @@ EOF exec "$0" wait nostart ;; :ask-run) - req "Shell command" .cmd.hist xcatch -FMiscFixed6x13 -- sh -c& + req "Shell command" .cmd.hist xcatch -F"Fixed 13" -- sh -c& ;; :ask-command) req "xinit command" .xinit.hist xatom set XINIT_COMMAND$atomtag& @@ -312,7 +363,7 @@ EOF eval "${line#!}" ;; *) - set -- $line + set -- $line run bgclients "$@" ;; esac @@ -320,6 +371,38 @@ EOF } ###-------------------------------------------------------------------------- +### Gnome session care and feeding. + +session-running-p () { + dbus-send --session --print-reply --dest=org.freedesktop.DBus / \ + org.freedesktop.DBus.GetNameOwner string:org.gnome.SessionManager \ + >/dev/null 2>&1 +} + +dbus-service-running-p () { + dbus-send >/dev/null 2>&1 --session --print-reply \ + --dest=org.freedesktop.DBus / \ + org.freedesktop.DBus.GetNameOwner string:$1 +} + +kill-gnome-session () { + win=nil + while read service object logout; do + if dbus-service-running-p $service; then win=t; break; fi + done <