From 03090fa2ec09bce0bd65687547c1e8286528c139 Mon Sep 17 00:00:00 2001 From: Emmanuel Lepage Vallee Date: Fri, 14 Nov 2014 23:46:06 -0500 Subject: [PATCH] Add a bunch of skining options --- README.md | 2 ++ bar.lua | 4 +++ base.lua | 1 + dock.lua | 12 ++++---- impl/common/tag.lua | 4 ++- impl/taglist/README.md | 15 +++++++++- impl/taglist/init.lua | 52 +++++++++++++++++++++++--------- impl/taglist/tag_menu.lua | 57 +++++++++++++++++++++++++++++++++++- impl/tasklist/init.lua | 7 +++-- item/layout/horizontal.lua | 2 +- item/layout/icon.lua | 2 +- item/layout/notification.lua | 2 +- item/style/holo.lua | 29 +++++++++++++++--- item/style/init.lua | 5 +++- style/arrow.lua | 4 +-- widgets/separator.lua | 2 +- 16 files changed, 165 insertions(+), 35 deletions(-) diff --git a/README.md b/README.md index 7481f2a..e8725e6 100644 --- a/README.md +++ b/README.md @@ -352,6 +352,8 @@ Radical also use the some of the same theme options as awful.menu, plus some: | menu_draw_underlay | Function returning the underlay pixmap | function(array,width) | | menu_icon_transformation | The function used to draw the icon | function(image,data,item) | | underlay_alpha | Alpha for underlays | Number (0 to 1) | +| menu_corner_radius | Arrow based menu corner radius | Number (default = 10) | +| dock_corner_radius | The dock menu type corner radius | Number (default 10) | Styling can also be done using the icon_transformation option. This feature diff --git a/bar.lua b/bar.lua index 470478d..ab4d507 100644 --- a/bar.lua +++ b/bar.lua @@ -53,6 +53,10 @@ local function setup_drawable(data) internal.layout.draw = bg_draw internal.layout._data = data + if internal.layout.set_spacing and data.spacing then + internal.layout:set_spacing(data.spacing) + end + --Getters data.get_x = function() return 0 end data.get_y = function() return 0 end diff --git a/base.lua b/base.lua index 3ffec35..a71b680 100644 --- a/base.lua +++ b/base.lua @@ -332,6 +332,7 @@ local function new(args) select_on = args.select_on or module.event.HOVER, overlay = args.overlay or nil, opacity = args.opacity or beautiful.menu_opacity or 1, + spacing = args.spacing or nil, --TODO add to README once merged upstream default_margins = args.default_margins or {}, default_item_margins = args.default_item_margins or {}, icon_transformation = args.icon_transformation or nil, diff --git a/dock.lua b/dock.lua index 10374f1..6692c20 100644 --- a/dock.lua +++ b/dock.lua @@ -20,6 +20,8 @@ local margins2 = require("radical.margins" ) local capi,module = { mouse = mouse , screen = screen, keygrabber = keygrabber },{} local max_size = {height={},width={}} +local default_radius = 10 + local dir_to_deg = {left=0,bottom=math.pi/2,right=math.pi,top=3*(math.pi/2)} local function get_direction(data) @@ -81,7 +83,7 @@ local function dock_draw(self, w, cr, width, height) -- Generate the border surface if not self.mask or self.mask_hash ~= width*1000+height then local dir,rotation = get_direction(self.data) - self.mask = mask(rotation,w.width,w.height,8,1,0,color(self.data.border_color or seld.data.fg),color("#FF000000")) + self.mask = mask(rotation,w.width,w.height,(beautiful.dock_corner_radius or default_radius) - 2,1,0,color(self.data.border_color or seld.data.fg),color("#FF000000")) self.mask_hash = width*1000+height end cr:save() @@ -220,11 +222,11 @@ local function get_wibox(data, screen) data._internal.w = w -- Create the rounded corner mask - w:set_bg(cairo.Pattern.create_for_surface(mask(rotation,w.width,w.height,8,1,0,color(beautiful.fg_normal),color(beautiful.bg_dock or beautiful.bg_normal)))) - w.shape_bounding = mask(rotation,w.width,w.height,10,0,1,color("#00000000"),color("#FFFFFFFF"))._native + w:set_bg(cairo.Pattern.create_for_surface(mask(rotation,w.width,w.height,(beautiful.dock_corner_radius or default_radius)-2,1,0,color(beautiful.fg_normal),color(beautiful.bg_dock or beautiful.bg_normal)))) + w.shape_bounding = mask(rotation,w.width,w.height,beautiful.dock_corner_radius or default_radius,0,1,color("#00000000"),color("#FFFFFFFF"))._native local function prop_change() - w:set_bg(cairo.Pattern.create_for_surface(mask(rotation,w.width,w.height,8,1,0,color(beautiful.fg_normal),color(beautiful.bg_dock or beautiful.bg_normal)))) - w.shape_bounding = mask(rotation,w.width,w.height,10,0,1,color("#00000000"),color("#FFFFFFFF"))._native + w:set_bg(cairo.Pattern.create_for_surface(mask(rotation,w.width,w.height,(beautiful.dock_corner_radius or default_radius) -2,1,0,color(beautiful.fg_normal),color(beautiful.bg_dock or beautiful.bg_normal)))) + w.shape_bounding = mask(rotation,w.width,w.height,beautiful.dock_corner_radius or default_radius,0,1,color("#00000000"),color("#FFFFFFFF"))._native end w:connect_signal("property::height",prop_change) w:connect_signal("property::width" ,prop_change) diff --git a/impl/common/tag.lua b/impl/common/tag.lua index afe1c64..b9e403a 100644 --- a/impl/common/tag.lua +++ b/impl/common/tag.lua @@ -27,10 +27,12 @@ local function createTagList(aScreen,args) tag_list = require("radical.impl.taglist") end local tagList = radical.context {} + local ret = {} for _, v in ipairs(awful.tag.gettags(aScreen)) do args.text,args.icon = v.name,awful.tag.geticon(v) local i = tagList:add_item(args) i._tag = v + ret[v] = i i:connect_signal("mouse::enter",function() tag_list.highlight(v) end) @@ -40,7 +42,7 @@ local function createTagList(aScreen,args) tag_list.highlight(nil) end end) - return tagList + return tagList,ret end function module.listTags(args) diff --git a/impl/taglist/README.md b/impl/taglist/README.md index d487ad7..a62339b 100644 --- a/impl/taglist/README.md +++ b/impl/taglist/README.md @@ -38,4 +38,17 @@ taglist_fg_urgent taglist_bg_cloned taglist_fg_cloned taglist_bg_changed -taglist_fg_changed \ No newline at end of file +taglist_fg_changed +taglist_default_icon +taglist_style +taglist_default_item_margins +taglist_default_margins +taglist_disable_index +taglist_fg_prefix +taglist_disable_icon +taglist_icon_transformation + +States: +empty +cloned +highlight \ No newline at end of file diff --git a/impl/taglist/init.lua b/impl/taglist/init.lua index b84a143..c4ddd9e 100644 --- a/impl/taglist/init.lua +++ b/impl/taglist/init.lua @@ -18,11 +18,15 @@ local theme = require( "radical.theme") local tracker = require( "radical.impl.taglist.tracker" ) local tag_menu = require( "radical.impl.taglist.tag_menu" ) -local CLONED = 100 +local CLONED = 100 local HIGHLIGHTED = -2 +local EMPTY = 412345 + +local last_idx = EMPTY theme.register_color(CLONED , "cloned" , "cloned" , true ) theme.register_color(HIGHLIGHTED , "highlight" , "highlight" , true ) +theme.register_color(EMPTY , "empty" , "empty" , true ) local module,instances = {},{} @@ -54,20 +58,28 @@ local function index_draw(self,w, cr, width, height) end local function create_item(t,s) - local menu = instances[s] + local menu,ib = instances[s],nil if not menu or not t then return end local w = wibox.layout.fixed.horizontal() - local icon = tag.geticon(t) - local ib = wibox.widget.imagebox() - ib:set_image(icon) - w:add(ib) - local tw = wibox.widget.textbox() - tw.draw = index_draw - local index = tag.getidx(t) - tw:set_markup(" "..(index).." ") - w:add(tw) + if beautiful.taglist_disable_icon ~= true then + local icon = tag.geticon(t) + if icon and beautiful.taglist_icon_transformation then + icon = beautiful.taglist_icon_transformation(icon,menu,nil) + end + ib = wibox.widget.imagebox() + ib:set_image(icon) + w:add(ib) + end + if beautiful.taglist_disable_index ~= true then + local tw = wibox.widget.textbox() + tw.draw = index_draw + local index = tag.getproperty(t,"index") or tag.getidx(t) + tw:set_markup(" "..(index).." ") + w:add(tw) + end local suf_w = wibox.layout.fixed.horizontal() - local item = menu:add_item { text = t.name, prefix_widget = w,suffix_widget=suf_w} + local item = menu:add_item { text = t.name, prefix_widget = w,suffix_widget=suf_w,bg_normal="#ff0000"--[[beautiful.taglist_bg_unused]]} + item.state[EMPTY] = true item._internal.icon_w = ib -- item:connect_signal("index::changed",function(_,value) -- tw:set_markup(" "..(index).." ") @@ -235,8 +247,11 @@ local function new(s) bg = beautiful.taglist_bg or beautiful.bg_normal, bg_focus = beautiful.taglist_bg_selected, fg_focus = beautiful.taglist_fg_selected, + bg_empty = beautiful.taglist_bg_empty, + fg_empty = beautiful.taglist_fg_empty, + spacing = beautiful.taglist_spacing, default_item_margins = beautiful.taglist_default_item_margins, - default_margins = beautiful.taglist_default_margins , + default_margins = beautiful.taglist_default_margins , -- fkeys_prefix = true, } for k,v in ipairs {"hover","used","urgent","cloned","changed","highlight"} do @@ -268,7 +283,7 @@ end capi.tag.connect_signal("property::selected" , select) capi.tag.connect_signal("property::index2",function(t,i) - if t then + if t and not beautiful.taglist_disable_index then local s = tag.getscreen(t) local item = cache[t] if item then @@ -282,6 +297,15 @@ function module.item(t) return cache[t] end +function module.register_color(col) + last_idx = last_idx - 1 + theme.register_color(last_idx , "color_"..last_idx , "color_"..last_idx , true ) + for k,v in pairs(instances) do + v["bg_color_"..last_idx] = col + end + return last_idx,"color_"..last_idx +end + return setmetatable(module, { __call = function(_, ...) return new(...) end }) -- kate: space-indent on; indent-width 2; replace-tabs on; diff --git a/impl/taglist/tag_menu.lua b/impl/taglist/tag_menu.lua index abd7f27..c4e13a0 100644 --- a/impl/taglist/tag_menu.lua +++ b/impl/taglist/tag_menu.lua @@ -3,11 +3,15 @@ local io = io local ipairs = ipairs local tag = require( "awful.tag" ) local menu = require( "radical.context" ) +local beautiful = require( "beautiful" ) local com_tag = require( "radical.impl.common.tag" ) local awful = require("awful") local radical = require("radical") local extensions = require("radical.impl.taglist.extensions") local capi = { screen = screen } +local cairo = require("lgi" ).cairo +local color = require("gears.color" ) +local tag_list = nil local module = {} @@ -15,6 +19,55 @@ local aTagMenu = nil local aTag = nil +local radius = 3 +local function gen_icon(col,height) + local img = cairo.ImageSurface.create(cairo.Format.ARGB32, height, height)--target:create_similar(target:get_content(),width,height) + local cr = cairo.Context(img) + + cr:move_to(1,radius+1) + cr:arc(1+radius,radius+1,radius,math.pi,3*(math.pi/2)) + cr:arc(height-radius-2,radius+1,radius,3*(math.pi/2),math.pi*2) + cr:arc(height-radius-2,height-radius-2,radius,math.pi*2,math.pi/2) + cr:arc(2+radius,height-radius-2,radius,math.pi/2,math.pi) + cr:close_path() + cr:set_source(color(beautiful.menu_fg or beautiful.fg_normal)) + cr:set_line_width(2) + cr:stroke_preserve() + cr:set_source(color(col)) + cr:fill() + return img +end + +local function set_color(aTag,col) + local pat = col + if beautiful.taglist_custom_color then + pat = beautiful.taglist_custom_color(pat) + end + local idx,name = tag_list.register_color(pat) + local item = tag_list.item(aTag) + item["bg_"..name] = pat + item.state[idx] = true +end + +local function color_menu(aTag) + if not tag_list then + tag_list = require("radical.impl.taglist") + end + local m = radical.context {layout=radical.layout.grid,column=6} + m:add_item{icon=gen_icon("#ff0000",m.item_height-4), item_layout = radical.item.layout.icon, button1 = function() set_color(aTag,"#ff0000") end} + m:add_item{icon=gen_icon("#00ff00",m.item_height-4), item_layout = radical.item.layout.icon, button1 = function() set_color(aTag,"#00ff00") end} + m:add_item{icon=gen_icon("#0000ff",m.item_height-4), item_layout = radical.item.layout.icon} + m:add_item{icon=gen_icon("#ff00ff",m.item_height-4), item_layout = radical.item.layout.icon} + m:add_item{icon=gen_icon("#ffff00",m.item_height-4), item_layout = radical.item.layout.icon} + m:add_item{icon=gen_icon("#00ffff",m.item_height-4), item_layout = radical.item.layout.icon} + m:add_item{icon=gen_icon("#ff0000",m.item_height-4), item_layout = radical.item.layout.icon} + m:add_item{icon=gen_icon("#00ff00",m.item_height-4), item_layout = radical.item.layout.icon} + m:add_item{icon=gen_icon("#0000ff",m.item_height-4), item_layout = radical.item.layout.icon} + m:add_item{icon=gen_icon("#ff00ff",m.item_height-4), item_layout = radical.item.layout.icon} + m:add_item{icon=gen_icon("#ffff00",m.item_height-4), item_layout = radical.item.layout.icon} + m:add_item{icon=gen_icon("#00ffff",m.item_height-4), item_layout = radical.item.layout.icon} + return m +end -- My config has an icon directory path stored there, change as you like local config = nil @@ -48,7 +101,9 @@ local function new(t) end end - aTagMenu:add_item({text = "Merge With", sub_menu = com_tag.listTags}) + aTagMenu:add_item({text = "Set color", sub_menu = function() return color_menu(aTag) end}) + + aTagMenu:add_item({text = "Merge With", sub_menu = function() return com_tag.listTags() end}) function createTagList(aScreen) local tagList = menu() diff --git a/impl/tasklist/init.lua b/impl/tasklist/init.lua index 07a5f44..8d1cc6c 100644 --- a/impl/tasklist/init.lua +++ b/impl/tasklist/init.lua @@ -137,7 +137,9 @@ end local function reload_content(c,b,a) local item = _cache[c] if item then - item.icon = surface(c.icon) or beautiful.tasklist_default_icon + if not beautiful.tasklist_disable_icon then + item.icon = surface(c.icon) or beautiful.tasklist_default_icon + end item.text = c.name or "N/A" end end @@ -154,7 +156,7 @@ local function create_client_item(c,screen) -- Too bad, let's create a new one local suf_w = wibox.layout.fixed.horizontal() - item = menu:add_item{text=c.name,icon=surface(c.icon),suffix_widget=suf_w} + item = menu:add_item{text=c.name,icon=(not beautiful.tasklist_disable_icon) and surface(c.icon),suffix_widget=suf_w} item.add_suffix = function(w,w2) suf_w:add(w2) end @@ -251,6 +253,7 @@ local function new(screen) default_margins = beautiful.tasklist_default_margins , item_style = beautiful.tasklist_item_style , style = beautiful.tasklist_style , + spacing = beautiful.tasklist_spacing , } for k,v in ipairs {"hover","urgent","minimized","focus"} do args["bg_"..v] = beautiful["tasklist_bg_"..v] diff --git a/item/layout/horizontal.lua b/item/layout/horizontal.lua index 701ec41..72c0de2 100644 --- a/item/layout/horizontal.lua +++ b/item/layout/horizontal.lua @@ -69,7 +69,7 @@ function module:setup_checked(item,data) if item.checkable then item.get_checked = function() if type(item._private_data.checked) == "function" then - return item._private_data.checked() + return item._private_data.checked(data,item) else return item._private_data.checked end diff --git a/item/layout/icon.lua b/item/layout/icon.lua index 37dcf8a..c1fbc24 100644 --- a/item/layout/icon.lua +++ b/item/layout/icon.lua @@ -87,7 +87,7 @@ local function create_item(item,data,args) return data._internal.layout.item_fit(data,item,box,w,h) end if item.checkable then - item.get_checked = function() + item.get_checked = function(data,item) if type(item._private_data.checked) == "function" then return item._private_data.checked() else diff --git a/item/layout/notification.lua b/item/layout/notification.lua index 32b9d6a..f45fd22 100644 --- a/item/layout/notification.lua +++ b/item/layout/notification.lua @@ -42,7 +42,7 @@ end -- Show the checkbox function module:setup_checked(item,data) if item.checkable then - item.get_checked = function() + item.get_checked = function(data,item) if type(item._private_data.checked) == "function" then return item._private_data.checked() else diff --git a/item/style/holo.lua b/item/style/holo.lua index a73521e..7071258 100644 --- a/item/style/holo.lua +++ b/item/style/holo.lua @@ -16,12 +16,18 @@ local module = { local state_cache = {} -local function gen(width,height,bg_color,border_color) +local default_height = 3 + +local rect = { + bottom = function(x,y,width,height) return 0, height-default_height, width , default_height end, + top = function(x,y,width,height) return 0, 0, width , 3 end, +} + +local function gen(width,height,bg_color,border_color, pos) local img = cairo.ImageSurface(cairo.Format.ARGB32, width,height) local cr = cairo.Context(img) - local rad = corner_radius or 3 cr:set_source(color(bg_color)) - cr:rectangle(0,height -4, width , 4) + cr:rectangle(rect[pos](0,0,width,height)) cr:fill() return cairo.Pattern.create_for_surface(img) end @@ -41,7 +47,7 @@ local function widget_draw(self, w, cr, width, height) --Generate the pixmap if not cached then local state_name = current_state == "" and "bg" or "bg_"..(base.colors_by_id[current_state] or "") - cached = gen(width,height,self._item[state_name],bc) + cached = gen(width,height,self._item[state_name],bc,self.holo_pos) cache[hash] = cached end @@ -65,6 +71,7 @@ local function draw(item,args) item.widget.draw = widget_draw item.widget._overlay_init = true item.widget._item = item + item.widget.holo_pos = args.pos or "bottom" end local state = item.state or {} @@ -80,5 +87,19 @@ local function draw(item,args) end end +local function draw_top(item,args) + return draw(item,{pos="top"}) +end + +-- Create an identical module for holo_top +module.top = setmetatable({ + draw = draw_top, + margins = module.margins + }, + { + __call = function(_, ...) return draw_top(...) end + } +) + return setmetatable(module, { __call = function(_, ...) return draw(...) end }) -- kate: space-indent on; indent-width 2; replace-tabs on; diff --git a/item/style/init.lua b/item/style/init.lua index b20b884..884ed2b 100644 --- a/item/style/init.lua +++ b/item/style/init.lua @@ -1,9 +1,12 @@ +local holo = require("radical.item.style.holo") + return { basic = require("radical.item.style.basic" ), classic = require("radical.item.style.classic" ), subtle = require("radical.item.style.subtle" ), rounded = require("radical.item.style.rounded" ), - holo = require("radical.item.style.holo" ), + holo = holo , + holo_top = holo.top , arrow_alt = require("radical.item.style.arrow_alt" ), arrow_prefix = require("radical.item.style.arrow_prefix" ), arrow_single = require("radical.item.style.arrow_single" ), diff --git a/style/arrow.lua b/style/arrow.lua index 34400bc..da499dd 100644 --- a/style/arrow.lua +++ b/style/arrow.lua @@ -89,7 +89,7 @@ local function do_gen_menu_top(data, width, height, radius,padding,args) cr:set_source( color(args.fg) ) -- Generate the path - draw_roundedrect_path(cr, data, width, height, radius,padding,args) + draw_roundedrect_path(cr, data, width, height, beautiful.menu_corner_radius or radius,padding,args) -- Apply cr:fill() @@ -200,7 +200,7 @@ local function draw_border(self,w, cr, width, height) cr:set_matrix(matrix) -- Generate the path - draw_roundedrect_path(cr, data, width, height, radius,data.border_width/2) + draw_roundedrect_path(cr, data, width, height, beautiful.menu_corner_radius or radius,data.border_width/2) cr:set_source(color(beautiful.fg_normal)) cr:set_line_width(data.border_width) cr:stroke() diff --git a/widgets/separator.lua b/widgets/separator.lua index 6955681..6726af0 100644 --- a/widgets/separator.lua +++ b/widgets/separator.lua @@ -28,7 +28,7 @@ local function new(menu,direction) local bg = wibox.widget.base.make_widget() bg.direction = direction or module.HORIZONTAL bg.fit = fit - bg._color = color( menu and menu.separator_color or beautiful.border_color or beautiful.fg_normal) + bg._color = color( menu and menu.separator_color or beautiful.menu_border_color or beautiful.menu_fg or beautiful.fg_normal) bg.draw = draw bg._force_fit = true return bg