local wibox = require('wibox') local awful = require('awful') local naughty = require('naughty') local gears = require('gears') local clickable_container = require('widget.clickable-container') local dpi = require('beautiful').xresources.apply_dpi local config_dir = gears.filesystem.get_configuration_dir() local widget_icon_dir = config_dir .. 'widget/xdg-folders/icons/' local trash_widget = wibox.widget { { id = 'trash_icon', image = widget_icon_dir .. 'user-trash-empty' .. '.svg', resize = true, widget = wibox.widget.imagebox }, layout = wibox.layout.align.horizontal } local trash_menu = awful.menu({ items = { { "Open trash", function() awful.spawn.easy_async_with_shell("gio open trash:///", function(stdout) end, 1) end, widget_icon_dir .. 'open-folder' .. '.svg' }, { "Delete forever", { { 'Yes', function() awful.spawn.easy_async_with_shell("gio trash --empty", function(stdout) end, 1) end, widget_icon_dir .. 'yes' .. '.svg' }, { 'No', '', widget_icon_dir .. 'no' .. '.svg' } }, widget_icon_dir .. 'user-trash-empty' .. '.svg' }, } }) local trash_button = wibox.widget { { trash_widget, margins = dpi(10), widget = wibox.container.margin }, widget = clickable_container } -- Tooltip for trash_button trash_tooltip = awful.tooltip { objects = {trash_button}, mode = 'outside', align = 'right', markup = 'Trash', margin_leftright = dpi(8), margin_topbottom = dpi(8), preferred_positions = {'right', 'left', 'top', 'bottom'} } -- Mouse event for trash_button trash_button:buttons( gears.table.join( awful.button( {}, 1, nil, function() awful.spawn({'gio', 'open', 'trash:///'}, false) end ), awful.button( {}, 3, nil, function() trash_menu:toggle() trash_tooltip.visible = not trash_tooltip.visible end ) ) ) -- Update icon on changes local check_trash_list = function() awful.spawn.easy_async_with_shell('gio list trash:/// | wc -l', function(stdout) if tonumber(stdout) > 0 then trash_widget.trash_icon:set_image(widget_icon_dir .. 'user-trash-full' .. '.svg') awful.spawn.easy_async_with_shell('gio list trash:///', function(stdout) trash_tooltip.markup = 'Trash contains:\n' .. stdout:gsub('\n$', '') end, false) else trash_widget.trash_icon:set_image(widget_icon_dir .. 'user-trash-empty' .. '.svg') trash_tooltip.markup = 'Trash empty' end end, false) end -- Check trash on awesome (re)-start check_trash_list() -- Kill the old process of gio monitor trash:/// awful.spawn.easy_async_with_shell('ps x | grep \'gio monitor trash:///\' | grep -v grep | awk \'{print $1}\' | xargs kill', function() awful.spawn.with_line_callback('gio monitor trash:///', { stdout = function(_) check_trash_list() end }) end, false) return trash_button