From 5e62a5ab1420b4a8e60452abbba598d7e32f78e7 Mon Sep 17 00:00:00 2001 From: nakst <> Date: Mon, 20 Sep 2021 18:59:01 +0100 Subject: [PATCH] show dot on tabs with modified documents --- apps/file_manager.ini | 1 + desktop/api.cpp | 21 +++++++++++++++----- desktop/desktop.cpp | 27 +++++++++++++++++++------- res/System Configuration Template.ini | 10 ++++++---- res/Theme Source.dat | Bin 53108 -> 53420 bytes res/Themes/Theme.dat | Bin 53944 -> 54064 bytes util/build_core.c | 1 - 7 files changed, 43 insertions(+), 17 deletions(-) diff --git a/apps/file_manager.ini b/apps/file_manager.ini index bceeee1..05b4b25 100644 --- a/apps/file_manager.ini +++ b/apps/file_manager.ini @@ -4,6 +4,7 @@ icon=icon_system_file_manager permission_all_files=1 permission_view_file_types=1 use_single_process=1 +is_file_manager=1 [build] source=apps/file_manager/main.cpp diff --git a/desktop/api.cpp b/desktop/api.cpp index 2793b76..66d3b83 100644 --- a/desktop/api.cpp +++ b/desktop/api.cpp @@ -61,6 +61,7 @@ struct EnumString { const char *cName; int value; }; #define DESKTOP_MSG_START_USER_TASK (16) #define DESKTOP_MSG_SET_PROGRESS (17) #define DESKTOP_MSG_RENAME (18) +#define DESKTOP_MSG_SET_MODIFIED (19) struct EsFileStore { #define FILE_STORE_HANDLE (1) @@ -352,7 +353,8 @@ EsSystemConfigurationGroup *SystemConfigurationGetGroup(const char *section, ptr if (sectionBytes == -1) sectionBytes = EsCStringLength(section); for (uintptr_t i = 0; i < api.systemConfigurationGroups.Length(); i++) { - if (0 == EsStringCompareRaw(section, sectionBytes, api.systemConfigurationGroups[i].section, api.systemConfigurationGroups[i].sectionBytes)) { + if (0 == EsStringCompareRaw(section, sectionBytes, api.systemConfigurationGroups[i].section, api.systemConfigurationGroups[i].sectionBytes) + && !api.systemConfigurationGroups[i].sectionClassBytes) { return &api.systemConfigurationGroups[i]; } } @@ -1201,6 +1203,15 @@ EsMessage *EsMessageReceive() { } } +void InstanceSetModified(EsInstance *instance, bool modified) { + EsCommandSetEnabled(EsCommandByID(instance, ES_COMMAND_SAVE), modified); + + uint8_t m[2]; + m[0] = DESKTOP_MSG_SET_MODIFIED; + m[1] = modified; + MessageDesktop(m, 2, instance->window->handle); +} + void EsInstanceOpenComplete(EsMessage *message, bool success, const char *errorText, ptrdiff_t errorTextBytes) { EsInstance *instance = message->instanceOpen.instance; @@ -1234,7 +1245,7 @@ void EsInstanceOpenComplete(EsMessage *message, bool success, const char *errorT EsUndoClear(instance->undoManager); } - EsCommandSetDisabled(EsCommandByID(instance, ES_COMMAND_SAVE), true); + InstanceSetModified(instance, false); } EsAssert(!message->instanceOpen.file->operationComplete); @@ -1263,7 +1274,7 @@ void EsInstanceSaveComplete(EsMessage *message, bool success) { MessageDesktop(buffer, 1, instance->window->handle); if (success) { - EsCommandSetDisabled(EsCommandByID(instance, ES_COMMAND_SAVE), true); + InstanceSetModified(instance, false); EsRectangle bounds = EsElementGetWindowBounds(instance->window->toolbarSwitcher); size_t messageBytes; char *message = EsStringAllocateAndFormat(&messageBytes, "Saved to %s", // TODO Localization. @@ -1377,7 +1388,7 @@ extern "C" void _start(EsProcessStartupInformation *_startupInformation) { _EsNodeInformation node; char *path; - path = EsSystemConfigurationReadString(EsLiteral("general"), EsLiteral("fonts_path")); + path = EsSystemConfigurationReadString(EsLiteral("paths"), EsLiteral("fonts")); NodeOpen(path, EsCStringLength(path), ES_NODE_DIRECTORY, &node); NodeAddMountPoint(EsLiteral("|Fonts:"), node.handle, false); EsHeapFree(path); @@ -1644,7 +1655,7 @@ void EsUndoPush(EsUndoManager *manager, EsUndoCallback callback, const void *ite EsCommandSetDisabled(EsCommandByID(manager->instance, ES_COMMAND_REDO), !manager->redoStack.Length()); if (manager->instance->undoManager == manager) { - EsCommandSetDisabled(EsCommandByID(manager->instance, ES_COMMAND_SAVE), false); + InstanceSetModified(manager->instance, true); } } diff --git a/desktop/desktop.cpp b/desktop/desktop.cpp index b4c5aa3..186a30b 100644 --- a/desktop/desktop.cpp +++ b/desktop/desktop.cpp @@ -1921,7 +1921,7 @@ EsError TemporaryFileCreate(EsHandle *handle, char **path, size_t *pathBytes, ui } size_t temporaryFolderBytes; - char *temporaryFolder = EsSystemConfigurationReadString(EsLiteral("general"), EsLiteral("temporary_path"), &temporaryFolderBytes); + char *temporaryFolder = EsSystemConfigurationReadString(EsLiteral("paths"), EsLiteral("temporary"), &temporaryFolderBytes); char *temporaryFilePath = (char *) EsHeapAllocate(temporaryFolderBytes + 1 + sizeof(temporaryFileName), false); size_t temporaryFilePathBytes = EsStringFormat(temporaryFilePath, ES_STRING_FORMAT_ENOUGH_SPACE, "%s/%s", temporaryFolderBytes, temporaryFolder, sizeof(temporaryFileName), temporaryFileName); @@ -1951,7 +1951,7 @@ void ApplicationInstanceRequestSave(ApplicationInstance *instance, const char *n if (!instance->documentID) { size_t folderBytes; - char *folder = EsSystemConfigurationReadString(EsLiteral("general"), EsLiteral("default_user_documents_path"), &folderBytes); + char *folder = EsSystemConfigurationReadString(EsLiteral("paths"), EsLiteral("default_user_documents"), &folderBytes); char *name = (char *) EsHeapAllocate(folderBytes + newNameBytes + 32, false); EsMemoryCopy(name, folder, folderBytes); EsMemoryCopy(name + folderBytes, newName, newNameBytes); @@ -2357,14 +2357,15 @@ void CheckForegroundWindowResponding(EsGeneric) { } void DesktopSetup() { + // Get the installation state. + if (!desktop.setupDesktopUIComplete) { - // Get the installation state. desktop.installationState = EsSystemConfigurationReadInteger(EsLiteral("general"), EsLiteral("installation_state")); } - if (!desktop.setupDesktopUIComplete) { - // Load the theme bitmap. + // Load the theme bitmap. + if (!desktop.setupDesktopUIComplete) { EsHandle handle = EsMemoryOpen(ES_THEME_CURSORS_WIDTH * ES_THEME_CURSORS_HEIGHT * 4, EsLiteral(ES_THEME_CURSORS_NAME), ES_FLAGS_DEFAULT); void *destination = EsObjectMap(handle, 0, ES_THEME_CURSORS_WIDTH * ES_THEME_CURSORS_HEIGHT * 4, ES_MAP_OBJECT_READ_WRITE); LoadImage(theming.system.in + theming.system.bytes - theming.header->bitmapBytes, theming.header->bitmapBytes, @@ -2373,9 +2374,9 @@ void DesktopSetup() { EsHandleClose(handle); } - { - // Create the wallpaper window. + // Create the wallpaper window. + { if (!desktop.wallpaperWindow) desktop.wallpaperWindow = EsWindowCreate(nullptr, ES_WINDOW_PLAIN); EsRectangle screen; EsSyscall(ES_SYSCALL_SCREEN_BOUNDS_GET, 0, (uintptr_t) &screen, 0, 0); @@ -2459,6 +2460,8 @@ void DesktopSetup() { EsHeapFree(firstApplication); } } else if (desktop.installationState == INSTALLATION_STATE_INSTALLER) { + // Start the instller. + if (!desktop.setupDesktopUIComplete) { ApplicationInstanceCreate(desktop.installer->id, nullptr, nullptr, true /* hidden */); } @@ -2549,8 +2552,14 @@ void DesktopSyscall(EsMessage *message, uint8_t *buffer, EsBuffer *pipe) { EsHandleClose(processHandle); } } else if (buffer[0] == DESKTOP_MSG_SYSTEM_CONFIGURATION_GET && pipe) { + InstalledApplication *application = ApplicationFindByPID(message->desktop.processID); + ConfigurationWriteSectionsToBuffer("font", nullptr, false, pipe); ConfigurationWriteSectionsToBuffer(nullptr, "ui", false, pipe); + + if (application && (application->permissions & APPLICATION_PERMISSION_ALL_FILES)) { + ConfigurationWriteSectionsToBuffer(nullptr, "paths", false, pipe); + } } else if (buffer[0] == DESKTOP_MSG_REQUEST_SHUTDOWN) { InstalledApplication *application = ApplicationFindByPID(message->desktop.processID); @@ -2648,6 +2657,10 @@ void DesktopSyscall(EsMessage *message, uint8_t *buffer, EsBuffer *pipe) { instance->tab->container->taskBarButton->Repaint(true); } } + } else if (buffer[0] == DESKTOP_MSG_SET_MODIFIED && message->desktop.bytes == 2) { + if (instance->tab) { + EsButtonSetCheck(instance->tab->closeButton, buffer[1] ? ES_CHECK_CHECKED : ES_CHECK_UNCHECKED, false); + } } else if (buffer[0] == DESKTOP_MSG_SET_PROGRESS && message->desktop.bytes == 1 + sizeof(double) && instance->isUserTask) { double progress; EsMemoryCopy(&progress, buffer + 1, sizeof(double)); diff --git a/res/System Configuration Template.ini b/res/System Configuration Template.ini index c9afaec..5dc9faf 100644 --- a/res/System Configuration Template.ini +++ b/res/System Configuration Template.ini @@ -1,8 +1,4 @@ [general] -fonts_path=0:/Essence/Fonts -temporary_path=0:/Essence/Temporary -default_settings_path=0:/Essence/Settings -default_user_documents_path=0:/ click_chain_timeout_ms=500 show_cursor_shadow=1 scroll_lines_per_notch=3 @@ -11,6 +7,12 @@ window_color=6 use_smart_quotes=1 enable_hover_state=1 +[paths] +fonts=0:/Essence/Fonts +temporary=0:/Essence/Temporary +default_settings=0:/Essence/Settings +default_user_documents=0:/ + [ui] font_fallback=Inter font_sans=Inter diff --git a/res/Theme Source.dat b/res/Theme Source.dat index 2ba73eaaa93bfbaa2e7b2f819d9c166113b8e584..b8570c4d872ae97fc557d6533a8d44a2b2ee3d8e 100644 GIT binary patch delta 223 zcmew|k9o~PW>!%K1_ry0tS@*tTjE<2S`%CC+9rSDDP$3EVr-l|QA~PrfD`NHPTt$q z+!LG$moTvXV*ACA!jRGcvz7}8CO?>Owt2zcD}n%BSwy)2 delta 81 zcmV-X0IvV6p#$`u0|gZT002F)1?UV1gI|SUg<*x0_6%_Y7J>nj@f;YF&?p46h7I6* nlV4I8lZlCV0fUnviW8F+ibw~BaA9<4ATqOpii9(>6Tg`ezxE!Z diff --git a/res/Themes/Theme.dat b/res/Themes/Theme.dat index ed9c15e6b02e298de2a0fe57feab8a24062ec333..2040f88669ba1a5351064910f81afed33df56c89 100644 GIT binary patch delta 2878 zcmZA3e@s$f z-}9ayLnl20pL@J-6c2y6pNJOYDA`Wb-Q{%xJt3kx%L5`x!;dcgu=A!7`@bDUp$x)) zwM=a)7QnA_U6oGY5&{=om38nM?4mhUPj{eg6!xR(AxV7E+5kEh~ogRp0(lhJ0Qw8H+FneeKq<#`+U=L}BSLD*ly zI{B`00>==!D^fZROR^Iey&Lv7rZao?V{`TJI=4P9Fr2_3A|G4-Ut=8^hTRk6orC=& zMjGKR^l$}{e?{$4*h5i!4ED%XPcP{>-!yRL5%IWk(2)t4C2SIwWF^jwB19>|Ojxm4 zfn?Y$(O)WTj%CDFV`eL*10Tnhb6@!!Sg#mlIn3+oP%oShc0-sS=7_fWuzAxro4y>e z3^oGii^fH;1;R>T3q^;eunb`puuQad-)Ob4S*~rUlWx|7ED?i*Vc9Ozm*fDfE}^la z4%kvxJ>B6^K5IIGOf)qKD-gRTxsB*~VQH`zgk`~A zg6R_947sqEEj*Om=m)+kDi*>v3oC;Cl#n1E^sv|P+>UQ+-ES@Il&~=D+ZmgFD0Ki| z7abmj6$?AgcWt~%5ZNIjeXyOv24H2vhPWWf35+08kg(H;uE5F@CaTmJtkPu)&xYT) zE6HiUgUD`IL{E1Tc1w(B;zd|9^*Wnb`!ra+*dgh#mEw`I2-YC#Wx+nMRN{5Z0XB(> z%VB$k<-%Ho`C$8mt%g;LWc<3V%VHVi1HCTPtFQqU!pg)qg1)mi!6L#+VEcvbf}MA* zpl%z4z2{zOT!Sz#NpS)P5IHGQKL~5LY@NvTdMoONofg-ipZBIX^F|PPSM+cxdLpG^ z3qDZtRqQJSGg4H9kCA-Ey$wz@W9O$zB{7V+=3d8&vr>W-+%=ofX_%Aoq_nqoxGC0ZBlk8t ze6%>Mu0?yBw<{y}O@62NurU<-qYByEazx$cPg=e+I$Cu^rSZ+yBdSOLj^5wrQ^}?H zB(fja4>;JAUKd-(*!+pI$fSyjibsa){1J)==ep>)KDT1$Dt4}Y>l~tvwM1w35{=_1 z%p>{?M}Ild>y#g@%e?b!c5%Dyfj>|^0_O#!Wu0j>fy8DybNC@-W@oOrJ`FL zg>#Vzj${m5%ic(~>gF|(Wmaw}`sK<jY!SB(ng{|A5m))(Lgi4 zWRT4w-qE(oNG|8YZBHz%MHV^u@J-!<$>ML$2BL%d!2f0|#>ZHLe4%Zbm4&_!@V&P6 NhCdX2X8)n>{{hIfP^16= delta 2736 zcmZA34NO&K7zgm@J@=doBpU2Met@C_6;me-T$tS{MMWPjT_6;fkPinJ1umg-FR);% zmQy!jk88SU!wnl2ZLn*L8WwK2(a@HgE}LjM*>cO4EL-&5|GjwW+~;NI0>9_|c;1h5 z?iqaFHGImI_)5{pJ8eX?3|C1pQD%3d?OE4C{|@(c3Ux#wxh6XrmKTuQ6hK&cpVj8DBASY zufo0)vzdh5MAFW-Q?Og6rN>i|wllCt?r$n40Y0f>8)KM1~G#~=?>Fd5)bo5HCB`a zTj{8$J51$srtQfziJ>+ttg`>EC5*%dG1NgX-Jx~qGL3<)z^i9QyV1bZoJir7|I zk+2M&cH_GPk(Wgz2UaTVaaftKe9nupJ%xzmMI9|7FRVOjW=hqEo+16PdQooxcGObQ&yYc2qo{ZW)+B5g z)+}rUwqMvNtV$#^rrSC!oWVFS(SdpuF2Gu_GLdtjZ{@47ps*=eo3OjE^NtnNZD(L_ zJ69TeVDgGM+Y^tsic=!>1XzdV)`{F-Z$+7~v(6q6%i*RtJ9#@IZ-^cWLnq?uckrrh zOF~(tJxZnWMQ@AYE#roSWt>%#s|G{wl}#w4y_~c)Wx)rYqJQ3H^Ow_)Y zXp)-(Df5T-5G}%g`DsL>d?K(%tz#>=)*3G(>f(*T?4`>qh&pi{OTaS&SN;Mdf@@|! zUK#nVV7fZOr-Q4lR4@AFE5S7P@lr%f`H$dEHNrbuYm#4R!0T2P-uD`bdi_KL$R?gI rwr((HUgdvUm#7k6+?En|51DmhGJWi6TWuwv7eD*jwuA=S-YotP7R5NN diff --git a/util/build_core.c b/util/build_core.c index 39e05b4..9036de8 100644 --- a/util/build_core.c +++ b/util/build_core.c @@ -821,7 +821,6 @@ void OutputSystemConfiguration() { FilePrintFormat(file, "name=%s\n", applications[i].name); FilePrintFormat(file, "executable=0:/Applications/%s.esx\n", applications[i].name); FilePrintFormat(file, "settings_path=0:/Essence/Settings/%s\n", applications[i].name); - FilePrintFormat(file, "is_file_manager=%d\n", 0 == strcmp(applications[i].name, "File Manager") ? 1 : 0); for (uintptr_t j = 0; j < arrlenu(applications[i].properties); j++) { FilePrintFormat(file, "%s=%s\n", applications[i].properties[j].key, applications[i].properties[j].value);