summaryrefslogtreecommitdiff
path: root/src/app.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/app.c')
-rw-r--r--src/app.c66
1 files changed, 51 insertions, 15 deletions
diff --git a/src/app.c b/src/app.c
index b6c48062..0f9249cc 100644
--- a/src/app.c
+++ b/src/app.c
@@ -1365,6 +1365,10 @@ void processEvents_App(enum iAppEventMode eventMode) {
1365 dispatchCommands_Periodic(&d->periodic); 1365 dispatchCommands_Periodic(&d->periodic);
1366 continue; 1366 continue;
1367 } 1367 }
1368 if (ev.type == SDL_USEREVENT && ev.user.code == releaseObject_UserEventCode) {
1369 iRelease(ev.user.data1);
1370 continue;
1371 }
1368 if (ev.type == SDL_USEREVENT && ev.user.code == refresh_UserEventCode) { 1372 if (ev.type == SDL_USEREVENT && ev.user.code == refresh_UserEventCode) {
1369 gotRefresh = iTrue; 1373 gotRefresh = iTrue;
1370 continue; 1374 continue;
@@ -2257,6 +2261,13 @@ void resetFonts_App(void) {
2257 } 2261 }
2258} 2262}
2259 2263
2264void availableFontsChanged_App(void) {
2265 iApp *d = &app_;
2266 iConstForEach(PtrArray, win, listWindows_App_(d, collectNew_PtrArray())) {
2267 resetMissing_Text(text_Window(win.ptr));
2268 }
2269}
2270
2260static void invalidateCachedDocuments_App_(void) { 2271static void invalidateCachedDocuments_App_(void) {
2261 iForEach(ObjectList, i, iClob(listDocuments_App(NULL))) { 2272 iForEach(ObjectList, i, iClob(listDocuments_App(NULL))) {
2262 invalidateCachedLayout_History(history_DocumentWidget(i.object)); 2273 invalidateCachedLayout_History(history_DocumentWidget(i.object));
@@ -2383,24 +2394,49 @@ iBool handleCommand_App(const char *cmd) {
2383 reload_Fonts(); /* also does font cache reset, window invalidation */ 2394 reload_Fonts(); /* also does font cache reset, window invalidation */
2384 return iTrue; 2395 return iTrue;
2385 } 2396 }
2386#if 0 2397 else if (equal_Command(cmd, "font.find")) {
2387 else if (equal_Command(cmd, "font.user")) { 2398 searchOnlineLibraryForCharacters_Fonts(string_Command(cmd, "chars"));
2388 const char *path = suffixPtr_Command(cmd, "path"); 2399 return iTrue;
2389 if (cmp_String(&d->prefs.symbolFontPath, path)) { 2400 }
2390 if (!isFrozen) { 2401 else if (equal_Command(cmd, "font.found")) {
2391 setFreezeDraw_MainWindow(get_MainWindow(), iTrue); 2402 if (hasLabel_Command(cmd, "error")) {
2392 } 2403 makeSimpleMessage_Widget("${heading.glyphfinder}",
2393 setCStr_String(&d->prefs.symbolFontPath, path); 2404 format_CStr("%d %s",
2394 loadUserFonts_Text(); 2405 argLabel_Command(cmd, "error"),
2395 resetFonts_App(d); 2406 suffixPtr_Command(cmd, "msg")));
2396 if (!isFrozen) { 2407 return iTrue;
2397 postCommand_App("font.changed");
2398 postCommand_App("window.unfreeze");
2399 }
2400 } 2408 }
2409 iString *src = collectNew_String();
2410 setCStr_String(src, "# ${heading.glyphfinder.results}\n\n");
2411 iRangecc path = iNullRange;
2412 iBool isFirst = iTrue;
2413 while (nextSplit_Rangecc(range_Command(cmd, "packs"), ",", &path)) {
2414 if (isFirst) {
2415 appendCStr_String(src, "${glyphfinder.results}\n\n");
2416 }
2417 iRangecc fpath = path;
2418 iRangecc fsize = path;
2419 fpath.end = strchr(fpath.start, ';');
2420 fsize.start = fpath.end + 1;
2421 const uint32_t size = strtoul(fsize.start, NULL, 10);
2422 appendFormat_String(src, "=> gemini://skyjake.fi/fonts/%s %s (%.1f MB)\n",
2423 cstr_Rangecc(fpath),
2424 cstr_Rangecc(fpath),
2425 (double) size / 1.0e6);
2426 isFirst = iFalse;
2427 }
2428 if (isFirst) {
2429 appendFormat_String(src, "${glyphfinder.results.empty}\n");
2430 }
2431 appendCStr_String(src, "\n=> about:fonts ${menu.fonts}");
2432 iDocumentWidget *page = newTab_App(NULL, iTrue);
2433 translate_Lang(src);
2434 setUrlAndSource_DocumentWidget(page,
2435 collectNewCStr_String(""),
2436 collectNewCStr_String("text/gemini"),
2437 utf8_String(src));
2401 return iTrue; 2438 return iTrue;
2402 } 2439 }
2403#endif
2404 else if (equal_Command(cmd, "font.set")) { 2440 else if (equal_Command(cmd, "font.set")) {
2405 if (!isFrozen) { 2441 if (!isFrozen) {
2406 setFreezeDraw_MainWindow(get_MainWindow(), iTrue); 2442 setFreezeDraw_MainWindow(get_MainWindow(), iTrue);