diff options
author | Jaakko Keränen <jaakko.keranen@iki.fi> | 2020-11-03 15:49:15 +0200 |
---|---|---|
committer | Jaakko Keränen <jaakko.keranen@iki.fi> | 2020-11-03 15:49:15 +0200 |
commit | e7f697a2e11d4cf4b6c7219eaf7e9b61e2598fa8 (patch) | |
tree | 2f81e62b3d91ac6e5e38c10a123c53a2f1b0b168 /src/ui | |
parent | 19102c9076cf8790c25edbc72862e8bcd157ad79 (diff) |
DocumentWidget: Keyboard navigation keys on Mac
Some default key shortcuts use Option on macOS, so avoid those for keyboard navigation.
Diffstat (limited to 'src/ui')
-rw-r--r-- | src/ui/documentwidget.c | 52 |
1 files changed, 47 insertions, 5 deletions
diff --git a/src/ui/documentwidget.c b/src/ui/documentwidget.c index cef1275b..604192c5 100644 --- a/src/ui/documentwidget.c +++ b/src/ui/documentwidget.c | |||
@@ -1716,6 +1716,48 @@ static iBool processPlayerEvents_DocumentWidget_(iDocumentWidget *d, const SDL_E | |||
1716 | return iFalse; | 1716 | return iFalse; |
1717 | } | 1717 | } |
1718 | 1718 | ||
1719 | static size_t linkOrdinalFromKey_(int key) { | ||
1720 | if (key >= '1' && key <= '9') { | ||
1721 | return key - '1'; | ||
1722 | } | ||
1723 | if (key < 'a' || key > 'z') { | ||
1724 | return iInvalidPos; | ||
1725 | } | ||
1726 | int ord = key - 'a' + 9; | ||
1727 | #if defined (iPlatformApple) | ||
1728 | /* Skip keys that would conflict with default system shortcuts: hide, minimize, quit, close. */ | ||
1729 | if (key == 'h' || key == 'm' || key == 'q' || key == 'w') { | ||
1730 | return iInvalidPos; | ||
1731 | } | ||
1732 | if (key > 'h') ord--; | ||
1733 | if (key > 'm') ord--; | ||
1734 | if (key > 'q') ord--; | ||
1735 | if (key > 'w') ord--; | ||
1736 | #endif | ||
1737 | return ord; | ||
1738 | } | ||
1739 | |||
1740 | static iChar linkOrdinalChar_(size_t ord) { | ||
1741 | if (ord < 9) { | ||
1742 | return 0x278a + ord; | ||
1743 | } | ||
1744 | #if defined (iPlatformApple) | ||
1745 | if (ord < 9 + 22) { | ||
1746 | int key = 'a' + ord - 9; | ||
1747 | if (key >= 'h') key++; | ||
1748 | if (key >= 'm') key++; | ||
1749 | if (key >= 'q') key++; | ||
1750 | if (key >= 'w') key++; | ||
1751 | return 0x24b6 + key - 'a'; | ||
1752 | } | ||
1753 | #else | ||
1754 | if (ord < 9 + 26) { | ||
1755 | return 0x24b6 + ord - 9; | ||
1756 | } | ||
1757 | #endif | ||
1758 | return 0; | ||
1759 | } | ||
1760 | |||
1719 | static iBool processEvent_DocumentWidget_(iDocumentWidget *d, const SDL_Event *ev) { | 1761 | static iBool processEvent_DocumentWidget_(iDocumentWidget *d, const SDL_Event *ev) { |
1720 | iWidget *w = as_Widget(d); | 1762 | iWidget *w = as_Widget(d); |
1721 | if (ev->type == SDL_USEREVENT && ev->user.code == command_UserEventCode) { | 1763 | if (ev->type == SDL_USEREVENT && ev->user.code == command_UserEventCode) { |
@@ -1746,12 +1788,12 @@ static iBool processEvent_DocumentWidget_(iDocumentWidget *d, const SDL_Event *e | |||
1746 | } | 1788 | } |
1747 | } | 1789 | } |
1748 | if (ev->type == SDL_KEYDOWN) { | 1790 | if (ev->type == SDL_KEYDOWN) { |
1749 | const int mods = keyMods_Sym(ev->key.keysym.mod); | 1791 | const int key = ev->key.keysym.sym; |
1750 | const int key = ev->key.keysym.sym; | ||
1751 | if ((d->flags & showLinkNumbers_DocumentWidgetFlag) && | 1792 | if ((d->flags & showLinkNumbers_DocumentWidgetFlag) && |
1752 | ((key >= '1' && key <= '9') || (key >= 'a' && key <= 'z'))) { | 1793 | ((key >= '1' && key <= '9') || (key >= 'a' && key <= 'z'))) { |
1753 | const size_t ord = isdigit(key) ? key - SDLK_1 : (key - 'a' + 9); | 1794 | const size_t ord = linkOrdinalFromKey_(key); |
1754 | iConstForEach(PtrArray, i, &d->visibleLinks) { | 1795 | iConstForEach(PtrArray, i, &d->visibleLinks) { |
1796 | if (ord == iInvalidPos) break; | ||
1755 | const iGmRun *run = i.ptr; | 1797 | const iGmRun *run = i.ptr; |
1756 | if (run->flags & decoration_GmRunFlag && | 1798 | if (run->flags & decoration_GmRunFlag && |
1757 | visibleLinkOrdinal_DocumentWidget_(d, run->linkId) == ord) { | 1799 | visibleLinkOrdinal_DocumentWidget_(d, run->linkId) == ord) { |
@@ -2160,8 +2202,8 @@ static void drawRun_DrawContext_(void *context, const iGmRun *run) { | |||
2160 | else { | 2202 | else { |
2161 | if (d->showLinkNumbers && run->linkId && run->flags & decoration_GmRunFlag) { | 2203 | if (d->showLinkNumbers && run->linkId && run->flags & decoration_GmRunFlag) { |
2162 | const size_t ord = visibleLinkOrdinal_DocumentWidget_(d->widget, run->linkId); | 2204 | const size_t ord = visibleLinkOrdinal_DocumentWidget_(d->widget, run->linkId); |
2163 | if (ord < 9 + 26) { | 2205 | const iChar ordChar = linkOrdinalChar_(ord); |
2164 | const iChar ordChar = ord < 9 ? 0x278a + ord : (0x24b6 + ord - 9); | 2206 | if (ordChar) { |
2165 | drawString_Text(run->font, | 2207 | drawString_Text(run->font, |
2166 | init_I2(d->viewPos.x - gap_UI / 3, visPos.y), | 2208 | init_I2(d->viewPos.x - gap_UI / 3, visPos.y), |
2167 | fg, | 2209 | fg, |