--------------------------------------------------------------------------- -- @author Uli Schlachter -- @copyright 2010 Uli Schlachter -- @release @AWESOME_VERSION@ -- @classmod wibox --------------------------------------------------------------------------- local capi = { drawin = drawin, root = root, awesome = awesome, screen = screen } local setmetatable = setmetatable local pairs = pairs local type = type local object = require("gears.object") local grect = require("gears.geometry").rectangle local beautiful = require("beautiful") local base = require("wibox.widget.base") --- This provides widget box windows. Every wibox can also be used as if it were -- a drawin. All drawin functions and properties are also available on wiboxes! -- wibox local wibox = { mt = {}, object = {} } wibox.layout = require("wibox.layout") wibox.widget = require("wibox.widget") wibox.drawable = require("wibox.drawable") wibox.hierarchy = require("wibox.hierarchy") local force_forward = { shape_bounding = true, shape_clip = true, } --@DOC_wibox_COMMON@ function wibox:set_widget(widget) self._drawable:set_widget(widget) end function wibox:get_widget() return self._drawable.widget end wibox.setup = base.widget.setup function wibox:set_bg(c) self._drawable:set_bg(c) end function wibox:set_bgimage(image, ...) self._drawable:set_bgimage(image, ...) end function wibox:set_fg(c) self._drawable:set_fg(c) end function wibox:find_widgets(x, y) return self._drawable:find_widgets(x, y) end function wibox:get_screen() local sgeos = {} for s in capi.screen do sgeos[s] = s.geometry end return grect.get_closest_by_coord(sgeos, self.x, self.y) end function wibox:set_screen(s) s = capi.screen[s or 1] if s ~= self:get_screen() then self.x = s.geometry.x self.y = s.geometry.y end end for _, k in pairs{ "buttons", "struts", "geometry", "get_xproperty", "set_xproperty" } do wibox[k] = function(self, ...) return self.drawin[k](self.drawin, ...) end end local function setup_signals(_wibox) local obj local function clone_signal(name) _wibox:add_signal(name) -- When "name" is emitted on wibox.drawin, also emit it on wibox obj:connect_signal(name, function(_, ...) _wibox:emit_signal(name, ...) end) end obj = _wibox.drawin clone_signal("property::border_color") clone_signal("property::border_width") clone_signal("property::buttons") clone_signal("property::cursor") clone_signal("property::height") clone_signal("property::ontop") clone_signal("property::opacity") clone_signal("property::struts") clone_signal("property::visible") clone_signal("property::width") clone_signal("property::x") clone_signal("property::y") clone_signal("property::geometry") clone_signal("property::shape_bounding") clone_signal("property::shape_clip") obj = _wibox._drawable clone_signal("button::press") clone_signal("button::release") clone_signal("mouse::enter") clone_signal("mouse::leave") clone_signal("mouse::move") clone_signal("property::surface") end local function new(args) args = args or {} local ret = object() local w = capi.drawin(args) -- lua 5.1 and luajit have issues with self referencing loops local avoid_leak = setmetatable({ret},{__mode="v"}) function w.get_wibox() return avoid_leak[1] end ret.drawin = w ret._drawable = wibox.drawable(w.drawable, { wibox = ret }, "wibox drawable (" .. object.modulename(3) .. ")") for k, v in pairs(wibox) do if type(v) == "function" then ret[k] = v end end setup_signals(ret) ret.draw = ret._drawable.draw ret.widget_at = function(_, widget, x, y, width, height) return ret._drawable:widget_at(widget, x, y, width, height) end -- Set the default background ret:set_bg(args.bg or beautiful.bg_normal) ret:set_fg(args.fg or beautiful.fg_normal) -- Add __tostring method to metatable. local mt = {} local orig_string = tostring(ret) mt.__tostring = function() return string.format("wibox: %s (%s)", tostring(ret._drawable), orig_string) end ret = setmetatable(ret, mt) -- Make sure the wibox is drawn at least once ret.draw() -- If a value is not found, look in the drawin setmetatable(ret, { __index = function(self, k) if rawget(self, "get_"..k) then return self["get_"..k](self) else return w[k] end end, __newindex = function(self, k,v) if rawget(self, "set_"..k) then self["set_"..k](self, v) elseif w[k] ~= nil or force_forward[k] then w[k] = v else rawset(self, k, v) end end }) return ret end capi.drawin.add_signal("property::get_wibox") --- Redraw a wibox. You should never have to call this explicitely because it is -- automatically called when needed. -- @param wibox -- @function draw function wibox.mt:__call(...) return new(...) end -- Extend the luaobject object.properties(capi.drawin, { getter_class = wibox.object, setter_class = wibox.object, auto_emit = true, }) return setmetatable(wibox, wibox.mt) -- vim: filetype=lua:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:textwidth=80