diff options
author | Jaakko Keränen <jaakko.keranen@iki.fi> | 2021-01-26 07:34:39 +0200 |
---|---|---|
committer | Jaakko Keränen <jaakko.keranen@iki.fi> | 2021-01-26 07:34:39 +0200 |
commit | 85ccb7e82dc080e033d7aee621b53651aaa457e7 (patch) | |
tree | 65c05dedceb1de9ed95c52469ad2c643d63504a7 | |
parent | c5668c7eb7004cb4edad0cb3a18422bf81a64c19 (diff) | |
parent | 37fefc85a9a23be7c3bc6dcddb8a30047459f534 (diff) |
Merge branch 'pullrequests/Br0000k/dev' into dev
-rw-r--r-- | src/macos.m | 26 | ||||
-rw-r--r-- | src/ui/documentwidget.c | 2 | ||||
-rw-r--r-- | src/ui/inputwidget.c | 10 | ||||
-rw-r--r-- | src/ui/keys.c | 3 | ||||
-rw-r--r-- | src/ui/keys.h | 4 |
5 files changed, 38 insertions, 7 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 | |||
247 | static 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/inputwidget.c b/src/ui/inputwidget.c index 6992bbec..62f0341e 100644 --- a/src/ui/inputwidget.c +++ b/src/ui/inputwidget.c | |||
@@ -224,6 +224,16 @@ static void updateBuffered_InputWidget_(iInputWidget *d) { | |||
224 | } | 224 | } |
225 | 225 | ||
226 | void setText_InputWidget(iInputWidget *d, const iString *text) { | 226 | void setText_InputWidget(iInputWidget *d, const iString *text) { |
227 | if (d->inFlags & isUrl_InputWidgetFlag) { | ||
228 | /* If user wants URLs encoded, also Punycode the domain. */ | ||
229 | if (!prefs_App()->decodeUserVisibleURLs) { | ||
230 | iString *enc = collect_String(copy_String(text)); | ||
231 | /* Prevent address bar spoofing (mentioned as IDN homograph attack in | ||
232 | https://github.com/skyjake/lagrange/issues/73) */ | ||
233 | punyEncodeUrlHost_String(enc); | ||
234 | text = enc; | ||
235 | } | ||
236 | } | ||
227 | clearUndo_InputWidget_(d); | 237 | clearUndo_InputWidget_(d); |
228 | clear_Array(&d->text); | 238 | clear_Array(&d->text); |
229 | iConstForEach(String, i, text) { | 239 | iConstForEach(String, i, text) { |
diff --git a/src/ui/keys.c b/src/ui/keys.c index ec681b6f..656a52ac 100644 --- a/src/ui/keys.c +++ b/src/ui/keys.c | |||
@@ -80,9 +80,12 @@ 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 | { 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 }, |
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 |