summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJaakko Keränen <jaakko.keranen@iki.fi>2021-01-26 07:34:22 +0200
committerJaakko Keränen <jaakko.keranen@iki.fi>2021-01-26 07:34:22 +0200
commit37fefc85a9a23be7c3bc6dcddb8a30047459f534 (patch)
treed35e00807cb4ab5d351f5149b6aae0eed0e9be63 /src
parent90d1acd4a88822675208f5e1d445b5017f7cbfb8 (diff)
Keybindings for new tab, close tab, add bookmark
Added new keybindings for opening and closing a tab. Also added a keybinding for adding a bookmark so ⌘D can be made available. On macOS, there is a default Window > Close menu item, so treat that as a "tabs.close" command to make it bindable. IssueID #121
Diffstat (limited to 'src')
-rw-r--r--src/macos.m26
-rw-r--r--src/ui/documentwidget.c2
-rw-r--r--src/ui/keys.c4
-rw-r--r--src/ui/keys.h4
4 files changed, 28 insertions, 8 deletions
diff --git a/src/macos.m b/src/macos.m
index 4e214923..9d46d84b 100644
--- a/src/macos.m
+++ b/src/macos.m
@@ -241,10 +241,20 @@ static void appearanceChanged_MacOS_(NSString *name) {
241 241
242- (void)showPreferences { 242- (void)showPreferences {
243 postCommand_App("preferences"); 243 postCommand_App("preferences");
244 ignoreImmediateKeyDownEvents_();
245}
246
247static void ignoreImmediateKeyDownEvents_(void) {
248 /* SDL ignores menu key equivalents so the keydown events will be posted regardless.
249 However, we shouldn't double-activate menu items when a shortcut key is used in our
250 widgets. Quite a kludge: take advantage of Window's focus-acquisition threshold to
251 ignore the immediately following key down events. */
252 get_Window()->focusGainedAt = SDL_GetTicks();
244} 253}
245 254
246- (void)closeTab { 255- (void)closeTab {
247 postCommand_App("tabs.close"); 256 postCommand_App("tabs.close");
257 ignoreImmediateKeyDownEvents_();
248} 258}
249 259
250- (NSString *)commandForItem:(NSMenuItem *)menuItem { 260- (NSString *)commandForItem:(NSMenuItem *)menuItem {
@@ -255,11 +265,7 @@ static void appearanceChanged_MacOS_(NSString *name) {
255 NSString *command = [menuCommands objectForKey:[(NSMenuItem *)sender title]]; 265 NSString *command = [menuCommands objectForKey:[(NSMenuItem *)sender title]];
256 if (command) { 266 if (command) {
257 postCommand_App([command cStringUsingEncoding:NSUTF8StringEncoding]); 267 postCommand_App([command cStringUsingEncoding:NSUTF8StringEncoding]);
258 /* Shouldn't double-activate menu items in case the same key is used in our widgets. 268 ignoreImmediateKeyDownEvents_();
259 SDL ignores menu key equivalents so the keydown events will be posted regardless.
260 This is quite a kludge, but we can achieve this by taking advantage of Window's
261 focus-acquisition threshold for ignoring key events. */
262 get_Window()->focusGainedAt = SDL_GetTicks();
263 } 269 }
264} 270}
265 271
@@ -501,11 +507,17 @@ void handleCommand_MacOS(const char *cmd) {
501 NSApplication *app = [NSApplication sharedApplication]; 507 NSApplication *app = [NSApplication sharedApplication];
502 MyDelegate *myDel = (MyDelegate *) app.delegate; 508 MyDelegate *myDel = (MyDelegate *) app.delegate;
503 NSMenu *appMenu = [app mainMenu]; 509 NSMenu *appMenu = [app mainMenu];
510 int mainIndex = 0;
504 for (NSMenuItem *mainMenuItem in appMenu.itemArray) { 511 for (NSMenuItem *mainMenuItem in appMenu.itemArray) {
505 NSMenu *menu = mainMenuItem.submenu; 512 NSMenu *menu = mainMenuItem.submenu;
506 if (menu) { 513 if (menu) {
507 for (NSMenuItem *menuItem in menu.itemArray) { 514 int itemIndex = 0;
515 for (NSMenuItem *menuItem in menu.itemArray) {
508 NSString *command = [myDel commandForItem:menuItem]; 516 NSString *command = [myDel commandForItem:menuItem];
517 if (!command && mainIndex == 6 && itemIndex == 0) {
518 /* Window > Close */
519 command = @"tabs.close";
520 }
509 if (command) { 521 if (command) {
510 const iBinding *bind = findCommand_Keys( 522 const iBinding *bind = findCommand_Keys(
511 [command cStringUsingEncoding:NSUTF8StringEncoding]); 523 [command cStringUsingEncoding:NSUTF8StringEncoding]);
@@ -513,8 +525,10 @@ void handleCommand_MacOS(const char *cmd) {
513 setShortcut_NSMenuItem_(menuItem, bind->key, bind->mods); 525 setShortcut_NSMenuItem_(menuItem, bind->key, bind->mods);
514 } 526 }
515 } 527 }
528 itemIndex++;
516 } 529 }
517 } 530 }
531 mainIndex++;
518 } 532 }
519 } 533 }
520} 534}
diff --git a/src/ui/documentwidget.c b/src/ui/documentwidget.c
index c725a8f6..68f3c966 100644
--- a/src/ui/documentwidget.c
+++ b/src/ui/documentwidget.c
@@ -253,7 +253,7 @@ void init_DocumentWidget(iDocumentWidget *d) {
253 resizeToParentWidth_WidgetFlag | resizeToParentHeight_WidgetFlag); 253 resizeToParentWidth_WidgetFlag | resizeToParentHeight_WidgetFlag);
254#if !defined (iPlatformApple) /* in system menu */ 254#if !defined (iPlatformApple) /* in system menu */
255 addAction_Widget(w, reload_KeyShortcut, "navigate.reload"); 255 addAction_Widget(w, reload_KeyShortcut, "navigate.reload");
256 addAction_Widget(w, SDLK_w, KMOD_PRIMARY, "tabs.close"); 256 addAction_Widget(w, closeTab_KeyShortcut, "tabs.close");
257 addAction_Widget(w, SDLK_d, KMOD_PRIMARY, "bookmark.add"); 257 addAction_Widget(w, SDLK_d, KMOD_PRIMARY, "bookmark.add");
258 addAction_Widget(w, subscribeToPage_KeyModifier, "feeds.subscribe"); 258 addAction_Widget(w, subscribeToPage_KeyModifier, "feeds.subscribe");
259#endif 259#endif
diff --git a/src/ui/keys.c b/src/ui/keys.c
index 5cf071fb..656a52ac 100644
--- a/src/ui/keys.c
+++ b/src/ui/keys.c
@@ -80,12 +80,14 @@ static const struct { int id; iMenuItem bind; int flags; } defaultBindings_[] =
80 { 45, { "Open link in new tab via home row keys", 'f', KMOD_SHIFT, "document.linkkeys arg:1 newtab:1" }, 0 }, 80 { 45, { "Open link in new tab via home row keys", 'f', KMOD_SHIFT, "document.linkkeys arg:1 newtab:1" }, 0 },
81 { 46, { "Hover on link via home row keys", 'h', 0, "document.linkkeys arg:1 hover:1" }, 0 }, 81 { 46, { "Hover on link via home row keys", 'h', 0, "document.linkkeys arg:1 hover:1" }, 0 },
82 { 47, { "Next set of home row key links", '.', 0, "document.linkkeys more:1" }, 0 }, 82 { 47, { "Next set of home row key links", '.', 0, "document.linkkeys more:1" }, 0 },
83 { 50, { "Add bookmark", 'd', KMOD_PRIMARY, "bookmark.add" }, 0 },
83 { 70, { "Zoom in", SDLK_EQUALS, KMOD_PRIMARY, "zoom.delta arg:10" }, 0 }, 84 { 70, { "Zoom in", SDLK_EQUALS, KMOD_PRIMARY, "zoom.delta arg:10" }, 0 },
84 { 71, { "Zoom out", SDLK_MINUS, KMOD_PRIMARY, "zoom.delta arg:-10" }, 0 }, 85 { 71, { "Zoom out", SDLK_MINUS, KMOD_PRIMARY, "zoom.delta arg:-10" }, 0 },
85 { 72, { "Reset zoom", SDLK_0, KMOD_PRIMARY, "zoom.set arg:100" }, 0 }, 86 { 72, { "Reset zoom", SDLK_0, KMOD_PRIMARY, "zoom.set arg:100" }, 0 },
87 { 76, { "New tab", newTab_KeyShortcut, "tabs.new" }, 0 },
88 { 77, { "Close tab", closeTab_KeyShortcut, "tabs.close" }, 0 },
86 { 80, { "Previous tab", prevTab_KeyShortcut, "tabs.prev" }, 0 }, 89 { 80, { "Previous tab", prevTab_KeyShortcut, "tabs.prev" }, 0 },
87 { 81, { "Next tab", nextTab_KeyShortcut, "tabs.next" }, 0 }, 90 { 81, { "Next tab", nextTab_KeyShortcut, "tabs.next" }, 0 },
88 { 82, { "Close tab", 'c', 0, "tabs.close" }, 0 },
89 { 100,{ "Toggle show URL on hover", '/', KMOD_PRIMARY, "prefs.hoverlink.toggle" }, 0 }, 91 { 100,{ "Toggle show URL on hover", '/', KMOD_PRIMARY, "prefs.hoverlink.toggle" }, 0 },
90 /* The following cannot currently be changed (built-in duplicates). */ 92 /* The following cannot currently be changed (built-in duplicates). */
91 { 1000, { NULL, SDLK_SPACE, KMOD_SHIFT, "scroll.page arg:-1" }, argRepeat_BindFlag }, 93 { 1000, { NULL, SDLK_SPACE, KMOD_SHIFT, "scroll.page arg:-1" }, argRepeat_BindFlag },
diff --git a/src/ui/keys.h b/src/ui/keys.h
index 8bcd4f53..f6f0b465 100644
--- a/src/ui/keys.h
+++ b/src/ui/keys.h
@@ -28,6 +28,8 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */
28 28
29#if defined (iPlatformApple) 29#if defined (iPlatformApple)
30# define reload_KeyShortcut SDLK_r, KMOD_PRIMARY 30# define reload_KeyShortcut SDLK_r, KMOD_PRIMARY
31# define newTab_KeyShortcut SDLK_t, KMOD_PRIMARY
32# define closeTab_KeyShortcut SDLK_w, KMOD_PRIMARY
31# define prevTab_KeyShortcut SDLK_LEFTBRACKET, KMOD_SHIFT | KMOD_PRIMARY 33# define prevTab_KeyShortcut SDLK_LEFTBRACKET, KMOD_SHIFT | KMOD_PRIMARY
32# define nextTab_KeyShortcut SDLK_RIGHTBRACKET, KMOD_SHIFT | KMOD_PRIMARY 34# define nextTab_KeyShortcut SDLK_RIGHTBRACKET, KMOD_SHIFT | KMOD_PRIMARY
33# define navigateBack_KeyShortcut SDLK_LEFT, KMOD_PRIMARY 35# define navigateBack_KeyShortcut SDLK_LEFT, KMOD_PRIMARY
@@ -40,6 +42,8 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */
40# define subscribeToPage_KeyModifier SDLK_d, KMOD_SHIFT | KMOD_PRIMARY 42# define subscribeToPage_KeyModifier SDLK_d, KMOD_SHIFT | KMOD_PRIMARY
41#else 43#else
42# define reload_KeyShortcut SDLK_r, KMOD_PRIMARY 44# define reload_KeyShortcut SDLK_r, KMOD_PRIMARY
45# define newTab_KeyShortcut SDLK_t, KMOD_PRIMARY
46# define closeTab_KeyShortcut SDLK_w, KMOD_PRIMARY
43# define prevTab_KeyShortcut SDLK_PAGEUP, KMOD_PRIMARY 47# define prevTab_KeyShortcut SDLK_PAGEUP, KMOD_PRIMARY
44# define nextTab_KeyShortcut SDLK_PAGEDOWN, KMOD_PRIMARY 48# define nextTab_KeyShortcut SDLK_PAGEDOWN, KMOD_PRIMARY
45# define navigateBack_KeyShortcut SDLK_LEFT, KMOD_ALT 49# define navigateBack_KeyShortcut SDLK_LEFT, KMOD_ALT