summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJaakko Keränen <jaakko.keranen@iki.fi>2021-04-04 20:46:52 +0300
committerJaakko Keränen <jaakko.keranen@iki.fi>2021-04-04 20:46:52 +0300
commit8759bf5c9e2cccbcf01eeb43b9d83dad4432b69d (patch)
tree6e04c971008828a5d932c6f40c9d83e89eb68c61
parent7c1645bb1fae8a233fd2afe088e8d198f17b4831 (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.
-rw-r--r--src/ui/documentwidget.c40
-rw-r--r--src/ui/util.c4
-rw-r--r--src/ui/util.h1
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
366static 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
375static 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
366static void resetWideRuns_DocumentWidget_(iDocumentWidget *d) { 384static 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) {
1162static void smoothScroll_DocumentWidget_(iDocumentWidget *d, int offset, int duration) { 1180static 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
3636void setUrlFromCache_DocumentWidget(iDocumentWidget *d, const iString *url, iBool isFromCache) { 3654void 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
471iBool 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
473static iBool isCommandIgnoredByMenus_(const char *cmd) { 477static 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);
163iWidget * makeHDiv_Widget (void); 163iWidget * makeHDiv_Widget (void);
164iWidget * makeVDiv_Widget (void); 164iWidget * makeVDiv_Widget (void);
165iWidget * addAction_Widget (iWidget *parent, int key, int kmods, const char *command); 165iWidget * addAction_Widget (iWidget *parent, int key, int kmods, const char *command);
166iBool isAction_Widget (const iWidget *);
166 167
167/*-----------------------------------------------------------------------------------------------*/ 168/*-----------------------------------------------------------------------------------------------*/
168 169