mirror of https://gitlab.com/nakst/essence
				
				
				
			fix file manager threaded instance destroy bug
This commit is contained in:
		
							parent
							
								
									2b288a82a6
								
							
						
					
					
						commit
						626eac1386
					
				|  | @ -56,7 +56,9 @@ void CommandRename(Instance *instance, EsElement *, EsCommand *) { | ||||||
| 					}, | 					}, | ||||||
| 
 | 
 | ||||||
| 					.then = [] (Instance *instance, Task *task) { | 					.then = [] (Instance *instance, Task *task) { | ||||||
| 						if (task->result != ES_SUCCESS) { | 						if (instance->closed) { | ||||||
|  | 							// Ignore.
 | ||||||
|  | 						} else if (task->result != ES_SUCCESS) { | ||||||
| 							InstanceReportError(instance, ERROR_RENAME_ITEM, task->result); | 							InstanceReportError(instance, ERROR_RENAME_ITEM, task->result); | ||||||
| 						} else { | 						} else { | ||||||
| 							Folder *folder = instance->folder; | 							Folder *folder = instance->folder; | ||||||
|  | @ -105,7 +107,9 @@ void CommandNewFolder(Instance *instance, EsElement *, EsCommand *) { | ||||||
| 		}, | 		}, | ||||||
| 
 | 
 | ||||||
| 		.then = [] (Instance *instance, Task *task) { | 		.then = [] (Instance *instance, Task *task) { | ||||||
| 			if (task->result != ES_SUCCESS) { | 			if (instance->closed) { | ||||||
|  | 				// Ignore.
 | ||||||
|  | 			} else if (task->result != ES_SUCCESS) { | ||||||
| 				InstanceReportError(instance, ERROR_NEW_FOLDER, task->result); | 				InstanceReportError(instance, ERROR_NEW_FOLDER, task->result); | ||||||
| 			} else { | 			} else { | ||||||
| 				Folder *folder = instance->folder; | 				Folder *folder = instance->folder; | ||||||
|  | @ -405,7 +409,7 @@ void CommandPasteTask(EsUserTask *userTask, EsGeneric _task) { | ||||||
| 	for (uintptr_t i = 0; i < instances.Length(); i++) { | 	for (uintptr_t i = 0; i < instances.Length(); i++) { | ||||||
| 		Instance *instance = instances[i]; | 		Instance *instance = instances[i]; | ||||||
| 
 | 
 | ||||||
| 		if (instance->issuedPasteTask == task) { | 		if (!instance->closed && instance->issuedPasteTask == task) { | ||||||
| 			instance->issuedPasteTask = nullptr; | 			instance->issuedPasteTask = nullptr; | ||||||
| 
 | 
 | ||||||
| 			if (error != ES_SUCCESS) { | 			if (error != ES_SUCCESS) { | ||||||
|  |  | ||||||
|  | @ -77,6 +77,9 @@ EsError FSDirEnumerate(Folder *folder) { | ||||||
| 	EsDirectoryChild *buffer = nullptr; | 	EsDirectoryChild *buffer = nullptr; | ||||||
| 	ptrdiff_t _entryCount = EsDirectoryEnumerateChildren(STRING(folder->path), &buffer); | 	ptrdiff_t _entryCount = EsDirectoryEnumerateChildren(STRING(folder->path), &buffer); | ||||||
| 
 | 
 | ||||||
|  | 	// TODO.
 | ||||||
|  | 	EsSleep(5000); | ||||||
|  | 
 | ||||||
| 	if (!ES_CHECK_ERROR(_entryCount)) { | 	if (!ES_CHECK_ERROR(_entryCount)) { | ||||||
| 		for (intptr_t i = 0; i < _entryCount; i++) { | 		for (intptr_t i = 0; i < _entryCount; i++) { | ||||||
| 			FolderAddEntry(folder, buffer[i].name, buffer[i].nameBytes, &buffer[i]); | 			FolderAddEntry(folder, buffer[i].name, buffer[i].nameBytes, &buffer[i]); | ||||||
|  | @ -301,6 +304,7 @@ void BookmarkAdd(String path, bool saveConfiguration = true) { | ||||||
| 	if (saveConfiguration) ConfigurationSave(); | 	if (saveConfiguration) ConfigurationSave(); | ||||||
| 
 | 
 | ||||||
| 	for (uintptr_t i = 0; i < instances.Length(); i++) { | 	for (uintptr_t i = 0; i < instances.Length(); i++) { | ||||||
|  | 		if (instances[i]->closed) continue; | ||||||
| 		EsListViewInsert(instances[i]->placesView, PLACES_VIEW_GROUP_BOOKMARKS, bookmarks.Length(), 1); | 		EsListViewInsert(instances[i]->placesView, PLACES_VIEW_GROUP_BOOKMARKS, bookmarks.Length(), 1); | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  | @ -311,6 +315,7 @@ void BookmarkRemove(String path) { | ||||||
| 			bookmarks.Delete(i); | 			bookmarks.Delete(i); | ||||||
| 
 | 
 | ||||||
| 			for (uintptr_t i = 0; i < instances.Length(); i++) { | 			for (uintptr_t i = 0; i < instances.Length(); i++) { | ||||||
|  | 				if (instances[i]->closed) continue; | ||||||
| 				EsListViewRemove(instances[i]->placesView, PLACES_VIEW_GROUP_BOOKMARKS, i + 1, 1); | 				EsListViewRemove(instances[i]->placesView, PLACES_VIEW_GROUP_BOOKMARKS, i + 1, 1); | ||||||
| 			} | 			} | ||||||
| 
 | 
 | ||||||
|  | @ -433,6 +438,7 @@ void FolderAddEntryAndUpdateInstances(Folder *folder, const char *name, size_t n | ||||||
| 
 | 
 | ||||||
| 	for (uintptr_t i = 0; i < folder->attachedInstances.Length(); i++) { | 	for (uintptr_t i = 0; i < folder->attachedInstances.Length(); i++) { | ||||||
| 		Instance *instance = folder->attachedInstances[i]; | 		Instance *instance = folder->attachedInstances[i]; | ||||||
|  | 		if (instance->closed) continue; | ||||||
| 		listEntry.selected = instance == selectItem; | 		listEntry.selected = instance == selectItem; | ||||||
| 		InstanceAddSingle(instance, listEntry); | 		InstanceAddSingle(instance, listEntry); | ||||||
| 		InstanceUpdateStatusString(instance); | 		InstanceUpdateStatusString(instance); | ||||||
|  | @ -445,6 +451,7 @@ uint64_t FolderRemoveEntryAndUpdateInstances(Folder *folder, const char *name, s | ||||||
| 
 | 
 | ||||||
| 	if (entry) { | 	if (entry) { | ||||||
| 		for (uintptr_t i = 0; i < folder->attachedInstances.Length(); i++) { | 		for (uintptr_t i = 0; i < folder->attachedInstances.Length(); i++) { | ||||||
|  | 			if (folder->attachedInstances[i]->closed) continue; | ||||||
| 			InstanceRemoveSingle(folder->attachedInstances[i], entry); | 			InstanceRemoveSingle(folder->attachedInstances[i], entry); | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
|  | @ -489,6 +496,7 @@ void FolderPathMoved(String oldPath, String newPath, bool saveConfiguration) { | ||||||
| 
 | 
 | ||||||
| 		if (PathReplacePrefix(&folder->path, oldPath, newPath)) { | 		if (PathReplacePrefix(&folder->path, oldPath, newPath)) { | ||||||
| 			for (uintptr_t i = 0; i < folder->attachedInstances.Length(); i++) { | 			for (uintptr_t i = 0; i < folder->attachedInstances.Length(); i++) { | ||||||
|  | 				if (folder->attachedInstances[i]->closed) continue; | ||||||
| 				InstanceFolderPathChanged(folder->attachedInstances[i], false); | 				InstanceFolderPathChanged(folder->attachedInstances[i], false); | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
|  | @ -503,6 +511,7 @@ void FolderPathMoved(String oldPath, String newPath, bool saveConfiguration) { | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	for (uintptr_t i = 0; i < instances.Length(); i++) { | 	for (uintptr_t i = 0; i < instances.Length(); i++) { | ||||||
|  | 		if (instances[i]->closed) continue; | ||||||
| 		EsListViewInvalidateAll(instances[i]->placesView); | 		EsListViewInvalidateAll(instances[i]->placesView); | ||||||
| 
 | 
 | ||||||
| 		for (uintptr_t j = 0; j < instances[i]->pathBackwardHistory.Length(); j++) { | 		for (uintptr_t j = 0; j < instances[i]->pathBackwardHistory.Length(); j++) { | ||||||
|  | @ -581,6 +590,7 @@ void FolderRefresh(Folder *folder) { | ||||||
| 	Array<Instance *> instancesToRefresh = {}; | 	Array<Instance *> instancesToRefresh = {}; | ||||||
| 
 | 
 | ||||||
| 	for (uintptr_t i = 0; i < folder->attachedInstances.Length(); i++) { | 	for (uintptr_t i = 0; i < folder->attachedInstances.Length(); i++) { | ||||||
|  | 		if (folder->attachedInstances[i]->closed) continue; | ||||||
| 		instancesToRefresh.Add(folder->attachedInstances[i]); | 		instancesToRefresh.Add(folder->attachedInstances[i]); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -179,6 +179,8 @@ struct Instance : EsInstance { | ||||||
| 	Task blockingTask; | 	Task blockingTask; | ||||||
| 	volatile bool blockingTaskInProgress, blockingTaskReachedTimeout; | 	volatile bool blockingTaskInProgress, blockingTaskReachedTimeout; | ||||||
| 	volatile uint32_t blockingTaskID; | 	volatile uint32_t blockingTaskID; | ||||||
|  | 
 | ||||||
|  | 	bool closed; // The window has been destroyed (or is about to be).
 | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| struct NamespaceHandler { | struct NamespaceHandler { | ||||||
|  | @ -205,7 +207,7 @@ struct Folder { | ||||||
| 	HashTable entries; | 	HashTable entries; | ||||||
| 	EsArena entryArena; | 	EsArena entryArena; | ||||||
| 
 | 
 | ||||||
| 	Array<Instance *> attachedInstances; | 	Array<Instance *> attachedInstances; // NOTE Check Instance::closed is false before accessing the UI!
 | ||||||
| 	uintptr_t referenceCount; | 	uintptr_t referenceCount; | ||||||
| 
 | 
 | ||||||
| 	String path; | 	String path; | ||||||
|  | @ -245,7 +247,7 @@ void ThumbnailGenerateIfNeeded(Folder *folder, FolderEntry *entry, bool fromFold | ||||||
| Array<Drive> drives; | Array<Drive> drives; | ||||||
| EsMutex drivesMutex; | EsMutex drivesMutex; | ||||||
| 
 | 
 | ||||||
| Array<Instance *> instances; | Array<Instance *> instances; // NOTE Check Instance::closed is false before accessing the UI!
 | ||||||
| 
 | 
 | ||||||
| Array<String> bookmarks; | Array<String> bookmarks; | ||||||
| #define FOLDER_VIEW_SETTINGS_MAXIMUM_ENTRIES (10000) | #define FOLDER_VIEW_SETTINGS_MAXIMUM_ENTRIES (10000) | ||||||
|  | @ -330,11 +332,15 @@ void BlockingTaskComplete(Instance *instance) { | ||||||
| 	if (task->then) { | 	if (task->then) { | ||||||
| 		task->then(instance, task); | 		task->then(instance, task); | ||||||
| 	} | 	} | ||||||
|  | 
 | ||||||
|  | 	EsInstanceCloseReference(instance); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void BlockingTaskQueue(Instance *instance, Task task) { | void BlockingTaskQueue(Instance *instance, Task task) { | ||||||
| 	EsAssert(!instance->blockingTaskInProgress); // Cannot queue a new blocking task if the previous has not finished.
 | 	EsAssert(!instance->blockingTaskInProgress); // Cannot queue a new blocking task if the previous has not finished.
 | ||||||
| 
 | 
 | ||||||
|  | 	EsInstanceOpenReference(instance); // Don't destroy the instance while the task is in progress.
 | ||||||
|  | 
 | ||||||
| 	instance->blockingTask = task; | 	instance->blockingTask = task; | ||||||
| 	instance->blockingTaskInProgress = true; | 	instance->blockingTaskInProgress = true; | ||||||
| 
 | 
 | ||||||
|  | @ -434,6 +440,7 @@ void DriveRemove(const char *prefix, size_t prefixBytes) { | ||||||
| 			found = true; | 			found = true; | ||||||
| 
 | 
 | ||||||
| 			for (uintptr_t i = 0; i < instances.Length(); i++) { | 			for (uintptr_t i = 0; i < instances.Length(); i++) { | ||||||
|  | 				if (instances[i]->closed) continue; | ||||||
| 				EsListViewRemove(instances[i]->placesView, PLACES_VIEW_GROUP_DRIVES, index, 1); | 				EsListViewRemove(instances[i]->placesView, PLACES_VIEW_GROUP_DRIVES, index, 1); | ||||||
| 			} | 			} | ||||||
| 
 | 
 | ||||||
|  | @ -459,6 +466,7 @@ void DriveAdd(const char *prefix, size_t prefixBytes) { | ||||||
| 	drives.Add(drive); | 	drives.Add(drive); | ||||||
| 
 | 
 | ||||||
| 	for (uintptr_t i = 0; i < instances.Length(); i++) { | 	for (uintptr_t i = 0; i < instances.Length(); i++) { | ||||||
|  | 		if (instances[i]->closed) continue; | ||||||
| 		EsListViewInsert(instances[i]->placesView, PLACES_VIEW_GROUP_DRIVES, drives.Length(), 1); | 		EsListViewInsert(instances[i]->placesView, PLACES_VIEW_GROUP_DRIVES, drives.Length(), 1); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | @ -520,6 +528,16 @@ void _start() { | ||||||
| 				instances.Add(instance); | 				instances.Add(instance); | ||||||
| 				InstanceCreateUI(instance); | 				InstanceCreateUI(instance); | ||||||
| 			} | 			} | ||||||
|  | 		} else if (message->type == ES_MSG_INSTANCE_CLOSE) { | ||||||
|  | 			Instance *instance = message->instanceClose.instance; | ||||||
|  | 			EsAssert(!instance->closed); | ||||||
|  | 			instance->closed = true; | ||||||
|  | 			instance->list = nullptr; | ||||||
|  | 			instance->placesView = nullptr; | ||||||
|  | 			instance->breadcrumbBar = nullptr; | ||||||
|  | 			instance->newFolderButton = nullptr; | ||||||
|  | 			instance->status = nullptr; | ||||||
|  | 			instance->blockingDialog = nullptr; | ||||||
| 		} else if (message->type == ES_MSG_INSTANCE_DESTROY) { | 		} else if (message->type == ES_MSG_INSTANCE_DESTROY) { | ||||||
| 			Instance *instance = message->instanceDestroy.instance; | 			Instance *instance = message->instanceDestroy.instance; | ||||||
| 			EsApplicationStartupRequest request = EsInstanceGetStartupRequest(instance); | 			EsApplicationStartupRequest request = EsInstanceGetStartupRequest(instance); | ||||||
|  | @ -628,6 +646,7 @@ void _start() { | ||||||
| 			} | 			} | ||||||
| 
 | 
 | ||||||
| 			for (uintptr_t i = 0; i < instances.Length(); i++) { | 			for (uintptr_t i = 0; i < instances.Length(); i++) { | ||||||
|  | 				if (instances[i]->closed) continue; | ||||||
| 				EsListViewInvalidateAll(instances[i]->list); | 				EsListViewInvalidateAll(instances[i]->list); | ||||||
| 			} | 			} | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -72,6 +72,10 @@ bool InstanceLoadFolder(Instance *instance, String path /* takes ownership */, i | ||||||
| 	task.then = [] (Instance *instance, Task *task) { | 	task.then = [] (Instance *instance, Task *task) { | ||||||
| 		// TODO Check if folder was marked for refresh.
 | 		// TODO Check if folder was marked for refresh.
 | ||||||
| 
 | 
 | ||||||
|  | 		if (instance->closed) { | ||||||
|  | 			return; | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
| 		int historyMode = task->context.i & 0xFF; | 		int historyMode = task->context.i & 0xFF; | ||||||
| 		int flags = task->context.i; | 		int flags = task->context.i; | ||||||
| 		Folder *folder = instance->folder; | 		Folder *folder = instance->folder; | ||||||
|  | @ -627,7 +631,7 @@ void ThumbnailGenerateTaskComplete(Instance *, Task *task) { | ||||||
| 	String parent = PathGetParent(task->string); | 	String parent = PathGetParent(task->string); | ||||||
| 
 | 
 | ||||||
| 	for (uintptr_t i = 0; i < instances.Length(); i++) { | 	for (uintptr_t i = 0; i < instances.Length(); i++) { | ||||||
| 		if (StringEquals(parent, instances[i]->path)) { // TODO Support recursive views.
 | 		if (!instances[i]->closed && StringEquals(parent, instances[i]->path)) { // TODO Support recursive views.
 | ||||||
| 			EsListViewInvalidateAll(instances[i]->list); | 			EsListViewInvalidateAll(instances[i]->list); | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | @ -670,7 +670,7 @@ void InstanceSave(EsInstance *_instance) { | ||||||
| 
 | 
 | ||||||
| void InstanceClose(EsInstance *instance) { | void InstanceClose(EsInstance *instance) { | ||||||
| 	if (!EsCommandByID(instance, ES_COMMAND_SAVE)->enabled) { | 	if (!EsCommandByID(instance, ES_COMMAND_SAVE)->enabled) { | ||||||
| 		EsInstanceDestroy(instance); | 		EsInstanceClose(instance); | ||||||
| 		return; | 		return; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | @ -717,7 +717,7 @@ void InstanceClose(EsInstance *instance) { | ||||||
| 	EsDialogAddButton(dialog, ES_FLAGS_DEFAULT, ES_STYLE_PUSH_BUTTON_DANGEROUS, INTERFACE_STRING(FileCloseWithModificationsDelete),  | 	EsDialogAddButton(dialog, ES_FLAGS_DEFAULT, ES_STYLE_PUSH_BUTTON_DANGEROUS, INTERFACE_STRING(FileCloseWithModificationsDelete),  | ||||||
| 			[] (EsInstance *instance, EsElement *, EsCommand *) {  | 			[] (EsInstance *instance, EsElement *, EsCommand *) {  | ||||||
| 		EsDialogClose(instance->window->dialogs.Last());  | 		EsDialogClose(instance->window->dialogs.Last());  | ||||||
| 		EsInstanceDestroy(instance); | 		EsInstanceClose(instance); | ||||||
| 	}); | 	}); | ||||||
| 
 | 
 | ||||||
| 	EsButton *button = EsDialogAddButton(dialog, ES_BUTTON_DEFAULT, 0, INTERFACE_STRING(FileCloseWithModificationsSave),  | 	EsButton *button = EsDialogAddButton(dialog, ES_BUTTON_DEFAULT, 0, INTERFACE_STRING(FileCloseWithModificationsSave),  | ||||||
|  | @ -936,20 +936,12 @@ void EsInstanceCloseReference(EsInstance *_instance) { | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void EsInstanceDestroy(EsInstance *instance) { | void EsInstanceClose(EsInstance *instance) { | ||||||
| 	EsMessageMutexCheck(); | 	EsMessageMutexCheck(); | ||||||
| 	InspectorWindow **inspector = &((APIInstance *) instance->_private)->attachedInspector; | 	EsMessage m = {}; | ||||||
| 
 | 	m.type = ES_MSG_INSTANCE_CLOSE; | ||||||
| 	if (*inspector) { | 	m.instanceClose.instance = instance; | ||||||
| 		EsInstanceDestroy(*inspector); | 	EsMessagePost(nullptr, &m);  | ||||||
| 		(*inspector)->window->InternalDestroy(); |  | ||||||
| 		*inspector = nullptr; |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	UndoManagerDestroy(instance->undoManager); |  | ||||||
| 	EsAssert(instance->window->instance == instance); |  | ||||||
| 	EsElementDestroy(instance->window); |  | ||||||
| 	EsInstanceCloseReference(instance); |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| EsWindow *WindowFromWindowID(EsObjectID id) { | EsWindow *WindowFromWindowID(EsObjectID id) { | ||||||
|  | @ -1063,6 +1055,24 @@ EsMessage *EsMessageReceive() { | ||||||
| 			if (instance->fileStore) FileStoreCloseHandle(instance->fileStore); | 			if (instance->fileStore) FileStoreCloseHandle(instance->fileStore); | ||||||
| 			EsHeapFree(instance); | 			EsHeapFree(instance); | ||||||
| 			EsHeapFree(message.message.instanceDestroy.instance); | 			EsHeapFree(message.message.instanceDestroy.instance); | ||||||
|  | 		} else if (message.message.type == ES_MSG_INSTANCE_CLOSE) { | ||||||
|  | 			EsInstance *instance = message.message.instanceClose.instance; | ||||||
|  | 			InspectorWindow **inspector = &((APIInstance *) instance->_private)->attachedInspector; | ||||||
|  | 
 | ||||||
|  | 			if (*inspector) { | ||||||
|  | 				EsInstance *instance2 = *inspector; | ||||||
|  | 				UndoManagerDestroy(instance2->undoManager); | ||||||
|  | 				EsAssert(instance2->window->instance == instance2); | ||||||
|  | 				EsElementDestroy(instance2->window); | ||||||
|  | 				EsInstanceCloseReference(instance2); | ||||||
|  | 				instance2->window->InternalDestroy(); | ||||||
|  | 				*inspector = nullptr; | ||||||
|  | 			} | ||||||
|  | 
 | ||||||
|  | 			UndoManagerDestroy(instance->undoManager); | ||||||
|  | 			EsAssert(instance->window->instance == instance); | ||||||
|  | 			EsElementDestroy(instance->window); | ||||||
|  | 			EsInstanceCloseReference(instance); | ||||||
| 		} else if (message.message.type == ES_MSG_UNREGISTER_FILE_SYSTEM) { | 		} else if (message.message.type == ES_MSG_UNREGISTER_FILE_SYSTEM) { | ||||||
| 			for (uintptr_t i = 0; i < api.mountPoints.Length(); i++) { | 			for (uintptr_t i = 0; i < api.mountPoints.Length(); i++) { | ||||||
| 				if (api.mountPoints[i].information.id == message.message.unregisterFileSystem.id) { | 				if (api.mountPoints[i].information.id == message.message.unregisterFileSystem.id) { | ||||||
|  | @ -1312,7 +1322,7 @@ EsMessage *EsMessageReceive() { | ||||||
| 					return &message.message; | 					return &message.message; | ||||||
| 				} | 				} | ||||||
| 			} | 			} | ||||||
| 		} else if (type == ES_MSG_INSTANCE_DESTROY) { | 		} else if (type == ES_MSG_INSTANCE_DESTROY || type == ES_MSG_INSTANCE_CLOSE) { | ||||||
| 			APIInstance *instance = (APIInstance *) message.message.instanceDestroy.instance->_private; | 			APIInstance *instance = (APIInstance *) message.message.instanceDestroy.instance->_private; | ||||||
| 
 | 
 | ||||||
| 			if (!instance->internalOnly) { | 			if (!instance->internalOnly) { | ||||||
|  | @ -1404,7 +1414,7 @@ void EsInstanceSaveComplete(EsMessage *message, bool success) { | ||||||
| 			EsCommandSetDisabled(&apiInstance->commandShowInFileManager, false); | 			EsCommandSetDisabled(&apiInstance->commandShowInFileManager, false); | ||||||
| 
 | 
 | ||||||
| 			if (apiInstance->closeAfterSaveCompletes) { | 			if (apiInstance->closeAfterSaveCompletes) { | ||||||
| 				EsInstanceDestroy(instance); | 				EsInstanceClose(instance); | ||||||
| 			} | 			} | ||||||
| 		} else { | 		} else { | ||||||
| 			apiInstance->closeAfterSaveCompletes = false; | 			apiInstance->closeAfterSaveCompletes = false; | ||||||
|  |  | ||||||
|  | @ -1524,7 +1524,7 @@ void InstanceBlankTabCreate(EsMessage *message) { | ||||||
| 
 | 
 | ||||||
| 			if (ApplicationInstanceStart(((InstalledApplication *) element->userData.p)->id, nullptr, instance)) { | 			if (ApplicationInstanceStart(((InstalledApplication *) element->userData.p)->id, nullptr, instance)) { | ||||||
| 				WindowTabActivate(instance->tab, true); | 				WindowTabActivate(instance->tab, true); | ||||||
| 				EsInstanceDestroy(element->instance); | 				EsInstanceClose(element->instance); | ||||||
| 			} | 			} | ||||||
| 		}); | 		}); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | @ -1040,6 +1040,7 @@ enum EsMessageType { | ||||||
| 	ES_MSG_INSTANCE_OPEN			= 0x7003 | 	ES_MSG_INSTANCE_OPEN			= 0x7003 | ||||||
| 	ES_MSG_INSTANCE_SAVE			= 0x7004 | 	ES_MSG_INSTANCE_SAVE			= 0x7004 | ||||||
| 	ES_MSG_INSTANCE_DESTROY			= 0x7005 | 	ES_MSG_INSTANCE_DESTROY			= 0x7005 | ||||||
|  | 	ES_MSG_INSTANCE_CLOSE			= 0x7006 | ||||||
| 
 | 
 | ||||||
| 	// User messages: | 	// User messages: | ||||||
| 	ES_MSG_USER_START			= 0x8000 | 	ES_MSG_USER_START			= 0x8000 | ||||||
|  | @ -1744,6 +1745,10 @@ struct EsMessageInstanceDestroy { | ||||||
| 	ES_INSTANCE_TYPE *instance; | 	ES_INSTANCE_TYPE *instance; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
|  | struct EsMessageInstanceClose { | ||||||
|  | 	ES_INSTANCE_TYPE *instance; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
| // Internal system messages. | // Internal system messages. | ||||||
| 
 | 
 | ||||||
| struct EsMessageProcessCrash { | struct EsMessageProcessCrash { | ||||||
|  | @ -1856,6 +1861,7 @@ struct EsMessage { | ||||||
| 		EsMessageInstanceOpen instanceOpen; | 		EsMessageInstanceOpen instanceOpen; | ||||||
| 		EsMessageInstanceSave instanceSave; | 		EsMessageInstanceSave instanceSave; | ||||||
| 		EsMessageInstanceDestroy instanceDestroy; | 		EsMessageInstanceDestroy instanceDestroy; | ||||||
|  | 		EsMessageInstanceClose instanceClose; | ||||||
| 
 | 
 | ||||||
| 		// Internal messages: | 		// Internal messages: | ||||||
| 		void *_argument; | 		void *_argument; | ||||||
|  | @ -2366,9 +2372,9 @@ function void EsCommandSetCallback(EsCommand *command, EsCommandCallback callbac | ||||||
| function void EsCommandSetDisabled(EsCommand *command, bool disabled); | function void EsCommandSetDisabled(EsCommand *command, bool disabled); | ||||||
| function void EsCommandSetCheck(EsCommand *command, EsCheckState check, bool sendUpdatedMessage); | function void EsCommandSetCheck(EsCommand *command, EsCheckState check, bool sendUpdatedMessage); | ||||||
| 
 | 
 | ||||||
| function void EsInstanceOpenReference(EsInstance *_instance); | function void EsInstanceOpenReference(ES_INSTANCE_TYPE *_instance); | ||||||
| function void EsInstanceCloseReference(EsInstance *_instance); | function void EsInstanceCloseReference(ES_INSTANCE_TYPE *_instance); // Sends ES_MSG_INSTANCE_DESTROY when all references closed. | ||||||
| function void EsInstanceDestroy(ES_INSTANCE_TYPE *instance); | function void EsInstanceClose(ES_INSTANCE_TYPE *instance); // Sends ES_MSG_INSTANCE_CLOSE, and closes the window's reference to the instance. | ||||||
| function void EsInstanceSetActiveUndoManager(ES_INSTANCE_TYPE *instance, EsUndoManager *manager); | function void EsInstanceSetActiveUndoManager(ES_INSTANCE_TYPE *instance, EsUndoManager *manager); | ||||||
| function void EsInstanceSetClassEditor(ES_INSTANCE_TYPE *instance, const EsInstanceClassEditorSettings *settings); | function void EsInstanceSetClassEditor(ES_INSTANCE_TYPE *instance, const EsInstanceClassEditorSettings *settings); | ||||||
| function void EsInstanceSetClassViewer(ES_INSTANCE_TYPE *instance, const EsInstanceClassViewerSettings *settings); | function void EsInstanceSetClassViewer(ES_INSTANCE_TYPE *instance, const EsInstanceClassViewerSettings *settings); | ||||||
|  |  | ||||||
|  | @ -136,6 +136,7 @@ EsBufferFormat=134 | ||||||
| EsEventReset=135 | EsEventReset=135 | ||||||
| EsEventSet=136 | EsEventSet=136 | ||||||
| EsInstanceCloseReference=137 | EsInstanceCloseReference=137 | ||||||
|  | EsInstanceClose=138 | ||||||
| EsMutexAcquire=140 | EsMutexAcquire=140 | ||||||
| EsMutexDestroy=141 | EsMutexDestroy=141 | ||||||
| EsMutexRelease=142 | EsMutexRelease=142 | ||||||
|  | @ -296,7 +297,6 @@ EsSliderCreate=296 | ||||||
| EsSystemConfigurationReadString=297 | EsSystemConfigurationReadString=297 | ||||||
| EsSliderGetValue=298 | EsSliderGetValue=298 | ||||||
| EsGameControllerStatePoll=299 | EsGameControllerStatePoll=299 | ||||||
| EsInstanceDestroy=300 |  | ||||||
| EsRandomU8=301 | EsRandomU8=301 | ||||||
| EsRandomU64=302 | EsRandomU64=302 | ||||||
| EsConnectionPoll=303 | EsConnectionPoll=303 | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue
	
	 nakst
						nakst