/Tukui/core/uiscale.lua
http://github.com/Asphyxia/Tukui · Lua · 132 lines · 78 code · 25 blank · 29 comment · 44 complexity · bc0caa4b9b986a05e122229c8b0e2b95 MD5 · raw file
- local T, C, L = unpack(select(2, ...)) -- Import: T - functions, constants, variables; C - config; L - locales
- --------------------------------------------------------
- -- detect if high, low or eyefinity version
- --------------------------------------------------------
- if T.getscreenwidth < 1600 then
- if C.general.overridelowtohigh == true then
- C["general"].autoscale = false
- T.lowversion = false
- else
- T.lowversion = true
- end
- elseif (T.getscreenwidth >= 3840) or (UIParent:GetWidth() + 1 > T.getscreenwidth) then
- local width = T.getscreenwidth
- local height = T.getscreenheight
-
- -- because some user enable bezel compensation, we need to find the real width of a single monitor.
- -- I don't know how it really work, but i'm assuming they add pixel to width to compensate the bezel. :P
-
- -- HQ resolution
- if width >= 9840 then width = 3280 end -- WQSXGA
- if width >= 7680 and width < 9840 then width = 2560 end -- WQXGA
- if width >= 5760 and width < 7680 then width = 1920 end -- WUXGA & HDTV
- if width >= 5040 and width < 5760 then width = 1680 end -- WSXGA+
-
- -- adding height condition here to be sure it work with bezel compensation because WSXGA+ and UXGA/HD+ got approx same width
- if width >= 4800 and width < 5760 and height == 900 then width = 1600 end -- UXGA & HD+
-
- -- low resolution screen
- if width >= 4320 and width < 4800 then width = 1440 end -- WSXGA
- if width >= 4080 and width < 4320 then width = 1360 end -- WXGA
- if width >= 3840 and width < 4080 then width = 1224 end -- SXGA & SXGA (UVGA) & WXGA & HDTV
-
- -- yep, now set Tukui to lower reso if screen #1 width < 1600
- if width < 1600 and not C.general.overridelowtohigh then
- T.lowversion = true
- end
-
- -- register a constant, we will need it later for launch.lua
- T.eyefinity = width
- end
- -- raid scale according to which version we use
- if T.lowversion then
- T.raidscale = 0.8
- else
- T.raidscale = 1
- end
- --------------------------------------------------------
- -- Auto Scale UI (Overwrite Settings and Blizzard)
- --------------------------------------------------------
- -- autoscale
- if C["general"].autoscale == true then
- C["general"].uiscale = min(2, max(.64, 768/string.match(T.resolution, "%d+x(%d+)")))
- end
-
- --------------------------------------------------------
- -- Graphics Settings
- --------------------------------------------------------
- -- the ui doesn't reload if ratio stay the same, we need to force reload if it happen.
- local function NeedReloadUI()
- local resolution = Graphics_ResolutionDropDown
- local x, y = resolution:getValues()
- local oldratio = T.getscreenwidth / T.getscreenheight
- local newratio = x / y
- local oldreso = T.resolution
- local newreso = x.."x"..y
-
- if (oldratio == newratio) and (oldreso ~= newreso) then
- ReloadUI()
- end
- end
- local Graphic = CreateFrame("Frame")
- Graphic:RegisterEvent("PLAYER_ENTERING_WORLD")
- Graphic:SetScript("OnEvent", function(self, event)
- -- always enable uiscale for Tukui (needed)
- local useUiScale = GetCVar("useUiScale")
- if useUiScale ~= "1" then
- SetCVar("useUiScale", 1)
- end
- -- Multisample need to be at 1 for pixel perfectness
- local gxMultisample = GetCVar("gxMultisample")
- if C["general"].multisampleprotect == true and gxMultisample ~= "1" then
- SetMultisampleFormat(1)
- end
- -- uiscale security
- if C["general"].uiscale > 1 then C["general"].uiscale = 1 end
- if C["general"].uiscale < 0.64 then C["general"].uiscale = 0.64 end
- -- set our new uiscale now if it doesn't match Blizzard saved uiScale.
- if format("%.2f", GetCVar("uiScale")) ~= format("%.2f", C["general"].uiscale) then
- -- if we set an uiscale, it broke quest when opening full size map in combat
- T.FullMapQuestTaintFix = true
-
- -- set new ui scale
- SetCVar("uiScale", C["general"].uiscale)
- end
- -- we adjust UIParent to screen #1 if Eyefinity is found
- if T.eyefinity then
- local width = T.eyefinity
- local height = T.getscreenheight
-
- -- if autoscale is off, find a new width value of UIParent for screen #1.
- if not C.general.autoscale or height > 1200 then
- local h = UIParent:GetHeight()
- local ratio = T.getscreenheight / h
- local w = T.eyefinity / ratio
-
- width = w
- height = h
- end
-
- UIParent:SetSize(width, height)
- UIParent:ClearAllPoints()
- UIParent:SetPoint("CENTER")
- end
- -- require a reload when graphics option changes, even if Standard Blizzard UI doesn't really need it.
- VideoOptionsFrameOkay:HookScript("OnClick", NeedReloadUI)
- VideoOptionsFrameApply:HookScript("OnClick", NeedReloadUI)
-
- -- unload
- self:UnregisterEvent("PLAYER_ENTERING_WORLD")
- end)