#!/bin/bash
# rgba -- enable or disable subpixel antialiasing in GNOME

. lib.bash || exit

winehintstyle=${winehintstyle:-hintfull}
gtkhintstyle=${gtkhintstyle:-hintslight}

if gsettings list-keys 'org.gnome.desktop.interface' | grep -qs '^font-antialiasing$'; then
	gschema="org.gnome.desktop.interface"
	gprefix="font-"
else
	gschema="org.gnome.settings-daemon.plugins.xsettings"
	gprefix=""
fi

case $1 in
	*/*)
		gtkhintstyle=${1#*/}
		gtkhintstyle=hint${gtkhintstyle#hint}
		set -- "${1%/*}" "${@:2}"
		;;
esac

case ${gtkhintstyle#hint} in
	none|slight|medium|full)
		;;
	*)
		die "invalid GTK hint style '$gtkhintstyle'"
		;;
esac

case $1 in
	on|always)
		info "enabling RGBA/$winehintstyle everywhere"
		do: gsettings set $gschema ${gprefix}antialiasing rgba
		do: gsettings set $gschema ${gprefix}hinting ${winehintstyle#hint}
		do: gsettings reset org.gnome.settings-daemon.plugins.xsettings overrides
		;;
	off|mixed)
		info "selecting grayscale/$gtkhintstyle for Gtk, RGBA/$winehintstyle for everything else"
		do: gsettings set $gschema ${gprefix}antialiasing rgba
		do: gsettings set $gschema ${gprefix}hinting ${winehintstyle#hint}
		do: gsettings set org.gnome.settings-daemon.plugins.xsettings overrides "{'Xft/HintStyle': <'$gtkhintstyle'>, 'Xft/RGBA': <'none'>}"
		;;
	default|really-off)
		info "selecting global defaults (grayscale with slight hinting)"
		do: gsettings reset $gschema ${gprefix}antialiasing
		do: gsettings reset $gschema ${gprefix}hinting
		do: gsettings reset org.gnome.settings-daemon.plugins.xsettings overrides
		;;
	"")
		info "current GNOME settings for g-s-d:"
		for key in antialiasing hinting; do
			echo "  $key = $(gsettings get $gschema $gprefix$key)"
		done
		for key in overrides; do
			echo "  $key = $(gsettings get 'org.gnome.settings-daemon.plugins.xsettings' $key)"
		done
		info "current XSETTINGS values for GTK:"
		dump_xsettings \
			| grep -E '^Xft/(Antialias|Hinting|HintStyle|RGBA)' \
			| grep -E -v '^Xft/(Antialias|Hinting) 1$' \
			| sed 's/^/  /' | sort
		info "current Xrdb values for Wine:"
		xrdb -query \
			| grep -E '^Xft\.(antialias|hinting|hintstyle|rgba):' \
			| sed 's/[ \t]\+/ /g' \
			| grep -E -v '^Xft\.(antialias|hinting): 1$' \
			| sed 's/^/  /' | sort
		;;
	*)
		die "unknown subcommand '$1' (valid: on/off/really-off)"
		;;
esac
