diff --git a/modules/xdg_data.lua b/modules/xdg_data.lua
index 0e230ff..0407c03 100644
--- a/modules/xdg_data.lua
+++ b/modules/xdg_data.lua
@@ -140,3 +140,8 @@ awesome.connect_signal("xdg::dir_finished",function(dir)
awesome.emit_signal("xdg::all_finished")
end
end)
+
+-- Before exiting, save all xdg cache
+awesome.connect_signal("exit",function()
+ io.open(gears.filesystem.get_xdg_cache_home()..".reno_xdg_cache.json","w"):write(json.encode(xdg)):close()
+end)
diff --git a/themes/reno98/config/wibar_top.json b/themes/reno98/config/wibar_top.json
index a19cb1c..04d3972 100644
--- a/themes/reno98/config/wibar_top.json
+++ b/themes/reno98/config/wibar_top.json
@@ -17,9 +17,14 @@
"path": "$HOME/Pictures/Wallpapers"
}
},
- { "widget": "widgets.desktop.battery" },
- { "widget": "widgets.base.systray" },
- { "widget": "widgets.base.clock" }
+ {
+ "widget": "widgets.base.subpanel",
+ "layout": {"list":[
+ { "widget": "widgets.desktop.battery" },
+ { "widget": "widgets.base.systray" },
+ { "widget": "widgets.base.clock" }
+ ]}
+ }
]
}
}
diff --git a/widgets/dismal.lua b/widgets/dismal.lua
index e95a39f..73fd564 100644
--- a/widgets/dismal.lua
+++ b/widgets/dismal.lua
@@ -13,19 +13,59 @@ local gears = require("gears")
local awful = require("awful")
local ask = require("asckey")
-local xdg_search = function(name,rlimit)
- local results = {}
- local count = 0
- for _,v in pairs(xdg.apps) do
- if v.name:lower():find(name,nil,true) then
- count = count + 1
- table.insert(results,v)
+local xdg_search = function(name,rlimit,sorting_method)
+ local ranked_results = {}
+ if sorting_method == "usage" then
+ local filter = {}
+ local keys = {}
+ for k,v in pairs(xdg.apps) do
+ if not v.count then
+ v.count = 0
+ end
+ if v.name:lower():find(name,nil,true) then
+ if not filter[v.count] then
+ table.insert(keys, v.count)
+ filter[v.count] = {}
+ end
+ table.insert(filter[v.count],{k,v})
+ end
+ end
+ table.sort(keys,function(a,b) return a > b end)
+ local count = 0
+ local exit = false
+ gears.debug.dump(keys)
+ gears.debug.dump(filter)
+ for k = 1,rlimit do
+ local i = keys[k]
+ if not filter[i] then
+ break
+ end
+ for _,v in pairs(filter[i]) do
+ table.insert(ranked_results, v)
+ count = count + 1
+ if count >= rlimit then
+ exit = true
+ break
+ end
+ end
+ if exit == true then
+ break
+ end
end
- if rlimit <= count then
- break
+ gears.debug.dump(ranked_results)
+ elseif sorting_method == "recent" then
+ local most_recent = 0
+ for k,v in pairs(xdg.apps) do
+ if v.name:lower():find(name,nil,true) and v.atime and v.atime >= most_recent then
+ most_recent = v.atime
+ table.insert(ranked_results,1,{k,v})
+ end
+ if #ranked_results > rlimit then
+ table.remove(ranked_results,rlimit+1)
+ end
end
end
- return results
+ return ranked_results
end
return function(args)
@@ -38,7 +78,7 @@ return function(args)
layout = wibox.layout.fixed.horizontal,
spacing = style.container.spacing
}))
- local button_cache = gears.cache(function(name,exec,description,icon)
+ local button_cache = gears.cache(function(name,exec,description,icon,key)
-- beacause apparently cache doesn't allow nil values
if icon == "" then icon = nil end
-- contents of our button
@@ -59,6 +99,13 @@ return function(args)
widget:connect_signal("button::press",style.button.onpress)
widget:connect_signal("button::release",style.button.onrelease)
widget:connect_signal("mouses::leave",style.button.onrelease)
+ local bump = function()
+ if not xdg.apps[key].count then
+ xdg.apps[key].count = 0
+ end
+ xdg.apps[key].count = xdg.apps[key].count + 1
+ xdg.apps[key].atime = os.time()
+ end
widget:buttons(
gears.table.join(
awful.button({},1,function()
@@ -66,17 +113,21 @@ return function(args)
dismal.visible = false
-- i know it's deprecated, you literally give me no option
awful.keygrabber.stop()
+ bump()
end),
awful.button({"Control"},1,function()
awful.spawn({global.terminal,"-e",exec})
dismal.visible = false
awful.keygrabber.stop()
+ bump()
end),
awful.button({},3,function()
awful.spawn(exec)
+ bump()
end),
awful.button({"Control"},3,function()
awful.spawn({global.terminal,"-e",exec})
+ bump()
end)
)
)
@@ -101,6 +152,23 @@ return function(args)
bgimage = style.container.bgimage_highlight,
forced_width = style.button.width or 180
}),
+ t.container({
+ t.button(
+ t.textbox({
+ markup = "Most used"
+ }),{
+ id = "usage"
+ }),
+ t.button(
+ t.textbox({
+ markup = "Recent"
+ }),{
+ id = "recent"
+ }),
+ id = "buttonbox",
+ spacing = style.container.spacing,
+ layout = wibox.layout.flex.horizontal
+ }),
t.textbox({
markup = "Enter - run\nCtrl+Enter - run in terminal"
}),
@@ -109,14 +177,43 @@ return function(args)
})
local results_list = launchpad:get_children_by_id("resultbox")[1]
local input_field = launchpad:get_children_by_id("inputbox")[1]
+ local usage_sort = launchpad:get_children_by_id("usage")[1]
+ local recent_sort = launchpad:get_children_by_id("recent")[1]
+ local sorting_method = "usage"
+ usage_sort:set_bg(style.bg_focus)
+ if style.button.onpress then
+ style.button.onpress(usage_sort)
+ end
+ usage_sort:connect_signal("button::press",function()
+ recent_sort:set_bg(style.bg_normal)
+ if style.button.onrelease then
+ style.button.onrelease(recent_sort)
+ end
+ usage_sort:set_bg(style.bg_focus)
+ if style.button.onpress then
+ style.button.onpress(usage_sort)
+ end
+ sorting_method = "usage"
+ end)
+ recent_sort:connect_signal("button::press",function()
+ usage_sort:set_bg(style.bg_normal)
+ if style.button.onrelease then
+ style.button.onrelease(usage_sort)
+ end
+ recent_sort:set_bg(style.bg_focus)
+ if style.button.onpress then
+ style.button.onpress(recent_sort)
+ end
+ sorting_method = "recent"
+ end)
root.keys(gears.table.join(
root.keys(),
ask.k(":dismal.run", function()
results_list:reset()
- launchpad.visible = true
- launchpad.x = args.x or 0
- launchpad.y = args.y or 0
- if launchpad.visible then
+ dismal.visible = true
+ dismal.x = args.x or 0
+ dismal.y = args.y or 0
+ if dismal.visible then
awful.prompt.run {
prompt = "Run: ",
textbox = input_field,
@@ -132,18 +229,18 @@ return function(args)
end},
},
done_callback = function()
- dismal:emit_signal("sorted_refresh")
- launchpad.visible = false
+ dismal.visible = false
end,
changed_callback = function(command)
- local results = xdg_search(command,args.result_limit or 5)
+ local results = xdg_search(command,args.result_limit or 5,sorting_method)
results_list:reset()
for _,v in pairs(results) do
- results_list:insert(1,button_cache:get(
- v.name,
- v.exec,
- v.description or "",
- v.icon or ""
+ results_list:add(button_cache:get(
+ v[2].name,
+ v[2].exec,
+ v[2].description or "",
+ v[2].icon or "",
+ v[1]
))
end
end,
@@ -157,21 +254,7 @@ return function(args)
end,{description = "open run menu", group = "widgets"})
))
end
- local sorted
- do -- sorting tab
- sorted = wibox.widget({
- t.container({
- id = "sortingbox",
- layout = wibox.layout.fixed.vertical,
- spacing = style.container.spacing
- },{
- bg = style.container.bg_highlight,
- bgimage = style.container.bgimage_highlight,
- forced_width = style.button.width or 180
- }),
- spacing = style.container.spacing,
- layout = wibox.layout.fixed.vertical
- })
- end
+ local dismal_root = dismal.widget:get_children_by_id("dismal_root")[1]
+ dismal_root:add(launchpad)
return dismal
end