17rooms/autotheme.lua

87 lines
2.0 KiB
Lua

local function autodetect_theme()
if not instead.screen_size then
return
end
local f = io.open(instead.savepath().."/config.ini", "r")
if f then
f:close()
return
end
f = io.open(instead.gamepath().."/themes/default/theme.ini", "r")
if not f then
return
end
f:close()
local themes = {}
local vertical = false
for d in std.readdir(instead.gamepath().."/themes") do
if d ~= '.' and d ~= '..' then
local p = instead.gamepath().."/themes/" .. d
local f = io.open(p.."/theme.ini", "r")
if f then
local w, h
for l in f:lines() do
if l:find("scr%.w[ \t]*=[ \t]*[0-9]+") then
w = l:gsub("scr%.w[ \t]*=[ \t]*([0-9]+)", "%1")
elseif l:find("scr%.h[ \t]*=[ \t]*[0-9]+") then
h = l:gsub("scr%.h[ \t]*=[ \t]*([0-9]+)", "%1")
end
if w and h then break end
end
if w and h then
w = tonumber(w)
h = tonumber(h)
local r = w / h
if r < 1 then r = 1 / r end
table.insert(themes, { nam = d, w = w, h = h, mobile = w < h, ratio = r })
vertical = vertical or (w < h)
end
f:close()
end
end
end
if #themes == 1 then
return
end
local w, h = instead.screen_size()
local r = w / h
local mobile = w < h or PLATFORM == "ANDROID" or PLATFORM == "IOS" or PLATFORM == "S60" or PLATFORM == "WINRT" or PLATFORM == "WINCE"
if w < h then
r = 1 / r
end
local d = 1000
local t = false
for _, v in ipairs(themes) do
local dd = math.abs(v.ratio - r)
if dd < d then
if mobile and (not vertical or v.mobile) then
d = dd
t = v
elseif not mobile and not v.mobile then
d = dd
t = v
end
end
end
if not t or t.nam == 'default' then
return
end
local name = instead.savepath().."/config.ini"
local name_tmp = name .. '.tmp'
local f = io.open(name_tmp, "w")
if f then
dprint("Autodetect theme: ", t.nam)
f:write("theme = "..t.nam.."\n")
f:close()
std.os.remove(name)
std.os.rename(name_tmp, name);
instead.restart()
end
end
std.mod_start(function()
autodetect_theme()
end, -100)