# Init Skript xauswahl: Auswahl zw. Xinerama & Multiseat

## Finswimmer

Hallo!

Mein Initskript soll bevor KDM gestartet wird, eine Menü anzeigen, mit dem auswählen kann, ob Xinerama (mit links od. rechts Master) oder Multiseat gestartet werden soll.

Dazu habe ich mir folgendes Skript gebastelt:

```
$cat /usr/local/bin/xauswahl

#!/bin/sh

Xdialog --screen-center --title "X Auswahl" \

                --menu "Welche Bedienungsart soll gestartet werden? \n" -1 -1 0 \

                "XineramaR" "1 User auf zwei Bildschirmen - Rechts Master" \

                "XineramaL - Links" "1 User auf zwei Bildschirmen - Links Master" \

                "Multiseat" "2 User mit jeweils einem eigenen Bildschirm" 2> /tmp/menu.tmp.$$

                retval=$?

                choice=`cat /tmp/menu.tmp.$$`

                rm -f /tmp/menu.tmp.$$

                case $retval in

                0)

                if [ $choice == "Multiseat" ] ; then

                        cp /etc/X11/xorg.conf-gesamt /etc/X11/xorg.conf

                        cp /usr/kde/3.5/share/config/kdm/kdmrc.multiseat /usr/kde/3.5/share/config/kdm/kdmrc

                fi

                if [ $choice == "XineramaR" ] ; then

                                cp /usr/kde/3.5/share/config/kdm/kdmrc.xinerama /usr/kde/3.5/share/config/kdm/kdmrc

                                cp /etc/X11/xorg.conf-re /etc/X11/xorg.conf

                fi

                if [ $choice == "XineramaL" ] ; then

                                cp /usr/kde/3.5/share/config/kdm/kdmrc.xinerama /usr/kde/3.5/share/config/kdm/kdmrc

                                cp /etc/X11/xorg.conf-li /etc/X11/xorg.conf

                fi;;

                1)

                echo "Cancel pressed.";;

                255)

                echo "Box closed.";;

                esac
```

Nun noch ein Initskript. Dazu habe ich das xdm einfach modifiziert:

```
$cat /etc/init.d/xauswahl

#!/sbin/runscript

# Copyright 1999-2008 Gentoo Foundation

# Distributed under the terms of the GNU General Public License v2

# $Header: $

depend() {

        need localmount

        # this should start as early as possible

        # we can't do 'before *' as that breaks it

        # (#139824) Start after ypbind and autofs for network authentication

        # (#145219 #180163) Could use lirc mouse as input device

        # (#70689 comment #92) Start after consolefont to avoid display corruption

                        after bootmisc consolefont modules netmount

                        after readahead-list ypbind autofs openvpn gpm lircmd

                        before alsasound

        # Start before X

                        use acpid consolekit hald xfs

        }

        setup_dm() {

                local MY_XDM="$(echo "${DISPLAYMANAGER}" | tr '[:upper:]' '[:lower:]')"

                # Load our root path from profile.env

                # Needed for kdm

                                PATH="${PATH}:$(. /etc/profile.env; echo "${ROOTPATH}")"

                                case "${MY_XDM}" in

                                kdm|kde|kde2|kde3)

                                EXE="$(which kdm)"

                # kdm takes too long to create a pidfile for baselayout-2

                #PIDFILE=/var/run/kdm.pid

                                PIDFILE=

                                ;;

                        kdm-*)

                                EXE="/usr/kde/${MY_XDM#kdm-}/bin/kdm"

                                PIDFILE=

                                ;;

                        entrance*)

                                EXE=/usr/sbin/entranced

                                PIDFILE=/var/lib/entranced.pid

                                ;;

                        gdm|gnome)

                                EXE=/usr/bin/gdm

                                [ "${RC_UNAME}" != "Linux" ] && NAME=gdm-binary

                                PIDFILE=/var/run/gdm.pid

                                ;;

                        wdm)

                                EXE=/usr/bin/wdm

                                PIDFILE=

                                ;;

                        *)

                                EXE=

                # Fix #65586, where MY_XDM is empty so EXE=somedir

                                [ -x "/usr/bin/${MY_XDM}" ] && [ -f "/usr/bin/${MY_XDM}" ] \

                                && EXE="/usr/bin/${MY_XDM}"

                                if [ -z "${EXE}" ] ; then

                                        EXE=/usr/bin/xdm

                                                PIDFILE=/var/run/xdm.pid

                                                fi

                                                ;;

                        esac

                                if ! [ -x "${EXE}" ] ; then

                                        EXE=/usr/bin/xdm

                                                PIDFILE=/var/run/xdm.pid

                                                fi

                }

                cmdline_opt() {

                        if [ $# -ne 1 ] || ! [ -r /proc/cmdline ]; then

                                return 1

                                        fi

                                        for opt in $(cat /proc/cmdline) ; do

                                                [ "${opt}" = "${1}" ] && return 0

                                                        done

                                                        return 1

                }

                # Check to see if something is defined on our VT

                vtstatic() {

                        if [ -e /etc/inittab ] ; then

                                grep -Eq "^[^#]+.*\<tty$1\>" /etc/inittab

                                        elif [ -e /etc/ttys ] ; then

                                        grep -q "^ttyv$(($1 - 1))" /etc/ttys

                        else

                                return 1

                                        fi

                }

                start() {

                        cp /etc/X11/xorg.conf-gesamt /etc/X11/xorg.conf

                                X -layout alltogether &

                                DISPLAY=:0 bash /usr/local/bin/xauswahl && killall -9 X

                        local EXE= NAME= PIDFILE=

                        setup_dm

                        if cmdline_opt nox ; then

                                einfo "Skipping ${EXE}, received 'nox'"

                                return 0

                        fi

                        ebegin "Setting up ${EXE##*/}"

                        #save the prefered DM

                        save_options "service" "${EXE}"

                        save_options "name"    "${NAME}"

                        save_options "pidfile" "${PIDFILE}"

                        if [ -n "${CHECKVT-y}" ] ; then

                                if vtstatic "${CHECKVT:-7}" ; then

                                        if [ -x /sbin/telinit ] && [ "${SOFTLEVEL}" != "BOOT" ] && [ "${RC_SOFTLEVEL}" != "BOOT" ] ; then

                                                ewarn "Something is already defined on VT ${CHECKVT:-7}, will start X later"

                                                telinit a >/dev/null 2>/dev/null

                                                return 0

                                        else

                                                eerror "Something is already defined on VT ${CHECKVT:-7}, not starting"

                                                return 1

                                        fi

                                fi

                        fi

        . /etc/profile

        . /etc/init.d/functions.sh

        # baselayout-1 compat

        if ! type get_options >/dev/null 2>/dev/null ; then

                [ -r "${svclib}"/sh/rc-services.sh ] && . "${svclib}"/sh/rc-services.sh

        fi

        # Great new Gnome2 feature, AA

        # We enable this by default

        export GDK_USE_XFT=1

        export SVCNAME=xdm

        EXEC="/usr/kde/3.5/bin/kdm"

        NAME="KDM"

        PIDFILE="/var/run/kdm.pid"

start-stop-daemon --start --exec ${EXEC} \

${NAME:+--name} ${NAME} ${PIDFILE:+--pidfile} ${PIDFILE} || \

eerror "ERROR: could not start the Display Manager"

                eend 0

        }

        stop() {

                local retval=0

                local curvt=

                if [ -t 0 ] ; then

                        if type fgconsole >/dev/null 2>/dev/null ; then

                                curvt="$(fgconsole 2>/dev/null)"

                        else

                                curvt="$(tty)"

                                case "${curvt}" in

                                        /dev/ttyv[0-9]*) curvt="${curvt#/dev/ttyv*}" ;;

                                        *) curvt= ;;

                                esac

                        fi

                fi

                local myexe="$(get_options "service")"

                local myname="$(get_options "name")"

                local mypidfile="$(get_options "pidfile")"

                local myservice=${myexe##*/}

                [ -z "${myexe}" ] && return 0

                ebegin "Stopping ${myservice}"

                if start-stop-daemon --quiet --test --stop --exec "${myexe}" ; then

                        start-stop-daemon --stop --exec "${myexe}" --retry TERM/5/TERM/5 \

                                ${mypidfile:+--pidfile} ${mypidfile} \

                                ${myname:+--name} ${myname}

                        retval=$?

                fi

                # switch back to original vt

                if [ -n "${curvt}" ] ; then

                        if type chvt >/dev/null 2>/dev/null ; then

                                chvt "${curvt}"

                        else

                                vidcontrol -s "$((${curvt} + 1))"

                        fi

                fi

                eend ${retval} "Error stopping ${myservice}"

        return ${retval}

}
```

Am Anfang von start() lasse ich einen eigenen X mit der Auswahl starten.

Dies kopiert dann die richtige kdmrc und xorg.conf. Danach startet sich der KDM.

Nun ist mein Problem, dass bei /etc/init.d/xauswahl stop IMMER der X nicht richtig heruntergefahren wird.

Ich muss ein killall -9 X durchführen, dann xauswahl zap, danach erst kann ich xauswahl wieder starten.

Habt ihr eine Idee?

Danke

Tob

----------

## ChrisJumper

Hi Tobi,

hab keine Idee, aber es klingt doch so als hast du einen Fehler im Init-Skript beim stop befehl. 

Vielleicht macht es keinen Unterschied aber mir ist da was aufgefallen.

Du startest so...

```
start-stop-daemon --start --exec ${EXEC} \

${NAME:+--name} ${NAME} ${PIDFILE:+--pidfile} ${PIDFILE} || \

eerror "ERROR: could not start the Display Manager" 
```

und beendest das ganze so:

```
start-stop-daemon --quiet --test --stop --exec "${myexe}" ; then

                        start-stop-daemon --stop --exec "${myexe}" --retry TERM/5/TERM/5 \

                                ${mypidfile:+--pidfile} ${mypidfile} \

                                ${myname:+--name} ${myname} 
```

Das mit den Anführungszeichen im --exec Parameter, beim stoppen hast du sie und beim starten nicht.

----------

## Finswimmer

Danke für die Antwort. Da ich diese Teile alle von xdm übernommen habe, denke ich nicht, dass das ein Fehler ist.

Ich denke viel mehr, dass das normal xdm-Skript nur 1X stoppt, ich muss aber 2 stoppen.

Somit ist für xdm alles getan, obwohl dann noch ein X am Laufen ist.

Tobi

----------

## Finswimmer

So. Ich habe nun in stop() einfach ein killall -9 X/kdm eingefügt.

Damit geht sogar ein xauswahl restart ohne Probleme.

Mein Problem ist aber nun, dass ich, wenn ich mich aus KDE auslogge, auch zwischen Xinerama/Multiseat umschalten möchte. Aber bei einem normalen Logout komme ich "nur" zum KDM. Ich möchte aber wieder zu dem Start von meinem Init-Skript.

Hat da jemand eine Idee?

Danke

Tobi

----------

## Finswimmer

*bump*

----------

## think4urs11

Wie wäre es mit einer Umfunktionierung von 'Rechner neu starten' aka reboot?

Normalerweise wird /sbin/reboot ausgeführt aber prinzipiell spricht hier ja nichts dagegen einen 'reboot' von X11 auszulösen oder was auch immer. Siehe /usr/kde/3.5/share/config/kdm/kdmrc:RebootCmd

----------

## Finswimmer

 *Think4UrS11 wrote:*   

> Wie wäre es mit einer Umfunktionierung von 'Rechner neu starten' aka reboot?
> 
> Normalerweise wird /sbin/reboot ausgeführt aber prinzipiell spricht hier ja nichts dagegen einen 'reboot' von X11 auszulösen oder was auch immer. Siehe /usr/kde/3.5/share/config/kdm/kdmrc:RebootCmd

 

Der Mann ist gut. Die Idee hatte ich auch schon, leider klappt das nicht. Der X wurde nicht richtig beendet, sodass dann auch keine neue Instanz erzeugt wurde.

Ich glaube, ich muss da noch ein paar Debugging Sachen anzeigen lassen, damit ich weiß, woran es hapert.

Ein neuer Button geht wohl nicht?

Tobi

----------

## think4urs11

klappt es wenn du die entsprechenden Aktionen im shutdown script auslöst? ~/.kde/shutdown

klappt es via dcop ksmserver ksmserver logout 1 1 2? Beschreibung

----------

## Finswimmer

Hey!

~/.kde/shutdown wird anscheinend nicht bei einem Logout ausgeführt, denn der Eintrag "echo "shutdown" > /tmp/test" brachte nichts, ebensowenig das /etc/init.d/xauswahl restart.

Bei dem zweiten weiß ich leider nicht, was ich damit anfangen soll  :Wink: 

Wenn ich es ausführe, komme ich auf Restart Computer.

Ideal wäre es, wenn man das direkt im init Skript machen könnte. In etwa: Soll kdm aufgerufen werden, dann ruf zuerst X mit meinem xauswahl Skript auf.

Danke

Tobi

----------

## Finswimmer

*bump*

----------

