Keybinding to open URL with URL handler instead of proxy

Fixes #143
This commit is contained in:
makeworld 2021-12-28 17:35:08 -05:00
parent 1aa13f2408
commit 33bf9603b5
8 changed files with 70 additions and 45 deletions

View File

@ -10,6 +10,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- [Client certificates](https://github.com/makeworld-the-better-one/amfora/wiki/Client-Certificates) can be restricted to certain paths of a host (#115) - [Client certificates](https://github.com/makeworld-the-better-one/amfora/wiki/Client-Certificates) can be restricted to certain paths of a host (#115)
- `header` config option in `[subscriptions]` to allow disabling the header text on the subscriptions page (#191) - `header` config option in `[subscriptions]` to allow disabling the header text on the subscriptions page (#191)
- Selected link and scroll position stays for non-cached pages (#122) - Selected link and scroll position stays for non-cached pages (#122)
- Keybinding to open URL with URL handler instead of configured proxy (#143)
### Changed ### Changed
- Center text automatically, removing `left_margin` from the config (#233) - Center text automatically, removing `left_margin` from the config (#233)

View File

@ -255,6 +255,7 @@ func Init() error {
viper.SetDefault("keybindings.bind_beginning", []string{"Home", "g"}) viper.SetDefault("keybindings.bind_beginning", []string{"Home", "g"})
viper.SetDefault("keybindings.bind_end", []string{"End", "G"}) viper.SetDefault("keybindings.bind_end", []string{"End", "G"})
viper.SetDefault("keybindings.shift_numbers", "") viper.SetDefault("keybindings.shift_numbers", "")
viper.SetDefault("keybindings.bind_url_handler_open", "Ctrl-U")
viper.SetDefault("url-handlers.other", "default") viper.SetDefault("url-handlers.other", "default")
viper.SetDefault("cache.max_size", 0) viper.SetDefault("cache.max_size", 0)
viper.SetDefault("cache.max_pages", 20) viper.SetDefault("cache.max_pages", 20)

View File

@ -188,6 +188,7 @@ underline = true
# bind_copy_target_url # bind_copy_target_url
# bind_beginning: moving to beginning of page (top left) # bind_beginning: moving to beginning of page (top left)
# bind_end: same but the for the end (bottom left) # bind_end: same but the for the end (bottom left)
# bind_url_handler_open: Open highlighted URL with URL handler (#143)
[url-handlers] [url-handlers]
# Allows setting the commands to run for various URL schemes. # Allows setting the commands to run for various URL schemes.

View File

@ -61,6 +61,7 @@ const (
CmdCopyTargetURL CmdCopyTargetURL
CmdBeginning CmdBeginning
CmdEnd CmdEnd
CmdURLHandlerOpen // See #143
) )
type keyBinding struct { type keyBinding struct {
@ -161,43 +162,44 @@ func parseBinding(cmd Command, binding string) {
// Called by config.Init() // Called by config.Init()
func KeyInit() { func KeyInit() {
configBindings := map[Command]string{ configBindings := map[Command]string{
CmdLink1: "keybindings.bind_link1", CmdLink1: "keybindings.bind_link1",
CmdLink2: "keybindings.bind_link2", CmdLink2: "keybindings.bind_link2",
CmdLink3: "keybindings.bind_link3", CmdLink3: "keybindings.bind_link3",
CmdLink4: "keybindings.bind_link4", CmdLink4: "keybindings.bind_link4",
CmdLink5: "keybindings.bind_link5", CmdLink5: "keybindings.bind_link5",
CmdLink6: "keybindings.bind_link6", CmdLink6: "keybindings.bind_link6",
CmdLink7: "keybindings.bind_link7", CmdLink7: "keybindings.bind_link7",
CmdLink8: "keybindings.bind_link8", CmdLink8: "keybindings.bind_link8",
CmdLink9: "keybindings.bind_link9", CmdLink9: "keybindings.bind_link9",
CmdLink0: "keybindings.bind_link0", CmdLink0: "keybindings.bind_link0",
CmdBottom: "keybindings.bind_bottom", CmdBottom: "keybindings.bind_bottom",
CmdEdit: "keybindings.bind_edit", CmdEdit: "keybindings.bind_edit",
CmdHome: "keybindings.bind_home", CmdHome: "keybindings.bind_home",
CmdBookmarks: "keybindings.bind_bookmarks", CmdBookmarks: "keybindings.bind_bookmarks",
CmdAddBookmark: "keybindings.bind_add_bookmark", CmdAddBookmark: "keybindings.bind_add_bookmark",
CmdSave: "keybindings.bind_save", CmdSave: "keybindings.bind_save",
CmdReload: "keybindings.bind_reload", CmdReload: "keybindings.bind_reload",
CmdBack: "keybindings.bind_back", CmdBack: "keybindings.bind_back",
CmdForward: "keybindings.bind_forward", CmdForward: "keybindings.bind_forward",
CmdMoveUp: "keybindings.bind_moveup", CmdMoveUp: "keybindings.bind_moveup",
CmdMoveDown: "keybindings.bind_movedown", CmdMoveDown: "keybindings.bind_movedown",
CmdMoveLeft: "keybindings.bind_moveleft", CmdMoveLeft: "keybindings.bind_moveleft",
CmdMoveRight: "keybindings.bind_moveright", CmdMoveRight: "keybindings.bind_moveright",
CmdPgup: "keybindings.bind_pgup", CmdPgup: "keybindings.bind_pgup",
CmdPgdn: "keybindings.bind_pgdn", CmdPgdn: "keybindings.bind_pgdn",
CmdNewTab: "keybindings.bind_new_tab", CmdNewTab: "keybindings.bind_new_tab",
CmdCloseTab: "keybindings.bind_close_tab", CmdCloseTab: "keybindings.bind_close_tab",
CmdNextTab: "keybindings.bind_next_tab", CmdNextTab: "keybindings.bind_next_tab",
CmdPrevTab: "keybindings.bind_prev_tab", CmdPrevTab: "keybindings.bind_prev_tab",
CmdQuit: "keybindings.bind_quit", CmdQuit: "keybindings.bind_quit",
CmdHelp: "keybindings.bind_help", CmdHelp: "keybindings.bind_help",
CmdSub: "keybindings.bind_sub", CmdSub: "keybindings.bind_sub",
CmdAddSub: "keybindings.bind_add_sub", CmdAddSub: "keybindings.bind_add_sub",
CmdCopyPageURL: "keybindings.bind_copy_page_url", CmdCopyPageURL: "keybindings.bind_copy_page_url",
CmdCopyTargetURL: "keybindings.bind_copy_target_url", CmdCopyTargetURL: "keybindings.bind_copy_target_url",
CmdBeginning: "keybindings.bind_beginning", CmdBeginning: "keybindings.bind_beginning",
CmdEnd: "keybindings.bind_end", CmdEnd: "keybindings.bind_end",
CmdURLHandlerOpen: "keybindings.bind_url_handler_open",
} }
// This is split off to allow shift_numbers to override bind_tab[1-90] // This is split off to allow shift_numbers to override bind_tab[1-90]
// (This is needed for older configs so that the default bind_tab values // (This is needed for older configs so that the default bind_tab values

View File

@ -185,6 +185,7 @@ underline = true
# bind_copy_target_url # bind_copy_target_url
# bind_beginning: moving to beginning of page (top left) # bind_beginning: moving to beginning of page (top left)
# bind_end: same but the for the end (bottom left) # bind_end: same but the for the end (bottom left)
# bind_url_handler_open: Open highlighted URL with URL handler (#143)
[url-handlers] [url-handlers]
# Allows setting the commands to run for various URL schemes. # Allows setting the commands to run for various URL schemes.

View File

@ -216,6 +216,8 @@ func handleURL(t *tab, u string, numRedirects int) (string, bool) {
} }
t.mode = tabModeDone t.mode = tabModeDone
t.preferURLHandler = false
go func(p *structs.Page) { go func(p *structs.Page) {
if b && t.hasContent() && !t.isAnAboutPage() && viper.GetBool("subscriptions.popup") { if b && t.hasContent() && !t.isAnAboutPage() && viper.GetBool("subscriptions.popup") {
// The current page might be an untracked feed, and the user wants // The current page might be an untracked feed, and the user wants
@ -261,7 +263,7 @@ func handleURL(t *tab, u string, numRedirects int) (string, bool) {
} }
if strings.HasPrefix(u, "http") { if strings.HasPrefix(u, "http") {
if proxy == "" || proxy == "off" { if proxy == "" || proxy == "off" || t.preferURLHandler {
// No proxy available // No proxy available
handleHTTP(u, true) handleHTTP(u, true)
return ret("", false) return ret("", false)
@ -280,7 +282,7 @@ func handleURL(t *tab, u string, numRedirects int) (string, bool) {
if !strings.HasPrefix(u, "http") && !strings.HasPrefix(u, "gemini") && !strings.HasPrefix(u, "file") { if !strings.HasPrefix(u, "http") && !strings.HasPrefix(u, "gemini") && !strings.HasPrefix(u, "file") {
// Not a Gemini URL // Not a Gemini URL
if proxy == "" || proxy == "off" { if proxy == "" || proxy == "off" || t.preferURLHandler {
// No proxy available // No proxy available
handleOther(u) handleOther(u)
return ret("", false) return ret("", false)

View File

@ -33,6 +33,7 @@ var helpCells = strings.TrimSpace(
"Enter, Tab\tOn a page this will start link highlighting.\n" + "Enter, Tab\tOn a page this will start link highlighting.\n" +
"\tPress Tab and Shift-Tab to pick different links.\n" + "\tPress Tab and Shift-Tab to pick different links.\n" +
"\tPress Enter again to go to one, or Esc to stop.\n" + "\tPress Enter again to go to one, or Esc to stop.\n" +
"%s\tOpen the highlighted URL with a URL handler instead of the configured proxy\n" +
"%s\tGo to a specific tab. (Default: Shift-NUMBER)\n" + "%s\tGo to a specific tab. (Default: Shift-NUMBER)\n" +
"%s\tGo to the last tab.\n" + "%s\tGo to the last tab.\n" +
"%s\tPrevious tab\n" + "%s\tPrevious tab\n" +
@ -95,6 +96,7 @@ func helpInit() {
config.GetKeyBinding(config.CmdEdit), config.GetKeyBinding(config.CmdEdit),
config.GetKeyBinding(config.CmdCopyPageURL), config.GetKeyBinding(config.CmdCopyPageURL),
config.GetKeyBinding(config.CmdCopyTargetURL), config.GetKeyBinding(config.CmdCopyTargetURL),
config.GetKeyBinding(config.CmdURLHandlerOpen),
tabKeys, tabKeys,
config.GetKeyBinding(config.CmdTab0), config.GetKeyBinding(config.CmdTab0),
config.GetKeyBinding(config.CmdPrevTab), config.GetKeyBinding(config.CmdPrevTab),

View File

@ -39,12 +39,13 @@ type tabHistory struct {
// tab hold the information needed for each browser tab. // tab hold the information needed for each browser tab.
type tab struct { type tab struct {
page *structs.Page page *structs.Page
view *cview.TextView view *cview.TextView
history *tabHistory history *tabHistory
mode tabMode mode tabMode
barLabel string // The bottomBar label for the tab barLabel string // The bottomBar label for the tab
barText string // The bottomBar text for the tab barText string // The bottomBar text for the tab
preferURLHandler bool // For #143, use URL handler over proxy
} }
// makeNewTab initializes an tab struct with no content. // makeNewTab initializes an tab struct with no content.
@ -98,6 +99,7 @@ func makeNewTab() *tab {
linkN, _ := strconv.Atoi(currentSelection[0]) linkN, _ := strconv.Atoi(currentSelection[0])
tabs[tab].page.Selected = tabs[tab].page.Links[linkN] tabs[tab].page.Selected = tabs[tab].page.Links[linkN]
tabs[tab].page.SelectedID = currentSelection[0] tabs[tab].page.SelectedID = currentSelection[0]
tabs[tab].preferURLHandler = false // Reset in case
go followLink(tabs[tab], tabs[tab].page.URL, tabs[tab].page.Links[linkN]) go followLink(tabs[tab], tabs[tab].page.URL, tabs[tab].page.Links[linkN])
return return
} }
@ -216,11 +218,24 @@ func makeNewTab() *tab {
return nil return nil
} }
return nil return nil
case config.CmdURLHandlerOpen:
currentSelection := t.view.GetHighlights()
t.preferURLHandler = true
// Copied code from when enter key is pressed
if len(currentSelection) > 0 {
bottomBar.SetLabel("")
linkN, _ := strconv.Atoi(currentSelection[0])
t.page.Selected = t.page.Links[linkN]
t.page.SelectedID = currentSelection[0]
go followLink(&t, t.page.URL, t.page.Links[linkN])
}
return nil
} }
// Number key: 1-9, 0, LINK1-LINK10 // Number key: 1-9, 0, LINK1-LINK10
if cmd >= config.CmdLink1 && cmd <= config.CmdLink0 { if cmd >= config.CmdLink1 && cmd <= config.CmdLink0 {
if int(cmd) <= len(t.page.Links) { if int(cmd) <= len(t.page.Links) {
// It's a valid link number // It's a valid link number
t.preferURLHandler = false // Reset in case
go followLink(&t, t.page.URL, t.page.Links[cmd-1]) go followLink(&t, t.page.URL, t.page.Links[cmd-1])
return nil return nil
} }