summaryrefslogtreecommitdiffstats
path: root/data/Xsession.in
diff options
context:
space:
mode:
Diffstat (limited to 'data/Xsession.in')
-rwxr-xr-xdata/Xsession.in197
1 files changed, 197 insertions, 0 deletions
diff --git a/data/Xsession.in b/data/Xsession.in
new file mode 100755
index 0000000..9d79558
--- /dev/null
+++ b/data/Xsession.in
@@ -0,0 +1,197 @@
+#!@XSESSION_SHELL@
+#
+# This is SORT OF LIKE an X session, but not quite. You get a command as the
+# first argument (it could be multiple words, so run it with "eval"). As a
+# special case, the command can be:
+# default - Run the appropriate Xclients startup (see the code below)
+# custom - Run ~/.xsession and if that's not available run 'default'
+#
+# (Note that other arguments could also follow, but only the command one is
+# right now relevant and supported)
+#
+# The output is ALREADY redirected to .xsession-errors in GDM. This way
+# .xsession-errors actually gets more output such as if the PreSession script
+# is failing. This also prevents DoS attacks if some app in the users session
+# can be prodded to dump lots of stuff on the stdout/stderr. We wish to be
+# robust don't we? In case you wish to use an existing script for other DM's,
+# you can just not redirect when GDMSESSION is set. GDMSESSION will always
+# be set from gdm.
+#
+# Also note that this is not run as a login shell, this is just executed.
+# This is why we source the profile files below.
+#
+# based on:
+# $XConsortium: Xsession /main/10 1995/12/18 18:21:28 gildea $
+
+command="$@"
+
+# this will go into the .xsession-errors along with all other echo's
+# good for debugging where things went wrong
+echo "$0: Beginning session setup..."
+
+# First read /etc/profile and .profile
+test -f /etc/profile && . /etc/profile
+test -f "$HOME/.profile" && . "$HOME/.profile"
+# Second read /etc/xprofile and .xprofile for X specific setup
+test -f /etc/xprofile && . /etc/xprofile
+test -f "$HOME/.xprofile" && . "$HOME/.xprofile"
+
+# Translation stuff
+if [ -x "@libexecdir@/gdmtranslate" ] ; then
+ gdmtranslate="@libexecdir@/gdmtranslate"
+else
+ gdmtranslate=
+fi
+
+# Note that this should only go to zenity dialogs which always expect utf8
+gettextfunc () {
+ if [ "x$gdmtranslate" != "x" ] ; then
+ "$gdmtranslate" --utf8 "$1"
+ else
+ echo "$1"
+ fi
+}
+
+OLD_IFS=$IFS
+
+gdmwhich () {
+ COMMAND="$1"
+ OUTPUT=
+ IFS=:
+ for dir in $PATH
+ do
+ if test -x "$dir/$COMMAND" ; then
+ if test "x$OUTPUT" = "x" ; then
+ OUTPUT="$dir/$COMMAND"
+ fi
+ fi
+ done
+ IFS=$OLD_IFS
+ echo "$OUTPUT"
+}
+
+zenity=`gdmwhich zenity`
+
+# Note: ~/.xsession-errors is now done in the daemon so that it
+# works for ALL sessions (except ones named 'Failsafe')
+
+# clean up after xbanner
+freetemp=`gdmwhich freetemp`
+if [ -n "$freetemp" ] ; then
+ "$freetemp"
+fi
+
+userresources="$HOME/.Xresources"
+usermodmap="$HOME/.Xmodmap"
+userxkbmap="$HOME/.Xkbmap"
+
+sysresources=/etc/X11/Xresources
+sysmodmap=/etc/X11/Xmodmap
+sysxkbmap=/etc/X11/Xkbmap
+
+rh6sysresources=/etc/X11/xinit/Xresources
+rh6sysmodmap=/etc/X11/xinit/Xmodmap
+
+# merge in defaults
+if [ -f "$rh6sysresources" ]; then
+ xrdb -nocpp -merge "$rh6sysresources"
+fi
+
+if [ -f "$sysresources" ]; then
+ xrdb -nocpp -merge "$sysresources"
+fi
+
+if [ -f "$userresources" ]; then
+ xrdb -nocpp -merge "$userresources"
+fi
+
+# merge in keymaps
+if [ -f "$sysxkbmap" ]; then
+ setxkbmap `cat "$sysxkbmap"`
+ XKB_IN_USE=yes
+fi
+
+if [ -f "$userxkbmap" ]; then
+ setxkbmap `cat "$userxkbmap"`
+ XKB_IN_USE=yes
+fi
+
+#
+# Eeek, this seems like too much magic here
+#
+if [ -z "$XKB_IN_USE" -a ! -L /etc/X11/X ]; then
+ if grep '^exec.*/Xsun' /etc/X11/X > /dev/null 2>&1 && [ -f /etc/X11/XF86Config ]; then
+ xkbsymbols=`sed -n -e 's/^[ ]*XkbSymbols[ ]*"\(.*\)".*$/\1/p' /etc/X11/XF86Config`
+ if [ -n "$xkbsymbols" ]; then
+ setxkbmap -symbols "$xkbsymbols"
+ XKB_IN_USE=yes
+ fi
+ fi
+fi
+
+# xkb and xmodmap don't play nice together
+if [ -z "$XKB_IN_USE" ]; then
+ if [ -f "$rh6sysmodmap" ]; then
+ xmodmap "$rh6sysmodmap"
+ fi
+
+ if [ -f "$sysmodmap" ]; then
+ xmodmap "$sysmodmap"
+ fi
+
+ if [ -f "$usermodmap" ]; then
+ xmodmap "$usermodmap"
+ fi
+fi
+
+unset XKB_IN_USE
+
+xhost +si:localuser:`id -un` || :
+
+# run all system xinitrc shell scripts.
+if [ -d /etc/X11/xinit/xinitrc.d ]; then
+ for i in /etc/X11/xinit/xinitrc.d/* ; do
+ if [ -x "$i" -a ! -d "$i" ]; then
+ . "$i"
+ fi
+ done
+fi
+
+if [ "x$command" = "xdefault" ] ; then
+ if [ -x "$HOME/.Xclients" ]; then
+ command="$HOME/.Xclients"
+ elif [ -x /etc/X11/xinit/Xclients ]; then
+ command="/etc/X11/xinit/Xclients"
+ elif [ -x /etc/X11/Xclients ]; then
+ command="/etc/X11/Xclients"
+ else
+ if [ -n "$zenity" ] ; then
+ disptext=`gettextfunc "System has no Xclients file, so starting a failsafe xterm session. Windows will have focus only if the mouse pointer is above them. To get out of this mode type 'exit' in the window."`
+ "$zenity" --info --text "$disptext"
+ else
+ echo "$0: Cannot find Xclients"
+ fi
+ exec xterm -geometry 80x24+0+0
+ fi
+fi
+
+# add ssh-agent if found
+sshagent="`gdmwhich ssh-agent`"
+if [ -n "$sshagent" ] && [ -x "$sshagent" ] && [ -z "$SSH_AUTH_SOCK" ]; then
+ command="$sshagent -- $command"
+elif [ -z "$sshagent" ] ; then
+ echo "$0: ssh-agent not found!"
+fi
+
+echo "$0: Setup done, will execute: $command"
+
+eval exec $command
+
+echo "$0: Executing $command failed, will run xterm"
+
+if [ -n "$zenity" ] ; then
+ disptext=`gettextfunc "Failed to start the session, so starting a failsafe xterm session. Windows will have focus only if the mouse pointer is above them. To get out of this mode type 'exit' in the window."`
+ "$zenity" --info --text "$disptext"
+fi
+
+exec xterm -geometry 80x24+0+0