** Usable - [-] Tests for api - [ ] Config permission persist (persist_permission_state = 'always' | 'never' | 'in_memory') - [ ] Permission list/allow/deny api - [ ] Fullscreen - [ ] Zoom in/out - [ ] Run JS in page (web.view.eval_js()) - [ ] Use table for all internals api options? - [ ] Create window with new profile ** Bugs - [ ] INVESTIGATE: segfault on api module error - [ ] INVESTIGATE: Check why urlchanged doesnt fire for first url open - [ ] INVESTIGATE: Segfault on close - [ ] INVESTIGATE: Errors in keymap/thread segfaults ** Next - [ ] web.win.* apis (list, current_id) - [ ] Allow toggling devtools - [ ] Tests for window - [ ] More tests for stack - [ ] Tests for router - [ ] Set search text as the user is typing (dmenu -r) - [ ] Log stdout, errors and results from lua somewhere - [ ] Conflict in keymap (keymap already exists) - [ ] Allow pattern filtering for event listeners - [ ] Allow tab_id, win_id filtering for event listeners - [ ] Handle resource cleanup + signal disconnecting - [ ] Profiles - [ ] Private window (in-memory profile) - [ ] Read page contents via lua ** Later - [ ] Bookmarking - [ ] User scripts (greasemonkey?) - [ ] User stylesheets (per site and global?) - [ ] Support multiple modes for keymap.set: `web.keymap.set({'n','i'}, ...)` - [ ] static linking for qt - [X] vendor web.inspect with build - [ ] Right click context menu items - [ ] Listen to renderprocesstermination signal - [ ] Create view with html (web.view.set_html()) - [ ] Change instance manager command format ** Later later - [ ] Custom file picker - [ ] remote debugging with cdp (spider-repl) ** Maybe - [ ] Floating webviews? - [ ] Move modal keymap management into lua? ** Notes - view = 0, nil, none: Current view - Win = 0: Current window - Win = nil, none: All windows or current window based on operation - Keep track of last focused window (current window is last focused) #+begin_src lua web.view.set_url(url) -- Set url for current view web.view.set_url(url, { view = 1 }) -- Set url for view 1 web.view.set_url(url, { view = 1, win = 1 }) -- Set url for view 1 in win 1 web.view.set_url(url, { win = 1 }) -- Set url for current view in win 1 web.view.create(url, { win = 1 }) -- New view in win 1 web.view.create(url) -- New view in current window web.view.close({ view = 1 }) -- Close view 1 web.view.close() -- Close current view in current window web.view.list({ win = nil }) -- List all tabs web.view.list({ win = 1 }) -- List win 1 tabs web.view.select({ view = 1, win = 1 }) -- Select win 1 view web.view.select({ view = 1, win = 0 }) -- Select view 1 in current window web.view.select({ view = 1 }) -- Select view 1 web.view.current({ win = 1 }) -- Current view in win 1 web.view.current() -- Current view in current win web.history.back(1) -- Back for current view in current window web.history.back(1, { view = 1 }) -- Back for view 1 web.history.back(1, { win = 1 }) -- Back for current view in win 1 web.keymap.set('n', '', ..., { view = 1 }) -- Set keymap for view 1 web.keymap.set('n', '', ..., { win = 1 }) -- Set keymap for win 1 web.opt.new_tab_url = 'https://duckduckgo.com' -- Search api web.search.set_search_text('whatever') web.search.next() web.search.prev() web.search.get_search_text() web.search.current() web.search.total() web.keymap.set('n', '/', function() dmenu.input({ prompt = 'Search:' }, function(err, input) if err or not input then return end web.search.set_search_text(input) end) end) web.keymap.set('n', 'n', function() web.search.next() end) web.keymap.set('n', 'p', function() web.search.prev() end) web.event.add_listener('SearchChanged', { callback = function() local label = web.search.get_search_text() .. ': ' .. web.search.current() .. '/' .. web.search.total() -- CALL notify-send -- OR inject js into view to show ui end, }) web.view.open_devtools() web.view.open_devtools(2) #+end_src