From 65552efb5a3e9d4f1f561ffa8988a6f9153da1fd Mon Sep 17 00:00:00 2001 From: nakst <> Date: Mon, 23 Aug 2021 15:51:59 +0100 Subject: [PATCH] settings infrastructure --- desktop/api.cpp | 6 +- desktop/gui.cpp | 11 + desktop/os.header | 1 + desktop/settings.cpp | 295 +++++++++++++++++++++----- desktop/styles.header | 1 + kernel/module.h | 1 + res/System Configuration Template.ini | 5 +- res/Theme Source.dat | Bin 49032 -> 49348 bytes res/Themes/Theme.dat | Bin 59272 -> 59492 bytes shared/common.cpp | 10 +- shared/strings.cpp | 15 +- 11 files changed, 281 insertions(+), 64 deletions(-) diff --git a/desktop/api.cpp b/desktop/api.cpp index 304285b..9715076 100644 --- a/desktop/api.cpp +++ b/desktop/api.cpp @@ -84,7 +84,8 @@ struct EsFileStore { }; struct GlobalData { - uint32_t clickChainTimeoutMs; + int32_t clickChainTimeoutMs; + bool swapLeftAndRightButtons; }; struct ThreadLocalStorage { @@ -1108,7 +1109,8 @@ extern "C" void _start(EsProcessStartupInformation *_startupInformation) { NodeAddMountPoint(EsLiteral("|Themes:"), node.handle, false); EsHeapFree(path); - api.global->clickChainTimeoutMs = EsIntegerParse(EsSystemConfigurationReadString(EsLiteral("general"), EsLiteral("click_chain_timeout_ms")), -1); + api.global->clickChainTimeoutMs = EsSystemConfigurationReadInteger(EsLiteral("general"), EsLiteral("click_chain_timeout_ms")); + api.global->swapLeftAndRightButtons = EsSystemConfigurationReadInteger(EsLiteral("general"), EsLiteral("swap_left_and_right_buttons")); } else { EsHandle initialMountPointsBuffer = EsSyscall(ES_SYSCALL_PROCESS_GET_CREATION_ARGUMENT, ES_CURRENT_PROCESS, CREATION_ARGUMENT_INITIAL_MOUNT_POINTS, 0, 0); size_t initialMountPointCount = EsConstantBufferGetSize(initialMountPointsBuffer) / sizeof(EsMountPoint); diff --git a/desktop/gui.cpp b/desktop/gui.cpp index ccec009..624a514 100644 --- a/desktop/gui.cpp +++ b/desktop/gui.cpp @@ -5073,6 +5073,10 @@ bool EsElement::InternalDestroy() { window->checkVisible.FindAndDeleteSwap(this, true); } + if (flags & ES_ELEMENT_FREE_USER_DATA) { + EsHeapFree(userData.p); + } + if (currentStyle) currentStyle->CloseReference(); if (previousTransitionFrame) EsPaintTargetDestroy(previousTransitionFrame); ThemeAnimationDestroy(&animation); @@ -6352,6 +6356,13 @@ void UIProcessWindowManagerMessage(EsWindow *window, EsMessage *message, Process if (timing) timing->startLogic = EsTimeStampMs(); + if (api.global->swapLeftAndRightButtons) { + if (message->type == ES_MSG_MOUSE_LEFT_DOWN ) message->type = ES_MSG_MOUSE_RIGHT_DOWN; + else if (message->type == ES_MSG_MOUSE_RIGHT_DOWN) message->type = ES_MSG_MOUSE_LEFT_DOWN; + else if (message->type == ES_MSG_MOUSE_LEFT_UP ) message->type = ES_MSG_MOUSE_RIGHT_UP; + else if (message->type == ES_MSG_MOUSE_RIGHT_UP ) message->type = ES_MSG_MOUSE_LEFT_UP; + } + if (message->type == ES_MSG_MOUSE_MOVED) { window->mousePosition.x = message->mouseMoved.newPositionX; window->mousePosition.y = message->mouseMoved.newPositionY; diff --git a/desktop/os.header b/desktop/os.header index 4a3d35d..8ee7ce5 100644 --- a/desktop/os.header +++ b/desktop/os.header @@ -439,6 +439,7 @@ define ES_ELEMENT_LAYOUT_HINT_HORIZONTAL ((_EsLongConstant) (1) << 43) // Hint f define ES_ELEMENT_LAYOUT_HINT_REVERSE ((_EsLongConstant) (1) << 44) // Hint for autoCorners and autoBorders; and tab traversal. 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. // For children of splitters: define ES_CELL_COLLAPSABLE ((_EsLongConstant) (1) << 51) diff --git a/desktop/settings.cpp b/desktop/settings.cpp index 54fb6a4..2bd635d 100644 --- a/desktop/settings.cpp +++ b/desktop/settings.cpp @@ -1,6 +1,34 @@ +// TODO Save system configuration file on closing the instance or going back to all settings. + struct SettingsInstance : EsInstance { EsPanel *switcher; EsPanel *mainPage; + EsButton *undoButton; + Array controls; +}; + +struct SettingsPage { + const char *string; + ptrdiff_t stringBytes; + uint32_t iconID; + void (*create)(EsElement *parent, SettingsPage *page); + char accessKey; +}; + +struct SettingsControl { +#define SETTINGS_CONTROL_CHECKBOX (1) +#define SETTINGS_CONTROL_NUMBER (2) + uint8_t type; + bool originalValueBool; + bool *globalPointerBool; + int32_t originalValueInt; + int32_t *globalPointerInt; + int32_t minimumValue, maximumValue; + const char *suffix; + size_t suffixBytes; + const char *cConfigurationSection; + const char *cConfigurationKey; + EsElement *element; }; const EsStyle styleSettingsGroupContainer = { @@ -44,8 +72,8 @@ const EsStyle styleSettingsTable = { const EsStyle styleSettingsCheckboxGroup = { .metrics = { .mask = ES_THEME_METRICS_GAP_MAJOR | ES_THEME_METRICS_GAP_MINOR, - .gapMajor = 0, - .gapMinor = 0, + .gapMajor = 3, + .gapMinor = 3, }, }; @@ -74,113 +102,274 @@ const EsStyle styleSettingsButton = { }, }; -struct SettingsPage { - const char *string; - ptrdiff_t stringBytes; - uint32_t iconID; - void (*create)(EsElement *parent, SettingsPage *page); - char accessKey; -}; - void SettingsBackButton(EsInstance *_instance, EsElement *, EsCommand *) { SettingsInstance *instance = (SettingsInstance *) _instance; + instance->undoButton = nullptr; + instance->controls.Free(); EsPanelSwitchTo(instance->switcher, instance->mainPage, ES_TRANSITION_ZOOM_OUT, ES_PANEL_SWITCHER_DESTROY_PREVIOUS_AFTER_TRANSITION, 1.0f); } -void SettingsPageAddTitle(EsElement *container, SettingsPage *page) { +void SettingsNumberBoxSetValue(EsElement *element, int32_t newValue) { + EsTextbox *textbox = (EsTextbox *) element; + SettingsInstance *instance = (SettingsInstance *) textbox->instance; + SettingsControl *control = (SettingsControl *) textbox->userData.p; + + newValue = ClampInteger(control->minimumValue, control->maximumValue, newValue); + char buffer[64]; + size_t bytes = EsStringFormat(buffer, sizeof(buffer), "%d%s", newValue, control->suffixBytes, control->suffix); + EsTextboxSelectAll(textbox); + EsTextboxInsert(textbox, buffer, bytes); + + EsMutexAcquire(&api.systemConfigurationMutex); + EsSystemConfigurationGroup *group = SystemConfigurationGetGroup(control->cConfigurationSection, -1); // TODO Create if needed. + EsSystemConfigurationItem *item = SystemConfigurationGetItem(group, control->cConfigurationKey, -1); // TODO Create if needed. + int32_t oldValue = EsIntegerParse(item->value, item->valueBytes); + EsHeapFree(item->value); + item->value = (char *) EsHeapAllocate(65, true); + item->valueBytes = EsStringFormat(item->value, 64, "%fd", ES_STRING_FORMAT_SIMPLE, newValue); + EsMutexRelease(&api.systemConfigurationMutex); + + if (oldValue != newValue) { + if (control->globalPointerInt) *control->globalPointerInt = newValue; + EsElementSetDisabled(instance->undoButton, false); + } +} + +void SettingsUndoButton(EsInstance *_instance, EsElement *, EsCommand *) { + SettingsInstance *instance = (SettingsInstance *) _instance; + + for (uintptr_t i = 0; i < instance->controls.Length(); i++) { + SettingsControl *control = instance->controls[i]; + + if (control->type == SETTINGS_CONTROL_CHECKBOX) { + EsButton *button = (EsButton *) control->element; + EsButtonSetCheck(button, control->originalValueBool ? ES_CHECK_CHECKED : ES_CHECK_UNCHECKED, true); + } else if (control->type == SETTINGS_CONTROL_NUMBER) { + SettingsNumberBoxSetValue(control->element, control->originalValueInt); + } + } + + EsElementSetDisabled(instance->undoButton, true); +} + +void SettingsAddTitle(EsElement *container, SettingsPage *page) { EsPanel *row = EsPanelCreate(container, ES_CELL_H_FILL | ES_PANEL_HORIZONTAL); EsIconDisplayCreate(row, ES_FLAGS_DEFAULT, ES_STYLE_ICON_DISPLAY, page->iconID); EsSpacerCreate(row, ES_FLAGS_DEFAULT, 0, 10, 0); EsTextDisplayCreate(row, ES_CELL_H_FILL, ES_STYLE_TEXT_HEADING2, page->string, page->stringBytes); + EsSpacerCreate(container, ES_CELL_H_FILL, ES_STYLE_BUTTON_GROUP_SEPARATOR); } -void SettingsPageAddUndoButton(EsElement *stack) { +void SettingsAddUndoButton(EsElement *stack) { EsPanel *overlay = EsPanelCreate(stack, ES_CELL_H_RIGHT | ES_CELL_V_TOP, &styleSettingsOverlayPanel); EsButton *undoButton = EsButtonCreate(overlay, ES_BUTTON_TOOLBAR, 0, INTERFACE_STRING(DesktopSettingsUndoButton)); undoButton->accessKey = 'U'; + ((SettingsInstance *) stack->instance)->undoButton = undoButton; EsButtonSetIcon(undoButton, ES_ICON_EDIT_UNDO_SYMBOLIC); + EsButtonOnCommand(undoButton, SettingsUndoButton); EsElementSetDisabled(undoButton, true); } void SettingsPageUnimplemented(EsElement *element, SettingsPage *page) { EsPanel *content = EsPanelCreate(element, ES_CELL_FILL | ES_PANEL_V_SCROLL_AUTO, &styleNewTabContent); EsPanel *container = EsPanelCreate(content, ES_PANEL_VERTICAL | ES_CELL_H_SHRINK, &styleSettingsGroupContainer2); - SettingsPageAddTitle(container, page); + SettingsAddTitle(container, page); EsTextDisplayCreate(container, ES_CELL_H_CENTER, 0, "Work in progress" ELLIPSIS); } +void SettingsCheckboxCommand(EsInstance *_instance, EsElement *element, EsCommand *) { + EsButton *button = (EsButton *) element; + SettingsInstance *instance = (SettingsInstance *) _instance; + SettingsControl *control = (SettingsControl *) button->userData.p; + bool newValue = EsButtonGetCheck(button) == ES_CHECK_CHECKED; + + EsMutexAcquire(&api.systemConfigurationMutex); + EsSystemConfigurationGroup *group = SystemConfigurationGetGroup(control->cConfigurationSection, -1); // TODO Create if needed. + EsSystemConfigurationItem *item = SystemConfigurationGetItem(group, control->cConfigurationKey, -1); // TODO Create if needed. + bool oldValue = EsIntegerParse(item->value, item->valueBytes); + EsHeapFree(item->value); + item->value = (char *) EsHeapAllocate(2, true); + *item->value = newValue ? '1' : '0'; + item->valueBytes = 1; + EsMutexRelease(&api.systemConfigurationMutex); + + if (oldValue == newValue) return; + if (control->globalPointerBool) *control->globalPointerBool = newValue; + EsElementSetDisabled(instance->undoButton, false); +} + +void SettingsAddCheckbox(EsElement *table, const char *string, ptrdiff_t stringBytes, char accessKey, + const char *cConfigurationSection, const char *cConfigurationKey, bool *globalPointerBool) { + SettingsInstance *instance = (SettingsInstance *) table->instance; + + SettingsControl *control = (SettingsControl *) EsHeapAllocate(sizeof(SettingsControl), true); + control->type = SETTINGS_CONTROL_CHECKBOX; + control->cConfigurationSection = cConfigurationSection; + control->cConfigurationKey = cConfigurationKey; + control->globalPointerBool = globalPointerBool; + control->originalValueBool = EsSystemConfigurationReadInteger(control->cConfigurationSection, -1, control->cConfigurationKey, -1); + + EsButton *button = EsButtonCreate(table, ES_CELL_H_FILL | ES_BUTTON_CHECKBOX | ES_ELEMENT_FREE_USER_DATA, 0, string, stringBytes); + button->userData = control; + button->accessKey = accessKey; + if (control->originalValueBool) EsButtonSetCheck(button, ES_CHECK_CHECKED, false); + EsButtonOnCommand(button, SettingsCheckboxCommand); + + control->element = button; + instance->controls.Add(control); +} + +int SettingsNumberBoxMessage(EsElement *element, EsMessage *message) { + EsTextbox *textbox = (EsTextbox *) element; + SettingsControl *control = (SettingsControl *) textbox->userData.p; + + if (message->type == ES_MSG_TEXTBOX_EDIT_END || message->type == ES_MSG_TEXTBOX_NUMBER_DRAG_END) { + char *expression = EsTextboxGetContents(textbox); + EsCalculationValue value = EsCalculateFromUserExpression(expression); + EsHeapFree(expression); + + if (!value.error) { + SettingsNumberBoxSetValue(element, value.number + 0.5); + return ES_HANDLED; + } else { + return ES_REJECTED; + } + } else if (message->type == ES_MSG_TEXTBOX_NUMBER_DRAG_DELTA) { + int oldValue = EsTextboxGetContentsAsDouble(textbox); + int newValue = ClampInteger(control->minimumValue, control->maximumValue, oldValue + message->numberDragDelta.delta * (message->numberDragDelta.fast ? 10 : 1)); + char buffer[64]; + size_t bytes = EsStringFormat(buffer, sizeof(buffer), "%d%s", newValue, control->suffixBytes, control->suffix); + EsTextboxSelectAll(textbox); + EsTextboxInsert(textbox, buffer, bytes); + return ES_HANDLED; + } + + return 0; +} + +void SettingsAddNumberBox(EsElement *table, const char *string, ptrdiff_t stringBytes, char accessKey, + const char *cConfigurationSection, const char *cConfigurationKey, int32_t *globalPointer, + int32_t minimumValue, int32_t maximumValue, const char *suffix, ptrdiff_t suffixBytes) { + if (suffixBytes == -1) { + suffixBytes = EsCStringLength(suffix); + } + + SettingsInstance *instance = (SettingsInstance *) table->instance; + + SettingsControl *control = (SettingsControl *) EsHeapAllocate(sizeof(SettingsControl), true); + control->type = SETTINGS_CONTROL_NUMBER; + control->cConfigurationSection = cConfigurationSection; + control->cConfigurationKey = cConfigurationKey; + control->globalPointerInt = globalPointer; + control->originalValueInt = EsSystemConfigurationReadInteger(control->cConfigurationSection, -1, control->cConfigurationKey, -1); + control->suffix = suffix; + control->suffixBytes = suffixBytes; + control->minimumValue = minimumValue; + control->maximumValue = maximumValue; + + EsTextDisplayCreate(table, ES_CELL_H_RIGHT | ES_CELL_H_PUSH, 0, string, stringBytes); + EsTextbox *textbox = EsTextboxCreate(table, ES_CELL_H_LEFT | ES_CELL_H_PUSH | ES_TEXTBOX_EDIT_BASED | ES_ELEMENT_FREE_USER_DATA, &styleSettingsNumberTextbox); + EsTextboxUseNumberOverlay(textbox, false); + textbox->userData = control; + textbox->accessKey = accessKey; + textbox->messageUser = SettingsNumberBoxMessage; + + char buffer[64]; + size_t bytes = EsStringFormat(buffer, sizeof(buffer), "%d%s", control->originalValueInt, suffixBytes, suffix); + EsTextboxInsert(textbox, buffer, bytes); + + control->element = textbox; + instance->controls.Add(control); +} + +int SettingsDoubleClickTestMessage(EsElement *element, EsMessage *message) { + if (message->type == ES_MSG_MOUSE_LEFT_DOWN) { + if (message->mouseDown.clickChainCount >= 2) { + element->customStyleState ^= THEME_STATE_CHECKED; + EsElementRepaint(element); + } + + return ES_HANDLED; + } + + return 0; +} + void SettingsPageMouse(EsElement *element, SettingsPage *page) { - // TODO Make this interactive. - - SettingsPageAddUndoButton(element); - EsPanel *content = EsPanelCreate(element, ES_CELL_FILL | ES_PANEL_V_SCROLL_AUTO, &styleNewTabContent); EsPanel *container = EsPanelCreate(content, ES_PANEL_VERTICAL | ES_CELL_H_SHRINK, &styleSettingsGroupContainer2); - SettingsPageAddTitle(container, page); - - EsPanel *table = EsPanelCreate(container, ES_CELL_H_FILL | ES_PANEL_TABLE | ES_PANEL_HORIZONTAL, &styleSettingsTable); - EsPanelSetBands(table, 2); + SettingsAddTitle(container, page); + EsPanel *table; EsTextbox *textbox; - EsTextDisplayCreate(table, ES_CELL_H_RIGHT | ES_CELL_H_PUSH, 0, INTERFACE_STRING(DesktopSettingsMouseDoubleClickSpeed)); - textbox = EsTextboxCreate(table, ES_CELL_H_LEFT | ES_CELL_H_PUSH | ES_TEXTBOX_EDIT_BASED, &styleSettingsNumberTextbox); - textbox->accessKey = 'D'; - EsTextboxUseNumberOverlay(textbox, false); - EsTextboxInsert(textbox, "500 ms"); + table = EsPanelCreate(container, ES_CELL_H_FILL | ES_PANEL_TABLE | ES_PANEL_HORIZONTAL, &styleSettingsTable); + EsPanelSetBands(table, 2); - EsTextDisplayCreate(table, ES_CELL_H_RIGHT | ES_CELL_H_PUSH, 0, INTERFACE_STRING(DesktopSettingsMouseSpeed)); + EsTextDisplayCreate(table, ES_CELL_H_RIGHT | ES_CELL_H_PUSH, 0, INTERFACE_STRING(DesktopSettingsMouseSpeed)); // TODO. textbox = EsTextboxCreate(table, ES_CELL_H_LEFT | ES_CELL_H_PUSH | ES_TEXTBOX_EDIT_BASED, &styleSettingsNumberTextbox); textbox->accessKey = 'M'; EsTextboxUseNumberOverlay(textbox, false); EsTextboxInsert(textbox, "50%"); - EsTextDisplayCreate(table, ES_CELL_H_RIGHT | ES_CELL_H_PUSH, 0, INTERFACE_STRING(DesktopSettingsMouseCursorTrails)); + EsTextDisplayCreate(table, ES_CELL_H_RIGHT | ES_CELL_H_PUSH, 0, INTERFACE_STRING(DesktopSettingsMouseCursorTrails)); // TODO. textbox = EsTextboxCreate(table, ES_CELL_H_LEFT | ES_CELL_H_PUSH | ES_TEXTBOX_EDIT_BASED, &styleSettingsNumberTextbox); textbox->accessKey = 'T'; EsTextboxUseNumberOverlay(textbox, false); EsTextboxInsert(textbox, "0"); - EsTextDisplayCreate(table, ES_CELL_H_RIGHT | ES_CELL_H_PUSH, 0, INTERFACE_STRING(DesktopSettingsMouseLinesPerScrollNotch)); + EsTextDisplayCreate(table, ES_CELL_H_RIGHT | ES_CELL_H_PUSH, 0, INTERFACE_STRING(DesktopSettingsMouseLinesPerScrollNotch)); // TODO. textbox = EsTextboxCreate(table, ES_CELL_H_LEFT | ES_CELL_H_PUSH | ES_TEXTBOX_EDIT_BASED, &styleSettingsNumberTextbox); textbox->accessKey = 'S'; EsTextboxUseNumberOverlay(textbox, false); EsTextboxInsert(textbox, "3"); - table = EsPanelCreate(container, ES_CELL_H_FILL | ES_PANEL_TABLE | ES_PANEL_HORIZONTAL, &styleSettingsCheckboxGroup); - EsPanelSetBands(table, 1); - EsButtonCreate(table, ES_CELL_H_FILL | ES_BUTTON_CHECKBOX, 0, INTERFACE_STRING(DesktopSettingsMouseSwapLeftAndRightButtons))->accessKey = 'B'; - EsButtonCreate(table, ES_CELL_H_FILL | ES_BUTTON_CHECKBOX, 0, INTERFACE_STRING(DesktopSettingsMouseShowShadow))->accessKey = 'W'; - EsButtonCreate(table, ES_CELL_H_FILL | ES_BUTTON_CHECKBOX, 0, INTERFACE_STRING(DesktopSettingsMouseLocateCursorOnCtrl))->accessKey = 'L'; + table = EsPanelCreate(container, ES_CELL_H_FILL, &styleSettingsCheckboxGroup); + SettingsAddCheckbox(table, INTERFACE_STRING(DesktopSettingsMouseSwapLeftAndRightButtons), 'B', + "general", "swap_left_and_right_buttons", &api.global->swapLeftAndRightButtons); + EsButtonCreate(table, ES_CELL_H_FILL | ES_BUTTON_CHECKBOX, 0, INTERFACE_STRING(DesktopSettingsMouseShowShadow))->accessKey = 'W'; // TODO. + EsButtonCreate(table, ES_CELL_H_FILL | ES_BUTTON_CHECKBOX, 0, INTERFACE_STRING(DesktopSettingsMouseLocateCursorOnCtrl))->accessKey = 'L'; // TODO. + + EsSpacerCreate(container, ES_CELL_H_FILL, ES_STYLE_BUTTON_GROUP_SEPARATOR); + + table = EsPanelCreate(container, ES_CELL_H_FILL | ES_PANEL_TABLE | ES_PANEL_HORIZONTAL, &styleSettingsTable); + EsPanelSetBands(table, 2); + + SettingsAddNumberBox(table, INTERFACE_STRING(DesktopSettingsMouseDoubleClickSpeed), 'D', + "general", "click_chain_timeout_ms", &api.global->clickChainTimeoutMs, + 100, 1500, INTERFACE_STRING(CommonUnitMilliseconds)); + + EsPanel *testBox = EsPanelCreate(container, ES_CELL_H_FILL); + EsTextDisplayCreate(testBox, ES_CELL_H_FILL, ES_STYLE_TEXT_PARAGRAPH, INTERFACE_STRING(DesktopSettingsMouseTestDoubleClickIntroduction)); + EsSpacerCreate(testBox, ES_FLAGS_DEFAULT, 0, 0, 5); + EsCustomElementCreate(testBox, ES_FLAGS_DEFAULT, ES_STYLE_DOUBLE_CLICK_TEST)->messageUser = SettingsDoubleClickTestMessage; + + SettingsAddUndoButton(element); } void SettingsPageKeyboard(EsElement *element, SettingsPage *page) { - // TODO Make this interactive. - - SettingsPageAddUndoButton(element); - EsPanel *content = EsPanelCreate(element, ES_CELL_FILL | ES_PANEL_V_SCROLL_AUTO, &styleNewTabContent); EsPanel *container = EsPanelCreate(content, ES_PANEL_VERTICAL | ES_CELL_H_SHRINK, &styleSettingsGroupContainer2); - SettingsPageAddTitle(container, page); + SettingsAddTitle(container, page); EsPanel *table = EsPanelCreate(container, ES_CELL_H_FILL | ES_PANEL_TABLE | ES_PANEL_HORIZONTAL, &styleSettingsTable); EsPanelSetBands(table, 2); EsTextbox *textbox; - EsTextDisplayCreate(table, ES_CELL_H_RIGHT | ES_CELL_H_PUSH, 0, INTERFACE_STRING(DesktopSettingsKeyboardKeyRepeatDelay)); + EsTextDisplayCreate(table, ES_CELL_H_RIGHT | ES_CELL_H_PUSH, 0, INTERFACE_STRING(DesktopSettingsKeyboardKeyRepeatDelay)); // TODO. textbox = EsTextboxCreate(table, ES_CELL_H_LEFT | ES_CELL_H_PUSH | ES_TEXTBOX_EDIT_BASED, &styleSettingsNumberTextbox); textbox->accessKey = 'D'; EsTextboxUseNumberOverlay(textbox, false); EsTextboxInsert(textbox, "400 ms"); - EsTextDisplayCreate(table, ES_CELL_H_RIGHT | ES_CELL_H_PUSH, 0, INTERFACE_STRING(DesktopSettingsKeyboardKeyRepeatRate)); + EsTextDisplayCreate(table, ES_CELL_H_RIGHT | ES_CELL_H_PUSH, 0, INTERFACE_STRING(DesktopSettingsKeyboardKeyRepeatRate)); // TODO. textbox = EsTextboxCreate(table, ES_CELL_H_LEFT | ES_CELL_H_PUSH | ES_TEXTBOX_EDIT_BASED, &styleSettingsNumberTextbox); textbox->accessKey = 'R'; EsTextboxUseNumberOverlay(textbox, false); EsTextboxInsert(textbox, "40 ms"); - EsTextDisplayCreate(table, ES_CELL_H_RIGHT | ES_CELL_H_PUSH, 0, INTERFACE_STRING(DesktopSettingsKeyboardCaretBlinkRate)); + EsTextDisplayCreate(table, ES_CELL_H_RIGHT | ES_CELL_H_PUSH, 0, INTERFACE_STRING(DesktopSettingsKeyboardCaretBlinkRate)); // TODO. textbox = EsTextboxCreate(table, ES_CELL_H_LEFT | ES_CELL_H_PUSH | ES_TEXTBOX_EDIT_BASED, &styleSettingsNumberTextbox); textbox->accessKey = 'B'; EsTextboxUseNumberOverlay(textbox, false); @@ -190,21 +379,23 @@ void SettingsPageKeyboard(EsElement *element, SettingsPage *page) { EsTextDisplayCreate(testBox, ES_CELL_H_FILL, ES_STYLE_TEXT_PARAGRAPH, INTERFACE_STRING(DesktopSettingsKeyboardTestTextboxIntroduction)); EsSpacerCreate(testBox, ES_FLAGS_DEFAULT, 0, 0, 5); EsTextboxCreate(testBox, ES_CELL_H_LEFT)->accessKey = 'T'; + + SettingsAddUndoButton(element); } SettingsPage settingsPages[] = { - { INTERFACE_STRING(DesktopSettingsAccessibility), ES_ICON_PREFERENCES_DESKTOP_ACCESSIBILITY, SettingsPageUnimplemented, 'A' }, - { INTERFACE_STRING(DesktopSettingsApplications), ES_ICON_APPLICATIONS_OTHER, SettingsPageUnimplemented, 'A' }, - { INTERFACE_STRING(DesktopSettingsDateAndTime), ES_ICON_PREFERENCES_SYSTEM_TIME, SettingsPageUnimplemented, 'D' }, - { INTERFACE_STRING(DesktopSettingsDevices), ES_ICON_COMPUTER_LAPTOP, SettingsPageUnimplemented, 'D' }, - { INTERFACE_STRING(DesktopSettingsDisplay), ES_ICON_PREFERENCES_DESKTOP_DISPLAY, SettingsPageUnimplemented, 'D' }, + { INTERFACE_STRING(DesktopSettingsAccessibility), ES_ICON_PREFERENCES_DESKTOP_ACCESSIBILITY, SettingsPageUnimplemented, 'A' }, // TODO. + { INTERFACE_STRING(DesktopSettingsApplications), ES_ICON_APPLICATIONS_OTHER, SettingsPageUnimplemented, 'A' }, // TODO. + { INTERFACE_STRING(DesktopSettingsDateAndTime), ES_ICON_PREFERENCES_SYSTEM_TIME, SettingsPageUnimplemented, 'D' }, // TODO. + { INTERFACE_STRING(DesktopSettingsDevices), ES_ICON_COMPUTER_LAPTOP, SettingsPageUnimplemented, 'D' }, // TODO. + { INTERFACE_STRING(DesktopSettingsDisplay), ES_ICON_PREFERENCES_DESKTOP_DISPLAY, SettingsPageUnimplemented, 'D' }, // TODO. { INTERFACE_STRING(DesktopSettingsKeyboard), ES_ICON_INPUT_KEYBOARD, SettingsPageKeyboard, 'K' }, - { INTERFACE_STRING(DesktopSettingsLocalisation), ES_ICON_PREFERENCES_DESKTOP_LOCALE, SettingsPageUnimplemented, 'L' }, + { INTERFACE_STRING(DesktopSettingsLocalisation), ES_ICON_PREFERENCES_DESKTOP_LOCALE, SettingsPageUnimplemented, 'L' }, // TODO. { INTERFACE_STRING(DesktopSettingsMouse), ES_ICON_INPUT_MOUSE, SettingsPageMouse, 'M' }, - { INTERFACE_STRING(DesktopSettingsNetwork), ES_ICON_PREFERENCES_SYSTEM_NETWORK, SettingsPageUnimplemented, 'N' }, - { INTERFACE_STRING(DesktopSettingsPower), ES_ICON_PREFERENCES_SYSTEM_POWER, SettingsPageUnimplemented, 'P' }, - { INTERFACE_STRING(DesktopSettingsSound), ES_ICON_PREFERENCES_DESKTOP_SOUND, SettingsPageUnimplemented, 'S' }, - { INTERFACE_STRING(DesktopSettingsTheme), ES_ICON_APPLICATIONS_INTERFACEDESIGN, SettingsPageUnimplemented, 'T' }, + { INTERFACE_STRING(DesktopSettingsNetwork), ES_ICON_PREFERENCES_SYSTEM_NETWORK, SettingsPageUnimplemented, 'N' }, // TODO. + { INTERFACE_STRING(DesktopSettingsPower), ES_ICON_PREFERENCES_SYSTEM_POWER, SettingsPageUnimplemented, 'P' }, // TODO. + { INTERFACE_STRING(DesktopSettingsSound), ES_ICON_PREFERENCES_DESKTOP_SOUND, SettingsPageUnimplemented, 'S' }, // TODO. + { INTERFACE_STRING(DesktopSettingsTheme), ES_ICON_APPLICATIONS_INTERFACEDESIGN, SettingsPageUnimplemented, 'T' }, // TODO. }; void SettingsButtonPressed(EsInstance *_instance, EsElement *element, EsCommand *) { diff --git a/desktop/styles.header b/desktop/styles.header index d309fc1..7445a6f 100644 --- a/desktop/styles.header +++ b/desktop/styles.header @@ -20,6 +20,7 @@ define_private ES_STYLE_CONTAINER_WINDOW_INACTIVE (ES_STYLE_CAST(1255)) 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)) 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)) diff --git a/kernel/module.h b/kernel/module.h index d4eefb5..c9e8a1a 100644 --- a/kernel/module.h +++ b/kernel/module.h @@ -126,6 +126,7 @@ void KRegisterAsyncTask(KAsyncTaskCallback callback, EsGeneric argument, bool ne #ifdef K_IN_CORE_KERNEL #define SHARED_COMMON_WANT_ALL +#include #include #endif diff --git a/res/System Configuration Template.ini b/res/System Configuration Template.ini index 47ed4a2..c037a3c 100644 --- a/res/System Configuration Template.ini +++ b/res/System Configuration Template.ini @@ -1,6 +1,5 @@ -; Global system configuration. - [general] +; General settings. startup_sound=0:/Essence/Media/Startup Sound.wav fonts_path=0:/Essence/Fonts themes_path=0:/Essence/Themes @@ -9,8 +8,10 @@ settings_path=0:/Settings default_user_documents_path=0:/ installation_state=0 click_chain_timeout_ms=500 +swap_left_and_right_buttons=0 [ui] +; User interface settings that are accessible by all applications. theme=|Themes:/Theme.dat icon_pack=|Themes:/elementary Icons.dat font_fallback=Inter diff --git a/res/Theme Source.dat b/res/Theme Source.dat index 3baac4f4f389f4215256309db0e94a69b1c90fda..1e845e5caa2ad61b2d7f96b07251f9bb8bdb81ed 100644 GIT binary patch delta 162 zcmeD9&vc}bnO&5DfkCRRWFvbnlSGqbn^arBOMYomPO5WGW^#5&YH^7~8^h*eCN(Y= zjwZ&&$q((MH}Bw4oyf_+&;ZoQ&@g$j;9}Fw((~T3AcQsxE-N8!8$yGETnNE6v3S1Oh+)HzQ&_4k&$I`f`Y_k dh4qq~HRk$JC>pe=Ad5joT@zIBgOG>`x@1Zk z8!^&e(qURU!Pd64qGj^vlyq?1PRUd!r0SGu=u}%A>F88UaAK#}lCl50%fj3HnE&4U ze&^it&OP_O4^H3Ejo#FGca-)2pq_{lpsY8DT!)Dm{>0(MA=(140|rHOr&%%BC;A!2 zaFl}GH|T|1AOJcZus??Q5!HZQ53r5X0qX%j)rVfV0qirqjtmC9F_=s<*bPlUakUn( zTl{S$)_YM(vjY~ZQBOK}1tWBWrAVwF?60_z(P#(@`dtJ28(27wAR7X^1E#|vn3(nm z*gpc9^OxBy?XMuf%iJ43hQNhW&z&=p6ok;;Xp=luAM4d0B}$zM?vHH(o3CM_>=v*E8YU7< z0$U_8JJ@3B>S~)E?gT+Y6bbuYljJ1!cF0d04>jisDVm`1>P#OR1gYU6xfbVKch*A%Mos>#=8|-IN zf+JvFgVDblf#(^c39u{Lc(Cg0h~74Y1^wnC0Y)~!Z%YB~b^O2Ki3ts}@xb?c2YxnQ zzgMf=+vaZK8MCYj&9I7hap2*P9r`D?;rAU^dRzETSX-sBtM*1`_kY%(+Ro3y+9{2F z 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