#!/bin/ash
# start-up script for xinit, launch window manager and panels
# Copyright (C) James Budiono 2012, 2015
# License: GNU GPL Version 3 or later
#
# Re-written for Fatdog64 600 from original $Xorg: xinitrc.cpp,v 1.3 2000/08/17 19:54:30 cpqbld Exp $
#
# $1 - window manager, $2 - window panel (both optional)

### redirect all std file descriptors so that they are not inherited and cause hangups later
#   closing them only works half of the time, it's better just to redirect to /dev/null
exec < /dev/null > /dev/null 2>&1	

### configuration
export XSESSION_ID=$(hexdump -e '"%08x"'  -n 4 /dev/urandom) # define our session
USER_RESOURCE=$HOME/.Xresources
USER_MODMAP=$HOME/.Xmodmap
SYSTEM_RESOURCE=/etc/X11/app-defaults/Xresources
SYSTEM_MODMAP=/etc/X11/app-defaults/Xmodmap

TEMPLATE_DRIVE_ICON_ROOT=/tmp/fatdog-drive-icons	# no $USER here - we want to delete all leftover icons
MASTER_PINBOARD_FILE=/etc/xdg/rox.sourceforge.net/ROX-Filer/PuppyPin
PINBOARD_FILE=$HOME/.config/rox.sourceforge.net/ROX-Filer/PuppyPin
GLOBICON_FILE=$HOME/.config/rox.sourceforge.net/ROX-Filer/globicons
KEYMAP_CONFIG=$FATDOG_STATE_DIR/xkeymap	# set by fatdog-keyboard-wizard.sh
MASTER_XFCE_CONFIG=/etc/xdg/home	# required by our xfce4 implementation

WINDOW_MANAGER=openbox          # default window manager
WINDOW_PANEL=defaultpanel        # default window panel
[ -r /etc/windowmanager ] && read WINDOW_MANAGER < /etc/windowmanager # system default
[ -r /etc/windowpanel ] && read WINDOW_PANEL < /etc/windowpanel       # system default
WINDOW_MANAGER_CONFIG=$FATDOG_STATE_DIR/windowmanager # per-user default
WINDOW_PANEL_CONFIG=$FATDOG_STATE_DIR/windowpanel     # per-user default

F_WINDOW_MANAGER_PID=/tmp/xinitrc-wm.pid.$USER.$XSESSION_ID		# used by wmexit
F_WINDOW_PANEL_PID=/tmp/xinitrc-panel.pid.$USER.$XSESSION_ID	# used by wmexit
F_NO_FREEMEM_APPLET=/tmp/xinitrc-no-freemem.$USER.$XSESSION_ID	# used by rc.Xservices

. $BOOTSTATE_PATH 	# TMPFS_MOUNT, SAVEFILE_MOUNT
export EDITOR=geany	# override console settings

### cleanup stuff
trap 'cleanup; exit;' 0 INT HUP TERM
cleanup() {
	rm -f $F_WINDOW_MANAGER_PID $F_WINDOW_PANEL_PID $F_NO_FREEMEM_APPLET
}

### screen mode / resolution setup
zarfy -l

### setup Xresources, fonts, cursors
# merge in defaults and keymaps
[ -f $SYSTEM_RESOURCE ] && xrdb -merge -nocpp $SYSTEM_RESOURCE
[ -f $SYSTEM_MODMAP ] && xmodmap $SYSTEM_MODMAP
[ -f $USER_RESOURCE ] && xrdb -merge -nocpp $USER_RESOURCE
[ -f $USER_MODMAP ] && xmodmap $USER_MODMAP

# set keyboard layout - if needed
[ -e $KEYMAP_CONFIG ] && read p < $KEYMAP_CONFIG 2>/dev/null
if [ "$p" ]; then
	setxkbmap $p
	setxkbmap -query # workaround for certain layout 
fi

# fonts & default cursor
[ -f $HOME/.fonts/fonts.dir ] && xset fp+ $HOME/.fonts/
[ -f /usr/bin/xsetroot ] && xsetroot -cursor_name top_left_arrow

# apply settings from /usr/bin/pupx...
[ -f $HOME/.xset.sh ] &&  eval $HOME/.xset.sh

### prepare Rox desktop
# create pinboard file if it does not exist
if [ ! -e $PINBOARD_FILE ]; then
	mkdir -p ${PINBOARD_FILE%/*}
	cp $MASTER_PINBOARD_FILE $PINBOARD_FILE
fi 

# remove stale drive icons
sed -i -e "\%$TEMPLATE_DRIVE_ICON_ROOT% d" $PINBOARD_FILE	
sed -i -e "\%$TEMPLATE_DRIVE_ICON_ROOT%,\%</rule>% d" $GLOBICON_FILE

# remove all save-* buttons, calc rightmost location
sed -i -e '/save2flash/ d; /save2session/ d' $PINBOARD_FILE
p=$(xdpyinfo | sed '/dimensions:/!d; s/^[^0-9]*//;s/[ \t].*//')
p=$((${p%x*}-96)) # 96 pixels from right

# RAM-layer/first-boot setup
if [ "$TMPFS_MOUNT" ]; then 
	if [ -z "$SAVEFILE_MOUNT" ]; then 
		# RAM layer but no savefile - assume first boot
		true # /usr/sbin/background_reshape	
	else 
		# RAM layer and with savefile - enable our RAM-save layer button
		sed -i -e 's_</pinboard>_<icon x="'$p'" y="32" label="Save RAM layer">/usr/sbin/save2flash</icon>\n</pinboard>_' $PINBOARD_FILE
	fi
fi

# add multisession save button if multisession mode
if [ "$MULTI_DEVICE" ]; then 
	sed -i -e 's_</pinboard>_<icon x="'$p'" y="120" label="Save session">/usr/sbin/save2session</icon>\n</pinboard>_' $PINBOARD_FILE
fi

### launch Rox desktop 
Xdialog --infobox "Preparing desktop ..." 0 0 1 # use Xdialog to pre-load GTK libs, fonts, icons, etc
rox -p $PINBOARD_FILE

### start late-start apps
rm -f $F_NO_FREEMEM_APPLET
/etc/rc.d/rc.Xservices &

### final step: launch window manager & panel
[ "$1" ] && echo "$1" > $WINDOW_MANAGER_CONFIG
[ "$2" ] && echo "$2" > $WINDOW_PANEL_CONFIG
[ -e $WINDOW_MANAGER_CONFIG ] && read WINDOW_MANAGER < $WINDOW_MANAGER_CONFIG
[ -e $WINDOW_PANEL_CONFIG ] && read WINDOW_PANEL < $WINDOW_PANEL_CONFIG

rm -f $F_WINDOW_MANAGER_PID $F_WINDOW_PANEL_PID
echo $$ > $F_WINDOW_MANAGER_PID
case "$WINDOW_MANAGER" in
	jwm)
		jwm_menu_create
		[ ! -e $HOME/.jwmrc-tray ] && cp /etc/xdg/templates/jwmrc-tray $HOME/.jwmrc-tray
		[ -f $HOME/.jwm/jwm_colors ] && . $HOME/.jwm/jwm_colors	
		exec jwm
		;;
	icewm|icewm-session)
		[ ! -e $HOME/.icewm ] && mkdir $HOME/.icewm
		[ ! -e $HOME/.icewm/menu ] && cp /etc/xdg/templates/icewm.menu $HOME/.icewm/menu
		[ ! -e $HOME/.icewm/toolbar ] && cp /etc/xdg/templates/icewm.toolbar $HOME/.icewm/toolbar
		exec "$WINDOW_MANAGER"
		;;
	xfwm4)
		touch $F_NO_FREEMEM_APPLET	# don't use freememapplet for xfce
     	[ ! -e $HOME/.config/xfce4 ] && cp -r $MASTER_XFCE_CONFIG/.??* $HOME # add default Xfce config to $HOME
		xfwm4 --daemon #note, starts xfce-mcs-manager daemon also.
		exec xfce4-panel
		;;
	*)	# all others: openbox, etc
		if [ "$WINDOW_PANEL" ]; then
			"$WINDOW_PANEL" &
			echo $! > $F_WINDOW_PANEL_PID
		fi
		exec "$WINDOW_MANAGER"
		;;
esac
