feat: wire up buttons for tag list
This commit is contained in:
		| @@ -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("<i><Invalid text></i>") | ||||
| 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("<i><Invalid text></i>") | ||||
|          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 | ||||
|  | ||||
|   | ||||
| @@ -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 | ||||
|   | ||||
		Reference in New Issue
	
	Block a user