#!/bin/bash # Sanity checks: if (( $# == 0 )); then echo -e "No arguments provided.\n\nUsage: env GAMECLASS='=' gameclass \033[1m[COMMAND]\033[0m..." exit 1 else if [[ -z ${GAMECLASS} ]]; then echo -e "No environment variable set.\n\nUsage: env \033[1mGAMECLASS='='\033[0m gameclass [COMMAND]..." exit 1 fi fi _get_variable_field() { echo "$GAMECLASS" | awk -v FIELD="$1" 'BEGIN { FS = "=" } ; { print $FIELD }' } EXE="$( _get_variable_field 1 )" WM_CLASS="$( _get_variable_field 2 )" if [[ -z "$EXE" ]] || [[ -z "$WM_CLASS" ]]; then echo -e "Incorrect environment variable formatting.\n\nUsage: env GAMECLASS='\033[1m=\033[0m' gameclass [COMMAND]..." exit 1 fi # Adapted from — https://github.com/tactikauan/thcrap-steam-proton-wrapper/blob/3adb608f7aa58323f441aedbe40a3b5096fe9d23/thcrap_proton if [[ -z "$COMMAND" ]]; then shift $((OPTIND -1)) COMMAND='' # Quote all arguments which contain whitespace for i in "$@"; do [[ $i =~ ( ) ]] && i=${i@Q} COMMAND="$COMMAND $i" done fi COMMAND=$(printf %s "$COMMAND") _get_exe_window() { local windowlist ; windowlist=$( wmctrl -l -p ) local windowcount ; windowcount=$( echo "$windowlist" | wc -l ) for (( n = 1 ; n <= windowcount ; n++ )); do local window ; window=$( echo "$windowlist" | sed -n "$n"p ) _get_window_property() { echo "$window" | awk -v prop="$1" '{ print $prop }' } local wid ; wid=$( _get_window_property 1 ) local pid ; pid=$( _get_window_property 3 ) local cmd ; cmd=$( cat /proc/"$pid"/cmdline | tr -d '\0' ) # Trim null bytes from cmdline to avoid log spam unset -v WID if [[ "$cmd" =~ $EXE ]]; then WID="$wid" fi done } _set_class() { if [[ -z $WID ]]; then : else if [[ $( xdotool getwindowclassname "$WID" ) = $WM_CLASS ]]; then : else xdotool set_window --class "$WM_CLASS" "$WID" echo "Set WM_CLASS." fi fi } _window_watcher() { while sleep 1; do _get_exe_window _set_class done } set -m _window_watcher & GAMECLASS_PID="$!" # Let it rip. sh -c "$COMMAND" # Let it die. kill -- -$GAMECLASS_PID