You are not logged in.

#1 2013-04-14 03:47:23

miroslec
Member
From: Lisbon
Registered: 2013-03-05
Posts: 10

[Solved] Awesome wibox.textbox.lua problem

I keep getting this error periodically:

/usr/share/awesome/lib/wibox/widget/textbox.lua:61: Unknown tag 'Span' on line 1 char 68

This is the textbox.lua the error references:

---------------------------------------------------------------------------
-- @author Uli Schlachter
-- @author dodo
-- @copyright 2010, 2011 Uli Schlachter, dodo
-- @release v3.5.1-1-g2d31033
---------------------------------------------------------------------------

local base = require("wibox.widget.base")
local beautiful = require("beautiful")
local lgi = require("lgi")
local cairo = lgi.cairo
local Pango = lgi.Pango
local PangoCairo = lgi.PangoCairo
local type = type
local setmetatable = setmetatable
local pairs = pairs
local error = error

-- wibox.widget.textbox
local textbox = { mt = {} }

-- Setup a pango layout for the given textbox and cairo context
local function setup_layout(box, width, height)
    local layout = box._layout
    layout.width = Pango.units_from_double(width)
    layout.height = Pango.units_from_double(height)
end

--- Draw the given textbox on the given cairo context in the given geometry
function textbox:draw(wibox, cr, width, height)
    cr:update_layout(self._layout)
    setup_layout(self, width, height)
    local ink, logical = self._layout:get_pixel_extents()
    local offset = 0
    if self._valign == "center" then
        offset = (height - logical.height) / 2
    elseif self._valign == "bottom" then
        offset = height - logical.height
    end
    cr:move_to(0, offset)
    cr:show_layout(self._layout)
end

--- Fit the given textbox
function textbox:fit(width, height)
    setup_layout(self, width, height)
    local ink, logical = self._layout:get_pixel_extents()

    if logical.width == 0 or logical.height == 0 then
        return 0, 0
    end

    return logical.width, logical.height
end

--- Set a textbox' text.
-- @param text The text to set. This can contain pango markup (e.g. <b>bold</b>)
function textbox:set_markup(text)
    local attr, parsed = Pango.parse_markup(text, -1, 0)
    -- In case of error, attr is false and parsed is an error message
    if not attr then error(parsed) end

    self._layout.text = parsed
    self._layout.attributes = attr
    self:emit_signal("widget::updated")
end

--- Set a textbox' text.
-- @param text The text to display. Pango markup is ignored and shown as-is.
function textbox:set_text(text)
    self._layout.text = text
    self._layout.attributes = nil
    self:emit_signal("widget::updated")
end

--- Set a textbox' ellipsize mode.
-- @param mode Where should long lines be shortened? "start", "middle" or "end"
function textbox:set_ellipsize(mode)
    local allowed = { none = "NONE", start = "START", middle = "MIDDLE", ["end"] = "END" }
    if allowed[mode] then
        self._layout:set_ellipsize(allowed[mode])
        self:emit_signal("widget::updated")
    end
end

--- Set a textbox' wrap mode.
-- @param mode Where to wrap? After "word", "char" or "word_char"
function textbox:set_wrap(mode)
    local allowed = { word = "WORD", char = "CHAR", word_char = "WORD_CHAR" }
    if allowed[mode] then
        self._layout:set_wrap(allowed[mode])
        self:emit_signal("widget::updated")
    end
end

--- Set a textbox' vertical alignment
-- @param mode Where should the textbox be drawn? "top", "center" or "bottom"
function textbox:set_valign(mode)
    local allowed = { top = true, center = true, bottom = true }
    if allowed[mode] then
        self._valign = mode
        self:emit_signal("widget::updated")
    end
end

--- Set a textbox' horizontal alignment
-- @param mode Where should the textbox be drawn? "left", "center" or "right"
function textbox:set_align(mode)
    local allowed = { left = "LEFT", center = "CENTER", right = "RIGHT" }
    if allowed[mode] then
        self._layout:set_alignment(allowed[mode])
        self:emit_signal("widget::updated")
    end
end

--- Set a textbox' font
-- @param font The font description as string
function textbox:set_font(font)
    self._layout:set_font_description(beautiful.get_font(font))
end

-- Returns a new textbox
local function new(text, ignore_markup)
    local ret = base.make_widget()

    for k, v in pairs(textbox) do
        if type(v) == "function" then
            ret[k] = v
        end
    end

    local ctx = PangoCairo.font_map_get_default():create_context()
    ret._layout = Pango.Layout.new(ctx)

    ret:set_ellipsize("end")
    ret:set_wrap("word_char")
    ret:set_valign("center")
    ret:set_align("left")
    ret:set_font()

    if text then
        if ignore_markup then
            ret:set_text(text)
        else
            ret:set_markup(text)
        end
    end

    return ret
end

function textbox.mt:__call(...)
    return new(...)
end

return setmetatable(textbox, textbox.mt)

-- vim: filetype=lua:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:textwidth=80

And this is my rc.lua:

--[[                                     ]]--
--                                         -
--    Steamburn Awesome WM 3.5.+ config    --
--        github.com/copycat-killer        --
--                                         -
--[[                                     ]]--


-- Required Libraries

gears 	        = require("gears")
awful           = require("awful")
awful.rules     = require("awful.rules")
awful.autofocus = require("awful.autofocus")
wibox           = require("wibox")
beautiful       = require("beautiful")
naughty         = require("naughty")
vicious         = require("vicious")
scratch         = require("scratch")
local menubar   = require("menubar")


-- Run once function

function run_once(cmd)
  findme = cmd
  firstspace = cmd:find(" ")
  if firstspace then
     findme = cmd:sub(0, firstspace-1)
  end
  awful.util.spawn_with_shell("pgrep -u $USER -x " .. findme .. " > /dev/null || (" .. cmd .. ")")
 end

-- autostart applications
run_once("urxvtd")
run_once("unclutter -idle 10")


-- Localization

os.setlocale(os.getenv("LANG"))


-- Error Handling

-- Check if awesome encountered an error during startup and fell back to
-- another config (This code will only ever execute for the fallback config)
if awesome.startup_errors then
    naughty.notify({ preset = naughty.config.presets.critical,
                     title = "Oops, there were errors during startup!",
                     text = awesome.startup_errors })
end

-- Handle runtime errors after startup
do
    in_error = false
    awesome.connect_signal("debug::error", function (err)
        -- Make sure we don't go into an endless error loop
        if in_error then return end
        in_error = true

        naughty.notify({ preset = naughty.config.presets.critical,
                         title = "Oops, an error happened!",
                         text = err })
        in_error = false
    end)
end


-- Variable Definitions

home = os.getenv("HOME")
confdir = home .. "/.config/awesome"
scriptdir = confdir .. "/script/"
themes = confdir .. "/themes"
active_theme = themes .. "/steamburn"

beautiful.init(active_theme .. "/theme.lua")

terminal = "urxvtc"
editor = os.getenv("EDITOR")
editor_cmd = terminal .. " -e " .. editor
gui_editor = "subl"
browser = "firefox"
browser2 = "google-chrome"
chat = terminal .. " -e irssi "
tasks = terminal .. " -e htop "
wifi = terminal .. " -e sudo wicd-curses "
musicplr = terminal .. " -g 130x34-320+16 -e ncmpcpp "

modkey = "Mod4"
altkey = "Mod1"

layouts =
{
    awful.layout.suit.floating,             -- 1
    awful.layout.suit.tile,                 -- 2
    awful.layout.suit.tile.left,            -- 3
    awful.layout.suit.tile.bottom,          -- 4
    awful.layout.suit.tile.top,             -- 5
    awful.layout.suit.fair,                 -- 6
    awful.layout.suit.fair.horizontal,      -- 7
    --awful.layout.suit.spiral,               -- 8
    --awful.layout.suit.spiral.dwindle,       -- 9
    awful.layout.suit.max,                  -- 10
    --awful.layout.suit.max.fullscreen,     -- 11
    --awful.layout.suit.magnifier           -- 12
}


-- Wallpaper

if beautiful.wallpaper then
    for s = 1, screen.count() do
        gears.wallpaper.maximized(beautiful.wallpaper, s, true)
    end
end

-- Tags

tags = {
       names = { "web", "term", "docs", "media", "down"},
       layout = { layouts[1], layouts[3], layouts[4], layouts[1], layouts[7] }
       }
for s = 1, screen.count() do
   tags[s] = awful.tag(tags.names, s, tags.layout)
end

-- Menubar configuration
menubar.utils.terminal = terminal -- Set the terminal for applications that require it


-- Menu
myaccessories = {
   { "archives",        "7zFM" },
   { "file manager",    "pcmanfm" },
   { "editor",          gui_editor },
}
myinternet = {
    { "browser",        browser },
    { "irc client" ,    chat },
    { "torrent" ,       "deluge" },
}
mygraphics = {
    { "gimp" ,          "gimp" },
    { "inkscape",       "inkscape" },
    { "dia",            "dia" },
    { "image viewer" ,  "viewnior" }
}
myoffice = {
    { "writer" ,        "libreoffice -writer" },
    { "spreadsheet" ,   "libreoffice -calc" },
    { "impress" ,       "libreoffice -impress" },
}
mysystem = {
    { "appearance" ,    "lxappearance" },
    { "cleaning" ,      "bleachbit" },
    { "powertop" ,      terminal .. " -e sudo powertop " },
    { "task manager" ,  tasks }
}
mymainmenu = awful.menu({ items = {
				    { "accessories" ,   myaccessories },
				    { "graphics" ,      mygraphics },
				    { "internet" ,      myinternet },
				    { "office" ,        myoffice },
				    { "system" ,        mysystem },
            }
            })
mylauncher = awful.widget.launcher({ image = beautiful.awesome_icon,
                                     menu = mymainmenu })


-- Wibox

-- Colours
coldef  = "</span>"
white  = "<span color='#cdcdcd'>"
gray = "<span color='#94928f'>"

-- Textclock widget
clockicon = wibox.widget.imagebox()
clockicon:set_image(beautiful.widget_clock)
mytextclock = awful.widget.textclock(white .. "%H:%M"  .. coldef)

-- Calendar attached to the textclock
local os = os
local string = string
local table = table
local util = awful.util

char_width = nil
text_color = theme.fg_normal or "#FFFFFF"
today_color = theme.tasklist_fg_focus or "#FF7100"
calendar_width = 21

local calendar = nil
local offset = 0

local data = nil

local function pop_spaces(s1, s2, maxsize)
   local sps = ""
   for i = 1, maxsize - string.len(s1) - string.len(s2) do
      sps = sps .. " "
   end
   return s1 .. sps .. s2
end

local function create_calendar()
   offset = offset or 0

   local now = os.date("*t")
   local cal_month = now.month + offset
   local cal_year = now.year
   if cal_month > 12 then
      cal_month = (cal_month % 12)
      cal_year = cal_year + 1
   elseif cal_month < 1 then
      cal_month = (cal_month + 12)
      cal_year = cal_year - 1
   end

   local last_day = os.date("%d", os.time({ day = 1, year = cal_year,
                                            month = cal_month + 1}) - 86400)
   local first_day = os.time({ day = 1, month = cal_month, year = cal_year})
   local first_day_in_week =
      os.date("%w", first_day)
   local result = "su mo tu we th fr sa\n"
   for i = 1, first_day_in_week do
      result = result .. "   "
   end

   local this_month = false
   for day = 1, last_day do
      local last_in_week = (day + first_day_in_week) % 7 == 0
      local day_str = pop_spaces("", day, 2) .. (last_in_week and "" or " ")
      if cal_month == now.month and cal_year == now.year and day == now.day then
         this_month = true
         result = result ..
            string.format('<span weight="bold" foreground = "%s">%s</span>',
                          today_color, day_str)
      else
         result = result .. day_str
      end
      if last_in_week and day ~= last_day then
         result = result .. "\n"
      end
   end

   local header
   if this_month then
      header = os.date("%A, %d de %B")
   else
      header = os.date("%B %Y", first_day)
   end
   return header, string.format('<span font="%s" foreground="%s">%s</span>',
                                theme.font, text_color, result)
end

local function calculate_char_width()
   return beautiful.get_font_height(theme.font) * 0.555
end

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

function show(inc_offset)
   inc_offset = inc_offset or 0

   local save_offset = offset
   hide()
   offset = save_offset + inc_offset

   local char_width = char_width or calculate_char_width()
   local header, cal_text = create_calendar()
   calendar = naughty.notify({ title = header,
                               text = cal_text,
                               timeout = 0, hover_timeout = 0.5,
                            })
end

function add_calendar(t_out)
   hide()
   local char_width = char_width or calculate_char_width()
   local header, cal_text = create_calendar()
   calendar = naughty.notify({ title = header,
                               text = cal_text,
                               timeout = t_out,
                            })
end

mytextclock:connect_signal("mouse::enter", function() show(0) end)
mytextclock:connect_signal("mouse::leave", hide)
mytextclock:buttons(util.table.join( awful.button({ }, 1, function() show(-1) end),
                                     awful.button({ }, 3, function() show(1) end)))

-- Mpd widget
mpdwidget = wibox.widget.textbox()
mpdwidget:buttons(awful.util.table.join(awful.button({ }, 1, function () awful.util.spawn_with_shell(musicplr) end)))
curr_track = nil
vicious.register(mpdwidget, vicious.widgets.mpd,
function(widget, args)
	if (args["{state}"] == "Play") then
    if( args["{Title}"] ~= curr_track )
    then
        curr_track = args["{Title}"]
        run_once(scriptdir .. "mpdinfo")
    end
		return gray .. args["{Title}"] .. coldef .. white .. " " .. args["{Artist}"] .. coldef
	elseif (args["{state}"] == "Pause") then
		return gray .. "mpd " .. coldef .. white .. "in pausa" .. coldef
	else
		return ""
	end
end, 1)

-- MEM widget
memicon = wibox.widget.imagebox()
memicon:set_image(beautiful.widget_mem)
memwidget = wibox.widget.textbox()
vicious.register(memwidget, vicious.widgets.mem, gray .. "Mem " .. coldef .. white .. "$1% " .. coldef, 13) -- in Megabytes

-- CPU widget
cpuicon = wibox.widget.imagebox()
cpuicon:set_image(beautiful.widget_cpu)
cpuwidget = wibox.widget.textbox()
vicious.register(cpuwidget, vicious.widgets.cpu, gray .. "Cpu " .. coldef .. white .. "$1% " .. coldef, 3)
cpuicon:buttons(awful.util.table.join(awful.button({ }, 1, function () awful.util.spawn(tasks, false) end)))

-- Temp widget
tempicon = wibox.widget.imagebox()
tempicon:set_image(beautiful.widget_temp)
tempicon:buttons(awful.util.table.join(awful.button({ }, 1, function () awful.util.spawn(terminal .. " -e sudo powertop ", false) end)))
tempwidget = wibox.widget.textbox()
vicious.register(tempwidget, vicious.widgets.thermal, gray .. "Temp " .. coldef .. white .. "$1º " .. coldef, 9, {"coretemp.0", "core"} )

-- Battery widget
baticon = wibox.widget.imagebox()
baticon:set_image(beautiful.widget_battery)

function batstate()

  local file = io.open("/sys/class/power_supply/BAT0/status", "r")

  if (file == nil) then
    return "Cable plugged"
  end

  local batstate = file:read("*line")
  file:close()

  if (batstate == 'Discharging' or batstate == 'Charging') then
    return batstate
  else
    return "Fully charged"
  end
end

batwidget = wibox.widget.textbox()
vicious.register(batwidget, vicious.widgets.bat,
function (widget, args)
  -- plugged
  if (batstate() == 'Cable plugged') then
    baticon:set_image(beautiful.widget_ac)
    return ''
    -- critical
  elseif (args[2] <= 5 and batstate() == 'Discharging') then
    baticon:set_image(beautiful.widget_battery_empty)
    naughty.notify({
      text = "sto per spegnermi...",
      title = "Carica quasi esaurita!",
      position = "top_right",
      timeout = 1,
      fg="#000000",
      bg="#ffffff",
      screen = 1,
      ontop = true,
    })
    -- low
  elseif (args[2] <= 10 and batstate() == 'Discharging') then
    baticon:set_image(beautiful.widget_battery_low)
    naughty.notify({
      text = "attacca il cavo!",
      title = "Carica bassa",
      position = "top_right",
      timeout = 1,
      fg="#ffffff",
      bg="#262729",
      screen = 1,
      ontop = true,
    })
   else baticon:set_image(beautiful.widget_battery)
  end
  return gray .. "Bat " .. coldef .. white .. args[2] .. " " .. coldef
end, 1, 'BAT0', '%')

-- Volume widget
volicon = wibox.widget.imagebox()
volicon:set_image(beautiful.widget_vol)
volumewidget = wibox.widget.textbox()
vicious.register(volumewidget, vicious.widgets.volume,
function (widget, args)
  if (args[2] ~= "♩" ) then
     return gray .. "Vol " .. coldef .. white .. args[1] .. " " .. coldef
  else
     return gray .. "Vol " .. coldef .. white .. "mute " .. coldef
  end
end, 1, "Master")

-- Net widget
netwidget = wibox.widget.textbox()
vicious.register(netwidget, vicious.widgets.net, gray .. "Net " .. coldef .. white .. "${wlp2s0 down_kb} " .. "<span font=\"Terminus 8\">↓↑ </span>" .. "${wlp2s0 up_kb} " .. coldef, 3)
neticon = wibox.widget.imagebox()
neticon:set_image(beautiful.widget_net)
netwidget:buttons(awful.util.table.join(awful.button({ }, 1, function () awful.util.spawn_with_shell(wifi) end)))

-- Weather widget
weatherwidget = wibox.widget.textbox()
vicious.register(weatherwidget, vicious.widgets.weather,
    function (widget, args)
        if args["{tempf}"] == "N/A" then
            return gray .. "No " .. coldef .. white .. "Info " .. coldef
        else
            -- work in progress - ☂☔☃ ⛆⛇⛈ ?
            if( args["{sky}"] == "N/A" or string.find(args["{sky}"], "Clear") ~= nil ) then args["{sky}"] = "<span font=\"Symbola 10\" rise=\"-1535\">☼</span>"
            elseif( string.find(args["{sky}"], "Cloudy") ~= nil ) then args["{sky}"] = "<span font=\"Symbola 11\" rise=\"-1620\">☁</span>"
            end
            return gray .. args["{sky}"] .. coldef .. " " .. white .. args["{tempc}"] .. "º " .. coldef
        end
    end, 1800, "LPPT" )

-- Separators
spr = wibox.widget.textbox(' ')
leftbr = wibox.widget.textbox(' [')
rightbr = wibox.widget.textbox('] ')


-- Layout

-- Create a wibox for each screen and add it
mywibox = {}
mypromptbox = {}
mylayoutbox = {}
mytaglist = {}
mytaglist.buttons = awful.util.table.join(
                    awful.button({ }, 1, awful.tag.viewonly),
                    awful.button({ modkey }, 1, awful.client.movetotag),
                    awful.button({ }, 3, awful.tag.viewtoggle),
                    awful.button({ modkey }, 3, awful.client.toggletag),
                    awful.button({ }, 4, function(t) awful.tag.viewnext(awful.tag.getscreen(t)) end),
                    awful.button({ }, 5, function(t) awful.tag.viewprev(awful.tag.getscreen(t)) end)
                    )
mytasklist = {}
mytasklist.buttons = awful.util.table.join(
                     awful.button({ }, 1, function (c)
                                              if c == client.focus then
                                                  c.minimized = true
                                              else
                                                  -- Without this, the following
                                                  -- :isvisible() makes no sense
                                                  c.minimized = false
                                                  if not c:isvisible() then
                                                      awful.tag.viewonly(c:tags()[1])
                                                  end
                                                  -- This will also un-minimize
                                                  -- the client, if needed
                                                  client.focus = c
                                                  c:raise()
                                              end
                                          end),
                     awful.button({ }, 3, function ()
                                              if instance then
                                                  instance:hide()
                                                  instance = nil
                                              else
                                                  instance = awful.menu.clients({ width=250 })
                                              end
                                          end),
                     awful.button({ }, 4, function ()
                                              awful.client.focus.byidx(1)
                                              if client.focus then client.focus:raise() end
                                          end),
                     awful.button({ }, 5, function ()
                                              awful.client.focus.byidx(-1)
                                              if client.focus then client.focus:raise() end
                                          end))

for s = 1, screen.count() do

    -- Create a promptbox for each screen
    mypromptbox[s] = awful.widget.prompt()

    -- We need one layoutbox per screen.
    mylayoutbox[s] = awful.widget.layoutbox(s)
    mylayoutbox[s]:buttons(awful.util.table.join(
                            awful.button({ }, 1, function () awful.layout.inc(layouts, 1) end),
                            awful.button({ }, 3, function () awful.layout.inc(layouts, -1) end),
                            awful.button({ }, 4, function () awful.layout.inc(layouts, 1) end),
                            awful.button({ }, 5, function () awful.layout.inc(layouts, -1) end)))

    -- Create a taglist widget
    mytaglist[s] = awful.widget.taglist(s, awful.widget.taglist.filter.all, mytaglist.buttons)

    -- Create a tasklist widget
    mytasklist[s] = awful.widget.tasklist(s, awful.widget.tasklist.filter.currenttags, mytasklist.buttons)

    -- Create the upper wibox
    mywibox[s] = awful.wibox({ position = "top", screen = s, height = 18 })

    -- Widgets that are aligned to the upper left
    local left_layout = wibox.layout.fixed.horizontal()
    left_layout:add(spr)
    left_layout:add(mytaglist[s])
    left_layout:add(leftbr)
    left_layout:add(mylayoutbox[s])
    left_layout:add(rightbr)
    left_layout:add(mypromptbox[s])

    -- Widgets that are aligned to the upper right
    local right_layout = wibox.layout.fixed.horizontal()
    --if s == 1 then right_layout:add(wibox.widget.systray()) end
    right_layout:add(spr)
    right_layout:add(mpdwidget)
    right_layout:add(spr)
    right_layout:add(cpuwidget)
    right_layout:add(spr)
    right_layout:add(memwidget)
    right_layout:add(spr)
    right_layout:add(tempwidget)
    right_layout:add(spr)
    right_layout:add(batwidget)
    right_layout:add(spr)
    right_layout:add(netwidget)
    right_layout:add(spr)
    right_layout:add(volumewidget)
    right_layout:add(spr)
    right_layout:add(weatherwidget)
    right_layout:add(spr)
    right_layout:add(mytextclock)
    right_layout:add(spr)
    if s == 1 then right_layout:add(wibox.widget.systray()) end

    -- Now bring it all together (with the tasklist in the middle)
    local layout = wibox.layout.align.horizontal()
    layout:set_left(left_layout)
ma = terminal .. " -e mutt "
    layout:set_middle(mytasklist[s])
    layout:set_right(right_layout)
    mywibox[s]:set_widget(layout)

end

-- Mouse Bindings

root.buttons(awful.util.table.join(
    awful.button({ }, 3, function () mymainmenu:toggle() end),
    awful.button({ }, 4, awful.tag.viewnext),
    awful.button({ }, 5, awful.tag.viewprev)
))


-- Key bindings
globalkeys = awful.util.table.join(

    -- Capture a screenshot
    awful.key({ altkey }, "p", function() awful.util.spawn("screenshot",false) end),

    -- Move clients
    awful.key({ altkey }, "Next",  function () awful.client.moveresize( 1,  1, -2, -2) end),
    awful.key({ altkey }, "Prior", function () awful.client.moveresize(-1, -1,  2,  2) end),
    awful.key({ altkey }, "Down",  function () awful.client.moveresize(  0,  1,   0,   0) end),
    awful.key({ altkey }, "Up",    function () awful.client.moveresize(  0, -1,   0,   0) end),
    awful.key({ altkey }, "Left",  function () awful.client.moveresize(-1,   0,   0,   0) end),
    awful.key({ altkey }, "Right", function () awful.client.moveresize( 1,   0,   0,   0) end),
    awful.key({ modkey,           }, "Left",   awful.tag.viewprev       ),
    awful.key({ modkey,           }, "Right",  awful.tag.viewnext       ),
    awful.key({ modkey,           }, "Escape", awful.tag.history.restore),
    awful.key({ modkey,           }, "k",
        function ()
            awful.client.focus.byidx( 1)
            if client.focus then client.focus:raise() end
        end),
    awful.key({ modkey,           }, "j",
        function ()
            awful.client.focus.byidx(-1)
            if client.focus then client.focus:raise() end
        end),
    awful.key({ modkey,           }, "w", function () mymainmenu:show({keygrabber=true}) end),

    -- Show/Hide Wibox
    awful.key({ modkey }, "b", function ()
    mywibox[mouse.screen].visible = not mywibox[mouse.screen].visible
    end),

    -- Layout manipulation
    awful.key({ modkey, "Shift"   }, "j", function () awful.client.swap.byidx(  1)    end),
    awful.key({ modkey, "Shift"   }, "k", function () awful.client.swap.byidx( -1)    end),
    awful.key({ modkey, "Control" }, "j", function () awful.screen.focus_relative( 1) end),
    awful.key({ modkey, "Control" }, "k", function () awful.screen.focus_relative(-1) end),
    awful.key({ modkey,           }, "u", awful.client.urgent.jumpto),
    awful.key({ modkey,           }, "Tab",
        function ()
            awful.client.focus.history.previous()
            if client.focus then
                client.focus:raise()
            end
        end),

    -- Standard program
    awful.key({ modkey,           }, "Return", function () awful.util.spawn(terminal) end),
    awful.key({ modkey, "Control" }, "r", awesome.restart),
    awful.key({ modkey, "Shift"   }, "q", awesome.quit),
    awful.key({ modkey,           }, "l",     function () awful.tag.incmwfact( 0.05)     end),
    awful.key({ modkey,           }, "h",     function () awful.tag.incmwfact(-0.05)     end),
    awful.key({ modkey, "Shift"   }, "h",     function () awful.tag.incnmaster( 1)       end),
    awful.key({ modkey, "Shift"   }, "l",     function () awful.tag.incnmaster(-1)       end),
    awful.key({ modkey, "Control" }, "h",     function () awful.tag.incncol( 1)          end),
    awful.key({ modkey, "Control" }, "l",     function () awful.tag.incncol(-1)          end),
    awful.key({ modkey,           }, "space", function () awful.layout.inc(layouts,  1)  end),
    awful.key({ modkey, "Shift"   }, "space", function () awful.layout.inc(layouts, -1)  end),
    awful.key({ modkey, "Control" }, "n", awful.client.restore),

    -- Dropdown terminal
    awful.key({ modkey,	          }, "z",     function () scratch.drop(terminal) end),

    -- Widgets popups
    awful.key({ altkey,           }, "c",     function () add_calendar(7) end),

    -- Volume control
    awful.key({       },      "XF86AudioRaiseVolume", function ()
                                       awful.util.spawn("amixer set Master playback 1%+", false )
                                       vicious.force({ volumewidget })
                                   end),
    awful.key({       },      "XF86AudioLowerVolume", function ()
                                       awful.util.spawn("amixer set Master playback 1%-", false )
                                       vicious.force({ volumewidget })
                                     end),
    awful.key({       },      "XF86AudioMute", function ()
                                       awful.util.spawn("amixer set Master playback toggle", false )
                                       vicious.force({ volumewidget })
                                     end),
    -- Music control
    awful.key({ altkey, "Control" }, "Up", function () 
                                              awful.util.spawn( "mpc toggle", false ) 
                                              vicious.force({ mpdwidget } )
                                           end),
    awful.key({ altkey, "Control" }, "Down", function () 
                                                awful.util.spawn( "mpc stop", false ) 
                                                vicious.force({ mpdwidget } )
                                             end ),
    awful.key({ altkey, "Control" }, "Left", function ()
                                                awful.util.spawn( "mpc prev", false )
                                                vicious.force({ mpdwidget } )
                                             end ),
    awful.key({ altkey, "Control" }, "Right", function () 
                                                awful.util.spawn( "mpc next", false )
                                                vicious.force({ mpdwidget } )
                                              end ),

    -- Copy to clipboard
    awful.key({ modkey,        }, "c",      function () os.execute("xsel -p -o | xsel -i -b") end),

    -- User programs
    awful.key({ modkey,        }, "q",      function () awful.util.spawn( "google-chrome", false ) end),
    awful.key({ modkey,        }, "a",      function () awful.util.spawn( "firefox", false ) end),
    awful.key({ modkey,        }, "s",      function () awful.util.spawn(gui_editor) end),
    awful.key({ modkey, 	     }, "t", 	    function () awful.util.spawn( "deluge", false ) end),
    awful.key({ modkey,        }, "d", 	    function () awful.util.spawn( "pcmanfm", false ) end),

    -- Prompt
    awful.key({ modkey }, "r", function () mypromptbox[mouse.screen]:run() end),

    awful.key({ modkey }, "x",
              function ()
                  awful.prompt.run({ prompt = "Run Lua code: " },
                  mypromptbox[mouse.screen].widget,
                  awful.util.eval, nil,
                  awful.util.getdir("cache") .. "/history_eval")
              end),

    -- Menubar
    awful.key({ modkey }, "p", function() menubar.show() end)
)

clientkeys = awful.util.table.join(
    awful.key({ modkey,           }, "f",      function (c) c.fullscreen = not c.fullscreen  end),
    awful.key({ modkey, "Shift"   }, "c",      function (c) c:kill()                         end),
    awful.key({ modkey, "Control" }, "space",  awful.client.floating.toggle                     ),
    awful.key({ modkey, "Control" }, "Return", function (c) c:swap(awful.client.getmaster()) end),
    awful.key({ modkey,           }, "o",      awful.client.movetoscreen                        ),
    awful.key({ modkey,           }, "t",      function (c) c.ontop = not c.ontop            end),
    awful.key({ modkey,           }, "n",
        function (c)
            -- The client currently has the input focus, so it cannot be
            -- minimized, since minimized clients can't have the focus.
            c.minimized = true
        end),
    awful.key({ modkey,           }, "m",
        function (c)
            c.maximized_horizontal = not c.maximized_horizontal
            c.maximized_vertical   = not c.maximized_vertical
        end)
)

-- Compute the maximum number of digit we need, limited to 9
keynumber = 0
for s = 1, screen.count() do
   keynumber = math.min(9, math.max(#tags[s], keynumber));
end

-- Bind all key numbers to tags.
-- Be careful: we use keycodes to make it works on any keyboard layout.
-- This should map on the top row of your keyboard, usually 1 to 9.
for i = 1, keynumber do
    globalkeys = awful.util.table.join(globalkeys,
        awful.key({ modkey }, "#" .. i + 9,
                  function ()
                        screen = mouse.screen
                        if tags[screen][i] then
                            awful.tag.viewonly(tags[screen][i])
                        end
                  end),
        awful.key({ modkey, "Control" }, "#" .. i + 9,
                  function ()
                      screen = mouse.screen
                      if tags[screen][i] then
                          awful.tag.viewtoggle(tags[screen][i])
                      end
                  end),
        awful.key({ modkey, "Shift" }, "#" .. i + 9,
                  function ()
                      if client.focus and tags[client.focus.screen][i] then
                          awful.client.movetotag(tags[client.focus.screen][i])
                      end
                  end),
        awful.key({ modkey, "Control", "Shift" }, "#" .. i + 9,
                  function ()
                      if client.focus and tags[client.focus.screen][i] then
                          awful.client.toggletag(tags[client.focus.screen][i])
                      end
                  end))
end

clientbuttons = awful.util.table.join(
    awful.button({ }, 1, function (c) client.focus = c; c:raise() end),
    awful.button({ modkey }, 1, awful.mouse.client.move),
    awful.button({ modkey }, 3, awful.mouse.client.resize))

-- Set keys
root.keys(globalkeys)


-- Rules

awful.rules.rules = {
     -- All clients will match this rule.
     { rule = { },
       properties = { border_width = beautiful.border_width,
                      border_color = beautiful.border_normal,
                      focus = true,
                      keys = clientkeys,
                      buttons = clientbuttons,
	                  size_hints_honor = false
                     }
    },

    { rule = { class = "MPlayer" },
      properties = { floating = true } },

    { rule = { class = "Dwb" },
          properties = { tag = tags[1][1],
          			     maximized_vertical=true,
          			     maximized_horizontal=true } },

    { rule = { class = "Midori" },
          properties = { tag = tags[1][1],
          			     maximized_vertical=true,
          			     maximized_horizontal=true } },

    { rule = { class = "Geany" },
          properties = { tag = tags[1][2] } },

	  { rule = { class = "Zathura" },
     	  properties = { tag = tags[1][3] } },

    { rule = { class = "Thunderbird" },
          properties = { tag = tags[1][3] } },

    { rule = { class = "Dia" },
          properties = { tag = tags[1][4],
          floating = true } },

    { rule = { class = "Gimp" },
          properties = { tag = tags[1][4],
          floating = true } },

    { rule = { class = "Inkscape" },
          properties = { tag = tags[1][4],
          floating = true } },

    { rule = { class = "Transmission-gtk" },
          properties = { tag = tags[1][5] } },

    { rule = { class = "Torrent-search" },
          properties = { tag = tags[1][5] } },
}


-- Signals

-- Signal function to execute when a new client appears.
client.connect_signal("manage", function (c, startup)
    -- Enable sloppy focus
    c:connect_signal("mouse::enter", function(c)
        if awful.layout.get(c.screen) ~= awful.layout.suit.magnifier
            and awful.client.focus.filter(c) then
            client.focus = c
        end
    end)

    if not startup then
        -- Set the windows at the slave,
        -- i.e. put it at the end of others instead of setting it master.
        -- awful.client.setslave(c)

        -- Put windows in a smart way, only if they does not set an initial position.
        if not c.size_hints.user_position and not c.size_hints.program_position then
            awful.placement.no_overlap(c)
            awful.placement.no_offscreen(c)
        end
    end

    local titlebars_enabled = false
    if titlebars_enabled and (c.type == "normal" or c.type == "dialog") then
        -- Widgets that are aligned to the left
        local left_layout = wibox.layout.fixed.horizontal()
        left_layout:add(awful.titlebar.widget.iconwidget(c))

        -- Widgets that are aligned to the right
        local right_layout = wibox.layout.fixed.horizontal()
        right_layout:add(awful.titlebar.widget.floatingbutton(c))
        right_layout:add(awful.titlebar.widget.maximizedbutton(c))
        right_layout:add(awful.titlebar.widget.stickybutton(c))
        right_layout:add(awful.titlebar.widget.ontopbutton(c))
        right_layout:add(awful.titlebar.widget.closebutton(c))
        right_layout:add(awful.titlebar.widget.closebutton(c))

        -- The title goes in the middle
        local title = awful.titlebar.widget.titlewidget(c)
        title:buttons(awful.util.table.join(
                awful.button({ }, 1, function()
                    client.focus = c
                    c:raise()
                    awful.mouse.client.move(c)
                end),
                awful.button({ }, 3, function()
                    client.focus = c
                    c:raise()
                    awful.mouse.client.resize(c)
                end)
                ))

        -- Now bring it all together
        local layout = wibox.layout.align.horizontal()
        layout:set_left(left_layout)
        layout:set_right(right_layout)
        layout:set_middle(title)

        awful.titlebar(c):set_widget(layout)
    end
end)

client.connect_signal("focus", function(c) c.border_color = beautiful.border_focus end)
client.connect_signal("unfocus", function(c) c.border_color = beautiful.border_normal end)

Can anybody help me out with this? I don't even know where to start, since I can't find said 'Span' tag.

Last edited by miroslec (2013-04-18 02:01:01)

Offline

#2 2013-04-15 23:41:43

miroslec
Member
From: Lisbon
Registered: 2013-03-05
Posts: 10

Re: [Solved] Awesome wibox.textbox.lua problem

Trying to troubleshoot this problem I can confirm it happens with Awesome from community and Awesome-git from AUR.

I still can't find the elusive "Span" tag the error talks about. hmm

Offline

#3 2013-04-16 12:28:31

sardina
Member
Registered: 2013-02-23
Posts: 152

Re: [Solved] Awesome wibox.textbox.lua problem

I am the author, I used steamburn for a while without such problem.

Maybe it has to do with some setting in the rc that probably don't match with your system.

Tell me the exact moments the problem occurs, or post a screenshot.

Offline

#4 2013-04-16 12:58:42

miroslec
Member
From: Lisbon
Registered: 2013-03-05
Posts: 10

Re: [Solved] Awesome wibox.textbox.lua problem

sardina wrote:

I am the author, I used steamburn for a while without such problem.

Maybe it has to do with some setting in the rc that probably don't match with your system.

Tell me the exact moments the problem occurs, or post a screenshot.

First of all, thank you for the awesome themes. I've been using them as a base for my daily Awesome configs.
Unfortunately, the error occurs rather randomly, and I'm not able to pinpoint why it happens.

Here's a screenshot:

qZloq9Ds.png?1

This happened during the night, while I wasn't using the laptop. Only Deluge and Dropbox were running (although it still happens if they aren't running).

Last edited by miroslec (2013-04-16 12:59:27)

Offline

#5 2013-04-17 02:31:16

z1lt0id
Member
Registered: 2012-09-20
Posts: 177

Re: [Solved] Awesome wibox.textbox.lua problem

I too can confirm I get this error message and I use your the Blackbird theme with the same config.  I find that the error message comes up when my internet is really bogged down with other connections.

Offline

#6 2013-04-17 10:35:18

sardina
Member
Registered: 2013-02-23
Posts: 152

Re: [Solved] Awesome wibox.textbox.lua problem

miroslec wrote:
sardina wrote:

I am the author, I used steamburn for a while without such problem.

Maybe it has to do with some setting in the rc that probably don't match with your system.

Tell me the exact moments the problem occurs, or post a screenshot.

First of all, thank you for the awesome themes. I've been using them as a base for my daily Awesome configs.
Unfortunately, the error occurs rather randomly, and I'm not able to pinpoint why it happens.

Here's a screenshot:

http://i.imgur.com/qZloq9Ds.png?1

This happened during the night, while I wasn't using the laptop. Only Deluge and Dropbox were running (although it still happens if they aren't running).

I used your configuration for about 45 minutes, slice of time in wich every widget updates.

No problems.

Let's see if it is the weather widget causing your problem.

Modify it like this:

weatherwidget = wibox.widget.textbox()
sky_toshow = ""
vicious.register(weatherwidget, vicious.widgets.weather,
    function (widget, args)
        if args["{tempf}"] == "N/A" then
            return gray .. "No " .. coldef .. white .. "Info " .. coldef
        else
            -- work in progress - ☂☔☃ ⛆⛇⛈ ?
            if( args["{sky}"] == "N/A" or string.find(args["{sky}"], "Clear") ~= nil ) then sky_toshow = "<span font=\"Symbola 10\" rise=\"-1535\">☼</span>"
            elseif( string.find(args["{sky}"], "Cloudy") ~= nil ) then sky_toshow = "<span font=\"Symbola 11\" rise=\"-1620\">☁</span>"
            end
            if sky_toshow ~= "" then return gray .. sky_toshow .. coldef .. " " .. white .. args["{tempc}"] .. " " .. coldef
            else return gray .. args["{sky}"] .. coldef .. " " .. white .. args["{tempc}"] .. " " .. coldef
            end
        end
    end, 1800, "LPPT" )

And install ttf-symbola and ttf-terminus, if you don't have them. (just in case)

If problem occurs again, remove the code from your config, to surely assert wether it the cause or not.

Let me know how it goes.

@z1lt0id same procedure: post a screenshot and your rc.lua

I updated my github.

Offline

#7 2013-04-17 11:20:13

z1lt0id
Member
Registered: 2012-09-20
Posts: 177

Re: [Solved] Awesome wibox.textbox.lua problem

Cheers Sardina, I've edited the code and I'll see how it goes.  I'll give an update tomorrow morning.

Offline

#8 2013-04-17 12:00:15

miroslec
Member
From: Lisbon
Registered: 2013-03-05
Posts: 10

Re: [Solved] Awesome wibox.textbox.lua problem

sardina wrote:
miroslec wrote:
sardina wrote:

I am the author, I used steamburn for a while without such problem.

Maybe it has to do with some setting in the rc that probably don't match with your system.

Tell me the exact moments the problem occurs, or post a screenshot.

First of all, thank you for the awesome themes. I've been using them as a base for my daily Awesome configs.
Unfortunately, the error occurs rather randomly, and I'm not able to pinpoint why it happens.

Here's a screenshot:

http://i.imgur.com/qZloq9Ds.png?1

This happened during the night, while I wasn't using the laptop. Only Deluge and Dropbox were running (although it still happens if they aren't running).

I used your configuration for about 45 minutes, slice of time in wich every widget updates.

No problems.

Let's see if it is the weather widget causing your problem.

Modify it like this:

weatherwidget = wibox.widget.textbox()
sky_toshow = ""
vicious.register(weatherwidget, vicious.widgets.weather,
    function (widget, args)
        if args["{tempf}"] == "N/A" then
            return gray .. "No " .. coldef .. white .. "Info " .. coldef
        else
            -- work in progress - ☂☔☃ ⛆⛇⛈ ?
            if( args["{sky}"] == "N/A" or string.find(args["{sky}"], "Clear") ~= nil ) then sky_toshow = "<span font=\"Symbola 10\" rise=\"-1535\">☼</span>"
            elseif( string.find(args["{sky}"], "Cloudy") ~= nil ) then sky_toshow = "<span font=\"Symbola 11\" rise=\"-1620\">☁</span>"
            end
            if sky_toshow ~= "" then return gray .. sky_toshow .. coldef .. " " .. white .. args["{tempc}"] .. " " .. coldef
            else return gray .. args["{sky}"] .. coldef .. " " .. white .. args["{tempc}"] .. " " .. coldef
            end
        end
    end, 1800, "LPPT" )

And install ttf-symbola and ttf-terminus, if you don't have them. (just in case)

If problem occurs again, remove the code from your config, to surely assert wether it the cause or not.

Let me know how it goes.

@z1lt0id same procedure: post a screenshot and your rc.lua

I updated my github.

Thanks for your help troubleshooting this. I've changed the code for the weather widget. Let's see how it goes.

EDIT - About two hours without the bug. Thanks for your help Sardina

Last edited by miroslec (2013-04-17 13:15:26)

Offline

#9 2013-04-18 02:01:27

miroslec
Member
From: Lisbon
Registered: 2013-03-05
Posts: 10

Re: [Solved] Awesome wibox.textbox.lua problem

Solved. No errors all day.

Thanks! smile

Offline

#10 2013-04-18 02:02:04

z1lt0id
Member
Registered: 2012-09-20
Posts: 177

Re: [Solved] Awesome wibox.textbox.lua problem

No errors for me so far either smile

Offline

Board footer

Powered by FluxBB