#!/bin/sh
#(c) Copyright Barry Kauler 2003,2004,2005,2006,2007 www.puppylinux.com
#2007 Lesser GPL licence v2 (http://www.fsf.org/licensing/licenses/lgpl.html)
# called by /root/.profile
# moved sync code for console/xorg kbd layout from xwin to /usr/sbin/input-wizard.
#
# $DISTRO_XORG_AUTO : see /etc/DISTRO_SPECS.
# /var/local/xwin_no_xorg_auto_flag:
# the presence of this file triggers xorg wizard (cli)
# if /etc/X11/xorg.conf does not exist
#
# /var/local/xwin_disable_xerrs_log_flag
# create this file to silence xerrs.log
# some buggy / incompatible apps flood xerrs.log mercilessly
[ -z $DISPLAY ] || exit
export TEXTDOMAIN=xwin
export OUTPUT_CHARSET=UTF-8
if ! command -v Xorg >/dev/null 2>&1 ; then
exit
fi
if [ -f /var/local/xwin_disable_xerrs_log_flag ] ; then
LOGFILE_X='/dev/null'
else
LOGFILE_X='/tmp/xerrs.log'
fi
if [ `id -u` -eq 0 -a ! -e /usr/bin/X ] ; then
ln -snf Xorg /usr/bin/X
fi
if [ "$1" = "-default" ] ; then
xorgwizard-automatic
shift
fi
# Ensure current directory is root, in case changed at command prompt,
# so rox icon and menu item open only at home directory. rerwin
cd ~/
. /etc/rc.d/PUPSTATE # variables created at bootup by init script in initrd...
. /etc/DISTRO_SPECS # PUPMODE=current operating configuration,
. /etc/rc.d/BOOTCONSTRAINED
reset_monitor_settings() {
rm -f /var/lib/gdm/.config/monitors.xml 2>/dev/null
for lxpath2 in /etc/xdg /root/.config
do
if [ -e $lxpath2/autostart/lxrandr-autostart.desktop ]; then
rm -f $lxpath2/autostart/lxrandr-autostart.desktop 2>/dev/null
fi
done
for xfcepath in /etc/xdg/xfce4 /etc/xdg/xfce /root/.config/xfce4 /root/.config/xfce
do
if [ -e $xfcepath/xfconf/xfce-perchannel-xml/displays.xml ]; then
echo '
' > $xfcepath/xfconf/xfce-perchannel-xml/displays.xml
fi
done
rm -f /root/.screenlayout/* 2>/dev/null
rm -f /root/.config/monitors.xml 2>/dev/null
rm -f /root/.kde/share/apps/kscreen/* 2>/dev/null
rm -f /root/.kde/local/share/apps/kscreen/* 2>/dev/null
rm -f /root/.kde/share/config/krandrc 2>/dev/null
rm -f /root/.kde4/share/apps/kscreen/* 2>/dev/null
rm -f /root/.kde4/local/share/apps/kscreen/* 2>/dev/null
rm -f /root/.kde4/share/config/krandrc 2>/dev/null
rm -f /root/.local/share/kscreen/* 2>/dev/null
rm -f /root/.zarfy/* 2>/dev/null
if [ -d /home ]; then
for lxf in $(find /home -name "lxrandr-autostart.desktop" -type f | grep "/.config/autostart/")
do
if [ "$lxf" != "" ]; then
rm -f $lxf
fi
done
for usr1 in $(ls -1 /home 2>/dev/null | tr '\n' ' ')
do
if [ -f /home/$usr1/.config/xfce4/xfconf/xfce-perchannel-xml/displays.xml ]; then
echo '
' > /home/$usr1/.config/xfce4/xfconf/xfce-perchannel-xml/displays.xml
fi
if [ -f /home/$usr1/.config/xfce/xfconf/xfce-perchannel-xml/displays.xml ]; then
echo '
' > /home/$usr1/.config/xfce/xfconf/xfce-perchannel-xml/displays.xml
fi
rm -f /home/$usr1/.screenlayout/* 2>/dev/null
rm -f /home/$usr1/.config/monitors.xml 2>/dev/null
rm -f /home/$usr1/.kde/share/apps/kscreen/* 2>/dev/null
rm -f /home/$usr1/.kde/local/share/apps/kscreen/* 2>/dev/null
rm -f /home/$usr1/.kde/share/config/krandrc 2>/dev/null
rm -f /home/$usr1/.kde4/share/apps/kscreen/* 2>/dev/null
rm -f /home/$usr1/.kde4/local/share/apps/kscreen/* 2>/dev/null
rm -f /home/$usr1/.kde4/share/config/krandrc 2>/dev/null
rm -f /home/$usr1/.local/share/kscreen/* 2>/dev/null
rm -f /home/$usr1/.zarfy/* 2>/dev/null
done
fi
}
get_edid_hash() {
for medid in $(ls -1 /sys/class/drm/*/edid 2>/dev/null | grep "card" | grep "-")
do
sc1="$(dirname $medid)/status"
if [ "$(cat $sc1)" == "connected" ]; then
md5sum $medid
fi
done
}
config_video() {
if [ ! -d /var/hwdata ]; then
mkdir -p /var/hwdata
fi
if [ ! -f /var/hwdata/screen.lst ]; then
xConfig=1
elif [ ! -f /var/hwdata/videocards.lst ]; then
xConfig=1
else
xConfig=0
fi
if [ $xConfig -eq 0 ]; then
vlist="$(busybox lspci | grep "Class 03" | cut -c 21-29 | sort)"
ocard="$(cat /var/hwdata/videocards.lst 2>/dev/null)"
#Check if video card change
if [ "$vlist" != "$ocard" ]; then
#Video card change. Remember videocard
echo "$vlist" > /var/hwdata/videocards.lst
xConfig=1
else
xScreens="$(get_edid_hash)"
oScreens="$(cat /var/hwdata/screen.lst 2>/dev/null)"
#Check if screen doesn't change
if [ "$xScreens" != "$oScreens" ]; then
#Screen setup changed. Remember screen setup
echo "$xScreens" > /var/hwdata/screen.lst
xConfig=1
fi
fi
fi
if [ $xConfig -ne 0 ]; then
xorgwizard-automatic
reset_monitor_settings
busybox lspci | grep "Class 03" | cut -c 21-29 | sort > /var/hwdata/videocards.lst
get_edid_hash > /var/hwdata/screen.lst
fi
}
# automatic network reconnect. refer /usr/sbin/hostname-set
if [ -f /tmp/services/network_default_reconnect_required_flag ];then
rm -f /tmp/services/network_default_reconnect_required_flag
IFCONFIG="`ifconfig | grep '^[pwe]' | grep -v 'wmaster'`" #precaution.
[ "$IFCONFIG" = "" ] && network_default_connect #/usr/sbin
fi
# enables to start a specific w.m. from commandline...
# this can also be an app that stars a desktop environment..
if [ "$1" ] ; then
DEXEC="$1"
case $DEXEC in
lxde)
if [ "$(which startlxde)" != "" ]; then
DEXEC="startlxde"
else
DEXEC="lxde-session"
fi
;;
xfce|xfce4|gnome|lxqt|razor|mate|cinnamon)
DEXEC="$DEXEC-session"
;;
kde|tde|fluxbox)
DEXEC="start$DEXEC"
;;
enlightenment)
DEXEC="enlightenment_start"
;;
windowmaker)
DEXEC="wmaker"
;;
esac
if [ ! "`which $DEXEC 2>/dev/null`" ] && [ ! -x $DEXEC ] ; then
echo "* $DEXEC does not exist or is not a valid executable.."
exit 1
fi
echo -n "$DEXEC" > /etc/windowmanager # /root/.xinitrc uses this file.
fi
# in some very strange situations this file might be empty
[ ! -s /etc/X11/xorg.conf ] && rm -f /etc/X11/xorg.conf
# Puppy Xorg Video Wizard...
# boot param pfix=xorgwizard
if [ -f /tmp/xwin_xorgwizard_cli ] ; then
rm -f /tmp/xwin_xorgwizard_cli
xorgwizard-cli
xorgwizard-automatic
# normal operation
elif [ -f /etc/X11/xorg.conf ];then
USING_DRIVER=$(grep '#card0driver' /etc/X11/xorg.conf | grep -v '#.*Driver')
DRVRSPATH='/usr/lib/xorg/modules/drivers'
if [ -d /usr/lib64/xorg/modules/drivers ] ; then
DRVRSPATH='/usr/lib64/xorg/modules/drivers'
fi
if [ "$USING_DRIVER" -a -d "$DRVRSPATH" ] ; then #find location of video chip drivers...
CURRENT_DRIVER="`grep '#card0driver' /etc/X11/xorg.conf | cut -f 2 -d '"'`"
if [ "$CURRENT_DRIVER" ];then
if ! [ "`find -L $DRVRSPATH -type f -name "*${CURRENT_DRIVER}*"`" ] ; then
#driver file not found, comment out
sed -i "s|.*#card0driver|# Driver \"${CURRENT_DRIVER}\" #card0driver|" /etc/X11/xorg.conf
fi
fi
fi
else
#* /etc/X11/xorg.conf does not exist *
rm -f /root/.XLOADED 2> /dev/null #not necessary, precaution.
fi
if [ "$(uname -m | grep -E "[i|x]*86")" != "" ] || [ "$(uname -m)" == "x86_64" ]; then
config_video
fi
# J_Reys idea (see note further down)...
if [ -f /root/.XLOADED ];then
if [ "`cat /root/.XLOADED`" = "true" ];then
#last time X ran, PC hung and had to be rebooted...
dialog --timeout 30 --title "$(gettext 'Warning')" --yes-label "$(gettext 'Ignore')" --no-label "$(gettext 'Commandline')" --yesno "$(gettext 'X seems to have exited uncleanly the last time you ran Puppy. This is usually because of an improper shutdown (such as a power failure), but may be because something is broken.')
$(gettext 'If it was just something like a power failure, wait for 30 seconds or choose for normal startup of X...')
$(gettext 'If there is a problem, such as X not working, choose to drop out to a commandline. There will then be further advice how to fix X...')
$(gettext 'If undecided, wait 30 seconds for normal startup of X...')" 0 0
if [ ! $? = 1 ]; then
rm /root/.XLOADED
else
echo -en "\\033[1;31m" #34=blue, 33=yellow, 32=green, 31=red, 35=purple, 36=aquablue, 38=black.
echo '
'$(gettext 'It seems that last time X ran, the computer hung and you had to reboot.')'
'$(gettext 'Have now dropped down to the commandline. If you want to run the Xorg')'
'$(gettext 'Video Wizard, type "xorgwizard", and after configuring /etc/X11/xorg.conf')'
'$(gettext '(hopefully correctly this time!) type "xwin" to start X.')''
echo -e "\\033[0;39m"
rm -f /root/.XLOADED #otherwise cannot start X.
exit
fi
fi
fi
if type pcmanfm >/dev/null 2>&1 ; then
rm -f $HOME/.cache/menu-cached* $HOME/.cache/pcmanfm* $HOME/.cache/menus/*
fi
for i in /tmp/runtime-* ; do
[ -d ${i} ] || continue
find ${i} -not -type d -delete
done
if [ "$XDG_RUNTIME_DIR" ] && [ -d "$XDG_RUNTIME_DIR" ] ; then
find "$XDG_RUNTIME_DIR" -not -type d -delete
fi
killall -9 pup_event_frontend_d 2>/dev/null
#-- finally, start X... --
# J_Rey had a good idea, flag XLOADED... and set to false on exit.
# but if PC hangs, XLOADED will still be true, so will know it is broken.
if [ -f $HOME/.xinitrc ] ; then
XINITRC="$HOME/.xinitrc"
elif [ -f /root/.xinitrc ] ; then
XINITRC="/root/.xinitrc"
fi
echo -n "true" > /root/.XLOADED
echo "$(gettext 'Starting X, specs in /etc/X11/xorg.conf'). ${XINITRC}...."
#-----------------------------------------------------------------------
if [ "$LOGFILE_X" = "/dev/null" ] ; then
echo 'logging of X errors is disabled' > /tmp/xerrs.log
echo 'remove /var/local/xwin_disable_xerrs_log_flag to enable it, then restart X' >> /tmp/xerrs.log
fi
if [ -f /var/local/xwin_run_as_spot_flag ] ; then
(
if [ ! -L /var/log/Xorg.0.log ] ; then
rm -f /var/log/Xorg.0.log
ln -s /home/spot/.local/share/xorg/Xorg.0.log /var/log/
fi
export DISPLAY=":0"
(
while ! xdpyinfo > /dev/null 2>&1; do
sleep 0.1
done
exec ${XINITRC}
) &
PID=$!
run-as-spot X -br -nolisten tcp || (rm -f /var/log/Xorg.0.log && X -br -nolisten tcp && rm -f /var/local/xwin_run_as_spot_flag)
kill $PID 2>/dev/null
unset DISPLAY
) > $LOGFILE_X 2>&1
else
/usr/bin/xinit ${XINITRC} -- -br -nolisten tcp > $LOGFILE_X 2>&1
fi
#-----------------------------------------------------------------------
echo -n "false" > /root/.XLOADED #see note above.
rm -f /tmp/services/x_display
sleep 0.5
# ...if PC hung, run xorgwizard at next bootup (see further up).
load_consolefont # load console font on exit from X.
# console font is loaded in quicksetup if locale changed.
echo '--------'
echo ''$(gettext 'Exited from X. Type "xwin [jwm]" to restart X ([ ] mean optional).')''
echo ''$(gettext 'Type "xwin -default [jwm]" to restart X with the default xorg.conf')''
echo '-'
echo ''$(gettext '(To shutdown PC type "poweroff", to reboot PC type "reboot")')''
echo ''$(gettext 'If X failed to start, type "xorgwizard" to setup X')''
[ -f /tmp/wmexitmode.txt ] || exit
# Shutdown menu calls wmreboot, wmpoweroff, wmexit or restartwm, which create this file...
WMEXITMODE="`cat /tmp/wmexitmode.txt`"
if [ "$WMEXITMODE" = "exit" ];then #see /usr/bin/wmexit.
rm -f /tmp/wmexitmode.txt
exit
fi
[ "$WMEXITMODE" = "poweroff" ] && exec poweroff #see /usr/bin/wmpoweroff
[ "$WMEXITMODE" = "reboot" ] && exec reboot #see /usr/bin/wmreboot
[ "$WMEXITMODE" = "shutdown" ] && exec shutdown
# restart window manager...
# make a gross assumption, if wmexitmode.txt exists, haven't already exited this script, then want
# to restart maybe with different window manager. /etc/windowmanager already has desired w.m.
rm -f /tmp/wmexitmode.txt #definitely delete it now.
# thanks GuestToo for advice on this, works with chooselocale script...
NEWLANG="`cat /etc/profile | grep '^LANG=' | cut -f 2 -d '='`"
if [ "$NEWLANG" -a "$NEWLANG" != "$LANG" ];then #precaution
export LANG=$NEWLANG
fi
# hostname-set changed HOSTNAME, via quicksetup, X is restarted,
# update $HOSTNAME (was exported at bootup in /etc/profile)...
NEWHOSTNAME="`cat /etc/hostname | tr -d '\n'`"
if [ "$NEWHOSTNAME" -a "$NEWHOSTNAME" != "$HOSTNAME" ];then
export HOSTNAME=$NEWHOSTNAME
fi
exec xwin
### END ###