diff options
author | Jaakko Keränen <jaakko.keranen@iki.fi> | 2021-04-04 20:46:52 +0300 |
---|---|---|
committer | Jaakko Keränen <jaakko.keranen@iki.fi> | 2021-04-04 20:46:52 +0300 |
commit | 8759bf5c9e2cccbcf01eeb43b9d83dad4432b69d (patch) | |
tree | 6e04c971008828a5d932c6f40c9d83e89eb68c61 /src | |
parent | 7c1645bb1fae8a233fd2afe088e8d198f17b4831 (diff) |
DocumentWidget: Key navigation mode vs. bound actions
Events are dispatched first to child widgets, so the menus and actions of DocumentWidget were still handling key navigation events even though they shouldn't.
Diffstat (limited to 'src')
-rw-r--r-- | src/ui/documentwidget.c | 40 | ||||
-rw-r--r-- | src/ui/util.c | 4 | ||||
-rw-r--r-- | src/ui/util.h | 1 |
3 files changed, 34 insertions, 11 deletions
diff --git a/src/ui/documentwidget.c b/src/ui/documentwidget.c index 733ed543..240b2d4a 100644 --- a/src/ui/documentwidget.c +++ b/src/ui/documentwidget.c | |||
@@ -363,6 +363,24 @@ void deinit_DocumentWidget(iDocumentWidget *d) { | |||
363 | deinit_PersistentDocumentState(&d->mod); | 363 | deinit_PersistentDocumentState(&d->mod); |
364 | } | 364 | } |
365 | 365 | ||
366 | static void enableActions_DocumentWidget_(iDocumentWidget *d, iBool enable) { | ||
367 | /* Actions are invisible child widgets of the DocumentWidget. */ | ||
368 | iForEach(ObjectList, i, children_Widget(d)) { | ||
369 | if (isAction_Widget(i.object)) { | ||
370 | setFlags_Widget(i.object, disabled_WidgetFlag, !enable); | ||
371 | } | ||
372 | } | ||
373 | } | ||
374 | |||
375 | static void setLinkNumberMode_DocumentWidget_(iDocumentWidget *d, iBool set) { | ||
376 | iChangeFlags(d->flags, showLinkNumbers_DocumentWidgetFlag, set); | ||
377 | /* Children have priority when handling events. */ | ||
378 | enableActions_DocumentWidget_(d, !set); | ||
379 | if (d->menu) { | ||
380 | setFlags_Widget(d->menu, disabled_WidgetFlag, set); | ||
381 | } | ||
382 | } | ||
383 | |||
366 | static void resetWideRuns_DocumentWidget_(iDocumentWidget *d) { | 384 | static void resetWideRuns_DocumentWidget_(iDocumentWidget *d) { |
367 | clear_Array(&d->wideRunOffsets); | 385 | clear_Array(&d->wideRunOffsets); |
368 | d->animWideRunId = 0; | 386 | d->animWideRunId = 0; |
@@ -1054,7 +1072,7 @@ static void fetch_DocumentWidget_(iDocumentWidget *d) { | |||
1054 | postCommandf_App("document.request.started doc:%p url:%s", d, cstr_String(d->mod.url)); | 1072 | postCommandf_App("document.request.started doc:%p url:%s", d, cstr_String(d->mod.url)); |
1055 | clear_ObjectList(d->media); | 1073 | clear_ObjectList(d->media); |
1056 | d->certFlags = 0; | 1074 | d->certFlags = 0; |
1057 | d->flags &= ~showLinkNumbers_DocumentWidgetFlag; | 1075 | setLinkNumberMode_DocumentWidget_(d, iFalse); |
1058 | d->state = fetching_RequestState; | 1076 | d->state = fetching_RequestState; |
1059 | set_Atomic(&d->isRequestUpdated, iFalse); | 1077 | set_Atomic(&d->isRequestUpdated, iFalse); |
1060 | d->request = new_GmRequest(certs_App()); | 1078 | d->request = new_GmRequest(certs_App()); |
@@ -1162,7 +1180,7 @@ static void refreshWhileScrolling_DocumentWidget_(iAny *ptr) { | |||
1162 | static void smoothScroll_DocumentWidget_(iDocumentWidget *d, int offset, int duration) { | 1180 | static void smoothScroll_DocumentWidget_(iDocumentWidget *d, int offset, int duration) { |
1163 | /* Get rid of link numbers when scrolling. */ | 1181 | /* Get rid of link numbers when scrolling. */ |
1164 | if (offset && d->flags & showLinkNumbers_DocumentWidgetFlag) { | 1182 | if (offset && d->flags & showLinkNumbers_DocumentWidgetFlag) { |
1165 | d->flags &= ~showLinkNumbers_DocumentWidgetFlag; | 1183 | setLinkNumberMode_DocumentWidget_(d, iFalse); |
1166 | invalidateVisibleLinks_DocumentWidget_(d); | 1184 | invalidateVisibleLinks_DocumentWidget_(d); |
1167 | } | 1185 | } |
1168 | if (!prefs_App()->smoothScrolling) { | 1186 | if (!prefs_App()->smoothScrolling) { |
@@ -1649,7 +1667,7 @@ static iBool handleCommand_DocumentWidget_(iDocumentWidget *d, const char *cmd) | |||
1649 | iWidget *w = as_Widget(d); | 1667 | iWidget *w = as_Widget(d); |
1650 | if (equal_Command(cmd, "window.resized") || equal_Command(cmd, "font.changed")) { | 1668 | if (equal_Command(cmd, "window.resized") || equal_Command(cmd, "font.changed")) { |
1651 | /* Alt/Option key may be involved in window size changes. */ | 1669 | /* Alt/Option key may be involved in window size changes. */ |
1652 | iChangeFlags(d->flags, showLinkNumbers_DocumentWidgetFlag, iFalse); | 1670 | setLinkNumberMode_DocumentWidget_(d, iFalse); |
1653 | d->phoneToolbar = findWidget_App("toolbar"); | 1671 | d->phoneToolbar = findWidget_App("toolbar"); |
1654 | const iBool keepCenter = equal_Command(cmd, "font.changed"); | 1672 | const iBool keepCenter = equal_Command(cmd, "font.changed"); |
1655 | updateDocumentWidthRetainingScrollPosition_DocumentWidget_(d, keepCenter); | 1673 | updateDocumentWidthRetainingScrollPosition_DocumentWidget_(d, keepCenter); |
@@ -1661,7 +1679,7 @@ static iBool handleCommand_DocumentWidget_(iDocumentWidget *d, const char *cmd) | |||
1661 | } | 1679 | } |
1662 | else if (equal_Command(cmd, "window.focus.lost")) { | 1680 | else if (equal_Command(cmd, "window.focus.lost")) { |
1663 | if (d->flags & showLinkNumbers_DocumentWidgetFlag) { | 1681 | if (d->flags & showLinkNumbers_DocumentWidgetFlag) { |
1664 | d->flags &= ~showLinkNumbers_DocumentWidgetFlag; | 1682 | setLinkNumberMode_DocumentWidget_(d, iFalse); |
1665 | invalidateVisibleLinks_DocumentWidget_(d); | 1683 | invalidateVisibleLinks_DocumentWidget_(d); |
1666 | refresh_Widget(w); | 1684 | refresh_Widget(w); |
1667 | } | 1685 | } |
@@ -1682,7 +1700,7 @@ static iBool handleCommand_DocumentWidget_(iDocumentWidget *d, const char *cmd) | |||
1682 | updateSize_DocumentWidget(d); | 1700 | updateSize_DocumentWidget(d); |
1683 | } | 1701 | } |
1684 | else if (equal_Command(cmd, "tabs.changed")) { | 1702 | else if (equal_Command(cmd, "tabs.changed")) { |
1685 | iChangeFlags(d->flags, showLinkNumbers_DocumentWidgetFlag, iFalse); | 1703 | setLinkNumberMode_DocumentWidget_(d, iFalse); |
1686 | if (cmp_String(id_Widget(w), suffixPtr_Command(cmd, "id")) == 0) { | 1704 | if (cmp_String(id_Widget(w), suffixPtr_Command(cmd, "id")) == 0) { |
1687 | /* Set palette for our document. */ | 1705 | /* Set palette for our document. */ |
1688 | updateTheme_DocumentWidget_(d); | 1706 | updateTheme_DocumentWidget_(d); |
@@ -1987,7 +2005,7 @@ static iBool handleCommand_DocumentWidget_(iDocumentWidget *d, const char *cmd) | |||
1987 | } | 2005 | } |
1988 | else if (equal_Command(cmd, "document.linkkeys") && document_App() == d) { | 2006 | else if (equal_Command(cmd, "document.linkkeys") && document_App() == d) { |
1989 | if (argLabel_Command(cmd, "release")) { | 2007 | if (argLabel_Command(cmd, "release")) { |
1990 | iChangeFlags(d->flags, showLinkNumbers_DocumentWidgetFlag, iFalse); | 2008 | setLinkNumberMode_DocumentWidget_(d, iFalse); |
1991 | } | 2009 | } |
1992 | else if (argLabel_Command(cmd, "more")) { | 2010 | else if (argLabel_Command(cmd, "more")) { |
1993 | if (d->flags & showLinkNumbers_DocumentWidgetFlag && | 2011 | if (d->flags & showLinkNumbers_DocumentWidgetFlag && |
@@ -2007,13 +2025,13 @@ static iBool handleCommand_DocumentWidget_(iDocumentWidget *d, const char *cmd) | |||
2007 | else if (~d->flags & showLinkNumbers_DocumentWidgetFlag) { | 2025 | else if (~d->flags & showLinkNumbers_DocumentWidgetFlag) { |
2008 | d->ordinalMode = homeRow_DocumentLinkOrdinalMode; | 2026 | d->ordinalMode = homeRow_DocumentLinkOrdinalMode; |
2009 | d->ordinalBase = 0; | 2027 | d->ordinalBase = 0; |
2010 | iChangeFlags(d->flags, showLinkNumbers_DocumentWidgetFlag, iTrue); | 2028 | setLinkNumberMode_DocumentWidget_(d, iTrue); |
2011 | } | 2029 | } |
2012 | } | 2030 | } |
2013 | else { | 2031 | else { |
2014 | d->ordinalMode = arg_Command(cmd); | 2032 | d->ordinalMode = arg_Command(cmd); |
2015 | d->ordinalBase = 0; | 2033 | d->ordinalBase = 0; |
2016 | iChangeFlags(d->flags, showLinkNumbers_DocumentWidgetFlag, iTrue); | 2034 | setLinkNumberMode_DocumentWidget_(d, iTrue); |
2017 | iChangeFlags(d->flags, setHoverViaKeys_DocumentWidgetFlag, | 2035 | iChangeFlags(d->flags, setHoverViaKeys_DocumentWidgetFlag, |
2018 | argLabel_Command(cmd, "hover") != 0); | 2036 | argLabel_Command(cmd, "hover") != 0); |
2019 | iChangeFlags(d->flags, newTabViaHomeKeys_DocumentWidgetFlag, | 2037 | iChangeFlags(d->flags, newTabViaHomeKeys_DocumentWidgetFlag, |
@@ -2457,7 +2475,7 @@ static iBool processEvent_DocumentWidget_(iDocumentWidget *d, const SDL_Event *e | |||
2457 | cstr_String(absoluteUrl_String( | 2475 | cstr_String(absoluteUrl_String( |
2458 | d->mod.url, linkUrl_GmDocument(d->doc, run->linkId)))); | 2476 | d->mod.url, linkUrl_GmDocument(d->doc, run->linkId)))); |
2459 | } | 2477 | } |
2460 | iChangeFlags(d->flags, showLinkNumbers_DocumentWidgetFlag, iFalse); | 2478 | setLinkNumberMode_DocumentWidget_(d, iFalse); |
2461 | invalidateVisibleLinks_DocumentWidget_(d); | 2479 | invalidateVisibleLinks_DocumentWidget_(d); |
2462 | refresh_Widget(d); | 2480 | refresh_Widget(d); |
2463 | return iTrue; | 2481 | return iTrue; |
@@ -2467,7 +2485,7 @@ static iBool processEvent_DocumentWidget_(iDocumentWidget *d, const SDL_Event *e | |||
2467 | switch (key) { | 2485 | switch (key) { |
2468 | case SDLK_ESCAPE: | 2486 | case SDLK_ESCAPE: |
2469 | if (d->flags & showLinkNumbers_DocumentWidgetFlag && document_App() == d) { | 2487 | if (d->flags & showLinkNumbers_DocumentWidgetFlag && document_App() == d) { |
2470 | iChangeFlags(d->flags, showLinkNumbers_DocumentWidgetFlag, iFalse); | 2488 | setLinkNumberMode_DocumentWidget_(d, iFalse); |
2471 | invalidateVisibleLinks_DocumentWidget_(d); | 2489 | invalidateVisibleLinks_DocumentWidget_(d); |
2472 | refresh_Widget(d); | 2490 | refresh_Widget(d); |
2473 | return iTrue; | 2491 | return iTrue; |
@@ -3634,7 +3652,7 @@ void deserializeState_DocumentWidget(iDocumentWidget *d, iStream *ins) { | |||
3634 | } | 3652 | } |
3635 | 3653 | ||
3636 | void setUrlFromCache_DocumentWidget(iDocumentWidget *d, const iString *url, iBool isFromCache) { | 3654 | void setUrlFromCache_DocumentWidget(iDocumentWidget *d, const iString *url, iBool isFromCache) { |
3637 | d->flags &= ~showLinkNumbers_DocumentWidgetFlag; | 3655 | setLinkNumberMode_DocumentWidget_(d, iFalse); |
3638 | set_String(d->mod.url, urlFragmentStripped_String(url)); | 3656 | set_String(d->mod.url, urlFragmentStripped_String(url)); |
3639 | /* See if there a username in the URL. */ | 3657 | /* See if there a username in the URL. */ |
3640 | parseUser_DocumentWidget_(d); | 3658 | parseUser_DocumentWidget_(d); |
diff --git a/src/ui/util.c b/src/ui/util.c index 017e1d98..4793f447 100644 --- a/src/ui/util.c +++ b/src/ui/util.c | |||
@@ -468,6 +468,10 @@ iWidget *addAction_Widget(iWidget *parent, int key, int kmods, const char *comma | |||
468 | return as_Widget(action); | 468 | return as_Widget(action); |
469 | } | 469 | } |
470 | 470 | ||
471 | iBool isAction_Widget(const iWidget *d) { | ||
472 | return isInstance_Object(d, &Class_LabelWidget) && isEqual_I2(d->rect.size, zero_I2()); | ||
473 | } | ||
474 | |||
471 | /*-----------------------------------------------------------------------------------------------*/ | 475 | /*-----------------------------------------------------------------------------------------------*/ |
472 | 476 | ||
473 | static iBool isCommandIgnoredByMenus_(const char *cmd) { | 477 | static iBool isCommandIgnoredByMenus_(const char *cmd) { |
diff --git a/src/ui/util.h b/src/ui/util.h index 02b0df38..eb8e31c3 100644 --- a/src/ui/util.h +++ b/src/ui/util.h | |||
@@ -163,6 +163,7 @@ iLabelWidget * makeHeading_Widget (const char *text); | |||
163 | iWidget * makeHDiv_Widget (void); | 163 | iWidget * makeHDiv_Widget (void); |
164 | iWidget * makeVDiv_Widget (void); | 164 | iWidget * makeVDiv_Widget (void); |
165 | iWidget * addAction_Widget (iWidget *parent, int key, int kmods, const char *command); | 165 | iWidget * addAction_Widget (iWidget *parent, int key, int kmods, const char *command); |
166 | iBool isAction_Widget (const iWidget *); | ||
166 | 167 | ||
167 | /*-----------------------------------------------------------------------------------------------*/ | 168 | /*-----------------------------------------------------------------------------------------------*/ |
168 | 169 | ||