diff --git a/bar.lua b/bar.lua index 8eab9b1..76f4bca 100644 --- a/bar.lua +++ b/bar.lua @@ -25,13 +25,12 @@ local function set_position(self) end -- Draw the menu background -local function bg_draw(self, w, cr, width, height) +local function bg_draw(self, context, cr, width, height)--w, cr, width, height) cr:save() cr:set_source(color(self._data.bg)) cr:rectangle(0,0,width,height) cr:fill() cr:restore() - self._draw(self, w, cr, width, height) end local function proxy_draw(_,...) @@ -49,8 +48,9 @@ local function setup_drawable(data) local private_data = internal.private_data internal.layout = internal.layout_func or wibox.layout.fixed.horizontal() - internal.layout._draw = internal.layout.draw - internal.layout.draw = bg_draw + + --internal.layout.draw = bg_draw --TODO Dead code? + internal.layout._data = data if internal.layout.set_spacing and data.spacing then diff --git a/base.lua b/base.lua index 54c9d9e..d653015 100644 --- a/base.lua +++ b/base.lua @@ -213,8 +213,8 @@ local function add_widget(data,widget,args) args = args or {} data._internal.has_widget = true widget._fit = widget.fit - widget.fit = function(self,width,height) - local w,h = widget._fit(self,width or 1, height or 1) + widget.fit = function(self,context,width,height) + local w,h = widget._fit(self, context, width or 1, height or 1) return args.width or w,args.height or h end @@ -239,7 +239,7 @@ local function add_widget(data,widget,args) data._internal.items[#data._internal.items+1] = item data:emit_signal("widget::added",item,widget) if data.visible then - local fit_w,fit_h = data._internal.layout:fit(9999,9999) + local fit_w,fit_h = data._internal.layout:fit({dpi=96}, 9999,9999) data.width = data._internal.width or fit_w data.height = fit_h end @@ -262,18 +262,21 @@ end -- Sum all widgets height and width local function get_widget_fit_sum(data) local h,w = 0,0 + -- TODO query this from the layout itself for k,v in ipairs(data._internal.widgets) do - local fw,fh = v.widget:fit(9999,9999) + local fw,fh = v.widget:fit({dpi=96},9999,9999) w,h = w + fw,h + fh end return w,h end local function get_widget_fit_width_sum(data) + -- TODO query this from the layout itself return get_widget_fit_sum(data) end local function get_widget_fit_height_sum(data) + -- TODO query this from the layout itself local w,h = get_widget_fit_sum(data) return h end @@ -406,7 +409,7 @@ print(beautiful.menu_border_color) data.set_visible = function(_,value) private_data.visible = value if value then - local fit_w,fit_h = data._internal.layout:fit(9999,9999) + local fit_w,fit_h = data._internal.layout:fit({dpi=96}, 9999,9999) data.width = internal.width or fit_w data.height = fit_h elseif data._tmp_menu and data._current_item then diff --git a/box.lua b/box.lua index a001a0e..edbafb2 100644 --- a/box.lua +++ b/box.lua @@ -7,8 +7,8 @@ local function set_position(data) local s = data.screen or capi.mouse.screen s = s > capi.screen.count() and 1 or s local geom = capi.screen[s].geometry - data.wibox.x = geom.x + (geom.width/2) - data.width/2 - data.wibox.y = geom.y + (geom.height/2) - data.height/2 + data.wibox.x = math.ceil(geom.x + (geom.width/2) - data.width/2) + data.wibox.y = math.ceil(geom.y + (geom.height/2) - data.height/2) end local function new(args) diff --git a/context.lua b/context.lua index 448f53d..07e81d0 100644 --- a/context.lua +++ b/context.lua @@ -43,7 +43,7 @@ local function set_geometry_real(data) local geo = data._internal._next_geometry if geo then for k,v in pairs(geo) do - data.wibox[k] = v + data.wibox[k] = math.ceil(v) end end data._internal._next_geometry = nil diff --git a/dock.lua b/dock.lua index 5e469f2..69d9967 100644 --- a/dock.lua +++ b/dock.lua @@ -78,7 +78,9 @@ local function mask(rotate,width,height,radius,offset,anti,bg,fg) end -- Do not draw over the boder, ever -local function dock_draw(self, w, cr, width, height) +local function dock_draw(self, context, cr, width, height) + + local w = context.wibox -- Generate the border surface if not self.mask or self.mask_hash ~= width*1000+height then @@ -89,7 +91,7 @@ local function dock_draw(self, w, cr, width, height) cr:save() --Draw the border - self.__draw(self, w, cr, width, height) + --self.__draw(self, context, cr, width, height) cr:set_source_surface(self.mask) cr:paint() cr:restore() @@ -103,15 +105,15 @@ local function align_wibox(w,direction,screen) local src_geom = capi.screen[screen].geometry local scr_size = src_geom[offset] + (src_geom[axis] - w[axis]) /2 - w[offset] = scr_size + w[offset] = math.ceil(scr_size) if direction == "left" then - w.x = src_geom.x + w.x = math.ceil(src_geom.x) elseif direction == "right" then - w.x = src_geom.x + src_geom.width - w.width + w.x = math.ceil(src_geom.x + src_geom.width - w.width) elseif direction == "bottom" then - w.y = src_geom.y+src_geom.height-w.height + w.y = math.ceil(src_geom.y+src_geom.height-w.height) else - w.y = src_geom.y + w.y = math.ceil(src_geom.y) end end @@ -163,7 +165,7 @@ local function adapt_size(data,w,h,screen) local max = get_max_size(data,screen) -- Get the current size, then compare and ajust - local fit_w,fit_h = data._internal.layout:fit(20,9999,true) + local fit_w,fit_h = data._internal.layout:fit({dpi=96},20,9999,true) -- Get the number of items minus the number of widgets -- This can be used to approximate the number of pixel to remove @@ -323,13 +325,13 @@ local function setup_drawable(data) data.get_x = function() return 0 end data.get_y = function() return 0 end data.get_width = function() - return internal.w and internal.w.width or data._internal.layout:fit(9999,9999,true) + return internal.w and internal.w.width or data._internal.layout:fit({dpi=96},9999,9999,true) end data.get_height = function() if internal.orientation == "horizontal" then return beautiful.default_height else - local w,h = internal.layout.fit(internal.layout,9999,9999) + local w,h = internal.layout.fit(internal.layout,{dpi=96},9999,9999) return h end end @@ -355,7 +357,7 @@ end local function setup_item(data,item,args) -- Add widgets - local f = (data._internal.layout.setup_item) or (layout.vertical.setup_item) + local f = (data._internal.layout.setup_item) or (vertical.setup_item) f(data._internal.layout,data,item,args) -- Buttons @@ -397,7 +399,7 @@ local function new(args) args.internal.layout_func = orientation == "vertical" and vertical or horizontal args.layout = args.layout or args.internal.layout_func args.item_style = args.item_style or item.style - args.item_layout = args.item_layout or item_layout +-- args.item_layout = args.item_layout or item_layout args[length_inv] = args[length_inv] or 40 -- Create the dock diff --git a/impl/alttab/init.lua b/impl/alttab/init.lua index 7926264..7677f62 100644 --- a/impl/alttab/init.lua +++ b/impl/alttab/init.lua @@ -126,8 +126,8 @@ local function new(args) if not auto_release then local pref_bg = wibox.widget.background() local pref_l = wibox.layout.align.horizontal() - pref_bg.fit = function(s,w,h) - local w2,h2 = wibox.widget.background.fit(s,w,h) + pref_bg.fit = function(s,c,w,h) + local w2,h2 = wibox.widget.background.fit(s,c,w,h) return w2,currentMenu.item_height end pref_bg:set_bg(currentMenu.bg_alternate) @@ -136,13 +136,13 @@ local function new(args) pref_l:set_first(tb2) pref_bg:set_widget(pref_l) local pref_menu,pref_menu_l = radical.bar{item_style=radical.item.style.basic} - pref_menu:add_widget(radical.widgets.separator(pref_menu,radical.widgets.separator.VERTICAL)) +-- pref_menu:add_widget(radical.widgets.separator(pref_menu,radical.widgets.separator.VERTICAL)) pref_menu:add_item{text="Exclusive"} - pref_menu:add_widget(radical.widgets.separator(pref_menu,radical.widgets.separator.VERTICAL)) +-- pref_menu:add_widget(radical.widgets.separator(pref_menu,radical.widgets.separator.VERTICAL)) pref_menu:add_item{text="12 clients"} - pref_menu:add_widget(radical.widgets.separator(pref_menu,radical.widgets.separator.VERTICAL)) +-- pref_menu:add_widget(radical.widgets.separator(pref_menu,radical.widgets.separator.VERTICAL)) pref_menu:add_item{text="All Screens"} - pref_menu:add_widget(radical.widgets.separator(pref_menu,radical.widgets.separator.VERTICAL)) +-- pref_menu:add_widget(radical.widgets.separator(pref_menu,radical.widgets.separator.VERTICAL)) pref_l:set_third(pref_menu_l) currentMenu:add_prefix_widget(pref_bg) @@ -186,7 +186,7 @@ local function new(args) l:add( button_group({client = v, field = "sticky" , focus = false, checked = function() return v.sticky end, onclick = function() v.sticky = not v.sticky end })) l:add( button_group({client = v, field = "ontop" , focus = false, checked = function() return v.ontop end, onclick = function() v.ontop = not v.ontop end })) l:add( button_group({client = v, field = "close" , focus = false, checked = function() return false end, onclick = function() v:kill() end })) - l.fit = function (s,w,h) return 5*h,h end + l.fit = function (s,c,w,h) return 5*h,h end end local underlays = reload_underlay(v) diff --git a/impl/taglist/init.lua b/impl/taglist/init.lua index 59cd04d..35b486d 100644 --- a/impl/taglist/init.lua +++ b/impl/taglist/init.lua @@ -50,11 +50,13 @@ module.buttons = { [1] = awful.tag.viewonly, -local function index_draw(self,w, cr, width, height) +local function index_draw(self, context, cr, width, height) cr:save() cr:set_source(color(self._color or beautiful.taglist_fg_prefix or beautiful.fg_normal)) local d = wibox.widget.textbox._draw or wibox.widget.textbox.draw - d(self,wibox, cr, width, height) + if d then + d(self,context, cr, width, height) + end cr:restore() end diff --git a/init.lua b/init.lua index ffa91f2..1557002 100644 --- a/init.lua +++ b/init.lua @@ -35,13 +35,13 @@ local function set_menu(self,menu,button) return bt end -local function _underlay_draw(self,w, cr, width, height) +local function _underlay_draw(self, context, cr, width, height) cr:save() local udl = underlay.draw(self._underlay,{height=height,style = self._underlay_style,bg=self._underlay_color}) cr:set_source_surface(udl,width-udl:get_width()-3) cr:paint_with_alpha(self._underlay_alpha or beautiful.underlay_alpha or 0.7) cr:restore() - self._draw_underlay(self,w, cr, width, height) + self._draw_underlay(self, context, cr, width, height) end local function set_underlay(self,udl,args) diff --git a/item/layout/horizontal.lua b/item/layout/horizontal.lua index cf46662..23262bb 100644 --- a/item/layout/horizontal.lua +++ b/item/layout/horizontal.lua @@ -100,7 +100,7 @@ function module:setup_sub_menu_arrow(item,data) if (item._private_data.sub_menu_f or item._private_data.sub_menu_m) and not data.disable_submenu_icon then if not sub_arrow then sub_arrow = wibox.widget.imagebox() --TODO, make global - sub_arrow.fit = function(box, w, h) return (sub_arrow._image and sub_arrow._image:get_width() or 0),item.height end + sub_arrow.fit = function(box, context,w, h) return (sub_arrow._image and sub_arrow._image:get_width() or 0),item.height end sub_arrow:set_image( beautiful.menu_submenu_icon ) end return sub_arrow @@ -157,15 +157,15 @@ function module.setup_event(data,item,widget) end -- Use all the space, let "align_fit" compute the right size -local function textbox_fit(box,w,h) +local function textbox_fit(box,context,w,h) return w,h end -- Force the width or compute the minimum space -local function align_fit(box,w,h) +local function align_fit(box,context,w,h) local mar = util.table.join(box._data.item_style.margins,box._data.default_item_margins) if box._item.width then return box._item.width - box._data.item_style.margins.LEFT - box._data.item_style.margins.RIGHT,h end - return box.first:fit(w,h)+wibox.widget.textbox.fit(box.second,w,h)+box.third:fit(w,h),h + return box.first:fit(context,w,h)+wibox.widget.textbox.fit(box.second,context,w,h)+box.third:fit(context,w,h),h end -- Create the actual widget @@ -217,11 +217,11 @@ local function create_item(item,data,args) -- Text local tb = wibox.widget.textbox() tb.fit = data._internal.text_fit or textbox_fit - tb.draw = function(self,w, cr, width, height) + tb.draw = function(self, context, cr, width, height) if item.underlay then module.paint_underlay(data,item,cr,width,height) end - wibox.widget.textbox.draw(self,w, cr, width, height) + wibox.widget.textbox.draw(self, context, cr, width, height) end tb:set_text(item.text) item.set_text = function (_,value) diff --git a/item/layout/icon.lua b/item/layout/icon.lua index ecdd510..1366ec8 100644 --- a/item/layout/icon.lua +++ b/item/layout/icon.lua @@ -22,11 +22,11 @@ local function icon_fit(data,...) end -local function icon_draw(self,w, cr, width, height) - local w,h = wibox.widget.imagebox.fit(self,width,height) +local function icon_draw(self, context, cr, width, height) + local w,h = wibox.widget.imagebox.fit(self,context,width,height) cr:save() cr:translate((width-w)/2,0) - wibox.widget.imagebox.draw(self,w, cr, width, height) + wibox.widget.imagebox.draw(self, context, cr, width, height) cr:restore() end @@ -57,10 +57,10 @@ local function create_item(item,data,args) if data.fkeys_prefix == true then local pref = wibox.widget.textbox() - pref.draw = function(self,w, cr, width, height) + pref.draw = function(self, context, cr, width, height) cr:set_source(color(beautiful.fg_normal)) cr:paint() - wibox.widget.textbox.draw(self,w, cr, width, height) + wibox.widget.textbox.draw(self, context, cr, width, height) end l:add(pref) m:set_left ( 0 ) @@ -78,16 +78,16 @@ local function create_item(item,data,args) l:add(text_w) if item._private_data.sub_menu_f or item._private_data.sub_menu_m then local subArrow = wibox.widget.imagebox() --TODO, make global - subArrow.fit = function(box, w, h) return subArrow._image:get_width(),item.height end + subArrow.fit = function(box, context, w, h) return subArrow._image:get_width(),item.height end subArrow:set_image( beautiful.menu_submenu_icon ) lr:add(subArrow) end - bg.fit = function(box,w,h) + bg.fit = function(box, context, w,h) -- args.y = data.height-h-data.margins.top --TODO dead code? if data._internal.layout.item_fit then - return data._internal.layout.item_fit(data,item,box,w,h) + return data._internal.layout.item_fit(data,item,box,contextw,h) else - return wibox.widget.background.fit(box,w,h) + return wibox.widget.background.fit(box,context, w,h) end return 0,0 end diff --git a/item/layout/notification.lua b/item/layout/notification.lua index f45fd22..b47a91a 100644 --- a/item/layout/notification.lua +++ b/item/layout/notification.lua @@ -75,7 +75,7 @@ function module:setup_sub_menu_arrow(item,data) if item._private_data.sub_menu_f or item._private_data.sub_menu_m then if not sub_arrow then sub_arrow = wibox.widget.imagebox() --TODO, make global - sub_arrow.fit = function(box, w, h) return sub_arrow._image:get_width(),item.height end + sub_arrow.fit = function(box, context, w, h) return sub_arrow._image:get_width(),item.height end sub_arrow:set_image( beautiful.menu_submenu_icon ) end return sub_arrow @@ -132,15 +132,15 @@ function module.setup_event(data,item,widget) end -- Use all the space, let "align_fit" compute the right size -local function textbox_fit(box,w,h) - local w2,h2 = wibox.widget.textbox.fit(box,w,h) +local function textbox_fit(box,context,w,h) + local w2,h2 = wibox.widget.textbox.fit(box,context,w,h) return w,h2 end -- Force the width or compute the minimum space -local function align_fit(box,w,h) +local function align_fit(box,context,w,h) if box._item.width then return box._item.width - box._data.item_style.margins.LEFT - box._data.item_style.margins.RIGHT,h end - return box.first:fit(w,h)+wibox.widget.textbox.fit(box.second,w,h)+box.third:fit(w,h),h + return box.first:fit(context,w,h)+wibox.widget.textbox.fit(box.second,context,w,h)+box.third:fit(context,w,h),h end -- Create the actual widget @@ -207,11 +207,11 @@ local function create_item(item,data,args) -- Text local tb4 = wibox.widget.textbox() - tb4.draw = function(self,w, cr, width, height) + tb4.draw = function(self, context, cr, width, height) if item.underlay then module.paint_underlay(data,item,cr,width,height) end - wibox.widget.textbox.draw(self,w, cr, width, height) + wibox.widget.textbox.draw(self, context, cr, width, height) end item.set_text = function (_,value) @@ -225,7 +225,7 @@ local function create_item(item,data,args) item:set_text(item.text or "") local tb2 = wibox.widget.textbox() tb2:set_text("alternate") - tb2.fit = function(s,w,h) + tb2.fit = function(s,context,w,h) return w,h end diff --git a/item/style/arrow_3d.lua b/item/style/arrow_3d.lua index 123e904..b9b6723 100644 --- a/item/style/arrow_3d.lua +++ b/item/style/arrow_3d.lua @@ -28,7 +28,7 @@ local c4 = color("#3b4249dd") local padding = 1 local p2 = 2 -local function widget_draw23(self, w, cr, width, height) +local function widget_draw23(self, context, cr, width, height) local overlay = self._item and self._item.overlay if overlay then overlay(self._item._menu,self._item,cr,width,height) @@ -62,7 +62,10 @@ local function widget_draw23(self, w, cr, width, height) create_path(cr,1,height,1) cr:stroke() cr:restore() - self.__drawbasic(self,w, cr, width, height) + + if self.__drawbasic then + self.__drawbasic(self, context, cr, width, height) + end end local function new_set_bg(self,bg) diff --git a/item/style/arrow_alt.lua b/item/style/arrow_alt.lua index f36b175..f53c073 100644 --- a/item/style/arrow_alt.lua +++ b/item/style/arrow_alt.lua @@ -76,8 +76,8 @@ module.get_beg_arrow = function(args) return img end -local function draw_real(self, w, cr, width, height) --- wibox.widget.background.draw(self, w, cr, width, height) +local function draw_real(self, context, cr, width, height) +-- wibox.widget.background.draw(self, context, cr, width, height) cr:save() -- This item style require negative padding, this is a little dangerous to @@ -94,9 +94,15 @@ local function draw_real(self, w, cr, width, height) cr:reset_clip() cr:fill() cr:restore() - self._draw(self, w, cr, width, height) - self.widget:draw(w, cr, width, height) + if self._draw then + self._draw(self, context, cr, width, height) + end + + if self.widget.draw then + self.widget:draw(context, cr, width, height) + end + local overlay = self._item and self._item.overlay if overlay then overlay(self._item._menu,self._item,cr,width,height) diff --git a/item/style/arrow_prefix.lua b/item/style/arrow_prefix.lua index adddf22..481a249 100644 --- a/item/style/arrow_prefix.lua +++ b/item/style/arrow_prefix.lua @@ -15,7 +15,7 @@ local module = { } } -local function prefix_draw(self, w, cr, width, height) +local function prefix_draw(self, context, cr, width, height) cr:save() -- This item style require negative padding, this is a little dangerous to @@ -32,21 +32,23 @@ local function prefix_draw(self, w, cr, width, height) cr:reset_clip() cr:fill() cr:restore() - self._draw(self, w, cr, width, height) + if self._draw then + self._draw(self, context, cr, width, height) + end end -local function prefix_fit(box,w,h) - local width,height = box._fit(box,w,h) +local function prefix_fit(box,context,w,h) + local width,height = box._fit(box,context,w,h) return width + h/2 + h/6,height end -local function suffix_fit(box,w,h) - local width,height = box._fit(box,w,h) +local function suffix_fit(box,context,w,h) + local width,height = box._fit(box,context,w,h) return width + h/2 + h/6,height end -local function widget_draw(self, w, cr, width, height) - self:_drawprefix(w, cr, width, height) +local function widget_draw(self, context, cr, width, height) + self:_drawprefix(context, cr, width, height) local overlay = self._item and self._item.overlay if overlay then overlay(self._item._menu,self._item,cr,width,height) diff --git a/item/style/arrow_single.lua b/item/style/arrow_single.lua index 475efb4..686841e 100644 --- a/item/style/arrow_single.lua +++ b/item/style/arrow_single.lua @@ -16,7 +16,7 @@ local module = { } -local function suffix_draw(self, w, cr, width, height) +local function suffix_draw(self, context, cr, width, height) cr:save() cr:move_to(height/2,0) cr:line_to(width-height/2,0) @@ -27,7 +27,11 @@ local function suffix_draw(self, w, cr, width, height) cr:line_to(height/2,0) cr:close_path() cr:clip() - wibox.widget.background.draw(self, w, cr, width, height) + + if wibox.widget.background.draw then + wibox.widget.background.draw(self, context, cr, width, height) + end + local overlay = self._item and self._item.overlay if overlay then overlay(self._item._menu,self._item,cr,width,height) diff --git a/item/style/basic.lua b/item/style/basic.lua index 62973bb..e411fd7 100644 --- a/item/style/basic.lua +++ b/item/style/basic.lua @@ -2,6 +2,7 @@ local setmetatable = setmetatable local print = print local pairs=pairs local base = require( "radical.base" ) +local wibox = require("wibox" ) local module = { margins = { @@ -12,8 +13,11 @@ local module = { } } -local function widget_draw23(self, w, cr, width, height) - self.__drawbasic(self,w, cr, width, height) +local function widget_draw23(self, context, cr, width, height) + if wibox.widget.background.draw then + wibox.widget.background.draw(self, context, cr, width, height) + end + local overlay = self._item and self._item.overlay if overlay then overlay(self._item._menu,self._item,cr,width,height) @@ -23,11 +27,7 @@ end local function draw(item,args) local args = args or {} - if not item.widget._overlay_init and not item.widget._draw then - item.widget.__drawbasic = item.widget.draw - item.widget.draw = widget_draw23 - item.widget._overlay_init = true - end + item.widget.draw = widget_draw23 local state = item.state or {} local current_state = state._current_key or nil diff --git a/item/style/classic.lua b/item/style/classic.lua index a13261e..c5422c8 100644 --- a/item/style/classic.lua +++ b/item/style/classic.lua @@ -3,6 +3,7 @@ local base = require( "radical.base" ) local color = require( "gears.color" ) local cairo = require( "lgi" ).cairo local beautiful = require( "beautiful" ) +local wibox = require("wibox" ) local print = print local module = { @@ -27,8 +28,12 @@ local function gen(item_height,bg_color,border_color) return cairo.Pattern.create_for_surface(img) end -local function widget_draw(self, w, cr, width, height) - self:_draw2(w, cr, width, height) +local function widget_draw(self, context, cr, width, height) + + if wibox.widget.background.draw then + wibox.widget.background.draw(self, context, cr, width, height) + end + local overlay = self._item and self._item.overlay if overlay then overlay(self._item._menu,self._item,cr,width,height) @@ -39,11 +44,7 @@ local function draw(item,args) local args = args or {} local col = args.color - if not item.widget._overlay_init then - item.widget._draw2 = item.widget.draw - item.widget.draw = widget_draw - item.widget._overlay_init = true - end + item.widget.draw = widget_draw local ih = item.height or 1 if not focussed or not focussed[ih] then diff --git a/item/style/holo.lua b/item/style/holo.lua index 7071258..0b8de9b 100644 --- a/item/style/holo.lua +++ b/item/style/holo.lua @@ -32,7 +32,7 @@ local function gen(width,height,bg_color,border_color, pos) return cairo.Pattern.create_for_surface(img) end -local function widget_draw(self, w, cr, width, height) +local function widget_draw(self, context, cr, width, height) local state = self._item.state or {} local current_state = state._current_key or "" @@ -56,7 +56,10 @@ local function widget_draw(self, w, cr, width, height) self._last_state = current_state end - self:_drawrounded(w, cr, width, height) + if self._drawrounded then + self:_drawrounded(context, cr, width, height) + end + local overlay = self._item and self._item.overlay if overlay then overlay(self._item._menu,self._item,cr,width,height) diff --git a/item/style/init.lua b/item/style/init.lua index 7b1abda..b087b73 100644 --- a/item/style/init.lua +++ b/item/style/init.lua @@ -15,4 +15,4 @@ return { arrow_3d = require("radical.item.style.arrow_3d" ), slice_prefix = require("radical.item.style.slice_prefix" ), line_3d = require("radical.item.style.line_3d" ), -} \ No newline at end of file +} diff --git a/item/style/line_3d.lua b/item/style/line_3d.lua index 987b710..eec359b 100644 --- a/item/style/line_3d.lua +++ b/item/style/line_3d.lua @@ -15,8 +15,8 @@ local module = { } } -local function widget_draw(self, w, cr, width, height) - self.__drawbasic(self,w, cr, width, height) +local function widget_draw(self, context, cr, width, height) + self.__drawbasic(self,context, cr, width, height) cr:set_source(self.col1) cr:rectangle(0,3,1,height-6) cr:fill() @@ -37,7 +37,7 @@ local function draw(item,args) item.widget.draw = widget_draw item.widget._overlay_init = true item.widget._item = item - + -- Build the 2 item border colors, this item_style doesn't support gradient -- or patterns item.widget.col1 = color(item.item_border_color or item.border_color or beautiful.border_color) diff --git a/item/style/rounded.lua b/item/style/rounded.lua index 0694de6..e651dcc 100644 --- a/item/style/rounded.lua +++ b/item/style/rounded.lua @@ -3,6 +3,7 @@ local math = math local base = require( "radical.base" ) local color = require( "gears.color" ) local cairo = require( "lgi" ).cairo +local wibox = require("wibox" ) local print = print local module = { @@ -45,7 +46,7 @@ local function gen(width,height,bg_color,border_color,item,shadow) return cairo.Pattern.create_for_surface(img) end -local function widget_draw(self, w, cr, width, height,shadow) +local function widget_draw(self, context, cr, width, height,shadow) local item = self._item local state = item.state or {} local current_state = state._current_key or "" @@ -69,14 +70,17 @@ local function widget_draw(self, w, cr, width, height,shadow) self._last_state = current_state end - self:_drawrounded(w, cr, width, height) + if wibox.widget.background.draw then + wibox.widget.background.draw(self, context, cr, width, height) + end + local overlay = item and item.overlay if overlay then overlay(item._menu,item,cr,width,height) end end -local function draw_width_shadow(self, w, cr, width, height) +local function draw_width_shadow(self, context, cr, width, height) cr:save() cr:reset_clip() @@ -90,7 +94,7 @@ local function draw_width_shadow(self, w, cr, width, height) end cr:restore() - widget_draw(self, w, cr, width, height,true) + widget_draw(self, context, cr, width, height,true) end local function common(item,args) @@ -110,9 +114,9 @@ end local function draw(item,args) local args = args or {} + item.widget.draw = widget_draw + if not item.widget._overlay_init then - item.widget._drawrounded = item.widget.draw - item.widget.draw = widget_draw item.widget._overlay_init = true item.widget._item = item end @@ -124,9 +128,9 @@ end local function shadow(item,args) local args = args or {} + item.widget.draw = draw_width_shadow + if not item.widget._overlay_init then - item.widget._drawrounded = item.widget.draw - item.widget.draw = draw_width_shadow item.widget._overlay_init = true item.widget._item = item end diff --git a/item/style/slice_prefix.lua b/item/style/slice_prefix.lua index f219077..e3342d4 100644 --- a/item/style/slice_prefix.lua +++ b/item/style/slice_prefix.lua @@ -15,7 +15,7 @@ local module = { } } -local function prefix_draw(self, w, cr, width, height) +local function prefix_draw(self, context, cr, width, height) cr:save() -- This item style require negative padding, this is a little dangerous to @@ -30,21 +30,27 @@ local function prefix_draw(self, w, cr, width, height) cr:reset_clip() cr:fill() cr:restore() - self._draw(self, w, cr, width, height) + + if self._draw then + self._draw(self, context, cr, width, height) + end end -local function prefix_fit(box,w,h) - local width,height = box._fit(box,w,h) +local function prefix_fit(box,context,w,h) + local width,height = box._fit(box,context,w,h) return width + h/2,height end -local function suffix_fit(box,w,h) - local width,height = box._fit(box,w,h) +local function suffix_fit(box,context,w,h) + local width,height = box._fit(box,context,w,h) return width + h/2 + h/6,height end -local function widget_draw(self, w, cr, width, height) - self:_drawprefix(w, cr, width, height) +local function widget_draw(self, context, cr, width, height) + if self._drawprefix then + self:_drawprefix(context, cr, width, height) + end + local overlay = self._item and self._item.overlay if overlay then overlay(self._item._menu,self._item,cr,width,height) diff --git a/item/style/subtle.lua b/item/style/subtle.lua index d4326b4..970411b 100644 --- a/item/style/subtle.lua +++ b/item/style/subtle.lua @@ -39,7 +39,7 @@ local function gen(w,h,bg_color,border_color) return cairo.Pattern.create_for_surface(img) end -local function widget_draw(self, w, cr, width, height) +local function widget_draw(self, context, cr, width, height) local state = self._item.state or {} local current_state = state._current_key or "" @@ -63,7 +63,10 @@ local function widget_draw(self, w, cr, width, height) self._last_state = current_state end - self:_drawrounded(w, cr, width, height) + if self._drawrounded then + self:_drawrounded(context, cr, width, height) + end + local overlay = self._item and self._item.overlay if overlay then overlay(self._item._menu,self._item,cr,width,height) diff --git a/layout/horizontal.lua b/layout/horizontal.lua index 0f90481..c4f9efb 100644 --- a/layout/horizontal.lua +++ b/layout/horizontal.lua @@ -109,7 +109,7 @@ function module:setup_item(data,item,args) text_w:set_markup(value) end if data.auto_resize then - local fit_w,fit_h = text_w:fit(999,9999) + local fit_w,fit_h = text_w:fit({dpi=96},999,9999) local is_largest = item == data._internal.largest_item_h --TODO find new largest is item is smaller if not data._internal.largest_item_h_v or data._internal.largest_item_h_v < fit_h then @@ -144,8 +144,8 @@ local function new(data) base = require( "radical.base" ) end local l = wibox.layout.fixed.horizontal() - l.fit = function(a1,a2,a3,force_values) - local result,r2 = wibox.layout.fixed.fit(a1,force_values and a2 or 99999,force_values and a3 or 99999) + l.fit = function(self,context,w,h,force_values) --TODO use the context instead of extra argument + local result,r2 = wibox.layout.fixed.fit(self,context,force_values and w or 99999,force_values and h or 99999) local w,h if data.auto_resize and data._internal.largest_item_h then w,h = data.rowcount*(data.item_width or data.default_width),data._internal.largest_item_h_v > data.item_height and data._internal.largest_item_h_v or data.item_height diff --git a/layout/vertical.lua b/layout/vertical.lua index 1e1189d..ab85cd2 100644 --- a/layout/vertical.lua +++ b/layout/vertical.lua @@ -55,7 +55,7 @@ end local function item_fit(data,item,self,width,height) local w, h = 0,0--item._internal.cache_w or 1,item._internal.cache_h or 1 if data.visible then - w, h = item._private_data._fit(self,width,height) + w, h = item._private_data._fit({},self,{},width,height) item._internal.pix_cache = {} --Clear the pimap cache end @@ -67,7 +67,7 @@ end local function cache_pixmap(item) item._internal.pix_cache = {} item.widget._draw = item.widget.draw - item.widget.draw = function(self,w, cr, width, height) + item.widget.draw = function(self, context, cr, width, height) if not w.visible or item._hidden then return end if item._internal.pix_cache[10*width+7*height+(item.selected and 8888 or 999)] then cr:set_source_surface(item._internal.pix_cache[10*width+7*height+(item.selected and 8888 or 999)]) @@ -75,7 +75,7 @@ local function cache_pixmap(item) else local img5 = cairo.ImageSurface.create(cairo.Format.ARGB32, width, height) local cr5 = cairo.Context(img5) - item.widget._draw(self,w, cr5, width, height) + item.widget._draw(self, context, cr5, width, height) cr:set_source_surface(img5) cr:paint() item._internal.pix_cache[10*width+7*height+(item.selected and 8888 or 999)] = img5 @@ -87,13 +87,13 @@ end function module:setup_text(item,data,text_w) local text_w = item._internal.text_w - text_w.draw = function(self,w, cr, width, height) + text_w.draw = function(self,context, cr, width, height) if item.underlay then horizontal_item_layout.paint_underlay(data,item,cr,width,height) end - wibox.widget.textbox.draw(self,w, cr, width, height) + wibox.widget.textbox.draw(self, context, cr, width, height) end - text_w.fit = function(self,width,height) return width,height end + text_w.fit = function(self,context,width,height) return width,height end item.set_text = function (_,value) if data.disable_markup then @@ -183,7 +183,7 @@ function module:setup_item(data,item,args) -- Compute the minimum width if data.auto_resize and item._internal.margin_w then - local fit_w,fit_h = wibox.layout.margin.fit(item._internal.margin_w,9999,9999) + local fit_w = wibox.layout.margin.fit(item._internal.margin_w,{},9999,9999) local is_largest = item == data._internal.largest_item_w if fit_w < 1000 and (not data._internal.largest_item_w_v or data._internal.largest_item_w_v < fit_w) then data._internal.largest_item_w = item @@ -202,8 +202,8 @@ local function compute_geo(data,width,height,force_values) local visblerow = data.visible_row_count - local sw,sh = data._internal.suf_l:fit(9999,9999) - local pw,ph = data._internal.pref_l:fit(9999,9999) + local sw,sh = data._internal.suf_l:fit({dpi=96},9999,9999) + local pw,ph = data._internal.pref_l:fit({dpi=96},9999,9999) if not data._internal.has_widget then return w,(total and total > 0 and total or visblerow*data.item_height) + ph + sh else @@ -217,8 +217,8 @@ local function new(data) if not base then base = require( "radical.base" ) end - local l,real_l = wibox.layout.fixed.vertical(),nil - real_l = wibox.layout.fixed.vertical() + local l = wibox.layout.fixed.vertical() + local real_l = wibox.layout.fixed.vertical() local pref_l,suf_l = wibox.layout.fixed.vertical(),wibox.layout.fixed.vertical() real_l:add(pref_l) if data.max_items then @@ -239,9 +239,9 @@ local function new(data) suf_l:add(data._internal.scroll_w["down"]) end end - real_l.fit = function(a1,a2,a3,force_values) + real_l.fit = function(self,context,o_w,o_h,force_values) if not data.visible then return 1,1 end - local w,h = compute_geo(data,a2,a3,force_values) + local w,h = compute_geo(data,o_w,o_h,force_values) data:emit_signal("layout_size",w,h) return w,h end @@ -287,7 +287,7 @@ local function new(data) data:connect_signal("suffix_widget::added",function(_,widget,args) suf_l:add(widget) end) - data._internal.text_fit = function(self,width,height) return width,height end + data._internal.text_fit = function(self,context,width,height) return width,height end return real_l end diff --git a/style/arrow.lua b/style/arrow.lua index a760f68..4e9347e 100644 --- a/style/arrow.lua +++ b/style/arrow.lua @@ -189,10 +189,10 @@ local function get_arrow_x(data) return data._arrow_x end --- Draw the border on top of items, prevent sharp corners from messing with the border -local function draw_border(self,w, cr, width, height) - -- Draw the widget content - self.__draw(self,w, cr, width, height) +-- As the menus have a rounded border, rectangle elements will draw over the +-- corner border. To fix this, this method re-draw the border on top of the +-- content +local function after_draw_children(self, context, cr, width, height) local data = self._data -- Create a matrix to rotate the border @@ -217,7 +217,7 @@ local function draw(data,args) -- Prevent sharp corners from being over the border if data._internal.margin then data._internal.margin.__draw = data._internal.margin.draw - data._internal.margin.draw = draw_border + data._internal.margin.after_draw_children = after_draw_children if not data._internal.margin._data then data._internal.margin._data = data end diff --git a/style/grouped_3d.lua b/style/grouped_3d.lua index d38856a..0c36ff0 100644 --- a/style/grouped_3d.lua +++ b/style/grouped_3d.lua @@ -23,20 +23,25 @@ local function rounded_rect(cr,x,y,w,h,radius) cr:restore() end -local function draw2(self,w, cr, width, height) +local function draw2(self, context, cr, width, height) cr:save() local mx,my = self.left or 0, self.top or 0 local mw,mh = width - mx - (self.right or 0), height - my - (self.bottom or 0) rounded_rect(cr,mx,my,mw,mh,6) local path = cr:copy_path() cr:clip() - self.___draw(self,w, cr, width, height) + + if self.___draw then + self.___draw(self, context, cr, width, height) + end + cr:append_path(path) cr:set_source(color(self.data.border_color)) cr:stroke() cr:restore() end +--TODO unported local function draw(data) if not data._internal then return end diff --git a/tooltip.lua b/tooltip.lua index c2732d6..e6676c9 100644 --- a/tooltip.lua +++ b/tooltip.lua @@ -152,8 +152,8 @@ local function new(widget,text, args) data.wibox:connect_signal("mouse::leave",hide_tooltip) local relative_to_parent = rel_parent(data.wibox,args2,args) - data.wibox.x = args2.x or args.x or relative_to_parent.x or capi.mouse.coords().x - data.wibox.width/2 -5 - data.wibox.y = args2.y or args.y or relative_to_parent.y or ((not vertical) and capi.screen[capi.mouse.screen].geometry.height - 16 - 25 or 16) + data.wibox.x = math.floor(args2.x or args.x or relative_to_parent.x or capi.mouse.coords().x - data.wibox.width/2 -5) + data.wibox.y = math.floor(args2.y or args.y or relative_to_parent.y or ((not vertical) and capi.screen[capi.mouse.screen].geometry.height - 16 - 25 or 16)) data.wibox.visible = true if args2.parent and args2.parent.drawable and data.drawable ~= args2.parent.drawable then data.drawable = args2.parent.drawable diff --git a/widgets/filter.lua b/widgets/filter.lua index d87e46f..dd9f750 100644 --- a/widgets/filter.lua +++ b/widgets/filter.lua @@ -14,7 +14,7 @@ local function new(data) bg:set_bg(data.bg_highlight) bg:set_widget(filter_tb) filter_tb:set_markup(" ".. data.filter_prefix .." "..data.filter_placeholder) - filter_tb.fit = function(tb,width,height) + filter_tb.fit = function(tb,context,width,height) return width,data.item_height end filter_tb:set_underlay(data.filter_underlay,{alpha=data.filter_underlay_alpha,color=data.filter_underlay_color}) diff --git a/widgets/fkey.lua b/widgets/fkey.lua index 8bae5e5..0d75497 100644 --- a/widgets/fkey.lua +++ b/widgets/fkey.lua @@ -24,7 +24,7 @@ end local function new(data,item) local pref = wibox.widget.textbox() - pref.draw = function(self,w, cr, width, height) + pref.draw = function(self, context, cr, width, height) local padding = height/4 local key = item._internal.f_key if not keys[height] then @@ -55,7 +55,7 @@ local function new(data,item) cr:set_source_surface((key and key > 12 and keys[height][0]) and keys[height][0] or keys[height][key]) cr:paint() end - pref.fit = function(self,width,height) + pref.fit = function(self,context,width,height) return max_width,data.item_height end pref:set_markup("F11") diff --git a/widgets/piechart.lua b/widgets/piechart.lua index a646774..aeadfee 100644 --- a/widgets/piechart.lua +++ b/widgets/piechart.lua @@ -38,7 +38,7 @@ local function compute_sum(data) return ret end -local function draw(self, w, cr, width, height) +local function draw(self, context, cr, width, height) if not self._data then return end -- Load from cache diff --git a/widgets/scroll.lua b/widgets/scroll.lua index 40b7618..be38c9f 100644 --- a/widgets/scroll.lua +++ b/widgets/scroll.lua @@ -50,13 +50,13 @@ local function new(data) for k,v in ipairs({"up","down"}) do local ib = wibox.widget.imagebox() ib:set_image(module[v]()) - ib.fit = function(tb,width,height) + ib.fit = function(tb,context,width,height) if scroll_w.visible == false then return 0,0 end return width,data.item_height end - ib.draw = function(self,wibox, cr, width, height) + ib.draw = function(self, context, cr, width, height) if width > 0 and height > 0 then cr:set_source_surface(self._image, width/2 - self._image:get_width()/2, 0) end diff --git a/widgets/separator.lua b/widgets/separator.lua index 6726af0..8d06302 100644 --- a/widgets/separator.lua +++ b/widgets/separator.lua @@ -7,7 +7,7 @@ local beautiful = require( "beautiful" ) local module = {HORIZONTAL=1,VERTICAL=2} -local function draw(self, w, cr, width, height) +local function draw(self, context, cr, width, height) cr:save() cr:set_source(self._color) if self.direction == module.VERTICAL then @@ -19,7 +19,7 @@ local function draw(self, w, cr, width, height) cr:restore() end -local function fit(box, w, h) +local function fit(box, context, w, h) local direction = box.direction or w > h and module.HORIZONTAL or module.VERTICAL return direction == module.VERTICAL and 5 or w,direction == module.VERTICAL and h or 5 end diff --git a/widgets/table.lua b/widgets/table.lua index dfacf9a..d9642eb 100644 --- a/widgets/table.lua +++ b/widgets/table.lua @@ -4,7 +4,7 @@ local color = require("gears.color") local ipairs = ipairs local print = print -local function textbox_draw(self, w, cr, width, height) +local function textbox_draw(self, context, cr, width, height) cr:save() cr:set_source(color(beautiful.menu_border_color or beautiful.border_normal or beautiful.border_color)) cr:rectangle(0,0,width,1) @@ -12,14 +12,14 @@ local function textbox_draw(self, w, cr, width, height) cr:stroke() cr:restore() cr:set_source(color(beautiful.menu_fg_normal or beautiful.fg_normal)) - wibox.widget.textbox.draw(self, w, cr, width, height) + wibox.widget.textbox.draw(self, context, cr, width, height) end -local function create_textbox(w,col_c,col,has_v_header,row_height) +local function create_textbox(context,col_c,col,has_v_header,row_height) local t = wibox.widget.textbox() - t.fit = function(s,w2,h) - local fw,fh = wibox.widget.textbox.fit(s,w2,h) + t.fit = function(s,context,w2,h) + local fw,fh = wibox.widget.textbox.fit(s,context,w2,h) return (w2/(col_c+2 - col)),row_height or fh end t.draw = textbox_draw @@ -27,19 +27,19 @@ local function create_textbox(w,col_c,col,has_v_header,row_height) return t end -local function create_h_header(main_l,cols,w,args) +local function create_h_header(main_l,cols,context,args) if args.h_header then local bg = wibox.widget.background() local row_l = wibox.layout.fixed.horizontal() bg:set_bg(beautiful.menu_table_bg_header or beautiful.menu_bg_header or beautiful.fg_normal) bg:set_widget(row_l) if args.v_header then - local t = create_textbox(w,cols,1,args.v_header ~= nil,args.row_height) + local t = create_textbox(context,cols,1,args.v_header ~= nil,args.row_height) t:set_markup("--") row_l:add(t) end for i=1,cols do - local t = create_textbox(w,cols,i+1,args.v_header ~= nil,args.row_height) + local t = create_textbox(context,cols,i+1,args.v_header ~= nil,args.row_height) t:set_markup("".. (args.h_header[i] or "-") .."") row_l:add(t) end @@ -58,9 +58,9 @@ local function new(content,args) end local main_l = wibox.layout.fixed.vertical() local w =200 - main_l.fit = function(self,width,height) + main_l.fit = function(self,context,width,height) w = width - return wibox.layout.fixed.fit(self,width,height) + return wibox.layout.fixed.fit(self,context,width,height) end create_h_header(main_l,cols,w,args)