[134] | 1 | #!@XSESSION_SHELL@ |
---|
| 2 | # |
---|
| 3 | # This is SORT OF LIKE an X session, but not quite. You get a command as the |
---|
| 4 | # first argument (it could be multiple words, so run it with "eval"). As a |
---|
| 5 | # special case, the command can be: |
---|
| 6 | # default - Run the appropriate Xclients startup (see the code below) |
---|
| 7 | # custom - Run ~/.xsession and if that's not available run 'default' |
---|
| 8 | # |
---|
| 9 | # (Note that other arguments could also follow, but only the command one is |
---|
| 10 | # right now relevant and supported) |
---|
| 11 | # |
---|
| 12 | # The output is ALREADY redirected to .xsession-errors in GDM. This way |
---|
| 13 | # .xsession-errors actually gets more output such as if the PreSession script |
---|
| 14 | # is failing. This also prevents DoS attacks if some app in the users session |
---|
| 15 | # can be prodded to dump lots of stuff on the stdout/stderr. We wish to be |
---|
| 16 | # robust don't we? In case you wish to use an existing script for other DM's, |
---|
| 17 | # you can just not redirect when GDMSESSION is set. GDMSESSION will always |
---|
| 18 | # be set from gdm. |
---|
| 19 | # |
---|
| 20 | # Also note that this is not run as a login shell, this is just executed. |
---|
| 21 | # This is why we source the profile files below. |
---|
| 22 | # |
---|
| 23 | # based on: |
---|
| 24 | # $XConsortium: Xsession /main/10 1995/12/18 18:21:28 gildea $ |
---|
| 25 | |
---|
| 26 | command="$@" |
---|
| 27 | |
---|
| 28 | # this will go into the .xsession-errors along with all other echo's |
---|
| 29 | # good for debugging where things went wrong |
---|
| 30 | echo "$0: Beginning session setup..." |
---|
| 31 | |
---|
| 32 | # First read /etc/profile and .profile |
---|
| 33 | test -f /etc/profile && . /etc/profile |
---|
| 34 | test -f "$HOME/.profile" && . "$HOME/.profile" |
---|
| 35 | # Second read /etc/xprofile and .xprofile for X specific setup |
---|
| 36 | test -f /etc/xprofile && . /etc/xprofile |
---|
| 37 | test -f "$HOME/.xprofile" && . "$HOME/.xprofile" |
---|
| 38 | |
---|
| 39 | # Translation stuff |
---|
| 40 | if [ -x "@libexecdir@/gdmtranslate" ] ; then |
---|
| 41 | gdmtranslate="@libexecdir@/gdmtranslate" |
---|
| 42 | else |
---|
| 43 | gdmtranslate= |
---|
| 44 | fi |
---|
| 45 | |
---|
| 46 | # Note that this should only go to zenity dialogs which always expect utf8 |
---|
| 47 | gettextfunc () { |
---|
| 48 | if [ "x$gdmtranslate" != "x" ] ; then |
---|
| 49 | "$gdmtranslate" --utf8 "$1" |
---|
| 50 | else |
---|
| 51 | echo "$1" |
---|
| 52 | fi |
---|
| 53 | } |
---|
| 54 | |
---|
| 55 | OLD_IFS=$IFS |
---|
| 56 | |
---|
| 57 | gdmwhich () { |
---|
| 58 | COMMAND="$1" |
---|
| 59 | OUTPUT= |
---|
| 60 | IFS=: |
---|
| 61 | for dir in $PATH |
---|
| 62 | do |
---|
| 63 | if test -x "$dir/$COMMAND" ; then |
---|
| 64 | if test "x$OUTPUT" = "x" ; then |
---|
| 65 | OUTPUT="$dir/$COMMAND" |
---|
| 66 | fi |
---|
| 67 | fi |
---|
| 68 | done |
---|
| 69 | IFS=$OLD_IFS |
---|
| 70 | echo "$OUTPUT" |
---|
| 71 | } |
---|
| 72 | |
---|
| 73 | zenity=`gdmwhich zenity` |
---|
| 74 | |
---|
| 75 | # Note: ~/.xsession-errors is now done in the daemon so that it |
---|
| 76 | # works for ALL sessions (except ones named 'Failsafe') |
---|
| 77 | |
---|
| 78 | # clean up after xbanner |
---|
| 79 | freetemp=`gdmwhich freetemp` |
---|
| 80 | if [ -n "$freetemp" ] ; then |
---|
| 81 | "$freetemp" |
---|
| 82 | fi |
---|
| 83 | |
---|
| 84 | userresources="$HOME/.Xresources" |
---|
| 85 | usermodmap="$HOME/.Xmodmap" |
---|
| 86 | userxkbmap="$HOME/.Xkbmap" |
---|
| 87 | |
---|
| 88 | sysresources=/etc/X11/Xresources |
---|
| 89 | sysmodmap=/etc/X11/Xmodmap |
---|
| 90 | sysxkbmap=/etc/X11/Xkbmap |
---|
| 91 | |
---|
| 92 | rh6sysresources=/etc/X11/xinit/Xresources |
---|
| 93 | rh6sysmodmap=/etc/X11/xinit/Xmodmap |
---|
| 94 | |
---|
| 95 | # merge in defaults |
---|
| 96 | if [ -f "$rh6sysresources" ]; then |
---|
| 97 | xrdb -nocpp -merge "$rh6sysresources" |
---|
| 98 | fi |
---|
| 99 | |
---|
| 100 | if [ -f "$sysresources" ]; then |
---|
| 101 | xrdb -nocpp -merge "$sysresources" |
---|
| 102 | fi |
---|
| 103 | |
---|
| 104 | if [ -f "$userresources" ]; then |
---|
| 105 | xrdb -nocpp -merge "$userresources" |
---|
| 106 | fi |
---|
| 107 | |
---|
| 108 | # merge in keymaps |
---|
| 109 | if [ -f "$sysxkbmap" ]; then |
---|
| 110 | setxkbmap `cat "$sysxkbmap"` |
---|
| 111 | XKB_IN_USE=yes |
---|
| 112 | fi |
---|
| 113 | |
---|
| 114 | if [ -f "$userxkbmap" ]; then |
---|
| 115 | setxkbmap `cat "$userxkbmap"` |
---|
| 116 | XKB_IN_USE=yes |
---|
| 117 | fi |
---|
| 118 | |
---|
| 119 | # |
---|
| 120 | # Eeek, this seems like too much magic here |
---|
| 121 | # |
---|
| 122 | if [ -z "$XKB_IN_USE" -a ! -L /etc/X11/X ]; then |
---|
| 123 | if grep '^exec.*/Xsun' /etc/X11/X > /dev/null 2>&1 && [ -f /etc/X11/XF86Config ]; then |
---|
| 124 | xkbsymbols=`sed -n -e 's/^[ ]*XkbSymbols[ ]*"\(.*\)".*$/\1/p' /etc/X11/XF86Config` |
---|
| 125 | if [ -n "$xkbsymbols" ]; then |
---|
| 126 | setxkbmap -symbols "$xkbsymbols" |
---|
| 127 | XKB_IN_USE=yes |
---|
| 128 | fi |
---|
| 129 | fi |
---|
| 130 | fi |
---|
| 131 | |
---|
| 132 | # xkb and xmodmap don't play nice together |
---|
| 133 | if [ -z "$XKB_IN_USE" ]; then |
---|
| 134 | if [ -f "$rh6sysmodmap" ]; then |
---|
| 135 | xmodmap "$rh6sysmodmap" |
---|
| 136 | fi |
---|
| 137 | |
---|
| 138 | if [ -f "$sysmodmap" ]; then |
---|
| 139 | xmodmap "$sysmodmap" |
---|
| 140 | fi |
---|
| 141 | |
---|
| 142 | if [ -f "$usermodmap" ]; then |
---|
| 143 | xmodmap "$usermodmap" |
---|
| 144 | fi |
---|
| 145 | fi |
---|
| 146 | |
---|
| 147 | unset XKB_IN_USE |
---|
| 148 | |
---|
| 149 | # Normalize languages, some places/distros screw us up in /etc/profile, |
---|
| 150 | # so in case the user did select a language |
---|
| 151 | if [ -n "$GDM_LANG" ]; then |
---|
| 152 | LANG="$GDM_LANG" |
---|
| 153 | export LANG |
---|
| 154 | |
---|
| 155 | if [ -n "$LC_ALL" ]; then |
---|
| 156 | if [ "$LC_ALL" != "$LANG" ]; then |
---|
| 157 | LC_ALL="$LANG" |
---|
| 158 | fi |
---|
| 159 | else |
---|
| 160 | unset LC_ALL |
---|
| 161 | fi |
---|
| 162 | |
---|
| 163 | if [ -n "$LANGUAGE" ]; then |
---|
| 164 | if [ "$LANGUAGE" != "$LANG" ]; then |
---|
| 165 | LANGUAGE="$LANG" |
---|
| 166 | fi |
---|
| 167 | else |
---|
| 168 | unset LANGUAGE |
---|
| 169 | fi |
---|
| 170 | |
---|
| 171 | if [ -n "$LINGUAS" ]; then |
---|
| 172 | if [ "$LINGUAS" != "$LANG" ]; then |
---|
| 173 | LINGUAS="$LANG" |
---|
| 174 | fi |
---|
| 175 | else |
---|
| 176 | unset LINGUAS |
---|
| 177 | fi |
---|
| 178 | fi |
---|
| 179 | |
---|
| 180 | # run all system xinitrc shell scripts. |
---|
| 181 | if [ -d /etc/X11/xinit/xinitrc.d ]; then |
---|
| 182 | for i in /etc/X11/xinit/xinitrc.d/* ; do |
---|
| 183 | if [ -x "$i" ]; then |
---|
| 184 | . "$i" |
---|
| 185 | fi |
---|
| 186 | done |
---|
| 187 | fi |
---|
| 188 | |
---|
| 189 | if [ "x$command" = "xcustom" ] ; then |
---|
| 190 | if [ -x "$HOME/.xsession" ]; then |
---|
| 191 | command="$HOME/.xsession" |
---|
| 192 | else |
---|
| 193 | echo "$0: Cannot find ~/.xsession will try the default session" |
---|
| 194 | command="default" |
---|
| 195 | fi |
---|
| 196 | fi |
---|
| 197 | |
---|
| 198 | if [ "x$command" = "xdefault" ] ; then |
---|
| 199 | if [ -x "$HOME/.Xclients" ]; then |
---|
| 200 | command="$HOME/.Xclients" |
---|
| 201 | elif [ -x /etc/X11/xinit/Xclients ]; then |
---|
| 202 | command="/etc/X11/xinit/Xclients" |
---|
| 203 | elif [ -x /etc/X11/Xclients ]; then |
---|
| 204 | command="/etc/X11/Xclients" |
---|
| 205 | else |
---|
| 206 | if [ -n "$zenity" ] ; then |
---|
| 207 | 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."` |
---|
| 208 | "$zenity" --info --text "$disptext" |
---|
| 209 | else |
---|
| 210 | echo "$0: Cannot find Xclients" |
---|
| 211 | fi |
---|
| 212 | exec xterm -geometry 80x24+0+0 |
---|
| 213 | fi |
---|
| 214 | fi |
---|
| 215 | |
---|
| 216 | # add ssh-agent if found |
---|
| 217 | sshagent="`gdmwhich ssh-agent`" |
---|
| 218 | if [ -n "$sshagent" ] && [ -x "$sshagent" ] && [ -z "$SSH_AUTH_SOCK" ]; then |
---|
| 219 | command="$sshagent -- $command" |
---|
| 220 | elif [ -z "$sshagent" ] ; then |
---|
| 221 | echo "$0: ssh-agent not found!" |
---|
| 222 | fi |
---|
| 223 | |
---|
| 224 | echo "$0: Setup done, will execute: $command" |
---|
| 225 | |
---|
| 226 | eval exec $command |
---|
| 227 | |
---|
| 228 | echo "$0: Executing $command failed, will run xterm" |
---|
| 229 | |
---|
| 230 | if [ -n "$zenity" ] ; then |
---|
| 231 | 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."` |
---|
| 232 | "$zenity" --info --text "$disptext" |
---|
| 233 | fi |
---|
| 234 | |
---|
| 235 | exec xterm -geometry 80x24+0+0 |
---|