From 56b55da549fe30e89eb30c650e263fc6d6612650 Mon Sep 17 00:00:00 2001 From: nakst <> Date: Thu, 18 Nov 2021 10:45:01 +0000 Subject: [PATCH] require ES_ELEMENT_AUTO_GROUP for autoBorders/autoCorners --- apps/file_manager/ui.cpp | 4 +-- apps/font_book.cpp | 2 +- apps/image_editor.cpp | 8 +++--- apps/system_monitor.cpp | 5 +++- apps/text_editor.cpp | 10 ++++--- desktop/desktop.cpp | 7 ++++- desktop/gui.cpp | 8 +++--- desktop/os.header | 4 +++ desktop/settings.cpp | 8 ++---- desktop/styles.header | 1 - kernel/module.h | 3 +- kernel/objects.cpp | 13 ++++++++- kernel/syscall.cpp | 59 +++++++++++++++++++++++++++++++++++++++ res/Theme Source.dat | Bin 530140 -> 528564 bytes res/Theme.dat | Bin 30980 -> 30560 bytes util/designer2.cpp | 42 +++++++++++++++++++++++++--- 16 files changed, 145 insertions(+), 29 deletions(-) diff --git a/apps/file_manager/ui.cpp b/apps/file_manager/ui.cpp index dd7ee75..00be54f 100644 --- a/apps/file_manager/ui.cpp +++ b/apps/file_manager/ui.cpp @@ -1090,7 +1090,7 @@ void InstanceCreateUI(Instance *instance) { // Toolbar: EsElement *toolbar = EsWindowGetToolbar(instance->window); - EsPanel *buttonGroup = EsPanelCreate(toolbar, ES_PANEL_HORIZONTAL); + EsPanel *buttonGroup = EsPanelCreate(toolbar, ES_PANEL_HORIZONTAL | ES_ELEMENT_AUTO_GROUP); ADD_BUTTON_TO_TOOLBAR(commandGoBackwards, nullptr, ES_ICON_GO_PREVIOUS_SYMBOLIC, 'B', button); EsSpacerCreate(buttonGroup, ES_CELL_V_FILL, ES_STYLE_TOOLBAR_BUTTON_GROUP_SEPARATOR); ADD_BUTTON_TO_TOOLBAR(commandGoForwards, nullptr, ES_ICON_GO_NEXT_SYMBOLIC, 'F', button); @@ -1109,7 +1109,7 @@ void InstanceCreateUI(Instance *instance) { EsPanel *statusBar = EsPanelCreate(rootPanel, ES_CELL_H_FILL | ES_PANEL_HORIZONTAL, ES_STYLE_PANEL_STATUS_BAR); instance->status = EsTextDisplayCreate(statusBar, ES_CELL_H_FILL); - buttonGroup = EsPanelCreate(statusBar, ES_PANEL_HORIZONTAL); + buttonGroup = EsPanelCreate(statusBar, ES_PANEL_HORIZONTAL | ES_ELEMENT_AUTO_GROUP); ADD_BUTTON_TO_STATUS_BAR(commandViewDetails, nullptr, ES_ICON_VIEW_LIST_SYMBOLIC, 0, button); EsSpacerCreate(buttonGroup, ES_CELL_V_FILL, ES_STYLE_TOOLBAR_BUTTON_GROUP_SEPARATOR); ADD_BUTTON_TO_STATUS_BAR(commandViewTiles, nullptr, ES_ICON_VIEW_LIST_COMPACT_SYMBOLIC, 0, button); diff --git a/apps/font_book.cpp b/apps/font_book.cpp index 1cfcc99..c0e011f 100644 --- a/apps/font_book.cpp +++ b/apps/font_book.cpp @@ -360,7 +360,7 @@ void _start() { EsSpacerCreate(toolbar, ES_CELL_H_FILL); - EsButton *button = EsButtonCreate(EsPanelCreate(toolbar, ES_PANEL_HORIZONTAL), ES_BUTTON_DROPDOWN, {}, INTERFACE_STRING(FontBookVariants)); + EsButton *button = EsButtonCreate(toolbar, ES_BUTTON_DROPDOWN, {}, INTERFACE_STRING(FontBookVariants)); button->accessKey = 'V'; EsButtonOnCommand(button, VariantsPopupCreate); diff --git a/apps/image_editor.cpp b/apps/image_editor.cpp index 7db4b91..ac7c4f4 100644 --- a/apps/image_editor.cpp +++ b/apps/image_editor.cpp @@ -721,11 +721,11 @@ void InstanceCreate(EsMessage *message) { EsButton *button; EsFileMenuAddToToolbar(toolbar); - button = EsButtonCreate(EsPanelCreate(toolbar, ES_PANEL_HORIZONTAL), ES_BUTTON_DROPDOWN, ES_STYLE_PUSH_BUTTON_TOOLBAR, INTERFACE_STRING(ImageEditorImage)); + button = EsButtonCreate(toolbar, ES_BUTTON_DROPDOWN, ES_STYLE_PUSH_BUTTON_TOOLBAR, INTERFACE_STRING(ImageEditorImage)); EsButtonSetIcon(button, ES_ICON_IMAGE_X_GENERIC); button->accessKey = 'I'; EsButtonOnCommand(button, MenuImage); - EsPanel *buttonGroup = EsPanelCreate(toolbar, ES_PANEL_HORIZONTAL); + EsPanel *buttonGroup = EsPanelCreate(toolbar, ES_PANEL_HORIZONTAL | ES_ELEMENT_AUTO_GROUP); button = EsButtonCreate(buttonGroup); EsCommandAddButton(EsCommandByID(instance, ES_COMMAND_UNDO), button); EsButtonSetIcon(button, ES_ICON_EDIT_UNDO_SYMBOLIC); @@ -738,13 +738,13 @@ void InstanceCreate(EsMessage *message) { EsSpacerCreate(toolbar, ES_CELL_FILL); - button = instance->toolDropdown = EsButtonCreate(EsPanelCreate(toolbar, ES_PANEL_HORIZONTAL), ES_BUTTON_DROPDOWN, + button = instance->toolDropdown = EsButtonCreate(toolbar, ES_BUTTON_DROPDOWN, ES_STYLE_PUSH_BUTTON_TOOLBAR_BIG, INTERFACE_STRING(ImageEditorPickTool)); EsButtonSetIcon(button, ES_ICON_DRAW_FREEHAND); EsButtonOnCommand(button, MenuTools); button->accessKey = 'T'; - instance->toolPanel = EsPanelCreate(toolbar, ES_PANEL_HORIZONTAL); + instance->toolPanel = EsPanelCreate(toolbar, ES_PANEL_HORIZONTAL | ES_ELEMENT_AUTO_GROUP); button = EsButtonCreate(instance->toolPanel, ES_FLAGS_DEFAULT, ES_STYLE_PUSH_BUTTON_TOOLBAR_BIG, INTERFACE_STRING(ImageEditorToolBrush)); EsCommandAddButton(&instance->commandBrush, button); EsButtonSetIcon(button, ES_ICON_DRAW_FREEHAND); diff --git a/apps/system_monitor.cpp b/apps/system_monitor.cpp index 2698322..9322861 100644 --- a/apps/system_monitor.cpp +++ b/apps/system_monitor.cpp @@ -401,12 +401,15 @@ void ProcessApplicationMessage(EsMessage *message) { ES_CELL_FILL | ES_PANEL_TABLE | ES_PANEL_HORIZONTAL | ES_PANEL_V_SCROLL_AUTO, &stylePanelMemoryStatistics); EsPanelSetBands(instance->panelMemoryStatistics, 2 /* columns */); - EsElement *buttonGroup = EsPanelCreate(EsWindowGetToolbar(window), ES_PANEL_HORIZONTAL); + EsElement *toolbar = EsWindowGetToolbar(window); + EsSpacerCreate(toolbar, ES_CELL_H_FILL); + EsElement *buttonGroup = EsPanelCreate(toolbar, ES_PANEL_HORIZONTAL | ES_ELEMENT_AUTO_GROUP); AddTab(buttonGroup, DISPLAY_PROCESSES, "Processes", true); EsSpacerCreate(buttonGroup, ES_CELL_V_FILL, ES_STYLE_TOOLBAR_BUTTON_GROUP_SEPARATOR); AddTab(buttonGroup, DISPLAY_GENERAL_LOG, "System log"); EsSpacerCreate(buttonGroup, ES_CELL_V_FILL, ES_STYLE_TOOLBAR_BUTTON_GROUP_SEPARATOR); AddTab(buttonGroup, DISPLAY_MEMORY, "Memory"); + EsSpacerCreate(toolbar, ES_CELL_H_FILL); } else if (message->type == ES_MSG_INSTANCE_DESTROY) { processes.Free(); } diff --git a/apps/text_editor.cpp b/apps/text_editor.cpp index d04bb16..78f5273 100644 --- a/apps/text_editor.cpp +++ b/apps/text_editor.cpp @@ -287,7 +287,7 @@ void ProcessApplicationMessage(EsMessage *message) { EsFileMenuAddToToolbar(toolbarMain); - button = EsButtonCreate(EsPanelCreate(toolbarMain, ES_PANEL_HORIZONTAL), ES_FLAGS_DEFAULT, {}, INTERFACE_STRING(CommonSearchOpen)); + button = EsButtonCreate(toolbarMain, ES_FLAGS_DEFAULT, {}, INTERFACE_STRING(CommonSearchOpen)); button->accessKey = 'S'; EsButtonSetIcon(button, ES_ICON_EDIT_FIND_SYMBOLIC); @@ -296,7 +296,9 @@ void ProcessApplicationMessage(EsMessage *message) { EsElementFocus(instance->textboxSearch); }); - button = EsButtonCreate(EsPanelCreate(toolbarMain, ES_PANEL_HORIZONTAL), ES_BUTTON_DROPDOWN, {}, INTERFACE_STRING(CommonFormatPopup)); + EsSpacerCreate(toolbarMain, ES_CELL_H_FILL); + + button = EsButtonCreate(toolbarMain, ES_BUTTON_DROPDOWN, {}, INTERFACE_STRING(CommonFormatPopup)); button->accessKey = 'M'; EsButtonSetIcon(button, ES_ICON_FORMAT_TEXT_LARGER_SYMBOLIC); EsCommandAddButton(&instance->commandFormat, button); @@ -308,7 +310,7 @@ void ProcessApplicationMessage(EsMessage *message) { EsElement *toolbarSearch = instance->toolbarSearch = EsWindowGetToolbar(window, true); - button = EsButtonCreate(EsPanelCreate(toolbarSearch, ES_PANEL_HORIZONTAL), ES_FLAGS_DEFAULT, 0); + button = EsButtonCreate(toolbarSearch, ES_FLAGS_DEFAULT, 0); button->cName = "go back", button->accessKey = 'X'; EsButtonSetIcon(button, ES_ICON_GO_FIRST_SYMBOLIC); @@ -344,7 +346,7 @@ void ProcessApplicationMessage(EsMessage *message) { EsSpacerCreate(toolbarSearch, ES_FLAGS_DEFAULT, 0, 7, 0); instance->displaySearch = EsTextDisplayCreate(toolbarSearch, ES_CELL_H_FILL, {}, ""); - EsPanel *buttonGroup = EsPanelCreate(toolbarSearch, ES_PANEL_HORIZONTAL); + EsPanel *buttonGroup = EsPanelCreate(toolbarSearch, ES_PANEL_HORIZONTAL | ES_ELEMENT_AUTO_GROUP); button = EsButtonCreate(buttonGroup, ES_FLAGS_DEFAULT, {}, INTERFACE_STRING(CommonSearchNext)); button->accessKey = 'N'; EsCommandAddButton(&instance->commandFindNext, button); diff --git a/desktop/desktop.cpp b/desktop/desktop.cpp index 943592f..6d0e151 100644 --- a/desktop/desktop.cpp +++ b/desktop/desktop.cpp @@ -631,6 +631,11 @@ WindowTab *WindowTabMoveToNewContainer(WindowTab *tab, ContainerWindow *containe tab->applicationInstance = nullptr; tab->notRespondingInstance = nullptr; + // Copy across metadata. + EsMemoryCopy(newTab->title, tab->title, tab->titleBytes); + newTab->titleBytes = tab->titleBytes; + newTab->iconID = tab->iconID; + // Destroy the old tab, and activate the new one. WindowTabDestroy(tab); // Deplaces the embedded window from the old container. WindowTabActivate(newTab); @@ -1400,7 +1405,7 @@ void ShutdownModalCreate() { EsPanel *stack = EsPanelCreate(window, ES_CELL_FILL | ES_PANEL_Z_STACK); stack->cName = "window stack"; EsPanelCreate(stack, ES_CELL_FILL, ES_STYLE_PANEL_SHUTDOWN_OVERLAY)->cName = "modal overlay"; - EsPanel *dialog = EsPanelCreate(stack, ES_PANEL_VERTICAL | ES_CELL_CENTER, ES_STYLE_DIALOG_SHADOW); + EsPanel *dialog = EsPanelCreate(stack, ES_PANEL_VERTICAL | ES_CELL_CENTER | ES_ELEMENT_AUTO_GROUP, ES_STYLE_DIALOG_SHADOW); dialog->cName = "dialog"; EsPanel *heading = EsPanelCreate(dialog, ES_PANEL_HORIZONTAL | ES_CELL_H_FILL, ES_STYLE_DIALOG_HEADING); EsIconDisplayCreate(heading, ES_FLAGS_DEFAULT, {}, ES_ICON_SYSTEM_SHUTDOWN); diff --git a/desktop/gui.cpp b/desktop/gui.cpp index 310a1b8..3f84f24 100644 --- a/desktop/gui.cpp +++ b/desktop/gui.cpp @@ -1461,7 +1461,7 @@ void EsElement::InternalPaint(EsPainter *painter, int paintFlags) { int childType = 0; - if (parent && parent->GetChildCount()) { + if (parent && parent->GetChildCount() && (parent->flags & ES_ELEMENT_AUTO_GROUP)) { if (parent->GetChildCount() == 1 && parent->GetChild(0) == this) { childType = THEME_CHILD_TYPE_ONLY; } else if (parent->GetChild(0) == this) { @@ -3670,7 +3670,7 @@ EsDialog *EsDialogShow(EsWindow *window, const char *title, ptrdiff_t titleBytes EsElement *wrapper = EsPanelCreate(mainStack, ES_PANEL_VERTICAL | ES_CELL_FILL, ES_STYLE_DIALOG_WRAPPER); wrapper->cName = "dialog wrapper"; - dialog->mainPanel = EsPanelCreate(wrapper, ES_PANEL_VERTICAL | ES_CELL_SHRINK, ES_STYLE_DIALOG_SHADOW); + dialog->mainPanel = EsPanelCreate(wrapper, ES_PANEL_VERTICAL | ES_CELL_SHRINK | ES_ELEMENT_AUTO_GROUP, ES_STYLE_DIALOG_SHADOW); dialog->mainPanel->cName = "dialog"; EsElementStartTransition(dialog->mainPanel, ES_TRANSITION_ZOOM_OUT_LIGHT, ES_FLAGS_DEFAULT, 1.0f); window->dialogs.Add(dialog); @@ -4057,7 +4057,7 @@ EsButton *EsButtonCreate(EsElement *parent, uint64_t flags, const EsStyle *style if (style == ES_STYLE_PUSH_BUTTON_NORMAL || style == ES_STYLE_PUSH_BUTTON_DANGEROUS) { flags |= ES_BUTTON_PUSH; - } else if (style == ES_STYLE_PUSH_BUTTON_TOOLBAR || style == ES_STYLE_PUSH_BUTTON_TOOLBAR_MEDIUM + } else if (style == ES_STYLE_PUSH_BUTTON_TOOLBAR || style == ES_STYLE_PUSH_BUTTON_TOOLBAR_BIG || style == ES_STYLE_PUSH_BUTTON_STATUS_BAR) { flags |= ES_BUTTON_COMPACT | ES_BUTTON_NOT_FOCUSABLE; } else if (style == ES_STYLE_CHECKBOX_NORMAL || style == ES_STYLE_CHECKBOX_RADIOBOX) { @@ -5692,7 +5692,7 @@ void EsFileMenuCreate(EsInstance *_instance, EsElement *element, uint64_t menuFl instance->startupInformation->filePath, instance->startupInformation->filePathBytes); } - EsButton *renameButton = EsButtonCreate(EsPanelCreate(panel3, ES_PANEL_HORIZONTAL), ES_BUTTON_TOOLBAR); + EsButton *renameButton = EsButtonCreate(panel3, ES_BUTTON_TOOLBAR); if (!renameButton) goto show; EsButtonSetIcon(renameButton, ES_ICON_DOCUMENT_EDIT_SYMBOLIC); EsButtonOnCommand(renameButton, FileMenuRename); diff --git a/desktop/os.header b/desktop/os.header index aec967f..493e764 100644 --- a/desktop/os.header +++ b/desktop/os.header @@ -451,6 +451,7 @@ define ES_ELEMENT_LAYOUT_HINT_REVERSE ((_EsLongConstant) (1) << 44) // Hint for define ES_ELEMENT_STICKY_ACCESS_KEY ((_EsLongConstant) (1) << 45) // Don't exit access key mode after using the access key. define ES_ELEMENT_NON_CLIENT ((_EsLongConstant) (1) << 46) define ES_ELEMENT_FREE_USER_DATA ((_EsLongConstant) (1) << 47) // Call EsHeapFree on userData when destroying the element. +define ES_ELEMENT_AUTO_GROUP ((_EsLongConstant) (1) << 48) // Enables autoCorners and autoBorders. // For children of splitters: define ES_CELL_COLLAPSABLE ((_EsLongConstant) (1) << 51) @@ -857,6 +858,9 @@ private enum EsSyscallType { ES_SYSCALL_PIPE_CREATE ES_SYSCALL_PIPE_WRITE ES_SYSCALL_PIPE_READ + ES_SYSCALL_MAILSLOT_CREATE + ES_SYSCALL_MAILSLOT_SEND + ES_SYSCALL_MAILSLOT_RESPOND // Misc. diff --git a/desktop/settings.cpp b/desktop/settings.cpp index f85ebed..aa4328e 100644 --- a/desktop/settings.cpp +++ b/desktop/settings.cpp @@ -116,7 +116,7 @@ const EsStyle styleSettingsOverlayPanel = { }; const EsStyle styleSettingsButton = { - .inherit = ES_STYLE_PUSH_BUTTON_NORMAL, + .inherit = ES_STYLE_PUSH_BUTTON_TOOLBAR, .metrics = { .mask = ES_THEME_METRICS_PREFERRED_WIDTH | ES_THEME_METRICS_PREFERRED_HEIGHT | ES_THEME_METRICS_LAYOUT_VERTICAL @@ -870,8 +870,7 @@ void InstanceSettingsCreate(EsMessage *message) { { EsElement *toolbar = EsWindowGetToolbar(instance->window); - EsButton *backButton = EsButtonCreate(EsPanelCreate(toolbar, ES_PANEL_HORIZONTAL), ES_BUTTON_TOOLBAR | ES_ELEMENT_STICKY_ACCESS_KEY, - 0, INTERFACE_STRING(DesktopSettingsBackButton)); + EsButton *backButton = EsButtonCreate(toolbar, ES_BUTTON_TOOLBAR | ES_ELEMENT_STICKY_ACCESS_KEY, 0, INTERFACE_STRING(DesktopSettingsBackButton)); instance->backButton = backButton; backButton->accessKey = 'A'; EsButtonSetIcon(backButton, ES_ICON_GO_HOME_SYMBOLIC); @@ -880,8 +879,7 @@ void InstanceSettingsCreate(EsMessage *message) { EsSpacerCreate(toolbar, ES_CELL_FILL); - EsButton *undoButton = EsButtonCreate(EsPanelCreate(toolbar, ES_PANEL_HORIZONTAL), ES_BUTTON_TOOLBAR | ES_ELEMENT_STICKY_ACCESS_KEY, - 0, INTERFACE_STRING(DesktopSettingsUndoButton)); + EsButton *undoButton = EsButtonCreate(toolbar, ES_BUTTON_TOOLBAR | ES_ELEMENT_STICKY_ACCESS_KEY, 0, INTERFACE_STRING(DesktopSettingsUndoButton)); instance->undoButton = undoButton; undoButton->accessKey = 'U'; EsButtonSetIcon(undoButton, ES_ICON_EDIT_UNDO_SYMBOLIC); diff --git a/desktop/styles.header b/desktop/styles.header index 1868b24..d5df4d6 100644 --- a/desktop/styles.header +++ b/desktop/styles.header @@ -111,7 +111,6 @@ define ES_STYLE_PUSH_BUTTON_STATUS_BAR (ES_STYLE_CAST(1495)) define ES_STYLE_PUSH_BUTTON_TOOLBAR (ES_STYLE_CAST(1359)) private define ES_STYLE_WINDOW_TAB_ACTIVE (ES_STYLE_CAST(1407)) define ES_STYLE_PUSH_BUTTON_TOOLBAR_BIG (ES_STYLE_CAST(1457)) -define ES_STYLE_PUSH_BUTTON_TOOLBAR_MEDIUM (ES_STYLE_CAST(1461)) private define ES_STYLE_SCROLLBAR_BAR_HORIZONTAL (ES_STYLE_CAST(1363)) private define ES_STYLE_WINDOW_TAB_INACTIVE (ES_STYLE_CAST(1409)) private define ES_STYLE_SCROLLBAR_BAR_VERTICAL (ES_STYLE_CAST(1365)) diff --git a/kernel/module.h b/kernel/module.h index 9a80cb5..f661565 100644 --- a/kernel/module.h +++ b/kernel/module.h @@ -189,6 +189,7 @@ enum KernelObjectType : uint32_t { KERNEL_OBJECT_NODE = 0x00000010, // A file system node (file or directory). KERNEL_OBJECT_EVENT = 0x00000020, // A synchronisation event. KERNEL_OBJECT_CONSTANT_BUFFER = 0x00000040, // A buffer of unmodifiable data stored in the kernel's address space. + KERNEL_OBJECT_MAILSLOT = 0x00000080, // A mailslot into a process's message queue. Can only send messages synchronously. #ifdef ENABLE_POSIX_SUBSYSTEM KERNEL_OBJECT_POSIX_FD = 0x00000100, // A POSIX file descriptor, used in the POSIX subsystem. #endif @@ -271,7 +272,7 @@ void KMutexAssertLocked(KMutex *mutex); struct KEvent { // Waiting and notifying. Can wait on multiple at once. Can be set and reset with interrupts disabled. volatile bool autoReset; // This should be first field in the structure, so that the type of KEvent can be easily declared with {autoReset}. - volatile uintptr_t state; + volatile uintptr_t state; // TODO Change this to a bool? K_PRIVATE LinkedList blockedThreads; volatile size_t handles; diff --git a/kernel/objects.cpp b/kernel/objects.cpp index 41fa53b..7479231 100644 --- a/kernel/objects.cpp +++ b/kernel/objects.cpp @@ -53,6 +53,15 @@ struct MessageQueue { KEvent notEmpty; }; +struct Mailslot { +#define MAILSLOT_RECEIVER (1 << 0) + struct Process *target; // Owns a handle. + KEvent responseReceivedEvent; + KEvent available; + volatile size_t handles; + volatile uintptr_t response; +}; + size_t totalHandleCount; struct HandleTableL2 { @@ -362,7 +371,7 @@ void CloseHandleToObject(void *object, KernelObjectType type, uint32_t flags) { uintptr_t HandleShare(Handle share, Process *process, uint32_t mode, EsHandle at = ES_INVALID_HANDLE) { #define HANDLE_SHARE_TYPE_MASK ((KernelObjectType) (KERNEL_OBJECT_SHMEM | KERNEL_OBJECT_CONSTANT_BUFFER | KERNEL_OBJECT_PROCESS \ - | KERNEL_OBJECT_DEVICE | KERNEL_OBJECT_NODE | KERNEL_OBJECT_EVENT | KERNEL_OBJECT_PIPE)) + | KERNEL_OBJECT_DEVICE | KERNEL_OBJECT_NODE | KERNEL_OBJECT_EVENT | KERNEL_OBJECT_PIPE | KERNEL_OBJECT_MAILSLOT)) if ((share.type & HANDLE_SHARE_TYPE_MASK) == 0) { KernelPanic("HandleShare - Invalid object type %x; allowed types are %x.\n", share.type, HANDLE_SHARE_TYPE_MASK); @@ -378,6 +387,8 @@ uintptr_t HandleShare(Handle share, Process *process, uint32_t mode, EsHandle at sharedFlags = (mode & 1) && (share.flags & (ES_FILE_WRITE_SHARED | ES_FILE_WRITE)) ? ES_FILE_READ_SHARED : share.flags; if (mode & 2) sharedFlags &= ~_ES_NODE_DIRECTORY_WRITE; } else if (share.type == KERNEL_OBJECT_PIPE) { + } else if (share.type == KERNEL_OBJECT_MAILSLOT) { + sharedFlags = (mode & 1) ? share.flags : 0; } if (!OpenHandleToObject(share.object, share.type, sharedFlags)) { diff --git a/kernel/syscall.cpp b/kernel/syscall.cpp index 9d47d5f..3edb57c 100644 --- a/kernel/syscall.cpp +++ b/kernel/syscall.cpp @@ -1619,6 +1619,65 @@ SYSCALL_IMPLEMENT(ES_SYSCALL_DEVICE_CONTROL) { SYSCALL_RETURN(ES_SUCCESS, false); } +SYSCALL_IMPLEMENT(ES_SYSCALL_MAILSLOT_CREATE) { + if (!OpenHandleToObject(currentProcess, KERNEL_OBJECT_PROCESS, ES_FLAGS_DEFAULT)) { + SYSCALL_RETURN(ES_ERROR_INSUFFICIENT_RESOURCES, false); + } + + Mailslot *mailslot = (Mailslot *) EsHeapAllocate(sizeof(Mailslot), true, K_PAGED); + + if (mailslot) { + mailslot->target = currentProcess; + mailslot->responseReceivedEvent.autoReset = true; + mailslot->available.autoReset = true; + mailslot->handles = 1; + KEventSet(&mailslot->available); + + EsHandle handle = currentProcess->handleTable.OpenHandle(mailslot, MAILSLOT_RECEIVER, KERNEL_OBJECT_MAILSLOT); + SYSCALL_RETURN(handle, false); + } else { + SYSCALL_RETURN(ES_ERROR_INSUFFICIENT_RESOURCES, false); + } +} + +SYSCALL_IMPLEMENT(ES_SYSCALL_MAILSLOT_RESPOND) { + SYSCALL_HANDLE_2(argument0, KERNEL_OBJECT_MAILSLOT, _mailslot); + if (~_mailslot.flags & MAILSLOT_RECEIVER) SYSCALL_RETURN(ES_FATAL_ERROR_INSUFFICIENT_PERMISSIONS, true); + Mailslot *mailslot = (Mailslot *) _mailslot.object; + mailslot->response = argument1; + __sync_synchronize(); + KEventSet(&mailslot->responseReceivedEvent, true /* maybe already set */); + SYSCALL_RETURN(ES_SUCCESS, false); +} + +SYSCALL_IMPLEMENT(ES_SYSCALL_MAILSLOT_SEND) { + SYSCALL_HANDLE(argument0, KERNEL_OBJECT_MAILSLOT, mailslot, Mailslot); + + _EsMessageWithObject message; + SYSCALL_READ(&message.message, argument2, sizeof(EsMessage)); + message.object = (void *) argument3; + + currentThread->terminatableState = THREAD_USER_BLOCK_REQUEST; + bool success = KEventWait(&mailslot->available); + currentThread->terminatableState = THREAD_IN_SYSCALL; + + if (success) { + mailslot->target->messageQueue.SendMessage(&message); + + currentThread->terminatableState = THREAD_USER_BLOCK_REQUEST; + success = KEventWait(&mailslot->responseReceivedEvent); + currentThread->terminatableState = THREAD_IN_SYSCALL; + + if (success) { + SYSCALL_WRITE(argument1, &mailslot->response, sizeof(mailslot->response)); + } + + KEventSet(&mailslot->available); + } + + SYSCALL_RETURN(success ? ES_SUCCESS : ES_ERROR_TIMEOUT_REACHED, false); +} + SYSCALL_IMPLEMENT(ES_SYSCALL_DEBUG_COMMAND) { SYSCALL_PERMISSION(ES_PERMISSION_TAKE_SYSTEM_SNAPSHOT); diff --git a/res/Theme Source.dat b/res/Theme Source.dat index e2e685ab49edf6e9361879a5d705424d0b66ded6..2c75f1e840e0f179313a634abe79141431ddf188 100644 GIT binary patch delta 123 zcmV->0EGYCtsu0aAPNBh003tL003PDlO8BGfk1^o0fj&Ug+K#^Km@fw1#hvJ?|%ge zx45wdjOLecRtE@^sLbe>&>jLPlIjYR{^FLGK)nVimhuBwmoT>iFt@Cl2ACcJLy-|K dx9`0MH6@dXJ1~aj2Daq~>jVJ-x9sT$@GQcHFkb)w delta 229 zcmdn8P~py61ujMg28K*#28LMH$#NQIjSj62jI9n#tq#ns4lG+8So1eBGH&0nk#)+m z=?Q*}9Mb}sUrfIs$D}cN!)dO`{~k@7?x4=DG3^s`#B_u0Oa|N6%wn4%H+jZ=gXulz zSU9Ht$Yox#{X!vQ2IDjfcFxHw&pgM}%(!Ga<0t0u=?|3I45okB#>TO|W+$7D>hu}g z*+f`>qRhk_lQw diff --git a/res/Theme.dat b/res/Theme.dat index 563c8856ca8ff08971b2b139afbe88168bf10307..e969d98432e84a24bae87ef39760e78cb99a9782 100644 GIT binary patch delta 5866 zcmZ9Q3s6+o8OQHA?nTsHSY+j`0?T7z7g$(SqC6H^Wswz7!Ha-TKv5JH#l|#=t5Z91 zIy5EuOvag_gEMr-wA5g+4HHR9X3Uf{B*hFfHB(G+Vp2LKEjDCIrdazwmk^hGo!@%* zchB=XughNeH=Fn;^VL)hzWzf=l2(J9Q(!Ak#32k(=Cw~3cLXKCr#cC zxVsv63GP?&5=mMjEm_FheF}ZNj{=wA5>m9f7YXY%J-!8381S@rqJe{O;Q>07_cU4~ za0f*t-#O8_dvNc}N8$UZPQvXM=|qg@Tf^84NbB9A(D7Ti?BZSZSM0ImaY|ImcG3GOS6 z^TPd08UCZTj%l76OfI=B-W7YLW8 zX`mjiS(DBPw`9IvpE~Cnj7ST(CNkp3b8txND0l!3GBxqRHD1ci*RxFF>YfGM|I9YTO05 zG))vb;X*a(F2SwRr0a$Y_p4Xk1Fl0x`bp8dKDcO2fw$mRYuo_b3eEByf{W9XHw^dE z;z;|X5lFLNLNOP{;EpaTkV)fk4o$@qaO==J|MOr9Zi8QWq9ZeKcQtMf?ity)cs1MH=-Qg50i2I0E;QzY|9)+@JlNsQ4jVxyDVy`Q!k#?C(xlDezfI zy7_&&;`uY*1i4ESt{AxUvU&n89MMt^T$LuB6HXx(5V~=X=1B#f$eQ=0O1Pzx|CPP(nxJVp)_G| z$#p>@Z%B4HIfLx%7Q7-)sIJfuLw^riA?t(ZOAjYwu#s6PE;yQJ3cdJyHH zzA97yL~tx)E@B}H>!Up(%`A}K$Nd3Xy;5Nvbb6(g4bU}w8tJ2zitG$Ux9DzxnL1kn zsWP;ZPlZx?x`lqCPiGOtOjhnS(Z_})sx;YI7yZ~|Wy5q6pRsh`q{tPkBuPh^1>sb& z%EfzE(be5=vrDuiOp%Ae=35*?AB3&o5#ee)z72DrEotG!XvOL9Ru$EKL z_k1FfUXG0-TXi=djzXnodLzogOmsi0o>fy}v=v=C5v|DM(UQaw>2R8ewy>Q3Wih81 zDt&QvEst5F=6k%_!I~&@O+D+S*Vb5>j^10-%9{E!*P^oHR291cgZ9(d+q@%=Ze-<= zG2B40;d&98I5jkJ3U|iSyA|o&8&5&zDDuXe_;5V>kVL)lc0Lc z+1v7P8eT)`+Rj9}k+zXb>GX0=Dw)zF(8siNMea@)kHzfkO*e@_N>^B&`q@Ek8O3Z4 z_hNyB(ESVtY6`Juh??vQI#_5ArM{ge8nWA&rT>wA1>?>vv^0!NSx$aA3*)+xI*6D+G=$0*%B+YE1d~-aFZOZ1cxrp3m4D@abZ@QM_A@ajP9M znB^z9+9}hm@E$jPT#!V4?m$efOm`@CCSYp09b)~IDDs68k!5}}(^F@Ox{gXhskg)> z)=`PNj<%_t+ZIYg#R0Uol`e;oYT_Z&*ujl!l9mU8*n- zMS6aK{#4be%SyA+*Cl%og*rTXqsn?Ybn!rBab+DxU_y81UwsZ$9x<(bb(TysxVNYHd6d zgR>j0P}IhqRkE-n-Bk8tD-5Z=jUDXZo@kn^&Xt{e=GV5>pp%9ri=>mLrly{t`+F35 z49}jP8ul7-YVe3!^vg`&);PrOP}|DJ`mfYtyS_*7)!h~od9NZ*?ZsapVvl{b-h!E# zxX&j~?i1}5>v&|Jon_PGeNULJ|MC7>#=8#E*}c2Pd3CTH^N1bti9Q}unE&e54fz@7*JB$=yxWyTj+f3sMgdFG?1JBpm<)z=#(e@d9)Uh?gGms$&7?z?4yvTp@TB1%WG(2Xue| zV8pI_2~2?q6W)_S7Z?VycrQ5za`6&!3E*YKCq;y#05A$>B2Zx@GDRT+u;HDe8uWn~ z(1ah>?tqvzCy_Emo4wfb2Ll1PlOUJUsA%VK56UcpEqeW`HpPyQuJ z0{Zo65Eule4G4PrBvfE%!1W3r zT7{dD9Z0kjp#*)q(DF*O9Eg3lp$gA-qW}d3fH^QwjYwg?^nf0qt3kv-L@m;S-a14P z+u{%~?!(*wVo#jhk8%#8954lr`wpQZV5-NG08_x#fO}wSL;}zShC$9@LF3CmmOx944Jc3gY=6~&x+)g!{W|;MEdzj!pHOx;E1oub70%kBQP-X*0!~IFu z*9vz_=NxdqQWh|_fGwEqn|1_qyn}!X@RCxFIvWk^bTcl5%Un1&J2}8IxUhu=#G9*D zJzT9!^32J}wZUC~T7_?`+6`AD+sPU~9S!FvAeZX`o`Kt-OMC(DuevJq!~G3T!E1JQ z*WmW~4Mq-X814(ds`}P=1oAG*<==S>?n}cW*~hnbHhh?ZTjw{Jg?N1h_YYmE*-MN) z&^aUAKXoqXCCq<0N*x;;5kEWXa5Ox&aQ?bS!#(epSdPjH_sDN1(%Ik^>H0e0{%tVK z%i)H53zfm5&#ikN7I-To=JEF|5R*&qfbI0M@b?yY5hx^S~CO!?>s%zK__hX$q1J|r`eQ+yv z1H1s&sB3o-Zo$*M9^dYliTfcB=#I${T(B_^ zxkHy^0&cM`;3QmtpOYJI8g7YiBhBq2_Fcx#&r5;}99*!juLmY$-2(raCV)G zhFhttf(*4||{&GF{iO z4{pOe$Js@=@9Nfj5N?yM-8HyR=R1A_E*F<~|3QzzWqNc0y^tUIb(W{&9$c2L-89@Q zI>(MO_IiU!~OhO6@2#q*)SY(v#y~PE*DO|W-rky+*Us)2k3^&_j9s+ z9$bOWmBGC_ul%?NR6rK#8rH+T=I`XK6z(s6PA2YxE77^*a2{o$9K-D0mG!}0*0s9? z_paiZo1F}J1#-KtghO!06yM$O+km&>cIetoz-c-+3Aa<{rs0&?Cn)*oC0}1bE@J)< z8F+kndEf`neIoc3Dl%!xgbB^)d~Lk)-r#%Rxak&LLjdm3(otzZ5Fe3FSOclplt|tH zmA6rFU;!Vd-GQ2z4x~5YQn-cg2HLrs0+vMa)0DhKH;&Sew2O)OR zBflh4hFRtP)NZ!(+jQ1!7pb9Cywge#&8v7l#f8@JAvzX%m0zR{%QP{z3`0y7dmZ%Q zGMPCdEEloq|t~z1Z|JhxQ#xJtm93zGRiJ)M9~{< z8>lTVfV$&Me2OkdW%0s+$5DqlvK)-56lyF+7EkwMR`V{3iLH}Eh_&-@`gLq8?;40% zjzry*X<3K5zihcG`r@d1&0IuGKF-dq)V?B~+E5m6oGRzP!o_CEG^TaSN#;-X@dA9~M?Ct#?Oa9KlwNkKrAq?g*yWt*eD00TCkU zw$;q5=n;NCPWcJz5dK&~4btCD$VI~B#2PH`j}q;Cn%+%ZCl@hMw%nZL;$AwEq=_IK zM&RTP^aNjeZS=X#iK0A7ilB40jo1x$Y%YG3-b@Z5OLDfjkW9a{r|=mF4YN9*l0-o% zDnCP+DK*?gTkT0SjPLcnPZqn171?Un_&s{ZZWm?;y|FZsrtCpHgSf-adugRZQ-&SB zeXE60pTjJs9dvUm7SG{Zyp?r|*~ysjZQ;H&!zpLD=y76wZ1gbOM8(b(e306m>2h_P z8uqh%@1xzWToI)DmhofPYGixja>;C}CZ<&SjWdxhsVa95+))>EOe1qu*r`<+{1QHB z+(3_3rBiqMV)|lLuq-XypwIONn&{-}AYn@Ng&1C~ii*^M&(-g6(YA(S3%1axYLcgE zjV3H>$*FERwbq2<1+3NhDBcUGAKz_seXS-s*ZDf~6BL)GDOb|w<`~V*1J~2CaNq{` z`YbN`)9LHHW#rwrlv>iA!sw=R>E%kQ+rLKxz2J@#LvHM#MCx*@!nEOOcq;{OOd{_F zRc@h;zAc3BCpW4%g&%Izl&Vd>FsOa%CWkyrn>1wxj!~^Ep1hlksLuUOn%ue>E_qNh zuF5)QqK=vLFlcVqSJ9o!Mltx}JZYixFE+{oWNBhFi$2IIm$T2(Ol8?f@$5xy$rgE@ zvh94FnzJ>o(nr~^$c&qF<=)*~!n3J1C+SpCKl-&TH}1 zm2bpJ_+h>#PeHys1p!+yk1Z6Nw~DHkSOqJf54Jdw;K3G`Oi-XHg9Y+>`(|7s{j4BB zZps3U?;)iyS6-tFaoUQoEgbY&VG4HElfnWqSVT8V!l}AsBcGu2MJ`-hxOf_EEyeaV(qu^*4qig3T^_npjZe}$r7k6HD`SDg zi^6ESbX=IWA<+BE^ftNdmz@a|yCX-b*p3HZx~r}xb$hqGB5uDbm!eElj60qdBZ;QU z49XsSo9lH0-i?IuXt3C2U zRITwmx?lYb<F0Q;G9ZE1SvNNo@%>%!68woXlQL80vf-&roQcN3eQ&yRKYR)ca!g z)cbylrnl-n*o&e2H0<@}eez;`cAs5I-7hE3^Fwe7D@5;p`ryEOa$oJQlruTdid*6J z1HTi44HVn7ORiu;9d^r_gD$M;zJrap{@glPiH*7PP@^z5(oYWU!lrn9C>f_=dE;hr zqtO?ziej27m5C;qt35k`$KuBXvIH2(yDePgHOofA+bna4h8B95XroiRol0+u+;X)p z`>AG=m}#NF=DnhbSwS2`J8BIqnBECiK#aFtmT}jZ^rM&)qy)@xpEQC;Jf|~wWng%cRS*#zb#d%I_&Q!;FBo2Lly2$oT_rs z)JebSST9E9w?r}?Ry}+0d~yZI=M*=dOFF>_um6U|E9S!D+yP8LI#{K=e}d z0exTuSVI`Q2$-2M2j~I);5JANMSoDb3~j*JGCW8+!VmyV0AmCaf}Tip02xt?HGvzz z7|mE0p1a0@8jC<+2&l{PcO463CqP~t1_DNabp<@=0k?rE9uokkfzgWJL6;Q|(qs5w zNMNiAoCedtoygc3Fbr4{W($r3F9^clRT@Aqm;#n$#*TsuUFg6HGcE;+#HE<7@ z9hea41@i9Nvl8BeH-{5nzz_&`q3qxa2vX4j^nxic^E`sDV(bzytj2)BATXt(-x~A- z!@#l@0|KMKwhm>-ee47n1?KgbOgfeX7;(4q6ymJ`41tjiD9c8a1&jd)?m3-c1jzeO zSq26QGBPnJFa@e!#2|nr3rWE!u;E4`ZzkPfTz=k+YJy3Sor9QQ1mI@jVP(0P5isOo zEx~ah?+8Kp7#NV3{wZMDf&^d`umZFN$H5Q?FJx>FxB`NTFeoqxCV;yb$w5U4W(~X` ztrSZGu9bQ)Dtz#6MWbyf<#uc~&|QX+19_=E3eJ=xfQA4dr~;!0)}2TSu7L1es2Ffm zqAeJzLKSzz0c$n(2AGl5AWkjf0Jax-Ja`)iwmKXM!0OQeTm-g#XaM@bZBV!$RXTvA zU=$p0zzjj&K@1X1fQ&<^CNMU_0ksKh4`#q%GX~#+s)7r^*ox{j;mypressed, UI_MENU_NO_SCROLL); + UIMenuAddItem(menu, 0, "Switch view", -1, CanvasSwitchView, 0); + UIMenuAddItem(menu, 0, "Switch selector index", -1, CanvasSwitchSelectorIndex, 0); + UIMenuAddItem(menu, 0, "Find by ID", -1, CanvasFindByID, 0); + UIMenuAddItem(menu, 0, "Zoom to 100%", -1, CanvasZoom100, 0); + UIMenuShow(menu); +} + int main(int argc, char **argv) { #ifndef OS_ESSENCE if (argc == 2) { @@ -3671,8 +3706,7 @@ int main(int argc, char **argv) { #else UIButtonCreate(0, 0, "Save", -1)->invoke = DocumentSave; #endif - UIButtonCreate(0, 0, "Switch view", -1)->invoke = CanvasSwitchView; - UIButtonCreate(0, 0, "Switch selector index", -1)->invoke = CanvasSwitchSelectorIndex; + UIButtonCreate(0, 0, "Menu", -1)->invoke = DocumentMenu; UIParentPop(); UISpacerCreate(0, UI_SPACER_LINE, 0, 1); inspector = &UIPanelCreate(0, UI_ELEMENT_V_FILL | UI_PANEL_GRAY | UI_PANEL_MEDIUM_SPACING | UI_PANEL_SCROLL | UI_PANEL_EXPAND)->e;