summaryrefslogtreecommitdiff
path: root/src/ui
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 /src/ui
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.
Diffstat (limited to 'src/ui')
-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