mirror of
https://github.com/awesomeWM/awesome
synced 2024-11-17 07:47:41 +01:00
drawable: Use a context table as first argument to :draw()
This table contains the drawable, wibox and titlebar that we are drawing on, but also includes the screen and the DPI of that screen. This allows widgets to depend on the DPI in their rendering. Signed-off-by: Uli Schlachter <psychon@znc.in>
This commit is contained in:
parent
e5a9eef157
commit
31b69dbe1a
4 changed files with 47 additions and 6 deletions
|
@ -76,7 +76,11 @@ local function new(c, args)
|
|||
|
||||
local ret
|
||||
if not bars[position] then
|
||||
ret = drawable(d, nil, "awful.titlebar")
|
||||
local context = {
|
||||
client = c,
|
||||
position = position
|
||||
}
|
||||
ret = drawable(d, context, "awful.titlebar")
|
||||
local function update_colors()
|
||||
local args = bars[position].args
|
||||
ret:set_bg(get_color("bg", c, args))
|
||||
|
|
|
@ -24,6 +24,43 @@ local timer = require("gears.timer")
|
|||
local drawables = setmetatable({}, { __mode = 'k' })
|
||||
local wallpaper = nil
|
||||
|
||||
-- This is awful.screen.getbycoord() which we sadly cannot use from here (cyclic
|
||||
-- dependencies are bad!)
|
||||
function screen_getbycoord(x, y)
|
||||
for i = 1, screen:count() do
|
||||
local geometry = screen[i].geometry
|
||||
if x >= geometry.x and x < geometry.x + geometry.width
|
||||
and y >= geometry.y and y < geometry.y + geometry.height then
|
||||
return i
|
||||
end
|
||||
end
|
||||
return 1
|
||||
end
|
||||
|
||||
-- Get the widget context. This should always return the same table (if
|
||||
-- possible), so that our draw and fit caches can work efficiently.
|
||||
local function get_widget_context(self)
|
||||
local geom = self.drawable:geometry()
|
||||
local s = screen_getbycoord(geom.x, geom.y)
|
||||
local context = self._widget_context
|
||||
local dpi = beautiful.xresources.get_dpi(s)
|
||||
if (not context) or context.screen ~= s or context.dpi ~= dpi then
|
||||
context = {
|
||||
screen = s,
|
||||
dpi = dpi,
|
||||
drawable = self,
|
||||
widget_at = function(_, ...)
|
||||
self:widget_at(...)
|
||||
end
|
||||
}
|
||||
for k, v in pairs(self._widget_context_skeleton) do
|
||||
context[k] = v
|
||||
end
|
||||
self._widget_context = context
|
||||
end
|
||||
return context
|
||||
end
|
||||
|
||||
local function do_redraw(self)
|
||||
local surf = surface(self.drawable.surface)
|
||||
-- The surface can be nil if the drawable's parent was already finalized
|
||||
|
@ -59,7 +96,7 @@ local function do_redraw(self)
|
|||
self._widget_geometries = {}
|
||||
if self.widget and self.widget.visible then
|
||||
cr:set_source(self.foreground_color)
|
||||
self.widget:draw(self.widget_arg, cr, width, height)
|
||||
self.widget:draw(get_widget_context(self), cr, width, height)
|
||||
self:widget_at(self.widget, 0, 0, width, height)
|
||||
end
|
||||
|
||||
|
@ -229,10 +266,10 @@ local function setup_signals(_drawable)
|
|||
clone_signal("property::y")
|
||||
end
|
||||
|
||||
function drawable.new(d, widget_arg, drawable_name)
|
||||
function drawable.new(d, widget_context_skeleton, drawable_name)
|
||||
local ret = object()
|
||||
ret.drawable = d
|
||||
ret.widget_arg = widget_arg or ret
|
||||
ret._widget_context_skeleton = widget_context_skeleton
|
||||
setup_signals(ret)
|
||||
|
||||
for k, v in pairs(drawable) do
|
||||
|
|
|
@ -108,7 +108,7 @@ local function new(args)
|
|||
local ret = object()
|
||||
local w = capi.drawin(args)
|
||||
ret.drawin = w
|
||||
ret._drawable = wibox.drawable(w.drawable, ret,
|
||||
ret._drawable = wibox.drawable(w.drawable, { wibox = ret },
|
||||
"wibox drawable (" .. object.modulename(3) .. ")")
|
||||
|
||||
for k, v in pairs(wibox) do
|
||||
|
|
|
@ -41,7 +41,7 @@ function systray:draw(wibox, cr, width, height)
|
|||
else
|
||||
base = in_dir / num_entries
|
||||
end
|
||||
capi.awesome.systray(wibox.drawin, math.ceil(x), math.ceil(y),
|
||||
capi.awesome.systray(wibox.wibox.drawin, math.ceil(x), math.ceil(y),
|
||||
base, is_rotated, bg, reverse, spacing)
|
||||
end
|
||||
|
||||
|
|
Loading…
Reference in a new issue