summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJaakko Keränen <jaakko.keranen@iki.fi>2021-12-13 10:58:59 +0200
committerJaakko Keränen <jaakko.keranen@iki.fi>2021-12-13 11:00:26 +0200
commitf45c27a85013cdf4261c8f0d5673e3ba5420cdd6 (patch)
tree971b3f0a02c38a29652127cba33924da1a5a3b46
parent806a3ce4d56c85d80b7d050c052caa1abbf1bd40 (diff)
Android: Various fixes to get things up and running
Resource paths, runtime data, ignore mouse events. Assume that the Java side tells us the display pixel density via a command line argument.
-rw-r--r--src/app.c39
-rw-r--r--src/resources.c5
-rw-r--r--src/ui/documentwidget.c4
-rw-r--r--src/ui/touch.c4
-rw-r--r--src/ui/window.c10
5 files changed, 50 insertions, 12 deletions
diff --git a/src/app.c b/src/app.c
index a2de03ca..bfac84d9 100644
--- a/src/app.c
+++ b/src/app.c
@@ -92,7 +92,10 @@ static const char *defaultDataDir_App_ = "~/Library/Application Support";
92#define EMB_BIN "../resources.lgr" 92#define EMB_BIN "../resources.lgr"
93static const char *defaultDataDir_App_ = "~/AppData/Roaming/fi.skyjake.Lagrange"; 93static const char *defaultDataDir_App_ = "~/AppData/Roaming/fi.skyjake.Lagrange";
94#endif 94#endif
95#if defined (iPlatformLinux) || defined (iPlatformOther) 95#if defined (iPlatformAndroidMobile)
96#define EMB_BIN "resources.lgr" /* loaded from assets with SDL_rwops */
97static const char *defaultDataDir_App_ = NULL; /* will ask SDL */
98#elif defined (iPlatformLinux) || defined (iPlatformOther)
96#define EMB_BIN "../../share/lagrange/resources.lgr" 99#define EMB_BIN "../../share/lagrange/resources.lgr"
97#define EMB_BIN2 "../../../share/lagrange/resources.lgr" 100#define EMB_BIN2 "../../../share/lagrange/resources.lgr"
98static const char *defaultDataDir_App_ = "~/.config/lagrange"; 101static const char *defaultDataDir_App_ = "~/.config/lagrange";
@@ -137,6 +140,9 @@ struct Impl_App {
137 int autoReloadTimer; 140 int autoReloadTimer;
138 iPeriodic periodic; 141 iPeriodic periodic;
139 int warmupFrames; /* forced refresh just after resuming from background; FIXME: shouldn't be needed */ 142 int warmupFrames; /* forced refresh just after resuming from background; FIXME: shouldn't be needed */
143#if defined (iPlatformAndroidMobile)
144 float displayDensity;
145#endif
140 /* Preferences: */ 146 /* Preferences: */
141 iBool commandEcho; /* --echo */ 147 iBool commandEcho; /* --echo */
142 iBool forceSoftwareRender; /* --sw */ 148 iBool forceSoftwareRender; /* --sw */
@@ -300,7 +306,10 @@ static const char *dataDir_App_(void) {
300 return userDir; 306 return userDir;
301 } 307 }
302#endif 308#endif
303 return defaultDataDir_App_; 309 if (defaultDataDir_App_) {
310 return defaultDataDir_App_;
311 }
312 return SDL_GetPrefPath("Jaakko Keränen", "fi.skyjake.lagrange");
304} 313}
305 314
306static const char *downloadDir_App_(void) { 315static const char *downloadDir_App_(void) {
@@ -698,7 +707,7 @@ static iBool hasCommandLineOpenableScheme_(const iRangecc uri) {
698} 707}
699 708
700static void init_App_(iApp *d, int argc, char **argv) { 709static void init_App_(iApp *d, int argc, char **argv) {
701#if defined (iPlatformLinux) 710#if defined (iPlatformLinux) && !defined (iPlatformAndroid)
702 d->isRunningUnderWindowSystem = !iCmpStr(SDL_GetCurrentVideoDriver(), "x11") || 711 d->isRunningUnderWindowSystem = !iCmpStr(SDL_GetCurrentVideoDriver(), "x11") ||
703 !iCmpStr(SDL_GetCurrentVideoDriver(), "wayland"); 712 !iCmpStr(SDL_GetCurrentVideoDriver(), "wayland");
704#else 713#else
@@ -745,6 +754,8 @@ static void init_App_(iApp *d, int argc, char **argv) {
745 } 754 }
746 } 755 }
747 init_Lang(); 756 init_Lang();
757 iStringList *openCmds = new_StringList();
758#if !defined (iPlatformAndroidMobile)
748 /* Configure the valid command line options. */ { 759 /* Configure the valid command line options. */ {
749 defineValues_CommandLine(&d->args, "close-tab", 0); 760 defineValues_CommandLine(&d->args, "close-tab", 0);
750 defineValues_CommandLine(&d->args, "echo;E", 0); 761 defineValues_CommandLine(&d->args, "echo;E", 0);
@@ -759,7 +770,6 @@ static void init_App_(iApp *d, int argc, char **argv) {
759 defineValues_CommandLine(&d->args, "sw", 0); 770 defineValues_CommandLine(&d->args, "sw", 0);
760 defineValues_CommandLine(&d->args, "version;V", 0); 771 defineValues_CommandLine(&d->args, "version;V", 0);
761 } 772 }
762 iStringList *openCmds = new_StringList();
763 /* Handle command line options. */ { 773 /* Handle command line options. */ {
764 if (contains_CommandLine(&d->args, "help")) { 774 if (contains_CommandLine(&d->args, "help")) {
765 puts(cstr_Block(&blobArghelp_Resources)); 775 puts(cstr_Block(&blobArghelp_Resources));
@@ -808,6 +818,7 @@ static void init_App_(iApp *d, int argc, char **argv) {
808 } 818 }
809 } 819 }
810 } 820 }
821#endif
811#if defined (LAGRANGE_ENABLE_IPC) 822#if defined (LAGRANGE_ENABLE_IPC)
812 /* Only one instance is allowed to run at a time; the runtime files (bookmarks, etc.) 823 /* Only one instance is allowed to run at a time; the runtime files (bookmarks, etc.)
813 are not shareable. */ { 824 are not shareable. */ {
@@ -842,7 +853,7 @@ static void init_App_(iApp *d, int argc, char **argv) {
842 /* Must scale by UI scaling factor. */ 853 /* Must scale by UI scaling factor. */
843 mulfv_I2(&d->initialWindowRect.size, desktopDPI_Win32()); 854 mulfv_I2(&d->initialWindowRect.size, desktopDPI_Win32());
844#endif 855#endif
845#if defined (iPlatformLinux) 856#if defined (iPlatformLinux) && !defined (iPlatformAndroid)
846 /* Scale by the primary (?) monitor DPI. */ 857 /* Scale by the primary (?) monitor DPI. */
847 if (isRunningUnderWindowSystem_App()) { 858 if (isRunningUnderWindowSystem_App()) {
848 float vdpi; 859 float vdpi;
@@ -1301,6 +1312,15 @@ void processEvents_App(enum iAppEventMode eventMode) {
1301 } 1312 }
1302 ev.key.keysym.mod = mapMods_Keys(ev.key.keysym.mod & ~KMOD_CAPS); 1313 ev.key.keysym.mod = mapMods_Keys(ev.key.keysym.mod & ~KMOD_CAPS);
1303 } 1314 }
1315#if defined (iPlatformAndroidMobile)
1316 /* Ignore all mouse events; just use touch. */
1317 if (ev.type == SDL_MOUSEBUTTONDOWN ||
1318 ev.type == SDL_MOUSEBUTTONUP ||
1319 ev.type == SDL_MOUSEMOTION ||
1320 ev.type == SDL_MOUSEWHEEL) {
1321 continue;
1322 }
1323#endif
1304 /* Scroll events may be per-pixel or mouse wheel steps. */ 1324 /* Scroll events may be per-pixel or mouse wheel steps. */
1305 if (ev.type == SDL_MOUSEWHEEL) { 1325 if (ev.type == SDL_MOUSEWHEEL) {
1306#if defined (iPlatformAppleDesktop) 1326#if defined (iPlatformAppleDesktop)
@@ -1759,6 +1779,8 @@ enum iAppDeviceType deviceType_App(void) {
1759 return tablet_AppDeviceType; 1779 return tablet_AppDeviceType;
1760#elif defined (iPlatformAppleMobile) 1780#elif defined (iPlatformAppleMobile)
1761 return isPhone_iOS() ? phone_AppDeviceType : tablet_AppDeviceType; 1781 return isPhone_iOS() ? phone_AppDeviceType : tablet_AppDeviceType;
1782#elif defined (iPlatformAndroidMobile)
1783 return phone_AppDeviceType; /* TODO: Java side could tell us via cmdline if this is a tablet. */
1762#else 1784#else
1763 return desktop_AppDeviceType; 1785 return desktop_AppDeviceType;
1764#endif 1786#endif
@@ -3350,3 +3372,10 @@ void closePopups_App(void) {
3350 } 3372 }
3351 } 3373 }
3352} 3374}
3375
3376#if defined (iPlatformAndroidMobile)
3377float displayDensity_Android(void) {
3378 iApp *d = &app_;
3379 return toFloat_String(at_CommandLine(&d->args, 1));
3380}
3381#endif
diff --git a/src/resources.c b/src/resources.c
index 0358e3a3..5c7e41ea 100644
--- a/src/resources.c
+++ b/src/resources.c
@@ -101,8 +101,9 @@ iBool init_Resources(const char *path) {
101 iBool ok = iFalse; 101 iBool ok = iFalse;
102#if defined (iPlatformAndroidMobile) 102#if defined (iPlatformAndroidMobile)
103 /* Resources are bundled as assets so they cannot be loaded as a regular file. 103 /* Resources are bundled as assets so they cannot be loaded as a regular file.
104 Fortunately, SDL implements a file wrapper. */ { 104 Fortunately, SDL implements a file wrapper. */
105 SDL_RWops *io = SDL_RWFromFile(path, "rb"); 105 SDL_RWops *io = SDL_RWFromFile(path, "rb");
106 if (io) {
106 iBlock buf; 107 iBlock buf;
107 init_Block(&buf, (size_t) SDL_RWsize(io)); 108 init_Block(&buf, (size_t) SDL_RWsize(io));
108 SDL_RWread(io, data_Block(&buf), size_Block(&buf), 1); 109 SDL_RWread(io, data_Block(&buf), size_Block(&buf), 1);
diff --git a/src/ui/documentwidget.c b/src/ui/documentwidget.c
index 746e03e0..46af5fcd 100644
--- a/src/ui/documentwidget.c
+++ b/src/ui/documentwidget.c
@@ -1224,10 +1224,6 @@ static void showErrorPage_DocumentWidget_(iDocumentWidget *d, enum iGmStatusCode
1224 case tooManyRedirects_GmStatusCode: 1224 case tooManyRedirects_GmStatusCode:
1225 appendFormat_String(src, "=> %s\n", cstr_String(meta)); 1225 appendFormat_String(src, "=> %s\n", cstr_String(meta));
1226 break; 1226 break;
1227 case tlsFailure_GmStatusCode:
1228// useBanner = iFalse; /* valid data wasn't received from host */
1229// appendFormat_String(src, ">%s\n", cstr_String(meta));
1230 break;
1231 case tlsServerCertificateExpired_GmStatusCode: 1227 case tlsServerCertificateExpired_GmStatusCode:
1232 makeFooterButtons_DocumentWidget_( 1228 makeFooterButtons_DocumentWidget_(
1233 d, 1229 d,
diff --git a/src/ui/touch.c b/src/ui/touch.c
index 195d1dff..d6846572 100644
--- a/src/ui/touch.c
+++ b/src/ui/touch.c
@@ -42,7 +42,11 @@ iDeclareType(TouchState)
42 42
43static const uint32_t longPressSpanMs_ = 500; 43static const uint32_t longPressSpanMs_ = 500;
44static const uint32_t shortPressSpanMs_ = 250; 44static const uint32_t shortPressSpanMs_ = 250;
45#if defined (iPlatformAndroidMobile)
46static const int tapRadiusPt_ = 30; /* inaccurate sensors? */
47#else
45static const int tapRadiusPt_ = 10; 48static const int tapRadiusPt_ = 10;
49#endif
46 50
47enum iTouchEdge { 51enum iTouchEdge {
48 none_TouchEdge, 52 none_TouchEdge,
diff --git a/src/ui/window.c b/src/ui/window.c
index 0bbe588c..9f12cabf 100644
--- a/src/ui/window.c
+++ b/src/ui/window.c
@@ -263,6 +263,10 @@ static float pixelRatio_Window_(const iWindow *d) {
263# define baseDPI_Window 96.0f 263# define baseDPI_Window 96.0f
264#endif 264#endif
265 265
266#if defined (iPlatformAndroidMobile)
267float displayDensity_Android(void);
268#endif
269
266static float displayScale_Window_(const iWindow *d) { 270static float displayScale_Window_(const iWindow *d) {
267 /* The environment variable LAGRANGE_OVERRIDE_DPI can be used to override the automatic 271 /* The environment variable LAGRANGE_OVERRIDE_DPI can be used to override the automatic
268 display DPI detection. If not set, or is an empty string, ignore it. 272 display DPI detection. If not set, or is an empty string, ignore it.
@@ -289,6 +293,8 @@ static float displayScale_Window_(const iWindow *d) {
289#elif defined (iPlatformMsys) 293#elif defined (iPlatformMsys)
290 iUnused(d); 294 iUnused(d);
291 return desktopDPI_Win32(); 295 return desktopDPI_Win32();
296#elif defined (iPlatformAndroidMobile)
297 return displayDensity_Android();
292#else 298#else
293 if (isRunningUnderWindowSystem_App()) { 299 if (isRunningUnderWindowSystem_App()) {
294 float vdpi = 0.0f; 300 float vdpi = 0.0f;
@@ -457,7 +463,7 @@ void init_Window(iWindow *d, enum iWindowType type, iRect rect, uint32_t flags)
457 d->mouseGrab = NULL; 463 d->mouseGrab = NULL;
458 d->focus = NULL; 464 d->focus = NULL;
459 d->pendingCursor = NULL; 465 d->pendingCursor = NULL;
460 d->isExposed = iFalse; 466 d->isExposed = (deviceType_App() != desktop_AppDeviceType);
461 d->isMinimized = iFalse; 467 d->isMinimized = iFalse;
462 d->isInvalidated = iFalse; /* set when posting event, to avoid repeated events */ 468 d->isInvalidated = iFalse; /* set when posting event, to avoid repeated events */
463 d->isMouseInside = iTrue; 469 d->isMouseInside = iTrue;
@@ -541,6 +547,8 @@ void init_MainWindow(iMainWindow *d, iRect rect) {
541 SDL_SetHint(SDL_HINT_RENDER_DRIVER, "metal"); 547 SDL_SetHint(SDL_HINT_RENDER_DRIVER, "metal");
542 flags |= SDL_WINDOW_METAL; 548 flags |= SDL_WINDOW_METAL;
543 d->base.isExposed = iTrue; 549 d->base.isExposed = iTrue;
550#elif defined (iPlatformAndroidMobile)
551 d->base.isExposed = iTrue;
544#else 552#else
545 if (!forceSoftwareRender_App()) { 553 if (!forceSoftwareRender_App()) {
546 flags |= SDL_WINDOW_OPENGL; 554 flags |= SDL_WINDOW_OPENGL;