• Autor

    Imagen de elsenyordelcaos
    elsenyordelcaos
  • Archivo

  • Categorías

  • Notas sobre awesome: Vicious.

    Enviado por elsenyordelcaos el 12 Octubre, 2009 - 23:33.

    En mis andanzas con la nueva versión de awesome todavía no estable (3.4 RC1) he tenido que enfrentarme a la nueva forma de crear widgets para este wm, ahora wicked esta obsoleto y se puede usar vicious o obvious. Yo personalmente he preferido usar vicious porque es más controlable y similar a wicked. Voy a intentar explicar un poco como funcionan las cosas ahora poniendo de ejemplo uno de los widgets que ya he migrado.

    Hay una diferencia importante de concepto entre wicked y vicious de la cual derivan todas las diferencias de uso, ahora los widget siempre son modulares pero solo se encargan de dar datos en crudo, dejando el tema de presentación al usuario dentro de rc.lua, esto para mi tiene algunas deficiencias que enumerare al final del texto.

    Para obtener vicious solo tenemos que seguir las instrucciones en el wiki de awesome aquí.

    El resultado práctico de este planteamiento es que los widgets anteriores se dividen en dos partes, la obtención de datos que se realiza desde el propio vicious y su presentación que se coloca en el rc.lua. Esto deja un poco más confuso el uso pero aligera la carga para el sistema.

    El primer widget que migre fue el de la batería, el código quedo de la siguiente forma:

    -- {{{ Grab environment
    local tonumber = tonumber
    local io = { open = io.open }
    local setmetatable = setmetatable
    local math = { floor = math.floor }
    local string = {
        find = string.find,
        match = string.match,
        format = string.format
    }
    -- }}}

    -- Battery: provides state and charge for a requested battery
    module("vicious.battery")

    -- {{{ Battery widget type

    function worker(format,adapter)
         local fcur = io.open("/sys/class/power_supply/"..adapter.."/charge_now")   
         local fcap = io.open("/sys/class/power_supply/"..adapter.."/charge_full")
         local fsta = io.open("/sys/class/power_supply/"..adapter.."/status")
         local cur = fcur:read()
         local cap = fcap:read()
         local sta = fsta:read()
         local battery = math.floor(cur * 100 / cap)
         local spacer = " "
         batimage  = "power"
         if sta:match("Charging") then
             battery = "("..battery..")"
    batimage  = "power"
         elseif sta:match("Discharging") then
             if tonumber(battery) > 25 and tonumber(battery) < 75 then
                 battery = "("..battery..")"
                 batimage  = "bat"
             elseif tonumber(battery) < 25 then
                 if tonumber(battery) < 10 then
                     naughty.notify({ title      = "Battery Warning"
                                    , text       = "Battery low!"..spacer..battery.."%"..spacer.."left!"
                                    , timeout    = 5
                                    , position   = "top_right"
                                    , fg         = beautiful.fg_focus
                                    , bg         = beautiful.bg_focus
                                    })
                 end
                 battery = "("..battery..")"
         batimage  = "bat"
             else
                 battery = "("..battery..")"
         batimage  = "bat"
             end
         else
             battery = ""
    batimage  = "power"
         end
         fcur:close()
         fcap:close()
         fsta:close()
         return {battery,batimage}
    end
    -- }}}

    setmetatable(_M, { __call = function(_, ...) return worker(...) end })

    Este widget todavía no esta terminado, ya que debo sacar la notificación naughty de aquí y colocarlo en el rc.lua, donde debe estar.

    El código del widget se divide en cuatro partes:

    En la primera parte creamos las variables de entorno para que funcione el código posterior, como podemos ver en el siguiente bloque si hemos de usar las típicas ordenes algo.algo hemos de declararlas antes porqué si no lo hacemos no las podremos usar.

    -- {{{ Grab environment
    local tonumber = tonumber
    local io = { open = io.open }
    local setmetatable = setmetatable
    local math = { floor = math.floor }
    local string = {
        find = string.find,
        match = string.match,
        format = string.format
    }
    -- }}}

    En la segunda parte definimos el nombre del módulo que hemos de registrar el init.lua de vicious para luego poder cargarlo:

    -- Battery: provides state and charge for a requested battery
    module("vicious.battery")

    La tercera parte del widget es el código propiamente de este, he respetado el nombre de la función, además hemos de recordar que el primer argumento siempre debe ser el formato, después ya podemos poner los que necesitemos. También tenemos que devolver los valores con la orden return entre llaves:

    -- {{{ Battery widget type

    function worker(format,adapter)
         local fcur = io.open("/sys/class/power_supply/"..adapter.."/charge_now")   
         local fcap = io.open("/sys/class/power_supply/"..adapter.."/charge_full")
         local fsta = io.open("/sys/class/power_supply/"..adapter.."/status")
         local cur = fcur:read()
         local cap = fcap:read()
         local sta = fsta:read()
         local battery = math.floor(cur * 100 / cap)
         local spacer = " "
         batimage  = "power"
         if sta:match("Charging") then
             battery = "("..battery..")"
    batimage  = "power"
         elseif sta:match("Discharging") then
             if tonumber(battery) > 25 and tonumber(battery) < 75 then
                 battery = "("..battery..")"
                 batimage  = "bat"
             elseif tonumber(battery) < 25 then
                 if tonumber(battery) < 10 then
                     naughty.notify({ title      = "Battery Warning"
                                    , text       = "Battery low!"..spacer..battery.."%"..spacer.."left!"
                                    , timeout    = 5
                                    , position   = "top_right"
                                    , fg         = beautiful.fg_focus
                                    , bg         = beautiful.bg_focus
                                    })
                 end
                 battery = "("..battery..")"
         batimage  = "bat"
             else
                 battery = "("..battery..")"
         batimage  = "bat"
             end
         else
             battery = ""
    batimage  = "power"
         end
         fcur:close()
         fcap:close()
         fsta:close()
         return {battery,batimage}
    end
    -- }}}

    La ultima parte sirve para retornar los valores que hemos marcado en el cuerpo de la función:

    setmetatable(_M, { __call = function(_, ...) return worker(...) end })

    Como veis cambia un poco la sintaxis pero en esencia es lo mismo. Para que funcione hemos de copiarlo en un archivo que se llame como el modulo, en este caso "battery.lua", depués lo copiamos debajo del directorio vicious en nuestro directorio de configuración y modificamos el archivo "init.lua" en el mismo directorio añadiendo nuestro widget a la lista de los predefinidos para luego poder cargarlo.

    Una vez dentro de nuestro rc.lua solo tenemos que añadir la llamada, ahora con vicious ya no es necesario añadir una función hook para actualizarlo, ya lo hace el mismo:

    -- {{{ Battery state
    -- Widget icon
    baticon       = widget({ type = "imagebox", name = "baticon" })
    -- Initialize widget
    batwidget     = widget({ type = "textbox", name = "batwidget" })
    -- Register widget
    vicious.register(batwidget, vicious.widgets.battery,
         function (widget, args)
      if   args[2] == "bat" then
        baticon.image=image(confdir.. "/icons/power-bat.png")
        return args[1]
      else
        baticon.image=image(confdir.. "/icons/power-ac.png")
        return args[1]
      end
          end,
          23, "BAT1")
    -- }}}

    Como vemos la creación de los widgets es parecida, excepto que ya no marcamos el alineamiento que lo marcamos al añadir los widgets al wibox como ya explique en una configuración anterior.

    El verdadero meollo esta en la función vicious.register, funciona de una forma muy sencilla con una serie de parametros obligatorios y otros opcionales:

    El primer argumento de la función es el nombre del widget en el cual modificamos los datos, el segundo es la función a la cual llamamos de vicious, el tercer argumento es el dato que devolvemos al widget procedente de la función vicious, como se puede observar en mi código permite el uso de funciones para modificar este. El resto de los argumentos son opcionales, el cuarto es la frecuencia de actualización (si no ponemos ninguna es cada 2 segundos) y el último es el argumento que se le pasa (si lo necesita) a la función vicious.

    Ya solo queda añadirlo a nuestro wibox.

    Esta es la explicación de como funciona vicious, espero que haya sido comprensible.

    Vicious para mi todavía tiene carencias importantes, no se puede llamar a funciones una sola vez, siempre se van actualizando periódicamente y tampoco podemos modificar otros widgets que no sean de texto o de cuadros gráficos. Pero tiene funciones muy interesantes como la de suspender widgets a voluntad y la estandarización que trae.

    Si queréis ver mi configuración o clonarla he puesto a disposición pública un repositorio git con mi configuración, para verlo en un navegador solo tenemos que abrir el siguiente enlace:

    http://senyorcaos.homelinux.org/git/?p=awesome34.git;a=tree

    o clonarlo mediante git:

    git clone git://senyorcaos.homelinux.org/awesome34.git

    En próximas ediciones iré explicando cada uno de los widgets que tengo en uso.

    Imagen de xanderboy
    Enviado por xanderboy el 13 Octubre, 2009 - 00:53.

    Eres un Master clap pues ese es el famoso Vicious que he visto en algunas webs de Awesome, ahora comprendo de donde sale esa "librería" pues me era extraño ver que mi versión de Awesome no la tiene.

    Felicidades, sin duda alguna creas uno de los mejores aportes para habla hispana de Awesome first

    Imagen de minaya
    Enviado por minaya el 13 Octubre, 2009 - 06:24.

    ¿Wicked obsoleto?. Menuda cagad.a, con perdón. Yo estuve jugando un par de días con vicious y no me terminó de convencer. Quizás si sea algo más modular (depende de como lo mires claro) pero lo veo mucho más confuso, menos claro. Con wicked tu podías agrupar todo el código de la función, de forma que veías con un vistazo rápido cualquier detalle.

    Enfín, ahora que ya tiene algo más de rodaje vicious y parece que han creado algo más de documentación, le volveré a dar una oportunidad. Pero no me gusta que hagan este tipo de cambios/anuncios así, de buenas a primeras. Awesome se está convirtiendo en una fuente extra de estrés meparto .