gene.pavlovsky wrote: При отсутствии эвентов клавиатуры или мыши таймер проверяет панели раз в 5 секунд.
Перестраховка?
gene.pavlovsky wrote:Через 250 мс после последнего эвента панели проверяются. Если состояние изменилось - запускается второй таймер на 250 мс, если за это время не пришло новых эвентов, изменения коммитятся в localconfig.db.
А просто проверять (и сразу записывать) через 500 мс после последнего события не то же самое будет?
P.S.
Вместо sqlite можно попробовать far.exe /import
Last edited by John Doe on Thu 10 Nov, 2016 13:50, edited 1 time in total.
-- Timer poll interval in milliseconds.
local POLL_INTERVAL = 5000
-- Timer boost on input event interval in milliseconds.
local BOOST_INTERVAL = 500
--local SQLITE = 'C:\\cygwin\\bin\\setsid.exe C:\\cygwin\\bin\\sqlite3.exe' -- Run sqlite3 in background (returns immediately, best performance).
local SQLITE = 'C:\\cygwin\\bin\\sqlite3.exe' -- Run sqlite3 directly (blocks execution until transaction has finished).
local LOCALCONFIG_DB = win.GetEnv('FARPROFILE') .. '\\localconfig.db'
--local dbg = require "dbgprint".filter("FAR:"," ")
local function CommitPanelState()
-- dbg.print('commit')
local leftPanel = APanel.Left and APanel or PPanel
local rightPanel = APanel.Left and PPanel or APanel
local sql = "BEGIN TRANSACTION; DELETE FROM 'general_config'; " ..
"INSERT INTO 'general_config' VALUES('Panel.Left','CurFile','" .. leftPanel.Current:gsub("'", "''") .. "'); " ..
"INSERT INTO 'general_config' VALUES('Panel.Left','Folder','" .. leftPanel.Path0:gsub("'", "''") .. "'); " ..
"INSERT INTO 'general_config' VALUES('Panel.Right','CurFile','" .. rightPanel.Current:gsub("'", "''") .. "'); " ..
"INSERT INTO 'general_config' VALUES('Panel.Right','Folder','" .. rightPanel.Path0:gsub("'", "''") .. "'); " ..
"INSERT INTO 'general_config' VALUES('Panel','LeftFocus'," .. (APanel.Left and 1 or 0) .. "); " ..
"COMMIT;"
os.execute(SQLITE .. ' "' .. LOCALCONFIG_DB .. '" "' .. sql .. '"')
end
local lastActiveLeft = APanel.Left
local lastLeftPath = APanel.Left and APanel.Path0 or PPanel.Path0
local lastLeftCurrent = APanel.Left and APanel.Current or PPanel.Current
local lastRightPath = APanel.Left and PPanel.Path0 or APanel.Path0
local lastRightCurrent = APanel.Left and PPanel.Current or APanel.Current
local function UpdatePanelState()
local leftPanel = APanel.Left and APanel or PPanel
local rightPanel = APanel.Left and PPanel or APanel
local modified = false
if APanel.Left ~= lastActiveLeft then
lastActiveLeft = APanel.Left
modified = true
end
if (leftPanel.Type == 0) and ((leftPanel.Path0 ~= lastLeftPath) or (leftPanel.Current ~= lastLeftCurrent)) then
lastLeftPath = leftPanel.Path0
lastLeftCurrent = leftPanel.Current
modified = true
end
if (rightPanel.Type == 0) and ((rightPanel.Path0 ~= lastRightPath) or (rightPanel.Current ~= lastRightCurrent)) then
lastRightPath = rightPanel.Path0
lastRightCurrent = rightPanel.Current
modified = true
end
if modified then
CommitPanelState()
end
end
timer = far.Timer(POLL_INTERVAL, function(timer)
timer.Enabled = false
UpdatePanelState()
timer.Interval = POLL_INTERVAL
timer.Enabled = true
end)
Event { description="PanelChangeDir: Clean up timer on exit"; group="ExitFAR";
uid="351F4780-2799-47BF-984A-EB429E8B431E";
action=function()
timer:Close()
end;
}
Event { description="PanelChangeDir: Listen to input events"; group="ConsoleInput";
action=function(Rec)
if ((Rec.EventType == far.Flags.KEY_EVENT) and (Rec.VirtualKeyCode ~= 0)) or
((Rec.EventType == far.Flags.MOUSE_EVENT) and (Rec.EventFlags ~= far.Flags.MOUSE_MOVED)) then
timer.Interval = BOOST_INTERVAL
end
end;
}
John Doe wrote:Вместо sqlite можно попробовать far.exe /import
Никогда этим не пользовался, и что ему давать на вход? И будет ли оно быстрее отрабатывать?
Никогда этим не пользовался, и что ему давать на вход? И будет ли оно быстрее отрабатывать?
На вход xml. Сделайте export, и посмотрите что именно (ещё не факт что в экспорте будет то что вам надо, я не проверял)
Быстрее вряд ли заработает, но зато не будет иметь зависимостей.
В экспорте все конфиги. Но если всё лишнее убрать и оставить только <localconfig>, импорт работает нормально.
На скорую руку протестил
100x far -import - 2.85 s
100x sqlite3 - 2.43 s
Оставлю как есть. Если у кого нету sqlite3.exe, и принципиально не хочется ставить, могут доработать с far -import. Благо там всего навсего надо подменить ф-цию CommitPanelState()
Спрашиваю именно потому, что не процитировано ничего такого, чему можно "поверить" или "не поверить".
А если за пределами цитаты, то было вот:
John Doe wrote: Имхо, на багтрекере не так много подобных примеров, а те что всё-таки есть (и будут) не должно быть сложно закрыть, с соответствующей формулировкой.
Можно согласиться, или не согласиться, но и тут отсутствует что либо, что бы я предлагал принять на веру.
zg wrote: зачем такие сложные приседания с sqlite и far /import? чем far.CreateSettings не угодил?
В фаре столько всего полезно зарыто, а найти непросто. Поэтому и спрашивал тут.
Пробую CreateSettings. Как пользоваться, если честно, непонятно. Документации кот наплакал.
zg wrote: как нет? вы утверждаете, что достаточно в энциклопедии запретить чем-то пользоваться и проблем не будет, не?
Я утверждаю (1) некоторое количество некорректных тикетов на мантисе не создают проблем и (2) если что-то или невозможность чего-то описана в документации, то закрывать такие тикеты можно не тратя время на объяснения, стандартной формулировкой типа "см. документацию".
А так да, не каждый читает документацию, а из тех кто читает - не все верно интерпретируют. И чем больше возможностей предоставляет инструмент тем больше возможностей отстрелить себе ногу.
zg wrote: в чём принципиальность сохранения именно в localconfig.db? чем, скажем, PluginsData\4EBBEFC8-2084-4B7F-94C0-692CE136894D.db принципиально хуже?
Это возможно, если скрипт при старте фара будет самостоятельно восстанавливать нужные пути на панелях.