Add default_item_margins and default_margins

This commit is contained in:
Emmanuel Lepage Vallee 2014-10-17 23:52:26 -04:00
parent 9d8bcc3882
commit 1a7630e437
13 changed files with 90 additions and 44 deletions

View File

@ -203,6 +203,8 @@ Multiple items can have multiple sets of options.
| disable_submenu_icon| Do not show the submenu icon (arrow) | boolean | | disable_submenu_icon| Do not show the submenu icon (arrow) | boolean |
| margins | Read/Write table (left,right,top and bottom) | dynamic table | | margins | Read/Write table (left,right,top and bottom) | dynamic table |
| visible_row_count | Number of visible items -(#max-(#total-#filtered)) | number | | visible_row_count | Number of visible items -(#max-(#total-#filtered)) | number |
| default_item_margins| Default margins for items ({left=1,right=1...}) | array of direction |
| default_margins | Default margins for the menu ({left=1,right=1...}) | array of direction |
###Item options ###Item options

26
bar.lua
View File

@ -12,6 +12,7 @@ local checkbox = require( "radical.widgets.checkbox" )
local item_style = require( "radical.item.style.arrow_single" ) local item_style = require( "radical.item.style.arrow_single" )
-- local vertical = require( "radical.layout.vertical" ) -- local vertical = require( "radical.layout.vertical" )
local item_layout= require( "radical.item.layout.horizontal" ) local item_layout= require( "radical.item.layout.horizontal" )
local margins2 = require("radical.margins" )
local capi,module = { mouse = mouse , screen = screen, keygrabber = keygrabber },{} local capi,module = { mouse = mouse , screen = screen, keygrabber = keygrabber },{}
@ -47,11 +48,11 @@ local function setup_drawable(data)
local internal = data._internal local internal = data._internal
local private_data = internal.private_data local private_data = internal.private_data
internal.layout = internal.layout_func or wibox.layout.fixed.horizontal() internal.layout = internal.layout_func or wibox.layout.fixed.horizontal()
internal.layout._draw = internal.layout.draw internal.layout._draw = internal.layout.draw
internal.layout.draw = bg_draw internal.layout.draw = bg_draw
internal.layout._data = data internal.layout._data = data
--Getters --Getters
data.get_x = function() return 0 end data.get_x = function() return 0 end
data.get_y = function() return 0 end data.get_y = function() return 0 end
@ -59,7 +60,16 @@ internal.layout._data = data
data.get_height = function() return beautiful.default_height end data.get_height = function() return beautiful.default_height end
data.get_visible = function() return true end data.get_visible = function() return true end
data.get_direction = function() return "left" end data.get_direction = function() return "left" end
data.get_margins = function() return {left=0,right=0,top=0,bottom=0} end
-- Setup the margins
local m = wibox.layout.margin()
m:set_widget(internal.layout)
internal.margin = m
local mrgns = margins2(m,data.default_margins or {})
data._internal.mrgns = mrgns
data.get_margins = function()
return data._internal.mrgns or {}
end
-- This widget do not use wibox, so setup correct widget interface -- This widget do not use wibox, so setup correct widget interface
data.fit = internal.layout data.fit = internal.layout
@ -163,7 +173,7 @@ local function new(args)
-- ret._internal.layout:connect_signal("widget::updated",function() -- ret._internal.layout:connect_signal("widget::updated",function()
-- ret:emit_signal("widget::updated") -- ret:emit_signal("widget::updated")
-- end) -- end)
return ret,ret._internal.layout return ret,ret._internal.margin
end end
function module.flex(args) function module.flex(args)
@ -172,7 +182,7 @@ function module.flex(args)
args.internal.layout_func = wibox.layout.flex.horizontal() args.internal.layout_func = wibox.layout.flex.horizontal()
local data = new(args) local data = new(args)
data._internal.text_fit = function(self,width,height) return width,height end data._internal.text_fit = function(self,width,height) return width,height end
return data return data,data._internal.margin
end end
return setmetatable(module, { __call = function(_, ...) return new(...) end }) return setmetatable(module, { __call = function(_, ...) return new(...) end })

View File

@ -290,14 +290,8 @@ local function new(args)
-- Default settings -- Default settings
bg = args.bg or beautiful.menu_bg_normal or beautiful.bg_normal or "#000000", bg = args.bg or beautiful.menu_bg_normal or beautiful.bg_normal or "#000000",
fg = args.fg or beautiful.menu_fg_normal or beautiful.fg_normal or "#ffffff", fg = args.fg or beautiful.menu_fg_normal or beautiful.fg_normal or "#ffffff",
-- bg_focus = args.bg_focus or beautiful.menu_bg_focus or beautiful.bg_focus or "#ffffff",
-- fg_focus = args.fg_focus or beautiful.menu_fg_focus or beautiful.fg_focus or "#000000",
-- bg_alternate = args.bg_alternate or beautiful.menu_bg_alternate or beautiful.bg_alternate or beautiful.bg_normal,
-- bg_highlight = args.bg_highlight or beautiful.menu_bg_highlight or beautiful.bg_highlight or beautiful.bg_normal,
bg_header = args.bg_header or beautiful.menu_bg_header or beautiful.fg_normal, bg_header = args.bg_header or beautiful.menu_bg_header or beautiful.fg_normal,
bg_prefix = args.bg_prefix or nil, bg_prefix = args.bg_prefix or nil,
-- bg_hover = args.bg_hover or nil,
-- fg_hover = args.fg_hover or nil,
border_color = args.border_color or beautiful.menu_border_color or beautiful.border_color or "#333333", border_color = args.border_color or beautiful.menu_border_color or beautiful.border_color or "#333333",
border_width = args.border_width or beautiful.menu_border_width or beautiful.border_width or 3, border_width = args.border_width or beautiful.menu_border_width or beautiful.border_width or 3,
separator_color = args.separator_color or beautiful.menu_separator_color or args.border_color or beautiful.menu_border_color or beautiful.border_color or "#333333", separator_color = args.separator_color or beautiful.menu_separator_color or args.border_color or beautiful.menu_border_color or beautiful.border_color or "#333333",
@ -338,7 +332,9 @@ local function new(args)
select_on = args.select_on or module.event.HOVER, select_on = args.select_on or module.event.HOVER,
overlay = args.overlay or nil, overlay = args.overlay or nil,
opacity = args.opacity or beautiful.menu_opacity or 1, opacity = args.opacity or beautiful.menu_opacity or 1,
icon_transformation = args.icon_transformation or nil, default_margins = args.default_margins or {},
default_item_margins = args.default_item_margins or {},
icon_transformation = args.icon_transformation or nil,
filter_underlay_style = args.filter_underlay_style or nil, filter_underlay_style = args.filter_underlay_style or nil,
filter_underlay_color = args.filter_underlay_color, filter_underlay_color = args.filter_underlay_color,
filter_placeholder = args.filter_placeholder or "", filter_placeholder = args.filter_placeholder or "",

View File

@ -75,7 +75,7 @@ local function set_position(self)
ret={x=parent.x-self.width,y=parent.y+(self.parent_item.y)} ret={x=parent.x-self.width,y=parent.y+(self.parent_item.y)}
else else
local margins = self.margins local margins = self.margins
ret={x=parent.x+parent.width,y=parent.y+(self.parent_item.y)-(margins and self.margins.top or self.style.margins.TOP)} ret={x=parent.x+parent.width,y=parent.y+(self.parent_item.y)-(margins and self.margins.top or data.default_margins.top or self.style.margins.TOP)}
--Handle when the menu doesn't fit in the srceen horizontally --Handle when the menu doesn't fit in the srceen horizontally
if ret.x+self.width > src_geo.x + src_geo.width then if ret.x+self.width > src_geo.x + src_geo.width then
@ -84,7 +84,7 @@ local function set_position(self)
-- Handle when the menu doesn't fit on the screen vertically -- Handle when the menu doesn't fit on the screen vertically
if ret.y+self.height > src_geo.y + src_geo.height then if ret.y+self.height > src_geo.y + src_geo.height then
ret.y = ret.y - self.height + self.item_height + 2*(margins and self.margins.top or self.style.margins.TOP) ret.y = ret.y - self.height + self.item_height + 2*(margins and self.margins.top or data.default_margins.top or self.style.margins.TOP)
end end
end end
elseif parent then elseif parent then
@ -157,10 +157,10 @@ local function setup_drawable(data)
data.get_margins = function() data.get_margins = function()
if not internal._margins then if not internal._margins then
local ret = { local ret = {
left = data.border_width+(data.style.margins.LEFT or 0), left = data.border_width+(data.default_margins.left or data.style.margins.LEFT or 0),
right = data.border_width+(data.style.margins.RIGHT or 0), right = data.border_width+(data.default_margins.right or data.style.margins.RIGHT or 0),
top = data.border_width+(data.style.margins.TOP or 0), top = data.border_width+(data.default_margins.top or data.style.margins.TOP or 0),
bottom = data.border_width+(data.style.margins.BOTTOM or 0), bottom = data.border_width+(data.default_margins.bottom or data.style.margins.BOTTOM or 0),
} }
local m = margins2(internal.margin,ret) local m = margins2(internal.margin,ret)
rawset(m,"_reset",m.reset) rawset(m,"_reset",m.reset)

View File

@ -12,6 +12,17 @@ local capi = { client = client, mouse = mouse, screen = screen}
local module,pause_monitoring = {},false local module,pause_monitoring = {},false
-- Using viewonly to change tag will create an unwanted
-- focus event in the awful stack. While this module does
-- not use it, it try to be a good citizen and avoid corrupting
-- it.
local lock_history = false
local function awful_client_history_add(c)
if not lock_history then
client2.focus.history.add(c)
end
end
-- Keep its own history instead of using awful.client.focus.history -- Keep its own history instead of using awful.client.focus.history
local focusIdx,focusTable = 1,setmetatable({}, { __mode = 'v' }) local focusIdx,focusTable = 1,setmetatable({}, { __mode = 'v' })
local focusTag = setmetatable({}, { __mode = 'v' }) local focusTag = setmetatable({}, { __mode = 'v' })
@ -89,7 +100,7 @@ local function reload_highlight(i)
end end
tag_list.highlight(hl) tag_list.highlight(hl)
i._internal.border_color_back = i.client.border_color i._internal.border_color_back = i._internal.border_color_back or i.client.border_color
i.client.border_color = beautiful.bg_urgent i.client.border_color = beautiful.bg_urgent
elseif i._internal.border_color_back then elseif i._internal.border_color_back then
i.client.border_color = i._internal.border_color_back i.client.border_color = i._internal.border_color_back
@ -138,20 +149,26 @@ local function new(args)
currentMenu:add_key_hook({}, "Tab", "press", select_next) currentMenu:add_key_hook({}, "Tab", "press", select_next)
currentMenu:add_key_hook({}, "Shift_L", "press", function() currentMenu:add_key_hook({}, "Shift_L", "press", function()
currentMenu._current_item.checked = not currentMenu._current_item.checked local item = currentMenu._current_item
client2.toggletag (t, currentMenu._current_item.client) item.checked = not item.checked
reload_underlay(currentMenu._current_item.client,currentMenu._current_item) local c = item.client
client2.toggletag (t, c)
reload_underlay(c,item)
if not auto_release then if not auto_release then
reload_highlight(currentMenu._current_item) reload_highlight(item)
end
if item._internal.border_color_back then
c.border_color = item._internal.border_color_back
end end
return true return true
end) end)
currentMenu:add_key_hook({}, "Control_L", "press", function() currentMenu:add_key_hook({}, "Control_L", "press", function()
currentMenu._current_item.checked = not currentMenu._current_item.checked local item = currentMenu._current_item
client2.movetotag(t, currentMenu._current_item.client) item.checked = not item.checked
reload_underlay(currentMenu._current_item.client,currentMenu._current_item) client2.movetotag(t, item.client)
reload_underlay(item.client,item)
if not auto_release then if not auto_release then
reload_highlight(currentMenu._current_item) reload_highlight(item)
end end
return true return true
end) end)
@ -181,7 +198,9 @@ local function new(args)
button1 = function(a,b,c,d,no_hide) button1 = function(a,b,c,d,no_hide)
local t = focusTag[v] or v:tags()[1] local t = focusTag[v] or v:tags()[1]
if t and t.selected == false and not util.table.hasitem(v:tags(),tag.selected(v.screen)) then if t and t.selected == false and not util.table.hasitem(v:tags(),tag.selected(v.screen)) then
lock_history = true
tag.viewonly(t) tag.viewonly(t)
lock_history = false
end end
capi.client.focus = v capi.client.focus = v
v:raise() v:raise()
@ -229,5 +248,9 @@ function module.altTabBack(args)
new({leap = -1,auto_release = (args or {}).auto_release}) new({leap = -1,auto_release = (args or {}).auto_release})
end end
-- Sometime need to lock .add
capi.client.disconnect_signal("focus", client2.focus.history.add)
capi.client.connect_signal("focus", awful_client_history_add)
return setmetatable(module, { __call = function(_, ...) return new(...) end }) return setmetatable(module, { __call = function(_, ...) return new(...) end })
-- kate: space-indent on; indent-width 2; replace-tabs on; -- kate: space-indent on; indent-width 2; replace-tabs on;

View File

@ -228,12 +228,15 @@ local function new(s)
local track = tracker(s) local track = tracker(s)
local args = { local args = {
item_style = beautiful.taglist_theme or radical.item.style.arrow_prefix, item_style = beautiful.taglist_item_style or radical.item.style.arrow_prefix,
style = beautiful.taglist_style,
select_on = radical.base.event.NEVER, select_on = radical.base.event.NEVER,
fg = beautiful.taglist_fg or beautiful.fg_normal, fg = beautiful.taglist_fg or beautiful.fg_normal,
bg = beautiful.taglist_bg or beautiful.bg_normal, bg = beautiful.taglist_bg or beautiful.bg_normal,
bg_focus = beautiful.taglist_bg_selected, bg_focus = beautiful.taglist_bg_selected,
fg_focus = beautiful.taglist_fg_selected, fg_focus = beautiful.taglist_fg_selected,
default_item_margins = beautiful.taglist_default_item_margins,
default_margins = beautiful.taglist_default_margins ,
-- fkeys_prefix = true, -- fkeys_prefix = true,
} }
for k,v in ipairs {"hover","used","urgent","cloned","changed","highlight"} do for k,v in ipairs {"hover","used","urgent","cloned","changed","highlight"} do

View File

@ -66,6 +66,7 @@ local function new(s)
if not init then if not init then
capi.tag.connect_signal("property::screen" , reload ) capi.tag.connect_signal("property::screen" , reload )
capi.tag.connect_signal("property::activated", reload ) capi.tag.connect_signal("property::activated", reload )
capi.tag.connect_signal("property::index" , reload )
end end
tracker.reload = function() tracker.reload = function()

View File

@ -241,12 +241,16 @@ end
local function new(screen) local function new(screen)
local args = { local args = {
select_on=radical.base.event.NEVER, select_on = radical.base.event.NEVER ,
disable_markup = true, disable_markup = true ,
fg = beautiful.tasklist_fg or beautiful.fg_normal, fg = beautiful.tasklist_fg or beautiful.fg_normal ,
bg = beautiful.tasklist_bg or beautiful.bg_normal, bg = beautiful.tasklist_bg or beautiful.bg_normal ,
underlay_style = beautiful.tasklist_underlay_style or radical.widgets.underlay.draw_arrow, underlay_style = beautiful.tasklist_underlay_style or radical.widgets.underlay.draw_arrow,
icon_transformation = beautiful.tasklist_icon_transformation icon_transformation = beautiful.tasklist_icon_transformation ,
default_item_margins = beautiful.tasklist_default_item_margins ,
default_margins = beautiful.tasklist_default_margins ,
item_style = beautiful.tasklist_item_style ,
style = beautiful.tasklist_style ,
} }
for k,v in ipairs {"hover","urgent","minimized","focus"} do for k,v in ipairs {"hover","urgent","minimized","focus"} do
args["bg_"..v] = beautiful["tasklist_bg_"..v] args["bg_"..v] = beautiful["tasklist_bg_"..v]

View File

@ -5,6 +5,7 @@ local cairo = require( "lgi" ).cairo
local wibox = require( "wibox" ) local wibox = require( "wibox" )
local checkbox = require( "radical.widgets.checkbox" ) local checkbox = require( "radical.widgets.checkbox" )
local fkey = require( "radical.widgets.fkey" ) local fkey = require( "radical.widgets.fkey" )
local util = require( "awful.util" )
local horizontal = require( "radical.item.layout.horizontal" ) local horizontal = require( "radical.item.layout.horizontal" )
local margins2 = require("radical.margins") local margins2 = require("radical.margins")
@ -16,7 +17,7 @@ local function create_item(item,data,args)
-- Margins -- Margins
local m = wibox.layout.margin(la) local m = wibox.layout.margin(la)
local mrgns = margins2(m,data.item_style.margins) local mrgns = margins2(m,util.table.join(data.item_style.margins,data.default_item_margins))
item.get_margins = function() item.get_margins = function()
return mrgns return mrgns
end end

View File

@ -7,6 +7,7 @@ local checkbox = require( "radical.widgets.checkbox" )
local fkey = require( "radical.widgets.fkey" ) local fkey = require( "radical.widgets.fkey" )
local underlay = require( "radical.widgets.underlay" ) local underlay = require( "radical.widgets.underlay" )
local theme = require( "radical.theme" ) local theme = require( "radical.theme" )
local util = require( "awful.util" )
local margins2 = require("radical.margins") local margins2 = require("radical.margins")
local module = {} local module = {}
@ -162,6 +163,7 @@ end
-- Force the width or compute the minimum space -- Force the width or compute the minimum space
local function align_fit(box,w,h) local function align_fit(box,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 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(w,h)+wibox.widget.textbox.fit(box.second,w,h)+box.third:fit(w,h),h
end end
@ -173,7 +175,8 @@ local function create_item(item,data,args)
-- Margins -- Margins
local m = wibox.layout.margin(la) local m = wibox.layout.margin(la)
local mrgns = margins2(m,(item.item_style or data.item_style).margins) -- print("LA",data.default_item_margins.TOP)
local mrgns = margins2(m,util.table.join((item.item_style or data.item_style).margins,data.default_item_margins))
item.get_margins = function() item.get_margins = function()
return mrgns return mrgns
end end

View File

@ -6,6 +6,7 @@ local wibox = require( "wibox" )
local checkbox = require( "radical.widgets.checkbox" ) local checkbox = require( "radical.widgets.checkbox" )
local fkey = require( "radical.widgets.fkey" ) local fkey = require( "radical.widgets.fkey" )
local horizontal = require( "radical.item.layout.horizontal" ) local horizontal = require( "radical.item.layout.horizontal" )
local util = require( "awful.util" )
local margins2 = require("radical.margins") local margins2 = require("radical.margins")
local module = {} local module = {}
@ -37,7 +38,7 @@ local function create_item(item,data,args)
--Create the main item layout --Create the main item layout
local l,la,lr = wibox.layout.fixed.vertical(),wibox.layout.align.vertical(),wibox.layout.fixed.horizontal() local l,la,lr = wibox.layout.fixed.vertical(),wibox.layout.align.vertical(),wibox.layout.fixed.horizontal()
local m = wibox.layout.margin(la) local m = wibox.layout.margin(la)
local mrgns = margins2(m,data.item_style.margins) local mrgns = margins2(m,util.table.join(data.item_style.margins,data.default_item_margins))
item.get_margins = function() item.get_margins = function()
return mrgns return mrgns
end end

View File

@ -33,7 +33,7 @@ local function gen(width,height,bg_color,border_color)
end end
local function widget_draw(self, w, cr, width, height) local function widget_draw(self, w, cr, width, height)
local state = self._item.state or {} local state = self._item.state or {}
local current_state = state._current_key or "" local current_state = state._current_key or ""
if not state_cache[current_state] then if not state_cache[current_state] then

View File

@ -18,7 +18,8 @@ local function reset_margins(margins)
end end
local function new(widget,defaults) local function new(widget,defaults)
local mt = setmetatable({defaults=awful.util.table.join(defaults,{}),widget=widget,reset=reset_margins, local mt = nil
mt = setmetatable({defaults=awful.util.table.join(defaults,{}),widget=widget,reset=reset_margins,
merge = function(values) merge = function(values)
if values.left then if values.left then
widget:set_left(values.left) widget:set_left(values.left)
@ -34,18 +35,19 @@ local function new(widget,defaults)
end end
end end
},{__newindex = function(tab, key,value) },{__newindex = function(tab, key,value)
key = key:lower()
if key == "widget" then if key == "widget" then
rawset(tab,"widget",value) rawset(tab,"widget",value)
reset_margins(tab) reset_margins(tab)
elseif widget then elseif widget then
widget["set_"..key](widget,value) widget["set_"..key](widget,value)
else --TODO can't do this else --TODO can't do this
defaults[key] = value mt.defaults[key] = value
end end
end end
,__index=function(table,key) ,__index=function(table,key)
local w = rawget(table,"widget") local w = rawget(table,"widget")
return w and w[key] or 0 --widget["get_"..key](widget) return w and w[key] or defaults[key] --widget["get_"..key](widget)
end}) end})
reset_margins(mt) reset_margins(mt)