You are not logged in.

#1 2013-01-08 05:33:58

nhare330
Member
From: Pennsylvania, USA
Registered: 2013-01-08
Posts: 9

[SOLVED] Awesome is not recognizing widgets

Hey everybody,
So this is my first (non-virtualbox) arch install. I just switched over from crunchbang. I had awesome installed on crunchbang and used that as my primary window manager. So I saved all of my configs and everything so that I could use them on arch. I got arch installed and then awesome, and awesome works well. I am using it right now. But as soon as I started trying to add widgets it wouldn't let me. Every time I restart it awesome reverts to the rc.lua in /etc/xdg... and gives me a warning message saying:

Oops, there were errors during startup!
/home/nathan/.config/awesome/rc.lua:117: attempt to call global 'widget' (a nil value)

The line it is referring to is this:

separator = widget({ type = "textbox" })

Also, all of the requires at the top currently look like this:

-- Standard awesome library
local gears = require("gears")
local awful = require("awful")
awful.rules = require("awful.rules")
require("awful.autofocus")
-- Widget and layout library
wibox = require("wibox")
-- Theme handling library
local beautiful = require("beautiful")
-- Notification library
local naughty = require("naughty")
local menubar = require("menubar")

So I tried to google and search the awesome wiki and the arch wiki for how it is done on arch. From everything I have found I am doing it correctly, but I must be missing something. One thought was that it might be a result of the most recent awesome update. I think it was on the 4th. Any ideas?

Last edited by nhare330 (2013-01-09 00:21:05)

Offline

#2 2013-01-08 11:06:10

ilusi0n
Member
Registered: 2010-06-09
Posts: 187

Re: [SOLVED] Awesome is not recognizing widgets

Offline

#3 2013-01-08 11:46:56

gridcol
Member
From: Karlsruhe, Germany
Registered: 2012-03-27
Posts: 32

Re: [SOLVED] Awesome is not recognizing widgets

separator = wibox.widget.textbox()

Offline

#4 2013-01-08 13:15:20

Antoine
Member
From: Picton Ontario
Registered: 2012-10-11
Posts: 90

Re: [SOLVED] Awesome is not recognizing widgets

nhare330 wrote:

So I tried to google and search the awesome wiki and the arch wiki for how it is done on arch. From everything I have found I am doing it correctly, but I must be missing something. One thought was that it might be a result of the most recent awesome update. I think it was on the 4th. Any ideas?

I see that gridcol and ilusi0n have pointed you in the right direction.

The Awesome wiki gives pretty vage instructions. but.

This is how I set up a simple vicious widget in 3.5:

-- {{{ CPU widget from vicious                                         
         local cpuwidget = wibox.widget.textbox()                               
         vicious.register(cpuwidget, vicious.widgets.cpu, "$1%")                
-- }}}  

Far as I can make out, you can place that anywhere in your rc.lua, after you've "required" vicious. Then find the bit of rc.lua where the taglist/tasklist/systray widgetty wiboxes are created,  and place it in your "layout":

-- Widgets that are aligned to the right                                                                      
         local right_layout = wibox.layout.fixed.horizontal()                                                          
                                                                                                                       
         if s == 1 then right_layout:add(wibox.widget.systray()) end                                                   
         right_layout:add(mytextclock)                                                                                 
         right_layout:add(mylayoutbox[s])                                                                           
THIS: right_layout:add(cpuwidget)                                                                                  
         -- Now bring it all together (with the tasklist in the middle)                                                
         local layout = wibox.layout.align.horizontal()                                                                
         layout:set_left(left_layout)                                                                                  
         layout:set_middle(mytasklist[s])                                                                              
         layout:set_right(right_layout)                                                                                

The "THIS:" isn't part of the code -- just to show you where. Now you'll have a (not particularly attractive) cpu monitor widget at the very right of your systray. It's worth reading through this part of the rc.lua. I guess it's easier than Lisp.

Offline

#5 2013-01-08 14:34:58

nhare330
Member
From: Pennsylvania, USA
Registered: 2013-01-08
Posts: 9

Re: [SOLVED] Awesome is not recognizing widgets

Okay, Thanks a lot for your help everyone.

I ran into another problem though. I altered every widget in rc.lua to the new wibox.widget.textbox() method and it has stopped giving me errors about that. But now it gives me an error saying this:

Oops, there were errors during startup!
/usr/share/awesome/lib/wibox/widget/textbox.lua:54: bad argument #2 to 'parse_markup' (string expected. got table)

I thought maybe I had screwed it up while I was messing with it before so I deleted it and reinstalled awesome, therefore replacing the whole wibox folder with the newest version. But I still get the errors. Below is my textbox.lua. I marked line 54 with '----->' on either side. Any ideas?

---------------------------------------------------------------------------
-- @author Uli Schlachter
-- @author dodo
-- @copyright 2010, 2011 Uli Schlachter, dodo
-- @release v3.5
---------------------------------------------------------------------------

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()
    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

Last edited by nhare330 (2013-01-08 17:14:15)

Offline

#6 2013-01-08 18:39:30

Stebalien
Member
Registered: 2010-04-27
Posts: 1,237
Website

Re: [SOLVED] Awesome is not recognizing widgets

The error is still in your config, not textbox.lua (it's just getting thrown in textbox.lua). Post your new rc.lua.


Steven [ web : git ]
GPG:  327B 20CE 21EA 68CF A7748675 7C92 3221 5899 410C
Do not email: honeypot@stebalien.com

Offline

#7 2013-01-08 18:54:22

nhare330
Member
From: Pennsylvania, USA
Registered: 2013-01-08
Posts: 9

Re: [SOLVED] Awesome is not recognizing widgets

Here it is. My rc.lua:

-- Standard awesome library
local gears = require("gears")
local awful = require("awful")
awful.rules = require("awful.rules")
require("awful.autofocus")
-- Widget and layout library
local wibox = require("wibox")
local vicious = require("vicious")
-- Theme handling library
local beautiful = require("beautiful")
-- Notification library
local naughty = require("naughty")
local menubar = require("menubar")


-- {{{ 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
    local 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
-- Themes define colours, icons, and wallpapers
beautiful.init("/usr/share/awesome/themes/zenburn/theme.lua")

-- This is used later as the default terminal and editor to run.
terminal = "lxterminal"
editor = os.getenv("EDITOR") or "nano"
editor_cmd = terminal .. " -e " .. editor

-- Default modkey.
-- Usually, Mod4 is the key with a logo between Control and Alt.
-- If you do not like this or do not have such a key,
-- I suggest you to remap Mod4 to another key using xmodmap or other tools.
-- However, you can use another modifier like Mod1, but it may interact with others.
modkey = "Mod4"

-- Table of layouts to cover with awful.layout.inc, order matters.
local layouts =
{
    awful.layout.suit.floating,
    awful.layout.suit.tile,
    awful.layout.suit.tile.left,
    awful.layout.suit.tile.bottom,
    awful.layout.suit.tile.top,
    awful.layout.suit.fair,
    awful.layout.suit.fair.horizontal,
    awful.layout.suit.spiral,
    awful.layout.suit.spiral.dwindle,
    awful.layout.suit.max,
    awful.layout.suit.max.fullscreen,
    awful.layout.suit.magnifier
}
-- }}}

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

-- {{{ Tags
-- Define a tag table which hold all screen tags.
tags = {
		names = { "➊ ", "➋ ", "➌ ", "➍ ", "➎ ", "◌ " },
		layout = { layouts[2], layouts[10], layouts[10], layouts[1], layouts[1], layouts[10]
}}
for s = 1, screen.count() do
    -- Each screen has its own tag table.
    tags[s] = awful.tag(tags.names, s, tags.layout)
end
-- }}}

-- {{{ Menu
-- Create a laucher widget and a main menu
myawesomemenu = {
   { "manual", terminal .. " -e man awesome" },
   { "edit config", editor_cmd .. " " .. awesome.conffile },
   { "restart", awesome.restart },
   { "quit", awesome.quit }
}

mymainmenu = awful.menu({ items = { { "awesome", myawesomemenu, beautiful.awesome_icon },
                                    { "open terminal", terminal }
                                  }
                        })

mylauncher = awful.widget.launcher({ image = beautiful.awesome_icon,
                                     menu = mymainmenu })

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

-- {{{ Wibox

-- Separator
     separator = wibox.widget.textbox()
     separator:set_text(" | ")

-- Spacer
     spacer = wibox.widget.textbox()
     spacer:set_text(" ")

-- Network usage widget
     netwidget = wibox.widget.textbox()
     vicious.register(netwidget, vicious.widgets.net, '<span color="#CDBC73">${eth0 down_kb}</span> <span color="#7F9F7F">${eth0 up_kb}</span>', 3)

-- Memory widget
     memwidget = wibox.widget.textbox()
     memwidget_t = awful.tooltip({ objects = {memwidget}, })
     vicious.register(memwidget, vicious.widgets.mem, 
			function (widget, args)
                 memwidget_t:set_text('<span color="#9868B1"> mem: ' ..args[2].. '/' ..args[3].. 'mb \n free: ' ..args[4].. 'mb \n swap: ' ..args[5].. '% > ' ..args[6].. '/' ..args[7].. 'mb \n free: ' ..args[8].. 'mb </span>')
               return  '<span color="#CDBC73">▣ ' ..args[1].. '%</span>'
               end, 3)

-- Cpu widget
     cpuwidget = wibox.widget.textbox()
     cpuwidget_t = awful.tooltip({ objects = {cpuwidget}, })
     vicious.register(cpuwidget, vicious.widgets.cpu, 
			function (widget, args)
                 cpuwidget_t:set_text('<span color="#9868B1"> cpu0: ' ..args[2].. '% \n cpu1: ' ..args[3].. '% </span>')
               return  '<span color="#CDBC73">◈ ' ..args[1].. '%</span>'
               end, 3)

-- Battery widget
      batwidget = wibox.widget.textbox()
      batwidget_t = awful.tooltip({ objects = {batwidget}, })
      vicious.register(batwidget, vicious.widgets.bat, 
             function (widget, args)
                 batwidget_t:set_text('<span color="#9868B1"> ' ..args[3].. ' </span>')
               return '<span color="#CDBC73">↯ ' ..args[1].. '' ..args[2].. '</span>'
              end, 14, "BAT0")

-- Keyboard widget
kbdcfg = {}
kbdcfg.cmd = "setxkbmap"
kbdcfg.layout = { "us", "es" }
--    kbdcfg.us = "<span color='#CDBC73'>us</span>"
--    kbdcfg.es = "<span color='#CDBC73'>es</span>"
    kbdcfg.current = 1
    kbdcfg.widget = wibox.widget.textbox({ align = "right" })
    kbdcfg.widget:set_text( kbdcfg.layout[kbdcfg.current] )
    kbdcfg.switch = function ()
    kbdcfg.current = kbdcfg.current % #(kbdcfg.layout) + 1
    local t = kbdcfg.layout[kbdcfg.current]
    kbdcfg.widget:set_text( t )
    os.execute( kbdcfg.cmd .. t )
end
kbdcfg.widget:buttons(awful.util.table.join(
    awful.button({ }, 1, function () kbdcfg.switch() end )
))

-- Wifi
    wifiwidget = wibox.widget.textbox()
    wifiwidget_t = awful.tooltip({ objects = {wifiwidget}, })
    vicious.register (wifiwidget, vicious.widgets.wifi, 
        function (widget, args)
        wifiwidget_t:set_text('<span color="#9868B1"> ' ..args["{ssid}"].. ' \n mode: ' ..args["{mode}"].. ' \n chan: ' ..args["{chan}"].. ' \n sign: ' ..args["{sign}"]..  ' \n rate: ' ..args["{rate}"].. ' </span>')
    --    ' \n rate: ' ..args["{rate}"]..  ' \n linp: ' ..args["{linp}"]..
        return '<span color="#CDBC73">⇄ ' ..args["{link}"].. '%</span>'
  end, 7, "wlan0")

-- File System
  fswidget = wibox.widget.textbox()
  fswidget_t = awful.tooltip({ objects = {fswidget}, })
  vicious.register(fswidget, vicious.widgets.fs,
    function (widget, args)
      fswidget_t:set_text('<span color="#9868B1">used: ' ..args["{/ used_gb}"].. '/' ..args["{/ size_gb}"].. 'gb </span>')
      return '<span color="#CDBC73">◕ ' ..args["{/ avail_gb}"].. 'gb</span>'
    end, 61)

-- Uptime
  uptimewidget = wibox.widget.textbox()
  uptimewidget_t = awful.tooltip({ objects = {uptimewidget}, })
  vicious.register(uptimewidget, vicious.widgets.uptime,
    function (widget, args)
      uptimewidget_t:set_text('<span color="#9868B1"> ' ..args[1].. 'd ' ..args[2].. ':' ..args[3].. ' </span>')
      return string.format('<span color="#CDBC73">⇑ ' ..args[1].. 'd</span>')
    end, 61)

-- Volume Widget
    volumecfg = {}
    volumecfg.cardid  = 0
    volumecfg.channel = "Master"
    volumecfg.widget = wibox.widget.textbox({ align = "right" })
        -- volumecfg_t = awful.tooltip({ objects = { volumecfg.widget },})
        -- volumecfg_t:set_text("volume")
        -- command must start with a space!
     volumecfg.mixercommand = function (command)
           local fd = io.popen("amixer -c " .. volumecfg.cardid .. command)
           local status = fd:read("*all")
           fd:close()    
           local volume = string.match(status, "(%d?%d?%d)%%")
           volume = string.format("% 3d", volume)
           status = string.match(status, "%[(o[^%]]*)%]")
           if string.find(status, "on", 1, true) then
                   volume = "<span color='#CDBC73'>◄ " .. volume .. "</span>"
           else
                   volume = "<span color='#CDBC73'>⋪ " .. volume .. "</span>"
           end
           volumecfg.widget:set_text( volume )
    end
    volumecfg.update = function ()
           volumecfg.mixercommand(" sget " .. volumecfg.channel)
    end
    volumecfg.up = function ()
           volumecfg.mixercommand(" sset " .. volumecfg.channel .. " 1%+")
    end
    volumecfg.down = function ()
           volumecfg.mixercommand(" sset " .. volumecfg.channel .. " 1%-")
    end
    volumecfg.toggle = function ()
           volumecfg.mixercommand(" sset " .. volumecfg.channel .. " toggle")
    end
    volumecfg.widget:buttons({
           button({ }, 4, function () volumecfg.up() end),
           button({ }, 5, function () volumecfg.down() end),
           button({ }, 1, function () volumecfg.toggle() end)
    })
    volumecfg.update()
    
-- Date widget
    datewidget = wibox.widget.textbox()
     vicious.register(datewidget, vicious.widgets.date, '<span color="#D8D8D8"> %a. %b %d, %l:%M %p </span>', 5)

-- Create a textclock widget
    mytextclock = awful.widget.textclock({ align = "right" })
    -- Calendar widget to attach to the textclock
      require('calendar2')
       calendar2.addCalendarToWidget(datewidget)

-- Create a textclock widget
mytextclock = awful.widget.textclock()

-- 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()
    -- Create an imagebox widget which will contains an icon indicating which layout we're using.
    -- 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 wibox
    mywibox[s] = awful.wibox({ position = "top", screen = s })

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

    -- Widgets that are aligned to the right
    local right_layout = wibox.layout.fixed.horizontal()
    if s == 1 then right_layout:add(wibox.widget.systray()) end
    right_layout:add(mytextclock)
    right_layout:add(mylayoutbox[s])

    -- Now bring it all together (with the tasklist in the middle)
    local layout = wibox.layout.align.horizontal()
    layout:set_left(left_layout)
    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(
    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,           }, "Down",
        function ()
            awful.client.focus.byidx( 1)
            if client.focus then client.focus:raise() end
        end),
    awful.key({ modkey,           }, "Up",
        function ()
            awful.client.focus.byidx(-1)
            if client.focus then client.focus:raise() end
        end),
    awful.key({ modkey,           }, "a", function () mymainmenu:show() end),

    -- Layout manipulation
    awful.key({ modkey, "Shift"   }, "Down", function () awful.client.swap.byidx(  1)    end),
    awful.key({ modkey, "Shift"   }, "Up", function () awful.client.swap.byidx( -1)    end),
    awful.key({ modkey, "Control" }, "Down", function () awful.screen.focus_relative( 1) end),
    awful.key({ modkey, "Control" }, "Up", 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),

    -- 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,           }, "w",      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 ()
                        local screen = mouse.screen
                        if tags[screen][i] then
                            awful.tag.viewonly(tags[screen][i])
                        end
                  end),
        awful.key({ modkey, "Control" }, "#" .. i + 9,
                  function ()
                      local 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 = awful.client.focus.filter,
                     keys = clientkeys,
                     buttons = clientbuttons } },
    { rule = { class = "MPlayer" },
      properties = { floating = true } },
    { rule = { class = "pinentry" },
      properties = { floating = true } },
    { rule = { class = "gimp" },
      properties = { floating = true } },
    -- Set Firefox to always map on tags number 2 of screen 1.
    -- { rule = { class = "Firefox" },
    --   properties = { tag = tags[1][2] } },
}
-- }}}

-- {{{ 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))

        -- 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)
-- }}}

http://pastebin.com/X4JdkVi0

Last edited by nhare330 (2013-01-18 13:59:40)

Offline

#8 2013-01-09 00:18:46

nhare330
Member
From: Pennsylvania, USA
Registered: 2013-01-08
Posts: 9

Re: [SOLVED] Awesome is not recognizing widgets

So I went on the awesome IRC channel and asked around. They were helpful and one person looked through the whole rc.lua file for me. Turns out this usage of textbox is what caused the error:

 kbdcfg.widget = wibox.widget.textbox({ align = "right" }) 

That one was line 164, but its in there online 208 and 250 as well. All I had to do was change it to:

 kbdcfg.widget = wibox.widget.textbox() 

and it was fine. I don't know how to maintain the align right (probably when you actually call it later) but I didn't need it anyway. Thanks everyone for your help!

Offline

#9 2013-01-17 22:51:06

knuckles
Member
Registered: 2008-01-24
Posts: 13

Re: [SOLVED] Awesome is not recognizing widgets

EDIT: I used wibox as a variable name. So, wibox.whatever certainly wasn't going where I wanted it to. #FAIL

I was having the same issues as discussed above. After update to the new wibox.widget.textbox() changes, I am now having trouble with adding the widgets to my layout.

Here is the error:

 
~/.config/awesome/rc.lua:250: attempt to index field 'layout' (a nil value) 

And here is line 250:

 
local left_layout = wibox.layout.fixed.horizontal() 

I don't understand the error, it seems to me this is exactly what I should be doing.

Here is my config:
http://pastebin.com/QRYgPTzc

Thanks for any advice you can provide.

Last edited by knuckles (2013-01-18 01:38:48)

Offline

Board footer

Powered by FluxBB