aboutsummaryrefslogtreecommitdiff
path: root/.config/awesome/ui/fresnel/init.lua
diff options
context:
space:
mode:
Diffstat (limited to '.config/awesome/ui/fresnel/init.lua')
-rw-r--r--.config/awesome/ui/fresnel/init.lua60
1 files changed, 52 insertions, 8 deletions
diff --git a/.config/awesome/ui/fresnel/init.lua b/.config/awesome/ui/fresnel/init.lua
index 613bc9c..42ae328 100644
--- a/.config/awesome/ui/fresnel/init.lua
+++ b/.config/awesome/ui/fresnel/init.lua
@@ -147,6 +147,9 @@ function fresnel:_exec_entry(entry)
if type(entry) == "number" then
entry = self._visible_entries[entry]
end
+ if not entry then
+ error("entry does not exist")
+ end
local exec = entry.exec
if type(exec) ~= "userdata" and type(exec) ~= "nil" then
if exec[2] then
@@ -234,8 +237,9 @@ function fresnel:_render(update)
self._prev_selected_idx = self._selected_idx
end
+---@private
---@param up boolean Whether to scroll up or down
-function fresnel:scroll(up)
+function fresnel:_scroll_impl(up)
local direction = up and -1 or 1
local offset = direction
@@ -270,6 +274,14 @@ function fresnel:scroll(up)
self:_render(false)
end
+function fresnel:scroll_down()
+ self:_scroll_impl(false)
+end
+
+function fresnel:scroll_up()
+ self:_scroll_impl(true)
+end
+
fresnel._prev_text = ""
fresnel._w_prompt = wibox.widget {
widget = text_input,
@@ -295,16 +307,37 @@ fresnel._w_prompt:connect_signal("key::press", function(_, _mods, key)
if key == "Escape" or key == " " and mods.Mod4 then
fresnel:hide()
elseif key == "Return" then
- fresnel:_exec_entry(fresnel._selected_idx)
- fresnel:hide()
+ local ok = pcall(fresnel._exec_entry, fresnel, fresnel._selected_idx)
+ if ok then
+ fresnel:hide()
+ end
elseif key == "k" and mods.Mod1 then
- fresnel:scroll(true)
+ fresnel:scroll_up()
elseif key == "j" and mods.Mod1 then
- fresnel:scroll(false)
+ fresnel:scroll_down()
end
end)
-local max_height = qui.BIG_PADDING * 2 + (qui.BIG_PADDING * 2 + qui.CHAR_HEIGHT) * 10
+local PROMPT_HEIGHT =
+ qui.BIG_PADDING +
+ qui.CHAR_HEIGHT +
+ qui.BIG_PADDING
+
+local ENTRY_HEIGHT =
+ qui.PADDING +
+ qui.CHAR_HEIGHT +
+ qui.PADDING
+
+local MAX_HEIGHT =
+ qui.BIG_PADDING +
+ PROMPT_HEIGHT +
+ qui.PADDING +
+ (
+ qui.PADDING * 9 + -- there's n-1 gaps between n elements
+ ENTRY_HEIGHT * 10
+ ) +
+ qui.BIG_PADDING +
+ 1 -- it's off by one for some reason
local width = awful.screen.focused().geometry.width / 2
@@ -379,7 +412,10 @@ function fresnel:show()
self._first_query = true
self._toggled = true
self._t_opacity.target = 1
- self._t_height:set(max_height)
+ self._t_height:set {
+ pos = 0,
+ target = MAX_HEIGHT
+ }
self:_update()
self._w_prompt:focus()
end
@@ -388,7 +424,10 @@ end
function fresnel:_hide()
self._toggled = false
self._t_opacity.target = 0
- self._t_height:set(0)
+ self._t_height:set {
+ pos = fresnel._w_popup.height,
+ target = 0
+ }
for _, lense in ipairs(qnative.lenses) do
lense:interrupt()
end
@@ -406,6 +445,11 @@ fresnel._t_height = qanim:new {
subscribed = function(pos)
fresnel._w_popup.shape_height = pos
end,
+ signals = {
+ ended = function()
+ fresnel._w_popup.shape_height = nil
+ end
+ }
}
fresnel._t_opacity = rubato.timed {