Naughty

From awesome
Jump to: navigation, search

Naughty est une bibliothèque Lua qui permet l’implémentation de notifications pour awesome 3 (git) sous la forme de popups. Elle est incluse dans la version maître git actuelle d’awesome. Vous pouvez trouver la branche de développement dans la branche naughty du miroir git d’awesome.


Contents

Mettre en place naughty

Tout d’abord, incluez la bibliothèque dans votre rc.lua :  require('naughty')

Si vous voulez changer les paramètres par défaut, vous pouvez redéfinir les champs suivants. Pour des détails, reportez-vous à la doc Lua.

naughty.config.timeout          = 5
naughty.config.screen           = 1
naughty.config.position         = "top_right"
naughty.config.margin           = 4
naughty.config.height           = 16
naughty.config.width            = 300
naughty.config.gap              = 1
naughty.config.ontop            = true
naughty.config.font             = beautiful.font or "Verdana 8"
naughty.config.icon             = nil
naughty.config.icon_size        = 16
naughty.config.fg               = beautiful.fg_focus or '#ffffff'
naughty.config.bg               = beautiful.bg_focus or '#535d6c'
naughty.config.presets.normal.border_color     = beautiful.border_focus or '#535d6c'
naughty.config.border_width     = 1
naughty.config.hover_timeout    = nil

Utilisation de naughty

Pour créer une notification sous forme de popup, appelez naughty.notify({arguments}). D’habitude, on utilise :

naughty.notify({ text="Contenu de la notification", icon="/chemin/vers/icone" })

Remarquez que les arguments de naughty.notify() sont facultatifs. L’exemple précédent utilise des paramètres configurés par défaut qui on pour résultat de générer des popups avec une apparence uniforme pour le texte et l’icône. Si vous voulez changer tous les détails, vous pouvez changer le paramètres par défaut avec les arguments suivants :

naughty.notify({
   text = "Notification",
   title = "Titre",
   position = "top_left"|"top_right"|"bottom_left"|"bottom_right",
   timeout = 5,
   icon="/chemin/vers/image",
   fg="#ffggcc",
   bg="#bbggcc",
   screen = 1,
   ontop = false, 
   run = function () awful.util.spawn("wicd-client") end
})

Remarquez que vous pouvez utiliser des balises HTML avec naughty, donc les symboles < et > ne s’afficheront pas.

Fournir des informations à naughty

Charger uniquement naughty dans votre configuration ne produira aucune popup. Le problème principal est de lui fournir des données. Pour cela :

  • pour tester le module, vous pouvez appeler naughty.notify depuis l’invite Lua ;
  • vous pouvez appeler la fonction depuis n’importe quel endroit du rc.lua, ce qui est bien pour des infos supplémentaires de widgets, par exemple ;
  • pour appeler la fonction depuis n’importe quoi qui peut exécuter des commandes, utilisez awesome-client :
echo 'naughty.notify({title = "Test", text = "Naughty", timeout = 10})' | awesome-client -</pre>

La dernière méthode est bonne pour fournir à naughty des données depuis acpid, ivman, etc.

Exemples

Ivman

Récupéré de ~/.ivman/IvmConfigActions.xml :

<ivm:Match name="hal.info.linux.driver" value="usb">
 <ivm:Option name="exec" value="echo naughty.notify\({timeout=15, title=\'Appareil USB\',\
      text=\'$hal.info.product$\'}\) | awesome-client -" />
</ivm:Match>

<ivm:Match name="hal.volume.is_mounted" value="true">
 <ivm:Option name="exec" \
      value="echo naughty.notify\({timeout=15,\ title=\'Monté\',\
      text=\'$hal.block.device$ sur $hal.volume.mount_point$ \($hal.volume.size$\)\'}\)\
      | awesome-client -" />
</ivm:Match>
       
<ivm:Match name="hal.info.category" value="storage">
 <ivm:Match name="hal.storage.drive_type" value="disk">
  <ivm:Option name="exec" value="echo naughty.notify\({timeout=15, title=\'Nouveau volume\',\
       text=\'$hal.info.vendor$ $hal.info.product$ $hal.storage.size$\'}\) | awesome-client -" />
 </ivm:Match>
</ivm:Match>

rc.lua + curl : hack pour bascule de réseau *WRT/AutoAP

AutoAP est un script de démon qui permet à OpenWRT, DD-WRT ou autre de changer de réseau en se basant sur la qualité du signal qui est suivi avec ping. Regardez le wiki de DD-WRT pour plus d’infos.

function dump_autoap()
   os.execute('curl -s http://gw/user/autoap.htm  > /tmp/.awesome.autoap &')
end

last_ap = "none"
function get_autoap()
   local ap = ""
   if info then return end
   local f = io.open('/tmp/.awesome.autoap')
   if not f then return end
   local line = f:read()
   f:close()
   if not line then return end

   local aar, beg = line:find('<title>')
   if line:sub(beg+32, beg+32) == 'S' then ap = "<span color=\"#FF602E\">Recherche en cours…</span>"
   elseif line:sub(beg+32,beg+32) == 'C' then
      endd = line:find('</title>', beg)
      ap = line:sub(beg+47,endd-2)
   end

   if ap ~= last_ap then 
     naughty.notify({title = "Réseau AutoAP", text = ap, timeout = 10})
     last_ap = ap 
   end
   return ap
end

function hook_10s()
  dump_autoap()
  get_autoap()
end

awful.hooks.timer.register(10, hook_10s)

rc.lua + dict : invite de dictionnaire avec sortie naughty

keybinding({ modkey}, "d", function ()
        info = true
        awful.prompt.run({ fg_cursor = "black",bg_cursor="orange", prompt = "<span color='#008DFA'>Dico :</span> " }, 
        mypromptbox[mouse.screen],
        function(word)
                local f = io.popen("dict -d wn " .. word .. " 2>&1")
                local fr = ""
                for line in f:lines() do
                fr = fr .. line .. '\n'
                end
                f:close()
                naughty.notify({ text = '<span font_desc="Sans 7">'..fr..'</span>', timeout = 0, width = 400 })
        end,
        nil, awful.util.getdir("cache") .. "/dict") 
end):add()

rc.lua : invite de calculatrice avec sortie naughty

Le raccourci clavier suivant affiche une invite de calculatrice, contenant le dernier résultat si disponible, et affiche également une popup naughty dont la valeur est l’expression. Quand on clique, la valeur est copiée vers le presse-papiers pour la coller ailleurs. capture d’écran

val = nil
keybinding({ modkey}, "c", function ()
    awful.prompt.run({  text = val and tostring(val),
            selectall = true,
            fg_cursor = "black",bg_cursor="orange",
            prompt = "<span color='#00A5AB'>Calc :</span> " }, mypromptbox,
            function(expr)
              val = awful.util.eval(expr)
              naughty.notify({ text = expr .. ' = <span color="white">' .. val .. "</span>",
                               timeout = 0,
                               run = function() io.popen("echo ".. val .. " | xsel -i"):close() end, })
            end,
            nil, awful.util.getdir("cache") .. "/calc")
end):add()

Utiliser naughty pour déboguer du code Lua

Avec naughty, il est très facile de vérifier la valeur de variables à n’importe quel moment. Oubliez print() dans votre console ! Pour vous évitez de devoir retaper toute la syntaxe, vous pouvez mettre cette fonction avant le code que vous voulez déboguer. capture d’écran

function dbg(vars)
    local text = ""
    for i=1, #vars do text = text .. vars[i] .. " | " end
    naughty.notify({ text = text, timeout = 0 })
end

Maintenant, vous pouvez utiliser la ligne suivant dans le code que vous voulez déboguer, pour votre les valeurs en temps réel dans des popups !

dbg({liste, de, variables})

Calendrier popup

Si vous n’avez pas beaucoup de place sur votre bureau et que votre horloge ne vous donne que l’heure, vous pouvez afficher la date et le calendrier quand la souris passe dessus. Utilisez alors la roulette de la souris pour changer le mois que vous voulez regarder. capture d’écran

    local calendar = nil
    local offset = 0

    function remove_calendar()
        if calendar ~= nil then
            naughty.destroy(calendar)
            calendar = nil
            offset = 0
        end
    end

    function add_calendar(inc_offset)
        local save_offset = offset
        remove_calendar()
        offset = save_offset + inc_offset
        local datespec = os.date("*t")
        datespec = datespec.year * 12 + datespec.month - 1 + offset
        datespec = (datespec % 12 + 1) .. " " .. math.floor(datespec / 12)
        local cal = awful.util.pread("cal -m " .. datespec)
        cal = string.gsub(cal, "^%s*(.-)%s*$", "%1")
        calendar = naughty.notify({
            text = string.format('<span font_desc="%s">%s</span>', "monospace", os.date("%a, %d %B %Y") .. "\n" .. cal),
            timeout = 0, hover_timeout = 0.5,
            width = 160,
        })
    end

-- remplace la boîte d’horloge par le widget d’horloge (par exemple « mytextbox »)
    clockbox.mouse_enter = function()
        add_calendar(0)
    end
    clockbox.mouse_leave = remove_calendar

    clockbox:buttons({
        button({ }, 4, function()
            add_calendar(-1)
        end),
        button({ }, 5, function()
            add_calendar(1)
        end),
    })

Fournir des informations à naughty en utilisant D-Bus

Récupérez la dernière version git d’awesome et naughty écoutera l’interface D-Bus. Vous pouvez créer des notifications en utilisant notify-me, dbus-send, d-feet ou en ouvrant simplement n’importe quelle application avec une notification D-Bus, comme Gajim.

Pour utiliser notify-send :

notify-send "awesome is" "getting naughty"

Pour utiliser dbus-send :

dbus-send --dest=org.freedesktop.Notifications --type=method_call /org/freedesktop/Notifications \
  org.freedesktop.Notifications.Notify string:"" uint32:0 string:"" string:"awesome is" string:"getting naughty"

Pour aller plus loin avec naughty

  • empilement : les nouvelles popups s’affichent « avant » les anciennes
  • niveaux d’urgence pour les popups
Personal tools