# This file will be sourced by gamescope-session script if not
# overridden in ~/.config/environment.d

SYS_ID="$(cat /sys/devices/virtual/dmi/id/product_name)"
CPU_VENDOR="$(lscpu | grep "Vendor ID" | cut -d : -f 2 | xargs)"

# OXP 60Hz Devices
OXP_LIST="ONE XPLAYER:ONEXPLAYER 1 T08:ONEXPLAYER 1S A08:ONEXPLAYER 1S T08:ONEXPLAYER mini A07:ONEXPLAYER mini GA72:ONEXPLAYER mini GT72:ONEXPLAYER Mini Pro:ONEXPLAYER GUNDAM GA72:ONEXPLAYER 2 ARP23:ONEXPLAYER 2 PRO ARP23H:ONEXPLAYER 2 PRO ARP23P:ONEXPLAYER 2 PRO ARP23P EVA-01"
AOK_LIST="AOKZOE A1 AR07:AOKZOE A1 Pro"
if [[ ":$OXP_LIST:" =~ ":$SYS_ID:"  ]] || [[  ":$AOK_LIST:" =~ ":$SYS_ID:"   ]]; then
  DRM_MODE=fixed
  PANEL_TYPE=external
  ORIENTATION=left

  # Set refresh rate range and enable refresh rate switching
  export STEAM_DISPLAY_REFRESH_LIMITS=40,60
fi

# OXP 120Hz Devices
OXP_120_LIST="ONEXPLAYER F1:ONEXPLAYER F1 EVA-01"
if [[ ":$OXP_120_LIST:" =~ ":$SYS_ID:"  ]]; then
  PANEL_TYPE=external
  ORIENTATION=left

  # Set refresh rate range and enable refresh rate switching
  export STEAM_DISPLAY_REFRESH_LIMITS=40,120
fi

# OXP X1 Devices
OXP_X1_LIST="ONEXPLAYER X1 i"
if [[ ":$OXP_X1_LIST:" =~ ":$SYS_ID:"  ]]; then
  PANEL_TYPE=internal
  USE_ROTATION_SHADER=1
  ORIENTATION=left
  CUSTOM_REFRESH_RATES=60,120

  # Set refresh rate range and enable refresh rate switching
  export STEAM_DISPLAY_REFRESH_LIMITS=60,120
fi

OXP_X1_LIST="ONEXPLAYER X1 A"
if [[ ":$OXP_X1_LIST:" =~ ":$SYS_ID:"  ]]; then
  PANEL_TYPE=external
  ORIENTATION=left
  CUSTOM_REFRESH_RATES=60,120

  # Set refresh rate range and enable refresh rate switching
  export STEAM_DISPLAY_REFRESH_LIMITS=60,120
fi

# OXP X1 144Hz Devices
OXP_X1_144_LIST="ONEXPLAYER X1 mini"
if [[ ":$OXP_X1_144_LIST:" =~ ":$SYS_ID:"  ]]; then
  PANEL_TYPE=external
  ORIENTATION=left
  CUSTOM_REFRESH_RATES=60,144

  # Set refresh rate range and enable refresh rate switching
  export STEAM_DISPLAY_REFRESH_LIMITS=60,144
fi

# OXP G1 Devices
if [[ ":$SYS_ID:" =~ :ONEXPLAYER\ G1\ (A|i): ]]; then
  PANEL_TYPE=internal
  # AMD version has hardware rotation
  [[ ":$SYS_ID:" =~ ":ONEXPLAYER G1 i:" ]] && USE_ROTATION_SHADER=1
  ORIENTATION=left
  CUSTOM_REFRESH_RATES=60,144

  # Set refresh rate range and enable refresh rate switching
  export STEAM_DISPLAY_REFRESH_LIMITS=60,144
fi

# AYANEO AIR, SLIDE, and FLIP Keyboard Devices
AIR_LIST="AIR:AIR Pro:AIR Plus:SLIDE:FLIP KB:"
if [[ ":$AIR_LIST:" =~ ":$SYS_ID:"  ]]; then
  PANEL_TYPE=external
  ORIENTATION=left
fi

# AYANEO FLIP Dual Screen
if [[ ":FLIP DS:" =~ ":$SYS_ID:" ]]; then
  PANEL_TYPE=external
  ORIENTATION=left
  OUTPUT_CONNECTOR='*,eDP-1,eDP-2' # prefer the top screen
fi

# AYN Loki Devices
AYN_LIST="Loki Max:Loki Zero:Loki MiniPro"
if [[ ":$AYN_LIST:" =~ ":$SYS_ID:"  ]]; then
  DRM_MODE=fixed
  ORIENTATION=left
  CUSTOM_REFRESH_RATES=40,50,60

  # Set refresh rate range and enable refresh rate switching
  export STEAM_DISPLAY_REFRESH_LIMITS=40,60
fi

# GDP Win devices
GDP_LIST="G1619-01:G1621-02:MicroPC:WIN2"
if [[ ":$GDP_LIST:" =~ ":$SYS_ID:"  ]]; then
  OUTPUT_CONNECTOR='*,DSI-1'
  DRM_MODE=fixed
  ORIENTATION=right
fi

# GPD Win 3 specifc quirk to prevent crashing
  # The GPD Win 3 does not support hardware rotation for 270/90 modes. We need to implement shader rotations to get this working correctly.
  # 0/180 rotations should work.
if [[ ":G1618-03:" =~ ":$SYS_ID:"  ]]; then
  OUTPUT_CONNECTOR='*,DSI-1'
  DRM_MODE=fixed
  ORIENTATION=right
fi

#GPD Win 4 supports 40-60hz refresh rate changing
if [[ ":G1618-04:" =~ ":$SYS_ID:"  ]]; then
  CUSTOM_REFRESH_RATES=40,60
  export STEAM_DISPLAY_REFRESH_LIMITS=40,60
fi

# GPD Win Max 2 supports 40,60hz
if [[ ":G1619-04:" =~ ":$SYS_ID:"  ]]; then
  CUSTOM_REFRESH_RATES=40,60
  export STEAM_DISPLAY_REFRESH_LIMITS=40,60
fi

# GPD Win mini
if [[ ":G1617-01:" =~ ":$SYS_ID:"  ]]; then
  ORIENTATION=""
  if ( xrandr --prop 2>$1 | grep -e "1080x1920 " > /dev/null ) ; then
     ORIENTATION=right
  fi
fi

# Steam Deck (Common)
if [[ ":Jupiter:Galileo:" =~ ":$SYS_ID:" ]]; then
  DRM_MODE=fixed

  # Enables the adaptive brightness toggle
  export STEAM_ENABLE_DYNAMIC_BACKLIGHT=1
  # Allows the fan controller service to be toggled from gamemode
  export STEAM_ENABLE_FAN_CONTROL=1
  # Sets CPU topology for Steam Deck hardware
  export WINE_CPU_TOPOLOGY=8:0,1,2,3,4,5,6,7

  function inhibit_systemd {
    # Prevent default power button behavior
    systemd-inhibit --what=handle-suspend-key:handle-power-key:handle-hibernate-key --who=gamescope-session --why="gamescope-session handles power button events" sleep infinity &
  }

  # Start SteamOS's power button handler daemon, this passes power button events to Steam.
  if command -v /usr/bin/powerbuttond > /dev/null; then
    inhibit_systemd
    (while true; do
      /usr/bin/powerbuttond
    done) &
  elif [ -f /usr/lib/hwsupport/power-button-handler.py ]; then
    inhibit_systemd
    (while true; do
      /usr/bin/python3 /usr/lib/hwsupport/power-button-handler.py
    done) &
  fi
fi

# Steam Deck (LCD)
if [[ ":Jupiter:" =~ ":$SYS_ID:" ]]; then
  export STEAM_DISPLAY_REFRESH_LIMITS=40,60

  if [ -f "/usr/share/plymouth/themes/steamos/steamos-jupiter.png" ]; then
    export STEAM_UPDATEUI_PNG_BACKGROUND=/usr/share/plymouth/themes/steamos/steamos-jupiter.png
  fi
fi

# Steam Deck (OLED)
if [[ ":Galileo:" =~ ":$SYS_ID:" ]]; then
  export STEAM_DISPLAY_REFRESH_LIMITS=45,90

  export STEAM_GAMESCOPE_FORCE_HDR_DEFAULT=1
  export STEAM_GAMESCOPE_FORCE_OUTPUT_TO_HDR10PQ_DEFAULT=1
  export STEAM_ENABLE_STATUS_LED_BRIGHTNESS=1

  if [ -f "/usr/share/plymouth/themes/steamos/steamos-galileo.png" ]; then
    export STEAM_UPDATEUI_PNG_BACKGROUND=/usr/share/plymouth/themes/steamos/steamos-galileo.png
  fi
fi

# ROG Ally & ROG Ally X
ALLY_LIST="ROG Ally RC71L_RC71L:ROG Ally RC71L:ROG Ally X RC72LA"
if [[ ":$ALLY_LIST:" =~ ":$SYS_ID:"  ]]; then
  PANEL_TYPE=external
  ADAPTIVE_SYNC=1

  # Set refresh rate range and enable refresh rate switching
  export STEAM_DISPLAY_REFRESH_LIMITS=40,120
fi

# Lenovo Legion Go
if [[ ":83E1:" =~ ":$SYS_ID:"  ]]; then
  ORIENTATION=left
  CUSTOM_REFRESH_RATES=60,144

  # Set refresh rate range and enable refresh rate switching
  export STEAM_DISPLAY_REFRESH_LIMITS=60,144
fi

# Minisforum V3
if [[ ":V3:" =~ ":$SYS_ID:"  ]]; then
  PANEL_TYPE=external
  ADAPTIVE_SYNC=1

  # Set refresh rate range and enable refresh rate switching
  export STEAM_DISPLAY_REFRESH_LIMITS=36,165
fi

# XG mobile for ASUS laptops that supports the proprietary connector
xg_mobile_file_path="/sys/devices/virtual/firmware-attributes/asus-armoury/attributes/egpu_enable/current_value"
if [ -f "$xg_mobile_file_path" ]; then
  egpu_status=$(<"$xg_mobile_file_path")
  if [[ "$egpu_status" -ne 0 ]]; then
    unset STEAM_DISPLAY_REFRESH_LIMITS

    # XG Mobile 2023: NVIDIA 4090
    if lspci -nn | grep -Fq "10de:2717"; then
      export VULKAN_ADAPTER="10de:2717"
    fi

    # XG Mobile 2022: AMD RX 6850xt
    if lspci -nn | grep -Fq "1002:73df"; then
      export VULKAN_ADAPTER="1002:73df"
    fi

    # XG Mobile 2021: NVIDIA 3080
    if lspci -nn | grep -q "10de:249c"; then
      export VULKAN_ADAPTER="1002:249c"
    fi
  fi
fi
