From fdcffa9650a3d58f68a6e7ddcc7db160b6a867be Mon Sep 17 00:00:00 2001 From: xeals Date: Fri, 18 Jan 2019 10:30:58 +1100 Subject: [PATCH] feat: wire up buttons for tag list --- widget/list_update.lua | 164 ++++++++++++++++++++++++----------------- widget/tag-list.fnl | 8 +- 2 files changed, 104 insertions(+), 68 deletions(-) diff --git a/widget/list_update.lua b/widget/list_update.lua index 03f1c3d..b6295a7 100644 --- a/widget/list_update.lua +++ b/widget/list_update.lua @@ -3,77 +3,107 @@ local dpi = require("beautiful").xresources.apply_dpi local wibox = require("wibox") local clickable_container = require("widget.clickable-container") -function list_update(w, buttons, label, data, objects) - -- update the widgets, creating them if needed - w:reset() - for i, o in ipairs(objects) do - local cache = data[o] - local ib, tb, bgb, tbm, ibm, l - if cache then - ib = cache.ib - tb = cache.tb - bgb = cache.bgb - tbm = cache.tbm - ibm = cache.ibm - else - ib = wibox.widget.imagebox() - tb = wibox.widget.textbox() - bgb = wibox.container.background() - tbm = wibox.container.margin(tb, dpi(4), dpi(4)) - ibm = wibox.container.margin(ib, dpi(10), dpi(8), dpi(8), dpi(8)) - -- ibm = wibox.container.margin(ib, dpi(4)) - l = wibox.layout.fixed.horizontal() - bg_clickable = clickable_container() +local capi = {button = _G.button} - -- All of this is added in a fixed widget - l:fill_space(true) - l:add(ibm) - -- l:add(tbm) - bg_clickable:set_widget(l) - - -- And all of this gets a background - -- bgb:set_widget(l) - bgb:set_widget(bg_clickable) - - bgb:buttons(common.create_buttons(buttons, o)) - - data[o] = { - ib = ib, - tb = tb, - bgb = bgb, - tbm = tbm, - ibm = ibm, - } - end - - local text, bg, bg_image, icon, args = label(o, tb) - args = args or {} - - -- The text might be invalid, so use pcall. - if text == nil or text == "" then - tbm:set_margins(0) - else - if not tb:set_markup_silently(text) then - tb:set_markup("<Invalid text>") +function create_buttons(buttons, object) + if buttons then + local btns = {} + for _, b in ipairs(buttons) do + -- Create a proxy button object: it will receive the real + -- press and release events, and will propagate them to the + -- button object the user provided, but with the object as + -- argument. + local btn = capi.button {modifiers = b.modifiers, button = b.button} + btn:connect_signal( + 'press', + function() + b:emit_signal('press', object) end - end - bgb:set_bg(bg) - if type(bg_image) == "function" then - -- TODO: Why does this pass nil as an argument? - bg_image = bg_image(tb,o,nil,objects,i) - end - bgb:set_bgimage(bg_image) - if icon then - ib:set_image(icon) - else - ibm:set_margins(0) - end + ) + btn:connect_signal( + 'release', + function() + b:emit_signal('release', object) + end + ) + btns[#btns + 1] = btn + end - bgb.shape = args.shape - bgb.shape_border_width = args.shape_border_width - bgb.shape_border_color = args.shape_border_color + return btns + end +end - w:add(bgb) +function list_update(w, buttons, label, data, objects) + -- update the widgets, creating them if needed + w:reset() + for i, o in ipairs(objects) do + local cache = data[o] + local ib, tb, bgb, tbm, ibm, l + if cache then + ib = cache.ib + tb = cache.tb + bgb = cache.bgb + tbm = cache.tbm + ibm = cache.ibm + else + ib = wibox.widget.imagebox() + tb = wibox.widget.textbox() + bgb = wibox.container.background() + tbm = wibox.container.margin(tb, dpi(4), dpi(4)) + ibm = wibox.container.margin(ib, dpi(10), dpi(8), dpi(8), dpi(8)) + -- ibm = wibox.container.margin(ib, dpi(4)) + l = wibox.layout.fixed.horizontal() + bg_clickable = clickable_container() + + -- All of this is added in a fixed widget + l:fill_space(true) + l:add(ibm) + -- l:add(tbm) + bg_clickable:set_widget(l) + + -- And all of this gets a background + -- bgb:set_widget(l) + bgb:set_widget(bg_clickable) + + bgb:buttons(create_buttons(buttons, o)) + + data[o] = { + ib = ib, + tb = tb, + bgb = bgb, + tbm = tbm, + ibm = ibm, + } + end + + local text, bg, bg_image, icon, args = label(o, tb) + args = args or {} + + -- The text might be invalid, so use pcall. + if text == nil or text == "" then + tbm:set_margins(0) + else + if not tb:set_markup_silently(text) then + tb:set_markup("<Invalid text>") + end + end + bgb:set_bg(bg) + if type(bg_image) == "function" then + -- TODO: Why does this pass nil as an argument? + bg_image = bg_image(tb,o,nil,objects,i) + end + bgb:set_bgimage(bg_image) + if icon then + ib:set_image(icon) + else + ibm:set_margins(0) + end + + bgb.shape = args.shape + bgb.shape_border_width = args.shape_border_width + bgb.shape_border_color = args.shape_border_color + + w:add(bgb) end end diff --git a/widget/tag-list.fnl b/widget/tag-list.fnl index c0b73e5..03c256b 100644 --- a/widget/tag-list.fnl +++ b/widget/tag-list.fnl @@ -4,10 +4,12 @@ (local awful (require :awful)) (local beautiful (require :beautiful)) +(local gears (require :gears)) (local wibox (require :wibox)) (local common (require :awful.widget.common)) (local dpi (. (require :beautiful) :xresources :apply_dpi)) +(local button (. (require :lib.keys) :button)) (local std (require :lib.std)) ;;; @@ -93,7 +95,11 @@ (awful.widget.taglist s awful.widget.taglist.filter.all - {} + (gears.table.join + (button [] 1 (lambda [t] (: t :view_only))) + (button [] 3 (lambda [t] (when _G.client.focus (: _G.client.focus :move_to_tag t)))) + (button [] 4 (lambda [t] (awful.tag.viewnext t.screen))) + (button [] 5 (lambda [t] (awful.tag.viewprev t.screen)))) {:font (.. beautiful.font " Bold 10") :spacing 2} ;; update-tag-list