LINUX.ORG.RU

Awesome top widget show()

 , ,


0

2

Решил написать простой виджет для осома для показа топа процессов с помощью скрипта на баше, так как с lua не сталкивался до этого, писал по примеру со виджетов base/abase, fs из lain, но при попытке забиндить на показ по нажатию вываливается с ошибкой attempt to call field 'show' (a nil value), но не совсем понимаю в чем ошибка конкретно в коде, буду благодарен, если кто-нибудь поможет разобраться

local helpers      = require("lain.helpers")

local beautiful    = require("beautiful")
local wibox        = require("wibox")
local naughty      = require("naughty")

local io           = { popen  = io.popen }
local pairs        = pairs
local string       = { match  = string.match,
                       format = string.format }
local tonumber     = tonumber

local setmetatable = setmetatable
-- Basic template for custom widgets
-- lain.widgets.top
local top = {}

local notification  = nil
top_notification_preset = { fg = beautiful.fg_normal }

function top:hide()
    if notification ~= nil then
        naughty.destroy(notification)
        notification = nil
    end
end

function top:show(t_out)
    top:hide()

   local f = io.popen("ps -eo pcpu,pid,user,args | sort -k 1 | awk -v name=\"$USER\" '{if($3==name && $1>=1) print $1,$4;}'")
        output = f:read("*a"):gsub("\n*$", "")
        f:close()

    notification = naughty.notify({
        preset = top_notification_preset,
        text = output,
        timeout = t_out,
    })
end

local function worker( args )
    local top  = {}
    local args = args or {}
    local cmd  = args.cmd or "ps -eo pcpu,pid,user,args | sort -k 1 | awk -v name=\"$USER\" '{if($3==name && $1>=1) print $1,$4;}'"

    top.widget = wibox.widget.textbox('')

    local f = io.popen(cmd)
    output = f:read("*a"):gsub("\n*$", "")
    f:close()
    widget=top.widget

    return setmetatable(top, { __index = top.widget })
end

return setmetatable({}, { __call = function(_, ...) return worker(...) end })
 awful.key({ altkey,           }, "t",      function () lain.widgets.top.show(5) end),
awesome v3.5.6 (For Those About To Rock)
 • Build: Jan 10 2015 23:18:34 for x86_64 by gcc version 4.9.2 (builduser@)
 • Compiled against Lua 5.2.3 (running with Lua 5.2)
 • D-Bus support: ✔


Последнее исправление: moookino (всего исправлений: 2)

Ну и откуда у тебя в top поле show возьмется? Если это тот top, который из function worker возвращается, то он никаким образом не связан с top, который описан выше.

Vovka-Korovka ★★★★★
()
Ответ на: комментарий от Vovka-Korovka

хорошо, но все равно остается та же ошибка.

moookino
() автор топика

Где awesome --version?

local helpers      = require("lain.helpers")
local beautiful    = require("beautiful")
local wibox        = require("wibox")
local awful        = require("awful")
local naughty      = require("naughty")
local string       = { match  = string.match,
                       format = string.format }
local tonumber     = tonumber

local setmetatable = setmetatable
-- Basic template for custom widgets
-- lain.widgets.top
local top = {}

local notification  = nil
top_notification_preset = { fg = beautiful.fg_normal }

function top:hide()
    if notification ~= nil then
        naughty.destroy(notification)
        notification = nil
    end
end

local function top:show( args )
    local top  = top
    local args = args or {}
    local t_out = args.t_out or 5
    local cmd  = args.cmd or "ps -eo pcpu,pid,user,args | sort -k 1 | awk -v name=\"$USER\" '{if($3==name && $1>=1) print $1,$4;}'"

    top.widget = wibox.widget.textbox('')

    local f = awful.util.pread(cmd)
    output = f:gsub("\n*$", "")
    f:close()

    widget=top.widget
    top:hide()

    notification = naughty.notify({
        preset = top_notification_preset,
        text = output,
        timeout = t_out,
    })

    return setmetatable(top, { __index = top.widget })
end

function top.mt:__call(...)
    top:show(...)
end

return setmetatable(top, top.mt)
awful.key({ altkey,           }, "t",      function () lain.widgets.top:show(5) end),

Как-то так или что-то типа того. Работоспособность не проверял.

r3lgar ★★★★★
()
Ответ на: комментарий от r3lgar

спасибо большое, поправил версию, но при вызове ругается на

local function top:show( args )
говорит, что
'(' expected near ':'

moookino
() автор топика
return setmetatable({}, { __call = function(_, ...) return worker(...) end })

Ты цепляешь только(!) worker к пустой(!) таблице в качестве вызова(!). Может таки стоит ознакомится с основами языка прежде чем на нем писать?

Вообще забей на этот пример от Lain, он несколько специфичный, для твоих целей должно хватить более простой базы:

local naughty = require("naughty")
local awful   = require("awful")

local top = {}

function top:hide()
    if self.notification then
        naughty.destroy(self.notification)
        self.notification = nil
    end
end

function top:show(args)
    local args = args or {}
    local t_out = args.t_out or 5
    local cmd = args.cmd or "echo No command"

    local output = awful.util.pread(cmd)

    self.notification = naughty.notify({
        text = output,
        timeout = t_out,
    })
end

return top
awful.key({ altkey,           }, "t",      function () lain.widgets.top:show({ t_out = 10, cmd = "echo test" }) end),

Worron ★★★
()
Ответ на: комментарий от moookino

Я же сказал, что не тестировал. Поправил наколеночный код так же на коленке.

r3lgar ★★★★★
()
Ответ на: комментарий от Worron

спасибо большое за помощь, то что нужно, к сожалению, сейчас в приоритете C/C++, а очень хотелось, чтобы так умело. :)

moookino
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.