Могу ли я запустить интервальные таймеры в AwesomeWM? - PullRequest
0 голосов
/ 17 апреля 2020

Я использую Awesome 4.3 на Manjaro Linux (Arch) Я перешел с рабочего стола KDE на рабочий стол XFCE. Я написал переключатель обоев, который будет случайным образом менять обои на четырех отдельных экранах. Я написал процедуру рандомизации в стандартном файле Lua для целей разработки. Я добавил его в r c. lua, но не похоже, что таймеры Lua (luv) работают в r c. lua. Я проверил все методы отдельно, чтобы загрузить обои из моих процедур рандомизации, и они отлично работают, когда я обращаюсь напрямую к одному набору файлов для четырех экранов. Как только я добавляю интервальные таймеры, ничего не происходит, нет ошибок, вообще ничего.

Это код, упрощенный для загрузки только одного экрана, я что-то упустил, вынул удивительные объекты и заменил операторы печати, и он прекрасно работает в стандартном Lua файле

спасибо любая помощь приветствуется

local lfs = require('lfs') -- lua file system
local uv = require('luv') -- lua timer
local dir = "/home/jerry/Documents/wallpaper"
local images = {} -- images collection
local idx = 0
math.randomseed(os.time())

local function tablelength(T)
    local count = 0
    for _ in pairs(T) do count = count + 1 end
    return count
end

local function readImages(path)
    for file in lfs.dir(path) do
        if file ~= "." and file ~= ".." then
            images[idx] = path .. '/' .. file
            idx = idx + 1
        end
    end
end

readImages(dir);
imageCount = tablelength(images)

local function getImage()
    number = math.random(1, imageCount)
    return images[number]
end

local function setInterval(interval, callback)
    local timer = uv.new_timer()
    uv.timer_start(timer, 0, interval, callback)
    return timer
end

local function cb()
    local path = getImage()
    gears.wallpaper.maximized(path, screen[1], true)
end


timer1 = setInterval(1000, cb)
 local function cb(gears, getImage, screen, screenIndex)
    return function()
        print(gears)
        print(getImage())
        print(screen)
        print("Screen " .. screenIndex)
        return gears.wallpaper.maximized(getImage(), screen[screenIndex], true)
    end
end 

Ответы [ 2 ]

1 голос
/ 22 апреля 2020

Вот законченная реализация, использующая совет @uli schlachter, однако я обнаружил, что она, похоже, периодически всасывает огромное количество оперативной памяти и процессора. Если кто-то знает причину, по которой это будет здорово, это намного проще, чем bash или другая реализация.

-- wallpaper changer routine
local lfs = require('lfs') -- lua file system
local dir = "/home/jerry/Documents/wallpaper" --images location
local images = {} -- images collection
local idx = 0 -- index for the image collection
math.randomseed(os.time())
-- function to generate the image count for the randomize function
local function tablelength(T)
    local count = 0
    for _ in pairs(T) do count = count + 1 end
    return count
end
-- function to read the images from the directory 
local function readImages(path)
    for file in lfs.dir(path) do
        if file ~= "." and file ~= ".." then
            images[idx] = path .. '/' .. file
            idx = idx + 1
        end
    end
end
-- execute read the images
readImages(dir);
-- grab the image count
imageCount = tablelength(images)
-- Generate the random image path
local function getImage()
    number = math.random(1, imageCount)
    return images[number]
end
-- call back for timer 
local function cb(screenIndex)
    return function()
        print(getImage())
        gears.wallpaper.maximized(getImage(), screen[screenIndex], true)
        return true;
    end
end
-- partial application of the
-- call back for the timer
-- pre-apply the screen index to create the
-- four separate cb's one for each screen
cb1 = cb(1)
cb2 = cb(2)
cb3 = cb(3)
cb4 = cb(4)
-- create the timers with unique time spans 
-- to sell the ramdomized approach 
local timer1 = gears.timer.start_new(14, cb1)
local timer2 = gears.timer.start_new(16, cb2)
local timer3 = gears.timer.start_new(18, cb3)
local timer4 = gears.timer.start_new(20, cb4)
-- trigger the timers 
timer1:emit_signal("timeout")
timer2:emit_signal("timeout")
timer3:emit_signal("timeout")
timer4:emit_signal("timeout")

Окончательный вариант обратного звонка с вызовом в сборщик мусора

-- call back for timer
local function cb(screenIndex)
    return function()
        gears.wallpaper.maximized(getImage(), screen[screenIndex], true)
        collectgarbage("step", 4000)
        return true;
    end
end
1 голос
/ 19 апреля 2020

Вы забыли позвонить uv.run(). Этот звонок запускает таймеры. Однако он также не запустит ничего другого, поэтому AwesomeWM перестанет работать.

uv.run() запускает основной l oop. L oop ожидает события (например, истекает таймер) и затем обрабатывает это событие. AwesomeWM также использует основной l oop. Он запускает GLib GMainLoop.

Поскольку вы не можете запустить два основных цикла одновременно, вам придется использовать средства GLib и AwesomeWM. Я нашел несколько документов для luv timer_start: https://github.com/luvit/luv/blob/master/docs.md#uvtimer_starttimer -timeout-repeat-callback В соответствии с этим ваш timer_start(timer, 0, interval, callback) означает, что таймер срабатывает сразу, а затем каждую секунду. Версия AwesomeWM:

local gears = require("gears") -- This is part of AwesomeWM
local timer1 = gears.start_new(1, function()
    print("I run once per second")
    return true -- Signal that the timer should continue running
end)
timer1:emit_signal("timeout") -- Cause the callback function to run right now

gears.timer использует GLib для запуска таймера: https://github.com/awesomeWM/awesome/blob/87e7b84ff54c050f86541421ec0aa93e325dd49d/lib/gears/timer.lua#L94

...