show containing folder in file menu

This commit is contained in:
nakst 2021-09-20 08:58:29 +01:00
parent ee87c4a789
commit 67c1c44184
11 changed files with 307 additions and 218 deletions

View File

@ -792,11 +792,11 @@ int ListCallback(EsElement *element, EsMessage *message) {
if (fileType->openHandler) {
String path = StringAllocateAndFormat("%s%s", STRFMT(instance->folder->path), STRFMT(entry->GetInternalName()));
EsApplicationStartupInformation information = {};
information.id = fileType->openHandler;
information.filePath = path.text;
information.filePathBytes = path.bytes;
EsApplicationStart(&information);
EsApplicationStartupRequest request = {};
request.id = fileType->openHandler;
request.filePath = path.text;
request.filePathBytes = path.bytes;
EsApplicationStart(&request);
StringDestroy(&path);
} else {
EsDialogShowAlert(instance->window, INTERFACE_STRING(FileManagerOpenFileError),
@ -1064,20 +1064,20 @@ void InstanceCreateUI(Instance *instance) {
// Load initial folder:
const EsApplicationStartupInformation *startupInformation = EsInstanceGetStartupInformation(instance);
EsApplicationStartupRequest startupRequest = EsInstanceGetStartupRequest(instance);
String path;
if (startupInformation && (startupInformation->flags & ES_APPLICATION_STARTUP_MANUAL_PATH)) {
uintptr_t directoryEnd = startupInformation->filePathBytes;
if (startupRequest.flags & ES_APPLICATION_STARTUP_MANUAL_PATH) {
uintptr_t directoryEnd = startupRequest.filePathBytes;
for (uintptr_t i = 0; i < (uintptr_t) startupInformation->filePathBytes; i++) {
if (startupInformation->filePath[i] == '/') {
for (uintptr_t i = 0; i < (uintptr_t) startupRequest.filePathBytes; i++) {
if (startupRequest.filePath[i] == '/') {
directoryEnd = i + 1;
}
}
instance->delayedFocusItem = StringAllocateAndFormat("%s", startupInformation->filePathBytes - directoryEnd, startupInformation->filePath + directoryEnd);
path = StringAllocateAndFormat("%s", directoryEnd, startupInformation->filePath);
instance->delayedFocusItem = StringAllocateAndFormat("%s", startupRequest.filePathBytes - directoryEnd, startupRequest.filePath + directoryEnd);
path = StringAllocateAndFormat("%s", directoryEnd, startupRequest.filePath);
} else {
path = StringAllocateAndFormat("0:/");
}

View File

@ -192,7 +192,7 @@ struct EsUndoManager {
struct APIInstance {
HashStore<uint32_t, EsCommand *> commands;
EsApplicationStartupInformation *startupInformation;
_EsApplicationStartupInformation *startupInformation;
EsHandle mainWindowHandle;
char *documentPath;
@ -442,40 +442,47 @@ void SystemConfigurationLoad(char *file, size_t fileBytes) {
EsHeapFree(file);
}
uint8_t *ApplicationStartupInformationToBuffer(const EsApplicationStartupInformation *information, size_t *dataBytes = nullptr) {
EsApplicationStartupInformation copy = *information;
uint8_t *ApplicationStartupInformationToBuffer(const _EsApplicationStartupInformation *information, size_t *dataBytes = nullptr) {
_EsApplicationStartupInformation copy = *information;
if (copy.filePathBytes == -1) copy.filePathBytes = EsCStringLength(copy.filePath);
size_t bytes = 1 + sizeof(EsApplicationStartupInformation) + copy.filePathBytes;
uint8_t *buffer = (uint8_t *) EsHeapAllocate(bytes, false);
buffer[0] = DESKTOP_MSG_START_APPLICATION;
EsMemoryCopy(buffer + 1, &copy, sizeof(EsApplicationStartupInformation));
EsMemoryCopy(buffer + 1 + sizeof(EsApplicationStartupInformation), copy.filePath, copy.filePathBytes);
if (dataBytes) *dataBytes = bytes;
return buffer;
EsBuffer buffer = { .canGrow = true };
EsBufferWriteInt8(&buffer, DESKTOP_MSG_START_APPLICATION);
EsBufferWrite(&buffer, &copy, sizeof(_EsApplicationStartupInformation));
EsBufferWrite(&buffer, copy.filePath, copy.filePathBytes);
EsBufferWrite(&buffer, copy.containingFolder, copy.containingFolderBytes);
if (dataBytes) *dataBytes = buffer.position;
return buffer.out;
}
void EsApplicationStart(const EsApplicationStartupInformation *information) {
size_t bufferBytes;
uint8_t *buffer = ApplicationStartupInformationToBuffer(information, &bufferBytes);
MessageDesktop(buffer, bufferBytes);
_EsApplicationStartupInformation *ApplicationStartupInformationParse(const void *data, size_t dataBytes) {
EsBuffer buffer = { .in = (const uint8_t *) data, .bytes = dataBytes };
_EsApplicationStartupInformation *startupInformation = (_EsApplicationStartupInformation *) EsBufferRead(&buffer, sizeof(_EsApplicationStartupInformation));
startupInformation->filePath = (char *) EsHeapAllocate(startupInformation->filePathBytes, false);
EsBufferReadInto(&buffer, (char *) startupInformation->filePath, startupInformation->filePathBytes);
startupInformation->containingFolder = (char *) EsHeapAllocate(startupInformation->containingFolderBytes, false);
EsBufferReadInto(&buffer, (char *) startupInformation->containingFolder, startupInformation->containingFolderBytes);
return startupInformation;
}
EsApplicationStartupInformation *ApplicationStartupInformationParse(const void *data, size_t dataBytes) {
EsApplicationStartupInformation *startupInformation = (EsApplicationStartupInformation *) data;
void EsApplicationStart(const EsApplicationStartupRequest *request) {
EsApplicationStartupRequest copy = *request;
if (sizeof(EsApplicationStartupInformation) <= dataBytes) {
dataBytes -= sizeof(EsApplicationStartupInformation);
if ((size_t) startupInformation->filePathBytes > dataBytes) goto error;
dataBytes -= startupInformation->filePathBytes;
if (dataBytes) goto error;
startupInformation->filePath = (const char *) (startupInformation + 1);
} else {
error:;
EsPrint("Warning: received corrupted startup information.\n");
return nullptr;
if (copy.filePathBytes == -1) {
copy.filePathBytes = EsCStringLength(copy.filePath);
}
return startupInformation;
EsBuffer buffer = { .canGrow = true };
EsBufferWriteInt8(&buffer, DESKTOP_MSG_START_APPLICATION);
EsBufferWrite(&buffer, &copy, sizeof(EsApplicationStartupRequest));
EsBufferWrite(&buffer, copy.filePath, copy.filePathBytes);
if (!buffer.error) {
MessageDesktop(buffer.out, buffer.position);
}
EsHeapFree(buffer.out);
}
void EsInstanceSetClassEditor(EsInstance *_instance, const EsInstanceClassEditorSettings *settings) {
@ -752,7 +759,7 @@ EsInstance *_EsInstanceCreate(size_t bytes, EsMessage *message, const char *appl
apiInstance->applicationNameBytes = applicationNameBytes;
if (message && message->createInstance.data != ES_INVALID_HANDLE && message->createInstance.dataBytes > 1) {
apiInstance->startupInformation = (EsApplicationStartupInformation *) EsHeapAllocate(message->createInstance.dataBytes, false);
apiInstance->startupInformation = (_EsApplicationStartupInformation *) EsHeapAllocate(message->createInstance.dataBytes, false);
if (apiInstance->startupInformation) {
void *buffer = EsHeapAllocate(message->createInstance.dataBytes, false);
@ -788,9 +795,18 @@ EsInstance *_EsInstanceCreate(size_t bytes, EsMessage *message, const char *appl
return instance;
}
const EsApplicationStartupInformation *EsInstanceGetStartupInformation(EsInstance *_instance) {
EsApplicationStartupRequest EsInstanceGetStartupRequest(EsInstance *_instance) {
APIInstance *instance = (APIInstance *) _instance->_private;
return instance->startupInformation;
EsApplicationStartupRequest request = {};
if (instance->startupInformation) {
request.id = instance->startupInformation->id;
request.filePath = instance->startupInformation->filePath;
request.filePathBytes = instance->startupInformation->filePathBytes;
request.flags = instance->startupInformation->flags;
}
return request;
}
void EsInstanceDestroy(EsInstance *instance) {
@ -1055,14 +1071,21 @@ EsMessage *EsMessageReceive() {
if (_instance) {
APIInstance *instance = (APIInstance *) _instance->_private;
EsHeapFree((void *) instance->startupInformation->filePath);
instance->startupInformation->filePath = buffer;
instance->startupInformation->filePathBytes = message.message.tabOperation.bytes;
EsWindowSetTitle(_instance->window, buffer, message.message.tabOperation.bytes);
} else {
EsHeapFree(buffer);
EsHeapFree((void *) instance->startupInformation->containingFolder);
EsMemoryCopy(&instance->startupInformation->filePathBytes, buffer, sizeof(ptrdiff_t));
EsMemoryCopy(&instance->startupInformation->containingFolderBytes, buffer + sizeof(ptrdiff_t), sizeof(ptrdiff_t));
char *filePath = (char *) EsHeapAllocate(instance->startupInformation->filePathBytes, false);
char *containingFolder = (char *) EsHeapAllocate(instance->startupInformation->containingFolderBytes, false);
EsMemoryCopy(filePath, buffer + sizeof(ptrdiff_t) * 2, instance->startupInformation->filePathBytes);
EsMemoryCopy(containingFolder, buffer + sizeof(ptrdiff_t) * 2 + instance->startupInformation->filePathBytes,
instance->startupInformation->containingFolderBytes);
instance->startupInformation->filePath = filePath;
instance->startupInformation->containingFolder = containingFolder;
EsWindowSetTitle(_instance->window, filePath, instance->startupInformation->filePathBytes);
}
}
EsHeapFree(buffer);
EsHandleClose(message.message.tabOperation.handle);
} else if (type == ES_MSG_INSTANCE_DOCUMENT_UPDATED) {
EsInstance *_instance = InstanceFromWindowID(message.message.tabOperation.id);

View File

@ -220,8 +220,8 @@ struct {
} desktop;
int TaskBarButtonMessage(EsElement *element, EsMessage *message);
ApplicationInstance *ApplicationInstanceCreate(int64_t id, EsApplicationStartupInformation *startupInformation, ContainerWindow *container, bool hidden = false);
bool ApplicationInstanceStart(int64_t applicationID, EsApplicationStartupInformation *startupInformation, ApplicationInstance *instance);
ApplicationInstance *ApplicationInstanceCreate(int64_t id, _EsApplicationStartupInformation *startupInformation, ContainerWindow *container, bool hidden = false);
bool ApplicationInstanceStart(int64_t applicationID, _EsApplicationStartupInformation *startupInformation, ApplicationInstance *instance);
void ApplicationInstanceClose(ApplicationInstance *instance);
ApplicationInstance *ApplicationInstanceFindByWindowID(EsObjectID windowID, bool remove = false);
void EmbeddedWindowDestroyed(EsObjectID id);
@ -1328,7 +1328,59 @@ void ApplicationInstanceCleanup(ApplicationInstance *instance) {
instance->application = nullptr;
}
bool ApplicationInstanceStart(int64_t applicationID, EsApplicationStartupInformation *startupInformation, ApplicationInstance *instance) {
void PathGetNameAndContainingFolder(const char *path, ptrdiff_t pathBytes,
const char **name, ptrdiff_t *nameBytes,
const char **containingFolder, ptrdiff_t *containingFolderBytes,
EsVolumeInformation *volumeInformation /* needs to be allocated outside */) {
if (pathBytes == -1) {
pathBytes = EsCStringLength(path);
}
*name = path;
*nameBytes = pathBytes;
*containingFolderBytes = 0;
const char *containingFolderEnd = nullptr;
for (uintptr_t i = pathBytes; i > 0; i--) {
if (path[i - 1] == '/') {
if (!containingFolderEnd) {
containingFolderEnd = path + i - 1;
*name = path + i;
*nameBytes = pathBytes - i;
} else {
*containingFolder = path + i;
*containingFolderBytes = containingFolderEnd - *containingFolder;
}
}
}
// TODO Get the user name of the folder from File Manager?
// Maybe more of File Manager's code needs to be shared with Desktop..?
if (pathBytes && !(*containingFolderBytes)) {
if (EsMountPointGetVolumeInformation(path, pathBytes, volumeInformation)) {
*containingFolder = volumeInformation->label;
*containingFolderBytes = volumeInformation->labelBytes;
}
}
}
void *OpenDocumentGetRenameMessageData(const char *path, size_t pathBytes, size_t *bytes) {
EsVolumeInformation volumeInformation;
const char *name, *containingFolder;
ptrdiff_t nameBytes, containingFolderBytes;
PathGetNameAndContainingFolder(path, pathBytes, &name, &nameBytes, &containingFolder, &containingFolderBytes, &volumeInformation);
*bytes = sizeof(ptrdiff_t) * 2 + nameBytes + containingFolderBytes;
uint8_t *data = (uint8_t *) EsHeapAllocate(*bytes, false);
EsMemoryCopy(data, &nameBytes, sizeof(ptrdiff_t));
EsMemoryCopy(data + sizeof(ptrdiff_t), &containingFolderBytes, sizeof(ptrdiff_t));
EsMemoryCopy(data + sizeof(ptrdiff_t) * 2, name, nameBytes);
EsMemoryCopy(data + sizeof(ptrdiff_t) * 2 + nameBytes, containingFolder, containingFolderBytes);
return data;
}
bool ApplicationInstanceStart(int64_t applicationID, _EsApplicationStartupInformation *startupInformation, ApplicationInstance *instance) {
if (desktop.inShutdown) {
return false;
}
@ -1349,12 +1401,12 @@ bool ApplicationInstanceStart(int64_t applicationID, EsApplicationStartupInforma
}
if (!application) {
EsApplicationStartupInformation s = {};
_EsApplicationStartupInformation s = {};
s.data = CRASHED_TAB_PROGRAM_NOT_FOUND;
return ApplicationInstanceStart(APPLICATION_ID_DESKTOP_CRASHED, &s, instance);
}
EsApplicationStartupInformation _startupInformation = {};
_EsApplicationStartupInformation _startupInformation = {};
if (!startupInformation) {
startupInformation = &_startupInformation;
@ -1392,7 +1444,7 @@ bool ApplicationInstanceStart(int64_t applicationID, EsApplicationStartupInforma
ES_FILE_READ | ES_NODE_FAIL_IF_NOT_FOUND, &executableNode);
if (ES_CHECK_ERROR(error)) {
EsApplicationStartupInformation s = {};
_EsApplicationStartupInformation s = {};
s.data = CRASHED_TAB_INVALID_EXECUTABLE;
return ApplicationInstanceStart(APPLICATION_ID_DESKTOP_CRASHED, &s, instance);
}
@ -1510,7 +1562,7 @@ bool ApplicationInstanceStart(int64_t applicationID, EsApplicationStartupInforma
process->application = application;
desktop.allApplicationProcesses.Add(process);
} else {
EsApplicationStartupInformation s = {};
_EsApplicationStartupInformation s = {};
s.data = CRASHED_TAB_INVALID_EXECUTABLE;
return ApplicationInstanceStart(APPLICATION_ID_DESKTOP_CRASHED, &s, instance);
}
@ -1534,18 +1586,15 @@ bool ApplicationInstanceStart(int64_t applicationID, EsApplicationStartupInforma
OpenDocumentOpenReference(instance->documentID);
}
EsVolumeInformation volumeInformation;
EsMessage m = { ES_MSG_INSTANCE_CREATE };
if (~startupInformation->flags & ES_APPLICATION_STARTUP_MANUAL_PATH) {
// Only tell the application the name of the file.
for (uintptr_t i = 0; i < (size_t) startupInformation->filePathBytes; i++) {
if (startupInformation->filePath[i] == '/') {
startupInformation->filePath += i + 1;
startupInformation->filePathBytes -= i + 1;
i = 0;
}
}
PathGetNameAndContainingFolder(startupInformation->filePath, startupInformation->filePathBytes,
&startupInformation->filePath, &startupInformation->filePathBytes,
&startupInformation->containingFolder, &startupInformation->containingFolderBytes,
&volumeInformation);
}
// Share handles to the file and the startup information buffer.
@ -1577,7 +1626,7 @@ bool ApplicationInstanceStart(int64_t applicationID, EsApplicationStartupInforma
return true;
}
ApplicationInstance *ApplicationInstanceCreate(int64_t id, EsApplicationStartupInformation *startupInformation, ContainerWindow *container, bool hidden) {
ApplicationInstance *ApplicationInstanceCreate(int64_t id, _EsApplicationStartupInformation *startupInformation, ContainerWindow *container, bool hidden) {
ApplicationInstance *instance = (ApplicationInstance *) EsHeapAllocate(sizeof(ApplicationInstance), true);
WindowTab *tab = !hidden ? WindowTabCreate(container ?: ContainerWindowCreate(0, 0)) : nullptr;
if (tab) tab->applicationInstance = instance;
@ -1743,24 +1792,30 @@ void OpenDocumentOpenReference(EsObjectID id) {
document->referenceCount++;
}
void OpenDocumentWithApplication(EsApplicationStartupInformation *startupInformation) {
void OpenDocumentWithApplication(EsApplicationStartupRequest *startupRequest) {
bool foundDocument = false;
_EsApplicationStartupInformation startupInformation = {};
startupInformation.id = startupRequest->id;
startupInformation.flags = startupRequest->flags;
startupInformation.filePath = startupRequest->filePath;
startupInformation.filePathBytes = startupRequest->filePathBytes;
for (uintptr_t i = 0; i < desktop.openDocuments.Count(); i++) {
OpenDocument *document = &desktop.openDocuments[i];
if (document->pathBytes == (size_t) startupInformation->filePathBytes
&& 0 == EsMemoryCompare(document->path, startupInformation->filePath, document->pathBytes)) {
if (document->pathBytes == (size_t) startupInformation.filePathBytes
&& 0 == EsMemoryCompare(document->path, startupInformation.filePath, document->pathBytes)) {
foundDocument = true;
startupInformation->readHandle = document->readHandle;
startupInformation->documentID = document->id;
startupInformation.readHandle = document->readHandle;
startupInformation.documentID = document->id;
document->referenceCount++;
break;
}
}
if (!foundDocument) {
EsFileInformation file = EsFileOpen(startupInformation->filePath, startupInformation->filePathBytes,
EsFileInformation file = EsFileOpen(startupInformation.filePath, startupInformation.filePathBytes,
ES_FILE_READ_SHARED | ES_NODE_FAIL_IF_NOT_FOUND);
if (file.error != ES_SUCCESS) {
@ -1769,20 +1824,20 @@ void OpenDocumentWithApplication(EsApplicationStartupInformation *startupInforma
}
OpenDocument document = {};
document.path = (char *) EsHeapAllocate(startupInformation->filePathBytes, false);
document.pathBytes = startupInformation->filePathBytes;
document.path = (char *) EsHeapAllocate(startupInformation.filePathBytes, false);
document.pathBytes = startupInformation.filePathBytes;
document.readHandle = file.handle;
document.id = ++desktop.currentDocumentID;
document.referenceCount = 1;
EsMemoryCopy(document.path, startupInformation->filePath, startupInformation->filePathBytes);
EsMemoryCopy(document.path, startupInformation.filePath, startupInformation.filePathBytes);
*desktop.openDocuments.Put(&document.id) = document;
startupInformation->readHandle = document.readHandle;
startupInformation->documentID = document.id;
startupInformation.readHandle = document.readHandle;
startupInformation.documentID = document.id;
}
ApplicationInstanceCreate(startupInformation->id, startupInformation, nullptr);
OpenDocumentCloseReference(startupInformation->documentID);
ApplicationInstanceCreate(startupInformation.id, &startupInformation, nullptr);
OpenDocumentCloseReference(startupInformation.documentID);
}
EsError TemporaryFileCreate(EsHandle *handle, char **path, size_t *pathBytes, uint32_t additionalFlags) {
@ -1857,21 +1912,13 @@ void ApplicationInstanceRequestSave(ApplicationInstance *instance, const char *n
instance->documentID = document.id;
{
// Tell the instance the chosen name for the document.
uintptr_t nameOffset = 0;
for (uintptr_t i = 0; i < nameBytes; i++) {
if (name[i] == '/') {
nameOffset = i + 1;
}
}
// Tell the instance the chosen name and new containing folder for the document.
EsMessage m = { ES_MSG_INSTANCE_DOCUMENT_RENAMED };
void *data = OpenDocumentGetRenameMessageData(name, nameBytes, &m.tabOperation.bytes);
m.tabOperation.id = instance->embeddedWindowID;
m.tabOperation.handle = EsConstantBufferCreate(name + nameOffset, nameBytes - nameOffset, instance->process->handle);
m.tabOperation.bytes = nameBytes - nameOffset;
m.tabOperation.handle = EsConstantBufferCreate(data, m.tabOperation.bytes, instance->process->handle);
EsMessagePostRemote(instance->process->handle, &m);
EsHeapFree(data);
}
}
@ -1926,13 +1973,8 @@ void InstanceAnnouncePathMoved(InstalledApplication *fromApplication, const char
return;
}
uintptr_t newNameOffset = 0;
for (uintptr_t i = 0; i < newPathBytes; i++) {
if (newPath[i] == '/') {
newNameOffset = i + 1;
}
}
size_t messageDataBytes;
void *messageData = OpenDocumentGetRenameMessageData(newPath, newPathBytes, &messageDataBytes);
for (uintptr_t i = 0; i < desktop.allApplicationInstances.Length(); i++) {
ApplicationInstance *instance = desktop.allApplicationInstances[i];
@ -1943,11 +1985,13 @@ void InstanceAnnouncePathMoved(InstalledApplication *fromApplication, const char
EsMessage m = { ES_MSG_INSTANCE_DOCUMENT_RENAMED };
m.tabOperation.id = instance->embeddedWindowID;
m.tabOperation.handle = EsConstantBufferCreate(newPath + newNameOffset, newPathBytes - newNameOffset, instance->process->handle);
m.tabOperation.bytes = newPathBytes - newNameOffset;
m.tabOperation.handle = EsConstantBufferCreate(messageData, messageDataBytes, instance->process->handle);
m.tabOperation.bytes = messageDataBytes;
EsMessagePostRemote(instance->process->handle, &m);
}
EsHeapFree(messageData);
if (fromApplication != desktop.fileManager && desktop.fileManager && desktop.fileManager->singleProcess) {
char *data = (char *) EsHeapAllocate(sizeof(size_t) * 2 + oldPathBytes + newPathBytes, false);
EsMemoryCopy(data + 0, &oldPathBytes, sizeof(size_t));
@ -2218,7 +2262,7 @@ void CheckForegroundWindowResponding(EsGeneric) {
// The tab is already not responding.
} else {
// The tab has just stopped not responding.
EsApplicationStartupInformation startupInformation = { .data = CRASHED_TAB_NOT_RESPONDING };
_EsApplicationStartupInformation startupInformation = { .data = CRASHED_TAB_NOT_RESPONDING };
tab->notRespondingInstance = ApplicationInstanceCreate(APPLICATION_ID_DESKTOP_CRASHED,
&startupInformation, tab->container, true /* hidden */);
WindowTabActivate(tab, true);
@ -2361,8 +2405,11 @@ void DesktopSyscall(EsMessage *message, uint8_t *buffer, EsBuffer *pipe) {
ApplicationInstance *instance = ApplicationInstanceFindByWindowID(message->desktop.windowID);
if (buffer[0] == DESKTOP_MSG_START_APPLICATION) {
EsApplicationStartupInformation *information = ApplicationStartupInformationParse(buffer + 1, message->desktop.bytes - 1);
if (information) OpenDocumentWithApplication(information);
EsBuffer b = { .in = buffer + 1, .bytes = message->desktop.bytes - 1 };
EsApplicationStartupRequest request = {};
EsBufferReadInto(&b, &request, sizeof(EsApplicationStartupRequest));
request.filePath = (const char *) EsBufferRead(&b, request.filePathBytes);
if (!b.error) OpenDocumentWithApplication(&request);
} else if (buffer[0] == DESKTOP_MSG_CREATE_CLIPBOARD_FILE && pipe) {
EsHandle processHandle = EsProcessOpen(message->desktop.processID);
@ -2582,7 +2629,7 @@ void DesktopSyscall(EsMessage *message, uint8_t *buffer, EsBuffer *pipe) {
OpenDocument *document = desktop.openDocuments.Get(&instance->documentID);
if (document) {
EsApplicationStartupInformation startupInformation = {};
_EsApplicationStartupInformation startupInformation = {};
startupInformation.flags = ES_APPLICATION_STARTUP_MANUAL_PATH;
startupInformation.filePath = document->path;
startupInformation.filePathBytes = document->pathBytes;

View File

@ -5224,8 +5224,9 @@ EsSlider *EsSliderCreate(EsElement *parent, uint64_t flags, const EsStyle *style
const EsStyle styleFileMenuDocumentInformationPanel1 = {
.metrics = {
.mask = ES_THEME_METRICS_INSETS | ES_THEME_METRICS_GAP_MAJOR,
.mask = ES_THEME_METRICS_INSETS | ES_THEME_METRICS_GAP_MAJOR | ES_THEME_METRICS_PREFERRED_WIDTH,
.insets = ES_RECT_4(10, 10, 5, 5),
.preferredWidth = 230,
.gapMajor = 5,
},
};
@ -5322,16 +5323,16 @@ void FileMenuCreate(EsInstance *_instance, EsElement *element, EsCommand *) {
{
// TODO Get this icon from the file type database?
// We'll probably need Desktop to send this via EsApplicationStartupInformation and when the file is renamed.
// We'll probably need Desktop to send this via _EsApplicationStartupInformation and when the file is renamed.
EsIconDisplayCreate(panel1, ES_FLAGS_DEFAULT, 0, editorSettings->documentIconID);
EsIconDisplayCreate(panel1, ES_CELL_V_TOP, 0, editorSettings->documentIconID);
EsSpacerCreate(panel1, ES_FLAGS_DEFAULT, 0, 5, 0);
EsPanel *panel2 = EsPanelCreate(panel1, ES_FLAGS_DEFAULT, &styleFileMenuDocumentInformationPanel2);
EsPanel *panel2 = EsPanelCreate(panel1, ES_CELL_H_FILL, &styleFileMenuDocumentInformationPanel2);
if (!panel2) goto show;
EsPanel *switcher = EsPanelCreate(panel2, ES_PANEL_H_LEFT | ES_PANEL_SWITCHER | ES_PANEL_SWITCHER_MEASURE_LARGEST);
EsPanel *switcher = EsPanelCreate(panel2, ES_CELL_H_FILL | ES_PANEL_SWITCHER | ES_PANEL_SWITCHER_MEASURE_LARGEST);
if (!switcher) goto show;
EsPanel *panel3 = EsPanelCreate(switcher, ES_PANEL_HORIZONTAL | ES_PANEL_H_LEFT, &styleFileMenuDocumentInformationPanel2);
EsPanel *panel3 = EsPanelCreate(switcher, ES_PANEL_HORIZONTAL | ES_CELL_H_FILL, &styleFileMenuDocumentInformationPanel2);
if (!panel3) goto show;
instance->fileMenuNameTextbox = EsTextboxCreate(switcher, ES_CELL_H_FILL | ES_TEXTBOX_EDIT_BASED, &styleFileMenuNameTextbox);
@ -5341,10 +5342,10 @@ void FileMenuCreate(EsInstance *_instance, EsElement *element, EsCommand *) {
EsPanelSwitchTo(instance->fileMenuNameSwitcher, instance->fileMenuNamePanel, ES_TRANSITION_NONE);
if (newDocument) {
EsTextDisplayCreate(panel3, ES_FLAGS_DEFAULT, ES_STYLE_TEXT_LABEL,
EsTextDisplayCreate(panel3, ES_CELL_H_FILL, ES_STYLE_TEXT_LABEL,
editorSettings->newDocumentTitle, editorSettings->newDocumentTitleBytes);
} else {
EsTextDisplayCreate(panel3, ES_FLAGS_DEFAULT, ES_STYLE_TEXT_LABEL,
EsTextDisplayCreate(panel3, ES_CELL_H_FILL, ES_STYLE_TEXT_LABEL,
instance->startupInformation->filePath, instance->startupInformation->filePathBytes);
}
@ -5358,10 +5359,12 @@ void FileMenuCreate(EsInstance *_instance, EsElement *element, EsCommand *) {
if (!panel4) goto show;
EsPanelSetBands(panel4, 2 /* columns */);
char buffer[64];
size_t bytes;
EsTextDisplayCreate(panel4, ES_CELL_H_RIGHT, ES_STYLE_TEXT_LABEL_SECONDARY, INTERFACE_STRING(CommonFileMenuFileLocation));
EsTextDisplayCreate(panel4, ES_CELL_H_LEFT, ES_STYLE_TEXT_LABEL, instance->startupInformation->containingFolder,
instance->startupInformation->containingFolderBytes);
bytes = EsStringFormat(buffer, sizeof(buffer), "%D", EsFileStoreGetSize(instance->fileStore));
char buffer[64];
size_t bytes = EsStringFormat(buffer, sizeof(buffer), "%D", EsFileStoreGetSize(instance->fileStore));
EsTextDisplayCreate(panel4, ES_CELL_H_RIGHT, ES_STYLE_TEXT_LABEL_SECONDARY, INTERFACE_STRING(CommonFileMenuFileSize));
EsTextDisplayCreate(panel4, ES_CELL_H_LEFT, ES_STYLE_TEXT_LABEL, buffer, bytes);
@ -5369,21 +5372,21 @@ void FileMenuCreate(EsInstance *_instance, EsElement *element, EsCommand *) {
}
}
if (instance->instanceClass == ES_INSTANCE_CLASS_EDITOR && !newDocument) {
if (instance->instanceClass == ES_INSTANCE_CLASS_EDITOR) {
EsMenuAddSeparator(menu);
if (instance->commandSave.disabled) {
if (instance->commandSave.disabled && !newDocument) {
EsMenuAddItem(menu, ES_ELEMENT_DISABLED, INTERFACE_STRING(CommonFileUnchanged));
} else {
EsMenuAddCommand(menu, ES_FLAGS_DEFAULT, INTERFACE_STRING(CommonFileSave), &instance->commandSave);
}
// EsMenuAddItem(menu, newDocument ? ES_ELEMENT_DISABLED : ES_FLAGS_DEFAULT, INTERFACE_STRING(CommonFileMakeCopy)); // TODO.
EsMenuAddSeparator(menu);
// EsMenuAddSeparator(menu);
// EsMenuAddItem(menu, newDocument ? ES_ELEMENT_DISABLED : ES_FLAGS_DEFAULT, INTERFACE_STRING(CommonFileShare)); // TODO.
// EsMenuAddItem(menu, newDocument ? ES_ELEMENT_DISABLED : ES_FLAGS_DEFAULT, INTERFACE_STRING(CommonFileVersionHistory)); // TODO.
EsMenuAddCommand(menu, ES_FLAGS_DEFAULT, INTERFACE_STRING(CommonFileShowInFileManager), &instance->commandShowInFileManager);
EsMenuAddCommand(menu, newDocument ? ES_ELEMENT_DISABLED : ES_FLAGS_DEFAULT, INTERFACE_STRING(CommonFileShowInFileManager), &instance->commandShowInFileManager);
}
show: EsMenuShow(menu);

View File

@ -1409,16 +1409,21 @@ struct EsListViewColumn {
double width;
};
struct EsApplicationStartupInformation {
struct EsApplicationStartupRequest {
int64_t id;
STRING filePath;
uint32_t flags;
};
private struct _EsApplicationStartupInformation {
int64_t id;
STRING filePath;
EsWindow *targetWindow;
uint32_t flags;
int32_t data;
// Internal use only.
EsHandle readHandle;
EsObjectID documentID;
STRING containingFolder;
};
struct EsINIState {
@ -1503,7 +1508,7 @@ struct EsInstanceClassEditorSettings {
struct EsInstanceClassViewerSettings {
};
struct _EsNodeInformation {
private struct _EsNodeInformation {
EsHandle handle;
EsFileOffset fileSize;
EsFileOffsetDifference directoryChildren;
@ -1840,7 +1845,7 @@ struct EsMessage {
};
}
struct _EsMessageWithObject {
private struct _EsMessageWithObject {
void *object;
EsMessage message;
};
@ -1911,7 +1916,7 @@ function_pointer void EsWorkCallback(EsGeneric context);
// System.
function void EsApplicationStart(const EsApplicationStartupInformation *information);
function void EsApplicationStart(const EsApplicationStartupRequest *request);
function void EsApplicationRunTemporary(ES_INSTANCE_TYPE *instance, STRING path);
function EsHandle EsTakeSystemSnapshot(int type, size_t *bufferSize);
function EsInstance *_EsInstanceCreate(size_t bytes, EsMessage *message, STRING name = BLANK_STRING);
@ -2013,6 +2018,7 @@ function bool EsBufferReadInto(EsBuffer *buffer, void *destination, size_t readB
function const void *EsBufferReadMany(struct EsBuffer *buffer, size_t a, size_t b);
function int32_t EsBufferReadInt32Endian(EsBuffer *buffer, int32_t errorValue);
function void *EsBufferWrite(EsBuffer *buffer, const void *source, size_t writeBytes);
function bool EsBufferWriteInt8(EsBuffer *buffer, int8_t value);
function bool EsBufferWriteInt32Endian(EsBuffer *buffer, int32_t value); // Changes byte order if big endian.
function void EsBufferFormat(EsBuffer *buffer, EsCString format, ...); // Appends.
function void EsBufferFormatV(EsBuffer *buffer, EsCString format, va_list arguments); // Appends.
@ -2298,7 +2304,7 @@ function void EsInstanceDestroy(ES_INSTANCE_TYPE *instance);
function void EsInstanceSetActiveUndoManager(ES_INSTANCE_TYPE *instance, EsUndoManager *manager);
function void EsInstanceSetClassEditor(ES_INSTANCE_TYPE *instance, const EsInstanceClassEditorSettings *settings);
function void EsInstanceSetClassViewer(ES_INSTANCE_TYPE *instance, const EsInstanceClassViewerSettings *settings);
function const EsApplicationStartupInformation *EsInstanceGetStartupInformation(ES_INSTANCE_TYPE *instance);
function EsApplicationStartupRequest EsInstanceGetStartupRequest(ES_INSTANCE_TYPE *instance);
function void EsInstanceOpenComplete(EsMessage *message, bool success, STRING errorText = BLANK_STRING);
function void EsInstanceSaveComplete(EsMessage *message, bool success);
@ -2376,9 +2382,8 @@ function EsElement *EsDialogShowAlert(EsWindow *window, STRING title, STRING con
function void EsToolbarAddFileMenu(EsElement *element, const EsFileMenuSettings *settings = ES_NULL);
// For internal use only.
function EsHandle _EsWindowGetHandle(EsWindow *window);
function void _EsUISetFont(EsFontFamily id);
private function EsHandle _EsWindowGetHandle(EsWindow *window);
private function void _EsUISetFont(EsFontFamily id);
// Buttons.

View File

@ -1,71 +1,71 @@
define_private ES_STYLE__TEST_STYLE (ES_STYLE_CAST(1385))
define_private ES_STYLE_ACCESS_KEY_HINT (ES_STYLE_CAST(1221))
define_private ES_STYLE_ANNOUNCEMENT (ES_STYLE_CAST(1511))
define_private ES_STYLE_BREADCRUMB_BAR_CRUMB (ES_STYLE_CAST(1223))
define_private ES_STYLE_BREADCRUMB_BAR_OVERFLOW_ICON (ES_STYLE_CAST(1225))
define_private ES_STYLE_BREADCRUMB_BAR_PANEL (ES_STYLE_CAST(1227))
private define ES_STYLE__TEST_STYLE (ES_STYLE_CAST(1385))
private define ES_STYLE_ACCESS_KEY_HINT (ES_STYLE_CAST(1221))
private define ES_STYLE_ANNOUNCEMENT (ES_STYLE_CAST(1511))
private define ES_STYLE_BREADCRUMB_BAR_CRUMB (ES_STYLE_CAST(1223))
private define ES_STYLE_BREADCRUMB_BAR_OVERFLOW_ICON (ES_STYLE_CAST(1225))
private define ES_STYLE_BREADCRUMB_BAR_PANEL (ES_STYLE_CAST(1227))
define ES_STYLE_BUTTON_GROUP_CONTAINER (ES_STYLE_CAST(1229))
define ES_STYLE_BUTTON_GROUP_ITEM (ES_STYLE_CAST(1231))
define ES_STYLE_BUTTON_GROUP_SEPARATOR (ES_STYLE_CAST(1233))
define_private ES_STYLE_CANVAS_SHADOW (ES_STYLE_CAST(1451))
define_private ES_STYLE_CHECKBOX_NORMAL (ES_STYLE_CAST(1559))
define_private ES_STYLE_CHECKBOX_RADIOBOX (ES_STYLE_CAST(1567))
private define ES_STYLE_CANVAS_SHADOW (ES_STYLE_CAST(1451))
private define ES_STYLE_CHECKBOX_NORMAL (ES_STYLE_CAST(1559))
private define ES_STYLE_CHECKBOX_RADIOBOX (ES_STYLE_CAST(1567))
define ES_STYLE_CLEAR_BACKGROUND (ES_STYLE_CAST(1597))
define_private ES_STYLE_COLOR_CHOSEN_POINT (ES_STYLE_CAST(1241))
define_private ES_STYLE_COLOR_CIRCLE (ES_STYLE_CAST(1243))
define_private ES_STYLE_COLOR_HEX_TEXTBOX (ES_STYLE_CAST(1245))
define_private ES_STYLE_COLOR_PICKER_MAIN_PANEL (ES_STYLE_CAST(1247))
define_private ES_STYLE_COLOR_SLIDER (ES_STYLE_CAST(1249))
define_private ES_STYLE_CONTAINER_WINDOW (ES_STYLE_CAST(1251))
define_private ES_STYLE_CURSOR_LOCATOR (ES_STYLE_CAST(1591))
private define ES_STYLE_COLOR_CHOSEN_POINT (ES_STYLE_CAST(1241))
private define ES_STYLE_COLOR_CIRCLE (ES_STYLE_CAST(1243))
private define ES_STYLE_COLOR_HEX_TEXTBOX (ES_STYLE_CAST(1245))
private define ES_STYLE_COLOR_PICKER_MAIN_PANEL (ES_STYLE_CAST(1247))
private define ES_STYLE_COLOR_SLIDER (ES_STYLE_CAST(1249))
private define ES_STYLE_CONTAINER_WINDOW (ES_STYLE_CAST(1251))
private define ES_STYLE_CURSOR_LOCATOR (ES_STYLE_CAST(1591))
define ES_STYLE_DIALOG_BUTTON_AREA (ES_STYLE_CAST(1259))
define ES_STYLE_DIALOG_CONTENT (ES_STYLE_CAST(1261))
define ES_STYLE_DIALOG_HEADING (ES_STYLE_CAST(1263))
define_private ES_STYLE_DOUBLE_CLICK_TEST (ES_STYLE_CAST(1585))
private define ES_STYLE_DOUBLE_CLICK_TEST (ES_STYLE_CAST(1585))
define ES_STYLE_ICON_DISPLAY (ES_STYLE_CAST(1265))
define ES_STYLE_ICON_DISPLAY_SMALL (ES_STYLE_CAST(1543))
define ES_STYLE_INSTALLER_ROOT (ES_STYLE_CAST(1267))
define ES_STYLE_LIST_CHOICE_BORDERED (ES_STYLE_CAST(1429))
define ES_STYLE_LIST_CHOICE_ITEM (ES_STYLE_CAST(1435))
define_private ES_STYLE_LIST_COLUMN_HEADER (ES_STYLE_CAST(1269))
define_private ES_STYLE_LIST_COLUMN_HEADER_ITEM (ES_STYLE_CAST(1271))
define_private ES_STYLE_LIST_COLUMN_HEADER_ITEM_HAS_MENU (ES_STYLE_CAST(1273))
define_private ES_STYLE_LIST_COLUMN_HEADER_SPLITTER (ES_STYLE_CAST(1275))
define_private ES_STYLE_LIST_GROUP_HEADER_CELL (ES_STYLE_CAST(1277))
private define ES_STYLE_LIST_COLUMN_HEADER (ES_STYLE_CAST(1269))
private define ES_STYLE_LIST_COLUMN_HEADER_ITEM (ES_STYLE_CAST(1271))
private define ES_STYLE_LIST_COLUMN_HEADER_ITEM_HAS_MENU (ES_STYLE_CAST(1273))
private define ES_STYLE_LIST_COLUMN_HEADER_SPLITTER (ES_STYLE_CAST(1275))
private define ES_STYLE_LIST_GROUP_HEADER_CELL (ES_STYLE_CAST(1277))
define ES_STYLE_LIST_ITEM (ES_STYLE_CAST(1279))
define ES_STYLE_LIST_ITEM_GROUP_FOOTER (ES_STYLE_CAST(1281))
define ES_STYLE_LIST_ITEM_GROUP_HEADER (ES_STYLE_CAST(1283))
define ES_STYLE_LIST_ITEM_TILE (ES_STYLE_CAST(1285))
define_private ES_STYLE_LIST_PRIMARY_CELL (ES_STYLE_CAST(1287))
define_private ES_STYLE_LIST_SECONDARY_CELL (ES_STYLE_CAST(1289))
define_private ES_STYLE_LIST_SELECTED_CHOICE_CELL (ES_STYLE_CAST(1621))
define_private ES_STYLE_LIST_SELECTION_BOX (ES_STYLE_CAST(1291))
private define ES_STYLE_LIST_PRIMARY_CELL (ES_STYLE_CAST(1287))
private define ES_STYLE_LIST_SECONDARY_CELL (ES_STYLE_CAST(1289))
private define ES_STYLE_LIST_SELECTED_CHOICE_CELL (ES_STYLE_CAST(1621))
private define ES_STYLE_LIST_SELECTION_BOX (ES_STYLE_CAST(1291))
define ES_STYLE_LIST_VIEW (ES_STYLE_CAST(1293))
define ES_STYLE_LIST_VIEW_BORDERED (ES_STYLE_CAST(1295))
define ES_STYLE_LIST_DISPLAY_DEFAULT (ES_STYLE_CAST(1441))
define_private ES_STYLE_MARKER_DOWN_ARROW (ES_STYLE_CAST(1297))
define_private ES_STYLE_MARKER_UP_ARROW (ES_STYLE_CAST(1501))
define_private ES_STYLE_MENU_ITEM_HEADER (ES_STYLE_CAST(1299))
define_private ES_STYLE_MENU_ITEM_NORMAL (ES_STYLE_CAST(1301))
define_private ES_STYLE_MENU_SEPARATOR_HORIZONTAL (ES_STYLE_CAST(1303))
define_private ES_STYLE_MENU_SEPARATOR_VERTICAL (ES_STYLE_CAST(1305))
define_private ES_STYLE_PANEL_CONTAINER_WINDOW_ROOT (ES_STYLE_CAST(1307))
define_private ES_STYLE_PANEL_CRASH_INFO (ES_STYLE_CAST(1309))
private define ES_STYLE_MARKER_DOWN_ARROW (ES_STYLE_CAST(1297))
private define ES_STYLE_MARKER_UP_ARROW (ES_STYLE_CAST(1501))
private define ES_STYLE_MENU_ITEM_HEADER (ES_STYLE_CAST(1299))
private define ES_STYLE_MENU_ITEM_NORMAL (ES_STYLE_CAST(1301))
private define ES_STYLE_MENU_SEPARATOR_HORIZONTAL (ES_STYLE_CAST(1303))
private define ES_STYLE_MENU_SEPARATOR_VERTICAL (ES_STYLE_CAST(1305))
private define ES_STYLE_PANEL_CONTAINER_WINDOW_ROOT (ES_STYLE_CAST(1307))
private define ES_STYLE_PANEL_CRASH_INFO (ES_STYLE_CAST(1309))
define ES_STYLE_PANEL_DIALOG_ROOT (ES_STYLE_CAST(1311))
define ES_STYLE_PANEL_DOCUMENT (ES_STYLE_CAST(1547))
define ES_STYLE_PANEL_FILLED (ES_STYLE_CAST(1313))
define ES_STYLE_PANEL_GROUP_BOX (ES_STYLE_CAST(1315))
define ES_STYLE_PANEL_INSET (ES_STYLE_CAST(1641))
define_private ES_STYLE_PANEL_INSPECTOR_WINDOW_CONTAINER (ES_STYLE_CAST(1317))
define_private ES_STYLE_PANEL_INSPECTOR_WINDOW_ROOT (ES_STYLE_CAST(1319))
define_private ES_STYLE_PANEL_MENU_COLUMN (ES_STYLE_CAST(1321))
define_private ES_STYLE_PANEL_MENU_CONTAINER (ES_STYLE_CAST(1323))
define_private ES_STYLE_PANEL_MENU_ROOT (ES_STYLE_CAST(1325))
define_private ES_STYLE_PANEL_MODAL_OVERLAY (ES_STYLE_CAST(1327))
define_private ES_STYLE_PANEL_NORMAL_WINDOW_ROOT (ES_STYLE_CAST(1329))
private define ES_STYLE_PANEL_INSPECTOR_WINDOW_CONTAINER (ES_STYLE_CAST(1317))
private define ES_STYLE_PANEL_INSPECTOR_WINDOW_ROOT (ES_STYLE_CAST(1319))
private define ES_STYLE_PANEL_MENU_COLUMN (ES_STYLE_CAST(1321))
private define ES_STYLE_PANEL_MENU_CONTAINER (ES_STYLE_CAST(1323))
private define ES_STYLE_PANEL_MENU_ROOT (ES_STYLE_CAST(1325))
private define ES_STYLE_PANEL_MODAL_OVERLAY (ES_STYLE_CAST(1327))
private define ES_STYLE_PANEL_NORMAL_WINDOW_ROOT (ES_STYLE_CAST(1329))
define ES_STYLE_PANEL_POPUP (ES_STYLE_CAST(1331))
define ES_STYLE_PANEL_SHEET (ES_STYLE_CAST(1333))
define_private ES_STYLE_PANEL_SHUTDOWN_OVERLAY (ES_STYLE_CAST(1335))
private define ES_STYLE_PANEL_SHUTDOWN_OVERLAY (ES_STYLE_CAST(1335))
define ES_STYLE_PANEL_STATUS_BAR (ES_STYLE_CAST(1489))
define ES_STYLE_PANEL_TOOLBAR (ES_STYLE_CAST(1337))
define ES_STYLE_PANEL_TOOLBAR_ROOT (ES_STYLE_CAST(1339))
@ -73,34 +73,34 @@ define ES_STYLE_PANEL_WINDOW_BACKGROUND (ES_STYLE_CAST(1341))
define ES_STYLE_PANEL_WINDOW_DIVIDER (ES_STYLE_CAST(1343))
define ES_STYLE_PANEL_WINDOW_WITH_STATUS_BAR_CONTENT (ES_STYLE_CAST(1483))
define ES_STYLE_PUSH_BUTTON_DANGEROUS (ES_STYLE_CAST(1345))
define_private ES_STYLE_PUSH_BUTTON_NORMAL (ES_STYLE_CAST(1347))
define_private ES_STYLE_PUSH_BUTTON_NORMAL_COLOR_WELL (ES_STYLE_CAST(1349))
define_private ES_STYLE_PUSH_BUTTON_SCROLLBAR_DOWN (ES_STYLE_CAST(1351))
define_private ES_STYLE_PUSH_BUTTON_SCROLLBAR_LEFT (ES_STYLE_CAST(1353))
define_private ES_STYLE_PUSH_BUTTON_SCROLLBAR_RIGHT (ES_STYLE_CAST(1355))
define_private ES_STYLE_PUSH_BUTTON_SCROLLBAR_UP (ES_STYLE_CAST(1357))
private define ES_STYLE_PUSH_BUTTON_NORMAL (ES_STYLE_CAST(1347))
private define ES_STYLE_PUSH_BUTTON_NORMAL_COLOR_WELL (ES_STYLE_CAST(1349))
private define ES_STYLE_PUSH_BUTTON_SCROLLBAR_DOWN (ES_STYLE_CAST(1351))
private define ES_STYLE_PUSH_BUTTON_SCROLLBAR_LEFT (ES_STYLE_CAST(1353))
private define ES_STYLE_PUSH_BUTTON_SCROLLBAR_RIGHT (ES_STYLE_CAST(1355))
private define ES_STYLE_PUSH_BUTTON_SCROLLBAR_UP (ES_STYLE_CAST(1357))
define ES_STYLE_PUSH_BUTTON_STATUS_BAR (ES_STYLE_CAST(1495))
define ES_STYLE_PUSH_BUTTON_TOOLBAR (ES_STYLE_CAST(1359))
define ES_STYLE_PUSH_BUTTON_TOOLBAR_BIG (ES_STYLE_CAST(1457))
define ES_STYLE_PUSH_BUTTON_TOOLBAR_MEDIUM (ES_STYLE_CAST(1461))
define_private ES_STYLE_SCROLLBAR_BAR_HORIZONTAL (ES_STYLE_CAST(1363))
define_private ES_STYLE_SCROLLBAR_BAR_VERTICAL (ES_STYLE_CAST(1365))
define_private ES_STYLE_SCROLLBAR_THUMB_HORIZONTAL (ES_STYLE_CAST(1367))
define_private ES_STYLE_SCROLLBAR_THUMB_VERTICAL (ES_STYLE_CAST(1369))
define_private ES_STYLE_SCROLLBAR_PAD (ES_STYLE_CAST(1371))
private define ES_STYLE_SCROLLBAR_BAR_HORIZONTAL (ES_STYLE_CAST(1363))
private define ES_STYLE_SCROLLBAR_BAR_VERTICAL (ES_STYLE_CAST(1365))
private define ES_STYLE_SCROLLBAR_THUMB_HORIZONTAL (ES_STYLE_CAST(1367))
private define ES_STYLE_SCROLLBAR_THUMB_VERTICAL (ES_STYLE_CAST(1369))
private define ES_STYLE_SCROLLBAR_PAD (ES_STYLE_CAST(1371))
define ES_STYLE_SEPARATOR_HORIZONTAL (ES_STYLE_CAST(1373))
define_private ES_STYLE_SLIDER_POINT (ES_STYLE_CAST(1607))
define_private ES_STYLE_SLIDER_TRACK (ES_STYLE_CAST(1601))
define_private ES_STYLE_SPLIT_BAR_HORIZONTAL (ES_STYLE_CAST(1375))
define_private ES_STYLE_SPLIT_BAR_VERTICAL (ES_STYLE_CAST(1377))
define_private ES_STYLE_TASK_BAR_BAR (ES_STYLE_CAST(1379))
define_private ES_STYLE_TASK_BAR_BUTTON (ES_STYLE_CAST(1381))
define_private ES_STYLE_TASK_BAR_EXTRA (ES_STYLE_CAST(1507))
define_private ES_STYLE_TASK_BAR_NEW_WINDOW (ES_STYLE_CAST(1383))
private define ES_STYLE_SLIDER_POINT (ES_STYLE_CAST(1607))
private define ES_STYLE_SLIDER_TRACK (ES_STYLE_CAST(1601))
private define ES_STYLE_SPLIT_BAR_HORIZONTAL (ES_STYLE_CAST(1375))
private define ES_STYLE_SPLIT_BAR_VERTICAL (ES_STYLE_CAST(1377))
private define ES_STYLE_TASK_BAR_BAR (ES_STYLE_CAST(1379))
private define ES_STYLE_TASK_BAR_BUTTON (ES_STYLE_CAST(1381))
private define ES_STYLE_TASK_BAR_EXTRA (ES_STYLE_CAST(1507))
private define ES_STYLE_TASK_BAR_NEW_WINDOW (ES_STYLE_CAST(1383))
define ES_STYLE_TEXT_HEADING0 (ES_STYLE_CAST(1387))
define ES_STYLE_TEXT_HEADING1 (ES_STYLE_CAST(1581))
define ES_STYLE_TEXT_HEADING2 (ES_STYLE_CAST(1389))
define_private ES_STYLE_TEXT_HEADING3 (ES_STYLE_CAST(1423))
private define ES_STYLE_TEXT_HEADING3 (ES_STYLE_CAST(1423))
define ES_STYLE_TEXT_LABEL (ES_STYLE_CAST(1391))
define ES_STYLE_TEXT_LABEL_INVERTED (ES_STYLE_CAST(1393))
define ES_STYLE_TEXT_LABEL_SECONDARY (ES_STYLE_CAST(1395))
@ -111,12 +111,12 @@ define ES_STYLE_TEXT_TOOLBAR (ES_STYLE_CAST(1553))
define ES_STYLE_TEXTBOX_BORDERED_MULTILINE (ES_STYLE_CAST(1399))
define ES_STYLE_TEXTBOX_BORDERED_SINGLE (ES_STYLE_CAST(1401))
define ES_STYLE_TEXTBOX_BORDERED_SINGLE_COMPACT (ES_STYLE_CAST(1403))
define_private ES_STYLE_TEXTBOX_INLINE (ES_STYLE_CAST(1477))
define_private ES_STYLE_TEXTBOX_MARGIN (ES_STYLE_CAST(1415))
private define ES_STYLE_TEXTBOX_INLINE (ES_STYLE_CAST(1477))
private define ES_STYLE_TEXTBOX_MARGIN (ES_STYLE_CAST(1415))
define ES_STYLE_TEXTBOX_NO_BORDER (ES_STYLE_CAST(1405))
define ES_STYLE_TEXTBOX_TRANSPARENT (ES_STYLE_CAST(1445))
define_private ES_STYLE_WINDOW_TAB_ACTIVE (ES_STYLE_CAST(1407))
define_private ES_STYLE_WINDOW_TAB_CLOSE_BUTTON (ES_STYLE_CAST(1469))
define_private ES_STYLE_WINDOW_TAB_INACTIVE (ES_STYLE_CAST(1409))
define_private ES_STYLE_WINDOW_TAB_BAND (ES_STYLE_CAST(1411))
define_private ES_STYLE_WINDOW_TAB_BAND_NEW (ES_STYLE_CAST(1361))
private define ES_STYLE_WINDOW_TAB_ACTIVE (ES_STYLE_CAST(1407))
private define ES_STYLE_WINDOW_TAB_CLOSE_BUTTON (ES_STYLE_CAST(1469))
private define ES_STYLE_WINDOW_TAB_INACTIVE (ES_STYLE_CAST(1409))
private define ES_STYLE_WINDOW_TAB_BAND (ES_STYLE_CAST(1411))
private define ES_STYLE_WINDOW_TAB_BAND_NEW (ES_STYLE_CAST(1361))

View File

@ -2677,6 +2677,11 @@ void *EsBufferWrite(EsBuffer *buffer, const void *source, size_t writeBytes) {
}
}
bool EsBufferWriteInt8(EsBuffer *buffer, int8_t value) {
EsBufferWrite(buffer, &value, sizeof(int8_t));
return buffer->error;
}
bool EsBufferWriteInt32Endian(EsBuffer *buffer, int32_t value) {
#ifdef __BIG_ENDIAN__
value = ByteSwap32(value);

View File

@ -33,6 +33,7 @@ DEFINE_INTERFACE_STRING(CommonFileMakeCopy, "Make a copy");
DEFINE_INTERFACE_STRING(CommonFileVersionHistory, "Version history" ELLIPSIS);
DEFINE_INTERFACE_STRING(CommonFileShowInFileManager, "Show in File Manager" ELLIPSIS);
DEFINE_INTERFACE_STRING(CommonFileMenuFileSize, "Size:");
DEFINE_INTERFACE_STRING(CommonFileMenuFileLocation, "Location:");
DEFINE_INTERFACE_STRING(CommonFileUnchanged, "(All changes saved.)");
DEFINE_INTERFACE_STRING(CommonSearchOpen, "Search");

View File

@ -378,7 +378,6 @@ EsMountPointEnumerate=376
EsMountPointGetVolumeInformation=377
EsListViewInvalidateAll=378
EsListViewGetFocusedItem=379
EsInstanceGetStartupInformation=380
EsPathQueryInformation=381
EsListViewCreateInlineTextbox=382
EsTextboxStartEdit=383
@ -457,3 +456,5 @@ EsWorkQueue=455
EsWorkIsExiting=456
EsPanelRadioGroupGetChecked=457
EsTextboxEnableSmartQuotes=458
EsBufferWriteInt8=459
EsInstanceGetStartupRequest=460

View File

@ -1403,7 +1403,7 @@ void StyleSetOp(RfState *state, RfItem *item, void *pointer) {
printf("exporting '%.*s' (id: %ld)\n", (int) style->name.byteCount, (char *) style->name.buffer, (style->id << 1) | 1);
if (style->id && stylesPath) {
fprintf(f, "%s ES_STYLE_", style->publicStyle ? "define" : "define_private");
fprintf(f, "%s ES_STYLE_", style->publicStyle ? "define" : "private define");
bool dot = false;

View File

@ -37,14 +37,13 @@ typedef struct Token {
#define TOKEN_API_TYPE (29)
#define TOKEN_FUNCTION_POINTER (30)
#define TOKEN_TYPE_NAME (31)
#define TOKEN_DEFINE_PRIVATE (32)
#define TOKEN_PRIVATE (32)
int type, value;
char *text;
} Token;
#define ENTRY_ROOT (0)
#define ENTRY_DEFINE (1)
#define ENTRY_DEFINE_PRIVATE (2)
#define ENTRY_ENUM (3)
#define ENTRY_STRUCT (4)
#define ENTRY_UNION (5)
@ -59,6 +58,8 @@ typedef struct Entry {
char *name;
struct Entry *children;
bool isPrivate;
union {
struct {
char *type, *arraySize, *initialValue;
@ -146,7 +147,6 @@ Token NextToken() {
#define COMPARE_KEYWORD(x, y) if (strlen(x) == token.value && 0 == memcmp(x, token.text, token.value)) token.type = y
COMPARE_KEYWORD("define", TOKEN_DEFINE);
COMPARE_KEYWORD("define_private", TOKEN_DEFINE_PRIVATE);
COMPARE_KEYWORD("enum", TOKEN_ENUM);
COMPARE_KEYWORD("struct", TOKEN_STRUCT);
COMPARE_KEYWORD("function", TOKEN_FUNCTION);
@ -158,6 +158,7 @@ Token NextToken() {
COMPARE_KEYWORD("opaque_type", TOKEN_API_TYPE);
COMPARE_KEYWORD("function_pointer", TOKEN_FUNCTION_POINTER);
COMPARE_KEYWORD("type_name", TOKEN_TYPE_NAME);
COMPARE_KEYWORD("private", TOKEN_PRIVATE);
}
else {
@ -296,25 +297,16 @@ void ParseFile(Entry *root, const char *name) {
position = 0;
Token token;
bool nextToken = true;
bool isPrivate = false;
while (true) {
if (nextToken) token = NextToken();
nextToken = true;
token = NextToken();
if (token.type == TOKEN_DEFINE) {
Token identifier = NextToken();
size_t length = 0;
while (!FoundEndOfLine(length)) length++;
Entry entry = { .type = ENTRY_DEFINE, .name = TokenToString(identifier) };
entry.define.value = TokenToString((Token) { .value = (int) length, .text = buffer + position });
arrput(root->children, entry);
position += length;
} else if (token.type == TOKEN_DEFINE_PRIVATE) {
Token identifier = NextToken();
size_t length = 0;
while (!FoundEndOfLine(length)) length++;
Entry entry = { .type = ENTRY_DEFINE_PRIVATE, .name = TokenToString(identifier) };
Entry entry = { .type = ENTRY_DEFINE, .name = TokenToString(identifier), .isPrivate = isPrivate };
entry.define.value = TokenToString((Token) { .value = (int) length, .text = buffer + position });
arrput(root->children, entry);
position += length;
@ -334,7 +326,7 @@ void ParseFile(Entry *root, const char *name) {
assert(name.type == TOKEN_IDENTIFIER);
assert(NextToken().type == TOKEN_LEFT_BRACE);
Entry entry = { .type = ENTRY_ENUM, .name = TokenToString(name) };
Entry entry = { .type = ENTRY_ENUM, .name = TokenToString(name), .isPrivate = isPrivate };
Token token = NextToken();
while (true) {
@ -364,6 +356,7 @@ void ParseFile(Entry *root, const char *name) {
assert(structName.type == TOKEN_IDENTIFIER);
assert(NextToken().type == TOKEN_LEFT_BRACE);
Entry entry = ParseRecord(false);
entry.isPrivate = isPrivate;
entry.name = TokenToString(structName);
arrput(root->children, entry);
} else if (token.type == TOKEN_FUNCTION || token.type == TOKEN_FUNCTION_NOT_IN_KERNEL
@ -371,7 +364,7 @@ void ParseFile(Entry *root, const char *name) {
bool inKernel = token.type != TOKEN_FUNCTION_NOT_IN_KERNEL;
Entry objectFunctionType;
bool firstVariable = true;
Entry entry = { .type = ENTRY_FUNCTION, .function = { .inKernel = inKernel, .apiArrayIndex = 0 } };
Entry entry = { .type = ENTRY_FUNCTION, .isPrivate = isPrivate, .function = { .inKernel = inKernel, .apiArrayIndex = 0 } };
if (token.type == TOKEN_FUNCTION_POINTER) {
entry.function.functionPointer = true;
@ -395,15 +388,18 @@ void ParseFile(Entry *root, const char *name) {
arrput(root->children, entry);
} else if (token.type == TOKEN_TYPE_NAME) {
Token oldName = NextToken(), newName = NextToken();
Entry entry = { .type = ENTRY_TYPE_NAME, .name = TokenToString(newName), .oldTypeName = TokenToString(oldName) };
Entry entry = { .type = ENTRY_TYPE_NAME, .isPrivate = isPrivate, .name = TokenToString(newName), .oldTypeName = TokenToString(oldName) };
arrput(root->children, entry);
} else if (token.type == TOKEN_SEMICOLON) {
} else if (token.type == TOKEN_PRIVATE) {
} else if (token.type == TOKEN_EOF) {
break;
} else {
Log("unexpected token '%.*s' at top level\n", token.value, token.text);
exit(1);
}
isPrivate = token.type == TOKEN_PRIVATE;
}
free(buffer);
@ -593,10 +589,12 @@ void OutputC(Entry *root) {
for (int i = 0; i < arrlen(root->children); i++) {
Entry *entry = root->children + i;
if (entry->isPrivate) {
FilePrintFormat(output, "#if defined(ES_API) || defined(KERNEL) || defined(INSTALLER)\n");
}
if (entry->type == ENTRY_DEFINE) {
FilePrintFormat(output, "#define %s (%s)\n", entry->name, entry->define.value);
} else if (entry->type == ENTRY_DEFINE_PRIVATE) {
FilePrintFormat(output, "#ifdef ES_API\n#define %s (%s)\n#endif\n", entry->name, entry->define.value);
} else if (entry->type == ENTRY_STRUCT) {
FilePrintFormat(output, "typedef struct %s {\n", entry->name);
OutputCRecord(entry, 0);
@ -640,6 +638,10 @@ void OutputC(Entry *root) {
} else if (entry->type == ENTRY_TYPE_NAME) {
FilePrintFormat(output, "typedef %s %s;\n", entry->oldTypeName, entry->name);
}
if (entry->isPrivate) {
FilePrintFormat(output, "#endif\n");
}
}
for (int i = 0; i < arrlen(root->children); i++) {
@ -901,6 +903,7 @@ void OutputOdin(Entry *root) {
for (int i = 0; i < arrlen(root->children); i++) {
Entry *entry = root->children + i;
if (entry->isPrivate) continue;
if (entry->type == ENTRY_DEFINE) {
const char *styleCast = strstr(entry->define.value, "STYLE_CAST(");
@ -1128,6 +1131,7 @@ void OutputZig(Entry *root) {
for (int i = 0; i < arrlen(root->children); i++) {
Entry *entry = root->children + i;
if (entry->isPrivate) continue;
if (entry->type == ENTRY_DEFINE) {
FilePrintFormat(output, "pub const %s = %s;\n", TrimPrefix(entry->name), ZigReplaceTypes(entry->define.value, false));