diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md deleted file mode 100644 index 8e79dedb8..000000000 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -name: Bug report -about: Create a report to help us improve -title: '' -labels: '' -assignees: '' - ---- - -**Describe the bug** -A clear and concise description of what the bug is. - -**To Reproduce** -Steps to reproduce the behavior: -1. Go to '...' -2. Click on '....' -3. Scroll down to '....' -4. See error - -**Expected behavior** -A clear and concise description of what you expected to happen. - -**Screenshots** -If applicable, add screenshots to help explain your problem. - -**Version:** - - Open-Shell: [e.g. 4.4.131] - - OS: [e.g. Windows 10 1903] - -**Additional context** -Add any other context about the problem here. diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml new file mode 100644 index 000000000..dbe5f8b8f --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -0,0 +1,61 @@ +name: Bug report +description: Create a report to help us improve +labels: Bug + +body: +- type: markdown + attributes: + value: | + **Please, make sure you are using [latest](https://github.com/Open-Shell/Open-Shell-Menu/releases) `Open-Shell` build before reporting a bug.** + Especially on `Windows 11` you should use 4.4.190 (or newer). +- type: textarea + attributes: + label: Describe the bug + description: A clear and concise description of what the bug is. Screenshots are also encouraged. + placeholder: Please use English for reports and screenshots to allow maintainers to easily understand the issue. + validations: + required: true +- type: dropdown + attributes: + label: Area of issue + description: What component(s) of Open-Shell does this involve? Select all that apply. + multiple: true + options: + - Start menu + - Taskbar + - Windows Explorer + - Internet Explorer + - Installation/Other + validations: + required: true +- type: textarea + attributes: + label: To reproduce + description: Steps to reproduce the behavior + placeholder: | + 1. Go to '...' + 2. Click on '....' + 3. Scroll down to '....' + 4. See error + validations: + required: true +- type: textarea + attributes: + label: Expected behavior + placeholder: What did you expect to happen? +- type: input + attributes: + label: Open-Shell version + placeholder: e.g. 4.4.170 + validations: + required: true +- type: input + attributes: + label: Windows version + placeholder: e.g. Windows 10 22H2 + validations: + required: true +- type: textarea + attributes: + label: Additional context + description: Add any other context about the problem here. diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 000000000..4534f67c6 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,5 @@ +blank_issues_enabled: false +contact_links: + - name: Github Discussions + url: https://github.com/Open-Shell/Open-Shell-Menu/discussions + about: Please ask and answer questions here. diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md deleted file mode 100644 index c8421a4dc..000000000 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -name: Feature request -about: Suggest an idea for this project -title: '' -labels: Enhancement/Feature Request -assignees: '' - ---- - -**Is your feature request related to a problem? Please describe.** -A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] - -**Describe the solution you'd like** -A clear and concise description of what you want to happen. - -**Describe alternatives you've considered** -A clear and concise description of any alternative solutions or features you've considered. - -**Additional context** -Add any other context or screenshots about the feature request here. diff --git a/.github/ISSUE_TEMPLATE/feature_request.yml b/.github/ISSUE_TEMPLATE/feature_request.yml new file mode 100644 index 000000000..a1f4b338c --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.yml @@ -0,0 +1,39 @@ +name: Feature request +description: Suggest an idea for this project +labels: Enhancement/Feature Request + +body: +- type: textarea + attributes: + label: Is your feature request related to a problem? Please describe. + description: A clear and concise description of what the problem is. + placeholder: Ex. I'm always frustrated when [...] + validations: + required: true +- type: textarea + attributes: + label: Describe the solution you'd like + description: A clear and concise description of what you want to happen. + validations: + required: true +- type: dropdown + attributes: + label: Area of issue + description: What component(s) of Open-Shell does this involve? Select all that apply. + multiple: true + options: + - Start menu + - Taskbar + - Windows Explorer + - Internet Explorer + - Installation/Other + validations: + required: true +- type: textarea + attributes: + label: Alternatives you've considered + description: A clear and concise description of any alternative solutions or features you've considered. +- type: textarea + attributes: + label: Additional context + description: Add any other context or screenshots about the feature request here. diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 000000000..f6b1819bc --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,94 @@ +name: Build + +permissions: + contents: read # Default to secure + +on: + pull_request: + branches: + - master + paths: + - 'Src/**' + - 'Localization/**' + - '.github/workflows/build.yml' + + workflow_dispatch: # allows manual trigger for main/master + +jobs: + build: + runs-on: windows-2022 + outputs: + new_version: ${{ steps.versioning.outputs.NEW_VERSION }} + steps: + - name: Checkout code + uses: actions/checkout@v6 + with: + fetch-depth: 0 # Essential to see all tags + + - name: Prepare version + id: versioning + shell: pwsh + run: | + # Fetch latest tag + $latestTag = git describe --tags --abbrev=0 2>$null + + if ($latestTag -notmatch '^v\d+\.\d+\.\d+$') { + Write-Error "Error: Could not find a valid vX.Y.Z tag in history. Found: '$latestTag'" + exit 1 + } + + # Parse and Increment + $version = [version]$latestTag.Substring(1) + $baseVersion = "$($version.Major).$($version.Minor).$($version.Build + 1)" + + # Handle PR Suffix + if ("${{ github.event_name }}" -eq "pull_request") { + $shortSha = "${{ github.event.pull_request.head.sha }}".Substring(0, 7) + $finalVersion = "$baseVersion-pr-$shortSha" + } else { + $finalVersion = $baseVersion + } + + # Export + "NEW_VERSION=$finalVersion" | Out-File -FilePath $env:GITHUB_OUTPUT -Append + Write-Host "Building version: $finalVersion" + + - name: Build + shell: cmd + env: + APPVEYOR_BUILD_VERSION: ${{ steps.versioning.outputs.NEW_VERSION }} + run: Src\Setup\__MakeFinal.bat + + - name: Upload artifacts + uses: actions/upload-artifact@v7 + with: + name: OpenShell + path: | + Src/Setup/Final/ + !Src/Setup/Final/OpenShellLoc.zip + + release: + if: github.event_name == 'workflow_dispatch' && github.ref == 'refs/heads/master' # Only manual master builds + needs: build + runs-on: ubuntu-latest # Cheaper/faster than windows for just uploading + permissions: + contents: write # Elevate permissions ONLY for this job + steps: + - name: Download artifacts + uses: actions/download-artifact@v8 + with: + name: OpenShell + + - name: Create GitHub Release + uses: softprops/action-gh-release@v3 + with: + tag_name: v${{ needs.build.outputs.new_version }} + name: ${{ needs.build.outputs.new_version }} + generate_release_notes: true + prerelease: true + files: | + OpenShellSetup*.exe + OpenShellSymbols_*.7z + Utility.exe + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.gitignore b/.gitignore index 363b43464..75591d3db 100644 --- a/.gitignore +++ b/.gitignore @@ -20,12 +20,15 @@ # Build results [Dd]ebug/ [Dd]ebug64/ +[Dd]ebugARM64/ [Dd]ebugPublic/ [Rr]elease/ [Rr]elease64/ +[Rr]eleaseARM64/ [Rr]eleases/ x64/ x86/ +ARM64/ bld/ [Bb]in/ [Oo]bj/ @@ -68,6 +71,7 @@ StyleCopReport.xml *_i.c *_p.c *_i.h +*_h.h *.ilk *.meta *.obj @@ -348,7 +352,6 @@ ASALocalRun/ *.PVS-Studio.* # Classic-Shell specific ignores -Src/StartMenu/Skins/ Src/Setup/Output/ Src/Setup/Final/ Src/Setup/Temp/ diff --git a/Localization/English/ClassicExplorer.html b/Localization/English/ClassicExplorer.html deleted file mode 100644 index 3d0eb8a4a..000000000 --- a/Localization/English/ClassicExplorer.html +++ /dev/null @@ -1,437 +0,0 @@ - - - - - - Classic Explorer - -

Open-Shell website  Classic Explorer


-Classic -Explorer is a plugin for Windows Explorer that: - -
- - -

New copy UI (Windows 7 only)
-

- -In Vista when you copy files and there is a conflict you are presented -with this:
- -
- -Before
- -

What’s wrong with it?

- -

Well, for -starters it is half a screen full of text that you have to read. Also -it is not immediately clear what parts of it are clickable. You have to -move the mouse around to discover the UI like in a Lucas Arts -adventure game. And finally the keyboard usability is awful. To -tell it -“yes, I know what I’m doing, I want to overwrite all files” you have to -press Alt+D, up, up, up, Space! It is harder than performing the Akuma -Kara Demon move in Street Fighter 3. There is a time and a place -for -that stuff and copying files is not it.

- -

The Classic Explorer plugin brings back the simpler dialog box from Windows XP:
-

- -

After
-

- -

It -is immediately clear what is clickable (clue – the buttons at the -bottom), there is easy keyboard navigation (press Y for “Yes”, A to -copy all files) and you can still see which file is newer and which is -larger. And of course just like in Windows XP, holding down Shift while clicking on the No button means "No to All" (or just press Shift+N).
-

- -

If you click -on More… you will get -the original dialog from Windows. From there you -will see all the details and you’ll get an extra option to “Copy, but -keep both files”.

-

Important Note: Only the UI is replaced. The underlying system that does the actual copying is not affected.
-

-


-

- - - -

Alt+Enter in the folder panel

- -Alt+Enter is -universal shortcut across Windows to bring up the properties of the -selection. But newer versions of Windows it doesn’t work in the left -panel that shows the folders. It works fine on the right where the -files are. This is broken compared to Windows XP where Alt+Enter works -in both places. -

To solve the -problem, the Classic Explorer plugin detects when you press Alt+Enter -and shows the properties for the currently selected folder.
-

-


-

- - -

Toolbar for Windows Explorer

-Windows -Explorer in Vista doesn’t have a toolbar like the one in Windows XP. If -you want to go to the parent folder you have to use the breadcrumbs -bar. If you want to copy or delete a file with the mouse you have to -right-click and look for the Delete command. The right-click menu gets -bigger and bigger the more shell extensions you have installed, and -finding the right command can take a while.
-

To solve the problem, the Classic Explorer plugin adds a new toolbar:
-

- - Explorer Toolbar
-
-The available button are: Go Up, Cut, Copy, Paste, Delete, Properties, -Email, Settings. More buttons can be added from the Settings dialog.
-
-Hints:
-    - Hold the Control key when clicking the Up button to open the parent folder in a new Explorer window.
-    - Hold the Shift key when clicking the Delete button to permanently delete a file
- -
- -The new toolbar doesn’t show up in Explorer automatically after -installation. You have to do a few things before you can use it:
- -
    - -
  1. Open a new Windows Explorer window (Win key+E)
  2. -
  3. Turn on the menu in Explorer – Go to Tools (Alt+T), Folder -Options, the View tab, and make sure “Always show menus” is checked.
  4. -
  5. Right click on the menu bar and select “Classic Explorer Bar” to -show the toolbar.
  6. -
  7. If that option is not available (you only see “Lock the -Toolbars”) you may have to enable the plugin from Internet Explorer. -Run IE, right click on its toolbar and select “Classic Explorer Bar”. -It will ask you if you want to enable this add-on. Select “Enable”, -then repeat steps 1 through 3 again.
  8. -
  9. If even then you don't see the toolbar, maybe the browser -extensions are disabled on your system. This is usually the default for -servers. Open the "Internet Options", go to the "Advanced" tab, and check -the option "Enable third-party browser extensions".
    -
  10. - -

-

Status bar
-

-Classic Explorer restores the original Explorer status bar that shows the free disk space and the size of the selected files:
-
-File size in status bar
-
-Unlike the built-in status bar, the selection size is shown even if -more than 100 files are selected. When no files are selected the total -size of all files in the folder is shown.
-
Windows 7 note: Classic Explorer enhances the -default status bar instead of replacing it. To see it, you have to turn -it on first from the View menu. -The status bar is different from the blue -Details Pane you see at the bottom of Explorer. You can turn off the -Details Pane from the Organize menu to save space. Also there is a bug -in the Windows 7 Explorer that sometimes doesn't show any text in the -status bar. Press F5 to refresh the view and get the status text.
-
Windows 8 note: Classic Explorer adds its own -status bar. You should hide the default status bar to save space. -Select the View tab in the ribbon, then click on Options. Select the -View tab in the options. Locate the checkbox "Show status bar" and -uncheck it. -
-
- - -

Settings

You can access the settings of Classic Explorer from the toolbar or from the start menu:
-
-
You can choose from seeing only the basic settings, or all -available settings. Hover over each setting to see a description of -what it's for. Type in the search box to find a setting by name.
-Every setting has a default value. The default value can be constant, -or it may depend on the current system settings. Once you edit a -setting it becomes "modified" and is shown in bold. To revert to the -default value, right-click on the setting.
-
You can save the settings to an XML file, and later load them back. -Press the Backup button to access these functions. From there you can -also reset all settings to their default value.
- -
- -Press OK to store your settings. Most of the settings will be applied -the next time you open a new Explorer window. Small number of settings -will require a log off before you can see the change.
- -
- -Note: All Settings windows are resizable. Resize them and place them where you want them to be. They will remember the new position.
- -
-Here's one example of what can be customized:
- - Title bar tweaks
-
-Click on the Toolbar Buttons tab to customize the toolbar:
-
-
The column on the left shows the current buttons in the toolbar, -and the column on the right lists the buttons you can add to the -toolbar. You can drag and drop buttons from the right column to the -left. You -can rearrange the buttons by dragging them up and down. If you drop one button inside another you will create a sub-menu.
-Hover over each -button to see a short description of what it does. Right-click on each -button to access more functions (like Delete, Rename, etc). From the -right-click menu you can also reset the toolbar to the original state.
-Each item in the left column must have a unique name. This is the -identifier of the item and can only contain English letters, digits and -underscore. Some items (like SEPARATOR) cannot be renamed.
-
-Important Note: Not all available commands have default icons or text. That's because Windows doesn't have icons for things like Undo, Select All, etc. If you want to use such buttons in your toolbar you will have to provide your own icon. See below how to do it.
-
-After you place a button in the toolbar, you can edit it's attributes. Double-click on the button to edit:
-Edit toolbar button
-Here you can select a command for the button, its text and icon. Press the Restore Defaults button to get the default text and icon for the chosen command.
-The command can be:
- -The link can be a path to a file or a folder. If it is a file, that -file will be executed. If it is a folder, that folder will be opened as -a sub-menu (only for top-level buttons).
-
-The icon can be:
- -If the label or the tip attribute start with $ (dollar sign), then the -system will treat it as a name of a string in the ExplorerL10N.ini -file. The actual text will depend on the current language setting. This -is useful when creating a toolbar that can be used by multiple languages.
-
-Note to developers: Buttons for custom commands can be checked or disabled. The toolbar checks the registry key HKCU\Software\OpenShell\ClassicExplorer -for a DWORD value with the name of the button (the name used in left -column). 0 means normal, 1 is disabled and 2 is checked. The toolbar -reads the registry keys on startup. To force the buttons to update -their state after that you need to find all Explorer windows, locate -the child window with class OpenShell.CBandWindow, and post a message WM_CLEAR. This is useful if you are developing a custom exe to be used by the toolbar.
- -
-

Examples for Custom Commands

-

0) Use quotes when necessary

In order to support paths that -contain spaces, you should use quotes around the path parameters. The -quotes are not always required, like in examples 1 and 2 below. Make -sure you test your commands with paths containing spaces to avoid -surprises.
-
-

1) Print the current folder

- -Use this command: cmd.exe /k echo %1. %1 will be replaced by the path of the current folder.
-
-

2) Open the selected file in Notepad

-Use this command: %SystemRoot%\notepad.exe %2. -%2 will be replaced by the full name of the selected file. It doesn't -need to be in quotes because Notepad uses the whole command line as a -file name.
-
-

3) Copy selected files to the parent folder
-

-Create a batch file called C:\CopyParent.bat:
-set list=%1
-set list=%list:"=%
-for /F "delims=" %%i in (%list%) do copy /Y "%%i" ..
-del %1
-
-Use this command: C:\CopyParent.bat "%3". -%3 will be replaced by a text file containing the full names of all -selected files. The batch file will read each line of that text file, -and copy each of the selected files to the parent folder. At the end -the batch file deletes the initial -temp file. The first two set commands remove the quotes from the %1 parameter.
-
-

4) Select all text files

-Create a batch file called C:\SelectText.bat:
-echo select > %1
-dir *.txt /b >> %1
-
-Use this command: C:\SelectText.bat "%5". -%5 will be replaced by a blank text file, where the command must output -the word "select" and a list of files it wants to select. The "dir -*.txt /b" command provides that list.
-
-
- -

Administrative Settings

The settings are -per user and are stored in the registry. By default every user can edit -all of their settings. An administrator can lock specific settings, so -no user can edit them:
-
-In this example the setting "Show Up button" is locked to always be -"Before Back/Forward" and can't be changed by any user. This is achieved -by adding the setting to the HKEY_LOCAL_MACHINE\SOFTWARE\OpenShell\ClassicExplorer registry key. Create a string value called "ShowUpButton" and set it to "BeforeBack".
-
In some cases you may not want to lock the value for all users, but -simply modify the initial value of the setting. In such case add -"_Default" to the name of the value. For example if you want the Up -button to be before Back by default but still allow the users to change -it if they wish, create a string value named "ShowUpButton_Default" and -set it to "BeforeBack".
-
-The easiest way to know the registry name of a setting and its value is to modify it, and then look it up in HKEY_CURRENT_USER\Software\OpenShell\ClassicExplorer\Settings.
-Sometimes you may want to lock a setting to its default value, but you -don't know what the default value is. Then create a DWORD value and set -it to 0xDEFA.
-
-There is also a global setting EnableSettings. Set it to 0 in the -registry to prevent the users from even opening the Settings dialog:
-Disable all settings
-
-You can enable or disable Classic Explorer for individual processes -using the 2 registry settings "ProcessWhiteList" and -"ProcessBlackList". ProcessWhiteList is -a list of processes for which Classic Explorer will load. Use only the -file name of the process (like "notepad.exe"), separate multiple names -with a comma or a semicolon. ProcessBlackList -is a list of processes for which Classic Explorer will not load. You -should only use one of the two lists. If both lists are specified, the -black list will be ignored. The lists are only used when you enable the -features that are supported for processes other than Explorer. At the -moment these features are: the shared overlay icon and the replacements -for the copy dialogs.
-
-Editing the settings through group policies is also supported. Extract the file PolicyDefinitions.zip found in the installation folder and read the document PolicyDefinitions.rtf for more details.
-
- -
- -

Dependencies on Windows settings
-

-Some Classic Explorer settings require specific Windows settings to be enabled:
- - -
- -

Localization

- - - - -The user -interface (except the Settings dialog box) is localized in 35 -languages.
-The Settings dialog box is translated in a smaller number of languages. -The default installation contains only English. More languages can be -downloaded from the translations page. Make sure you download the translation package for the exact version of Open-Shell.
- -
- - diff --git a/Localization/English/ClassicExplorerADMX.txt b/Localization/English/ClassicExplorerADMX.txt deleted file mode 100644 index b29018349..000000000 --- a/Localization/English/ClassicExplorerADMX.txt +++ /dev/null @@ -1,62 +0,0 @@ -; DON'T TRANSLATE ============================================================= - -; disabled -LogLevel.supportedOn = never -ShowFreeSpace2.supportedOn = never -ShowInfoTip2.supportedOn = never - -; os-specific -ReplaceFileUI.supportedOn = win7 -ReplaceFolderUI.supportedOn = win7 -OverwriteAlertLevel.supportedOn = win7 -EnableMore.supportedOn = win7 -MoreProgressDelay.supportedOn = win7 -FileExplorer.supportedOn = win7 -ShowUpButton.supportedOn = win7 -UpIconNormal.supportedOn = win7 -UpIconPressed.supportedOn = win7 -UpIconHot.supportedOn = win7 -UpIconDisabled.supportedOn = win7 -UpIconSize.supportedOn = win7 -FixFolderScroll.supportedOn = win7 -ForceRefreshWin7.supportedOn = win7 -ShowCaption.supportedOn = win7 -ShowIcon.supportedOn = win7 -ShowStatusBar.supportedOn = win881 -ShowZone.supportedOn = win881 - - - -; TRANSLATE =================================================================== - -Title.text = Open-Shell settings -State.text = State: -State1.text = Locked to this value -State2.text = Locked to default -State3.text = Unlocked -State1Help.text = If you set the state to 'Locked to this value', the setting will be locked to the specified value for all users. -State2Help.text = If you set the state to 'Locked to default', the setting will be locked to the default value for all users. The specified value is ignored. -State3Help.text = If you set the state to 'Unlocked', the default value for the setting will be changed to the specified value. Individual users can override the setting. - -ClassicExplorerCat.text = Classic Explorer -ClassicExplorerCatHelp.text = Classic Explorer group policy settings -SUPPORTED_CS404.text = Requires Open-Shell 4.0.4 or later. -SUPPORTED_CS404_WIN7.text = Requires Windows 7. -SUPPORTED_CS404_WIN881.text = Requires Windows 8 or Windows 8.1. - -AddressAltD.nameOverride = Additional shortcut for the address bar -AddressAltD.tipOverride = Enter a letter 'A' to 'Z' to be a shortcut for the address bar in combination with the Alt key -EnableSettings.nameOverride = Enable settings -EnableSettings.tipOverride = Enables the users to edit their own settings -ProcessWhiteList.nameOverride = Process white list -ProcessWhiteList.tipOverride = List of processes that can load Classic Explorer. Use only the file name of the process (like "notepad.exe"), separate multiple names with a comma or semicolon. -ProcessBlackList.nameOverride = Process black list -ProcessBlackList.tipOverride = List of processes that will not load Classic Explorer. Use only the file name of the process (like "notepad.exe"), separate multiple names with a comma or semicolon. -ToolbarItems.nameOverride = Toolbar buttons -ToolbarItems.tipOverride = Select the buttons to be shown in the toolbar.\nThe best way to get the right string is to configure the buttons in the Classic Explorer settings dialog and then look up the value named ToolbarItems in HKCU\Software\OpenShell\ClassicExplorer\Settings -NoInitialToolbar.nameOverride = No initial showing of the toolbar -NoInitialToolbar.tipOverride = When this is checked, the Explorer toolbar will not be automatically displayed - - -; os-specific -FileExplorer.nameOverride = Enable dialogs only in Explorer (improves performance) diff --git a/Localization/English/ClassicIE.html b/Localization/English/ClassicIE.html deleted file mode 100644 index c121d167d..000000000 --- a/Localization/English/ClassicIE.html +++ /dev/null @@ -1,100 +0,0 @@ - - - - - - - - - - - - - Classic IE - -

Open-Shell website  -Classic IE


-Classic IE
-is a -small plugin for Internet Explorer that:
- -
-See the full page title even when it doesn't fit in the tab:
-
-
See the progress and the security zone:
-
-
-

Installation

-When you run Internet Explorer for the first time after installing -Classic IE it may prompt you that a new add-on called ClassicIEBHO is -installed and if you want to enable it. Click on the Enable button. If -you don't get a prompt, go to Tools -> Manage add-ons and make sure ClassicIEBHO is enabled. After enabling the add-on you have to restart Internet Explorer to activate the plugin.
-
-

Settings

-You can access the settings from Tools -> Classic IE Settings -or from the start menu. The settings control the color and the font of -the caption, and what information to display on the status bar.
-
-
You can choose from seeing only the basic settings, or all -available settings. Hover over each setting to see a description of -what it's for. Type in the search box to find a setting by name.
-Every setting has a default value. The default value can be constant, -or it may depend on the current system settings. Once you edit a -setting it becomes "modified" and is shown in bold. To revert to the -default value, right-click on the setting.
- -
-You can save the settings to an XML file, and later load them back. -Press the Backup button to access these functions. From there you can -also reset all settings to their default value.
- - -
- - -Press OK to store your settings. You need to restart Internet Explorer to apply the new settings.
- - -
-

Administrative Settings

-The settings are -per user and are stored in the registry. By default every user can edit -all of their settings. An administrator can lock specific settings, so -no user can edit them. This is achieved by adding the setting to the HKEY_LOCAL_MACHINE\SOFTWARE\OpenShell\ClassicIE registry key.
-
-You may also wish to not lock the setting but only override its initial -value. Then add "_Default" to the name of the registry value.
-
-The easiest way to know the registry name of a setting and its value is to modify it, and then look it up in HKEY_CURRENT_USER\Software\OpenShell\ClassicIE\Settings.
- -Sometimes you may want to lock a setting to its default value, but you -don't know what the default value is. Then create a DWORD value and set -it to 0xDEFA.
- -
- -There is also a global setting EnableSettings. Set it to 0 in the -registry to prevent the users from even opening the Settings dialog:
- -
-
-Editing the settings through group policies is also supported. Extract the file PolicyDefinitions.zip found in the installation folder and read the document PolicyDefinitions.rtf for more details.
-
- diff --git a/Localization/English/ClassicIEADMX.txt b/Localization/English/ClassicIEADMX.txt deleted file mode 100644 index 1d2662b0b..000000000 --- a/Localization/English/ClassicIEADMX.txt +++ /dev/null @@ -1,26 +0,0 @@ -; DON'T TRANSLATE ============================================================= - -LogLevel.supportedOn = never - - - -; TRANSLATE =================================================================== - -Title.text = Open-Shell settings -State.text = State: -State1.text = Locked to this value -State2.text = Locked to default -State3.text = Unlocked -State1Help.text = If you set the state to 'Locked to this value', the setting will be locked to the specified value for all users. -State2Help.text = If you set the state to 'Locked to default', the setting will be locked to the default value for all users. The specified value is ignored. -State3Help.text = If you set the state to 'Unlocked', the default value for the setting will be changed to the specified value. Individual users can override the setting. - -ClassicIECat.text = Classic IE -ClassicIECatHelp.text = Classic IE group policy settings -SUPPORTED_CS404.text = Requires Open-Shell 4.0.4 or later. -SUPPORTED_IE9.text = Requires Internet Explorer 9 or later. - - -EnableSettings.nameOverride = Enable settings -EnableSettings.tipOverride = Enables the users to edit their own settings -CaptionFont.tipAddition = .\n\nThe format is , , . For example "Segoe UI, normal, 9" diff --git a/Localization/English/License.html b/Localization/English/License.html deleted file mode 100644 index 68368e00e..000000000 --- a/Localization/English/License.html +++ /dev/null @@ -1,62 +0,0 @@ - - - - - - License Agreement - -

Open-Shell website  License Agreement
-


- -Classic Shell 2009-2017, Ivo Beltchev http://www.classicshell.net/
- -Open-Shell 2017-2018, The Open-Shell Team https://github.com/open-shell
-
-BY USING THIS SOFTWARE, YOU ACCEPT THESE TERMS. IF YOU DO NOT ACCEPT THEM, DO NOT USE THE SOFTWARE.
-
-If you comply with these license terms, you have the rights below.
-
-
    -
  1. -

    SCOPE OF LICENSE. This agreement only gives you some rights to use the software. The author reserves all other rights.

    -
  2. -
  3. -

    INSTALLATION AND USE RIGHTS. This software is free for both personal and commercial use. You may install and use it on your computers free of charge.

    -
  4. -
  5. -

    REDISTRIBUTION RIGHTS. You may redistribute the software as long as you do it free of charge and you don’t misrepresent the origin of the software.

    -
  6. -
  7. -

    TRADEMARKS. The Open-Shell name and logo are trademarks of the author. Using them to to identify other products or services is not permitted.

    -
  8. -
  9. -

    DISCLAIMER OF WARRANTY. -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

    -
  10. -
  11. -

    IN OTHER WORDS: -Basically you can use this software freely for any purpose but don’t be -surprised if it doesn’t work as you expect. You can’t hold the author -responsible for any damages that come to you from using the software. -You can’t profit from selling this software. You got it for free after -all.

    -
  12. -
- - - diff --git a/Localization/English/Links.html b/Localization/English/Links.html deleted file mode 100644 index 36f21b45c..000000000 --- a/Localization/English/Links.html +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - - Open-Shell - -

Open-Shell website  Links


The latest version can be found on the Open-Shell website:
-http://www.classicshell.net/
-
-View the project history here:
-History: http://www.classicshell.net/history/
-
-
-

Get Help

-For answers to frequently asked questions look here:
-FAQ: http://www.classicshell.net/faq/
- -
-If you don't find your answer in the FAQ, try the discussion forums:
-Discussion Forums: http://www.classicshell.net/forum/viewforum.php?f=6
- -
-
-

Report Problems

-Report bugs and feature requests in the development forums:
-Development Forums: http://www.classicshell.net/forum/viewforum.php?f=11
- - diff --git a/Localization/English/Localization.rtf b/Localization/English/Localization.rtf deleted file mode 100644 index 5b573a82f..000000000 --- a/Localization/English/Localization.rtf +++ /dev/null @@ -1,108 +0,0 @@ -{\rtf1\ansi\ansicpg1252\deff0\nouicompat\deflang1033\deflangfe1033{\fonttbl{\f0\froman\fprq2\fcharset0 Cambria;}{\f1\fswiss\fprq2\fcharset0 Arial;}{\f2\fnil\fcharset2 Symbol;}} -{\colortbl ;\red0\green0\blue255;} -{\*\listtable -{\list\listhybrid -{\listlevel\levelnfc23\leveljc0\levelstartat1{\leveltext\'01\'B7;}{\levelnumbers;}\f2\jclisttab\tx0} -{\listlevel\levelnfc23\leveljc0\levelstartat1{\leveltext\'01\'B7;}{\levelnumbers;}\f2\jclisttab\tx0}\listid1 }} -{\*\listoverridetable{\listoverride\listid1\listoverridecount0\ls1}} -{\stylesheet{ Normal;}{\s1 heading 1;}{\s2 heading 2;}} -{\*\generator Riched20 10.0.17134}{\*\mmathPr\mnaryLim0\mdispDef1\mwrapIndent1440 }\viewkind4\uc1 -\pard\keepn\widctlpar\s1\sb240\sa60\sl276\slmult1\kerning32\b\f0\fs32 Localization of Open-Shell\par - -\pard\nowidctlpar\kerning0\b0\f1\fs20\par -This file explains the localization system used by Open-Shell and how to translate Open-Shell in new languages.\par -\par - -\pard\keepn\widctlpar\s2\sb240\sa60\sl276\slmult1\b\i\f0\fs28 1. What can be localized\par - -\pard\nowidctlpar\b0\i0\f1\fs20\par -Open-Shell has 2 major systems for providing localized text.\par -\par -The first one is the L10N.ini files. There are 3 files \endash ExplorerL10N.ini, StartMenuL10N.ini and StartMenuHelperL10N.ini. They contain translations for the text in Explorer and the start menu that users will encounter during normal use. These files contain translations for all of the 35 supported languages. Each language is separated in its own section. You will generally not need to edit these files unless you find a typo. If you do, please send the correction to {{\field{\*\fldinst{HYPERLINK "mailto:classicshell@ibeltchev.com" }}{\fldrslt{\ul\cf1\cf1\ul classicshell@ibeltchev.com}}}}\f1\fs20 , so I can fix the typo in the next release.\par -\par -The second system is for localizing the settings UI and the system messages that Open-Shell displays. The translations are packaged into a resource DLL with the name of the language \endash en-US.dll, ja-JP.dll, etc. The DLL can contain:\par - -\pard{\pntext\f2\'B7\tab}{\*\pn\pnlvlblt\pnf2\pnindent0{\pntxtb\'B7}}\nowidctlpar\fi-360\li720 A string table with replacement strings\par -{\pntext\f2\'B7\tab}Dialog resources for the Settings UI\par -{\pntext\f2\'B7\tab}Overrides for text lines in the L10N.ini files\par - -\pard\nowidctlpar\par -The same DLL contains resources for all of the Open-Shell components \endash Classic Explorer, Open-Shell Menu, etc. Generally resources from 2000 to 3000 belong to Classic Explorer, from 3000 to 4000 belong to Open-Shell Menu, from 5000 to 6000 belong to Classic IE, 6000 to 7000 belong to the updater component and from 4000 to 5000 are shared by all components.\par -\par - -\pard\keepn\widctlpar\s2\sb240\sa60\sl276\slmult1\b\i\f0\fs28 2. What else can be localized (if you really want to)\par - -\pard\nowidctlpar\b0\i0\f1\fs20\par -Open-Shell is designed to mainly support localizations for the UI. Localizations for other areas, like the installer and the documentation will require more work.\par -\par -To translate the installer you need to translate the OpenShellText-en-US.wxl file. It contain the text for the installer. One benefit of translating the installer is that you can localize the names of the shortcuts in the Start menu. You also need to translate the OpenShellReadme.rtf file and OpenShellEULA.rtf if you want them to display in your language.\par -\par -To translate the help file you will need to translate the HTML files included in OpenShellLoc.zip. If you install the tool HTML Help Workshop from Microsoft, you will be able to also compile the CHM file and preview it yourself. Use the OpenShell.hhp help project file for that.\par -\par -To translate the group policies you will need to translate the files ClassicExplorerADMX.txt, ClassicIEADMX.txt, OpenShellADMX.txt and MenuADMX.txt. You may also translate the PolicyDefinitions.rtf file.\par -\par -When you are done, send all translations to me and I will prepare an installer for your language. \par -\par -\par - -\pard\keepn\widctlpar\s2\sb240\sa60\sl276\slmult1\b\i\f0\fs28 3. The DLL structure in detail\par - -\pard\nowidctlpar\b0\i0\f1\fs20\par -Look at the provided \b en-US.dll\b0 file. It contains all English resources that can be translated.\par -\b\i Note:\b0 Open-Shell doesn\rquote t need the en-US.dll file. The English text is already built-in. The purpose of the en-US.dll file is to serve as an example and starting point for other languages.\par -\i0\par -The localization DLL contains the following resources:\par -\par - -\pard{\pntext\f2\'B7\tab}{\*\pn\pnlvlblt\pnf2\pnindent0{\pntxtb\'B7}}\nowidctlpar\fi-360\li720 A version resource. It must match the version of Open-Shell it is intended to be used with. The reason is that the text often changes between versions, so translations from one version will not work with the next. You may also use the comments section to list your name as the author.\par - -\pard\nowidctlpar\li720\par - -\pard{\pntext\f2\'B7\tab}{\*\pn\pnlvlblt\pnf2\pnindent0{\pntxtb\'B7}}\nowidctlpar\fi-360\li720 A string table. Provides translations for the UI text in Open-Shell. Use the text from en-US.dll as a source. The string table doesn\rquote t need to include all strings. If a string is missing, it will stay in English.\line\par -{\pntext\f2\'B7\tab}A set of dialog resources. These are the dialog boxes that the Settings UI needs. You can replace the text in the dialogs with your own. You can also resize some of the dialog elements to make the text fit. Like with the strings, if a dialog is missing from the DLL, the English version will be used.\line\par -{\pntext\f2\'B7\tab}A L10N resource (its resource ID must be 1). This is a UTF-16 text file that contains replacement strings for the ini files. For example the ini files do not have the text \ldblquote Settings for Open-Shell Menu\rdblquote translated in all languages (since I don\rquote t know how to say it in all 35 languages). So the DLL can provide the translations for the current language. It is possible to replace even text that is already translated \endash for example if you want to fix a typo in the ini file, or to provide a better version of some text line.\line\par - -\pard\widctlpar\sa200\sl276\slmult1 You can edit a DLL using a resource editor like Visual Studio, Res Hacker, and many others.\par - -\pard\keepn\widctlpar\s2\sb240\sa60\sl276\slmult1\b\i\f0\fs28 4. What if I don\rquote t know how to edit DLLs?\par - -\pard\nowidctlpar\b0\i0\f1\fs20\par -Look at the provided \b en-US.csv\b0 file. It is a tab-separated file in UTF-16 format. You can open it in Excel or any compatible editor. The file contains 4 columns:\par - -\pard -{\listtext\f1\u10625?\tab}\ls1\nowidctlpar\fi-360\li720\b ID\b0 \endash this is the identifier of the text line. There are 3 types of IDs:\par - -\pard -{\listtext\f1\u10625?\tab}\ls1\ilvl1\nowidctlpar\fi-360\li1440 A number, like 2001, 4030, etc. These correspond to the strings in the string table\par -{\listtext\f1 1\tab}A pair of numbers, like 3002/1025. These correspond to strings found in the dialog boxes. The first number is the ID of the dialog, and the second is the ID of the control in that dialog\par -{\listtext\f1 2\tab}Text, like \ldblquote Menu.SettingsTip\rdblquote . These correspond to the lines of the L10N resource\par - -\pard\nowidctlpar\li720\par - -\pard{\pntext\f2\'B7\tab}{\*\pn\pnlvlblt\pnf2\pnindent0{\pntxtb\'B7}}\nowidctlpar\fi-360\li720\b English\b0 \endash this is the original English text\par - -\pard\nowidctlpar\li720\par - -\pard{\pntext\f2\'B7\tab}{\*\pn\pnlvlblt\pnf2\pnindent0{\pntxtb\'B7}}\nowidctlpar\fi-360\li720\b Translation\b0 \endash this column is empty. That\rquote s where you will have to enter the translations for your language\line\par -{\pntext\f2\'B7\tab}\b Comment\b0 \endash some lines contain hints for the meaning of the translation, or instructions for providing better translation. If you are still unclear about something, ask me. I will provide more comments in future versions based on which text lines people find confusing\par - -\pard\nowidctlpar\par -\par -Once you are done, send the CSV file to {{\field{\*\fldinst{HYPERLINK "mailto:classicshell@ibeltchev.com" }}{\fldrslt{\ul\cf1\cf1\ul classicshell@ibeltchev.com}}}}\f1\fs20 and I will convert that text into a DLL and upload it to the Open-Shell website.\par -\par - -\pard\keepn\widctlpar\s2\sb240\sa60\sl276\slmult1\b\i\f0\fs28 5. Special characters\par - -\pard\nowidctlpar\b0\i0\f1\fs20\par -Some text lines in the DLL or the CSV contain special characters. They are:\par -\b\\t\b0 \endash this is the Tab character. Do not enter an actual tab in the text, because the CSVs don\rquote t handle it well\par -\b\\r\b0 \endash this is a carriage return character\par -\b\\n\b0 \endash this is a new line character\par -\b\\\\\b0 - this is the backslash character. You must use \\\\ instead of \\, because a single \\ can be mistaken for a special character\par -\b %d\b0 \endash this is a placeholder for a number. The actual number will be provided at run-time\par -\b %s\b0 \endash this is a placeholder for a string. The actual string will be provided at run-time\par -\par -In general, try to keep the special characters as they are.\par -\par -} - diff --git a/Localization/English/Main.html b/Localization/English/Main.html deleted file mode 100644 index ce136c631..000000000 --- a/Localization/English/Main.html +++ /dev/null @@ -1,49 +0,0 @@ - - - - - - - - - - - Open-Shell - -

Open-Shell website  Open-Shell

-Version 4.3.1 – general release

-

What is Open-Shell?

-Open-Shell™ is a collection of usability enhancement for Windows. It -has a customizable Start menu and Start button, it adds a -toolbar for Windows Explorer and supports a variety of smaller features.
-
-
-

System Requirements

-Open-Shell works on Windows 7, Windows 8, Windows 8.1, Windows Server 2008 R2, -Windows Server 2012 and Windows Server 2012 R2. Both 32 and 64-bit versions are -supported (the same installer works for both). Some skins for the start menu -require Aero theme to be enabled. Others require at least Basic theme.
-
-
-

Components


- -Open-Shell has three major components: -
-

Uninstallation

-You can uninstall Open-Shell from Control Panel -> Programs and Features. Another way is  to run the setup again and chose "Remove".
-A logoff may be required to complete the process.
-
- diff --git a/Localization/English/Menu.html b/Localization/English/Menu.html deleted file mode 100644 index 6de14d3ac..000000000 --- a/Localization/English/Menu.html +++ /dev/null @@ -1,349 +0,0 @@ - - - - - - - - - - - - Open-Shell Menu - -

Open-Shell website  -Open-Shell Menu


-Open-Shell Menu
-is a flexible start menu that can mimic the menu behavior of Windows -2000, XP and Windows 7. It has a variety of advanced features: -
    - -
  • Choose between “Classic” and “Windows 7” styles
    -
  • -
  • Drag and drop to let you organize your applications
  • - -
  • Options to show Favorites, expand Control Panel, etc
  • -
  • Shows recently used documents. The number of documents to display -is customizable
  • -
  • Translated in 35 languages, including Right-to-left support for -Arabic and Hebrew
  • -
  • Does not disable the original start menu in Windows. You can -access it by Shift+Click on the start button
  • -
  • Right-click on an item in the menu to delete, rename, sort, or -perform other tasks
  • -
  • The search box helps you find your programs and files without getting in the way of your keyboard shortcuts
  • -
  • Supports jumplists for easy access to recent documents and common tasks
  • -
  • Available for 32 and 64-bit operating systems
  • -
  • Has support for skins, including additional 3rd party skins. Make your own!
  • -
  • Fully customizable in both looks and functionality
  • -
  • Support for Microsoft’s Active Accessibility
  • -
  • Converts the “All Programs” button in the Windows menu into a cascading menu
  • -
  • Implements a customizable start button
    -
  • -
  • Can show, search and launch Windows Store apps (Windows 8)
  • - - - - -
  • And last but not least – it's FREE!
  • -

-

Styles

-The start menu offers 3 styles to choose from.
-

1) Single-column classic style

-
-This style is similar to the menu found in Windows 2000. It has one -column in the main menu with vertical text on the side. you can -customize the order of items, icons and text.
- -Programs, jumplists and search results show as cascading sub-menus.
- -
-

2) Two-column classic style

-
-This style is similar to the Windows XP menu. There are two columns -where you can arrange your menu items. Customize the order, icons and -text.
-Programs, jumplists and search results show as cascading sub-menus.
-
-

3) Windows 7 style
-

-
-This style is similar to the Windows Vista and Windows 7 menu. The -items in the first column are pre-defined to pinned and recent -programs, all programs list and search box. The items in the second -column are fully customizable.
-The jumplists and search results show inside the main menu. The -programs can be inside the main menu or open as a cascading sub-menu.
-This style offers less customizing options than the classic styles, but -has look and feel more familiar to people used to Windows 7.
-
-
-

Operation

-If you have used the start menu in older versions of Windows you’ll -feel right at home:
- - - -

-Press the Windows key or click on the orb in the corner of the -screen to open the start menu.

-

-Hold down Shift while clicking on the orb to access the operating -system's own -start menu. -

-

-Click on an item to execute it. -

-

-Drag a program to change the order of the programs in a menu, or to -move it to another folder. -

-

-Right-click on an item to rename it, delete it, explore it, sort the -menu, or perform other tasks.

-

-Right-click on the orb to edit the settings for the start menu, to view this help file, or to -stop the start menu.
-

-


- -

- -

-Settings

Right-click on the start button to access the settings:
-
-
-You can choose from seeing only the basic settings, or all available -settings. Hover over each setting to see a description of what it's for. Type in the search box to find a setting by name.
- -Every setting has a default value. The default value can be constant, -or it may depend on the current system settings. Once you edit a -setting it becomes "modified" and is shown in bold. To revert to the -default value, right-click on the setting.
-
- -You can save the settings to an XML file, and later load them back. -Press the Backup button to access these functions. From there you can -also reset all settings to their default value.
- - -
- -Most settings will be changed immediately as you edit them. For example -you can edit the start menu, then while the Settings dialog is open, -access the start menu to see the changes. Small number of settings will -require you to exit the start menu before you can see the change.
- -
- - -Note: All Settings windows are resizable. Resize them and place them where you want them to be. They will remember the new position.
- - -
-Click on the Customize Start Menu tab to customize the menu items. Depending on the style you will see different UI.
-
-For classic styles you can customize both columns of the start menu and -create sub-menus. The left column shows the current items in the menu -and the right column shows the available menu items. Drag from the -right to the left to add items to the menu.
-
-
-For the Windows 7 style you can only edit the items for the second column and there are no sub-menus.
-
-

-Double-click on the icon to edit the item properties:
-
-Here you can select a command for the item, its text, icon and other attributes. Press the Restore Defaults button to get the default text and icon for the chosen command.
-
-The command can be:
- -
    -
  • one of the predefined commands - from the dropdown
  • custom executable string -- this can be a name of a program and its arguments, or even a URL -(like http://www.google.com). Environment variables like %SystemRoot% are supported
  • left blank - then if the link attribute is used, it will act as a command
    -
  • -
-The link can be a path to a file or a folder. If it is a file, that -file will be executed. If it is a folder, that folder will be opened as -a sub-menu. Some menu items (like Programs and Favorites) have an implicit -link attribute, so for them the Link box will be disabled.
- -
- -The icon can be:
- -
    -
  • left blank - then if the link attribute points to a file or a folder, the icon of that file or folder will be used
    -
  • resource file,icon ID - for example %windir%\notepad.exe,2. Do not leave space between the file name and the comma. Make sure you are using the icon's resource ID, and not the icon's index. For best results use the [...] button next to the icon box
    -
  • ,icon ID - same as above, but the resource file is the MenuDLL.dll itself. This is useful when referring to the start menu's own icons
    -
  • icon file -  for example C:\Program Files\Mozilla Thunderbird\Email.ico
  • none - this will use a blank icon
  • -
-If the label or the tip attribute start with $ (dollar sign), then the system will treat it as a name of a string in the StartMenuL10N.ini -file. The actual text will depend on the current language setting. This -is useful when creating a menu that can be used by multiple languages.
-
-If you check "Insert Sub-items as Buttons", instead of showing the menu -item itself, the start menu will show the sub-items as a row of -buttons. By default the buttons are centered. You can align them to the -left by adding a separator as the last item, or align them to the right -by adding a separator as the first item. One possible use is to replace -the shutdown menu item with -separate buttons for shutdown, restart, log off, etc.
-
-

Administrative Settings

-The settings are -per user and are stored in the registry. By default every user can edit -all of their settings. An administrator can lock specific settings, so -no user can edit them:
- -
-In this example the setting "Enable right-click menu" is locked to always -be unchecked and can't be changed by any user. This is achieved -by adding the setting to the HKEY_LOCAL_MACHINE\SOFTWARE\OpenShell\Menu registry key. Create a DWORD value called "EnableContextMenu" and set it to 0.
-
-In some cases you may not want to lock the value for all users, but -simply modify the initial value of the setting. In such case add -"_Default" to the name of the value. For example if you want to context -menu to be disabled by default but still allow the users to enable it -if they wish, create a DWORD value named "EnableContextMenu_Default" -and set it to 0.
-
-The easiest way to know the registry name of a setting and its value is to modify it, and then look it up in HKEY_CURRENT_USER\Software\OpenShell\StartMenu\Settings.
- -Sometimes you may want to lock a setting to its default value, but you -don't know what the default value is. Then create a DWORD value and set -it to 0xDEFA.
- -
- -There is also a global setting "EnableSettings". Set it to 0 in the -registry to prevent the users from even opening the Settings dialog:
- -
-
-The start menu also checks most of the group policies set by the administrator. Run gpedit.msc and go to User Configuration -> Administrative Templates -> Start Menu and Taskbar. From there you can disable Run, Shutdown, Help, and other features. (Not available on Home versions of Windows).
-
-Editing the settings through group policies is also supported. Extract the file PolicyDefinitions.zip found in the installation folder and read the document PolicyDefinitions.rtf for more details.
-
-
-

More About Skins

-You can pick from the many pre-installed skins:
-
-Skins for Open-Shell Menu
-
Or you can download and install additional 3rd party skins (from -the main website or from another place). After you download a new skin -you -must copy the .skin file to the Skins directory – usually C:\Program -Files\Open-Shell\Skins. After that it will be available in the settings.
-
-Note: Some skins may be specifically designed for -Classic, Basic, or Aero mode. For example an Aero skin may require -glass support any will look weird if the Classic or Basic theme is -selected. Some Aero skins may also require specific glass color to be -selected.
-
-You can create your own skin. You will need an image editor that -supports alpha channel (like Gimp or Photoshop) and a tool to edit -resource files (like Resource Hacker or Visual Studio). And of course -some talent for graphical design :). Read the Skinning Tutorial before you begin.
-
-

-

Search


-
- The search box lets you search the contents of the start menu, the -programs in the PATH environment variable and the indexed files. You can have the search box -appear as a normal menu item and then you can get to it using the -up/down arrow keys. You can choose to have the search box selected by -default when you open the start menu. Or you can choose to activate the -search box only with the Tab key, so until you press Tab you can use -the keyboard for navigation as if the search box is not there.
-
-The search results show in the main menu if you are using the Windows 7 style or in a sub-menu for the classic styles.
-Click on each category to expand it and see more results. Click on the icon at the end to view all results in Explorer.
-
-The classic styles allow you to register additional "search providers", which you can use to -search for the text from the search box. You run the search program -either by selecting it from the menu, or by -pressing Alt+key. In this example use Alt+A for Agent Ransack.
-
-
-This is done by adding sub-items of the SearchBoxItem in the Customize Start Menu tab:
-
-
-Open each of the sub-items and enter a command to start the search program. If you use %1 in the command, it will be replaced by the contents of the search box. If you use %2 -it will be replaced by the url-style encoded search text. Enter a -label, tip, and icon to complete your menu entry. In the label text you -can use & to mark the accelerator character (for example &Agent Ransack).
-
-Here are a few possible commands:
-Search with Agent Ransack: "C:\Program Files\Agent Ransack\AgentRansack.exe" -r -f "%1"
-Search with Everything: "C:\Program Files\Everything\Everything.exe" -search "%1"
-Search with Google: http://www.google.com/#q=%2
-Search with Bing: http://www.bing.com/search?q=%2
-
-
-

Custom Start Button
-

Open-Shell can add its own start button to the taskbar. It can -even replace the default start button in Windows 7. You can choose from -an Aero-style orb, a rectangular classic button, or -you can make your own. For a custom start button you need an image that -contain the 3 states of the button - normal, hot and pressed:
-Start button images
-The image must be a 32-bit PNG or BMP. By default the width of the -image determines the size of the button. You can override that by -entering a custom width.
-Read the Button Tutorial for more information about creating custom buttons.
-You can find many custom start button images online. Here are few examples:
-http://www.classicshell.net/forum/viewforum.php?f=18
-http://www.sevenforums.com/themes-styles/34951-custom-start-menu-button-collection.html
-
http://www.sevenforums.com/customization/78291-big-group-custom-start-orbs.html
-http://tutoriales13.deviantart.com/art/Orbs-153450418
-
-
-

Localization

- -The user interface (except the Settings dialog box) is localized in 35 -languages.
- -The Settings dialog box is translated in a smaller number of languages. -The default installation contains only English. More languages can be -downloaded from the translations page. Make sure you download the translation package for the exact version of Open-Shell.
- - -
-

Command Line

-The StartMenu.exe supports 5 command line parameters: -open, -toggle, -togglenew, -exit and -settings.
-
-The first two do what the name suggests. One opens the classic start menu, the other -toggles it. You can use the parameters to create a shortcut in your -QuickLaunch bar that opens the start menu. Or to set a hotkey in -programs such as WinKey.
-
-The third one "-togglenew" toggles the default Windows start menu (or start screen). It is useful if -you want to create a shortcut or a hotkey to open the default menu and use the Win -key for the classic menu.
-
-Use "-exit" to exit the start menu. This command will only work if the start menu is not currently busy.
-
-Use "-settings" to open the start menu settings. This is useful for creating a shortcut for editing the settings.
-
-
-

Accessibility

The start menu supports screen readers like JAWS, -or Microsoft's Narrator. If the accessibility support causes problems it can be disabled from the General Behavior tab of the Settings.
- -
- diff --git a/Localization/English/MenuADMX.txt b/Localization/English/MenuADMX.txt deleted file mode 100644 index 712f70eaf..000000000 --- a/Localization/English/MenuADMX.txt +++ /dev/null @@ -1,192 +0,0 @@ -; DON'T TRANSLATE ============================================================= - -; disabled -CrashDump.supportedOn = never -LogLevel.supportedOn = never -OldProgramsAge.supportedOn = never -DefaultMenuStyle.supportedOn = never -MenuItems.supportedOn = never -Skin1.supportedOn = never -SkinOptions1.supportedOn = never -SkinVariation1.supportedOn = never -Skin2.supportedOn = never -SkinVariation2.supportedOn = never -SkinOptions2.supportedOn = never -SkipMetroCount.supportedOn = never -CompatibilityFixes.supportedOn = never - -; skins -SkinC1.supportedOn = classic1 -SkinVariationC1.supportedOn = classic1 -SkinOptionsC1.supportedOn = classic1 -MenuItems1.supportedOn = classic1 -SkinC2.supportedOn = classic2 -SkinVariationC2.supportedOn = classic2 -SkinOptionsC2.supportedOn = classic2 -MenuItems2.supportedOn = classic2 -SkinW7.supportedOn = win7_style -SkinVariationW7.supportedOn = win7_style -SkinOptionsW7.supportedOn = win7_style -MenuItems7.supportedOn = win7_style - -; style-specific -Computer.supportedOn = classic -Favorites.supportedOn = classic -Documents.supportedOn = classic -UserFiles.supportedOn = classic -UserDocuments.supportedOn = classic -UserPictures.supportedOn = classic -ControlPanel.supportedOn = classic -Network.supportedOn = classic -Printers.supportedOn = classic -Shutdown.supportedOn = classic -LogOff.supportedOn = classic -Undock.supportedOn = classic -Search.supportedOn = classic -Help.supportedOn = classic -Run.supportedOn = classic -SearchFilesCommand.supportedOn = classic -SearchResults.supportedOn = classic -SearchResultsMax.supportedOn = classic -MaxMainMenuWidth.supportedOn = classic -MainMenuAnimation.supportedOn = classic -MainMenuAnimationSpeed.supportedOn = classic -MainMenuScrollSpeed.supportedOn = classic -MenuCaption.supportedOn = classic -MenuUsername.supportedOn = classic -ShutdownCommand.supportedOn = win7_style -MinMainHeight.supportedOn = win7_style -ProgramsStyle.supportedOn = win7_style -FoldersFirst.supportedOn = win7_style -OpenPrograms.supportedOn = win7_style -ProgramsMenuDelay.supportedOn = win7_style -ShutdownW7.supportedOn = win7_style -ProgramsWidth.supportedOn = win7_style -JumplistWidth.supportedOn = win7_style - -; windows 7 -CascadeAll.supportedOn = win7 -AllProgramsDelay.supportedOn = win7 -InitiallySelect.supportedOn = win7 -HideUserPic.supportedOn = win7 -SkinA.supportedOn = win7 -SkinVariationA.supportedOn = win7 -SkinOptionsA.supportedOn = win7 - -; metro settings -AllTaskbars.supportedOn = win881 -AllProgramsMetro.supportedOn = win881 -HideProgramsMetro.supportedOn = win881 -RecentMetroApps.supportedOn = win881 -StartScreenShortcut.supportedOn = win881 -SearchMetroApps.supportedOn = win881 -DisableHotCorner.supportedOn = win881 -OpenMouseMonitor.supportedOn = win881 -SkipMetro.supportedOn = win8 - - - -; TRANSLATE =================================================================== - - -Title.text = Open-Shell settings -State.text = State: -State1.text = Locked to this value -State2.text = Locked to default -State3.text = Unlocked -State1Help.text = If you set the state to 'Locked to this value', the setting will be locked to the specified value for all users. -State2Help.text = If you set the state to 'Locked to default', the setting will be locked to the default value for all users. The specified value is ignored. -State3Help.text = If you set the state to 'Unlocked', the default value for the setting will be changed to the specified value. Individual users can override the setting. - -MenuCat.text = Open-Shell Menu -MenuCatHelp.text = Open-Shell Menu group policy settings -SUPPORTED_CS404.text = Requires Open-Shell 4.0.4 or later. -SUPPORTED_CS404_WIN7.text = Requires Windows 7. -SUPPORTED_CS404_WIN78.text = Requires Windows 7 or Windows 8. -SUPPORTED_CS404_WIN781.text = Requires Windows 7 or Windows 8.1. -SUPPORTED_CS404_WIN8.text = Requires Windows 8. -SUPPORTED_CS404_WIN881.text = Requires Windows 8 or Windows 8.1. -SUPPORTED_CS404_WIN81.text = Requires Windows 8.1. -SUPPORTED_CS404_CLASSIC1_STYLE.text = Requires Classic menu style with one column. -SUPPORTED_CS404_CLASSIC2_STYLE.text = Requires Classic menu style with two columns. -SUPPORTED_CS404_CLASSIC_STYLE.text = Requires Classic menu style. -SUPPORTED_CS404_WIN7_STYLE.text = Requires Windows 7 menu style. - - -EnableSettings.nameOverride = Enable settings -EnableSettings.tipOverride = Enables the users to edit their own settings - -MenuStyle.nameOverride = Menu style -MenuStyle.tipOverride = Select the style for the start menu.\nThe style determines the overall look and functionality of the menu. -MenuStyle_Classic1.nameOverride = Classic with one column -MenuStyle_Classic2.nameOverride = Classic with two columns -MenuStyle_Win7.nameOverride = Windows 7 - -MouseClick.nameOverride = Left Click opens -ShiftClick.nameOverride = Shift+Click opens -WinKey.nameOverride = Windows Key opens -ShiftWin.nameOverride = Shift+Win opens -MiddleClick.nameOverride = Middle Click opens -Hover.nameOverride = Hover opens - -; skins -SkinC1.nameOverride = Skin for classic menu with one column -SkinC1.tipOverride = Select the skin to be used by the classic style with one column -SkinVariationC1.nameOverride = Skin variation for classic menu with one column -SkinVariationC1.tipOverride = Select the skin variation to be used by the classic style with one column (for skins that support multiple variations) -SkinOptionsC1.nameOverride = Skin options for classic menu with one column -SkinOptionsC1.tipOverride = Select the skin options to be used by the classic style with one column.\nThe options are a list of hex numbers. The best way to get them is to adjust the options in the Open-Shell Menu settings dialog and then look up the value named SkinOptionsC1 in HKCU\Software\OpenShell\StartMenu\Settings -MenuItems1.nameOverride = Menu items for classic menu with one column -MenuItems1.tipOverride = Select the menu items to be used by the classic style with one column.\nThe best way to get the right string is to configure the items in the Open-Shell Menu settings dialog and then look up the value named MenuItems1 in HKCU\Software\OpenShell\StartMenu\Settings -SkinC2.nameOverride = Skin for classic menu with two columns -SkinC2.tipOverride = Select the skin to be used by the classic style with two columns -SkinVariationC2.nameOverride = Skin variation for classic menu with two columns -SkinVariationC2.tipOverride = Select the skin variation to be used by the classic style with two columns (for skins that support multiple variations) -SkinOptionsC2.nameOverride = Skin options for classic menu with two columns -SkinOptionsC2.tipOverride = Select the skin options to be used by the classic style with two columns.\nThe options are a list of hex numbers. The best way to get them is to adjust the options in the Open-Shell Menu settings dialog and then look up the value named SkinOptionsC2 in HKCU\Software\OpenShell\StartMenu\Settings -MenuItems2.nameOverride = Menu items for classic menu with two columns -MenuItems2.tipOverride = Select the menu items to be used by the classic style with two columns.\nThe best way to get the right string is to configure the items in the Open-Shell Menu settings dialog and then look up the value named MenuItems2 in HKCU\Software\OpenShell\StartMenu\Settings -SkinW7.nameOverride = Skin for the Windows 7 style -SkinW7.tipOverride = Select the skin to be used by the Windows 7 style -SkinVariationW7.nameOverride = Skin variation for the Windows 7 style -SkinVariationW7.tipOverride = Select the skin variation to be used by the Windows 7 style (for skins that support multiple variations) -SkinOptionsW7.nameOverride = Skin options for the Windows 7 style -SkinOptionsW7.tipOverride = Select the skin options to be used by the Windows 7 style.\nThe options are a list of hex numbers. The best way to get them is to adjust the options in the Open-Shell Menu settings dialog and then look up the value named SkinOptionsW7 in HKCU\Software\OpenShell\StartMenu\Settings -MenuItems7.nameOverride = Menu items for the Windows 7 style -MenuItems7.tipOverride = Select the menu items to be used by the Windows 7 style.\nThe best way to get the right string is to configure the items in the Open-Shell Menu settings dialog and then look up the value named MenuItems7 in HKCU\Software\OpenShell\StartMenu\Settings - -; windows 7 -SkinA.nameOverride = Skin for the All Programs sub-menu for the Windows 7 start menu -SkinA.tipOverride = Select the skin to be used by the All Programs sub-menu for the Windows 7 start menu -SkinVariationA.nameOverride = Skin variation for the All Programs sub-menu for the Windows 7 start menu -SkinVariationA.tipOverride = Select the skin variation to be used by the All Programs sub-menu for the Windows 7 start menu (for skins that support multiple variations) -SkinOptionsA.nameOverride = Skin options for the All Programs sub-menu for the Windows 7 start menu -SkinOptionsA.tipOverride = Select the skin options to be used by the All Programs sub-menu for the Windows 7 start menu.\nThe options are a list of hex numbers. The best way to get them is to adjust the options in the Open-Shell Menu settings dialog and then look up the value named SkinOptionsA in HKCU\Software\OpenShell\StartMenu\Settings - -; metro settings -SkipMetro.tipAddition = This setting doesn't work for Windows 8.1. You need to use the built-in Windows setting for booting to Desktop - -; hidden -FolderStartMenu.nameOverride = Start Menu folder -FolderStartMenu.tipOverride = Enter an override for the per-user start menu folder (also overrides the per-user Programs folder).\nThe path can contain environment variables.\nNote: This setting is not editable from the Settings dialog -FolderPrograms.nameOverride = Programs folder -FolderPrograms.tipOverride = Enter an override for the per-user Programs folder.\nThe path can contain environment variables.\nNote: This setting is not editable from the Settings dialog -FolderCommonStartMenu.nameOverride = Common Start Menu folder -FolderCommonStartMenu.tipOverride = Enter an override for the common start menu folder (also overrides the common Programs folder).\nThe path can contain environment variables.\nNote: This setting is not editable from the Settings dialog -FolderCommonPrograms.nameOverride = Common Programs folder -FolderCommonPrograms.tipOverride = Enter an override for the common Programs folder.\nThe path can contain environment variables.\nNote: This setting is not editable from the Settings dialog -AutoStartDelay.nameOverride = Auto-start delay -AutoStartDelay.tipOverride = Enter a delay in ms when launching the start menu automatically during login (does not apply when starting the menu manually by running StartMenu.exe).\nNote: This setting is not editable from the Settings dialog - -; other -StartButtonIcon.tipAddition = The value can be a path to an ICO file or a path to an EXE/DLL and an the ID of the icon -StartButtonPath.tipAddition = The value is a full path to the BMP or PNG file -SoundMain.tipAddition = The value can be a name of a system event or a path to a WAV file -SoundPopup.tipAddition = The value can be a name of a system event or a path to a WAV file -SoundCommand.tipAddition = The value can be a name of a system event or a path to a WAV file -SoundDrop.tipAddition = The value can be a name of a system event or a path to a WAV file -ExpandFolderLinks.tipAddition = Only works for symbolic links (like junctions) and not for plain shortcuts -StartHoverDelay.nameOverride = Hover delay (for Start button) -AllProgramsDelay.nameOverride = Hover delay (for All Programs in Windows 7) -CSMHotkey.tipAddition = .\n\nThe base value is the main key's virtual code. Add 256 for Shift, 512 for Control and 1024 for Alt.\nThe best way to get the value is to select the hotkey in the Open-Shell Menu settings dialog and then look up the value named CSMHotkey in HKCU\Software\OpenShell\StartMenu\Settings -WSMHotkey.tipAddition = .\n\nThe base value is the main key's virtual code. Add 256 for Shift, 512 for Control and 1024 for Alt.\nThe best way to get the value is to select the hotkey in the Open-Shell Menu settings dialog and then look up the value named WSMHotkey in HKCU\Software\OpenShell\StartMenu\Settings diff --git a/Localization/English/OpenShell.hhp b/Localization/English/OpenShell.hhp deleted file mode 100644 index 323719722..000000000 --- a/Localization/English/OpenShell.hhp +++ /dev/null @@ -1,16 +0,0 @@ -[OPTIONS] -Compatibility=1.1 or later -Compiled file=OpenShell.chm -Contents file=OpenShellTOC.hhc -Default topic=Main.html -Display compile progress=Yes -Language=0x409 English (United States) - - -[FILES] -ClassicExplorer.html -Menu.html -ClassicIE.html - -[INFOTYPES] - diff --git a/Localization/English/OpenShellADMX.txt b/Localization/English/OpenShellADMX.txt deleted file mode 100644 index 9219b6f61..000000000 --- a/Localization/English/OpenShellADMX.txt +++ /dev/null @@ -1,19 +0,0 @@ -; TRANSLATE =================================================================== - -Title.text = Open-Shell settings -State.text = State: -State1.text = Locked to this value -State2.text = Locked to default -State3.text = Unlocked -State1Help.text = If you set the state to 'Locked to this value', the setting will be locked to the specified value for all users. -State2Help.text = If you set the state to 'Locked to default', the setting will be locked to the default value for all users. The specified value is ignored. -State3Help.text = If you set the state to 'Unlocked', the default value for the setting will be changed to the specified value. Individual users can override the setting. - -OpenShellCat.text = Open-Shell -OpenShellCatHelp.text = Open-Shell group policy settings -SUPPORTED_CS404.text = Requires Open-Shell 4.0.4 or later. - -Language.nameOverride = Language for Open-Shell components -Language.tipOverride = Select the language to be used by Open-Shell (for example en-US or de-DE). The language will affect the text in the start menu, toolbars, etc. If the appropriate language DLL is installed, the settings UI may also be translated -Update.nameOverride = Enable automatic checks for new versions -Update.tipOverride = When this is checked, Open-Shell will check for new releases every week. You will be notified if there is a new version of the Open-Shell software or a new update for your current language diff --git a/Localization/English/OpenShellEULA.rtf b/Localization/English/OpenShellEULA.rtf deleted file mode 100644 index c7cb5cc94..000000000 Binary files a/Localization/English/OpenShellEULA.rtf and /dev/null differ diff --git a/Localization/English/OpenShellReadme.rtf b/Localization/English/OpenShellReadme.rtf deleted file mode 100644 index de2d4e631..000000000 --- a/Localization/English/OpenShellReadme.rtf +++ /dev/null @@ -1,106 +0,0 @@ -{\rtf1\ansi\ansicpg1252\deff0\nouicompat\deflang1033\deflangfe1033{\fonttbl{\f0\froman\fprq2\fcharset0 Cambria;}{\f1\fswiss\fprq2\fcharset0 Calibri;}{\f2\fnil\fcharset2 Symbol;}} -{\colortbl ;\red23\green54\blue93;\red79\green129\blue189;\red0\green112\blue192;\red0\green0\blue255;\red54\green95\blue145;} -{\stylesheet{ Normal;}{\s1 heading 1;}} -{\*\generator Riched20 10.0.17134}{\*\mmathPr\mnaryLim0\mdispDef1\mwrapIndent1440 }\viewkind4\uc1 -\pard\brdrb\brdrs\brdrw20\brsp80 \widctlpar\sa300\qc\cf1\expndtw5\kerning28\f0\fs52 Open-Shell\par - -\pard\widctlpar\cf0\expndtw0\b0\i0\f1\fs22\par -Thank you for installing \cf3\b Open-Shell\'99\cf0\b0 . It adds some missing features to Windows 7, Windows 8, Windows 8.1 and Windows 10 - like a classic start menu, start button, a toolbar for Windows Explorer and others.\par -\par -The latest version can be found on the Open-Shell website:\par -{{\field{\*\fldinst{HYPERLINK http://www.classicshell.net/ }}{\fldrslt{http://www.classicshell.net/\ul0\cf0}}}}\f1\fs22\par -\par -For answers to frequently asked questions look here:\par -{{\field{\*\fldinst{HYPERLINK http://www.classicshell.net/faq/ }}{\fldrslt{http://www.classicshell.net/faq/\ul0\cf0}}}}\f1\fs22\par -\par -Or use the discussion forums to get help:\par -{{\field{\*\fldinst{HYPERLINK http://www.classicshell.net/forum/viewforum.php?f=6 }}{\fldrslt{http://www.classicshell.net/forum/viewforum.php?f=6\ul0\cf0}}}}\f1\fs22\par -\par -Report problems in the Open-Shell development forums:\par -{{\field{\*\fldinst{HYPERLINK http://www.classicshell.net/forum/viewforum.php?f=11 }}{\fldrslt{http://www.classicshell.net/forum/viewforum.php?f=11\ul0\cf0}}}}\f1\fs22\par -\par - -\pard\keep\keepn\widctlpar\s1\sb480\sl276\slmult1\cf5\b\f0\fs28 Open-Shell Menu\par - -\pard\widctlpar\cf0\b0\f1\fs22\par -\cf3\b Open-Shell Menu\cf0 \b0 is a flexible start menu that can mimic the menu behavior of Windows 2000, XP and Windows 7. It has a variety of advanced features:\par -\par - -\pard{\pntext\f2\'B7\tab}{\*\pn\pnlvlblt\pnf2\pnindent0{\pntxtb\'B7}}\widctlpar\fi-360\li720 Choose between \ldblquote Classic\rdblquote and \ldblquote Windows 7\rdblquote styles\par -{\pntext\f2\'B7\tab}Drag and drop to let you organize your applications\par -{\pntext\f2\'B7\tab}Options to show Favorites, expand Control Panel, etc\par -{\pntext\f2\'B7\tab}Shows recently used documents. The number of documents to display is customizable\par -{\pntext\f2\'B7\tab}Translated in 35 languages, including Right-to-left support for Arabic and Hebrew\par -{\pntext\f2\'B7\tab}Does not disable the original start menu in Windows. You can access it by Shift+Click on the start button\par -{\pntext\f2\'B7\tab}Right-click on an item in the menu to delete, rename, sort, or perform other tasks\par -{\pntext\f2\'B7\tab}The search box helps you find your programs and files without getting in the way of your keyboard shortcuts\par -{\pntext\f2\'B7\tab}Supports jumplists for easy access to recent documents and common tasks\par -{\pntext\f2\'B7\tab}Available for 32 and 64-bit operating systems\par -{\pntext\f2\'B7\tab}Has support for skins, including additional 3rd party skins. Make your own!\par -{\pntext\f2\'B7\tab}Fully customizable in both looks and functionality\par -{\pntext\f2\'B7\tab}Support for Microsoft\rquote s Active Accessibility\par -{\pntext\f2\'B7\tab}Converts the \ldblquote All Programs\rdblquote button in the Windows menu into a cascading menu\par -{\pntext\f2\'B7\tab}Implements a customizable start button\par -{\pntext\f2\'B7\tab}Can show, search and launch Windows Store apps (Windows 8)\par - -\pard\keep\keepn\widctlpar\s1\sb480\sl276\slmult1\cf5\b\f0\fs28 Classic Explorer\par - -\pard\widctlpar\cf0\b0\f1\fs22\par -\cf3\b Classic Explorer\cf0 \b0 is a plugin for Windows Explorer that:\par -\par - -\pard{\pntext\f2\'B7\tab}{\*\pn\pnlvlblt\pnf2\pnindent0{\pntxtb\'B7}}\widctlpar\fi-360\li720 Adds a toolbar to Explorer for some common operations (Go to parent folder, Cut, Copy, Paste, Delete, Properties, Email). The toolbar is fully customizable\par -{\pntext\f2\'B7\tab}Replaces the copy UI in Windows 7 with the more user-friendly \ldblquote classic\rdblquote version similar to Windows XP\par -{\pntext\f2\'B7\tab}Handles Alt+Enter in the folder panel of Windows Explorer and shows the properties of the selected folder\par -{\pntext\f2\'B7\tab}Has options for customizing the folder panel to look more like the Windows XP version or to not fade the expand buttons\par -{\pntext\f2\'B7\tab}Can show the free disk space and the total size of the selected files in the status bar\par -{\pntext\f2\'B7\tab}Can disable the breadcrumbs in the address bar\par -{\pntext\f2\'B7\tab}Fixes a long list of features that are broken in Windows 7 \endash missing icon overlay for shared folders, the jumping folders in the navigation pane, missing sorting headers in list view, and more\par - -\pard\keep\keepn\widctlpar\s1\sb480\sl276\slmult1\cf5\b\f0\fs28 Classic IE\par - -\pard\widctlpar\cf0\b0\f1\fs22\par -\cf3\b Classic IE is a plugin for Internet Explorer 9 and later versions that:\par -\cf0\b0\par - -\pard{\pntext\f2\'B7\tab}{\*\pn\pnlvlblt\pnf2\pnindent0{\pntxtb\'B7}}\widctlpar\fi-360\li720 Adds a caption to the title bar so you can see the full title of the page\par -{\pntext\f2\'B7\tab}Shows the security zone in the status bar\par -{\pntext\f2\'B7\tab}Shows the loading progress in the status bar\par - -\pard\keep\keepn\widctlpar\s1\sb480\sl276\slmult1\cf5\b\f0\fs28 Installation instructions\par - -\pard\widctlpar\cf0\b0\f1\fs22\par -The toolbar for Windows Explorer may not show up automatically after installation. You have to do a few things before you can use it.\par -\par -\cf3\b Windows 7:\cf0\b0 Press Alt+V to open the View menu. Open the \ldblquote Toolbars\rdblquote sub-menu and select \ldblquote Classic Exlporer Bar\rdblquote . Keep in mind that the menu will always be displayed as long as the toolbar is visible.\par -\par -\cf3\b Windows 8:\cf0\b0 Press Alt+V to open the View ribbon. Click on the down arrow in the \ldblquote Options\rdblquote section. Select \ldblquote Classic Explorer Bar\rdblquote\par -\par -If these steps don\rquote t work, it may be possible that the Explorer extensions have been disabled. Check the following, then try to show the toolbar again:\par - -\pard -{\pntext\f1 1)\tab}{\*\pn\pnlvlbody\pnf1\pnindent0\pnstart1\pndec{\pntxta)}} -\widctlpar\fi-360\li720 Open Internet Explorer and go to Tools -> Manage add-ons. Locate the add-ons \ldblquote Classic Explorer Bar\rdblquote and \ldblquote ExplorerBHO Class\rdblquote and make sure they are enabled.\par -{\pntext\f1 2)\tab}Maybe the browser extensions are disabled on your system. This is usually the default for Windows Server. Open the "Internet Options", go to the "Advanced" tab, and check the option "Enable third-party browser extensions".\par - -\pard\widctlpar\par -On Windows 7 you have to turn on the status bar from the View menu if you want to see the file sizes.\par -On Windows 8 the Classic Explorer status bar is different from the one in Explorer. You can show/hide the first one from the Classic Explorer settings dialog and show/hide the second one from Explorer\rquote s folder options dialog.\par -\par -The caption in Internet Explorer may not show up automatically after installation. You may get a prompt to enable the ClassicIEBHO plugin. If you get the prompt, select \ldblquote Enable\rdblquote . If you don\rquote t get a prompt, go to Tools -> Manage add-ons and make sure the add-on \ldblquote ClassicIEBHO\rdblquote is enabled. After that restart Internet Explorer.\par - -\pard\keep\keepn\widctlpar\s1\sb480\sl276\slmult1\cf5\b\f0\fs28 Uninstallation\par - -\pard\widctlpar\cf0\b0\f1\fs22\par -To uninstall \cf3\b Open-Shell\cf0\b0 follow these steps:\par - -\pard -{\pntext\f1 1)\tab}{\*\pn\pnlvlbody\pnf1\pnindent0\pnstart1\pndec{\pntxta)}} -\widctlpar\fi-360\li720 Open \b Control Panel -> Programs and Features\b0 and double-click on \b Open-Shell\b0 . Then follow the instructions. You may have to restart Windows to complete the process.\par -{\pntext\f1 2)\tab}If you installed any additional skins for the start menu you will have to delete them manually\par - -\pard\widctlpar\par - -\pard\widctlpar\sa200\sl276\slmult1\par -} - diff --git a/Localization/English/OpenShellTOC.hhc b/Localization/English/OpenShellTOC.hhc deleted file mode 100644 index 9835e2363..000000000 --- a/Localization/English/OpenShellTOC.hhc +++ /dev/null @@ -1,138 +0,0 @@ - - - - - - - - - -
    -
  • - - - - -
  • - - - - -
      -
    • - - - -
    • - - - -
    • - - - - -
    • - - - - -
    • - - - -
    • - - - -
    • - - - -
    • - - - -
    • - - - -
    • - - - -
    -
  • - - - - -
      -
    • - - - -
    • - - - -
    • - - - -
    • - - - -
    • - - - -
    • - - - -
    • - - - -
    • - - - -
    • - - - -
    -
  • - - - - -
      -
    • - - - -
    • - - - -
    • - - - -
    -
  • - - - - -
  • - - - - -
- diff --git a/Localization/English/OpenShellText-en-US.wxl b/Localization/English/OpenShellText-en-US.wxl deleted file mode 100644 index dd4bc0213..000000000 --- a/Localization/English/OpenShellText-en-US.wxl +++ /dev/null @@ -1,33 +0,0 @@ - - - This installer is only for 32-bit version of Windows. For 64-bit Windows you need to run Setup64. - Open-Shell requires Windows 7 or above. - A newer version of [ProductName] is already installed. The setup will now exit. - Classic Explorer - Classic Explorer adds a toolbar to Windows Explorer, replaces the copy UI and fixes some usability problems - Open-Shell Menu - Open-Shell Menu is a highly customizable replacement for the Windows start menu - Classic IE - Classic IE lets you customize the title bar and the status bar of Internet Explorer - Open-Shell Update - Open-Shell Update checks periodically for new versions - View the Open-Shell documentation - View the Open-Shell introduction - Edit the settings of Classic Explorer - Edit the settings of the classic start menu - Edit the settings of the Internet Explorer title bar and status bar - Edit the settings for Open-Shell's new version check - Create a start menu folder - Open-Shell website - Donate to Open-Shell - Visit us on Facebook - View Readme file - Open-Shell Help - Open-Shell Readme - Open-Shell Update - Classic Explorer Settings - Open-Shell Menu Settings - Classic IE Settings - Open the Start screen - Open-Shell is a collection of usability enhancements for Windows - diff --git a/Localization/English/PolicyDefinitions.rtf b/Localization/English/PolicyDefinitions.rtf deleted file mode 100644 index e68967d15..000000000 Binary files a/Localization/English/PolicyDefinitions.rtf and /dev/null differ diff --git a/Localization/English/en-US.csv b/Localization/English/en-US.csv deleted file mode 100644 index cbea0935d..000000000 Binary files a/Localization/English/en-US.csv and /dev/null differ diff --git a/Localization/English/images/OpenShell.png b/Localization/English/images/OpenShell.png deleted file mode 100644 index 1c1786845..000000000 Binary files a/Localization/English/images/OpenShell.png and /dev/null differ diff --git a/Localization/English/images/acc_locked.png b/Localization/English/images/acc_locked.png deleted file mode 100644 index 0dd5dc9cf..000000000 Binary files a/Localization/English/images/acc_locked.png and /dev/null differ diff --git a/Localization/English/images/after.png b/Localization/English/images/after.png deleted file mode 100644 index bdb89f9e7..000000000 Binary files a/Localization/English/images/after.png and /dev/null differ diff --git a/Localization/English/images/before.png b/Localization/English/images/before.png deleted file mode 100644 index 62f32e903..000000000 Binary files a/Localization/English/images/before.png and /dev/null differ diff --git a/Localization/English/images/button_images.png b/Localization/English/images/button_images.png deleted file mode 100644 index e8bfa3225..000000000 Binary files a/Localization/English/images/button_images.png and /dev/null differ diff --git a/Localization/English/images/button_settings.png b/Localization/English/images/button_settings.png deleted file mode 100644 index 8dcb650f3..000000000 Binary files a/Localization/English/images/button_settings.png and /dev/null differ diff --git a/Localization/English/images/customize_menu.png b/Localization/English/images/customize_menu.png deleted file mode 100644 index ef06aab44..000000000 Binary files a/Localization/English/images/customize_menu.png and /dev/null differ diff --git a/Localization/English/images/explorer_settings.png b/Localization/English/images/explorer_settings.png deleted file mode 100644 index d1d2c15de..000000000 Binary files a/Localization/English/images/explorer_settings.png and /dev/null differ diff --git a/Localization/English/images/ie9_caption.png b/Localization/English/images/ie9_caption.png deleted file mode 100644 index 5d853f7a4..000000000 Binary files a/Localization/English/images/ie9_caption.png and /dev/null differ diff --git a/Localization/English/images/ie9_settings.png b/Localization/English/images/ie9_settings.png deleted file mode 100644 index 47342d5a6..000000000 Binary files a/Localization/English/images/ie9_settings.png and /dev/null differ diff --git a/Localization/English/images/ie9_status.png b/Localization/English/images/ie9_status.png deleted file mode 100644 index ebfb297e1..000000000 Binary files a/Localization/English/images/ie9_status.png and /dev/null differ diff --git a/Localization/English/images/item_settings.png b/Localization/English/images/item_settings.png deleted file mode 100644 index d978eb3d3..000000000 Binary files a/Localization/English/images/item_settings.png and /dev/null differ diff --git a/Localization/English/images/menu_settings.png b/Localization/English/images/menu_settings.png deleted file mode 100644 index 6d99c16b5..000000000 Binary files a/Localization/English/images/menu_settings.png and /dev/null differ diff --git a/Localization/English/images/search1.png b/Localization/English/images/search1.png deleted file mode 100644 index 9c3b5126c..000000000 Binary files a/Localization/English/images/search1.png and /dev/null differ diff --git a/Localization/English/images/search2.png b/Localization/English/images/search2.png deleted file mode 100644 index 049f69e79..000000000 Binary files a/Localization/English/images/search2.png and /dev/null differ diff --git a/Localization/English/images/search3.png b/Localization/English/images/search3.png deleted file mode 100644 index 9de67ebda..000000000 Binary files a/Localization/English/images/search3.png and /dev/null differ diff --git a/Localization/English/images/settings1.png b/Localization/English/images/settings1.png deleted file mode 100644 index fbbb6ffaa..000000000 Binary files a/Localization/English/images/settings1.png and /dev/null differ diff --git a/Localization/English/images/settings2.png b/Localization/English/images/settings2.png deleted file mode 100644 index 45c8d55be..000000000 Binary files a/Localization/English/images/settings2.png and /dev/null differ diff --git a/Localization/English/images/settings3.png b/Localization/English/images/settings3.png deleted file mode 100644 index c72ae673a..000000000 Binary files a/Localization/English/images/settings3.png and /dev/null differ diff --git a/Localization/English/images/settings4.png b/Localization/English/images/settings4.png deleted file mode 100644 index a2ebb4a16..000000000 Binary files a/Localization/English/images/settings4.png and /dev/null differ diff --git a/Localization/English/images/settings5.png b/Localization/English/images/settings5.png deleted file mode 100644 index f4b0c0c84..000000000 Binary files a/Localization/English/images/settings5.png and /dev/null differ diff --git a/Localization/English/images/settings_disable_ex.png b/Localization/English/images/settings_disable_ex.png deleted file mode 100644 index 4bb572d99..000000000 Binary files a/Localization/English/images/settings_disable_ex.png and /dev/null differ diff --git a/Localization/English/images/settings_disable_ie9.png b/Localization/English/images/settings_disable_ie9.png deleted file mode 100644 index 352b100e6..000000000 Binary files a/Localization/English/images/settings_disable_ie9.png and /dev/null differ diff --git a/Localization/English/images/settings_disable_sm.png b/Localization/English/images/settings_disable_sm.png deleted file mode 100644 index d65b65ab3..000000000 Binary files a/Localization/English/images/settings_disable_sm.png and /dev/null differ diff --git a/Localization/English/images/skins.gif b/Localization/English/images/skins.gif deleted file mode 100644 index c9a26cfe6..000000000 Binary files a/Localization/English/images/skins.gif and /dev/null differ diff --git a/Localization/English/images/statusbar.png b/Localization/English/images/statusbar.png deleted file mode 100644 index e9cfc0070..000000000 Binary files a/Localization/English/images/statusbar.png and /dev/null differ diff --git a/Localization/English/images/style1.png b/Localization/English/images/style1.png deleted file mode 100644 index 02cf5be40..000000000 Binary files a/Localization/English/images/style1.png and /dev/null differ diff --git a/Localization/English/images/style2.png b/Localization/English/images/style2.png deleted file mode 100644 index 9bbd1d146..000000000 Binary files a/Localization/English/images/style2.png and /dev/null differ diff --git a/Localization/English/images/style3.png b/Localization/English/images/style3.png deleted file mode 100644 index 67a4f0fc8..000000000 Binary files a/Localization/English/images/style3.png and /dev/null differ diff --git a/Localization/English/images/titlebar.png b/Localization/English/images/titlebar.png deleted file mode 100644 index bbad38bb3..000000000 Binary files a/Localization/English/images/titlebar.png and /dev/null differ diff --git a/Localization/English/images/toolbar.png b/Localization/English/images/toolbar.png deleted file mode 100644 index 7a23fbee3..000000000 Binary files a/Localization/English/images/toolbar.png and /dev/null differ diff --git a/Localization/English/images/toolbar_settings.png b/Localization/English/images/toolbar_settings.png deleted file mode 100644 index 93416f22a..000000000 Binary files a/Localization/English/images/toolbar_settings.png and /dev/null differ diff --git a/Localization/English/images/up_locked.png b/Localization/English/images/up_locked.png deleted file mode 100644 index e1284d868..000000000 Binary files a/Localization/English/images/up_locked.png and /dev/null differ diff --git a/Localization/ExplorerL10N.ini b/Localization/ExplorerL10N.ini deleted file mode 100644 index 5f64782fb..000000000 --- a/Localization/ExplorerL10N.ini +++ /dev/null @@ -1,2599 +0,0 @@ -; This file contains all localized text for Open-Shell. There is one section per language. -; Every section contains text lines in the form of = . -; Which section is used depends on the current OS setting. If a key is missing from the language section -; it will be searched in the [default] section. In some cases more than one language can be used. -; For example a Japanese system may use English as a secondary language. In that case the search order -; will be [ja-JP] -> [en-US] -> [default]. -; -; ============================================================================= - - -[default] -Toolbar.Settings = Classic Explorer Settings - - -[ar-SA] - Arabic (Saudi Arabia) -Copy.Cancel = إلغاء الأمر -Copy.More = المزيد... -Copy.CopyHere = ن&سخ إلى هذا الموضع -Copy.MoveHere = ن&قل إلى هذا الموضع -Copy.Title = تأكيد استبدال الملف -Copy.Subtitle = يحتوي هذا المجلد على ملف باسم '%s'. -Copy.SubtitleRO = يحتوي هذا المجلد على ملف للقراءة فقط باسم '‎%s'. -Copy.SubtitleSys = يحتوي هذا المجلد مسبقاً على ملف نظام باسم '‎%s'. -Copy.Prompt1 = ‏‏هل تريد استبدال الملف الموجود -Copy.Prompt2 = بهذا؟ -Copy.Yes = &نعم -Copy.No = &لا -Copy.YesAll = نعم لل&كل -Folder.Title = تأكيد استبدال المجلد -Folder.Prompt = هل ما زلت تريد نقل المجلد أو نسخه؟ -Toolbar.GoUp = مستوى واحد لأعلى -Toolbar.Cut = قص -Toolbar.Copy = نسخ -Toolbar.Paste = لصق -Toolbar.PasteShortcut = لصق الاختصار -Toolbar.Delete = حذف -Toolbar.Email = إرسال العناصر المحددة بالبريد الإلكتروني -Toolbar.Properties = خصائص -Toolbar.NewFolder = مجلد جديد -Toolbar.ZipFolder = مجلد جديد مضغوط -Toolbar.ExtraLarge = رموز كبيرة جداً -Toolbar.Large = رموز كبيرة -Toolbar.Medium = رموز متوسطة -Toolbar.Small = رموز صغيرة -Toolbar.List = قائمة -Toolbar.Details = تفاصيل -Toolbar.Tiles = مربعات -Toolbar.Content = محتوى -Toolbar.Undo = تراجع -Toolbar.Redo = إعادة -Toolbar.Refresh = تحديث -Toolbar.Back = الخلف -Toolbar.Forward = الأمام -Toolbar.Stop = إيقاف -Toolbar.Rename = إعادة تسمية -Toolbar.SelectAll = تحديد الكل -Toolbar.CustomizeFolder = تخصيص هذا المجلد -Toolbar.MapDrive = تعيين محرك أقراص الشبكة -Toolbar.DisconnectDrive = قطع اتصال محرك أقراص الشبكة -Toolbar.NavigationPane = جزء التنقل -Toolbar.DetailsPane = جزء التفاصيل -Toolbar.PreviewPane = جزء المعاينة -Toolbar.CopyTo = نسخ إلى -Toolbar.MoveTo = نقل إلى -Toolbar.Deselect = بلا تحديد -Toolbar.InvertSelection = عكس التحديد -Toolbar.FolderOptions = خيارات المجلد -Toolbar.ShowHiddenFiles = الملفات والمجلدات المخفية -Toolbar.ShowSystemFiles = ملفات النظام -Toolbar.ShowExtensions = ملحقات أسماء الملفات -Status.FreeSpace = ‎%s (مساحة القرص الحرة: ‎%s) -Status.Item = عنصر %s -Status.Items = ‎‎%s عنصر/عناصر -Status.ItemSelected = %s عنصر محدد -Status.ItemsSelected = %s عنصر/عناصر محددة - - -[bg-BG] - Bulgarian (Bulgaria) -Copy.Cancel = Отказ -Copy.More = Още... -Copy.CopyHere = &Копирай тук -Copy.MoveHere = Пр&емести тук -Copy.Title = Потвърждаване на заместването на файл -Copy.Subtitle = Тази папка вече съдържа файл с име '%s'. -Copy.SubtitleRO = Тази папка вече съдържа файл само за четене с име '%s'. -Copy.SubtitleSys = Тази папка вече съдържа системен файл с име '%s'. -Copy.Prompt1 = Желаете ли да заместите съществуващия файл -Copy.Prompt2 = с този? -Copy.Yes = &Да -Copy.No = &Не -Copy.YesAll = "Да" за &всички -Folder.Title = Потвърждаване на заместването на папка -Folder.Prompt = Все още ли искате да преместите или копирате папката? -Toolbar.GoUp = Едно ниво нагоре -Toolbar.Cut = Изрежи -Toolbar.Copy = Копирай -Toolbar.Paste = Постави -Toolbar.PasteShortcut = Постави пряк път -Toolbar.Delete = Изтриване -Toolbar.Email = Изпрати избраните елементи по електронната поща -Toolbar.Properties = Свойства -Toolbar.NewFolder = Нова папка -Toolbar.ZipFolder = Нова компресирана със ZIP папка -Toolbar.ExtraLarge = Много големи икони -Toolbar.Large = Големи икони -Toolbar.Medium = Средни икони -Toolbar.Small = Малки икони -Toolbar.List = Списък -Toolbar.Details = Детайли -Toolbar.Tiles = Мозайка -Toolbar.Content = Съдържание -Toolbar.Undo = Отмени -Toolbar.Redo = Върни -Toolbar.Refresh = Обнови -Toolbar.Back = Назад -Toolbar.Forward = Напред -Toolbar.Stop = Спри -Toolbar.Rename = Преименуване -Toolbar.SelectAll = Избери всички -Toolbar.CustomizeFolder = Персонализиране на тази папка -Toolbar.MapDrive = Назначаване на мрежово устройство -Toolbar.DisconnectDrive = Изключване на мрежово устройство -Toolbar.NavigationPane = Навигационен екран -Toolbar.DetailsPane = Екран за подробни данни -Toolbar.PreviewPane = Прозорец за визуализация -Toolbar.CopyTo = Копирай в -Toolbar.MoveTo = Премести в -Toolbar.Deselect = Не избирай нищо -Toolbar.InvertSelection = Обърни селекцията -Toolbar.FolderOptions = Опции за папката -Toolbar.ShowHiddenFiles = Скрити файлове и папки -Toolbar.ShowSystemFiles = Системни файлове -Toolbar.ShowExtensions = Разширения на имената на файлове -Status.FreeSpace = %s (Свободно място на диска: %s) -Status.Item = %s елемент -Status.Items = %s елемента -Status.ItemSelected = %s избран елемент -Status.ItemsSelected = %s избрани елемента - - -[ca-ES] - Catalan (Catalan) -Copy.Cancel = Cancel·lar -Copy.More = Més... -Copy.CopyHere = &Copiar aquí -Copy.MoveHere = &Moure aquí -Copy.Title = Confirmar la substitució de l'arxiu -Copy.Subtitle = Aquesta carpeta ja conté un arxiu amb el nom "%s". -Copy.SubtitleRO = Aquesta carpeta ja conté un arxiu de sols lectura amb el nom "%s". -Copy.SubtitleSys = Aquesta carpeta ja conté un arxiu de sistema amb el nom "%s". -Copy.Prompt1 = Desitja substituir l'arxiu existent -Copy.Prompt2 = per aquest altre? -Copy.Yes = &Sí -Copy.No = &No -Copy.YesAll = Sí a &tot -Folder.Title = Confirmar la substitució de carpetes -Folder.Prompt = Desitja moure o copiar la carpeta de totes maneres? -Toolbar.GoUp = Pujar un nivell -Toolbar.Cut = Retallar -Toolbar.Copy = Copiar -Toolbar.Paste = Enganxar -Toolbar.PasteShortcut = Enganxar accés directe -Toolbar.Delete = Suprimeix -Toolbar.Email = Enviar per correu electrònic els elements següents -Toolbar.Properties = Propietats -Toolbar.NewFolder = Nova carpeta -Toolbar.ZipFolder = Carpeta comprimida (en zip) nova -Toolbar.ExtraLarge = Icones molt grans -Toolbar.Large = Icones grans -Toolbar.Medium = Icones mitjanes -Toolbar.Small = Icones petites -Toolbar.List = Llista -Toolbar.Details = Detalls -Toolbar.Tiles = Mosaics -Toolbar.Content = Contingut -Toolbar.Undo = Desfer -Toolbar.Redo = Refer -Toolbar.Refresh = Actualitzar -Toolbar.Back = Enrera -Toolbar.Forward = Endavant -Toolbar.Stop = Aturar -Toolbar.Rename = Cambiar nom -Toolbar.SelectAll = Seleccionar tot -Toolbar.CustomizeFolder = Personalitzar aquesta carpeta -Toolbar.MapDrive = Conectar a unitat de xarxa -Toolbar.DisconnectDrive = Desconectar unitat de xarxa -Toolbar.NavigationPane = Panell de navegació -Toolbar.DetailsPane = Panell de detalls -Toolbar.PreviewPane = Panell de vista prèvia -Toolbar.CopyTo = Copia a -Toolbar.MoveTo = Desplaça a -Toolbar.Deselect = No en seleccionis cap -Toolbar.InvertSelection = Inverteix la selecció -Toolbar.FolderOptions = Opcions de carpeta -Toolbar.ShowHiddenFiles = Fitxers i carpetes amagats -Toolbar.ShowSystemFiles = Fitxers del sistema -Toolbar.ShowExtensions = Extensions del nom de fitxer -Toolbar.Settings = Ajustaments del Classic Explorer -Status.FreeSpace = %s (espai disponible en disc: %s) -Status.Item = %s element -Status.Items = %s elements -Status.ItemSelected = %s element seleccionat -Status.ItemsSelected = %s elements seleccionats - - -[cs-CZ] - Czech (Czech Republic) -Copy.Cancel = Storno -Copy.More = Další... -Copy.CopyHere = &Kopírovat sem -Copy.MoveHere = &Přesunout sem -Copy.Title = Potvrdit nahrazení souboru -Copy.Subtitle = Tato složka již obsahuje soubor s názvem %s. -Copy.SubtitleRO = Tato složka již obsahuje soubor jen pro čtení s názvem %s. -Copy.SubtitleSys = Tato složka již obsahuje systémový soubor s názvem %s. -Copy.Prompt1 = Chcete nahradit stávající soubor -Copy.Prompt2 = tímto souborem? -Copy.Yes = &Ano -Copy.No = &Ne -Copy.YesAll = Ano vš&em -Folder.Title = Potvrdit nahrazení složky -Folder.Prompt = Opravdu chcete přesunout nebo zkopírovat tuto složku? -Toolbar.GoUp = O úroveň výš -Toolbar.Cut = Vyjmout -Toolbar.Copy = Kopírovat -Toolbar.Paste = Vložit -Toolbar.PasteShortcut = Vložit zástupce -Toolbar.Delete = Odstranit -Toolbar.Email = Odešle vybrané položky e-mailem -Toolbar.Properties = Vlastnosti -Toolbar.NewFolder = Nová složka -Toolbar.ZipFolder = Nová komprimovaná složka (metoda ZIP) -Toolbar.ExtraLarge = Největší ikony -Toolbar.Large = Velké ikony -Toolbar.Medium = Střední ikony -Toolbar.Small = Malé ikony -Toolbar.List = Seznam -Toolbar.Details = Podrobnosti -Toolbar.Tiles = Dlaždice -Toolbar.Content = Obsah -Toolbar.Undo = Zpět -Toolbar.Redo = Znovu -Toolbar.Refresh = Aktualizovat -Toolbar.Back = Zpět -Toolbar.Forward = Vpřed -Toolbar.Stop = Zastavit -Toolbar.Rename = Přejmenovat -Toolbar.SelectAll = Vybrat vše -Toolbar.CustomizeFolder = Vlastní nastavení této složky -Toolbar.MapDrive = Připojit síťovou jednotku -Toolbar.DisconnectDrive = Odpojit síťovou jednotku -Toolbar.NavigationPane = Navigační podokno -Toolbar.DetailsPane = Podokno podrobností -Toolbar.PreviewPane = Podokno náhledu -Toolbar.CopyTo = Kopírovat do -Toolbar.MoveTo = Přesunout do -Toolbar.Deselect = Zrušit výběr -Toolbar.InvertSelection = Invertovat výběr -Toolbar.FolderOptions = Možnosti složky -Toolbar.ShowHiddenFiles = Skryté soubory a složky -Toolbar.ShowSystemFiles = Systémové soubory -Toolbar.ShowExtensions = Přípony názvů souborů -Status.FreeSpace = %s (volné místo na disku: %s) -Status.Item = %s položka -Status.Items = Počet položek: %s -Status.ItemSelected = %s vybraná položka -Status.ItemsSelected = Vybrané položky: %s - - -[da-DK] - Danish (Denmark) -Copy.Cancel = Annuller -Copy.More = Flere... -Copy.CopyHere = &Kopier hertil -Copy.MoveHere = &Flyt hertil -Copy.Title = Bekræft erstatning af fil -Copy.Subtitle = Denne mappe indeholder allerede en fil med navnet '%s'. -Copy.SubtitleRO = Denne mappe indeholder allerede en skrivebeskyttet fil med navnet '%s'. -Copy.SubtitleSys = Denne mappe indeholder allerede en systemfil med navnet '%s'. -Copy.Prompt1 = Vil du erstatte den eksisterende fil -Copy.Prompt2 = med denne fil? -Copy.Yes = &Ja -Copy.No = &Nej -Copy.YesAll = J&a til alle -Folder.Title = Bekræft erstatning af mappe -Folder.Prompt = Vil du flytte mappen alligevel? -Toolbar.GoUp = Et niveau op -Toolbar.Cut = Klip -Toolbar.Copy = Kopier -Toolbar.Paste = Sæt ind -Toolbar.PasteShortcut = Indsæt genvej -Toolbar.Delete = Slet -Toolbar.Email = Send de markerede elementer med e-mail -Toolbar.Properties = Egenskaber -Toolbar.NewFolder = Ny mappe -Toolbar.ZipFolder = Ny ZIP-komprimeret mappe -Toolbar.ExtraLarge = Ekstra store ikoner -Toolbar.Large = Store ikoner -Toolbar.Medium = Mellemstore ikoner -Toolbar.Small = Små ikoner -Toolbar.List = Oversigt -Toolbar.Details = Detaljer -Toolbar.Tiles = Fliser -Toolbar.Content = Indhold -Toolbar.Undo = Fortryd -Toolbar.Redo = Annuller Fortryd -Toolbar.Refresh = Opdater -Toolbar.Back = Tilbage -Toolbar.Forward = Fremad -Toolbar.Stop = Stop -Toolbar.Rename = Omdøb -Toolbar.SelectAll = Marker alt -Toolbar.CustomizeFolder = Tilpas denne mappe -Toolbar.MapDrive = Tilknyt netværksdrev -Toolbar.DisconnectDrive = Afbryd forbindelsen til et netværksdrev -Toolbar.NavigationPane = Navigationsrude -Toolbar.DetailsPane = Detaljerude -Toolbar.PreviewPane = Indholdsrude -Toolbar.CopyTo = Kopiér til -Toolbar.MoveTo = Flyt til -Toolbar.Deselect = Vælg ingen -Toolbar.InvertSelection = Inverter markeringen -Toolbar.FolderOptions = Mappeindstillinger -Toolbar.ShowHiddenFiles = Skjulte filer og mapper -Toolbar.ShowSystemFiles = Systemfiler -Toolbar.ShowExtensions = Filtypenavne -Status.FreeSpace = %s (ledig diskplads: %s) -Status.Item = %s element -Status.Items = %s elementer -Status.ItemSelected = %s markeret element -Status.ItemsSelected = %s markerede elementer - - -[de-DE] - German (Germany) -Copy.Cancel = Abbrechen -Copy.More = Weitere... -Copy.CopyHere = Hierher &kopieren -Copy.MoveHere = Hierher &verschieben -Copy.Title = Ersetzen von Dateien bestätigen -Copy.Subtitle = Dieser Ordner enthält bereits eine Datei "%s". -Copy.SubtitleRO = Der Ordner enthält bereits eine schreibgeschützte Datei "%s". -Copy.SubtitleSys = Der Ordner enthält bereits eine Systemdatei "%s". -Copy.Prompt1 = Möchten Sie die existierende Datei -Copy.Prompt2 = mit dieser ersetzen? -Copy.Yes = &Ja -Copy.No = &Nein -Copy.YesAll = Ja, &alle -Folder.Title = Ersetzen von Ordnern bestätigen -Folder.Prompt = Soll der Ordner trotzdem verschoben bzw. kopiert werden? -Toolbar.GoUp = Eine Ebene nach oben -Toolbar.Cut = Ausschneiden -Toolbar.Copy = Kopieren -Toolbar.Paste = Einfügen -Toolbar.PasteShortcut = Verknüpfung einfügen -Toolbar.Delete = Löschen -Toolbar.Email = Ausgewählte Elemente in E-Mail senden -Toolbar.Properties = Eigenschaften -Toolbar.NewFolder = Neuer Ordner -Toolbar.ZipFolder = Neuer ZIP-komprimierter Ordner -Toolbar.ExtraLarge = Extra große Symbole -Toolbar.Large = Große Symbole -Toolbar.Medium = Mittelgroße Symbole -Toolbar.Small = Kleine Symbole -Toolbar.List = Liste -Toolbar.Details = Details -Toolbar.Tiles = Kacheln -Toolbar.Content = Inhalt -Toolbar.Undo = Rückgängig -Toolbar.Redo = Wiederholen -Toolbar.Refresh = Aktualisieren -Toolbar.Back = Zurück -Toolbar.Forward = Vorwärts -Toolbar.Stop = Beenden -Toolbar.Rename = Umbenennen -Toolbar.SelectAll = Alles auswählen -Toolbar.CustomizeFolder = Ordner anpassen -Toolbar.MapDrive = Netzlaufwerk verbinden -Toolbar.DisconnectDrive = Netzlaufwerk trennen -Toolbar.NavigationPane = Navigationsbereich -Toolbar.DetailsPane = Detailbereich -Toolbar.PreviewPane = Vorschaufenster -Toolbar.CopyTo = Kopieren nach -Toolbar.MoveTo = Verschieben nach -Toolbar.Deselect = Nichts auswählen -Toolbar.InvertSelection = Auswahl umkehren -Toolbar.FolderOptions = Ordneroptionen -Toolbar.ShowHiddenFiles = Versteckte Dateien und Ordner -Toolbar.ShowSystemFiles = Systemdateien -Toolbar.ShowExtensions = Dateinamenerweiterungen -Status.FreeSpace = %s (Freier Speicherplatz: %s) -Status.Item = %s Element -Status.Items = %s Elemente -Status.ItemSelected = %s Element ausgewählt -Status.ItemsSelected = %s Elemente ausgewählt - - -[el-GR] - Greek (Greece) -Copy.Cancel = Άκυρο -Copy.More = Περισσότερα... -Copy.CopyHere = &Αντιγραφή εδώ -Copy.MoveHere = &Μετακίνηση εδώ -Copy.Title = Επιβεβαίωση αντικατάστασης αρχείου -Copy.Subtitle = Αυτός ο φάκελος περιέχει ήδη ένα αρχείο με όνομα "%s". -Copy.SubtitleRO = Αυτός ο φάκελος περιέχει ήδη ένα αρχείο μόνο για ανάγνωση με όνομα "%s". -Copy.SubtitleSys = Αυτός ο φάκελος περιέχει ήδη ένα αρχείο συστήματος με όνομα "%s". -Copy.Prompt1 = Θέλετε να αντικατασταθεί το υπάρχον αρχείο -Copy.Prompt2 = με αυτό το αρχείο; -Copy.Yes = &Ναι -Copy.No = Ό&χι -Copy.YesAll = Ναι σε ό&λα -Folder.Title = Επιβεβαίωση αντικατάστασης φακέλου -Folder.Prompt = Είστε βέβαιοι ότι θέλετε να μετακινηθεί ή να αντιγραφεί ο φάκελος; -Toolbar.GoUp = Ένα επίπεδο επάνω -Toolbar.Cut = Αποκοπή -Toolbar.Copy = Αντιγραφή -Toolbar.Paste = Επικόλληση -Toolbar.PasteShortcut = Επικόλληση συντόμευσης -Toolbar.Delete = Διαγραφή -Toolbar.Email = Ηλεκτρονική ταχυδρόμηση των επιλεγμένων αντικειμένων -Toolbar.Properties = Ιδιότητες -Toolbar.NewFolder = Νέος φάκελος -Toolbar.ZipFolder = Νέος συμπιεσμένος (μορφή zip) φάκελος -Toolbar.ExtraLarge = Πολύ μεγάλα εικονίδια -Toolbar.Large = Μεγάλα εικονίδια -Toolbar.Medium = Μεσαία εικονίδια -Toolbar.Small = Μικρά εικονίδια -Toolbar.List = Λίστα -Toolbar.Details = Λεπτομέρειες -Toolbar.Tiles = Τίτλοι -Toolbar.Content = Περιεχόμενο -Toolbar.Undo = Αναίρεση -Toolbar.Redo = Επανάληψη -Toolbar.Refresh = Ανανέωση -Toolbar.Back = Πίσω -Toolbar.Forward = Εμπρός -Toolbar.Stop = Τέλος -Toolbar.Rename = Μετονομασία -Toolbar.SelectAll = Επιλογή όλων -Toolbar.CustomizeFolder = Προσαρμογή φακέλου -Toolbar.MapDrive = Αντιστοίχιση δίσκου δικτύου -Toolbar.DisconnectDrive = Αποσύνδεση δίσκου δικτύου -Toolbar.NavigationPane = Παράθυρο περιήγησης -Toolbar.DetailsPane = Παράθυρο λεπτομερειών -Toolbar.PreviewPane = Παράθυρο προεπισκόπησης -Toolbar.CopyTo = Αντιγραφή σε -Toolbar.MoveTo = Μετακίνηση σε -Toolbar.Deselect = Καμία επιλογή -Toolbar.InvertSelection = Αναστροφή επιλογής -Toolbar.FolderOptions = Επιλογές φακέλων -Toolbar.ShowHiddenFiles = Κρυφά αρχεία και φάκελοι -Toolbar.ShowSystemFiles = Αρχεία συστήματος -Toolbar.ShowExtensions = Επεκτάσεις ονόματος αρχείων -Status.FreeSpace = %s (Ελεύθερος χώρος στο δίσκο: %s) -Status.Item = %s στοιχείο -Status.Items = %s στοιχεία -Status.ItemSelected = %s επιλεγμένο στοιχείο -Status.ItemsSelected = %s επιλεγμένα στοιχεία - - -[en-US] - English (United States) -Copy.Cancel = Cancel -Copy.More = More... -Copy.CopyHere = &Copy Here -Copy.MoveHere = &Move Here -Copy.Title = Confirm File Replacement -Copy.Subtitle = This folder already contains a file named '%s'. -Copy.SubtitleRO = This folder already contains a read-only file named '%s'. -Copy.SubtitleSys = This folder already contains a system file named '%s'. -Copy.Prompt1 = Would you like to replace the existing file -Copy.Prompt2 = with this one? -Copy.Yes = &Yes -Copy.No = &No -Copy.YesAll = Yes to &All -Folder.Title = Confirm Folder Replace -Folder.Prompt = Do you still want to move or copy the folder? -Toolbar.GoUp = Up One Level -Toolbar.Cut = Cut -Toolbar.Copy = Copy -Toolbar.Paste = Paste -Toolbar.PasteShortcut = Paste Shortcut -Toolbar.Delete = Delete -Toolbar.Email = E-mail the selected items -Toolbar.Properties = Properties -Toolbar.NewFolder = New Folder -Toolbar.ZipFolder = New Compressed (zipped) Folder -Toolbar.ExtraLarge = Extra Large Icons -Toolbar.Large = Large Icons -Toolbar.Medium = Medium Icons -Toolbar.Small = Small Icons -Toolbar.List = List -Toolbar.Details = Details -Toolbar.Tiles = Tiles -Toolbar.Content = Content -Toolbar.Undo = Undo -Toolbar.Redo = Redo -Toolbar.Refresh = Refresh -Toolbar.Back = Back -Toolbar.Forward = Forward -Toolbar.Stop = Stop -Toolbar.Rename = Rename -Toolbar.SelectAll = Select all -Toolbar.CustomizeFolder = Customize this folder -Toolbar.MapDrive = Map network drive -Toolbar.DisconnectDrive = Disconnect network drive -Toolbar.NavigationPane = Navigation pane -Toolbar.DetailsPane = Details pane -Toolbar.PreviewPane = Preview pane -Toolbar.CopyTo = Copy to -Toolbar.MoveTo = Move to -Toolbar.Deselect = Select none -Toolbar.InvertSelection = Invert selection -Toolbar.FolderOptions = Folder options -Toolbar.ShowHiddenFiles = Hidden files and folders -Toolbar.ShowSystemFiles = System files -Toolbar.ShowExtensions = File name extensions -Status.FreeSpace = %s (Disk free space: %s) -Status.Item = %s item -Status.Items = %s items -Status.ItemSelected = %s item selected -Status.ItemsSelected = %s items selected - - -[es-ES] - Spanish (Spain) -Copy.Cancel = Cancelar -Copy.More = Mas... -Copy.CopyHere = &Copiar aquí -Copy.MoveHere = &Mover aquí -Copy.Title = Confirmar el reemplazo de archivo -Copy.Subtitle = Esta carpeta ya contiene un archivo con el nombre "%s". -Copy.SubtitleRO = Esta carpeta ya contiene un archivo de sólo lectura con el nombre "%s". -Copy.SubtitleSys = Esta carpeta ya contiene un archivo de sistema con el nombre "%s". -Copy.Prompt1 = ¿Desea reemplazar el archivo existente -Copy.Prompt2 = por este otro? -Copy.Yes = &Sí -Copy.No = &No -Copy.YesAll = Sí a &todo -Folder.Title = Confirmar el reemplazo de carpetas -Folder.Prompt = ¿Desea mover o copiar la carpeta de todas formas? -Toolbar.GoUp = Subir un nivel -Toolbar.Cut = Cortar -Toolbar.Copy = Copiar -Toolbar.Paste = Pegar -Toolbar.PasteShortcut = Pegar acceso directo -Toolbar.Delete = Eliminar -Toolbar.Email = Enviar por correo electrónico los elementos siguientes -Toolbar.Properties = Propiedades -Toolbar.NewFolder = Nueva carpeta -Toolbar.ZipFolder = Nueva carpeta comprimida (en zip) -Toolbar.ExtraLarge = Iconos muy grandes -Toolbar.Large = Iconos grandes -Toolbar.Medium = Iconos medianos -Toolbar.Small = Iconos pequeños -Toolbar.List = Lista -Toolbar.Details = Detalles -Toolbar.Tiles = Mosaicos -Toolbar.Content = Contenido -Toolbar.Undo = Deshacer -Toolbar.Redo = Rehacer -Toolbar.Refresh = Actualizar -Toolbar.Back = Atrás -Toolbar.Forward = Adelante -Toolbar.Stop = Detener -Toolbar.Rename = Cambiar nombre -Toolbar.SelectAll = Seleccionar todo -Toolbar.CustomizeFolder = Personalizar esta carpeta -Toolbar.MapDrive = Conectar a unidad de red -Toolbar.DisconnectDrive = Desconectar unidad de red -Toolbar.NavigationPane = Panel de navegación -Toolbar.DetailsPane = Panel de detalles -Toolbar.PreviewPane = Panel de vista previa -Toolbar.CopyTo = Copiar a -Toolbar.MoveTo = Mover a -Toolbar.Deselect = No seleccionar ninguno -Toolbar.InvertSelection = Invertir selección -Toolbar.FolderOptions = Opciones de carpeta -Toolbar.ShowHiddenFiles = Archivos y carpetas ocultos -Toolbar.ShowSystemFiles = Archivos de sistema -Toolbar.ShowExtensions = Extensiones de nombre de archivo -Status.FreeSpace = %s (espacio disponible en disco: %s) -Status.Item = %s elemento -Status.Items = %s elementos -Status.ItemSelected = %s elemento seleccionado -Status.ItemsSelected = %s elementos seleccionados - - -[et-EE] - Estonian (Estonia) -Copy.Cancel = Loobu -Copy.More = Veel... -Copy.CopyHere = &Kopeeri siia -Copy.MoveHere = &Teisalda siia -Copy.Title = Kinnitage failiasendus -Copy.Subtitle = See kaust sisaldab juba faili nimega %s. -Copy.SubtitleRO = See kaust sisaldab juba kirjutuskaitstud faili nimega %s. -Copy.SubtitleSys = See kaust sisaldab juba süsteemifaili nimega %s. -Copy.Prompt1 = Kas soovite asendada olemasoleva faili -Copy.Prompt2 = sellega? -Copy.Yes = &Jah -Copy.No = &Ei -Copy.YesAll = &Kõigile jah -Folder.Title = Kinnitage kausta asendamine -Folder.Prompt = Kas soovite kausta ikkagi teisaldada või kopeerida? -Toolbar.GoUp = Taseme võrra üles -Toolbar.Cut = Lõika -Toolbar.Copy = Kopeeri -Toolbar.Paste = Kleebi -Toolbar.PasteShortcut = Kleebi otsetee -Toolbar.Delete = Kustuta -Toolbar.Email = Saada valitud üksused e-postiga -Toolbar.Properties = Atribuudid -Toolbar.NewFolder = Uus kaust -Toolbar.ZipFolder = Uus tihendatud (zip) kaust -Toolbar.ExtraLarge = Eriti suured ikoonid -Toolbar.Large = Suured ikoonid -Toolbar.Medium = Keskmise suurusega ikoonid -Toolbar.Small = Väikesed ikoonid -Toolbar.List = Loend -Toolbar.Details = Üksikasjad -Toolbar.Tiles = Paanid -Toolbar.Content = Sisu -Toolbar.Undo = Võta tagasi -Toolbar.Redo = Tee uuesti -Toolbar.Refresh = Värskenda -Toolbar.Back = Tagasi -Toolbar.Forward = Edasi -Toolbar.Stop = Lõpeta -Toolbar.Rename = Nimeta ümber -Toolbar.SelectAll = Vali kõik -Toolbar.CustomizeFolder = Kohanda seda kausta -Toolbar.MapDrive = Ühenda võrgudraiv -Toolbar.DisconnectDrive = Katkesta võrgudraivi ühendus -Toolbar.NavigationPane = Navigeerimispaan -Toolbar.DetailsPane = Üksikasjapaan -Toolbar.PreviewPane = Eelvaatepaan -Toolbar.CopyTo = Kopeeri asukohta -Toolbar.MoveTo = Teisalda asukohta -Toolbar.Deselect = Ära vali midagi -Toolbar.InvertSelection = Pööra valik -Toolbar.FolderOptions = Kaustasuvandid -Toolbar.ShowHiddenFiles = Peitfailid ja -kaustad -Toolbar.ShowSystemFiles = Süsteemifailid -Toolbar.ShowExtensions = Failinimede laiendid -Status.FreeSpace = %s (vaba kettaruumi: %s) -Status.Item = %s üksus -Status.Items = %s üksust -Status.ItemSelected = Valitud on %s üksus -Status.ItemsSelected = Valitud on %s üksust - - -[fa-IR] - Persian -Copy.Cancel = لغو -Copy.More = بیشتر... -Copy.CopyHere = &کپی به اینجا -Copy.MoveHere = &انتقال به اینجا -Copy.Title = تأیید جایگزینی پرونده -Copy.Subtitle = ‏‏در حال حاضر این پوشه حاوی پرونده‌ای به نام "%s" است. -Copy.SubtitleRO = ‏‏در حال حاضر این پوشه حاوی پرونده‌ای فقط خواندنی به نام "%s" است. -Copy.SubtitleSys = ‏‏در حال حاضر این پوشه حاوی پرونده‌ای سیستمی به نام "%s" است. -Copy.Prompt1 = آیا می‌خواهید پرونده‌ی موجود را جایگزین کنید -Copy.Prompt2 = با این یکی؟ -Copy.Yes = &بله -Copy.No = &خیر -Copy.YesAll = بله برای &همه -Folder.Title = تأیید جایگزینی پوشه -Folder.Prompt = آیا هنوز می‌خواهید پوشه را کپی یا منتقل کنید؟ -Toolbar.GoUp = یک سطح بالاتر -Toolbar.Cut = برش -Toolbar.Copy = کپی -Toolbar.Paste = جایگذاری -Toolbar.PasteShortcut = جایگذاری میانبر -Toolbar.Delete = حذف -Toolbar.Email = مورد انتخابی را با پست الکترونیکی بفرستید -Toolbar.Properties = خصوصیات -Toolbar.NewFolder = پوشه جدید -Toolbar.ZipFolder = پوشه فشرده ‏(زیپ شده)‏ جدید‫ -Toolbar.ExtraLarge = نمادهای خیلی بزرگ -Toolbar.Large = نمادهای بزرگ -Toolbar.Medium = نمادهای متوسط -Toolbar.Small = نمادهای کوچک -Toolbar.List = لیست -Toolbar.Details = جزئیات -Toolbar.Tiles = موزائیک‌ها -Toolbar.Content = محتوا -Toolbar.Undo = لغو عمل -Toolbar.Redo = انجام مجدد -Toolbar.Refresh = تازه‌کردن -Toolbar.Back = عقب -Toolbar.Forward = جلو -Toolbar.Stop = توقف -Toolbar.Rename = تغییر نام -Toolbar.SelectAll = انتخاب همه -Toolbar.CustomizeFolder = سفارشی کردن این پوشه -Toolbar.MapDrive = نگاشت درایو شبکه -Toolbar.DisconnectDrive = قطع اتصال درایو شبکه -Toolbar.NavigationPane = چارچوب پیمایش -Toolbar.DetailsPane = چارچوب جزئیات -Toolbar.PreviewPane = چارچوب پیش‌نمایش -Toolbar.CopyTo = ‏‏کپی در -Toolbar.MoveTo = انتقال به -Toolbar.Deselect = هیچکدام انتخاب نشود -Toolbar.InvertSelection = معکوس کردن انتخاب -Toolbar.FolderOptions = گزینه های پوشه -Toolbar.ShowHiddenFiles = پرونده و پوشه های پنهان -Toolbar.ShowSystemFiles = پرونده های سیستم -Toolbar.ShowExtensions = پسوندهای نام پرونده ها -Toolbar.Settings = تنظیمات کاوشگر کلاسیک -Status.FreeSpace = %s (فضای خالی دیسک: %s) -Status.Item = %s مورد -Status.Items = %s مورد -Status.ItemSelected = %s مورد انتخاب شده -Status.ItemsSelected = %s مورد انتخاب شده - - -[fi-FI] - Finnish (Finland) -Copy.Cancel = Peruuta -Copy.More = Lisää... -Copy.CopyHere = &Kopioi tähän -Copy.MoveHere = &Siirrä tähän -Copy.Title = Vahvista tiedoston korvaus -Copy.Subtitle = Tämä kansio sisältää jo tiedoston %s. -Copy.SubtitleRO = Tämä kansio sisältää jo vain luku -tiedoston %s. -Copy.SubtitleSys = Tämä kansio sisältää jo järjestelmätiedoston %s. -Copy.Prompt1 = Haluatko korvata tiedoston -Copy.Prompt2 = tällä tiedostolla? -Copy.Yes = &Kyllä -Copy.No = &Ei -Copy.YesAll = Kyllä k&aikkiin -Folder.Title = Vahvista kansion korvaus -Folder.Prompt = Haluatko korvata järjestelmässä jo olevan kansion tiedostot siirrettävän tai kopioitavan kansion samannimisillä tiedostoilla? -Toolbar.GoUp = Yksi taso ylöspäin -Toolbar.Cut = Leikkaa -Toolbar.Copy = Kopioi -Toolbar.Paste = Liitä -Toolbar.PasteShortcut = Liitä pikakuvake -Toolbar.Delete = Poista -Toolbar.Email = Lähetä valitut kohteet sähköpostilla -Toolbar.Properties = Ominaisuudet -Toolbar.NewFolder = Uusi kansio -Toolbar.ZipFolder = Uusi pakattu (zip) kansio -Toolbar.ExtraLarge = Suurimmat kuvakkeet -Toolbar.Large = Suuret kuvakkeet -Toolbar.Medium = Keskikokoiset kuvakkeet -Toolbar.Small = Pienet kuvakkeet -Toolbar.List = Luettelo -Toolbar.Details = Tiedot -Toolbar.Tiles = Kuvakkeet ja tiedot -Toolbar.Content = Sisältö -Toolbar.Undo = Kumoa -Toolbar.Redo = Tee uudelleen -Toolbar.Refresh = Päivitä -Toolbar.Back = Edellinen -Toolbar.Forward = Seuraava -Toolbar.Stop = Pysäytä -Toolbar.Rename = Nimeä uudelleen -Toolbar.SelectAll = Valitse kaikki -Toolbar.CustomizeFolder = Mukauta kansiota -Toolbar.MapDrive = Yhdistä verkkoasemaan -Toolbar.DisconnectDrive = Katkaise yhteys verkkoasemaan -Toolbar.NavigationPane = Siirtymisruutu -Toolbar.DetailsPane = Tiedot-ruutu -Toolbar.PreviewPane = Esikatseluruutu -Toolbar.CopyTo = Kopioi kohteeseen -Toolbar.MoveTo = Siirrä kohteeseen -Toolbar.Deselect = Poista valinnat -Toolbar.InvertSelection = Käänteinen valinta -Toolbar.FolderOptions = Kansion asetukset -Toolbar.ShowHiddenFiles = Piilotetut tiedostot ja kansiot -Toolbar.ShowSystemFiles = Järjestelmätiedostot -Toolbar.ShowExtensions = Tiedostotunnisteet -Status.FreeSpace = %s (levyn vapaa tila: %s) -Status.Item = %s kohde -Status.Items = %s kohdetta -Status.ItemSelected = %s kohde valittu -Status.ItemsSelected = %s kohdetta valittu - - -[fr-FR] - French (France) -Copy.Cancel = Annuler -Copy.More = Autres… -Copy.CopyHere = &Copier ici -Copy.MoveHere = &Déplacer ici -Copy.Title = Confirmer le remplacement du fichier -Copy.Subtitle = Ce dossier contient déjà un fichier nommé « %s ». -Copy.SubtitleRO = Ce dossier contient déjà un fichier en lecture seule nommé « %s ». -Copy.SubtitleSys = Ce dossier contient déjà un fichier système nommé « %s ». -Copy.Prompt1 = Faut-il remplacer le fichier existant -Copy.Prompt2 = par celui-ci ? -Copy.Yes = &Oui -Copy.No = &Non -Copy.YesAll = &Tous -Folder.Title = Confirmation du remplacement du dossier -Folder.Prompt = Faut-il vraiment déplacer ou copier le dossier ? -Toolbar.GoUp = Dossier parent -Toolbar.Cut = Couper -Toolbar.Copy = Copier -Toolbar.Paste = Coller -Toolbar.PasteShortcut = Coller le raccourci -Toolbar.Delete = Supprimer -Toolbar.Email = Envoyer les éléments sélectionnés par courrier électronique -Toolbar.Properties = Propriétés -Toolbar.NewFolder = Nouveau dossier -Toolbar.ZipFolder = Nouveau dossier compressé -Toolbar.ExtraLarge = Très grandes icônes -Toolbar.Large = Grandes icônes -Toolbar.Medium = Icônes moyennes -Toolbar.Small = Petites icônes -Toolbar.List = Liste -Toolbar.Details = Détails -Toolbar.Tiles = Mosaïques -Toolbar.Content = Contenu -Toolbar.Undo = Annuler -Toolbar.Redo = Rétablir -Toolbar.Refresh = Actualiser -Toolbar.Back = Précédent -Toolbar.Forward = Suivant -Toolbar.Stop = Arrêter -Toolbar.Rename = Renommer -Toolbar.SelectAll = Sélectionner tout -Toolbar.CustomizeFolder = Personnaliser ce dossier -Toolbar.MapDrive = Connecter un lecteur réseau -Toolbar.DisconnectDrive = Déconnecter un lecteur réseau -Toolbar.NavigationPane = Volet de navigation -Toolbar.DetailsPane = Volet des détails -Toolbar.PreviewPane = Volet de visualisation -Toolbar.CopyTo = Copier vers -Toolbar.MoveTo = Déplacer vers -Toolbar.Deselect = Aucun -Toolbar.InvertSelection = Inverser la sélection -Toolbar.FolderOptions = Options des dossiers -Toolbar.ShowHiddenFiles = Fichiers et dossiers cachés -Toolbar.ShowSystemFiles = Fichiers système -Toolbar.ShowExtensions = Extensions de noms de fichiers -Status.FreeSpace = %s (espace libre : %s) -Status.Item = %s élément -Status.Items = %s éléments -Status.ItemSelected = %s élément sélectionné -Status.ItemsSelected = %s éléments sélectionnés - - -[gd-GB] - Scottish Gaelic (United Kingdom) -Copy.Cancel = Sguir dheth -Copy.More = Barrachd... -Copy.CopyHere = &Cuir an lethbhreac an-seo -Copy.MoveHere = &Gluais an-seo -Copy.Title = Dearbh an cur an àite -Copy.Subtitle = Tha faidhle air a bheil "%s" sa phasgan seo mu thràth. -Copy.SubtitleRO = Tha faidhle air a bheil "%s" sa phasgan seo mu thràth a tha ri leughadh a-mhàin. -Copy.SubtitleSys = Tha faidhle siostaim air a bheil "%s" sa phasgan seo mu thràth. -Copy.Prompt1 = A bheil thu airson am faidhle seo a chur -Copy.Prompt2 = an àite an fhir làithrich? -Copy.Yes = &Tha -Copy.No = &Chan eil -Copy.YesAll = Th&a ris a h-uile -Folder.Title = Dearbh an cur an àite -Folder.Prompt = A bheil thu airson am pasgan a ghluasad fhathast no airson lethbhreac a dhèanamh dheth? -Toolbar.GoUp = Suas aon ìre -Toolbar.Cut = Gearr -Toolbar.Copy = Dàn lethbhreac -Toolbar.Paste = Cuir ann -Toolbar.PasteShortcut = Cuir ann an ath-ghoirid -Toolbar.Delete = Sguab às -Toolbar.Email = Cuir na thagh thu ann am post-d -Toolbar.Properties = Roghainnean -Toolbar.NewFolder = Pasgan ùr -Toolbar.ZipFolder = Pasgan dùmhlaichte (air a shiopadh) ùr -Toolbar.ExtraLarge = Ìomhaigheagan anabarrach mòr -Toolbar.Large = Ìomhaigheagan mòra -Toolbar.Medium = Ìomhaigheagan meadhanach -Toolbar.Small = Ìomhaigheagan beaga -Toolbar.List = Liosta -Toolbar.Details = Mion-fhiosrachadh -Toolbar.Tiles = Leacagan -Toolbar.Content = Susbaint -Toolbar.Undo = Neo-dhèan -Toolbar.Redo = Ath-dhèan -Toolbar.Refresh = Ath-nuadhaich -Toolbar.Back = Air ais -Toolbar.Forward = Air adhart -Toolbar.Stop = Sguir dheth -Toolbar.Rename = Thoir ainm eile air -Toolbar.SelectAll = Tagh na h-uile -Toolbar.CustomizeFolder = Gnàthaich am pasgan seo -Toolbar.MapDrive = Mapaich draibh an lìonraidh -Toolbar.DisconnectDrive = Dì-cheangail draibh an lìonraidh -Toolbar.NavigationPane = Leòsan na seòladaireachd -Toolbar.DetailsPane = Leòsan a' mhion-fhiosrachaidh -Toolbar.PreviewPane = Leòsan an ro-sheallaidh -Toolbar.CopyTo = Cuir lethbhreac gu -Toolbar.MoveTo = Gluais gu -Toolbar.Deselect = Na tagh gin -Toolbar.InvertSelection = Ais-thionndaidh an taghadh -Toolbar.FolderOptions = Roghainnean a' phasgain -Toolbar.ShowHiddenFiles = Faidhlichean is pasgain fhalaichte -Toolbar.ShowSystemFiles = Faidhlichean an t-siostaim -Toolbar.ShowExtensions = Leudachain ainmean nam faidhle -Status.FreeSpace = %s (Àire saor air an diosga: %s) -Status.Item = %s nì -Status.Items = %s nithean -Status.ItemSelected = %s nì air a thaghadh -Status.ItemsSelected = %s nithean air a thaghadh - - -[he-IL] - Hebrew (Israel) -Copy.Cancel = ביטול -Copy.More = עוד... -Copy.CopyHere = הע&תק לכאן -Copy.MoveHere = הע&בר לכאן -Copy.Title = אישור החלפת קובץ -Copy.Subtitle = תיקיה זו מכילה כבר קובץ בשם '‎‎%s‎‏'‏.‏ -Copy.SubtitleRO = תיקיה זו מכילה כבר קובץ המוגדר לקריאה בלבד בשם '‎‎%s‎‏'.‏ -Copy.SubtitleSys = תיקיה זו מכילה כבר קובץ מערכת בשם '‎‎%s‎'‏.‏ -Copy.Prompt1 = ‏‏האם ברצונך להחליף את הקובץ הקיים -Copy.Prompt2 = בקובץ זה? -Copy.Yes = &כן -Copy.No = &לא -Copy.YesAll = כ&ן לכל -Folder.Title = אישור החלפת תיקיה -Folder.Prompt = האם ברצונך להעביר או להעתיק את התיקיה בכל זאת? -Toolbar.GoUp = רמה אחת למעלה -Toolbar.Cut = גזור -Toolbar.Copy = העתק -Toolbar.Paste = הדבק -Toolbar.PasteShortcut = הדבק קיצור דרך -Toolbar.Delete = מחק -Toolbar.Email = שלח את הפריטים הנבחרים בדואר אלקטרוני -Toolbar.Properties = מאפיינים -Toolbar.NewFolder = תיקיה חדשה -Toolbar.ZipFolder = ‫תיקיה ‫דחוסה ‫(מכווצת) ‫חדשה -Toolbar.ExtraLarge = סמלים גדולים מאוד -Toolbar.Large = סמלים גדולים -Toolbar.Medium = סמלים בינוניים -Toolbar.Small = סמלים קטנים -Toolbar.List = רשימה -Toolbar.Details = פרטים -Toolbar.Tiles = משבצות -Toolbar.Content = תוכן -Toolbar.Undo = בטל -Toolbar.Redo = בצע שוב -Toolbar.Refresh = רענן -Toolbar.Back = אחורה -Toolbar.Forward = קדימה -Toolbar.Stop = עצור -Toolbar.Rename = שינוי שם -Toolbar.SelectAll = בחר הכל -Toolbar.CustomizeFolder = התאמה אישית של תיקיה זו -Toolbar.MapDrive = מיפוי כונן רשת -Toolbar.DisconnectDrive = ניתוק כונן רשת -Toolbar.NavigationPane = חלונית ניווט -Toolbar.DetailsPane = חלונית פרטים -Toolbar.PreviewPane = חלונית תצוגה מקדימה -Toolbar.CopyTo = העתק אל -Toolbar.MoveTo = העבר אל -Toolbar.Deselect = אל תבחר -Toolbar.InvertSelection = הפוך בחירה -Toolbar.FolderOptions = אפשרויות תיקיה -Toolbar.ShowHiddenFiles = קבצים ותיקיות מוסתרים -Toolbar.ShowSystemFiles = קבצי מערכת -Toolbar.ShowExtensions = סיומות שמות קבצים -Status.FreeSpace = %s (שטח פנוי בדיסק: %s) -Status.Item = ‏‏%s פריט -Status.Items = %s פריטים -Status.ItemSelected = פריט %s נבחר -Status.ItemsSelected = %s פריטים נבחרו - - -[hr-HR] - Croatian (Croatia) -Copy.DoForAll = Učini to za sljedećih -Copy.Cancel = Odustani -Copy.More = Više... -Copy.CopyHere = &Kopiraj ovdje -Copy.MoveHere = Pr&emjesti ovdje -Copy.Title = Potvrda zamjene datoteke -Copy.Subtitle = Ova mapa već sadrži datoteku naziva '%s'. -Copy.SubtitleRO = Ova mapa već sadrži datoteku samo za čitanje, nazvanu '%s'. -Copy.SubtitleSys = Ova mapa već sadrži sistemsku datoteku, nazvanu '%s'. -Copy.Prompt1 = Želite li zamijeniti postojeću datoteku -Copy.Prompt2 = s ovom? -Copy.Yes = &Da -Copy.No = &Ne -Copy.YesAll = Da za &sve -Folder.Title = Potvrda zamjene mape -Folder.Prompt = Želite li još uvijek premjestiti ili kopirati mapu? -Toolbar.GoUp = Jednu razinu gore -Toolbar.Cut = Izreži -Toolbar.Copy = Kopiraj -Toolbar.Paste = Zalijepi -Toolbar.PasteShortcut = Zalijepi prečac -Toolbar.Delete = Izbriši -Toolbar.Email = Odabrane stavke pošalji e-poštom -Toolbar.Properties = Svojstva -Toolbar.NewFolder = Nova mapa -Toolbar.ZipFolder = Nova komprimirana (zipana) mapa -Toolbar.ExtraLarge = Vrlo velike ikone -Toolbar.Large = Velike ikone -Toolbar.Medium = Srednje ikone -Toolbar.Small = Male ikone -Toolbar.List = Popis -Toolbar.Details = Detalji -Toolbar.Tiles = Pločice -Toolbar.Content = Sadržaj -Toolbar.Undo = Poništi -Toolbar.Redo = Ponovi -Toolbar.Refresh = Osvježi -Toolbar.Back = Natrag -Toolbar.Forward = Naprijed -Toolbar.Stop = Prekini -Toolbar.Rename = Preimenuj -Toolbar.SelectAll = Odaberi sve -Toolbar.CustomizeFolder = Prilagodi ovu mapu -Toolbar.MapDrive = Mapiranje mrežnog pogona -Toolbar.DisconnectDrive = Prekid veze s mrežnim pogonom -Toolbar.NavigationPane = Navigacijsko okno -Toolbar.DetailsPane = Okno s detaljima -Toolbar.PreviewPane = Okno pretpregleda -Toolbar.CopyTo = Kopiraj u -Toolbar.MoveTo = Premjesti u -Toolbar.Deselect = Bez odabira -Toolbar.InvertSelection = Obrni odabir -Toolbar.FolderOptions = Mogućnosti mapa -Toolbar.ShowHiddenFiles = Skrivene datoteke i mape -Toolbar.ShowSystemFiles = Sistemske datoteke -Toolbar.ShowExtensions = Datotečni nastavci -Status.FreeSpace = %s (slobodan prostor na disku: %s) -Status.Item = %s stavka -Status.Items = Broj stavki: %s -Status.ItemSelected = Odabrano stavki: %s -Status.ItemsSelected = Odabrano stavki: %s - - -[hu-HU] - Hungarian (Hungary) -Copy.Cancel = Mégse -Copy.More = Egyebek... -Copy.CopyHere = Más&olás ide -Copy.MoveHere = Át&helyezés ide -Copy.Title = Fájlcsere megerősítése -Copy.Subtitle = A mappa már tartalmaz egy '%s' nevű fájlt. -Copy.SubtitleRO = Ez a mappa már tartalmaz egy '%s' nevű írásvédett fájlt. -Copy.SubtitleSys = Ez a mappa már tartalmaz egy '%s' nevű rendszerfájlt. -Copy.Prompt1 = Kicseréli a létező fájlt -Copy.Prompt2 = ezzel? -Copy.Yes = &Igen -Copy.No = &Nem -Copy.YesAll = Igen, &mindet -Folder.Title = Mappacsere megerősítése -Folder.Prompt = Folytatja a műveletet? -Toolbar.GoUp = Egy szinttel feljebb -Toolbar.Cut = Kivágás -Toolbar.Copy = Másolás -Toolbar.Paste = Beillesztés -Toolbar.PasteShortcut = Parancsikon beillesztése -Toolbar.Delete = Törlés -Toolbar.Email = A kijelölt elemek elküldése e-mailben -Toolbar.Properties = Tulajdonságok -Toolbar.NewFolder = Új mappa -Toolbar.ZipFolder = Új tömörített mappa -Toolbar.ExtraLarge = Extra nagy ikonok -Toolbar.Large = Nagy ikonok -Toolbar.Medium = Közepes ikonok -Toolbar.Small = Kis ikonok -Toolbar.List = Lista -Toolbar.Details = Részletek -Toolbar.Tiles = Mozaik -Toolbar.Content = Tartalom -Toolbar.Undo = Visszavonás -Toolbar.Redo = Mégis -Toolbar.Refresh = Frissítés -Toolbar.Back = Vissza -Toolbar.Forward = Előre -Toolbar.Stop = Leállítás -Toolbar.Rename = Átnevezés -Toolbar.SelectAll = Az összes kijelölése -Toolbar.CustomizeFolder = Mappa testreszabása -Toolbar.MapDrive = Hálózati meghajtó csatlakoztatása -Toolbar.DisconnectDrive = Hálózati meghajtó leválasztása -Toolbar.NavigationPane = Navigációs ablak -Toolbar.DetailsPane = Részletek ablaktábla -Toolbar.PreviewPane = Betekintő ablaktábla -Toolbar.CopyTo = Másolási cél -Toolbar.MoveTo = Áthelyezési cél -Toolbar.Deselect = Kijelölés megszüntetése -Toolbar.InvertSelection = Kijelölés megfordítása -Toolbar.FolderOptions = Mappa beállításai -Toolbar.ShowHiddenFiles = Rejtett fájlok és mappák -Toolbar.ShowSystemFiles = Rendszerfájlok -Toolbar.ShowExtensions = Fájlnévkiterjesztések -Status.FreeSpace = %s (szabad lemezterület: %s) -Status.Item = %s elem -Status.Items = %s elem -Status.ItemSelected = %s kijelölt elem -Status.ItemsSelected = %s kijelölt elem - - -[is-IS] - Icelandic (Iceland) -Toolbar.Settings = Classic Explorer stillingar -Copy.Cancel = Hætta við -Copy.More = Meira... -Copy.CopyHere = &Afrita hingað -Copy.MoveHere = &Færa hingað -Copy.Title = Skipta út skrá -Copy.Subtitle = Endastaðurinn inniheldur þegar skrá með heitinu '%s'. -Copy.SubtitleRO = Endastaðurinn inniheldur þegar skrifvarða skrá með heitinu '%s'. -Copy.SubtitleSys = Endastaðurinn inniheldur þegar stýrikerfisskrá með heitinu '%s'. -Copy.Prompt1 = Viltu skipta út skránni á endastaðnum -Copy.Prompt2 = fyrir þessa skrá? -Copy.Yes = &Já -Copy.No = &Nei -Copy.YesAll = Já við &öllu -Folder.Title = Skipta út möppu -Folder.Prompt = Ertu viss um að þú viljir færa eða afrita möppuna? -Toolbar.GoUp = Upp um eitt þrep -Toolbar.Cut = Klippa -Toolbar.Copy = Afrita -Toolbar.Paste = Líma -Toolbar.PasteShortcut = Líma flýtileið -Toolbar.Delete = Eyða -Toolbar.Email = Senda valin atriði með tölvupósti -Toolbar.Properties = Eiginleikar -Toolbar.NewFolder = Ný mappa -Toolbar.ZipFolder = Ný þjöppuð (zip-þjöppuð) mappa -Toolbar.ExtraLarge = Mjög stór tákn -Toolbar.Large = Stór tákn -Toolbar.Medium = Meðalstór tákn -Toolbar.Small = Lítil tákn -Toolbar.List = Listi -Toolbar.Details = Upplýsingar -Toolbar.Tiles = Reitir -Toolbar.Content = Efni -Toolbar.Undo = Afturkalla -Toolbar.Redo = Endurgera -Toolbar.Refresh = Endurhlaða -Toolbar.Back = Til baka -Toolbar.Forward = Áfram -Toolbar.Stop = Stöðva -Toolbar.Rename = Endurnefna -Toolbar.SelectAll = Velja allt -Toolbar.CustomizeFolder = Sérstilla þessa möppu -Toolbar.MapDrive = Tengja netdrif -Toolbar.DisconnectDrive = Aftengja netdrif -Toolbar.NavigationPane = Yfirlitssvæði -Toolbar.DetailsPane = Upplýsingasvæði -Toolbar.PreviewPane = Forskoðunarsvæði -Toolbar.CopyTo = Afrita til -Toolbar.MoveTo = Færa til -Toolbar.Deselect = Velja ekkert -Toolbar.InvertSelection = Umsnúa vali -Toolbar.FolderOptions = Möppuvalkostir -Toolbar.ShowHiddenFiles = Faldar skrár og möppur -Toolbar.ShowSystemFiles = Kerfisskrár -Toolbar.ShowExtensions = Skráarendingar -Status.FreeSpace = %s (laust pláss: %s) -Status.Item = %s atriði -Status.Items = %s atriði -Status.ItemSelected = %s atriði valin -Status.ItemsSelected = %s atriði valin - - -[it-IT] - Italian (Italy) -Copy.Cancel = Annulla -Copy.More = Altro... -Copy.CopyHere = &Copia qui -Copy.MoveHere = &Sposta qui -Copy.Title = Conferma sostituzione file -Copy.Subtitle = La cartella contiene già un file "%s". -Copy.SubtitleRO = La cartella contiene già un file di sola lettura "%s". -Copy.SubtitleSys = La cartella contiene già un file di sistema "%s". -Copy.Prompt1 = Vuoi sostituire il file esistente -Copy.Prompt2 = con questo file? -Copy.Yes = &Sì -Copy.No = &No -Copy.YesAll = Sì t&utti -Folder.Title = Conferma sostituzione cartella -Folder.Prompt = Vuoi continuare? -Toolbar.GoUp = Cartella superiore -Toolbar.Cut = Taglia -Toolbar.Copy = Copia -Toolbar.Paste = Incolla -Toolbar.PasteShortcut = Incolla collegamento -Toolbar.Delete = Elimina -Toolbar.Email = Invia gli elementi selezionati via email -Toolbar.Properties = Proprietà -Toolbar.NewFolder = Nuova cartella -Toolbar.ZipFolder = Nuova cartella compressa -Toolbar.ExtraLarge = Icone molto grandi -Toolbar.Large = Icone grandi -Toolbar.Medium = Icone medie -Toolbar.Small = Icone piccole -Toolbar.List = Elenco -Toolbar.Details = Dettagli -Toolbar.Tiles = Titoli -Toolbar.Content = Contenuto -Toolbar.Undo = Annulla -Toolbar.Redo = Ripeti -Toolbar.Refresh = Aggiorna -Toolbar.Back = Indietro -Toolbar.Forward = Avanti -Toolbar.Stop = Termina -Toolbar.Rename = Rinomina -Toolbar.SelectAll = Seleziona tutto -Toolbar.CustomizeFolder = Personalizza cartella -Toolbar.MapDrive = Connetti unità di rete -Toolbar.DisconnectDrive = Disconnetti unità di rete -Toolbar.NavigationPane = Riquadro spostamento -Toolbar.DetailsPane = Riquadro dettagli -Toolbar.PreviewPane = Riquadro anteprima -Toolbar.CopyTo = Copia in -Toolbar.MoveTo = Sposta in -Toolbar.Deselect = Deseleziona tutto -Toolbar.InvertSelection = Inverti selezione -Toolbar.FolderOptions = Opzioni cartella -Toolbar.ShowHiddenFiles = Cartelle e file nascosti -Toolbar.ShowSystemFiles = File di sistema -Toolbar.ShowExtensions = Visualizza estensioni file -Status.FreeSpace = %s (spazio disponibile: %s) -Status.Item = %s elemento -Status.Items = %s elementi -Status.ItemSelected = %s elemento selezionato -Status.ItemsSelected = %s elementi selezionati - - -[ja-JP] - Japanese (Japan) -Copy.Cancel = キャンセル -Copy.More = その他... -Copy.CopyHere = ここにコピー(&C) -Copy.MoveHere = ここに移動(&M) -Copy.Title = ファイルの上書きの確認 -Copy.Subtitle = このフォルダーには既に '%s' ファイルが存在します。 -Copy.SubtitleRO = このフォルダーには既に読み取り専用ファイル '%s' が含まれています。 -Copy.SubtitleSys = このフォルダーには既にシステム ファイル '%s' が含まれています。 -Copy.Prompt1 = 現在のファイル -Copy.Prompt2 = を次の新しいファイルで置き換えますか? -Copy.Yes = はい(&Y) -Copy.No = いいえ(&N) -Copy.YesAll = すべて上書き(&A) -Folder.Title = フォルダーの上書きの確認 -Folder.Prompt = フォルダーを移動またはコピーしますか? -Toolbar.GoUp = 1 つ上のフォルダーへ -Toolbar.Cut = 切り取り -Toolbar.Copy = コピー -Toolbar.Paste = 貼り付け -Toolbar.PasteShortcut = ショートカットの貼り付け -Toolbar.Delete = 削除 -Toolbar.Email = 選択した項目を電子メールで送信する -Toolbar.Properties = プロパティ -Toolbar.NewFolder = 新しいフォルダー -Toolbar.ZipFolder = 新しい圧縮された (ZIP) フォルダー -Toolbar.ExtraLarge = 特大アイコン -Toolbar.Large = 大アイコン -Toolbar.Medium = 中アイコン -Toolbar.Small = 小アイコン -Toolbar.List = 一覧 -Toolbar.Details = 詳細 -Toolbar.Tiles = 並べて表示 -Toolbar.Content = コンテンツ -Toolbar.Undo = 元に戻す -Toolbar.Redo = やり直し -Toolbar.Refresh = 最新の情報に更新 -Toolbar.Back = 戻る -Toolbar.Forward = 進む -Toolbar.Stop = 中止 -Toolbar.Rename = 名前の変更 -Toolbar.SelectAll = すべて選択 -Toolbar.CustomizeFolder = このフォルダーのカスタマイズ -Toolbar.MapDrive = ネットワーク ドライブの割り当て -Toolbar.DisconnectDrive = ネットワーク ドライブの切断 -Toolbar.NavigationPane = ナビゲーション ウィンドウ -Toolbar.DetailsPane = 詳細ウィンドウ -Toolbar.PreviewPane = プレビュー ウィンドウ -Toolbar.CopyTo = コピー先​​ -Toolbar.MoveTo = 移動先​​ -Toolbar.Deselect = 選択解除 -Toolbar.InvertSelection = 選択の切り替え -Toolbar.FolderOptions = フォルダー オプション -Toolbar.ShowHiddenFiles = ファイルとフォルダーの表示 -Toolbar.ShowSystemFiles = システム ファイル -Toolbar.ShowExtensions = ファイル名拡張子 -Status.FreeSpace = %s (空きディスク領域: %s) -Status.Item = %s 個 -Status.Items = %s 個の項目 -Status.ItemSelected = %s 個の項目を選択 -Status.ItemsSelected = %s 個の項目を選択 - - -[ko-KR] - Korean (Korea) -Copy.Cancel = 취소 -Copy.More = 자세히... -Copy.CopyHere = 여기에 복사(&C) -Copy.MoveHere = 여기로 이동(&M) -Copy.Title = 파일 바꾸기 확인 -Copy.Subtitle = 이 폴더에 이미 '%s' 파일이 있습니다. -Copy.SubtitleRO = 이 폴더에 이미 '%s' 읽기 전용 파일이 있습니다. -Copy.SubtitleSys = 이 폴더에 이미 '%s' 시스템 파일이 있습니다. -Copy.Prompt1 = 기존 파일을 -Copy.Prompt2 = 이 파일로 바꾸시겠습니까? -Copy.Yes = 예(&Y) -Copy.No = 아니오(&N) -Copy.YesAll = 모두 예(&A) -Folder.Title = 폴더 바꾸기 확인 -Folder.Prompt = 폴더를 이동하거나 복사하시겠습니까? -Toolbar.GoUp = 한 수준 위로 -Toolbar.Cut = 잘라내기 -Toolbar.Copy = 복사 -Toolbar.Paste = 붙여넣기 -Toolbar.PasteShortcut = 바로 가기 붙여넣기 -Toolbar.Delete = 삭제 -Toolbar.Email = 항목을 전자 메일로 보내기 -Toolbar.Properties = 속성 -Toolbar.NewFolder = 새 폴더 -Toolbar.ZipFolder = 새 압축(ZIP) 폴더 -Toolbar.ExtraLarge = 아주 큰 아이콘 -Toolbar.Large = 큰 아이콘 -Toolbar.Medium = 보통 아이콘 -Toolbar.Small = 작은 아이콘 -Toolbar.List = 목록 -Toolbar.Details = 자세히 -Toolbar.Tiles = 나란히 보기 -Toolbar.Content = 내용 -Toolbar.Undo = 실행 취소 -Toolbar.Redo = 다시 실행 -Toolbar.Refresh = 새로 고침 -Toolbar.Back = 뒤로 -Toolbar.Forward = 앞으로 -Toolbar.Stop = 중지 -Toolbar.Rename = 이름 바꾸기 -Toolbar.SelectAll = 모두 선택 -Toolbar.CustomizeFolder = 현재 폴더 사용자 지정 -Toolbar.MapDrive = 네트워크 드라이브 연결 -Toolbar.DisconnectDrive = 네트워크 드라이브 연결 끊기 -Toolbar.NavigationPane = 탐색 창 -Toolbar.DetailsPane = 세부 정보 창 -Toolbar.PreviewPane = 미리 보기 창 -Toolbar.CopyTo = 복사 위치 -Toolbar.MoveTo = 이동 위치 -Toolbar.Deselect = 선택 안 함 -Toolbar.InvertSelection = 선택 영역 반전 -Toolbar.FolderOptions = 폴더 옵션 -Toolbar.ShowHiddenFiles = 숨김 파일 및 폴더 -Toolbar.ShowSystemFiles = 시스템 파일 -Toolbar.ShowExtensions = 파일 확장명 -Status.FreeSpace = %s (빈 디스크 공간: %s) -Status.Item = %s 항목 -Status.Items = %s 항목 -Status.ItemSelected = %s개 항목을 선택했습니다. -Status.ItemsSelected = %s개 항목을 선택했습니다. - - -[lt-LT] - Lithuanian (Lithuania) -Copy.Cancel = Atšaukti -Copy.More = Daugiau... -Copy.CopyHere = &Kopijuoti čia -Copy.MoveHere = &Perkelti čia -Copy.Title = Patvirtinti failo pakeitimą -Copy.Subtitle = Šiame aplanke jau yra failas, pavadintas '%s'. -Copy.SubtitleRO = Aplanke jau yra failas, skirtas tik skaityti, pavadintas '%s'. -Copy.SubtitleSys = Aplanke jau yra sistemos failas, pavadintas '%s'. -Copy.Prompt1 = Ar pakeisti esamą failą -Copy.Prompt2 = šiuo? -Copy.Yes = &Taip -Copy.No = &Ne -Copy.YesAll = Taip &viskam -Folder.Title = Patvirtinti aplanko pakeitimą -Folder.Prompt = Ar vis tiek perkelti, ar kopijuoti aplanką? -Toolbar.GoUp = Vienu lygiu aukščiau -Toolbar.Cut = Iškirpti -Toolbar.Copy = Kopijuoti -Toolbar.Paste = Įklijuoti -Toolbar.PasteShortcut = Įklijuoti nuorodą -Toolbar.Delete = Naikinti -Toolbar.Email = Pažymėtus elementus siųsti el. paštu -Toolbar.Properties = Ypatybės -Toolbar.NewFolder = Naujas aplankas -Toolbar.ZipFolder = Naujas suglaudintas (zip) aplankas -Toolbar.ExtraLarge = Padidintos piktogramos -Toolbar.Large = Didelės piktogramos -Toolbar.Medium = Vidutinės piktogramos -Toolbar.Small = Mažos piktogramos -Toolbar.List = Sąrašas -Toolbar.Details = Išsami informacija -Toolbar.Tiles = Išklotinės -Toolbar.Content = Turinys -Toolbar.Undo = Anuliuoti -Toolbar.Redo = Perdaryti -Toolbar.Refresh = Atnaujinti -Toolbar.Back = Atgal į: -Toolbar.Forward = Pirmyn -Toolbar.Stop = Stabdyti -Toolbar.Rename = Pervardyti -Toolbar.SelectAll = Žymėti viską -Toolbar.CustomizeFolder = Tinkinti šį aplanką -Toolbar.MapDrive = Susieti tinklo diską -Toolbar.DisconnectDrive = Atjungti tinklo diską -Toolbar.NavigationPane = Naršymo sritis -Toolbar.DetailsPane = Išsamios informacijos sritis -Toolbar.PreviewPane = Peržiūros sritis -Toolbar.CopyTo = Kopijuoti į -Toolbar.MoveTo = Perkelti į -Toolbar.Deselect = Nieko nežymėti -Toolbar.InvertSelection = Žymėti priešingai -Toolbar.FolderOptions = Aplanko parinktys -Toolbar.ShowHiddenFiles = Paslėpti failai ir aplankai -Toolbar.ShowSystemFiles = Sistemos failai -Toolbar.ShowExtensions = Failų vardų plėtiniai -Status.FreeSpace = %s (Diske laisvos vietos: %s) -Status.Item = %s elementas -Status.Items = %s elementai -Status.ItemSelected = %s pažymėtas elementas -Status.ItemsSelected = Pažymėta elementų: %s - - -[lv-LV] - Latvian (Latvia) -Copy.Cancel = Atcelt -Copy.More = Vēl... -Copy.CopyHere = &Kopēt šeit -Copy.MoveHere = &Pārvietot šeit -Copy.Title = Failu aizstāšanas apstiprināšana -Copy.Subtitle = Šajā mapē jau ir fails '%s'. -Copy.SubtitleRO = Šajā mapē jau ir tikai lasāms fails '%s'. -Copy.SubtitleSys = Šajā mapē jau ir sistēmas fails '%s'. -Copy.Prompt1 = Vai vēlaties aizstāt esošo failu -Copy.Prompt2 = ar šo? -Copy.Yes = &Jā -Copy.No = &Nē -Copy.YesAll = Jā, &visus -Folder.Title = Mapju aizstāšanas apstiprināšana -Folder.Prompt = Vai tiešām vēlaties pārvietot vai kopēt šo mapi? -Toolbar.GoUp = Vienu līmeni augstāk -Toolbar.Cut = Izgriezt -Toolbar.Copy = Kopēt -Toolbar.Paste = Ielīmēt -Toolbar.PasteShortcut = Ielīmēt saīsni -Toolbar.Delete = Dzēst -Toolbar.Email = Nosūtīt atlasītos vienumus pa e-pastu -Toolbar.Properties = Rekvizīti -Toolbar.NewFolder = Jauna mape -Toolbar.ZipFolder = Jauna saspiestā (tilpsaspiestā) mape -Toolbar.ExtraLarge = Ļoti lielas ikonas -Toolbar.Large = Lielas ikonas -Toolbar.Medium = Vidējas ikonas -Toolbar.Small = Mazas ikonas -Toolbar.List = Saraksts -Toolbar.Details = Detaļas -Toolbar.Tiles = Mozaīka -Toolbar.Content = Saturs -Toolbar.Undo = Atsaukt -Toolbar.Redo = Atcelt atsaukšanu -Toolbar.Refresh = Atsvaidzināt -Toolbar.Back = Atpakaļ -Toolbar.Forward = Uz priekšu -Toolbar.Stop = Apturēt -Toolbar.Rename = Pārdēvēt -Toolbar.SelectAll = Atlasīt visus -Toolbar.CustomizeFolder = Pielāgot šo mapi -Toolbar.MapDrive = Kartēt tīkla disku -Toolbar.DisconnectDrive = Atvienot tīkla disku -Toolbar.NavigationPane = Navigācijas rūts -Toolbar.DetailsPane = Detalizētas informācijas rūts -Toolbar.PreviewPane = Priekšskatījuma rūts -Toolbar.CopyTo = Kopēt uz -Toolbar.MoveTo = Pārvietot uz -Toolbar.Deselect = Neatlasīt neko -Toolbar.InvertSelection = Mainīt atlasi uz pretējo -Toolbar.FolderOptions = Mapes opcijas -Toolbar.ShowHiddenFiles = Slēptie faili un mapes -Toolbar.ShowSystemFiles = Sistēmas faili -Toolbar.ShowExtensions = Failu nosaukumu paplašinājumi -Status.FreeSpace = %s (brīvā vieta diskā: %s) -Status.Item = %s vienums -Status.Items = %s vienumi -Status.ItemSelected = Atlasīts %s vienums -Status.ItemsSelected = Atlasīti %s vienumi - - -[mk-MK] - Macedonian (Macedonia) -Copy.Cancel = Откажи -Copy.More = Повеќе... -Copy.CopyHere = Копирај тука -Copy.MoveHere = Премести тука -Copy.Title = Потврди замена на фајл -Copy.Subtitle = Тој фолдер веќе содржи фајл со име '%s'. -Copy.SubtitleRO = Тој фолдер веќе содржи фајл само за читање со име '%s'. -Copy.SubtitleSys = Тој фолдер веќе содржи системски фајл со име '%s'. -Copy.Prompt1 = Дали сакате да замените постоечкиот фајл -Copy.Prompt2 = а тој? -Copy.Yes = Да -Copy.No = Не -Copy.YesAll = "Да" за сите -Folder.Title = Потврда за промена на фолдерот -Folder.Prompt = Сеуште ли сакате да го преместите или копирате фолдерот? -Toolbar.GoUp = Едно ниво нагоре -Toolbar.Cut = Исечи -Toolbar.Copy = Копирај -Toolbar.Paste = Стави -Toolbar.PasteShortcut = Стави краток пат -Toolbar.Delete = Избриши -Toolbar.Email = Испрати ги селектираните фајлови по електронска пошта -Toolbar.Properties = Својства -Toolbar.NewFolder = Нов фолдер -Toolbar.ZipFolder = Нова компресирана (зипувана) папка -Toolbar.ExtraLarge = Многу големи икони -Toolbar.Large = Големи икони -Toolbar.Medium = Средни икони -Toolbar.Small = Мали икони -Toolbar.List = Список -Toolbar.Details = Детали -Toolbar.Tiles = Мозаик -Toolbar.Content = Содржина -Toolbar.Undo = врати -Toolbar.Redo = повтори -Toolbar.Refresh = Обнови -Toolbar.Back = Назад -Toolbar.Forward = Напред -Toolbar.Stop = Застани -Toolbar.Rename = Преименување -Toolbar.SelectAll = Селектирај ги сите -Toolbar.CustomizeFolder = Персонализирање на тој фолдер -Toolbar.MapDrive = Назначување на мрежен уред -Toolbar.DisconnectDrive = Исклучи го мрежниот уред -Toolbar.NavigationPane = Навигационен екран -Toolbar.DetailsPane = Екран за подетални податоци -Toolbar.PreviewPane = Прозорец за визуализација -Toolbar.CopyTo = Копирај во -Toolbar.MoveTo = Премести во -Toolbar.Deselect = Не избирај ништо -Toolbar.InvertSelection = Преврти го изборот -Toolbar.FolderOptions = Опции за папка -Toolbar.ShowHiddenFiles = Сокриени датотеки и папки -Toolbar.ShowSystemFiles = Системски датотеки -Toolbar.ShowExtensions = Датотечни наставки -Status.FreeSpace = %s (Слободно место на дискот: %s) -Status.Item = %s фајл -Status.Items = %s фајлови -Status.ItemSelected = %s селектиран фајл -Status.ItemsSelected = %s селектирани фајлови - - -[nb-NO] - Norwegian, Bokmål (Norway) -Copy.Cancel = Avbryt -Copy.More = Mer... -Copy.CopyHere = &Kopier hit -Copy.MoveHere = &Flytt hit -Copy.Title = Bekreft erstatting av fil -Copy.Subtitle = Mappen inneholder allerede filen %s. -Copy.SubtitleRO = Mappen inneholder allerede den skrivebeskyttede filen %s. -Copy.SubtitleSys = Mappen inneholder allerede systemfilen %s. -Copy.Prompt1 = Vil du erstatte den eksisterende filen -Copy.Prompt2 = med denne? -Copy.Yes = &Ja -Copy.No = &Nei -Copy.YesAll = J&a til alt -Folder.Title = Bekreft erstatting av mappe -Folder.Prompt = Vil du likevel flytte eller kopiere mappen? -Toolbar.GoUp = Opp ett nivå -Toolbar.Cut = Klipp ut -Toolbar.Copy = Kopier -Toolbar.Paste = Lim inn -Toolbar.PasteShortcut = Lim inn snarvei -Toolbar.Delete = Slett -Toolbar.Email = Send valgte elementer via e-post -Toolbar.Properties = Egenskaper -Toolbar.NewFolder = Ny mappe -Toolbar.ZipFolder = Ny komprimert (zippet) mappe -Toolbar.ExtraLarge = Ekstra store ikoner -Toolbar.Large = Store ikoner -Toolbar.Medium = Middels store ikoner -Toolbar.Small = Små ikoner -Toolbar.List = Liste -Toolbar.Details = Detaljer -Toolbar.Tiles = Side ved side -Toolbar.Content = Innhold -Toolbar.Undo = Angre -Toolbar.Redo = Gjør om -Toolbar.Refresh = Oppdater -Toolbar.Back = Tilbake -Toolbar.Forward = Fremover -Toolbar.Stop = Stopp -Toolbar.Rename = Gi nytt navn -Toolbar.SelectAll = Merk alt -Toolbar.CustomizeFolder = Tilpass denne mappen -Toolbar.MapDrive = Koble til nettverksstasjon -Toolbar.DisconnectDrive = Koble fra nettverksstasjon -Toolbar.NavigationPane = Navigasjonsrute -Toolbar.DetailsPane = Detaljrute -Toolbar.PreviewPane = Forhåndsvisningsrute -Toolbar.CopyTo = Kopier til -Toolbar.MoveTo = Flytt til -Toolbar.Deselect = Merk ingenting -Toolbar.InvertSelection = Inverter utvalg -Toolbar.FolderOptions = Mappealternativer -Toolbar.ShowHiddenFiles = Skjulte filer og mapper -Toolbar.ShowSystemFiles = Systemfiler -Toolbar.ShowExtensions = Filtyper -Status.FreeSpace = %s (Ledig plass på disken: %s) -Status.Item = %s element -Status.Items = %s elementer -Status.ItemSelected = %s element er merket -Status.ItemsSelected = %s elementer er merket - - -[nl-NL] - Dutch (Netherlands) -Copy.Cancel = Annuleren -Copy.More = Meer... -Copy.CopyHere = Hierheen &kopiëren -Copy.MoveHere = Hi&erheen verplaatsen -Copy.Title = Vervangen van bestand bevestigen -Copy.Subtitle = In deze map bevindt zich al een bestand met de naam %s. -Copy.SubtitleRO = In deze map bevindt zich al een bestand met het kenmerk Alleen-lezen en de naam %s. -Copy.SubtitleSys = In deze map bevindt zich al een systeembestand met de naam %s. -Copy.Prompt1 = Wilt u het bestaande bestand: -Copy.Prompt2 = vervangen door het onderstaande bestand? -Copy.Yes = &Ja -Copy.No = &Nee -Copy.YesAll = J&a op alles -Folder.Title = Vervangen van map bevestigen -Folder.Prompt = Wilt u de bestanden in de bestaande map vervangen door de bestanden in de map die u verplaatst of kopieert, als de bestanden dezelfde naam hebben? -Toolbar.GoUp = Bovenliggende map -Toolbar.Cut = Knippen -Toolbar.Copy = Kopiëren -Toolbar.Paste = Plakken -Toolbar.PasteShortcut = Snelkoppeling plakken -Toolbar.Delete = Verwijderen -Toolbar.Email = De geselecteerde items per e-mail verzenden -Toolbar.Properties = Eigenschappen -Toolbar.NewFolder = Nieuwe map -Toolbar.ZipFolder = Nieuwe gecomprimeerde (gezipte) map -Toolbar.ExtraLarge = Extra grote pictogrammen -Toolbar.Large = Grote pictogrammen -Toolbar.Medium = Normale pictogrammen -Toolbar.Small = Kleine pictogrammen -Toolbar.List = Lijst -Toolbar.Details = Details -Toolbar.Tiles = Tegels -Toolbar.Content = Inhoud -Toolbar.Undo = Ongedaan maken -Toolbar.Redo = Opnieuw -Toolbar.Refresh = Vernieuwen -Toolbar.Back = Vorige -Toolbar.Forward = Volgende -Toolbar.Stop = Stoppen -Toolbar.Rename = Naam wijzigen -Toolbar.SelectAll = Alles selecteren -Toolbar.CustomizeFolder = Deze map aanpassen -Toolbar.MapDrive = Netwerkverbinding maken -Toolbar.DisconnectDrive = Netwerkverbinding verbreken -Toolbar.NavigationPane = Navigatievenster -Toolbar.DetailsPane = Detailvenster -Toolbar.PreviewPane = Voorbeeldvenster -Toolbar.CopyTo = Kopiëren naar -Toolbar.MoveTo = Verplaatsen naar -Toolbar.Deselect = Niets selecteren -Toolbar.InvertSelection = Selectie omkeren -Toolbar.FolderOptions = Mapopties -Toolbar.ShowHiddenFiles = Verborgen bestanden en mappen -Toolbar.ShowSystemFiles = Systeembestanden -Toolbar.ShowExtensions = Bestandsnaamextensies -Status.FreeSpace = %s (beschikbare schijfruimte: %s) -Status.Item = %s item -Status.Items = %s items -Status.ItemSelected = %s item geselecteerd -Status.ItemsSelected = %s items geselecteerd - - -[pl-PL] - Polish (Poland) -Copy.Cancel = Anuluj -Copy.More = Więcej... -Copy.CopyHere = &Kopiuj tutaj -Copy.MoveHere = Prze&nieś tutaj -Copy.Title = Potwierdź zamianę pliku -Copy.Subtitle = Ten folder zawiera już plik o nazwie „%s”. -Copy.SubtitleRO = Ten folder zawiera już plik tylko do odczytu o nazwie „%s”. -Copy.SubtitleSys = Ten folder zawiera już plik systemowy o nazwie „%s”. -Copy.Prompt1 = Czy chcesz zamienić istniejący plik -Copy.Prompt2 = na następujący? -Copy.Yes = &Tak -Copy.No = &Nie -Copy.YesAll = Tak na &wszystkie -Folder.Title = Potwierdź zamianę folderu -Folder.Prompt = Czy nadal chcesz przenieść lub skopiować ten folder? -Toolbar.GoUp = Do góry o jeden poziom -Toolbar.Cut = Wytnij -Toolbar.Copy = Kopiuj -Toolbar.Paste = Wklej -Toolbar.PasteShortcut = Wklej skrót -Toolbar.Delete = Usuń -Toolbar.Email = Wyślij zaznaczone elementy pocztą e-mail -Toolbar.Properties = Właściwości -Toolbar.NewFolder = Nowy folder -Toolbar.ZipFolder = Nowy folder skompresowany (zip) -Toolbar.ExtraLarge = Bardzo duże ikony -Toolbar.Large = Duże ikony -Toolbar.Medium = Średnie ikony -Toolbar.Small = Małe ikony -Toolbar.List = Lista -Toolbar.Details = Szczegóły -Toolbar.Tiles = Kafelki -Toolbar.Content = Zawartość -Toolbar.Undo = Cofnij -Toolbar.Redo = Wykonaj ponownie -Toolbar.Refresh = Odśwież -Toolbar.Back = Wstecz -Toolbar.Forward = Dalej -Toolbar.Stop = Zatrzymaj -Toolbar.Rename = Zmień nazwę -Toolbar.SelectAll = Zaznacz wszystko -Toolbar.CustomizeFolder = Dostosuj ten folder -Toolbar.MapDrive = Mapuj dysk sieciowy -Toolbar.DisconnectDrive = Odłącz dysk sieciowy -Toolbar.NavigationPane = Okienko nawigacji -Toolbar.DetailsPane = Okienko szczegółów -Toolbar.PreviewPane = Okienko podglądu -Toolbar.CopyTo = Kopiuj do -Toolbar.MoveTo = Przenieś do -Toolbar.Deselect = Nie zaznaczaj nic -Toolbar.InvertSelection = Odwróć zaznaczenie -Toolbar.FolderOptions = Opcje folderów -Toolbar.ShowHiddenFiles = Ukryte pliki i foldery -Toolbar.ShowSystemFiles = Pliki systemowe -Toolbar.ShowExtensions = Rozszerzenia nazw plików -Status.FreeSpace = %s (Wolne miejsce: %s) -Status.Item = %s element -Status.Items = Elementów: %s -Status.ItemSelected = Wybranych elementów: %s -Status.ItemsSelected = Wybranych elementów: %s - - -[pt-BR] - Portuguese (Brazil) -Copy.Cancel = Cancelar -Copy.More = Mais... -Copy.CopyHere = &Copiar Aqui -Copy.MoveHere = Mov&er para Cá -Copy.Title = Confirmar substituição de arquivo -Copy.Subtitle = Esta pasta já contém um arquivo chamado '%s'. -Copy.SubtitleRO = Esta pasta já contém um arquivo somente leitura chamado '%s'. -Copy.SubtitleSys = Esta pasta já contém um arquivo de sistema chamado '%s'. -Copy.Prompt1 = Deseja substituir o arquivo existente -Copy.Prompt2 = por este? -Copy.Yes = &Sim -Copy.No = &Não -Copy.YesAll = Sim para &todos -Folder.Title = Confirmar substituição de pasta -Folder.Prompt = Deseja mover a pasta mesmo assim? -Toolbar.GoUp = Um Nível Acima -Toolbar.Cut = Recortar -Toolbar.Copy = Copiar -Toolbar.Paste = Colar -Toolbar.PasteShortcut = Colar Atalho -Toolbar.Delete = Excluir -Toolbar.Email = Enviar os itens selecionados por email -Toolbar.Properties = Propriedades -Toolbar.NewFolder = Nova Pasta -Toolbar.ZipFolder = Nova Pasta Compactada -Toolbar.ExtraLarge = Ícones Extra Grandes -Toolbar.Large = Ícones Grandes -Toolbar.Medium = Ícones Médios -Toolbar.Small = Ícones Pequenos -Toolbar.List = Lista -Toolbar.Details = Detalhes -Toolbar.Tiles = Lado a Lado -Toolbar.Content = Conteúdo -Toolbar.Undo = Desfazer -Toolbar.Redo = Refazer -Toolbar.Refresh = Atualizar -Toolbar.Back = Voltar -Toolbar.Forward = Avançar -Toolbar.Stop = Parar -Toolbar.Rename = Renomear -Toolbar.SelectAll = Selecionar tudo -Toolbar.CustomizeFolder = Personalizar esta pasta -Toolbar.MapDrive = Mapear unidade de rede -Toolbar.DisconnectDrive = Desconectar unidade de rede -Toolbar.NavigationPane = Painel de navegação -Toolbar.DetailsPane = Painel de detalhes -Toolbar.PreviewPane = Painel de visualização -Toolbar.CopyTo = Copiar para -Toolbar.MoveTo = Mover para -Toolbar.Deselect = Selecionar nenhum -Toolbar.InvertSelection = Inverter seleção -Toolbar.FolderOptions = Opções de pasta -Toolbar.ShowHiddenFiles = Pastas e arquivos ocultos -Toolbar.ShowSystemFiles = Arquivos do sistema -Toolbar.ShowExtensions = Extensões de nomes de arquivos -Status.FreeSpace = %s (espaço livre em disco: %s) -Status.Item = %s item -Status.Items = %s itens -Status.ItemSelected = %s item selecionado -Status.ItemsSelected = %s itens selecionados - - -[pt-PT] - Portuguese (Portugal) -Copy.Cancel = Cancelar -Copy.More = Mais... -Copy.CopyHere = &Copiar para aqui -Copy.MoveHere = &Mover para aqui -Copy.Title = Confirmar substituição de ficheiro(s) -Copy.Subtitle = Esta pasta já contém um ficheiro com o nome '%s'. -Copy.SubtitleRO = Esta pasta já contém um ficheiro só de leitura com o nome '%s'. -Copy.SubtitleSys = Esta pasta já contém um ficheiro de sistema com o nome '%s'. -Copy.Prompt1 = Pretende substituir o ficheiro existente -Copy.Prompt2 = por este? -Copy.Yes = &Sim -Copy.No = &Não -Copy.YesAll = Sim p&ara todos -Folder.Title = Confirmar substituição de pasta(s) -Folder.Prompt = Pretende continuar a mover ou copiar a pasta? -Toolbar.GoUp = Um nível acima -Toolbar.Cut = Cortar -Toolbar.Copy = Copiar -Toolbar.Paste = Colar -Toolbar.PasteShortcut = Colar atalho -Toolbar.Delete = Eliminar -Toolbar.Email = Enviar os itens seleccionados por correio electrónico -Toolbar.Properties = Propriedades -Toolbar.NewFolder = Nova pasta -Toolbar.ZipFolder = Nova Pasta Comprimida (zipada) -Toolbar.ExtraLarge = Ícones muito grandes -Toolbar.Large = Ícones grandes -Toolbar.Medium = Ícones médios -Toolbar.Small = Ícones pequenos -Toolbar.List = Lista -Toolbar.Details = Detalhes -Toolbar.Tiles = Mosaicos -Toolbar.Content = Conteúdo -Toolbar.Undo = Anular -Toolbar.Redo = Refazer -Toolbar.Refresh = Actualizar -Toolbar.Back = Anterior -Toolbar.Forward = Avançar -Toolbar.Stop = Parar -Toolbar.Rename = Mudar o nome -Toolbar.SelectAll = Seleccionar tudo -Toolbar.CustomizeFolder = Personalizar esta pasta -Toolbar.MapDrive = Mapear unidade de rede -Toolbar.DisconnectDrive = Desligar unidade de rede -Toolbar.NavigationPane = Painel de navegação -Toolbar.DetailsPane = Painel de detalhes -Toolbar.PreviewPane = Painel de pré-visualização -Toolbar.CopyTo = Copiar para -Toolbar.MoveTo = Mover para -Toolbar.Deselect = Desmarcar tudo -Toolbar.InvertSelection = Inverter seleção -Toolbar.FolderOptions = Opções de pastas -Toolbar.ShowHiddenFiles = Ficheiros e pastas ocultos -Toolbar.ShowSystemFiles = Ficheiros de sistema -Toolbar.ShowExtensions = Extensões de nome de ficheiro -Status.FreeSpace = %s (Espaço livre em disco: %s) -Status.Item = %s item -Status.Items = %s itens -Status.ItemSelected = %s item seleccionado -Status.ItemsSelected = %s itens seleccionados - - -[ro-RO] - Romanian (Romania) -Copy.Cancel = Revocare -Copy.More = Mai multe... -Copy.CopyHere = &Copiere în acest loc -Copy.MoveHere = &Mutare în acest loc -Copy.Title = Confirmare înlocuire fişier -Copy.Subtitle = Acest folder conţine deja un fişier cu numele '%s'. -Copy.SubtitleRO = Acest folder conţine deja un fişier doar în citire cu numele '%s'. -Copy.SubtitleSys = Acest folder conţine deja un fişier de sistem cu numele '%s'. -Copy.Prompt1 = Înlocuiţi fişierul existent -Copy.Prompt2 = cu acesta? -Copy.Yes = &Da -Copy.No = &Nu -Copy.YesAll = D&a pentru tot -Folder.Title = Confirmare înlocuire folder -Folder.Prompt = Totuşi, mutaţi sau copiaţi folderul? -Toolbar.GoUp = Mai sus cu un nivel -Toolbar.Cut = Decupare -Toolbar.Copy = Copiere -Toolbar.Paste = Lipire -Toolbar.PasteShortcut = Lipire comandă rapidă -Toolbar.Delete = Ștergere -Toolbar.Email = Se trimit prin poştă electronică elementele selectate -Toolbar.Properties = Proprietăți -Toolbar.NewFolder = Folder nou -Toolbar.ZipFolder = Folder comprimat (ZIP) nou -Toolbar.ExtraLarge = Pictograme foarte mari -Toolbar.Large = Pictograme mari -Toolbar.Medium = Pictograme medii -Toolbar.Small = Pictograme mici -Toolbar.List = Listă -Toolbar.Details = Detalii -Toolbar.Tiles = Cadre -Toolbar.Content = Cuprins -Toolbar.Undo = Anulare -Toolbar.Redo = Refacere -Toolbar.Refresh = Reîmprospătare -Toolbar.Back = Înapoi -Toolbar.Forward = Înainte -Toolbar.Stop = Oprire -Toolbar.Rename = Redenumire -Toolbar.SelectAll = Selectare totală -Toolbar.CustomizeFolder = Particularizare folder -Toolbar.MapDrive = Conectare unitate de rețea -Toolbar.DisconnectDrive = Deconectare unitate de rețea -Toolbar.NavigationPane = Panou de navigare -Toolbar.DetailsPane = Panou detalii -Toolbar.PreviewPane = Panou de examinare -Toolbar.CopyTo = Copiere în -Toolbar.MoveTo = Mutare la -Toolbar.Deselect = Deselectare totală -Toolbar.InvertSelection = Inversare selecție -Toolbar.FolderOptions = Opțiuni folder -Toolbar.ShowHiddenFiles = Fișiere și foldere ascunse -Toolbar.ShowSystemFiles = Fișiere de sistem -Toolbar.ShowExtensions = Extensii nume de fișier -Status.FreeSpace = %s (Spațiu liber pe disc: %s) -Status.Item = Element %s -Status.Items = %s elemente -Status.ItemSelected = %s element selectat -Status.ItemsSelected = %s elemente selectate - - -[ru-RU] - Russian (Russia) -Copy.Cancel = Отмена -Copy.More = Подробнее... -Copy.CopyHere = &Копировать -Copy.MoveHere = П&ереместить -Copy.Title = Подтверждение замены файла -Copy.Subtitle = Папка уже содержит файл "%s". -Copy.SubtitleRO = Папка уже содержит доступный только для чтения файл "%s". -Copy.SubtitleSys = Папка уже содержит системный файл "%s". -Copy.Prompt1 = Заменить имеющийся файл -Copy.Prompt2 = следующим файлом? -Copy.Yes = &Да -Copy.No = &Нет -Copy.YesAll = Да - для &всех -Folder.Title = Подтверждение замены папки -Folder.Prompt = Заменить существующие в ней файлы перемещаемыми при совпадении имен? -Toolbar.GoUp = На один уровень вверх -Toolbar.Cut = Вырезать -Toolbar.Copy = Копировать -Toolbar.Paste = Вставить -Toolbar.PasteShortcut = Вставить ярлык -Toolbar.Delete = Удалить -Toolbar.Email = Отправка выбранных объектов по электронной почте -Toolbar.Properties = Свойства -Toolbar.NewFolder = Новая папка -Toolbar.ZipFolder = Новая сжатая ZIP-папка -Toolbar.ExtraLarge = Огромные значки -Toolbar.Large = Крупные значки -Toolbar.Medium = Обычные значки -Toolbar.Small = Мелкие значки -Toolbar.List = Список -Toolbar.Details = Таблица -Toolbar.Tiles = Плитка -Toolbar.Content = Содержимое -Toolbar.Undo = Отменить -Toolbar.Redo = Вернуть -Toolbar.Refresh = Обновить -Toolbar.Back = Назад -Toolbar.Forward = Вперед -Toolbar.Stop = Остановить -Toolbar.Rename = Переименовать -Toolbar.SelectAll = Выделить все -Toolbar.CustomizeFolder = Настроить папку -Toolbar.MapDrive = Подключить сетевой диск -Toolbar.DisconnectDrive = Отключить сетевой диск -Toolbar.NavigationPane = Область переходов -Toolbar.DetailsPane = Область сведений -Toolbar.PreviewPane = Область предпросмотра -Toolbar.CopyTo = Копировать в -Toolbar.MoveTo = Переместить в -Toolbar.Deselect = Снять выделение -Toolbar.InvertSelection = Обратить выделение -Toolbar.FolderOptions = Параметры папок -Toolbar.ShowHiddenFiles = Скрытые файлы и папки -Toolbar.ShowSystemFiles = Системные файлы -Toolbar.ShowExtensions = Расширения имен файлов -Status.FreeSpace = %s (свободно на диске: %s) -Status.Item = %s элемент -Status.Items = Элементов: %s -Status.ItemSelected = Выбран элемент: %s -Status.ItemsSelected = Выбрано элементов: %s - - -[sk-SK] - Slovak (Slovakia) -Copy.Cancel = Zrušiť -Copy.More = Ďalšie... -Copy.CopyHere = &Kopírovať sem -Copy.MoveHere = &Premiestniť sem -Copy.Title = Potvrdenie nahradenia súboru -Copy.Subtitle = Tento priečinok už obsahuje súbor s názvom %s. -Copy.SubtitleRO = Tento priečinok už obsahuje súbor s názvom %s, ktorý je iba na čítanie. -Copy.SubtitleSys = Tento priečinok už obsahuje systémový súbor s názvom %s. -Copy.Prompt1 = Chcete nahradiť existujúci súbor -Copy.Prompt2 = týmto súborom? -Copy.Yes = Án&o -Copy.No = &Nie -Copy.YesAll = Áno pre &všetky -Folder.Title = Potvrdenie nahradenia priečinka -Folder.Prompt = Naozaj chcete premiestniť alebo skopírovať priečinok? -Toolbar.GoUp = O úroveň vyššie -Toolbar.Cut = Vystrihnúť -Toolbar.Copy = Kopírovať -Toolbar.Paste = Prilepiť -Toolbar.PasteShortcut = Prilepiť odkaz -Toolbar.Delete = Odstrániť -Toolbar.Email = Vybraté položky odoslať e-mailom -Toolbar.Properties = Vlastnosti -Toolbar.NewFolder = Nový priečinok -Toolbar.ZipFolder = Nový komprimovaný priečinok (ZIP) -Toolbar.ExtraLarge = Veľmi veľké ikony -Toolbar.Large = Veľké ikony -Toolbar.Medium = Stredne veľké ikony -Toolbar.Small = Malé ikony -Toolbar.List = Zoznam -Toolbar.Details = Podrobnosti -Toolbar.Tiles = Dlaždice -Toolbar.Content = Obsah -Toolbar.Undo = Späť -Toolbar.Redo = Znova -Toolbar.Refresh = Obnoviť -Toolbar.Back = Dozadu -Toolbar.Forward = Dopredu -Toolbar.Stop = Zastaviť -Toolbar.Rename = Premenovať -Toolbar.SelectAll = Vybrať všetko -Toolbar.CustomizeFolder = Prispôsobiť priečinok -Toolbar.MapDrive = Pripojiť sieťovú jednotku -Toolbar.DisconnectDrive = Odpojiť sieťovú jednotku -Toolbar.NavigationPane = Navigačná tabla -Toolbar.DetailsPane = Tabla podrobností -Toolbar.PreviewPane = Tabla ukážky -Toolbar.CopyTo = Kopírovať do -Toolbar.MoveTo = Premiestniť do -Toolbar.Deselect = Zrušiť výber -Toolbar.InvertSelection = Invertovať výber -Toolbar.FolderOptions = Možnosti priečinka -Toolbar.ShowHiddenFiles = Skryté súbory a priečinky -Toolbar.ShowSystemFiles = Systémové súbory -Toolbar.ShowExtensions = Prípony názvov súborov -Status.FreeSpace = %s (voľné miesto na disku: %s) -Status.Item = %s položka -Status.Items = Počet položiek: %s -Status.ItemSelected = Počet vybratých položiek: %s -Status.ItemsSelected = Počet vybratých položiek: %s - - -[sl-SI] - Slovenian (Slovenia) -Copy.Cancel = Prekliči -Copy.More = Dodatno ... -Copy.CopyHere = &Kopiraj sem -Copy.MoveHere = &Premakni sem -Copy.Title = Potrditev zamenjave datoteke -Copy.Subtitle = Ta mapa že vsebuje datoteko z imenom »%s«. -Copy.SubtitleRO = Ta mapa že vsebuje datoteko samo za branje z imenom »%s«. -Copy.SubtitleSys = Ta mapa že vsebuje sistemsko datoteko z imenom »%s«. -Copy.Prompt1 = Ali želite zamenjati obstoječo datoteko -Copy.Prompt2 = s to datoteko? -Copy.Yes = &Da -Copy.No = &Ne -Copy.YesAll = Da za &vse -Folder.Title = Potrditev zamenjave mape -Folder.Prompt = Ali še vedno želite premakniti ali kopirati mapo? -Toolbar.GoUp = V nadrejeno mapo -Toolbar.Cut = Izreži -Toolbar.Copy = Kopiraj -Toolbar.Paste = Prilepi -Toolbar.PasteShortcut = Prilepi bližnjico -Toolbar.Delete = Izbriši -Toolbar.Email = Pošlji izbrane elemente prek e-pošte -Toolbar.Properties = Lastnosti -Toolbar.NewFolder = Nova mapa -Toolbar.ZipFolder = Nova stisnjena mapa -Toolbar.ExtraLarge = Izredno velike ikone -Toolbar.Large = Velike ikone -Toolbar.Medium = Srednje velike ikone -Toolbar.Small = Male ikone -Toolbar.List = Seznam -Toolbar.Details = Podrobnosti -Toolbar.Tiles = Ploščice -Toolbar.Content = Vsebina -Toolbar.Undo = Razveljavi -Toolbar.Redo = Uveljavi -Toolbar.Refresh = Osveži -Toolbar.Back = Nazaj -Toolbar.Forward = Naprej -Toolbar.Stop = Ustavi -Toolbar.Rename = Preimenuj -Toolbar.SelectAll = Izberi vse -Toolbar.CustomizeFolder = Prilagodi mapo -Toolbar.MapDrive = Preslikaj omrežni pogon -Toolbar.DisconnectDrive = Prekini povezavo z omrežnim pogonom -Toolbar.NavigationPane = Podokno za krmarjenje -Toolbar.DetailsPane = Podokno s podrobnostmi -Toolbar.PreviewPane = Podokno za predogled -Toolbar.CopyTo = Kopiraj v -Toolbar.MoveTo = Premakni v -Toolbar.Deselect = Ne izberi ničesar -Toolbar.InvertSelection = Preobrni izbor -Toolbar.FolderOptions = Možnosti mape -Toolbar.ShowHiddenFiles = Skrite datoteke in mape -Toolbar.ShowSystemFiles = Sistemske datoteke -Toolbar.ShowExtensions = Datotečne pripone -Status.FreeSpace = %s (Nezaseden prostor na disku: %s) -Status.Item = %s predmet -Status.Items = Št. predmetov: %s -Status.ItemSelected = Izbrano je to število elementov: %s -Status.ItemsSelected = Izbrano je to število elementov: %s - - -[sr-Latn-CS] - Serbian (Latin, Serbia) -Copy.Cancel = Otkaži -Copy.More = Više... -Copy.CopyHere = &Kopiraj ovde -Copy.MoveHere = &Premesti ovde -Copy.Title = Potvrdite zamenu datoteke -Copy.Subtitle = Ova fascikla već sadrži datoteku po imenu '%s'. -Copy.SubtitleRO = Ova fascikla već sadrži datoteku samo za čitanje po imenu '%s'. -Copy.SubtitleSys = Ova fascikla već sadrži sistemsku datoteku po imenu '%s'. -Copy.Prompt1 = Želite li da zamenite postojeću datoteku -Copy.Prompt2 = ovom? -Copy.Yes = &Da -Copy.No = &Ne -Copy.YesAll = Da za &sve -Folder.Title = Potvrdite zamenu fascikle -Folder.Prompt = Želite li zaista da premestite ili kopirate ovu fasciklu? -Toolbar.GoUp = Jedan nivo nagore -Toolbar.Cut = Iseci -Toolbar.Copy = Kopiraj -Toolbar.Paste = Nalepi -Toolbar.PasteShortcut = Nalepi prečicu -Toolbar.Delete = Izbriši -Toolbar.Email = Pošalji izabrane stavke e-poštom -Toolbar.Properties = Svojstva -Toolbar.NewFolder = Nova fascikla -Toolbar.ZipFolder = Nova komprimovana (zipovana) fascikla -Toolbar.ExtraLarge = Veoma velike ikone -Toolbar.Large = Velike ikone -Toolbar.Medium = Srednje ikone -Toolbar.Small = Male ikone -Toolbar.List = Lista -Toolbar.Details = Detalji -Toolbar.Tiles = Naporedno slaganje -Toolbar.Content = Sadržaj -Toolbar.Undo = Opozovi radnju -Toolbar.Redo = Ponovi radnju -Toolbar.Refresh = Osveži -Toolbar.Back = Nazad -Toolbar.Forward = Napred -Toolbar.Stop = Zaustavi -Toolbar.Rename = Preimenuj -Toolbar.SelectAll = Izaberi sve -Toolbar.CustomizeFolder = Prilagođavanje fascikle -Toolbar.MapDrive = Mapiraj mrežni disk -Toolbar.DisconnectDrive = Prekini vezu sa mrežnim diskom -Toolbar.NavigationPane = Okno za navigaciju -Toolbar.DetailsPane = Okno sa detaljima -Toolbar.PreviewPane = Okno za pregled -Toolbar.CopyTo = Kopiraj u -Toolbar.MoveTo = Premesti u -Toolbar.Deselect = Nemoj da izabereš nijedno -Toolbar.InvertSelection = Obrni izbor -Toolbar.FolderOptions = Opcije fascikle -Toolbar.ShowHiddenFiles = Skrivene datoteke i fascikle -Toolbar.ShowSystemFiles = Sistemske datoteke -Toolbar.ShowExtensions = Oznake tipa datoteke -Status.FreeSpace = %s (slobodan prostor na disku: %s) -Status.Item = %s stavka -Status.Items = %s stavki -Status.ItemSelected = %s izabrana stavka -Status.ItemsSelected = %s izabranih stavki - - -[sv-SE] - Swedish (Sweden) -Copy.Cancel = Avbryt -Copy.More = Mer... -Copy.CopyHere = K&opiera hit -Copy.MoveHere = &Flytta hit -Copy.Title = Bekräfta ersättning av fil -Copy.Subtitle = Den här mappen innehåller redan en fil med namnet %s. -Copy.SubtitleRO = Den här mappen innehåller redan en skrivskyddad fil med namnet %s. -Copy.SubtitleSys = Den här mappen innehåller redan en systemfil med namnet %s. -Copy.Prompt1 = Vill du ersätta den befintliga filen -Copy.Prompt2 = med följande fil? -Copy.Yes = &Ja -Copy.No = &Nej -Copy.YesAll = Ersätt &alla -Folder.Title = Bekräfta ersättning av mapp -Folder.Prompt = Vill du ersätta filerna i den mappen om de har samma namn som filerna i mappen som flyttas eller kopieras? -Toolbar.GoUp = Upp en nivå -Toolbar.Cut = Klipp ut -Toolbar.Copy = Kopiera -Toolbar.Paste = Klistra in -Toolbar.PasteShortcut = Klistra in genväg -Toolbar.Delete = Ta bort -Toolbar.Email = Skicka de markerade objekten i e-postmeddelanden -Toolbar.Properties = Egenskaper -Toolbar.NewFolder = Ny mapp -Toolbar.ZipFolder = Ny komprimerad mapp -Toolbar.ExtraLarge = Extra stora ikoner -Toolbar.Large = Stora ikoner -Toolbar.Medium = Medelstora ikoner -Toolbar.Small = Små ikoner -Toolbar.List = Lista -Toolbar.Details = Detaljerad lista -Toolbar.Tiles = Sammanfattning -Toolbar.Content = Innehåll -Toolbar.Undo = Ångra -Toolbar.Redo = Gör om -Toolbar.Refresh = Uppdatera -Toolbar.Back = Bakåt -Toolbar.Forward = Framåt -Toolbar.Stop = Stoppa -Toolbar.Rename = Byt namn -Toolbar.SelectAll = Markera alla -Toolbar.CustomizeFolder = Anpassa den här mappen -Toolbar.MapDrive = Anslut nätverksenhet -Toolbar.DisconnectDrive = Koppla från nätverksenhet -Toolbar.NavigationPane = Navigeringsfönstret -Toolbar.DetailsPane = Informationsfönstret -Toolbar.PreviewPane = Förhandsgranskningsfönstret -Toolbar.CopyTo = Kopiera till -Toolbar.MoveTo = Flytta till -Toolbar.Deselect = Avmarkera alla -Toolbar.InvertSelection = Invertera markering -Toolbar.FolderOptions = Mappalternativ -Toolbar.ShowHiddenFiles = Dolda filer och mappar -Toolbar.ShowSystemFiles = Systemfiler -Toolbar.ShowExtensions = Filnamnstillägg -Status.FreeSpace = %s (Ledigt utrymme: %s) -Status.Item = %s objekt -Status.Items = %s objekt -Status.ItemSelected = %s objekt markerat -Status.ItemsSelected = %s objekt markerade - - -[th-TH] - Thai (Thailand) -Copy.Cancel = ยกเลิก -Copy.More = เพิ่มเติม... -Copy.CopyHere = คัด&ลอกมาที่นี่ -Copy.MoveHere = ย้&ายมาที่นี่ -Copy.Title = ยืนยันการแทนที่แฟ้ม -Copy.Subtitle = โฟลเดอร์นี้มีแฟ้มชื่อ '%s' อยู่แล้ว -Copy.SubtitleRO = โฟลเดอร์นี้มีแฟ้มแบบอ่านอย่างเดียวที่ชื่อ '%s' อยู่แล้ว -Copy.SubtitleSys = โฟลเดอร์นี้มีแฟ้มระบบที่ชื่อ '%s' อยู่แล้ว -Copy.Prompt1 = คุณต้องการแทนที่แฟ้มที่มีอยู่ -Copy.Prompt2 = ด้วยแฟ้มนี้หรือไม่ -Copy.Yes = ใ&ช่ -Copy.No = ไ&ม่ใช่ -Copy.YesAll = ใช่&ทั้งหมด -Folder.Title = การยืนยันการแทนที่โฟลเดอร์ -Folder.Prompt = ถ้าแฟ้มในโฟลเดอร์ที่มีอยู่มีชื่อเดียวกันกับแฟ้มในโฟลเดอร์ที่คุณกำลังย้ายหรือคัดลอก แฟ้มเหล่านั้นจะถูกแทนที่ คุณยังต้องการที่จะย้ายหรือคัดลอกโฟลเดอร์หรือไม่ -Toolbar.GoUp = เลื่อนขึ้นหนึ่งระดับ -Toolbar.Cut = ตัด -Toolbar.Copy = คัดลอก -Toolbar.Paste = วาง -Toolbar.PasteShortcut = วางทางลัด -Toolbar.Delete = ลบ -Toolbar.Email = ส่งอีเมลรายการที่เลือก -Toolbar.Properties = คุณสมบัติ -Toolbar.NewFolder = สร้างโฟลเดอร์ -Toolbar.ZipFolder = โฟลเดอร์ที่บีบอัดใหม่ -Toolbar.ExtraLarge = ไอคอนขนาดใหญ่พิเศษ -Toolbar.Large = ไอคอนขนาดใหญ่ -Toolbar.Medium = ไอคอนขนาดกลาง -Toolbar.Small = ไอคอนขนาดเล็ก -Toolbar.List = รายการ -Toolbar.Details = รายละเอียด -Toolbar.Tiles = เรียงต่อกัน -Toolbar.Content = เนื้อหา -Toolbar.Undo = เลิกทำ -Toolbar.Redo = ทำซ้ำ -Toolbar.Refresh = ฟื้นฟู -Toolbar.Back = ย้อนกลับ -Toolbar.Forward = ไปข้างหน้า -Toolbar.Stop = หยุด -Toolbar.Rename = เปลี่ยนชื่อ -Toolbar.SelectAll = เลือกทั้งหมด -Toolbar.CustomizeFolder = กำหนดโฟลเดอร์นี้เอง -Toolbar.MapDrive = แมปไดรฟ์เครือข่าย -Toolbar.DisconnectDrive = ยกเลิกการเชื่อมต่อไดรฟ์เครือข่าย -Toolbar.NavigationPane = บานหน้าต่างนำทาง -Toolbar.DetailsPane = บานหน้าต่างแสดงรายละเอียด -Toolbar.PreviewPane = บานหน้าต่างแสดงตัวอย่าง -Toolbar.CopyTo = คัดลอกไปที่ -Toolbar.MoveTo = ย้ายไปที่ -Toolbar.Deselect = ไม่เลือกเลย -Toolbar.InvertSelection = สลับส่วนที่เลือก -Toolbar.FolderOptions = ตัวเลือกโฟลเดอร์ -Toolbar.ShowHiddenFiles = แฟ้มและโฟลเดอร์ที่ซ่อนไว้ -Toolbar.ShowSystemFiles = แฟ้มระบบ -Toolbar.ShowExtensions = ส่วนขยายของแฟ้ม -Status.FreeSpace = %s (เนื้อที่ว่างดิสก์: %s) -Status.Item = %s รายการ -Status.Items = %s รายการ -Status.ItemSelected = เลือก %s รายการ -Status.ItemsSelected = เลือก %s รายการ - - -[tr-TR] - Turkish (Turkey) -Copy.Cancel = İptal -Copy.More = Tümü... -Copy.CopyHere = Buraya &Kopyala -Copy.MoveHere = Buraya &Taşı -Copy.Title = Dosya Değişimini Onayla -Copy.Subtitle = Bu klasörde zaten '%s' adlı bir dosya var. -Copy.SubtitleRO = Bu klasörde zaten '%s' adlı salt okunur bir dosya var. -Copy.SubtitleSys = Bu klasörde zaten '%s' adlı bir sistem dosyası var. -Copy.Prompt1 = Varolan dosyayı -Copy.Prompt2 = aşağıdaki dosya ile değiştirmek istiyor musunuz? -Copy.Yes = &Evet -Copy.No = &Hayır -Copy.YesAll = &Tümüne Evet -Folder.Title = Klasör Değişimini Onayla -Folder.Prompt = Klasörü taşımak ya da kopyalamak istiyor musunuz? -Toolbar.GoUp = Bir Düzey Yukarı -Toolbar.Cut = Kes -Toolbar.Copy = Kopyala -Toolbar.Paste = Yapıştır -Toolbar.PasteShortcut = Kısayol Yapıştır -Toolbar.Delete = Sil -Toolbar.Email = Seçili öğeleri e-postayla gönder -Toolbar.Properties = Özellikler -Toolbar.NewFolder = Yeni Klasör -Toolbar.ZipFolder = Yeni Sıkıştırılmış Klasör -Toolbar.ExtraLarge = Çok Büyük Simgeler -Toolbar.Large = Büyük Simgeler -Toolbar.Medium = Orta Boy Simgeler -Toolbar.Small = Küçük Simgeler -Toolbar.List = Listele -Toolbar.Details = Ayrıntılar -Toolbar.Tiles = Döşemeler -Toolbar.Content = İçerik -Toolbar.Undo = Geri Al -Toolbar.Redo = Yinele -Toolbar.Refresh = Yenile -Toolbar.Back = Geri -Toolbar.Forward = İleri -Toolbar.Stop = Durdur -Toolbar.Rename = Yeniden Adlandır -Toolbar.SelectAll = Tümünü seç -Toolbar.CustomizeFolder = Bu klasörü özelleştir -Toolbar.MapDrive = Ağ sürücüsüne bağlan -Toolbar.DisconnectDrive = Ağ sürücüsü bağlantısını kes -Toolbar.NavigationPane = Gezinti bölmesi -Toolbar.DetailsPane = Ayrıntılar bölmesi -Toolbar.PreviewPane = Önizleme bölmesi -Toolbar.CopyTo = Kopyalama hedefi -Toolbar.MoveTo = Taşıma hedefi -Toolbar.Deselect = Hiçbirini seçme -Toolbar.InvertSelection = Diğerlerini seç -Toolbar.FolderOptions = Klasör seçenekleri -Toolbar.ShowHiddenFiles = Gizli dosya ve klasörler -Toolbar.ShowSystemFiles = Sistem dosyaları -Toolbar.ShowExtensions = Dosya adı uzantıları -Status.FreeSpace = %s (Boş disk boş alanı: %s) -Status.Item = %s öğe -Status.Items = %s öğe -Status.ItemSelected = %s öğe seçili -Status.ItemsSelected = %s öğe seçili - - -[uk-UA] - Ukrainian (Ukraine) -Copy.Cancel = Скасувати -Copy.More = Додатково... -Copy.CopyHere = &Копіювати сюди -Copy.MoveHere = П&еремістити -Copy.Title = Підтвердження заміни файлу -Copy.Subtitle = Ця папка вже містить файл з ім'ям "%s". -Copy.SubtitleRO = Ця папка вже містить доступний лише для читання файл з ім'ям "%s". -Copy.SubtitleSys = Ця папка вже містить системний файл з ім'ям "%s". -Copy.Prompt1 = Замінити наявний файл -Copy.Prompt2 = на цей файл? -Copy.Yes = &Так -Copy.No = &Ні -Copy.YesAll = Так для &всіх -Folder.Title = Підтвердження заміни папки -Folder.Prompt = Розпочати переміщення або копіювання папки? -Toolbar.GoUp = На один рівень вгору -Toolbar.Cut = Вирізати -Toolbar.Copy = Копіювати -Toolbar.Paste = Вставити -Toolbar.PasteShortcut = Вставити ярлик -Toolbar.Delete = Видалити -Toolbar.Email = Надіслати виділені об'єкти електронною поштою -Toolbar.Properties = Властивості -Toolbar.NewFolder = Створити папку -Toolbar.ZipFolder = Нова стиснута ZIP-папка -Toolbar.ExtraLarge = Величезні піктограми -Toolbar.Large = Великі піктограми -Toolbar.Medium = Середні піктограми -Toolbar.Small = Дрібні піктограми -Toolbar.List = Список -Toolbar.Details = Таблиця -Toolbar.Tiles = Мозаїка -Toolbar.Content = Вміст -Toolbar.Undo = Скасувати -Toolbar.Redo = Повторити -Toolbar.Refresh = Оновити -Toolbar.Back = Назад -Toolbar.Forward = Вперед -Toolbar.Stop = Зупинити -Toolbar.Rename = Перейменувати -Toolbar.SelectAll = Вибрати всі -Toolbar.CustomizeFolder = Настроїти папку -Toolbar.MapDrive = Підключити мережний диск -Toolbar.DisconnectDrive = Відключити мережний диск -Toolbar.NavigationPane = Область переходів -Toolbar.DetailsPane = Область відомостей -Toolbar.PreviewPane = Область перегляду -Toolbar.CopyTo = Копіювати -Toolbar.MoveTo = Перемістити -Toolbar.Deselect = Скасувати виділення -Toolbar.InvertSelection = Обернути виділення -Toolbar.FolderOptions = Параметри папки -Toolbar.ShowHiddenFiles = Приховані файли й папки -Toolbar.ShowSystemFiles = Системні файли -Toolbar.ShowExtensions = Розширення імен файлів -Status.FreeSpace = %s (Доступно на диску: %s) -Status.Item = %s елемент -Status.Items = %s елементів -Status.ItemSelected = Вибрано елемент: %s -Status.ItemsSelected = Вибрано елементів: %s - - -[zh-CN] - Chinese (Simplified) -Copy.Cancel = 取消 -Copy.More = 其他... -Copy.CopyHere = 复制到当前位置(&C) -Copy.MoveHere = 移动到当前位置(&M) -Copy.Title = 确认文件替换 -Copy.Subtitle = 此文件夹已包含一个名为“%s”的文件。 -Copy.SubtitleRO = 此文件夹已包括一个名为“%s”的只读文件。 -Copy.SubtitleSys = 此文件夹已包括一个名为“%s”的系统文件。 -Copy.Prompt1 = 是否将现有文件 -Copy.Prompt2 = 替换为 -Copy.Yes = 是(&Y) -Copy.No = 否(&N) -Copy.YesAll = 全部(&A) -Folder.Title = 确认文件夹替换 -Folder.Prompt = 是否移动或复制文件夹? -Toolbar.GoUp = 向上一级 -Toolbar.Cut = 剪切 -Toolbar.Copy = 复制 -Toolbar.Paste = 粘贴 -Toolbar.PasteShortcut = 粘贴快捷方式 -Toolbar.Delete = 删除 -Toolbar.Email = 以电子邮件形式发送所选项目 -Toolbar.Properties = 属性 -Toolbar.NewFolder = 新文件夹 -Toolbar.ZipFolder = 新建压缩的(zipped)文件夹 -Toolbar.ExtraLarge = 超大图标 -Toolbar.Large = 大图标 -Toolbar.Medium = 中等图标 -Toolbar.Small = 小图标 -Toolbar.List = 列表 -Toolbar.Details = 详细信息 -Toolbar.Tiles = 平铺 -Toolbar.Content = 内容 -Toolbar.Undo = 撤消 -Toolbar.Redo = 恢复 -Toolbar.Refresh = 刷新 -Toolbar.Back = 后退 -Toolbar.Forward = 前进 -Toolbar.Stop = 停止 -Toolbar.Rename = 重命名 -Toolbar.SelectAll = 全选 -Toolbar.CustomizeFolder = 自定义文件夹 -Toolbar.MapDrive = 映射网络驱动器 -Toolbar.DisconnectDrive = 断开网络驱动器 -Toolbar.NavigationPane = 导航窗格 -Toolbar.DetailsPane = 细节窗格 -Toolbar.PreviewPane = 预览窗格 -Toolbar.CopyTo = 复制到​​ -Toolbar.MoveTo = 移动到​​ -Toolbar.Deselect = 全部取消 -Toolbar.InvertSelection = 反向选择 -Toolbar.FolderOptions = 文件夹选项 -Toolbar.ShowHiddenFiles = 隐藏文件和文件夹 -Toolbar.ShowSystemFiles = 系统文件 -Toolbar.ShowExtensions = 文件扩展名 -Status.FreeSpace = %s (磁盘可用空间: %s) -Status.Item = %s 项 -Status.Items = %s 个项目 -Status.ItemSelected = 已选择 %s 项 -Status.ItemsSelected = 已选择 %s 个项 - - -[zh-HK] - Chinese (Traditional) -Copy.Cancel = 取消 -Copy.More = 其他... -Copy.CopyHere = 複製到這裡(&C) -Copy.MoveHere = 移動到這裡(&M) -Copy.Title = 確認取代檔案 -Copy.Subtitle = 這個資料夾已經有一個名稱為 '%s' 的檔案。 -Copy.SubtitleRO = 這個資料夾已經有一個名稱為 '%s' 的唯讀檔。 -Copy.SubtitleSys = 這個資料夾已經有一個名稱為 '%s' 的系統檔。 -Copy.Prompt1 = 您要將目前的檔案 -Copy.Prompt2 = 取代成這個檔案嗎? -Copy.Yes = 是(&Y) -Copy.No = 否(&N) -Copy.YesAll = 全部取代(&A) -Folder.Title = 確認取代資料夾 -Folder.Prompt = 仍然要移動或複製資料夾? -Toolbar.GoUp = 上移一層 -Toolbar.Cut = 剪下 -Toolbar.Copy = 複製 -Toolbar.Paste = 貼上 -Toolbar.PasteShortcut = 貼上捷徑 -Toolbar.Delete = 刪除 -Toolbar.Email = 以電子郵件傳送選取的項目 -Toolbar.Properties = 內容 -Toolbar.NewFolder = 新增資料夾 -Toolbar.ZipFolder = 新壓縮 (zipped) 資料夾 -Toolbar.ExtraLarge = 特大圖示 -Toolbar.Large = 大圖示 -Toolbar.Medium = 中圖示 -Toolbar.Small = 小圖示 -Toolbar.List = 清單 -Toolbar.Details = 詳細資料 -Toolbar.Tiles = 並排 -Toolbar.Content = 內容 -Toolbar.Undo = 復原 -Toolbar.Redo = 重做 -Toolbar.Refresh = 重新整理 -Toolbar.Back = 上一頁 -Toolbar.Forward = 下一頁 -Toolbar.Stop = 停止 -Toolbar.Rename = 重新命名 -Toolbar.SelectAll = 全選 -Toolbar.CustomizeFolder = 自訂此資料夾 -Toolbar.MapDrive = 連線網路磁碟機 -Toolbar.DisconnectDrive = 中斷網路磁碟機 -Toolbar.NavigationPane = 瀏覽窗格 -Toolbar.DetailsPane = 詳細資料窗格 -Toolbar.PreviewPane = 預覽窗格 -Toolbar.CopyTo = 複製到​​ -Toolbar.MoveTo = 移至​​ -Toolbar.Deselect = 全部不選 -Toolbar.InvertSelection = 反向選擇 -Toolbar.FolderOptions = 資料夾選項 -Toolbar.ShowHiddenFiles = 隱藏的檔案和資料夾 -Toolbar.ShowSystemFiles = 系統檔 -Toolbar.ShowExtensions = 副檔名 -Status.FreeSpace = %s (磁碟可用空間: %s) -Status.Item = %s 個項目 -Status.Items = %s 個項目 -Status.ItemSelected = 選取了 %s 個項目 -Status.ItemsSelected = 選取了 %s 個項目 - - -[zh-TW] - Chinese (Traditional) -Copy.Cancel = 取消 -Copy.More = 其他... -Copy.CopyHere = 複製到這裡(&C) -Copy.MoveHere = 移動到這裡(&M) -Copy.Title = 確認取代檔案 -Copy.Subtitle = 這個資料夾已經有一個名稱為 '%s' 的檔案。 -Copy.SubtitleRO = 這個資料夾已經有一個名稱為 '%s' 的唯讀檔。 -Copy.SubtitleSys = 這個資料夾已經有一個名稱為 '%s' 的系統檔。 -Copy.Prompt1 = 您要將目前的檔案 -Copy.Prompt2 = 取代成這個檔案嗎? -Copy.Yes = 是(&Y) -Copy.No = 否(&N) -Copy.YesAll = 全部取代(&A) -Folder.Title = 確認取代資料夾 -Folder.Prompt = 仍然要移動或複製資料夾? -Toolbar.GoUp = 上移一層 -Toolbar.Cut = 剪下 -Toolbar.Copy = 複製 -Toolbar.Paste = 貼上 -Toolbar.PasteShortcut = 貼上捷徑 -Toolbar.Delete = 刪除 -Toolbar.Email = 以電子郵件傳送選取的項目 -Toolbar.Properties = 內容 -Toolbar.NewFolder = 新增資料夾 -Toolbar.ZipFolder = 新壓縮 (zipped) 資料夾 -Toolbar.ExtraLarge = 特大圖示 -Toolbar.Large = 大圖示 -Toolbar.Medium = 中圖示 -Toolbar.Small = 小圖示 -Toolbar.List = 清單 -Toolbar.Details = 詳細資料 -Toolbar.Tiles = 並排 -Toolbar.Content = 內容 -Toolbar.Undo = 復原 -Toolbar.Redo = 重做 -Toolbar.Refresh = 重新整理 -Toolbar.Back = 上一頁 -Toolbar.Forward = 下一頁 -Toolbar.Stop = 停止 -Toolbar.Rename = 重新命名 -Toolbar.SelectAll = 全選 -Toolbar.CustomizeFolder = 自訂此資料夾 -Toolbar.MapDrive = 連線網路磁碟機 -Toolbar.DisconnectDrive = 中斷網路磁碟機 -Toolbar.NavigationPane = 瀏覽窗格 -Toolbar.DetailsPane = 詳細資料窗格 -Toolbar.PreviewPane = 預覽窗格 -Toolbar.CopyTo = 複製到​​ -Toolbar.MoveTo = 移至​​ -Toolbar.Deselect = 全部不選 -Toolbar.InvertSelection = 反向選擇 -Toolbar.FolderOptions = 資料夾選項 -Toolbar.ShowHiddenFiles = 隱藏的檔案和資料夾 -Toolbar.ShowSystemFiles = 系統檔 -Toolbar.ShowExtensions = 副檔名 -Status.FreeSpace = %s (磁碟可用空間: %s) -Status.Item = %s 個項目 -Status.Items = %s 個項目 -Status.ItemSelected = 選取了 %s 個項目 -Status.ItemsSelected = 選取了 %s 個項目 diff --git a/Localization/StartMenuHelperL10N.ini b/Localization/StartMenuHelperL10N.ini deleted file mode 100644 index 14aef2afe..000000000 Binary files a/Localization/StartMenuHelperL10N.ini and /dev/null differ diff --git a/Localization/StartMenuL10N.ini b/Localization/StartMenuL10N.ini deleted file mode 100644 index 6df9b5086..000000000 --- a/Localization/StartMenuL10N.ini +++ /dev/null @@ -1,5596 +0,0 @@ -; This file contains all localized text for Open-Shell Menu. There is one section per language. -; Every section contains text lines in the form of = . -; Which section is used depends on the current OS setting. If a key is missing from the language section -; it will be searched in the [default] section. In some cases more than one language can be used. -; For example a Japanese system may use English as a secondary language. In that case the search order -; will be [ja-JP] -> [en-US] -> [default]. -; -; ============================================================================= - - -[default] -Menu.ClassicSettings = Open-Shell &Menu -Menu.SettingsTip = Settings for Open-Shell Menu - - -[ar-SA] - Arabic (Saudi Arabia) -Menu.Programs = البرا&مج -Menu.Apps = التطبيقات -Menu.AllPrograms = كافة البرامج -Menu.Back = الخلف -Menu.Favorites = المف&ضلة -Menu.Documents = المستن&دات -Menu.Settings = إ&عدادات -Menu.Search = بح&ث -Menu.SearchBox = بحث -Menu.SearchPrograms = البحث في البرامج والملفات -Menu.SearchInternet = بحث في إنترنت -Menu.Searching = يتم الآن البحث... -Menu.NoMatch = لا توجد أية عناصر تطابق البحث. -Menu.MoreResults = الاطلاع على مزيد من النتائج -Menu.Help = التع&ليمات والدعم -Menu.Run = تش&غيل... -Menu.Logoff = ت&سجيل خروج %s‎ -Menu.SwitchUser = تبديل المست&خدم -Menu.Lock = تأ&مين -Menu.LogOffShort = ت&سجيل الخروج -Menu.Undock = إلغاء إرساء ال&كمبيوتر -Menu.Disconnect = &قطع الاتصال -Menu.ShutdownBox = إيقا&ف التشغيل... -Menu.Shutdown = إيقاف الت&شغيل -Menu.Restart = إعادة التش&غيل -Menu.ShutdownUpdate = التحديث وإيقاف التشغيل -Menu.RestartUpdate = تثبيت التحديثات وإعادة التشغيل -Menu.Sleep = &سكون -Menu.Hibernate = إ&سبات -Menu.ControlPanel = لوحة التح&كم -Menu.PCSettings = إعدادات الكمبيوتر -Menu.Security = أمان Windows -Menu.Network = ا&تصالات الشبكة -Menu.Printers = &طابعات -Menu.Taskbar = &شريط المهام والقائمة "ابدأ" -Menu.SearchFiles = عن &ملفات أو مجلدات... -Menu.SearchPrinter = عن &طابعة -Menu.SearchComputers = عن أجهزة &كمبيوتر -Menu.UserFilesTip = يحتوي على مجلدات للمستندات والصور والموسيقى وغير ذلك من الملفات الخاصة بك. -Menu.UserDocumentsTip = يحتوي على خطابات وتقارير ومستندات وملفات أخرى. -Menu.UserPicturesTip = يحتوي على صور فوتوغرافية رقمية وصور وملفات رسومية. -Menu.UserMusicTip = يحتوي على ملفات الموسيقى والصوت الأخرى. -Menu.UserVideosTip = يحتوي على أفلام وملفات فيديو أخرى. -Menu.NetworkTip = ‏‏عرض اتصالات الشبكة الموجودة على هذا الكمبيوتر والمساعدة في إنشاء اتصالات جديدة -Menu.PrintersTip = إضافة الطابعات المحلية وطابعات الشبكة وإزالتها وتكوينها. -Menu.TaskbarTip = ‏‏تخصيص القائمة "ابدأ" وشريط المهام مثل أنواع العناصر التي سيتم عرضها وطريقة عرضها -Menu.ControlPanelTip = ‏‏تغيير الإعدادات وتخصيص وظائف الكمبيوتر. -Menu.DocumentsLibTip = الوصول إلى الخطابات والتقارير والملاحظات وغير ذلك من أنواع المستندات. -Menu.MusicLibTip = تشغيل ملفات الموسيقى وملفات الصوت الأخرى. -Menu.PicturesLibTip = عرض الصور الرقمية وتنظيمها. -Menu.VideosLibTip = مشاهدة الأفلام المنزلية ومقاطع الفيديو الرقمية الأخرى. -Menu.RecordingsLibTip = مشاهدة برامج التلفزيون المسجلة على الكمبيوتر. -Menu.DownloadTip = البحث عن تنزيلات إنترنت والارتباطات بمواقع ويب المفضلة. -Menu.HomegroupTip = الوصول إلى المكتبات والمجلدات المشتركة من قِبل أشخاص آخرين في مجموعة المشاركة المنزلية. -Menu.RunTip = فتح برنامج أو مجلد أو مستند أو موقع على ويب. -Menu.HelpTip = العثور على مواضيع "التعليمات"، والبرامج التعليمية واستكشاف الأخطاء وإصلاحها وخدمات الدعم الأخرى. -Menu.ProgramsTip = فتح قائمة من البرامج. -Menu.SearchFilesTip = البحث عن المستندات والموسيقى والصور والبريد الإلكتروني وغير ذلك. -Menu.GamesTip = تشغيل الألعاب وإدارتها على الكمبيوتر. -Menu.SecurityTip = بدء تشغيل خيارات أمان Windows لتغيير كلمة المرور أو تبديل المستخدم أو بدء إدارة المهام. -Menu.SearchComputersTip = البحث عن أجهزة كمبيوتر على الشبكة -Menu.SearchPrintersTip = البحث عن طابعة -Menu.AdminToolsTip = تكوين الإعدادات الإدارية للكمبيوتر -Menu.ShutdownTip = إغلاق كافة البرامج المفتوحة وإيقاف تشغيل Windows، ثم إيقاف تشغيل الكمبيوتر. -Menu.RestartTip = إغلاق كافة البرامج المفتوحة وإيقاف تشغيل Windows، ثم تشغيله مرة أخرى. -Menu.SleepTip = حفظ جلسة العمل في الذاكرة ووضع الكمبيوتر في حالة الطاقة المنخفضة حتى يمكن استئناف العمل بسرعة. -Menu.HibernateTip = حفظ جلسة العمل وإيقاف تشغيل الكمبيوتر. وعند تشغيل الكمبيوتر يقوم Windows باستعادة الجلسة. -Menu.LogOffTip = ‏‏أغلق البرامج وقم بتسجيل الخروج. -Menu.DisconnectTip = قطع الاتصال بجلسة العمل. يمكنك إعادة الاتصال بجلسة العمل هذه عند تسجيل الدخول مرة أخرى. -Menu.LockTip = تأمين هذا الكمبيوتر. -Menu.UndockTip = إزالة الكمبيوتر المحمول من محطة إرساء. -Menu.SwitchUserTip = تبديل المستخدمين بدون إغلاق البرامج. -Menu.Empty = (فارغ) -Menu.Features = البرامج والميزات -Menu.FeaturesTip = إزالة تثبيت البرامج الموجودة على الكمبيوتر أو تغييرها. -Menu.SearchPeople = عن أ&شخاص... -Menu.SortByName = فرز &حسب الاسم -Menu.Open = ف&تح -Menu.OpenAll = &فتح كافة المستخدمين -Menu.Explore = ا&ستكشاف -Menu.ExploreAll = است&كشاف كافة المستخدمين -Menu.MenuSettings = إعدادات -Menu.MenuHelp = تعليمات -Menu.MenuExit = إنهاء -Menu.LogoffTitle = تسجيل الخروج من Windows -Menu.LogoffPrompt = هل تريد بالتأكيد تسجيل الخروج؟ -Menu.LogoffYes = &تسجيل الخروج -Menu.LogoffNo = &لا -Menu.RenameTitle = إعادة تسمية -Menu.RenamePrompt = الاسم الج&ديد: -Menu.RenameOK = حسنا -Menu.RenameCancel = إلغاء الأمر -Menu.Organize = تنظيم قائمة "ابدأ" -Menu.Expand = تو&سيع -Menu.Collapse = &طي -Menu.NewFolder = مجلد جديد -Menu.NewShortcut = اختصار جديد -Menu.AutoArrange = ترتيب تل&قائي -Menu.ActionOpen = فتح -Menu.ActionClose = إغلاق -Menu.ActionExecute = تنفيذ -Menu.RemoveList = إزالة من هذه ال&قائمة -Menu.RemoveAll = م&سح قائمة العناصر الحديثة -Menu.Explorer = مستكشف Windows -Menu.Start = ابدأ -Menu.StartScreen = شاشة البدء -Menu.StartMenu = القائمة "ابدأ" (Windows) -Menu.PinStart = تثبيت بالقائمة "ابدأ". -Menu.PinStartCs = تثبيت بالقائمة "ابدأ". (Open-Shell) -Menu.UnpinStartCs = إزالة التثبيت من القائمة "ابدأ" (Open-Shell) -Menu.MonitorOff = إيقاف تشغيل شاشة العرض -Menu.RemoveHighlight = إزالة التمييز -Menu.Uninstall = إز&الة التثبيت -Menu.UninstallTitle = إزالة التثبيت -Menu.UninstallPrompt = ‏‏هل تريد بالتأكيد إزالة تثبيت %s؟ -Search.CategorySettings = لوحة التح&كم -Search.CategoryPCSettings = إعدادات الكمبيوتر -Search.CategoryPrograms = البرامج -Search.CategoryDocuments = المستندات -Search.CategoryMusic = الموسيقى -Search.CategoryPictures = الصور -Search.CategoryVideos = ملفات فيديو -Search.CategoryFiles = الملفات -Search.CategoryInternet = إنترنت -JumpList.Recent = حديث -JumpList.Frequent = متكرر -JumpList.Tasks = المهام -JumpList.Pinned = مثبت -JumpList.Pin = ت&ثبيت بهذه القائمة -JumpList.Unpin = إزا&لة التثبيت من هذه القائمة -JumpList.Remove = إزالة من ه&ذه القائمة -JumpList.PinTip = تثبيت بهذه القائمة -JumpList.UnpinTip = إزالة التثبيت من هذه القائمة - - -[bg-BG] - Bulgarian (Bulgaria) -Menu.Programs = &Програми -Menu.Apps = Приложения -Menu.AllPrograms = Всички програми -Menu.Back = Назад -Menu.Favorites = Пре&дпочитани -Menu.Documents = Док&ументи -Menu.Settings = &Настройки -Menu.Search = &Търсене -Menu.SearchBox = Търсене -Menu.SearchPrograms = Търсене на програми и файлове -Menu.SearchInternet = Търсене в интернет -Menu.Searching = Търсене... -Menu.NoMatch = Няма елементи, отговарящи на вашето търсене. -Menu.MoreResults = Показване на повече резултати -Menu.Help = Помо&щ и поддръжка -Menu.Run = &Изпълнение... -Menu.Logoff = Изли&зане на %s -Menu.SwitchUser = Смяна на потр&ебител -Menu.Lock = З&аключване -Menu.LogOffShort = Из&лизане -Menu.Undock = Откачи компют&ъра -Menu.Disconnect = Пр&екъсване на връзката -Menu.ShutdownBox = Изк&лючване... -Menu.Shutdown = Изк&лючване -Menu.Restart = &Рестартиране -Menu.ShutdownUpdate = Актуализиране и изключване -Menu.RestartUpdate = Актуализиране и рестартиране -Menu.Sleep = &Заспиване -Menu.Hibernate = &Хибернация -Menu.ControlPanel = &Контролен панел -Menu.PCSettings = Настройки на компютъра -Menu.Security = Защита на Windows -Menu.Network = &Мрежови връзки -Menu.Printers = Принт&ери -Menu.Taskbar = &Лента на задачите и меню "Старт" -Menu.SearchFiles = За &файловете или папките... -Menu.SearchPrinter = За &принтер -Menu.SearchComputers = За &компютри -Menu.UserFilesTip = Съдържа папки за документи, изображения, музика и други ваши файлове. -Menu.UserDocumentsTip = Съдържа писма, отчети и други документи и файлове. -Menu.UserPicturesTip = Съдържа цифрови снимки, изображения и графични файлове. -Menu.UserMusicTip = Съдържа музика и други аудио файлове. -Menu.UserVideosTip = Съдържа филми и други видео файлове. -Menu.NetworkTip = Показва съществуващи връзки на мрежата в този компютър и ви помага да създадете нови -Menu.PrintersTip = Добавяне, премахване и конфигуриране на локални и мрежови принтери. -Menu.TaskbarTip = Персонализиране на менюто "Старт" и лентата на задачите, като напр. типовете елементи, които ще бъдат показани, както и начина на тяхната поява. -Menu.ControlPanelTip = Промяна на настройките и персонализиране на функционалността на компютъра. -Menu.DocumentsLibTip = Достъп до писма, отчети, бележки и други видове документи. -Menu.MusicLibTip = Възпроизвеждане на музика и други аудио файлове. -Menu.PicturesLibTip = Преглед и организиране на цифрови картини. -Menu.VideosLibTip = Гледане на домашни филми и други цифрови видеозаписи. -Menu.RecordingsLibTip = Гледане на записани на компютъра ТВ програми. -Menu.DownloadTip = Търсене на изтеглени файлове от интернет и връзки към предпочитани връзки. -Menu.HomegroupTip = Достъп до библиотеки и папки, споделени от други хора в домашната ви мрежа. -Menu.RunTip = Отваря програма, папка, документ или уеб сайт. -Menu.HelpTip = Намерете теми от "Помощ", уроци, отстраняване на неизправности и други поддържащи услуги. -Menu.ProgramsTip = Отваря списък на програмите. -Menu.SearchFilesTip = Търсете документи, музика, картини, електронна поща и др. -Menu.GamesTip = Играйте и управлявайте игрите на своя компютър. -Menu.SecurityTip = Стартирайте опциите за защита на Windows, за да смените парола, да смените потребител или да стартирате диспечера на задачите. -Menu.SearchComputersTip = Търсене на компютри в мрежата -Menu.SearchPrintersTip = Търсене на принтер -Menu.AdminToolsTip = Конфигуриране на административните настройки на компютъра. -Menu.ShutdownTip = Затваря всички отворени програми, изключва Windows и изключва компютъра. -Menu.RestartTip = Затваря всички отворени програми, изключва Windows и после отново стартира Windows. -Menu.SleepTip = Запазва сесията ви в паметта и поставя компютъра в състояние на ниско енергопотребление, така че да можете бързо да възобновите работа. -Menu.HibernateTip = Запазва сесията ви в паметта и изключва компютъра. Когато включите компютъра, Windows възстановява сесията ви. -Menu.LogOffTip = Затваряне на програмите и излизане. -Menu.DisconnectTip = Прекратява връзката с вашата сесия. Можете да се свържете с тази сесия отново, когато влезете отново. -Menu.LockTip = Заключване на този компютър. -Menu.UndockTip = Премахва вашия лаптоп или ноутбук компютър от базова станция. -Menu.SwitchUserTip = Смяна на потребителите потребители без да се затварят програмите. -Menu.Empty = (Празно) -Menu.Features = Програми и компоненти -Menu.FeaturesTip = Деинсталиране или промяна на програми на компютъра. -Menu.SearchPeople = За хо&ра... -Menu.SortByName = &Сортирай по име -Menu.Open = &Отвори -Menu.OpenAll = О&твори "Всички потребители" -Menu.Explore = &Преглед -Menu.ExploreAll = Пре&глед на "Всички потребители" -Menu.MenuSettings = Настройки -Menu.MenuHelp = Помощ -Menu.MenuExit = Изход -Menu.LogoffTitle = Излизане от Windows -Menu.LogoffPrompt = Наистина ли искате да излезете? -Menu.LogoffYes = &Излизане -Menu.LogoffNo = &Не -Menu.RenameTitle = Преименуване -Menu.RenamePrompt = &Ново име: -Menu.RenameOK = OK -Menu.RenameCancel = Отказ -Menu.Organize = Организиране на менюто "Старт" -Menu.Expand = &Разгъни -Menu.Collapse = С&вий -Menu.NewFolder = Нова папка -Menu.NewShortcut = Нов пряк път -Menu.AutoArrange = &Автоматично подреждане -Menu.ActionOpen = Отвори -Menu.ActionClose = Затвори -Menu.ActionExecute = Изпълнение -Menu.RemoveList = Премахни &от този списък -Menu.RemoveAll = И&зчисти списъка с последни програми -Menu.Explorer = Windows Explorer -Menu.Start = Старт -Menu.StartScreen = Стартов екран -Menu.StartMenu = Меню "Старт" (Windows) -Menu.PinStart = Закачи към менюто "Старт" -Menu.PinStartCs = Закачи към менюто "Старт" (Open-Shell) -Menu.UnpinStartCs = Откачи от менюто "Старт" (Open-Shell) -Menu.MonitorOff = Изключване на дисплея -Menu.RemoveHighlight = Премахни осветяването -Menu.Uninstall = &Деинсталирай -Menu.UninstallTitle = Деинсталиране -Menu.UninstallPrompt = Наистина ли искате да деинсталирате %s? -Search.CategorySettings = Контролен панел -Search.CategoryPCSettings = Настройки на компютъра -Search.CategoryPrograms = Програми -Search.CategoryDocuments = Документи -Search.CategoryMusic = Музика -Search.CategoryPictures = Картини -Search.CategoryVideos = Видеозаписи -Search.CategoryFiles = Файлове -Search.CategoryInternet = Интернет -JumpList.Recent = Последни -JumpList.Frequent = Често Използвани -JumpList.Tasks = Задачи -JumpList.Pinned = Закачени -JumpList.Pin = За&качи към този списък -JumpList.Unpin = &Откачи от този списък -JumpList.Remove = Према&хни от този списък -JumpList.PinTip = Закачи към този списък -JumpList.UnpinTip = Откачи от този списък - - -[ca-ES] - Catalan (Catalan) -Menu.Programs = &Programes -Menu.Apps = Aplicacions -Menu.AllPrograms = Tots els programes -Menu.Back = Enrera -Menu.Favorites = Fa&vorits -Menu.Documents = Docu&ments -Menu.Settings = Con&figuració -Menu.Search = &Cercar -Menu.SearchBox = Cercar -Menu.SearchPrograms = Cercar programes i arxius -Menu.SearchInternet = Cercar a Internet -Menu.Searching = Cercant... -Menu.NoMatch = Ningún element coincideix amb el criteri de cerca. -Menu.MoreResults = Veure més resultats -Menu.Help = &Ajuda i suport técnic -Menu.Run = &Executar... -Menu.Logoff = &Tancar sessió de %s -Menu.SwitchUser = Canviar d'usuari -Menu.Lock = Bloquejar -Menu.LogOffShort = Tancar sessió -Menu.Undock = De&sacoblar equip -Menu.Disconnect = &Desconectar -Menu.ShutdownBox = Apaga&r... -Menu.Shutdown = &Apagar -Menu.Restart = &Reiniciar -Menu.ShutdownUpdate = Actualitzar i apagar -Menu.RestartUpdate = Actualitzar i reiniciar -Menu.Sleep = &Suspendre -Menu.Hibernate = &Hibernar -Menu.ControlPanel = &Panell de control -Menu.PCSettings = Configuració de l'ordinador -Menu.Security = Seguretat de Windows -Menu.Network = &Conexions de xarxa -Menu.Printers = &Impressores -Menu.Taskbar = &Barra de tasques i Menú Inicia -Menu.SearchFiles = &Arxius o carpetes... -Menu.SearchPrinter = I&mpressores -Menu.SearchComputers = Equip&s -Menu.UserFilesTip = Conté carpetes per a Documents, Imatges, Música i altres arxius que li pertanyen. -Menu.UserDocumentsTip = Conté cartes, informes, i altres documents i arxius. -Menu.UserPicturesTip = Conté fotos digitals, imatges i arxius de gràfics. -Menu.UserMusicTip = Conté música i altres arxius d'àudio. -Menu.UserVideosTip = Conté pel·lícules i altres arxius de vídeo. -Menu.NetworkTip = Mostra les conexions de xarxa existents a aquest equip i ajuda a crear altres noves -Menu.PrintersTip = Agrega, treu i configura impressores locals i de xarxa. -Menu.TaskbarTip = Personalitza el Menú Inicia i la barra de tasques, el tipus d'elements que es mostren i la forma en que tenen que mostrar-se. -Menu.ControlPanelTip = Canviï la configuració i personalitzi la funcionalitat del seu equip. -Menu.DocumentsLibTip = Obtengui accés a cartes, informes, notes i altra classe de documents. -Menu.MusicLibTip = Reprodueixi música i altres arxius d'àudio. -Menu.PicturesLibTip = Vegi i organitzi imatges digitals. -Menu.VideosLibTip = Vegi pel·lícules doméstiques i altres vídeos digitals. -Menu.RecordingsLibTip = Vegi programes de televisió gravats a l'equip. -Menu.DownloadTip = Cerqui descàrregues de Internet i vincles als seus llocs web favorits. -Menu.HomegroupTip = Obtengui accés a les biblioteques i carpetes que comparteixen altres usuaris del seu grup a la llar. -Menu.RunTip = Obre un programa, una carpeta, un document o un lloc web. -Menu.HelpTip = Cerqui temes d'Ajuda, tutorials, resoldre problemes i altres serveis de suport tècnic. -Menu.ProgramsTip = Obre una llista dels seus programes. -Menu.SearchFilesTip = Cercar documents, música, imatges, correu electrònic i més. -Menu.GamesTip = Jugui i administri els jocs a l'equip. -Menu.SecurityTip = Iniciï Opcions de seguretat de Windows per a canviar la contrasenya, canviar d'usuari o iniciar l'Administrador de tasques. -Menu.SearchComputersTip = Cercar equips a la xarxa -Menu.SearchPrintersTip = Cercar una impressora -Menu.AdminToolsTip = Faci configuracions administratives a l'equip -Menu.ShutdownTip = Tanca tots els programes oberts, tanca Windows i, després, apaga l'equip. -Menu.RestartTip = Tanca tots els programes oberts, tanca Windows i després inicia Windows de nou. -Menu.SleepTip = Manté la memoria de la sessió i posa l'equip en un estat de baixa energia per a que pugui continuar treballant ràpidament al reanudar. -Menu.HibernateTip = Guarda la sessió i apaga l'equip. Quan iniciï l'equip, Windows restaurarà la sessió. -Menu.LogOffTip = Tancar els programes i la sessió. -Menu.DisconnectTip = Desconnecta sessió. Pots reconectar-se a aquesta sessió quan torni a iniciar sessió. -Menu.LockTip = Bloquejar aquest equip. -Menu.UndockTip = Treu un equip portàtil o de mà de l'estació de acoblament. -Menu.SwitchUserTip = Canviar d'usuari sense tancar els programes. -Menu.Empty = (Buit) -Menu.Features = Programes i característiques -Menu.FeaturesTip = Desinstal·li o canviï programes a l'equip. -Menu.SearchPeople = &Persones... -Menu.SortByName = Ordenar per &Nom -Menu.Open = &Obrir -Menu.OpenAll = Ob&rir tots els usuaris -Menu.Explore = E&xplorar -Menu.ExploreAll = &Explorar tots els usuaris -Menu.MenuSettings = Configuració -Menu.MenuHelp = Ajuda -Menu.MenuExit = Sortir -Menu.LogoffTitle = Tancar la sessió a Windows -Menu.LogoffPrompt = Està segur de que desitja tancar la sessió? -Menu.LogoffYes = &Tancar sessió -Menu.LogoffNo = &No -Menu.RenameTitle = Canviar nom -Menu.RenamePrompt = &Nou nom: -Menu.RenameOK = Acceptar -Menu.RenameCancel = Cancel·lar -Menu.Organize = Organitzar el Menú Inicia -Menu.Expand = &Expandir -Menu.Collapse = &Contraure -Menu.NewFolder = Nova carpeta -Menu.NewShortcut = Nou accés directe -Menu.AutoArrange = Organi&tzació automàtica -Menu.ActionOpen = Obrir -Menu.ActionClose = Tancar -Menu.ActionExecute = Executar -Menu.RemoveList = &Treure d'aquesta llista -Menu.RemoveAll = &Borrar llista d'elements recents -Menu.Explorer = Explorador de Windows -Menu.Start = Inicia -Menu.StartScreen = Pantalla Inicia -Menu.StartMenu = Menú Inicia (Windows) -Menu.PinStart = Ancorar al Menú Inicia -Menu.PinStartCs = Ancorar al Menú Inicia (Open-Shell) -Menu.UnpinStartCs = Desancorar del Menú Inicia (Open-Shell) -Menu.MonitorOff = Apaga la pantalla -Menu.RemoveHighlight = Suprimeix la marca -Menu.Uninstall = &Desinstal·la -Menu.UninstallTitle = Desinstal·la -Menu.UninstallPrompt = Esteu segur que voleu desinstal·lar el %s? -Menu.ClassicSettings = Open-Shell &Menú -Menu.SettingsTip = Ajustaments del Open-Shell Menú -Search.CategorySettings = Panell de control -Search.CategoryPCSettings = Configuració de l'ordinador -Search.CategoryPrograms = Programes -Search.CategoryDocuments = Documents -Search.CategoryMusic = Música -Search.CategoryPictures = Imatges -Search.CategoryVideos = Vídeos -Search.CategoryFiles = Arxius -Search.CategoryInternet = Internet -JumpList.Recent = Recent -JumpList.Frequent = Freqüent -JumpList.Tasks = Tasques -JumpList.Pinned = Ancorat -JumpList.Pin = &Ancorar a aquesta llista -JumpList.Unpin = &Desancorar d'aquesta llista -JumpList.Remove = &Treure d'aquesta llista -JumpList.PinTip = Ancorar a aquesta llista -JumpList.UnpinTip = Desancorar d'aquesta llista - - -[cs-CZ] - Czech (Czech Republic) -Menu.Programs = &Programy -Menu.Apps = Aplikace -Menu.AllPrograms = Všechny programy -Menu.Back = Zpět -Menu.Favorites = Oblíbené položk&y -Menu.Documents = Doku&menty -Menu.Settings = N&astavení -Menu.Search = &Hledat -Menu.SearchBox = Hledat -Menu.SearchPrograms = Prohledat programy a soubory -Menu.SearchInternet = Vyhledat v Internetu -Menu.Searching = Vyhledávání... -Menu.NoMatch = Hledání neodpovídají žádné položky. -Menu.MoreResults = Zobrazit další výsledky -Menu.Help = &Nápověda a podpora -Menu.Run = Spus&tit... -Menu.Logoff = Odhlásit &uživatele %s -Menu.SwitchUser = &Přepnout uživatele -Menu.Lock = &Uzamknout -Menu.LogOffShort = Odh&lásit se -Menu.Undock = Vyjmout z dokova&cí stanice -Menu.Disconnect = O&dpojit -Menu.ShutdownBox = &Vypnout... -Menu.Shutdown = &Vypnout -Menu.Restart = &Restartovat -Menu.ShutdownUpdate = Aktualizovat a vypnout -Menu.RestartUpdate = Aktualizovat a restartovat -Menu.Sleep = &Režim spánku -Menu.Hibernate = &Hibernace -Menu.ControlPanel = Ovláda&cí panely -Menu.PCSettings = Nastavení počítače -Menu.Security = Zabezpečení systému Windows -Menu.Network = &Síťová připojení -Menu.Printers = &Tiskárny -Menu.Taskbar = &Hlavní panel a nabídka Start -Menu.SearchFiles = &Soubory či složky... -Menu.SearchPrinter = &Tiskárnu -Menu.SearchComputers = &Počítače -Menu.UserFilesTip = Obsahuje složky pro Dokumenty, Obrázky, Hudbu a další vaše soubory. -Menu.UserDocumentsTip = Obsahuje dopisy, hlášení a další soubory a dokumenty. -Menu.UserPicturesTip = Obsahuje digitální fotografie, obrázky a grafické soubory. -Menu.UserMusicTip = Obsahuje hudební a další zvukové soubory. -Menu.UserVideosTip = Obsahuje filmy a další video soubory. -Menu.NetworkTip = Zobrazí existující síťová připojení a usnadňuje vytvoření nových připojení. -Menu.PrintersTip = Slouží k přidávání, odebírání a konfigurování místních a síťových tiskáren. -Menu.TaskbarTip = Umožňuje upravit nabídku start a hlavní panel (například typy a způsob zobrazení položek). -Menu.ControlPanelTip = Změňte nastavení a přizpůsobte funkčnost svého počítače. -Menu.DocumentsLibTip = Umožňuje přístup k dopisům, zprávám, poznámkám a jiným druhům dokumentů. -Menu.MusicLibTip = Umožňuje přehrávat hudební a jiné zvukové soubory. -Menu.PicturesLibTip = Umožňuje prohlížet a organizovat digitální obrázky. -Menu.VideosLibTip = Umožňuje sledování domácích videí a dalších digitálních videozáznamů. -Menu.RecordingsLibTip = Umožňuje sledování televizních programů nahraných v počítači. -Menu.DownloadTip = Umožňuje hledání položek ke stažení na Internetu a odkazů na oblíbené weby. -Menu.HomegroupTip = Přistupujte ke knihovnám a složkám sdíleným dalšími uživateli v domácí skupině. -Menu.RunTip = Otevře složku, program, dokument nebo webovou stránku. -Menu.HelpTip = Umožní vyhledávat témata nápovědy, kurzy, řešení problémů a další služby podpory. -Menu.ProgramsTip = Zobrazí seznam programů v počítači. -Menu.SearchFilesTip = Umožňuje vyhledávat dokumenty, hudbu, obrázky, e-maily a další. -Menu.GamesTip = Umožňuje hrát a spravovat hry v počítači. -Menu.SecurityTip = Spustí možnosti zabezpečení systému Windows, ve kterých lze změnit heslo, přepnout uživatele nebo spustit Správce úloh. -Menu.SearchComputersTip = Hledat počítače v síti -Menu.SearchPrintersTip = Hledat tiskárnu -Menu.AdminToolsTip = Konfiguruje nastavení počítače pro správu. -Menu.ShutdownTip = Ukončí všechny spuštěné programy, ukončí systém Windows a potom vypne počítač. -Menu.RestartTip = Ukončí všechny spuštěné programy, ukončí systém Windows a potom znovu spustí systém Windows. -Menu.SleepTip = Ponechá relaci v paměti a uvede počítač do režimu nízké spotřeby, takže je možné rychle pokračovat v práci. -Menu.HibernateTip = Uloží relaci a vypne počítač. Po zapnutí počítače systém Windows relaci obnoví. -Menu.LogOffTip = Umožňuje ukončit programy a odhlásit uživatele. -Menu.DisconnectTip = Odpojí vaši relaci. K relaci se můžete opět připojit při dalším přihlášení. -Menu.LockTip = Uzamkne počítač. -Menu.UndockTip = Vyjme přenosný počítač z dokovací stanice. -Menu.SwitchUserTip = Přepne uživatele bez ukončování programů. -Menu.Empty = (prázdné) -Menu.Features = Programy a funkce -Menu.FeaturesTip = Odinstaluje nebo změní programy v počítači. -Menu.SearchPeople = Oso&by... -Menu.SortByName = Seřadit podle &názvu -Menu.Open = &Otevřít -Menu.OpenAll = Ot&evřít položky všech uživatele -Menu.Explore = Proz&koumat -Menu.ExploreAll = P&rocházet položky všech uživatelů -Menu.MenuSettings = Nastavení -Menu.MenuHelp = Nápověda -Menu.MenuExit = Ukončit -Menu.LogoffTitle = Odhlásit se od systému Windows -Menu.LogoffPrompt = Opravdu se chcete odhlásit? -Menu.LogoffYes = &Odhlásit se -Menu.LogoffNo = &Ne -Menu.RenameTitle = Přejmenovat -Menu.RenamePrompt = &Nový název: -Menu.RenameOK = OK -Menu.RenameCancel = Storno -Menu.Organize = Uspořádat nabídku Start -Menu.Expand = Ro&zbalit -Menu.Collapse = S&balit -Menu.NewFolder = Nová složka -Menu.NewShortcut = Nový zástupce -Menu.AutoArrange = &Rovnat automaticky -Menu.ActionOpen = Otevřít -Menu.ActionClose = Zavřít -Menu.ActionExecute = Spouštět -Menu.RemoveList = &Odebrat z tohoto seznamu -Menu.RemoveAll = Smazat seznam pos&ledních položek -Menu.Explorer = Průzkumník Windows -Menu.Start = Start -Menu.StartScreen = Úvodní obrazovka -Menu.StartMenu = Nabídka Start (Windows) -Menu.PinStart = Připnout k nabídce Start -Menu.PinStartCs = Připnout k nabídce Start (Open-Shell) -Menu.UnpinStartCs = Odepnout z nabídky Start (Open-Shell) -Menu.MonitorOff = Vypnout zobrazení -Menu.RemoveHighlight = Odebrat nejzajímavější místo -Menu.Uninstall = &Odinstalovat -Menu.UninstallTitle = Odinstalovat -Menu.UninstallPrompt = Opravdu chcete odinstalovat položku %s? -Search.CategorySettings = Ovládací panely -Search.CategoryPCSettings = Nastavení počítače -Search.CategoryPrograms = Programy -Search.CategoryDocuments = Dokumenty -Search.CategoryMusic = Hudba -Search.CategoryPictures = Obrázky -Search.CategoryVideos = Videa -Search.CategoryFiles = Soubory -Search.CategoryInternet = Internet -JumpList.Recent = Poslední -JumpList.Frequent = Nejčastěji používané -JumpList.Tasks = Úlohy -JumpList.Pinned = Připnuté -JumpList.Pin = &Připnout do tohoto seznamu -JumpList.Unpin = &Odepnout z tohoto seznamu -JumpList.Remove = O&debrat z tohoto seznamu -JumpList.PinTip = Připnout do tohoto seznamu -JumpList.UnpinTip = Odepnout z tohoto seznamu - - -[da-DK] - Danish (Denmark) -Menu.Programs = &Programmer -Menu.Apps = Apps -Menu.AllPrograms = Alle programmer -Menu.Back = Tilbage -Menu.Favorites = &Favoritter -Menu.Documents = &Dokumenter -Menu.Settings = &Indstillinger -Menu.Search = S&øg -Menu.SearchBox = Søg -Menu.SearchPrograms = Søg i alle programmer og filer -Menu.SearchInternet = Søg på internettet -Menu.Searching = Søger... -Menu.NoMatch = Ingen elementer svarede til dine søgekriterier. -Menu.MoreResults = Se flere resultater -Menu.Help = &Hjælp og support -Menu.Run = &Kør... -Menu.Logoff = L&og %s af -Menu.SwitchUser = S&kift bruger -Menu.Lock = &Lås -Menu.LogOffShort = Log &af -Menu.Undock = Fradock &computer -Menu.Disconnect = &Afbryd forbindelsen -Menu.ShutdownBox = &Luk computeren... -Menu.Shutdown = &Luk computeren -Menu.Restart = &Genstart -Menu.ShutdownUpdate = Opdater og luk -Menu.RestartUpdate = Opdater og genstart -Menu.Sleep = Sl&umre -Menu.Hibernate = &Dvale -Menu.ControlPanel = &Kontrolpanel -Menu.PCSettings = Pc-indstillinger -Menu.Security = Windows Sikkerhed -Menu.Network = &Netværksforbindelser -Menu.Printers = &Printere -Menu.Taskbar = &Proceslinje og menuen Start -Menu.SearchFiles = efter &Filer eller mapper... -Menu.SearchPrinter = efter &Printer -Menu.SearchComputers = efter &Computere -Menu.UserFilesTip = Indeholder mapper for Dokumenter, Billeder, Musik og andre filer, der tilhører dig. -Menu.UserDocumentsTip = Indeholder breve, rapporter og andre dokumenter og filer -Menu.UserPicturesTip = Indeholder digitale fotos, billeder og grafikfiler -Menu.UserMusicTip = Indeholder musik og andre lydfiler -Menu.UserVideosTip = Indeholder film og andre videofiler -Menu.NetworkTip = Viser eksisterende netværksforbindelser på computeren og hjælper dig med at oprette nye forbindelser -Menu.PrintersTip = Tilføjer, fjerner og konfigurerer printere lokalt og på netværket -Menu.TaskbarTip = Tilpas menuen Start og proceslinjen f.eks. hvilken type elementer, der skal vises, og hvordan de skal vises -Menu.ControlPanelTip = Rediger indstillinger, og tilpas computerens funktioner. -Menu.DocumentsLibTip = Få adgang til breve, rapporter, notater og andre slags dokumenter. -Menu.MusicLibTip = Afspil musik og andre lydfiler. -Menu.PicturesLibTip = Få vist og organiser digitale billeder. -Menu.VideosLibTip = Se film og andre digitale videoer. -Menu.RecordingsLibTip = Se tv-programmer optaget på computeren. -Menu.DownloadTip = Find internetoverførsler og links til yndlingswebsteder. -Menu.HomegroupTip = Få adgang til biblioteker og mapper, der deles af andre i hjemmegruppen. -Menu.RunTip = Åbner et program, en mappe, et dokument eller et websted -Menu.HelpTip = Find emner i Hjælp, selvstudier, fejlfinding og andre supporttjenester -Menu.ProgramsTip = Åbner en liste over dine programmer -Menu.SearchFilesTip = Søg efter dokumenter, musik, billeder, e-mails m.m. -Menu.GamesTip = Spil og administrer spil på computeren -Menu.SecurityTip = Start sikkerhedsindstillingerne i Windows for at skifte adgangskode, ændre bruger eller starte Jobliste. -Menu.SearchComputersTip = Søg efter computere på netværket -Menu.SearchPrintersTip = Søg efter en printer -Menu.AdminToolsTip = Konfigurerer administrative indstillinger for computeren -Menu.ShutdownTip = Lukker alle åbne programmer, lukker Windows og slukker derefter for computeren. -Menu.RestartTip = Lukker alle åbne programmer, lukker Windows og starter derefter Windows igen. -Menu.SleepTip = Bevarer sessionen i hukommelsen og sætter computeren i strømbesparelsestilstand, så du hurtigt kan fortsætte dit arbejde. -Menu.HibernateTip = Gemmer sessionen og slukker for computeren. Når du tænder for computeren, gendanner Windows sessionen. -Menu.LogOffTip = Luk programmer, og log af. -Menu.DisconnectTip = Afbryder sessionen. Du kan genoprette forbindelsen til sessionen, når du logger på igen. -Menu.LockTip = Lås denne computer -Menu.UndockTip = Fjerner din bærbare computer fra en dockingstation. -Menu.SwitchUserTip = Skift brugere uden at lukke programmer. -Menu.Empty = (Tom) -Menu.Features = Installerede programmer og funktioner -Menu.FeaturesTip = Fjern eller rediger programmer på din computer. -Menu.SearchPeople = Efter &personer... -Menu.SortByName = So&rter efter navn -Menu.Open = Å&bn -Menu.OpenAll = &Åbn mappen Alle brugere -Menu.Explore = &Stifinder -Menu.ExploreAll = &Gennemse mappen Alle brugere -Menu.MenuSettings = Indstillinger -Menu.MenuHelp = Hjælp -Menu.MenuExit = Afslut -Menu.LogoffTitle = Log af Windows -Menu.LogoffPrompt = Vil du logge af? -Menu.LogoffYes = &Log af -Menu.LogoffNo = &Nej -Menu.RenameTitle = Omdøb -Menu.RenamePrompt = &Nyt navn: -Menu.RenameOK = OK -Menu.RenameCancel = Annuller -Menu.Organize = Organiser menuen Start -Menu.Expand = &Udvid -Menu.Collapse = S&kjul -Menu.NewFolder = Ny mappe -Menu.NewShortcut = Ny genvej -Menu.AutoArrange = &Arranger automatisk -Menu.ActionOpen = Åbn -Menu.ActionClose = Luk -Menu.ActionExecute = Kør -Menu.RemoveList = Fjern &fra denne liste -Menu.RemoveAll = &Ryd listen over seneste elementer -Menu.Explorer = Windows Stifinder -Menu.Start = Start -Menu.StartScreen = Startskærm -Menu.StartMenu = Menuen Start (Windows) -Menu.PinStart = Fastgør til menuen Start -Menu.PinStartCs = Fastgør til menuen Start (Open-Shell) -Menu.UnpinStartCs = Frigør fra menuen Start (Open-Shell) -Menu.MonitorOff = Sluk skærmen -Menu.RemoveHighlight = Fjern centralt punkt -Menu.Uninstall = &Fjern -Menu.UninstallTitle = Fjern -Menu.UninstallPrompt = Er du sikker på, at du vil fjerne %s? -Search.CategorySettings = Kontrolpanel -Search.CategoryPCSettings = Pc-indstillinger -Search.CategoryPrograms = Programmer -Search.CategoryDocuments = Dokumenter -Search.CategoryMusic = Musik -Search.CategoryPictures = Billeder -Search.CategoryVideos = Videoer -Search.CategoryFiles = Filer -Search.CategoryInternet = Internet -JumpList.Recent = Seneste -JumpList.Frequent = Ofte -JumpList.Tasks = Opgaver -JumpList.Pinned = Fastgjort -JumpList.Pin = F&astgør til listen -JumpList.Unpin = &Frigør fra listen -JumpList.Remove = Fje&rn fra denne liste -JumpList.PinTip = Fastgør til listen -JumpList.UnpinTip = Frigør fra listen - - -[de-DE] - German (Germany) -Menu.Programs = &Programme -Menu.Apps = Apps -Menu.AllPrograms = Alle Programme -Menu.Back = Zurück -Menu.Favorites = &Favoriten -Menu.Documents = &Dokumente -Menu.Settings = &Einstellungen -Menu.Search = &Suchen -Menu.SearchBox = Suchen -Menu.SearchPrograms = Programme/Dateien durchsuchen -Menu.SearchInternet = Internet durchsuchen -Menu.Searching = Suchvorgang... -Menu.NoMatch = Es wurden keine Suchergebnisse gefunden. -Menu.MoreResults = Weitere Ergebnisse anzeigen -Menu.Help = &Hilfe und Support -Menu.Run = A&usführen... -Menu.Logoff = "%s" ab&melden -Menu.SwitchUser = &Benutzer wechseln -Menu.Lock = &Sperren -Menu.LogOffShort = &Abmelden -Menu.Undock = Abd&ocken -Menu.Disconnect = &Trennen -Menu.ShutdownBox = He&runterfahren... -Menu.Shutdown = &Herunterfahren -Menu.Restart = &Neu starten -Menu.ShutdownUpdate = Aktualisieren und herunterfahren -Menu.RestartUpdate = Aktualisieren und neu starten -Menu.Sleep = &Energie sparen -Menu.Hibernate = &Ruhezustand -Menu.ControlPanel = S&ystemsteuerung -Menu.PCSettings = PC-Einstellungen -Menu.Security = Windows-Sicherheit -Menu.Network = &Netzwerkverbindungen -Menu.Printers = &Drucker -Menu.Taskbar = &Taskleiste und Startmenü -Menu.SearchFiles = Nach &Dateien oder Ordnern... -Menu.SearchPrinter = Nach &Druckern -Menu.SearchComputers = Nach &Computern -Menu.UserFilesTip = Enthält Ordner für Dokumente, Bilder, Musik und andere Dateien, die Ihnen gehören. -Menu.UserDocumentsTip = Enthält Briefe, Berichte und andere Dokumente und Dateien. -Menu.UserPicturesTip = Enthält digitale Fotos, Bilder und Grafikdateien. -Menu.UserMusicTip = Enthält Musik- und andere Audiodateien. -Menu.UserVideosTip = Enthält Filme und andere Videodateien. -Menu.NetworkTip = Zeigt vorhandene Netzwerkverbindungen an und hilft bei der Erstellung von neuen Verbindungen. -Menu.PrintersTip = Fügt lokale und Netzwerkdrucker hinzu, entfernt und konfiguriert diese. -Menu.TaskbarTip = Passt das Startmenü und die Taskleiste an, z.B. die Auswahl anzuzeigender Elementtypen und deren Darstellung. -Menu.ControlPanelTip = Ändert Einstellungen, und passt die Funktionalität des Computers an. -Menu.DocumentsLibTip = Greift auf Briefe, Berichte, Notizen und andere Dokumente zu. -Menu.MusicLibTip = Gibt Musik und andere Audiodateien wieder. -Menu.PicturesLibTip = Zeigt digitale Bilder an und verwaltet sie. -Menu.VideosLibTip = Sehen Sie sich private Filme und andere digitale Videos an. -Menu.RecordingsLibTip = Sehen Sie sich auf dem Computer aufgezeichnete TV-Programme an. -Menu.DownloadTip = Sucht nach Internetdownloads und Links zu bevorzugten Websites. -Menu.HomegroupTip = Greift auf Bibliotheken und Ordner zu, die von anderen Personen in der Heimnetzgruppe freigegeben werden. -Menu.RunTip = Öffnet ein Programm, einen Ordner, ein Dokument oder eine Website. -Menu.HelpTip = Sucht Hilfethemen, Lernprogramme, Problembehandlung und andere Supportdienste. -Menu.ProgramsTip = Öffnet eine Liste der Programme. -Menu.SearchFilesTip = Sucht nach Dokumenten, Musik, Bildern, E-Mail und mehr. -Menu.GamesTip = Verwaltet Spiele auf dem Computer. -Menu.SecurityTip = Öffnet die Windows-Sicherheitsoptionen, um Kennwörter zu ändern, sich als anderer Benutzer anzumelden oder den Task-Manager zu starten. -Menu.SearchComputersTip = Nach Computern im Netzwerk suchen -Menu.SearchPrintersTip = Nach einem Drucker suchen -Menu.AdminToolsTip = Konfigurieren Sie Verwaltungseinstellungen für den Computer. -Menu.ShutdownTip = Schließt alle offenen Programme, fährt Windows herunter, und schaltet den Computer aus. -Menu.RestartTip = Schließt alle offenen Programme, fährt Windows herunter, und führt einen Neustart durch. -Menu.SleepTip = Speichert die Sitzung im Arbeitsspeicher und versetzt den Computer in einen Energiesparmodus, so dass die Sitzung schnell wiederhergestellt werden kann. -Menu.HibernateTip = Speichert die Sitzung und schaltet den Computer aus. Wenn Sie den Computer einschalten, wird die Sitzung wiederhergestellt. -Menu.LogOffTip = Schließt Programme und führt die Abmeldung aus. -Menu.DisconnectTip = Trennt diese Sitzung. Sie können eine Verbindung mit dieser Sitzung erneut herstellen, wenn Sie sich das nächste Mal anmelden. -Menu.LockTip = Sperrt diesen Computer. -Menu.UndockTip = Entfernt den Laptop- bzw. Notebookcomputer aus der Dockingstation. -Menu.SwitchUserTip = Wechselt Benutzer, ohne Programme zu schließen. -Menu.Empty = (Leer) -Menu.Features = Programme und Funktionen -Menu.FeaturesTip = Deinstalliert oder ändert Programme auf dem Computer. -Menu.SearchPeople = &Nach Personen... -Menu.SortByName = &Nach Namen sortieren -Menu.Open = Ö&ffnen -Menu.OpenAll = Öffnen - &Alle Benutzer -Menu.Explore = &Explorer -Menu.ExploreAll = E&xplorer - Alle Benutzer -Menu.MenuSettings = Einstellungen -Menu.MenuHelp = Hilfe -Menu.MenuExit = Beenden -Menu.LogoffTitle = Windows-Abmeldung -Menu.LogoffPrompt = Möchten Sie sich wirklich abmelden? -Menu.LogoffYes = &Abmelden -Menu.LogoffNo = &Nein -Menu.RenameTitle = Umbenennen -Menu.RenamePrompt = &Neuer Name: -Menu.RenameOK = OK -Menu.RenameCancel = Abbrechen -Menu.Organize = Startmenü organisieren -Menu.Expand = &Erweitern -Menu.Collapse = &Reduzieren -Menu.NewFolder = Neuer Ordner -Menu.NewShortcut = Neue Verknüpfung -Menu.AutoArrange = Automatisch a&nordnen -Menu.ActionOpen = Öffnen -Menu.ActionClose = Schließen -Menu.ActionExecute = Ausführen -Menu.RemoveList = &Aus Liste entfernen -Menu.RemoveAll = &Liste zuletzt verwendeter Elemente löschen -Menu.Explorer = Windows-Explorer -Menu.Start = Start -Menu.StartScreen = Startseite -Menu.StartMenu = Startmenü (Windows) -Menu.PinStart = An Startmenü anheften -Menu.PinStartCs = An Startmenü anheften (Open-Shell) -Menu.UnpinStartCs = Vom Startmenü lösen (Open-Shell) -Menu.MonitorOff = Bildschirm ausschalten -Menu.RemoveHighlight = Haupttreffer entfernen -Menu.Uninstall = &Deinstallieren -Menu.UninstallTitle = Deinstallieren -Menu.UninstallPrompt = Möchten Sie %s wirklich deinstallieren? -Search.CategorySettings = Systemsteuerung -Search.CategoryPCSettings = PC-Einstellungen -Search.CategoryPrograms = Programme -Search.CategoryDocuments = Dokumente -Search.CategoryMusic = Musik -Search.CategoryPictures = Bilder -Search.CategoryVideos = Videos -Search.CategoryFiles = Dateien -Search.CategoryInternet = Internet -JumpList.Recent = Zuletzt verwendet -JumpList.Frequent = Häufig -JumpList.Tasks = Aufgaben -JumpList.Pinned = Angeheftet -JumpList.Pin = An diese Liste an&heften -JumpList.Unpin = V&on dieser Liste lösen -JumpList.Remove = &Aus Liste entfernen -JumpList.PinTip = An diese Liste anheften -JumpList.UnpinTip = Von dieser Liste lösen - - -[el-GR] - Greek (Greece) -Menu.Programs = &Προγράμματα -Menu.Apps = Εφαρμογές -Menu.AllPrograms = Όλα τα προγράμματα -Menu.Back = Πίσω -Menu.Favorites = Αγαπ&ημένα -Menu.Documents = Έ&γγραφα -Menu.Settings = Ρυ&θμίσεις -Menu.Search = &Αναζήτηση -Menu.SearchBox = Αναζήτηση -Menu.SearchPrograms = Αναζήτηση προγραμμάτων και αρχείων -Menu.SearchInternet = Αναζήτηση στο Internet -Menu.Searching = Αναζήτηση... -Menu.NoMatch = Δεν βρέθηκαν αποτελέσματα για την αναζήτησή σας. -Menu.MoreResults = Περισσότερα αποτελέσματα -Menu.Help = &Βοήθεια και υποστήριξη -Menu.Run = Εκτέ&λεση... -Menu.Logoff = Αποσύν&δεση %s -Menu.SwitchUser = Α&λλαγή χρήστη -Menu.Lock = &Κλείδωμα -Menu.LogOffShort = &Αποσύνδεση -Menu.Undock = Απαγκύρωση &υπολογιστή -Menu.Disconnect = Απο&σύνδεση -Menu.ShutdownBox = &Τερματισμός... -Menu.Shutdown = &Τερματισμός λειτουργίας -Menu.Restart = &Επανεκκίνηση -Menu.ShutdownUpdate = Ενημέρωση και τερματισμός λειτουργίας -Menu.RestartUpdate = Ενημέρωση και επανεκκίνηση -Menu.Sleep = Αναστολή &λειτουργίας -Menu.Hibernate = &Αδρανοποίηση -Menu.ControlPanel = Πί&νακας Ελέγχου -Menu.PCSettings = Ρυθμίσεις υπολογιστή -Menu.Security = Ασφάλεια των Windows -Menu.Network = &Συνδέσεις Δικτύου -Menu.Printers = Εκτυπ&ωτές -Menu.Taskbar = &Γραμμή εργασιών και μενού "Έναρξη" -Menu.SearchFiles = Για αρ&χεία ή φακέλους... -Menu.SearchPrinter = Για &Εκτυπωτή -Menu.SearchComputers = Για υ&πολογιστές -Menu.UserFilesTip = Περιέχει φακέλους για έγγραφα, εικόνες, μουσική και άλλα αρχεία που σας ανήκουν. -Menu.UserDocumentsTip = Περιέχει επιστολές, αναφορές και άλλα έγγραφα και αρχεία. -Menu.UserPicturesTip = Περιέχει ψηφιακές φωτογραφίες, εικόνες και αρχεία γραφικών. -Menu.UserMusicTip = Περιέχει μουσική και άλλα αρχεία ήχου. -Menu.UserVideosTip = Περιέχει ταινίες και άλλα αρχεία βίντεο. -Menu.NetworkTip = Εμφανίζει τις επίκαιρες συνδέσεις δικτύου σε αυτόν τον υπολογιστή και σας βοηθά στη δημιουργία νέων συνδέσεων -Menu.PrintersTip = Προσθήκη, κατάργηση και ρύθμιση παραμέτρων των τοπικών εκτυπωτών και των εκτυπωτών δικτύου. -Menu.TaskbarTip = Προσαρμογή του μενού "Έναρξη" και της γραμμής εργασιών, όπως των τύπων των προς εμφάνιση στοιχείων και πώς πρέπει να εμφανίζονται. -Menu.ControlPanelTip = Αλλάξτε τις ρυθμίσεις και προσαρμόστε τη λειτουργικότητα του υπολογιστή. -Menu.DocumentsLibTip = Πρόσβαση σε επιστολές, αναφορές, σημειώσεις και άλλους τύπους εγγράφων. -Menu.MusicLibTip = Αναπαραγωγή μουσικής και άλλων αρχείων ήχου. -Menu.PicturesLibTip = Προβολή και οργάνωση ψηφιακών εικόνων. -Menu.VideosLibTip = Παρακολούθηση οικιακών ταινιών και άλλων ψηφιακών βίντεο. -Menu.RecordingsLibTip = Παρακολούθηση τηλεοπτικών προγραμμάτων που έχουν εγγραφεί στον υπολογιστή σας. -Menu.DownloadTip = Εύρεση λήψεων Internet και συνδέσεων προς αγαπημένες τοποθεσίες Web. -Menu.HomegroupTip = Η πρόσβαση σε βιβλιοθήκες και φακέλους είναι κοινή από άλλα άτομα στην οικιακή ομάδα σας. -Menu.RunTip = Ανοίγει ένα πρόγραμμα, φάκελο, έγγραφο ή τοποθεσία Web. -Menu.HelpTip = Βρείτε θέματα Βοήθειας, εγχειρίδια εκμάθησης, λύσεις αντιμετώπισης προβλημάτων και άλλες υπηρεσίες υποστήριξης. -Menu.ProgramsTip = Ανοίγει μια λίστα των προγραμμάτων σας. -Menu.SearchFilesTip = Αναζητήστε έγγραφα, μουσική, εικόνες, αλληλογραφία και πολλά άλλα. -Menu.GamesTip = Χρήση και διαχείριση παιχνιδιών στον υπολογιστή σας. -Menu.SecurityTip = Εκκίνηση Επιλογών ασφαλείας των Windows για αλλαγή κωδικού πρόσβασης, αλλαγή χρήστη ή έναρξη της διαχείρισης εργασιών. -Menu.SearchComputersTip = Αναζήτηση υπολογιστή στο δίκτυο -Menu.SearchPrintersTip = Αναζήτηση ενός εκτυπωτή -Menu.AdminToolsTip = Ρύθμιση των παραμέτρων διαχείρισης του υπολογιστή σας. -Menu.ShutdownTip = Κλείνει όλα τα ανοικτά προγράμματα, τερματίζει τα Windows και, στη συνέχεια, τερματίζει τη λειτουργία του υπολογιστή. -Menu.RestartTip = Κλείνει όλα τα ανοικτά προγράμματα, τερματίζει τα Windows και, στη συνέχεια, πραγματοποιεί επανεκκίνηση των Windows. -Menu.SleepTip = Διατηρεί την περίοδο λειτουργίας στη μνήμη και θέτει τον υπολογιστή σε κατάσταση χαμηλής ενέργειας, ώστε να μπορείτε να συνεχίσετε γρήγορα την εργασία σας. -Menu.HibernateTip = Αποθηκεύει την περίοδο λειτουργίας και απενεργοποιεί τον υπολογιστή. Όταν ενεργοποιήσετε τον υπολογιστή, τα Windows θα επαναφέρουν την περίοδο λειτουργίας σας. -Menu.LogOffTip = Κλείστε τα προγράμματα και αποσυνδεθείτε. -Menu.DisconnectTip = Αποσυνδέει την περίοδο λειτουργίας σας. Μπορείτε να συνδεθείτε ξανά σε αυτήν την περίοδο λειτουργίας την επόμενη φορά που θα εισέλθετε. -Menu.LockTip = Κλείδωμα αυτού του υπολογιστή. -Menu.UndockTip = Αφαιρεί τον φορητό υπολογιστή σας από ένα σταθμό αγκύρωσης. -Menu.SwitchUserTip = Αλλαγή χρηστών χωρίς κλείσιμο των προγραμμάτων. -Menu.Empty = (Κενό) -Menu.Features = Προγράμματα και δυνατότητες -Menu.FeaturesTip = Κατάργηση εγκατάστασης ή αλλαγή των προγραμμάτων του υπολογιστή σας. -Menu.SearchPeople = Για ά&τομα... -Menu.SortByName = Ταξι&νόμηση κατά όνομα -Menu.Open = Άν&οιγμα -Menu.OpenAll = Άνοιγμα ό&λων των χρηστών -Menu.Explore = Ε&ξερεύνηση -Menu.ExploreAll = &Εξερεύνηση όλων των χρηστών -Menu.MenuSettings = Ρυθμίσεις -Menu.MenuHelp = Βοήθεια -Menu.MenuExit = Έξοδος -Menu.LogoffTitle = Αποσύνδεση των Windows -Menu.LogoffPrompt = Είστε βέβαιοι ότι θέλετε να αποσυνδεθείτε; -Menu.LogoffYes = Αποσύ&νδεση -Menu.LogoffNo = Ό&χι -Menu.RenameTitle = Μετονομασία -Menu.RenamePrompt = &Νέο όνομα: -Menu.RenameOK = ΟΚ -Menu.RenameCancel = Άκυρο -Menu.Organize = Οργάνωση μενού "Έναρξη" -Menu.Expand = Ανάπτυ&ξη -Menu.Collapse = Σύμπτ&υξη -Menu.NewFolder = Νέος φάκελος -Menu.NewShortcut = Νέα συντόμευση -Menu.AutoArrange = &Αυτόματη τακτοποίηση -Menu.ActionOpen = Άνοιγμα -Menu.ActionClose = Kλείσιμο -Menu.ActionExecute = Εκτέλεση -Menu.RemoveList = Κατά&ργηση από τη λίστα -Menu.RemoveAll = &Εκκαθάριση λίστας πρόσφατων στοιχείων -Menu.Explorer = Εξερεύνηση των Windows -Menu.Start = Έναρξη -Menu.StartScreen = Οθόνη Έναρξης -Menu.StartMenu = Μενού "Έναρξη" (Windows) -Menu.PinStart = Καρφίτσωμα στο μενού "Έναρξη" -Menu.PinStartCs = Καρφίτσωμα στο μενού "Έναρξη" (Open-Shell) -Menu.UnpinStartCs = Ξεκαρφίτσωμα από το μενού "Έναρξη" (Open-Shell) -Menu.MonitorOff = Απενεργοποίηση της οθόνης -Menu.RemoveHighlight = Κατάργηση επισήμανσης -Menu.Uninstall = &Κατάργηση εγκατάστασης -Menu.UninstallTitle = Κατάργηση εγκατάστασης -Menu.UninstallPrompt = Είστε βέβαιοι ότι θέλετε να καταργήσετε την εγκατάσταση του %s; -Search.CategorySettings = Πίνακας Ελέγχου -Search.CategoryPCSettings = Ρυθμίσεις υπολογιστή -Search.CategoryPrograms = Προγράμματα -Search.CategoryDocuments = Έγγραφα -Search.CategoryMusic = Μουσική -Search.CategoryPictures = Εικόνες -Search.CategoryVideos = Βίντεο -Search.CategoryFiles = Αρχεία -Search.CategoryInternet = Ιnternet -JumpList.Recent = Πρόσφατα -JumpList.Frequent = Στοιχεία που επιλέγονται συχνότερα -JumpList.Tasks = Εργασίες -JumpList.Pinned = Καρφιτσωμένα -JumpList.Pin = &Καρφίτσωμα σε αυτήν τη λίστα -JumpList.Unpin = &Ξεκαρφίτσωμα από αυτήν τη λίστα -JumpList.Remove = Κατά&ργηση από τη λίστα -JumpList.PinTip = Καρφίτσωμα σε αυτήν τη λίστα -JumpList.UnpinTip = Ξεκαρφίτσωμα από αυτήν τη λίστα - - -[en-US] - English (United States) -Menu.Programs = &Programs -Menu.Apps = Apps -Menu.AllPrograms = All Programs -Menu.Back = Back -Menu.Favorites = F&avorites -Menu.Documents = &Documents -Menu.Settings = &Settings -Menu.Search = Sear&ch -Menu.SearchBox = Search -Menu.SearchPrograms = Search programs and files -Menu.SearchInternet = Search the Internet -Menu.Searching = Searching... -Menu.NoMatch = No items match your search. -Menu.MoreResults = See more results -Menu.Help = &Help and Support -Menu.Run = &Run... -Menu.Logoff = &Log Off %s -Menu.SwitchUser = S&witch user -Menu.Lock = L&ock -Menu.LogOffShort = &Log off -Menu.Undock = Undock Comput&er -Menu.Disconnect = D&isconnect -Menu.ShutdownBox = Sh&ut Down... -Menu.Shutdown = Sh&ut down -Menu.Restart = &Restart -Menu.ShutdownUpdate = Update and shut down -Menu.RestartUpdate = Update and restart -Menu.Sleep = &Sleep -Menu.Hibernate = &Hibernate -Menu.ControlPanel = &Control Panel -Menu.PCSettings = Settings -Menu.Security = Windows Security -Menu.Network = &Network Connections -Menu.Printers = &Printers -Menu.Taskbar = &Taskbar and Start Menu -Menu.SearchFiles = For &Files or Folders... -Menu.SearchPrinter = For &Printer -Menu.SearchComputers = For &Computers -Menu.UserFilesTip = Contains folders for Documents, Pictures, Music, and other files that belong to you. -Menu.UserDocumentsTip = Contains letters, reports, and other documents and files. -Menu.UserPicturesTip = Contains digital photos, images, and graphic files. -Menu.UserMusicTip = Contains music and other audio files. -Menu.UserVideosTip = Contains movies and other video files. -Menu.NetworkTip = Displays existing network connections on this computer and helps you create new ones -Menu.PrintersTip = Add, remove, and configure local and network printers. -Menu.TaskbarTip = Customize the Start Menu and the taskbar, such as the types of items to be displayed and how they should appear. -Menu.ControlPanelTip = Change settings and customize the functionality of your computer. -Menu.DocumentsLibTip = Access letters, reports, notes, and other kinds of documents. -Menu.MusicLibTip = Play music and other audio files. -Menu.PicturesLibTip = View and organize digital pictures. -Menu.VideosLibTip = Watch home movies and other digital videos. -Menu.RecordingsLibTip = Watch TV programs recorded on your computer. -Menu.DownloadTip = Find Internet downloads and links to favorite websites. -Menu.HomegroupTip = Access libraries and folders shared by other people in your homegroup. -Menu.RunTip = Opens a program, folder, document, or web site. -Menu.HelpTip = Find Help topics, tutorials, troubleshooting, and other support services. -Menu.ProgramsTip = Opens a list of your programs. -Menu.SearchFilesTip = Search for documents, music, pictures, email and more. -Menu.GamesTip = Play and manage games on your computer. -Menu.SecurityTip = Launch Windows Security Options to Change Password, Switch User, or Start Task Manager. -Menu.SearchComputersTip = Search for computers on the network -Menu.SearchPrintersTip = Search for a printer -Menu.AdminToolsTip = Configure administrative settings for your computer. -Menu.ShutdownTip = Closes all open programs, shuts down Windows, and then turns off your computer. -Menu.RestartTip = Closes all open programs, shuts down Windows, and then starts Windows again. -Menu.SleepTip = Keeps your session in memory and puts the computer in a low-power state so that you can quickly resume working. -Menu.HibernateTip = Saves your session and turns off the computer. When you turn on the computer, Windows restores your session. -Menu.LogOffTip = Close programs and log off. -Menu.DisconnectTip = Disconnects your session. You can reconnect to this session when you log on again. -Menu.LockTip = Lock this computer. -Menu.UndockTip = Removes your laptop or notebook computer from a docking station. -Menu.SwitchUserTip = Switch users without closing programs. -Menu.Empty = (Empty) -Menu.Features = Programs and Features -Menu.FeaturesTip = Uninstall or change programs on your computer. -Menu.SearchPeople = For &People... -Menu.SortByName = Sort &by Name -Menu.Open = &Open -Menu.OpenAll = O&pen All Users -Menu.Explore = &Explore -Menu.ExploreAll = E&xplore All Users -Menu.MenuSettings = Settings -Menu.MenuHelp = Help -Menu.MenuExit = Exit -Menu.LogoffTitle = Log Off Windows -Menu.LogoffPrompt = Are you sure you want to log off? -Menu.LogoffYes = &Log Off -Menu.LogoffNo = &No -Menu.RenameTitle = Rename -Menu.RenamePrompt = &New name: -Menu.RenameOK = OK -Menu.RenameCancel = Cancel -Menu.Organize = Organize Start menu -Menu.Expand = Exp&and -Menu.Collapse = Coll&apse -Menu.NewFolder = New Folder -Menu.NewShortcut = New Shortcut -Menu.AutoArrange = &Auto Arrange -Menu.ActionOpen = Open -Menu.ActionClose = Close -Menu.ActionExecute = Execute -Menu.RemoveList = Remove &from this list -Menu.RemoveAll = C&lear recent items list -Menu.Explorer = Windows Explorer -Menu.Start = Start -Menu.StartScreen = Start Screen -Menu.StartMenu = Start Menu (Windows) -Menu.PinStart = Pin to Start menu -Menu.PinStartCs = Pin to Start menu (Open-Shell) -Menu.UnpinStartCs = Unpin from Start menu (Open-Shell) -Menu.MonitorOff = Turn the display off -Menu.RemoveHighlight = Remove highlight -Menu.Uninstall = &Uninstall -Menu.UninstallTitle = Uninstall -Menu.UninstallPrompt = Are you sure you want to uninstall %s? -Search.CategorySettings = Control Panel -Search.CategoryPCSettings = Settings -Search.CategoryPrograms = Programs -Search.CategoryDocuments = Documents -Search.CategoryMusic = Music -Search.CategoryPictures = Pictures -Search.CategoryVideos = Videos -Search.CategoryFiles = Files -Search.CategoryInternet = Internet -JumpList.Recent = Recent -JumpList.Frequent = Frequent -JumpList.Tasks = Tasks -JumpList.Pinned = Pinned -JumpList.Pin = P&in to this list -JumpList.Unpin = &Unpin from this list -JumpList.Remove = Remove &from this list -JumpList.PinTip = Pin to this list -JumpList.UnpinTip = Unpin from this list - - -[es-ES] - Spanish (Spain) -Menu.Programs = &Programas -Menu.Apps = Aplicaciones -Menu.AllPrograms = Todos los programas -Menu.Back = Atrás -Menu.Favorites = Fa&voritos -Menu.Documents = Docu&mentos -Menu.Settings = Con&figuración -Menu.Search = &Buscar -Menu.SearchBox = Buscar -Menu.SearchPrograms = Buscar programas y archivos -Menu.SearchInternet = Buscar en Internet -Menu.Searching = Buscando... -Menu.NoMatch = Ningún elemento coincide con el criterio de búsqueda. -Menu.MoreResults = Ver más resultados -Menu.Help = &Ayuda y soporte técnico -Menu.Run = &Ejecutar... -Menu.Logoff = &Cerrar sesión de %s -Menu.SwitchUser = Cam&biar de usuario -Menu.Lock = Bl&oquear -Menu.LogOffShort = C&errar sesión -Menu.Undock = De&sacoplar equipo -Menu.Disconnect = &Desconectar -Menu.ShutdownBox = Apaga&r... -Menu.Shutdown = &Apagar -Menu.Restart = &Reiniciar -Menu.ShutdownUpdate = Actualizar y apagar -Menu.RestartUpdate = Actualizar y reiniciar -Menu.Sleep = &Suspender -Menu.Hibernate = &Hibernar -Menu.ControlPanel = &Panel de control -Menu.PCSettings = Configuración de tu PC -Menu.Security = Seguridad de Windows -Menu.Network = &Conexiones de red -Menu.Printers = &Impresoras -Menu.Taskbar = &Barra de tareas y menú Inicio -Menu.SearchFiles = &Archivos o carpetas... -Menu.SearchPrinter = I&mpresoras -Menu.SearchComputers = Equip&os -Menu.UserFilesTip = Contiene carpetas para Documentos, Imágenes, Música y otros archivos que le pertenecen. -Menu.UserDocumentsTip = Contiene cartas, informes, y otros documentos y archivos. -Menu.UserPicturesTip = Contiene fotos digitales, imágenes y archivos de gráficos. -Menu.UserMusicTip = Contiene música y otros archivos de audio. -Menu.UserVideosTip = Contiene películas y otros archivos de vídeo. -Menu.NetworkTip = Muestra las conexiones de red existentes en este equipo y ayuda a crear otras nuevas -Menu.PrintersTip = Agrega, quita y configura impresoras locales y de red. -Menu.TaskbarTip = Personaliza el menú Inicio y la barra de tareas, el tipo de elementos que se muestra y la forma en que deben aparecer. -Menu.ControlPanelTip = Cambie la configuración y personalice la funcionalidad de su equipo. -Menu.DocumentsLibTip = Obtenga acceso a cartas, informes, notas y otra clase de documentos. -Menu.MusicLibTip = Reproduzca música y otros archivos de audio. -Menu.PicturesLibTip = Vea y organice imágenes digitales. -Menu.VideosLibTip = Vea películas domésticas y otros vídeos digitales. -Menu.RecordingsLibTip = Vea programas de televisión grabados en el equipo. -Menu.DownloadTip = Busque descargas de Internet y vínculos a sus sitios web favoritos. -Menu.HomegroupTip = Obtenga acceso a las bibliotecas y carpetas que comparten otros usuarios de su grupo en el hogar. -Menu.RunTip = Abre un programa, una carpeta, un documento o un sitio web. -Menu.HelpTip = Busque temas de Ayuda, tutoriales, solucionar problemas y otros servicios de soporte técnico. -Menu.ProgramsTip = Abre una lista de sus programas. -Menu.SearchFilesTip = Buscar documentos, música, imágenes, correo electrónico y más. -Menu.GamesTip = Juegue y administre los juegos en el equipo. -Menu.SecurityTip = Inicie Opciones de seguridad de Windows para cambiar la contraseña, cambiar de usuario o iniciar el Administrador de tareas. -Menu.SearchComputersTip = Buscar equipos en la red -Menu.SearchPrintersTip = Buscar una impresora -Menu.AdminToolsTip = Haga configuraciones administrativas en el equipo -Menu.ShutdownTip = Cierra todos los programas abiertos, cierra Windows y, después, apaga el equipo. -Menu.RestartTip = Cierra todos los programas abiertos, cierra Windows y después inicia Windows de nuevo. -Menu.SleepTip = Mantiene la memoria de la sesión y pone el equipo en un estado de baja energía para que pueda continuar trabajando rápidamente. -Menu.HibernateTip = Guarda la sesión y apaga el equipo. Cuando inicie el equipo, Windows restaurará la sesión. -Menu.LogOffTip = Cerrar los programas y la sesión. -Menu.DisconnectTip = Desconecta su sesión. Puede reconectarse a esta sesión cuando vuelva a iniciar sesión. -Menu.LockTip = Bloquear este equipo. -Menu.UndockTip = Quita un equipo portátil o de mano de la estación de acoplamiento. -Menu.SwitchUserTip = Cambiar de usuario sin cerrar los programas. -Menu.Empty = (Vacío) -Menu.Features = Programas y características -Menu.FeaturesTip = Desinstale o cambie programas en el equipo. -Menu.SearchPeople = &Personas... -Menu.SortByName = Ordenar por &Nombre -Menu.Open = &Abrir -Menu.OpenAll = Ab&rir todos los usuarios -Menu.Explore = E&xplorar -Menu.ExploreAll = &Explorar todos los usuarios -Menu.MenuSettings = Configuración -Menu.MenuHelp = Ayuda -Menu.MenuExit = Salir -Menu.LogoffTitle = Cerrar la sesión en Windows -Menu.LogoffPrompt = ¿Está seguro de que desea cerrar la sesión? -Menu.LogoffYes = &Cerrar sesión -Menu.LogoffNo = &No -Menu.RenameTitle = Cambiar nombre -Menu.RenamePrompt = &Nuevo nombre: -Menu.RenameOK = Aceptar -Menu.RenameCancel = Cancelar -Menu.Organize = Organizar el menú Inicio -Menu.Expand = &Expandir -Menu.Collapse = &Contraer -Menu.NewFolder = Nueva carpeta -Menu.NewShortcut = Nuevo acceso directo -Menu.AutoArrange = Organi&zación automática -Menu.ActionOpen = Abrir -Menu.ActionClose = Cerrar -Menu.ActionExecute = Ejecutar -Menu.RemoveList = &Quitar de esta lista -Menu.RemoveAll = &Borrar lista de elementos recientes -Menu.Explorer = Explorador de Windows -Menu.Start = Inicio -Menu.StartScreen = Pantalla Inicio -Menu.StartMenu = Menú Inicio (Windows) -Menu.PinStart = Anclar al menú Inicio -Menu.PinStartCs = Anclar al menú Inicio (Open-Shell) -Menu.UnpinStartCs = Desanclar del menú Inicio (Open-Shell) -Menu.MonitorOff = Apagar pantalla -Menu.RemoveHighlight = Quitar como elemento destacado -Menu.Uninstall = &Desinstalar -Menu.UninstallTitle = Desinstalar -Menu.UninstallPrompt = ¿Está seguro de que desea desinstalar %s? -Search.CategorySettings = Panel de control -Search.CategoryPCSettings = Configuración de tu PC -Search.CategoryPrograms = Programas -Search.CategoryDocuments = Documentos -Search.CategoryMusic = Música -Search.CategoryPictures = Imágenes -Search.CategoryVideos = Vídeos -Search.CategoryFiles = Archivos -Search.CategoryInternet = Internet -JumpList.Recent = Reciente -JumpList.Frequent = Frecuente -JumpList.Tasks = Tareas -JumpList.Pinned = Anclado -JumpList.Pin = &Anclar a esta lista -JumpList.Unpin = &Desanclar de esta lista -JumpList.Remove = &Quitar de esta lista -JumpList.PinTip = Anclar a esta lista -JumpList.UnpinTip = Desanclar de esta lista - - -[et-EE] - Estonian (Estonia) -Menu.Programs = &Programmid -Menu.Apps = Rakendused -Menu.AllPrograms = Kõik programmid -Menu.Back = Tagasi -Menu.Favorites = &Lemmikud -Menu.Documents = &Dokumendid -Menu.Settings = &Sätted -Menu.Search = O&tsi -Menu.SearchBox = Otsi -Menu.SearchPrograms = Programmide ja failide otsing -Menu.SearchInternet = Otsi Internetist -Menu.Searching = Otsimine... -Menu.NoMatch = Teie otsingule ei vasta ükski üksus. -Menu.MoreResults = Kuva rohkem tulemeid -Menu.Help = Sp&ikker ja tugi -Menu.Run = &Käivita... -Menu.Logoff = L&ogi välja kasutaja %s -Menu.SwitchUser = V&aheta kasutajat -Menu.Lock = &Lukusta -Menu.LogOffShort = &Logi välja -Menu.Undock = Doki a&rvuti lahti -Menu.Disconnect = K&atkesta ühendus -Menu.ShutdownBox = S&ule arvuti... -Menu.Shutdown = &Sule arvuti -Menu.Restart = &Taaskäivita -Menu.ShutdownUpdate = Värskenda ja sule -Menu.RestartUpdate = Värskenda ja taaskäivita -Menu.Sleep = &Unerežiim -Menu.Hibernate = &Talveunerežiim -Menu.ControlPanel = &Juhtpaneel -Menu.PCSettings = Arvutisätted -Menu.Security = Windowsi turvalisus -Menu.Network = Võrguühe&ndused -Menu.Printers = &Printerid -Menu.Taskbar = &Tegumiriba ja menüü Start -Menu.SearchFiles = &Failid või kaustad... -Menu.SearchPrinter = &Printer -Menu.SearchComputers = &Arvutitele -Menu.UserFilesTip = Sisaldab dokumentide, piltide, muusika ning teiste teile kuuluvate failide kaustu. -Menu.UserDocumentsTip = Sisaldab kirju, aruandeid ja muid dokumente ning faile. -Menu.UserPicturesTip = Sisaldab digitaalfotosid, pilte ja graafikafaile. -Menu.UserMusicTip = Sisaldab muusikat ja muid helifaile. -Menu.UserVideosTip = Sisaldab filme ja muid videofaile. -Menu.NetworkTip = Kuvab selles arvutis olemasolevad võrguühendused ja aitab luua uusi -Menu.PrintersTip = Lisa, eemalda ja konfigureeri kohalikke ning võrguprintereid. -Menu.TaskbarTip = Saate kohandada menüüd Start ja tegumiriba, näiteks seal kuvatavate üksuste tüüpe ja kuvamisviisi. -Menu.ControlPanelTip = Arvuti sätete muutmine ja funktsioonide kohandamine. -Menu.DocumentsLibTip = Juurdepääs kirjadele, aruannetele, märkmetele ja muudele dokumentidele. -Menu.MusicLibTip = Muusika ja muude helifailide esitamine. -Menu.PicturesLibTip = Digipiltide vaatamine ja korraldamine. -Menu.VideosLibTip = Kodu- ja muude digivideote vaatamine. -Menu.RecordingsLibTip = Arvutisse salvestatud telesaadete vaatamine. -Menu.DownloadTip = Internetist allalaaditavate failide ja lemmikveebisaidi linkide otsimine. -Menu.HomegroupTip = Juurdepääs teiste kodurühma inimeste ühiskasutusse antud teekidele ja kaustadele. -Menu.RunTip = Avab programmi, kausta, dokumendi või veebisaidi. -Menu.HelpTip = Otsige spikriteemasid, õpikuid, tõrkeotsinguid ja muid tugiteenuseid. -Menu.ProgramsTip = Kuvab programmide loendi. -Menu.SearchFilesTip = Otsige dokumente, muusikat, pilte, meile ja muud. -Menu.GamesTip = Mängige ja hallake oma arvutis mänge. -Menu.SecurityTip = Parooli muutmiseks, kasutaja vahetamiseks või tegumihalduri käivitamiseks avage Windowsi turbe suvandid. -Menu.SearchComputersTip = Otsi võrgus olevaid arvuteid -Menu.SearchPrintersTip = Otsi printerit -Menu.AdminToolsTip = Arvuti haldussätete konfigureerimine. -Menu.ShutdownTip = Suleb kõik avatud programmid, suleb Windowsi ja lülitab arvuti välja. -Menu.RestartTip = Suleb kõik avatud programmid, sulgeb Windowsi ning seejärel käivitab Windowsi uuesti. -Menu.SleepTip = Säilitab teie seansi mälus ja lülitab arvuti energiasäästurežiimi, et saaksite kiiresti töötamist jätkata. -Menu.HibernateTip = Salvestab teie seansi ning lülitab arvuti välja. Kui lülitate arvuti sisse, taastab Windows teie seansi. -Menu.LogOffTip = Programmide sulgemine ja väljalogimine. -Menu.DisconnectTip = Katkestab teie seansi. Saate selle seansiga ühenduse taastada, kui uuesti sisse logite. -Menu.LockTip = Selle arvuti lukustamine. -Menu.UndockTip = Eemaldab teie sülearvuti dokkimisjaamast. -Menu.SwitchUserTip = Kasutaja vahetamine ilma programme sulgemata. -Menu.Empty = (Tühi) -Menu.Features = Programmid ja funktsioonid -Menu.FeaturesTip = Desinstallige või muutke programme oma arvutis. -Menu.SearchPeople = &Inimesi... -Menu.SortByName = Sor&di nime järgi -Menu.Open = &Ava -Menu.OpenAll = A&va kaust Kõik kasutajad -Menu.Explore = Uu&ri -Menu.ExploreAll = Uur&i kausta Kõik kasutajad -Menu.MenuSettings = Sätted -Menu.MenuHelp = Spikker -Menu.MenuExit = Välju -Menu.LogoffTitle = Windowsist väljalogimine -Menu.LogoffPrompt = Kas soovite kindlasti välja logida? -Menu.LogoffYes = Lo&gi välja -Menu.LogoffNo = &Ei -Menu.RenameTitle = Ümbernimetamine -Menu.RenamePrompt = &Uus nimi: -Menu.RenameOK = OK -Menu.RenameCancel = Loobu -Menu.Organize = Korralda menüü Start -Menu.Expand = &Laienda -Menu.Collapse = A&henda -Menu.NewFolder = Uus kaust -Menu.NewShortcut = Uus otsetee -Menu.AutoArrange = &Korralda automaatselt -Menu.ActionOpen = Ava -Menu.ActionClose = Sule -Menu.ActionExecute = Täida -Menu.RemoveList = Eemal&da sellest loendist -Menu.RemoveAll = Tü&hjenda hiljutiste üksuste loend -Menu.Explorer = Windows Explorer -Menu.Start = Start -Menu.StartScreen = Avakuva -Menu.StartMenu = Menüü Start (Windows) -Menu.PinStart = Kinnita menüüsse Start -Menu.PinStartCs = Kinnita menüüsse Start (Open-Shell) -Menu.UnpinStartCs = Eemalda menüüst Start (Open-Shell) -Menu.MonitorOff = Lülitage kuvar välja -Menu.RemoveHighlight = Eemalda esiletõst -Menu.Uninstall = &Desinstalli -Menu.UninstallTitle = Desinstalli -Menu.UninstallPrompt = Kas soovite kindlasti desinstallida %s? -Search.CategorySettings = Juhtpaneel -Search.CategoryPCSettings = Arvutisätted -Search.CategoryPrograms = Programmid -Search.CategoryDocuments = Dokumendid -Search.CategoryMusic = Muusika -Search.CategoryPictures = Pildid -Search.CategoryVideos = Videod -Search.CategoryFiles = Failid -Search.CategoryInternet = Internet -JumpList.Recent = Hiljutised -JumpList.Frequent = Sagedased -JumpList.Tasks = Toimingud -JumpList.Pinned = Kinnitatud -JumpList.Pin = &Kinnita sellesse loendisse -JumpList.Unpin = &Eemalda sellest loendist -JumpList.Remove = Eemal&da sellest loendist -JumpList.PinTip = Kinnita sellesse loendisse -JumpList.UnpinTip = Eemalda sellest loendist - - -[fa-IR] - Persian -Menu.Programs = &برنامه‌ها -Menu.Apps = برنامه‌ها -Menu.AllPrograms = همه برنامه‌ها -Menu.Back = عقب -Menu.Favorites = علا&قه‌مندی‌ها -Menu.Documents = ا&سناد -Menu.Settings = تن&ظیمات -Menu.Search = &جستجو -Menu.SearchBox = جستجو -Menu.SearchPrograms = جستجوی برنامه‌ها و پرونده‌ها -Menu.SearchInternet = جستجوی اینترنت -Menu.Searching = در حال جستجو... -Menu.NoMatch = ‏‏هیچ موردی با جستجوی شما مطابقت ندارد. -Menu.MoreResults = دیدن نتایج بیشتر -Menu.Help = را&هنمایی و پشتیبانی -Menu.Run = &اجرا... -Menu.Logoff = &خروج از سیستم %s -Menu.SwitchUser = تعویض کاربر -Menu.Lock = قفل کردن -Menu.LogOffShort = خروج از سیستم -Menu.Undock = جداسازی را&یانه از محل استقرار -Menu.Disconnect = ق&طع ارتباط -Menu.ShutdownBox = خامو&ش کردن... -Menu.Shutdown = خامو&ش کردن... -Menu.Restart = &راه‌اندازی مجدد -Menu.ShutdownUpdate = به‌روزرسانی و خاموش کردن -Menu.RestartUpdate = به‌روزرسانی و راه‌اندازی مجدد -Menu.Sleep = خ&واب -Menu.Hibernate = خاموشی &موقت -Menu.ControlPanel = &صفحه کنترل -Menu.PCSettings = تنظیمات رایانه -Menu.Security = امنیت ویندوز -Menu.Network = اتصالات شب&که -Menu.Printers = &چاپگرها -Menu.Taskbar = &نوار وظیفه و منوی شروع -Menu.SearchFiles = برای &پرونده‌ها و پوشه‌ها... -Menu.SearchPrinter = برای &چاپگر -Menu.SearchComputers = برای &رایانه‌ها -Menu.UserFilesTip = شامل پوشه‌های اسناد، تصاویر، موسیقی‌ها و پرونده‌های دیگری است که به شما تعلق دارد. -Menu.UserDocumentsTip = شامل نامه‌ها، اخبار و اسناد و پرونده‌های دیگر است. -Menu.UserPicturesTip = شامل عکس‌های دیجیتالی، تصاویر و پرونده‌های گرافیکی است. -Menu.UserMusicTip = شامل موسیقی‌ها و دیگر پرونده‌های صوتی است. -Menu.UserVideosTip = شامل فیلم‌ها و دیگر پرونده‌های ویدئویی است. -Menu.NetworkTip = ‏‏اتصالات شبکه موجود روی رایانه را نمایش می‌دهد و به شما در ایجاد اتصالات جدید کمک می کند -Menu.PrintersTip = چاپگرهای محلی و شبکه را اضافه، حذف و پیکربندی کنید. -Menu.TaskbarTip = ‏‏منوی "شروع" و نوار وظیفه را سفارشی می کند، مانند انواع موارد و نحوه نمایش آنها. -Menu.ControlPanelTip = تنظیمات را تغییر داده و عملکرد رایانه را سفارشی کنید. -Menu.DocumentsLibTip = دسترسی به نامه‌ها، گزارش‌ها، یادداشت‌ها، و انواع دیگر مدارک. -Menu.MusicLibTip = پخش موسیقی و پرونده‌های صوتی دیگر. -Menu.PicturesLibTip = مشاهده و سازماندهی تصاویر دیجیتالی. -Menu.VideosLibTip = تماشای فیلم‌های خانوادگی و سایر فیلم‌های دیجیتالی. -Menu.RecordingsLibTip = تماشای برنامه‌های تلویزیونی ضبط شده در رایانه شما. -Menu.DownloadTip = یافتن بارگیری‌های اینترنتی و پیوند به وب‌سایت‌های دلخواه. -Menu.HomegroupTip = به کتابخانه‌ها و پوشه‌هایی که دیگران به اشتراک گذاشته‌اند در گروه خانگی خود دسترسی پیدا کنید. -Menu.RunTip = یک برنامه، پوشه، سند یا وب‌سایت را باز می‌کند. -Menu.HelpTip = پیدا کردن عناوین راهنما، آموزش، رفع اشکال، و خدمات پشتیبانی دیگر. -Menu.ProgramsTip = فهرستی از برنامه‌های شما را باز می‌کند. -Menu.SearchFilesTip = جستجو برای سندها، موسیقی‌ها، تصاویر، پست الکترونیکی و موارد دیگر. -Menu.GamesTip = بازی کردن و مدیریت بازی‌های رایانه شما. -Menu.SecurityTip = راه‌اندازی گزینه‌های امنیتی ویندوز برای تغییر رمز ورود، تعویض کاربر یا شروع کنترل‌گر فعالیت‌ها. -Menu.SearchComputersTip = جستجو برای رایانه‌ها در شبکه -Menu.SearchPrintersTip = جستجو برای چاپگر -Menu.AdminToolsTip = پیکربندی تنظیمات مدیریت برای رایانه شما. -Menu.ShutdownTip = همه برنامه‌های باز را می‌بندد، ویندوز را خاموش می‌کند و سپس رایانه شما را خاموش می‌کند. -Menu.RestartTip = همه برنامه‌های باز را می‌بندد، ویندوز را خاموش می‌کند و سپس ویندوز را مجدداً راه‌اندازی می‌کند. -Menu.SleepTip = جلسه شما را در حافظه نگه می‌دارد و رایانه را در حالت مصرف برق کمتر قرار می‌دهد تا شما سریعاً بتوانید به کار خود برگردید. -Menu.HibernateTip = جلسه شما را ذخیره و رایانه را خاموش می‌کند. وقتی که رایانه را روشن می‌کنید، ویندوز جلسه شما را باز می‌گرداند. -Menu.LogOffTip = ‏‏برنامه‌ها را ببندید و از سیستم خارج شوید. -Menu.DisconnectTip = جلسه شما را قطع می‌کند. می‌توانید هنگامی که دوباره به سیستم وارد می‌شوید مجدداً به این جلسه وصل شوید. -Menu.LockTip = این رایانه را قفل کنید. -Menu.UndockTip = رایانه کیفی یا نوت‌بوک خود را از محل استقرار جدا کنید. -Menu.SwitchUserTip = تعویض کاربران بدون بستن برنامه‌ها. -Menu.Empty = (خالی) -Menu.Features = برنامه‌ها و ویژگی‌ها -Menu.FeaturesTip = برنامه‌های رایانه خود را تغییر داده یا پاک کنید. -Menu.SearchPeople = برای ا&فراد... -Menu.SortByName = &ترتیب بر اساس نام -Menu.Open = با&ز کردن -Menu.OpenAll = باز کردن تمام &کاربرها -Menu.Explore = کاو&ش -Menu.ExploreAll = کاوش ت&مام کاربرها -Menu.MenuSettings = تنظیمات -Menu.MenuHelp = راهنما -Menu.MenuExit = خروج -Menu.LogoffTitle = خروج از ویندوز -Menu.LogoffPrompt = آیا برای خروج از سیستم مطمئن هستید؟ -Menu.LogoffYes = خروج از س&یستم -Menu.LogoffNo = &خیر -Menu.RenameTitle = تغییر نام -Menu.RenamePrompt = نام &جدید: -Menu.RenameOK = تایید -Menu.RenameCancel = لغو -Menu.Organize = سازماندهی منوی شروع -Menu.Expand = با&ز شدن -Menu.Collapse = جمع &شدن -Menu.NewFolder = پوشه جدید -Menu.NewShortcut = میانبر جدید -Menu.AutoArrange = ترتیب خو&دکار -Menu.ActionOpen = باز کردن -Menu.ActionClose = بستن -Menu.ActionExecute = اجرا -Menu.RemoveList = حذف از این &لیست -Menu.RemoveAll = &پاک کردن لیست موارد اخیر -Menu.Explorer = کاوشگر ویندوز -Menu.Start = شروع -Menu.StartScreen = صفحه شروع -Menu.StartMenu = منوی آغاز (Windows) -Menu.PinStart = سنجاق کردن به منوی شروع -Menu.PinStartCs = سنجاق کردن به منوی شروع (Open-Shell) -Menu.UnpinStartCs = برداشتن از منوی شروع (Open-Shell) -Menu.MonitorOff = خاموش کردن صفحه نمایش -Menu.RemoveHighlight = حذف هایلایت -Menu.Uninstall = ل&غو نصب -Menu.UninstallTitle = لغو نصب -Menu.UninstallPrompt = ‏‏آیا مطمئنید می خواهید %s را لغو نصب کنید؟ -Menu.ClassicSettings = منوی ش&روع کلاسیک -Menu.SettingsTip = تنظیمات منوی شروع کلاسیک -Search.CategorySettings = صفحه کنترل -Search.CategoryPCSettings = تنظیمات رایانه -Search.CategoryPrograms = برنامه‌ها -Search.CategoryDocuments = اسناد -Search.CategoryMusic = موسیقی -Search.CategoryPictures = تصاویر -Search.CategoryVideos = فیلم‌ها -Search.CategoryFiles = پرونده‌ها -Search.CategoryInternet = اینترنت -JumpList.Recent = اخیر -JumpList.Frequent = مکرر -JumpList.Tasks = وظایف -JumpList.Pinned = سنجاق شده -JumpList.Pin = سن&جاق کردن به این لیست -JumpList.Unpin = &برداشتن از این لیست -JumpList.Remove = ح&ذف از این لیست -JumpList.PinTip = سننجاق کردن به این لیست -JumpList.UnpinTip = برداشتن از این لیست - - -[fi-FI] - Finnish (Finland) -Menu.Programs = O&hjelmat -Menu.Apps = Sovellukset -Menu.AllPrograms = Kaikki ohjelmat -Menu.Back = Takaisin -Menu.Favorites = &Suosikit -Menu.Documents = &Tiedostot -Menu.Settings = &Asetukset -Menu.Search = &Etsi -Menu.SearchBox = Etsi -Menu.SearchPrograms = Hae ohjelmista ja tiedostoista -Menu.SearchInternet = Etsi Internetistä -Menu.Searching = Etsitään... -Menu.NoMatch = Hakuehtoja täyttäviä kohteita ei löytynyt. -Menu.MoreResults = Näytä lisää tuloksia -Menu.Help = &Ohje ja tuki -Menu.Run = Suo&rita... -Menu.Logoff = Kirjaa &ulos: %s -Menu.SwitchUser = &Vaihda käyttäjää -Menu.Lock = Luk&itse -Menu.LogOffShort = &Kirjaudu ulos -Menu.Undock = &Poista tietokone -Menu.Disconnect = &Katkaise yhteys -Menu.ShutdownBox = Sa&mmuta... -Menu.Shutdown = &Sammuta -Menu.Restart = Käynnistä &uudelleen -Menu.ShutdownUpdate = Päivitä ja sammuta -Menu.RestartUpdate = Päivitä ja käynnistä uudelleen -Menu.Sleep = L&epotila -Menu.Hibernate = &Horrostila -Menu.ControlPanel = &Ohjauspaneeli -Menu.PCSettings = Tietokoneen asetukset -Menu.Security = Windowsin suojaus -Menu.Network = &Verkkoyhteydet -Menu.Printers = T&ulostimet -Menu.Taskbar = &Tehtäväpalkki ja Käynnistä-valikko -Menu.SearchFiles = &Tiedostoja tai kansioita... -Menu.SearchPrinter = &Tulostimia -Menu.SearchComputers = Tiet&okoneita -Menu.UserFilesTip = Sisältää kansiot asiakirjoille, kuville, musiikille ja muille tiedostoillesi. -Menu.UserDocumentsTip = Sisältää asiakirjoja, tekstitiedostoja ja muita tiedostoja. -Menu.UserPicturesTip = Sisältää digitaalisia kuvia ja grafiikkatiedostoja. -Menu.UserMusicTip = Musiikki- ja äänitiedostojen tallennuspaikka. -Menu.UserVideosTip = Videotiedostojen tallennuspaikka. -Menu.NetworkTip = Näyttää tämän tietokoneen verkkoyhteydet ja auttaa uusien luomisessa -Menu.PrintersTip = Lisää, poistaa ja määrittää paikallisia ja verkossa olevia tulostimia. -Menu.TaskbarTip = Mukauttaa Käynnistä-valikon ja tehtäväpalkin asetuksia, kuten ilmaisinalueen kohteiden näyttötapaa. -Menu.ControlPanelTip = Muuta asetuksia ja muokkaa tietokoneen toimintaa. -Menu.DocumentsLibTip = Käytä kirjeitä, raportteja, muistiinpanoja ja muunlaisia asiakirjoja. -Menu.MusicLibTip = Toista musiikkia ja muita äänitiedostoja. -Menu.PicturesLibTip = Katsele digitaalisia kuvia ja järjestä niitä. -Menu.VideosLibTip = Katsele kotivideoita ja muita digitaalisia videoita. -Menu.RecordingsLibTip = Katsele tietokoneeseen tallennettuja TV-ohjelmia. -Menu.DownloadTip = Löydä ladattavia Internet-tiedostoja ja suosikkisivustojen linkkejä. -Menu.HomegroupTip = Käytä kotiryhmäsi muiden jäsenien jakamia kirjastoja ja kansioita. -Menu.RunTip = Avaa kansion, tiedoston tai WWW-sivun. -Menu.HelpTip = Etsi ohjeaiheita, opetusohjelmia, vianmääritystietoja ja muita tukipalveluja. -Menu.ProgramsTip = Avaa ohjelmaluettelon. -Menu.SearchFilesTip = Etsi asiakirjoja, musiikkia, kuvia, sähköpostiviestejä ja muita tiedostoja. -Menu.GamesTip = Pelaa ja käsittele tietokoneessa olevia pelejä. -Menu.SecurityTip = Avaa Windowsin suojausasetukset, jotta voit vaihtaa salasanan, vaihtaa käyttäjää tai käynnistää Tehtävienhallinnan. -Menu.SearchComputersTip = Etsi tietokoneita verkosta -Menu.SearchPrintersTip = Etsi tulostimia -Menu.AdminToolsTip = Määritä tietokoneen hallinta-asetukset. -Menu.ShutdownTip = Sulkee kaikki ohjelmat ja Windowsin sekä sammuttaa tietokoneen. -Menu.RestartTip = Sulkee kaikki avoimet ohjelmat ja Windowsin ja käynnistää sitten Windowsin uudelleen. -Menu.SleepTip = Säilyttää istunnon muistissa ja siirtää tietokoneen virransäästötilaan, jotta voit nopeasti jatkaa työskentelyä. -Menu.HibernateTip = Tallentaa istunnon ja sammuttaa tietokoneen. Kun käynnistät tietokoneen, Windows jatkaa istuntoa. -Menu.LogOffTip = Sulje ohjelmat ja kirjaudu ulos. -Menu.DisconnectTip = Katkaisee yhteyden istuntoon. Voit muodostaa yhteyden tähän istuntoon uudelleen kirjauduttaessa uudelleen. -Menu.LockTip = Lukitse tämä tietokone. -Menu.UndockTip = Poistaa kannettavan tietokoneen telakointiasemasta. -Menu.SwitchUserTip = Vaihda käyttäjiä sulkematta ohjelmia. -Menu.Empty = (Tyhjä) -Menu.Features = Ohjelmat ja toiminnot -Menu.FeaturesTip = Poista tai muuta tietokoneessa olevia ohjelmia. -Menu.SearchPeople = &Henkilöitä... -Menu.SortByName = &Lajittele nimen mukaan -Menu.Open = &Avaa -Menu.OpenAll = Avaa &kaikki käyttäjät -Menu.Explore = &Resurssienhallinta -Menu.ExploreAll = &Selaa kaikkia käyttäjiä -Menu.MenuSettings = Asetukset -Menu.MenuHelp = Ohje -Menu.MenuExit = Lopeta -Menu.LogoffTitle = Kirjaudu ulos Windowsista -Menu.LogoffPrompt = Haluatko varmasti kirjautua ulos? -Menu.LogoffYes = &Kirjaudu ulos -Menu.LogoffNo = E&i -Menu.RenameTitle = Nimeä uudelleen -Menu.RenamePrompt = &Uusi nimi: -Menu.RenameOK = OK -Menu.RenameCancel = Peruuta -Menu.Organize = Järjestä Käynnistä-valikko -Menu.Expand = &Laajenna -Menu.Collapse = &Kutista -Menu.NewFolder = Uusi kansio -Menu.NewShortcut = Uusi pikakuvake -Menu.AutoArrange = &Järjestä automaattisesti -Menu.ActionOpen = Avaa -Menu.ActionClose = Sulje -Menu.ActionExecute = Suorita -Menu.RemoveList = &Poista luettelosta -Menu.RemoveAll = &Tyhjennä viimeisimpien tiedostojen luettelo -Menu.Explorer = Resurssienhallinta -Menu.Start = Käynnistä -Menu.StartScreen = Aloitusnäyttö -Menu.StartMenu = Käynnistä-valikko (Windows) -Menu.PinStart = Kiinnitä Käynnistä-valikkoon -Menu.PinStartCs = Kiinnitä Käynnistä-valikkoon (Open-Shell) -Menu.UnpinStartCs = Poista kiinnitys Käynnistä-valikosta (Open-Shell) -Menu.MonitorOff = Sammuta näyttö -Menu.RemoveHighlight = Poista tärkeä kohde -Menu.Uninstall = &Poista asennus -Menu.UninstallTitle = Poista asennus -Menu.UninstallPrompt = Haluatko varmasti poistaa kohteen %s asennuksen? -Search.CategorySettings = Ohjauspaneeli -Search.CategoryPCSettings = Tietokoneen asetukset -Search.CategoryPrograms = Ohjelmat -Search.CategoryDocuments = Tiedostot -Search.CategoryMusic = Musiikki -Search.CategoryPictures = Kuvat -Search.CategoryVideos = Videot -Search.CategoryFiles = Tiedostoja -Search.CategoryInternet = Internet -JumpList.Recent = Viimeksi käytetyt tiedostot -JumpList.Frequent = Usein käytetty -JumpList.Tasks = Tehtävät -JumpList.Pinned = Kiinnitetty -JumpList.Pin = Kiinnitä &tähän luetteloon -JumpList.Unpin = Poista &kiinnitys tästä luettelosta -JumpList.Remove = &Poista luettelosta -JumpList.PinTip = Kiinnitä tähän luetteloon -JumpList.UnpinTip = Poista kiinnitys tästä luettelosta - - -[fr-FR] - French (France) -Menu.Programs = Progra&mmes -Menu.Apps = Applications -Menu.AllPrograms = Tous les programmes -Menu.Back = Précédent -Menu.Favorites = Fa&voris -Menu.Documents = Doc&uments -Menu.Settings = &Paramètres -Menu.Search = Rec&hercher -Menu.SearchBox = Rechercher -Menu.SearchPrograms = Rechercher les programmes et fichiers -Menu.SearchInternet = Rechercher sur Internet -Menu.Searching = Recherche… -Menu.NoMatch = Aucun élément ne correspond à la recherche. -Menu.MoreResults = Voir plus de résultats -Menu.Help = &Aide et support -Menu.Run = E&xécuter… -Menu.Logoff = Fermer la sessi&on %s… -Menu.SwitchUser = &Changer d’utilisateur -Menu.Lock = Verr&ouiller -Menu.LogOffShort = &Fermer la session -Menu.Undock = R&etirer l’ordinateur -Menu.Disconnect = &Déconnecter -Menu.ShutdownBox = Arrê&ter… -Menu.Shutdown = A&rrêter -Menu.Restart = &Redémarrer -Menu.ShutdownUpdate = Mettre à jour et arrêter -Menu.RestartUpdate = Mettre à jour et redémarrer -Menu.Sleep = Mettre en &veille -Menu.Hibernate = &Mettre en veille prolongée -Menu.ControlPanel = &Panneau de configuration -Menu.PCSettings = Paramètres du PC -Menu.Security = Sécurité de Windows -Menu.Network = &Connexions réseau -Menu.Printers = &Imprimantes -Menu.Taskbar = &Barre des tâches et menu Démarrer -Menu.SearchFiles = Des &fichiers ou des dossiers… -Menu.SearchPrinter = Une i&mprimante -Menu.SearchComputers = Des &ordinateurs -Menu.UserFilesTip = Contient des dossiers pour les documents, les images, la musique et d’autres fichiers utilisateur. -Menu.UserDocumentsTip = Ouvrir des lettres, rapports et autres documents et fichiers. -Menu.UserPicturesTip = Contient des photos numériques, des images et des fichiers graphiques. -Menu.UserMusicTip = Contient de la musique et des fichiers audio. -Menu.UserVideosTip = Contient des films et des fichiers vidéo. -Menu.NetworkTip = Affiche les connexions réseau existantes sur cet ordinateur et vous aide à en créer de nouvelles -Menu.PrintersTip = Ajouter, supprimer ou configurer des imprimantes locales ou en réseau. -Menu.TaskbarTip = Personnalise le menu Démarrer et la barre des tâches, notamment les types d’éléments à afficher et l’aspect à leur donner. -Menu.ControlPanelTip = Modifier les paramètres et personnaliser la fonctionnalité de l’ordinateur. -Menu.DocumentsLibTip = Accéder aux lettres, rapports et notes et à d’autres types de documents. -Menu.MusicLibTip = Écouter de la musique et des fichiers audio. -Menu.PicturesLibTip = Afficher et organiser les images. -Menu.VideosLibTip = Regarder des films et d’autres vidéos numériques à la maison. -Menu.RecordingsLibTip = Regarder les programmes TV enregistrés sur cet ordinateur. -Menu.DownloadTip = Rechercher des téléchargements Internet et des liens vers les sites Web favoris. -Menu.HomegroupTip = Accéder aux bibliothèques et aux dossiers partagés par les autres membres du groupe résidentiel. -Menu.RunTip = Ouvrir un programme, un dossier, un document ou un site Web. -Menu.HelpTip = Rechercher des rubriques d’aide, des didacticiels, des informations de dépannage et d’autres services d’assistance. -Menu.ProgramsTip = Afficher tous les programmes présents sur cet ordinateur. -Menu.SearchFilesTip = Rechercher des documents, des morceaux de musique, des images, des messages et bien plus encore. -Menu.GamesTip = Jouer des parties et gérer les jeux de cet ordinateur. -Menu.SecurityTip = Lancer les Options de sécurité Windows pour modifier le mot de passe, changer d’utilisateur ou ouvrir le gestionnaire des tâches. -Menu.SearchComputersTip = Rechercher des ordinateurs sur le réseau -Menu.SearchPrintersTip = Rechercher une imprimante -Menu.AdminToolsTip = Configurer les paramètres d’administration de cet ordinateur. -Menu.ShutdownTip = Fermer tous les programmes ouverts, arrêter Windows et éteindre cet ordinateur. -Menu.RestartTip = Fermer tous les programmes ouverts, arrêter Windows puis redémarrer Windows. -Menu.SleepTip = Conserver cette session en mémoire en plaçant l’ordinateur en mode de consommation réduite, pour permettre de reprendre rapidement le travail. -Menu.HibernateTip = Enregistrer cette session et éteindre l’ordinateur. Lors du redémarrage de l’ordinateur, la session sera restaurée. -Menu.LogOffTip = Fermer les programmes et cette session. -Menu.DisconnectTip = Se déconnecter de cette session. Il sera possible de se reconnecter à cette session à l’ouverture d’une nouvelle session. -Menu.LockTip = Verrouiller cet ordinateur. -Menu.UndockTip = Retirer l’ordinateur portable de sa station d’accueil. -Menu.SwitchUserTip = Changer d’utilisateur sans fermer les programmes. -Menu.Empty = (Vide) -Menu.Features = Programmes et fonctionnalités -Menu.FeaturesTip = Désinstaller ou modifier des programmes sur cet ordinateur. -Menu.SearchPeople = Des &personnes… -Menu.SortByName = Trier par &nom -Menu.Open = &Ouvrir -Menu.OpenAll = Ouvrir &tous les utilisateurs -Menu.Explore = E&xplorer -Menu.ExploreAll = &Explorer Tous les utilisateurs -Menu.MenuSettings = Paramètres -Menu.MenuHelp = Aide -Menu.MenuExit = Quitter -Menu.LogoffTitle = Fermeture de session Windows -Menu.LogoffPrompt = Faut-il vraiment fermer cette session ? -Menu.LogoffYes = &Fermer la session -Menu.LogoffNo = &Non -Menu.RenameTitle = Renommer -Menu.RenamePrompt = &Nouveau nom : -Menu.RenameOK = OK -Menu.RenameCancel = Annuler -Menu.Organize = Organiser le menu Démarrer -Menu.Expand = &Développer -Menu.Collapse = &Réduire -Menu.NewFolder = Nouveau dossier -Menu.NewShortcut = Nouveau raccourci -Menu.AutoArrange = &Réorganisation automatique -Menu.ActionOpen = Ouvrir -Menu.ActionClose = Fermer -Menu.ActionExecute = Exécuter -Menu.RemoveList = &Supprimer de cette liste -Menu.RemoveAll = Effacer les é&léments récents -Menu.Explorer = Explorateur Windows -Menu.Start = Démarrer -Menu.StartScreen = Écran d’accueil -Menu.StartMenu = Menu Démarrer (Windows) -Menu.PinStart = Épingler au menu Démarrer -Menu.PinStartCs = Épingler au menu Démarrer (Open-Shell) -Menu.UnpinStartCs = Détacher du menu Démarrer (Open-Shell) -Menu.MonitorOff = Éteindre l’affichage -Menu.RemoveHighlight = Supprimer la recommandation -Menu.Uninstall = &Désinstaller -Menu.UninstallTitle = Désinstaller -Menu.UninstallPrompt = Faut-il vraiment désinstaller %s ? -Search.CategorySettings = Panneau de configuration -Search.CategoryPCSettings = Paramètres du PC -Search.CategoryPrograms = Programmes -Search.CategoryDocuments = Documents -Search.CategoryMusic = Musique -Search.CategoryPictures = Images -Search.CategoryVideos = Vidéos -Search.CategoryFiles = Fichiers -Search.CategoryInternet = Internet -JumpList.Recent = Récent -JumpList.Frequent = Fréquent -JumpList.Tasks = Tâches -JumpList.Pinned = Épinglé -JumpList.Pin = Ép&ingler à cette liste -JumpList.Unpin = &Détacher de cette liste -JumpList.Remove = Suppri&mer de cette liste -JumpList.PinTip = Épingler à cette liste -JumpList.UnpinTip = Détacher de cette liste - - -[gd-GB] - Scottish Gaelic (United Kingdom) -Menu.Programs = &Prògraman -Menu.Apps = Aplacaidean -Menu.AllPrograms = Na h-uile prògram -Menu.Back = Air ais -Menu.Favorites = &Annsachdan -Menu.Documents = &Sgrìobhainnean -Menu.Settings = R&oghainnean -Menu.Search = &Lorg -Menu.SearchBox = Lorg -Menu.SearchPrograms = Lorg prògraman is faidhlichean -Menu.SearchInternet = Lorg air an eadar-lìon -Menu.Searching = Ga lorg... -Menu.NoMatch = Chan eil dad a' freagairt ris na lorg thu. -Menu.MoreResults = Faic barrachd thoraidhean -Menu.Help = Cob&hair is taic -Menu.Run = &Ruith... -Menu.Logoff = C&làraich %s a-mach -Menu.SwitchUser = Gearr leum gu cleachdaiche eile -Menu.Lock = Glais -Menu.LogOffShort = Clàraich a-mach -Menu.Undock = N&eo-dhocaich an coimpiutair -Menu.Disconnect = Dì-cheanga&il -Menu.ShutdownBox = &Dùin sìos... -Menu.Shutdown = &Dùin sìos -Menu.Restart = &Ath-thòisich -Menu.ShutdownUpdate = Ùraich is dùin sìos -Menu.RestartUpdate = Ùraich is ath-thòisich -Menu.Sleep = C&uir na chadal -Menu.Hibernate = &Geamhraich -Menu.ControlPanel = A' &phanail-smachd -Menu.PCSettings = Roghainnean a' PC -Menu.Security = Tèarainteachd Windows -Menu.Network = Cea&nglaichean lìonraidh -Menu.Printers = Clò-&bhualadairean -Menu.Taskbar = Bàr nan sao&thair is an clàr-taice tòiseachaidh -Menu.SearchFiles = Airson &faidhlichean no pasganan... -Menu.SearchPrinter = Airson clò-&bhualadair -Menu.SearchComputers = Airson &coimpiutairean -Menu.UserFilesTip = Tha pasgain airson sgrìobhainnean, dealbhan, ceòl is na faidhlichean eile agad ann. -Menu.UserDocumentsTip = Tha litrichean, aithisgean, sgrìobhainnean is faidhlichean eile ann. -Menu.UserPicturesTip = Tha dealbhan digiteach, ìomhaighean is faidhlichean grafaigeach ann. -Menu.UserMusicTip = Tha faidhlichean ciùil is fuaime ann. -Menu.UserVideosTip = Tha filmichean is faidhlichean video eile ann. -Menu.NetworkTip = Seallaidh e ceanglaichean lìonraidh a tha air a' choimpiutair seo 's cuidichidh e a' cruthachadh feadhainn ùra -Menu.PrintersTip = Cuir ris, thoir air falbh is rèitich clò-bhualadairean ionadail is lìonraidh. -Menu.TaskbarTip = Gnàthaich an clàr-taice tòiseachaidh agus bàr nan saothair, can seòrsa nan nithean a chithear agus mar a nochdas iad. -Menu.ControlPanelTip = Atharraich na roghainnean is gnàthaich comas-gnìomh a' choimpiutair agad. -Menu.DocumentsLibTip = Dèan inntrigeadh do litrichean, aithisgean, nòtaichean is sgrìobhainnean eile. -Menu.MusicLibTip = Cluich ceòl is faidhlichean fuaime eile. -Menu.PicturesLibTip = Faic is cuir air dòigh dealbhan digiteach. -Menu.VideosLibTip = Coimhead air filmichean dachaigh is videothan digiteach eile. -Menu.RecordingsLibTip = Coimhead air prògraman TBh a chlàraich thu air a' choimpiutair agad. -Menu.DownloadTip = Lorg rudan ri luchdadh a-nuas on eadar-lìon is ceanglaichean ris na làraichean-lìn as fhearr leat. -Menu.HomegroupTip = Dèan inntrigeadh do leabharlannan is pasgain air an co-roinneadh le daoine eile sa bhuidhinn dachaigh agad. -Menu.RunTip = Fosglaidh seo prògram, pasgan, sgrìobhainn no làrach-lìn. -Menu.HelpTip = Lorg cuspairean na cobharach, treòirean, fuasgladh dhuilgheadasan is seirbheisean taice eile. -Menu.ProgramsTip = Fosglaidh seo liosta nam prògraman agad. -Menu.SearchFilesTip = Lorg sgrìobhainnean, ceòl, dealbhan, puist-d is mòran a bharrachd. -Menu.GamesTip = Cluich is stiùir geamannan air a' choimpiutair agad. -Menu.SecurityTip = Tòisich roghainnean tèarainteachd Windows gus facal-faire atharrachadh, suidseadh eadar cleachdaichean no manaidsear nan saothair a thòiseachadh. -Menu.SearchComputersTip = Lorg coimpiutairean air an lìonra -Menu.SearchPrintersTip = Lorg clò-bhualadair -Menu.AdminToolsTip = Rèitich roghainnean rianaire air a' choimpiutair agad. -Menu.ShutdownTip = Dùinidh seo a h-uile prògram fosgailte, dùinidh e sìos Windows agus cuiridh e dheth an coimpiutair agad. -Menu.RestartTip = Dùinidh seo a h-uile prògram fosgailte, dùinidh e sìos Windows agus tòisichidh e Windows às ùr. -Menu.SleepTip = Cumaidh seo an seisean agad na chuimhne agus cuiridh e an coimpiutair na staid nach cleachd ach beagan cumhachd airson 's gun urrainn dhut tòiseachadh air d' obair a-rithist gu luath. -Menu.HibernateTip = Sàbhailidh seo an seisean agad is cuiridh e dheth an coimpiutair. Nuair a chuireas tu air an coimpiutair a-rithist, aisigidh Windows an seisean dhut. -Menu.LogOffTip = Dùin na prògraman is clàraich a-mach. -Menu.DisconnectTip = Dì-cheanglaidh seo an seisean agad. 'S urrainn dhut ceangal ris an t-seisean seo às ùr nuair a chlàraicheas tu a-steach a-rithist. -Menu.LockTip = Glais an coimpiutair seo. -Menu.UndockTip = Bheir seo an laptop no notebook agad air falbh on stèisean docaidh. -Menu.SwitchUserTip = Gearr leum eadar cleachdaichean gun na prògraman a dhùnadh. -Menu.Empty = (Falamh) -Menu.Features = Prògraman is feartan -Menu.FeaturesTip = Dì-stàlaich no atharraich prògraman air a' choimpiutair agad. -Menu.SearchPeople = Airson &daoine... -Menu.SortByName = Seòrsaich a-rèir ain&m -Menu.Open = F&osgail -Menu.OpenAll = &Fosgail a h-uile cleachdaiche -Menu.Explore = &Rùraich -Menu.ExploreAll = Rùraic&h a h-uile cleachdaiche -Menu.MenuSettings = Roghainnean -Menu.MenuHelp = Cobhair -Menu.MenuExit = Fàg an-seo -Menu.LogoffTitle = Clàraich a-mach à Windows -Menu.LogoffPrompt = A bheil thu cinnteach gu bheil thu airson clàradh a-mach? -Menu.LogoffYes = &Clàraich a-mach -Menu.LogoffNo = Cha&n eil -Menu.RenameTitle = Thoir ainm ùr air -Menu.RenamePrompt = An &t-ainm ùr: -Menu.RenameOK = Ceart ma-thàa -Menu.RenameCancel = Sguir dheth -Menu.Organize = Cuir air dòigh an clàr-taice tòiseachaidh -Menu.Expand = Leud&aich -Menu.Collapse = Co-the&annaich -Menu.NewFolder = Pasgan ùr -Menu.NewShortcut = Ath-ghoirid ùr -Menu.AutoArrange = C&uir air dòigh gu fèin-obrachail -Menu.ActionOpen = Fosgail -Menu.ActionClose = Dùin -Menu.ActionExecute = Cuir an gnìomh -Menu.RemoveList = Thoir air &falbh on liosta seo -Menu.RemoveAll = Fa&lamhaich liosta nan nithean a bha fosgailte o chionn goirid -Menu.Explorer = Windows Explorer -Menu.Start = Tòisich -Menu.StartScreen = An sgrìn-tòiseachaidh -Menu.StartMenu = Start Menu (Windows) -Menu.PinStart = Prìnich ris a' chlàr-taice tòiseachaidh -Menu.PinStartCs = Prìnich ris a' chlàr-taice tòiseachaidh (Open-Shell) -Menu.UnpinStartCs = Dì-phrìnich on chlàr-taice tòiseachaidh (Open-Shell) -Menu.MonitorOff = Cuir an t-uidheam-taisbeanaidh dheth -Menu.RemoveHighlight = Remove highlight -Menu.Uninstall = &Dì-stàlaich -Menu.UninstallTitle = Dì-stàlaich -Menu.UninstallPrompt = A bheil thu cinnteach gu bheil thu airson %s a dhì-stàladh? -Search.CategorySettings = A' phanail-smachd -Search.CategoryPCSettings = Roghainnean a' PC -Search.CategoryPrograms = Prògraman -Search.CategoryDocuments = Sgrìobhainnean -Search.CategoryMusic = Ceòl -Search.CategoryPictures = Dealbhan -Search.CategoryVideos = Videothan -Search.CategoryFiles = Faidhlichean -Search.CategoryInternet = An t-eadar-lìon -JumpList.Recent = O chionn goirid -JumpList.Frequent = Gu tric -JumpList.Tasks = Saothraichean -JumpList.Pinned = Prìnichte -JumpList.Pin = Prìn&ich ris an liosta seo -JumpList.Unpin = Dì-phrìnich &on liosta seo -JumpList.Remove = Thoir air &falbh on liosta seo -JumpList.PinTip = Prìnich ris an liosta seo -JumpList.UnpinTip = Dì-phrìnich on liosta seo - - -[he-IL] - Hebrew (Israel) -Menu.Programs = &תוכניות -Menu.Apps = אפליקציות -Menu.AllPrograms = כל התוכניות -Menu.Back = הקודם -Menu.Favorites = מו&עדפים -Menu.Documents = מסמכ&ים -Menu.Settings = &הגדרות -Menu.Search = &חפש -Menu.SearchBox = חפש -Menu.SearchPrograms = חפש בתוכניות ובקבצים -Menu.SearchInternet = חפש באינטרנט -Menu.Searching = מחפש... -Menu.NoMatch = ‏‏אין פריטים התואמים לחיפוש שלך. -Menu.MoreResults = הצג תוצאות נוספות -Menu.Help = ע&זרה ותמיכה -Menu.Run = הפע&לה... -Menu.Logoff = י&ציאת %s -Menu.SwitchUser = החלף מש&תמש -Menu.Lock = נ&על -Menu.LogOffShort = &צא -Menu.Undock = &בטל עיגון מחשב -Menu.Disconnect = התנת&קות -Menu.ShutdownBox = &כיבוי... -Menu.Shutdown = &כיבוי -Menu.Restart = &הפעלה מחדש -Menu.ShutdownUpdate = עדכן וכבה -Menu.RestartUpdate = עדכן והפעל מחדש -Menu.Sleep = &שינה -Menu.Hibernate = &מצב שינה -Menu.ControlPanel = &לוח הבקרה -Menu.PCSettings = הגדרות מחשב -Menu.Security = אבטחת Windows -Menu.Network = חיבורי &רשת -Menu.Printers = &מדפסות -Menu.Taskbar = שורת המ&שימות ותפריט התחלה -Menu.SearchFiles = עבור &קבצים או תיקיות... -Menu.SearchPrinter = עבור מ&דפסת -Menu.SearchComputers = עבור &מחשבים -Menu.UserFilesTip = מכיל תיקיות עבור מסמכים, תמונות, מוסיקה וקבצים אחרים השייכים לך. -Menu.UserDocumentsTip = מכיל מכתבים, דוחות ומסמכים וקבצים אחרים. -Menu.UserPicturesTip = תיקיה זו מכילה צילומים דיגיטליים, תמונות וקבצי גרפיקה. -Menu.UserMusicTip = תיקיה זו מכילה קבצי מוסיקה וקבצי שמע אחרים. -Menu.UserVideosTip = תיקיה זו מכילה סרטים וקבצי וידאו אחרים. -Menu.NetworkTip = הצגת חיבורי רשת קיימים במחשב זה ועזרה ביצירת חיבורים חדשים -Menu.PrintersTip = הוסף, הסר והגדר מדפסות מקומיות ומדפסות רשת. -Menu.TaskbarTip = התאם אישית את תפריט התחלה ואת שורת המשימות, כגון סוגי הפריטים שיוצגו ואופן התצוגה שלהם. -Menu.ControlPanelTip = שנה הגדרות והתאם אישית את הפונקציונליות של המחשב שלך. -Menu.DocumentsLibTip = גש למכתבים, דוחות, פתקים וסוגי מסמכים אחרים. -Menu.MusicLibTip = השמע קבצי מוסיקה וקבצי שמע אחרים. -Menu.PicturesLibTip = הצג וארגן תמונות דיגיטליות. -Menu.VideosLibTip = צפה בסרטים ביתיים ובסרטי וידאו דיגיטליים אחרים. -Menu.RecordingsLibTip = צפה בתוכניות טלוויזיה שהוקלטו במחשב שלך. -Menu.DownloadTip = מצא הורדות באינטרנט וקישורים לאתרי אינטרנט מועדפים. -Menu.HomegroupTip = גש לספריות ותיקיות שמשתפים אנשים אחרים בקבוצה הביתית שלך. -Menu.RunTip = פתיחת תוכנית, תיקיה, מסמך או אתר אינטרנט. -Menu.HelpTip = חפש נושאי עזרה, ערכות לימוד, כלי פתרון בעיות ושירותי תמיכה נוספים. -Menu.ProgramsTip = פתיחת רשימה של התוכניות שלך. -Menu.SearchFilesTip = חפש מסמכים, מוסיקה, תמונות, דואר אלקטרוני ועוד. -Menu.GamesTip = שחק ונהל משחקים במחשב. -Menu.SecurityTip = הפעל אפשרויות אבטחה של Windows ל'שנה סיסמה', 'החלף משתמש' או 'הפעל את מנהל המשימות'. -Menu.SearchComputersTip = חפש מחשבים ברשת -Menu.SearchPrintersTip = חפש מדפסת -Menu.AdminToolsTip = קבע תצורה של הגדרות ניהול עבור המחשב. -Menu.ShutdownTip = סגירת כל התוכניות הפתוחות, יציאה מ- Windows ולאחר מכן כיבוי המחשב שלך. -Menu.RestartTip = סגירת כל התוכניות הפתוחות, יציאה מ- Windows ולאחר מכן הפעלה מחדש של Windows. -Menu.SleepTip = שמירת ההפעלה שלך בזיכרון והעברת המחשב למצב צריכת חשמל נמוכה כדי שתוכל לחדש במהירות את העבודה. -Menu.HibernateTip = שמירת ההפעלה שלך וכיבוי המחשב. כאשר תפעיל את המחשב, Windows ישחזר את ההפעלה. -Menu.LogOffTip = סגור תוכניות וצא. -Menu.DisconnectTip = ניתוק ההפעלה שלך. באפשרותך להתחבר מחדש להפעלה זו כשתיכנס שוב. -Menu.LockTip = נעל מחשב זה. -Menu.UndockTip = הסרת המחשב הנישא או מחשב המחברת שלך מתחנת עגינה. -Menu.SwitchUserTip = החלף משתמשים מבלי לסגור תוכניות. -Menu.Empty = (ריק) -Menu.Features = תוכניות ותכונות -Menu.FeaturesTip = הסר התקנה או שנה תוכניות במחשב שלך. -Menu.SearchPeople = עבור &אנשים... -Menu.SortByName = מיין לפי &שם -Menu.Open = &פתח -Menu.OpenAll = פתח את &כל המשתמשים -Menu.Explore = &סייר -Menu.ExploreAll = סיי&ר בכל המשתמשים -Menu.MenuSettings = הגדרות -Menu.MenuHelp = עזרה -Menu.MenuExit = יציאה -Menu.LogoffTitle = יציאה מ- Windows -Menu.LogoffPrompt = האם אתה בטוח שברצונך לצאת? -Menu.LogoffYes = &צא -Menu.LogoffNo = &לא -Menu.RenameTitle = שינוי שם -Menu.RenamePrompt = &שם חדש: -Menu.RenameOK = אישור -Menu.RenameCancel = ביטול -Menu.Organize = ארגן את תפריט התחלה -Menu.Expand = &הרחב -Menu.Collapse = &כווץ -Menu.NewFolder = תיקיה חדשה -Menu.NewShortcut = קיצור דרך חדש -Menu.AutoArrange = סדר &אוטומטית -Menu.ActionOpen = פתח -Menu.ActionClose = סגור -Menu.ActionExecute = בצע -Menu.RemoveList = &הסר מרשימה זו -Menu.RemoveAll = &נקה את רשימת הפריטים האחרונים -Menu.Explorer = סייר Windows -Menu.Start = התחל -Menu.StartScreen = מסך התחל -Menu.StartMenu = תפריט התחלה (Windows) -Menu.PinStart = הצמד לתפריט התחלה -Menu.PinStartCs = הצמד לתפריט התחלה (Open-Shell) -Menu.UnpinStartCs = בטל הצמדה לתפריט התחלה (Open-Shell) -Menu.MonitorOff = כבה את התצוגה -Menu.RemoveHighlight = הסר הבלטה -Menu.Uninstall = ה&סר התקנה -Menu.UninstallTitle = הסר התקנה -Menu.UninstallPrompt = ‏‏האם אתה בטוח שברצונך להסיר את התקנת %s? -Search.CategorySettings = לוח הבקרה -Search.CategoryPCSettings = הגדרות מחשב -Search.CategoryPrograms = תוכניות -Search.CategoryDocuments = מסמכים -Search.CategoryMusic = מוסיקה -Search.CategoryPictures = תמונות -Search.CategoryVideos = סרטי וידאו -Search.CategoryFiles = קבצים -Search.CategoryInternet = אינטרנט -JumpList.Recent = לאחרונה -JumpList.Frequent = תכוף -JumpList.Tasks = משימות -JumpList.Pinned = מוצמד -JumpList.Pin = ה&צמד לרשימה זו -JumpList.Unpin = ב&טל הצמדה לרשימה זו -JumpList.Remove = &הסר מרשימה זו -JumpList.PinTip = הצמד לרשימה זו -JumpList.UnpinTip = בטל הצמדה לרשימה זו - - -[hr-HR] - Croatian (Croatia) -Menu.Programs = Pro&grami -Menu.Apps = Aplikacije -Menu.AllPrograms = Svi programi -Menu.Back = Natrag -Menu.Favorites = &Favoriti -Menu.Documents = &Dokumenti -Menu.Settings = Postav&ke -Menu.Search = T&raži -Menu.SearchBox = Traži -Menu.SearchPrograms = Pretraži programe i datoteke -Menu.SearchInternet = Pretraži internet -Menu.Searching = Pretraživanje... -Menu.NoMatch = Pretraživanje nije dalo rezultata. -Menu.MoreResults = Prikaži još rezultata -Menu.Help = Po&moć i podrška -Menu.Run = &Pokreni... -Menu.Logoff = &Odjava korisnika %s -Menu.SwitchUser = P&romijeni korisnika -Menu.Lock = &Zaključaj -Menu.LogOffShort = &Odjava -Menu.Undock = Ukloni r&ačunalo iz ležišta -Menu.Disconnect = Prekini &vezu -Menu.ShutdownBox = Isklj&uči računalo... -Menu.Shutdown = I&sključi računalo -Menu.Restart = &Ponovo pokreni -Menu.ShutdownUpdate = Ažuriraj i isključi -Menu.RestartUpdate = Ažuriraj i ponovno pokreni -Menu.Sleep = &Spavaj -Menu.Hibernate = &Hibernacija -Menu.ControlPanel = &Upravljačka ploča -Menu.PCSettings = Postavke PC-ja -Menu.Security = Sigurnost sustava Windows -Menu.Network = &Mrežne veze -Menu.Printers = &Pisači -Menu.Taskbar = Programska traka i izbornik &Start -Menu.SearchFiles = Za &datoteke i mape... -Menu.SearchPrinter = Za &pisač -Menu.SearchComputers = Za &računala -Menu.UserFilesTip = Sadrži mape za dokumente, slike, glazbu i druge datoteke koje vam pripadaju. -Menu.UserDocumentsTip = Sadrži digitalne fotografije, slike i grafičke datoteke. -Menu.UserPicturesTip = Sadrži digitalne fotografije, slike i grafičke datoteke. -Menu.UserMusicTip = Sadrži glazbene i druge audio datoteke. -Menu.UserVideosTip = Sadrži filmove i druge videodatoteke. -Menu.NetworkTip = Prikazuje postojeće mrežne veze u računalu i pomaže vam u stvaranju novih -Menu.PrintersTip = Dodajte, uklonite i konfigurirajte lokalne i mrežne pisače. -Menu.TaskbarTip = Prilagodite izbornik Start i programsku traku (npr. odaberite stavke koje će biti prikazane i njihov izgled). -Menu.ControlPanelTip = Promijenite postavke i prilagodite funkcije svog računala. -Menu.DocumentsLibTip = Pristupajte pismima, izvješćima, bilješkama i drugim vrstama dokumenata. -Menu.MusicLibTip = Reproducirajte glazbu i druge audiodatoteke. -Menu.PicturesLibTip = Pregledavajte i organizirajte digitalne slike. -Menu.VideosLibTip = Gledanje kućnih snimki i drugih digitalnih videozapisa. -Menu.RecordingsLibTip = Gledanje TV programa snimljenog na računalu. -Menu.DownloadTip = Traženje internetskih preuzimanja i veza do omiljenih web-mjesta. -Menu.HomegroupTip = Pristupajte bibliotekama i mapama koje zajednički koriste druge osobe u osnovnoj grupi. -Menu.RunTip = Otvara program, mapu, dokument ili web-mjesto. -Menu.HelpTip = Potražite teme Pomoći, vodiče za korisnike, upute za otklanjanje poteškoća i druge servise podrške. -Menu.ProgramsTip = Otvara popis vaših programa. -Menu.SearchFilesTip = Tražite dokumente, glazbu, slike, poruke e-pošte i štošta drugo. -Menu.GamesTip = Igranje i upravljanje igrama na računalu. -Menu.SecurityTip = Pokretanje mogućnosti sigurnosti sustava Windows radi promjene lozinke ili korisnika, odnosno pokretanja Upravitelja zadataka. -Menu.SearchComputersTip = Traži računala u mreži -Menu.SearchPrintersTip = Traži pisač -Menu.AdminToolsTip = Konfigurirajte administrativne postavke računala. -Menu.ShutdownTip = Zatvara sve otvorene programe i isključuje sustav Windows, a zatim i računalo. -Menu.RestartTip = Zatvara sve otvorene programe i isključuje sustav Windows, a zatim ga ponovno pokreće. -Menu.SleepTip = Čuva sesiju u memoriji, a računalo stavlja u stanje male potrošnje radi mogućnosti što bržeg nastavka s radom. -Menu.HibernateTip = Sprema sesiju i gasi računalo. Kada uključite računalo, Windows vraća vašu sesiju. -Menu.LogOffTip = Zatvaranje programa i odjava korisnika. -Menu.DisconnectTip = Prekida vašu sesiju. Možete nastaviti rad u istoj sesiji kada se ponovno prijavite. -Menu.LockTip = Zaključavanje ovog računala. -Menu.UndockTip = Uklanja prijenosno računalo sa stanice za spajanje. -Menu.SwitchUserTip = Promjena korisnika bez zatvaranja programa. -Menu.Empty = (Prazno) -Menu.Features = Programi i značajke -Menu.FeaturesTip = Deinstaliranje ili uklanjanje programa s računala. -Menu.SearchPeople = Za &osobe... -Menu.SortByName = Poredaj po i&menu -Menu.Open = &Otvori -Menu.OpenAll = Ot&vori sve korisnike -Menu.Explore = Ist&raži -Menu.ExploreAll = Istr&aži sve korisnike -Menu.MenuSettings = Postavke -Menu.MenuHelp = Pomoć -Menu.MenuExit = Izlaz -Menu.LogoffTitle = Odjava iz sustava Windows -Menu.LogoffPrompt = Jeste li sigurni da se želite odjaviti? -Menu.LogoffYes = &Odjava -Menu.LogoffNo = &Ne -Menu.RenameTitle = Preimenovanje -Menu.RenamePrompt = &Novi naziv: -Menu.RenameOK = U redu -Menu.RenameCancel = Odustani -Menu.Organize = Organiziranje izbornika Start -Menu.Expand = &Proširi -Menu.Collapse = Saž&mi -Menu.NewFolder = Nova mapa -Menu.NewShortcut = Novi prečac -Menu.AutoArrange = &Posloži automatski -Menu.ActionOpen = Otvori -Menu.ActionClose = Zatvori -Menu.ActionExecute = Izvrši -Menu.RemoveList = Ukloni s &ovog popisa -Menu.RemoveAll = Oč&isti popis nedavnih stavki -Menu.Explorer = Windows Explorer -Menu.Start = Start -Menu.StartScreen = Početni zaslon -Menu.StartMenu = Izbornik Start (Windows) -Menu.PinStart = Prikvači na izbornik Start -Menu.PinStartCs = Prikvači na izbornik Start (Open-Shell) -Menu.UnpinStartCs = Otkvači s izbornika Start (Open-Shell) -Menu.MonitorOff = Isključi prikaz -Menu.RemoveHighlight = Ukloni isticanje -Menu.Uninstall = &Deinstaliraj -Menu.UninstallTitle = Deinstaliraj -Menu.UninstallPrompt = Jeste li sigurni da želite deinstalirati %s iz računala? -Search.CategorySettings = Upravljačka ploča -Search.CategoryPCSettings = Postavke PC-ja -Search.CategoryPrograms = Programi -Search.CategoryDocuments = Dokumenti -Search.CategoryMusic = Glazba -Search.CategoryPictures = Slike -Search.CategoryVideos = Videozapisi -Search.CategoryFiles = Datoteke -Search.CategoryInternet = Internet -JumpList.Recent = Nedavni -JumpList.Frequent = Učestali -JumpList.Tasks = Zadaci -JumpList.Pinned = Prikvačeni -JumpList.Pin = &Prikvači na ovaj popis -JumpList.Unpin = &Otkvači s ovog popisa -JumpList.Remove = &Ukloni s ovog popisa -JumpList.PinTip = Prikvači na ovaj popis -JumpList.UnpinTip = Otkvači s ovog popisa - - -[hu-HU] - Hungarian (Hungary) -Menu.Programs = &Programok -Menu.Apps = Alkalmazások -Menu.AllPrograms = Minden program -Menu.Back = Vissza -Menu.Favorites = K&edvencek -Menu.Documents = &Dokumentumok -Menu.Settings = &Beállítások -Menu.Search = &Keresés -Menu.SearchBox = Keresés -Menu.SearchPrograms = Keresés programokban és fájlokban -Menu.SearchInternet = Keresés az interneten -Menu.Searching = Keresés... -Menu.NoMatch = Nincs a keresésnek megfelelő elem. -Menu.MoreResults = További eredmények -Menu.Help = &Súgó és támogatás -Menu.Run = F&uttatás... -Menu.Logoff = Ki&jelentkezés - %s -Menu.SwitchUser = &Felhasználóváltás -Menu.Lock = &Zárolás -Menu.LogOffShort = &Kijelentkezés -Menu.Undock = &A számítógép dokkolásának megszüntetése -Menu.Disconnect = Kap&csolat bontása -Menu.ShutdownBox = &Leállítás... -Menu.Shutdown = &Leállítás -Menu.Restart = Új&raindítás -Menu.ShutdownUpdate = Frissítés és leállítás -Menu.RestartUpdate = Frissítés és újraindítás -Menu.Sleep = &Alvó állapot -Menu.Hibernate = &Hibernálás -Menu.ControlPanel = &Vezérlőpult -Menu.PCSettings = Gépház -Menu.Security = Windows rendszerbiztonság -Menu.Network = &Hálózati kapcsolatok -Menu.Printers = &Nyomtatók -Menu.Taskbar = &Tálca és Start menü -Menu.SearchFiles = &Fájlok és mappák... -Menu.SearchPrinter = &Nyomtatók -Menu.SearchComputers = &Számítógépek -Menu.UserFilesTip = A Dokumentumok, a Képek és a Zene mappát, illetve egyéb saját fájljait tartalmazó mappák találhatók itt. -Menu.UserDocumentsTip = Levelek, jelentések és egyéb dokumentumok. -Menu.UserPicturesTip = Digitális fényképek, képek és grafikai fájlok. -Menu.UserMusicTip = Zenéket és egyéb audiofájlokat tartalmaz. -Menu.UserVideosTip = Filmeket és egyéb videofájlokat tartalmaz. -Menu.NetworkTip = A számítógépen már létező hálózati kapcsolatok megjelenítése, segítségével új kapcsolatok hozhatók létre -Menu.PrintersTip = Helyi és hálózati nyomtatók hozzáadása, eltávolítása és konfigurálása. -Menu.TaskbarTip = A Start menü és a tálca elemei megjelenésének testreszabása - pl. milyen típusú elemek jelenjenek meg, és hogyan. -Menu.ControlPanelTip = Beállítások módosítása és a számítógép működésének testreszabása. -Menu.DocumentsLibTip = Levelek, jelentések, feljegyzések és egyéb dokumentumok megnyitása. -Menu.MusicLibTip = Zeneszámok és egyéb hangfájlok lejátszása. -Menu.PicturesLibTip = Digitális képek megjelenítése és rendezése. -Menu.VideosLibTip = Saját készítésű filmek és egyéb digitális videók lejátszása. -Menu.RecordingsLibTip = A számítógépre felvett televízióműsorok lejátszása. -Menu.DownloadTip = Internetes letöltések és kedvenc webhelyekre mutató hivatkozások keresése. -Menu.HomegroupTip = Az otthoni csoport más felhasználói által megosztott könyvtárak és mappák elérése. -Menu.RunTip = Program, mappa, dokumentum vagy webhely megnyitása. -Menu.HelpTip = Súgótémakörök, oktatóanyagok, hibaelhárító anyagok és más támogatási szolgáltatások keresése. -Menu.ProgramsTip = A telepített programok listájának megjelenítése. -Menu.SearchFilesTip = Dokumentumok, zenék, képek, levelek és más elemek keresése. -Menu.GamesTip = A számítógépen található játékok elindítása és kezelése. -Menu.SecurityTip = A Windows biztonsági beállításainak megnyitása a jelszó módosítása, felhasználóváltás vagy a Feladatkezelő indítása céljából. -Menu.SearchComputersTip = Számítógépek keresése a hálózaton -Menu.SearchPrintersTip = Nyomtatók keresése -Menu.AdminToolsTip = Felügyeleti beállítások konfigurálása. -Menu.ShutdownTip = Minden futó program bezárása, a Windows leállítása, majd a számítógép kikapcsolása. -Menu.RestartTip = Minden futó program bezárása, a Windows leállítása, majd a Windows rendszer újraindítása. -Menu.SleepTip = Megőrzi a munkamenetet a memóriában, és kis energiafogyasztású állapotba helyezi a számítógépet, hogy gyorsan lehessen folytatni a munkát. -Menu.HibernateTip = A munkamenet mentése és a számítógép kikapcsolása. A számítógép bekapcsolásakor a Windows visszaállítja a munkamenetet. -Menu.LogOffTip = A programok bezárása és kijelentkezés. -Menu.DisconnectTip = A munkamenet leválasztása. Ismét csatlakozhat ehhez a munkamenethez, ha újra bejelentkezik. -Menu.LockTip = A számítógép zárolása. -Menu.UndockTip = A laptop vagy notebook számítógép dokkolásának megszüntetése. -Menu.SwitchUserTip = Felhasználóváltás a programok bezárása nélkül. -Menu.Empty = (Üres) -Menu.Features = Programok és szolgáltatások -Menu.FeaturesTip = A számítógép programjainak eltávolítása vagy módosítása. -Menu.SearchPeople = &Személyek... -Menu.SortByName = &Név szerinti rendezés -Menu.Open = &Megnyitás -Menu.OpenAll = M&egnyitás - All Users -Menu.Explore = T&allózás -Menu.ExploreAll = Ta&llózás - All Users -Menu.MenuSettings = Beállítások -Menu.MenuHelp = Súgó -Menu.MenuExit = Kilépés -Menu.LogoffTitle = Kijelentkezés a Windowsból -Menu.LogoffPrompt = Biztosan kijelentkezik? -Menu.LogoffYes = &Kijelentkezés -Menu.LogoffNo = &Nem -Menu.RenameTitle = Átnevezés -Menu.RenamePrompt = &Új név: -Menu.RenameOK = OK -Menu.RenameCancel = Mégse -Menu.Organize = A Start menü rendezése -Menu.Expand = K&ibontás -Menu.Collapse = Össze&csukás -Menu.NewFolder = Új mappa -Menu.NewShortcut = Új parancsikon -Menu.AutoArrange = Automatikus &elrendezés -Menu.ActionOpen = Megnyitás -Menu.ActionClose = Bezárás -Menu.ActionExecute = Végrehajtás -Menu.RemoveList = Eltá&volítás a listáról -Menu.RemoveAll = &Legutóbbi elemek listájának törlése -Menu.Explorer = Windows Intéző -Menu.Start = Start -Menu.StartScreen = Kezdőképernyő -Menu.StartMenu = Start menü (Windows) -Menu.PinStart = Rögzítés a Start menün -Menu.PinStartCs = Rögzítés a Start menün (Open-Shell) -Menu.UnpinStartCs = Rögzítés feloldása a Start menün (Open-Shell) -Menu.MonitorOff = Kijelző kikapcsolása -Menu.RemoveHighlight = Kiemelés eltávolítása -Menu.Uninstall = Eltá&volítás -Menu.UninstallTitle = Eltávolítás -Menu.UninstallPrompt = Biztosan el kívánja távolítani a következőt: %s? -Search.CategorySettings = Vezérlőpult -Search.CategoryPCSettings = Gépház -Search.CategoryPrograms = Programs -Search.CategoryDocuments = Dokumentumok -Search.CategoryMusic = Zene -Search.CategoryPictures = Képek -Search.CategoryVideos = Videók -Search.CategoryFiles = Fájl -Search.CategoryInternet = Internet -JumpList.Recent = Legutóbbi -JumpList.Frequent = Gyakori -JumpList.Tasks = Feladatok -JumpList.Pinned = Rögzített -JumpList.Pin = &Rögzítés ebbe a listába -JumpList.Unpin = Rögzítés &feloldása ebben a listában -JumpList.Remove = Eltá&volítás a listáról -JumpList.PinTip = Rögzítés ebbe a listába -JumpList.UnpinTip = Rögzítés feloldása ebben a listában - - -[is-IS] - Icelandic (Iceland) -Menu.ClassicSettings = Open-Shell &Menu -Menu.SettingsTip = Stillingar fyrir Open-Shell Menu -Menu.Programs = &Forrit -Menu.Apps = Snjallforrit -Menu.AllPrograms = Öll forrit -Menu.Back = Til baka -Menu.Favorites = &Eftirlæti -Menu.Documents = &Skjöl -Menu.Settings = S&tillingar -Menu.Search = &Leita -Menu.SearchBox = Leita -Menu.SearchPrograms = Leita í forritum og skrám -Menu.SearchInternet = Leita á vefnum -Menu.Searching = Leita... -Menu.NoMatch = Engin atriði samsvara leitinni. -Menu.MoreResults = Sjá fleiri niðurstöður -Menu.Help = &Hjálp og stuðningur -Menu.Run = &Keyra... -Menu.Logoff = Sk&rá út %s -Menu.SwitchUser = &Skipta um notanda -Menu.Lock = &Læsa -Menu.LogOffShort = Sk&rá út -Menu.Undock = A&ftengja tölvuna -Menu.Disconnect = Afteng&jast -Menu.ShutdownBox = &Ganga frá... -Menu.Shutdown = &Ganga frá -Menu.Restart = &Endurræsa -Menu.ShutdownUpdate = Uppfæra og ganga frá -Menu.RestartUpdate = Uppfæra og endurræsa -Menu.Sleep = &Hvíldarstaða -Menu.Hibernate = Í &dvala -Menu.ControlPanel = Stjórn&borð -Menu.PCSettings = PC stillingar -Menu.Security = Windows öryggi -Menu.Network = &Nettengingar -Menu.Printers = &Prentarar -Menu.Taskbar = &Verkstika og ræsivalmynd -Menu.SearchFiles = Að &skrám eða möppum... -Menu.SearchPrinter = Að &prentara -Menu.SearchComputers = Að &tölvum -Menu.UserFilesTip = Inniheldur möppur fyrir skjöl, myndir, tónlist, og aðrar skrár sem tilheyra þér. -Menu.UserDocumentsTip = Inniheldur bréf, skýrslur, og önnur skjöl og skrár. -Menu.UserPicturesTip = Inniheldur stafrænar ljósmyndir, myndir, og grafískar skrár. -Menu.UserMusicTip = Inniheldur tónlist og aðrar hljóðskrár. -Menu.UserVideosTip = Inniheldur kvikmyndir og aðrar myndbandaskrár. -Menu.NetworkTip = Sýnir tiltækar nettengingar á þessari tölvu og hjálpar þér að búa til nýjar -Menu.PrintersTip = Bæta við, fjarlægja, og grunnstilla staðbundna og samnýtta prentara. -Menu.TaskbarTip = Sérstilla ræsivalmyndina og verkstikuna, svo sem tegundir atriða til að birta og hvernig þau eiga að birtast. -Menu.ControlPanelTip = Breyta stillingum og sérstilla virkni tölvunnar þinnar. -Menu.DocumentsLibTip = Nálgast bréf, skýrslur, minnispunkta, og annars konar skjöl. -Menu.MusicLibTip = Spila tónlist og aðrar hljóðskrár. -Menu.PicturesLibTip = Skoða og raða stafrænum ljósmyndum. -Menu.VideosLibTip = Horfa á heimatilbúnar kvikmyndir og önnur stafræn myndbönd. -Menu.RecordingsLibTip = Horfa á sjónvarpsþáttaupptökur á tölvunni þinni. -Menu.DownloadTip = Finna vefniðurhöl og vefföng eftirlætis vefsvæða. -Menu.HomegroupTip = Nálgast forritasöfn og möppur samnýttar af öðru fólki í heimahópnum þínum. -Menu.RunTip = Opnar forrit, möppu, skjal, eða vefsvæði. -Menu.HelpTip = Finna hjálparefni, kennslu, bilanagreiningu, og aðrar stuðningsþjónustur. -Menu.ProgramsTip = Opnar lista yfir forritin þín. -Menu.SearchFilesTip = Leita að skjölum, tónlist, myndum, tölvupósti og fleiru. -Menu.GamesTip = Spila og stjórna leikjum á tölvunni þinni. -Menu.SecurityTip = Ræsa Windows öryggi til að breyta lykilorði, skipta um notanda, eða ræsa verkstjórnun. -Menu.SearchComputersTip = Leita að tölvum á netinu -Menu.SearchPrintersTip = Leita að prentara -Menu.AdminToolsTip = Grunnstilla stjórnunarstillingar fyrir tölvuna þína. -Menu.ShutdownTip = Lokar öllum opnum forritum, gengur frá Windows, og slekkur svo á tölvunni þinni. -Menu.RestartTip = Lokar öllum opnum forritum, gengur frá Windows, og ræsir síðan Windows að nýju. -Menu.SleepTip = Geymir innskráningu þína í minni og setur tölvuna í orkusparnaðarstöðu svo þú getir snögglega byrjað aftur að vinna. -Menu.HibernateTip = Vistar innskráningu þína og slekkur á tölvunni. Þegar þú kveikir á tölvunni, sækir Windows innskráninguna þína aftur. -Menu.LogOffTip = Loka forritum og skrá út. -Menu.DisconnectTip = Aftengir innskráningu þína. Þú getur tengst þessari innskráningu aftur með því að skrá inn að nýju. -Menu.LockTip = Læsa þessari tölvu. -Menu.UndockTip = Fjarlægir fartölvuna þína úr tengikví. -Menu.SwitchUserTip = Skipta milli notenda án þess að loka forritum. -Menu.Empty = (Tómt) -Menu.Features = Forrit og eiginleikar -Menu.FeaturesTip = Fjarlægja eða breyta forritum á tölvunni þinni. -Menu.SearchPeople = Að &fólki... -Menu.SortByName = Raða &eftir heiti -Menu.Open = &Opna -Menu.OpenAll = O&pna Allir notendur -Menu.Explore = Opna &möppu -Menu.ExploreAll = Opna m&öppu Allir notendur -Menu.MenuSettings = Stillingar -Menu.MenuHelp = Hjálp -Menu.MenuExit = Hætta -Menu.LogoffTitle = Skrá út úr Windows -Menu.LogoffPrompt = Ertu viss um að þú viljir skrá út? -Menu.LogoffYes = &Skrá út -Menu.LogoffNo = &Nei -Menu.RenameTitle = Endurnefna -Menu.RenamePrompt = &Nýtt heiti: -Menu.RenameOK = Í lagi -Menu.RenameCancel = Hætta við -Menu.Organize = Sérstilla ræsivalmynd -Menu.Expand = Þenj&a út -Menu.Collapse = Dr&aga saman -Menu.NewFolder = Ný mappa -Menu.NewShortcut = Ný flýtileið -Menu.AutoArrange = R&aða sjálfkrafa -Menu.ActionOpen = Opna -Menu.ActionClose = Loka -Menu.ActionExecute = Keyra -Menu.RemoveList = &Fjarlægja &úr þessum lista -Menu.RemoveAll = Hreinsa &lista yfir nýlegt -Menu.Explorer = Skráarvafri -Menu.Start = Ræsa -Menu.StartScreen = Ræsiskjár -Menu.StartMenu = Ræsivalmynd (Windows) -Menu.PinStart = Festa við ræsivalmynd -Menu.PinStartCs = Festa við ræsivalmynd (Open-Shell) -Menu.UnpinStartCs = Losa af ræsivalmynd (Open-Shell) -Menu.MonitorOff = Slökkva á skjánum -Menu.RemoveHighlight = Fjarlægja auðkenningu -Menu.Uninstall = Fjarlægja -Menu.UninstallTitle = Fjarlægja -Menu.UninstallPrompt = Ertu viss um að það eigi að fjarlægja %s? -Search.CategorySettings = Stjórnborð -Search.CategoryPCSettings = PC stillingar -Search.CategoryPrograms = Forrit -Search.CategoryDocuments = Skjöl -Search.CategoryMusic = Tónlist -Search.CategoryPictures = Myndir -Search.CategoryVideos = Myndbönd -Search.CategoryFiles = Skrár -Search.CategoryInternet = Vefurinn -JumpList.Recent = Nýlegt -JumpList.Frequent = Algengt -JumpList.Tasks = Verk -JumpList.Pinned = Fest -JumpList.Pin = Festa v&ið þennan lista -JumpList.Unpin = L&osa af þessum lista -JumpList.Remove = &Fjarlægja úr þessum lista -JumpList.PinTip = Festa við þennan lista -JumpList.UnpinTip = Losa af þessum lista - - -[it-IT] - Italian (Italy) -Menu.Programs = &Programmi -Menu.Apps = App -Menu.AllPrograms = Tutti i programmi -Menu.Back = Indietro -Menu.Favorites = Pre&feriti -Menu.Documents = &Dati recenti -Menu.Settings = &Impostazioni -Menu.Search = Ce&rca -Menu.SearchBox = Cerca -Menu.SearchPrograms = Cerca programmi e file -Menu.SearchInternet = Cerca in Internet -Menu.Searching = Ricerca in corso... -Menu.NoMatch = Nessun elemento corrisponde ai criteri di ricerca. -Menu.MoreResults = Ulteriori risultati -Menu.Help = &Guida e supporto tecnico -Menu.Run = &Esegui... -Menu.Logoff = Disc&onnetti %s -Menu.SwitchUser = &Cambia utente -Menu.Lock = Bl&occa -Menu.LogOffShort = &Disconnetti -Menu.Undock = Disinseri&sci computer -Menu.Disconnect = Disco&nnetti -Menu.ShutdownBox = &Chiudi sessione... -Menu.Shutdown = &Arresta il sistema -Menu.Restart = &Riavvia il sistema -Menu.ShutdownUpdate = Aggiorna e arresta -Menu.RestartUpdate = Aggiorna e riavvia -Menu.Sleep = &Sospendi -Menu.Hibernate = Metti in &ibernazione -Menu.ControlPanel = &Pannello di controllo -Menu.PCSettings = Impostazioni PC -Menu.Security = Protezione di Windows -Menu.Network = Connessioni di &rete -Menu.Printers = &Stampanti -Menu.Taskbar = &Barra delle applicazioni e menu Start -Menu.SearchFiles = &File o cartelle... -Menu.SearchPrinter = &Per stampante -Menu.SearchComputers = Per &Computer -Menu.UserFilesTip = Contiene cartelle per documenti, immagini, musica e altri file dell'utente. -Menu.UserDocumentsTip = Contiene lettere, rapporti e altri documenti e file. -Menu.UserPicturesTip = Contiene foto digitali, immagini e file di grafica. -Menu.UserMusicTip = Contiene file musicali e audio. -Menu.UserVideosTip = Contiene filmati e altri file video. -Menu.NetworkTip = Visualizza le connessioni di rete del computer e consente di crearne nuove -Menu.PrintersTip = Aggiunge, rimuove e configura stampanti locali e di rete. -Menu.TaskbarTip = Personalizza la visualizzazione degli elementi nel menu Start, barra delle applicazioni e area di notifica. -Menu.ControlPanelTip = Modificare le impostazioni e personalizzare la funzionalità del computer. -Menu.DocumentsLibTip = Accedere a lettere, rapporti, note e ad altri tipi di documenti. -Menu.MusicLibTip = Consente di riprodurre musica e altri file audio. -Menu.PicturesLibTip = Consente di visualizzare e organizzare immagini. -Menu.VideosLibTip = Consente di vedere i propri filmati e altri video digitali. -Menu.RecordingsLibTip = Consente di assistere ai programmi TV registrati nel computer. -Menu.DownloadTip = Consente di trovare i collegamenti ai siti Web preferiti per il download. -Menu.HomegroupTip = Consente di accedere a raccolte e cartelle condivise da altri utenti nel gruppo home. -Menu.RunTip = Consente di aprire un programma, una cartella, un documento o un sito. -Menu.HelpTip = Trovare argomenti della Guida, esercitazioni, risoluzione problemi, e altri servizi di supporto tecnico. -Menu.ProgramsTip = Apre l'elenco dei programmi. -Menu.SearchFilesTip = Cercare documenti, musica, immagini, posta elettronica e altro. -Menu.GamesTip = Consente di giocare e gestire i giochi installati nel computer. -Menu.SecurityTip = Avvia le opzioni di Sicurezza di Windows per modificare la password, cambiare utente o avviare Gestione attività. -Menu.SearchComputersTip = Cerca computer sulla rete -Menu.SearchPrintersTip = Cerca stampante -Menu.AdminToolsTip = Configura le impostazioni amministrative del computer. -Menu.ShutdownTip = Chiude tutti i programmi aperti, arresta Windows e spegne il computer. -Menu.RestartTip = Chiude tutti i programmi aperti e riavvia Windows. -Menu.SleepTip = Mantiene la sessione in memoria e imposta la modalità basso consumo che consente di riprendere rapidamente il lavoro. -Menu.HibernateTip = Salva la sessione e spegne il computer. Quando si riaccende il computer, la sessione verrà ripristinata. -Menu.LogOffTip = Chiude i programmi e disconnette l'utente. -Menu.DisconnectTip = Disconnette la sessione. È possibile riconnettersi a questa sessione al prossimo accesso. -Menu.LockTip = Blocca il computer. -Menu.UndockTip = Consente di rimuovere il computer portatile o il notebook dall'alloggiamento di espansione. -Menu.SwitchUserTip = Consente di cambiare utente senza chiudere i programmi. -Menu.Empty = (vuoto) -Menu.Features = Programmi e funzionalità -Menu.FeaturesTip = Disinstalla o modifica i programmi nel computer. -Menu.SearchPeople = &Contatti... -Menu.SortByName = Or&dina per nome -Menu.Open = &Apri -Menu.OpenAll = Apri &cartella Utenti -Menu.Explore = &Esplora -Menu.ExploreAll = Esplora cartella &Utenti -Menu.MenuSettings = Impostazioni -Menu.MenuHelp = Guida -Menu.MenuExit = Esci -Menu.LogoffTitle = Disconnessione da Windows -Menu.LogoffPrompt = Disconnettersi? -Menu.LogoffYes = &Disconnetti -Menu.LogoffNo = &No -Menu.RenameTitle = Rinomina -Menu.RenamePrompt = &Nuovo nome: -Menu.RenameOK = OK -Menu.RenameCancel = Annulla -Menu.Organize = Organizza menu Start -Menu.Expand = &Espandi -Menu.Collapse = Comp&rimi -Menu.NewFolder = Nuova cartella -Menu.NewShortcut = Nuovo collegamento -Menu.AutoArrange = &Disposizione automatica -Menu.ActionOpen = Apri -Menu.ActionClose = Chiudi -Menu.ActionExecute = Esegui -Menu.RemoveList = &Rimuovi da questo elenco -Menu.RemoveAll = Cancella elenco Ogge&tti recenti -Menu.Explorer = Esplora risorse -Menu.Start = Start -Menu.StartScreen = Schermata Start -Menu.StartMenu = Menu Start (Windows) -Menu.PinStart = Aggiungi al menu Start -Menu.PinStartCs = Aggiungi al menu Start (Open-Shell) -Menu.UnpinStartCs = Rimuovi dal menu Start (Open-Shell) -Menu.MonitorOff = Spegne lo schermo -Menu.RemoveHighlight = Rimuovi elemento di rilievo -Menu.Uninstall = &Disinstalla -Menu.UninstallTitle = Disinstalla -Menu.UninstallPrompt = Disinstallare %s? -Search.CategorySettings = Pannello di controllo -Search.CategoryPCSettings = Impostazioni PC -Search.CategoryPrograms = Programmi -Search.CategoryDocuments = Documenti -Search.CategoryMusic = Musica -Search.CategoryPictures = Immagini -Search.CategoryVideos = Video -Search.CategoryFiles = File -Search.CategoryInternet = Internet -JumpList.Recent = Recenti -JumpList.Frequent = Frequente -JumpList.Tasks = Attività -JumpList.Pinned = Bloccato -JumpList.Pin = Agg&iungi all'elenco -JumpList.Unpin = Rim&uovi dall'elenco -JumpList.Remove = &Rimuovi da questo elenco -JumpList.PinTip = Aggiungi all'elenco -JumpList.UnpinTip = Rimuovi dall'elenco - - -[ja-JP] - Japanese (Japan) -Menu.Programs = プログラム(&P) -Menu.Apps = アプリ -Menu.AllPrograms = すべてのプログラム -Menu.Back = 前に戻る -Menu.Favorites = お気に入り(&A) -Menu.Documents = 最近使った項目(&D) -Menu.Settings = 設定(&S) -Menu.Search = 検索(&C) -Menu.SearchBox = 検索 -Menu.SearchPrograms = プログラムとファイルの検索 -Menu.SearchInternet = インターネットの検索 -Menu.Searching = 検索しています... -Menu.NoMatch = 検索条件に一致する項目はありません。 -Menu.MoreResults = 検索結果の続きを表示 -Menu.Help = ヘルプとサポート(&H) -Menu.Run = ファイル名を指定して実行(&R)... -Menu.Logoff = %s のログオフ(&L) -Menu.SwitchUser = ユーザーの切り替え(&W) -Menu.Lock = ロック(&O) -Menu.LogOffShort = ログオフ(&L) -Menu.Undock = コンピューターの装着解除(&E) -Menu.Disconnect = 切断(&I) -Menu.ShutdownBox = シャットダウン(&U)... -Menu.Shutdown = シャットダウン(&U) -Menu.Restart = 再起動(&R) -Menu.ShutdownUpdate = 更新してシャットダウン -Menu.RestartUpdate = 更新して再起動 -Menu.Sleep = スリープ(&S) -Menu.Hibernate = 休止状態(&H) -Menu.ControlPanel = コントロール パネル(&C) -Menu.PCSettings = 設定 -Menu.Security = Windows セキュリティ -Menu.Network = ネットワーク接続(&N) -Menu.Printers = プリンター(&P) -Menu.Taskbar = タスク バーと [スタート] メニュー(&T) -Menu.SearchFiles = ファイルやフォルダー(&F)... -Menu.SearchPrinter = プリンターの検索(&P) -Menu.SearchComputers = コンピューターの検索(&C) -Menu.UserFilesTip = ユーザーが所有しているドキュメント、画像、音楽などのフォルダーが含まれています。 -Menu.UserDocumentsTip = 手紙、レポート、およびそのほかのドキュメントやファイルが含まれます。 -Menu.UserPicturesTip = デジタル写真、イメージ、および画像ファイルが含まれます。 -Menu.UserMusicTip = 音楽およびそのほかのオーディオ ファイルが含まれます。 -Menu.UserVideosTip = ムービーおよびそのほかのビデオ ファイルが含まれます。 -Menu.NetworkTip = このコンピューターにあるネットワーク接続を表示し、新しい接続の作成をお手伝いします -Menu.PrintersTip = ローカルおよびネットワークのプリンターの追加、削除、および構成を行います。 -Menu.TaskbarTip = [スタート] メニューおよびタスク バーに表示される項目の種類や表示方法をカスタマイズします。 -Menu.ControlPanelTip = 設定を変更し、このコンピューターの機能をカスタマイズします。 -Menu.DocumentsLibTip = 手紙、レポート、メモなどのドキュメントにアクセスします。 -Menu.MusicLibTip = 音楽ファイルやオーディオ ファイルを再生します。 -Menu.PicturesLibTip = デジタル画像を表示および整理します。 -Menu.VideosLibTip = ホーム ビデオとその他のデジタル ビデオを視聴します。 -Menu.RecordingsLibTip = コンピューター上に録画されたテレビ番組を視聴します。 -Menu.DownloadTip = インターネット ダウンロードおよびお気に入りの Web サイトへのリンクを検索します。 -Menu.HomegroupTip = ホームグループ内の他のメンバーが共有するライブラリとフォルダーにアクセスします。 -Menu.RunTip = プログラム、フォルダー、ドキュメントまたは Web サイトを開きます。 -Menu.HelpTip = ヘルプのトピック、チュートリアル、トラブルシューティング、サポート サービスなどを検索します。 -Menu.ProgramsTip = プログラムの一覧を表示します。 -Menu.SearchFilesTip = ドキュメント、音楽ファイル、画像、電子メールなどを検索します。 -Menu.GamesTip = コンピューターにあるゲームのプレイと管理を行います。 -Menu.SecurityTip = Windows セキュリティ オプションを起動して [パスワードの変更]、[ユーザーの切り替え]、[タスク マネージャーの起動] を行います。 -Menu.SearchComputersTip = ネットワークのコンピューターを検索します -Menu.SearchPrintersTip = プリンターを検索します -Menu.AdminToolsTip = コンピューターの管理に関する設定を構成します。 -Menu.ShutdownTip = 開いているプログラムをすべて閉じて、Windows をシャットダウンしてからコンピューターの電源を切ります。 -Menu.RestartTip = 開いているプログラムをすべて閉じて、Windows をシャットダウンしてから、Windows を再起動します。 -Menu.SleepTip = すばやく作業を再開できるように、セッションをメモリに保持してコンピューターを低電力の状態にします。 -Menu.HibernateTip = セッションを保存してコンピューターの電源を切ります。コンピューターの電源を入れたときに、セッションは復元されます。 -Menu.LogOffTip = プログラムを閉じて、ログオフします。 -Menu.DisconnectTip = セッションを切断します。ログオンし直すと、このセッションに再接続できます。 -Menu.LockTip = このコンピューターをロックします。 -Menu.UndockTip = ドッキング ステーションからラップトップやノートブック コンピューターを取り外します。 -Menu.SwitchUserTip = プログラムを閉じずに、ユーザーを切り替えます。 -Menu.Empty = (なし) -Menu.Features = プログラムと機能 -Menu.FeaturesTip = コンピューター上のプログラムをアンインストールまたは変更します。 -Menu.SearchPeople = 人(&P)... -Menu.SortByName = 名前順で並べ替え(&B) -Menu.Open = 開く(&O) -Menu.OpenAll = 開く - All Users(&P) -Menu.Explore = エクスプローラー(&E) -Menu.ExploreAll = エクスプローラー - All Users(&X) -Menu.MenuSettings = 設定 -Menu.MenuHelp = ヘルプ -Menu.MenuExit = 終了 -Menu.LogoffTitle = Windows のログオフ -Menu.LogoffPrompt = ログオフしますか? -Menu.LogoffYes = ログオフ(&L) -Menu.LogoffNo = いいえ(&N) -Menu.RenameTitle = 名前の変更 -Menu.RenamePrompt = 新しい名前(&N): -Menu.RenameOK = OK -Menu.RenameCancel = キャンセル -Menu.Organize = スタート メニューの管理 -Menu.Expand = 展開(&A) -Menu.Collapse = 折りたたみ(&A) -Menu.NewFolder = 新しいフォルダー -Menu.NewShortcut = 新しいショートカット -Menu.AutoArrange = 自動整列(&A) -Menu.ActionOpen = 開く -Menu.ActionClose = 閉じる -Menu.ActionExecute = 実行 -Menu.RemoveList = この一覧から削除(&F) -Menu.RemoveAll = 最近使った項目の一覧のクリア(&L) -Menu.Explorer = エクスプローラー -Menu.Start = スタート -Menu.StartScreen = スタート画面 -Menu.StartMenu = スタート メニュー (Windows) -Menu.PinStart = スタート メニューに表示する -Menu.PinStartCs = スタート メニューに表示する (Open-Shell) -Menu.UnpinStartCs = スタート メニューに表示しない (Open-Shell) -Menu.MonitorOff = 画面をオフにする -Menu.RemoveHighlight = ハイライトの削除 -Menu.Uninstall = アンインストール(&U) -Menu.UninstallTitle = アンインストール -Menu.UninstallPrompt = %s をアンインストールしますか? -Search.CategorySettings = 設定 -Search.CategoryPCSettings = 設定 -Search.CategoryPrograms = プログラム -Search.CategoryDocuments = ドキュメント -Search.CategoryMusic = ミュージック -Search.CategoryPictures = ピクチャ -Search.CategoryVideos = ビデオ -Search.CategoryFiles = ファイル -Search.CategoryInternet = インターネット -JumpList.Recent = 最近使ったもの -JumpList.Frequent = よく使うもの -JumpList.Tasks = タスク -JumpList.Pinned = いつも表示 -JumpList.Pin = いつも表示する(&I) -JumpList.Unpin = いつも表示するものから外す(&U) -JumpList.Remove = この一覧から削除(&F) -JumpList.PinTip = いつも表示する -JumpList.UnpinTip = いつも表示するものから外す - - -[ko-KR] - Korean (Korea) -Menu.Programs = 프로그램(&P) -Menu.Apps = 앱 -Menu.AllPrograms = 모든 프로그램 -Menu.Back = 뒤로 -Menu.Favorites = 즐겨찾기(&A) -Menu.Documents = 문서(&D) -Menu.Settings = 설정(&S) -Menu.Search = 검색(&C) -Menu.SearchBox = 검색 -Menu.SearchPrograms = 프로그램 및 파일 검색 -Menu.SearchInternet = 인터넷 검색 -Menu.Searching = 검색 중... -Menu.NoMatch = 일치하는 항목이 없습니다. -Menu.MoreResults = 자세한 결과 보기 -Menu.Help = 도움말 및 지원(&H) -Menu.Run = 실행(&R)... -Menu.Logoff = %s 로그오프(&L) -Menu.SwitchUser = 사용자 전환(&W) -Menu.Lock = 잠금(&O) -Menu.LogOffShort = 로그오프(&L) -Menu.Undock = 컴퓨터 도킹 해제(&E) -Menu.Disconnect = 연결 끊기(&I) -Menu.ShutdownBox = 시스템 종료(&U)... -Menu.Shutdown = 시스템 종료(&U) -Menu.Restart = 다시 시작(&R) -Menu.ShutdownUpdate = 업데이트 및 종료 -Menu.RestartUpdate = 업데이트 및 다시 시작 -Menu.Sleep = 절전(&S) -Menu.Hibernate = 최대 절전 모드(&H) -Menu.ControlPanel = 제어판(&C) -Menu.PCSettings = PC 설정 -Menu.Security = Windows 보안 -Menu.Network = 네트워크 연결(&N) -Menu.Printers = 프린터(&P) -Menu.Taskbar = 작업 표시줄 및 시작 메뉴(&T) -Menu.SearchFiles = 파일 또는 폴더(&F)... -Menu.SearchPrinter = 프린터(&P) -Menu.SearchComputers = 컴퓨터(&C) -Menu.UserFilesTip = 사용자가 소유한 문서, 사진, 음악 및 기타 파일의 폴더가 있습니다. -Menu.UserDocumentsTip = 편지, 보고서, 기타 문서나 파일이 들어 있습니다. -Menu.UserPicturesTip = 디지털 사진, 이미지 및 그래픽 파일이 들어 있습니다. -Menu.UserMusicTip = 음악 및 기타 오디오 파일이 들어 있습니다. -Menu.UserVideosTip = 음악 및 기타 비디오 파일이 들어 있습니다. -Menu.NetworkTip = 이 컴퓨터의 기존 네트워크 연결을 표시하거나 새로 만드는 것을 도와줍니다. -Menu.PrintersTip = 로컬 및 네트워크 프린터를 추가, 제거, 구성합니다. -Menu.TaskbarTip = 표시되는 항목의 유형 및 표시 방법 등과 같은 시작 메뉴 및 작업 표시줄 설정을 사용자 지정합니다. -Menu.ControlPanelTip = 설정을 변경하고 컴퓨터의 기능을 사용자 지정합니다. -Menu.DocumentsLibTip = 편지, 보고서, 메모 및 기타 문서에 액세스합니다. -Menu.MusicLibTip = 음악 및 기타 오디오 파일을 재생합니다. -Menu.PicturesLibTip = 디지털 사진을 보고 정리합니다. -Menu.VideosLibTip = 홈 동영상 및 기타 디지털 비디오를 시청합니다. -Menu.RecordingsLibTip = 컴퓨터에 녹화된 TV 프로그램을 시청합니다. -Menu.DownloadTip = 인터넷 다운로드 및 즐겨 찾는 웹 사이트에 대한 링크를 찾습니다. -Menu.HomegroupTip = 홈 그룹의 다른 사용자가 공유한 라이브러리 및 폴더에 액세스합니다. -Menu.RunTip = 프로그램, 폴더, 문서 또는 웹 사이트를 엽니다. -Menu.HelpTip = 도움말 항목, 자습서, 문제 해결 및 기타 지원 서비스를 찾습니다. -Menu.ProgramsTip = 프로그램의 목록을 표시합니다. -Menu.SearchFilesTip = 문서, 음악, 사진, 전자 메일 등을 검색합니다. -Menu.GamesTip = 컴퓨터에 있는 게임을 실행 및 관리합니다. -Menu.SecurityTip = 암호를 변경하거나, 사용자를 전환하거나, 작업 관리자를 시작하려면 Windows 보안 옵션을 시작합니다. -Menu.SearchComputersTip = 네트워크에서 컴퓨터 찾기 -Menu.SearchPrintersTip = 프린터 찾기 -Menu.AdminToolsTip = 사용자 컴퓨터의 관리 설정을 구성합니다. -Menu.ShutdownTip = 열려 있는 프로그램을 모두 닫고 Windows를 종료한 다음 컴퓨터를 끕니다. -Menu.RestartTip = 열려 있는 프로그램을 모두 닫고 Windows를 종료한 다음 Windows를 다시 시작합니다. -Menu.SleepTip = 작업을 빠르게 다시 시작할 수 있도록 사용자 세션을 메모리에 저장하고 컴퓨터를 절전 상태로 전환합니다. -Menu.HibernateTip = 사용자 세션을 저장하고 컴퓨터를 끕니다. 컴퓨터를 켜면 Windows에 사용자 세션이 복원됩니다. -Menu.LogOffTip = 프로그램을 닫고 로그오프합니다. -Menu.DisconnectTip = 세션 연결을 끊습니다. 다시 로그온할 때 이 세션에 연결할 수 있습니다. -Menu.LockTip = 이 컴퓨터를 잠급니다. -Menu.UndockTip = 도킹 스테이션에서 랩톱 또는 노트북 컴퓨터를 제거합니다. -Menu.SwitchUserTip = 프로그램을 닫지 않고 사용자를 전환합니다. -Menu.Empty = (비어 있음) -Menu.Features = 프로그램 및 기능 -Menu.FeaturesTip = 컴퓨터의 프로그램을 제거하거나 변경합니다. -Menu.SearchPeople = 사람 찾기(&P)... -Menu.SortByName = 이름순 정렬(&B) -Menu.Open = 열기(&O) -Menu.OpenAll = 열기 - All Users(&P) -Menu.Explore = 탐색(&E) -Menu.ExploreAll = 탐색 - All Users(&X) -Menu.MenuSettings = 설정 -Menu.MenuHelp = 도움말 -Menu.MenuExit = 끝내기 -Menu.LogoffTitle = Windows 로그오프 -Menu.LogoffPrompt = 로그오프하시겠습니까? -Menu.LogoffYes = 로그오프(&L) -Menu.LogoffNo = 아니요(&N) -Menu.RenameTitle = 이름 바꾸기 -Menu.RenamePrompt = 새 이름(&N): -Menu.RenameOK = 확인 -Menu.RenameCancel = 취소 -Menu.Organize = 시작 메뉴 구성 -Menu.Expand = 확장(&A) -Menu.Collapse = 축소(&A) -Menu.NewFolder = 새 폴더 -Menu.NewShortcut = 새 바로 가기 -Menu.AutoArrange = 자동 정렬(&A) -Menu.ActionOpen = 열기 -Menu.ActionClose = 닫기 -Menu.ActionExecute = 실행 -Menu.RemoveList = 이 목록에서 제거(&F) -Menu.RemoveAll = 최근 항목 목록 지우기(&L) -Menu.Explorer = Windows 탐색기 -Menu.Start = 시작 -Menu.StartScreen = 시작 화면 -Menu.StartMenu = 시작 메뉴 (Windows) -Menu.PinStart = 시작 메뉴에 고정 -Menu.PinStartCs = 시작 메뉴에 고정 (Open-Shell) -Menu.UnpinStartCs = 시작 메뉴에서 제거 (Open-Shell) -Menu.MonitorOff = 디스플레이 끄기 -Menu.RemoveHighlight = 추천 취소 -Menu.Uninstall = 제거(&U) -Menu.UninstallTitle = 제거 -Menu.UninstallPrompt = %s 설치를 제거하시겠습니까? -Search.CategorySettings = 설정 -Search.CategoryPCSettings = PC 설정 -Search.CategoryPrograms = 프로그램 -Search.CategoryDocuments = 문서 -Search.CategoryMusic = 음악 -Search.CategoryPictures = 사진 -Search.CategoryVideos = 비디오 -Search.CategoryFiles = 파일 -Search.CategoryInternet = 인터넷 -JumpList.Recent = 최근 항목 -JumpList.Frequent = 자주 사용하는 항목 -JumpList.Tasks = 작업 -JumpList.Pinned = 고정됨 -JumpList.Pin = 이 목록에 고정(&I) -JumpList.Unpin = 이 목록에서 제거(&U) -JumpList.Remove = 이 목록에서 제거(&F) -JumpList.PinTip = 이 목록에 고정 -JumpList.UnpinTip = 이 목록에서 제거 - - -[lt-LT] - Lithuanian (Lithuania) -Menu.Programs = &Programos -Menu.Apps = Programėlės -Menu.AllPrograms = Visos programos -Menu.Back = Atgal -Menu.Favorites = P&arankiniai -Menu.Documents = &Dokumentai -Menu.Settings = Para&metrai -Menu.Search = I&eškoti -Menu.SearchBox = Ieškoti -Menu.SearchPrograms = Ieškoti tarp programų ir failų -Menu.SearchInternet = Ieškoti internete -Menu.Searching = Ieškoma... -Menu.NoMatch = Nėra iešką atitinkančių elementų. -Menu.MoreResults = Rodyti daugiau rezultatų -Menu.Help = &Žinynas ir palaikymas -Menu.Run = &Vykdyti... -Menu.Logoff = I&šeiti %s -Menu.SwitchUser = Perjungti &vartotoją -Menu.Lock = Už&rakinti -Menu.LogOffShort = &Išeiti -Menu.Undock = Kompi&uterį atjungti nuo doko -Menu.Disconnect = A&tsijungti -Menu.ShutdownBox = Išjun>i... -Menu.Shutdown = &Baigti darbą -Menu.Restart = &Paleisti iš naujo -Menu.ShutdownUpdate = Naujinti ir išjungti -Menu.RestartUpdate = Naujinti ir paleisti iš naujo -Menu.Sleep = &Miego būsena -Menu.Hibernate = &Užmigdyti -Menu.ControlPanel = &Valdymo skydas -Menu.PCSettings = PC parametrai -Menu.Security = Windows sauga -Menu.Network = &Tinklo ryšiai -Menu.Printers = &Spausdintuvai -Menu.Taskbar = &Užduočių juosta ir meniu Pradėti -Menu.SearchFiles = Fa&ilams ir aplankams... -Menu.SearchPrinter = S&pausdintuvui -Menu.SearchComputers = &Kompiuteriams -Menu.UserFilesTip = Čia yra aplankai, skirti Dokumentams, Paveikslėliams, Muzikai ir kitoms jums priklausantiems failams. -Menu.UserDocumentsTip = Yra laiškų, ataskaitų ir kitų dokumentų, bei failų. -Menu.UserPicturesTip = Yra skaitmeninių nuotraukų, vaizdų ir grafinių failų. -Menu.UserMusicTip = Yra muzikos ir kitų garso failų. -Menu.UserVideosTip = Yra filmų ir kitų vaizdo failų. -Menu.NetworkTip = Rodomi esantys tinklo ryšiai kompiuteryje ir padedama kurti naujus -Menu.PrintersTip = Įtraukti, šalinti ir konfigūruoti vietinius ir tinklo spausdintuvus. -Menu.TaskbarTip = Tinkinkite meniu Pradėti ir užduočių juostą, pvz., rodyti skirtų elementų tipus ir jų išvaizdą. -Menu.ControlPanelTip = Keiskite parametrus ir tinkinkite savo kompiuterio funkcionalumą. -Menu.DocumentsLibTip = Pasiekite laiškus, ataskaitas, pastabas ir kitų tipų dokumentus. -Menu.MusicLibTip = Leiskite muzikos įrašus ir kitus garso failus. -Menu.PicturesLibTip = Peržiūrėkite ir tvarkykite skaitmeninius paveikslėlius. -Menu.VideosLibTip = Žiūrėkite namų kinus ir kitus skaitmeninius vaizdo įrašus. -Menu.RecordingsLibTip = Žiūrėkite TV programas, įrašytas jūsų kompiuteryje. -Menu.DownloadTip = Ieškokite siūlomų atsisiųsti failų internete ir nuorodų į mėgstamas svetaines. -Menu.HomegroupTip = Pasiekite bibliotekas ir aplankus, kuriuos bendrina kiti jūsų namų grupės nariai. -Menu.RunTip = Atidaro programą, aplanką, dokumentą ar svetainę. -Menu.HelpTip = Ieškokite Žinyno temų, vadovėlių, trikčių šalinimo ir kitų palaikymo paslaugų. -Menu.ProgramsTip = Atidaro programų sąrašą. -Menu.SearchFilesTip = Ieškokite dokumentų, muzikos įrašų, paveikslėlių, el. pašto ir t. t. -Menu.GamesTip = Paleiskite ir valdykite žaidimus kompiuteryje. -Menu.SecurityTip = Paleiskite Windows saugos parinktis, kad pakeistumėte slaptažodį, perjungtumėte vartotoją arba paleistumėte užduočių tvarkytuvą. -Menu.SearchComputersTip = Tinkle ieškoti kompiuterių -Menu.SearchPrintersTip = Ieškoti spausdintuvo -Menu.AdminToolsTip = Konfigūruokite kompiuterio administracinius parametrus. -Menu.ShutdownTip = Uždaro visas atidarytas programas, baigia darbą su Windows ir išjungia kompiuterį. -Menu.RestartTip = Uždaro visas atidarytas programas, Windows ir dar kartą paleidžia Windows. -Menu.SleepTip = Palieka seansą atmintyje ir perjungia kompiuterį veikti eikvojant mažai energijos, kad galėtumėte greitai tęsti darbą. -Menu.HibernateTip = Įrašo seansą ir išjungia kompiuterį. Įjungus kompiuterį, Windows atkuria seansą. -Menu.LogOffTip = Uždaro programas ir išeina. -Menu.DisconnectTip = Atjungiamas seansas. Pakartotinai prisijungti prie šio seanso galėsite dar kartą įėję. -Menu.LockTip = Užrakina šį kompiuterį. -Menu.UndockTip = Iš doko šalinamas nešiojamasis kompiuteris. -Menu.SwitchUserTip = Pakeičia vartotojus neuždarant programų. -Menu.Empty = (Tuščia) -Menu.Features = Programos ir funkcijos -Menu.FeaturesTip = Pašalinkite arba keiskite kompiuterio programas. -Menu.SearchPeople = &Asmenims... -Menu.SortByName = &Rūšiuoti pagal vardus -Menu.Open = &Atidaryti -Menu.OpenAll = A&tidaryti aplanką Visi vartotojai -Menu.Explore = Naršyt&i -Menu.ExploreAll = Na&ršyti visus vartotojus -Menu.MenuSettings = Parametrai -Menu.MenuHelp = Žinynas -Menu.MenuExit = Išeiti -Menu.LogoffTitle = Išeiti iš Windows -Menu.LogoffPrompt = Ar tikrai norite išeiti? -Menu.LogoffYes = I&šeiti -Menu.LogoffNo = &Ne -Menu.RenameTitle = Pervardyti -Menu.RenamePrompt = Naujas &pavadinimas: -Menu.RenameOK = Gerai -Menu.RenameCancel = Atšaukti -Menu.Organize = Tvarkyti pradžios meniu -Menu.Expand = P&lėsti -Menu.Collapse = Su&traukti -Menu.NewFolder = Naujas aplankas -Menu.NewShortcut = Nauja nuoroda -Menu.AutoArrange = Autom&atinis išdėstymas -Menu.ActionOpen = Atidaryti -Menu.ActionClose = Uždaryti -Menu.ActionExecute = Vykdyti -Menu.RemoveList = Šal&inti iš šio sąrašo -Menu.RemoveAll = &Valyti naujausių elementų sąrašą -Menu.Explorer = Windows naršyklė -Menu.Start = Pradėti -Menu.StartScreen = Pradžios ekranas -Menu.StartMenu = Meniu Pradėti (Windows) -Menu.PinStart = Padaryti prieinamą meniu Pradėti -Menu.PinStartCs = Padaryti prieinamą meniu Pradėti (Open-Shell) -Menu.UnpinStartCs = Padaryti neprieinamą meniu Pradėti (Open-Shell) -Menu.MonitorOff = Išjungti ekraną -Menu.RemoveHighlight = Šalinti paryškinimą -Menu.Uninstall = &Pašalinti -Menu.UninstallTitle = Pašalinti -Menu.UninstallPrompt = Ar tikrai norite pašalinti %s? -Search.CategorySettings = Valdymo skydas -Search.CategoryPCSettings = PC parametrai -Search.CategoryPrograms = Programos -Search.CategoryDocuments = Dokumentai -Search.CategoryMusic = Muzika -Search.CategoryPictures = Paveikslėliai -Search.CategoryVideos = Vaizdo įrašai -Search.CategoryFiles = Failai -Search.CategoryInternet = Internetas -JumpList.Recent = Paskutiniai -JumpList.Frequent = Dažniausi -JumpList.Tasks = Užduotys -JumpList.Pinned = Susegta -JumpList.Pin = Į&traukti į šį sąrašą -JumpList.Unpin = P&ašalinti iš šio sąrašo -JumpList.Remove = Pašal&inti iš šio sąrašo -JumpList.PinTip = Įtraukti į šį sąrašą -JumpList.UnpinTip = Pašalinti iš šio sąrašo - - -[lv-LV] - Latvian (Latvia) -Menu.Programs = Pro&grammas -Menu.Apps = Programmas -Menu.AllPrograms = Visas programmas -Menu.Back = Atpakaļ -Menu.Favorites = Mana i&zlase -Menu.Documents = &Dokumenti -Menu.Settings = &Iestatījumi -Menu.Search = &Meklēt -Menu.SearchBox = Meklēt -Menu.SearchPrograms = Meklēt programmas un failus -Menu.SearchInternet = Meklēt internetā -Menu.Searching = Notiek meklēšana... -Menu.NoMatch = Nav vienumu, kas atbilstu meklēšanas kritērijiem. -Menu.MoreResults = Skatīt citus rezultātus -Menu.Help = Pa&līdzība un atbalsts -Menu.Run = Iz&pildīt... -Menu.Logoff = &Atteikties ar vārdu %s -Menu.SwitchUser = Pār&slēgt lietotāju -Menu.Lock = Ai&zslēgt -Menu.LogOffShort = &Atteikties -Menu.Undock = Atdokot dat&oru -Menu.Disconnect = At&vienoties -Menu.ShutdownBox = &Beidzēt... -Menu.Shutdown = &Beidzēšana -Menu.Restart = &Restartēšana -Menu.ShutdownUpdate = Atjaunināt un izslēgt -Menu.RestartUpdate = Atjaunināt un restartēt -Menu.Sleep = &Miega režīms -Menu.Hibernate = &Hibernācija -Menu.ControlPanel = Vadības &panelis -Menu.PCSettings = Datora iestatījumi -Menu.Security = Windows drošība -Menu.Network = &Tīkla savienojumi -Menu.Printers = P&rinteri -Menu.Taskbar = &Uzdevumjosla un izvēlne Sākt -Menu.SearchFiles = &Failus vai mapes... -Menu.SearchPrinter = &Printeri -Menu.SearchComputers = &Datorus -Menu.UserFilesTip = Ietver sadaļu Mani dokumenti, Mani attēli, Mana mūzika mapes un citus failus, kas jums pieder. -Menu.UserDocumentsTip = Satur vēstules, atskaites un citus dokumentus un failus. -Menu.UserPicturesTip = Satur ciparu fotogrāfijas, attēlus un grafikas failus. -Menu.UserMusicTip = Satur mūziku un citus audio failus. -Menu.UserVideosTip = Satur filmas un citus video failus. -Menu.NetworkTip = Parāda šajā datorā esošos tīkla savienojumus un palīdz izveidot jaunus -Menu.PrintersTip = Pievienojiet, noņemiet un konfigurējiet lokālos un tīkla printerus. -Menu.TaskbarTip = Pielāgot izvēlni Sākt un uzdevumjoslu, piemēram, kāda tipa vienumus rādīt un kā tiem ir jāizskatās. -Menu.ControlPanelTip = Mainīt iestatījumus un pielāgot datora funkcionalitāti. -Menu.DocumentsLibTip = Piekļūt vēstulēm, atskaitēm, piezīmēm un cita veida dokumentiem. -Menu.MusicLibTip = Atskaņot mūzikas un citus audio failus. -Menu.PicturesLibTip = Skatīt un organizēt digitālos attēlus. -Menu.VideosLibTip = Skatiet amatieru filmas un citu ciparvideo. -Menu.RecordingsLibTip = Skatiet datorā ierakstītās TV programmas. -Menu.DownloadTip = Atrodiet interneta lejupielādes un saites uz iecienītajām vietnēm. -Menu.HomegroupTip = Piekļūstiet bibliotēkām un mapēm, ko kopīgojušas citas personas mājas grupā. -Menu.RunTip = Atver programmu, mapi, dokumentu vai tīmekļa vietni. -Menu.HelpTip = Atrast palīdzības tēmas, apmācības, problēmu novēršanu un citus atbalsta pakalpojumus. -Menu.ProgramsTip = Atver programmu sarakstu. -Menu.SearchFilesTip = Meklēt dokumentus, mūziku, attēlus, e-pastu un citu. -Menu.GamesTip = Spēlēt un pārvaldīt spēles datorā. -Menu.SecurityTip = Palaist Windows drošības opcijas, lai mainītu paroli, pārslēgtu lietotāju vai startētu Uzdevumu pārvaldnieku. -Menu.SearchComputersTip = Meklēt datorus tīklā -Menu.SearchPrintersTip = Meklēt printeri -Menu.AdminToolsTip = Konfigurēt datora administratīvos iestatījumus. -Menu.ShutdownTip = Aizver visas atvērtās programmas, izslēdz sistēmu Windows un pēc tam izslēdz datoru. -Menu.RestartTip = Aizver visas atvērtās programmas, izslēdz sistēmu Windows un pēc tam to atkal startē. -Menu.SleepTip = Saglabā sesiju atmiņā un pārslēdz datoru mazas jaudas režīmā, lai pēc tam varētu ātri atsākt darbu. -Menu.HibernateTip = Saglabā sesiju un izslēdz datoru. Ieslēdzot datoru, sistēma Windows atjauno sesiju. -Menu.LogOffTip = Aizvērt programmas un atteikties. -Menu.DisconnectTip = Atvieno sesiju. Atkārtoti izveidot savienojumu ar šo sesiju var, vēlreiz piesakoties sistēmā. -Menu.LockTip = Aizslēgt datoru. -Menu.UndockTip = Noņem klēpjdatoru vai piezīmjdatoru no dokstacijas. -Menu.SwitchUserTip = Pārslēgt lietotājus, neaizverot programmas. -Menu.Empty = (Tukšs) -Menu.Features = Programmas un līdzekļi -Menu.FeaturesTip = Noņemt programmu instalāciju vai mainīt programmas datorā. -Menu.SearchPeople = &Personām... -Menu.SortByName = &Kārtot pēc nosaukuma -Menu.Open = A&tvērt -Menu.OpenAll = &Atvērt visus lietotājus -Menu.Explore = &Pārlūkot -Menu.ExploreAll = Pār&lūkot visus lietotājus -Menu.MenuSettings = Iestatījumi -Menu.MenuHelp = Palīdzība -Menu.MenuExit = Iziet -Menu.LogoffTitle = Atteikšanās sistēmā Windows -Menu.LogoffPrompt = Vai tiešām vēlaties atteikties? -Menu.LogoffYes = &Atteikties -Menu.LogoffNo = &Nē -Menu.RenameTitle = Pārdēvēšana -Menu.RenamePrompt = Jaunais &nosaukums: -Menu.RenameOK = Labi -Menu.RenameCancel = Atcelt -Menu.Organize = Organizēt izvēlni Sākt -Menu.Expand = Izv&ērst -Menu.Collapse = Sakļ&aut -Menu.NewFolder = Jauna mape -Menu.NewShortcut = Jauna saīsne -Menu.AutoArrange = &Automātiski sakārtot -Menu.ActionOpen = Atvērt -Menu.ActionClose = Aizvērt -Menu.ActionExecute = Izpildīt -Menu.RemoveList = &Noņemt no šī saraksta -Menu.RemoveAll = &Notīrīt nesen pievienoto vienumu sarakstu -Menu.Explorer = Windows Explorer -Menu.Start = Sākt -Menu.StartScreen = Sākuma ekrāns -Menu.StartMenu = Izvēlne Sākt (Windows) -Menu.PinStart = Piespraust izvēlnei Sākt -Menu.PinStartCs = Piespraust izvēlnei Sākt (Open-Shell) -Menu.UnpinStartCs = Atspraust no izvēlnes Sākt (Open-Shell) -Menu.MonitorOff = Izslēgt displeju -Menu.RemoveHighlight = Noņemt marķējumu -Menu.Uninstall = &Atinstalēt -Menu.UninstallTitle = Atinstalēt -Menu.UninstallPrompt = Vai esat pārliecināts, ka vēlaties atinstalēt %s? -Search.CategorySettings = Vadības panelis -Search.CategoryPCSettings = Datora iestatījumi -Search.CategoryPrograms = Programmas -Search.CategoryDocuments = Dokumenti -Search.CategoryMusic = Mūzika -Search.CategoryPictures = Attēli -Search.CategoryVideos = Video -Search.CategoryFiles = Faili -Search.CategoryInternet = Internets -JumpList.Recent = Nesen izmantotie -JumpList.Frequent = Biežāk atvērtie -JumpList.Tasks = Uzdevumi -JumpList.Pinned = Piesprausts -JumpList.Pin = Pie&spraust šim sarakstam -JumpList.Unpin = &Atspraust no šī saraksta -JumpList.Remove = &Noņemt no šī saraksta -JumpList.PinTip = Piespraust šim sarakstam -JumpList.UnpinTip = Atspraust no šī saraksta - - -[mk-MK] - Macedonian (Macedonia) -Menu.Programs = Програми -Menu.Apps = Апликации -Menu.AllPrograms = Сите програми -Menu.Back = Назад -Menu.Favorites = Омилени -Menu.Documents = Документи -Menu.Settings = Подесувања -Menu.Search = Пребарување -Menu.SearchBox = Поле за пребарување -Menu.SearchPrograms = Барање на програми и фајлови -Menu.SearchInternet = Пребарување на интернет -Menu.Searching = Пребарување... -Menu.NoMatch = Не е пронајдено ништо. -Menu.MoreResults = Дај повеќе резултати -Menu.Help = Помош и поддршка -Menu.Run = Стартувај... -Menu.Logoff = Излегување од -Menu.SwitchUser = Смени го корисникот -Menu.Lock = Заклучување -Menu.LogOffShort = Кратко излегување -Menu.Undock = Откачи го компјутерот -Menu.Disconnect = Прекини ја врската -Menu.ShutdownBox = Исклучи... -Menu.Shutdown = Исклучување -Menu.Restart = Рестартирај -Menu.ShutdownUpdate = Надградба и исклучување -Menu.RestartUpdate = Надградба и рестартирање -Menu.Sleep = Заспивање -Menu.Hibernate = Хибернација -Menu.ControlPanel = Контрол панел -Menu.PCSettings = Параметри на компјутерот -Menu.Security = Заштита на Windows -Menu.Network = Компјутерска Мрежа -Menu.Printers = Принтери -Menu.Taskbar = Таскбар и мени “Старт“ -Menu.SearchFiles = За фајлови или фолдери... -Menu.SearchPrinter = За печатар -Menu.SearchComputers = За компјутери -Menu.UserFilesTip = Содржи фолдери за документи, музика и други ваши фајлови. -Menu.UserDocumentsTip = Содржи документи, слики, фајлови и друго. -Menu.UserPicturesTip = Содржи документи, слики и фајлови. -Menu.UserMusicTip = Содржи музика и други аудио фајлови. -Menu.UserVideosTip = Содржи филмови и други видео фајлови. -Menu.NetworkTip = Покажува постоечки врски на мрежата на тој компјутер и ви овозможува да направите нови -Menu.PrintersTip = Додавање, отстранување и конфигурирање на локални мрежини принтери. -Menu.TaskbarTip = Персонализирање на менито "Старт" и таскбарот на задачите, како на прим. типови на елементи коишто ќе бидат покажани. -Menu.ControlPanelTip = Промена на подесување и пресонализирање на функционалноста на компјутерот. -Menu.DocumentsLibTip = Пристап до писма, белешки и други видови на документи. -Menu.MusicLibTip = Репродукција на музика и други аудио фајлови. -Menu.PicturesLibTip = Преглед и организирање на дигитални слики. -Menu.VideosLibTip = Гледање на домашни филмови и други дигитални видеозаписи. -Menu.RecordingsLibTip = Гледање на снимени на компјутер ТВ програми. -Menu.DownloadTip = Барање на даунлоадирани фајлови од интернет и кон напосакуваните врски. -Menu.HomegroupTip = Достап до директориуми и фолдери, споделени од други луѓе во вашата домашна мрежа. -Menu.RunTip = Отвара програма, фолдер, документ или веб сајт. -Menu.HelpTip = Лоцирајте теми од "Помош", туторијали, отстранување на неисправности и други услуги за поддршка. -Menu.ProgramsTip = Го отвора списокот на програмите. -Menu.SearchFilesTip = Барање на документи, музика, слики,и електронска пошта и друго. -Menu.GamesTip = Играјте и управувајте со игрите на својот компјутер. -Menu.SecurityTip = Стартирајте ги опциите за заштита на Windows, за да промените лозинка, да смените корисник или да стартирате таск менаџер. -Menu.SearchComputersTip = Барање на компјутери во мрежата -Menu.SearchPrintersTip = Барање на печатари -Menu.AdminToolsTip = Конфигурирање на административните подесувања на компјутерот. -Menu.ShutdownTip = Ги затвора сите отворени програми, исклучува Windows и исклучува компјутер. -Menu.RestartTip = Ги затвора сите отворени програми, исклучува Windows и после одново се стартува Windows. -Menu.SleepTip = Ја запазува сесијата во меморија и го поставува компјутерот во систем на штедење на енергија, за да можете брзо да продолжите со работа. -Menu.HibernateTip = Ја запазува сесијата во меморија и исклучува компјутерот. Кога ќе го вклучите компјутерот, Windows ја продолжува вашата сесија. -Menu.LogOffTip = Затварање на програмите и излегување. -Menu.DisconnectTip = Ја прекинува врската со вашата сесија. Можете да се поврзете со таа сесија повторно, кога ќе влезете повторно. -Menu.LockTip = Заклупување на компјутерот. -Menu.UndockTip = Го отстранува вашиот лаптоп или ноутбук комјутер од базната станица. -Menu.SwitchUserTip = Смена на корисниците без да се затвораат програмите. -Menu.Empty = (Празно) -Menu.Features = Програми и компоненти -Menu.FeaturesTip = Деинсталација или промена на програми на компјутерот. -Menu.SearchPeople = За луѓе... -Menu.SortByName = Сортирај по име -Menu.Open = Отвори -Menu.OpenAll = Отвори "Сите корисници" -Menu.Explore = Преглед -Menu.ExploreAll = Преглед на "Сите корисници" -Menu.MenuSettings = Подесувања -Menu.MenuHelp = Помош -Menu.MenuExit = Излез -Menu.LogoffTitle = Излегување од Windows -Menu.LogoffPrompt = Навистина сакате да излезете? -Menu.LogoffYes = Излегување -Menu.LogoffNo = Не -Menu.RenameTitle = Преименување -Menu.RenamePrompt = Ново име: -Menu.RenameOK = OK -Menu.RenameCancel = Откажи -Menu.Organize = Организирање на менито "Старт" -Menu.Expand = Прошири -Menu.Collapse = Собери -Menu.NewFolder = Нов фолдер -Menu.NewShortcut = Нов краток пат -Menu.AutoArrange = Автоматско подредување -Menu.ActionOpen = Отвори -Menu.ActionClose = Затвори -Menu.ActionExecute = Изврши -Menu.RemoveList = Отстрани од тој список -Menu.RemoveAll = Исчисти го списокот од последните програми -Menu.Explorer = Windows Explorer -Menu.Start = Старт -Menu.StartScreen = Почетен екран -Menu.StartMenu = Мени "Старт" (Windows) -Menu.PinStart = Закачи кон менито "Старт" -Menu.PinStartCs = Закачи го кон менито "Старт" (Open-Shell) -Menu.UnpinStartCs = Откачи го од менито "Старт" (Open-Shell) -Menu.MonitorOff = Исклучување на дисплејот -Menu.RemoveHighlight = Remove highlight -Menu.Uninstall = &Деинсталирај -Menu.UninstallTitle = Деинсталирај -Menu.UninstallPrompt = Дали сте сигурни дека сакате да го деинсталирате %s? -Search.CategorySettings = Контрол панел -Search.CategoryPCSettings = Параметри на компјутерот -Search.CategoryPrograms = Програми -Search.CategoryDocuments = Документи -Search.CategoryMusic = Музика -Search.CategoryPictures = Слики -Search.CategoryVideos = Видеозаписи -Search.CategoryFiles = Фајлови -Search.CategoryInternet = Интернет -JumpList.Recent = Последни -JumpList.Frequent = Често Користени -JumpList.Tasks = Задачи -JumpList.Pinned = Закачени -JumpList.Pin = Закачи кон тој список -JumpList.Unpin = Откачи од тој список -JumpList.Remove = Отстрани од тој список -JumpList.PinTip = Закачи кон тој список -JumpList.UnpinTip = Откачи од тој список - - -[nb-NO] - Norwegian, Bokmål (Norway) -Menu.Programs = &Programmer -Menu.Apps = Apper -Menu.AllPrograms = Alle programmer -Menu.Back = Tilbake -Menu.Favorites = &Favoritter -Menu.Documents = &Dokumenter -Menu.Settings = &Innstillinger -Menu.Search = &Søk -Menu.SearchBox = Søk -Menu.SearchPrograms = Søk i programmer og filer -Menu.SearchInternet = Søk på Internett -Menu.Searching = Søker... -Menu.NoMatch = Ingen elementer stemmer med søket. -Menu.MoreResults = Se flere resultater -Menu.Help = &Hjelp og støtte -Menu.Run = &Kjør... -Menu.Logoff = &Logg av %s -Menu.SwitchUser = &Bytt bruker -Menu.Lock = L&ås -Menu.LogOffShort = &Logg av -Menu.Undock = Koble fra P&C -Menu.Disconnect = K&oble fra -Menu.ShutdownBox = &Avslutt... -Menu.Shutdown = &Avslutt -Menu.Restart = &Start på nytt -Menu.ShutdownUpdate = Oppdater og slå av -Menu.RestartUpdate = Oppdater og start på nytt -Menu.Sleep = &Hvilemodus -Menu.Hibernate = &Dvalemodus -Menu.ControlPanel = &Kontrollpanel -Menu.PCSettings = PC-innstillinger -Menu.Security = Windows-sikkerhet -Menu.Network = &Nettverkstilkoblinger -Menu.Printers = &Skrivere -Menu.Taskbar = &Oppgavelinje og Start-meny -Menu.SearchFiles = Etter &filer eller mapper... -Menu.SearchPrinter = Etter &skriver -Menu.SearchComputers = Etter &datamaskiner -Menu.UserFilesTip = Inneholder mapper for dokumenter, bilder, musikk og andre filer som tilhører deg. -Menu.UserDocumentsTip = Inneholder brev, rapporter og andre dokumenter og filer. -Menu.UserPicturesTip = Inneholder digitale fotografier, bilder og grafikkfiler. -Menu.UserMusicTip = Inneholder musikk- og andre lydfiler. -Menu.UserVideosTip = Inneholder filmer og andre videofiler. -Menu.NetworkTip = Viser eksisterende tilkoblinger på denne datamaskinen, og hjelper deg med å opprette nye -Menu.PrintersTip = Legg til, fjern og konfigurer lokale skrivere. -Menu.TaskbarTip = Tilpass Start-menyen og oppgavelinjen, for eksempel typen elementer som skal vises, og hvordan de skal vises. -Menu.ControlPanelTip = Endre innstillinger og tilpass funksjonaliteten på datamaskinen. -Menu.DocumentsLibTip = Lagre brev, rapporter, notater og andre typer dokumenter. -Menu.MusicLibTip = Spill av musikk og andre lydfiler. -Menu.PicturesLibTip = Vis og ordne digitale bilder. -Menu.VideosLibTip = Se hjemmefilmer og andre digitale videoer. -Menu.RecordingsLibTip = Se TV-programmer lagret på datamaskinen. -Menu.DownloadTip = Finn Internett-nedlastinger og koblinger til favorittsteder på nettet. -Menu.HomegroupTip = Få tilgang til biblioteker og mapper delt med andre i hjemmegruppen. -Menu.RunTip = Åpner et program, en mappe, et dokument eller et webområde. -Menu.HelpTip = Finn hjelpeemner, opplæring, feilsøking og andre støttetjenester. -Menu.ProgramsTip = Åpner en liste over programmer. -Menu.SearchFilesTip = Søk etter dokumenter, musikk, bilder, e-post og mer. -Menu.GamesTip = Spill og administrer spill på datamaskinen. -Menu.SecurityTip = Start Windows sikkerhetsalternativer for å endre Passord, Bytte bruker eller starte Oppgavebehandling. -Menu.SearchComputersTip = Søk etter datamaskiner på nettverket -Menu.SearchPrintersTip = Søk etter en skriver -Menu.AdminToolsTip = Konfigurer administrative innstillinger for datamaskinen. -Menu.ShutdownTip = Lukker alle åpne programmer, avslutter Windows og slår deretter av datamaskinen. -Menu.RestartTip = Lukker alle åpne programmer, avslutter Windows, og starter deretter Windows på nytt. -Menu.SleepTip = Beholder økten i minnet, og setter datamaskinen i en status med lavt strømforbruk så du raskt kan gjenoppta arbeidet. -Menu.HibernateTip = Lagrer økten, og slår av datamaskinen. Windows gjenoppretter økten når du slår på datamaskinen. -Menu.LogOffTip = Lukk programmer og logg av. -Menu.DisconnectTip = Kobler fra økten. Du kan koble til denne økten når du logger på igjen. -Menu.LockTip = Lås denne datamaskinen. -Menu.UndockTip = Fjerner den bærbare datamaskinen fra en forankringsstasjon. -Menu.SwitchUserTip = Bytt brukere uten å lukke programmer. -Menu.Empty = (Tom) -Menu.Features = Programmer og funksjoner -Menu.FeaturesTip = Avinstaller eller endre programmer på datamaskinen. -Menu.SearchPeople = Etter &personer... -Menu.SortByName = Sorter etter &navn -Menu.Open = Å&pne -Menu.OpenAll = &Åpne mappen All users -Menu.Explore = &Utforsk -Menu.ExploreAll = Utforsk &mappen All users -Menu.MenuSettings = Innstillinger -Menu.MenuHelp = Hjelp -Menu.MenuExit = Avslutt -Menu.LogoffTitle = Logg av Windows -Menu.LogoffPrompt = Er du sikker på at du vil logge av? -Menu.LogoffYes = &Logg av -Menu.LogoffNo = &Nei -Menu.RenameTitle = Gi nytt navn -Menu.RenamePrompt = &Nytt navn: -Menu.RenameOK = OK -Menu.RenameCancel = Avbryt -Menu.Organize = Organiser Start-meny -Menu.Expand = &Utvid -Menu.Collapse = &Minimer -Menu.NewFolder = Ny mappe -Menu.NewShortcut = Ny snarvei -Menu.AutoArrange = O&rdne automatisk -Menu.ActionOpen = Åpne -Menu.ActionClose = Lukk -Menu.ActionExecute = Utføre -Menu.RemoveList = &Fjern fra denne listen -Menu.RemoveAll = &Tøm listen over nylig brukte elementer -Menu.Explorer = Windows Utforsker -Menu.Start = Start -Menu.StartScreen = Startskjerm -Menu.StartMenu = Start-meny (Windows) -Menu.PinStart = Fest til Start-menyen -Menu.PinStartCs = Fest til Start-menyen (Open-Shell) -Menu.UnpinStartCs = Løsne fra Start-menyen (Open-Shell) -Menu.MonitorOff = Slå av skjermen -Menu.RemoveHighlight = Fjern høydepunkt -Menu.Uninstall = &Avinstaller -Menu.UninstallTitle = Avinstaller -Menu.UninstallPrompt = Er du sikker på at du vil avinstallere %s? -Search.CategorySettings = Kontrollpanel -Search.CategoryPCSettings = PC-innstillinger -Search.CategoryPrograms = Programmer -Search.CategoryDocuments = Dokumenter -Search.CategoryMusic = Musikk -Search.CategoryPictures = Bilder -Search.CategoryVideos = Videoer -Search.CategoryFiles = Filer -Search.CategoryInternet = Internett -JumpList.Recent = Siste -JumpList.Frequent = Ofte -JumpList.Tasks = Oppgaver -JumpList.Pinned = Låst -JumpList.Pin = &Fest til denne listen -JumpList.Unpin = &Løsne fra denne listen -JumpList.Remove = Fjer&n fra denne listen -JumpList.PinTip = Fest til denne listen -JumpList.UnpinTip = Løsne fra denne listen - - -[nl-NL] - Dutch (Netherlands) -Menu.Programs = &Programma's -Menu.Apps = Apps -Menu.AllPrograms = Alle programma's -Menu.Back = Vorige weergave -Menu.Favorites = &Favorieten -Menu.Documents = &Documenten -Menu.Settings = &Instellingen -Menu.Search = &Zoeken -Menu.SearchBox = Zoeken -Menu.SearchPrograms = Programma's en bestanden zoeken -Menu.SearchInternet = Op internet zoeken -Menu.Searching = Zoeken... -Menu.NoMatch = Geen zoekresultaten. -Menu.MoreResults = Meer resultaten weergeven -Menu.Help = &Help en ondersteuning -Menu.Run = &Uitvoeren... -Menu.Logoff = %s af&melden -Menu.SwitchUser = An&dere gebruiker -Menu.Lock = &Vergrendelen -Menu.LogOffShort = Afmel&den -Menu.Undock = &Laptop loskoppelen -Menu.Disconnect = Ver&binding verbreken -Menu.ShutdownBox = &Afsluiten... -Menu.Shutdown = A&fsluiten -Menu.Restart = &Opnieuw opstarten -Menu.ShutdownUpdate = Bijwerken en afsluiten -Menu.RestartUpdate = Bijwerken en opnieuw opstarten -Menu.Sleep = &Slaapstand -Menu.Hibernate = Slui&merstand -Menu.ControlPanel = &Configuratiescherm -Menu.PCSettings = Pc-instellingen -Menu.Security = Windows-beveiliging -Menu.Network = &Netwerkverbindingen -Menu.Printers = &Printers -Menu.Taskbar = &Taakbalk en menu Start -Menu.SearchFiles = Naar &bestanden of mappen... -Menu.SearchPrinter = &Naar printer -Menu.SearchComputers = Naar &computers -Menu.UserFilesTip = Bevat mappen voor documenten, afbeeldingen, muziek en andere bestanden die van u zijn. -Menu.UserDocumentsTip = Dit is de locatie waar u brieven, rapporten, documenten en andere bestanden kunt opslaan -Menu.UserPicturesTip = Dit is de locatie waar u digitale foto's, afbeeldingen en andere grafische bestanden kunt opslaan -Menu.UserMusicTip = Dit is de locatie waar u muziek en andere audiobestanden kunt opslaan -Menu.UserVideosTip = Dit is de locatie waar u filmfragmenten en andere videobestanden kunt opslaan -Menu.NetworkTip = Hiermee worden netwerkverbindingen op deze computer weergegeven en krijgt u hulp bij het maken van nieuwe verbindingen -Menu.PrintersTip = Hiermee kunt u lokale en netwerkprinters toevoegen, verwijderen en configureren -Menu.TaskbarTip = Hiermee kunt u de weergave wijzigen van onderdelen die in het menu Start of op de taakbalk staan -Menu.ControlPanelTip = De instellingen en functionaliteit van uw computer wijzigen -Menu.DocumentsLibTip = Brieven, rapporten, notities en andere soorten documenten openen -Menu.MusicLibTip = Muziek en andere audiobestanden afspelen -Menu.PicturesLibTip = Digitale foto's weergeven en rangschikken -Menu.VideosLibTip = Bekijk zelfgemaakte films en andere digitale video's. -Menu.RecordingsLibTip = Bekijk televisieprogramma's die op de computer zijn opgenomen. -Menu.DownloadTip = Zoek internetdownloads en koppelingen naar favoriete websites. -Menu.HomegroupTip = Toegang krijgen tot bibliotheken en maken die gedeeld worden door andere gebruikers in uw thuisgroep. -Menu.RunTip = Hiermee kunt u een programma starten, map openen of een website bezoeken -Menu.HelpTip = Help-onderwerpen, zelfstudies, probleemoplossingen en andere ondersteuningsdiensten zoeken -Menu.ProgramsTip = Hiermee kunt u een lijst met beschikbare programma's weergeven -Menu.SearchFilesTip = Documenten, muziek, afbeeldingen, e-mailberichten en meer zoeken -Menu.GamesTip = Spellen op uw computer spelen en beheren -Menu.SecurityTip = Start Windows-beveiligingsopties om het wachtwoord te wijzigen, van gebruiker te veranderen of Taakbeheer te starten. -Menu.SearchComputersTip = Computers in het netwerk zoeken -Menu.SearchPrintersTip = Een printer zoeken -Menu.AdminToolsTip = Hiermee kunt u beheerinstellingen voor deze computer configureren -Menu.ShutdownTip = Alle geopende programma's sluiten, Windows afsluiten en vervolgens de computer uitschakelen -Menu.RestartTip = Alle geopende programma's sluiten en vervolgens Windows opnieuw starten -Menu.SleepTip = Uw sessie wordt in het geheugen bewaard en de computer wordt in een toestand van laag energieverbruik gezet, zodat u uw werk snel kunt hervatten. -Menu.HibernateTip = Uw sessie wordt opgeslagen en de computer wordt uitgeschakeld. Als u de computer inschakelt, wordt uw sessie hersteld. -Menu.LogOffTip = Alle programma's sluiten en u afmelden -Menu.DisconnectTip = De sessie beëindigen. U kunt de sessie hervatten door u opnieuw aan te melden. -Menu.LockTip = Deze computer vergrendelen -Menu.UndockTip = Uw draagbare computer loskoppelen van het basisstation -Menu.SwitchUserTip = Een andere gebruiker in staat stellen zich aan te melden zonder programma's te sluiten -Menu.Empty = (leeg) -Menu.Features = Programma's en onderdelen -Menu.FeaturesTip = Programma's op uw computer wijzigen of van uw computer verwijderen -Menu.SearchPeople = &Personen... -Menu.SortByName = S&orteren op naam -Menu.Open = &Openen -Menu.OpenAll = &Alle gebruikers weergeven -Menu.Explore = Ve&rkennen -Menu.ExploreAll = Alle &gebruikers verkennen -Menu.MenuSettings = Instellingen -Menu.MenuHelp = Help -Menu.MenuExit = Afsluiten -Menu.LogoffTitle = Afmelden bij Windows -Menu.LogoffPrompt = Weet u zeker dat u zich wilt afmelden? -Menu.LogoffYes = A&fmelden -Menu.LogoffNo = &Nee -Menu.RenameTitle = Naam wijzigen -Menu.RenamePrompt = &Nieuwe naam: -Menu.RenameOK = OK -Menu.RenameCancel = Annuleren -Menu.Organize = Menu Start organiseren -Menu.Expand = &Uitvouwen -Menu.Collapse = Samen&vouwen -Menu.NewFolder = Nieuwe map -Menu.NewShortcut = Nieuwe snelkoppeling -Menu.AutoArrange = Automatisch sc&hikken -Menu.ActionOpen = Openen -Menu.ActionClose = Sluiten -Menu.ActionExecute = Uitvoeren -Menu.RemoveList = Uit deze lijst &verwijderen -Menu.RemoveAll = Lijst met recente items &wissen -Menu.Explorer = Windows Verkenner -Menu.Start = Start -Menu.StartScreen = Startscherm -Menu.StartMenu = Menu Start (Windows) -Menu.PinStart = Vastmaken aan menu Start -Menu.PinStartCs = Vastmaken aan menu Start (Open-Shell) -Menu.UnpinStartCs = Losmaken van menu Start (Open-Shell) -Menu.MonitorOff = Het beeldscherm uitschakelen -Menu.RemoveHighlight = Aandachtspunt verwijderen -Menu.Uninstall = V&erwijderen -Menu.UninstallTitle = Verwijderen -Menu.UninstallPrompt = Weet u zeker dat u %s wilt verwijderen? -Search.CategorySettings = Configuratiescherm -Search.CategoryPCSettings = Pc-instellingen -Search.CategoryPrograms = Programma's -Search.CategoryDocuments = Documenten -Search.CategoryMusic = Muziek -Search.CategoryPictures = Afbeeldingen -Search.CategoryVideos = Video's -Search.CategoryFiles = Bestanden -Search.CategoryInternet = Internet -JumpList.Recent = Recent -JumpList.Frequent = Vaak gebruikte items -JumpList.Tasks = Taken -JumpList.Pinned = Gepind -JumpList.Pin = &Aan deze lijst vastmaken -JumpList.Unpin = &Van deze lijst losmaken -JumpList.Remove = Uit deze lijst &verwijderen -JumpList.PinTip = Aan deze lijst vastmaken -JumpList.UnpinTip = Van deze lijst losmaken - - -[pl-PL] - Polish (Poland) -Menu.Programs = &Programy -Menu.Apps = Aplikacje -Menu.AllPrograms = Wszystkie programy -Menu.Back = Wstecz -Menu.Favorites = Ulu&bione -Menu.Documents = &Dokumenty -Menu.Settings = &Ustawienia -Menu.Search = &Wyszukaj -Menu.SearchBox = Wyszukaj -Menu.SearchPrograms = Wyszukaj programy i pliki -Menu.SearchInternet = Przeszukaj Internet -Menu.Searching = Trwa wyszukiwanie... -Menu.NoMatch = Żadne elementy nie pasują do kryteriów wyszukiwania. -Menu.MoreResults = Wyświetl więcej wyników -Menu.Help = Pomo&c i obsługa techniczna -Menu.Run = Urucho&m... -Menu.Logoff = Wy&loguj: %s -Menu.SwitchUser = &Przełącz użytkownika -Menu.Lock = &Zablokuj -Menu.LogOffShort = Wy&loguj -Menu.Undock = Oddokuj kompu&ter -Menu.Disconnect = &Rozłącz -Menu.ShutdownBox = Zam&knij... -Menu.Shutdown = &Zamknij -Menu.Restart = &Uruchom ponownie -Menu.ShutdownUpdate = Zaktualizuj i zamknij -Menu.RestartUpdate = Zaktualizuj i uruchom ponownie -Menu.Sleep = &Wstrzymaj -Menu.Hibernate = &Hibernacja -Menu.ControlPanel = Panel &sterowania -Menu.PCSettings = Ustawienia komputera -Menu.Security = Zabezpieczenia systemu Windows -Menu.Network = &Połączenia sieciowe -Menu.Printers = &Drukarki -Menu.Taskbar = Pasek zadań i &menu Start -Menu.SearchFiles = &Pliki lub foldery... -Menu.SearchPrinter = &Drukarki -Menu.SearchComputers = &Komputery -Menu.UserFilesTip = Zawiera foldery na dokumenty, obrazy, muzykę i inne Twoje pliki. -Menu.UserDocumentsTip = Zawiera listy, raporty i inne dokumenty i pliki. -Menu.UserPicturesTip = Zawiera fotografie cyfrowe, obrazy i pliki graficzne. -Menu.UserMusicTip = Zawiera muzykę i inne pliki audio. -Menu.UserVideosTip = Zawiera filmy i inne pliki wideo. -Menu.NetworkTip = Wyświetla istniejące połączenia sieciowe na tym komputerze, oraz ułatwia tworzenie nowych. -Menu.PrintersTip = Dodawaj, usuwaj i konfiguruj drukarki lokalne i sieciowe. -Menu.TaskbarTip = Dostosuj menu Start i pasek zadań, na przykład typy wyświetlanych elementów i sposób ich wyświetlania. -Menu.ControlPanelTip = Zmień ustawienia i dostosuj funkcjonalność tego komputera. -Menu.DocumentsLibTip = Przechowuj listy, raporty, notatki i inne rodzaje dokumentów. -Menu.MusicLibTip = Odtwarzaj muzykę i inne pliki audio. -Menu.PicturesLibTip = Wyświetlaj i organizuj obrazy cyfrowe. -Menu.VideosLibTip = Oglądaj filmy i inne cyfrowe materiały wideo. -Menu.RecordingsLibTip = Oglądaj programy telewizyjne nagrane na komputerze. -Menu.DownloadTip = Znajdź pliki pobrane z Internetu i łącza do ulubionych witryn sieci Web. -Menu.HomegroupTip = Uzyskaj dostęp do bibliotek i folderów udostępnionych w grupie domowej przez inne osoby. -Menu.RunTip = Otwiera program, folder, dokument lub witrynę sieci web. -Menu.HelpTip = Znajdź tematy Pomocy, samouczki, narzędzia do rozwiązywania problemów i inne usługi pomocnicze. -Menu.ProgramsTip = Otwiera listę programów. -Menu.SearchFilesTip = Wyszukuj dokumenty, muzykę, obrazy, wiadomości e-mail i inne elementy. -Menu.GamesTip = Graj i zarządzaj grami na komputerze. -Menu.SecurityTip = Otwórz opcje zabezpieczeń systemu Windows, aby zmienić hasło, przełączyć użytkownika lub uruchomić Menedżera zadań. -Menu.SearchComputersTip = Wyszukiwanie komputerów w sieci -Menu.SearchPrintersTip = Wyszukiwanie drukarki -Menu.AdminToolsTip = Konfiguruje ustawienia administracyjne dla tego komputera. -Menu.ShutdownTip = Zamyka wszystkie otwarte programy, zamyka system Windows, a następnie wyłącza komputer. -Menu.RestartTip = Zamyka wszystkie otwarte programy, zamyka system Windows, a następnie ponownie go uruchamia. -Menu.SleepTip = Zachowuje sesję w pamięci i przełącza komputer w stan niskiego poboru energii, umożliwiając szybkie wznowienie pracy. -Menu.HibernateTip = Zapisuje sesję i wyłącza komputer. Gdy włączysz komputer, system Windows przywróci sesję. -Menu.LogOffTip = Zamknij programy i wyloguj się. -Menu.DisconnectTip = Rozłącza sesję. Po ponownym zalogowaniu można ponownie połączyć się z tą samą sesją. -Menu.LockTip = Zablokuj ten komputer. -Menu.UndockTip = Odłącza komputer przenośny od stacji dokowania. -Menu.SwitchUserTip = Przełącz użytkowników bez zamykania programów. -Menu.Empty = (Puste) -Menu.Features = Programy i funkcje -Menu.FeaturesTip = Odinstaluj lub zmień programy na komputerze. -Menu.SearchPeople = &Do osób... -Menu.SortByName = Sortuj w&edług nazw -Menu.Open = &Otwórz -Menu.OpenAll = Otwórz &wszystkich użytkowników -Menu.Explore = &Eksploruj -Menu.ExploreAll = E&ksploruj wszystkich użytkowników -Menu.MenuSettings = Ustawienia -Menu.MenuHelp = Pomoc -Menu.MenuExit = Zakończ -Menu.LogoffTitle = Wylogowywanie z systemu Windows -Menu.LogoffPrompt = Czy na pewno chcesz się wylogować? -Menu.LogoffYes = &Wyloguj -Menu.LogoffNo = &Nie -Menu.RenameTitle = Zmienianie nazwy -Menu.RenamePrompt = &Nowa nazwa: -Menu.RenameOK = OK -Menu.RenameCancel = Anuluj -Menu.Organize = Organizuj menu Start -Menu.Expand = &Rozwiń -Menu.Collapse = &Zwiń -Menu.NewFolder = Nowy folder -Menu.NewShortcut = Nowy skrót -Menu.AutoArrange = &Autorozmieszczanie -Menu.ActionOpen = Otwórz -Menu.ActionClose = Zamknij -Menu.ActionExecute = Wykonaj -Menu.RemoveList = &Usuń z tej listy -Menu.RemoveAll = &Wyczyść listę niedawno używanych elementów -Menu.Explorer = Eksplorator Windows -Menu.Start = Start -Menu.StartScreen = Ekran startowy -Menu.StartMenu = Menu Start (Windows) -Menu.PinStart = Przypnij do menu Start -Menu.PinStartCs = Przypnij do menu Start (Open-Shell) -Menu.UnpinStartCs = Odepnij od menu Start (Open-Shell) -Menu.MonitorOff = Wyłącz ekran -Menu.RemoveHighlight = Usuń wyróżnienie -Menu.Uninstall = &Odinstaluj -Menu.UninstallTitle = Odinstaluj -Menu.UninstallPrompt = Czy na pewno chcesz odinstalować program %s? -Search.CategorySettings = Panel sterowania -Search.CategoryPCSettings = Ustawienia komputera -Search.CategoryPrograms = Programy -Search.CategoryDocuments = Dokumenty -Search.CategoryMusic = Muzyka -Search.CategoryPictures = Obrazy -Search.CategoryVideos = Wideo -Search.CategoryFiles = Pliki -Search.CategoryInternet = Internet -JumpList.Recent = Najnowsze -JumpList.Frequent = Częste -JumpList.Tasks = Zadania -JumpList.Pinned = Zakotwiczony -JumpList.Pin = &Przypnij do tej listy -JumpList.Unpin = &Odepnij od tej listy -JumpList.Remove = U&suń z tej listy -JumpList.PinTip = Przypnij do tej listy -JumpList.UnpinTip = Odepnij od tej listy - - -[pt-BR] - Portuguese (Brazil) -Menu.Programs = &Programas -Menu.Apps = Aplicativos -Menu.AllPrograms = Todos os Programas -Menu.Back = Voltar -Menu.Favorites = &Favoritos -Menu.Documents = Docu&mentos -Menu.Settings = &Configurações -Menu.Search = Pe&squisar -Menu.SearchBox = Pesquisar -Menu.SearchPrograms = Pesquisar programas e arquivos -Menu.SearchInternet = Pesquisar na Internet -Menu.Searching = Pesquisando... -Menu.NoMatch = Nenhum item corresponde à pesquisa. -Menu.MoreResults = Ver mais resultados -Menu.Help = &Ajuda e Suporte -Menu.Run = Execu&tar... -Menu.Logoff = Fa&zer Logoff de %s -Menu.SwitchUser = &Trocar usuário -Menu.Lock = Bl&oquear -Menu.LogOffShort = Faz&er logoff -Menu.Undock = Desencai&xar -Menu.Disconnect = &Desconectar -Menu.ShutdownBox = Desliga&r... -Menu.Shutdown = &Desligar -Menu.Restart = &Reiniciar -Menu.ShutdownUpdate = Atualizar e desligar -Menu.RestartUpdate = Atualizar e reiniciar -Menu.Sleep = &Dormir -Menu.Hibernate = &Hibernar -Menu.ControlPanel = &Painel de controle -Menu.PCSettings = Configurações do computador -Menu.Security = Segurança do Windows -Menu.Network = Co&nexões de Rede -Menu.Printers = &Impressoras -Menu.Taskbar = &Barra de Tarefas e menu Iniciar -Menu.SearchFiles = &Arquivos ou Pastas... -Menu.SearchPrinter = Imp&ressora -Menu.SearchComputers = &Computadores -Menu.UserFilesTip = Contém pastas de Documentos, Imagens, Músicas e outros arquivos pertencentes a você. -Menu.UserDocumentsTip = Contém cartas, relatórios e outros documentos e arquivos. -Menu.UserPicturesTip = Contém fotos digitais, imagens e arquivos gráficos. -Menu.UserMusicTip = Contém música e outros arquivos de áudio. -Menu.UserVideosTip = Contém filmes e outros arquivos de vídeo. -Menu.NetworkTip = Exibe as conexões de rede existentes neste computador e ajuda a criar novas conexões -Menu.PrintersTip = Adicione, remova e configure impressoras e locais e de rede. -Menu.TaskbarTip = Personaliza o menu Iniciar e a barra de ferramentas: tipos de itens a exibir e a maneira como aparecem. -Menu.ControlPanelTip = Altere as configurações e personalize a funcionalidade do seu computador. -Menu.DocumentsLibTip = Acesse cartas, relatórios, anotações e outros tipos de documentos. -Menu.MusicLibTip = Toque música e outros arquivos de áudio. -Menu.PicturesLibTip = Veja e organize imagens digitais. -Menu.VideosLibTip = Assistir a filmes caseiros e outros vídeos digitais. -Menu.RecordingsLibTip = Assistir programas de TV gravados no seu computador. -Menu.DownloadTip = Localizar downloads da Internet e links para sites favoritos. -Menu.HomegroupTip = Acesse bibliotecas e pastas compartilhadas por outras pessoas em seu grupo doméstico. -Menu.RunTip = Abre um programa, uma pasta, um documento ou um site. -Menu.HelpTip = Localizar tópicos da Ajuda, tutoriais, soluções de problemas e outros serviços de suporte. -Menu.ProgramsTip = Abre uma lista dos programas. -Menu.SearchFilesTip = Pesquisar documentos, músicas, imagens, emails e muito mais. -Menu.GamesTip = Jogar e gerenciar jogos no computador. -Menu.SecurityTip = Iniciar Opções de Segurança do Windows para Alterar Senha, Alternar Usuário ou Iniciar o Gerenciador de Tarefas. -Menu.SearchComputersTip = Procurar computadores na rede -Menu.SearchPrintersTip = Procurar uma impressora -Menu.AdminToolsTip = Definir configurações administrativas para o computador. -Menu.ShutdownTip = Fecha todos os programas, desliga o Windows e desliga o computador. -Menu.RestartTip = Fecha todos os programas, desliga o Windows e o reinicia. -Menu.SleepTip = Mantém a sua sessão na memória e coloca o computador em um estado de baixa energia para que você possa reiniciar rapidamente o trabalho. -Menu.HibernateTip = Salva sua sessão e desliga o computador. Quando você liga o computador novamente, o Windows restaura a sessão. -Menu.LogOffTip = Fechar todos os programas e fazer logoff. -Menu.DisconnectTip = Desconecta a sessão. Você pode reconectá-la quando fizer logon novamente. -Menu.LockTip = Bloquear este computador. -Menu.UndockTip = Remove o laptop ou notebook de uma base de encaixe. -Menu.SwitchUserTip = Alternar os usuários sem fechar os programas. -Menu.Empty = (Vazio) -Menu.Features = Programas e Recursos -Menu.FeaturesTip = Desinstalar ou alterar programas do computador. -Menu.SearchPeople = Para &Pessoas... -Menu.SortByName = C&lassificar por nome -Menu.Open = &Abrir -Menu.OpenAll = A&brir a pasta All Users -Menu.Explore = E&xplorar -Menu.ExploreAll = Expl&orar a pasta All Users -Menu.MenuSettings = Configurações -Menu.MenuHelp = Ajuda -Menu.MenuExit = Sair -Menu.LogoffTitle = Fazer Logoff do Windows -Menu.LogoffPrompt = Tem certeza de que deseja fazer logoff? -Menu.LogoffYes = Faz&er Logoff -Menu.LogoffNo = &Não -Menu.RenameTitle = Renomear -Menu.RenamePrompt = &Novo nome: -Menu.RenameOK = OK -Menu.RenameCancel = Cancelar -Menu.Organize = Organizar o menu Iniciar -Menu.Expand = E&xpandir -Menu.Collapse = &Recolher -Menu.NewFolder = Nova Pasta -Menu.NewShortcut = Novo Atalho -Menu.AutoArrange = Organi&zar Automaticamente -Menu.ActionOpen = Abrir -Menu.ActionClose = Fechar -Menu.ActionExecute = Executar -Menu.RemoveList = Remover desta &lista -Menu.RemoveAll = &Limpar lista de itens recentes -Menu.Explorer = Windows Explorer -Menu.Start = Iniciar -Menu.StartScreen = Tela Inicial -Menu.StartMenu = Menu Iniciar (Windows) -Menu.PinStart = Fixar no Menu Iniciar -Menu.PinStartCs = Fixar no Menu Iniciar (Open-Shell) -Menu.UnpinStartCs = Desafixar do Menu Iniciar (Open-Shell) -Menu.MonitorOff = Desativar o vídeo -Menu.RemoveHighlight = Remover Destaque -Menu.Uninstall = &Desinstalar -Menu.UninstallTitle = Desinstalar -Menu.UninstallPrompt = Tem certeza de que deseja desinstalar %s? -Search.CategorySettings = Painel de controle -Search.CategoryPCSettings = Configurações do computador -Search.CategoryPrograms = Programas -Search.CategoryDocuments = Documentos -Search.CategoryMusic = Músicas -Search.CategoryPictures = Imagens -Search.CategoryVideos = Vídeos -Search.CategoryFiles = Arquivos -Search.CategoryInternet = Internet -JumpList.Recent = Recentes -JumpList.Frequent = Frequente -JumpList.Tasks = Tarefas -JumpList.Pinned = Fixo -JumpList.Pin = In&cluir nesta lista -JumpList.Unpin = &Tirar desta lista -JumpList.Remove = Remover desta &lista -JumpList.PinTip = Incluir nesta lista -JumpList.UnpinTip = Tirar desta lista - - -[pt-PT] - Portuguese (Portugal) -Menu.Programs = &Programas -Menu.Apps = Aplicações -Menu.AllPrograms = Todos os Programas -Menu.Back = Anterior -Menu.Favorites = &Favoritos -Menu.Documents = &Documentos -Menu.Settings = Defi&nições -Menu.Search = Pro&curar -Menu.SearchBox = Procurar -Menu.SearchPrograms = Procurar programas e ficheiros -Menu.SearchInternet = Procurar na Internet -Menu.Searching = A procurar... -Menu.NoMatch = Nenhum item corresponde à pesquisa. -Menu.MoreResults = Ver mais resultados -Menu.Help = &Ajuda e suporte -Menu.Run = E&xecutar... -Menu.Logoff = &Terminar sessão de %s -Menu.SwitchUser = M&udar de utilizador -Menu.Lock = &Bloquear -Menu.LogOffShort = &Terminar sessão -Menu.Undock = D&esancorar -Menu.Disconnect = Des&ligar -Menu.ShutdownBox = Ence&rrar... -Menu.Shutdown = &Encerrar -Menu.Restart = &Reiniciar -Menu.ShutdownUpdate = Atualizar e encerrar -Menu.RestartUpdate = Atualizar e reiniciar -Menu.Sleep = &Suspender -Menu.Hibernate = &Hibernar -Menu.ControlPanel = &Painel de controlo -Menu.PCSettings = Definições do PC -Menu.Security = Segurança do Windows -Menu.Network = &Ligações de rede -Menu.Printers = &Impressoras -Menu.Taskbar = &Barra de tarefas e menu Iniciar -Menu.SearchFiles = &Ficheiros ou Pastas... -Menu.SearchPrinter = &Impressora -Menu.SearchComputers = &Computadores -Menu.UserFilesTip = Contém pastas de Documentos, Imagens, Música e outros ficheiros que lhe pertençam. -Menu.UserDocumentsTip = Contém cartas, relatórios e outros documentos e ficheiros. -Menu.UserPicturesTip = Contém fotografias digitais, imagens e ficheiros gráficos. -Menu.UserMusicTip = Contém música e outros ficheiros de áudio. -Menu.UserVideosTip = Contém filmes e outros ficheiros de vídeo. -Menu.NetworkTip = Mostra as ligações de rede existentes neste computador e ajuda a criar novas ligações -Menu.PrintersTip = Adiciona, remove e configura impressoras locais e de rede. -Menu.TaskbarTip = Personalize o menu Iniciar e a barra de tarefas, por exemplo, o tipo de itens a apresentar e o modo como devem ser apresentados. -Menu.ControlPanelTip = Alterar as definições e personalizar a funcionalidade do computador. -Menu.DocumentsLibTip = Aceder a cartas, relatórios, notas e outros tipos de documentos. -Menu.MusicLibTip = Reproduzir música e outros ficheiros de áudio. -Menu.PicturesLibTip = Ver e organizar imagens digitais. -Menu.VideosLibTip = Assistir a filmes domésticos e a outros vídeos digitais. -Menu.RecordingsLibTip = Assistir a programas de TV gravados no computador. -Menu.DownloadTip = Localizar transferências e hiperligações para Web sites favoritos. -Menu.HomegroupTip = Aceda a bibliotecas e pastas partilhadas por outras pessoas no grupo doméstico. -Menu.RunTip = Abre um programa, pasta, documento ou Web site. -Menu.HelpTip = Localizar tópicos de Ajuda, iniciações, resolução de problemas e outros serviços de suporte. -Menu.ProgramsTip = Abre uma lista dos seus programas. -Menu.SearchFilesTip = Procurar documentos, música, imagens, correio electrónico e muito mais. -Menu.GamesTip = Jogar e gerir os jogos existentes no computador. -Menu.SecurityTip = Iniciar Opções de Segurança do Windows para Alterar Palavra-passe, Mudar de Utilizador ou Iniciar o Gestor de Tarefas. -Menu.SearchComputersTip = Procurar computadores na rede -Menu.SearchPrintersTip = Procurar impressora -Menu.AdminToolsTip = Configura definições administrativas para o computador. -Menu.ShutdownTip = Fecha todos os programas abertos, encerra o Windows e, em seguida, desliga o computador. -Menu.RestartTip = Fecha todos os programas abertos, encerra o Windows e, em seguida, inicia novamente o Windows. -Menu.SleepTip = Mantém a sessão em memória e coloca o computador num estado de baixo consumo para poder retomar o trabalho rapidamente. -Menu.HibernateTip = Guarda a sessão e desliga o computador. Quando ligar o computador, o Windows vai restaurar a sessão. -Menu.LogOffTip = Fecha programas e termina sessão. -Menu.DisconnectTip = Desliga a sua sessão. Pode religar a esta sessão quando iniciar sessão novamente. -Menu.LockTip = Bloqueia este computador. -Menu.UndockTip = Remove o computador portátil de uma estação de ancoragem. -Menu.SwitchUserTip = Muda de utilizadores sem fechar os programas. -Menu.Empty = (Vazio) -Menu.Features = Programas e Funcionalidades -Menu.FeaturesTip = Desinstale ou altere programas no computador. -Menu.SearchPeople = &Pessoas... -Menu.SortByName = Ordenar pelo &nome -Menu.Open = &Abrir -Menu.OpenAll = A&brir All Users -Menu.Explore = E&xplorar -Menu.ExploreAll = Explorar All &Users -Menu.MenuSettings = Definições -Menu.MenuHelp = Ajuda -Menu.MenuExit = Sair -Menu.LogoffTitle = Terminar sessão no Windows -Menu.LogoffPrompt = Tem a certeza de que pretende terminar a sessão? -Menu.LogoffYes = &Terminar sessão -Menu.LogoffNo = &Não -Menu.RenameTitle = Mudar o nome -Menu.RenamePrompt = &Novo nome: -Menu.RenameOK = OK -Menu.RenameCancel = Cancelar -Menu.Organize = Organizar o menu Iniciar -Menu.Expand = E&xpandir -Menu.Collapse = &Fechar -Menu.NewFolder = Nova pasta -Menu.NewShortcut = Novo atalho -Menu.AutoArrange = Dispor au&tomaticamente -Menu.ActionOpen = Abrir -Menu.ActionClose = Fechar -Menu.ActionExecute = Executar -Menu.RemoveList = Remover &desta lista -Menu.RemoveAll = &Limpar lista de itens recentes -Menu.Explorer = Explorador do Windows -Menu.Start = Iniciar -Menu.StartScreen = Ecrã Iniciar -Menu.StartMenu = Menu Iniciar (Windows) -Menu.PinStart = Afixar no menu Iniciar -Menu.PinStartCs = Afixar no menu Iniciar (Open-Shell) -Menu.UnpinStartCs = Remover do menu Iniciar (Open-Shell) -Menu.MonitorOff = Desligar a visualização -Menu.RemoveHighlight = Remover destaque -Menu.Uninstall = D&esinstalar -Menu.UninstallTitle = Desinstalar -Menu.UninstallPrompt = Tem a certeza de que pretende desinstalar %s? -Search.CategorySettings = Painel de controlo -Search.CategoryPCSettings = Definições do PC -Search.CategoryPrograms = Programas -Search.CategoryDocuments = Documentos -Search.CategoryMusic = Música -Search.CategoryPictures = Imagens -Search.CategoryVideos = Vídeos -Search.CategoryFiles = Ficheiros -Search.CategoryInternet = Internet -JumpList.Recent = Recente -JumpList.Frequent = Frequente -JumpList.Tasks = Tarefas -JumpList.Pinned = Fixado -JumpList.Pin = Afi&xar nesta lista -JumpList.Unpin = &Remover desta lista -JumpList.Remove = Remover &desta lista -JumpList.PinTip = Afixar nesta lista -JumpList.UnpinTip = Remover desta lista - - -[ro-RO] - Romanian (Romania) -Menu.Programs = &Programe -Menu.Apps = Aplicații -Menu.AllPrograms = Toate programele -Menu.Back = Înapoi -Menu.Favorites = Pre&ferințe -Menu.Documents = D&ocumente -Menu.Settings = &Setări -Menu.Search = &Căutare -Menu.SearchBox = Căutare -Menu.SearchPrograms = Căutare programe și fișiere -Menu.SearchInternet = Căutare pe Internet -Menu.Searching = Se caută... -Menu.NoMatch = Niciun element nu corespunde căutării. -Menu.MoreResults = Mai multe rezultate -Menu.Help = &Ajutor și asistență -Menu.Run = E&xecutare... -Menu.Logoff = &Log off %s -Menu.SwitchUser = &Comutare utilizatori -Menu.Lock = &Blocare -Menu.LogOffShort = &Log off -Menu.Undock = De&tașare computer -Menu.Disconnect = D&econectare -Menu.ShutdownBox = Î&nchidere... -Menu.Shutdown = Î&nchidere -Menu.Restart = &Repornire -Menu.ShutdownUpdate = Actualizare și închidere -Menu.RestartUpdate = Actualizare și repornire -Menu.Sleep = &Repaus -Menu.Hibernate = &Hibernare -Menu.ControlPanel = Pano&u de control -Menu.PCSettings = Setări PC -Menu.Security = Securitate Windows -Menu.Network = &Conexiuni în rețea -Menu.Printers = &Imprimante -Menu.Taskbar = Ba&ra de activități și meniu Start -Menu.SearchFiles = &Fișiere sau foldere... -Menu.SearchPrinter = I&mprimantă -Menu.SearchComputers = &Computere -Menu.UserFilesTip = Conține foldere pentru Documente, Imagini, Muzică și alte fișiere care vă aparțin. -Menu.UserDocumentsTip = Conține scrisori, rapoarte și alte documente și fișiere. -Menu.UserPicturesTip = Conține fotografii digitale, imagini și fișiere grafice. -Menu.UserMusicTip = Conține muzică și alte fișiere audio. -Menu.UserVideosTip = Conține filme și alte fișiere video. -Menu.NetworkTip = Afișează conexiunile existente în rețea și ajută la crearea unora noi -Menu.PrintersTip = Adăugare, eliminare și configurare imprimante locale și în rețea. -Menu.TaskbarTip = Se particularizează meniul Start și bara de stare, cum ar fi tipurile de elemente și modul lor de afișare. -Menu.ControlPanelTip = Modificați setările și particularizați funcționalitățile computerului. -Menu.DocumentsLibTip = Accesați scrisori, rapoarte, note și alte tipuri de documente. -Menu.MusicLibTip = Redați muzică și alte fișiere audio. -Menu.PicturesLibTip = Vizualizați și organizați imaginile digitale. -Menu.VideosLibTip = Vizionați filme făcute în casă și alte materiale video digitale. -Menu.RecordingsLibTip = Vizionați programe TV înregistrate pe computer. -Menu.DownloadTip = Găsiți descărcări Internet și linkuri la site-urile Web preferate. -Menu.HomegroupTip = Accesați bibliotecile și folderele partajate de alte persoane din grupul de domiciliu. -Menu.RunTip = Se deschide un program, un folder, un document sau un site Web. -Menu.HelpTip = Găsiți subiecte de ajutor, asistenți de instruire, depanare și alte servicii de asistență. -Menu.ProgramsTip = Se deschide o listă de programe. -Menu.SearchFilesTip = Se caută documente, muzică, imagini, mesaje de poștă electronică și altele. -Menu.GamesTip = Jucați și gestionați jocuri pe computer. -Menu.SecurityTip = Lansați Opțiuni de securitate Windows pentru a modifica parola, pentru a comuta la alt utilizator sau pentru a porni Manager activități. -Menu.SearchComputersTip = Căutare computere în rețea -Menu.SearchPrintersTip = Căutare imprimantă -Menu.AdminToolsTip = Configurare setări de administrare pe acest computer. -Menu.ShutdownTip = Închide toate programele deschise, închide Windows, apoi oprește computerul. -Menu.RestartTip = Închide toate programele deschise, închide Windows, apoi pornește din nou Windows. -Menu.SleepTip = Păstrează sesiunea în memorie și pune computerul într-o stare cu alimentare redusă, astfel încât aveți posibilitatea să reluați rapid lucrul. -Menu.HibernateTip = Salvează sesiunea și închide computerul. Când deschideți computerul, Windows restaurează sesiunea. -Menu.LogOffTip = Închide programele și face logoff. -Menu.DisconnectTip = Sesiunea se deconectează. Aveți posibilitatea să vă reconectați la această sesiune atunci când faceți din nou Log on. -Menu.LockTip = Blochează acest computer. -Menu.UndockTip = Deconectează laptopul sau computerul portabil dintr-o stație de andocare. -Menu.SwitchUserTip = Comută între utilizatori fără a închide programele. -Menu.Empty = (Gol) -Menu.Features = Programe și caracteristici -Menu.FeaturesTip = Dezinstalează sau modifică programe de pe computer. -Menu.SearchPeople = &Persoane... -Menu.SortByName = &Sortare după nume -Menu.Open = &Deschidere -Menu.OpenAll = Desc&hidere Toți utilizatorii -Menu.Explore = &Explorare -Menu.ExploreAll = E&xplorare Toți utilizatorii -Menu.MenuSettings = Setări -Menu.MenuHelp = Ajutor -Menu.MenuExit = Ieșire -Menu.LogoffTitle = Log off din Windows -Menu.LogoffPrompt = Sigur faceți logoff? -Menu.LogoffYes = &Log off -Menu.LogoffNo = &Nu -Menu.RenameTitle = Redenumire -Menu.RenamePrompt = &Nume nou: -Menu.RenameOK = OK -Menu.RenameCancel = Revocare -Menu.Organize = Organizare meniu Start -Menu.Expand = E&xtindere -Menu.Collapse = &Restrângere -Menu.NewFolder = Folder nou -Menu.NewShortcut = Comandă rapidă nouă -Menu.AutoArrange = Aran&jare automată -Menu.ActionOpen = Deschidere -Menu.ActionClose = Închidere -Menu.ActionExecute = Executare -Menu.RemoveList = Eliminare &din această listă -Menu.RemoveAll = &Golire Listă elemente recente -Menu.Explorer = Windows Explorer -Menu.Start = Start -Menu.StartScreen = Ecranul de Start -Menu.StartMenu = Meniu Start (Windows) -Menu.PinStart = Fixare la meniul Start -Menu.PinStartCs = Fixare la meniul Start (Open-Shell) -Menu.UnpinStartCs = Anulare fixare la meniul Start (Open-Shell) -Menu.MonitorOff = Dezactivare ecranului -Menu.RemoveHighlight = Eliminare evidențiere -Menu.Uninstall = &Dezinstalare -Menu.UninstallTitle = Dezinstalare -Menu.UninstallPrompt = Sigur dezinstalați %s? -Search.CategorySettings = Panou de control -Search.CategoryPCSettings = Setări PC -Search.CategoryPrograms = Programe -Search.CategoryDocuments = Documente -Search.CategoryMusic = Muzică -Search.CategoryPictures = Imagini -Search.CategoryVideos = Video -Search.CategoryFiles = Fișiere -Search.CategoryInternet = Internet -JumpList.Recent = Recent -JumpList.Frequent = Frecvent -JumpList.Tasks = Activități -JumpList.Pinned = Fixat -JumpList.Pin = F&ixare la această listă -JumpList.Unpin = An&ulare fixare la această listă -JumpList.Remove = Eliminare &din această listă -JumpList.PinTip = Fixare la această listă -JumpList.UnpinTip = Anulare fixare la această listă - - -[ru-RU] - Russian (Russia) -Menu.Programs = &Программы -Menu.Apps = Приложения -Menu.AllPrograms = Все программы -Menu.Back = Назад -Menu.Favorites = &Избранное -Menu.Documents = &Документы -Menu.Settings = Н&астройка -Menu.Search = &Найти -Menu.SearchBox = Найти -Menu.SearchPrograms = Найти программы и файлы -Menu.SearchInternet = Поиск в Интернете -Menu.Searching = Идет поиск... -Menu.NoMatch = Нет элементов, удовлетворяющих условиям поиска. -Menu.MoreResults = Ознакомиться с другими результатами -Menu.Help = &Справка и поддержка -Menu.Run = &Выполнить... -Menu.Logoff = Завер&шение сеанса %s -Menu.SwitchUser = См&енить пользователя -Menu.Lock = &Блокировать -Menu.LogOffShort = Завер&шение сеанса -Menu.Undock = Отстыковать &компьютер -Menu.Disconnect = Отклю&чить -Menu.ShutdownBox = &Завершение работы... -Menu.Shutdown = &Завершение работы -Menu.Restart = &Перезагрузка -Menu.ShutdownUpdate = Обновить и завершить работу -Menu.RestartUpdate = Обновить и перезагрузить -Menu.Sleep = &Сон -Menu.Hibernate = &Гибернация -Menu.ControlPanel = П&анель управления -Menu.PCSettings = Параметры ПК -Menu.Security = Безопасность Windows -Menu.Network = С&етевые подключения -Menu.Printers = &Принтеры -Menu.Taskbar = Панель &задач и меню "Пуск" -Menu.SearchFiles = &Файлы и папки... -Menu.SearchPrinter = &Принтер -Menu.SearchComputers = &Компьютеры -Menu.UserFilesTip = Содержит папки для документов, фотографий и изображений, музыки и других принадлежащих вам файлов. -Menu.UserDocumentsTip = Содержит письма, отчеты и другие документы и файлы. -Menu.UserPicturesTip = Содержит цифровые фотографии, рисунки, графические файлы. -Menu.UserMusicTip = Содержит музыкальные и звуковые файлы. -Menu.UserVideosTip = Содержит фильмы и видеофайлы. -Menu.NetworkTip = Отображение сетевых подключений для этого компьютера и создание новых подключений -Menu.PrintersTip = Добавление, удаление и настройка локальных и сетевых принтеров -Menu.TaskbarTip = Настройка меню ''Пуск'' и панели задач, например, изменение списка отображаемых элементов и внешнего вида. -Menu.ControlPanelTip = Изменение параметров и настройка функциональных возможностей компьютера. -Menu.DocumentsLibTip = Доступ к письмам, отчетам, заметкам и другим видам документов. -Menu.MusicLibTip = Проигрывание музыки и других аудиофайлов. -Menu.PicturesLibTip = Просмотр и упорядочение цифровых изображений. -Menu.VideosLibTip = Просмотр фильмов и другого цифрового видео. -Menu.RecordingsLibTip = Просмотр записанных на компьютере телевизионных передач. -Menu.DownloadTip = Поиск ссылок на избранные веб-узлы и загрузка файлов из Интернета. -Menu.HomegroupTip = Доступ к библиотекам и папкам, общий доступ к которым предоставлен другими участниками домашней группы. -Menu.RunTip = Открытие программы, папки, документа или веб-сайта. -Menu.HelpTip = Поиск разделов справки, учебников, средств устранения неисправностей и других служб поддержки. -Menu.ProgramsTip = Отображение списка программ, установленных на этом компьютере. -Menu.SearchFilesTip = Поиск документов, музыки, изображений, писем и многое другое. -Menu.GamesTip = Играть в игры и управлять ими на этом компьютере. -Menu.SecurityTip = Открыть параметры безопасности Windows для смены пароля или пользователя, а также запуска диспетчера задач. -Menu.SearchComputersTip = Поиск компьютеров в сети -Menu.SearchPrintersTip = Поиск принтера -Menu.AdminToolsTip = Настройка параметров управления этого компьютера -Menu.ShutdownTip = Закрытие всех открытых программ, завершение работы Windows и выключение компьютера. -Menu.RestartTip = Закрытие всех открытых программ, завершение работы Windows и повторный запуск Windows. -Menu.SleepTip = Перевод компьютера в состояние пониженного энергопотребления и сохранение текущего сеанса в памяти, что позволяет быстро возобновить работу. -Menu.HibernateTip = Сохранение сеанса на диске и выключение компьютера. При включении компьютера Windows восстанавливает текущий сеанс. -Menu.LogOffTip = Закрытие программ и выход из системы. -Menu.DisconnectTip = Отключение текущего сеанса. Можно вновь подключиться к этому сеансу при выполнении входа. -Menu.LockTip = Блокировка этого компьютера. -Menu.UndockTip = Извлечение ноутбука из стыковочного узла. -Menu.SwitchUserTip = Смена пользователей без закрытия программ. -Menu.Empty = (пусто) -Menu.Features = Программы и компоненты -Menu.FeaturesTip = Удаление или изменение программ на этом компьютере. -Menu.SearchPeople = &Людей... -Menu.SortByName = &Сортировать по имени -Menu.Open = &Открыть -Menu.OpenAll = Открыть о&бщее для всех меню -Menu.Explore = &Проводник -Menu.ExploreAll = Проводни&к в общее для всех меню -Menu.MenuSettings = Настройка -Menu.MenuHelp = Справка -Menu.MenuExit = Выход -Menu.LogoffTitle = Выход из Windows -Menu.LogoffPrompt = Вы действительно хотите выйти из системы? -Menu.LogoffYes = В&ыход -Menu.LogoffNo = Н&ет -Menu.RenameTitle = Переименование -Menu.RenamePrompt = &Новое имя: -Menu.RenameOK = ОК -Menu.RenameCancel = Отмена -Menu.Organize = Упорядочение меню "Пуск" -Menu.Expand = &Развернуть -Menu.Collapse = &Свернуть -Menu.NewFolder = Новая папка -Menu.NewShortcut = Новый ярлык -Menu.AutoArrange = Выравнивать &автоматически -Menu.ActionOpen = Открыть -Menu.ActionClose = Закрыть -Menu.ActionExecute = Выполнить -Menu.RemoveList = Удалить &из этого списка -Menu.RemoveAll = &Очистить список последних элементов -Menu.Explorer = Проводник -Menu.Start = Пуск -Menu.StartScreen = Начальный экран -Menu.StartMenu = Меню "Пуск" (Windows) -Menu.PinStart = Закрепить в меню "Пуск" -Menu.PinStartCs = Закрепить в меню "Пуск" (Open-Shell) -Menu.UnpinStartCs = Изъять из меню "Пуск" (Open-Shell) -Menu.MonitorOff = Выключение экрана -Menu.RemoveHighlight = Выключить пометку -Menu.Uninstall = &Удалить -Menu.UninstallTitle = Удалить -Menu.UninstallPrompt = Вы действительно хотите удалить "%s"? -Search.CategorySettings = Панель управления -Search.CategoryPCSettings = Параметры ПК -Search.CategoryPrograms = Программы -Search.CategoryDocuments = Документы -Search.CategoryMusic = Музыка -Search.CategoryPictures = Изображения -Search.CategoryVideos = Видео -Search.CategoryFiles = Файлы -Search.CategoryInternet = Интернет -JumpList.Recent = Последние -JumpList.Frequent = Часто используемые -JumpList.Tasks = Задачи -JumpList.Pinned = Закреплено -JumpList.Pin = &Закрепить в списке -JumpList.Unpin = &Изъять из списка -JumpList.Remove = Удалить &из этого списка -JumpList.PinTip = Закрепить в списке -JumpList.UnpinTip = Изъять из списка - - -[sk-SK] - Slovak (Slovakia) -Menu.Programs = Progra&my -Menu.Apps = Aplikácie -Menu.AllPrograms = Všetky programy -Menu.Back = Naspäť -Menu.Favorites = O&bľúbené položky -Menu.Documents = Do&kumenty -Menu.Settings = Nastav&enie -Menu.Search = &Hľadať -Menu.SearchBox = Hľadať -Menu.SearchPrograms = Prehľadať programy a súbory -Menu.SearchInternet = Hľadať na Internete -Menu.Searching = Hľadá sa... -Menu.NoMatch = Kritériám vyhľadávania nevyhovujú žiadne položky. -Menu.MoreResults = Zobraziť ďalšie výsledky -Menu.Help = &Pomoc a technická podpora -Menu.Run = Sp&ustiť... -Menu.Logoff = O&dhlásiť používateľa %s -Menu.SwitchUser = &Prepnúť používateľa -Menu.Lock = &Zamknúť -Menu.LogOffShort = Odh&lásiť -Menu.Undock = Vybr&ať počítač z doku -Menu.Disconnect = &Odpojiť -Menu.ShutdownBox = &Vypnúť... -Menu.Shutdown = &Vypnúť -Menu.Restart = &Reštartovať -Menu.ShutdownUpdate = Aktualizovať a vypnúť -Menu.RestartUpdate = Aktualizovať a reštartovať -Menu.Sleep = &Uspať -Menu.Hibernate = &Prepnúť do režimu dlhodobého spánku -Menu.ControlPanel = &Ovládací panel -Menu.PCSettings = Nastavenie PC -Menu.Security = Zabezpečenie systému Windows -Menu.Network = Sieťové pripoje&nia -Menu.Printers = &Tlačiarne -Menu.Taskbar = P&anel úloh a ponuka Štart -Menu.SearchFiles = &Súbory alebo priečinky... -Menu.SearchPrinter = &Tlačiarne -Menu.SearchComputers = &Počítače -Menu.UserFilesTip = Obsahuje priečinky pre dokumenty, obrázky, hudbu a ďalšie vaše súbory. -Menu.UserDocumentsTip = Obsahuje priečinok s listami, zostavami a inými dokumentmi a súbormi. -Menu.UserPicturesTip = Obsahuje digitálne fotografie, obrázky a grafické súbory. -Menu.UserMusicTip = Obsahuje hudbu a iné zvukové súbory. -Menu.UserVideosTip = Obsahuje filmy a iné videosúbory. -Menu.NetworkTip = Zobrazí existujúce sieťové pripojenia na tomto počítači a pomôže vytvoriť nové pripojenia. -Menu.PrintersTip = Pridá, odstráni a nakonfiguruje lokálne alebo sieťové tlačiarne. -Menu.TaskbarTip = Prispôsobí ponuku Štart a panel úloh, ako napríklad typy zobrazených položiek a spôsob ich zobrazenia. -Menu.ControlPanelTip = Umožňuje zmeniť nastavenia a prispôsobiť funkcie počítača. -Menu.DocumentsLibTip = Umožňuje získať prístup k listom, zostavám, poznámkam a ďalším typom dokumentov. -Menu.MusicLibTip = Umožňuje prehrávať hudbu a ďalšie zvukové súbory. -Menu.PicturesLibTip = Umožňuje zobraziť a usporiadať digitálne obrázky. -Menu.VideosLibTip = Umožňuje sledovať domáce filmy a ďalšie digitálne videá. -Menu.RecordingsLibTip = Umožňuje sledovať nahrané televízne programy v počítači. -Menu.DownloadTip = Umožňuje vyhľadať položky na prevzatie na Internete a prepojenia na obľúbené webové lokality. -Menu.HomegroupTip = Získajte prístup ku knižniciam a priečinkom, ktoré zdieľanú ostatné osoby v domácej skupine. -Menu.RunTip = Spustí program alebo otvorí priečinok, dokument alebo webovú lokalitu. -Menu.HelpTip = Umožňuje vyhľadať témy Pomocníka, kurzy, informácie pre riešenie problémov a ďalšie služby technickej podpory. -Menu.ProgramsTip = Zobrazí zoznam programov. -Menu.SearchFilesTip = Umožňuje vyhľadať dokumenty, hudbu, obrázky, e-maily a ďalšie položky. -Menu.GamesTip = Umožňuje hrať a spravovať hry v počítači. -Menu.SecurityTip = Ak chcete zmeniť heslo, prepnúť používateľa alebo spustiť Správcu úloh, otvorte okno Možnosti zabezpečenia systému Windows. -Menu.SearchComputersTip = Hľadať počítače v sieti -Menu.SearchPrintersTip = Hľadať tlačiareň -Menu.AdminToolsTip = Umožní konfigurovať nastavenia na správu počítača. -Menu.ShutdownTip = Zatvorí všetky otvorené programy, vypne systém Windows a vypne počítač. -Menu.RestartTip = Zatvorí všetky otvorené programy, vypne systém Windows a znovu ho spustí. -Menu.SleepTip = Uloží reláciu do pamäte a prepne počítač do režimu nízkej spotreby energie, z ktorého možno počítač kedykoľvek rýchlo zapnúť do pôvodného stavu. -Menu.HibernateTip = Uloží reláciu a vypne počítač. Keď ho zapnete, systém Windows obnoví reláciu. -Menu.LogOffTip = Zavrie programy a odhlási používateľa. -Menu.DisconnectTip = Odpojí reláciu. K relácii sa môžete opäť pripojiť pri ďalšom prihlásení. -Menu.LockTip = Zamkne tento počítač. -Menu.UndockTip = Odstráni prenosný počítač z doku. -Menu.SwitchUserTip = Prepne používateľov bez zatvorenia programov. -Menu.Empty = (Prázdne) -Menu.Features = Programy a súčasti -Menu.FeaturesTip = Odinštaluje alebo zmení programy v počítači. -Menu.SearchPeople = Ľu&dia... -Menu.SortByName = &Usporiadať podľa názvov -Menu.Open = &Otvoriť -Menu.OpenAll = Ot&voriť profil All Users -Menu.Explore = &Preskúmať -Menu.ExploreAll = P&reskúmať profil All Users -Menu.MenuSettings = Nastavenie -Menu.MenuHelp = Pomocník -Menu.MenuExit = Skončiť -Menu.LogoffTitle = Odhlásenie zo systému Windows -Menu.LogoffPrompt = Naozaj sa chcete odhlásiť? -Menu.LogoffYes = &Odhlásiť -Menu.LogoffNo = &Nie -Menu.RenameTitle = Premenovanie -Menu.RenamePrompt = &Nový názov: -Menu.RenameOK = OK -Menu.RenameCancel = Zrušiť -Menu.Organize = Usporiadanie ponuky Štart -Menu.Expand = &Rozbaliť -Menu.Collapse = Zb&aliť -Menu.NewFolder = Nový priečinok -Menu.NewShortcut = Nový odkaz -Menu.AutoArrange = Usporiadať &automaticky -Menu.ActionOpen = Otvoriť -Menu.ActionClose = Zavrieť -Menu.ActionExecute = Vykonať -Menu.RemoveList = Odstrániť &z tohto zoznamu -Menu.RemoveAll = &Vymazať zoznam naposledy použitých položiek -Menu.Explorer = Windows Prieskumník -Menu.Start = Štart -Menu.StartScreen = Domovská obrazovka -Menu.StartMenu = Ponuka Štart (Windows) -Menu.PinStart = Pripnúť položku do ponuky Štart -Menu.PinStartCs = Pripnúť položku do ponuky Štart (Open-Shell) -Menu.UnpinStartCs = Zrušiť pripnutie položky v ponuke Štart (Open-Shell) -Menu.MonitorOff = Vypnúť displej -Menu.RemoveHighlight = Odstrániť zvýraznenie -Menu.Uninstall = &Odinštalovať -Menu.UninstallTitle = Odinštalovať -Menu.UninstallPrompt = Naozaj chcete odinštalovať program %s? -Search.CategorySettings = Ovládací panel -Search.CategoryPCSettings = Nastavenie PC -Search.CategoryPrograms = Programy -Search.CategoryDocuments = Dokumenty -Search.CategoryMusic = Hudba -Search.CategoryPictures = Obrázky -Search.CategoryVideos = Videá -Search.CategoryFiles = Súbory -Search.CategoryInternet = Internet -JumpList.Recent = Naposledy použité -JumpList.Frequent = Najčastejšie používané -JumpList.Tasks = Úlohy -JumpList.Pinned = Pripnuté -JumpList.Pin = Pr&ipnúť do tohto zoznamu -JumpList.Unpin = Zr&ušiť pripnutie v tomto zozname -JumpList.Remove = Odstrániť &z tohto zoznamu -JumpList.PinTip = Pripnúť do tohto zoznamu -JumpList.UnpinTip = Zrušiť pripnutie v tomto zozname - - -[sl-SI] - Slovenian (Slovenia) -Menu.Programs = Progr&ami -Menu.Apps = Programi -Menu.AllPrograms = Vsi programi -Menu.Back = Nazaj -Menu.Favorites = P&riljubljene -Menu.Documents = &Dokumenti -Menu.Settings = Nas&tavitve -Menu.Search = Is&kanje -Menu.SearchBox = Iskanje -Menu.SearchPrograms = Iskanje programov in datotek -Menu.SearchInternet = Preišči internet -Menu.Searching = Iskanje ... -Menu.NoMatch = Vašemu iskanju ne ustreza noben element. -Menu.MoreResults = Pokaži več rezultatov -Menu.Help = &Pomoč in podpora -Menu.Run = &Zaženi ... -Menu.Logoff = &Odjavi %s -Menu.SwitchUser = P&reklopi med uporabniki -Menu.Lock = Z&akleni -Menu.LogOffShort = &Odjava -Menu.Undock = Razdr&uži računalnik -Menu.Disconnect = Pr&ekini povezavo -Menu.ShutdownBox = Zaustavitev &sistema ... -Menu.Shutdown = &Zaustavitev sistema -Menu.Restart = &Vnovični zagon -Menu.ShutdownUpdate = Posodobi in zaustavi -Menu.RestartUpdate = Posodobi in zaženi znova -Menu.Sleep = &Mirovanje -Menu.Hibernate = &Hibernacija -Menu.ControlPanel = &Nadzorna plošča -Menu.PCSettings = Nastavitve računalnika -Menu.Security = Varnost sistema Windows -Menu.Network = &Omrežne povezave -Menu.Printers = &Tiskalniki -Menu.Taskbar = Op&ravilna vrstica in meni »Start« -Menu.SearchFiles = &Datotek ali map ... -Menu.SearchPrinter = &Tiskalnika -Menu.SearchComputers = &Računalnikov -Menu.UserFilesTip = Vsebuje mape za dokumente, slike, glasbo in druge datoteke v vaši lasti. -Menu.UserDocumentsTip = Vsebuje pisma, poročila in druge dokumente ter datoteke. -Menu.UserPicturesTip = Vsebuje digitalne fotografije, slike in grafične datoteke. -Menu.UserMusicTip = Vsebuje glasbo in druge zvočne datoteke. -Menu.UserVideosTip = Vsebuje filme in druge videodatoteke. -Menu.NetworkTip = Prikaže obstoječe omrežne povezave v tem računalniku in vam pomaga ustvarjati nove -Menu.PrintersTip = Doda, odstrani in konfigurira lokalne ter omrežne tiskalnike. -Menu.TaskbarTip = Prilagodi meni »Start« in opravilno vrstico, kot so vrste elementov, ki naj se prikažejo, ter način njihovega prikaza. -Menu.ControlPanelTip = Spremenite nastavitve in prilagodite način delovanja računalnika. -Menu.DocumentsLibTip = Dostopajte do pisem, poročil, obvestil in drugih vrst dokumentov. -Menu.MusicLibTip = Predvajajte glasbene in druge zvočne datoteke. -Menu.PicturesLibTip = Oglejte si digitalne slike in jih razvrstite. -Menu.VideosLibTip = Glejte domače filme in druge digitalne videe. -Menu.RecordingsLibTip = Glejte TV-programe, posnete v računalniku. -Menu.DownloadTip = Poiščite prenose iz interneta in povezave do priljubljenih spletnih mest. -Menu.HomegroupTip = Dostop do knjižnic in map, za katere skupno rabo omogočijo druge osebe v domači skupini. -Menu.RunTip = Odpre program, mapo, dokument ali spletno mesto. -Menu.HelpTip = Poiščite teme pomoči, vadnice, odpravljanje težav in druge storitve za podporo. -Menu.ProgramsTip = Prikaže seznam vaših programov. -Menu.SearchFilesTip = Poiščite dokumente, glasbo, slike, e-pošto in še kaj. -Menu.GamesTip = Igranje in upravljanje nameščenih iger v računalniku. -Menu.SecurityTip = Zaženite možnosti varnosti sistema Windows, če želite spremeniti geslo, preklopiti med uporabniki ali zagnati upravitelja opravil. -Menu.SearchComputersTip = Iskanje računalnikov v omrežju -Menu.SearchPrintersTip = Iskanje tiskalnika -Menu.AdminToolsTip = Konfigurira računalnikove skrbniške nastavitve. -Menu.ShutdownTip = Zapre vse odprte programe, zaustavi sistem Windows in nato izklopi računalnik. -Menu.RestartTip = Zapre vse odprte programe, zaustavi sistem Windows in ga nato znova zažene. -Menu.SleepTip = Ohrani vašo sejo v pomnilniku in postavi računalnik v stanje nizke porabe, tako da lahko hitro nadaljujete delo. -Menu.HibernateTip = Shrani vašo sejo in izklopi računalnik. Ko računalnik vklopite, sistem Windows obnovi vašo sejo. -Menu.LogOffTip = Zapri programe in se odjavi. -Menu.DisconnectTip = Prekine povezavo s sejo. Znova jo lahko vzpostavite po prijavi. -Menu.LockTip = Zakleni ta računalnik. -Menu.UndockTip = Odstrani prenosni računalnik iz združitvene postaje. -Menu.SwitchUserTip = Preklop med uporabniki, ne da bi se programi zaprli. -Menu.Empty = (Prazno) -Menu.Features = Programi in funkcije -Menu.FeaturesTip = Odstranitev ali spreminjanje programov v računalniku. -Menu.SearchPeople = &Za osebe ... -Menu.SortByName = &Razvrsti po imenih -Menu.Open = &Odpri -Menu.OpenAll = O&dpri mapo »All users« -Menu.Explore = R&azišči -Menu.ExploreAll = &Razišči mapo »All users« -Menu.MenuSettings = Nastavitve -Menu.MenuHelp = Pomoč -Menu.MenuExit = Izhod -Menu.LogoffTitle = Odjava iz sistema Windows -Menu.LogoffPrompt = Ali ste prepričani, da se želite odjaviti? -Menu.LogoffYes = &Odjavi se -Menu.LogoffNo = &Ne -Menu.RenameTitle = Preimenuj -Menu.RenamePrompt = &Novo ime: -Menu.RenameOK = V redu -Menu.RenameCancel = Prekliči -Menu.Organize = Organiziraj meni Start -Menu.Expand = R&azširi -Menu.Collapse = &Strni -Menu.NewFolder = Nova mapa -Menu.NewShortcut = Nova bližnjica -Menu.AutoArrange = Samod&ejno razporedi -Menu.ActionOpen = Odpri -Menu.ActionClose = Zapri -Menu.ActionExecute = Izvedi -Menu.RemoveList = Od&strani s tega seznama -Menu.RemoveAll = &Izbriši seznam nedavnih elementov -Menu.Explorer = Raziskovalec -Menu.Start = Start -Menu.StartScreen = Začetni zaslon -Menu.StartMenu = Meni »Start« (Windows) -Menu.PinStart = Pripni v meni »Start« -Menu.PinStartCs = Pripni v meni »Start«. (Open-Shell) -Menu.UnpinStartCs = Odpni iz menija »Start«. (Open-Shell) -Menu.MonitorOff = Izklopi prikaz -Menu.RemoveHighlight = Odstrani označitev -Menu.Uninstall = &Odstrani -Menu.UninstallTitle = Odstrani -Menu.UninstallPrompt = Ali ste prepričani, da želite odstraniti %s? -Search.CategorySettings = Nadzorna plošča -Search.CategoryPCSettings = Nastavitve računalnika -Search.CategoryPrograms = Programi -Search.CategoryDocuments = Dokumenti -Search.CategoryMusic = Glasba -Search.CategoryPictures = Slike -Search.CategoryVideos = Videi -Search.CategoryFiles = Datoteke -Search.CategoryInternet = Internet -JumpList.Recent = Nedavno -JumpList.Frequent = Pogosto -JumpList.Tasks = Opravila -JumpList.Pinned = Pripeto -JumpList.Pin = &Pripni na ta seznam -JumpList.Unpin = &Odpni s tega seznama -JumpList.Remove = Od&strani s tega seznama -JumpList.PinTip = Pripni na ta seznam -JumpList.UnpinTip = Odpni s tega seznama - - -[sr-Latn-CS] - Serbian (Latin, Serbia) -Menu.Programs = &Programi -Menu.Apps = Aplikacije -Menu.AllPrograms = Svi programi -Menu.Back = Nazad -Menu.Favorites = Omiljene& lokacije -Menu.Documents = &Dokumenti -Menu.Settings = Postavk&e -Menu.Search = Pre&traži -Menu.SearchBox = Pretraži -Menu.SearchPrograms = Pretraži programe i datoteke -Menu.SearchInternet = Pretraži Internet -Menu.Searching = Pretraživanje... -Menu.NoMatch = Nijedna stavka se ne podudara sa pretragom. -Menu.MoreResults = Pogledajte više rezultata -Menu.Help = Po&moć i podrška -Menu.Run = Po&kreni... -Menu.Logoff = &Odjavi se sa %s -Menu.SwitchUser = P&romeni korisnika -Menu.Lock = Z&aključaj -Menu.LogOffShort = &Odjavi se -Menu.Undock = Odvoji računar od &bazne stanice -Menu.Disconnect = Prekini &vezu -Menu.ShutdownBox = &Isključi... -Menu.Shutdown = &Isključi -Menu.Restart = &Ponovo pokreni -Menu.ShutdownUpdate = Ažuriraj i isključi -Menu.RestartUpdate = Ažuriraj i ponovo pokreni -Menu.Sleep = &Stanje spavanja -Menu.Hibernate = &U stanju hibernacije -Menu.ControlPanel = &Kontrolna tabla -Menu.PCSettings = Postavke računara -Menu.Security = Windows bezbednost -Menu.Network = &Mrežne veze -Menu.Printers = Št&ači -Menu.Taskbar = &Traka zadataka i „Start“ meni -Menu.SearchFiles = &Za datoteke i fascikle... -Menu.SearchPrinter = &Za štampač -Menu.SearchComputers = &Za računare -Menu.UserFilesTip = Sadrži fascikle za dokumente, slike, muziku i druge datoteke koje vam pripadaju. -Menu.UserDocumentsTip = Sadrži pisma, izveštaje i druge dokumente i datoteke. -Menu.UserPicturesTip = Sadrži digitalne fotografije, slike i grafičke datoteke. -Menu.UserMusicTip = Sadrži muziku i druge audio datoteke. -Menu.UserVideosTip = Sadrži filmove i druge video datoteke. -Menu.NetworkTip = Prikazuje postojeće mrežne veze ovog računara i pomaže pri kreiranju novih -Menu.PrintersTip = Dodajte, uklonite i konfigurišite lokalne i mrežne štampače. -Menu.TaskbarTip = Prilagodite „Start“ meni i traku zadataka, npr. tipove stavki koje će biti prikazane i način njihovog pojavljivanja. -Menu.ControlPanelTip = Promenite postavke i prilagodite funkcionalnost računara. -Menu.DocumentsLibTip = Pristupajte pismima, izveštajima, beleškama i drugim vrstama dokumenata. -Menu.MusicLibTip = Reprodukujte muziku i druge zvučne datoteke. -Menu.PicturesLibTip = Prikazujte i organizujte digitalne slike. -Menu.VideosLibTip = Gledajte kućne filmove i druge digitalne video zapise. -Menu.RecordingsLibTip = Gledajte TV programe snimljene na računaru. -Menu.DownloadTip = Pronađite Internet preuzimanja i veze ka omiljenim Veb lokacijama. -Menu.HomegroupTip = Pristupite bibliotekama i fasciklama koje dele druge osobe u matičnoj grupi. -Menu.RunTip = Otvara program, fasciklu, dokument ili Veb lokaciju. -Menu.HelpTip = Pronađite teme pomoći, podučavanja, rešavanje problema i druge usluge podrške. -Menu.ProgramsTip = Otvara listu programa. -Menu.SearchFilesTip = Tražite dokumente, muziku, slike, e-poštu i još mnogo toga. -Menu.GamesTip = Igrajte i upravljajte igrama na računaru. -Menu.SecurityTip = Pokrenite Windows opcije bezbednosti da biste promenili lozinku, promenili korisnika ili pokrenuli upravljač zadacima. -Menu.SearchComputersTip = Pronađi računare u mreži -Menu.SearchPrintersTip = Pronađi štampač -Menu.AdminToolsTip = Konfigurišite administrativne postavke na svom računaru. -Menu.ShutdownTip = Zatvara sve otvorene programe, isključuje Windows i zatim isključuje računar. -Menu.RestartTip = Zatvara sve otvorene programe, isključuje Windows i zatim ponovo pokreće Windows. -Menu.SleepTip = Čuva sesiju u memoriji i stavlja računar u stanje niske potrošnje tako da možete brzo da nastavite sa radom. -Menu.HibernateTip = Čuva sesiju i isključuje računar. Kada uključite računar, Windows vraća sesiju u prethodno stanje. -Menu.LogOffTip = Zatvori programe i odjavi se. -Menu.DisconnectTip = Prekida vezu sesije. Možete se ponovo povezati sa sesijom kad se ponovo prijavite. -Menu.LockTip = Zaključaj ovaj računar. -Menu.UndockTip = Uklanja laptop ili notebook računar sa bazne stanice. -Menu.SwitchUserTip = Promeni korisnike bez zatvaranja programa. -Menu.Empty = (Prazno) -Menu.Features = Programi i funkcije -Menu.FeaturesTip = Deinstalirajte ili promenite programe na računaru. -Menu.SearchPeople = &Za osobe... -Menu.SortByName = &Sortiraj po imenu -Menu.Open = &Otvori -Menu.OpenAll = O&tvori sve korisnike -Menu.Explore = &Istraži -Menu.ExploreAll = Istraži sve &korisnike -Menu.MenuSettings = Postavke -Menu.MenuHelp = Pomoć -Menu.MenuExit = Izađi -Menu.LogoffTitle = Odjava iz Windowsa -Menu.LogoffPrompt = Želite li zaista da se odjavite? -Menu.LogoffYes = &Odjavi se -Menu.LogoffNo = &Ne -Menu.RenameTitle = Preimenovanje -Menu.RenamePrompt = &Novo ime: -Menu.RenameOK = U redu -Menu.RenameCancel = Otkaži -Menu.Organize = Organizovanje menija „Start“ -Menu.Expand = R&azvij -Menu.Collapse = Sk&upi -Menu.NewFolder = Nova fascikla -Menu.NewShortcut = Nova prečica -Menu.AutoArrange = Rasporedi &automatski -Menu.ActionOpen = Otvori -Menu.ActionClose = Zatvori -Menu.ActionExecute = Izvrši -Menu.RemoveList = &Ukloni sa ovog spiska -Menu.RemoveAll = O&briši listu nedavno korišćenih stavki -Menu.Explorer = Windows Explorer -Menu.Start = Pokreni -Menu.StartScreen = Početni ekran -Menu.StartMenu = „Start“ meni (Windows) -Menu.PinStart = Dodaj u „Start“ meni -Menu.PinStartCs = Dodaj u „Start“ meni (Open-Shell) -Menu.UnpinStartCs = Ukloni iz „Start“ menija (Open-Shell) -Menu.MonitorOff = Isključi displej -Menu.RemoveHighlight = Ukloni istaknuti sadržaj -Menu.Uninstall = &Deinstaliraj -Menu.UninstallTitle = Deinstaliraj -Menu.UninstallPrompt = Želite li zaista da deinstalirate %s? -Search.CategorySettings = Kontrolna tabla -Search.CategoryPCSettings = Postavke računara -Search.CategoryPrograms = Programs -Search.CategoryDocuments = Dokumenti -Search.CategoryMusic = Muzika -Search.CategoryPictures = Slike -Search.CategoryVideos = Video zapisi -Search.CategoryFiles = Datoteke -Search.CategoryInternet = Internet -JumpList.Recent = Nedavno -JumpList.Frequent = Često -JumpList.Tasks = Zadaci -JumpList.Pinned = Dodato -JumpList.Pin = Zakač&i na ovu listu -JumpList.Unpin = &Otkači sa ove liste -JumpList.Remove = U&kloni sa ovog spiska -JumpList.PinTip = Zakači na ovu listu -JumpList.UnpinTip = Otkači sa ove liste - - -[sv-SE] - Swedish (Sweden) -Menu.Programs = &Program -Menu.Apps = Appar -Menu.AllPrograms = Alla program -Menu.Back = Föregående -Menu.Favorites = &Favoriter -Menu.Documents = &Dokument -Menu.Settings = &Inställningar -Menu.Search = &Sök -Menu.SearchBox = Sök -Menu.SearchPrograms = Sök bland program och filer -Menu.SearchInternet = Sök på Internet -Menu.Searching = Söker... -Menu.NoMatch = Inga objekt matchade sökningen. -Menu.MoreResults = Visa fler resultat -Menu.Help = &Hjälp och support -Menu.Run = K&ör... -Menu.Logoff = &Logga ut %s -Menu.SwitchUser = &Växla användare -Menu.Lock = L&ås -Menu.LogOffShort = &Logga ut -Menu.Undock = K&oppla från datorn -Menu.Disconnect = Koppla fr&ån -Menu.ShutdownBox = &Avsluta... -Menu.Shutdown = Stäng &av -Menu.Restart = &Starta om -Menu.ShutdownUpdate = Uppdatera och stäng av -Menu.RestartUpdate = Uppdatera och starta om -Menu.Sleep = &Vila -Menu.Hibernate = &Viloläge -Menu.ControlPanel = &Kontrollpanelen -Menu.PCSettings = Datorinställningar -Menu.Security = Windows-säkerhet -Menu.Network = &Nätverksanslutningar -Menu.Printers = &Skrivare -Menu.Taskbar = &Aktivitetsfältet och Start-menyn -Menu.SearchFiles = E&fter filer eller mappar... -Menu.SearchPrinter = Efter &skrivare -Menu.SearchComputers = &Efter datorer -Menu.UserFilesTip = Innehåller mappar för dokument, bilder, musik och andra filer som tillhör dig. -Menu.UserDocumentsTip = Innehåller brev, rapporter och andra dokument och filer. -Menu.UserPicturesTip = Innehåller digitala foton, bilder och grafikfiler. -Menu.UserMusicTip = Innehåller musik och andra ljudfiler. -Menu.UserVideosTip = Innehåller filmer och andra videofiler. -Menu.NetworkTip = Visar befintliga nätverks- och fjärranslutningar på den här datorn samt hjälper dig att skapa nya -Menu.PrintersTip = Lägg till, ta bort och konfigurera lokala och nätverksskrivare. -Menu.TaskbarTip = Anpassa Start-menyn och Aktivitetsfältet, som exempelvis vilka objekt som ska synas och hur de ska visas. -Menu.ControlPanelTip = Ändra inställningar och anpassa datorns funktioner. -Menu.DocumentsLibTip = Använd brev, rapporter, anteckningar och andra dokument. -Menu.MusicLibTip = Spela musik och andra ljudfiler. -Menu.PicturesLibTip = Visa och ordna digitala bilder. -Menu.VideosLibTip = Titta på egna filmer och andra digitala videofilmer. -Menu.RecordingsLibTip = Titta på TV-program som har spelats in på datorn. -Menu.DownloadTip = Sök efter filer som du har hämtat från Internet och länkar till favoritwebbplatser. -Menu.HomegroupTip = Få åtkomst till bibliotek och mappar som delas ut av andra personer i hemgruppen. -Menu.RunTip = Öppnar ett program, en mapp, ett dokument eller en webbplats. -Menu.HelpTip = Hitta hjälpavsnitt, självstudier, felsökning och andra supporttjänster. -Menu.ProgramsTip = Öppnar en lista över program på datorn. -Menu.SearchFilesTip = Sök efter dokument, musik, bilder, e-post och mycket mer. -Menu.GamesTip = Spela och hantera spel på datorn. -Menu.SecurityTip = Visa Windows-säkerhetsalternativ om du vill ändra lösenord, växla användare eller starta Aktivitetshanteraren. -Menu.SearchComputersTip = Sök efter datorer på nätverket -Menu.SearchPrintersTip = Sök efter en skrivare -Menu.AdminToolsTip = Konfigurera administrationsinställningar för datorn. -Menu.ShutdownTip = Stänger alla öppna program, avslutar Windows och stänger sedan av datorn. -Menu.RestartTip = Stänger alla öppna program, avslutar Windows och startar sedan Windows igen. -Menu.SleepTip = Behåller sessionen i minnet och försätter datorn i energisparläge så att du snabbt kan återgå till arbetet. -Menu.HibernateTip = Sparar sessionen och stänger av datorn. Sessionen återställs när du startar datorn. -Menu.LogOffTip = Stänger alla program och loggar ut. -Menu.DisconnectTip = Kopplar från sessionen. Du kan ansluta till den här sessionen på nytt när du loggar in igen. -Menu.LockTip = Låser den här datorn. -Menu.UndockTip = Kopplar från din bärbara dator från dockningsstationen. -Menu.SwitchUserTip = Växlar användare utan att stänga program. -Menu.Empty = (Tom) -Menu.Features = Program och funktioner -Menu.FeaturesTip = Avinstallera eller ändra program på datorn. -Menu.SearchPeople = Efter &personer... -Menu.SortByName = Sortera efter &namn -Menu.Open = &Öppna -Menu.OpenAll = Öppna &delade Start-menyn -Menu.Explore = &Utforska -Menu.ExploreAll = Utf&orska delade Start-menyn -Menu.MenuSettings = Inställningar -Menu.MenuHelp = Hjälp -Menu.MenuExit = Avsluta -Menu.LogoffTitle = Logga ut -Menu.LogoffPrompt = Vill du logga ut? -Menu.LogoffYes = &Logga ut -Menu.LogoffNo = N&ej -Menu.RenameTitle = Byt namn -Menu.RenamePrompt = &Nytt namn: -Menu.RenameOK = OK -Menu.RenameCancel = Avbryt -Menu.Organize = Organisera Start-menyn -Menu.Expand = Exp&andera -Menu.Collapse = &Dölj -Menu.NewFolder = Ny mapp -Menu.NewShortcut = Ny genväg -Menu.AutoArrange = &Ordna automatiskt -Menu.ActionOpen = Öppna -Menu.ActionClose = Stäng -Menu.ActionExecute = Kör -Menu.RemoveList = &Ta bort från den här listan -Menu.RemoveAll = &Rensa listan Tidigare -Menu.Explorer = Utforskaren -Menu.Start = Start -Menu.StartScreen = Startskärmen -Menu.StartMenu = Startmenyn (Windows) -Menu.PinStart = Fäst på Start-menyn -Menu.PinStartCs = Fäst på Start-menyn (Open-Shell) -Menu.UnpinStartCs = Ta bort från Start-menyn (Open-Shell) -Menu.MonitorOff = Stänga av bildskärmen -Menu.RemoveHighlight = Ta bort fokus -Menu.Uninstall = &Avinstallera -Menu.UninstallTitle = Avinstallera -Menu.UninstallPrompt = Vill du avinstallera %s? -Search.CategorySettings = Kontrollpanelen -Search.CategoryPCSettings = Datorinställningar -Search.CategoryPrograms = Program -Search.CategoryDocuments = Dokument -Search.CategoryMusic = Musik -Search.CategoryPictures = Bilder -Search.CategoryVideos = Filmer -Search.CategoryFiles = Filer -Search.CategoryInternet = Internet -JumpList.Recent = Senast använda -JumpList.Frequent = Ofta använda -JumpList.Tasks = Aktiviteter -JumpList.Pinned = Fastnålat -JumpList.Pin = &Fäst i den här listan -JumpList.Unpin = &Ta bort från den här listan -JumpList.Remove = &Ta bort från den här listan -JumpList.PinTip = Fäst i den här listan -JumpList.UnpinTip = Ta bort från den här listan - - -[th-TH] - Thai (Thailand) -Menu.Programs = โ&ปรแกรม -Menu.Apps = โปรแกรม -Menu.AllPrograms = โปรแกรมทั้งหมด -Menu.Back = ย้อนกลับ -Menu.Favorites = ร&ายการโปรด -Menu.Documents = เอก&สาร -Menu.Settings = &การตั้งค่า -Menu.Search = &ค้นหา -Menu.SearchBox = ค้นหา -Menu.SearchPrograms = ค้นหาโปรแกรมและแฟ้ม -Menu.SearchInternet = ค้นหาอินเทอร์เน็ต -Menu.Searching = กำลังค้นหา... -Menu.NoMatch = ไม่มีรายการที่ตรงกับการค้นหาของคุณ -Menu.MoreResults = ดูผลลัพธ์เพิ่มเติม -Menu.Help = &บริการช่วยเหลือและวิธีใช้ -Menu.Run = เรียก&ใช้... -Menu.Logoff = ออก&จากระบบ %s -Menu.SwitchUser = สลับ&ผู้ใช้ -Menu.Lock = &ล็อก -Menu.LogOffShort = &ออกจากระบบ -Menu.Undock = ปล&ดชุดต่ออุปกรณ์ -Menu.Disconnect = &ยกเลิกการเชื่อมต่อ -Menu.ShutdownBox = ปิดเครื่&อง... -Menu.Shutdown = ปิ&ดเครื่อง -Menu.Restart = เริ่มการทำงานใ&หม่ -Menu.ShutdownUpdate = ปรับปรุงและปิดเครื่อง -Menu.RestartUpdate = ปรับปรุงและเริ่มระบบของคอมพิวเตอร์ใหม่ -Menu.Sleep = &สลีป -Menu.Hibernate = ไฮเบอร์เ&นต -Menu.ControlPanel = แ&ผงควบคุม -Menu.PCSettings = การตั้งค่าพีซี -Menu.Security = การรักษาความปลอดภัยของ Windows -Menu.Network = การเชื่อมต่อเค&รือข่าย -Menu.Printers = เ&ครื่องพิมพ์ -Menu.Taskbar = แ&ถบงานและเมนู 'เริ่ม' -Menu.SearchFiles = แ&ฟ้มหรือโฟลเดอร์... -Menu.SearchPrinter = เ&ครื่องพิมพ์ -Menu.SearchComputers = &คอมพิวเตอร์ -Menu.UserFilesTip = ประกอบด้วยโฟลเดอร์สำหรับเอกสาร รูปภาพ เพลง และแฟ้มอื่นๆ ที่เป็นของคุณ -Menu.UserDocumentsTip = เก็บจดหมาย รายงาน รวมทั้งเอกสารและแฟ้มอื่นๆ -Menu.UserPicturesTip = เก็บรูปถ่ายดิจิทัล รูป และแฟ้มกราฟิกต่างๆ -Menu.UserMusicTip = มีเพลงและแฟ้มเสียงอื่นๆ -Menu.UserVideosTip = มีภาพยนตร์และแฟ้มวิดีโออื่นๆ -Menu.NetworkTip = แสดงการเชื่อมต่อเครือข่ายที่มีอยู่บนคอมพิวเตอร์นี้ และช่วยคุณสร้างการเชื่อมต่อเครือข่ายใหม่ -Menu.PrintersTip = เพิ่ม เอาออก และกำหนดค่าเครื่องพิมพ์เฉพาะที่และเครื่องพิมพ์เครือข่าย -Menu.TaskbarTip = กำหนดเมนู 'เริ่ม' และแถบเครื่องมือเอง เช่น ชนิดของรายการที่จะแสดงและลักษณะที่จะปรากฏของเมนู 'เริ่ม' และแถบเครื่องมือ -Menu.ControlPanelTip = เปลี่ยนแปลงการตั้งค่าและกำหนดฟังก์ชันของคอมพิวเตอร์ของคุณ -Menu.DocumentsLibTip = เข้าถึงจดหมาย รายงาน บันทึกย่อ และเอกสารประเภทอื่นๆ -Menu.MusicLibTip = เล่นดนตรีและแฟ้มเสียงอื่นๆ -Menu.PicturesLibTip = ดูและจัดระเบียบรูปภาพดิจิทัล -Menu.VideosLibTip = ดูภาพยนตร์ถ่ายทำเองและวิดีโอดิจิทัลอื่นๆ -Menu.RecordingsLibTip = ดูรายการทีวีที่บันทึกบนคอมพิวเตอร์ -Menu.DownloadTip = ค้นหารายการดาวน์โหลดบนอินเทอร์เน็ตและการเชื่อมโยงไปยังเว็บไซต์โปรด -Menu.HomegroupTip = เข้าถึงไลบรารีและโฟลเดอร์ต่างๆ ที่ผู้อื่นเปิดให้ใช้ร่วมกันในโฮมกรุ๊ปของคุณ -Menu.RunTip = เปิดโปรแกรม โฟลเดอร์ เอกสาร หรือเว็บไซต์ -Menu.HelpTip = ค้นหาแหล่งข้อมูลสำหรับหัวข้อวิธีใช้ บทช่วยสอน การแก้ไขปัญหา และบริการช่วยเหลืออื่นๆ -Menu.ProgramsTip = เปิดรายชื่อของโปรแกรมของคุณ -Menu.SearchFilesTip = ค้นหาเอกสาร ดนตรี รูปภาพ อีเมล และอื่นๆอีกมาก -Menu.GamesTip = เล่นและจัดการกับเกมบนเครื่องคอมพิวเตอร์ของคุณ -Menu.SecurityTip = เปิดใช้ตัวเลือก 'การรักษาความปลอดภัยของ Windows' เพื่อเปลี่ยนรหัสผ่าน สลับผู้ใช้ หรือเริ่ม 'ตัวจัดการงาน' -Menu.SearchComputersTip = ค้นหาคอมพิวเตอร์บนเครือข่าย -Menu.SearchPrintersTip = ค้นหาเครื่องพิมพ์ -Menu.AdminToolsTip = กำหนดค่าการตั้งค่าเกี่ยวกับการจัดการ -สำหรับคอมพิวเตอร์ของคุณ -Menu.ShutdownTip = ปิดโปรแกรมที่เปิดอยู่ทั้งหมด ปิดระบบ Windows แล้วปิดคอมพิวเตอร์ของคุณ -Menu.RestartTip = ปิดโปรแกรมที่เปิดอยู่ทั้งหมด ปิดระบบ Windows แล้วเริ่มการทำงานของ Windows อีกครั้ง -Menu.SleepTip = รักษาเซสชันของคุณในหน่วยความจำ และทำให้คอมพิวเตอร์อยู่ในสถานะที่ใช้พลังงานต่ำ เพื่อให้คุณสามารถกลับมาดำเนินการต่อได้อย่างรวดเร็ว -Menu.HibernateTip = บันทึกเซสชันของคุณ และปิดเครื่องคอมพิวเตอร์ เมื่อคุณเปิดคอมพิวเตอร์ Windows จะคืนค่าเซสชันของคุณ -Menu.LogOffTip = ปิดโปรแกรมและออกจากระบบ -Menu.DisconnectTip = ยกเลิกการเชื่อมต่อเซสชันของคุณ คุณสามารถเชื่อมต่อใหม่ไปยังเซสชันนี้ได้เมื่อคุณเข้าสู่ระบบอีกครั้ง -Menu.LockTip = ล็อกคอมพิวเตอร์นี้ -Menu.UndockTip = เอาคอมพิวเตอร์แล็ปท็อปหรือโน้ตบุ๊กของคุณออกจากที่วางเทียบ -Menu.SwitchUserTip = สลับผู้ใช้โดยไม่ปิดโปรแกรม -Menu.Empty = (ว่าง) -Menu.Features = โปรแกรมและคุณลักษณะ -Menu.FeaturesTip = ถอนการติดตั้งหรือเปลี่ยนแปลงโปรแกรมบนคอมพิวเตอร์ของคุณ -Menu.SearchPeople = สำหรับ&บุคคล... -Menu.SortByName = เรียงลำดั&บตามชื่อ -Menu.Open = เ&ปิด -Menu.OpenAll = &เปิดโฟลเดอร์ All Users -Menu.Explore = สำรว&จ -Menu.ExploreAll = &สำรวจโฟลเดอร์ All Users -Menu.MenuSettings = การตั้งค่า -Menu.MenuHelp = วิธีใช้ -Menu.MenuExit = ออก -Menu.LogoffTitle = ออกจากระบบ Windows -Menu.LogoffPrompt = คุณแน่ใจหรือไม่ว่าคุณต้องการออกจากระบบ -Menu.LogoffYes = &ออกจากระบบ -Menu.LogoffNo = ไ&ม่ใช่ -Menu.RenameTitle = เปลี่ยนชื่อ -Menu.RenamePrompt = &ชื่อใหม่: -Menu.RenameOK = ตกลง -Menu.RenameCancel = ยกเลิก -Menu.Organize = จัดระเบียบเมนู 'เริ่ม' -Menu.Expand = &ขยาย -Menu.Collapse = &ยุบ -Menu.NewFolder = สร้างโฟลเดอร์ -Menu.NewShortcut = ทางลัดใหม่ -Menu.AutoArrange = จัดเรียงอัต&โนมัติ -Menu.ActionOpen = เปิด -Menu.ActionClose = ปิด -Menu.ActionExecute = ปฏิบัติการ -Menu.RemoveList = เอาออก&จากรายชื่อนี้ -Menu.RemoveAll = &ล้างรายการล่าสุด -Menu.Explorer = Windows Explorer -Menu.Start = เริ่ม -Menu.StartScreen = หน้าจอเริ่ม -Menu.StartMenu = เมนูเริ่ม (Windows) -Menu.PinStart = ตรึงกับเมนูเริ่ม -Menu.PinStartCs = ตรึงกับเมนูเริ่ม (Open-Shell) -Menu.UnpinStartCs = ถอนการตรึงออกจากเมนูเริ่ม (Open-Shell) -Menu.MonitorOff = ปิดจอแสดงผล -Menu.RemoveHighlight = เอาไฮไลท์ออก -Menu.Uninstall = &ถอนการติดตั้ง -Menu.UninstallTitle = ถอนการติดตั้ง -Menu.UninstallPrompt = คุณแน่ใจหรือไม่ว่าคุณต้องการถอนการติดตั้ง %s -Search.CategorySettings = แผงควบคุม -Search.CategoryPCSettings = การตั้งค่าพีซี -Search.CategoryPrograms = โปรแกรม -Search.CategoryDocuments = เอกสาร -Search.CategoryMusic = เพลง -Search.CategoryPictures = รูปภาพ -Search.CategoryVideos = วิดีโอ -Search.CategoryFiles = แฟ้ม -Search.CategoryInternet = อินเทอร์เน็ต -JumpList.Recent = ล่าสุด -JumpList.Frequent = ที่ใช้บ่อย -JumpList.Tasks = งาน -JumpList.Pinned = ตรึงไว้ -JumpList.Pin = &ตรึงเข้ากับรายการนี้ -JumpList.Unpin = &ถอนการตรึงออกจากรายการนี้ -JumpList.Remove = เอาออก&จากรายการนี้ -JumpList.PinTip = ตรึงเข้ากับรายการนี้ -JumpList.UnpinTip = ถอนการตรึงออกจากรายการนี้ - - -[tr-TR] - Turkish (Turkey) -Menu.Programs = Progra&mlar -Menu.Apps = Uygulamalar -Menu.AllPrograms = Tüm Programlar -Menu.Back = Geri -Menu.Favorites = &Sık Kullanılanlar -Menu.Documents = &Belgeler -Menu.Settings = Ayar&lar -Menu.Search = &Ara -Menu.SearchBox = Ara -Menu.SearchPrograms = Programları ve dosyaları ara -Menu.SearchInternet = Internet'te ara -Menu.Searching = Arıyor... -Menu.NoMatch = Aramanızla eşleşen öğe yok. -Menu.MoreResults = Diğer sonuçlar -Menu.Help = &Yardım ve Destek -Menu.Run = Çal&ıştır... -Menu.Logoff = %s Oturumunu &Kapat -Menu.SwitchUser = &Kullanıcı değiştir -Menu.Lock = Kili&tle -Menu.LogOffShort = &Oturumu Kapat -Menu.Undock = Bilgisaya&rı Çıkar -Menu.Disconnect = Ba&ğlantıyı Kes -Menu.ShutdownBox = B&ilgisayarı Kapat... -Menu.Shutdown = &Bilgisayarı Kapat -Menu.Restart = &Yeniden Başlat -Menu.ShutdownUpdate = Güncelleştir ve kapat -Menu.RestartUpdate = Güncelleştir ve yeniden başlat -Menu.Sleep = &Uyku -Menu.Hibernate = &Hazırda Beklet -Menu.ControlPanel = &Denetim Masası -Menu.PCSettings = Bilgisayar ayarları -Menu.Security = Windows Güvenliği -Menu.Network = &Ağ Bağlantıları -Menu.Printers = &Yazıcılar -Menu.Taskbar = &Görev Çubuğu ve Başlat Menüsü -Menu.SearchFiles = &Dosya ya da Klasör... -Menu.SearchPrinter = &Yazıcı için -Menu.SearchComputers = &Bilgisayar için -Menu.UserFilesTip = Size ait Belge, Resim, Müzik dosyalarının ve diğer dosyaların klasörlerini içerir. -Menu.UserDocumentsTip = Mektup, rapor ve benzeri belge ve dosyaları içerir. -Menu.UserPicturesTip = Dijital foto, resim ve grafik dosyaları içerir. -Menu.UserMusicTip = Müzik ve diğer ses dosyalarını içerir. -Menu.UserVideosTip = Film ve diğer video dosyalarını içerir. -Menu.NetworkTip = Bu bilgisayar üzerindeki ağ bağlantılarını görüntüleyip yenilerini oluşturmanıza yardımcı olur -Menu.PrintersTip = Yerel yazıcıları ve ağ yazıcılarını ekler, kaldırır ve yapılandırır. -Menu.TaskbarTip = Görüntülenecek öğeler ve ve nasıl görünmeleri gerektiği gibi konularda Başlat Menüsünü ve görev çubuğunu özelleştir. -Menu.ControlPanelTip = Bilgisayarınızın ayarlarını değiştirin ve işlevlerini özelleştirin. -Menu.DocumentsLibTip = Mektuplara, raporlara, notlara ve diğer belge türlerine erişin. -Menu.MusicLibTip = Müzik ve diğer ses dosyalarını çalın. -Menu.PicturesLibTip = Dijital resimleri görüntüleyin ve düzenleyin. -Menu.VideosLibTip = Ev filmlerini ve diğer dijital videoları izleyin. -Menu.RecordingsLibTip = Bilgisayarınızda kayıtlı TV programlarını izleyin. -Menu.DownloadTip = Internet yüklemelerini ve sık kullanılan web siteleri bağlantılarını bulun. -Menu.HomegroupTip = Ev grubunuzdaki diğer kişiler tarafından paylaşılan kitaplıklara ve klasörlere erişin. -Menu.RunTip = Bir program, klasör, belge veya Web sitesi açar. -Menu.HelpTip = Yardım konularını, bilgilendirici rehberleri ve diğer destek hizmetlerini bulun. -Menu.ProgramsTip = Programlarınızın listesini açar. -Menu.SearchFilesTip = Belge, müzik, resim, e-posta ve pek çok başka öğeyi arayın. -Menu.GamesTip = Bilgisayarınızda oyun oynayın ve oyunları yönetin. -Menu.SecurityTip = Parola Değiştirmek, Kullanıcı Değiştirmek veya Görev Yöneticisini Başlatmak için Windows Güvenlik Seçenekleri'ni başlatın. -Menu.SearchComputersTip = Ağda bilgisayarlar ara -Menu.SearchPrintersTip = Yazıcı arayın -Menu.AdminToolsTip = Bilgisayarınızın yönetimle ilgili ayarlarını yapılandırır. -Menu.ShutdownTip = Tüm açık programları kapatır, Windows'u kapatır ve sonra bilgisayarınızı kapatır. -Menu.RestartTip = Tüm açık programları kapatır, Windows'u kapatır ve sonra Windows'u yeniden başlatır. -Menu.SleepTip = Çalışmanızı kolayca devam ettirebilmeniz için oturumunuzu bellekte tutar ve bilgisayarı düşük güçte çalışma durumuna geçirir. -Menu.HibernateTip = Oturumunuzu kaydeder ve bilgisayarı kapatır. Bilgisayarı açtığınızda, Windows oturumunuzu geri yükler. -Menu.LogOffTip = Programları kapatın ve oturumdan çıkın. -Menu.DisconnectTip = Oturum bağlantınız kesilir. Oturum açtığınızda yeniden bağlanabilirsiniz. -Menu.LockTip = Bu bilgisayarı kilitleyin. -Menu.UndockTip = Dizüstü veya notebook bilgisayarınızı takma biriminden çıkartır. -Menu.SwitchUserTip = Kullanıcıları, programları kapatmadan değiştirin. -Menu.Empty = (Boş) -Menu.Features = Programlar ve Özellikler -Menu.FeaturesTip = Bilgisayarınızdaki programları kaldırın veya değiştirin. -Menu.SearchPeople = &Kişiler... -Menu.SortByName = A&da Göre Sırala -Menu.Open = &Aç -Menu.OpenAll = Tü&m Kullanıcıları Aç -Menu.Explore = A&raştır -Menu.ExploreAll = &Tüm Kullanıcıları Araştır -Menu.MenuSettings = Ayarlar -Menu.MenuHelp = Yardım -Menu.MenuExit = Çıkış -Menu.LogoffTitle = Windows Oturumunu Kapat -Menu.LogoffPrompt = Oturumu kapatmayı gerçekten istiyor musunuz? -Menu.LogoffYes = Oturumu &Kapat -Menu.LogoffNo = &Hayır -Menu.RenameTitle = Yeniden Adlandır -Menu.RenamePrompt = &Yeni ad: -Menu.RenameOK = Tamam -Menu.RenameCancel = İptal -Menu.Organize = Başlat menüsünü düzenle -Menu.Expand = &Genişlet -Menu.Collapse = &Daralt -Menu.NewFolder = Yeni Klasör -Menu.NewShortcut = Yeni Kısayol -Menu.AutoArrange = &Otomatik Düzenle -Menu.ActionOpen = Aç -Menu.ActionClose = Kapat -Menu.ActionExecute = Çalıştır -Menu.RemoveList = &Bu listeden kaldır -Menu.RemoveAll = &Son kullanılan öğeler listesini temizle -Menu.Explorer = Windows Gezgini -Menu.Start = Başlat -Menu.StartScreen = Başlangıç Ekranı -Menu.StartMenu = Başlat menüsü (Windows) -Menu.PinStart = Başlat menüsüne sabitle -Menu.PinStartCs = Başlat menüsüne sabitle (Open-Shell) -Menu.UnpinStartCs = Başlat menüsünden ayır (Open-Shell) -Menu.MonitorOff = Ekranı kapat -Menu.RemoveHighlight = Önemli Noktayı Kaldır -Menu.Uninstall = &Kaldır -Menu.UninstallTitle = Kaldır -Menu.UninstallPrompt = %s programını kaldırmak istediğinizden emin misiniz? -Search.CategorySettings = Denetim Masası -Search.CategoryPCSettings = Bilgisayar ayarları -Search.CategoryPrograms = Programlar -Search.CategoryDocuments = Belgeler -Search.CategoryMusic = Müzik -Search.CategoryPictures = Resimler -Search.CategoryVideos = Videolar -Search.CategoryFiles = Dosyalar -Search.CategoryInternet = Internet -JumpList.Recent = En Son -JumpList.Frequent = Sık Kullanılanlar -JumpList.Tasks = Görevler -JumpList.Pinned = Sabitlendi -JumpList.Pin = Bu listeye &sabitle -JumpList.Unpin = Bu listeden çı&kar -JumpList.Remove = &Bu listeden kaldır -JumpList.PinTip = Bu listeye sabitle -JumpList.UnpinTip = Bu listeden çıkar - - -[uk-UA] - Ukrainian (Ukraine) -Menu.Programs = &Програми -Menu.Apps = Застосунки -Menu.AllPrograms = Усі програми -Menu.Back = Назад -Menu.Favorites = &Уподобання -Menu.Documents = До&кументи -Menu.Settings = Н&астройки -Menu.Search = З&найти -Menu.SearchBox = Знайти -Menu.SearchPrograms = Пошук програм та файлів -Menu.SearchInternet = Пошук в Інтернеті -Menu.Searching = Триває пошук... -Menu.NoMatch = Пошук не дав результатів. -Menu.MoreResults = Інші результати -Menu.Help = &Довідка та підтримка -Menu.Run = Запуск про&грами... -Menu.Logoff = Завер&шення сеансу %s -Menu.SwitchUser = З&мінити користувача -Menu.Lock = Б&локувати -Menu.LogOffShort = &Вийти з системи -Menu.Undock = Відстикувати комп'&ютер -Menu.Disconnect = В&ідключити -Menu.ShutdownBox = &Завершення роботи... -Menu.Shutdown = &Завершення роботи -Menu.Restart = &Перезавантаження -Menu.ShutdownUpdate = Інсталювати оновлення та завершити роботу -Menu.RestartUpdate = Інсталювати оновлення та перезавантажити -Menu.Sleep = &Сон -Menu.Hibernate = &Режим глибокого сну -Menu.ControlPanel = П&анель керування -Menu.PCSettings = Параметри ПК -Menu.Security = Безпека Windows -Menu.Network = &Мережні підключення -Menu.Printers = Пр&интери -Menu.Taskbar = Панель &завдань і меню "Пуск" -Menu.SearchFiles = &Файли й папки... -Menu.SearchPrinter = &Принтер -Menu.SearchComputers = &Комп'ютери -Menu.UserFilesTip = Містить папки для документів, зображень, музики та інших ваших файлів. -Menu.UserDocumentsTip = Містить листи, звіти та інші документи й файли. -Menu.UserPicturesTip = Містить цифрові фотографії, малюнки, графічні файли. -Menu.UserMusicTip = Містить музичні та інші звукові файли. -Menu.UserVideosTip = Містить фільми та відеофайли. -Menu.NetworkTip = Показ наявних мережних підключень для цього комп’ютера та створення нових підключень -Menu.PrintersTip = Додати, видалити або настроїти локальні чи мережні принтери. -Menu.TaskbarTip = Настройка меню "Пуск" і панелі завдань, наприклад, установка типів і зовнішнього вигляду елементів, які буде показано. -Menu.ControlPanelTip = Змінити параметри та настроїти функціональність системи. -Menu.DocumentsLibTip = Отримайте доступ до листів, звітів, приміток та документів інших видів. -Menu.MusicLibTip = Відтворюйте музику та інші звукові файли. -Menu.PicturesLibTip = Переглядайте та організовуйте цифрові зображення. -Menu.VideosLibTip = Переглядати домашнє та інше цифрове відео. -Menu.RecordingsLibTip = Переглядати ТВ-програми, записані на комп'ютер. -Menu.DownloadTip = Знайти завантаження Інтернету і посилання на улюблені веб-сайти. -Menu.HomegroupTip = Спільний доступ до бібліотек і папок інших користувачів із домашньої групи. -Menu.RunTip = Відкриття програми, папки, документа або веб-сайту. -Menu.HelpTip = Пошук довідкових матеріалів, навчальних програм, засобів виправлення неполадок та інших служб технічної підтримки. -Menu.ProgramsTip = Відкрити список програм. -Menu.SearchFilesTip = Пошук документів, музики, зображень, адрес електронної пошти та іншого. -Menu.GamesTip = Гра та керування іграми, інстальованими на цьому комп’ютері. -Menu.SecurityTip = Запустити Параметри безпеки Windows для зміни пароля, переключення користувача або запуску диспетчера завдань. -Menu.SearchComputersTip = Пошук комп’ютерів у мережі -Menu.SearchPrintersTip = Пошук принтера -Menu.AdminToolsTip = Настройка параметрів адміністрування для цього комп'ютера. -Menu.ShutdownTip = Закриває всі відкриті програми, завершує роботу системи та вимикає комп’ютер. -Menu.RestartTip = Закриває всі відкриті програми, завершує роботу системи та запускає систему знову. -Menu.SleepTip = Зберігає сеанс роботи в пам’яті та переводить комп’ютер до режиму зниженого енергоспоживання, що надає змогу швидко відновити роботу. -Menu.HibernateTip = Зберігає дані сеансу та вимикає комп’ютер. Після увімкнення комп’ютера система відновлює сеанс. -Menu.LogOffTip = Закрити програми та вийти з системи. -Menu.DisconnectTip = Відключає ваш сеанс. Можна знову підключитися до сеансу, повторно увійшовши до системи. -Menu.LockTip = Заблокувати комп'ютер. -Menu.UndockTip = Видалення ноутбука із пристрою стаціонарного підключення. -Menu.SwitchUserTip = Переключення користувачів без закриття програм. -Menu.Empty = (пусто) -Menu.Features = Програми та засоби -Menu.FeaturesTip = Змінити або видалити програми на комп’ютері. -Menu.SearchPeople = Л&юдей... -Menu.SortByName = Сортувати за &іменем -Menu.Open = &Відкрити -Menu.OpenAll = В&ідкрити спільне для всіх меню -Menu.Explore = &Провідник -Menu.ExploreAll = Пр&овідник до спільного для всіх меню -Menu.MenuSettings = Настройки -Menu.MenuHelp = Довідка -Menu.MenuExit = Вихід -Menu.LogoffTitle = Вихід із Windows -Menu.LogoffPrompt = Ви дійсно бажаєте вийти із системи? -Menu.LogoffYes = В&ихід -Menu.LogoffNo = &Ні -Menu.RenameTitle = Перейменування -Menu.RenamePrompt = &Нове ім'я: -Menu.RenameOK = ОК -Menu.RenameCancel = Скасувати -Menu.Organize = Упорядкування меню "Пуск" -Menu.Expand = &Розгорнути -Menu.Collapse = &Згорнути -Menu.NewFolder = Створити папку -Menu.NewShortcut = Новий ярлик -Menu.AutoArrange = &Автоматично -Menu.ActionOpen = Відкрити -Menu.ActionClose = Закрити -Menu.ActionExecute = Виконати -Menu.RemoveList = Видалити &з цього списку -Menu.RemoveAll = О&чистити список останніх елементів -Menu.Explorer = Провідник -Menu.Start = Запустити -Menu.StartScreen = Початковий екран -Menu.StartMenu = Меню "Пуск" (Windows) -Menu.PinStart = Прикріпити до меню "Пуск" -Menu.PinStartCs = Прикріпити до меню "Пуск" (Open-Shell) -Menu.UnpinStartCs = Відкріпити від меню "Пуск" (Open-Shell) -Menu.MonitorOff = Вимкнути дисплей -Menu.RemoveHighlight = Видалити виділення -Menu.Uninstall = &Видалити -Menu.UninstallTitle = Видалити -Menu.UninstallPrompt = Дійсно видалити %s? -Search.CategorySettings = Панель керування -Search.CategoryPCSettings = Параметри ПК -Search.CategoryPrograms = Програми -Search.CategoryDocuments = Документи -Search.CategoryMusic = Музика -Search.CategoryPictures = Зображення -Search.CategoryVideos = Відео -Search.CategoryFiles = Файли -Search.CategoryInternet = Інтернет -JumpList.Recent = Недавні -JumpList.Frequent = Часто використовувані -JumpList.Tasks = Завдання -JumpList.Pinned = Зафіксовано -JumpList.Pin = &Прикріпити до списку -JumpList.Unpin = &Відкріпити від списку -JumpList.Remove = Видали&ти з цього списку -JumpList.PinTip = Прикріпити до списку -JumpList.UnpinTip = Відкріпити від списку - - -[zh-CN] - Chinese (Simplified) -Menu.Programs = 程序(&P) -Menu.Apps = 应用 -Menu.AllPrograms = 所有程序 -Menu.Back = 返回 -Menu.Favorites = 收藏夹(&A) -Menu.Documents = 文档(&D) -Menu.Settings = 设置(&S) -Menu.Search = 搜索(&C) -Menu.SearchBox = 搜索 -Menu.SearchPrograms = 搜索程序和文件 -Menu.SearchInternet = 搜索 Internet -Menu.Searching = 正在搜索... -Menu.NoMatch = 没有与搜索条件匹配的项。 -Menu.MoreResults = 查看更多结果 -Menu.Help = 帮助和支持(&H) -Menu.Run = 运行(&R)... -Menu.Logoff = 注销 %s(&L) -Menu.SwitchUser = 切换用户(&W) -Menu.Lock = 锁定(&O) -Menu.LogOffShort = 注销(&L) -Menu.Undock = 弹出 PC(&E) -Menu.Disconnect = 断开(&I) -Menu.ShutdownBox = 关机(&U)... -Menu.Shutdown = 关机(&U) -Menu.Restart = 重新启动(&R) -Menu.ShutdownUpdate = 更新并关机 -Menu.RestartUpdate = 更新并重启 -Menu.Sleep = 睡眠(&S) -Menu.Hibernate = 休眠(&H) -Menu.ControlPanel = 控制面板(&C) -Menu.PCSettings = 电脑设置 -Menu.Security = Windows 安全 -Menu.Network = 网络连接(&N) -Menu.Printers = 打印机(&P) -Menu.Taskbar = 任务栏和「开始」菜单(&T) -Menu.SearchFiles = 文件或文件夹(&F)... -Menu.SearchPrinter = 打印机(&P) -Menu.SearchComputers = 计算机(&C) -Menu.UserFilesTip = 包含文档文件、图片文件、音乐文件及您拥有的其他文件的文件夹。 -Menu.UserDocumentsTip = 包含信件,报告和其它文档以及文件。 -Menu.UserPicturesTip = 包含数字照片,图片和图形文件。 -Menu.UserMusicTip = 包含音乐和其他音频文件。 -Menu.UserVideosTip = 包含音乐和其他视频文件。 -Menu.NetworkTip = 显示此计算机上现有的网络连接并帮助您创建新的 -Menu.PrintersTip = 添加、删除和配置本地及网络打印机。 -Menu.TaskbarTip = 自定义「开始」菜单和任务栏,例如要显示项目的类型及如何显示。 -Menu.ControlPanelTip = 更改您的计算机设置并自定义其功能。 -Menu.DocumentsLibTip = 访问信件、报告、便笺以及其他类型的文档。 -Menu.MusicLibTip = 播放音乐和其他音频文件。 -Menu.PicturesLibTip = 查看和组织数字图片。 -Menu.VideosLibTip = 观看家庭电影和其他数字视频。 -Menu.RecordingsLibTip = 在计算机上观看录制的电视节目。 -Menu.DownloadTip = 查找 Internet 下载以及最喜欢的网站链接。 -Menu.HomegroupTip = 访问家庭组中其他人员共享的库和文件夹。 -Menu.RunTip = 打开一个程序、文件夹、文档或网站。 -Menu.HelpTip = 查找帮助主题、教程、疑难解答和其他支持服务。 -Menu.ProgramsTip = 打开您的程序列表。 -Menu.SearchFilesTip = 搜索文档、音乐、图片、电子邮件等等。 -Menu.GamesTip = 在计算机上运行和管理游戏。 -Menu.SecurityTip = 启动 Windows 安全选项以更改密码、切换用户或启动任务管理器。 -Menu.SearchComputersTip = 搜索网络计算机 -Menu.SearchPrintersTip = 搜索打印机 -Menu.AdminToolsTip = 配置您计算机的管理设置。 -Menu.ShutdownTip = 关闭所有打开的程序,关闭 Windows,然后关闭计算机。 -Menu.RestartTip = 关闭所有打开的程序,关闭 Windows,然后重新启动 Windows。 -Menu.SleepTip = 将会话保存在内存中并将计算机置于低功耗状态,这样即可快速恢复工作状态。 -Menu.HibernateTip = 保存会话并关闭计算机。打开计算机时,Windows 会还原会话。 -Menu.LogOffTip = 关闭程序并注销。 -Menu.DisconnectTip = 断开会话。再次登录时可以重新连接到该会话。 -Menu.LockTip = 锁定该计算机。 -Menu.UndockTip = 将您的便携式和笔记本计算机从扩展坞中移除。 -Menu.SwitchUserTip = 不关闭程序切换用户。 -Menu.Empty = (空) -Menu.Features = 程序和功能 -Menu.FeaturesTip = 卸载或更改计算机上的程序。 -Menu.SearchPeople = 个人(&P)... -Menu.SortByName = 按名称排序(&B) -Menu.Open = 打开(&O) -Menu.OpenAll = 打开所有用户(&P) -Menu.Explore = 浏览(&E) -Menu.ExploreAll = 浏览所有用户(&X) -Menu.MenuSettings = 设置 -Menu.MenuHelp = 帮助 -Menu.MenuExit = 退出 -Menu.LogoffTitle = 注销 Windows -Menu.LogoffPrompt = 确实要注销吗? -Menu.LogoffYes = 注销(&L) -Menu.LogoffNo = 否(&N) -Menu.RenameTitle = 重命名 -Menu.RenamePrompt = 新名称(&N): -Menu.RenameOK = 确定 -Menu.RenameCancel = 取消 -Menu.Organize = 组织「开始」菜单 -Menu.Expand = 展开(&A) -Menu.Collapse = 折叠(&A) -Menu.NewFolder = 新文件夹 -Menu.NewShortcut = 新快捷方式 -Menu.AutoArrange = 自动排列(&A) -Menu.ActionOpen = 打开 -Menu.ActionClose = 关闭 -Menu.ActionExecute = 执行 -Menu.RemoveList = 从列表中删除(&F) -Menu.RemoveAll = 清除最近的项目列表(&L) -Menu.Explorer = Windows 资源管理器 -Menu.Start = 开始 -Menu.StartScreen = “开始”屏幕 -Menu.StartMenu = 「开始」菜单 (Windows) -Menu.PinStart = 锁定到「开始」菜单 -Menu.PinStartCs = 锁定到「开始」菜单 (Open-Shell) -Menu.UnpinStartCs = 从「开始」菜单解锁 (Open-Shell) -Menu.MonitorOff = 关闭显示器 -Menu.RemoveHighlight = 删除突出显示 -Menu.Uninstall = 卸载(&U) -Menu.UninstallTitle = 卸载 -Menu.UninstallPrompt = 确实要卸载 %s 吗? -Search.CategorySettings = 设置 -Search.CategoryPCSettings = 电脑设置 -Search.CategoryPrograms = 程序 -Search.CategoryDocuments = 文档 -Search.CategoryMusic = 音乐 -Search.CategoryPictures = 图片 -Search.CategoryVideos = 视频 -Search.CategoryFiles = 文件 -Search.CategoryInternet = Internet -JumpList.Recent = 最近 -JumpList.Frequent = 常用 -JumpList.Tasks = 任务 -JumpList.Pinned = 已固定 -JumpList.Pin = 锁定到此列表(&I) -JumpList.Unpin = 从此列表解锁(&U) -JumpList.Remove = 从列表中删除(&F) -JumpList.PinTip = 锁定到此列表 -JumpList.UnpinTip = 从此列表解锁 - - -[zh-HK] - Chinese (Traditional) -Menu.Programs = 程式集(&P) -Menu.Apps = 應用程式 -Menu.AllPrograms = 所有程式 -Menu.Back = 上一頁 -Menu.Favorites = 我的最愛(&A) -Menu.Documents = 文件(&D) -Menu.Settings = 設定(&S) -Menu.Search = 搜尋(&C) -Menu.SearchBox = 搜尋 -Menu.SearchPrograms = 搜尋程式及檔案 -Menu.SearchInternet = 搜尋網際網路 -Menu.Searching = 正在搜尋... -Menu.NoMatch = 沒有符合搜尋的項目。 -Menu.MoreResults = 查看更多結果 -Menu.Help = 說明及支援(&H) -Menu.Run = 執行(&R)... -Menu.Logoff = 登出 %s(&L) -Menu.SwitchUser = 切換使用者(&W) -Menu.Lock = 鎖定(&O) -Menu.LogOffShort = 登出(&L) -Menu.Undock = 卸除 PC(&E) -Menu.Disconnect = 中斷連線(&I) -Menu.ShutdownBox = 關機(&U)... -Menu.Shutdown = 關機(&U) -Menu.Restart = 重新啟動(&R) -Menu.ShutdownUpdate = 更新並關機 -Menu.RestartUpdate = 更新並重新啟動 -Menu.Sleep = 睡眠(&S) -Menu.Hibernate = 休眠(&H) -Menu.ControlPanel = 控制台(&C) -Menu.PCSettings = 電腦設定 -Menu.Security = Windows 安全性 -Menu.Network = 網路連線(&N) -Menu.Printers = 印表機(&P) -Menu.Taskbar = 工作列及 [開始] 功能表(&T) -Menu.SearchFiles = 檔案或資料夾(&F)... -Menu.SearchPrinter = 印表機(&P) -Menu.SearchComputers = 電腦(&C) -Menu.UserFilesTip = 包含 [文件]、[圖片]、[音樂] 資料夾,以及其他屬於您的檔案。 -Menu.UserDocumentsTip = 包含信件、報告、其他文件和檔案。 -Menu.UserPicturesTip = 包含數位相片、影像和圖形檔案。 -Menu.UserMusicTip = 包含音樂和其他音訊檔案。 -Menu.UserVideosTip = 包含影片和其他視訊檔案。 -Menu.NetworkTip = 顯示這台電腦目前的網路連線,並協助您建立新連線。 -Menu.PrintersTip = 新增、移除和設定本機及網路印表機。 -Menu.TaskbarTip = 自訂開始功能表和工作列,例如要顯示的項目類型和顯示的方式。 -Menu.ControlPanelTip = 變更設定和自訂電腦的功能。 -Menu.DocumentsLibTip = 存取信件、報告、筆記及其他類型的文件。 -Menu.MusicLibTip = 播放音樂及其他音訊檔案。 -Menu.PicturesLibTip = 檢視及管理數位圖片。 -Menu.VideosLibTip = 觀看家庭影片及其他數位視訊。 -Menu.RecordingsLibTip = 觀看電腦上錄製的電視節目。 -Menu.DownloadTip = 尋找網際網路下載與我的最愛網站的連結。 -Menu.HomegroupTip = 存取家用群組中其他人共用的媒體櫃與資料夾。 -Menu.RunTip = 開啟程式、資料夾、文件或網站。 -Menu.HelpTip = 尋找說明主題、教學課程、疑難排解和其他支援服務。 -Menu.ProgramsTip = 開啟程式清單。 -Menu.SearchFilesTip = 搜尋文件、音樂、圖片及電子郵件等等。 -Menu.GamesTip = 玩和管理您電腦上的遊戲。 -Menu.SecurityTip = 啟動 [Windows 安全性選項] 以變更密碼、切換使用者或啟動工作管理員。 -Menu.SearchComputersTip = 搜尋網路上的電腦 -Menu.SearchPrintersTip = 搜尋印表機 -Menu.AdminToolsTip = 設定電腦的系統管理設定。 -Menu.ShutdownTip = 關閉所有開啟的程式、關閉 Windows,然後關閉您的電腦。 -Menu.RestartTip = 關閉所有開啟的程式、關閉 Windows,然後重新啟動 Windows。 -Menu.SleepTip = 將您的工作階段保留在記憶體中,並且讓電腦處於低電源狀態,如此您就能夠快速地恢復工作。 -Menu.HibernateTip = 儲存您的工作階段,並且關閉電腦。當您開啟電腦時,Windows 會還原您的工作階段。 -Menu.LogOffTip = 關閉程式並登出。 -Menu.DisconnectTip = 中斷您的工作階段連線。下次重新登入時,可以重新連線。 -Menu.LockTip = 鎖定此電腦。 -Menu.UndockTip = 將筆記型電腦從船塢中卸除。 -Menu.SwitchUserTip = 切換使用者 (不關閉程式)。 -Menu.Empty = (空白) -Menu.Features = 程式和功能 -Menu.FeaturesTip = 解除安裝或變更您電腦上的程式。 -Menu.SearchPeople = 人員(&P)... -Menu.SortByName = 依名稱排序(&B) -Menu.Open = 開啟(&O) -Menu.OpenAll = 開啟所有使用者(&P) -Menu.Explore = 檔案總管(&E) -Menu.ExploreAll = 瀏覽所有使用者(&X) -Menu.MenuSettings = 設定 -Menu.MenuHelp = 說明 -Menu.MenuExit = 結束 -Menu.LogoffTitle = 登出 Windows -Menu.LogoffPrompt = 您確定要登出? -Menu.LogoffYes = 登出(&L) -Menu.LogoffNo = 否(&N) -Menu.RenameTitle = 重新命名 -Menu.RenamePrompt = 新名稱(&N): -Menu.RenameOK = 確定 -Menu.RenameCancel = 取消 -Menu.Organize = 組織 [開始] 功能表 -Menu.Expand = 展開(&A) -Menu.Collapse = 摺疊(&A) -Menu.NewFolder = 新增資料夾 -Menu.NewShortcut = 新增捷徑 -Menu.AutoArrange = 自動排列(&A) -Menu.ActionOpen = 開啟 -Menu.ActionClose = 關閉 -Menu.ActionExecute = 執行 -Menu.RemoveList = 從清單中移除(&F) -Menu.RemoveAll = 清除最近使用的項目清單(&L) -Menu.Explorer = Windows 檔案總管 -Menu.Start = 開始 -Menu.StartScreen = [開始] 畫面 -Menu.StartMenu = [開始] 功能表 (Windows) -Menu.PinStart = 釘選到 [開始] 功能表 -Menu.PinStartCs = 釘選到 [開始] 功能表 (Open-Shell) -Menu.UnpinStartCs = 從 [開始] 功能表取消釘選 (Open-Shell) -Menu.MonitorOff = 關閉顯示 -Menu.RemoveHighlight = 移除醒目提示 -Menu.Uninstall = 解除安裝(&U) -Menu.UninstallTitle = 解除安裝 -Menu.UninstallPrompt = 您確定要從電腦解除安裝 %s 嗎? -Search.CategorySettings = 設定 -Search.CategoryPCSettings = 電腦設定 -Search.CategoryPrograms = 程式 -Search.CategoryDocuments = 文件 -Search.CategoryMusic = 音樂 -Search.CategoryPictures = 圖片 -Search.CategoryVideos = 影片 -Search.CategoryFiles = 檔案 -Search.CategoryInternet = 網際網路 -JumpList.Recent = 最近 -JumpList.Frequent = 常用 -JumpList.Tasks = 工作 -JumpList.Pinned = 已釘選 -JumpList.Pin = 釘選到這個清單(&I) -JumpList.Unpin = 從這個清單取消釘選(&U) -JumpList.Remove = 從清單中移除(&F) -JumpList.PinTip = 釘選到這個清單 -JumpList.UnpinTip = 從這個清單取消釘選 - - -[zh-TW] - Chinese (Traditional) -Menu.Programs = 程式集(&P) -Menu.Apps = 應用程式 -Menu.AllPrograms = 所有程式 -Menu.Back = 上一頁 -Menu.Favorites = 我的最愛(&A) -Menu.Documents = 文件(&D) -Menu.Settings = 設定(&S) -Menu.Search = 搜尋(&C) -Menu.SearchBox = 搜尋 -Menu.SearchPrograms = 搜尋程式及檔案 -Menu.SearchInternet = 搜尋網際網路 -Menu.Searching = 正在搜尋... -Menu.NoMatch = 沒有符合搜尋的項目。 -Menu.MoreResults = 查看更多結果 -Menu.Help = 說明及支援(&H) -Menu.Run = 執行(&R)... -Menu.Logoff = 登出 %s(&L) -Menu.SwitchUser = 切換使用者(&W) -Menu.Lock = 鎖定(&O) -Menu.LogOffShort = 登出(&L) -Menu.Undock = 卸除 PC(&E) -Menu.Disconnect = 中斷連線(&I) -Menu.ShutdownBox = 關機(&U)... -Menu.Shutdown = 關機(&U) -Menu.Restart = 重新啟動(&R) -Menu.ShutdownUpdate = 更新並關機 -Menu.RestartUpdate = 更新並重新啟動 -Menu.Sleep = 睡眠(&S) -Menu.Hibernate = 休眠(&H) -Menu.ControlPanel = 控制台(&C) -Menu.PCSettings = 電腦設定 -Menu.Security = Windows 安全性 -Menu.Network = 網路連線(&N) -Menu.Printers = 印表機(&P) -Menu.Taskbar = 工作列及 [開始] 功能表(&T) -Menu.SearchFiles = 檔案或資料夾(&F)... -Menu.SearchPrinter = 印表機(&P) -Menu.SearchComputers = 電腦(&C) -Menu.UserFilesTip = 包含 [文件]、[圖片]、[音樂] 資料夾,以及其他屬於您的檔案。 -Menu.UserDocumentsTip = 包含信件、報告、其他文件和檔案。 -Menu.UserPicturesTip = 包含數位相片、影像和圖形檔案。 -Menu.UserMusicTip = 包含音樂和其他音訊檔案。 -Menu.UserVideosTip = 包含影片和其他視訊檔案。 -Menu.NetworkTip = 顯示這台電腦目前的網路連線,並協助您建立新連線。 -Menu.PrintersTip = 新增、移除和設定本機及網路印表機。 -Menu.TaskbarTip = 自訂開始功能表和工作列,例如要顯示的項目類型和顯示的方式。 -Menu.ControlPanelTip = 變更設定和自訂電腦的功能。 -Menu.DocumentsLibTip = 存取信件、報告、筆記及其他類型的文件。 -Menu.MusicLibTip = 播放音樂及其他音訊檔案。 -Menu.PicturesLibTip = 檢視及管理數位圖片。 -Menu.VideosLibTip = 觀看家庭影片及其他數位視訊。 -Menu.RecordingsLibTip = 觀看電腦上錄製的電視節目。 -Menu.DownloadTip = 尋找網際網路下載與我的最愛網站的連結。 -Menu.HomegroupTip = 存取家用群組中其他人共用的媒體櫃與資料夾。 -Menu.RunTip = 開啟程式、資料夾、文件或網站。 -Menu.HelpTip = 尋找說明主題、教學課程、疑難排解和其他支援服務。 -Menu.ProgramsTip = 開啟程式清單。 -Menu.SearchFilesTip = 搜尋文件、音樂、圖片及電子郵件等等。 -Menu.GamesTip = 玩和管理您電腦上的遊戲。 -Menu.SecurityTip = 啟動 [Windows 安全性選項] 以變更密碼、切換使用者或啟動工作管理員。 -Menu.SearchComputersTip = 搜尋網路上的電腦 -Menu.SearchPrintersTip = 搜尋印表機 -Menu.AdminToolsTip = 設定電腦的系統管理設定。 -Menu.ShutdownTip = 關閉所有開啟的程式、關閉 Windows,然後關閉您的電腦。 -Menu.RestartTip = 關閉所有開啟的程式、關閉 Windows,然後重新啟動 Windows。 -Menu.SleepTip = 將您的工作階段保留在記憶體中,並且讓電腦處於低電源狀態,如此您就能夠快速地恢復工作。 -Menu.HibernateTip = 儲存您的工作階段,並且關閉電腦。當您開啟電腦時,Windows 會還原您的工作階段。 -Menu.LogOffTip = 關閉程式並登出。 -Menu.DisconnectTip = 中斷您的工作階段連線。下次重新登入時,可以重新連線。 -Menu.LockTip = 鎖定此電腦。 -Menu.UndockTip = 將筆記型電腦從船塢中卸除。 -Menu.SwitchUserTip = 切換使用者 (不關閉程式)。 -Menu.Empty = (空白) -Menu.Features = 程式和功能 -Menu.FeaturesTip = 解除安裝或變更您電腦上的程式。 -Menu.SearchPeople = 人員(&P)... -Menu.SortByName = 依名稱排序(&B) -Menu.Open = 開啟(&O) -Menu.OpenAll = 開啟所有使用者(&P) -Menu.Explore = 檔案總管(&E) -Menu.ExploreAll = 瀏覽所有使用者(&X) -Menu.MenuSettings = 設定 -Menu.MenuHelp = 說明 -Menu.MenuExit = 結束 -Menu.LogoffTitle = 登出 Windows -Menu.LogoffPrompt = 您確定要登出? -Menu.LogoffYes = 登出(&L) -Menu.LogoffNo = 否(&N) -Menu.RenameTitle = 重新命名 -Menu.RenamePrompt = 新名稱(&N): -Menu.RenameOK = 確定 -Menu.RenameCancel = 取消 -Menu.Organize = 組織 [開始] 功能表 -Menu.Expand = 展開(&A) -Menu.Collapse = 摺疊(&A) -Menu.NewFolder = 新增資料夾 -Menu.NewShortcut = 新增捷徑 -Menu.AutoArrange = 自動排列(&A) -Menu.ActionOpen = 開啟 -Menu.ActionClose = 關閉 -Menu.ActionExecute = 執行 -Menu.RemoveList = 從清單中移除(&F) -Menu.RemoveAll = 清除最近使用的項目清單(&L) -Menu.Explorer = Windows 檔案總管 -Menu.Start = 開始 -Menu.StartScreen = [開始] 畫面 -Menu.StartMenu = [開始] 功能表 (Windows) -Menu.PinStart = 釘選到 [開始] 功能表 -Menu.PinStartCs = 釘選到 [開始] 功能表 (Open-Shell) -Menu.UnpinStartCs = 從 [開始] 功能表取消釘選 (Open-Shell) -Menu.MonitorOff = 關閉顯示 -Menu.RemoveHighlight = 移除醒目提示 -Menu.Uninstall = 解除安裝(&U) -Menu.UninstallTitle = 解除安裝 -Menu.UninstallPrompt = 您確定要從電腦解除安裝 %s 嗎? -Search.CategorySettings = 設定 -Search.CategoryPCSettings = 電腦設定 -Search.CategoryPrograms = 程式 -Search.CategoryDocuments = 文件 -Search.CategoryMusic = 音樂 -Search.CategoryPictures = 圖片 -Search.CategoryVideos = 影片 -Search.CategoryFiles = 檔案 -Search.CategoryInternet = 網際網路 -JumpList.Recent = 最近 -JumpList.Frequent = 常用 -JumpList.Tasks = 工作 -JumpList.Pinned = 已釘選 -JumpList.Pin = 釘選到這個清單(&I) -JumpList.Unpin = 從這個清單取消釘選(&U) -JumpList.Remove = 從清單中移除(&F) -JumpList.PinTip = 釘選到這個清單 -JumpList.UnpinTip = 從這個清單取消釘選 diff --git a/README.md b/README.md index de91f0959..f05fed121 100644 --- a/README.md +++ b/README.md @@ -1,24 +1,33 @@ -## Open-Shell ![Open-Shell](/Src/Setup/OpenShell.ico) + + + +# Open-Shell + +A collection of utilities bringing back classic features to Windows. *Originally* **[Classic Shell](http://www.classicshell.net)** *by [Ivo Beltchev](https://sourceforge.net/u/ibeltchev/profile/)* -[![GitHub Release](https://img.shields.io/github/release/Open-Shell/Open-Shell-Menu.svg)](https://github.com/Open-Shell/Open-Shell-Menu/releases) [![GitHub Pre-Release](https://img.shields.io/github/release/Open-Shell/Open-Shell-Menu/all.svg)](https://github.com/Open-Shell/Open-Shell-Menu/releases) [![Build status](https://ci.appveyor.com/api/projects/status/2wj5x5qoypfjj0tr/branch/master?svg=true)](https://ci.appveyor.com/project/passionate-coder/open-shell-menu/branch/master) [![GitQ](https://gitq.com/badge.svg)](https://gitq.com/passionate-coder/Classic-Start) [![Gitter chat](https://badges.gitter.im/gitterHQ/gitter.png)](https://gitter.im/open-shell/Lobby) [![Discord](https://img.shields.io/discord/757701054782636082?color=%4E5D94&label=Discord&logo=discord&logoColor=white)](https://discord.gg/7H6arr5) +[![GitHub Release](https://img.shields.io/github/release/Open-Shell/Open-Shell-Menu.svg?style=flat-square)](https://github.com/Open-Shell/Open-Shell-Menu/releases/latest)  [![GitHub Pre-Release](https://img.shields.io/github/release/Open-Shell/Open-Shell-Menu/all.svg?style=flat-square)](https://github.com/Open-Shell/Open-Shell-Menu/releases)  [![Build](https://github.com/Open-Shell/Open-Shell-Menu/actions/workflows/build.yml/badge.svg)](https://github.com/Open-Shell/Open-Shell-Menu/actions/workflows/build.yml)  [![Build status](https://img.shields.io/appveyor/build/passionate-coder/Open-Shell-Menu?logo=appveyor&style=flat-square)](https://ci.appveyor.com/project/passionate-coder/open-shell-menu/branch/master)  [![GitQ](https://img.shields.io/badge/gitq-discussions-1577fa?style=flat-square)](https://gitq.com/passionate-coder/Classic-Start)  [![Gitter chat](https://img.shields.io/gitter/room/badges/shields.svg?color=lightseagreen&logo=gitter&style=flat-square)](https://gitter.im/open-shell/Lobby)  [![Discord](https://img.shields.io/discord/757701054782636082?color=mediumslateblue&label=Discord&logo=discord&logoColor=white&style=flat-square)](https://discord.gg/7H6arr5) -[Home Page](https://open-shell.github.io/Open-Shell-Menu) -[Gitter Discussion room](https://gitter.im/Open-Shell) -[Latest nightly build](https://ci.appveyor.com/project/passionate-coder/open-shell-menu/branch/master/artifacts) +[Open-Shell Homepage](https://open-shell.github.io/Open-Shell-Menu) ### Features -- Classic style Start Menu for Windows 7, 8, 8.1, 10 +- Classic style Start menu for Windows 7, 8, 8.1, 10, and 11 - Toolbar for Windows Explorer +- Explorer status bar with file size and disk space - Classic copy UI (Windows 7 only) -- Show file size in Explorer status bar - Title bar and status bar for Internet Explorer ### Download -If you just want to use it or looking for setup file, click here to download: +You can find the latest stable version here: + +[![GitHub All Releases](https://img.shields.io/github/downloads/Open-Shell/Open-Shell-Menu/total?style=for-the-badge&color=4bc2ee&logo=github)](https://github.com/Open-Shell/Open-Shell-Menu/releases/latest) -[![GitHub All Releases](https://img.shields.io/github/downloads/Open-Shell/Open-Shell-Menu/total?style=for-the-badge)](https://github.com/Open-Shell/Open-Shell-Menu/releases) +> [!IMPORTANT] +> #### Windows for ARM compatibility +> Open-Shell is compatible with Windows for ARM since version [4.4.196](https://github.com/Open-Shell/Open-Shell-Menu/releases/tag/v4.4.196). +> +> If you install older one on a Windows for ARM installation (ex. using Parallels Desktop on an Apple Silicon Mac), you will no longer be able to log into your account the next time you reboot. Please refrain from installing Open-Shell on Windows for ARM. ### Temporary Translation/Language Solution 1. Download [language DLL](https://coddec.github.io/Classic-Shell/www.classicshell.net/translations/index.html) @@ -29,6 +38,6 @@ If you just want to use it or looking for setup file, click here to download: *For archival reasons, we have a mirror of `www.classicshell.net` [here](https://coddec.github.io/Classic-Shell/www.classicshell.net/).* [How To Skin a Start Menu](https://coddec.github.io/Classic-Shell/www.classicshell.net/tutorials/skintutorial.html) -[Classic Shell - Custom Start Buttons](https://coddec.github.io/Classic-Shell/www.classicshell.net/tutorials/buttontutorial.html) +[Classic Shell: Custom Start Buttons](https://coddec.github.io/Classic-Shell/www.classicshell.net/tutorials/buttontutorial.html) [Questions? Ask on the Discussions section](https://github.com/Open-Shell/Open-Shell-Menu/discussions) or on [Discord](https://discord.gg/7H6arr5) -[Report a bug/issue or submit a feature request](https://github.com/Open-Shell/Open-Shell-Menu/issues) +[Submit a bug report/feature request](https://github.com/Open-Shell/Open-Shell-Menu/issues) diff --git a/Src/BUILDME.txt b/Src/BUILDME.txt index 4e9384964..b9ed47e5b 100644 --- a/Src/BUILDME.txt +++ b/Src/BUILDME.txt @@ -5,12 +5,12 @@ for other languages. The final files (installers, archives) are saved to the Setup\Final folder. You need the following tools: -Visual Studio 2019 (Community Edition is enough) +Visual Studio 2022 (Community Edition is enough) - Desktop development with C++ workload - - Windows 10 SDK (10.0.19041.0) for Desktop C++ + - Windows 11 SDK (10.0.22621.0) for Desktop C++ - Visual C++ ATL support HTML Help Workshop -WiX 3.7 +WiX 3.14 7-Zip It is possible to convert the projects to newer versions of Visual Studio and newer SDKs. Newer versions of WiX will probably work fine. diff --git a/Src/ClassicExplorer/ClassicCopyExt.h b/Src/ClassicExplorer/ClassicCopyExt.h index 9b02cbddc..dcf65d4a4 100644 --- a/Src/ClassicExplorer/ClassicCopyExt.h +++ b/Src/ClassicExplorer/ClassicCopyExt.h @@ -7,7 +7,7 @@ #pragma once #include "resource.h" // main symbols -#include "ClassicExplorer_i.h" +#include "ClassicExplorer_h.h" #include // CClassicCopyExt diff --git a/Src/ClassicExplorer/ClassicExplorer.cpp b/Src/ClassicExplorer/ClassicExplorer.cpp index 028891208..82f638225 100644 --- a/Src/ClassicExplorer/ClassicExplorer.cpp +++ b/Src/ClassicExplorer/ClassicExplorer.cpp @@ -6,7 +6,7 @@ #include "stdafx.h" #include "resource.h" -#include "ClassicExplorer_i.h" +#include "ClassicExplorer_h.h" #include "dllmain.h" // Used to determine whether the DLL can be unloaded by OLE diff --git a/Src/ClassicExplorer/ClassicExplorer.vcxproj b/Src/ClassicExplorer/ClassicExplorer.vcxproj index d53ba9d65..2ec90585b 100644 --- a/Src/ClassicExplorer/ClassicExplorer.vcxproj +++ b/Src/ClassicExplorer/ClassicExplorer.vcxproj @@ -1,6 +1,14 @@ + + Debug + ARM64 + + + Debug + ARM64EC + Debug Win32 @@ -9,6 +17,14 @@ Debug x64 + + Release + ARM64 + + + Release + ARM64EC + Release Win32 @@ -17,6 +33,14 @@ Release x64 + + Setup + ARM64 + + + Setup + ARM64EC + Setup Win32 @@ -33,337 +57,54 @@ 10.0 - + DynamicLibrary - v142 - Static - Unicode - true - - - DynamicLibrary - v142 - Static - Unicode - true - - - DynamicLibrary - v142 - Static - Unicode - - - DynamicLibrary - v142 - Static - Unicode - true - - - DynamicLibrary - v142 - Static - Unicode - true - - - DynamicLibrary - v142 + $(DefaultPlatformToolset) Static Unicode + true - - - - - - - - - - - - - - - - - - - - - - - + + - - $(Configuration)\ - $(Configuration)\ - true - true + $(ProjectName)32 - - $(Configuration)64\ - $(Configuration)64\ - true - true + $(ProjectName)64 - - $(Configuration)\ - $(Configuration)\ - true - false - $(ProjectName)32 - - - $(Configuration)64\ - $(Configuration)64\ - true - false + $(ProjectName)64 - - $(Configuration)\ - $(Configuration)\ - true - false - $(ProjectName)32 + + $(ProjectName)64 + true - - $(Configuration)64\ - $(Configuration)64\ + true - false - $(ProjectName)64 - - - _DEBUG;%(PreprocessorDefinitions) - false - true - ClassicExplorer_i.h - - ClassicExplorer_i.c - ClassicExplorer_p.c - true - + - Disabled - ..\Lib;%(AdditionalIncludeDirectories) - WIN32;_WINDOWS;_DEBUG;_USRDLL;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - Use - Level3 - EditAndContinue - true - true - stdcpp17 + _USRDLL;%(PreprocessorDefinitions) - _DEBUG;%(PreprocessorDefinitions) - $(IntDir);..\Lib;%(AdditionalIncludeDirectories) + $(IntDir);%(AdditionalIncludeDirectories) - true oleacc.lib;comctl32.lib;uxtheme.lib;dwmapi.lib;winmm.lib;htmlhelp.lib;wininet.lib;wintrust.lib;crypt32.lib;Netapi32.lib;%(AdditionalDependencies) - .\$(TargetName).def - true - Windows - true + $(TargetName).def - - - _DEBUG;%(PreprocessorDefinitions) - false - true - ClassicExplorer_i.h - - ClassicExplorer_i.c - ClassicExplorer_p.c - - - Disabled - ..\Lib;%(AdditionalIncludeDirectories) - WIN32;_WINDOWS;_DEBUG;_USRDLL;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - Use - Level3 - ProgramDatabase - true - true - stdcpp17 - - - _DEBUG;%(PreprocessorDefinitions) - $(IntDir);..\Lib;%(AdditionalIncludeDirectories) - + true - oleacc.lib;comctl32.lib;uxtheme.lib;dwmapi.lib;winmm.lib;htmlhelp.lib;wininet.lib;wintrust.lib;crypt32.lib;Netapi32.lib;%(AdditionalDependencies) - .\$(TargetName).def - true - Windows true - - - NDEBUG;%(PreprocessorDefinitions) - false - true - ClassicExplorer_i.h - - ClassicExplorer_i.c - ClassicExplorer_p.c - true - - - MaxSpeed - ..\Lib;%(AdditionalIncludeDirectories) - WIN32;_WINDOWS;NDEBUG;_USRDLL;%(PreprocessorDefinitions) - MultiThreaded - Use - Level3 - ProgramDatabase - true - true - stdcpp17 - - - NDEBUG;%(PreprocessorDefinitions) - $(IntDir);..\Lib;%(AdditionalIncludeDirectories) - - - true - oleacc.lib;comctl32.lib;uxtheme.lib;dwmapi.lib;winmm.lib;htmlhelp.lib;wininet.lib;wintrust.lib;crypt32.lib;Netapi32.lib;%(AdditionalDependencies) - .\$(TargetName).def - true - Windows - true - true - true - - - - - NDEBUG;%(PreprocessorDefinitions) - false - true - ClassicExplorer_i.h - - ClassicExplorer_i.c - ClassicExplorer_p.c - - - MaxSpeed - ..\Lib;%(AdditionalIncludeDirectories) - WIN32;_WINDOWS;NDEBUG;_USRDLL;%(PreprocessorDefinitions) - MultiThreaded - Use - Level3 - ProgramDatabase - true - true - stdcpp17 - - - NDEBUG;%(PreprocessorDefinitions) - $(IntDir);..\Lib;%(AdditionalIncludeDirectories) - - - true - oleacc.lib;comctl32.lib;uxtheme.lib;dwmapi.lib;winmm.lib;htmlhelp.lib;wininet.lib;wintrust.lib;crypt32.lib;Netapi32.lib;%(AdditionalDependencies) - .\$(TargetName).def - true - Windows - true - true - true - - - - - NDEBUG;%(PreprocessorDefinitions) - false - true - ClassicExplorer_i.h - - ClassicExplorer_i.c - ClassicExplorer_p.c - true - - - MaxSpeed - ..\Lib;%(AdditionalIncludeDirectories) - WIN32;_WINDOWS;NDEBUG;_USRDLL;BUILD_SETUP;%(PreprocessorDefinitions) - MultiThreaded - Use - Level3 - true - ProgramDatabase - true - true - stdcpp17 - - - NDEBUG;%(PreprocessorDefinitions) - $(IntDir);..\Lib;%(AdditionalIncludeDirectories) - - - oleacc.lib;comctl32.lib;uxtheme.lib;dwmapi.lib;winmm.lib;htmlhelp.lib;wininet.lib;wintrust.lib;crypt32.lib;Netapi32.lib;%(AdditionalDependencies) - .\$(TargetName).def - true - Windows - true - true - - - - - NDEBUG;%(PreprocessorDefinitions) - false - true - ClassicExplorer_i.h - - ClassicExplorer_i.c - ClassicExplorer_p.c - - - MaxSpeed - ..\Lib;%(AdditionalIncludeDirectories) - WIN32;_WINDOWS;NDEBUG;_USRDLL;BUILD_SETUP;%(PreprocessorDefinitions) - MultiThreaded - Use - Level3 - true - ProgramDatabase - true - true - stdcpp17 - - - NDEBUG;%(PreprocessorDefinitions) - $(IntDir);..\Lib;%(AdditionalIncludeDirectories) - - - oleacc.lib;comctl32.lib;uxtheme.lib;dwmapi.lib;winmm.lib;htmlhelp.lib;wininet.lib;wintrust.lib;crypt32.lib;Netapi32.lib;%(AdditionalDependencies) - .\$(TargetName).def - true - Windows - true - true - - @@ -390,7 +131,9 @@ - + + PreserveNewest + @@ -398,7 +141,7 @@ - + diff --git a/Src/ClassicExplorer/ClassicExplorer.vcxproj.filters b/Src/ClassicExplorer/ClassicExplorer.vcxproj.filters index b6c1eadd8..419ebce35 100644 --- a/Src/ClassicExplorer/ClassicExplorer.vcxproj.filters +++ b/Src/ClassicExplorer/ClassicExplorer.vcxproj.filters @@ -114,7 +114,7 @@ Resource Files - + Generated Files @@ -146,4 +146,4 @@ Resource Files - + \ No newline at end of file diff --git a/Src/ClassicExplorer/ClassicExplorerSettings/ClassicExplorerSettings.vcxproj b/Src/ClassicExplorer/ClassicExplorerSettings/ClassicExplorerSettings.vcxproj index 4bbe79540..592247fb7 100644 --- a/Src/ClassicExplorer/ClassicExplorerSettings/ClassicExplorerSettings.vcxproj +++ b/Src/ClassicExplorer/ClassicExplorerSettings/ClassicExplorerSettings.vcxproj @@ -21,128 +21,26 @@ 10.0 - + Application - v142 - Static - Unicode - true - - - Application - v142 - Static - Unicode - true - - - Application - v142 + $(DefaultPlatformToolset) Static Unicode + true - - - - - - - - - - - + + - - ..\$(Configuration)\ - $(Configuration)\ - true - - - ..\$(Configuration)\ - $(Configuration)\ - false - - - ..\$(Configuration)\ - $(Configuration)\ - false - - - - Disabled - ..\..\Lib;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - Level3 - true - EditAndContinue - true - true - stdcpp17 - - - _DEBUG;%(PreprocessorDefinitions) - - - shlwapi.lib;comctl32.lib;psapi.lib;%(AdditionalDependencies) - true - Windows - - - - - MaxSpeed - ..\..\Lib;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) - MultiThreaded - true - Level3 - true - ProgramDatabase - true - true - stdcpp17 - - - NDEBUG;%(PreprocessorDefinitions) - - - shlwapi.lib;comctl32.lib;psapi.lib;%(AdditionalDependencies) - true - Windows - true - true - - - + - MaxSpeed - ..\..\Lib;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_WINDOWS;BUILD_SETUP;%(PreprocessorDefinitions) - MultiThreaded - true - Level3 - true - ProgramDatabase - true - true - stdcpp17 + NotUsing - - NDEBUG;%(PreprocessorDefinitions) - shlwapi.lib;comctl32.lib;psapi.lib;%(AdditionalDependencies) - true - Windows - true - true diff --git a/Src/ClassicExplorer/ExplorerBHO.cpp b/Src/ClassicExplorer/ExplorerBHO.cpp index 9448d8e96..cfd456364 100644 --- a/Src/ClassicExplorer/ExplorerBHO.cpp +++ b/Src/ClassicExplorer/ExplorerBHO.cpp @@ -64,6 +64,9 @@ LRESULT CALLBACK CExplorerBHO::SubclassTreeParentProc( HWND hWnd, UINT uMsg, WPA // - change the tree styles to achieve different looks LRESULT CALLBACK CExplorerBHO::SubclassTreeProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, UINT_PTR uIdSubclass, DWORD_PTR dwRefData ) { + if (GetTlsData()->bho == NULL) + return DefSubclassProc(hWnd, uMsg, wParam, lParam); + if (uMsg==TVM_ENSUREVISIBLE && (dwRefData&1)) { // HACK! there is a bug in Win7 Explorer and when the selected folder is expanded for the first time it sends TVM_ENSUREVISIBLE for @@ -240,7 +243,7 @@ LRESULT CALLBACK CExplorerBHO::HookExplorer( int nCode, WPARAM wParam, LPARAM lP if (GetClassName(parent,name,_countof(name)) && _wcsicmp(name,L"CabinetWClass")==0) { DWORD_PTR settings=0; - if (GetWinVersion()==WIN_VER_WIN7 && GetSettingBool(L"FixFolderScroll")) + if (GetSettingBool(L"FixFolderScroll")) settings|=1; SetWindowSubclass(hWnd,SubclassTreeProc,'CLSH',settings); PostMessage(hWnd,TVM_SETEXTENDEDSTYLE,TVS_EX_FADEINOUTEXPANDOS|TVS_EX_AUTOHSCROLL|0x80000000,0); diff --git a/Src/ClassicExplorer/ExplorerBHO.h b/Src/ClassicExplorer/ExplorerBHO.h index e76c18407..83189bb7a 100644 --- a/Src/ClassicExplorer/ExplorerBHO.h +++ b/Src/ClassicExplorer/ExplorerBHO.h @@ -9,7 +9,7 @@ #include #include -#include "ClassicExplorer_i.h" +#include "ClassicExplorer_h.h" #include "ComHelper.h" #include @@ -53,7 +53,7 @@ class ATL_NO_VTABLE CExplorerBHO : m_ZoneWidth=0; } - DECLARE_REGISTRY_RESOURCEID(IDR_EXPLORERBHO) + DECLARE_REGISTRY_RESOURCEID_V2_WITHOUT_MODULE(IDR_EXPLORERBHO, CExplorerBHO) BEGIN_SINK_MAP( CExplorerBHO ) SINK_ENTRY_EX(1, DIID_DWebBrowserEvents2, DISPID_DOCUMENTCOMPLETE, OnDocumentComplete) diff --git a/Src/ClassicExplorer/ExplorerBand.h b/Src/ClassicExplorer/ExplorerBand.h index 54f79988e..ee8af4de9 100644 --- a/Src/ClassicExplorer/ExplorerBand.h +++ b/Src/ClassicExplorer/ExplorerBand.h @@ -6,7 +6,7 @@ #pragma once #include "resource.h" -#include "ClassicExplorer_i.h" +#include "ClassicExplorer_h.h" #include "SettingsParser.h" #include @@ -178,7 +178,7 @@ class ATL_NO_VTABLE CExplorerBand : public: CExplorerBand( void ); - DECLARE_REGISTRY_RESOURCEID(IDR_EXPLORERBAND) + DECLARE_REGISTRY_RESOURCEID_V2_WITHOUT_MODULE(IDR_EXPLORERBAND, CExplorerBand) BEGIN_SINK_MAP( CExplorerBand ) SINK_ENTRY_EX(1, DIID_DWebBrowserEvents2, DISPID_NAVIGATECOMPLETE2, OnNavigateComplete) diff --git a/Src/ClassicExplorer/SettingsUI.cpp b/Src/ClassicExplorer/SettingsUI.cpp index f70b77a5e..458500eba 100644 --- a/Src/ClassicExplorer/SettingsUI.cpp +++ b/Src/ClassicExplorer/SettingsUI.cpp @@ -380,7 +380,7 @@ LRESULT CEditToolbarDlg::OnBrowseLink( WORD wNotifyCode, WORD wID, HWND hWndCtl, { wchar_t text[_MAX_PATH]; GetDlgItemText(IDC_COMBOLINK,text,_countof(text)); - if (BrowseLinkHelper(m_hWnd,text)) + if (BrowseLinkHelper(m_hWnd,text,false)) { SetDlgItemText(IDC_COMBOLINK,text); SendMessage(WM_COMMAND,MAKEWPARAM(IDC_COMBOLINK,CBN_KILLFOCUS)); @@ -621,7 +621,7 @@ void UpdateSettings( void ) UpdateSetting(L"ShowCaption",CComVariant(0),false); HideSetting(L"ShowCaption",true); UpdateSetting(L"ShowIcon",CComVariant(0),false); HideSetting(L"ShowIcon",true); - UpdateSetting(L"FixFolderScroll",CComVariant(0),false); HideSetting(L"FixFolderScroll",true); + UpdateSetting(L"FixFolderScroll",CComVariant(0),false); UpdateSetting(L"ToolbarItems",CComVariant(g_DefaultToolbar2),false); if (GetWinVersion()>=WIN_VER_WIN10) diff --git a/Src/ClassicExplorer/ShareOverlay.h b/Src/ClassicExplorer/ShareOverlay.h index 3ed4d0306..8bb266f7f 100644 --- a/Src/ClassicExplorer/ShareOverlay.h +++ b/Src/ClassicExplorer/ShareOverlay.h @@ -8,7 +8,7 @@ #include "resource.h" // main symbols #include -#include "ClassicExplorer_i.h" +#include "ClassicExplorer_h.h" // CShareOverlay @@ -20,7 +20,7 @@ class ATL_NO_VTABLE CShareOverlay : public: CShareOverlay( void ); - DECLARE_REGISTRY_RESOURCEID(IDR_SHAREOVERLAY) + DECLARE_REGISTRY_RESOURCEID_V2_WITHOUT_MODULE(IDR_SHAREOVERLAY, CShareOverlay) DECLARE_PROTECT_FINAL_CONSTRUCT() diff --git a/Src/ClassicExplorer/dllmain.cpp b/Src/ClassicExplorer/dllmain.cpp index 42adb2eef..d841361ee 100644 --- a/Src/ClassicExplorer/dllmain.cpp +++ b/Src/ClassicExplorer/dllmain.cpp @@ -48,11 +48,6 @@ static int g_LoadDialogs[]= 0 }; -const wchar_t *GetDocRelativePath( void ) -{ - return DOC_PATH; -} - struct FindChild { const wchar_t *className; @@ -110,7 +105,7 @@ static DWORD CALLBACK DllInitThread( void* ) GetModuleFileName(g_Instance,path,_countof(path)); *PathFindFileName(path)=0; wchar_t fname[_MAX_PATH]; - Sprintf(fname,_countof(fname),L"%s" INI_PATH L"ExplorerL10N.ini",path); + Sprintf(fname,_countof(fname),L"%sExplorerL10N.ini",path); CString language=GetSettingString(L"Language"); ParseTranslations(fname,language); diff --git a/Src/ClassicExplorer/dllmain.h b/Src/ClassicExplorer/dllmain.h index 23f88889c..b4920c469 100644 --- a/Src/ClassicExplorer/dllmain.h +++ b/Src/ClassicExplorer/dllmain.h @@ -5,7 +5,7 @@ // dllmain.h : Declaration of module class. #pragma once -#include "ClassicExplorer_i.h" +#include "ClassicExplorer_h.h" #include class CClassicExplorerModule : public CAtlDllModuleT< CClassicExplorerModule > diff --git a/Src/ClassicExplorer/stdafx.h b/Src/ClassicExplorer/stdafx.h index 76735f23e..dc1200470 100644 --- a/Src/ClassicExplorer/stdafx.h +++ b/Src/ClassicExplorer/stdafx.h @@ -10,7 +10,7 @@ #define _ATL_APARTMENT_THREADED #define _ATL_NO_AUTOMATIC_NAMESPACE - +#define _ATL_MODULES // compatibility with /permissive- #define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS // some CString constructors will be explicit #include "resource.h" @@ -26,12 +26,4 @@ using namespace ATL; #include #include -#ifdef BUILD_SETUP -#define INI_PATH L"" -#define DOC_PATH L"" -#else -#define INI_PATH L"..\\" -#define DOC_PATH L"..\\..\\Docs\\Help\\" -#endif - #include "StringUtils.h" diff --git a/Src/ClassicIE/ClassicIE.vcxproj b/Src/ClassicIE/ClassicIE.vcxproj index 42b34e621..83f8308ba 100644 --- a/Src/ClassicIE/ClassicIE.vcxproj +++ b/Src/ClassicIE/ClassicIE.vcxproj @@ -1,6 +1,10 @@ + + Debug + ARM64 + Debug Win32 @@ -9,6 +13,10 @@ Debug x64 + + Release + ARM64 + Release Win32 @@ -17,6 +25,10 @@ Release x64 + + Setup + ARM64 + Setup Win32 @@ -33,236 +45,35 @@ 10.0 - - Application - v142 - Static - Unicode - true - - - Application - v142 - Static - Unicode - true - - - Application - v142 - Static - Unicode - - + Application - v142 - Static - Unicode - true - - - Application - v142 - Static - Unicode - true - - - Application - v142 + $(DefaultPlatformToolset) Static Unicode + true - - - - - - - - - - - - - - - - - - - - - - - + + - - $(Configuration)\ - $(Configuration)\ - true + $(ProjectName)_32 - - $(Configuration)64\ - $(Configuration)64\ - true + $(ProjectName)_64 - - $(Configuration)\ - $(Configuration)\ - false - $(ProjectName)_32 - - - $(Configuration)64\ - $(Configuration)64\ - false - $(ProjectName)_64 - - - $(Configuration)\ - $(Configuration)\ - false - $(ProjectName)_32 - - - $(Configuration)64\ - $(Configuration)64\ - false + $(ProjectName)_64 - - - Disabled - ..\Lib;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - NotUsing - Level3 - EditAndContinue - true - true - stdcpp17 - - - shlwapi.lib;comctl32.lib;psapi.lib;%(AdditionalDependencies) - true - Windows - - - - - Disabled - ..\Lib;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - NotUsing - Level3 - ProgramDatabase - true - true - stdcpp17 - - - shlwapi.lib;comctl32.lib;psapi.lib;%(AdditionalDependencies) - true - Windows - - - - - MaxSpeed - ..\Lib;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) - MultiThreaded - true - NotUsing - Level3 - ProgramDatabase - true - true - stdcpp17 - - - shlwapi.lib;comctl32.lib;psapi.lib;%(AdditionalDependencies) - true - Windows - true - true - - - - - MaxSpeed - ..\Lib;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) - MultiThreaded - true - NotUsing - Level3 - ProgramDatabase - true - true - stdcpp17 - - - shlwapi.lib;comctl32.lib;psapi.lib;%(AdditionalDependencies) - true - Windows - true - true - - - - - MaxSpeed - ..\Lib;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_WINDOWS;BUILD_SETUP;%(PreprocessorDefinitions) - MultiThreaded - true - NotUsing - Level3 - ProgramDatabase - true - true - stdcpp17 - - - shlwapi.lib;comctl32.lib;psapi.lib;%(AdditionalDependencies) - true - Windows - true - true - - - + - MaxSpeed - ..\Lib;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) - MultiThreaded - true NotUsing - Level3 - ProgramDatabase - true - true - stdcpp17 shlwapi.lib;comctl32.lib;psapi.lib;%(AdditionalDependencies) - true - Windows - true - true diff --git a/Src/ClassicIE/ClassicIEDLL/ClassicIEBHO.cpp b/Src/ClassicIE/ClassicIEDLL/ClassicIEBHO.cpp index 2393f56a2..5322fcf92 100644 --- a/Src/ClassicIE/ClassicIEDLL/ClassicIEBHO.cpp +++ b/Src/ClassicIE/ClassicIEDLL/ClassicIEBHO.cpp @@ -3,7 +3,7 @@ // Confidential information of Ivo Beltchev. Not for disclosure or distribution without prior written consent from the author #include "stdafx.h" -#include "ClassicIEDLL_i.h" +#include "ClassicIEDLL_h.h" #include "ClassicIEBHO.h" #include "ClassicIEDLL.h" #include "Settings.h" diff --git a/Src/ClassicIE/ClassicIEDLL/ClassicIEDLL.cpp b/Src/ClassicIE/ClassicIEDLL/ClassicIEDLL.cpp index b35fd84ee..733d11564 100644 --- a/Src/ClassicIE/ClassicIEDLL/ClassicIEDLL.cpp +++ b/Src/ClassicIE/ClassicIEDLL/ClassicIEDLL.cpp @@ -4,7 +4,7 @@ #include "stdafx.h" #include "resource.h" -#include "ClassicIEDLL_i.h" +#include "ClassicIEDLL_h.h" #include "ClassicIEDLL.h" #include "Settings.h" #include "dllmain.h" diff --git a/Src/ClassicIE/ClassicIEDLL/ClassicIEDLL.rc b/Src/ClassicIE/ClassicIEDLL/ClassicIEDLL.rc index 9d163d852..cd2e5dfd0 100644 --- a/Src/ClassicIE/ClassicIEDLL/ClassicIEDLL.rc +++ b/Src/ClassicIE/ClassicIEDLL/ClassicIEDLL.rc @@ -135,17 +135,17 @@ BEGIN IDS_LANGUAGE_SETTINGS "Language" IDS_CAPTION_FONT "Caption font" IDS_CAPTION_FONT_TIP "Select the font and text size to use for the caption" - IDS_TEXT_COLOR "Text color" + IDS_TEXT_COLOR "Text color (RRGGBB)" IDS_TEXT_COLOR_TIP "Select the color for the caption text" - IDS_MAXTEXT_COLOR "Text color (maximized)" + IDS_MAXTEXT_COLOR "Text color (maximized) (RRGGBB)" IDS_MAXTEXT_COLOR_TIP "Select the color for the caption text when the window is maximized" - IDS_INTEXT_COLOR "Text color (inactive)" + IDS_INTEXT_COLOR "Text color (inactive) (RRGGBB)" IDS_INTEXT_COLOR_TIP "Select the color for the caption text when the window is inactive" - IDS_MAXINTEXT_COLOR "Text color (maximized, inactive)" + IDS_MAXINTEXT_COLOR "Text color (maximized, inactive) (RRGGBB)" IDS_MAXINTEXT_COLOR_TIP "Select the color for the caption text when the window is maximized and inactive" IDS_GLOW "Text glow" IDS_GLOW_TIP "When this is checked, the text will have a glow around it" - IDS_GLOW_COLOR "Glow color" + IDS_GLOW_COLOR "Glow color (RRGGBB)" IDS_GLOW_COLOR_TIP "Select the color for the caption glow" END @@ -153,7 +153,7 @@ STRINGTABLE BEGIN IDS_MAXGLOW "Text glow (maximized)" IDS_MAXGLOW_TIP "When this is checked, the text in the maximized window will have a glow around it" - IDS_MAXGLOW_COLOR "Glow color (maximized)" + IDS_MAXGLOW_COLOR "Glow color (maximized) (RRGGBB)" IDS_MAXGLOW_COLOR_TIP "Select the color for the caption glow when the window is maximized" IDS_STATUS_SETTINGS "Status Bar" IDS_SHOW_PROGRESS "Show progress" diff --git a/Src/ClassicIE/ClassicIEDLL/ClassicIEDLL.vcxproj b/Src/ClassicIE/ClassicIEDLL/ClassicIEDLL.vcxproj index 593f173a4..10ea42734 100644 --- a/Src/ClassicIE/ClassicIEDLL/ClassicIEDLL.vcxproj +++ b/Src/ClassicIE/ClassicIEDLL/ClassicIEDLL.vcxproj @@ -1,6 +1,14 @@ + + Debug + ARM64 + + + Debug + ARM64EC + Debug Win32 @@ -9,6 +17,14 @@ Debug x64 + + Release + ARM64 + + + Release + ARM64EC + Release Win32 @@ -17,6 +33,14 @@ Release x64 + + Setup + ARM64 + + + Setup + ARM64EC + Setup Win32 @@ -33,323 +57,51 @@ 10.0 - - DynamicLibrary - v142 - Static - Unicode - true - - - DynamicLibrary - v142 - Static - Unicode - true - - - DynamicLibrary - v142 - Static - Unicode - - - DynamicLibrary - v142 - Static - Unicode - true - - - DynamicLibrary - v142 - Static - Unicode - true - - + DynamicLibrary - v142 + $(DefaultPlatformToolset) Static Unicode + true - - - - - - - - - - - - - - - - - - - - - - - + + - - ..\$(Configuration)\ - $(Configuration)\ - true + $(ProjectName)_32 - - ..\$(Configuration)64\ - $(Configuration)64\ - true + $(ProjectName)_64 - - ..\$(Configuration)\ - $(Configuration)\ - false - $(ProjectName)_32 - - - ..\$(Configuration)64\ - $(Configuration)64\ - false + $(ProjectName)_64 - - ..\$(Configuration)\ - $(Configuration)\ - false - $(ProjectName)_32 - - - ..\$(Configuration)64\ - $(Configuration)64\ - false + $(ProjectName)_64 + true - - - _DEBUG;%(PreprocessorDefinitions) - false - true - ClassicIEDLL_i.h - - ClassicIEDLL_i.c - ClassicIEDLL_p.c - true - - - Disabled - ..\..\Lib;%(AdditionalIncludeDirectories) - WIN32;_WINDOWS;_DEBUG;_USRDLL;CLASSICIEDLL_EXPORTS;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - Use - Level3 - EditAndContinue - true - stdcpp17 - - - _DEBUG;%(PreprocessorDefinitions) - $(IntDir);..\..\Lib;%(AdditionalIncludeDirectories) - - - true - uxtheme.lib;dwmapi.lib;comctl32.lib;msimg32.lib;winmm.lib;htmlhelp.lib;wininet.lib;wintrust.lib;crypt32.lib;%(AdditionalDependencies) - .\$(TargetName).def - true - Windows - true - - - - - _DEBUG;%(PreprocessorDefinitions) - false - true - ClassicIEDLL_i.h - - ClassicIEDLL_i.c - ClassicIEDLL_p.c - + - Disabled - ..\..\Lib;%(AdditionalIncludeDirectories) - WIN32;_WINDOWS;_DEBUG;_USRDLL;CLASSICIEDLL_EXPORTS;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - Use - Level3 - ProgramDatabase - true - stdcpp17 + _USRDLL;CLASSICIEDLL_EXPORTS;%(PreprocessorDefinitions) - _DEBUG;%(PreprocessorDefinitions) - $(IntDir);..\..\Lib;%(AdditionalIncludeDirectories) + $(IntDir);%(AdditionalIncludeDirectories) - true uxtheme.lib;dwmapi.lib;comctl32.lib;msimg32.lib;winmm.lib;htmlhelp.lib;wininet.lib;wintrust.lib;crypt32.lib;%(AdditionalDependencies) - .\$(TargetName).def - true - Windows - true - - - - - NDEBUG;%(PreprocessorDefinitions) - false - true - ClassicIEDLL_i.h - - ClassicIEDLL_i.c - ClassicIEDLL_p.c - true - - - MaxSpeed - ..\..\Lib;%(AdditionalIncludeDirectories) - WIN32;_WINDOWS;NDEBUG;_USRDLL;CLASSICIEDLL_EXPORTS;%(PreprocessorDefinitions) - MultiThreaded - Use - Level3 - ProgramDatabase - true - stdcpp17 - - - NDEBUG;%(PreprocessorDefinitions) - $(IntDir);..\..\Lib;%(AdditionalIncludeDirectories) - - - true - uxtheme.lib;dwmapi.lib;comctl32.lib;msimg32.lib;winmm.lib;htmlhelp.lib;wininet.lib;wintrust.lib;crypt32.lib;%(AdditionalDependencies) - .\$(TargetName).def - true - Windows - true - true - true + $(TargetName).def - - - NDEBUG;%(PreprocessorDefinitions) - false - true - ClassicIEDLL_i.h - - ClassicIEDLL_i.c - ClassicIEDLL_p.c - - - MaxSpeed - ..\..\Lib;%(AdditionalIncludeDirectories) - WIN32;_WINDOWS;NDEBUG;_USRDLL;CLASSICIEDLL_EXPORTS;%(PreprocessorDefinitions) - MultiThreaded - Use - Level3 - ProgramDatabase - true - stdcpp17 - - - NDEBUG;%(PreprocessorDefinitions) - $(IntDir);..\..\Lib;%(AdditionalIncludeDirectories) - + true - uxtheme.lib;dwmapi.lib;comctl32.lib;msimg32.lib;winmm.lib;htmlhelp.lib;wininet.lib;wintrust.lib;crypt32.lib;%(AdditionalDependencies) - .\$(TargetName).def - true - Windows - true - true true - - - NDEBUG;%(PreprocessorDefinitions) - false - true - ClassicIEDLL_i.h - - ClassicIEDLL_i.c - ClassicIEDLL_p.c - true - - - MaxSpeed - ..\..\Lib;%(AdditionalIncludeDirectories) - WIN32;_WINDOWS;NDEBUG;_USRDLL;CLASSICIEDLL_EXPORTS;BUILD_SETUP;%(PreprocessorDefinitions) - MultiThreaded - Use - Level3 - ProgramDatabase - true - stdcpp17 - - - NDEBUG;%(PreprocessorDefinitions) - $(IntDir);..\..\Lib;%(AdditionalIncludeDirectories) - - - uxtheme.lib;dwmapi.lib;comctl32.lib;msimg32.lib;winmm.lib;htmlhelp.lib;wininet.lib;wintrust.lib;crypt32.lib;%(AdditionalDependencies) - .\$(TargetName).def - true - Windows - true - true - - - - - NDEBUG;%(PreprocessorDefinitions) - false - true - ClassicIEDLL_i.h - - ClassicIEDLL_i.c - ClassicIEDLL_p.c - - - MaxSpeed - ..\..\Lib;%(AdditionalIncludeDirectories) - WIN32;_WINDOWS;NDEBUG;_USRDLL;CLASSICIEDLL_EXPORTS;BUILD_SETUP;%(PreprocessorDefinitions) - MultiThreaded - Use - Level3 - ProgramDatabase - true - stdcpp17 - - - NDEBUG;%(PreprocessorDefinitions) - $(IntDir);..\..\Lib;%(AdditionalIncludeDirectories) - - - uxtheme.lib;dwmapi.lib;comctl32.lib;msimg32.lib;winmm.lib;htmlhelp.lib;wininet.lib;wintrust.lib;crypt32.lib;%(AdditionalDependencies) - .\$(TargetName).def - true - Windows - true - true - - @@ -375,7 +127,7 @@ - + diff --git a/Src/ClassicIE/ClassicIEDLL/ClassicIEDLL.vcxproj.filters b/Src/ClassicIE/ClassicIEDLL/ClassicIEDLL.vcxproj.filters index ccca6f6ce..8f49852ad 100644 --- a/Src/ClassicIE/ClassicIEDLL/ClassicIEDLL.vcxproj.filters +++ b/Src/ClassicIE/ClassicIEDLL/ClassicIEDLL.vcxproj.filters @@ -81,7 +81,7 @@ Header Files - + Generated Files @@ -98,4 +98,4 @@ Resource Files - + \ No newline at end of file diff --git a/Src/ClassicIE/ClassicIEDLL/dllmain.cpp b/Src/ClassicIE/ClassicIEDLL/dllmain.cpp index 5efa436ef..e412d20f4 100644 --- a/Src/ClassicIE/ClassicIEDLL/dllmain.cpp +++ b/Src/ClassicIE/ClassicIEDLL/dllmain.cpp @@ -33,11 +33,6 @@ static int g_LoadDialogs[]= 0 }; -const wchar_t *GetDocRelativePath( void ) -{ - return DOC_PATH; -} - static void NewVersionCallback( VersionData &data ) { wchar_t path[_MAX_PATH]; diff --git a/Src/ClassicIE/ClassicIEDLL/dllmain.h b/Src/ClassicIE/ClassicIEDLL/dllmain.h index 26a8c3302..fe6990f3d 100644 --- a/Src/ClassicIE/ClassicIEDLL/dllmain.h +++ b/Src/ClassicIE/ClassicIEDLL/dllmain.h @@ -4,7 +4,7 @@ #pragma once -#include "ClassicIEDLL_i.h" +#include "ClassicIEDLL_h.h" class CClassicIEDLLModule : public CAtlDllModuleT< CClassicIEDLLModule > { diff --git a/Src/ClassicIE/ClassicIEDLL/stdafx.h b/Src/ClassicIE/ClassicIEDLL/stdafx.h index 57d4d826a..2fb5411ff 100644 --- a/Src/ClassicIE/ClassicIEDLL/stdafx.h +++ b/Src/ClassicIE/ClassicIEDLL/stdafx.h @@ -13,7 +13,7 @@ #define ISOLATION_AWARE_ENABLED 1 #define _ATL_APARTMENT_THREADED #define _ATL_NO_AUTOMATIC_NAMESPACE - +#define _ATL_MODULES // compatibility with /permissive- #define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS // some CString constructors will be explicit #include "resource.h" @@ -24,12 +24,4 @@ using namespace ATL; -#ifdef BUILD_SETUP -#define INI_PATH L"" -#define DOC_PATH L"" -#else -#define INI_PATH L"..\\" -#define DOC_PATH L"..\\..\\Docs\\Help\\" -#endif - #include "StringUtils.h" diff --git a/Src/Common.props b/Src/Common.props new file mode 100644 index 000000000..2a0a2ceee --- /dev/null +++ b/Src/Common.props @@ -0,0 +1,99 @@ + + + + + + + 4.4.1000 + + + + + $(MSBuildThisFileDirectory)..\build\bin\$(Configuration)\ + $(MSBuildThisFileDirectory)..\build\obj\$(ProjectName)\$(Configuration)\ + + + $(MSBuildThisFileDirectory)..\build\bin\$(Configuration)64\ + $(MSBuildThisFileDirectory)..\build\obj\$(ProjectName)\$(Configuration)64\ + + + $(MSBuildThisFileDirectory)..\build\bin\$(Configuration)ARM64\ + $(MSBuildThisFileDirectory)..\build\obj\$(ProjectName)\$(Configuration)ARM64\ + + + $(MSBuildThisFileDirectory)..\build\bin\$(Configuration)ARM64EC\ + $(MSBuildThisFileDirectory)..\build\obj\$(ProjectName)\$(Configuration)ARM64EC\ + + + + + + $(MSBuildThisFileDirectory)Lib;%(AdditionalIncludeDirectories) + WIN32;_WINDOWS;%(PreprocessorDefinitions) + Use + Level3 + true + true + stdcpp17 + + + false + true + true + + + true + Windows + + + $(MSBuildThisFileDirectory)Lib;%(AdditionalIncludeDirectories) + _PRODUCT_VERSION=$(CS_VERSION.Replace('.', ',')),0;_PRODUCT_VERSION_STR=\"$(CS_VERSION_ORIG)\";%(PreprocessorDefinitions) + + + + + + + Disabled + _DEBUG;%(PreprocessorDefinitions) + EnableFastChecks + MultiThreadedDebug + EditAndContinue + + + _DEBUG;%(PreprocessorDefinitions) + + + _DEBUG;%(PreprocessorDefinitions) + + + + + + + MaxSpeed + NDEBUG;%(PreprocessorDefinitions) + MultiThreaded + true + ProgramDatabase + + + NDEBUG;%(PreprocessorDefinitions) + + + NDEBUG;%(PreprocessorDefinitions) + + + true + true + + + + + + BUILD_SETUP;%(PreprocessorDefinitions) + + + + + diff --git a/Src/Lib/DownloadHelper.cpp b/Src/Lib/DownloadHelper.cpp index cecabdaf8..e610fda2d 100644 --- a/Src/Lib/DownloadHelper.cpp +++ b/Src/Lib/DownloadHelper.cpp @@ -4,7 +4,6 @@ #include #include "resource.h" -#include "..\Setup\UpdateBin\resource.h" #include "DownloadHelper.h" #include "Settings.h" #include "SettingsUIHelper.h" @@ -14,7 +13,7 @@ #include "FNVHash.h" #include "StringUtils.h" #include "Translations.h" -#include "json.hpp" +#include #include #include @@ -344,7 +343,7 @@ static DWORD WINAPI ThreadVersionCheck( void *param ) VersionData data; { - auto load = params.nightly ? data.LoadNightly() : data.Load(); + auto load = data.Load(!params.nightly); #ifdef UPDATE_LOG LogToFile(UPDATE_LOG, L"Load result: %d", load); @@ -371,60 +370,6 @@ static DWORD WINAPI ThreadVersionCheck( void *param ) data.bNewVersion=(data.newVersion>curVersion); data.bIgnoreVersion=(data.bNewVersion && data.newVersion<=remindedVersion); } - { - wchar_t languages[100]={0}; - CString language2=GetSettingString(L"Language"); - if (!language2.IsEmpty()) - { - Strcpy(languages,_countof(languages)-1,language2); - } - else - { - ULONG size=0; - ULONG len=_countof(languages); - GetUserPreferredUILanguages(MUI_LANGUAGE_NAME,&size,languages,&len); - } - - bool bNewLanguage=false; - for (wchar_t *lang=languages;*lang;lang+=Strlen(lang)+1) - { - if (_wcsicmp(lang,L"en")==0 || _wcsnicmp(lang,L"en-",3)==0) - break; // English - DWORD dllVersion=0, dllBuild=0; - HINSTANCE resInstance=LoadTranslationDll(lang); - if (resInstance) - { - dllVersion=GetVersionEx(resInstance,&dllBuild); - FreeLibrary(resInstance); - } - - DWORD newVersion=0, newBuild=0; - for (std::vector::const_iterator it=data.languages.begin();it!=data.languages.end();++it) - { - if (_wcsicmp(it->language,lang)==0) - { - newVersion=it->version; - newBuild=it->build; - break; - } - } - if (newVersion==0) - continue; - - if (newVersion>dllVersion || (newVersion==dllVersion && newBuild>dllBuild)) - { - // a new DLL for this language exists - data.bNewLanguage=true; - data.newLanguage=lang; - data.encodedLangVersion=(newVersion&0xFFFF0000)|((newVersion&0xFF)<<8)|(newBuild&0xFF); - DWORD remindedVersion; - if (regKey.QueryDWORDValue(L"RemindedLangVersion",remindedVersion)!=ERROR_SUCCESS) - remindedVersion=0; - data.bIgnoreLanguage=(data.encodedLangVersion<=remindedVersion); - } - break; - } - } data.bValid=true; if (params.check==CHECK_UPDATE) @@ -433,7 +378,7 @@ static DWORD WINAPI ThreadVersionCheck( void *param ) g_bCheckingVersion=false; return 1; } - if ((data.bNewVersion && !data.bIgnoreVersion) || (data.bNewLanguage && !data.bIgnoreLanguage)) + if (data.bNewVersion && !data.bIgnoreVersion) params.callback(data); g_bCheckingVersion=false; return 0; @@ -576,39 +521,6 @@ static CString LoadStringEx( HMODULE hModule, int stringId, int langId ) return res; } -static BOOL CALLBACK EnumStringLanguages( HMODULE hModule, LPCTSTR lpszType, LPCTSTR lpszName, WORD wIDLanguage, LONG_PTR lParam ) -{ - VersionData &data=*(VersionData*)lParam; - CString url=LoadStringEx(hModule,IDS_LNG_URL,wIDLanguage); - if (url.IsEmpty()) return TRUE; - CString ver=LoadStringEx(hModule,IDS_LNG_VERSION,wIDLanguage); - if (ver.IsEmpty()) return TRUE; - CString crc=LoadStringEx(hModule,IDS_LNG_CRC,wIDLanguage); - if (crc.IsEmpty()) return TRUE; - - LanguageVersionData langData; - langData.bBasic=(ver[ver.GetLength()-1]=='*'); - - int v1, v2, v3, v4; - if (swscanf_s(ver,L"%d.%d.%d.%d",&v1,&v2,&v3,&v4)==4) - { - wchar_t buf[100]; - if (GetLocaleInfo(wIDLanguage,LOCALE_SNAME,buf,_countof(buf))) - { - langData.languageId=wIDLanguage; - langData.language=buf; - langData.version=(v1<<24)|(v2<<16)|v3; - langData.build=v4; - langData.url=url; - wchar_t *q; - langData.hash=wcstoul(crc,&q,16); - data.languages.push_back(langData); - } - } - - return TRUE; -} - static bool VerifyDigitalCertificate( const wchar_t *fname, const wchar_t *signer ) { // verify the certificate @@ -710,38 +622,24 @@ static bool VerifyDigitalCertificate( const wchar_t *fname, const wchar_t *signe void VersionData::Clear( void ) { bValid=false; - newVersion=encodedLangVersion=0; + newVersion=0; downloadUrl.Empty(); downloadSigner.Empty(); news.Empty(); - updateLink.Empty(); - languageLink.Empty(); - altUrl.Empty(); - bNewVersion=bIgnoreVersion=bNewLanguage=bIgnoreLanguage=false; - newLanguage.Empty(); - for (std::vector::iterator it=languages.begin();it!=languages.end();++it) - if (it->bitmap) - DeleteObject(it->bitmap); - languages.clear(); + updateLink="https://github.com/Open-Shell/Open-Shell-Menu/releases"; + bNewVersion=bIgnoreVersion=false; } void VersionData::Swap( VersionData &data ) { std::swap(bValid,data.bValid); std::swap(newVersion,data.newVersion); - std::swap(encodedLangVersion,data.encodedLangVersion); std::swap(downloadUrl,data.downloadUrl); std::swap(downloadSigner,data.downloadSigner); std::swap(news,data.news); std::swap(updateLink,data.updateLink); - std::swap(languageLink,data.languageLink); - std::swap(altUrl,data.altUrl); std::swap(bNewVersion,data.bNewVersion); std::swap(bIgnoreVersion,data.bIgnoreVersion); - std::swap(bNewLanguage,data.bNewLanguage); - std::swap(bIgnoreLanguage,data.bIgnoreLanguage); - std::swap(newLanguage,data.newLanguage); - std::swap(languages,data.languages); } std::vector DownloadUrl(const wchar_t* url) @@ -765,20 +663,38 @@ std::vector DownloadUrl(const wchar_t* url) using namespace nlohmann; -VersionData::TLoadResult VersionData::Load() +VersionData::TLoadResult VersionData::Load(bool official) { Clear(); - auto buf = DownloadUrl(L"https://api.github.com/repos/Open-Shell/Open-Shell-Menu/releases/latest"); + std::wstring baseUrl = L"https://api.github.com/repos/Open-Shell/Open-Shell-Menu/releases"; + if (official) + baseUrl += L"/latest"; + + auto buf = DownloadUrl(baseUrl.c_str()); if (buf.empty()) return LOAD_ERROR; try { - auto data = json::parse(buf.begin(), buf.end()); + auto jsonData = json::parse(buf.begin(), buf.end()); + auto& data = jsonData; + + if (official) + { + // skip prerelease versions (just in case) + if (data["prerelease"].get()) + return LOAD_BAD_VERSION; + } + else + { + // we've got list of versions (release and pre-release) + // lets pick first one (that should be the latest one) + data = jsonData[0]; + } - // skip prerelease versions - if (data["prerelease"].get()) + // make sure we didn't get draft release (for whatever reason) + if (data["draft"].get()) return LOAD_BAD_VERSION; // get version from tag name @@ -832,179 +748,6 @@ VersionData::TLoadResult VersionData::Load() } } -VersionData::TLoadResult VersionData::LoadNightly() -{ - Clear(); - - auto buf = DownloadUrl(L"https://ci.appveyor.com/api/projects/passionate-coder/open-shell-menu/branch/master"); - if (buf.empty()) - return LOAD_ERROR; - - try - { - auto data = json::parse(buf.begin(), buf.end()); - auto build = data["build"]; - - // get version - auto version = build["version"].get(); - if (version.empty()) - return LOAD_BAD_FILE; - - { - int v1, v2, v3; - if (sscanf_s(version.c_str(), "%d.%d.%d", &v1, &v2, &v3) != 3) - return LOAD_BAD_FILE; - - newVersion = (v1 << 24) | (v2 << 16) | v3; - - if (newVersion <= GetVersionEx(g_Instance)) - return LOAD_OK; - } - - // artifact url - { - auto jobId = build["jobs"][0]["jobId"].get(); - if (jobId.empty()) - return LOAD_BAD_FILE; - - std::wstring jobUrl(L"https://ci.appveyor.com/api/buildjobs/"); - jobUrl += std::wstring(jobId.begin(), jobId.end()); - jobUrl += L"/artifacts"; - - buf = DownloadUrl(jobUrl.c_str()); - if (buf.empty()) - return LOAD_ERROR; - - auto artifacts = json::parse(buf.begin(), buf.end()); - - std::string fileName; - for (const auto& artifact : artifacts) - { - auto name = artifact["fileName"].get(); - if (name.find("OpenShellSetup") == 0) - { - fileName = name; - break; - } - } - - if (fileName.empty()) - return LOAD_BAD_FILE; - - auto artifactUrl(jobUrl); - artifactUrl += L'/'; - artifactUrl += std::wstring(fileName.begin(), fileName.end()); - - downloadUrl = artifactUrl.c_str(); - } - - // changelog - news.Append(CA2T(version.c_str())); - news.Append(L"\r\n\r\n"); - try - { - // use Github API to compare commit that actual version was built from (APPVEYOR_REPO_COMMIT) - // and commit that AppVeyor version was built from (commitId) - auto commitId = build["commitId"].get(); - - std::wstring compareUrl(L"https://api.github.com/repos/Open-Shell/Open-Shell-Menu/compare/"); - compareUrl += _T(APPVEYOR_REPO_COMMIT); - compareUrl += L"..."; - compareUrl += std::wstring(commitId.begin(), commitId.end()); - - buf = DownloadUrl(compareUrl.c_str()); - auto compare = json::parse(buf.begin(), buf.end()); - - // then use first lines (subjects) of commit messages as changelog - auto commits = compare["commits"]; - for (const auto& commit : commits) - { - auto message = commit["commit"]["message"].get(); - - auto pos = message.find('\n'); - if (pos != message.npos) - message.resize(pos); - - news.Append(L"- "); - news.Append(CA2T(message.c_str())); - news.Append(L"\r\n"); - } - } - catch (...) - { - } - } - catch (...) - { - return LOAD_BAD_FILE; - } - - return LOAD_OK; -} - -VersionData::TLoadResult VersionData::Load( const wchar_t *fname, bool bLoadFlags ) -{ - Clear(); - if (!VerifyDigitalCertificate(fname,L"Ivaylo Beltchev")) - return LOAD_BAD_FILE; - - HMODULE hModule=LoadLibraryEx(fname,NULL,LOAD_LIBRARY_AS_DATAFILE|LOAD_LIBRARY_AS_IMAGE_RESOURCE); - if (!hModule) return LOAD_BAD_FILE; - - if (GetVersionEx(hModule)!=GetVersionEx(g_Instance)) - { - FreeLibrary(hModule); - return LOAD_BAD_VERSION; - } - - wchar_t defLang[100]=L""; - { - CRegKey regKeyLng; - if (regKeyLng.Open(HKEY_LOCAL_MACHINE,L"Software\\OpenShell\\OpenShell",KEY_READ|KEY_WOW64_64KEY)==ERROR_SUCCESS) - { - ULONG size=_countof(defLang); - if (regKeyLng.QueryStringValue(L"DefaultLanguage",defLang,&size)!=ERROR_SUCCESS) - defLang[0]=0; - } - } - - const int DEFAULT_LANGUAGE=0x409; - - int defLangId; - if (!defLang[0] || !GetLocaleInfoEx(defLang,LOCALE_ILANGUAGE|LOCALE_RETURN_NUMBER,(LPWSTR)&defLangId,4)) - defLangId=DEFAULT_LANGUAGE; - - downloadUrl=LoadStringEx(hModule,IDS_INSTALL_URL,defLangId); - // these are always in en-US - downloadSigner=LoadStringEx(hModule,IDS_INSTALL_SIGNER,DEFAULT_LANGUAGE); - CString strVer=LoadStringEx(hModule,IDS_VERSION,defLangId); - if (strVer.IsEmpty()) - strVer=LoadStringEx(hModule,IDS_VERSION,DEFAULT_LANGUAGE); - updateLink=LoadStringEx(hModule,IDS_UPDATE_LINK,DEFAULT_LANGUAGE); - languageLink=LoadStringEx(hModule,IDS_LANGUAGE_LINK,DEFAULT_LANGUAGE); - altUrl=LoadStringEx(hModule,IDS_ALT_URL,DEFAULT_LANGUAGE); - - int v1, v2, v3; - if (!downloadUrl.IsEmpty() && swscanf_s(strVer,L"%d.%d.%d",&v1,&v2,&v3)==3) - { - newVersion=(v1<<24)|(v2<<16)|v3; - news=LoadStringEx(hModule,IDS_NEWS,defLangId); - if (news.IsEmpty()) - news=LoadStringEx(hModule,IDS_NEWS,DEFAULT_LANGUAGE); - - EnumResourceLanguages(hModule,RT_STRING,MAKEINTRESOURCE((IDS_LNG_URL>>4)+1),EnumStringLanguages,(LONG_PTR)this); - for (std::vector::iterator it=languages.begin();it!=languages.end();++it) - it->bitmap=(HBITMAP)LoadImage(hModule,MAKEINTRESOURCE(it->languageId),IMAGE_BITMAP,22,27,LR_CREATEDIBSECTION); - } - - FreeLibrary(hModule); - - if (newVersion && !downloadUrl.IsEmpty() && !news.IsEmpty()) - return LOAD_OK; - Clear(); - return LOAD_ERROR; -} - struct DownloadFileParams { // input @@ -1081,82 +824,6 @@ static DWORD WINAPI ThreadDownloadFile( void *param ) return 0; } -DWORD DownloadLanguageDll( HWND owner, TSettingsComponent component, const LanguageVersionData &data, CString &error ) -{ - // download file - wchar_t path[_MAX_PATH]=L"%ALLUSERSPROFILE%\\OpenShell\\Languages"; - DoEnvironmentSubst(path,_countof(path)); - SHCreateDirectory(NULL,path); - wchar_t fname[_MAX_PATH]; - Sprintf(fname,_countof(fname),L"%s.dll",data.language); - - CProgressDlg progress; - progress.Create(owner,LoadStringEx(IDS_PROGRESS_TITLE_DOWNLOAD)); - - DownloadFileParams params; - params.url=data.url; - params.signer=NULL; - params.hash=data.hash; - params.path=path; - params.fname=fname; - params.progress=&progress; - params.bAcceptCached=true; - params.component=component; - - HANDLE hThread=CreateThread(NULL,0,ThreadDownloadFile,¶ms,0,NULL); - - while (1) - { - DWORD wait=MsgWaitForMultipleObjects(1,&hThread,FALSE,INFINITE,QS_ALLINPUT); - if (wait!=WAIT_OBJECT_0+1) - break; - MSG msg; - while (PeekMessage(&msg,0,0,0,PM_REMOVE)) - { - TranslateMessage(&msg); - DispatchMessage(&msg); - } - } - progress.DestroyWindow(); - CloseHandle(hThread); - - if (params.downloadRes==DOWNLOAD_CANCEL) - return 2; - if (params.downloadRes==DOWNLOAD_INTERNET) - { - error=LoadStringEx(IDS_INTERNET_FAIL); - return 0; - } - else if (params.downloadRes==DOWNLOAD_START) - { - error=LoadStringEx(IDS_INITIATE_FAIL); - return 0; - } - else if (params.downloadRes==DOWNLOAD_FAIL) - { - error=LoadStringEx(IDS_LANG_DOWNLOAD_FAIL); - return 0; - } - - if (params.saveRes) - { - wchar_t msg[256]; - FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM|FORMAT_MESSAGE_IGNORE_INSERTS,NULL,params.saveRes,0,msg,_countof(msg),NULL); - error.Format(LoadStringEx(IDS_LANG_SAVE_FAIL),params.fname); - error+="\r\n"; - error+=msg; - return 0; - } - - if (!params.valid) - { - error=LoadStringEx(IDS_LANG_DOWNLOAD_FAIL); - return 0; - } - - return 1; -} - DWORD DownloadNewVersion( HWND owner, TSettingsComponent component, const wchar_t *url, const wchar_t *signer, CString &fname, CString &error ) { CComString pPath; diff --git a/Src/Lib/DownloadHelper.h b/Src/Lib/DownloadHelper.h index 32d536e64..12e8becbe 100644 --- a/Src/Lib/DownloadHelper.h +++ b/Src/Lib/DownloadHelper.h @@ -15,37 +15,16 @@ enum TVersionCheck enum TSettingsComponent; -struct LanguageVersionData -{ - CString language; - CString url; - DWORD version; - DWORD build; - DWORD hash; - bool bBasic; - WORD languageId; - HBITMAP bitmap; - - LanguageVersionData( void ) { bBasic=false; bitmap=NULL; } -}; - struct VersionData { bool bValid = false; DWORD newVersion = 0; - DWORD encodedLangVersion = 0; CString downloadUrl; CString downloadSigner; CString news; CString updateLink; - CString languageLink; - CString altUrl; bool bNewVersion = false; bool bIgnoreVersion = false; - bool bNewLanguage = false; - bool bIgnoreLanguage = false; - CString newLanguage; - std::vector languages; ~VersionData( void ) { Clear(); } void Clear( void ); @@ -59,9 +38,7 @@ struct VersionData LOAD_BAD_FILE, // the file is corrupted }; - TLoadResult Load(); - TLoadResult LoadNightly(); - TLoadResult Load( const wchar_t *fname, bool bLoadFlags ); + TLoadResult Load(bool official); private: void operator=( const VersionData& ); }; @@ -70,5 +47,4 @@ typedef void (*tNewVersionCallback)( VersionData &data ); // 0 - fail, 1 - success, 2 - cancel DWORD CheckForNewVersion( HWND owner, TSettingsComponent component, TVersionCheck check, tNewVersionCallback callback ); -DWORD DownloadLanguageDll( HWND owner, TSettingsComponent component, const LanguageVersionData &data, CString &error ); DWORD DownloadNewVersion( HWND owner, TSettingsComponent component, const wchar_t *url, const wchar_t *signer, CString &fname, CString &error ); diff --git a/Src/Lib/FileHelper.cpp b/Src/Lib/FileHelper.cpp index 2d928f849..7d6664edb 100644 --- a/Src/Lib/FileHelper.cpp +++ b/Src/Lib/FileHelper.cpp @@ -60,3 +60,17 @@ bool IsFakeFolder( const wchar_t *fname ) } return false; } + +bool GetFakeFolder( wchar_t *dst, int len, const wchar_t *src ) +{ + Sprintf(dst,len,L"%s\\target.lnk",src); + if (GetFileAttributes(dst)!=INVALID_FILE_ATTRIBUTES) + { + wchar_t path[_MAX_PATH]; + Sprintf(path,_countof(path),L"%s\\desktop.ini",src); + DWORD attrib=GetFileAttributes(path); + if (attrib!=INVALID_FILE_ATTRIBUTES && (attrib&FILE_ATTRIBUTE_SYSTEM)) + return true; + } + return false; +} diff --git a/Src/Lib/FileHelper.h b/Src/Lib/FileHelper.h index 4d33ffc6a..2a5b20bbd 100644 --- a/Src/Lib/FileHelper.h +++ b/Src/Lib/FileHelper.h @@ -7,3 +7,4 @@ bool CreateFakeFolder( const wchar_t *source, const wchar_t *fname ); void DeleteFakeFolder( const wchar_t *fname ); bool IsFakeFolder( const wchar_t *fname ); +bool GetFakeFolder( wchar_t *dst, int len, const wchar_t *src ); diff --git a/Src/Lib/IatHookHelper.cpp b/Src/Lib/IatHookHelper.cpp index 4a34d315b..5305811ed 100644 --- a/Src/Lib/IatHookHelper.cpp +++ b/Src/Lib/IatHookHelper.cpp @@ -70,12 +70,17 @@ IatHookData *SetIatHook( IMAGE_DOS_HEADER *dosHeader, DWORD iatOffset, DWORD int { IatHookData *hook=g_IatHooks+g_IatHookCount; g_IatHookCount++; +#if defined(_M_AMD64) || defined(_M_IX86) hook->jump[0]=hook->jump[1]=0x90; // NOP hook->jump[2]=0xFF; hook->jump[3]=0x25; // JUMP -#ifdef _WIN64 +#if defined(_M_AMD64) hook->jumpOffs=0; #else hook->jumpOffs=(DWORD)(hook)+8; +#endif +#elif defined(_M_ARM64) + hook->jump[0]=0x48; hook->jump[1]=0x00; hook->jump[2]=0x00; hook->jump[3]=0x58; // LDR X8, newProc + hook->jump[4]=0x00; hook->jump[5]=0x01; hook->jump[6]=0x1F; hook->jump[7]=0xD6; // BR X8 #endif hook->newProc=newProc; hook->oldProc=(void*)thunk->u1.Function; diff --git a/Src/Lib/IatHookHelper.h b/Src/Lib/IatHookHelper.h index 2a4603f0d..d522bfbd7 100644 --- a/Src/Lib/IatHookHelper.h +++ b/Src/Lib/IatHookHelper.h @@ -6,8 +6,12 @@ struct IatHookData { +#if defined(_M_AMD64) || defined(_M_IX86) unsigned char jump[4]; // jump instruction 0x90, 0x90, 0xFF, 0x25 DWORD jumpOffs; // jump instruction offset +#elif defined(_M_ARM64) + unsigned char jump[8]; // LDR
, BR +#endif void *newProc; // the address of the new proc void *oldProc; // the address of the old proc IMAGE_THUNK_DATA *thunk; // the IAT thunk diff --git a/Src/Lib/LanguageSettingsHelper.cpp b/Src/Lib/LanguageSettingsHelper.cpp index ad35b04c0..a9c4c6381 100644 --- a/Src/Lib/LanguageSettingsHelper.cpp +++ b/Src/Lib/LanguageSettingsHelper.cpp @@ -68,17 +68,13 @@ class CLanguageSettingsDlg: public CResizeableDlg MESSAGE_HANDLER( WM_INITDIALOG, OnInitDialog ) MESSAGE_HANDLER( WM_DESTROY, OnDestroy ) MESSAGE_HANDLER( WM_SIZE, OnSize ) - COMMAND_ID_HANDLER( IDC_BUTTONCHECK, OnCheckUpdates ) NOTIFY_HANDLER( IDC_LISTLANGUAGE, LVN_ITEMCHANGED, OnSelChange ) NOTIFY_HANDLER( IDC_LISTLANGUAGE, LVN_ITEMCHANGING, OnSelChanging ) NOTIFY_HANDLER( IDC_LISTLANGUAGE, NM_CUSTOMDRAW, OnCustomDraw ) - NOTIFY_HANDLER( IDC_LINKDOWNLOAD, NM_CLICK, OnDownload ) END_MSG_MAP() BEGIN_RESIZE_MAP RESIZE_CONTROL(IDC_LISTLANGUAGE,MOVE_SIZE_X|MOVE_SIZE_Y) - RESIZE_CONTROL(IDC_BUTTONCHECK,MOVE_MOVE_Y) - RESIZE_CONTROL(IDC_LINKDOWNLOAD,MOVE_SIZE_X|MOVE_MOVE_Y) END_RESIZE_MAP void SetGroup( CSetting *pGroup ); @@ -92,11 +88,9 @@ class CLanguageSettingsDlg: public CResizeableDlg LRESULT OnInitDialog( UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled ); LRESULT OnDestroy( UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled ); LRESULT OnSize( UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled ); - LRESULT OnCheckUpdates( WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled ); LRESULT OnSelChange( int idCtrl, LPNMHDR pnmh, BOOL& bHandled ); LRESULT OnSelChanging( int idCtrl, LPNMHDR pnmh, BOOL& bHandled ); LRESULT OnCustomDraw( int idCtrl, LPNMHDR pnmh, BOOL& bHandled ); - LRESULT OnDownload( int idCtrl, LPNMHDR pnmh, BOOL& bHandled ); private: CSetting *m_pSetting; @@ -114,17 +108,12 @@ class CLanguageSettingsDlg: public CResizeableDlg bool operator<( const LangInfo &info ) { return _wcsicmp(name,info.name)<0; } }; std::vector m_LanguageIDs; // the order matches the items in the listbox - static VersionData s_VersionData; - static void NewVersionCallback( VersionData &data ); void UpdateFlags( void ); - void UpdateLink( const wchar_t *language ); void AddFlag( const wchar_t *langName, int langId, HBITMAP bmp ); }; -VersionData CLanguageSettingsDlg::s_VersionData; - void CLanguageSettingsDlg::AddFlag( const wchar_t *langName, int langId, HBITMAP bmp ) { int idx=1; @@ -156,39 +145,6 @@ void CLanguageSettingsDlg::AddFlag( const wchar_t *langName, int langId, HBITMAP void CLanguageSettingsDlg::UpdateFlags( void ) { - // add flags from s_VersionData - for (std::vector::const_iterator it=s_VersionData.languages.begin();it!=s_VersionData.languages.end();++it) - { - if (it->bitmap) - { - BITMAPINFO bi={0}; - bi.bmiHeader.biSize=sizeof(BITMAPINFOHEADER); - bi.bmiHeader.biWidth=m_bLargeFlags?32:24; - bi.bmiHeader.biHeight=m_bLargeFlags?16:11; - bi.bmiHeader.biPlanes=1; - bi.bmiHeader.biBitCount=32; - - HDC hdc=CreateCompatibleDC(NULL); - HBITMAP bmp=CreateDIBSection(hdc,&bi,DIB_RGB_COLORS,NULL,NULL,0); - HGDIOBJ bmp0=SelectObject(hdc,bmp); - HDC hsrc=CreateCompatibleDC(hdc); - HGDIOBJ bmp02=SelectObject(hsrc,it->bitmap); - SetDCBrushColor(hdc,0xFF00FF); - RECT rc={0,0,bi.bmiHeader.biWidth,bi.bmiHeader.biHeight}; - FillRect(hdc,&rc,(HBRUSH)GetStockObject(DC_BRUSH)); - if (m_bLargeFlags) - BitBlt(hdc,3,0,22,16,hsrc,0,11,SRCCOPY); - else - BitBlt(hdc,2,0,16,11,hsrc,0,0,SRCCOPY); - SelectObject(hsrc,bmp02); - DeleteDC(hsrc); - SelectObject(hdc,bmp0); - DeleteDC(hdc); - AddFlag(it->language,it->languageId,bmp); - DeleteObject(bmp); - } - } - // add flags from dlls for (int pass=0;pass<2;pass++) { @@ -288,7 +244,6 @@ LRESULT CLanguageSettingsDlg::OnInitDialog( UINT uMsg, WPARAM wParam, LPARAM lPa ListView_SetExtendedListViewStyleEx(list,LVS_EX_DOUBLEBUFFER,LVS_EX_DOUBLEBUFFER); LVCOLUMN column={LVCF_WIDTH,0,rc.right-rc.left}; ListView_InsertColumn(list,0,&column); - SetDlgItemText(IDC_LINKDOWNLOAD,L""); m_LanguageIDs.resize(_countof(g_LanguageIDs)+1); { @@ -331,11 +286,6 @@ LRESULT CLanguageSettingsDlg::OnInitDialog( UINT uMsg, WPARAM wParam, LPARAM lPa ListView_InsertItem(list,&item); } - // parse update.ver in data and add all flags - wchar_t path[_MAX_PATH]=L"%ALLUSERSPROFILE%\\OpenShell\\update.ver"; - DoEnvironmentSubst(path,_countof(path)); - s_VersionData.bValid=(s_VersionData.Load(path,true)==VersionData::LOAD_OK); - UpdateFlags(); m_Tooltip.Create(TOOLTIPS_CLASS,m_hWnd,NULL,NULL,WS_POPUP|TTS_NOPREFIX); @@ -359,40 +309,6 @@ LRESULT CLanguageSettingsDlg::OnSize( UINT uMsg, WPARAM wParam, LPARAM lParam, B return 0; } -void CLanguageSettingsDlg::NewVersionCallback( VersionData &data ) -{ - s_VersionData.Swap(data); -} - -LRESULT CLanguageSettingsDlg::OnCheckUpdates( WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled ) -{ - DWORD res=CheckForNewVersion(m_hWnd,m_Component,CHECK_UPDATE,NewVersionCallback); - if (res==2) return 0; - if (res) - { - UpdateFlags(); - CString language=GetSettingString(L"Language"); - CWindow list=GetDlgItem(IDC_LISTLANGUAGE); - for (int idx=0;idx<(int)m_LanguageIDs.size();idx++) - { - const wchar_t *name=idx>0?m_LanguageIDs[idx].name.GetString():L""; - if (_wcsicmp(language,name)==0) - { - ListView_SetItemState(list,idx,LVIS_SELECTED|LVIS_FOCUSED,LVIS_SELECTED|LVIS_FOCUSED); - ListView_EnsureVisible(list,idx,FALSE); - break; - } - } - UpdateLink(language); - } - else - { - s_VersionData.Clear(); - SetDlgItemText(IDC_LINKDOWNLOAD,LoadStringEx(IDS_LANGUAGE_FAIL)); - } - return 0; -} - LRESULT CLanguageSettingsDlg::OnSelChange( int idCtrl, LPNMHDR pnmh, BOOL& bHandled ) { // set setting @@ -411,7 +327,6 @@ LRESULT CLanguageSettingsDlg::OnSelChange( int idCtrl, LPNMHDR pnmh, BOOL& bHand m_pSetting->flags|=CSetting::FLAG_DEFAULT; else m_pSetting->flags&=~CSetting::FLAG_DEFAULT; - UpdateLink(name); return 0; } @@ -448,41 +363,6 @@ static HRESULT CALLBACK TaskDialogCallbackProc( HWND hwnd, UINT uNotification, W return S_OK; } -LRESULT CLanguageSettingsDlg::OnDownload( int idCtrl, LPNMHDR pnmh, BOOL& bHandled ) -{ - CString language=GetSettingString(L"Language"); - if (language.IsEmpty()) - language=m_LanguageIDs[0].name; - - for (std::vector::const_iterator it=s_VersionData.languages.begin();it!=s_VersionData.languages.end();++it) - { - if (_wcsicmp(it->language,language)==0) - { - CString error; - DWORD res=DownloadLanguageDll(m_hWnd,m_Component,*it,error); - if (res==2) - return 0; - if (res) - MessageBox(LoadStringEx(it->bBasic?IDS_LANGUAGE_SUCCESS2:IDS_LANGUAGE_SUCCESS),LoadStringEx(IDS_UPDATE_TITLE),MB_OK|(it->bBasic?MB_ICONWARNING:MB_ICONINFORMATION)); - else - { - if (!s_VersionData.languageLink.IsEmpty()) - error+=L" "+LoadStringEx(IDS_DOWNLOAD_TIP)+L"\r\n\r\n"+s_VersionData.languageLink; - TASKDIALOGCONFIG task={sizeof(task),m_hWnd,NULL,TDF_ENABLE_HYPERLINKS|TDF_ALLOW_DIALOG_CANCELLATION|TDF_USE_HICON_MAIN,TDCBF_OK_BUTTON}; - CString title=LoadStringEx(IDS_UPDATE_TITLE); - task.pszWindowTitle=title; - task.pszContent=error; - task.hMainIcon=LoadIcon(NULL,IDI_ERROR); - task.pfCallback=TaskDialogCallbackProc; - TaskDialogIndirect(&task,NULL,NULL,NULL); - } - UpdateLink(language); - break; - } - } - return 0; -} - void CLanguageSettingsDlg::SetGroup( CSetting *pGroup ) { m_bLocked=false; @@ -504,7 +384,6 @@ void CLanguageSettingsDlg::SetGroup( CSetting *pGroup ) break; } } - UpdateLink(m_pSetting->value.bstrVal); m_bLocked=m_pSetting->IsLocked(); TOOLINFO tool={sizeof(tool),0,m_hWnd,'CLSH'}; @@ -517,52 +396,6 @@ void CLanguageSettingsDlg::SetGroup( CSetting *pGroup ) ListView_SetBkColor(list,GetSysColor(m_bLocked?COLOR_BTNFACE:COLOR_WINDOW)); } -void CLanguageSettingsDlg::UpdateLink( const wchar_t *language ) -{ - TOOLINFO tool={sizeof(tool),TTF_SUBCLASS|TTF_IDISHWND,m_hWnd,'CLSH'}; - tool.uId=(UINT_PTR)GetDlgItem(IDC_LINKDOWNLOAD).m_hWnd; - m_Tooltip.SendMessage(TTM_DELTOOL,0,(LPARAM)&tool); - - if (!s_VersionData.bValid) - { - SetDlgItemText(IDC_LINKDOWNLOAD,L""); - return; - } - if (!*language) - language=m_LanguageIDs[0].name; - - wchar_t text[1024]; - for (std::vector::const_iterator it=s_VersionData.languages.begin();it!=s_VersionData.languages.end();++it) - { - if (_wcsicmp(it->language,language)==0) - { - DWORD dllVersion=0, dllBuild=0; - HINSTANCE resInstance=LoadTranslationDll(language); - if (resInstance) - { - dllVersion=GetVersionEx(resInstance,&dllBuild); - FreeLibrary(resInstance); - } - if (it->version>dllVersion || (it->version==dllVersion && it->build>dllBuild)) - { - Sprintf(text,_countof(text),LoadStringEx(IDS_LANGUAGE_DOWNLOAD),language); - SetDlgItemText(IDC_LINKDOWNLOAD,text); - - tool.lpszText=(LPWSTR)(LPCWSTR)it->url; - m_Tooltip.SendMessage(TTM_ADDTOOL,0,(LPARAM)&tool); - } - else - { - Sprintf(text,_countof(text),LoadStringEx(IDS_LANGUAGE_UPDATED),language); - SetDlgItemText(IDC_LINKDOWNLOAD,text); - } - return; - } - } - Sprintf(text,_countof(text),LoadStringEx(IDS_LANGUAGE_MISSING),language); - SetDlgItemText(IDC_LINKDOWNLOAD,text); -} - class CLanguageSettingsPanel: public ISettingsPanel { public: diff --git a/Src/Lib/Lib.rc b/Src/Lib/Lib.rc index 479584a30..d34dbaf46 100644 --- a/Src/Lib/Lib.rc +++ b/Src/Lib/Lib.rc @@ -98,8 +98,6 @@ FONT 9, "Segoe UI", 400, 0, 0x0 BEGIN CONTROL "",IDC_LISTLANGUAGE,"SysListView32",LVS_REPORT | LVS_SINGLESEL | LVS_SHOWSELALWAYS | LVS_ALIGNLEFT | LVS_NOCOLUMNHEADER | LVS_NOSORTHEADER | WS_BORDER | WS_TABSTOP,7,18,302,99 LTEXT "Select a language for the user interface:",IDC_STATICHINT,7,7,131,8 - PUSHBUTTON "&Check for Updates",IDC_BUTTONCHECK,7,123,75,14 - CONTROL "download link goes here",IDC_LINKDOWNLOAD,"SysLink",WS_TABSTOP,85,126,224,10 END IDD_CUSTOMTREE DIALOGEX 0, 0, 365, 183 @@ -279,20 +277,12 @@ BEGIN IDS_SETTING_SEARCH "Search Results" IDS_WEBSITE_TIP "Visit Open-Shell on the web - https://open-shell.github.io/Open-Shell-Menu" IDS_LOCATE_SETTING "Locate setting" - IDS_LANGUAGE_UPDATED "The language %s is up to date." - IDS_LANGUAGE_MISSING "Update for language %s is not available." - IDS_LANGUAGE_DOWNLOAD "New update for language %s is available. Click here to install it." - IDS_LANGUAGE_SUCCESS "The language file was installed successfully.\nYou need to log off and back on for the update to take effect." - IDS_LANGUAGE_SUCCESS2 "The language file was installed successfully.\nYou need to log off and back on for the update to take effect.\n\nNote: This update provides only basic translations. It supports only the main text found in the start menu and in Explorer. The settings will not be translated." - IDS_LANGUAGE_FAIL "Failed to check for updates." IDS_INTERNET_FAIL "Failed to connect to the Internet." END STRINGTABLE BEGIN IDS_INITIATE_FAIL "Failed to initiate the download." - IDS_LANG_DOWNLOAD_FAIL "Failed to download the language file." - IDS_LANG_SAVE_FAIL "Failed to save language file '%s'." IDS_UPDATE_TITLE "Open-Shell Update" IDS_INST_DOWNLOAD_FAIL "Failed to download the new version." IDS_INST_SAVE_FAIL "Failed to save file '%s'." @@ -308,11 +298,6 @@ BEGIN IDS_UNSAVED_TITLE "Unsaved changes" END -STRINGTABLE -BEGIN - IDS_VERSION_URL "http://www.classicshell.net/files/updates/update_" -END - #endif // English (U.S.) resources ///////////////////////////////////////////////////////////////////////////// diff --git a/Src/Lib/Lib.vcxproj b/Src/Lib/Lib.vcxproj index ac8a4d84a..8c29ee77c 100644 --- a/Src/Lib/Lib.vcxproj +++ b/Src/Lib/Lib.vcxproj @@ -1,6 +1,14 @@ + + Debug + ARM64 + + + Debug + ARM64EC + Debug Win32 @@ -9,6 +17,14 @@ Debug x64 + + Release + ARM64 + + + Release + ARM64EC + Release Win32 @@ -25,130 +41,34 @@ 10.0 - - StaticLibrary - v142 - Static - Unicode - true - - - StaticLibrary - v142 - Static - Unicode - - - StaticLibrary - v142 - Static - Unicode - true - - + StaticLibrary - v142 + $(DefaultPlatformToolset) Static Unicode + true - - - - - - - - - - - + + - - $(Configuration)\ - $(Configuration)\ - - - $(Configuration)64\ - $(Configuration)64\ - - - $(Configuration)\ - $(Configuration)\ + + $(IntDir) - - $(Configuration)64\ - $(Configuration)64\ + + true - APPVEYOR_REPO_COMMIT="$(APPVEYOR_REPO_COMMIT)";%(PreprocessorDefinitions) - - - - - Disabled - WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - Use - Level3 - EditAndContinue - true - true - stdcpp17 - - - - - Disabled - WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - Use - Level3 - ProgramDatabase - true - true - stdcpp17 - - - - - MaxSpeed - WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) - MultiThreaded - true - Use - Level3 - true - ProgramDatabase - true - true - stdcpp17 + _LIB;%(PreprocessorDefinitions) - MachineX86 + MachineX86 - - - MaxSpeed - WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) - MultiThreaded - true - Use - Level3 - true - ProgramDatabase - true - true - stdcpp17 - - @@ -200,7 +120,17 @@ + + + + + + + This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. + + + \ No newline at end of file diff --git a/Src/Lib/Lib.vcxproj.filters b/Src/Lib/Lib.vcxproj.filters index fbcf3efb1..5f8d42680 100644 --- a/Src/Lib/Lib.vcxproj.filters +++ b/Src/Lib/Lib.vcxproj.filters @@ -149,4 +149,7 @@ Lib - + + + + \ No newline at end of file diff --git a/Src/Lib/ResourceHelper.cpp b/Src/Lib/ResourceHelper.cpp index 3ab46510e..b7388a554 100644 --- a/Src/Lib/ResourceHelper.cpp +++ b/Src/Lib/ResourceHelper.cpp @@ -384,20 +384,23 @@ HICON CreateDisabledIcon( HICON hIcon, int iconSize ) } // Loads an image file into a bitmap and optionally resizes it -HBITMAP LoadImageFile( const wchar_t *path, const SIZE *pSize, bool bUseAlpha, bool bPremultiply, std::vector *pButtonAnim ) +HBITMAP LoadImageFile( const wchar_t *path, const SIZE *pSize, bool bUseAlpha, bool bPremultiply, std::vector *pButtonAnim, UINT dpi ) { HBITMAP srcBmp=NULL; if (_wcsicmp(PathFindExtension(path),L".bmp")==0) { srcBmp=(HBITMAP)LoadImage(NULL,path,IMAGE_BITMAP,0,0,LR_CREATEDIBSECTION|LR_LOADFROMFILE); } - if (srcBmp && !pSize) + if (srcBmp && !pSize && !dpi) return srcBmp; CComPtr pFactory; if (FAILED(pFactory.CoCreateInstance(CLSID_WICImagingFactory))) { - if (srcBmp) DeleteObject(srcBmp); - return NULL; + if (FAILED(pFactory.CoCreateInstance(CLSID_WICImagingFactory1))) + { + if (srcBmp) DeleteObject(srcBmp); + return NULL; + } } CComPtr pBitmap; @@ -479,6 +482,12 @@ HBITMAP LoadImageFile( const wchar_t *path, const SIZE *pSize, bool bUseAlpha, b else frameHeightD=frameWidthD*frameHeightS/frameWidthS; } + + if (dpi) + { + frameWidthD=ScaleForDpi(dpi,frameWidthD); + frameHeightD=ScaleForDpi(dpi,frameHeightD); + } } BITMAPINFO bi={0}; @@ -534,7 +543,10 @@ HBITMAP LoadImageResource( HMODULE hModule, const wchar_t *name, bool bTopDown, { CComPtr pFactory; if (FAILED(pFactory.CoCreateInstance(CLSID_WICImagingFactory))) - return NULL; + { + if (FAILED(pFactory.CoCreateInstance(CLSID_WICImagingFactory1))) + return NULL; + } CComPtr pBitmap; if (hModule) @@ -727,6 +739,19 @@ bool IsWin10RS4( void ) return bIsRS4; } +static bool IsWin11Helper() +{ + auto version = GetOSVersion(); + return version.dwMajorVersion >= 10 && version.dwBuildNumber >= 22000; +} + +// Returns true if the version is Windows11 or later +bool IsWin11(void) +{ + static bool bIsWin11 = IsWin11Helper(); + return bIsWin11; +} + // Wrapper for IShellFolder::ParseDisplayName HRESULT ShParseDisplayName( const wchar_t *pszName, PIDLIST_ABSOLUTE *ppidl, SFGAOF sfgaoIn, SFGAOF *psfgaoOut ) { @@ -901,5 +926,38 @@ HFONT CreateFontSetting( const wchar_t *fontStr, int dpi ) weight=FW_BOLD, bItalic=true; str=GetToken(str,token,_countof(token),L", \t"); int size=-_wtol(token); - return CreateFont(size*dpi/72,0,0,0,weight,bItalic?1:0,0,0,DEFAULT_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH,name); + return CreateFont(MulDiv(size,dpi,72),0,0,0,weight,bItalic?1:0,0,0,DEFAULT_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH,name); +} + +static UINT WINAPI GetDpiForWindow(HWND hwnd) +{ + static auto p = static_cast((void*)GetProcAddress(GetModuleHandle(L"user32.dll"), "GetDpiForWindow")); + if (p) + return p(hwnd); + + return 0; +} + +UINT GetDpi(HWND hwnd) +{ + UINT dpi = GetDpiForWindow(hwnd); + if (!dpi) + { + // fall-back for older systems + HDC hdc = GetDC(nullptr); + dpi = GetDeviceCaps(hdc, LOGPIXELSY); + ReleaseDC(nullptr, hdc); + } + + return dpi; +} + +int ScaleForDpi(UINT dpi, int value) +{ + return MulDiv(value, dpi, USER_DEFAULT_SCREEN_DPI); +} + +int ScaleForDpi(HWND hwnd, int value) +{ + return ScaleForDpi(GetDpi(hwnd), value); } diff --git a/Src/Lib/ResourceHelper.h b/Src/Lib/ResourceHelper.h index ac7399acd..5afc1d1dc 100644 --- a/Src/Lib/ResourceHelper.h +++ b/Src/Lib/ResourceHelper.h @@ -35,7 +35,7 @@ HICON ShExtractIcon( const char *path, int index, int iconSize ); HBITMAP BitmapFromIcon( HICON hIcon, int iconSize, unsigned int **pBits, bool bDestroyIcon ); // Loads an image file into a bitmap and optionally resizes it -HBITMAP LoadImageFile( const wchar_t *path, const SIZE *pSize, bool bUseAlpha, bool bPremultiply, std::vector *pButtonAnim ); +HBITMAP LoadImageFile( const wchar_t *path, const SIZE *pSize, bool bUseAlpha, bool bPremultiply, std::vector *pButtonAnim, UINT dpi=0 ); // Loads a bitmap from a IMAGE resource HBITMAP LoadImageResource( HMODULE hModule, const wchar_t *name, bool bTopDown, bool bPremultiply ); @@ -67,6 +67,9 @@ bool IsWin10RS1( void ); // Returns true if the version is Windows10 RS4 (Spring Creator Update) or later bool IsWin10RS4( void ); +// Returns true if the version is Windows11 or later +bool IsWin11(); + // Wrapper for IShellFolder::ParseDisplayName HRESULT ShParseDisplayName( const wchar_t *pszName, PIDLIST_ABSOLUTE *ppidl, SFGAOF sfgaoIn, SFGAOF *psfgaoOut ); @@ -82,6 +85,14 @@ void StringUpper( CString &str ); // Create a font from the user settings HFONT CreateFontSetting( const wchar_t *fontStr, int dpi ); +// Return DPI of given window (or system DPI on older systems) +UINT GetDpi(HWND hwnd = nullptr); + +// Scale given value according to given DPI +int ScaleForDpi(UINT dpi, int value); +// Scale given value according to DPI of window +int ScaleForDpi(HWND hwnd, int value); + extern HINSTANCE g_Instance; const int ANIM_BUTTON_TAG1='ANM'; diff --git a/Src/Lib/Settings.cpp b/Src/Lib/Settings.cpp index df9646f4e..599cb9fed 100644 --- a/Src/Lib/Settings.cpp +++ b/Src/Lib/Settings.cpp @@ -13,17 +13,12 @@ #include #include #include +#include #include #include #include #include -#ifdef BUILD_SETUP -#define DOC_PATH L"" -#else -#define DOC_PATH L"..\\..\\Docs\\Help\\" -#endif - /////////////////////////////////////////////////////////////////////////////// // Read/Write lock for accessing the settings. Can't be acquired recursively. Only the main UI thread (the one displaying the settings UI) @@ -125,7 +120,7 @@ bool CSetting::IsEnabled( void ) const if (operation=='>' && pSetting->GetValue().intVal<=val) return false; } - if ((pSetting->type==CSetting::TYPE_STRING || pSetting->type==CSetting::TYPE_BITMAP || pSetting->type==CSetting::TYPE_BITMAP_JPG) && pSetting->GetValue().vt==VT_BSTR) + if ((pSetting->type==CSetting::TYPE_STRING || pSetting->type==CSetting::TYPE_BITMAP || pSetting->type==CSetting::TYPE_BITMAP_JPG || pSetting->type==CSetting::TYPE_DIRECTORY) && pSetting->GetValue().vt==VT_BSTR) { if (operation=='~' && *pSetting->GetValue().bstrVal==0) return false; @@ -202,7 +197,7 @@ bool CSetting::ReadValue( CRegKey ®Key, const wchar_t *valName ) } // string - if (type>=CSetting::TYPE_STRING && type=CSetting::TYPE_STRING && type!=CSetting::TYPE_MULTISTRING) { ULONG len; if (regKey.QueryStringValue(valName,NULL,&len)==ERROR_SUCCESS) @@ -984,7 +979,7 @@ void CSettingsManager::ResetSettings( void ) HIMAGELIST CSettingsManager::GetImageList( HWND tree ) { if (m_ImageList) return m_ImageList; - HTHEME theme=OpenThemeData(tree,L"button"); + HTHEME theme=OpenThemeData(GetParent(tree),L"button"); HDC hdc=CreateCompatibleDC(NULL); int iconSize=(TreeView_GetItemHeight(tree)<32)?16:32; int checkSize=16; @@ -1114,7 +1109,7 @@ class CSettingsDlg: public CResizeableDlg { public: CSettingsDlg( void ); - void Init( CSetting *pSettings, ICustomSettings *pCustom, int tab ); + void Init( CSetting *pSettings, ICustomSettings *pCustom, int tab, const wchar_t* appId ); BEGIN_MSG_MAP( CSettingsDlg ) MESSAGE_HANDLER( WM_INITDIALOG, OnInitDialog ) @@ -1188,6 +1183,7 @@ class CSettingsDlg: public CResizeableDlg bool m_bIgnoreEdit; bool m_bDirty; CString m_FilterText; + const wchar_t* m_AppId; void AddTabs( int name, const CSetting *pSelect=NULL ); void SetCurTab( int index, bool bReset, const CSetting *pSelect=NULL ); @@ -1220,15 +1216,17 @@ CSettingsDlg::CSettingsDlg( void ) m_bOnTop=false; m_bIgnoreEdit=false; m_bDirty=false; + m_AppId=NULL; } -void CSettingsDlg::Init( CSetting *pSettings, ICustomSettings *pCustom, int tab ) +void CSettingsDlg::Init( CSetting *pSettings, ICustomSettings *pCustom, int tab, const wchar_t* appId ) { m_pSettings=pSettings; m_pCustom=pCustom; m_InitialTab=tab; m_FilterText.Empty(); m_bDirty=false; + m_AppId=appId; } // Subclass the tooltip to delay the tip when the mouse moves from one tree item to the next @@ -1252,17 +1250,19 @@ LRESULT CSettingsDlg::OnInitDialog( UINT uMsg, WPARAM wParam, LPARAM lParam, BOO #ifdef _DEBUG g_bUIThread=true; #endif -/* - // attempt to make the dialog have its own icon. doesn't work though. the icon changes, but to the default folder icon - CComPtr pStore; - if (SUCCEEDED(SHGetPropertyStoreForWindow(m_hWnd,IID_IPropertyStore,(void**)&pStore))) + + if (m_AppId) { - PROPVARIANT val; - val.vt=VT_LPWSTR; - val.pwszVal=L"OpenShell.Settings.Dialog"; - pStore->SetValue(PKEY_AppUserModel_ID,val); + // attempt to make the dialog have its own icon + CComPtr pStore; + if (SUCCEEDED(SHGetPropertyStoreForWindow(m_hWnd,IID_IPropertyStore,(void**)&pStore))) + { + PROPVARIANT val; + InitPropVariantFromString(m_AppId,&val); + pStore->SetValue(PKEY_AppUserModel_ID,val); + } } -*/ + InitResize(MOVE_MODAL); HMENU menu=GetSystemMenu(FALSE); bool bAdded=false; @@ -1670,7 +1670,7 @@ LRESULT CSettingsDlg::OnBackup( WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& ofn.lpstrTitle=title; ofn.lpstrDefExt=L".xml"; ofn.Flags=OFN_DONTADDTORECENT|OFN_ENABLESIZING|OFN_EXPLORER|OFN_PATHMUSTEXIST|OFN_OVERWRITEPROMPT|OFN_HIDEREADONLY|OFN_NOCHANGEDIR; - if (GetSaveFileName(&ofn)) + if (GetSaveFileNameSafe(&ofn)) { CString err=g_SettingsManager.SaveSettingsXml(path); if (!err.IsEmpty()) @@ -1699,8 +1699,9 @@ LRESULT CSettingsDlg::OnBackup( WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& CString title=LoadStringEx(IDS_XML_TITLE_LOAD); ofn.lpstrTitle=title; ofn.Flags=OFN_DONTADDTORECENT|OFN_ENABLESIZING|OFN_EXPLORER|OFN_FILEMUSTEXIST|OFN_HIDEREADONLY|OFN_NOCHANGEDIR; - if (GetOpenFileName(&ofn)) + if (GetOpenFileNameSafe(&ofn)) { + SetCurTab(m_Index,true); // reload tab once to force-close any active edit boxes CString error=g_SettingsManager.LoadSettingsXml(path); if (!error.IsEmpty()) { @@ -1710,7 +1711,7 @@ LRESULT CSettingsDlg::OnBackup( WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& ::MessageBox(m_hWnd,text,LoadStringEx(IDS_ERROR_TITLE),MB_OK|MB_ICONERROR); } SetSettingsDirty(); - SetCurTab(m_Index,true); + SetCurTab(m_Index,true); // reload tab again to show the new settings } } if (res==3) @@ -1845,7 +1846,7 @@ bool CSettingsDlg::IsTabValid( void ) static CSettingsDlg g_SettingsDlg; -void EditSettings( const wchar_t *title, bool bModal, int tab ) +void EditSettings( const wchar_t *title, bool bModal, int tab, const wchar_t* appId ) { if (g_SettingsDlg.m_hWnd) { @@ -1863,7 +1864,7 @@ void EditSettings( const wchar_t *title, bool bModal, int tab ) } DLGTEMPLATE *pTemplate=LoadDialogEx(IDD_SETTINGS); g_SettingsManager.ResetImageList(); - g_SettingsDlg.Init(g_SettingsManager.GetSettings(),g_SettingsManager.GetCustom(),tab); + g_SettingsDlg.Init(g_SettingsManager.GetSettings(),g_SettingsManager.GetCustom(),tab,appId); g_SettingsDlg.Create(NULL,pTemplate); g_SettingsDlg.SetWindowText(title); g_SettingsDlg.SetWindowPos(HWND_TOPMOST,0,0,0,0,SWP_NOSIZE|SWP_NOMOVE|(g_SettingsDlg.GetOnTop()?0:SWP_NOZORDER)|SWP_SHOWWINDOW); @@ -1951,6 +1952,13 @@ bool ImportSettingsXml( const wchar_t *fname ) if (error.IsEmpty()) { g_SettingsManager.SaveSettings(false); + + // we have successfuly imported settings from XML + // so there is no need to show settings dialog when start menu is triggered for the first time + CRegKey regKey; + if (regKey.Open(HKEY_CURRENT_USER,GetSettingsRegPath())==ERROR_SUCCESS) + regKey.SetDWORDValue(L"ShowedStyle2",1); + return true; } @@ -2177,7 +2185,7 @@ bool HasHelp( void ) GetModuleFileName(_AtlBaseModule.GetResourceInstance(),path,_countof(path)); *PathFindFileName(path)=0; wchar_t topic[_MAX_PATH]; - Sprintf(topic,_countof(topic),L"%s%sOpenShell.chm",path,GetDocRelativePath()); + Sprintf(topic,_countof(topic),L"%sOpenShell.chm",path); return (GetFileAttributes(topic)!=INVALID_FILE_ATTRIBUTES); } @@ -2187,7 +2195,7 @@ void ShowHelp( void ) GetModuleFileName(_AtlBaseModule.GetResourceInstance(),path,_countof(path)); *PathFindFileName(path)=0; wchar_t topic[_MAX_PATH]; - Sprintf(topic,_countof(topic),L"%s%sOpenShell.chm::/%s.html",path,GetDocRelativePath(),PathFindFileName(g_SettingsManager.GetRegPath())); + Sprintf(topic,_countof(topic),L"%sOpenShell.chm::/%s.html",path,PathFindFileName(g_SettingsManager.GetRegPath())); HtmlHelp(GetDesktopWindow(),topic,HH_DISPLAY_TOPIC,NULL); } @@ -2208,7 +2216,7 @@ bool GetSettingBool( const CSetting &setting ) CString GetSettingString( const CSetting &setting ) { - Assert(setting.type==CSetting::TYPE_STRING); + Assert(setting.type==CSetting::TYPE_STRING || setting.type==CSetting::TYPE_DIRECTORY); if (setting.value.vt!=VT_BSTR) return CString(); return setting.value.bstrVal; @@ -2709,7 +2717,7 @@ bool SaveAdmx( TSettingsComponent component, const char *admxFile, const char *a { fprintf_s(fAdmx,"\t\t\t\t\r\n",pSetting->name); } - else if (pSetting->type==CSetting::TYPE_STRING || pSetting->type==CSetting::TYPE_ICON || pSetting->type==CSetting::TYPE_BITMAP || pSetting->type==CSetting::TYPE_BITMAP_JPG || pSetting->type==CSetting::TYPE_SOUND || pSetting->type==CSetting::TYPE_FONT) + else if (pSetting->type==CSetting::TYPE_STRING || pSetting->type==CSetting::TYPE_ICON || pSetting->type==CSetting::TYPE_BITMAP || pSetting->type==CSetting::TYPE_BITMAP_JPG || pSetting->type==CSetting::TYPE_SOUND || pSetting->type==CSetting::TYPE_FONT || pSetting->type==CSetting::TYPE_DIRECTORY) { fprintf_s(fAdmx,"\t\t\t\t\r\n",pSetting->name); } @@ -2769,7 +2777,7 @@ bool SaveAdmx( TSettingsComponent component, const char *admxFile, const char *a { fprintf_s(fAdml,"\t\t\t\t%s\r\n",(const char*)name); } - else if (pSetting->type==CSetting::TYPE_STRING || pSetting->type==CSetting::TYPE_ICON || pSetting->type==CSetting::TYPE_BITMAP || pSetting->type==CSetting::TYPE_BITMAP_JPG || pSetting->type==CSetting::TYPE_SOUND || pSetting->type==CSetting::TYPE_FONT) + else if (pSetting->type==CSetting::TYPE_STRING || pSetting->type==CSetting::TYPE_ICON || pSetting->type==CSetting::TYPE_BITMAP || pSetting->type==CSetting::TYPE_BITMAP_JPG || pSetting->type==CSetting::TYPE_SOUND || pSetting->type==CSetting::TYPE_FONT || pSetting->type==CSetting::TYPE_DIRECTORY) { fprintf_s(fAdml,"\t\t\t\t\r\n",(const char*)name); } diff --git a/Src/Lib/Settings.h b/Src/Lib/Settings.h index 0306a85d2..92fa88f25 100644 --- a/Src/Lib/Settings.h +++ b/Src/Lib/Settings.h @@ -32,6 +32,7 @@ struct CSetting TYPE_SOUND, TYPE_FONT, TYPE_MULTISTRING, + TYPE_DIRECTORY, }; enum @@ -128,14 +129,13 @@ void InitSettings( CSetting *pSettings, TSettingsComponent component, ICustomSet void LoadSettings( void ); void SaveSettings( void ); void UpdateDefaultSettings( void ); -void EditSettings( const wchar_t *title, bool bModal, int tab ); +void EditSettings( const wchar_t *title, bool bModal, int tab, const wchar_t *appId = nullptr ); void CloseSettings( void ); void SetSettingsDirty( void ); void SelectSettingsTab( int tab, bool bAdvanced, const CSetting *pSelect ); void UpdateSettings( void ); // implemented by the user void UpgradeSettings( bool bShared ); // implemented by the user (called when converting 3.0 settings to 4.0) void ClosingSettings( HWND hWnd, int flags, int command ); // implemented by the user -const wchar_t *GetDocRelativePath( void ); // implemented by the user void SettingChangedCallback( const CSetting *pSetting ); // implemented by the user bool IsSettingsMessage( MSG *msg ); bool ImportSettingsXml( const wchar_t *fname ); diff --git a/Src/Lib/SettingsUIHelper.cpp b/Src/Lib/SettingsUIHelper.cpp index 05e2c03ad..9b988e282 100644 --- a/Src/Lib/SettingsUIHelper.cpp +++ b/Src/Lib/SettingsUIHelper.cpp @@ -15,6 +15,7 @@ #include #include #include +#include const KNOWNFOLDERID FOLDERID_DesktopRoot={'DESK', 'TO', 'P', {'D', 'E', 'S', 'K', 'T', 'O', 'P', 0x00}}; @@ -1193,7 +1194,7 @@ bool BrowseCommandHelper( HWND parent, wchar_t *text ) ofn.lpstrFile=text; ofn.nMaxFile=_MAX_PATH; ofn.Flags=OFN_DONTADDTORECENT|OFN_ENABLESIZING|OFN_EXPLORER|OFN_FILEMUSTEXIST|OFN_HIDEREADONLY|OFN_NOCHANGEDIR|OFN_NODEREFERENCELINKS; - if (GetOpenFileName(&ofn)) + if (GetOpenFileNameSafe(&ofn)) { wchar_t buf[_MAX_PATH]; UnExpandEnvStrings(text,buf,_countof(buf)); @@ -1216,7 +1217,8 @@ bool BrowseCommandHelper( HWND parent, wchar_t *text ) return false; } -bool BrowseLinkHelper( HWND parent, wchar_t *text ) +// Internal implementation that must be run on an STA thread with COM initialized. +static bool BrowseLinkHelperImpl( HWND parent, wchar_t *text, bool bFoldersOnly ) { DoEnvironmentSubst(text,_MAX_PATH); @@ -1227,16 +1229,22 @@ bool BrowseLinkHelper( HWND parent, wchar_t *text ) if (!pCustomize) return false; - pDialog->SetTitle(LoadStringEx(IDS_PICK_LINK_TITLE)); - pDialog->SetOkButtonLabel(LoadStringEx(IDS_PICK_LINK_FILE)); - wchar_t button[256]; - Sprintf(button,_countof(button),L" %s ",LoadStringEx(IDS_PICK_LINK_FOLDER)); - pCustomize->AddPushButton(101,button); + pDialog->SetTitle(LoadStringEx(bFoldersOnly?IDS_PICK_LINK_FOLDER:IDS_PICK_LINK_TITLE)); + if (!bFoldersOnly) // add separate buttons for selecting files/folders to the dialog + { + pDialog->SetOkButtonLabel(LoadStringEx(IDS_PICK_LINK_FILE)); + wchar_t button[256]; + Sprintf(button,_countof(button),L" %s ",LoadStringEx(IDS_PICK_LINK_FOLDER)); + pCustomize->AddPushButton(101,button); + } CBrowseLinkEvents events; DWORD cookie; pDialog->Advise(&events,&cookie); - pDialog->SetOptions(FOS_ALLNONSTORAGEITEMS|FOS_FILEMUSTEXIST|FOS_DONTADDTORECENT|FOS_DEFAULTNOMINIMODE|FOS_NODEREFERENCELINKS); + if (bFoldersOnly) // set FOS_PICKFOLDERS option to use dialog in folder-only mode + pDialog->SetOptions(FOS_PICKFOLDERS|FOS_ALLNONSTORAGEITEMS|FOS_DONTADDTORECENT|FOS_DEFAULTNOMINIMODE); + else + pDialog->SetOptions(FOS_ALLNONSTORAGEITEMS|FOS_FILEMUSTEXIST|FOS_DONTADDTORECENT|FOS_DEFAULTNOMINIMODE|FOS_NODEREFERENCELINKS); { const wchar_t *c=wcschr(text,'|'); if (c) @@ -1270,6 +1278,41 @@ bool BrowseLinkHelper( HWND parent, wchar_t *text ) return pResult!=NULL; } +// Run IFileOpenDialog on a separate STA thread and pump messages on the caller while waiting. +bool BrowseLinkHelper( HWND parent, wchar_t *text, bool bFoldersOnly ) +{ + bool result = false; + + std::thread worker([&parent, &text, &bFoldersOnly, &result]() mutable { + CoInitializeEx(NULL, COINIT_APARTMENTTHREADED); + result = BrowseLinkHelperImpl(parent, text, bFoldersOnly); + CoUninitialize(); + }); + + // Pump messages while waiting for the worker (dialog) to finish + while (true) + { + HANDLE hWorker = worker.native_handle(); + if (MsgWaitForMultipleObjects(1, &hWorker, FALSE, INFINITE, QS_ALLINPUT) == WAIT_OBJECT_0) + break; + + MSG msg; + while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) + { + if (msg.message == WM_QUIT) + { + PostQuitMessage((int)msg.wParam); + break; + } + TranslateMessage(&msg); + DispatchMessage(&msg); + } + } + worker.join(); + + return result; +} + bool BrowseIconHelper( HWND parent, wchar_t *text ) { int id=0; @@ -2005,7 +2048,7 @@ LRESULT CBrowseForIconDlg::OnBrowse( WORD wNotifyCode, WORD wID, HWND hWndCtl, B CString title=LoadStringEx(IDS_ICON_TITLE); ofn.lpstrTitle=title; ofn.Flags=OFN_DONTADDTORECENT|OFN_ENABLESIZING|OFN_EXPLORER|OFN_FILEMUSTEXIST|OFN_HIDEREADONLY|OFN_NOCHANGEDIR; - if (GetOpenFileName(&ofn)) + if (GetOpenFileNameSafe(&ofn)) { wchar_t buf[_MAX_PATH]; UnExpandEnvStrings(path,buf,_countof(buf)); @@ -2204,7 +2247,7 @@ bool BrowseForBitmap( HWND hWndParent, wchar_t *path, bool bAllowJpeg ) CString title=LoadStringEx(IDS_BMP_TITLE); ofn.lpstrTitle=title; ofn.Flags=OFN_DONTADDTORECENT|OFN_ENABLESIZING|OFN_EXPLORER|OFN_FILEMUSTEXIST|OFN_HIDEREADONLY|OFN_NOCHANGEDIR; - if (GetOpenFileName(&ofn)) + if (GetOpenFileNameSafe(&ofn)) { wchar_t buf[_MAX_PATH]; UnExpandEnvStrings(path,buf,_countof(buf)); @@ -2236,7 +2279,7 @@ bool BrowseForSound( HWND hWndParent, wchar_t *path ) CString title=LoadStringEx(IDS_WAV_TITLE); ofn.lpstrTitle=title; ofn.Flags=OFN_DONTADDTORECENT|OFN_ENABLESIZING|OFN_EXPLORER|OFN_FILEMUSTEXIST|OFN_HIDEREADONLY|OFN_NOCHANGEDIR; - if (GetOpenFileName(&ofn)) + if (GetOpenFileNameSafe(&ofn)) { wchar_t buf[_MAX_PATH]; UnExpandEnvStrings(path,buf,_countof(buf)); @@ -2271,6 +2314,7 @@ class CTreeSettingsDlg: public CResizeableDlg EDIT_HOTKEY_ANY, EDIT_COLOR, EDIT_FONT, + EDIT_DIRECTORY, }; BEGIN_MSG_MAP( CTreeSettingsDlg ) @@ -2644,15 +2688,14 @@ LRESULT CTreeSettingsDlg::OnBrowse( WORD wNotifyCode, WORD wID, HWND hWndCtl, BO CString str; m_EditBox.GetWindowText(str); str.TrimLeft(); str.TrimRight(); - wchar_t *end; - COLORREF val=wcstol(str,&end,16)&0xFFFFFF; + COLORREF val=RgbToBgr(ParseColor(str)); static COLORREF customColors[16]; CHOOSECOLOR choose={sizeof(choose),m_hWnd,NULL,val,customColors}; choose.Flags=CC_ANYCOLOR|CC_FULLOPEN|CC_RGBINIT; if (ChooseColor(&choose)) { wchar_t text[100]; - Sprintf(text,_countof(text),L"%06X",choose.rgbResult); + Sprintf(text,_countof(text),L"%06X",BgrToRgb(choose.rgbResult)); m_EditBox.SetWindowText(text); ApplyEditBox(); UpdateGroup(m_pEditSetting); @@ -2695,7 +2738,7 @@ LRESULT CTreeSettingsDlg::OnBrowse( WORD wNotifyCode, WORD wID, HWND hWndCtl, BO else if (_wcsicmp(token,L"bold_italic")==0) font.lfWeight=FW_BOLD, font.lfItalic=1; str=GetToken(str,token,_countof(token),L", \t"); - font.lfHeight=-(_wtol(token)*dpi+36)/72; + font.lfHeight=-MulDiv(_wtol(token),dpi,72); CHOOSEFONT choose={sizeof(choose),m_hWnd,NULL,&font}; choose.Flags=CF_NOSCRIPTSEL; @@ -2714,6 +2757,29 @@ LRESULT CTreeSettingsDlg::OnBrowse( WORD wNotifyCode, WORD wID, HWND hWndCtl, BO m_EditBox.SetFocus(); m_bIgnoreFocus=false; } + else if (m_EditMode==EDIT_DIRECTORY) + { + m_bIgnoreFocus=true; + CString str; + m_EditBox.GetWindowText(str); + str.TrimLeft(); str.TrimRight(); + wchar_t text[1024]; + DWORD dwAttrs=GetFileAttributes(str); // ensure directory exists before passing it to dialog + if (dwAttrs!=INVALID_FILE_ATTRIBUTES && dwAttrs&FILE_ATTRIBUTE_DIRECTORY) + { + Strcpy(text,_countof(text),str); + DoEnvironmentSubst(text,_countof(text)); + } + else + text[0]=0; + Strcpy(text,_countof(text),str); + DoEnvironmentSubst(text,_countof(text)); + if (BrowseLinkHelper(m_hWnd,text,true)) + m_EditBox.SetWindowText(text); + SendMessage(WM_NEXTDLGCTL,(LPARAM)m_EditBox.m_hWnd,TRUE); + m_EditBox.SetFocus(); + m_bIgnoreFocus=false; + } return 0; } @@ -3018,8 +3084,7 @@ void CTreeSettingsDlg::ApplyEditBox( void ) } else if (pSetting->type==CSetting::TYPE_COLOR) { - wchar_t *end; - int val=wcstol(str,&end,16)&0xFFFFFF; + int val=RgbToBgr(ParseColor(str)); if (pSetting->value.vt!=VT_I4 || pSetting->value.intVal!=val) { pSetting->value=CComVariant(val); @@ -3034,6 +3099,20 @@ void CTreeSettingsDlg::ApplyEditBox( void ) pSetting->flags&=~CSetting::FLAG_DEFAULT; } } + else if (pSetting->type==CSetting::TYPE_DIRECTORY) + { + if (pSetting->value.vt!=VT_BSTR || str!=pSetting->value.bstrVal) + { + if (str.IsEmpty()) // empty directory strings cause unexpected behavior, so we reset to avoid this + pSetting->value=pSetting->defValue; + else // otherwise we are very lenient about what users can input as a path + pSetting->value=CComVariant(str); + if (pSetting->value==pSetting->defValue) + pSetting->flags|=CSetting::FLAG_DEFAULT; + else + pSetting->flags&=~CSetting::FLAG_DEFAULT; + } + } else { if (pSetting->value.vt!=VT_BSTR || str!=pSetting->value.bstrVal) @@ -3074,7 +3153,7 @@ void CTreeSettingsDlg::ItemSelected( HTREEITEM hItem, CSetting *pSetting, bool b val=valVar.intVal; Sprintf(text,_countof(text),L"%d",val); } - else if (pSetting->type==CSetting::TYPE_STRING || pSetting->type==CSetting::TYPE_ICON || pSetting->type==CSetting::TYPE_BITMAP || pSetting->type==CSetting::TYPE_BITMAP_JPG || pSetting->type==CSetting::TYPE_SOUND || pSetting->type==CSetting::TYPE_FONT) + else if (pSetting->type==CSetting::TYPE_STRING || pSetting->type==CSetting::TYPE_ICON || pSetting->type==CSetting::TYPE_BITMAP || pSetting->type==CSetting::TYPE_BITMAP_JPG || pSetting->type==CSetting::TYPE_SOUND || pSetting->type==CSetting::TYPE_FONT || pSetting->type==CSetting::TYPE_DIRECTORY) { if (valVar.vt==VT_BSTR) Strcpy(text,_countof(text),valVar.bstrVal); @@ -3090,8 +3169,10 @@ void CTreeSettingsDlg::ItemSelected( HTREEITEM hItem, CSetting *pSetting, bool b mode=EDIT_BITMAP_JPG; else if (pSetting->type==CSetting::TYPE_SOUND) mode=EDIT_SOUND; - else + else if (pSetting->type==CSetting::TYPE_FONT) mode=EDIT_FONT; + else + mode=EDIT_DIRECTORY; } else if (pSetting->type==CSetting::TYPE_HOTKEY || pSetting->type==CSetting::TYPE_HOTKEY_ANY) { @@ -3110,7 +3191,7 @@ void CTreeSettingsDlg::ItemSelected( HTREEITEM hItem, CSetting *pSetting, bool b mode=EDIT_COLOR; int val=0; if (valVar.vt==VT_I4) - val=valVar.intVal; + val=BgrToRgb(valVar.intVal); Sprintf(text,_countof(text),L"%06X",val); } } @@ -3131,7 +3212,7 @@ void CTreeSettingsDlg::ItemSelected( HTREEITEM hItem, CSetting *pSetting, bool b m_pEditSetting=pSetting; } - if (mode==EDIT_ICON || mode==EDIT_BITMAP || mode==EDIT_BITMAP_JPG || mode==EDIT_SOUND || mode==EDIT_FONT || mode==EDIT_COLOR) + if (mode==EDIT_ICON || mode==EDIT_BITMAP || mode==EDIT_BITMAP_JPG || mode==EDIT_SOUND || mode==EDIT_FONT || mode==EDIT_COLOR || mode==EDIT_DIRECTORY) { RECT rc2=rc; int width=(rc2.bottom-rc2.top)*3/2; @@ -3189,14 +3270,15 @@ void CTreeSettingsDlg::UpdateEditPosition( void ) DeleteDC(hdc); DWORD margins=(DWORD)m_EditBox.SendMessage(EM_GETMARGINS); size.cx+=HIWORD(margins)+LOWORD(margins)+12; - if (m_EditMode==EDIT_ICON || m_EditMode==EDIT_BITMAP || m_EditMode==EDIT_BITMAP_JPG || m_EditMode==EDIT_FONT || m_EditMode==EDIT_COLOR) + // adjust size and position of edit boxes for settings that use browse/play buttons + if (m_EditMode==EDIT_ICON || m_EditMode==EDIT_BITMAP || m_EditMode==EDIT_BITMAP_JPG || m_EditMode==EDIT_FONT || m_EditMode==EDIT_COLOR || m_EditMode==EDIT_DIRECTORY) size.cx+=width; if (m_EditMode==EDIT_SOUND) size.cx+=width*2; if (size.cxIsDefault(); const CComVariant &valVar=pSetting->GetValue(); + // check if modified items should be bold + bool bBoldSettings=GetSettingBool(L"BoldSettings"); + // calculate text if (pSetting!=m_pEditSetting) { @@ -3412,7 +3497,7 @@ void CTreeSettingsDlg::UpdateGroup( const CSetting *pModified ) CString str=LoadStringEx(pSetting->nameID); int val=0; if (valVar.vt==VT_I4) - val=valVar.intVal; + val=BgrToRgb(valVar.intVal); Sprintf(text,_countof(text),L"%s: %06X",str,val); item.mask|=TVIF_TEXT; } @@ -3458,7 +3543,7 @@ void CTreeSettingsDlg::UpdateGroup( const CSetting *pModified ) DeleteDC(hdc); DeleteDC(hdcMask); } - int state=bDefault?0:TVIS_BOLD; + int state=bDefault||!bBoldSettings?0:TVIS_BOLD; // check if item should be highlighted in bold if (!bEnabled) { if (pSetting->type!=CSetting::TYPE_COLOR) image|=SETTING_STATE_DISABLED; @@ -3566,3 +3651,65 @@ bool CDefaultSettingsPanel::Validate( HWND parent ) s_Dialog.Validate(); return true; } + +DWORD RgbToBgr(DWORD val) +{ + return ((val & 0xFF) << 16) | (val & 0xFF00) | ((val >> 16) & 0xFF); +} + +DWORD BgrToRgb(DWORD val) +{ + return RgbToBgr(val); +} + +DWORD ParseColor(const wchar_t* str) +{ + wchar_t* end; + return wcstoul(str, &end, 16) & 0xFFFFFF; +} + +// Run GetOpenFileName/GetSaveFileName on a separate STA thread and pump messages on the caller +template +static BOOL GetFileNameSafe(OPENFILENAME* pOfn) +{ + BOOL result = FALSE; + + std::thread worker([&pOfn, &result]() mutable { + CoInitializeEx(NULL, COINIT_APARTMENTTHREADED); + result = Fnc(pOfn); + CoUninitialize(); + }); + + // Pump messages while waiting for the worker (dialog) to finish + while (true) + { + HANDLE hWorker = worker.native_handle(); + if (MsgWaitForMultipleObjects(1, &hWorker, FALSE, INFINITE, QS_ALLINPUT) == WAIT_OBJECT_0) + break; + + MSG msg; + while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) + { + if (msg.message == WM_QUIT) + { + PostQuitMessage((int)msg.wParam); + break; + } + TranslateMessage(&msg); + DispatchMessage(&msg); + } + } + worker.join(); + + return result; +} + +BOOL GetOpenFileNameSafe(OPENFILENAME* pOfn) +{ + return GetFileNameSafe(pOfn); +} + +BOOL GetSaveFileNameSafe(OPENFILENAME* pOfn) +{ + return GetFileNameSafe(pOfn); +} diff --git a/Src/Lib/SettingsUIHelper.h b/Src/Lib/SettingsUIHelper.h index cd37bcc0a..8a66f72c3 100644 --- a/Src/Lib/SettingsUIHelper.h +++ b/Src/Lib/SettingsUIHelper.h @@ -385,5 +385,17 @@ const wchar_t *GetSettingsRegPath( void ); extern const GUID FOLDERID_DesktopRoot; bool BrowseCommandHelper( HWND parent, wchar_t *text ); -bool BrowseLinkHelper( HWND parent, wchar_t *text ); +bool BrowseLinkHelper( HWND parent, wchar_t *text, bool bFoldersOnly ); bool BrowseIconHelper( HWND parent, wchar_t *text ); + +// convert color in RRGGBB format to BBGGRR +DWORD RgbToBgr(DWORD val); +// convert color in BBGGRR format to RRGGBB +DWORD BgrToRgb(DWORD val); + +// parse color from hexadecimal string +DWORD ParseColor(const wchar_t* str); + +// safe versions of GetOpenFileName/GetSaveFileName (run API on a separate STA thread and pump messages on the caller) +BOOL GetOpenFileNameSafe(OPENFILENAME* pOfn); +BOOL GetSaveFileNameSafe(OPENFILENAME* pOfn); diff --git a/Src/Lib/json.hpp b/Src/Lib/json.hpp deleted file mode 100644 index a70aaf8cb..000000000 --- a/Src/Lib/json.hpp +++ /dev/null @@ -1,25447 +0,0 @@ -/* - __ _____ _____ _____ - __| | __| | | | JSON for Modern C++ -| | |__ | | | | | | version 3.9.1 -|_____|_____|_____|_|___| https://github.com/nlohmann/json - -Licensed under the MIT License . -SPDX-License-Identifier: MIT -Copyright (c) 2013-2019 Niels Lohmann . - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. -*/ - -#ifndef INCLUDE_NLOHMANN_JSON_HPP_ -#define INCLUDE_NLOHMANN_JSON_HPP_ - -#define NLOHMANN_JSON_VERSION_MAJOR 3 -#define NLOHMANN_JSON_VERSION_MINOR 9 -#define NLOHMANN_JSON_VERSION_PATCH 1 - -#include // all_of, find, for_each -#include // nullptr_t, ptrdiff_t, size_t -#include // hash, less -#include // initializer_list -#include // istream, ostream -#include // random_access_iterator_tag -#include // unique_ptr -#include // accumulate -#include // string, stoi, to_string -#include // declval, forward, move, pair, swap -#include // vector - -// #include - - -#include - -// #include - - -#include // transform -#include // array -#include // forward_list -#include // inserter, front_inserter, end -#include // map -#include // string -#include // tuple, make_tuple -#include // is_arithmetic, is_same, is_enum, underlying_type, is_convertible -#include // unordered_map -#include // pair, declval -#include // valarray - -// #include - - -#include // exception -#include // runtime_error -#include // to_string - -// #include - - -#include // size_t - -namespace nlohmann -{ -namespace detail -{ -/// struct to capture the start position of the current token -struct position_t -{ - /// the total number of characters read - std::size_t chars_read_total = 0; - /// the number of characters read in the current line - std::size_t chars_read_current_line = 0; - /// the number of lines read - std::size_t lines_read = 0; - - /// conversion to size_t to preserve SAX interface - constexpr operator size_t() const - { - return chars_read_total; - } -}; - -} // namespace detail -} // namespace nlohmann - -// #include - - -#include // pair -// #include -/* Hedley - https://nemequ.github.io/hedley - * Created by Evan Nemerson - * - * To the extent possible under law, the author(s) have dedicated all - * copyright and related and neighboring rights to this software to - * the public domain worldwide. This software is distributed without - * any warranty. - * - * For details, see . - * SPDX-License-Identifier: CC0-1.0 - */ - -#if !defined(JSON_HEDLEY_VERSION) || (JSON_HEDLEY_VERSION < 13) -#if defined(JSON_HEDLEY_VERSION) - #undef JSON_HEDLEY_VERSION -#endif -#define JSON_HEDLEY_VERSION 13 - -#if defined(JSON_HEDLEY_STRINGIFY_EX) - #undef JSON_HEDLEY_STRINGIFY_EX -#endif -#define JSON_HEDLEY_STRINGIFY_EX(x) #x - -#if defined(JSON_HEDLEY_STRINGIFY) - #undef JSON_HEDLEY_STRINGIFY -#endif -#define JSON_HEDLEY_STRINGIFY(x) JSON_HEDLEY_STRINGIFY_EX(x) - -#if defined(JSON_HEDLEY_CONCAT_EX) - #undef JSON_HEDLEY_CONCAT_EX -#endif -#define JSON_HEDLEY_CONCAT_EX(a,b) a##b - -#if defined(JSON_HEDLEY_CONCAT) - #undef JSON_HEDLEY_CONCAT -#endif -#define JSON_HEDLEY_CONCAT(a,b) JSON_HEDLEY_CONCAT_EX(a,b) - -#if defined(JSON_HEDLEY_CONCAT3_EX) - #undef JSON_HEDLEY_CONCAT3_EX -#endif -#define JSON_HEDLEY_CONCAT3_EX(a,b,c) a##b##c - -#if defined(JSON_HEDLEY_CONCAT3) - #undef JSON_HEDLEY_CONCAT3 -#endif -#define JSON_HEDLEY_CONCAT3(a,b,c) JSON_HEDLEY_CONCAT3_EX(a,b,c) - -#if defined(JSON_HEDLEY_VERSION_ENCODE) - #undef JSON_HEDLEY_VERSION_ENCODE -#endif -#define JSON_HEDLEY_VERSION_ENCODE(major,minor,revision) (((major) * 1000000) + ((minor) * 1000) + (revision)) - -#if defined(JSON_HEDLEY_VERSION_DECODE_MAJOR) - #undef JSON_HEDLEY_VERSION_DECODE_MAJOR -#endif -#define JSON_HEDLEY_VERSION_DECODE_MAJOR(version) ((version) / 1000000) - -#if defined(JSON_HEDLEY_VERSION_DECODE_MINOR) - #undef JSON_HEDLEY_VERSION_DECODE_MINOR -#endif -#define JSON_HEDLEY_VERSION_DECODE_MINOR(version) (((version) % 1000000) / 1000) - -#if defined(JSON_HEDLEY_VERSION_DECODE_REVISION) - #undef JSON_HEDLEY_VERSION_DECODE_REVISION -#endif -#define JSON_HEDLEY_VERSION_DECODE_REVISION(version) ((version) % 1000) - -#if defined(JSON_HEDLEY_GNUC_VERSION) - #undef JSON_HEDLEY_GNUC_VERSION -#endif -#if defined(__GNUC__) && defined(__GNUC_PATCHLEVEL__) - #define JSON_HEDLEY_GNUC_VERSION JSON_HEDLEY_VERSION_ENCODE(__GNUC__, __GNUC_MINOR__, __GNUC_PATCHLEVEL__) -#elif defined(__GNUC__) - #define JSON_HEDLEY_GNUC_VERSION JSON_HEDLEY_VERSION_ENCODE(__GNUC__, __GNUC_MINOR__, 0) -#endif - -#if defined(JSON_HEDLEY_GNUC_VERSION_CHECK) - #undef JSON_HEDLEY_GNUC_VERSION_CHECK -#endif -#if defined(JSON_HEDLEY_GNUC_VERSION) - #define JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_GNUC_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) -#else - #define JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch) (0) -#endif - -#if defined(JSON_HEDLEY_MSVC_VERSION) - #undef JSON_HEDLEY_MSVC_VERSION -#endif -#if defined(_MSC_FULL_VER) && (_MSC_FULL_VER >= 140000000) - #define JSON_HEDLEY_MSVC_VERSION JSON_HEDLEY_VERSION_ENCODE(_MSC_FULL_VER / 10000000, (_MSC_FULL_VER % 10000000) / 100000, (_MSC_FULL_VER % 100000) / 100) -#elif defined(_MSC_FULL_VER) - #define JSON_HEDLEY_MSVC_VERSION JSON_HEDLEY_VERSION_ENCODE(_MSC_FULL_VER / 1000000, (_MSC_FULL_VER % 1000000) / 10000, (_MSC_FULL_VER % 10000) / 10) -#elif defined(_MSC_VER) - #define JSON_HEDLEY_MSVC_VERSION JSON_HEDLEY_VERSION_ENCODE(_MSC_VER / 100, _MSC_VER % 100, 0) -#endif - -#if defined(JSON_HEDLEY_MSVC_VERSION_CHECK) - #undef JSON_HEDLEY_MSVC_VERSION_CHECK -#endif -#if !defined(_MSC_VER) - #define JSON_HEDLEY_MSVC_VERSION_CHECK(major,minor,patch) (0) -#elif defined(_MSC_VER) && (_MSC_VER >= 1400) - #define JSON_HEDLEY_MSVC_VERSION_CHECK(major,minor,patch) (_MSC_FULL_VER >= ((major * 10000000) + (minor * 100000) + (patch))) -#elif defined(_MSC_VER) && (_MSC_VER >= 1200) - #define JSON_HEDLEY_MSVC_VERSION_CHECK(major,minor,patch) (_MSC_FULL_VER >= ((major * 1000000) + (minor * 10000) + (patch))) -#else - #define JSON_HEDLEY_MSVC_VERSION_CHECK(major,minor,patch) (_MSC_VER >= ((major * 100) + (minor))) -#endif - -#if defined(JSON_HEDLEY_INTEL_VERSION) - #undef JSON_HEDLEY_INTEL_VERSION -#endif -#if defined(__INTEL_COMPILER) && defined(__INTEL_COMPILER_UPDATE) - #define JSON_HEDLEY_INTEL_VERSION JSON_HEDLEY_VERSION_ENCODE(__INTEL_COMPILER / 100, __INTEL_COMPILER % 100, __INTEL_COMPILER_UPDATE) -#elif defined(__INTEL_COMPILER) - #define JSON_HEDLEY_INTEL_VERSION JSON_HEDLEY_VERSION_ENCODE(__INTEL_COMPILER / 100, __INTEL_COMPILER % 100, 0) -#endif - -#if defined(JSON_HEDLEY_INTEL_VERSION_CHECK) - #undef JSON_HEDLEY_INTEL_VERSION_CHECK -#endif -#if defined(JSON_HEDLEY_INTEL_VERSION) - #define JSON_HEDLEY_INTEL_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_INTEL_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) -#else - #define JSON_HEDLEY_INTEL_VERSION_CHECK(major,minor,patch) (0) -#endif - -#if defined(JSON_HEDLEY_PGI_VERSION) - #undef JSON_HEDLEY_PGI_VERSION -#endif -#if defined(__PGI) && defined(__PGIC__) && defined(__PGIC_MINOR__) && defined(__PGIC_PATCHLEVEL__) - #define JSON_HEDLEY_PGI_VERSION JSON_HEDLEY_VERSION_ENCODE(__PGIC__, __PGIC_MINOR__, __PGIC_PATCHLEVEL__) -#endif - -#if defined(JSON_HEDLEY_PGI_VERSION_CHECK) - #undef JSON_HEDLEY_PGI_VERSION_CHECK -#endif -#if defined(JSON_HEDLEY_PGI_VERSION) - #define JSON_HEDLEY_PGI_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_PGI_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) -#else - #define JSON_HEDLEY_PGI_VERSION_CHECK(major,minor,patch) (0) -#endif - -#if defined(JSON_HEDLEY_SUNPRO_VERSION) - #undef JSON_HEDLEY_SUNPRO_VERSION -#endif -#if defined(__SUNPRO_C) && (__SUNPRO_C > 0x1000) - #define JSON_HEDLEY_SUNPRO_VERSION JSON_HEDLEY_VERSION_ENCODE((((__SUNPRO_C >> 16) & 0xf) * 10) + ((__SUNPRO_C >> 12) & 0xf), (((__SUNPRO_C >> 8) & 0xf) * 10) + ((__SUNPRO_C >> 4) & 0xf), (__SUNPRO_C & 0xf) * 10) -#elif defined(__SUNPRO_C) - #define JSON_HEDLEY_SUNPRO_VERSION JSON_HEDLEY_VERSION_ENCODE((__SUNPRO_C >> 8) & 0xf, (__SUNPRO_C >> 4) & 0xf, (__SUNPRO_C) & 0xf) -#elif defined(__SUNPRO_CC) && (__SUNPRO_CC > 0x1000) - #define JSON_HEDLEY_SUNPRO_VERSION JSON_HEDLEY_VERSION_ENCODE((((__SUNPRO_CC >> 16) & 0xf) * 10) + ((__SUNPRO_CC >> 12) & 0xf), (((__SUNPRO_CC >> 8) & 0xf) * 10) + ((__SUNPRO_CC >> 4) & 0xf), (__SUNPRO_CC & 0xf) * 10) -#elif defined(__SUNPRO_CC) - #define JSON_HEDLEY_SUNPRO_VERSION JSON_HEDLEY_VERSION_ENCODE((__SUNPRO_CC >> 8) & 0xf, (__SUNPRO_CC >> 4) & 0xf, (__SUNPRO_CC) & 0xf) -#endif - -#if defined(JSON_HEDLEY_SUNPRO_VERSION_CHECK) - #undef JSON_HEDLEY_SUNPRO_VERSION_CHECK -#endif -#if defined(JSON_HEDLEY_SUNPRO_VERSION) - #define JSON_HEDLEY_SUNPRO_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_SUNPRO_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) -#else - #define JSON_HEDLEY_SUNPRO_VERSION_CHECK(major,minor,patch) (0) -#endif - -#if defined(JSON_HEDLEY_EMSCRIPTEN_VERSION) - #undef JSON_HEDLEY_EMSCRIPTEN_VERSION -#endif -#if defined(__EMSCRIPTEN__) - #define JSON_HEDLEY_EMSCRIPTEN_VERSION JSON_HEDLEY_VERSION_ENCODE(__EMSCRIPTEN_major__, __EMSCRIPTEN_minor__, __EMSCRIPTEN_tiny__) -#endif - -#if defined(JSON_HEDLEY_EMSCRIPTEN_VERSION_CHECK) - #undef JSON_HEDLEY_EMSCRIPTEN_VERSION_CHECK -#endif -#if defined(JSON_HEDLEY_EMSCRIPTEN_VERSION) - #define JSON_HEDLEY_EMSCRIPTEN_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_EMSCRIPTEN_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) -#else - #define JSON_HEDLEY_EMSCRIPTEN_VERSION_CHECK(major,minor,patch) (0) -#endif - -#if defined(JSON_HEDLEY_ARM_VERSION) - #undef JSON_HEDLEY_ARM_VERSION -#endif -#if defined(__CC_ARM) && defined(__ARMCOMPILER_VERSION) - #define JSON_HEDLEY_ARM_VERSION JSON_HEDLEY_VERSION_ENCODE(__ARMCOMPILER_VERSION / 1000000, (__ARMCOMPILER_VERSION % 1000000) / 10000, (__ARMCOMPILER_VERSION % 10000) / 100) -#elif defined(__CC_ARM) && defined(__ARMCC_VERSION) - #define JSON_HEDLEY_ARM_VERSION JSON_HEDLEY_VERSION_ENCODE(__ARMCC_VERSION / 1000000, (__ARMCC_VERSION % 1000000) / 10000, (__ARMCC_VERSION % 10000) / 100) -#endif - -#if defined(JSON_HEDLEY_ARM_VERSION_CHECK) - #undef JSON_HEDLEY_ARM_VERSION_CHECK -#endif -#if defined(JSON_HEDLEY_ARM_VERSION) - #define JSON_HEDLEY_ARM_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_ARM_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) -#else - #define JSON_HEDLEY_ARM_VERSION_CHECK(major,minor,patch) (0) -#endif - -#if defined(JSON_HEDLEY_IBM_VERSION) - #undef JSON_HEDLEY_IBM_VERSION -#endif -#if defined(__ibmxl__) - #define JSON_HEDLEY_IBM_VERSION JSON_HEDLEY_VERSION_ENCODE(__ibmxl_version__, __ibmxl_release__, __ibmxl_modification__) -#elif defined(__xlC__) && defined(__xlC_ver__) - #define JSON_HEDLEY_IBM_VERSION JSON_HEDLEY_VERSION_ENCODE(__xlC__ >> 8, __xlC__ & 0xff, (__xlC_ver__ >> 8) & 0xff) -#elif defined(__xlC__) - #define JSON_HEDLEY_IBM_VERSION JSON_HEDLEY_VERSION_ENCODE(__xlC__ >> 8, __xlC__ & 0xff, 0) -#endif - -#if defined(JSON_HEDLEY_IBM_VERSION_CHECK) - #undef JSON_HEDLEY_IBM_VERSION_CHECK -#endif -#if defined(JSON_HEDLEY_IBM_VERSION) - #define JSON_HEDLEY_IBM_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_IBM_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) -#else - #define JSON_HEDLEY_IBM_VERSION_CHECK(major,minor,patch) (0) -#endif - -#if defined(JSON_HEDLEY_TI_VERSION) - #undef JSON_HEDLEY_TI_VERSION -#endif -#if \ - defined(__TI_COMPILER_VERSION__) && \ - ( \ - defined(__TMS470__) || defined(__TI_ARM__) || \ - defined(__MSP430__) || \ - defined(__TMS320C2000__) \ - ) -#if (__TI_COMPILER_VERSION__ >= 16000000) - #define JSON_HEDLEY_TI_VERSION JSON_HEDLEY_VERSION_ENCODE(__TI_COMPILER_VERSION__ / 1000000, (__TI_COMPILER_VERSION__ % 1000000) / 1000, (__TI_COMPILER_VERSION__ % 1000)) -#endif -#endif - -#if defined(JSON_HEDLEY_TI_VERSION_CHECK) - #undef JSON_HEDLEY_TI_VERSION_CHECK -#endif -#if defined(JSON_HEDLEY_TI_VERSION) - #define JSON_HEDLEY_TI_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TI_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) -#else - #define JSON_HEDLEY_TI_VERSION_CHECK(major,minor,patch) (0) -#endif - -#if defined(JSON_HEDLEY_TI_CL2000_VERSION) - #undef JSON_HEDLEY_TI_CL2000_VERSION -#endif -#if defined(__TI_COMPILER_VERSION__) && defined(__TMS320C2000__) - #define JSON_HEDLEY_TI_CL2000_VERSION JSON_HEDLEY_VERSION_ENCODE(__TI_COMPILER_VERSION__ / 1000000, (__TI_COMPILER_VERSION__ % 1000000) / 1000, (__TI_COMPILER_VERSION__ % 1000)) -#endif - -#if defined(JSON_HEDLEY_TI_CL2000_VERSION_CHECK) - #undef JSON_HEDLEY_TI_CL2000_VERSION_CHECK -#endif -#if defined(JSON_HEDLEY_TI_CL2000_VERSION) - #define JSON_HEDLEY_TI_CL2000_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TI_CL2000_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) -#else - #define JSON_HEDLEY_TI_CL2000_VERSION_CHECK(major,minor,patch) (0) -#endif - -#if defined(JSON_HEDLEY_TI_CL430_VERSION) - #undef JSON_HEDLEY_TI_CL430_VERSION -#endif -#if defined(__TI_COMPILER_VERSION__) && defined(__MSP430__) - #define JSON_HEDLEY_TI_CL430_VERSION JSON_HEDLEY_VERSION_ENCODE(__TI_COMPILER_VERSION__ / 1000000, (__TI_COMPILER_VERSION__ % 1000000) / 1000, (__TI_COMPILER_VERSION__ % 1000)) -#endif - -#if defined(JSON_HEDLEY_TI_CL430_VERSION_CHECK) - #undef JSON_HEDLEY_TI_CL430_VERSION_CHECK -#endif -#if defined(JSON_HEDLEY_TI_CL430_VERSION) - #define JSON_HEDLEY_TI_CL430_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TI_CL430_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) -#else - #define JSON_HEDLEY_TI_CL430_VERSION_CHECK(major,minor,patch) (0) -#endif - -#if defined(JSON_HEDLEY_TI_ARMCL_VERSION) - #undef JSON_HEDLEY_TI_ARMCL_VERSION -#endif -#if defined(__TI_COMPILER_VERSION__) && (defined(__TMS470__) || defined(__TI_ARM__)) - #define JSON_HEDLEY_TI_ARMCL_VERSION JSON_HEDLEY_VERSION_ENCODE(__TI_COMPILER_VERSION__ / 1000000, (__TI_COMPILER_VERSION__ % 1000000) / 1000, (__TI_COMPILER_VERSION__ % 1000)) -#endif - -#if defined(JSON_HEDLEY_TI_ARMCL_VERSION_CHECK) - #undef JSON_HEDLEY_TI_ARMCL_VERSION_CHECK -#endif -#if defined(JSON_HEDLEY_TI_ARMCL_VERSION) - #define JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TI_ARMCL_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) -#else - #define JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(major,minor,patch) (0) -#endif - -#if defined(JSON_HEDLEY_TI_CL6X_VERSION) - #undef JSON_HEDLEY_TI_CL6X_VERSION -#endif -#if defined(__TI_COMPILER_VERSION__) && defined(__TMS320C6X__) - #define JSON_HEDLEY_TI_CL6X_VERSION JSON_HEDLEY_VERSION_ENCODE(__TI_COMPILER_VERSION__ / 1000000, (__TI_COMPILER_VERSION__ % 1000000) / 1000, (__TI_COMPILER_VERSION__ % 1000)) -#endif - -#if defined(JSON_HEDLEY_TI_CL6X_VERSION_CHECK) - #undef JSON_HEDLEY_TI_CL6X_VERSION_CHECK -#endif -#if defined(JSON_HEDLEY_TI_CL6X_VERSION) - #define JSON_HEDLEY_TI_CL6X_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TI_CL6X_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) -#else - #define JSON_HEDLEY_TI_CL6X_VERSION_CHECK(major,minor,patch) (0) -#endif - -#if defined(JSON_HEDLEY_TI_CL7X_VERSION) - #undef JSON_HEDLEY_TI_CL7X_VERSION -#endif -#if defined(__TI_COMPILER_VERSION__) && defined(__C7000__) - #define JSON_HEDLEY_TI_CL7X_VERSION JSON_HEDLEY_VERSION_ENCODE(__TI_COMPILER_VERSION__ / 1000000, (__TI_COMPILER_VERSION__ % 1000000) / 1000, (__TI_COMPILER_VERSION__ % 1000)) -#endif - -#if defined(JSON_HEDLEY_TI_CL7X_VERSION_CHECK) - #undef JSON_HEDLEY_TI_CL7X_VERSION_CHECK -#endif -#if defined(JSON_HEDLEY_TI_CL7X_VERSION) - #define JSON_HEDLEY_TI_CL7X_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TI_CL7X_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) -#else - #define JSON_HEDLEY_TI_CL7X_VERSION_CHECK(major,minor,patch) (0) -#endif - -#if defined(JSON_HEDLEY_TI_CLPRU_VERSION) - #undef JSON_HEDLEY_TI_CLPRU_VERSION -#endif -#if defined(__TI_COMPILER_VERSION__) && defined(__PRU__) - #define JSON_HEDLEY_TI_CLPRU_VERSION JSON_HEDLEY_VERSION_ENCODE(__TI_COMPILER_VERSION__ / 1000000, (__TI_COMPILER_VERSION__ % 1000000) / 1000, (__TI_COMPILER_VERSION__ % 1000)) -#endif - -#if defined(JSON_HEDLEY_TI_CLPRU_VERSION_CHECK) - #undef JSON_HEDLEY_TI_CLPRU_VERSION_CHECK -#endif -#if defined(JSON_HEDLEY_TI_CLPRU_VERSION) - #define JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TI_CLPRU_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) -#else - #define JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(major,minor,patch) (0) -#endif - -#if defined(JSON_HEDLEY_CRAY_VERSION) - #undef JSON_HEDLEY_CRAY_VERSION -#endif -#if defined(_CRAYC) - #if defined(_RELEASE_PATCHLEVEL) - #define JSON_HEDLEY_CRAY_VERSION JSON_HEDLEY_VERSION_ENCODE(_RELEASE_MAJOR, _RELEASE_MINOR, _RELEASE_PATCHLEVEL) - #else - #define JSON_HEDLEY_CRAY_VERSION JSON_HEDLEY_VERSION_ENCODE(_RELEASE_MAJOR, _RELEASE_MINOR, 0) - #endif -#endif - -#if defined(JSON_HEDLEY_CRAY_VERSION_CHECK) - #undef JSON_HEDLEY_CRAY_VERSION_CHECK -#endif -#if defined(JSON_HEDLEY_CRAY_VERSION) - #define JSON_HEDLEY_CRAY_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_CRAY_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) -#else - #define JSON_HEDLEY_CRAY_VERSION_CHECK(major,minor,patch) (0) -#endif - -#if defined(JSON_HEDLEY_IAR_VERSION) - #undef JSON_HEDLEY_IAR_VERSION -#endif -#if defined(__IAR_SYSTEMS_ICC__) - #if __VER__ > 1000 - #define JSON_HEDLEY_IAR_VERSION JSON_HEDLEY_VERSION_ENCODE((__VER__ / 1000000), ((__VER__ / 1000) % 1000), (__VER__ % 1000)) - #else - #define JSON_HEDLEY_IAR_VERSION JSON_HEDLEY_VERSION_ENCODE(VER / 100, __VER__ % 100, 0) - #endif -#endif - -#if defined(JSON_HEDLEY_IAR_VERSION_CHECK) - #undef JSON_HEDLEY_IAR_VERSION_CHECK -#endif -#if defined(JSON_HEDLEY_IAR_VERSION) - #define JSON_HEDLEY_IAR_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_IAR_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) -#else - #define JSON_HEDLEY_IAR_VERSION_CHECK(major,minor,patch) (0) -#endif - -#if defined(JSON_HEDLEY_TINYC_VERSION) - #undef JSON_HEDLEY_TINYC_VERSION -#endif -#if defined(__TINYC__) - #define JSON_HEDLEY_TINYC_VERSION JSON_HEDLEY_VERSION_ENCODE(__TINYC__ / 1000, (__TINYC__ / 100) % 10, __TINYC__ % 100) -#endif - -#if defined(JSON_HEDLEY_TINYC_VERSION_CHECK) - #undef JSON_HEDLEY_TINYC_VERSION_CHECK -#endif -#if defined(JSON_HEDLEY_TINYC_VERSION) - #define JSON_HEDLEY_TINYC_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_TINYC_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) -#else - #define JSON_HEDLEY_TINYC_VERSION_CHECK(major,minor,patch) (0) -#endif - -#if defined(JSON_HEDLEY_DMC_VERSION) - #undef JSON_HEDLEY_DMC_VERSION -#endif -#if defined(__DMC__) - #define JSON_HEDLEY_DMC_VERSION JSON_HEDLEY_VERSION_ENCODE(__DMC__ >> 8, (__DMC__ >> 4) & 0xf, __DMC__ & 0xf) -#endif - -#if defined(JSON_HEDLEY_DMC_VERSION_CHECK) - #undef JSON_HEDLEY_DMC_VERSION_CHECK -#endif -#if defined(JSON_HEDLEY_DMC_VERSION) - #define JSON_HEDLEY_DMC_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_DMC_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) -#else - #define JSON_HEDLEY_DMC_VERSION_CHECK(major,minor,patch) (0) -#endif - -#if defined(JSON_HEDLEY_COMPCERT_VERSION) - #undef JSON_HEDLEY_COMPCERT_VERSION -#endif -#if defined(__COMPCERT_VERSION__) - #define JSON_HEDLEY_COMPCERT_VERSION JSON_HEDLEY_VERSION_ENCODE(__COMPCERT_VERSION__ / 10000, (__COMPCERT_VERSION__ / 100) % 100, __COMPCERT_VERSION__ % 100) -#endif - -#if defined(JSON_HEDLEY_COMPCERT_VERSION_CHECK) - #undef JSON_HEDLEY_COMPCERT_VERSION_CHECK -#endif -#if defined(JSON_HEDLEY_COMPCERT_VERSION) - #define JSON_HEDLEY_COMPCERT_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_COMPCERT_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) -#else - #define JSON_HEDLEY_COMPCERT_VERSION_CHECK(major,minor,patch) (0) -#endif - -#if defined(JSON_HEDLEY_PELLES_VERSION) - #undef JSON_HEDLEY_PELLES_VERSION -#endif -#if defined(__POCC__) - #define JSON_HEDLEY_PELLES_VERSION JSON_HEDLEY_VERSION_ENCODE(__POCC__ / 100, __POCC__ % 100, 0) -#endif - -#if defined(JSON_HEDLEY_PELLES_VERSION_CHECK) - #undef JSON_HEDLEY_PELLES_VERSION_CHECK -#endif -#if defined(JSON_HEDLEY_PELLES_VERSION) - #define JSON_HEDLEY_PELLES_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_PELLES_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) -#else - #define JSON_HEDLEY_PELLES_VERSION_CHECK(major,minor,patch) (0) -#endif - -#if defined(JSON_HEDLEY_GCC_VERSION) - #undef JSON_HEDLEY_GCC_VERSION -#endif -#if \ - defined(JSON_HEDLEY_GNUC_VERSION) && \ - !defined(__clang__) && \ - !defined(JSON_HEDLEY_INTEL_VERSION) && \ - !defined(JSON_HEDLEY_PGI_VERSION) && \ - !defined(JSON_HEDLEY_ARM_VERSION) && \ - !defined(JSON_HEDLEY_TI_VERSION) && \ - !defined(JSON_HEDLEY_TI_ARMCL_VERSION) && \ - !defined(JSON_HEDLEY_TI_CL430_VERSION) && \ - !defined(JSON_HEDLEY_TI_CL2000_VERSION) && \ - !defined(JSON_HEDLEY_TI_CL6X_VERSION) && \ - !defined(JSON_HEDLEY_TI_CL7X_VERSION) && \ - !defined(JSON_HEDLEY_TI_CLPRU_VERSION) && \ - !defined(__COMPCERT__) - #define JSON_HEDLEY_GCC_VERSION JSON_HEDLEY_GNUC_VERSION -#endif - -#if defined(JSON_HEDLEY_GCC_VERSION_CHECK) - #undef JSON_HEDLEY_GCC_VERSION_CHECK -#endif -#if defined(JSON_HEDLEY_GCC_VERSION) - #define JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch) (JSON_HEDLEY_GCC_VERSION >= JSON_HEDLEY_VERSION_ENCODE(major, minor, patch)) -#else - #define JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch) (0) -#endif - -#if defined(JSON_HEDLEY_HAS_ATTRIBUTE) - #undef JSON_HEDLEY_HAS_ATTRIBUTE -#endif -#if defined(__has_attribute) - #define JSON_HEDLEY_HAS_ATTRIBUTE(attribute) __has_attribute(attribute) -#else - #define JSON_HEDLEY_HAS_ATTRIBUTE(attribute) (0) -#endif - -#if defined(JSON_HEDLEY_GNUC_HAS_ATTRIBUTE) - #undef JSON_HEDLEY_GNUC_HAS_ATTRIBUTE -#endif -#if defined(__has_attribute) - #define JSON_HEDLEY_GNUC_HAS_ATTRIBUTE(attribute,major,minor,patch) __has_attribute(attribute) -#else - #define JSON_HEDLEY_GNUC_HAS_ATTRIBUTE(attribute,major,minor,patch) JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch) -#endif - -#if defined(JSON_HEDLEY_GCC_HAS_ATTRIBUTE) - #undef JSON_HEDLEY_GCC_HAS_ATTRIBUTE -#endif -#if defined(__has_attribute) - #define JSON_HEDLEY_GCC_HAS_ATTRIBUTE(attribute,major,minor,patch) __has_attribute(attribute) -#else - #define JSON_HEDLEY_GCC_HAS_ATTRIBUTE(attribute,major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch) -#endif - -#if defined(JSON_HEDLEY_HAS_CPP_ATTRIBUTE) - #undef JSON_HEDLEY_HAS_CPP_ATTRIBUTE -#endif -#if \ - defined(__has_cpp_attribute) && \ - defined(__cplusplus) && \ - (!defined(JSON_HEDLEY_SUNPRO_VERSION) || JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,15,0)) - #define JSON_HEDLEY_HAS_CPP_ATTRIBUTE(attribute) __has_cpp_attribute(attribute) -#else - #define JSON_HEDLEY_HAS_CPP_ATTRIBUTE(attribute) (0) -#endif - -#if defined(JSON_HEDLEY_HAS_CPP_ATTRIBUTE_NS) - #undef JSON_HEDLEY_HAS_CPP_ATTRIBUTE_NS -#endif -#if !defined(__cplusplus) || !defined(__has_cpp_attribute) - #define JSON_HEDLEY_HAS_CPP_ATTRIBUTE_NS(ns,attribute) (0) -#elif \ - !defined(JSON_HEDLEY_PGI_VERSION) && \ - !defined(JSON_HEDLEY_IAR_VERSION) && \ - (!defined(JSON_HEDLEY_SUNPRO_VERSION) || JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,15,0)) && \ - (!defined(JSON_HEDLEY_MSVC_VERSION) || JSON_HEDLEY_MSVC_VERSION_CHECK(19,20,0)) - #define JSON_HEDLEY_HAS_CPP_ATTRIBUTE_NS(ns,attribute) JSON_HEDLEY_HAS_CPP_ATTRIBUTE(ns::attribute) -#else - #define JSON_HEDLEY_HAS_CPP_ATTRIBUTE_NS(ns,attribute) (0) -#endif - -#if defined(JSON_HEDLEY_GNUC_HAS_CPP_ATTRIBUTE) - #undef JSON_HEDLEY_GNUC_HAS_CPP_ATTRIBUTE -#endif -#if defined(__has_cpp_attribute) && defined(__cplusplus) - #define JSON_HEDLEY_GNUC_HAS_CPP_ATTRIBUTE(attribute,major,minor,patch) __has_cpp_attribute(attribute) -#else - #define JSON_HEDLEY_GNUC_HAS_CPP_ATTRIBUTE(attribute,major,minor,patch) JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch) -#endif - -#if defined(JSON_HEDLEY_GCC_HAS_CPP_ATTRIBUTE) - #undef JSON_HEDLEY_GCC_HAS_CPP_ATTRIBUTE -#endif -#if defined(__has_cpp_attribute) && defined(__cplusplus) - #define JSON_HEDLEY_GCC_HAS_CPP_ATTRIBUTE(attribute,major,minor,patch) __has_cpp_attribute(attribute) -#else - #define JSON_HEDLEY_GCC_HAS_CPP_ATTRIBUTE(attribute,major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch) -#endif - -#if defined(JSON_HEDLEY_HAS_BUILTIN) - #undef JSON_HEDLEY_HAS_BUILTIN -#endif -#if defined(__has_builtin) - #define JSON_HEDLEY_HAS_BUILTIN(builtin) __has_builtin(builtin) -#else - #define JSON_HEDLEY_HAS_BUILTIN(builtin) (0) -#endif - -#if defined(JSON_HEDLEY_GNUC_HAS_BUILTIN) - #undef JSON_HEDLEY_GNUC_HAS_BUILTIN -#endif -#if defined(__has_builtin) - #define JSON_HEDLEY_GNUC_HAS_BUILTIN(builtin,major,minor,patch) __has_builtin(builtin) -#else - #define JSON_HEDLEY_GNUC_HAS_BUILTIN(builtin,major,minor,patch) JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch) -#endif - -#if defined(JSON_HEDLEY_GCC_HAS_BUILTIN) - #undef JSON_HEDLEY_GCC_HAS_BUILTIN -#endif -#if defined(__has_builtin) - #define JSON_HEDLEY_GCC_HAS_BUILTIN(builtin,major,minor,patch) __has_builtin(builtin) -#else - #define JSON_HEDLEY_GCC_HAS_BUILTIN(builtin,major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch) -#endif - -#if defined(JSON_HEDLEY_HAS_FEATURE) - #undef JSON_HEDLEY_HAS_FEATURE -#endif -#if defined(__has_feature) - #define JSON_HEDLEY_HAS_FEATURE(feature) __has_feature(feature) -#else - #define JSON_HEDLEY_HAS_FEATURE(feature) (0) -#endif - -#if defined(JSON_HEDLEY_GNUC_HAS_FEATURE) - #undef JSON_HEDLEY_GNUC_HAS_FEATURE -#endif -#if defined(__has_feature) - #define JSON_HEDLEY_GNUC_HAS_FEATURE(feature,major,minor,patch) __has_feature(feature) -#else - #define JSON_HEDLEY_GNUC_HAS_FEATURE(feature,major,minor,patch) JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch) -#endif - -#if defined(JSON_HEDLEY_GCC_HAS_FEATURE) - #undef JSON_HEDLEY_GCC_HAS_FEATURE -#endif -#if defined(__has_feature) - #define JSON_HEDLEY_GCC_HAS_FEATURE(feature,major,minor,patch) __has_feature(feature) -#else - #define JSON_HEDLEY_GCC_HAS_FEATURE(feature,major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch) -#endif - -#if defined(JSON_HEDLEY_HAS_EXTENSION) - #undef JSON_HEDLEY_HAS_EXTENSION -#endif -#if defined(__has_extension) - #define JSON_HEDLEY_HAS_EXTENSION(extension) __has_extension(extension) -#else - #define JSON_HEDLEY_HAS_EXTENSION(extension) (0) -#endif - -#if defined(JSON_HEDLEY_GNUC_HAS_EXTENSION) - #undef JSON_HEDLEY_GNUC_HAS_EXTENSION -#endif -#if defined(__has_extension) - #define JSON_HEDLEY_GNUC_HAS_EXTENSION(extension,major,minor,patch) __has_extension(extension) -#else - #define JSON_HEDLEY_GNUC_HAS_EXTENSION(extension,major,minor,patch) JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch) -#endif - -#if defined(JSON_HEDLEY_GCC_HAS_EXTENSION) - #undef JSON_HEDLEY_GCC_HAS_EXTENSION -#endif -#if defined(__has_extension) - #define JSON_HEDLEY_GCC_HAS_EXTENSION(extension,major,minor,patch) __has_extension(extension) -#else - #define JSON_HEDLEY_GCC_HAS_EXTENSION(extension,major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch) -#endif - -#if defined(JSON_HEDLEY_HAS_DECLSPEC_ATTRIBUTE) - #undef JSON_HEDLEY_HAS_DECLSPEC_ATTRIBUTE -#endif -#if defined(__has_declspec_attribute) - #define JSON_HEDLEY_HAS_DECLSPEC_ATTRIBUTE(attribute) __has_declspec_attribute(attribute) -#else - #define JSON_HEDLEY_HAS_DECLSPEC_ATTRIBUTE(attribute) (0) -#endif - -#if defined(JSON_HEDLEY_GNUC_HAS_DECLSPEC_ATTRIBUTE) - #undef JSON_HEDLEY_GNUC_HAS_DECLSPEC_ATTRIBUTE -#endif -#if defined(__has_declspec_attribute) - #define JSON_HEDLEY_GNUC_HAS_DECLSPEC_ATTRIBUTE(attribute,major,minor,patch) __has_declspec_attribute(attribute) -#else - #define JSON_HEDLEY_GNUC_HAS_DECLSPEC_ATTRIBUTE(attribute,major,minor,patch) JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch) -#endif - -#if defined(JSON_HEDLEY_GCC_HAS_DECLSPEC_ATTRIBUTE) - #undef JSON_HEDLEY_GCC_HAS_DECLSPEC_ATTRIBUTE -#endif -#if defined(__has_declspec_attribute) - #define JSON_HEDLEY_GCC_HAS_DECLSPEC_ATTRIBUTE(attribute,major,minor,patch) __has_declspec_attribute(attribute) -#else - #define JSON_HEDLEY_GCC_HAS_DECLSPEC_ATTRIBUTE(attribute,major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch) -#endif - -#if defined(JSON_HEDLEY_HAS_WARNING) - #undef JSON_HEDLEY_HAS_WARNING -#endif -#if defined(__has_warning) - #define JSON_HEDLEY_HAS_WARNING(warning) __has_warning(warning) -#else - #define JSON_HEDLEY_HAS_WARNING(warning) (0) -#endif - -#if defined(JSON_HEDLEY_GNUC_HAS_WARNING) - #undef JSON_HEDLEY_GNUC_HAS_WARNING -#endif -#if defined(__has_warning) - #define JSON_HEDLEY_GNUC_HAS_WARNING(warning,major,minor,patch) __has_warning(warning) -#else - #define JSON_HEDLEY_GNUC_HAS_WARNING(warning,major,minor,patch) JSON_HEDLEY_GNUC_VERSION_CHECK(major,minor,patch) -#endif - -#if defined(JSON_HEDLEY_GCC_HAS_WARNING) - #undef JSON_HEDLEY_GCC_HAS_WARNING -#endif -#if defined(__has_warning) - #define JSON_HEDLEY_GCC_HAS_WARNING(warning,major,minor,patch) __has_warning(warning) -#else - #define JSON_HEDLEY_GCC_HAS_WARNING(warning,major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch) -#endif - -/* JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_ is for - HEDLEY INTERNAL USE ONLY. API subject to change without notice. */ -#if defined(JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_) - #undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_ -#endif -#if defined(__cplusplus) -# if JSON_HEDLEY_HAS_WARNING("-Wc++98-compat") -# if JSON_HEDLEY_HAS_WARNING("-Wc++17-extensions") -# define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_(xpr) \ - JSON_HEDLEY_DIAGNOSTIC_PUSH \ - _Pragma("clang diagnostic ignored \"-Wc++98-compat\"") \ - _Pragma("clang diagnostic ignored \"-Wc++17-extensions\"") \ - xpr \ - JSON_HEDLEY_DIAGNOSTIC_POP -# else -# define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_(xpr) \ - JSON_HEDLEY_DIAGNOSTIC_PUSH \ - _Pragma("clang diagnostic ignored \"-Wc++98-compat\"") \ - xpr \ - JSON_HEDLEY_DIAGNOSTIC_POP -# endif -# endif -#endif -#if !defined(JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_) - #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_(x) x -#endif - -#if defined(JSON_HEDLEY_CONST_CAST) - #undef JSON_HEDLEY_CONST_CAST -#endif -#if defined(__cplusplus) -# define JSON_HEDLEY_CONST_CAST(T, expr) (const_cast(expr)) -#elif \ - JSON_HEDLEY_HAS_WARNING("-Wcast-qual") || \ - JSON_HEDLEY_GCC_VERSION_CHECK(4,6,0) || \ - JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) -# define JSON_HEDLEY_CONST_CAST(T, expr) (__extension__ ({ \ - JSON_HEDLEY_DIAGNOSTIC_PUSH \ - JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL \ - ((T) (expr)); \ - JSON_HEDLEY_DIAGNOSTIC_POP \ - })) -#else -# define JSON_HEDLEY_CONST_CAST(T, expr) ((T) (expr)) -#endif - -#if defined(JSON_HEDLEY_REINTERPRET_CAST) - #undef JSON_HEDLEY_REINTERPRET_CAST -#endif -#if defined(__cplusplus) - #define JSON_HEDLEY_REINTERPRET_CAST(T, expr) (reinterpret_cast(expr)) -#else - #define JSON_HEDLEY_REINTERPRET_CAST(T, expr) ((T) (expr)) -#endif - -#if defined(JSON_HEDLEY_STATIC_CAST) - #undef JSON_HEDLEY_STATIC_CAST -#endif -#if defined(__cplusplus) - #define JSON_HEDLEY_STATIC_CAST(T, expr) (static_cast(expr)) -#else - #define JSON_HEDLEY_STATIC_CAST(T, expr) ((T) (expr)) -#endif - -#if defined(JSON_HEDLEY_CPP_CAST) - #undef JSON_HEDLEY_CPP_CAST -#endif -#if defined(__cplusplus) -# if JSON_HEDLEY_HAS_WARNING("-Wold-style-cast") -# define JSON_HEDLEY_CPP_CAST(T, expr) \ - JSON_HEDLEY_DIAGNOSTIC_PUSH \ - _Pragma("clang diagnostic ignored \"-Wold-style-cast\"") \ - ((T) (expr)) \ - JSON_HEDLEY_DIAGNOSTIC_POP -# elif JSON_HEDLEY_IAR_VERSION_CHECK(8,3,0) -# define JSON_HEDLEY_CPP_CAST(T, expr) \ - JSON_HEDLEY_DIAGNOSTIC_PUSH \ - _Pragma("diag_suppress=Pe137") \ - JSON_HEDLEY_DIAGNOSTIC_POP \ -# else -# define JSON_HEDLEY_CPP_CAST(T, expr) ((T) (expr)) -# endif -#else -# define JSON_HEDLEY_CPP_CAST(T, expr) (expr) -#endif - -#if \ - (defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)) || \ - defined(__clang__) || \ - JSON_HEDLEY_GCC_VERSION_CHECK(3,0,0) || \ - JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ - JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0) || \ - JSON_HEDLEY_PGI_VERSION_CHECK(18,4,0) || \ - JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ - JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ - JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,7,0) || \ - JSON_HEDLEY_TI_CL430_VERSION_CHECK(2,0,1) || \ - JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,1,0) || \ - JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,0,0) || \ - JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ - JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ - JSON_HEDLEY_CRAY_VERSION_CHECK(5,0,0) || \ - JSON_HEDLEY_TINYC_VERSION_CHECK(0,9,17) || \ - JSON_HEDLEY_SUNPRO_VERSION_CHECK(8,0,0) || \ - (JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) && defined(__C99_PRAGMA_OPERATOR)) - #define JSON_HEDLEY_PRAGMA(value) _Pragma(#value) -#elif JSON_HEDLEY_MSVC_VERSION_CHECK(15,0,0) - #define JSON_HEDLEY_PRAGMA(value) __pragma(value) -#else - #define JSON_HEDLEY_PRAGMA(value) -#endif - -#if defined(JSON_HEDLEY_DIAGNOSTIC_PUSH) - #undef JSON_HEDLEY_DIAGNOSTIC_PUSH -#endif -#if defined(JSON_HEDLEY_DIAGNOSTIC_POP) - #undef JSON_HEDLEY_DIAGNOSTIC_POP -#endif -#if defined(__clang__) - #define JSON_HEDLEY_DIAGNOSTIC_PUSH _Pragma("clang diagnostic push") - #define JSON_HEDLEY_DIAGNOSTIC_POP _Pragma("clang diagnostic pop") -#elif JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) - #define JSON_HEDLEY_DIAGNOSTIC_PUSH _Pragma("warning(push)") - #define JSON_HEDLEY_DIAGNOSTIC_POP _Pragma("warning(pop)") -#elif JSON_HEDLEY_GCC_VERSION_CHECK(4,6,0) - #define JSON_HEDLEY_DIAGNOSTIC_PUSH _Pragma("GCC diagnostic push") - #define JSON_HEDLEY_DIAGNOSTIC_POP _Pragma("GCC diagnostic pop") -#elif JSON_HEDLEY_MSVC_VERSION_CHECK(15,0,0) - #define JSON_HEDLEY_DIAGNOSTIC_PUSH __pragma(warning(push)) - #define JSON_HEDLEY_DIAGNOSTIC_POP __pragma(warning(pop)) -#elif JSON_HEDLEY_ARM_VERSION_CHECK(5,6,0) - #define JSON_HEDLEY_DIAGNOSTIC_PUSH _Pragma("push") - #define JSON_HEDLEY_DIAGNOSTIC_POP _Pragma("pop") -#elif \ - JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ - JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ - JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,4,0) || \ - JSON_HEDLEY_TI_CL6X_VERSION_CHECK(8,1,0) || \ - JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ - JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) - #define JSON_HEDLEY_DIAGNOSTIC_PUSH _Pragma("diag_push") - #define JSON_HEDLEY_DIAGNOSTIC_POP _Pragma("diag_pop") -#elif JSON_HEDLEY_PELLES_VERSION_CHECK(2,90,0) - #define JSON_HEDLEY_DIAGNOSTIC_PUSH _Pragma("warning(push)") - #define JSON_HEDLEY_DIAGNOSTIC_POP _Pragma("warning(pop)") -#else - #define JSON_HEDLEY_DIAGNOSTIC_PUSH - #define JSON_HEDLEY_DIAGNOSTIC_POP -#endif - -#if defined(JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED) - #undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED -#endif -#if JSON_HEDLEY_HAS_WARNING("-Wdeprecated-declarations") - #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("clang diagnostic ignored \"-Wdeprecated-declarations\"") -#elif JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) - #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("warning(disable:1478 1786)") -#elif JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0) - #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("diag_suppress 1215,1444") -#elif JSON_HEDLEY_GCC_VERSION_CHECK(4,3,0) - #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("GCC diagnostic ignored \"-Wdeprecated-declarations\"") -#elif JSON_HEDLEY_MSVC_VERSION_CHECK(15,0,0) - #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED __pragma(warning(disable:4996)) -#elif \ - JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ - (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ - JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ - (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ - JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \ - (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ - JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ - (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ - JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \ - JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ - JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) - #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("diag_suppress 1291,1718") -#elif JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,13,0) && !defined(__cplusplus) - #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("error_messages(off,E_DEPRECATED_ATT,E_DEPRECATED_ATT_MESS)") -#elif JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,13,0) && defined(__cplusplus) - #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("error_messages(off,symdeprecated,symdeprecated2)") -#elif JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0) - #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("diag_suppress=Pe1444,Pe1215") -#elif JSON_HEDLEY_PELLES_VERSION_CHECK(2,90,0) - #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED _Pragma("warn(disable:2241)") -#else - #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED -#endif - -#if defined(JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS) - #undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS -#endif -#if JSON_HEDLEY_HAS_WARNING("-Wunknown-pragmas") - #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("clang diagnostic ignored \"-Wunknown-pragmas\"") -#elif JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) - #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("warning(disable:161)") -#elif JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0) - #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("diag_suppress 1675") -#elif JSON_HEDLEY_GCC_VERSION_CHECK(4,3,0) - #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("GCC diagnostic ignored \"-Wunknown-pragmas\"") -#elif JSON_HEDLEY_MSVC_VERSION_CHECK(15,0,0) - #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS __pragma(warning(disable:4068)) -#elif \ - JSON_HEDLEY_TI_VERSION_CHECK(16,9,0) || \ - JSON_HEDLEY_TI_CL6X_VERSION_CHECK(8,0,0) || \ - JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ - JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,3,0) - #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("diag_suppress 163") -#elif JSON_HEDLEY_TI_CL6X_VERSION_CHECK(8,0,0) - #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("diag_suppress 163") -#elif JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0) - #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS _Pragma("diag_suppress=Pe161") -#else - #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS -#endif - -#if defined(JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES) - #undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES -#endif -#if JSON_HEDLEY_HAS_WARNING("-Wunknown-attributes") - #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma("clang diagnostic ignored \"-Wunknown-attributes\"") -#elif JSON_HEDLEY_GCC_VERSION_CHECK(4,6,0) - #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma("GCC diagnostic ignored \"-Wdeprecated-declarations\"") -#elif JSON_HEDLEY_INTEL_VERSION_CHECK(17,0,0) - #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma("warning(disable:1292)") -#elif JSON_HEDLEY_MSVC_VERSION_CHECK(19,0,0) - #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES __pragma(warning(disable:5030)) -#elif JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0) - #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma("diag_suppress 1097") -#elif JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,14,0) && defined(__cplusplus) - #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma("error_messages(off,attrskipunsup)") -#elif \ - JSON_HEDLEY_TI_VERSION_CHECK(18,1,0) || \ - JSON_HEDLEY_TI_CL6X_VERSION_CHECK(8,3,0) || \ - JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) - #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma("diag_suppress 1173") -#elif JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0) - #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES _Pragma("diag_suppress=Pe1097") -#else - #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES -#endif - -#if defined(JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL) - #undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL -#endif -#if JSON_HEDLEY_HAS_WARNING("-Wcast-qual") - #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL _Pragma("clang diagnostic ignored \"-Wcast-qual\"") -#elif JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) - #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL _Pragma("warning(disable:2203 2331)") -#elif JSON_HEDLEY_GCC_VERSION_CHECK(3,0,0) - #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL _Pragma("GCC diagnostic ignored \"-Wcast-qual\"") -#else - #define JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL -#endif - -#if defined(JSON_HEDLEY_DEPRECATED) - #undef JSON_HEDLEY_DEPRECATED -#endif -#if defined(JSON_HEDLEY_DEPRECATED_FOR) - #undef JSON_HEDLEY_DEPRECATED_FOR -#endif -#if JSON_HEDLEY_MSVC_VERSION_CHECK(14,0,0) - #define JSON_HEDLEY_DEPRECATED(since) __declspec(deprecated("Since " # since)) - #define JSON_HEDLEY_DEPRECATED_FOR(since, replacement) __declspec(deprecated("Since " #since "; use " #replacement)) -#elif defined(__cplusplus) && (__cplusplus >= 201402L) - #define JSON_HEDLEY_DEPRECATED(since) JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[deprecated("Since " #since)]]) - #define JSON_HEDLEY_DEPRECATED_FOR(since, replacement) JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[deprecated("Since " #since "; use " #replacement)]]) -#elif \ - JSON_HEDLEY_HAS_EXTENSION(attribute_deprecated_with_message) || \ - JSON_HEDLEY_GCC_VERSION_CHECK(4,5,0) || \ - JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ - JSON_HEDLEY_ARM_VERSION_CHECK(5,6,0) || \ - JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,13,0) || \ - JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0) || \ - JSON_HEDLEY_TI_VERSION_CHECK(18,1,0) || \ - JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(18,1,0) || \ - JSON_HEDLEY_TI_CL6X_VERSION_CHECK(8,3,0) || \ - JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ - JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,3,0) - #define JSON_HEDLEY_DEPRECATED(since) __attribute__((__deprecated__("Since " #since))) - #define JSON_HEDLEY_DEPRECATED_FOR(since, replacement) __attribute__((__deprecated__("Since " #since "; use " #replacement))) -#elif \ - JSON_HEDLEY_HAS_ATTRIBUTE(deprecated) || \ - JSON_HEDLEY_GCC_VERSION_CHECK(3,1,0) || \ - JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ - JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ - (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ - JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ - (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ - JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \ - (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ - JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ - (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ - JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \ - JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ - JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) - #define JSON_HEDLEY_DEPRECATED(since) __attribute__((__deprecated__)) - #define JSON_HEDLEY_DEPRECATED_FOR(since, replacement) __attribute__((__deprecated__)) -#elif \ - JSON_HEDLEY_MSVC_VERSION_CHECK(13,10,0) || \ - JSON_HEDLEY_PELLES_VERSION_CHECK(6,50,0) - #define JSON_HEDLEY_DEPRECATED(since) __declspec(deprecated) - #define JSON_HEDLEY_DEPRECATED_FOR(since, replacement) __declspec(deprecated) -#elif JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0) - #define JSON_HEDLEY_DEPRECATED(since) _Pragma("deprecated") - #define JSON_HEDLEY_DEPRECATED_FOR(since, replacement) _Pragma("deprecated") -#else - #define JSON_HEDLEY_DEPRECATED(since) - #define JSON_HEDLEY_DEPRECATED_FOR(since, replacement) -#endif - -#if defined(JSON_HEDLEY_UNAVAILABLE) - #undef JSON_HEDLEY_UNAVAILABLE -#endif -#if \ - JSON_HEDLEY_HAS_ATTRIBUTE(warning) || \ - JSON_HEDLEY_GCC_VERSION_CHECK(4,3,0) || \ - JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) - #define JSON_HEDLEY_UNAVAILABLE(available_since) __attribute__((__warning__("Not available until " #available_since))) -#else - #define JSON_HEDLEY_UNAVAILABLE(available_since) -#endif - -#if defined(JSON_HEDLEY_WARN_UNUSED_RESULT) - #undef JSON_HEDLEY_WARN_UNUSED_RESULT -#endif -#if defined(JSON_HEDLEY_WARN_UNUSED_RESULT_MSG) - #undef JSON_HEDLEY_WARN_UNUSED_RESULT_MSG -#endif -#if (JSON_HEDLEY_HAS_CPP_ATTRIBUTE(nodiscard) >= 201907L) - #define JSON_HEDLEY_WARN_UNUSED_RESULT JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[nodiscard]]) - #define JSON_HEDLEY_WARN_UNUSED_RESULT_MSG(msg) JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[nodiscard(msg)]]) -#elif JSON_HEDLEY_HAS_CPP_ATTRIBUTE(nodiscard) - #define JSON_HEDLEY_WARN_UNUSED_RESULT JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[nodiscard]]) - #define JSON_HEDLEY_WARN_UNUSED_RESULT_MSG(msg) JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[nodiscard]]) -#elif \ - JSON_HEDLEY_HAS_ATTRIBUTE(warn_unused_result) || \ - JSON_HEDLEY_GCC_VERSION_CHECK(3,4,0) || \ - JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ - JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ - (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ - JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ - (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ - JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \ - (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ - JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ - (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ - JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \ - JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ - JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ - (JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,15,0) && defined(__cplusplus)) || \ - JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0) - #define JSON_HEDLEY_WARN_UNUSED_RESULT __attribute__((__warn_unused_result__)) - #define JSON_HEDLEY_WARN_UNUSED_RESULT_MSG(msg) __attribute__((__warn_unused_result__)) -#elif defined(_Check_return_) /* SAL */ - #define JSON_HEDLEY_WARN_UNUSED_RESULT _Check_return_ - #define JSON_HEDLEY_WARN_UNUSED_RESULT_MSG(msg) _Check_return_ -#else - #define JSON_HEDLEY_WARN_UNUSED_RESULT - #define JSON_HEDLEY_WARN_UNUSED_RESULT_MSG(msg) -#endif - -#if defined(JSON_HEDLEY_SENTINEL) - #undef JSON_HEDLEY_SENTINEL -#endif -#if \ - JSON_HEDLEY_HAS_ATTRIBUTE(sentinel) || \ - JSON_HEDLEY_GCC_VERSION_CHECK(4,0,0) || \ - JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ - JSON_HEDLEY_ARM_VERSION_CHECK(5,4,0) - #define JSON_HEDLEY_SENTINEL(position) __attribute__((__sentinel__(position))) -#else - #define JSON_HEDLEY_SENTINEL(position) -#endif - -#if defined(JSON_HEDLEY_NO_RETURN) - #undef JSON_HEDLEY_NO_RETURN -#endif -#if JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0) - #define JSON_HEDLEY_NO_RETURN __noreturn -#elif JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) - #define JSON_HEDLEY_NO_RETURN __attribute__((__noreturn__)) -#elif defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L - #define JSON_HEDLEY_NO_RETURN _Noreturn -#elif defined(__cplusplus) && (__cplusplus >= 201103L) - #define JSON_HEDLEY_NO_RETURN JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[noreturn]]) -#elif \ - JSON_HEDLEY_HAS_ATTRIBUTE(noreturn) || \ - JSON_HEDLEY_GCC_VERSION_CHECK(3,2,0) || \ - JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,11,0) || \ - JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ - JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \ - JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ - (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ - JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ - (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ - JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \ - (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ - JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ - (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ - JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \ - JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ - JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) - #define JSON_HEDLEY_NO_RETURN __attribute__((__noreturn__)) -#elif JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,10,0) - #define JSON_HEDLEY_NO_RETURN _Pragma("does_not_return") -#elif JSON_HEDLEY_MSVC_VERSION_CHECK(13,10,0) - #define JSON_HEDLEY_NO_RETURN __declspec(noreturn) -#elif JSON_HEDLEY_TI_CL6X_VERSION_CHECK(6,0,0) && defined(__cplusplus) - #define JSON_HEDLEY_NO_RETURN _Pragma("FUNC_NEVER_RETURNS;") -#elif JSON_HEDLEY_COMPCERT_VERSION_CHECK(3,2,0) - #define JSON_HEDLEY_NO_RETURN __attribute((noreturn)) -#elif JSON_HEDLEY_PELLES_VERSION_CHECK(9,0,0) - #define JSON_HEDLEY_NO_RETURN __declspec(noreturn) -#else - #define JSON_HEDLEY_NO_RETURN -#endif - -#if defined(JSON_HEDLEY_NO_ESCAPE) - #undef JSON_HEDLEY_NO_ESCAPE -#endif -#if JSON_HEDLEY_HAS_ATTRIBUTE(noescape) - #define JSON_HEDLEY_NO_ESCAPE __attribute__((__noescape__)) -#else - #define JSON_HEDLEY_NO_ESCAPE -#endif - -#if defined(JSON_HEDLEY_UNREACHABLE) - #undef JSON_HEDLEY_UNREACHABLE -#endif -#if defined(JSON_HEDLEY_UNREACHABLE_RETURN) - #undef JSON_HEDLEY_UNREACHABLE_RETURN -#endif -#if defined(JSON_HEDLEY_ASSUME) - #undef JSON_HEDLEY_ASSUME -#endif -#if \ - JSON_HEDLEY_MSVC_VERSION_CHECK(13,10,0) || \ - JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) - #define JSON_HEDLEY_ASSUME(expr) __assume(expr) -#elif JSON_HEDLEY_HAS_BUILTIN(__builtin_assume) - #define JSON_HEDLEY_ASSUME(expr) __builtin_assume(expr) -#elif \ - JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,2,0) || \ - JSON_HEDLEY_TI_CL6X_VERSION_CHECK(4,0,0) - #if defined(__cplusplus) - #define JSON_HEDLEY_ASSUME(expr) std::_nassert(expr) - #else - #define JSON_HEDLEY_ASSUME(expr) _nassert(expr) - #endif -#endif -#if \ - (JSON_HEDLEY_HAS_BUILTIN(__builtin_unreachable) && (!defined(JSON_HEDLEY_ARM_VERSION))) || \ - JSON_HEDLEY_GCC_VERSION_CHECK(4,5,0) || \ - JSON_HEDLEY_PGI_VERSION_CHECK(18,10,0) || \ - JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ - JSON_HEDLEY_IBM_VERSION_CHECK(13,1,5) - #define JSON_HEDLEY_UNREACHABLE() __builtin_unreachable() -#elif defined(JSON_HEDLEY_ASSUME) - #define JSON_HEDLEY_UNREACHABLE() JSON_HEDLEY_ASSUME(0) -#endif -#if !defined(JSON_HEDLEY_ASSUME) - #if defined(JSON_HEDLEY_UNREACHABLE) - #define JSON_HEDLEY_ASSUME(expr) JSON_HEDLEY_STATIC_CAST(void, ((expr) ? 1 : (JSON_HEDLEY_UNREACHABLE(), 1))) - #else - #define JSON_HEDLEY_ASSUME(expr) JSON_HEDLEY_STATIC_CAST(void, expr) - #endif -#endif -#if defined(JSON_HEDLEY_UNREACHABLE) - #if \ - JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,2,0) || \ - JSON_HEDLEY_TI_CL6X_VERSION_CHECK(4,0,0) - #define JSON_HEDLEY_UNREACHABLE_RETURN(value) return (JSON_HEDLEY_STATIC_CAST(void, JSON_HEDLEY_ASSUME(0)), (value)) - #else - #define JSON_HEDLEY_UNREACHABLE_RETURN(value) JSON_HEDLEY_UNREACHABLE() - #endif -#else - #define JSON_HEDLEY_UNREACHABLE_RETURN(value) return (value) -#endif -#if !defined(JSON_HEDLEY_UNREACHABLE) - #define JSON_HEDLEY_UNREACHABLE() JSON_HEDLEY_ASSUME(0) -#endif - -JSON_HEDLEY_DIAGNOSTIC_PUSH -#if JSON_HEDLEY_HAS_WARNING("-Wpedantic") - #pragma clang diagnostic ignored "-Wpedantic" -#endif -#if JSON_HEDLEY_HAS_WARNING("-Wc++98-compat-pedantic") && defined(__cplusplus) - #pragma clang diagnostic ignored "-Wc++98-compat-pedantic" -#endif -#if JSON_HEDLEY_GCC_HAS_WARNING("-Wvariadic-macros",4,0,0) - #if defined(__clang__) - #pragma clang diagnostic ignored "-Wvariadic-macros" - #elif defined(JSON_HEDLEY_GCC_VERSION) - #pragma GCC diagnostic ignored "-Wvariadic-macros" - #endif -#endif -#if defined(JSON_HEDLEY_NON_NULL) - #undef JSON_HEDLEY_NON_NULL -#endif -#if \ - JSON_HEDLEY_HAS_ATTRIBUTE(nonnull) || \ - JSON_HEDLEY_GCC_VERSION_CHECK(3,3,0) || \ - JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ - JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) - #define JSON_HEDLEY_NON_NULL(...) __attribute__((__nonnull__(__VA_ARGS__))) -#else - #define JSON_HEDLEY_NON_NULL(...) -#endif -JSON_HEDLEY_DIAGNOSTIC_POP - -#if defined(JSON_HEDLEY_PRINTF_FORMAT) - #undef JSON_HEDLEY_PRINTF_FORMAT -#endif -#if defined(__MINGW32__) && JSON_HEDLEY_GCC_HAS_ATTRIBUTE(format,4,4,0) && !defined(__USE_MINGW_ANSI_STDIO) - #define JSON_HEDLEY_PRINTF_FORMAT(string_idx,first_to_check) __attribute__((__format__(ms_printf, string_idx, first_to_check))) -#elif defined(__MINGW32__) && JSON_HEDLEY_GCC_HAS_ATTRIBUTE(format,4,4,0) && defined(__USE_MINGW_ANSI_STDIO) - #define JSON_HEDLEY_PRINTF_FORMAT(string_idx,first_to_check) __attribute__((__format__(gnu_printf, string_idx, first_to_check))) -#elif \ - JSON_HEDLEY_HAS_ATTRIBUTE(format) || \ - JSON_HEDLEY_GCC_VERSION_CHECK(3,1,0) || \ - JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ - JSON_HEDLEY_ARM_VERSION_CHECK(5,6,0) || \ - JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \ - JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ - (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ - JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ - (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ - JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \ - (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ - JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ - (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ - JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \ - JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ - JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) - #define JSON_HEDLEY_PRINTF_FORMAT(string_idx,first_to_check) __attribute__((__format__(__printf__, string_idx, first_to_check))) -#elif JSON_HEDLEY_PELLES_VERSION_CHECK(6,0,0) - #define JSON_HEDLEY_PRINTF_FORMAT(string_idx,first_to_check) __declspec(vaformat(printf,string_idx,first_to_check)) -#else - #define JSON_HEDLEY_PRINTF_FORMAT(string_idx,first_to_check) -#endif - -#if defined(JSON_HEDLEY_CONSTEXPR) - #undef JSON_HEDLEY_CONSTEXPR -#endif -#if defined(__cplusplus) - #if __cplusplus >= 201103L - #define JSON_HEDLEY_CONSTEXPR JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_(constexpr) - #endif -#endif -#if !defined(JSON_HEDLEY_CONSTEXPR) - #define JSON_HEDLEY_CONSTEXPR -#endif - -#if defined(JSON_HEDLEY_PREDICT) - #undef JSON_HEDLEY_PREDICT -#endif -#if defined(JSON_HEDLEY_LIKELY) - #undef JSON_HEDLEY_LIKELY -#endif -#if defined(JSON_HEDLEY_UNLIKELY) - #undef JSON_HEDLEY_UNLIKELY -#endif -#if defined(JSON_HEDLEY_UNPREDICTABLE) - #undef JSON_HEDLEY_UNPREDICTABLE -#endif -#if JSON_HEDLEY_HAS_BUILTIN(__builtin_unpredictable) - #define JSON_HEDLEY_UNPREDICTABLE(expr) __builtin_unpredictable((expr)) -#endif -#if \ - JSON_HEDLEY_HAS_BUILTIN(__builtin_expect_with_probability) || \ - JSON_HEDLEY_GCC_VERSION_CHECK(9,0,0) -# define JSON_HEDLEY_PREDICT(expr, value, probability) __builtin_expect_with_probability( (expr), (value), (probability)) -# define JSON_HEDLEY_PREDICT_TRUE(expr, probability) __builtin_expect_with_probability(!!(expr), 1 , (probability)) -# define JSON_HEDLEY_PREDICT_FALSE(expr, probability) __builtin_expect_with_probability(!!(expr), 0 , (probability)) -# define JSON_HEDLEY_LIKELY(expr) __builtin_expect (!!(expr), 1 ) -# define JSON_HEDLEY_UNLIKELY(expr) __builtin_expect (!!(expr), 0 ) -#elif \ - JSON_HEDLEY_HAS_BUILTIN(__builtin_expect) || \ - JSON_HEDLEY_GCC_VERSION_CHECK(3,0,0) || \ - JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ - (JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,15,0) && defined(__cplusplus)) || \ - JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ - JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \ - JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ - JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,7,0) || \ - JSON_HEDLEY_TI_CL430_VERSION_CHECK(3,1,0) || \ - JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,1,0) || \ - JSON_HEDLEY_TI_CL6X_VERSION_CHECK(6,1,0) || \ - JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ - JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ - JSON_HEDLEY_TINYC_VERSION_CHECK(0,9,27) || \ - JSON_HEDLEY_CRAY_VERSION_CHECK(8,1,0) -# define JSON_HEDLEY_PREDICT(expr, expected, probability) \ - (((probability) >= 0.9) ? __builtin_expect((expr), (expected)) : (JSON_HEDLEY_STATIC_CAST(void, expected), (expr))) -# define JSON_HEDLEY_PREDICT_TRUE(expr, probability) \ - (__extension__ ({ \ - double hedley_probability_ = (probability); \ - ((hedley_probability_ >= 0.9) ? __builtin_expect(!!(expr), 1) : ((hedley_probability_ <= 0.1) ? __builtin_expect(!!(expr), 0) : !!(expr))); \ - })) -# define JSON_HEDLEY_PREDICT_FALSE(expr, probability) \ - (__extension__ ({ \ - double hedley_probability_ = (probability); \ - ((hedley_probability_ >= 0.9) ? __builtin_expect(!!(expr), 0) : ((hedley_probability_ <= 0.1) ? __builtin_expect(!!(expr), 1) : !!(expr))); \ - })) -# define JSON_HEDLEY_LIKELY(expr) __builtin_expect(!!(expr), 1) -# define JSON_HEDLEY_UNLIKELY(expr) __builtin_expect(!!(expr), 0) -#else -# define JSON_HEDLEY_PREDICT(expr, expected, probability) (JSON_HEDLEY_STATIC_CAST(void, expected), (expr)) -# define JSON_HEDLEY_PREDICT_TRUE(expr, probability) (!!(expr)) -# define JSON_HEDLEY_PREDICT_FALSE(expr, probability) (!!(expr)) -# define JSON_HEDLEY_LIKELY(expr) (!!(expr)) -# define JSON_HEDLEY_UNLIKELY(expr) (!!(expr)) -#endif -#if !defined(JSON_HEDLEY_UNPREDICTABLE) - #define JSON_HEDLEY_UNPREDICTABLE(expr) JSON_HEDLEY_PREDICT(expr, 1, 0.5) -#endif - -#if defined(JSON_HEDLEY_MALLOC) - #undef JSON_HEDLEY_MALLOC -#endif -#if \ - JSON_HEDLEY_HAS_ATTRIBUTE(malloc) || \ - JSON_HEDLEY_GCC_VERSION_CHECK(3,1,0) || \ - JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ - JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,11,0) || \ - JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ - JSON_HEDLEY_IBM_VERSION_CHECK(12,1,0) || \ - JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ - (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ - JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ - (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ - JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \ - (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ - JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ - (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ - JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \ - JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ - JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) - #define JSON_HEDLEY_MALLOC __attribute__((__malloc__)) -#elif JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,10,0) - #define JSON_HEDLEY_MALLOC _Pragma("returns_new_memory") -#elif JSON_HEDLEY_MSVC_VERSION_CHECK(14, 0, 0) - #define JSON_HEDLEY_MALLOC __declspec(restrict) -#else - #define JSON_HEDLEY_MALLOC -#endif - -#if defined(JSON_HEDLEY_PURE) - #undef JSON_HEDLEY_PURE -#endif -#if \ - JSON_HEDLEY_HAS_ATTRIBUTE(pure) || \ - JSON_HEDLEY_GCC_VERSION_CHECK(2,96,0) || \ - JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ - JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,11,0) || \ - JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ - JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \ - JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ - (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ - JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ - (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ - JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \ - (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ - JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ - (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ - JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \ - JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ - JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ - JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0) -# define JSON_HEDLEY_PURE __attribute__((__pure__)) -#elif JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,10,0) -# define JSON_HEDLEY_PURE _Pragma("does_not_write_global_data") -#elif defined(__cplusplus) && \ - ( \ - JSON_HEDLEY_TI_CL430_VERSION_CHECK(2,0,1) || \ - JSON_HEDLEY_TI_CL6X_VERSION_CHECK(4,0,0) || \ - JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) \ - ) -# define JSON_HEDLEY_PURE _Pragma("FUNC_IS_PURE;") -#else -# define JSON_HEDLEY_PURE -#endif - -#if defined(JSON_HEDLEY_CONST) - #undef JSON_HEDLEY_CONST -#endif -#if \ - JSON_HEDLEY_HAS_ATTRIBUTE(const) || \ - JSON_HEDLEY_GCC_VERSION_CHECK(2,5,0) || \ - JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ - JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,11,0) || \ - JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ - JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \ - JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ - (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ - JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ - (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ - JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \ - (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ - JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ - (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ - JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \ - JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ - JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) || \ - JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0) - #define JSON_HEDLEY_CONST __attribute__((__const__)) -#elif \ - JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,10,0) - #define JSON_HEDLEY_CONST _Pragma("no_side_effect") -#else - #define JSON_HEDLEY_CONST JSON_HEDLEY_PURE -#endif - -#if defined(JSON_HEDLEY_RESTRICT) - #undef JSON_HEDLEY_RESTRICT -#endif -#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) && !defined(__cplusplus) - #define JSON_HEDLEY_RESTRICT restrict -#elif \ - JSON_HEDLEY_GCC_VERSION_CHECK(3,1,0) || \ - JSON_HEDLEY_MSVC_VERSION_CHECK(14,0,0) || \ - JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ - JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ - JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \ - JSON_HEDLEY_PGI_VERSION_CHECK(17,10,0) || \ - JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ - JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,2,4) || \ - JSON_HEDLEY_TI_CL6X_VERSION_CHECK(8,1,0) || \ - JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ - (JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,14,0) && defined(__cplusplus)) || \ - JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0) || \ - defined(__clang__) - #define JSON_HEDLEY_RESTRICT __restrict -#elif JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,3,0) && !defined(__cplusplus) - #define JSON_HEDLEY_RESTRICT _Restrict -#else - #define JSON_HEDLEY_RESTRICT -#endif - -#if defined(JSON_HEDLEY_INLINE) - #undef JSON_HEDLEY_INLINE -#endif -#if \ - (defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)) || \ - (defined(__cplusplus) && (__cplusplus >= 199711L)) - #define JSON_HEDLEY_INLINE inline -#elif \ - defined(JSON_HEDLEY_GCC_VERSION) || \ - JSON_HEDLEY_ARM_VERSION_CHECK(6,2,0) - #define JSON_HEDLEY_INLINE __inline__ -#elif \ - JSON_HEDLEY_MSVC_VERSION_CHECK(12,0,0) || \ - JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ - JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,1,0) || \ - JSON_HEDLEY_TI_CL430_VERSION_CHECK(3,1,0) || \ - JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,2,0) || \ - JSON_HEDLEY_TI_CL6X_VERSION_CHECK(8,0,0) || \ - JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ - JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) - #define JSON_HEDLEY_INLINE __inline -#else - #define JSON_HEDLEY_INLINE -#endif - -#if defined(JSON_HEDLEY_ALWAYS_INLINE) - #undef JSON_HEDLEY_ALWAYS_INLINE -#endif -#if \ - JSON_HEDLEY_HAS_ATTRIBUTE(always_inline) || \ - JSON_HEDLEY_GCC_VERSION_CHECK(4,0,0) || \ - JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ - JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,11,0) || \ - JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ - JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \ - JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ - (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ - JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ - (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ - JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \ - (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ - JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ - (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ - JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \ - JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ - JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) -# define JSON_HEDLEY_ALWAYS_INLINE __attribute__((__always_inline__)) JSON_HEDLEY_INLINE -#elif JSON_HEDLEY_MSVC_VERSION_CHECK(12,0,0) -# define JSON_HEDLEY_ALWAYS_INLINE __forceinline -#elif defined(__cplusplus) && \ - ( \ - JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ - JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ - JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \ - JSON_HEDLEY_TI_CL6X_VERSION_CHECK(6,1,0) || \ - JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ - JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) \ - ) -# define JSON_HEDLEY_ALWAYS_INLINE _Pragma("FUNC_ALWAYS_INLINE;") -#elif JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0) -# define JSON_HEDLEY_ALWAYS_INLINE _Pragma("inline=forced") -#else -# define JSON_HEDLEY_ALWAYS_INLINE JSON_HEDLEY_INLINE -#endif - -#if defined(JSON_HEDLEY_NEVER_INLINE) - #undef JSON_HEDLEY_NEVER_INLINE -#endif -#if \ - JSON_HEDLEY_HAS_ATTRIBUTE(noinline) || \ - JSON_HEDLEY_GCC_VERSION_CHECK(4,0,0) || \ - JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ - JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,11,0) || \ - JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ - JSON_HEDLEY_IBM_VERSION_CHECK(10,1,0) || \ - JSON_HEDLEY_TI_VERSION_CHECK(15,12,0) || \ - (JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(4,8,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ - JSON_HEDLEY_TI_ARMCL_VERSION_CHECK(5,2,0) || \ - (JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ - JSON_HEDLEY_TI_CL2000_VERSION_CHECK(6,4,0) || \ - (JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,0,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ - JSON_HEDLEY_TI_CL430_VERSION_CHECK(4,3,0) || \ - (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ - JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) || \ - JSON_HEDLEY_TI_CL7X_VERSION_CHECK(1,2,0) || \ - JSON_HEDLEY_TI_CLPRU_VERSION_CHECK(2,1,0) - #define JSON_HEDLEY_NEVER_INLINE __attribute__((__noinline__)) -#elif JSON_HEDLEY_MSVC_VERSION_CHECK(13,10,0) - #define JSON_HEDLEY_NEVER_INLINE __declspec(noinline) -#elif JSON_HEDLEY_PGI_VERSION_CHECK(10,2,0) - #define JSON_HEDLEY_NEVER_INLINE _Pragma("noinline") -#elif JSON_HEDLEY_TI_CL6X_VERSION_CHECK(6,0,0) && defined(__cplusplus) - #define JSON_HEDLEY_NEVER_INLINE _Pragma("FUNC_CANNOT_INLINE;") -#elif JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0) - #define JSON_HEDLEY_NEVER_INLINE _Pragma("inline=never") -#elif JSON_HEDLEY_COMPCERT_VERSION_CHECK(3,2,0) - #define JSON_HEDLEY_NEVER_INLINE __attribute((noinline)) -#elif JSON_HEDLEY_PELLES_VERSION_CHECK(9,0,0) - #define JSON_HEDLEY_NEVER_INLINE __declspec(noinline) -#else - #define JSON_HEDLEY_NEVER_INLINE -#endif - -#if defined(JSON_HEDLEY_PRIVATE) - #undef JSON_HEDLEY_PRIVATE -#endif -#if defined(JSON_HEDLEY_PUBLIC) - #undef JSON_HEDLEY_PUBLIC -#endif -#if defined(JSON_HEDLEY_IMPORT) - #undef JSON_HEDLEY_IMPORT -#endif -#if defined(_WIN32) || defined(__CYGWIN__) -# define JSON_HEDLEY_PRIVATE -# define JSON_HEDLEY_PUBLIC __declspec(dllexport) -# define JSON_HEDLEY_IMPORT __declspec(dllimport) -#else -# if \ - JSON_HEDLEY_HAS_ATTRIBUTE(visibility) || \ - JSON_HEDLEY_GCC_VERSION_CHECK(3,3,0) || \ - JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,11,0) || \ - JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ - JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ - JSON_HEDLEY_IBM_VERSION_CHECK(13,1,0) || \ - ( \ - defined(__TI_EABI__) && \ - ( \ - (JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,2,0) && defined(__TI_GNU_ATTRIBUTE_SUPPORT__)) || \ - JSON_HEDLEY_TI_CL6X_VERSION_CHECK(7,5,0) \ - ) \ - ) -# define JSON_HEDLEY_PRIVATE __attribute__((__visibility__("hidden"))) -# define JSON_HEDLEY_PUBLIC __attribute__((__visibility__("default"))) -# else -# define JSON_HEDLEY_PRIVATE -# define JSON_HEDLEY_PUBLIC -# endif -# define JSON_HEDLEY_IMPORT extern -#endif - -#if defined(JSON_HEDLEY_NO_THROW) - #undef JSON_HEDLEY_NO_THROW -#endif -#if \ - JSON_HEDLEY_HAS_ATTRIBUTE(nothrow) || \ - JSON_HEDLEY_GCC_VERSION_CHECK(3,3,0) || \ - JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) - #define JSON_HEDLEY_NO_THROW __attribute__((__nothrow__)) -#elif \ - JSON_HEDLEY_MSVC_VERSION_CHECK(13,1,0) || \ - JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) - #define JSON_HEDLEY_NO_THROW __declspec(nothrow) -#else - #define JSON_HEDLEY_NO_THROW -#endif - -#if defined(JSON_HEDLEY_FALL_THROUGH) - #undef JSON_HEDLEY_FALL_THROUGH -#endif -#if \ - JSON_HEDLEY_HAS_ATTRIBUTE(fallthrough) || \ - JSON_HEDLEY_GCC_VERSION_CHECK(7,0,0) - #define JSON_HEDLEY_FALL_THROUGH __attribute__((__fallthrough__)) -#elif JSON_HEDLEY_HAS_CPP_ATTRIBUTE_NS(clang,fallthrough) - #define JSON_HEDLEY_FALL_THROUGH JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[clang::fallthrough]]) -#elif JSON_HEDLEY_HAS_CPP_ATTRIBUTE(fallthrough) - #define JSON_HEDLEY_FALL_THROUGH JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_([[fallthrough]]) -#elif defined(__fallthrough) /* SAL */ - #define JSON_HEDLEY_FALL_THROUGH __fallthrough -#else - #define JSON_HEDLEY_FALL_THROUGH -#endif - -#if defined(JSON_HEDLEY_RETURNS_NON_NULL) - #undef JSON_HEDLEY_RETURNS_NON_NULL -#endif -#if \ - JSON_HEDLEY_HAS_ATTRIBUTE(returns_nonnull) || \ - JSON_HEDLEY_GCC_VERSION_CHECK(4,9,0) - #define JSON_HEDLEY_RETURNS_NON_NULL __attribute__((__returns_nonnull__)) -#elif defined(_Ret_notnull_) /* SAL */ - #define JSON_HEDLEY_RETURNS_NON_NULL _Ret_notnull_ -#else - #define JSON_HEDLEY_RETURNS_NON_NULL -#endif - -#if defined(JSON_HEDLEY_ARRAY_PARAM) - #undef JSON_HEDLEY_ARRAY_PARAM -#endif -#if \ - defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) && \ - !defined(__STDC_NO_VLA__) && \ - !defined(__cplusplus) && \ - !defined(JSON_HEDLEY_PGI_VERSION) && \ - !defined(JSON_HEDLEY_TINYC_VERSION) - #define JSON_HEDLEY_ARRAY_PARAM(name) (name) -#else - #define JSON_HEDLEY_ARRAY_PARAM(name) -#endif - -#if defined(JSON_HEDLEY_IS_CONSTANT) - #undef JSON_HEDLEY_IS_CONSTANT -#endif -#if defined(JSON_HEDLEY_REQUIRE_CONSTEXPR) - #undef JSON_HEDLEY_REQUIRE_CONSTEXPR -#endif -/* JSON_HEDLEY_IS_CONSTEXPR_ is for - HEDLEY INTERNAL USE ONLY. API subject to change without notice. */ -#if defined(JSON_HEDLEY_IS_CONSTEXPR_) - #undef JSON_HEDLEY_IS_CONSTEXPR_ -#endif -#if \ - JSON_HEDLEY_HAS_BUILTIN(__builtin_constant_p) || \ - JSON_HEDLEY_GCC_VERSION_CHECK(3,4,0) || \ - JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ - JSON_HEDLEY_TINYC_VERSION_CHECK(0,9,19) || \ - JSON_HEDLEY_ARM_VERSION_CHECK(4,1,0) || \ - JSON_HEDLEY_IBM_VERSION_CHECK(13,1,0) || \ - JSON_HEDLEY_TI_CL6X_VERSION_CHECK(6,1,0) || \ - (JSON_HEDLEY_SUNPRO_VERSION_CHECK(5,10,0) && !defined(__cplusplus)) || \ - JSON_HEDLEY_CRAY_VERSION_CHECK(8,1,0) - #define JSON_HEDLEY_IS_CONSTANT(expr) __builtin_constant_p(expr) -#endif -#if !defined(__cplusplus) -# if \ - JSON_HEDLEY_HAS_BUILTIN(__builtin_types_compatible_p) || \ - JSON_HEDLEY_GCC_VERSION_CHECK(3,4,0) || \ - JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ - JSON_HEDLEY_IBM_VERSION_CHECK(13,1,0) || \ - JSON_HEDLEY_CRAY_VERSION_CHECK(8,1,0) || \ - JSON_HEDLEY_ARM_VERSION_CHECK(5,4,0) || \ - JSON_HEDLEY_TINYC_VERSION_CHECK(0,9,24) -#if defined(__INTPTR_TYPE__) - #define JSON_HEDLEY_IS_CONSTEXPR_(expr) __builtin_types_compatible_p(__typeof__((1 ? (void*) ((__INTPTR_TYPE__) ((expr) * 0)) : (int*) 0)), int*) -#else - #include - #define JSON_HEDLEY_IS_CONSTEXPR_(expr) __builtin_types_compatible_p(__typeof__((1 ? (void*) ((intptr_t) ((expr) * 0)) : (int*) 0)), int*) -#endif -# elif \ - ( \ - defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L) && \ - !defined(JSON_HEDLEY_SUNPRO_VERSION) && \ - !defined(JSON_HEDLEY_PGI_VERSION) && \ - !defined(JSON_HEDLEY_IAR_VERSION)) || \ - JSON_HEDLEY_HAS_EXTENSION(c_generic_selections) || \ - JSON_HEDLEY_GCC_VERSION_CHECK(4,9,0) || \ - JSON_HEDLEY_INTEL_VERSION_CHECK(17,0,0) || \ - JSON_HEDLEY_IBM_VERSION_CHECK(12,1,0) || \ - JSON_HEDLEY_ARM_VERSION_CHECK(5,3,0) -#if defined(__INTPTR_TYPE__) - #define JSON_HEDLEY_IS_CONSTEXPR_(expr) _Generic((1 ? (void*) ((__INTPTR_TYPE__) ((expr) * 0)) : (int*) 0), int*: 1, void*: 0) -#else - #include - #define JSON_HEDLEY_IS_CONSTEXPR_(expr) _Generic((1 ? (void*) ((intptr_t) * 0) : (int*) 0), int*: 1, void*: 0) -#endif -# elif \ - defined(JSON_HEDLEY_GCC_VERSION) || \ - defined(JSON_HEDLEY_INTEL_VERSION) || \ - defined(JSON_HEDLEY_TINYC_VERSION) || \ - defined(JSON_HEDLEY_TI_ARMCL_VERSION) || \ - JSON_HEDLEY_TI_CL430_VERSION_CHECK(18,12,0) || \ - defined(JSON_HEDLEY_TI_CL2000_VERSION) || \ - defined(JSON_HEDLEY_TI_CL6X_VERSION) || \ - defined(JSON_HEDLEY_TI_CL7X_VERSION) || \ - defined(JSON_HEDLEY_TI_CLPRU_VERSION) || \ - defined(__clang__) -# define JSON_HEDLEY_IS_CONSTEXPR_(expr) ( \ - sizeof(void) != \ - sizeof(*( \ - 1 ? \ - ((void*) ((expr) * 0L) ) : \ -((struct { char v[sizeof(void) * 2]; } *) 1) \ - ) \ - ) \ - ) -# endif -#endif -#if defined(JSON_HEDLEY_IS_CONSTEXPR_) - #if !defined(JSON_HEDLEY_IS_CONSTANT) - #define JSON_HEDLEY_IS_CONSTANT(expr) JSON_HEDLEY_IS_CONSTEXPR_(expr) - #endif - #define JSON_HEDLEY_REQUIRE_CONSTEXPR(expr) (JSON_HEDLEY_IS_CONSTEXPR_(expr) ? (expr) : (-1)) -#else - #if !defined(JSON_HEDLEY_IS_CONSTANT) - #define JSON_HEDLEY_IS_CONSTANT(expr) (0) - #endif - #define JSON_HEDLEY_REQUIRE_CONSTEXPR(expr) (expr) -#endif - -#if defined(JSON_HEDLEY_BEGIN_C_DECLS) - #undef JSON_HEDLEY_BEGIN_C_DECLS -#endif -#if defined(JSON_HEDLEY_END_C_DECLS) - #undef JSON_HEDLEY_END_C_DECLS -#endif -#if defined(JSON_HEDLEY_C_DECL) - #undef JSON_HEDLEY_C_DECL -#endif -#if defined(__cplusplus) - #define JSON_HEDLEY_BEGIN_C_DECLS extern "C" { - #define JSON_HEDLEY_END_C_DECLS } - #define JSON_HEDLEY_C_DECL extern "C" -#else - #define JSON_HEDLEY_BEGIN_C_DECLS - #define JSON_HEDLEY_END_C_DECLS - #define JSON_HEDLEY_C_DECL -#endif - -#if defined(JSON_HEDLEY_STATIC_ASSERT) - #undef JSON_HEDLEY_STATIC_ASSERT -#endif -#if \ - !defined(__cplusplus) && ( \ - (defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L)) || \ - JSON_HEDLEY_HAS_FEATURE(c_static_assert) || \ - JSON_HEDLEY_GCC_VERSION_CHECK(6,0,0) || \ - JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) || \ - defined(_Static_assert) \ - ) -# define JSON_HEDLEY_STATIC_ASSERT(expr, message) _Static_assert(expr, message) -#elif \ - (defined(__cplusplus) && (__cplusplus >= 201103L)) || \ - JSON_HEDLEY_MSVC_VERSION_CHECK(16,0,0) -# define JSON_HEDLEY_STATIC_ASSERT(expr, message) JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_(static_assert(expr, message)) -#else -# define JSON_HEDLEY_STATIC_ASSERT(expr, message) -#endif - -#if defined(JSON_HEDLEY_NULL) - #undef JSON_HEDLEY_NULL -#endif -#if defined(__cplusplus) - #if __cplusplus >= 201103L - #define JSON_HEDLEY_NULL JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_(nullptr) - #elif defined(NULL) - #define JSON_HEDLEY_NULL NULL - #else - #define JSON_HEDLEY_NULL JSON_HEDLEY_STATIC_CAST(void*, 0) - #endif -#elif defined(NULL) - #define JSON_HEDLEY_NULL NULL -#else - #define JSON_HEDLEY_NULL ((void*) 0) -#endif - -#if defined(JSON_HEDLEY_MESSAGE) - #undef JSON_HEDLEY_MESSAGE -#endif -#if JSON_HEDLEY_HAS_WARNING("-Wunknown-pragmas") -# define JSON_HEDLEY_MESSAGE(msg) \ - JSON_HEDLEY_DIAGNOSTIC_PUSH \ - JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS \ - JSON_HEDLEY_PRAGMA(message msg) \ - JSON_HEDLEY_DIAGNOSTIC_POP -#elif \ - JSON_HEDLEY_GCC_VERSION_CHECK(4,4,0) || \ - JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) -# define JSON_HEDLEY_MESSAGE(msg) JSON_HEDLEY_PRAGMA(message msg) -#elif JSON_HEDLEY_CRAY_VERSION_CHECK(5,0,0) -# define JSON_HEDLEY_MESSAGE(msg) JSON_HEDLEY_PRAGMA(_CRI message msg) -#elif JSON_HEDLEY_IAR_VERSION_CHECK(8,0,0) -# define JSON_HEDLEY_MESSAGE(msg) JSON_HEDLEY_PRAGMA(message(msg)) -#elif JSON_HEDLEY_PELLES_VERSION_CHECK(2,0,0) -# define JSON_HEDLEY_MESSAGE(msg) JSON_HEDLEY_PRAGMA(message(msg)) -#else -# define JSON_HEDLEY_MESSAGE(msg) -#endif - -#if defined(JSON_HEDLEY_WARNING) - #undef JSON_HEDLEY_WARNING -#endif -#if JSON_HEDLEY_HAS_WARNING("-Wunknown-pragmas") -# define JSON_HEDLEY_WARNING(msg) \ - JSON_HEDLEY_DIAGNOSTIC_PUSH \ - JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS \ - JSON_HEDLEY_PRAGMA(clang warning msg) \ - JSON_HEDLEY_DIAGNOSTIC_POP -#elif \ - JSON_HEDLEY_GCC_VERSION_CHECK(4,8,0) || \ - JSON_HEDLEY_PGI_VERSION_CHECK(18,4,0) || \ - JSON_HEDLEY_INTEL_VERSION_CHECK(13,0,0) -# define JSON_HEDLEY_WARNING(msg) JSON_HEDLEY_PRAGMA(GCC warning msg) -#elif JSON_HEDLEY_MSVC_VERSION_CHECK(15,0,0) -# define JSON_HEDLEY_WARNING(msg) JSON_HEDLEY_PRAGMA(message(msg)) -#else -# define JSON_HEDLEY_WARNING(msg) JSON_HEDLEY_MESSAGE(msg) -#endif - -#if defined(JSON_HEDLEY_REQUIRE) - #undef JSON_HEDLEY_REQUIRE -#endif -#if defined(JSON_HEDLEY_REQUIRE_MSG) - #undef JSON_HEDLEY_REQUIRE_MSG -#endif -#if JSON_HEDLEY_HAS_ATTRIBUTE(diagnose_if) -# if JSON_HEDLEY_HAS_WARNING("-Wgcc-compat") -# define JSON_HEDLEY_REQUIRE(expr) \ - JSON_HEDLEY_DIAGNOSTIC_PUSH \ - _Pragma("clang diagnostic ignored \"-Wgcc-compat\"") \ - __attribute__((diagnose_if(!(expr), #expr, "error"))) \ - JSON_HEDLEY_DIAGNOSTIC_POP -# define JSON_HEDLEY_REQUIRE_MSG(expr,msg) \ - JSON_HEDLEY_DIAGNOSTIC_PUSH \ - _Pragma("clang diagnostic ignored \"-Wgcc-compat\"") \ - __attribute__((diagnose_if(!(expr), msg, "error"))) \ - JSON_HEDLEY_DIAGNOSTIC_POP -# else -# define JSON_HEDLEY_REQUIRE(expr) __attribute__((diagnose_if(!(expr), #expr, "error"))) -# define JSON_HEDLEY_REQUIRE_MSG(expr,msg) __attribute__((diagnose_if(!(expr), msg, "error"))) -# endif -#else -# define JSON_HEDLEY_REQUIRE(expr) -# define JSON_HEDLEY_REQUIRE_MSG(expr,msg) -#endif - -#if defined(JSON_HEDLEY_FLAGS) - #undef JSON_HEDLEY_FLAGS -#endif -#if JSON_HEDLEY_HAS_ATTRIBUTE(flag_enum) - #define JSON_HEDLEY_FLAGS __attribute__((__flag_enum__)) -#endif - -#if defined(JSON_HEDLEY_FLAGS_CAST) - #undef JSON_HEDLEY_FLAGS_CAST -#endif -#if JSON_HEDLEY_INTEL_VERSION_CHECK(19,0,0) -# define JSON_HEDLEY_FLAGS_CAST(T, expr) (__extension__ ({ \ - JSON_HEDLEY_DIAGNOSTIC_PUSH \ - _Pragma("warning(disable:188)") \ - ((T) (expr)); \ - JSON_HEDLEY_DIAGNOSTIC_POP \ - })) -#else -# define JSON_HEDLEY_FLAGS_CAST(T, expr) JSON_HEDLEY_STATIC_CAST(T, expr) -#endif - -#if defined(JSON_HEDLEY_EMPTY_BASES) - #undef JSON_HEDLEY_EMPTY_BASES -#endif -#if JSON_HEDLEY_MSVC_VERSION_CHECK(19,0,23918) && !JSON_HEDLEY_MSVC_VERSION_CHECK(20,0,0) - #define JSON_HEDLEY_EMPTY_BASES __declspec(empty_bases) -#else - #define JSON_HEDLEY_EMPTY_BASES -#endif - -/* Remaining macros are deprecated. */ - -#if defined(JSON_HEDLEY_GCC_NOT_CLANG_VERSION_CHECK) - #undef JSON_HEDLEY_GCC_NOT_CLANG_VERSION_CHECK -#endif -#if defined(__clang__) - #define JSON_HEDLEY_GCC_NOT_CLANG_VERSION_CHECK(major,minor,patch) (0) -#else - #define JSON_HEDLEY_GCC_NOT_CLANG_VERSION_CHECK(major,minor,patch) JSON_HEDLEY_GCC_VERSION_CHECK(major,minor,patch) -#endif - -#if defined(JSON_HEDLEY_CLANG_HAS_ATTRIBUTE) - #undef JSON_HEDLEY_CLANG_HAS_ATTRIBUTE -#endif -#define JSON_HEDLEY_CLANG_HAS_ATTRIBUTE(attribute) JSON_HEDLEY_HAS_ATTRIBUTE(attribute) - -#if defined(JSON_HEDLEY_CLANG_HAS_CPP_ATTRIBUTE) - #undef JSON_HEDLEY_CLANG_HAS_CPP_ATTRIBUTE -#endif -#define JSON_HEDLEY_CLANG_HAS_CPP_ATTRIBUTE(attribute) JSON_HEDLEY_HAS_CPP_ATTRIBUTE(attribute) - -#if defined(JSON_HEDLEY_CLANG_HAS_BUILTIN) - #undef JSON_HEDLEY_CLANG_HAS_BUILTIN -#endif -#define JSON_HEDLEY_CLANG_HAS_BUILTIN(builtin) JSON_HEDLEY_HAS_BUILTIN(builtin) - -#if defined(JSON_HEDLEY_CLANG_HAS_FEATURE) - #undef JSON_HEDLEY_CLANG_HAS_FEATURE -#endif -#define JSON_HEDLEY_CLANG_HAS_FEATURE(feature) JSON_HEDLEY_HAS_FEATURE(feature) - -#if defined(JSON_HEDLEY_CLANG_HAS_EXTENSION) - #undef JSON_HEDLEY_CLANG_HAS_EXTENSION -#endif -#define JSON_HEDLEY_CLANG_HAS_EXTENSION(extension) JSON_HEDLEY_HAS_EXTENSION(extension) - -#if defined(JSON_HEDLEY_CLANG_HAS_DECLSPEC_DECLSPEC_ATTRIBUTE) - #undef JSON_HEDLEY_CLANG_HAS_DECLSPEC_DECLSPEC_ATTRIBUTE -#endif -#define JSON_HEDLEY_CLANG_HAS_DECLSPEC_ATTRIBUTE(attribute) JSON_HEDLEY_HAS_DECLSPEC_ATTRIBUTE(attribute) - -#if defined(JSON_HEDLEY_CLANG_HAS_WARNING) - #undef JSON_HEDLEY_CLANG_HAS_WARNING -#endif -#define JSON_HEDLEY_CLANG_HAS_WARNING(warning) JSON_HEDLEY_HAS_WARNING(warning) - -#endif /* !defined(JSON_HEDLEY_VERSION) || (JSON_HEDLEY_VERSION < X) */ - - -// This file contains all internal macro definitions -// You MUST include macro_unscope.hpp at the end of json.hpp to undef all of them - -// exclude unsupported compilers -#if !defined(JSON_SKIP_UNSUPPORTED_COMPILER_CHECK) - #if defined(__clang__) - #if (__clang_major__ * 10000 + __clang_minor__ * 100 + __clang_patchlevel__) < 30400 - #error "unsupported Clang version - see https://github.com/nlohmann/json#supported-compilers" - #endif - #elif defined(__GNUC__) && !(defined(__ICC) || defined(__INTEL_COMPILER)) - #if (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) < 40800 - #error "unsupported GCC version - see https://github.com/nlohmann/json#supported-compilers" - #endif - #endif -#endif - -// C++ language standard detection -#if (defined(__cplusplus) && __cplusplus >= 202002L) || (defined(_MSVC_LANG) && _MSVC_LANG >= 202002L) - #define JSON_HAS_CPP_20 - #define JSON_HAS_CPP_17 - #define JSON_HAS_CPP_14 -#elif (defined(__cplusplus) && __cplusplus >= 201703L) || (defined(_HAS_CXX17) && _HAS_CXX17 == 1) // fix for issue #464 - #define JSON_HAS_CPP_17 - #define JSON_HAS_CPP_14 -#elif (defined(__cplusplus) && __cplusplus >= 201402L) || (defined(_HAS_CXX14) && _HAS_CXX14 == 1) - #define JSON_HAS_CPP_14 -#endif - -// disable float-equal warnings on GCC/clang -#if defined(__clang__) || defined(__GNUC__) || defined(__GNUG__) - #pragma GCC diagnostic push - #pragma GCC diagnostic ignored "-Wfloat-equal" -#endif - -// disable documentation warnings on clang -#if defined(__clang__) - #pragma GCC diagnostic push - #pragma GCC diagnostic ignored "-Wdocumentation" -#endif - -// allow to disable exceptions -#if (defined(__cpp_exceptions) || defined(__EXCEPTIONS) || defined(_CPPUNWIND)) && !defined(JSON_NOEXCEPTION) - #define JSON_THROW(exception) throw exception - #define JSON_TRY try - #define JSON_CATCH(exception) catch(exception) - #define JSON_INTERNAL_CATCH(exception) catch(exception) -#else - #include - #define JSON_THROW(exception) std::abort() - #define JSON_TRY if(true) - #define JSON_CATCH(exception) if(false) - #define JSON_INTERNAL_CATCH(exception) if(false) -#endif - -// override exception macros -#if defined(JSON_THROW_USER) - #undef JSON_THROW - #define JSON_THROW JSON_THROW_USER -#endif -#if defined(JSON_TRY_USER) - #undef JSON_TRY - #define JSON_TRY JSON_TRY_USER -#endif -#if defined(JSON_CATCH_USER) - #undef JSON_CATCH - #define JSON_CATCH JSON_CATCH_USER - #undef JSON_INTERNAL_CATCH - #define JSON_INTERNAL_CATCH JSON_CATCH_USER -#endif -#if defined(JSON_INTERNAL_CATCH_USER) - #undef JSON_INTERNAL_CATCH - #define JSON_INTERNAL_CATCH JSON_INTERNAL_CATCH_USER -#endif - -// allow to override assert -#if !defined(JSON_ASSERT) - #include // assert - #define JSON_ASSERT(x) assert(x) -#endif - -/*! -@brief macro to briefly define a mapping between an enum and JSON -@def NLOHMANN_JSON_SERIALIZE_ENUM -@since version 3.4.0 -*/ -#define NLOHMANN_JSON_SERIALIZE_ENUM(ENUM_TYPE, ...) \ - template \ - inline void to_json(BasicJsonType& j, const ENUM_TYPE& e) \ - { \ - static_assert(std::is_enum::value, #ENUM_TYPE " must be an enum!"); \ - static const std::pair m[] = __VA_ARGS__; \ - auto it = std::find_if(std::begin(m), std::end(m), \ - [e](const std::pair& ej_pair) -> bool \ - { \ - return ej_pair.first == e; \ - }); \ - j = ((it != std::end(m)) ? it : std::begin(m))->second; \ - } \ - template \ - inline void from_json(const BasicJsonType& j, ENUM_TYPE& e) \ - { \ - static_assert(std::is_enum::value, #ENUM_TYPE " must be an enum!"); \ - static const std::pair m[] = __VA_ARGS__; \ - auto it = std::find_if(std::begin(m), std::end(m), \ - [&j](const std::pair& ej_pair) -> bool \ - { \ - return ej_pair.second == j; \ - }); \ - e = ((it != std::end(m)) ? it : std::begin(m))->first; \ - } - -// Ugly macros to avoid uglier copy-paste when specializing basic_json. They -// may be removed in the future once the class is split. - -#define NLOHMANN_BASIC_JSON_TPL_DECLARATION \ - template class ObjectType, \ - template class ArrayType, \ - class StringType, class BooleanType, class NumberIntegerType, \ - class NumberUnsignedType, class NumberFloatType, \ - template class AllocatorType, \ - template class JSONSerializer, \ - class BinaryType> - -#define NLOHMANN_BASIC_JSON_TPL \ - basic_json - -// Macros to simplify conversion from/to types - -#define NLOHMANN_JSON_EXPAND( x ) x -#define NLOHMANN_JSON_GET_MACRO(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, _20, _21, _22, _23, _24, _25, _26, _27, _28, _29, _30, _31, _32, _33, _34, _35, _36, _37, _38, _39, _40, _41, _42, _43, _44, _45, _46, _47, _48, _49, _50, _51, _52, _53, _54, _55, _56, _57, _58, _59, _60, _61, _62, _63, _64, NAME,...) NAME -#define NLOHMANN_JSON_PASTE(...) NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_GET_MACRO(__VA_ARGS__, \ - NLOHMANN_JSON_PASTE64, \ - NLOHMANN_JSON_PASTE63, \ - NLOHMANN_JSON_PASTE62, \ - NLOHMANN_JSON_PASTE61, \ - NLOHMANN_JSON_PASTE60, \ - NLOHMANN_JSON_PASTE59, \ - NLOHMANN_JSON_PASTE58, \ - NLOHMANN_JSON_PASTE57, \ - NLOHMANN_JSON_PASTE56, \ - NLOHMANN_JSON_PASTE55, \ - NLOHMANN_JSON_PASTE54, \ - NLOHMANN_JSON_PASTE53, \ - NLOHMANN_JSON_PASTE52, \ - NLOHMANN_JSON_PASTE51, \ - NLOHMANN_JSON_PASTE50, \ - NLOHMANN_JSON_PASTE49, \ - NLOHMANN_JSON_PASTE48, \ - NLOHMANN_JSON_PASTE47, \ - NLOHMANN_JSON_PASTE46, \ - NLOHMANN_JSON_PASTE45, \ - NLOHMANN_JSON_PASTE44, \ - NLOHMANN_JSON_PASTE43, \ - NLOHMANN_JSON_PASTE42, \ - NLOHMANN_JSON_PASTE41, \ - NLOHMANN_JSON_PASTE40, \ - NLOHMANN_JSON_PASTE39, \ - NLOHMANN_JSON_PASTE38, \ - NLOHMANN_JSON_PASTE37, \ - NLOHMANN_JSON_PASTE36, \ - NLOHMANN_JSON_PASTE35, \ - NLOHMANN_JSON_PASTE34, \ - NLOHMANN_JSON_PASTE33, \ - NLOHMANN_JSON_PASTE32, \ - NLOHMANN_JSON_PASTE31, \ - NLOHMANN_JSON_PASTE30, \ - NLOHMANN_JSON_PASTE29, \ - NLOHMANN_JSON_PASTE28, \ - NLOHMANN_JSON_PASTE27, \ - NLOHMANN_JSON_PASTE26, \ - NLOHMANN_JSON_PASTE25, \ - NLOHMANN_JSON_PASTE24, \ - NLOHMANN_JSON_PASTE23, \ - NLOHMANN_JSON_PASTE22, \ - NLOHMANN_JSON_PASTE21, \ - NLOHMANN_JSON_PASTE20, \ - NLOHMANN_JSON_PASTE19, \ - NLOHMANN_JSON_PASTE18, \ - NLOHMANN_JSON_PASTE17, \ - NLOHMANN_JSON_PASTE16, \ - NLOHMANN_JSON_PASTE15, \ - NLOHMANN_JSON_PASTE14, \ - NLOHMANN_JSON_PASTE13, \ - NLOHMANN_JSON_PASTE12, \ - NLOHMANN_JSON_PASTE11, \ - NLOHMANN_JSON_PASTE10, \ - NLOHMANN_JSON_PASTE9, \ - NLOHMANN_JSON_PASTE8, \ - NLOHMANN_JSON_PASTE7, \ - NLOHMANN_JSON_PASTE6, \ - NLOHMANN_JSON_PASTE5, \ - NLOHMANN_JSON_PASTE4, \ - NLOHMANN_JSON_PASTE3, \ - NLOHMANN_JSON_PASTE2, \ - NLOHMANN_JSON_PASTE1)(__VA_ARGS__)) -#define NLOHMANN_JSON_PASTE2(func, v1) func(v1) -#define NLOHMANN_JSON_PASTE3(func, v1, v2) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE2(func, v2) -#define NLOHMANN_JSON_PASTE4(func, v1, v2, v3) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE3(func, v2, v3) -#define NLOHMANN_JSON_PASTE5(func, v1, v2, v3, v4) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE4(func, v2, v3, v4) -#define NLOHMANN_JSON_PASTE6(func, v1, v2, v3, v4, v5) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE5(func, v2, v3, v4, v5) -#define NLOHMANN_JSON_PASTE7(func, v1, v2, v3, v4, v5, v6) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE6(func, v2, v3, v4, v5, v6) -#define NLOHMANN_JSON_PASTE8(func, v1, v2, v3, v4, v5, v6, v7) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE7(func, v2, v3, v4, v5, v6, v7) -#define NLOHMANN_JSON_PASTE9(func, v1, v2, v3, v4, v5, v6, v7, v8) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE8(func, v2, v3, v4, v5, v6, v7, v8) -#define NLOHMANN_JSON_PASTE10(func, v1, v2, v3, v4, v5, v6, v7, v8, v9) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE9(func, v2, v3, v4, v5, v6, v7, v8, v9) -#define NLOHMANN_JSON_PASTE11(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE10(func, v2, v3, v4, v5, v6, v7, v8, v9, v10) -#define NLOHMANN_JSON_PASTE12(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE11(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11) -#define NLOHMANN_JSON_PASTE13(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE12(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12) -#define NLOHMANN_JSON_PASTE14(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE13(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13) -#define NLOHMANN_JSON_PASTE15(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE14(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14) -#define NLOHMANN_JSON_PASTE16(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE15(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15) -#define NLOHMANN_JSON_PASTE17(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE16(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16) -#define NLOHMANN_JSON_PASTE18(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE17(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17) -#define NLOHMANN_JSON_PASTE19(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE18(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18) -#define NLOHMANN_JSON_PASTE20(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE19(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19) -#define NLOHMANN_JSON_PASTE21(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE20(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20) -#define NLOHMANN_JSON_PASTE22(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE21(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21) -#define NLOHMANN_JSON_PASTE23(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE22(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22) -#define NLOHMANN_JSON_PASTE24(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE23(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23) -#define NLOHMANN_JSON_PASTE25(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE24(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24) -#define NLOHMANN_JSON_PASTE26(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE25(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25) -#define NLOHMANN_JSON_PASTE27(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE26(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26) -#define NLOHMANN_JSON_PASTE28(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE27(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27) -#define NLOHMANN_JSON_PASTE29(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE28(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28) -#define NLOHMANN_JSON_PASTE30(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE29(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29) -#define NLOHMANN_JSON_PASTE31(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE30(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30) -#define NLOHMANN_JSON_PASTE32(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE31(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31) -#define NLOHMANN_JSON_PASTE33(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE32(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32) -#define NLOHMANN_JSON_PASTE34(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE33(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33) -#define NLOHMANN_JSON_PASTE35(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE34(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34) -#define NLOHMANN_JSON_PASTE36(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE35(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35) -#define NLOHMANN_JSON_PASTE37(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE36(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36) -#define NLOHMANN_JSON_PASTE38(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE37(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37) -#define NLOHMANN_JSON_PASTE39(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE38(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38) -#define NLOHMANN_JSON_PASTE40(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE39(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39) -#define NLOHMANN_JSON_PASTE41(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE40(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40) -#define NLOHMANN_JSON_PASTE42(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE41(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41) -#define NLOHMANN_JSON_PASTE43(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE42(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42) -#define NLOHMANN_JSON_PASTE44(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE43(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43) -#define NLOHMANN_JSON_PASTE45(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE44(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44) -#define NLOHMANN_JSON_PASTE46(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE45(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45) -#define NLOHMANN_JSON_PASTE47(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE46(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46) -#define NLOHMANN_JSON_PASTE48(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE47(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47) -#define NLOHMANN_JSON_PASTE49(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE48(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48) -#define NLOHMANN_JSON_PASTE50(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE49(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49) -#define NLOHMANN_JSON_PASTE51(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE50(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50) -#define NLOHMANN_JSON_PASTE52(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE51(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51) -#define NLOHMANN_JSON_PASTE53(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE52(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52) -#define NLOHMANN_JSON_PASTE54(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE53(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53) -#define NLOHMANN_JSON_PASTE55(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE54(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54) -#define NLOHMANN_JSON_PASTE56(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE55(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55) -#define NLOHMANN_JSON_PASTE57(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE56(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56) -#define NLOHMANN_JSON_PASTE58(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE57(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57) -#define NLOHMANN_JSON_PASTE59(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE58(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58) -#define NLOHMANN_JSON_PASTE60(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE59(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59) -#define NLOHMANN_JSON_PASTE61(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE60(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60) -#define NLOHMANN_JSON_PASTE62(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60, v61) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE61(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60, v61) -#define NLOHMANN_JSON_PASTE63(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60, v61, v62) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE62(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60, v61, v62) -#define NLOHMANN_JSON_PASTE64(func, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60, v61, v62, v63) NLOHMANN_JSON_PASTE2(func, v1) NLOHMANN_JSON_PASTE63(func, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49, v50, v51, v52, v53, v54, v55, v56, v57, v58, v59, v60, v61, v62, v63) - -#define NLOHMANN_JSON_TO(v1) nlohmann_json_j[#v1] = nlohmann_json_t.v1; -#define NLOHMANN_JSON_FROM(v1) nlohmann_json_j.at(#v1).get_to(nlohmann_json_t.v1); - -/*! -@brief macro -@def NLOHMANN_DEFINE_TYPE_INTRUSIVE -@since version 3.9.0 -*/ -#define NLOHMANN_DEFINE_TYPE_INTRUSIVE(Type, ...) \ - friend void to_json(nlohmann::json& nlohmann_json_j, const Type& nlohmann_json_t) { NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_TO, __VA_ARGS__)) } \ - friend void from_json(const nlohmann::json& nlohmann_json_j, Type& nlohmann_json_t) { NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_FROM, __VA_ARGS__)) } - -/*! -@brief macro -@def NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE -@since version 3.9.0 -*/ -#define NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE(Type, ...) \ - inline void to_json(nlohmann::json& nlohmann_json_j, const Type& nlohmann_json_t) { NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_TO, __VA_ARGS__)) } \ - inline void from_json(const nlohmann::json& nlohmann_json_j, Type& nlohmann_json_t) { NLOHMANN_JSON_EXPAND(NLOHMANN_JSON_PASTE(NLOHMANN_JSON_FROM, __VA_ARGS__)) } - -#ifndef JSON_USE_IMPLICIT_CONVERSIONS - #define JSON_USE_IMPLICIT_CONVERSIONS 1 -#endif - -#if JSON_USE_IMPLICIT_CONVERSIONS - #define JSON_EXPLICIT -#else - #define JSON_EXPLICIT explicit -#endif - - -namespace nlohmann -{ -namespace detail -{ -//////////////// -// exceptions // -//////////////// - -/*! -@brief general exception of the @ref basic_json class - -This class is an extension of `std::exception` objects with a member @a id for -exception ids. It is used as the base class for all exceptions thrown by the -@ref basic_json class. This class can hence be used as "wildcard" to catch -exceptions. - -Subclasses: -- @ref parse_error for exceptions indicating a parse error -- @ref invalid_iterator for exceptions indicating errors with iterators -- @ref type_error for exceptions indicating executing a member function with - a wrong type -- @ref out_of_range for exceptions indicating access out of the defined range -- @ref other_error for exceptions indicating other library errors - -@internal -@note To have nothrow-copy-constructible exceptions, we internally use - `std::runtime_error` which can cope with arbitrary-length error messages. - Intermediate strings are built with static functions and then passed to - the actual constructor. -@endinternal - -@liveexample{The following code shows how arbitrary library exceptions can be -caught.,exception} - -@since version 3.0.0 -*/ -class exception : public std::exception -{ - public: - /// returns the explanatory string - JSON_HEDLEY_RETURNS_NON_NULL - const char* what() const noexcept override - { - return m.what(); - } - - /// the id of the exception - const int id; - - protected: - JSON_HEDLEY_NON_NULL(3) - exception(int id_, const char* what_arg) : id(id_), m(what_arg) {} - - static std::string name(const std::string& ename, int id_) - { - return "[json.exception." + ename + "." + std::to_string(id_) + "] "; - } - - private: - /// an exception object as storage for error messages - std::runtime_error m; -}; - -/*! -@brief exception indicating a parse error - -This exception is thrown by the library when a parse error occurs. Parse errors -can occur during the deserialization of JSON text, CBOR, MessagePack, as well -as when using JSON Patch. - -Member @a byte holds the byte index of the last read character in the input -file. - -Exceptions have ids 1xx. - -name / id | example message | description ------------------------------- | --------------- | ------------------------- -json.exception.parse_error.101 | parse error at 2: unexpected end of input; expected string literal | This error indicates a syntax error while deserializing a JSON text. The error message describes that an unexpected token (character) was encountered, and the member @a byte indicates the error position. -json.exception.parse_error.102 | parse error at 14: missing or wrong low surrogate | JSON uses the `\uxxxx` format to describe Unicode characters. Code points above above 0xFFFF are split into two `\uxxxx` entries ("surrogate pairs"). This error indicates that the surrogate pair is incomplete or contains an invalid code point. -json.exception.parse_error.103 | parse error: code points above 0x10FFFF are invalid | Unicode supports code points up to 0x10FFFF. Code points above 0x10FFFF are invalid. -json.exception.parse_error.104 | parse error: JSON patch must be an array of objects | [RFC 6902](https://tools.ietf.org/html/rfc6902) requires a JSON Patch document to be a JSON document that represents an array of objects. -json.exception.parse_error.105 | parse error: operation must have string member 'op' | An operation of a JSON Patch document must contain exactly one "op" member, whose value indicates the operation to perform. Its value must be one of "add", "remove", "replace", "move", "copy", or "test"; other values are errors. -json.exception.parse_error.106 | parse error: array index '01' must not begin with '0' | An array index in a JSON Pointer ([RFC 6901](https://tools.ietf.org/html/rfc6901)) may be `0` or any number without a leading `0`. -json.exception.parse_error.107 | parse error: JSON pointer must be empty or begin with '/' - was: 'foo' | A JSON Pointer must be a Unicode string containing a sequence of zero or more reference tokens, each prefixed by a `/` character. -json.exception.parse_error.108 | parse error: escape character '~' must be followed with '0' or '1' | In a JSON Pointer, only `~0` and `~1` are valid escape sequences. -json.exception.parse_error.109 | parse error: array index 'one' is not a number | A JSON Pointer array index must be a number. -json.exception.parse_error.110 | parse error at 1: cannot read 2 bytes from vector | When parsing CBOR or MessagePack, the byte vector ends before the complete value has been read. -json.exception.parse_error.112 | parse error at 1: error reading CBOR; last byte: 0xF8 | Not all types of CBOR or MessagePack are supported. This exception occurs if an unsupported byte was read. -json.exception.parse_error.113 | parse error at 2: expected a CBOR string; last byte: 0x98 | While parsing a map key, a value that is not a string has been read. -json.exception.parse_error.114 | parse error: Unsupported BSON record type 0x0F | The parsing of the corresponding BSON record type is not implemented (yet). -json.exception.parse_error.115 | parse error at byte 5: syntax error while parsing UBJSON high-precision number: invalid number text: 1A | A UBJSON high-precision number could not be parsed. - -@note For an input with n bytes, 1 is the index of the first character and n+1 - is the index of the terminating null byte or the end of file. This also - holds true when reading a byte vector (CBOR or MessagePack). - -@liveexample{The following code shows how a `parse_error` exception can be -caught.,parse_error} - -@sa - @ref exception for the base class of the library exceptions -@sa - @ref invalid_iterator for exceptions indicating errors with iterators -@sa - @ref type_error for exceptions indicating executing a member function with - a wrong type -@sa - @ref out_of_range for exceptions indicating access out of the defined range -@sa - @ref other_error for exceptions indicating other library errors - -@since version 3.0.0 -*/ -class parse_error : public exception -{ - public: - /*! - @brief create a parse error exception - @param[in] id_ the id of the exception - @param[in] pos the position where the error occurred (or with - chars_read_total=0 if the position cannot be - determined) - @param[in] what_arg the explanatory string - @return parse_error object - */ - static parse_error create(int id_, const position_t& pos, const std::string& what_arg) - { - std::string w = exception::name("parse_error", id_) + "parse error" + - position_string(pos) + ": " + what_arg; - return parse_error(id_, pos.chars_read_total, w.c_str()); - } - - static parse_error create(int id_, std::size_t byte_, const std::string& what_arg) - { - std::string w = exception::name("parse_error", id_) + "parse error" + - (byte_ != 0 ? (" at byte " + std::to_string(byte_)) : "") + - ": " + what_arg; - return parse_error(id_, byte_, w.c_str()); - } - - /*! - @brief byte index of the parse error - - The byte index of the last read character in the input file. - - @note For an input with n bytes, 1 is the index of the first character and - n+1 is the index of the terminating null byte or the end of file. - This also holds true when reading a byte vector (CBOR or MessagePack). - */ - const std::size_t byte; - - private: - parse_error(int id_, std::size_t byte_, const char* what_arg) - : exception(id_, what_arg), byte(byte_) {} - - static std::string position_string(const position_t& pos) - { - return " at line " + std::to_string(pos.lines_read + 1) + - ", column " + std::to_string(pos.chars_read_current_line); - } -}; - -/*! -@brief exception indicating errors with iterators - -This exception is thrown if iterators passed to a library function do not match -the expected semantics. - -Exceptions have ids 2xx. - -name / id | example message | description ------------------------------------ | --------------- | ------------------------- -json.exception.invalid_iterator.201 | iterators are not compatible | The iterators passed to constructor @ref basic_json(InputIT first, InputIT last) are not compatible, meaning they do not belong to the same container. Therefore, the range (@a first, @a last) is invalid. -json.exception.invalid_iterator.202 | iterator does not fit current value | In an erase or insert function, the passed iterator @a pos does not belong to the JSON value for which the function was called. It hence does not define a valid position for the deletion/insertion. -json.exception.invalid_iterator.203 | iterators do not fit current value | Either iterator passed to function @ref erase(IteratorType first, IteratorType last) does not belong to the JSON value from which values shall be erased. It hence does not define a valid range to delete values from. -json.exception.invalid_iterator.204 | iterators out of range | When an iterator range for a primitive type (number, boolean, or string) is passed to a constructor or an erase function, this range has to be exactly (@ref begin(), @ref end()), because this is the only way the single stored value is expressed. All other ranges are invalid. -json.exception.invalid_iterator.205 | iterator out of range | When an iterator for a primitive type (number, boolean, or string) is passed to an erase function, the iterator has to be the @ref begin() iterator, because it is the only way to address the stored value. All other iterators are invalid. -json.exception.invalid_iterator.206 | cannot construct with iterators from null | The iterators passed to constructor @ref basic_json(InputIT first, InputIT last) belong to a JSON null value and hence to not define a valid range. -json.exception.invalid_iterator.207 | cannot use key() for non-object iterators | The key() member function can only be used on iterators belonging to a JSON object, because other types do not have a concept of a key. -json.exception.invalid_iterator.208 | cannot use operator[] for object iterators | The operator[] to specify a concrete offset cannot be used on iterators belonging to a JSON object, because JSON objects are unordered. -json.exception.invalid_iterator.209 | cannot use offsets with object iterators | The offset operators (+, -, +=, -=) cannot be used on iterators belonging to a JSON object, because JSON objects are unordered. -json.exception.invalid_iterator.210 | iterators do not fit | The iterator range passed to the insert function are not compatible, meaning they do not belong to the same container. Therefore, the range (@a first, @a last) is invalid. -json.exception.invalid_iterator.211 | passed iterators may not belong to container | The iterator range passed to the insert function must not be a subrange of the container to insert to. -json.exception.invalid_iterator.212 | cannot compare iterators of different containers | When two iterators are compared, they must belong to the same container. -json.exception.invalid_iterator.213 | cannot compare order of object iterators | The order of object iterators cannot be compared, because JSON objects are unordered. -json.exception.invalid_iterator.214 | cannot get value | Cannot get value for iterator: Either the iterator belongs to a null value or it is an iterator to a primitive type (number, boolean, or string), but the iterator is different to @ref begin(). - -@liveexample{The following code shows how an `invalid_iterator` exception can be -caught.,invalid_iterator} - -@sa - @ref exception for the base class of the library exceptions -@sa - @ref parse_error for exceptions indicating a parse error -@sa - @ref type_error for exceptions indicating executing a member function with - a wrong type -@sa - @ref out_of_range for exceptions indicating access out of the defined range -@sa - @ref other_error for exceptions indicating other library errors - -@since version 3.0.0 -*/ -class invalid_iterator : public exception -{ - public: - static invalid_iterator create(int id_, const std::string& what_arg) - { - std::string w = exception::name("invalid_iterator", id_) + what_arg; - return invalid_iterator(id_, w.c_str()); - } - - private: - JSON_HEDLEY_NON_NULL(3) - invalid_iterator(int id_, const char* what_arg) - : exception(id_, what_arg) {} -}; - -/*! -@brief exception indicating executing a member function with a wrong type - -This exception is thrown in case of a type error; that is, a library function is -executed on a JSON value whose type does not match the expected semantics. - -Exceptions have ids 3xx. - -name / id | example message | description ------------------------------ | --------------- | ------------------------- -json.exception.type_error.301 | cannot create object from initializer list | To create an object from an initializer list, the initializer list must consist only of a list of pairs whose first element is a string. When this constraint is violated, an array is created instead. -json.exception.type_error.302 | type must be object, but is array | During implicit or explicit value conversion, the JSON type must be compatible to the target type. For instance, a JSON string can only be converted into string types, but not into numbers or boolean types. -json.exception.type_error.303 | incompatible ReferenceType for get_ref, actual type is object | To retrieve a reference to a value stored in a @ref basic_json object with @ref get_ref, the type of the reference must match the value type. For instance, for a JSON array, the @a ReferenceType must be @ref array_t &. -json.exception.type_error.304 | cannot use at() with string | The @ref at() member functions can only be executed for certain JSON types. -json.exception.type_error.305 | cannot use operator[] with string | The @ref operator[] member functions can only be executed for certain JSON types. -json.exception.type_error.306 | cannot use value() with string | The @ref value() member functions can only be executed for certain JSON types. -json.exception.type_error.307 | cannot use erase() with string | The @ref erase() member functions can only be executed for certain JSON types. -json.exception.type_error.308 | cannot use push_back() with string | The @ref push_back() and @ref operator+= member functions can only be executed for certain JSON types. -json.exception.type_error.309 | cannot use insert() with | The @ref insert() member functions can only be executed for certain JSON types. -json.exception.type_error.310 | cannot use swap() with number | The @ref swap() member functions can only be executed for certain JSON types. -json.exception.type_error.311 | cannot use emplace_back() with string | The @ref emplace_back() member function can only be executed for certain JSON types. -json.exception.type_error.312 | cannot use update() with string | The @ref update() member functions can only be executed for certain JSON types. -json.exception.type_error.313 | invalid value to unflatten | The @ref unflatten function converts an object whose keys are JSON Pointers back into an arbitrary nested JSON value. The JSON Pointers must not overlap, because then the resulting value would not be well defined. -json.exception.type_error.314 | only objects can be unflattened | The @ref unflatten function only works for an object whose keys are JSON Pointers. -json.exception.type_error.315 | values in object must be primitive | The @ref unflatten function only works for an object whose keys are JSON Pointers and whose values are primitive. -json.exception.type_error.316 | invalid UTF-8 byte at index 10: 0x7E | The @ref dump function only works with UTF-8 encoded strings; that is, if you assign a `std::string` to a JSON value, make sure it is UTF-8 encoded. | -json.exception.type_error.317 | JSON value cannot be serialized to requested format | The dynamic type of the object cannot be represented in the requested serialization format (e.g. a raw `true` or `null` JSON object cannot be serialized to BSON) | - -@liveexample{The following code shows how a `type_error` exception can be -caught.,type_error} - -@sa - @ref exception for the base class of the library exceptions -@sa - @ref parse_error for exceptions indicating a parse error -@sa - @ref invalid_iterator for exceptions indicating errors with iterators -@sa - @ref out_of_range for exceptions indicating access out of the defined range -@sa - @ref other_error for exceptions indicating other library errors - -@since version 3.0.0 -*/ -class type_error : public exception -{ - public: - static type_error create(int id_, const std::string& what_arg) - { - std::string w = exception::name("type_error", id_) + what_arg; - return type_error(id_, w.c_str()); - } - - private: - JSON_HEDLEY_NON_NULL(3) - type_error(int id_, const char* what_arg) : exception(id_, what_arg) {} -}; - -/*! -@brief exception indicating access out of the defined range - -This exception is thrown in case a library function is called on an input -parameter that exceeds the expected range, for instance in case of array -indices or nonexisting object keys. - -Exceptions have ids 4xx. - -name / id | example message | description -------------------------------- | --------------- | ------------------------- -json.exception.out_of_range.401 | array index 3 is out of range | The provided array index @a i is larger than @a size-1. -json.exception.out_of_range.402 | array index '-' (3) is out of range | The special array index `-` in a JSON Pointer never describes a valid element of the array, but the index past the end. That is, it can only be used to add elements at this position, but not to read it. -json.exception.out_of_range.403 | key 'foo' not found | The provided key was not found in the JSON object. -json.exception.out_of_range.404 | unresolved reference token 'foo' | A reference token in a JSON Pointer could not be resolved. -json.exception.out_of_range.405 | JSON pointer has no parent | The JSON Patch operations 'remove' and 'add' can not be applied to the root element of the JSON value. -json.exception.out_of_range.406 | number overflow parsing '10E1000' | A parsed number could not be stored as without changing it to NaN or INF. -json.exception.out_of_range.407 | number overflow serializing '9223372036854775808' | UBJSON and BSON only support integer numbers up to 9223372036854775807. (until version 3.8.0) | -json.exception.out_of_range.408 | excessive array size: 8658170730974374167 | The size (following `#`) of an UBJSON array or object exceeds the maximal capacity. | -json.exception.out_of_range.409 | BSON key cannot contain code point U+0000 (at byte 2) | Key identifiers to be serialized to BSON cannot contain code point U+0000, since the key is stored as zero-terminated c-string | - -@liveexample{The following code shows how an `out_of_range` exception can be -caught.,out_of_range} - -@sa - @ref exception for the base class of the library exceptions -@sa - @ref parse_error for exceptions indicating a parse error -@sa - @ref invalid_iterator for exceptions indicating errors with iterators -@sa - @ref type_error for exceptions indicating executing a member function with - a wrong type -@sa - @ref other_error for exceptions indicating other library errors - -@since version 3.0.0 -*/ -class out_of_range : public exception -{ - public: - static out_of_range create(int id_, const std::string& what_arg) - { - std::string w = exception::name("out_of_range", id_) + what_arg; - return out_of_range(id_, w.c_str()); - } - - private: - JSON_HEDLEY_NON_NULL(3) - out_of_range(int id_, const char* what_arg) : exception(id_, what_arg) {} -}; - -/*! -@brief exception indicating other library errors - -This exception is thrown in case of errors that cannot be classified with the -other exception types. - -Exceptions have ids 5xx. - -name / id | example message | description ------------------------------- | --------------- | ------------------------- -json.exception.other_error.501 | unsuccessful: {"op":"test","path":"/baz", "value":"bar"} | A JSON Patch operation 'test' failed. The unsuccessful operation is also printed. - -@sa - @ref exception for the base class of the library exceptions -@sa - @ref parse_error for exceptions indicating a parse error -@sa - @ref invalid_iterator for exceptions indicating errors with iterators -@sa - @ref type_error for exceptions indicating executing a member function with - a wrong type -@sa - @ref out_of_range for exceptions indicating access out of the defined range - -@liveexample{The following code shows how an `other_error` exception can be -caught.,other_error} - -@since version 3.0.0 -*/ -class other_error : public exception -{ - public: - static other_error create(int id_, const std::string& what_arg) - { - std::string w = exception::name("other_error", id_) + what_arg; - return other_error(id_, w.c_str()); - } - - private: - JSON_HEDLEY_NON_NULL(3) - other_error(int id_, const char* what_arg) : exception(id_, what_arg) {} -}; -} // namespace detail -} // namespace nlohmann - -// #include - -// #include - - -#include // size_t -#include // conditional, enable_if, false_type, integral_constant, is_constructible, is_integral, is_same, remove_cv, remove_reference, true_type - -namespace nlohmann -{ -namespace detail -{ -// alias templates to reduce boilerplate -template -using enable_if_t = typename std::enable_if::type; - -template -using uncvref_t = typename std::remove_cv::type>::type; - -// implementation of C++14 index_sequence and affiliates -// source: https://stackoverflow.com/a/32223343 -template -struct index_sequence -{ - using type = index_sequence; - using value_type = std::size_t; - static constexpr std::size_t size() noexcept - { - return sizeof...(Ints); - } -}; - -template -struct merge_and_renumber; - -template -struct merge_and_renumber, index_sequence> - : index_sequence < I1..., (sizeof...(I1) + I2)... > {}; - -template -struct make_index_sequence - : merge_and_renumber < typename make_index_sequence < N / 2 >::type, - typename make_index_sequence < N - N / 2 >::type > {}; - -template<> struct make_index_sequence<0> : index_sequence<> {}; -template<> struct make_index_sequence<1> : index_sequence<0> {}; - -template -using index_sequence_for = make_index_sequence; - -// dispatch utility (taken from ranges-v3) -template struct priority_tag : priority_tag < N - 1 > {}; -template<> struct priority_tag<0> {}; - -// taken from ranges-v3 -template -struct static_const -{ - static constexpr T value{}; -}; - -template -constexpr T static_const::value; -} // namespace detail -} // namespace nlohmann - -// #include - - -#include // numeric_limits -#include // false_type, is_constructible, is_integral, is_same, true_type -#include // declval - -// #include - - -#include // random_access_iterator_tag - -// #include - - -namespace nlohmann -{ -namespace detail -{ -template struct make_void -{ - using type = void; -}; -template using void_t = typename make_void::type; -} // namespace detail -} // namespace nlohmann - -// #include - - -namespace nlohmann -{ -namespace detail -{ -template -struct iterator_types {}; - -template -struct iterator_types < - It, - void_t> -{ - using difference_type = typename It::difference_type; - using value_type = typename It::value_type; - using pointer = typename It::pointer; - using reference = typename It::reference; - using iterator_category = typename It::iterator_category; -}; - -// This is required as some compilers implement std::iterator_traits in a way that -// doesn't work with SFINAE. See https://github.com/nlohmann/json/issues/1341. -template -struct iterator_traits -{ -}; - -template -struct iterator_traits < T, enable_if_t < !std::is_pointer::value >> - : iterator_types -{ -}; - -template -struct iterator_traits::value>> -{ - using iterator_category = std::random_access_iterator_tag; - using value_type = T; - using difference_type = ptrdiff_t; - using pointer = T*; - using reference = T&; -}; -} // namespace detail -} // namespace nlohmann - -// #include - -// #include - -// #include - - -#include - -// #include - - -// https://en.cppreference.com/w/cpp/experimental/is_detected -namespace nlohmann -{ -namespace detail -{ -struct nonesuch -{ - nonesuch() = delete; - ~nonesuch() = delete; - nonesuch(nonesuch const&) = delete; - nonesuch(nonesuch const&&) = delete; - void operator=(nonesuch const&) = delete; - void operator=(nonesuch&&) = delete; -}; - -template class Op, - class... Args> -struct detector -{ - using value_t = std::false_type; - using type = Default; -}; - -template class Op, class... Args> -struct detector>, Op, Args...> -{ - using value_t = std::true_type; - using type = Op; -}; - -template class Op, class... Args> -using is_detected = typename detector::value_t; - -template class Op, class... Args> -using detected_t = typename detector::type; - -template class Op, class... Args> -using detected_or = detector; - -template class Op, class... Args> -using detected_or_t = typename detected_or::type; - -template class Op, class... Args> -using is_detected_exact = std::is_same>; - -template class Op, class... Args> -using is_detected_convertible = - std::is_convertible, To>; -} // namespace detail -} // namespace nlohmann - -// #include -#ifndef INCLUDE_NLOHMANN_JSON_FWD_HPP_ -#define INCLUDE_NLOHMANN_JSON_FWD_HPP_ - -#include // int64_t, uint64_t -#include // map -#include // allocator -#include // string -#include // vector - -/*! -@brief namespace for Niels Lohmann -@see https://github.com/nlohmann -@since version 1.0.0 -*/ -namespace nlohmann -{ -/*! -@brief default JSONSerializer template argument - -This serializer ignores the template arguments and uses ADL -([argument-dependent lookup](https://en.cppreference.com/w/cpp/language/adl)) -for serialization. -*/ -template -struct adl_serializer; - -template class ObjectType = - std::map, - template class ArrayType = std::vector, - class StringType = std::string, class BooleanType = bool, - class NumberIntegerType = std::int64_t, - class NumberUnsignedType = std::uint64_t, - class NumberFloatType = double, - template class AllocatorType = std::allocator, - template class JSONSerializer = - adl_serializer, - class BinaryType = std::vector> -class basic_json; - -/*! -@brief JSON Pointer - -A JSON pointer defines a string syntax for identifying a specific value -within a JSON document. It can be used with functions `at` and -`operator[]`. Furthermore, JSON pointers are the base for JSON patches. - -@sa [RFC 6901](https://tools.ietf.org/html/rfc6901) - -@since version 2.0.0 -*/ -template -class json_pointer; - -/*! -@brief default JSON class - -This type is the default specialization of the @ref basic_json class which -uses the standard template types. - -@since version 1.0.0 -*/ -using json = basic_json<>; - -template -struct ordered_map; - -/*! -@brief ordered JSON class - -This type preserves the insertion order of object keys. - -@since version 3.9.0 -*/ -using ordered_json = basic_json; - -} // namespace nlohmann - -#endif // INCLUDE_NLOHMANN_JSON_FWD_HPP_ - - -namespace nlohmann -{ -/*! -@brief detail namespace with internal helper functions - -This namespace collects functions that should not be exposed, -implementations of some @ref basic_json methods, and meta-programming helpers. - -@since version 2.1.0 -*/ -namespace detail -{ -///////////// -// helpers // -///////////// - -// Note to maintainers: -// -// Every trait in this file expects a non CV-qualified type. -// The only exceptions are in the 'aliases for detected' section -// (i.e. those of the form: decltype(T::member_function(std::declval()))) -// -// In this case, T has to be properly CV-qualified to constraint the function arguments -// (e.g. to_json(BasicJsonType&, const T&)) - -template struct is_basic_json : std::false_type {}; - -NLOHMANN_BASIC_JSON_TPL_DECLARATION -struct is_basic_json : std::true_type {}; - -////////////////////// -// json_ref helpers // -////////////////////// - -template -class json_ref; - -template -struct is_json_ref : std::false_type {}; - -template -struct is_json_ref> : std::true_type {}; - -////////////////////////// -// aliases for detected // -////////////////////////// - -template -using mapped_type_t = typename T::mapped_type; - -template -using key_type_t = typename T::key_type; - -template -using value_type_t = typename T::value_type; - -template -using difference_type_t = typename T::difference_type; - -template -using pointer_t = typename T::pointer; - -template -using reference_t = typename T::reference; - -template -using iterator_category_t = typename T::iterator_category; - -template -using iterator_t = typename T::iterator; - -template -using to_json_function = decltype(T::to_json(std::declval()...)); - -template -using from_json_function = decltype(T::from_json(std::declval()...)); - -template -using get_template_function = decltype(std::declval().template get()); - -// trait checking if JSONSerializer::from_json(json const&, udt&) exists -template -struct has_from_json : std::false_type {}; - -// trait checking if j.get is valid -// use this trait instead of std::is_constructible or std::is_convertible, -// both rely on, or make use of implicit conversions, and thus fail when T -// has several constructors/operator= (see https://github.com/nlohmann/json/issues/958) -template -struct is_getable -{ - static constexpr bool value = is_detected::value; -}; - -template -struct has_from_json < BasicJsonType, T, - enable_if_t < !is_basic_json::value >> -{ - using serializer = typename BasicJsonType::template json_serializer; - - static constexpr bool value = - is_detected_exact::value; -}; - -// This trait checks if JSONSerializer::from_json(json const&) exists -// this overload is used for non-default-constructible user-defined-types -template -struct has_non_default_from_json : std::false_type {}; - -template -struct has_non_default_from_json < BasicJsonType, T, enable_if_t < !is_basic_json::value >> -{ - using serializer = typename BasicJsonType::template json_serializer; - - static constexpr bool value = - is_detected_exact::value; -}; - -// This trait checks if BasicJsonType::json_serializer::to_json exists -// Do not evaluate the trait when T is a basic_json type, to avoid template instantiation infinite recursion. -template -struct has_to_json : std::false_type {}; - -template -struct has_to_json < BasicJsonType, T, enable_if_t < !is_basic_json::value >> -{ - using serializer = typename BasicJsonType::template json_serializer; - - static constexpr bool value = - is_detected_exact::value; -}; - - -/////////////////// -// is_ functions // -/////////////////// - -template -struct is_iterator_traits : std::false_type {}; - -template -struct is_iterator_traits> -{ - private: - using traits = iterator_traits; - - public: - static constexpr auto value = - is_detected::value && - is_detected::value && - is_detected::value && - is_detected::value && - is_detected::value; -}; - -// source: https://stackoverflow.com/a/37193089/4116453 - -template -struct is_complete_type : std::false_type {}; - -template -struct is_complete_type : std::true_type {}; - -template -struct is_compatible_object_type_impl : std::false_type {}; - -template -struct is_compatible_object_type_impl < - BasicJsonType, CompatibleObjectType, - enable_if_t < is_detected::value&& - is_detected::value >> -{ - - using object_t = typename BasicJsonType::object_t; - - // macOS's is_constructible does not play well with nonesuch... - static constexpr bool value = - std::is_constructible::value && - std::is_constructible::value; -}; - -template -struct is_compatible_object_type - : is_compatible_object_type_impl {}; - -template -struct is_constructible_object_type_impl : std::false_type {}; - -template -struct is_constructible_object_type_impl < - BasicJsonType, ConstructibleObjectType, - enable_if_t < is_detected::value&& - is_detected::value >> -{ - using object_t = typename BasicJsonType::object_t; - - static constexpr bool value = - (std::is_default_constructible::value && - (std::is_move_assignable::value || - std::is_copy_assignable::value) && - (std::is_constructible::value && - std::is_same < - typename object_t::mapped_type, - typename ConstructibleObjectType::mapped_type >::value)) || - (has_from_json::value || - has_non_default_from_json < - BasicJsonType, - typename ConstructibleObjectType::mapped_type >::value); -}; - -template -struct is_constructible_object_type - : is_constructible_object_type_impl {}; - -template -struct is_compatible_string_type_impl : std::false_type {}; - -template -struct is_compatible_string_type_impl < - BasicJsonType, CompatibleStringType, - enable_if_t::value >> -{ - static constexpr auto value = - std::is_constructible::value; -}; - -template -struct is_compatible_string_type - : is_compatible_string_type_impl {}; - -template -struct is_constructible_string_type_impl : std::false_type {}; - -template -struct is_constructible_string_type_impl < - BasicJsonType, ConstructibleStringType, - enable_if_t::value >> -{ - static constexpr auto value = - std::is_constructible::value; -}; - -template -struct is_constructible_string_type - : is_constructible_string_type_impl {}; - -template -struct is_compatible_array_type_impl : std::false_type {}; - -template -struct is_compatible_array_type_impl < - BasicJsonType, CompatibleArrayType, - enable_if_t < is_detected::value&& - is_detected::value&& -// This is needed because json_reverse_iterator has a ::iterator type... -// Therefore it is detected as a CompatibleArrayType. -// The real fix would be to have an Iterable concept. - !is_iterator_traits < - iterator_traits>::value >> -{ - static constexpr bool value = - std::is_constructible::value; -}; - -template -struct is_compatible_array_type - : is_compatible_array_type_impl {}; - -template -struct is_constructible_array_type_impl : std::false_type {}; - -template -struct is_constructible_array_type_impl < - BasicJsonType, ConstructibleArrayType, - enable_if_t::value >> - : std::true_type {}; - -template -struct is_constructible_array_type_impl < - BasicJsonType, ConstructibleArrayType, - enable_if_t < !std::is_same::value&& - std::is_default_constructible::value&& -(std::is_move_assignable::value || - std::is_copy_assignable::value)&& -is_detected::value&& -is_detected::value&& -is_complete_type < -detected_t>::value >> -{ - static constexpr bool value = - // This is needed because json_reverse_iterator has a ::iterator type, - // furthermore, std::back_insert_iterator (and other iterators) have a - // base class `iterator`... Therefore it is detected as a - // ConstructibleArrayType. The real fix would be to have an Iterable - // concept. - !is_iterator_traits>::value && - - (std::is_same::value || - has_from_json::value || - has_non_default_from_json < - BasicJsonType, typename ConstructibleArrayType::value_type >::value); -}; - -template -struct is_constructible_array_type - : is_constructible_array_type_impl {}; - -template -struct is_compatible_integer_type_impl : std::false_type {}; - -template -struct is_compatible_integer_type_impl < - RealIntegerType, CompatibleNumberIntegerType, - enable_if_t < std::is_integral::value&& - std::is_integral::value&& - !std::is_same::value >> -{ - // is there an assert somewhere on overflows? - using RealLimits = std::numeric_limits; - using CompatibleLimits = std::numeric_limits; - - static constexpr auto value = - std::is_constructible::value && - CompatibleLimits::is_integer && - RealLimits::is_signed == CompatibleLimits::is_signed; -}; - -template -struct is_compatible_integer_type - : is_compatible_integer_type_impl {}; - -template -struct is_compatible_type_impl: std::false_type {}; - -template -struct is_compatible_type_impl < - BasicJsonType, CompatibleType, - enable_if_t::value >> -{ - static constexpr bool value = - has_to_json::value; -}; - -template -struct is_compatible_type - : is_compatible_type_impl {}; - -// https://en.cppreference.com/w/cpp/types/conjunction -template struct conjunction : std::true_type { }; -template struct conjunction : B1 { }; -template -struct conjunction -: std::conditional, B1>::type {}; - -template -struct is_constructible_tuple : std::false_type {}; - -template -struct is_constructible_tuple> : conjunction...> {}; -} // namespace detail -} // namespace nlohmann - -// #include - - -#include // array -#include // size_t -#include // uint8_t -#include // string - -namespace nlohmann -{ -namespace detail -{ -/////////////////////////// -// JSON type enumeration // -/////////////////////////// - -/*! -@brief the JSON type enumeration - -This enumeration collects the different JSON types. It is internally used to -distinguish the stored values, and the functions @ref basic_json::is_null(), -@ref basic_json::is_object(), @ref basic_json::is_array(), -@ref basic_json::is_string(), @ref basic_json::is_boolean(), -@ref basic_json::is_number() (with @ref basic_json::is_number_integer(), -@ref basic_json::is_number_unsigned(), and @ref basic_json::is_number_float()), -@ref basic_json::is_discarded(), @ref basic_json::is_primitive(), and -@ref basic_json::is_structured() rely on it. - -@note There are three enumeration entries (number_integer, number_unsigned, and -number_float), because the library distinguishes these three types for numbers: -@ref basic_json::number_unsigned_t is used for unsigned integers, -@ref basic_json::number_integer_t is used for signed integers, and -@ref basic_json::number_float_t is used for floating-point numbers or to -approximate integers which do not fit in the limits of their respective type. - -@sa @ref basic_json::basic_json(const value_t value_type) -- create a JSON -value with the default value for a given type - -@since version 1.0.0 -*/ -enum class value_t : std::uint8_t -{ - null, ///< null value - object, ///< object (unordered set of name/value pairs) - array, ///< array (ordered collection of values) - string, ///< string value - boolean, ///< boolean value - number_integer, ///< number value (signed integer) - number_unsigned, ///< number value (unsigned integer) - number_float, ///< number value (floating-point) - binary, ///< binary array (ordered collection of bytes) - discarded ///< discarded by the parser callback function -}; - -/*! -@brief comparison operator for JSON types - -Returns an ordering that is similar to Python: -- order: null < boolean < number < object < array < string < binary -- furthermore, each type is not smaller than itself -- discarded values are not comparable -- binary is represented as a b"" string in python and directly comparable to a - string; however, making a binary array directly comparable with a string would - be surprising behavior in a JSON file. - -@since version 1.0.0 -*/ -inline bool operator<(const value_t lhs, const value_t rhs) noexcept -{ - static constexpr std::array order = {{ - 0 /* null */, 3 /* object */, 4 /* array */, 5 /* string */, - 1 /* boolean */, 2 /* integer */, 2 /* unsigned */, 2 /* float */, - 6 /* binary */ - } - }; - - const auto l_index = static_cast(lhs); - const auto r_index = static_cast(rhs); - return l_index < order.size() && r_index < order.size() && order[l_index] < order[r_index]; -} -} // namespace detail -} // namespace nlohmann - - -namespace nlohmann -{ -namespace detail -{ -template -void from_json(const BasicJsonType& j, typename std::nullptr_t& n) -{ - if (JSON_HEDLEY_UNLIKELY(!j.is_null())) - { - JSON_THROW(type_error::create(302, "type must be null, but is " + std::string(j.type_name()))); - } - n = nullptr; -} - -// overloads for basic_json template parameters -template < typename BasicJsonType, typename ArithmeticType, - enable_if_t < std::is_arithmetic::value&& - !std::is_same::value, - int > = 0 > -void get_arithmetic_value(const BasicJsonType& j, ArithmeticType& val) -{ - switch (static_cast(j)) - { - case value_t::number_unsigned: - { - val = static_cast(*j.template get_ptr()); - break; - } - case value_t::number_integer: - { - val = static_cast(*j.template get_ptr()); - break; - } - case value_t::number_float: - { - val = static_cast(*j.template get_ptr()); - break; - } - - default: - JSON_THROW(type_error::create(302, "type must be number, but is " + std::string(j.type_name()))); - } -} - -template -void from_json(const BasicJsonType& j, typename BasicJsonType::boolean_t& b) -{ - if (JSON_HEDLEY_UNLIKELY(!j.is_boolean())) - { - JSON_THROW(type_error::create(302, "type must be boolean, but is " + std::string(j.type_name()))); - } - b = *j.template get_ptr(); -} - -template -void from_json(const BasicJsonType& j, typename BasicJsonType::string_t& s) -{ - if (JSON_HEDLEY_UNLIKELY(!j.is_string())) - { - JSON_THROW(type_error::create(302, "type must be string, but is " + std::string(j.type_name()))); - } - s = *j.template get_ptr(); -} - -template < - typename BasicJsonType, typename ConstructibleStringType, - enable_if_t < - is_constructible_string_type::value&& - !std::is_same::value, - int > = 0 > -void from_json(const BasicJsonType& j, ConstructibleStringType& s) -{ - if (JSON_HEDLEY_UNLIKELY(!j.is_string())) - { - JSON_THROW(type_error::create(302, "type must be string, but is " + std::string(j.type_name()))); - } - - s = *j.template get_ptr(); -} - -template -void from_json(const BasicJsonType& j, typename BasicJsonType::number_float_t& val) -{ - get_arithmetic_value(j, val); -} - -template -void from_json(const BasicJsonType& j, typename BasicJsonType::number_unsigned_t& val) -{ - get_arithmetic_value(j, val); -} - -template -void from_json(const BasicJsonType& j, typename BasicJsonType::number_integer_t& val) -{ - get_arithmetic_value(j, val); -} - -template::value, int> = 0> -void from_json(const BasicJsonType& j, EnumType& e) -{ - typename std::underlying_type::type val; - get_arithmetic_value(j, val); - e = static_cast(val); -} - -// forward_list doesn't have an insert method -template::value, int> = 0> -void from_json(const BasicJsonType& j, std::forward_list& l) -{ - if (JSON_HEDLEY_UNLIKELY(!j.is_array())) - { - JSON_THROW(type_error::create(302, "type must be array, but is " + std::string(j.type_name()))); - } - l.clear(); - std::transform(j.rbegin(), j.rend(), - std::front_inserter(l), [](const BasicJsonType & i) - { - return i.template get(); - }); -} - -// valarray doesn't have an insert method -template::value, int> = 0> -void from_json(const BasicJsonType& j, std::valarray& l) -{ - if (JSON_HEDLEY_UNLIKELY(!j.is_array())) - { - JSON_THROW(type_error::create(302, "type must be array, but is " + std::string(j.type_name()))); - } - l.resize(j.size()); - std::transform(j.begin(), j.end(), std::begin(l), - [](const BasicJsonType & elem) - { - return elem.template get(); - }); -} - -template -auto from_json(const BasicJsonType& j, T (&arr)[N]) --> decltype(j.template get(), void()) -{ - for (std::size_t i = 0; i < N; ++i) - { - arr[i] = j.at(i).template get(); - } -} - -template -void from_json_array_impl(const BasicJsonType& j, typename BasicJsonType::array_t& arr, priority_tag<3> /*unused*/) -{ - arr = *j.template get_ptr(); -} - -template -auto from_json_array_impl(const BasicJsonType& j, std::array& arr, - priority_tag<2> /*unused*/) --> decltype(j.template get(), void()) -{ - for (std::size_t i = 0; i < N; ++i) - { - arr[i] = j.at(i).template get(); - } -} - -template -auto from_json_array_impl(const BasicJsonType& j, ConstructibleArrayType& arr, priority_tag<1> /*unused*/) --> decltype( - arr.reserve(std::declval()), - j.template get(), - void()) -{ - using std::end; - - ConstructibleArrayType ret; - ret.reserve(j.size()); - std::transform(j.begin(), j.end(), - std::inserter(ret, end(ret)), [](const BasicJsonType & i) - { - // get() returns *this, this won't call a from_json - // method when value_type is BasicJsonType - return i.template get(); - }); - arr = std::move(ret); -} - -template -void from_json_array_impl(const BasicJsonType& j, ConstructibleArrayType& arr, - priority_tag<0> /*unused*/) -{ - using std::end; - - ConstructibleArrayType ret; - std::transform( - j.begin(), j.end(), std::inserter(ret, end(ret)), - [](const BasicJsonType & i) - { - // get() returns *this, this won't call a from_json - // method when value_type is BasicJsonType - return i.template get(); - }); - arr = std::move(ret); -} - -template < typename BasicJsonType, typename ConstructibleArrayType, - enable_if_t < - is_constructible_array_type::value&& - !is_constructible_object_type::value&& - !is_constructible_string_type::value&& - !std::is_same::value&& - !is_basic_json::value, - int > = 0 > -auto from_json(const BasicJsonType& j, ConstructibleArrayType& arr) --> decltype(from_json_array_impl(j, arr, priority_tag<3> {}), -j.template get(), -void()) -{ - if (JSON_HEDLEY_UNLIKELY(!j.is_array())) - { - JSON_THROW(type_error::create(302, "type must be array, but is " + - std::string(j.type_name()))); - } - - from_json_array_impl(j, arr, priority_tag<3> {}); -} - -template -void from_json(const BasicJsonType& j, typename BasicJsonType::binary_t& bin) -{ - if (JSON_HEDLEY_UNLIKELY(!j.is_binary())) - { - JSON_THROW(type_error::create(302, "type must be binary, but is " + std::string(j.type_name()))); - } - - bin = *j.template get_ptr(); -} - -template::value, int> = 0> -void from_json(const BasicJsonType& j, ConstructibleObjectType& obj) -{ - if (JSON_HEDLEY_UNLIKELY(!j.is_object())) - { - JSON_THROW(type_error::create(302, "type must be object, but is " + std::string(j.type_name()))); - } - - ConstructibleObjectType ret; - auto inner_object = j.template get_ptr(); - using value_type = typename ConstructibleObjectType::value_type; - std::transform( - inner_object->begin(), inner_object->end(), - std::inserter(ret, ret.begin()), - [](typename BasicJsonType::object_t::value_type const & p) - { - return value_type(p.first, p.second.template get()); - }); - obj = std::move(ret); -} - -// overload for arithmetic types, not chosen for basic_json template arguments -// (BooleanType, etc..); note: Is it really necessary to provide explicit -// overloads for boolean_t etc. in case of a custom BooleanType which is not -// an arithmetic type? -template < typename BasicJsonType, typename ArithmeticType, - enable_if_t < - std::is_arithmetic::value&& - !std::is_same::value&& - !std::is_same::value&& - !std::is_same::value&& - !std::is_same::value, - int > = 0 > -void from_json(const BasicJsonType& j, ArithmeticType& val) -{ - switch (static_cast(j)) - { - case value_t::number_unsigned: - { - val = static_cast(*j.template get_ptr()); - break; - } - case value_t::number_integer: - { - val = static_cast(*j.template get_ptr()); - break; - } - case value_t::number_float: - { - val = static_cast(*j.template get_ptr()); - break; - } - case value_t::boolean: - { - val = static_cast(*j.template get_ptr()); - break; - } - - default: - JSON_THROW(type_error::create(302, "type must be number, but is " + std::string(j.type_name()))); - } -} - -template -void from_json(const BasicJsonType& j, std::pair& p) -{ - p = {j.at(0).template get(), j.at(1).template get()}; -} - -template -void from_json_tuple_impl(const BasicJsonType& j, Tuple& t, index_sequence /*unused*/) -{ - t = std::make_tuple(j.at(Idx).template get::type>()...); -} - -template -void from_json(const BasicJsonType& j, std::tuple& t) -{ - from_json_tuple_impl(j, t, index_sequence_for {}); -} - -template < typename BasicJsonType, typename Key, typename Value, typename Compare, typename Allocator, - typename = enable_if_t < !std::is_constructible < - typename BasicJsonType::string_t, Key >::value >> -void from_json(const BasicJsonType& j, std::map& m) -{ - if (JSON_HEDLEY_UNLIKELY(!j.is_array())) - { - JSON_THROW(type_error::create(302, "type must be array, but is " + std::string(j.type_name()))); - } - m.clear(); - for (const auto& p : j) - { - if (JSON_HEDLEY_UNLIKELY(!p.is_array())) - { - JSON_THROW(type_error::create(302, "type must be array, but is " + std::string(p.type_name()))); - } - m.emplace(p.at(0).template get(), p.at(1).template get()); - } -} - -template < typename BasicJsonType, typename Key, typename Value, typename Hash, typename KeyEqual, typename Allocator, - typename = enable_if_t < !std::is_constructible < - typename BasicJsonType::string_t, Key >::value >> -void from_json(const BasicJsonType& j, std::unordered_map& m) -{ - if (JSON_HEDLEY_UNLIKELY(!j.is_array())) - { - JSON_THROW(type_error::create(302, "type must be array, but is " + std::string(j.type_name()))); - } - m.clear(); - for (const auto& p : j) - { - if (JSON_HEDLEY_UNLIKELY(!p.is_array())) - { - JSON_THROW(type_error::create(302, "type must be array, but is " + std::string(p.type_name()))); - } - m.emplace(p.at(0).template get(), p.at(1).template get()); - } -} - -struct from_json_fn -{ - template - auto operator()(const BasicJsonType& j, T& val) const - noexcept(noexcept(from_json(j, val))) - -> decltype(from_json(j, val), void()) - { - return from_json(j, val); - } -}; -} // namespace detail - -/// namespace to hold default `from_json` function -/// to see why this is required: -/// http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/n4381.html -namespace -{ -constexpr const auto& from_json = detail::static_const::value; -} // namespace -} // namespace nlohmann - -// #include - - -#include // copy -#include // begin, end -#include // string -#include // tuple, get -#include // is_same, is_constructible, is_floating_point, is_enum, underlying_type -#include // move, forward, declval, pair -#include // valarray -#include // vector - -// #include - - -#include // size_t -#include // input_iterator_tag -#include // string, to_string -#include // tuple_size, get, tuple_element - -// #include - -// #include - - -namespace nlohmann -{ -namespace detail -{ -template -void int_to_string( string_type& target, std::size_t value ) -{ - // For ADL - using std::to_string; - target = to_string(value); -} -template class iteration_proxy_value -{ - public: - using difference_type = std::ptrdiff_t; - using value_type = iteration_proxy_value; - using pointer = value_type * ; - using reference = value_type & ; - using iterator_category = std::input_iterator_tag; - using string_type = typename std::remove_cv< typename std::remove_reference().key() ) >::type >::type; - - private: - /// the iterator - IteratorType anchor; - /// an index for arrays (used to create key names) - std::size_t array_index = 0; - /// last stringified array index - mutable std::size_t array_index_last = 0; - /// a string representation of the array index - mutable string_type array_index_str = "0"; - /// an empty string (to return a reference for primitive values) - const string_type empty_str = ""; - - public: - explicit iteration_proxy_value(IteratorType it) noexcept : anchor(it) {} - - /// dereference operator (needed for range-based for) - iteration_proxy_value& operator*() - { - return *this; - } - - /// increment operator (needed for range-based for) - iteration_proxy_value& operator++() - { - ++anchor; - ++array_index; - - return *this; - } - - /// equality operator (needed for InputIterator) - bool operator==(const iteration_proxy_value& o) const - { - return anchor == o.anchor; - } - - /// inequality operator (needed for range-based for) - bool operator!=(const iteration_proxy_value& o) const - { - return anchor != o.anchor; - } - - /// return key of the iterator - const string_type& key() const - { - JSON_ASSERT(anchor.m_object != nullptr); - - switch (anchor.m_object->type()) - { - // use integer array index as key - case value_t::array: - { - if (array_index != array_index_last) - { - int_to_string( array_index_str, array_index ); - array_index_last = array_index; - } - return array_index_str; - } - - // use key from the object - case value_t::object: - return anchor.key(); - - // use an empty key for all primitive types - default: - return empty_str; - } - } - - /// return value of the iterator - typename IteratorType::reference value() const - { - return anchor.value(); - } -}; - -/// proxy class for the items() function -template class iteration_proxy -{ - private: - /// the container to iterate - typename IteratorType::reference container; - - public: - /// construct iteration proxy from a container - explicit iteration_proxy(typename IteratorType::reference cont) noexcept - : container(cont) {} - - /// return iterator begin (needed for range-based for) - iteration_proxy_value begin() noexcept - { - return iteration_proxy_value(container.begin()); - } - - /// return iterator end (needed for range-based for) - iteration_proxy_value end() noexcept - { - return iteration_proxy_value(container.end()); - } -}; -// Structured Bindings Support -// For further reference see https://blog.tartanllama.xyz/structured-bindings/ -// And see https://github.com/nlohmann/json/pull/1391 -template = 0> -auto get(const nlohmann::detail::iteration_proxy_value& i) -> decltype(i.key()) -{ - return i.key(); -} -// Structured Bindings Support -// For further reference see https://blog.tartanllama.xyz/structured-bindings/ -// And see https://github.com/nlohmann/json/pull/1391 -template = 0> -auto get(const nlohmann::detail::iteration_proxy_value& i) -> decltype(i.value()) -{ - return i.value(); -} -} // namespace detail -} // namespace nlohmann - -// The Addition to the STD Namespace is required to add -// Structured Bindings Support to the iteration_proxy_value class -// For further reference see https://blog.tartanllama.xyz/structured-bindings/ -// And see https://github.com/nlohmann/json/pull/1391 -namespace std -{ -#if defined(__clang__) - // Fix: https://github.com/nlohmann/json/issues/1401 - #pragma clang diagnostic push - #pragma clang diagnostic ignored "-Wmismatched-tags" -#endif -template -class tuple_size<::nlohmann::detail::iteration_proxy_value> - : public std::integral_constant {}; - -template -class tuple_element> -{ - public: - using type = decltype( - get(std::declval < - ::nlohmann::detail::iteration_proxy_value> ())); -}; -#if defined(__clang__) - #pragma clang diagnostic pop -#endif -} // namespace std - -// #include - -// #include - -// #include - - -namespace nlohmann -{ -namespace detail -{ -////////////////// -// constructors // -////////////////// - -template struct external_constructor; - -template<> -struct external_constructor -{ - template - static void construct(BasicJsonType& j, typename BasicJsonType::boolean_t b) noexcept - { - j.m_type = value_t::boolean; - j.m_value = b; - j.assert_invariant(); - } -}; - -template<> -struct external_constructor -{ - template - static void construct(BasicJsonType& j, const typename BasicJsonType::string_t& s) - { - j.m_type = value_t::string; - j.m_value = s; - j.assert_invariant(); - } - - template - static void construct(BasicJsonType& j, typename BasicJsonType::string_t&& s) - { - j.m_type = value_t::string; - j.m_value = std::move(s); - j.assert_invariant(); - } - - template < typename BasicJsonType, typename CompatibleStringType, - enable_if_t < !std::is_same::value, - int > = 0 > - static void construct(BasicJsonType& j, const CompatibleStringType& str) - { - j.m_type = value_t::string; - j.m_value.string = j.template create(str); - j.assert_invariant(); - } -}; - -template<> -struct external_constructor -{ - template - static void construct(BasicJsonType& j, const typename BasicJsonType::binary_t& b) - { - j.m_type = value_t::binary; - typename BasicJsonType::binary_t value{b}; - j.m_value = value; - j.assert_invariant(); - } - - template - static void construct(BasicJsonType& j, typename BasicJsonType::binary_t&& b) - { - j.m_type = value_t::binary; - typename BasicJsonType::binary_t value{std::move(b)}; - j.m_value = value; - j.assert_invariant(); - } -}; - -template<> -struct external_constructor -{ - template - static void construct(BasicJsonType& j, typename BasicJsonType::number_float_t val) noexcept - { - j.m_type = value_t::number_float; - j.m_value = val; - j.assert_invariant(); - } -}; - -template<> -struct external_constructor -{ - template - static void construct(BasicJsonType& j, typename BasicJsonType::number_unsigned_t val) noexcept - { - j.m_type = value_t::number_unsigned; - j.m_value = val; - j.assert_invariant(); - } -}; - -template<> -struct external_constructor -{ - template - static void construct(BasicJsonType& j, typename BasicJsonType::number_integer_t val) noexcept - { - j.m_type = value_t::number_integer; - j.m_value = val; - j.assert_invariant(); - } -}; - -template<> -struct external_constructor -{ - template - static void construct(BasicJsonType& j, const typename BasicJsonType::array_t& arr) - { - j.m_type = value_t::array; - j.m_value = arr; - j.assert_invariant(); - } - - template - static void construct(BasicJsonType& j, typename BasicJsonType::array_t&& arr) - { - j.m_type = value_t::array; - j.m_value = std::move(arr); - j.assert_invariant(); - } - - template < typename BasicJsonType, typename CompatibleArrayType, - enable_if_t < !std::is_same::value, - int > = 0 > - static void construct(BasicJsonType& j, const CompatibleArrayType& arr) - { - using std::begin; - using std::end; - j.m_type = value_t::array; - j.m_value.array = j.template create(begin(arr), end(arr)); - j.assert_invariant(); - } - - template - static void construct(BasicJsonType& j, const std::vector& arr) - { - j.m_type = value_t::array; - j.m_value = value_t::array; - j.m_value.array->reserve(arr.size()); - for (const bool x : arr) - { - j.m_value.array->push_back(x); - } - j.assert_invariant(); - } - - template::value, int> = 0> - static void construct(BasicJsonType& j, const std::valarray& arr) - { - j.m_type = value_t::array; - j.m_value = value_t::array; - j.m_value.array->resize(arr.size()); - if (arr.size() > 0) - { - std::copy(std::begin(arr), std::end(arr), j.m_value.array->begin()); - } - j.assert_invariant(); - } -}; - -template<> -struct external_constructor -{ - template - static void construct(BasicJsonType& j, const typename BasicJsonType::object_t& obj) - { - j.m_type = value_t::object; - j.m_value = obj; - j.assert_invariant(); - } - - template - static void construct(BasicJsonType& j, typename BasicJsonType::object_t&& obj) - { - j.m_type = value_t::object; - j.m_value = std::move(obj); - j.assert_invariant(); - } - - template < typename BasicJsonType, typename CompatibleObjectType, - enable_if_t < !std::is_same::value, int > = 0 > - static void construct(BasicJsonType& j, const CompatibleObjectType& obj) - { - using std::begin; - using std::end; - - j.m_type = value_t::object; - j.m_value.object = j.template create(begin(obj), end(obj)); - j.assert_invariant(); - } -}; - -///////////// -// to_json // -///////////// - -template::value, int> = 0> -void to_json(BasicJsonType& j, T b) noexcept -{ - external_constructor::construct(j, b); -} - -template::value, int> = 0> -void to_json(BasicJsonType& j, const CompatibleString& s) -{ - external_constructor::construct(j, s); -} - -template -void to_json(BasicJsonType& j, typename BasicJsonType::string_t&& s) -{ - external_constructor::construct(j, std::move(s)); -} - -template::value, int> = 0> -void to_json(BasicJsonType& j, FloatType val) noexcept -{ - external_constructor::construct(j, static_cast(val)); -} - -template::value, int> = 0> -void to_json(BasicJsonType& j, CompatibleNumberUnsignedType val) noexcept -{ - external_constructor::construct(j, static_cast(val)); -} - -template::value, int> = 0> -void to_json(BasicJsonType& j, CompatibleNumberIntegerType val) noexcept -{ - external_constructor::construct(j, static_cast(val)); -} - -template::value, int> = 0> -void to_json(BasicJsonType& j, EnumType e) noexcept -{ - using underlying_type = typename std::underlying_type::type; - external_constructor::construct(j, static_cast(e)); -} - -template -void to_json(BasicJsonType& j, const std::vector& e) -{ - external_constructor::construct(j, e); -} - -template < typename BasicJsonType, typename CompatibleArrayType, - enable_if_t < is_compatible_array_type::value&& - !is_compatible_object_type::value&& - !is_compatible_string_type::value&& - !std::is_same::value&& - !is_basic_json::value, - int > = 0 > -void to_json(BasicJsonType& j, const CompatibleArrayType& arr) -{ - external_constructor::construct(j, arr); -} - -template -void to_json(BasicJsonType& j, const typename BasicJsonType::binary_t& bin) -{ - external_constructor::construct(j, bin); -} - -template::value, int> = 0> -void to_json(BasicJsonType& j, const std::valarray& arr) -{ - external_constructor::construct(j, std::move(arr)); -} - -template -void to_json(BasicJsonType& j, typename BasicJsonType::array_t&& arr) -{ - external_constructor::construct(j, std::move(arr)); -} - -template < typename BasicJsonType, typename CompatibleObjectType, - enable_if_t < is_compatible_object_type::value&& !is_basic_json::value, int > = 0 > -void to_json(BasicJsonType& j, const CompatibleObjectType& obj) -{ - external_constructor::construct(j, obj); -} - -template -void to_json(BasicJsonType& j, typename BasicJsonType::object_t&& obj) -{ - external_constructor::construct(j, std::move(obj)); -} - -template < - typename BasicJsonType, typename T, std::size_t N, - enable_if_t < !std::is_constructible::value, - int > = 0 > -void to_json(BasicJsonType& j, const T(&arr)[N]) -{ - external_constructor::construct(j, arr); -} - -template < typename BasicJsonType, typename T1, typename T2, enable_if_t < std::is_constructible::value&& std::is_constructible::value, int > = 0 > -void to_json(BasicJsonType& j, const std::pair& p) -{ - j = { p.first, p.second }; -} - -// for https://github.com/nlohmann/json/pull/1134 -template>::value, int> = 0> -void to_json(BasicJsonType& j, const T& b) -{ - j = { {b.key(), b.value()} }; -} - -template -void to_json_tuple_impl(BasicJsonType& j, const Tuple& t, index_sequence /*unused*/) -{ - j = { std::get(t)... }; -} - -template::value, int > = 0> -void to_json(BasicJsonType& j, const T& t) -{ - to_json_tuple_impl(j, t, make_index_sequence::value> {}); -} - -struct to_json_fn -{ - template - auto operator()(BasicJsonType& j, T&& val) const noexcept(noexcept(to_json(j, std::forward(val)))) - -> decltype(to_json(j, std::forward(val)), void()) - { - return to_json(j, std::forward(val)); - } -}; -} // namespace detail - -/// namespace to hold default `to_json` function -namespace -{ -constexpr const auto& to_json = detail::static_const::value; -} // namespace -} // namespace nlohmann - - -namespace nlohmann -{ - -template -struct adl_serializer -{ - /*! - @brief convert a JSON value to any value type - - This function is usually called by the `get()` function of the - @ref basic_json class (either explicit or via conversion operators). - - @param[in] j JSON value to read from - @param[in,out] val value to write to - */ - template - static auto from_json(BasicJsonType&& j, ValueType& val) noexcept( - noexcept(::nlohmann::from_json(std::forward(j), val))) - -> decltype(::nlohmann::from_json(std::forward(j), val), void()) - { - ::nlohmann::from_json(std::forward(j), val); - } - - /*! - @brief convert any value type to a JSON value - - This function is usually called by the constructors of the @ref basic_json - class. - - @param[in,out] j JSON value to write to - @param[in] val value to read from - */ - template - static auto to_json(BasicJsonType& j, ValueType&& val) noexcept( - noexcept(::nlohmann::to_json(j, std::forward(val)))) - -> decltype(::nlohmann::to_json(j, std::forward(val)), void()) - { - ::nlohmann::to_json(j, std::forward(val)); - } -}; - -} // namespace nlohmann - -// #include - - -#include // uint8_t -#include // tie -#include // move - -namespace nlohmann -{ - -/*! -@brief an internal type for a backed binary type - -This type extends the template parameter @a BinaryType provided to `basic_json` -with a subtype used by BSON and MessagePack. This type exists so that the user -does not have to specify a type themselves with a specific naming scheme in -order to override the binary type. - -@tparam BinaryType container to store bytes (`std::vector` by - default) - -@since version 3.8.0 -*/ -template -class byte_container_with_subtype : public BinaryType -{ - public: - /// the type of the underlying container - using container_type = BinaryType; - - byte_container_with_subtype() noexcept(noexcept(container_type())) - : container_type() - {} - - byte_container_with_subtype(const container_type& b) noexcept(noexcept(container_type(b))) - : container_type(b) - {} - - byte_container_with_subtype(container_type&& b) noexcept(noexcept(container_type(std::move(b)))) - : container_type(std::move(b)) - {} - - byte_container_with_subtype(const container_type& b, std::uint8_t subtype) noexcept(noexcept(container_type(b))) - : container_type(b) - , m_subtype(subtype) - , m_has_subtype(true) - {} - - byte_container_with_subtype(container_type&& b, std::uint8_t subtype) noexcept(noexcept(container_type(std::move(b)))) - : container_type(std::move(b)) - , m_subtype(subtype) - , m_has_subtype(true) - {} - - bool operator==(const byte_container_with_subtype& rhs) const - { - return std::tie(static_cast(*this), m_subtype, m_has_subtype) == - std::tie(static_cast(rhs), rhs.m_subtype, rhs.m_has_subtype); - } - - bool operator!=(const byte_container_with_subtype& rhs) const - { - return !(rhs == *this); - } - - /*! - @brief sets the binary subtype - - Sets the binary subtype of the value, also flags a binary JSON value as - having a subtype, which has implications for serialization. - - @complexity Constant. - - @exceptionsafety No-throw guarantee: this member function never throws - exceptions. - - @sa @ref subtype() -- return the binary subtype - @sa @ref clear_subtype() -- clears the binary subtype - @sa @ref has_subtype() -- returns whether or not the binary value has a - subtype - - @since version 3.8.0 - */ - void set_subtype(std::uint8_t subtype) noexcept - { - m_subtype = subtype; - m_has_subtype = true; - } - - /*! - @brief return the binary subtype - - Returns the numerical subtype of the value if it has a subtype. If it does - not have a subtype, this function will return size_t(-1) as a sentinel - value. - - @return the numerical subtype of the binary value - - @complexity Constant. - - @exceptionsafety No-throw guarantee: this member function never throws - exceptions. - - @sa @ref set_subtype() -- sets the binary subtype - @sa @ref clear_subtype() -- clears the binary subtype - @sa @ref has_subtype() -- returns whether or not the binary value has a - subtype - - @since version 3.8.0 - */ - constexpr std::uint8_t subtype() const noexcept - { - return m_subtype; - } - - /*! - @brief return whether the value has a subtype - - @return whether the value has a subtype - - @complexity Constant. - - @exceptionsafety No-throw guarantee: this member function never throws - exceptions. - - @sa @ref subtype() -- return the binary subtype - @sa @ref set_subtype() -- sets the binary subtype - @sa @ref clear_subtype() -- clears the binary subtype - - @since version 3.8.0 - */ - constexpr bool has_subtype() const noexcept - { - return m_has_subtype; - } - - /*! - @brief clears the binary subtype - - Clears the binary subtype and flags the value as not having a subtype, which - has implications for serialization; for instance MessagePack will prefer the - bin family over the ext family. - - @complexity Constant. - - @exceptionsafety No-throw guarantee: this member function never throws - exceptions. - - @sa @ref subtype() -- return the binary subtype - @sa @ref set_subtype() -- sets the binary subtype - @sa @ref has_subtype() -- returns whether or not the binary value has a - subtype - - @since version 3.8.0 - */ - void clear_subtype() noexcept - { - m_subtype = 0; - m_has_subtype = false; - } - - private: - std::uint8_t m_subtype = 0; - bool m_has_subtype = false; -}; - -} // namespace nlohmann - -// #include - -// #include - -// #include - -// #include - - -#include // size_t, uint8_t -#include // hash - -namespace nlohmann -{ -namespace detail -{ - -// boost::hash_combine -inline std::size_t combine(std::size_t seed, std::size_t h) noexcept -{ - seed ^= h + 0x9e3779b9 + (seed << 6U) + (seed >> 2U); - return seed; -} - -/*! -@brief hash a JSON value - -The hash function tries to rely on std::hash where possible. Furthermore, the -type of the JSON value is taken into account to have different hash values for -null, 0, 0U, and false, etc. - -@tparam BasicJsonType basic_json specialization -@param j JSON value to hash -@return hash value of j -*/ -template -std::size_t hash(const BasicJsonType& j) -{ - using string_t = typename BasicJsonType::string_t; - using number_integer_t = typename BasicJsonType::number_integer_t; - using number_unsigned_t = typename BasicJsonType::number_unsigned_t; - using number_float_t = typename BasicJsonType::number_float_t; - - const auto type = static_cast(j.type()); - switch (j.type()) - { - case BasicJsonType::value_t::null: - case BasicJsonType::value_t::discarded: - { - return combine(type, 0); - } - - case BasicJsonType::value_t::object: - { - auto seed = combine(type, j.size()); - for (const auto& element : j.items()) - { - const auto h = std::hash {}(element.key()); - seed = combine(seed, h); - seed = combine(seed, hash(element.value())); - } - return seed; - } - - case BasicJsonType::value_t::array: - { - auto seed = combine(type, j.size()); - for (const auto& element : j) - { - seed = combine(seed, hash(element)); - } - return seed; - } - - case BasicJsonType::value_t::string: - { - const auto h = std::hash {}(j.template get_ref()); - return combine(type, h); - } - - case BasicJsonType::value_t::boolean: - { - const auto h = std::hash {}(j.template get()); - return combine(type, h); - } - - case BasicJsonType::value_t::number_integer: - { - const auto h = std::hash {}(j.template get()); - return combine(type, h); - } - - case nlohmann::detail::value_t::number_unsigned: - { - const auto h = std::hash {}(j.template get()); - return combine(type, h); - } - - case nlohmann::detail::value_t::number_float: - { - const auto h = std::hash {}(j.template get()); - return combine(type, h); - } - - case nlohmann::detail::value_t::binary: - { - auto seed = combine(type, j.get_binary().size()); - const auto h = std::hash {}(j.get_binary().has_subtype()); - seed = combine(seed, h); - seed = combine(seed, j.get_binary().subtype()); - for (const auto byte : j.get_binary()) - { - seed = combine(seed, std::hash {}(byte)); - } - return seed; - } - - default: // LCOV_EXCL_LINE - JSON_ASSERT(false); // LCOV_EXCL_LINE - } -} - -} // namespace detail -} // namespace nlohmann - -// #include - - -#include // generate_n -#include // array -#include // ldexp -#include // size_t -#include // uint8_t, uint16_t, uint32_t, uint64_t -#include // snprintf -#include // memcpy -#include // back_inserter -#include // numeric_limits -#include // char_traits, string -#include // make_pair, move - -// #include - -// #include - - -#include // array -#include // size_t -#include //FILE * -#include // strlen -#include // istream -#include // begin, end, iterator_traits, random_access_iterator_tag, distance, next -#include // shared_ptr, make_shared, addressof -#include // accumulate -#include // string, char_traits -#include // enable_if, is_base_of, is_pointer, is_integral, remove_pointer -#include // pair, declval - -// #include - -// #include - - -namespace nlohmann -{ -namespace detail -{ -/// the supported input formats -enum class input_format_t { json, cbor, msgpack, ubjson, bson }; - -//////////////////// -// input adapters // -//////////////////// - -/*! -Input adapter for stdio file access. This adapter read only 1 byte and do not use any - buffer. This adapter is a very low level adapter. -*/ -class file_input_adapter -{ - public: - using char_type = char; - - JSON_HEDLEY_NON_NULL(2) - explicit file_input_adapter(std::FILE* f) noexcept - : m_file(f) - {} - - // make class move-only - file_input_adapter(const file_input_adapter&) = delete; - file_input_adapter(file_input_adapter&&) = default; - file_input_adapter& operator=(const file_input_adapter&) = delete; - file_input_adapter& operator=(file_input_adapter&&) = delete; - - std::char_traits::int_type get_character() noexcept - { - return std::fgetc(m_file); - } - - private: - /// the file pointer to read from - std::FILE* m_file; -}; - - -/*! -Input adapter for a (caching) istream. Ignores a UFT Byte Order Mark at -beginning of input. Does not support changing the underlying std::streambuf -in mid-input. Maintains underlying std::istream and std::streambuf to support -subsequent use of standard std::istream operations to process any input -characters following those used in parsing the JSON input. Clears the -std::istream flags; any input errors (e.g., EOF) will be detected by the first -subsequent call for input from the std::istream. -*/ -class input_stream_adapter -{ - public: - using char_type = char; - - ~input_stream_adapter() - { - // clear stream flags; we use underlying streambuf I/O, do not - // maintain ifstream flags, except eof - if (is != nullptr) - { - is->clear(is->rdstate() & std::ios::eofbit); - } - } - - explicit input_stream_adapter(std::istream& i) - : is(&i), sb(i.rdbuf()) - {} - - // delete because of pointer members - input_stream_adapter(const input_stream_adapter&) = delete; - input_stream_adapter& operator=(input_stream_adapter&) = delete; - input_stream_adapter& operator=(input_stream_adapter&& rhs) = delete; - - input_stream_adapter(input_stream_adapter&& rhs) noexcept : is(rhs.is), sb(rhs.sb) - { - rhs.is = nullptr; - rhs.sb = nullptr; - } - - // std::istream/std::streambuf use std::char_traits::to_int_type, to - // ensure that std::char_traits::eof() and the character 0xFF do not - // end up as the same value, eg. 0xFFFFFFFF. - std::char_traits::int_type get_character() - { - auto res = sb->sbumpc(); - // set eof manually, as we don't use the istream interface. - if (JSON_HEDLEY_UNLIKELY(res == EOF)) - { - is->clear(is->rdstate() | std::ios::eofbit); - } - return res; - } - - private: - /// the associated input stream - std::istream* is = nullptr; - std::streambuf* sb = nullptr; -}; - -// General-purpose iterator-based adapter. It might not be as fast as -// theoretically possible for some containers, but it is extremely versatile. -template -class iterator_input_adapter -{ - public: - using char_type = typename std::iterator_traits::value_type; - - iterator_input_adapter(IteratorType first, IteratorType last) - : current(std::move(first)), end(std::move(last)) {} - - typename std::char_traits::int_type get_character() - { - if (JSON_HEDLEY_LIKELY(current != end)) - { - auto result = std::char_traits::to_int_type(*current); - std::advance(current, 1); - return result; - } - else - { - return std::char_traits::eof(); - } - } - - private: - IteratorType current; - IteratorType end; - - template - friend struct wide_string_input_helper; - - bool empty() const - { - return current == end; - } - -}; - - -template -struct wide_string_input_helper; - -template -struct wide_string_input_helper -{ - // UTF-32 - static void fill_buffer(BaseInputAdapter& input, - std::array::int_type, 4>& utf8_bytes, - size_t& utf8_bytes_index, - size_t& utf8_bytes_filled) - { - utf8_bytes_index = 0; - - if (JSON_HEDLEY_UNLIKELY(input.empty())) - { - utf8_bytes[0] = std::char_traits::eof(); - utf8_bytes_filled = 1; - } - else - { - // get the current character - const auto wc = input.get_character(); - - // UTF-32 to UTF-8 encoding - if (wc < 0x80) - { - utf8_bytes[0] = static_cast::int_type>(wc); - utf8_bytes_filled = 1; - } - else if (wc <= 0x7FF) - { - utf8_bytes[0] = static_cast::int_type>(0xC0u | ((static_cast(wc) >> 6u) & 0x1Fu)); - utf8_bytes[1] = static_cast::int_type>(0x80u | (static_cast(wc) & 0x3Fu)); - utf8_bytes_filled = 2; - } - else if (wc <= 0xFFFF) - { - utf8_bytes[0] = static_cast::int_type>(0xE0u | ((static_cast(wc) >> 12u) & 0x0Fu)); - utf8_bytes[1] = static_cast::int_type>(0x80u | ((static_cast(wc) >> 6u) & 0x3Fu)); - utf8_bytes[2] = static_cast::int_type>(0x80u | (static_cast(wc) & 0x3Fu)); - utf8_bytes_filled = 3; - } - else if (wc <= 0x10FFFF) - { - utf8_bytes[0] = static_cast::int_type>(0xF0u | ((static_cast(wc) >> 18u) & 0x07u)); - utf8_bytes[1] = static_cast::int_type>(0x80u | ((static_cast(wc) >> 12u) & 0x3Fu)); - utf8_bytes[2] = static_cast::int_type>(0x80u | ((static_cast(wc) >> 6u) & 0x3Fu)); - utf8_bytes[3] = static_cast::int_type>(0x80u | (static_cast(wc) & 0x3Fu)); - utf8_bytes_filled = 4; - } - else - { - // unknown character - utf8_bytes[0] = static_cast::int_type>(wc); - utf8_bytes_filled = 1; - } - } - } -}; - -template -struct wide_string_input_helper -{ - // UTF-16 - static void fill_buffer(BaseInputAdapter& input, - std::array::int_type, 4>& utf8_bytes, - size_t& utf8_bytes_index, - size_t& utf8_bytes_filled) - { - utf8_bytes_index = 0; - - if (JSON_HEDLEY_UNLIKELY(input.empty())) - { - utf8_bytes[0] = std::char_traits::eof(); - utf8_bytes_filled = 1; - } - else - { - // get the current character - const auto wc = input.get_character(); - - // UTF-16 to UTF-8 encoding - if (wc < 0x80) - { - utf8_bytes[0] = static_cast::int_type>(wc); - utf8_bytes_filled = 1; - } - else if (wc <= 0x7FF) - { - utf8_bytes[0] = static_cast::int_type>(0xC0u | ((static_cast(wc) >> 6u))); - utf8_bytes[1] = static_cast::int_type>(0x80u | (static_cast(wc) & 0x3Fu)); - utf8_bytes_filled = 2; - } - else if (0xD800 > wc || wc >= 0xE000) - { - utf8_bytes[0] = static_cast::int_type>(0xE0u | ((static_cast(wc) >> 12u))); - utf8_bytes[1] = static_cast::int_type>(0x80u | ((static_cast(wc) >> 6u) & 0x3Fu)); - utf8_bytes[2] = static_cast::int_type>(0x80u | (static_cast(wc) & 0x3Fu)); - utf8_bytes_filled = 3; - } - else - { - if (JSON_HEDLEY_UNLIKELY(!input.empty())) - { - const auto wc2 = static_cast(input.get_character()); - const auto charcode = 0x10000u + (((static_cast(wc) & 0x3FFu) << 10u) | (wc2 & 0x3FFu)); - utf8_bytes[0] = static_cast::int_type>(0xF0u | (charcode >> 18u)); - utf8_bytes[1] = static_cast::int_type>(0x80u | ((charcode >> 12u) & 0x3Fu)); - utf8_bytes[2] = static_cast::int_type>(0x80u | ((charcode >> 6u) & 0x3Fu)); - utf8_bytes[3] = static_cast::int_type>(0x80u | (charcode & 0x3Fu)); - utf8_bytes_filled = 4; - } - else - { - utf8_bytes[0] = static_cast::int_type>(wc); - utf8_bytes_filled = 1; - } - } - } - } -}; - -// Wraps another input apdater to convert wide character types into individual bytes. -template -class wide_string_input_adapter -{ - public: - using char_type = char; - - wide_string_input_adapter(BaseInputAdapter base) - : base_adapter(base) {} - - typename std::char_traits::int_type get_character() noexcept - { - // check if buffer needs to be filled - if (utf8_bytes_index == utf8_bytes_filled) - { - fill_buffer(); - - JSON_ASSERT(utf8_bytes_filled > 0); - JSON_ASSERT(utf8_bytes_index == 0); - } - - // use buffer - JSON_ASSERT(utf8_bytes_filled > 0); - JSON_ASSERT(utf8_bytes_index < utf8_bytes_filled); - return utf8_bytes[utf8_bytes_index++]; - } - - private: - BaseInputAdapter base_adapter; - - template - void fill_buffer() - { - wide_string_input_helper::fill_buffer(base_adapter, utf8_bytes, utf8_bytes_index, utf8_bytes_filled); - } - - /// a buffer for UTF-8 bytes - std::array::int_type, 4> utf8_bytes = {{0, 0, 0, 0}}; - - /// index to the utf8_codes array for the next valid byte - std::size_t utf8_bytes_index = 0; - /// number of valid bytes in the utf8_codes array - std::size_t utf8_bytes_filled = 0; -}; - - -template -struct iterator_input_adapter_factory -{ - using iterator_type = IteratorType; - using char_type = typename std::iterator_traits::value_type; - using adapter_type = iterator_input_adapter; - - static adapter_type create(IteratorType first, IteratorType last) - { - return adapter_type(std::move(first), std::move(last)); - } -}; - -template -struct is_iterator_of_multibyte -{ - using value_type = typename std::iterator_traits::value_type; - enum - { - value = sizeof(value_type) > 1 - }; -}; - -template -struct iterator_input_adapter_factory::value>> -{ - using iterator_type = IteratorType; - using char_type = typename std::iterator_traits::value_type; - using base_adapter_type = iterator_input_adapter; - using adapter_type = wide_string_input_adapter; - - static adapter_type create(IteratorType first, IteratorType last) - { - return adapter_type(base_adapter_type(std::move(first), std::move(last))); - } -}; - -// General purpose iterator-based input -template -typename iterator_input_adapter_factory::adapter_type input_adapter(IteratorType first, IteratorType last) -{ - using factory_type = iterator_input_adapter_factory; - return factory_type::create(first, last); -} - -// Convenience shorthand from container to iterator -template -auto input_adapter(const ContainerType& container) -> decltype(input_adapter(begin(container), end(container))) -{ - // Enable ADL - using std::begin; - using std::end; - - return input_adapter(begin(container), end(container)); -} - -// Special cases with fast paths -inline file_input_adapter input_adapter(std::FILE* file) -{ - return file_input_adapter(file); -} - -inline input_stream_adapter input_adapter(std::istream& stream) -{ - return input_stream_adapter(stream); -} - -inline input_stream_adapter input_adapter(std::istream&& stream) -{ - return input_stream_adapter(stream); -} - -using contiguous_bytes_input_adapter = decltype(input_adapter(std::declval(), std::declval())); - -// Null-delimited strings, and the like. -template < typename CharT, - typename std::enable_if < - std::is_pointer::value&& - !std::is_array::value&& - std::is_integral::type>::value&& - sizeof(typename std::remove_pointer::type) == 1, - int >::type = 0 > -contiguous_bytes_input_adapter input_adapter(CharT b) -{ - auto length = std::strlen(reinterpret_cast(b)); - const auto* ptr = reinterpret_cast(b); - return input_adapter(ptr, ptr + length); -} - -template -auto input_adapter(T (&array)[N]) -> decltype(input_adapter(array, array + N)) -{ - return input_adapter(array, array + N); -} - -// This class only handles inputs of input_buffer_adapter type. -// It's required so that expressions like {ptr, len} can be implicitely casted -// to the correct adapter. -class span_input_adapter -{ - public: - template < typename CharT, - typename std::enable_if < - std::is_pointer::value&& - std::is_integral::type>::value&& - sizeof(typename std::remove_pointer::type) == 1, - int >::type = 0 > - span_input_adapter(CharT b, std::size_t l) - : ia(reinterpret_cast(b), reinterpret_cast(b) + l) {} - - template::iterator_category, std::random_access_iterator_tag>::value, - int>::type = 0> - span_input_adapter(IteratorType first, IteratorType last) - : ia(input_adapter(first, last)) {} - - contiguous_bytes_input_adapter&& get() - { - return std::move(ia); - } - - private: - contiguous_bytes_input_adapter ia; -}; -} // namespace detail -} // namespace nlohmann - -// #include - - -#include -#include // string -#include // move -#include // vector - -// #include - -// #include - - -namespace nlohmann -{ - -/*! -@brief SAX interface - -This class describes the SAX interface used by @ref nlohmann::json::sax_parse. -Each function is called in different situations while the input is parsed. The -boolean return value informs the parser whether to continue processing the -input. -*/ -template -struct json_sax -{ - using number_integer_t = typename BasicJsonType::number_integer_t; - using number_unsigned_t = typename BasicJsonType::number_unsigned_t; - using number_float_t = typename BasicJsonType::number_float_t; - using string_t = typename BasicJsonType::string_t; - using binary_t = typename BasicJsonType::binary_t; - - /*! - @brief a null value was read - @return whether parsing should proceed - */ - virtual bool null() = 0; - - /*! - @brief a boolean value was read - @param[in] val boolean value - @return whether parsing should proceed - */ - virtual bool boolean(bool val) = 0; - - /*! - @brief an integer number was read - @param[in] val integer value - @return whether parsing should proceed - */ - virtual bool number_integer(number_integer_t val) = 0; - - /*! - @brief an unsigned integer number was read - @param[in] val unsigned integer value - @return whether parsing should proceed - */ - virtual bool number_unsigned(number_unsigned_t val) = 0; - - /*! - @brief an floating-point number was read - @param[in] val floating-point value - @param[in] s raw token value - @return whether parsing should proceed - */ - virtual bool number_float(number_float_t val, const string_t& s) = 0; - - /*! - @brief a string was read - @param[in] val string value - @return whether parsing should proceed - @note It is safe to move the passed string. - */ - virtual bool string(string_t& val) = 0; - - /*! - @brief a binary string was read - @param[in] val binary value - @return whether parsing should proceed - @note It is safe to move the passed binary. - */ - virtual bool binary(binary_t& val) = 0; - - /*! - @brief the beginning of an object was read - @param[in] elements number of object elements or -1 if unknown - @return whether parsing should proceed - @note binary formats may report the number of elements - */ - virtual bool start_object(std::size_t elements) = 0; - - /*! - @brief an object key was read - @param[in] val object key - @return whether parsing should proceed - @note It is safe to move the passed string. - */ - virtual bool key(string_t& val) = 0; - - /*! - @brief the end of an object was read - @return whether parsing should proceed - */ - virtual bool end_object() = 0; - - /*! - @brief the beginning of an array was read - @param[in] elements number of array elements or -1 if unknown - @return whether parsing should proceed - @note binary formats may report the number of elements - */ - virtual bool start_array(std::size_t elements) = 0; - - /*! - @brief the end of an array was read - @return whether parsing should proceed - */ - virtual bool end_array() = 0; - - /*! - @brief a parse error occurred - @param[in] position the position in the input where the error occurs - @param[in] last_token the last read token - @param[in] ex an exception object describing the error - @return whether parsing should proceed (must return false) - */ - virtual bool parse_error(std::size_t position, - const std::string& last_token, - const detail::exception& ex) = 0; - - virtual ~json_sax() = default; -}; - - -namespace detail -{ -/*! -@brief SAX implementation to create a JSON value from SAX events - -This class implements the @ref json_sax interface and processes the SAX events -to create a JSON value which makes it basically a DOM parser. The structure or -hierarchy of the JSON value is managed by the stack `ref_stack` which contains -a pointer to the respective array or object for each recursion depth. - -After successful parsing, the value that is passed by reference to the -constructor contains the parsed value. - -@tparam BasicJsonType the JSON type -*/ -template -class json_sax_dom_parser -{ - public: - using number_integer_t = typename BasicJsonType::number_integer_t; - using number_unsigned_t = typename BasicJsonType::number_unsigned_t; - using number_float_t = typename BasicJsonType::number_float_t; - using string_t = typename BasicJsonType::string_t; - using binary_t = typename BasicJsonType::binary_t; - - /*! - @param[in, out] r reference to a JSON value that is manipulated while - parsing - @param[in] allow_exceptions_ whether parse errors yield exceptions - */ - explicit json_sax_dom_parser(BasicJsonType& r, const bool allow_exceptions_ = true) - : root(r), allow_exceptions(allow_exceptions_) - {} - - // make class move-only - json_sax_dom_parser(const json_sax_dom_parser&) = delete; - json_sax_dom_parser(json_sax_dom_parser&&) = default; - json_sax_dom_parser& operator=(const json_sax_dom_parser&) = delete; - json_sax_dom_parser& operator=(json_sax_dom_parser&&) = default; - ~json_sax_dom_parser() = default; - - bool null() - { - handle_value(nullptr); - return true; - } - - bool boolean(bool val) - { - handle_value(val); - return true; - } - - bool number_integer(number_integer_t val) - { - handle_value(val); - return true; - } - - bool number_unsigned(number_unsigned_t val) - { - handle_value(val); - return true; - } - - bool number_float(number_float_t val, const string_t& /*unused*/) - { - handle_value(val); - return true; - } - - bool string(string_t& val) - { - handle_value(val); - return true; - } - - bool binary(binary_t& val) - { - handle_value(std::move(val)); - return true; - } - - bool start_object(std::size_t len) - { - ref_stack.push_back(handle_value(BasicJsonType::value_t::object)); - - if (JSON_HEDLEY_UNLIKELY(len != std::size_t(-1) && len > ref_stack.back()->max_size())) - { - JSON_THROW(out_of_range::create(408, - "excessive object size: " + std::to_string(len))); - } - - return true; - } - - bool key(string_t& val) - { - // add null at given key and store the reference for later - object_element = &(ref_stack.back()->m_value.object->operator[](val)); - return true; - } - - bool end_object() - { - ref_stack.pop_back(); - return true; - } - - bool start_array(std::size_t len) - { - ref_stack.push_back(handle_value(BasicJsonType::value_t::array)); - - if (JSON_HEDLEY_UNLIKELY(len != std::size_t(-1) && len > ref_stack.back()->max_size())) - { - JSON_THROW(out_of_range::create(408, - "excessive array size: " + std::to_string(len))); - } - - return true; - } - - bool end_array() - { - ref_stack.pop_back(); - return true; - } - - template - bool parse_error(std::size_t /*unused*/, const std::string& /*unused*/, - const Exception& ex) - { - errored = true; - static_cast(ex); - if (allow_exceptions) - { - JSON_THROW(ex); - } - return false; - } - - constexpr bool is_errored() const - { - return errored; - } - - private: - /*! - @invariant If the ref stack is empty, then the passed value will be the new - root. - @invariant If the ref stack contains a value, then it is an array or an - object to which we can add elements - */ - template - JSON_HEDLEY_RETURNS_NON_NULL - BasicJsonType* handle_value(Value&& v) - { - if (ref_stack.empty()) - { - root = BasicJsonType(std::forward(v)); - return &root; - } - - JSON_ASSERT(ref_stack.back()->is_array() || ref_stack.back()->is_object()); - - if (ref_stack.back()->is_array()) - { - ref_stack.back()->m_value.array->emplace_back(std::forward(v)); - return &(ref_stack.back()->m_value.array->back()); - } - - JSON_ASSERT(ref_stack.back()->is_object()); - JSON_ASSERT(object_element); - *object_element = BasicJsonType(std::forward(v)); - return object_element; - } - - /// the parsed JSON value - BasicJsonType& root; - /// stack to model hierarchy of values - std::vector ref_stack {}; - /// helper to hold the reference for the next object element - BasicJsonType* object_element = nullptr; - /// whether a syntax error occurred - bool errored = false; - /// whether to throw exceptions in case of errors - const bool allow_exceptions = true; -}; - -template -class json_sax_dom_callback_parser -{ - public: - using number_integer_t = typename BasicJsonType::number_integer_t; - using number_unsigned_t = typename BasicJsonType::number_unsigned_t; - using number_float_t = typename BasicJsonType::number_float_t; - using string_t = typename BasicJsonType::string_t; - using binary_t = typename BasicJsonType::binary_t; - using parser_callback_t = typename BasicJsonType::parser_callback_t; - using parse_event_t = typename BasicJsonType::parse_event_t; - - json_sax_dom_callback_parser(BasicJsonType& r, - const parser_callback_t cb, - const bool allow_exceptions_ = true) - : root(r), callback(cb), allow_exceptions(allow_exceptions_) - { - keep_stack.push_back(true); - } - - // make class move-only - json_sax_dom_callback_parser(const json_sax_dom_callback_parser&) = delete; - json_sax_dom_callback_parser(json_sax_dom_callback_parser&&) = default; - json_sax_dom_callback_parser& operator=(const json_sax_dom_callback_parser&) = delete; - json_sax_dom_callback_parser& operator=(json_sax_dom_callback_parser&&) = default; - ~json_sax_dom_callback_parser() = default; - - bool null() - { - handle_value(nullptr); - return true; - } - - bool boolean(bool val) - { - handle_value(val); - return true; - } - - bool number_integer(number_integer_t val) - { - handle_value(val); - return true; - } - - bool number_unsigned(number_unsigned_t val) - { - handle_value(val); - return true; - } - - bool number_float(number_float_t val, const string_t& /*unused*/) - { - handle_value(val); - return true; - } - - bool string(string_t& val) - { - handle_value(val); - return true; - } - - bool binary(binary_t& val) - { - handle_value(std::move(val)); - return true; - } - - bool start_object(std::size_t len) - { - // check callback for object start - const bool keep = callback(static_cast(ref_stack.size()), parse_event_t::object_start, discarded); - keep_stack.push_back(keep); - - auto val = handle_value(BasicJsonType::value_t::object, true); - ref_stack.push_back(val.second); - - // check object limit - if (ref_stack.back() && JSON_HEDLEY_UNLIKELY(len != std::size_t(-1) && len > ref_stack.back()->max_size())) - { - JSON_THROW(out_of_range::create(408, "excessive object size: " + std::to_string(len))); - } - - return true; - } - - bool key(string_t& val) - { - BasicJsonType k = BasicJsonType(val); - - // check callback for key - const bool keep = callback(static_cast(ref_stack.size()), parse_event_t::key, k); - key_keep_stack.push_back(keep); - - // add discarded value at given key and store the reference for later - if (keep && ref_stack.back()) - { - object_element = &(ref_stack.back()->m_value.object->operator[](val) = discarded); - } - - return true; - } - - bool end_object() - { - if (ref_stack.back() && !callback(static_cast(ref_stack.size()) - 1, parse_event_t::object_end, *ref_stack.back())) - { - // discard object - *ref_stack.back() = discarded; - } - - JSON_ASSERT(!ref_stack.empty()); - JSON_ASSERT(!keep_stack.empty()); - ref_stack.pop_back(); - keep_stack.pop_back(); - - if (!ref_stack.empty() && ref_stack.back() && ref_stack.back()->is_structured()) - { - // remove discarded value - for (auto it = ref_stack.back()->begin(); it != ref_stack.back()->end(); ++it) - { - if (it->is_discarded()) - { - ref_stack.back()->erase(it); - break; - } - } - } - - return true; - } - - bool start_array(std::size_t len) - { - const bool keep = callback(static_cast(ref_stack.size()), parse_event_t::array_start, discarded); - keep_stack.push_back(keep); - - auto val = handle_value(BasicJsonType::value_t::array, true); - ref_stack.push_back(val.second); - - // check array limit - if (ref_stack.back() && JSON_HEDLEY_UNLIKELY(len != std::size_t(-1) && len > ref_stack.back()->max_size())) - { - JSON_THROW(out_of_range::create(408, "excessive array size: " + std::to_string(len))); - } - - return true; - } - - bool end_array() - { - bool keep = true; - - if (ref_stack.back()) - { - keep = callback(static_cast(ref_stack.size()) - 1, parse_event_t::array_end, *ref_stack.back()); - if (!keep) - { - // discard array - *ref_stack.back() = discarded; - } - } - - JSON_ASSERT(!ref_stack.empty()); - JSON_ASSERT(!keep_stack.empty()); - ref_stack.pop_back(); - keep_stack.pop_back(); - - // remove discarded value - if (!keep && !ref_stack.empty() && ref_stack.back()->is_array()) - { - ref_stack.back()->m_value.array->pop_back(); - } - - return true; - } - - template - bool parse_error(std::size_t /*unused*/, const std::string& /*unused*/, - const Exception& ex) - { - errored = true; - static_cast(ex); - if (allow_exceptions) - { - JSON_THROW(ex); - } - return false; - } - - constexpr bool is_errored() const - { - return errored; - } - - private: - /*! - @param[in] v value to add to the JSON value we build during parsing - @param[in] skip_callback whether we should skip calling the callback - function; this is required after start_array() and - start_object() SAX events, because otherwise we would call the - callback function with an empty array or object, respectively. - - @invariant If the ref stack is empty, then the passed value will be the new - root. - @invariant If the ref stack contains a value, then it is an array or an - object to which we can add elements - - @return pair of boolean (whether value should be kept) and pointer (to the - passed value in the ref_stack hierarchy; nullptr if not kept) - */ - template - std::pair handle_value(Value&& v, const bool skip_callback = false) - { - JSON_ASSERT(!keep_stack.empty()); - - // do not handle this value if we know it would be added to a discarded - // container - if (!keep_stack.back()) - { - return {false, nullptr}; - } - - // create value - auto value = BasicJsonType(std::forward(v)); - - // check callback - const bool keep = skip_callback || callback(static_cast(ref_stack.size()), parse_event_t::value, value); - - // do not handle this value if we just learnt it shall be discarded - if (!keep) - { - return {false, nullptr}; - } - - if (ref_stack.empty()) - { - root = std::move(value); - return {true, &root}; - } - - // skip this value if we already decided to skip the parent - // (https://github.com/nlohmann/json/issues/971#issuecomment-413678360) - if (!ref_stack.back()) - { - return {false, nullptr}; - } - - // we now only expect arrays and objects - JSON_ASSERT(ref_stack.back()->is_array() || ref_stack.back()->is_object()); - - // array - if (ref_stack.back()->is_array()) - { - ref_stack.back()->m_value.array->push_back(std::move(value)); - return {true, &(ref_stack.back()->m_value.array->back())}; - } - - // object - JSON_ASSERT(ref_stack.back()->is_object()); - // check if we should store an element for the current key - JSON_ASSERT(!key_keep_stack.empty()); - const bool store_element = key_keep_stack.back(); - key_keep_stack.pop_back(); - - if (!store_element) - { - return {false, nullptr}; - } - - JSON_ASSERT(object_element); - *object_element = std::move(value); - return {true, object_element}; - } - - /// the parsed JSON value - BasicJsonType& root; - /// stack to model hierarchy of values - std::vector ref_stack {}; - /// stack to manage which values to keep - std::vector keep_stack {}; - /// stack to manage which object keys to keep - std::vector key_keep_stack {}; - /// helper to hold the reference for the next object element - BasicJsonType* object_element = nullptr; - /// whether a syntax error occurred - bool errored = false; - /// callback function - const parser_callback_t callback = nullptr; - /// whether to throw exceptions in case of errors - const bool allow_exceptions = true; - /// a discarded value for the callback - BasicJsonType discarded = BasicJsonType::value_t::discarded; -}; - -template -class json_sax_acceptor -{ - public: - using number_integer_t = typename BasicJsonType::number_integer_t; - using number_unsigned_t = typename BasicJsonType::number_unsigned_t; - using number_float_t = typename BasicJsonType::number_float_t; - using string_t = typename BasicJsonType::string_t; - using binary_t = typename BasicJsonType::binary_t; - - bool null() - { - return true; - } - - bool boolean(bool /*unused*/) - { - return true; - } - - bool number_integer(number_integer_t /*unused*/) - { - return true; - } - - bool number_unsigned(number_unsigned_t /*unused*/) - { - return true; - } - - bool number_float(number_float_t /*unused*/, const string_t& /*unused*/) - { - return true; - } - - bool string(string_t& /*unused*/) - { - return true; - } - - bool binary(binary_t& /*unused*/) - { - return true; - } - - bool start_object(std::size_t /*unused*/ = std::size_t(-1)) - { - return true; - } - - bool key(string_t& /*unused*/) - { - return true; - } - - bool end_object() - { - return true; - } - - bool start_array(std::size_t /*unused*/ = std::size_t(-1)) - { - return true; - } - - bool end_array() - { - return true; - } - - bool parse_error(std::size_t /*unused*/, const std::string& /*unused*/, const detail::exception& /*unused*/) - { - return false; - } -}; -} // namespace detail - -} // namespace nlohmann - -// #include - - -#include // array -#include // localeconv -#include // size_t -#include // snprintf -#include // strtof, strtod, strtold, strtoll, strtoull -#include // initializer_list -#include // char_traits, string -#include // move -#include // vector - -// #include - -// #include - -// #include - - -namespace nlohmann -{ -namespace detail -{ -/////////// -// lexer // -/////////// - -template -class lexer_base -{ - public: - /// token types for the parser - enum class token_type - { - uninitialized, ///< indicating the scanner is uninitialized - literal_true, ///< the `true` literal - literal_false, ///< the `false` literal - literal_null, ///< the `null` literal - value_string, ///< a string -- use get_string() for actual value - value_unsigned, ///< an unsigned integer -- use get_number_unsigned() for actual value - value_integer, ///< a signed integer -- use get_number_integer() for actual value - value_float, ///< an floating point number -- use get_number_float() for actual value - begin_array, ///< the character for array begin `[` - begin_object, ///< the character for object begin `{` - end_array, ///< the character for array end `]` - end_object, ///< the character for object end `}` - name_separator, ///< the name separator `:` - value_separator, ///< the value separator `,` - parse_error, ///< indicating a parse error - end_of_input, ///< indicating the end of the input buffer - literal_or_value ///< a literal or the begin of a value (only for diagnostics) - }; - - /// return name of values of type token_type (only used for errors) - JSON_HEDLEY_RETURNS_NON_NULL - JSON_HEDLEY_CONST - static const char* token_type_name(const token_type t) noexcept - { - switch (t) - { - case token_type::uninitialized: - return ""; - case token_type::literal_true: - return "true literal"; - case token_type::literal_false: - return "false literal"; - case token_type::literal_null: - return "null literal"; - case token_type::value_string: - return "string literal"; - case token_type::value_unsigned: - case token_type::value_integer: - case token_type::value_float: - return "number literal"; - case token_type::begin_array: - return "'['"; - case token_type::begin_object: - return "'{'"; - case token_type::end_array: - return "']'"; - case token_type::end_object: - return "'}'"; - case token_type::name_separator: - return "':'"; - case token_type::value_separator: - return "','"; - case token_type::parse_error: - return ""; - case token_type::end_of_input: - return "end of input"; - case token_type::literal_or_value: - return "'[', '{', or a literal"; - // LCOV_EXCL_START - default: // catch non-enum values - return "unknown token"; - // LCOV_EXCL_STOP - } - } -}; -/*! -@brief lexical analysis - -This class organizes the lexical analysis during JSON deserialization. -*/ -template -class lexer : public lexer_base -{ - using number_integer_t = typename BasicJsonType::number_integer_t; - using number_unsigned_t = typename BasicJsonType::number_unsigned_t; - using number_float_t = typename BasicJsonType::number_float_t; - using string_t = typename BasicJsonType::string_t; - using char_type = typename InputAdapterType::char_type; - using char_int_type = typename std::char_traits::int_type; - - public: - using token_type = typename lexer_base::token_type; - - explicit lexer(InputAdapterType&& adapter, bool ignore_comments_ = false) - : ia(std::move(adapter)) - , ignore_comments(ignore_comments_) - , decimal_point_char(static_cast(get_decimal_point())) - {} - - // delete because of pointer members - lexer(const lexer&) = delete; - lexer(lexer&&) = default; - lexer& operator=(lexer&) = delete; - lexer& operator=(lexer&&) = default; - ~lexer() = default; - - private: - ///////////////////// - // locales - ///////////////////// - - /// return the locale-dependent decimal point - JSON_HEDLEY_PURE - static char get_decimal_point() noexcept - { - const auto* loc = localeconv(); - JSON_ASSERT(loc != nullptr); - return (loc->decimal_point == nullptr) ? '.' : *(loc->decimal_point); - } - - ///////////////////// - // scan functions - ///////////////////// - - /*! - @brief get codepoint from 4 hex characters following `\u` - - For input "\u c1 c2 c3 c4" the codepoint is: - (c1 * 0x1000) + (c2 * 0x0100) + (c3 * 0x0010) + c4 - = (c1 << 12) + (c2 << 8) + (c3 << 4) + (c4 << 0) - - Furthermore, the possible characters '0'..'9', 'A'..'F', and 'a'..'f' - must be converted to the integers 0x0..0x9, 0xA..0xF, 0xA..0xF, resp. The - conversion is done by subtracting the offset (0x30, 0x37, and 0x57) - between the ASCII value of the character and the desired integer value. - - @return codepoint (0x0000..0xFFFF) or -1 in case of an error (e.g. EOF or - non-hex character) - */ - int get_codepoint() - { - // this function only makes sense after reading `\u` - JSON_ASSERT(current == 'u'); - int codepoint = 0; - - const auto factors = { 12u, 8u, 4u, 0u }; - for (const auto factor : factors) - { - get(); - - if (current >= '0' && current <= '9') - { - codepoint += static_cast((static_cast(current) - 0x30u) << factor); - } - else if (current >= 'A' && current <= 'F') - { - codepoint += static_cast((static_cast(current) - 0x37u) << factor); - } - else if (current >= 'a' && current <= 'f') - { - codepoint += static_cast((static_cast(current) - 0x57u) << factor); - } - else - { - return -1; - } - } - - JSON_ASSERT(0x0000 <= codepoint && codepoint <= 0xFFFF); - return codepoint; - } - - /*! - @brief check if the next byte(s) are inside a given range - - Adds the current byte and, for each passed range, reads a new byte and - checks if it is inside the range. If a violation was detected, set up an - error message and return false. Otherwise, return true. - - @param[in] ranges list of integers; interpreted as list of pairs of - inclusive lower and upper bound, respectively - - @pre The passed list @a ranges must have 2, 4, or 6 elements; that is, - 1, 2, or 3 pairs. This precondition is enforced by an assertion. - - @return true if and only if no range violation was detected - */ - bool next_byte_in_range(std::initializer_list ranges) - { - JSON_ASSERT(ranges.size() == 2 || ranges.size() == 4 || ranges.size() == 6); - add(current); - - for (auto range = ranges.begin(); range != ranges.end(); ++range) - { - get(); - if (JSON_HEDLEY_LIKELY(*range <= current && current <= *(++range))) - { - add(current); - } - else - { - error_message = "invalid string: ill-formed UTF-8 byte"; - return false; - } - } - - return true; - } - - /*! - @brief scan a string literal - - This function scans a string according to Sect. 7 of RFC 7159. While - scanning, bytes are escaped and copied into buffer token_buffer. Then the - function returns successfully, token_buffer is *not* null-terminated (as it - may contain \0 bytes), and token_buffer.size() is the number of bytes in the - string. - - @return token_type::value_string if string could be successfully scanned, - token_type::parse_error otherwise - - @note In case of errors, variable error_message contains a textual - description. - */ - token_type scan_string() - { - // reset token_buffer (ignore opening quote) - reset(); - - // we entered the function by reading an open quote - JSON_ASSERT(current == '\"'); - - while (true) - { - // get next character - switch (get()) - { - // end of file while parsing string - case std::char_traits::eof(): - { - error_message = "invalid string: missing closing quote"; - return token_type::parse_error; - } - - // closing quote - case '\"': - { - return token_type::value_string; - } - - // escapes - case '\\': - { - switch (get()) - { - // quotation mark - case '\"': - add('\"'); - break; - // reverse solidus - case '\\': - add('\\'); - break; - // solidus - case '/': - add('/'); - break; - // backspace - case 'b': - add('\b'); - break; - // form feed - case 'f': - add('\f'); - break; - // line feed - case 'n': - add('\n'); - break; - // carriage return - case 'r': - add('\r'); - break; - // tab - case 't': - add('\t'); - break; - - // unicode escapes - case 'u': - { - const int codepoint1 = get_codepoint(); - int codepoint = codepoint1; // start with codepoint1 - - if (JSON_HEDLEY_UNLIKELY(codepoint1 == -1)) - { - error_message = "invalid string: '\\u' must be followed by 4 hex digits"; - return token_type::parse_error; - } - - // check if code point is a high surrogate - if (0xD800 <= codepoint1 && codepoint1 <= 0xDBFF) - { - // expect next \uxxxx entry - if (JSON_HEDLEY_LIKELY(get() == '\\' && get() == 'u')) - { - const int codepoint2 = get_codepoint(); - - if (JSON_HEDLEY_UNLIKELY(codepoint2 == -1)) - { - error_message = "invalid string: '\\u' must be followed by 4 hex digits"; - return token_type::parse_error; - } - - // check if codepoint2 is a low surrogate - if (JSON_HEDLEY_LIKELY(0xDC00 <= codepoint2 && codepoint2 <= 0xDFFF)) - { - // overwrite codepoint - codepoint = static_cast( - // high surrogate occupies the most significant 22 bits - (static_cast(codepoint1) << 10u) - // low surrogate occupies the least significant 15 bits - + static_cast(codepoint2) - // there is still the 0xD800, 0xDC00 and 0x10000 noise - // in the result so we have to subtract with: - // (0xD800 << 10) + DC00 - 0x10000 = 0x35FDC00 - - 0x35FDC00u); - } - else - { - error_message = "invalid string: surrogate U+D800..U+DBFF must be followed by U+DC00..U+DFFF"; - return token_type::parse_error; - } - } - else - { - error_message = "invalid string: surrogate U+D800..U+DBFF must be followed by U+DC00..U+DFFF"; - return token_type::parse_error; - } - } - else - { - if (JSON_HEDLEY_UNLIKELY(0xDC00 <= codepoint1 && codepoint1 <= 0xDFFF)) - { - error_message = "invalid string: surrogate U+DC00..U+DFFF must follow U+D800..U+DBFF"; - return token_type::parse_error; - } - } - - // result of the above calculation yields a proper codepoint - JSON_ASSERT(0x00 <= codepoint && codepoint <= 0x10FFFF); - - // translate codepoint into bytes - if (codepoint < 0x80) - { - // 1-byte characters: 0xxxxxxx (ASCII) - add(static_cast(codepoint)); - } - else if (codepoint <= 0x7FF) - { - // 2-byte characters: 110xxxxx 10xxxxxx - add(static_cast(0xC0u | (static_cast(codepoint) >> 6u))); - add(static_cast(0x80u | (static_cast(codepoint) & 0x3Fu))); - } - else if (codepoint <= 0xFFFF) - { - // 3-byte characters: 1110xxxx 10xxxxxx 10xxxxxx - add(static_cast(0xE0u | (static_cast(codepoint) >> 12u))); - add(static_cast(0x80u | ((static_cast(codepoint) >> 6u) & 0x3Fu))); - add(static_cast(0x80u | (static_cast(codepoint) & 0x3Fu))); - } - else - { - // 4-byte characters: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx - add(static_cast(0xF0u | (static_cast(codepoint) >> 18u))); - add(static_cast(0x80u | ((static_cast(codepoint) >> 12u) & 0x3Fu))); - add(static_cast(0x80u | ((static_cast(codepoint) >> 6u) & 0x3Fu))); - add(static_cast(0x80u | (static_cast(codepoint) & 0x3Fu))); - } - - break; - } - - // other characters after escape - default: - error_message = "invalid string: forbidden character after backslash"; - return token_type::parse_error; - } - - break; - } - - // invalid control characters - case 0x00: - { - error_message = "invalid string: control character U+0000 (NUL) must be escaped to \\u0000"; - return token_type::parse_error; - } - - case 0x01: - { - error_message = "invalid string: control character U+0001 (SOH) must be escaped to \\u0001"; - return token_type::parse_error; - } - - case 0x02: - { - error_message = "invalid string: control character U+0002 (STX) must be escaped to \\u0002"; - return token_type::parse_error; - } - - case 0x03: - { - error_message = "invalid string: control character U+0003 (ETX) must be escaped to \\u0003"; - return token_type::parse_error; - } - - case 0x04: - { - error_message = "invalid string: control character U+0004 (EOT) must be escaped to \\u0004"; - return token_type::parse_error; - } - - case 0x05: - { - error_message = "invalid string: control character U+0005 (ENQ) must be escaped to \\u0005"; - return token_type::parse_error; - } - - case 0x06: - { - error_message = "invalid string: control character U+0006 (ACK) must be escaped to \\u0006"; - return token_type::parse_error; - } - - case 0x07: - { - error_message = "invalid string: control character U+0007 (BEL) must be escaped to \\u0007"; - return token_type::parse_error; - } - - case 0x08: - { - error_message = "invalid string: control character U+0008 (BS) must be escaped to \\u0008 or \\b"; - return token_type::parse_error; - } - - case 0x09: - { - error_message = "invalid string: control character U+0009 (HT) must be escaped to \\u0009 or \\t"; - return token_type::parse_error; - } - - case 0x0A: - { - error_message = "invalid string: control character U+000A (LF) must be escaped to \\u000A or \\n"; - return token_type::parse_error; - } - - case 0x0B: - { - error_message = "invalid string: control character U+000B (VT) must be escaped to \\u000B"; - return token_type::parse_error; - } - - case 0x0C: - { - error_message = "invalid string: control character U+000C (FF) must be escaped to \\u000C or \\f"; - return token_type::parse_error; - } - - case 0x0D: - { - error_message = "invalid string: control character U+000D (CR) must be escaped to \\u000D or \\r"; - return token_type::parse_error; - } - - case 0x0E: - { - error_message = "invalid string: control character U+000E (SO) must be escaped to \\u000E"; - return token_type::parse_error; - } - - case 0x0F: - { - error_message = "invalid string: control character U+000F (SI) must be escaped to \\u000F"; - return token_type::parse_error; - } - - case 0x10: - { - error_message = "invalid string: control character U+0010 (DLE) must be escaped to \\u0010"; - return token_type::parse_error; - } - - case 0x11: - { - error_message = "invalid string: control character U+0011 (DC1) must be escaped to \\u0011"; - return token_type::parse_error; - } - - case 0x12: - { - error_message = "invalid string: control character U+0012 (DC2) must be escaped to \\u0012"; - return token_type::parse_error; - } - - case 0x13: - { - error_message = "invalid string: control character U+0013 (DC3) must be escaped to \\u0013"; - return token_type::parse_error; - } - - case 0x14: - { - error_message = "invalid string: control character U+0014 (DC4) must be escaped to \\u0014"; - return token_type::parse_error; - } - - case 0x15: - { - error_message = "invalid string: control character U+0015 (NAK) must be escaped to \\u0015"; - return token_type::parse_error; - } - - case 0x16: - { - error_message = "invalid string: control character U+0016 (SYN) must be escaped to \\u0016"; - return token_type::parse_error; - } - - case 0x17: - { - error_message = "invalid string: control character U+0017 (ETB) must be escaped to \\u0017"; - return token_type::parse_error; - } - - case 0x18: - { - error_message = "invalid string: control character U+0018 (CAN) must be escaped to \\u0018"; - return token_type::parse_error; - } - - case 0x19: - { - error_message = "invalid string: control character U+0019 (EM) must be escaped to \\u0019"; - return token_type::parse_error; - } - - case 0x1A: - { - error_message = "invalid string: control character U+001A (SUB) must be escaped to \\u001A"; - return token_type::parse_error; - } - - case 0x1B: - { - error_message = "invalid string: control character U+001B (ESC) must be escaped to \\u001B"; - return token_type::parse_error; - } - - case 0x1C: - { - error_message = "invalid string: control character U+001C (FS) must be escaped to \\u001C"; - return token_type::parse_error; - } - - case 0x1D: - { - error_message = "invalid string: control character U+001D (GS) must be escaped to \\u001D"; - return token_type::parse_error; - } - - case 0x1E: - { - error_message = "invalid string: control character U+001E (RS) must be escaped to \\u001E"; - return token_type::parse_error; - } - - case 0x1F: - { - error_message = "invalid string: control character U+001F (US) must be escaped to \\u001F"; - return token_type::parse_error; - } - - // U+0020..U+007F (except U+0022 (quote) and U+005C (backspace)) - case 0x20: - case 0x21: - case 0x23: - case 0x24: - case 0x25: - case 0x26: - case 0x27: - case 0x28: - case 0x29: - case 0x2A: - case 0x2B: - case 0x2C: - case 0x2D: - case 0x2E: - case 0x2F: - case 0x30: - case 0x31: - case 0x32: - case 0x33: - case 0x34: - case 0x35: - case 0x36: - case 0x37: - case 0x38: - case 0x39: - case 0x3A: - case 0x3B: - case 0x3C: - case 0x3D: - case 0x3E: - case 0x3F: - case 0x40: - case 0x41: - case 0x42: - case 0x43: - case 0x44: - case 0x45: - case 0x46: - case 0x47: - case 0x48: - case 0x49: - case 0x4A: - case 0x4B: - case 0x4C: - case 0x4D: - case 0x4E: - case 0x4F: - case 0x50: - case 0x51: - case 0x52: - case 0x53: - case 0x54: - case 0x55: - case 0x56: - case 0x57: - case 0x58: - case 0x59: - case 0x5A: - case 0x5B: - case 0x5D: - case 0x5E: - case 0x5F: - case 0x60: - case 0x61: - case 0x62: - case 0x63: - case 0x64: - case 0x65: - case 0x66: - case 0x67: - case 0x68: - case 0x69: - case 0x6A: - case 0x6B: - case 0x6C: - case 0x6D: - case 0x6E: - case 0x6F: - case 0x70: - case 0x71: - case 0x72: - case 0x73: - case 0x74: - case 0x75: - case 0x76: - case 0x77: - case 0x78: - case 0x79: - case 0x7A: - case 0x7B: - case 0x7C: - case 0x7D: - case 0x7E: - case 0x7F: - { - add(current); - break; - } - - // U+0080..U+07FF: bytes C2..DF 80..BF - case 0xC2: - case 0xC3: - case 0xC4: - case 0xC5: - case 0xC6: - case 0xC7: - case 0xC8: - case 0xC9: - case 0xCA: - case 0xCB: - case 0xCC: - case 0xCD: - case 0xCE: - case 0xCF: - case 0xD0: - case 0xD1: - case 0xD2: - case 0xD3: - case 0xD4: - case 0xD5: - case 0xD6: - case 0xD7: - case 0xD8: - case 0xD9: - case 0xDA: - case 0xDB: - case 0xDC: - case 0xDD: - case 0xDE: - case 0xDF: - { - if (JSON_HEDLEY_UNLIKELY(!next_byte_in_range({0x80, 0xBF}))) - { - return token_type::parse_error; - } - break; - } - - // U+0800..U+0FFF: bytes E0 A0..BF 80..BF - case 0xE0: - { - if (JSON_HEDLEY_UNLIKELY(!(next_byte_in_range({0xA0, 0xBF, 0x80, 0xBF})))) - { - return token_type::parse_error; - } - break; - } - - // U+1000..U+CFFF: bytes E1..EC 80..BF 80..BF - // U+E000..U+FFFF: bytes EE..EF 80..BF 80..BF - case 0xE1: - case 0xE2: - case 0xE3: - case 0xE4: - case 0xE5: - case 0xE6: - case 0xE7: - case 0xE8: - case 0xE9: - case 0xEA: - case 0xEB: - case 0xEC: - case 0xEE: - case 0xEF: - { - if (JSON_HEDLEY_UNLIKELY(!(next_byte_in_range({0x80, 0xBF, 0x80, 0xBF})))) - { - return token_type::parse_error; - } - break; - } - - // U+D000..U+D7FF: bytes ED 80..9F 80..BF - case 0xED: - { - if (JSON_HEDLEY_UNLIKELY(!(next_byte_in_range({0x80, 0x9F, 0x80, 0xBF})))) - { - return token_type::parse_error; - } - break; - } - - // U+10000..U+3FFFF F0 90..BF 80..BF 80..BF - case 0xF0: - { - if (JSON_HEDLEY_UNLIKELY(!(next_byte_in_range({0x90, 0xBF, 0x80, 0xBF, 0x80, 0xBF})))) - { - return token_type::parse_error; - } - break; - } - - // U+40000..U+FFFFF F1..F3 80..BF 80..BF 80..BF - case 0xF1: - case 0xF2: - case 0xF3: - { - if (JSON_HEDLEY_UNLIKELY(!(next_byte_in_range({0x80, 0xBF, 0x80, 0xBF, 0x80, 0xBF})))) - { - return token_type::parse_error; - } - break; - } - - // U+100000..U+10FFFF F4 80..8F 80..BF 80..BF - case 0xF4: - { - if (JSON_HEDLEY_UNLIKELY(!(next_byte_in_range({0x80, 0x8F, 0x80, 0xBF, 0x80, 0xBF})))) - { - return token_type::parse_error; - } - break; - } - - // remaining bytes (80..C1 and F5..FF) are ill-formed - default: - { - error_message = "invalid string: ill-formed UTF-8 byte"; - return token_type::parse_error; - } - } - } - } - - /*! - * @brief scan a comment - * @return whether comment could be scanned successfully - */ - bool scan_comment() - { - switch (get()) - { - // single-line comments skip input until a newline or EOF is read - case '/': - { - while (true) - { - switch (get()) - { - case '\n': - case '\r': - case std::char_traits::eof(): - case '\0': - return true; - - default: - break; - } - } - } - - // multi-line comments skip input until */ is read - case '*': - { - while (true) - { - switch (get()) - { - case std::char_traits::eof(): - case '\0': - { - error_message = "invalid comment; missing closing '*/'"; - return false; - } - - case '*': - { - switch (get()) - { - case '/': - return true; - - default: - { - unget(); - continue; - } - } - } - - default: - continue; - } - } - } - - // unexpected character after reading '/' - default: - { - error_message = "invalid comment; expecting '/' or '*' after '/'"; - return false; - } - } - } - - JSON_HEDLEY_NON_NULL(2) - static void strtof(float& f, const char* str, char** endptr) noexcept - { - f = std::strtof(str, endptr); - } - - JSON_HEDLEY_NON_NULL(2) - static void strtof(double& f, const char* str, char** endptr) noexcept - { - f = std::strtod(str, endptr); - } - - JSON_HEDLEY_NON_NULL(2) - static void strtof(long double& f, const char* str, char** endptr) noexcept - { - f = std::strtold(str, endptr); - } - - /*! - @brief scan a number literal - - This function scans a string according to Sect. 6 of RFC 7159. - - The function is realized with a deterministic finite state machine derived - from the grammar described in RFC 7159. Starting in state "init", the - input is read and used to determined the next state. Only state "done" - accepts the number. State "error" is a trap state to model errors. In the - table below, "anything" means any character but the ones listed before. - - state | 0 | 1-9 | e E | + | - | . | anything - ---------|----------|----------|----------|---------|---------|----------|----------- - init | zero | any1 | [error] | [error] | minus | [error] | [error] - minus | zero | any1 | [error] | [error] | [error] | [error] | [error] - zero | done | done | exponent | done | done | decimal1 | done - any1 | any1 | any1 | exponent | done | done | decimal1 | done - decimal1 | decimal2 | decimal2 | [error] | [error] | [error] | [error] | [error] - decimal2 | decimal2 | decimal2 | exponent | done | done | done | done - exponent | any2 | any2 | [error] | sign | sign | [error] | [error] - sign | any2 | any2 | [error] | [error] | [error] | [error] | [error] - any2 | any2 | any2 | done | done | done | done | done - - The state machine is realized with one label per state (prefixed with - "scan_number_") and `goto` statements between them. The state machine - contains cycles, but any cycle can be left when EOF is read. Therefore, - the function is guaranteed to terminate. - - During scanning, the read bytes are stored in token_buffer. This string is - then converted to a signed integer, an unsigned integer, or a - floating-point number. - - @return token_type::value_unsigned, token_type::value_integer, or - token_type::value_float if number could be successfully scanned, - token_type::parse_error otherwise - - @note The scanner is independent of the current locale. Internally, the - locale's decimal point is used instead of `.` to work with the - locale-dependent converters. - */ - token_type scan_number() // lgtm [cpp/use-of-goto] - { - // reset token_buffer to store the number's bytes - reset(); - - // the type of the parsed number; initially set to unsigned; will be - // changed if minus sign, decimal point or exponent is read - token_type number_type = token_type::value_unsigned; - - // state (init): we just found out we need to scan a number - switch (current) - { - case '-': - { - add(current); - goto scan_number_minus; - } - - case '0': - { - add(current); - goto scan_number_zero; - } - - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - { - add(current); - goto scan_number_any1; - } - - // all other characters are rejected outside scan_number() - default: // LCOV_EXCL_LINE - JSON_ASSERT(false); // LCOV_EXCL_LINE - } - -scan_number_minus: - // state: we just parsed a leading minus sign - number_type = token_type::value_integer; - switch (get()) - { - case '0': - { - add(current); - goto scan_number_zero; - } - - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - { - add(current); - goto scan_number_any1; - } - - default: - { - error_message = "invalid number; expected digit after '-'"; - return token_type::parse_error; - } - } - -scan_number_zero: - // state: we just parse a zero (maybe with a leading minus sign) - switch (get()) - { - case '.': - { - add(decimal_point_char); - goto scan_number_decimal1; - } - - case 'e': - case 'E': - { - add(current); - goto scan_number_exponent; - } - - default: - goto scan_number_done; - } - -scan_number_any1: - // state: we just parsed a number 0-9 (maybe with a leading minus sign) - switch (get()) - { - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - { - add(current); - goto scan_number_any1; - } - - case '.': - { - add(decimal_point_char); - goto scan_number_decimal1; - } - - case 'e': - case 'E': - { - add(current); - goto scan_number_exponent; - } - - default: - goto scan_number_done; - } - -scan_number_decimal1: - // state: we just parsed a decimal point - number_type = token_type::value_float; - switch (get()) - { - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - { - add(current); - goto scan_number_decimal2; - } - - default: - { - error_message = "invalid number; expected digit after '.'"; - return token_type::parse_error; - } - } - -scan_number_decimal2: - // we just parsed at least one number after a decimal point - switch (get()) - { - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - { - add(current); - goto scan_number_decimal2; - } - - case 'e': - case 'E': - { - add(current); - goto scan_number_exponent; - } - - default: - goto scan_number_done; - } - -scan_number_exponent: - // we just parsed an exponent - number_type = token_type::value_float; - switch (get()) - { - case '+': - case '-': - { - add(current); - goto scan_number_sign; - } - - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - { - add(current); - goto scan_number_any2; - } - - default: - { - error_message = - "invalid number; expected '+', '-', or digit after exponent"; - return token_type::parse_error; - } - } - -scan_number_sign: - // we just parsed an exponent sign - switch (get()) - { - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - { - add(current); - goto scan_number_any2; - } - - default: - { - error_message = "invalid number; expected digit after exponent sign"; - return token_type::parse_error; - } - } - -scan_number_any2: - // we just parsed a number after the exponent or exponent sign - switch (get()) - { - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - { - add(current); - goto scan_number_any2; - } - - default: - goto scan_number_done; - } - -scan_number_done: - // unget the character after the number (we only read it to know that - // we are done scanning a number) - unget(); - - char* endptr = nullptr; - errno = 0; - - // try to parse integers first and fall back to floats - if (number_type == token_type::value_unsigned) - { - const auto x = std::strtoull(token_buffer.data(), &endptr, 10); - - // we checked the number format before - JSON_ASSERT(endptr == token_buffer.data() + token_buffer.size()); - - if (errno == 0) - { - value_unsigned = static_cast(x); - if (value_unsigned == x) - { - return token_type::value_unsigned; - } - } - } - else if (number_type == token_type::value_integer) - { - const auto x = std::strtoll(token_buffer.data(), &endptr, 10); - - // we checked the number format before - JSON_ASSERT(endptr == token_buffer.data() + token_buffer.size()); - - if (errno == 0) - { - value_integer = static_cast(x); - if (value_integer == x) - { - return token_type::value_integer; - } - } - } - - // this code is reached if we parse a floating-point number or if an - // integer conversion above failed - strtof(value_float, token_buffer.data(), &endptr); - - // we checked the number format before - JSON_ASSERT(endptr == token_buffer.data() + token_buffer.size()); - - return token_type::value_float; - } - - /*! - @param[in] literal_text the literal text to expect - @param[in] length the length of the passed literal text - @param[in] return_type the token type to return on success - */ - JSON_HEDLEY_NON_NULL(2) - token_type scan_literal(const char_type* literal_text, const std::size_t length, - token_type return_type) - { - JSON_ASSERT(std::char_traits::to_char_type(current) == literal_text[0]); - for (std::size_t i = 1; i < length; ++i) - { - if (JSON_HEDLEY_UNLIKELY(std::char_traits::to_char_type(get()) != literal_text[i])) - { - error_message = "invalid literal"; - return token_type::parse_error; - } - } - return return_type; - } - - ///////////////////// - // input management - ///////////////////// - - /// reset token_buffer; current character is beginning of token - void reset() noexcept - { - token_buffer.clear(); - token_string.clear(); - token_string.push_back(std::char_traits::to_char_type(current)); - } - - /* - @brief get next character from the input - - This function provides the interface to the used input adapter. It does - not throw in case the input reached EOF, but returns a - `std::char_traits::eof()` in that case. Stores the scanned characters - for use in error messages. - - @return character read from the input - */ - char_int_type get() - { - ++position.chars_read_total; - ++position.chars_read_current_line; - - if (next_unget) - { - // just reset the next_unget variable and work with current - next_unget = false; - } - else - { - current = ia.get_character(); - } - - if (JSON_HEDLEY_LIKELY(current != std::char_traits::eof())) - { - token_string.push_back(std::char_traits::to_char_type(current)); - } - - if (current == '\n') - { - ++position.lines_read; - position.chars_read_current_line = 0; - } - - return current; - } - - /*! - @brief unget current character (read it again on next get) - - We implement unget by setting variable next_unget to true. The input is not - changed - we just simulate ungetting by modifying chars_read_total, - chars_read_current_line, and token_string. The next call to get() will - behave as if the unget character is read again. - */ - void unget() - { - next_unget = true; - - --position.chars_read_total; - - // in case we "unget" a newline, we have to also decrement the lines_read - if (position.chars_read_current_line == 0) - { - if (position.lines_read > 0) - { - --position.lines_read; - } - } - else - { - --position.chars_read_current_line; - } - - if (JSON_HEDLEY_LIKELY(current != std::char_traits::eof())) - { - JSON_ASSERT(!token_string.empty()); - token_string.pop_back(); - } - } - - /// add a character to token_buffer - void add(char_int_type c) - { - token_buffer.push_back(static_cast(c)); - } - - public: - ///////////////////// - // value getters - ///////////////////// - - /// return integer value - constexpr number_integer_t get_number_integer() const noexcept - { - return value_integer; - } - - /// return unsigned integer value - constexpr number_unsigned_t get_number_unsigned() const noexcept - { - return value_unsigned; - } - - /// return floating-point value - constexpr number_float_t get_number_float() const noexcept - { - return value_float; - } - - /// return current string value (implicitly resets the token; useful only once) - string_t& get_string() - { - return token_buffer; - } - - ///////////////////// - // diagnostics - ///////////////////// - - /// return position of last read token - constexpr position_t get_position() const noexcept - { - return position; - } - - /// return the last read token (for errors only). Will never contain EOF - /// (an arbitrary value that is not a valid char value, often -1), because - /// 255 may legitimately occur. May contain NUL, which should be escaped. - std::string get_token_string() const - { - // escape control characters - std::string result; - for (const auto c : token_string) - { - if (static_cast(c) <= '\x1F') - { - // escape control characters - std::array cs{{}}; - (std::snprintf)(cs.data(), cs.size(), "", static_cast(c)); - result += cs.data(); - } - else - { - // add character as is - result.push_back(static_cast(c)); - } - } - - return result; - } - - /// return syntax error message - JSON_HEDLEY_RETURNS_NON_NULL - constexpr const char* get_error_message() const noexcept - { - return error_message; - } - - ///////////////////// - // actual scanner - ///////////////////// - - /*! - @brief skip the UTF-8 byte order mark - @return true iff there is no BOM or the correct BOM has been skipped - */ - bool skip_bom() - { - if (get() == 0xEF) - { - // check if we completely parse the BOM - return get() == 0xBB && get() == 0xBF; - } - - // the first character is not the beginning of the BOM; unget it to - // process is later - unget(); - return true; - } - - void skip_whitespace() - { - do - { - get(); - } - while (current == ' ' || current == '\t' || current == '\n' || current == '\r'); - } - - token_type scan() - { - // initially, skip the BOM - if (position.chars_read_total == 0 && !skip_bom()) - { - error_message = "invalid BOM; must be 0xEF 0xBB 0xBF if given"; - return token_type::parse_error; - } - - // read next character and ignore whitespace - skip_whitespace(); - - // ignore comments - while (ignore_comments && current == '/') - { - if (!scan_comment()) - { - return token_type::parse_error; - } - - // skip following whitespace - skip_whitespace(); - } - - switch (current) - { - // structural characters - case '[': - return token_type::begin_array; - case ']': - return token_type::end_array; - case '{': - return token_type::begin_object; - case '}': - return token_type::end_object; - case ':': - return token_type::name_separator; - case ',': - return token_type::value_separator; - - // literals - case 't': - { - std::array true_literal = {{'t', 'r', 'u', 'e'}}; - return scan_literal(true_literal.data(), true_literal.size(), token_type::literal_true); - } - case 'f': - { - std::array false_literal = {{'f', 'a', 'l', 's', 'e'}}; - return scan_literal(false_literal.data(), false_literal.size(), token_type::literal_false); - } - case 'n': - { - std::array null_literal = {{'n', 'u', 'l', 'l'}}; - return scan_literal(null_literal.data(), null_literal.size(), token_type::literal_null); - } - - // string - case '\"': - return scan_string(); - - // number - case '-': - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - return scan_number(); - - // end of input (the null byte is needed when parsing from - // string literals) - case '\0': - case std::char_traits::eof(): - return token_type::end_of_input; - - // error - default: - error_message = "invalid literal"; - return token_type::parse_error; - } - } - - private: - /// input adapter - InputAdapterType ia; - - /// whether comments should be ignored (true) or signaled as errors (false) - const bool ignore_comments = false; - - /// the current character - char_int_type current = std::char_traits::eof(); - - /// whether the next get() call should just return current - bool next_unget = false; - - /// the start position of the current token - position_t position {}; - - /// raw input token string (for error messages) - std::vector token_string {}; - - /// buffer for variable-length tokens (numbers, strings) - string_t token_buffer {}; - - /// a description of occurred lexer errors - const char* error_message = ""; - - // number values - number_integer_t value_integer = 0; - number_unsigned_t value_unsigned = 0; - number_float_t value_float = 0; - - /// the decimal point - const char_int_type decimal_point_char = '.'; -}; -} // namespace detail -} // namespace nlohmann - -// #include - -// #include - - -#include // size_t -#include // declval -#include // string - -// #include - -// #include - - -namespace nlohmann -{ -namespace detail -{ -template -using null_function_t = decltype(std::declval().null()); - -template -using boolean_function_t = - decltype(std::declval().boolean(std::declval())); - -template -using number_integer_function_t = - decltype(std::declval().number_integer(std::declval())); - -template -using number_unsigned_function_t = - decltype(std::declval().number_unsigned(std::declval())); - -template -using number_float_function_t = decltype(std::declval().number_float( - std::declval(), std::declval())); - -template -using string_function_t = - decltype(std::declval().string(std::declval())); - -template -using binary_function_t = - decltype(std::declval().binary(std::declval())); - -template -using start_object_function_t = - decltype(std::declval().start_object(std::declval())); - -template -using key_function_t = - decltype(std::declval().key(std::declval())); - -template -using end_object_function_t = decltype(std::declval().end_object()); - -template -using start_array_function_t = - decltype(std::declval().start_array(std::declval())); - -template -using end_array_function_t = decltype(std::declval().end_array()); - -template -using parse_error_function_t = decltype(std::declval().parse_error( - std::declval(), std::declval(), - std::declval())); - -template -struct is_sax -{ - private: - static_assert(is_basic_json::value, - "BasicJsonType must be of type basic_json<...>"); - - using number_integer_t = typename BasicJsonType::number_integer_t; - using number_unsigned_t = typename BasicJsonType::number_unsigned_t; - using number_float_t = typename BasicJsonType::number_float_t; - using string_t = typename BasicJsonType::string_t; - using binary_t = typename BasicJsonType::binary_t; - using exception_t = typename BasicJsonType::exception; - - public: - static constexpr bool value = - is_detected_exact::value && - is_detected_exact::value && - is_detected_exact::value && - is_detected_exact::value && - is_detected_exact::value && - is_detected_exact::value && - is_detected_exact::value && - is_detected_exact::value && - is_detected_exact::value && - is_detected_exact::value && - is_detected_exact::value && - is_detected_exact::value && - is_detected_exact::value; -}; - -template -struct is_sax_static_asserts -{ - private: - static_assert(is_basic_json::value, - "BasicJsonType must be of type basic_json<...>"); - - using number_integer_t = typename BasicJsonType::number_integer_t; - using number_unsigned_t = typename BasicJsonType::number_unsigned_t; - using number_float_t = typename BasicJsonType::number_float_t; - using string_t = typename BasicJsonType::string_t; - using binary_t = typename BasicJsonType::binary_t; - using exception_t = typename BasicJsonType::exception; - - public: - static_assert(is_detected_exact::value, - "Missing/invalid function: bool null()"); - static_assert(is_detected_exact::value, - "Missing/invalid function: bool boolean(bool)"); - static_assert(is_detected_exact::value, - "Missing/invalid function: bool boolean(bool)"); - static_assert( - is_detected_exact::value, - "Missing/invalid function: bool number_integer(number_integer_t)"); - static_assert( - is_detected_exact::value, - "Missing/invalid function: bool number_unsigned(number_unsigned_t)"); - static_assert(is_detected_exact::value, - "Missing/invalid function: bool number_float(number_float_t, const string_t&)"); - static_assert( - is_detected_exact::value, - "Missing/invalid function: bool string(string_t&)"); - static_assert( - is_detected_exact::value, - "Missing/invalid function: bool binary(binary_t&)"); - static_assert(is_detected_exact::value, - "Missing/invalid function: bool start_object(std::size_t)"); - static_assert(is_detected_exact::value, - "Missing/invalid function: bool key(string_t&)"); - static_assert(is_detected_exact::value, - "Missing/invalid function: bool end_object()"); - static_assert(is_detected_exact::value, - "Missing/invalid function: bool start_array(std::size_t)"); - static_assert(is_detected_exact::value, - "Missing/invalid function: bool end_array()"); - static_assert( - is_detected_exact::value, - "Missing/invalid function: bool parse_error(std::size_t, const " - "std::string&, const exception&)"); -}; -} // namespace detail -} // namespace nlohmann - -// #include - - -namespace nlohmann -{ -namespace detail -{ - -/// how to treat CBOR tags -enum class cbor_tag_handler_t -{ - error, ///< throw a parse_error exception in case of a tag - ignore ///< ignore tags -}; - -/*! -@brief determine system byte order - -@return true if and only if system's byte order is little endian - -@note from https://stackoverflow.com/a/1001328/266378 -*/ -static inline bool little_endianess(int num = 1) noexcept -{ - return *reinterpret_cast(&num) == 1; -} - - -/////////////////// -// binary reader // -/////////////////// - -/*! -@brief deserialization of CBOR, MessagePack, and UBJSON values -*/ -template> -class binary_reader -{ - using number_integer_t = typename BasicJsonType::number_integer_t; - using number_unsigned_t = typename BasicJsonType::number_unsigned_t; - using number_float_t = typename BasicJsonType::number_float_t; - using string_t = typename BasicJsonType::string_t; - using binary_t = typename BasicJsonType::binary_t; - using json_sax_t = SAX; - using char_type = typename InputAdapterType::char_type; - using char_int_type = typename std::char_traits::int_type; - - public: - /*! - @brief create a binary reader - - @param[in] adapter input adapter to read from - */ - explicit binary_reader(InputAdapterType&& adapter) : ia(std::move(adapter)) - { - (void)detail::is_sax_static_asserts {}; - } - - // make class move-only - binary_reader(const binary_reader&) = delete; - binary_reader(binary_reader&&) = default; - binary_reader& operator=(const binary_reader&) = delete; - binary_reader& operator=(binary_reader&&) = default; - ~binary_reader() = default; - - /*! - @param[in] format the binary format to parse - @param[in] sax_ a SAX event processor - @param[in] strict whether to expect the input to be consumed completed - @param[in] tag_handler how to treat CBOR tags - - @return - */ - JSON_HEDLEY_NON_NULL(3) - bool sax_parse(const input_format_t format, - json_sax_t* sax_, - const bool strict = true, - const cbor_tag_handler_t tag_handler = cbor_tag_handler_t::error) - { - sax = sax_; - bool result = false; - - switch (format) - { - case input_format_t::bson: - result = parse_bson_internal(); - break; - - case input_format_t::cbor: - result = parse_cbor_internal(true, tag_handler); - break; - - case input_format_t::msgpack: - result = parse_msgpack_internal(); - break; - - case input_format_t::ubjson: - result = parse_ubjson_internal(); - break; - - default: // LCOV_EXCL_LINE - JSON_ASSERT(false); // LCOV_EXCL_LINE - } - - // strict mode: next byte must be EOF - if (result && strict) - { - if (format == input_format_t::ubjson) - { - get_ignore_noop(); - } - else - { - get(); - } - - if (JSON_HEDLEY_UNLIKELY(current != std::char_traits::eof())) - { - return sax->parse_error(chars_read, get_token_string(), - parse_error::create(110, chars_read, exception_message(format, "expected end of input; last byte: 0x" + get_token_string(), "value"))); - } - } - - return result; - } - - private: - ////////// - // BSON // - ////////// - - /*! - @brief Reads in a BSON-object and passes it to the SAX-parser. - @return whether a valid BSON-value was passed to the SAX parser - */ - bool parse_bson_internal() - { - std::int32_t document_size{}; - get_number(input_format_t::bson, document_size); - - if (JSON_HEDLEY_UNLIKELY(!sax->start_object(std::size_t(-1)))) - { - return false; - } - - if (JSON_HEDLEY_UNLIKELY(!parse_bson_element_list(/*is_array*/false))) - { - return false; - } - - return sax->end_object(); - } - - /*! - @brief Parses a C-style string from the BSON input. - @param[in, out] result A reference to the string variable where the read - string is to be stored. - @return `true` if the \x00-byte indicating the end of the string was - encountered before the EOF; false` indicates an unexpected EOF. - */ - bool get_bson_cstr(string_t& result) - { - auto out = std::back_inserter(result); - while (true) - { - get(); - if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format_t::bson, "cstring"))) - { - return false; - } - if (current == 0x00) - { - return true; - } - *out++ = static_cast(current); - } - } - - /*! - @brief Parses a zero-terminated string of length @a len from the BSON - input. - @param[in] len The length (including the zero-byte at the end) of the - string to be read. - @param[in, out] result A reference to the string variable where the read - string is to be stored. - @tparam NumberType The type of the length @a len - @pre len >= 1 - @return `true` if the string was successfully parsed - */ - template - bool get_bson_string(const NumberType len, string_t& result) - { - if (JSON_HEDLEY_UNLIKELY(len < 1)) - { - auto last_token = get_token_string(); - return sax->parse_error(chars_read, last_token, parse_error::create(112, chars_read, exception_message(input_format_t::bson, "string length must be at least 1, is " + std::to_string(len), "string"))); - } - - return get_string(input_format_t::bson, len - static_cast(1), result) && get() != std::char_traits::eof(); - } - - /*! - @brief Parses a byte array input of length @a len from the BSON input. - @param[in] len The length of the byte array to be read. - @param[in, out] result A reference to the binary variable where the read - array is to be stored. - @tparam NumberType The type of the length @a len - @pre len >= 0 - @return `true` if the byte array was successfully parsed - */ - template - bool get_bson_binary(const NumberType len, binary_t& result) - { - if (JSON_HEDLEY_UNLIKELY(len < 0)) - { - auto last_token = get_token_string(); - return sax->parse_error(chars_read, last_token, parse_error::create(112, chars_read, exception_message(input_format_t::bson, "byte array length cannot be negative, is " + std::to_string(len), "binary"))); - } - - // All BSON binary values have a subtype - std::uint8_t subtype{}; - get_number(input_format_t::bson, subtype); - result.set_subtype(subtype); - - return get_binary(input_format_t::bson, len, result); - } - - /*! - @brief Read a BSON document element of the given @a element_type. - @param[in] element_type The BSON element type, c.f. http://bsonspec.org/spec.html - @param[in] element_type_parse_position The position in the input stream, - where the `element_type` was read. - @warning Not all BSON element types are supported yet. An unsupported - @a element_type will give rise to a parse_error.114: - Unsupported BSON record type 0x... - @return whether a valid BSON-object/array was passed to the SAX parser - */ - bool parse_bson_element_internal(const char_int_type element_type, - const std::size_t element_type_parse_position) - { - switch (element_type) - { - case 0x01: // double - { - double number{}; - return get_number(input_format_t::bson, number) && sax->number_float(static_cast(number), ""); - } - - case 0x02: // string - { - std::int32_t len{}; - string_t value; - return get_number(input_format_t::bson, len) && get_bson_string(len, value) && sax->string(value); - } - - case 0x03: // object - { - return parse_bson_internal(); - } - - case 0x04: // array - { - return parse_bson_array(); - } - - case 0x05: // binary - { - std::int32_t len{}; - binary_t value; - return get_number(input_format_t::bson, len) && get_bson_binary(len, value) && sax->binary(value); - } - - case 0x08: // boolean - { - return sax->boolean(get() != 0); - } - - case 0x0A: // null - { - return sax->null(); - } - - case 0x10: // int32 - { - std::int32_t value{}; - return get_number(input_format_t::bson, value) && sax->number_integer(value); - } - - case 0x12: // int64 - { - std::int64_t value{}; - return get_number(input_format_t::bson, value) && sax->number_integer(value); - } - - default: // anything else not supported (yet) - { - std::array cr{{}}; - (std::snprintf)(cr.data(), cr.size(), "%.2hhX", static_cast(element_type)); - return sax->parse_error(element_type_parse_position, std::string(cr.data()), parse_error::create(114, element_type_parse_position, "Unsupported BSON record type 0x" + std::string(cr.data()))); - } - } - } - - /*! - @brief Read a BSON element list (as specified in the BSON-spec) - - The same binary layout is used for objects and arrays, hence it must be - indicated with the argument @a is_array which one is expected - (true --> array, false --> object). - - @param[in] is_array Determines if the element list being read is to be - treated as an object (@a is_array == false), or as an - array (@a is_array == true). - @return whether a valid BSON-object/array was passed to the SAX parser - */ - bool parse_bson_element_list(const bool is_array) - { - string_t key; - - while (auto element_type = get()) - { - if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format_t::bson, "element list"))) - { - return false; - } - - const std::size_t element_type_parse_position = chars_read; - if (JSON_HEDLEY_UNLIKELY(!get_bson_cstr(key))) - { - return false; - } - - if (!is_array && !sax->key(key)) - { - return false; - } - - if (JSON_HEDLEY_UNLIKELY(!parse_bson_element_internal(element_type, element_type_parse_position))) - { - return false; - } - - // get_bson_cstr only appends - key.clear(); - } - - return true; - } - - /*! - @brief Reads an array from the BSON input and passes it to the SAX-parser. - @return whether a valid BSON-array was passed to the SAX parser - */ - bool parse_bson_array() - { - std::int32_t document_size{}; - get_number(input_format_t::bson, document_size); - - if (JSON_HEDLEY_UNLIKELY(!sax->start_array(std::size_t(-1)))) - { - return false; - } - - if (JSON_HEDLEY_UNLIKELY(!parse_bson_element_list(/*is_array*/true))) - { - return false; - } - - return sax->end_array(); - } - - ////////// - // CBOR // - ////////// - - /*! - @param[in] get_char whether a new character should be retrieved from the - input (true) or whether the last read character should - be considered instead (false) - @param[in] tag_handler how CBOR tags should be treated - - @return whether a valid CBOR value was passed to the SAX parser - */ - bool parse_cbor_internal(const bool get_char, - const cbor_tag_handler_t tag_handler) - { - switch (get_char ? get() : current) - { - // EOF - case std::char_traits::eof(): - return unexpect_eof(input_format_t::cbor, "value"); - - // Integer 0x00..0x17 (0..23) - case 0x00: - case 0x01: - case 0x02: - case 0x03: - case 0x04: - case 0x05: - case 0x06: - case 0x07: - case 0x08: - case 0x09: - case 0x0A: - case 0x0B: - case 0x0C: - case 0x0D: - case 0x0E: - case 0x0F: - case 0x10: - case 0x11: - case 0x12: - case 0x13: - case 0x14: - case 0x15: - case 0x16: - case 0x17: - return sax->number_unsigned(static_cast(current)); - - case 0x18: // Unsigned integer (one-byte uint8_t follows) - { - std::uint8_t number{}; - return get_number(input_format_t::cbor, number) && sax->number_unsigned(number); - } - - case 0x19: // Unsigned integer (two-byte uint16_t follows) - { - std::uint16_t number{}; - return get_number(input_format_t::cbor, number) && sax->number_unsigned(number); - } - - case 0x1A: // Unsigned integer (four-byte uint32_t follows) - { - std::uint32_t number{}; - return get_number(input_format_t::cbor, number) && sax->number_unsigned(number); - } - - case 0x1B: // Unsigned integer (eight-byte uint64_t follows) - { - std::uint64_t number{}; - return get_number(input_format_t::cbor, number) && sax->number_unsigned(number); - } - - // Negative integer -1-0x00..-1-0x17 (-1..-24) - case 0x20: - case 0x21: - case 0x22: - case 0x23: - case 0x24: - case 0x25: - case 0x26: - case 0x27: - case 0x28: - case 0x29: - case 0x2A: - case 0x2B: - case 0x2C: - case 0x2D: - case 0x2E: - case 0x2F: - case 0x30: - case 0x31: - case 0x32: - case 0x33: - case 0x34: - case 0x35: - case 0x36: - case 0x37: - return sax->number_integer(static_cast(0x20 - 1 - current)); - - case 0x38: // Negative integer (one-byte uint8_t follows) - { - std::uint8_t number{}; - return get_number(input_format_t::cbor, number) && sax->number_integer(static_cast(-1) - number); - } - - case 0x39: // Negative integer -1-n (two-byte uint16_t follows) - { - std::uint16_t number{}; - return get_number(input_format_t::cbor, number) && sax->number_integer(static_cast(-1) - number); - } - - case 0x3A: // Negative integer -1-n (four-byte uint32_t follows) - { - std::uint32_t number{}; - return get_number(input_format_t::cbor, number) && sax->number_integer(static_cast(-1) - number); - } - - case 0x3B: // Negative integer -1-n (eight-byte uint64_t follows) - { - std::uint64_t number{}; - return get_number(input_format_t::cbor, number) && sax->number_integer(static_cast(-1) - - static_cast(number)); - } - - // Binary data (0x00..0x17 bytes follow) - case 0x40: - case 0x41: - case 0x42: - case 0x43: - case 0x44: - case 0x45: - case 0x46: - case 0x47: - case 0x48: - case 0x49: - case 0x4A: - case 0x4B: - case 0x4C: - case 0x4D: - case 0x4E: - case 0x4F: - case 0x50: - case 0x51: - case 0x52: - case 0x53: - case 0x54: - case 0x55: - case 0x56: - case 0x57: - case 0x58: // Binary data (one-byte uint8_t for n follows) - case 0x59: // Binary data (two-byte uint16_t for n follow) - case 0x5A: // Binary data (four-byte uint32_t for n follow) - case 0x5B: // Binary data (eight-byte uint64_t for n follow) - case 0x5F: // Binary data (indefinite length) - { - binary_t b; - return get_cbor_binary(b) && sax->binary(b); - } - - // UTF-8 string (0x00..0x17 bytes follow) - case 0x60: - case 0x61: - case 0x62: - case 0x63: - case 0x64: - case 0x65: - case 0x66: - case 0x67: - case 0x68: - case 0x69: - case 0x6A: - case 0x6B: - case 0x6C: - case 0x6D: - case 0x6E: - case 0x6F: - case 0x70: - case 0x71: - case 0x72: - case 0x73: - case 0x74: - case 0x75: - case 0x76: - case 0x77: - case 0x78: // UTF-8 string (one-byte uint8_t for n follows) - case 0x79: // UTF-8 string (two-byte uint16_t for n follow) - case 0x7A: // UTF-8 string (four-byte uint32_t for n follow) - case 0x7B: // UTF-8 string (eight-byte uint64_t for n follow) - case 0x7F: // UTF-8 string (indefinite length) - { - string_t s; - return get_cbor_string(s) && sax->string(s); - } - - // array (0x00..0x17 data items follow) - case 0x80: - case 0x81: - case 0x82: - case 0x83: - case 0x84: - case 0x85: - case 0x86: - case 0x87: - case 0x88: - case 0x89: - case 0x8A: - case 0x8B: - case 0x8C: - case 0x8D: - case 0x8E: - case 0x8F: - case 0x90: - case 0x91: - case 0x92: - case 0x93: - case 0x94: - case 0x95: - case 0x96: - case 0x97: - return get_cbor_array(static_cast(static_cast(current) & 0x1Fu), tag_handler); - - case 0x98: // array (one-byte uint8_t for n follows) - { - std::uint8_t len{}; - return get_number(input_format_t::cbor, len) && get_cbor_array(static_cast(len), tag_handler); - } - - case 0x99: // array (two-byte uint16_t for n follow) - { - std::uint16_t len{}; - return get_number(input_format_t::cbor, len) && get_cbor_array(static_cast(len), tag_handler); - } - - case 0x9A: // array (four-byte uint32_t for n follow) - { - std::uint32_t len{}; - return get_number(input_format_t::cbor, len) && get_cbor_array(static_cast(len), tag_handler); - } - - case 0x9B: // array (eight-byte uint64_t for n follow) - { - std::uint64_t len{}; - return get_number(input_format_t::cbor, len) && get_cbor_array(static_cast(len), tag_handler); - } - - case 0x9F: // array (indefinite length) - return get_cbor_array(std::size_t(-1), tag_handler); - - // map (0x00..0x17 pairs of data items follow) - case 0xA0: - case 0xA1: - case 0xA2: - case 0xA3: - case 0xA4: - case 0xA5: - case 0xA6: - case 0xA7: - case 0xA8: - case 0xA9: - case 0xAA: - case 0xAB: - case 0xAC: - case 0xAD: - case 0xAE: - case 0xAF: - case 0xB0: - case 0xB1: - case 0xB2: - case 0xB3: - case 0xB4: - case 0xB5: - case 0xB6: - case 0xB7: - return get_cbor_object(static_cast(static_cast(current) & 0x1Fu), tag_handler); - - case 0xB8: // map (one-byte uint8_t for n follows) - { - std::uint8_t len{}; - return get_number(input_format_t::cbor, len) && get_cbor_object(static_cast(len), tag_handler); - } - - case 0xB9: // map (two-byte uint16_t for n follow) - { - std::uint16_t len{}; - return get_number(input_format_t::cbor, len) && get_cbor_object(static_cast(len), tag_handler); - } - - case 0xBA: // map (four-byte uint32_t for n follow) - { - std::uint32_t len{}; - return get_number(input_format_t::cbor, len) && get_cbor_object(static_cast(len), tag_handler); - } - - case 0xBB: // map (eight-byte uint64_t for n follow) - { - std::uint64_t len{}; - return get_number(input_format_t::cbor, len) && get_cbor_object(static_cast(len), tag_handler); - } - - case 0xBF: // map (indefinite length) - return get_cbor_object(std::size_t(-1), tag_handler); - - case 0xC6: // tagged item - case 0xC7: - case 0xC8: - case 0xC9: - case 0xCA: - case 0xCB: - case 0xCC: - case 0xCD: - case 0xCE: - case 0xCF: - case 0xD0: - case 0xD1: - case 0xD2: - case 0xD3: - case 0xD4: - case 0xD8: // tagged item (1 bytes follow) - case 0xD9: // tagged item (2 bytes follow) - case 0xDA: // tagged item (4 bytes follow) - case 0xDB: // tagged item (8 bytes follow) - { - switch (tag_handler) - { - case cbor_tag_handler_t::error: - { - auto last_token = get_token_string(); - return sax->parse_error(chars_read, last_token, parse_error::create(112, chars_read, exception_message(input_format_t::cbor, "invalid byte: 0x" + last_token, "value"))); - } - - case cbor_tag_handler_t::ignore: - { - switch (current) - { - case 0xD8: - { - std::uint8_t len{}; - get_number(input_format_t::cbor, len); - break; - } - case 0xD9: - { - std::uint16_t len{}; - get_number(input_format_t::cbor, len); - break; - } - case 0xDA: - { - std::uint32_t len{}; - get_number(input_format_t::cbor, len); - break; - } - case 0xDB: - { - std::uint64_t len{}; - get_number(input_format_t::cbor, len); - break; - } - default: - break; - } - return parse_cbor_internal(true, tag_handler); - } - - default: // LCOV_EXCL_LINE - JSON_ASSERT(false); // LCOV_EXCL_LINE - } - } - - case 0xF4: // false - return sax->boolean(false); - - case 0xF5: // true - return sax->boolean(true); - - case 0xF6: // null - return sax->null(); - - case 0xF9: // Half-Precision Float (two-byte IEEE 754) - { - const auto byte1_raw = get(); - if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format_t::cbor, "number"))) - { - return false; - } - const auto byte2_raw = get(); - if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format_t::cbor, "number"))) - { - return false; - } - - const auto byte1 = static_cast(byte1_raw); - const auto byte2 = static_cast(byte2_raw); - - // code from RFC 7049, Appendix D, Figure 3: - // As half-precision floating-point numbers were only added - // to IEEE 754 in 2008, today's programming platforms often - // still only have limited support for them. It is very - // easy to include at least decoding support for them even - // without such support. An example of a small decoder for - // half-precision floating-point numbers in the C language - // is shown in Fig. 3. - const auto half = static_cast((byte1 << 8u) + byte2); - const double val = [&half] - { - const int exp = (half >> 10u) & 0x1Fu; - const unsigned int mant = half & 0x3FFu; - JSON_ASSERT(0 <= exp&& exp <= 32); - JSON_ASSERT(mant <= 1024); - switch (exp) - { - case 0: - return std::ldexp(mant, -24); - case 31: - return (mant == 0) - ? std::numeric_limits::infinity() - : std::numeric_limits::quiet_NaN(); - default: - return std::ldexp(mant + 1024, exp - 25); - } - }(); - return sax->number_float((half & 0x8000u) != 0 - ? static_cast(-val) - : static_cast(val), ""); - } - - case 0xFA: // Single-Precision Float (four-byte IEEE 754) - { - float number{}; - return get_number(input_format_t::cbor, number) && sax->number_float(static_cast(number), ""); - } - - case 0xFB: // Double-Precision Float (eight-byte IEEE 754) - { - double number{}; - return get_number(input_format_t::cbor, number) && sax->number_float(static_cast(number), ""); - } - - default: // anything else (0xFF is handled inside the other types) - { - auto last_token = get_token_string(); - return sax->parse_error(chars_read, last_token, parse_error::create(112, chars_read, exception_message(input_format_t::cbor, "invalid byte: 0x" + last_token, "value"))); - } - } - } - - /*! - @brief reads a CBOR string - - This function first reads starting bytes to determine the expected - string length and then copies this number of bytes into a string. - Additionally, CBOR's strings with indefinite lengths are supported. - - @param[out] result created string - - @return whether string creation completed - */ - bool get_cbor_string(string_t& result) - { - if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format_t::cbor, "string"))) - { - return false; - } - - switch (current) - { - // UTF-8 string (0x00..0x17 bytes follow) - case 0x60: - case 0x61: - case 0x62: - case 0x63: - case 0x64: - case 0x65: - case 0x66: - case 0x67: - case 0x68: - case 0x69: - case 0x6A: - case 0x6B: - case 0x6C: - case 0x6D: - case 0x6E: - case 0x6F: - case 0x70: - case 0x71: - case 0x72: - case 0x73: - case 0x74: - case 0x75: - case 0x76: - case 0x77: - { - return get_string(input_format_t::cbor, static_cast(current) & 0x1Fu, result); - } - - case 0x78: // UTF-8 string (one-byte uint8_t for n follows) - { - std::uint8_t len{}; - return get_number(input_format_t::cbor, len) && get_string(input_format_t::cbor, len, result); - } - - case 0x79: // UTF-8 string (two-byte uint16_t for n follow) - { - std::uint16_t len{}; - return get_number(input_format_t::cbor, len) && get_string(input_format_t::cbor, len, result); - } - - case 0x7A: // UTF-8 string (four-byte uint32_t for n follow) - { - std::uint32_t len{}; - return get_number(input_format_t::cbor, len) && get_string(input_format_t::cbor, len, result); - } - - case 0x7B: // UTF-8 string (eight-byte uint64_t for n follow) - { - std::uint64_t len{}; - return get_number(input_format_t::cbor, len) && get_string(input_format_t::cbor, len, result); - } - - case 0x7F: // UTF-8 string (indefinite length) - { - while (get() != 0xFF) - { - string_t chunk; - if (!get_cbor_string(chunk)) - { - return false; - } - result.append(chunk); - } - return true; - } - - default: - { - auto last_token = get_token_string(); - return sax->parse_error(chars_read, last_token, parse_error::create(113, chars_read, exception_message(input_format_t::cbor, "expected length specification (0x60-0x7B) or indefinite string type (0x7F); last byte: 0x" + last_token, "string"))); - } - } - } - - /*! - @brief reads a CBOR byte array - - This function first reads starting bytes to determine the expected - byte array length and then copies this number of bytes into the byte array. - Additionally, CBOR's byte arrays with indefinite lengths are supported. - - @param[out] result created byte array - - @return whether byte array creation completed - */ - bool get_cbor_binary(binary_t& result) - { - if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format_t::cbor, "binary"))) - { - return false; - } - - switch (current) - { - // Binary data (0x00..0x17 bytes follow) - case 0x40: - case 0x41: - case 0x42: - case 0x43: - case 0x44: - case 0x45: - case 0x46: - case 0x47: - case 0x48: - case 0x49: - case 0x4A: - case 0x4B: - case 0x4C: - case 0x4D: - case 0x4E: - case 0x4F: - case 0x50: - case 0x51: - case 0x52: - case 0x53: - case 0x54: - case 0x55: - case 0x56: - case 0x57: - { - return get_binary(input_format_t::cbor, static_cast(current) & 0x1Fu, result); - } - - case 0x58: // Binary data (one-byte uint8_t for n follows) - { - std::uint8_t len{}; - return get_number(input_format_t::cbor, len) && - get_binary(input_format_t::cbor, len, result); - } - - case 0x59: // Binary data (two-byte uint16_t for n follow) - { - std::uint16_t len{}; - return get_number(input_format_t::cbor, len) && - get_binary(input_format_t::cbor, len, result); - } - - case 0x5A: // Binary data (four-byte uint32_t for n follow) - { - std::uint32_t len{}; - return get_number(input_format_t::cbor, len) && - get_binary(input_format_t::cbor, len, result); - } - - case 0x5B: // Binary data (eight-byte uint64_t for n follow) - { - std::uint64_t len{}; - return get_number(input_format_t::cbor, len) && - get_binary(input_format_t::cbor, len, result); - } - - case 0x5F: // Binary data (indefinite length) - { - while (get() != 0xFF) - { - binary_t chunk; - if (!get_cbor_binary(chunk)) - { - return false; - } - result.insert(result.end(), chunk.begin(), chunk.end()); - } - return true; - } - - default: - { - auto last_token = get_token_string(); - return sax->parse_error(chars_read, last_token, parse_error::create(113, chars_read, exception_message(input_format_t::cbor, "expected length specification (0x40-0x5B) or indefinite binary array type (0x5F); last byte: 0x" + last_token, "binary"))); - } - } - } - - /*! - @param[in] len the length of the array or std::size_t(-1) for an - array of indefinite size - @param[in] tag_handler how CBOR tags should be treated - @return whether array creation completed - */ - bool get_cbor_array(const std::size_t len, - const cbor_tag_handler_t tag_handler) - { - if (JSON_HEDLEY_UNLIKELY(!sax->start_array(len))) - { - return false; - } - - if (len != std::size_t(-1)) - { - for (std::size_t i = 0; i < len; ++i) - { - if (JSON_HEDLEY_UNLIKELY(!parse_cbor_internal(true, tag_handler))) - { - return false; - } - } - } - else - { - while (get() != 0xFF) - { - if (JSON_HEDLEY_UNLIKELY(!parse_cbor_internal(false, tag_handler))) - { - return false; - } - } - } - - return sax->end_array(); - } - - /*! - @param[in] len the length of the object or std::size_t(-1) for an - object of indefinite size - @param[in] tag_handler how CBOR tags should be treated - @return whether object creation completed - */ - bool get_cbor_object(const std::size_t len, - const cbor_tag_handler_t tag_handler) - { - if (JSON_HEDLEY_UNLIKELY(!sax->start_object(len))) - { - return false; - } - - string_t key; - if (len != std::size_t(-1)) - { - for (std::size_t i = 0; i < len; ++i) - { - get(); - if (JSON_HEDLEY_UNLIKELY(!get_cbor_string(key) || !sax->key(key))) - { - return false; - } - - if (JSON_HEDLEY_UNLIKELY(!parse_cbor_internal(true, tag_handler))) - { - return false; - } - key.clear(); - } - } - else - { - while (get() != 0xFF) - { - if (JSON_HEDLEY_UNLIKELY(!get_cbor_string(key) || !sax->key(key))) - { - return false; - } - - if (JSON_HEDLEY_UNLIKELY(!parse_cbor_internal(true, tag_handler))) - { - return false; - } - key.clear(); - } - } - - return sax->end_object(); - } - - ///////////// - // MsgPack // - ///////////// - - /*! - @return whether a valid MessagePack value was passed to the SAX parser - */ - bool parse_msgpack_internal() - { - switch (get()) - { - // EOF - case std::char_traits::eof(): - return unexpect_eof(input_format_t::msgpack, "value"); - - // positive fixint - case 0x00: - case 0x01: - case 0x02: - case 0x03: - case 0x04: - case 0x05: - case 0x06: - case 0x07: - case 0x08: - case 0x09: - case 0x0A: - case 0x0B: - case 0x0C: - case 0x0D: - case 0x0E: - case 0x0F: - case 0x10: - case 0x11: - case 0x12: - case 0x13: - case 0x14: - case 0x15: - case 0x16: - case 0x17: - case 0x18: - case 0x19: - case 0x1A: - case 0x1B: - case 0x1C: - case 0x1D: - case 0x1E: - case 0x1F: - case 0x20: - case 0x21: - case 0x22: - case 0x23: - case 0x24: - case 0x25: - case 0x26: - case 0x27: - case 0x28: - case 0x29: - case 0x2A: - case 0x2B: - case 0x2C: - case 0x2D: - case 0x2E: - case 0x2F: - case 0x30: - case 0x31: - case 0x32: - case 0x33: - case 0x34: - case 0x35: - case 0x36: - case 0x37: - case 0x38: - case 0x39: - case 0x3A: - case 0x3B: - case 0x3C: - case 0x3D: - case 0x3E: - case 0x3F: - case 0x40: - case 0x41: - case 0x42: - case 0x43: - case 0x44: - case 0x45: - case 0x46: - case 0x47: - case 0x48: - case 0x49: - case 0x4A: - case 0x4B: - case 0x4C: - case 0x4D: - case 0x4E: - case 0x4F: - case 0x50: - case 0x51: - case 0x52: - case 0x53: - case 0x54: - case 0x55: - case 0x56: - case 0x57: - case 0x58: - case 0x59: - case 0x5A: - case 0x5B: - case 0x5C: - case 0x5D: - case 0x5E: - case 0x5F: - case 0x60: - case 0x61: - case 0x62: - case 0x63: - case 0x64: - case 0x65: - case 0x66: - case 0x67: - case 0x68: - case 0x69: - case 0x6A: - case 0x6B: - case 0x6C: - case 0x6D: - case 0x6E: - case 0x6F: - case 0x70: - case 0x71: - case 0x72: - case 0x73: - case 0x74: - case 0x75: - case 0x76: - case 0x77: - case 0x78: - case 0x79: - case 0x7A: - case 0x7B: - case 0x7C: - case 0x7D: - case 0x7E: - case 0x7F: - return sax->number_unsigned(static_cast(current)); - - // fixmap - case 0x80: - case 0x81: - case 0x82: - case 0x83: - case 0x84: - case 0x85: - case 0x86: - case 0x87: - case 0x88: - case 0x89: - case 0x8A: - case 0x8B: - case 0x8C: - case 0x8D: - case 0x8E: - case 0x8F: - return get_msgpack_object(static_cast(static_cast(current) & 0x0Fu)); - - // fixarray - case 0x90: - case 0x91: - case 0x92: - case 0x93: - case 0x94: - case 0x95: - case 0x96: - case 0x97: - case 0x98: - case 0x99: - case 0x9A: - case 0x9B: - case 0x9C: - case 0x9D: - case 0x9E: - case 0x9F: - return get_msgpack_array(static_cast(static_cast(current) & 0x0Fu)); - - // fixstr - case 0xA0: - case 0xA1: - case 0xA2: - case 0xA3: - case 0xA4: - case 0xA5: - case 0xA6: - case 0xA7: - case 0xA8: - case 0xA9: - case 0xAA: - case 0xAB: - case 0xAC: - case 0xAD: - case 0xAE: - case 0xAF: - case 0xB0: - case 0xB1: - case 0xB2: - case 0xB3: - case 0xB4: - case 0xB5: - case 0xB6: - case 0xB7: - case 0xB8: - case 0xB9: - case 0xBA: - case 0xBB: - case 0xBC: - case 0xBD: - case 0xBE: - case 0xBF: - case 0xD9: // str 8 - case 0xDA: // str 16 - case 0xDB: // str 32 - { - string_t s; - return get_msgpack_string(s) && sax->string(s); - } - - case 0xC0: // nil - return sax->null(); - - case 0xC2: // false - return sax->boolean(false); - - case 0xC3: // true - return sax->boolean(true); - - case 0xC4: // bin 8 - case 0xC5: // bin 16 - case 0xC6: // bin 32 - case 0xC7: // ext 8 - case 0xC8: // ext 16 - case 0xC9: // ext 32 - case 0xD4: // fixext 1 - case 0xD5: // fixext 2 - case 0xD6: // fixext 4 - case 0xD7: // fixext 8 - case 0xD8: // fixext 16 - { - binary_t b; - return get_msgpack_binary(b) && sax->binary(b); - } - - case 0xCA: // float 32 - { - float number{}; - return get_number(input_format_t::msgpack, number) && sax->number_float(static_cast(number), ""); - } - - case 0xCB: // float 64 - { - double number{}; - return get_number(input_format_t::msgpack, number) && sax->number_float(static_cast(number), ""); - } - - case 0xCC: // uint 8 - { - std::uint8_t number{}; - return get_number(input_format_t::msgpack, number) && sax->number_unsigned(number); - } - - case 0xCD: // uint 16 - { - std::uint16_t number{}; - return get_number(input_format_t::msgpack, number) && sax->number_unsigned(number); - } - - case 0xCE: // uint 32 - { - std::uint32_t number{}; - return get_number(input_format_t::msgpack, number) && sax->number_unsigned(number); - } - - case 0xCF: // uint 64 - { - std::uint64_t number{}; - return get_number(input_format_t::msgpack, number) && sax->number_unsigned(number); - } - - case 0xD0: // int 8 - { - std::int8_t number{}; - return get_number(input_format_t::msgpack, number) && sax->number_integer(number); - } - - case 0xD1: // int 16 - { - std::int16_t number{}; - return get_number(input_format_t::msgpack, number) && sax->number_integer(number); - } - - case 0xD2: // int 32 - { - std::int32_t number{}; - return get_number(input_format_t::msgpack, number) && sax->number_integer(number); - } - - case 0xD3: // int 64 - { - std::int64_t number{}; - return get_number(input_format_t::msgpack, number) && sax->number_integer(number); - } - - case 0xDC: // array 16 - { - std::uint16_t len{}; - return get_number(input_format_t::msgpack, len) && get_msgpack_array(static_cast(len)); - } - - case 0xDD: // array 32 - { - std::uint32_t len{}; - return get_number(input_format_t::msgpack, len) && get_msgpack_array(static_cast(len)); - } - - case 0xDE: // map 16 - { - std::uint16_t len{}; - return get_number(input_format_t::msgpack, len) && get_msgpack_object(static_cast(len)); - } - - case 0xDF: // map 32 - { - std::uint32_t len{}; - return get_number(input_format_t::msgpack, len) && get_msgpack_object(static_cast(len)); - } - - // negative fixint - case 0xE0: - case 0xE1: - case 0xE2: - case 0xE3: - case 0xE4: - case 0xE5: - case 0xE6: - case 0xE7: - case 0xE8: - case 0xE9: - case 0xEA: - case 0xEB: - case 0xEC: - case 0xED: - case 0xEE: - case 0xEF: - case 0xF0: - case 0xF1: - case 0xF2: - case 0xF3: - case 0xF4: - case 0xF5: - case 0xF6: - case 0xF7: - case 0xF8: - case 0xF9: - case 0xFA: - case 0xFB: - case 0xFC: - case 0xFD: - case 0xFE: - case 0xFF: - return sax->number_integer(static_cast(current)); - - default: // anything else - { - auto last_token = get_token_string(); - return sax->parse_error(chars_read, last_token, parse_error::create(112, chars_read, exception_message(input_format_t::msgpack, "invalid byte: 0x" + last_token, "value"))); - } - } - } - - /*! - @brief reads a MessagePack string - - This function first reads starting bytes to determine the expected - string length and then copies this number of bytes into a string. - - @param[out] result created string - - @return whether string creation completed - */ - bool get_msgpack_string(string_t& result) - { - if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format_t::msgpack, "string"))) - { - return false; - } - - switch (current) - { - // fixstr - case 0xA0: - case 0xA1: - case 0xA2: - case 0xA3: - case 0xA4: - case 0xA5: - case 0xA6: - case 0xA7: - case 0xA8: - case 0xA9: - case 0xAA: - case 0xAB: - case 0xAC: - case 0xAD: - case 0xAE: - case 0xAF: - case 0xB0: - case 0xB1: - case 0xB2: - case 0xB3: - case 0xB4: - case 0xB5: - case 0xB6: - case 0xB7: - case 0xB8: - case 0xB9: - case 0xBA: - case 0xBB: - case 0xBC: - case 0xBD: - case 0xBE: - case 0xBF: - { - return get_string(input_format_t::msgpack, static_cast(current) & 0x1Fu, result); - } - - case 0xD9: // str 8 - { - std::uint8_t len{}; - return get_number(input_format_t::msgpack, len) && get_string(input_format_t::msgpack, len, result); - } - - case 0xDA: // str 16 - { - std::uint16_t len{}; - return get_number(input_format_t::msgpack, len) && get_string(input_format_t::msgpack, len, result); - } - - case 0xDB: // str 32 - { - std::uint32_t len{}; - return get_number(input_format_t::msgpack, len) && get_string(input_format_t::msgpack, len, result); - } - - default: - { - auto last_token = get_token_string(); - return sax->parse_error(chars_read, last_token, parse_error::create(113, chars_read, exception_message(input_format_t::msgpack, "expected length specification (0xA0-0xBF, 0xD9-0xDB); last byte: 0x" + last_token, "string"))); - } - } - } - - /*! - @brief reads a MessagePack byte array - - This function first reads starting bytes to determine the expected - byte array length and then copies this number of bytes into a byte array. - - @param[out] result created byte array - - @return whether byte array creation completed - */ - bool get_msgpack_binary(binary_t& result) - { - // helper function to set the subtype - auto assign_and_return_true = [&result](std::int8_t subtype) - { - result.set_subtype(static_cast(subtype)); - return true; - }; - - switch (current) - { - case 0xC4: // bin 8 - { - std::uint8_t len{}; - return get_number(input_format_t::msgpack, len) && - get_binary(input_format_t::msgpack, len, result); - } - - case 0xC5: // bin 16 - { - std::uint16_t len{}; - return get_number(input_format_t::msgpack, len) && - get_binary(input_format_t::msgpack, len, result); - } - - case 0xC6: // bin 32 - { - std::uint32_t len{}; - return get_number(input_format_t::msgpack, len) && - get_binary(input_format_t::msgpack, len, result); - } - - case 0xC7: // ext 8 - { - std::uint8_t len{}; - std::int8_t subtype{}; - return get_number(input_format_t::msgpack, len) && - get_number(input_format_t::msgpack, subtype) && - get_binary(input_format_t::msgpack, len, result) && - assign_and_return_true(subtype); - } - - case 0xC8: // ext 16 - { - std::uint16_t len{}; - std::int8_t subtype{}; - return get_number(input_format_t::msgpack, len) && - get_number(input_format_t::msgpack, subtype) && - get_binary(input_format_t::msgpack, len, result) && - assign_and_return_true(subtype); - } - - case 0xC9: // ext 32 - { - std::uint32_t len{}; - std::int8_t subtype{}; - return get_number(input_format_t::msgpack, len) && - get_number(input_format_t::msgpack, subtype) && - get_binary(input_format_t::msgpack, len, result) && - assign_and_return_true(subtype); - } - - case 0xD4: // fixext 1 - { - std::int8_t subtype{}; - return get_number(input_format_t::msgpack, subtype) && - get_binary(input_format_t::msgpack, 1, result) && - assign_and_return_true(subtype); - } - - case 0xD5: // fixext 2 - { - std::int8_t subtype{}; - return get_number(input_format_t::msgpack, subtype) && - get_binary(input_format_t::msgpack, 2, result) && - assign_and_return_true(subtype); - } - - case 0xD6: // fixext 4 - { - std::int8_t subtype{}; - return get_number(input_format_t::msgpack, subtype) && - get_binary(input_format_t::msgpack, 4, result) && - assign_and_return_true(subtype); - } - - case 0xD7: // fixext 8 - { - std::int8_t subtype{}; - return get_number(input_format_t::msgpack, subtype) && - get_binary(input_format_t::msgpack, 8, result) && - assign_and_return_true(subtype); - } - - case 0xD8: // fixext 16 - { - std::int8_t subtype{}; - return get_number(input_format_t::msgpack, subtype) && - get_binary(input_format_t::msgpack, 16, result) && - assign_and_return_true(subtype); - } - - default: // LCOV_EXCL_LINE - return false; // LCOV_EXCL_LINE - } - } - - /*! - @param[in] len the length of the array - @return whether array creation completed - */ - bool get_msgpack_array(const std::size_t len) - { - if (JSON_HEDLEY_UNLIKELY(!sax->start_array(len))) - { - return false; - } - - for (std::size_t i = 0; i < len; ++i) - { - if (JSON_HEDLEY_UNLIKELY(!parse_msgpack_internal())) - { - return false; - } - } - - return sax->end_array(); - } - - /*! - @param[in] len the length of the object - @return whether object creation completed - */ - bool get_msgpack_object(const std::size_t len) - { - if (JSON_HEDLEY_UNLIKELY(!sax->start_object(len))) - { - return false; - } - - string_t key; - for (std::size_t i = 0; i < len; ++i) - { - get(); - if (JSON_HEDLEY_UNLIKELY(!get_msgpack_string(key) || !sax->key(key))) - { - return false; - } - - if (JSON_HEDLEY_UNLIKELY(!parse_msgpack_internal())) - { - return false; - } - key.clear(); - } - - return sax->end_object(); - } - - //////////// - // UBJSON // - //////////// - - /*! - @param[in] get_char whether a new character should be retrieved from the - input (true, default) or whether the last read - character should be considered instead - - @return whether a valid UBJSON value was passed to the SAX parser - */ - bool parse_ubjson_internal(const bool get_char = true) - { - return get_ubjson_value(get_char ? get_ignore_noop() : current); - } - - /*! - @brief reads a UBJSON string - - This function is either called after reading the 'S' byte explicitly - indicating a string, or in case of an object key where the 'S' byte can be - left out. - - @param[out] result created string - @param[in] get_char whether a new character should be retrieved from the - input (true, default) or whether the last read - character should be considered instead - - @return whether string creation completed - */ - bool get_ubjson_string(string_t& result, const bool get_char = true) - { - if (get_char) - { - get(); // TODO(niels): may we ignore N here? - } - - if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format_t::ubjson, "value"))) - { - return false; - } - - switch (current) - { - case 'U': - { - std::uint8_t len{}; - return get_number(input_format_t::ubjson, len) && get_string(input_format_t::ubjson, len, result); - } - - case 'i': - { - std::int8_t len{}; - return get_number(input_format_t::ubjson, len) && get_string(input_format_t::ubjson, len, result); - } - - case 'I': - { - std::int16_t len{}; - return get_number(input_format_t::ubjson, len) && get_string(input_format_t::ubjson, len, result); - } - - case 'l': - { - std::int32_t len{}; - return get_number(input_format_t::ubjson, len) && get_string(input_format_t::ubjson, len, result); - } - - case 'L': - { - std::int64_t len{}; - return get_number(input_format_t::ubjson, len) && get_string(input_format_t::ubjson, len, result); - } - - default: - auto last_token = get_token_string(); - return sax->parse_error(chars_read, last_token, parse_error::create(113, chars_read, exception_message(input_format_t::ubjson, "expected length type specification (U, i, I, l, L); last byte: 0x" + last_token, "string"))); - } - } - - /*! - @param[out] result determined size - @return whether size determination completed - */ - bool get_ubjson_size_value(std::size_t& result) - { - switch (get_ignore_noop()) - { - case 'U': - { - std::uint8_t number{}; - if (JSON_HEDLEY_UNLIKELY(!get_number(input_format_t::ubjson, number))) - { - return false; - } - result = static_cast(number); - return true; - } - - case 'i': - { - std::int8_t number{}; - if (JSON_HEDLEY_UNLIKELY(!get_number(input_format_t::ubjson, number))) - { - return false; - } - result = static_cast(number); - return true; - } - - case 'I': - { - std::int16_t number{}; - if (JSON_HEDLEY_UNLIKELY(!get_number(input_format_t::ubjson, number))) - { - return false; - } - result = static_cast(number); - return true; - } - - case 'l': - { - std::int32_t number{}; - if (JSON_HEDLEY_UNLIKELY(!get_number(input_format_t::ubjson, number))) - { - return false; - } - result = static_cast(number); - return true; - } - - case 'L': - { - std::int64_t number{}; - if (JSON_HEDLEY_UNLIKELY(!get_number(input_format_t::ubjson, number))) - { - return false; - } - result = static_cast(number); - return true; - } - - default: - { - auto last_token = get_token_string(); - return sax->parse_error(chars_read, last_token, parse_error::create(113, chars_read, exception_message(input_format_t::ubjson, "expected length type specification (U, i, I, l, L) after '#'; last byte: 0x" + last_token, "size"))); - } - } - } - - /*! - @brief determine the type and size for a container - - In the optimized UBJSON format, a type and a size can be provided to allow - for a more compact representation. - - @param[out] result pair of the size and the type - - @return whether pair creation completed - */ - bool get_ubjson_size_type(std::pair& result) - { - result.first = string_t::npos; // size - result.second = 0; // type - - get_ignore_noop(); - - if (current == '$') - { - result.second = get(); // must not ignore 'N', because 'N' maybe the type - if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format_t::ubjson, "type"))) - { - return false; - } - - get_ignore_noop(); - if (JSON_HEDLEY_UNLIKELY(current != '#')) - { - if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format_t::ubjson, "value"))) - { - return false; - } - auto last_token = get_token_string(); - return sax->parse_error(chars_read, last_token, parse_error::create(112, chars_read, exception_message(input_format_t::ubjson, "expected '#' after type information; last byte: 0x" + last_token, "size"))); - } - - return get_ubjson_size_value(result.first); - } - - if (current == '#') - { - return get_ubjson_size_value(result.first); - } - - return true; - } - - /*! - @param prefix the previously read or set type prefix - @return whether value creation completed - */ - bool get_ubjson_value(const char_int_type prefix) - { - switch (prefix) - { - case std::char_traits::eof(): // EOF - return unexpect_eof(input_format_t::ubjson, "value"); - - case 'T': // true - return sax->boolean(true); - case 'F': // false - return sax->boolean(false); - - case 'Z': // null - return sax->null(); - - case 'U': - { - std::uint8_t number{}; - return get_number(input_format_t::ubjson, number) && sax->number_unsigned(number); - } - - case 'i': - { - std::int8_t number{}; - return get_number(input_format_t::ubjson, number) && sax->number_integer(number); - } - - case 'I': - { - std::int16_t number{}; - return get_number(input_format_t::ubjson, number) && sax->number_integer(number); - } - - case 'l': - { - std::int32_t number{}; - return get_number(input_format_t::ubjson, number) && sax->number_integer(number); - } - - case 'L': - { - std::int64_t number{}; - return get_number(input_format_t::ubjson, number) && sax->number_integer(number); - } - - case 'd': - { - float number{}; - return get_number(input_format_t::ubjson, number) && sax->number_float(static_cast(number), ""); - } - - case 'D': - { - double number{}; - return get_number(input_format_t::ubjson, number) && sax->number_float(static_cast(number), ""); - } - - case 'H': - { - return get_ubjson_high_precision_number(); - } - - case 'C': // char - { - get(); - if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format_t::ubjson, "char"))) - { - return false; - } - if (JSON_HEDLEY_UNLIKELY(current > 127)) - { - auto last_token = get_token_string(); - return sax->parse_error(chars_read, last_token, parse_error::create(113, chars_read, exception_message(input_format_t::ubjson, "byte after 'C' must be in range 0x00..0x7F; last byte: 0x" + last_token, "char"))); - } - string_t s(1, static_cast(current)); - return sax->string(s); - } - - case 'S': // string - { - string_t s; - return get_ubjson_string(s) && sax->string(s); - } - - case '[': // array - return get_ubjson_array(); - - case '{': // object - return get_ubjson_object(); - - default: // anything else - { - auto last_token = get_token_string(); - return sax->parse_error(chars_read, last_token, parse_error::create(112, chars_read, exception_message(input_format_t::ubjson, "invalid byte: 0x" + last_token, "value"))); - } - } - } - - /*! - @return whether array creation completed - */ - bool get_ubjson_array() - { - std::pair size_and_type; - if (JSON_HEDLEY_UNLIKELY(!get_ubjson_size_type(size_and_type))) - { - return false; - } - - if (size_and_type.first != string_t::npos) - { - if (JSON_HEDLEY_UNLIKELY(!sax->start_array(size_and_type.first))) - { - return false; - } - - if (size_and_type.second != 0) - { - if (size_and_type.second != 'N') - { - for (std::size_t i = 0; i < size_and_type.first; ++i) - { - if (JSON_HEDLEY_UNLIKELY(!get_ubjson_value(size_and_type.second))) - { - return false; - } - } - } - } - else - { - for (std::size_t i = 0; i < size_and_type.first; ++i) - { - if (JSON_HEDLEY_UNLIKELY(!parse_ubjson_internal())) - { - return false; - } - } - } - } - else - { - if (JSON_HEDLEY_UNLIKELY(!sax->start_array(std::size_t(-1)))) - { - return false; - } - - while (current != ']') - { - if (JSON_HEDLEY_UNLIKELY(!parse_ubjson_internal(false))) - { - return false; - } - get_ignore_noop(); - } - } - - return sax->end_array(); - } - - /*! - @return whether object creation completed - */ - bool get_ubjson_object() - { - std::pair size_and_type; - if (JSON_HEDLEY_UNLIKELY(!get_ubjson_size_type(size_and_type))) - { - return false; - } - - string_t key; - if (size_and_type.first != string_t::npos) - { - if (JSON_HEDLEY_UNLIKELY(!sax->start_object(size_and_type.first))) - { - return false; - } - - if (size_and_type.second != 0) - { - for (std::size_t i = 0; i < size_and_type.first; ++i) - { - if (JSON_HEDLEY_UNLIKELY(!get_ubjson_string(key) || !sax->key(key))) - { - return false; - } - if (JSON_HEDLEY_UNLIKELY(!get_ubjson_value(size_and_type.second))) - { - return false; - } - key.clear(); - } - } - else - { - for (std::size_t i = 0; i < size_and_type.first; ++i) - { - if (JSON_HEDLEY_UNLIKELY(!get_ubjson_string(key) || !sax->key(key))) - { - return false; - } - if (JSON_HEDLEY_UNLIKELY(!parse_ubjson_internal())) - { - return false; - } - key.clear(); - } - } - } - else - { - if (JSON_HEDLEY_UNLIKELY(!sax->start_object(std::size_t(-1)))) - { - return false; - } - - while (current != '}') - { - if (JSON_HEDLEY_UNLIKELY(!get_ubjson_string(key, false) || !sax->key(key))) - { - return false; - } - if (JSON_HEDLEY_UNLIKELY(!parse_ubjson_internal())) - { - return false; - } - get_ignore_noop(); - key.clear(); - } - } - - return sax->end_object(); - } - - // Note, no reader for UBJSON binary types is implemented because they do - // not exist - - bool get_ubjson_high_precision_number() - { - // get size of following number string - std::size_t size{}; - auto res = get_ubjson_size_value(size); - if (JSON_HEDLEY_UNLIKELY(!res)) - { - return res; - } - - // get number string - std::vector number_vector; - for (std::size_t i = 0; i < size; ++i) - { - get(); - if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(input_format_t::ubjson, "number"))) - { - return false; - } - number_vector.push_back(static_cast(current)); - } - - // parse number string - auto number_ia = detail::input_adapter(std::forward(number_vector)); - auto number_lexer = detail::lexer(std::move(number_ia), false); - const auto result_number = number_lexer.scan(); - const auto number_string = number_lexer.get_token_string(); - const auto result_remainder = number_lexer.scan(); - - using token_type = typename detail::lexer_base::token_type; - - if (JSON_HEDLEY_UNLIKELY(result_remainder != token_type::end_of_input)) - { - return sax->parse_error(chars_read, number_string, parse_error::create(115, chars_read, exception_message(input_format_t::ubjson, "invalid number text: " + number_lexer.get_token_string(), "high-precision number"))); - } - - switch (result_number) - { - case token_type::value_integer: - return sax->number_integer(number_lexer.get_number_integer()); - case token_type::value_unsigned: - return sax->number_unsigned(number_lexer.get_number_unsigned()); - case token_type::value_float: - return sax->number_float(number_lexer.get_number_float(), std::move(number_string)); - default: - return sax->parse_error(chars_read, number_string, parse_error::create(115, chars_read, exception_message(input_format_t::ubjson, "invalid number text: " + number_lexer.get_token_string(), "high-precision number"))); - } - } - - /////////////////////// - // Utility functions // - /////////////////////// - - /*! - @brief get next character from the input - - This function provides the interface to the used input adapter. It does - not throw in case the input reached EOF, but returns a -'ve valued - `std::char_traits::eof()` in that case. - - @return character read from the input - */ - char_int_type get() - { - ++chars_read; - return current = ia.get_character(); - } - - /*! - @return character read from the input after ignoring all 'N' entries - */ - char_int_type get_ignore_noop() - { - do - { - get(); - } - while (current == 'N'); - - return current; - } - - /* - @brief read a number from the input - - @tparam NumberType the type of the number - @param[in] format the current format (for diagnostics) - @param[out] result number of type @a NumberType - - @return whether conversion completed - - @note This function needs to respect the system's endianess, because - bytes in CBOR, MessagePack, and UBJSON are stored in network order - (big endian) and therefore need reordering on little endian systems. - */ - template - bool get_number(const input_format_t format, NumberType& result) - { - // step 1: read input into array with system's byte order - std::array vec; - for (std::size_t i = 0; i < sizeof(NumberType); ++i) - { - get(); - if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(format, "number"))) - { - return false; - } - - // reverse byte order prior to conversion if necessary - if (is_little_endian != InputIsLittleEndian) - { - vec[sizeof(NumberType) - i - 1] = static_cast(current); - } - else - { - vec[i] = static_cast(current); // LCOV_EXCL_LINE - } - } - - // step 2: convert array into number of type T and return - std::memcpy(&result, vec.data(), sizeof(NumberType)); - return true; - } - - /*! - @brief create a string by reading characters from the input - - @tparam NumberType the type of the number - @param[in] format the current format (for diagnostics) - @param[in] len number of characters to read - @param[out] result string created by reading @a len bytes - - @return whether string creation completed - - @note We can not reserve @a len bytes for the result, because @a len - may be too large. Usually, @ref unexpect_eof() detects the end of - the input before we run out of string memory. - */ - template - bool get_string(const input_format_t format, - const NumberType len, - string_t& result) - { - bool success = true; - for (NumberType i = 0; i < len; i++) - { - get(); - if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(format, "string"))) - { - success = false; - break; - } - result.push_back(static_cast(current)); - }; - return success; - } - - /*! - @brief create a byte array by reading bytes from the input - - @tparam NumberType the type of the number - @param[in] format the current format (for diagnostics) - @param[in] len number of bytes to read - @param[out] result byte array created by reading @a len bytes - - @return whether byte array creation completed - - @note We can not reserve @a len bytes for the result, because @a len - may be too large. Usually, @ref unexpect_eof() detects the end of - the input before we run out of memory. - */ - template - bool get_binary(const input_format_t format, - const NumberType len, - binary_t& result) - { - bool success = true; - for (NumberType i = 0; i < len; i++) - { - get(); - if (JSON_HEDLEY_UNLIKELY(!unexpect_eof(format, "binary"))) - { - success = false; - break; - } - result.push_back(static_cast(current)); - } - return success; - } - - /*! - @param[in] format the current format (for diagnostics) - @param[in] context further context information (for diagnostics) - @return whether the last read character is not EOF - */ - JSON_HEDLEY_NON_NULL(3) - bool unexpect_eof(const input_format_t format, const char* context) const - { - if (JSON_HEDLEY_UNLIKELY(current == std::char_traits::eof())) - { - return sax->parse_error(chars_read, "", - parse_error::create(110, chars_read, exception_message(format, "unexpected end of input", context))); - } - return true; - } - - /*! - @return a string representation of the last read byte - */ - std::string get_token_string() const - { - std::array cr{{}}; - (std::snprintf)(cr.data(), cr.size(), "%.2hhX", static_cast(current)); - return std::string{cr.data()}; - } - - /*! - @param[in] format the current format - @param[in] detail a detailed error message - @param[in] context further context information - @return a message string to use in the parse_error exceptions - */ - std::string exception_message(const input_format_t format, - const std::string& detail, - const std::string& context) const - { - std::string error_msg = "syntax error while parsing "; - - switch (format) - { - case input_format_t::cbor: - error_msg += "CBOR"; - break; - - case input_format_t::msgpack: - error_msg += "MessagePack"; - break; - - case input_format_t::ubjson: - error_msg += "UBJSON"; - break; - - case input_format_t::bson: - error_msg += "BSON"; - break; - - default: // LCOV_EXCL_LINE - JSON_ASSERT(false); // LCOV_EXCL_LINE - } - - return error_msg + " " + context + ": " + detail; - } - - private: - /// input adapter - InputAdapterType ia; - - /// the current character - char_int_type current = std::char_traits::eof(); - - /// the number of characters read - std::size_t chars_read = 0; - - /// whether we can assume little endianess - const bool is_little_endian = little_endianess(); - - /// the SAX parser - json_sax_t* sax = nullptr; -}; -} // namespace detail -} // namespace nlohmann - -// #include - -// #include - -// #include - - -#include // isfinite -#include // uint8_t -#include // function -#include // string -#include // move -#include // vector - -// #include - -// #include - -// #include - -// #include - -// #include - -// #include - -// #include - - -namespace nlohmann -{ -namespace detail -{ -//////////// -// parser // -//////////// - -enum class parse_event_t : uint8_t -{ - /// the parser read `{` and started to process a JSON object - object_start, - /// the parser read `}` and finished processing a JSON object - object_end, - /// the parser read `[` and started to process a JSON array - array_start, - /// the parser read `]` and finished processing a JSON array - array_end, - /// the parser read a key of a value in an object - key, - /// the parser finished reading a JSON value - value -}; - -template -using parser_callback_t = - std::function; - -/*! -@brief syntax analysis - -This class implements a recursive descent parser. -*/ -template -class parser -{ - using number_integer_t = typename BasicJsonType::number_integer_t; - using number_unsigned_t = typename BasicJsonType::number_unsigned_t; - using number_float_t = typename BasicJsonType::number_float_t; - using string_t = typename BasicJsonType::string_t; - using lexer_t = lexer; - using token_type = typename lexer_t::token_type; - - public: - /// a parser reading from an input adapter - explicit parser(InputAdapterType&& adapter, - const parser_callback_t cb = nullptr, - const bool allow_exceptions_ = true, - const bool skip_comments = false) - : callback(cb) - , m_lexer(std::move(adapter), skip_comments) - , allow_exceptions(allow_exceptions_) - { - // read first token - get_token(); - } - - /*! - @brief public parser interface - - @param[in] strict whether to expect the last token to be EOF - @param[in,out] result parsed JSON value - - @throw parse_error.101 in case of an unexpected token - @throw parse_error.102 if to_unicode fails or surrogate error - @throw parse_error.103 if to_unicode fails - */ - void parse(const bool strict, BasicJsonType& result) - { - if (callback) - { - json_sax_dom_callback_parser sdp(result, callback, allow_exceptions); - sax_parse_internal(&sdp); - result.assert_invariant(); - - // in strict mode, input must be completely read - if (strict && (get_token() != token_type::end_of_input)) - { - sdp.parse_error(m_lexer.get_position(), - m_lexer.get_token_string(), - parse_error::create(101, m_lexer.get_position(), - exception_message(token_type::end_of_input, "value"))); - } - - // in case of an error, return discarded value - if (sdp.is_errored()) - { - result = value_t::discarded; - return; - } - - // set top-level value to null if it was discarded by the callback - // function - if (result.is_discarded()) - { - result = nullptr; - } - } - else - { - json_sax_dom_parser sdp(result, allow_exceptions); - sax_parse_internal(&sdp); - result.assert_invariant(); - - // in strict mode, input must be completely read - if (strict && (get_token() != token_type::end_of_input)) - { - sdp.parse_error(m_lexer.get_position(), - m_lexer.get_token_string(), - parse_error::create(101, m_lexer.get_position(), - exception_message(token_type::end_of_input, "value"))); - } - - // in case of an error, return discarded value - if (sdp.is_errored()) - { - result = value_t::discarded; - return; - } - } - } - - /*! - @brief public accept interface - - @param[in] strict whether to expect the last token to be EOF - @return whether the input is a proper JSON text - */ - bool accept(const bool strict = true) - { - json_sax_acceptor sax_acceptor; - return sax_parse(&sax_acceptor, strict); - } - - template - JSON_HEDLEY_NON_NULL(2) - bool sax_parse(SAX* sax, const bool strict = true) - { - (void)detail::is_sax_static_asserts {}; - const bool result = sax_parse_internal(sax); - - // strict mode: next byte must be EOF - if (result && strict && (get_token() != token_type::end_of_input)) - { - return sax->parse_error(m_lexer.get_position(), - m_lexer.get_token_string(), - parse_error::create(101, m_lexer.get_position(), - exception_message(token_type::end_of_input, "value"))); - } - - return result; - } - - private: - template - JSON_HEDLEY_NON_NULL(2) - bool sax_parse_internal(SAX* sax) - { - // stack to remember the hierarchy of structured values we are parsing - // true = array; false = object - std::vector states; - // value to avoid a goto (see comment where set to true) - bool skip_to_state_evaluation = false; - - while (true) - { - if (!skip_to_state_evaluation) - { - // invariant: get_token() was called before each iteration - switch (last_token) - { - case token_type::begin_object: - { - if (JSON_HEDLEY_UNLIKELY(!sax->start_object(std::size_t(-1)))) - { - return false; - } - - // closing } -> we are done - if (get_token() == token_type::end_object) - { - if (JSON_HEDLEY_UNLIKELY(!sax->end_object())) - { - return false; - } - break; - } - - // parse key - if (JSON_HEDLEY_UNLIKELY(last_token != token_type::value_string)) - { - return sax->parse_error(m_lexer.get_position(), - m_lexer.get_token_string(), - parse_error::create(101, m_lexer.get_position(), - exception_message(token_type::value_string, "object key"))); - } - if (JSON_HEDLEY_UNLIKELY(!sax->key(m_lexer.get_string()))) - { - return false; - } - - // parse separator (:) - if (JSON_HEDLEY_UNLIKELY(get_token() != token_type::name_separator)) - { - return sax->parse_error(m_lexer.get_position(), - m_lexer.get_token_string(), - parse_error::create(101, m_lexer.get_position(), - exception_message(token_type::name_separator, "object separator"))); - } - - // remember we are now inside an object - states.push_back(false); - - // parse values - get_token(); - continue; - } - - case token_type::begin_array: - { - if (JSON_HEDLEY_UNLIKELY(!sax->start_array(std::size_t(-1)))) - { - return false; - } - - // closing ] -> we are done - if (get_token() == token_type::end_array) - { - if (JSON_HEDLEY_UNLIKELY(!sax->end_array())) - { - return false; - } - break; - } - - // remember we are now inside an array - states.push_back(true); - - // parse values (no need to call get_token) - continue; - } - - case token_type::value_float: - { - const auto res = m_lexer.get_number_float(); - - if (JSON_HEDLEY_UNLIKELY(!std::isfinite(res))) - { - return sax->parse_error(m_lexer.get_position(), - m_lexer.get_token_string(), - out_of_range::create(406, "number overflow parsing '" + m_lexer.get_token_string() + "'")); - } - - if (JSON_HEDLEY_UNLIKELY(!sax->number_float(res, m_lexer.get_string()))) - { - return false; - } - - break; - } - - case token_type::literal_false: - { - if (JSON_HEDLEY_UNLIKELY(!sax->boolean(false))) - { - return false; - } - break; - } - - case token_type::literal_null: - { - if (JSON_HEDLEY_UNLIKELY(!sax->null())) - { - return false; - } - break; - } - - case token_type::literal_true: - { - if (JSON_HEDLEY_UNLIKELY(!sax->boolean(true))) - { - return false; - } - break; - } - - case token_type::value_integer: - { - if (JSON_HEDLEY_UNLIKELY(!sax->number_integer(m_lexer.get_number_integer()))) - { - return false; - } - break; - } - - case token_type::value_string: - { - if (JSON_HEDLEY_UNLIKELY(!sax->string(m_lexer.get_string()))) - { - return false; - } - break; - } - - case token_type::value_unsigned: - { - if (JSON_HEDLEY_UNLIKELY(!sax->number_unsigned(m_lexer.get_number_unsigned()))) - { - return false; - } - break; - } - - case token_type::parse_error: - { - // using "uninitialized" to avoid "expected" message - return sax->parse_error(m_lexer.get_position(), - m_lexer.get_token_string(), - parse_error::create(101, m_lexer.get_position(), - exception_message(token_type::uninitialized, "value"))); - } - - default: // the last token was unexpected - { - return sax->parse_error(m_lexer.get_position(), - m_lexer.get_token_string(), - parse_error::create(101, m_lexer.get_position(), - exception_message(token_type::literal_or_value, "value"))); - } - } - } - else - { - skip_to_state_evaluation = false; - } - - // we reached this line after we successfully parsed a value - if (states.empty()) - { - // empty stack: we reached the end of the hierarchy: done - return true; - } - - if (states.back()) // array - { - // comma -> next value - if (get_token() == token_type::value_separator) - { - // parse a new value - get_token(); - continue; - } - - // closing ] - if (JSON_HEDLEY_LIKELY(last_token == token_type::end_array)) - { - if (JSON_HEDLEY_UNLIKELY(!sax->end_array())) - { - return false; - } - - // We are done with this array. Before we can parse a - // new value, we need to evaluate the new state first. - // By setting skip_to_state_evaluation to false, we - // are effectively jumping to the beginning of this if. - JSON_ASSERT(!states.empty()); - states.pop_back(); - skip_to_state_evaluation = true; - continue; - } - - return sax->parse_error(m_lexer.get_position(), - m_lexer.get_token_string(), - parse_error::create(101, m_lexer.get_position(), - exception_message(token_type::end_array, "array"))); - } - else // object - { - // comma -> next value - if (get_token() == token_type::value_separator) - { - // parse key - if (JSON_HEDLEY_UNLIKELY(get_token() != token_type::value_string)) - { - return sax->parse_error(m_lexer.get_position(), - m_lexer.get_token_string(), - parse_error::create(101, m_lexer.get_position(), - exception_message(token_type::value_string, "object key"))); - } - - if (JSON_HEDLEY_UNLIKELY(!sax->key(m_lexer.get_string()))) - { - return false; - } - - // parse separator (:) - if (JSON_HEDLEY_UNLIKELY(get_token() != token_type::name_separator)) - { - return sax->parse_error(m_lexer.get_position(), - m_lexer.get_token_string(), - parse_error::create(101, m_lexer.get_position(), - exception_message(token_type::name_separator, "object separator"))); - } - - // parse values - get_token(); - continue; - } - - // closing } - if (JSON_HEDLEY_LIKELY(last_token == token_type::end_object)) - { - if (JSON_HEDLEY_UNLIKELY(!sax->end_object())) - { - return false; - } - - // We are done with this object. Before we can parse a - // new value, we need to evaluate the new state first. - // By setting skip_to_state_evaluation to false, we - // are effectively jumping to the beginning of this if. - JSON_ASSERT(!states.empty()); - states.pop_back(); - skip_to_state_evaluation = true; - continue; - } - - return sax->parse_error(m_lexer.get_position(), - m_lexer.get_token_string(), - parse_error::create(101, m_lexer.get_position(), - exception_message(token_type::end_object, "object"))); - } - } - } - - /// get next token from lexer - token_type get_token() - { - return last_token = m_lexer.scan(); - } - - std::string exception_message(const token_type expected, const std::string& context) - { - std::string error_msg = "syntax error "; - - if (!context.empty()) - { - error_msg += "while parsing " + context + " "; - } - - error_msg += "- "; - - if (last_token == token_type::parse_error) - { - error_msg += std::string(m_lexer.get_error_message()) + "; last read: '" + - m_lexer.get_token_string() + "'"; - } - else - { - error_msg += "unexpected " + std::string(lexer_t::token_type_name(last_token)); - } - - if (expected != token_type::uninitialized) - { - error_msg += "; expected " + std::string(lexer_t::token_type_name(expected)); - } - - return error_msg; - } - - private: - /// callback function - const parser_callback_t callback = nullptr; - /// the type of the last read token - token_type last_token = token_type::uninitialized; - /// the lexer - lexer_t m_lexer; - /// whether to throw exceptions in case of errors - const bool allow_exceptions = true; -}; -} // namespace detail -} // namespace nlohmann - -// #include - - -// #include - - -#include // ptrdiff_t -#include // numeric_limits - -namespace nlohmann -{ -namespace detail -{ -/* -@brief an iterator for primitive JSON types - -This class models an iterator for primitive JSON types (boolean, number, -string). It's only purpose is to allow the iterator/const_iterator classes -to "iterate" over primitive values. Internally, the iterator is modeled by -a `difference_type` variable. Value begin_value (`0`) models the begin, -end_value (`1`) models past the end. -*/ -class primitive_iterator_t -{ - private: - using difference_type = std::ptrdiff_t; - static constexpr difference_type begin_value = 0; - static constexpr difference_type end_value = begin_value + 1; - - /// iterator as signed integer type - difference_type m_it = (std::numeric_limits::min)(); - - public: - constexpr difference_type get_value() const noexcept - { - return m_it; - } - - /// set iterator to a defined beginning - void set_begin() noexcept - { - m_it = begin_value; - } - - /// set iterator to a defined past the end - void set_end() noexcept - { - m_it = end_value; - } - - /// return whether the iterator can be dereferenced - constexpr bool is_begin() const noexcept - { - return m_it == begin_value; - } - - /// return whether the iterator is at end - constexpr bool is_end() const noexcept - { - return m_it == end_value; - } - - friend constexpr bool operator==(primitive_iterator_t lhs, primitive_iterator_t rhs) noexcept - { - return lhs.m_it == rhs.m_it; - } - - friend constexpr bool operator<(primitive_iterator_t lhs, primitive_iterator_t rhs) noexcept - { - return lhs.m_it < rhs.m_it; - } - - primitive_iterator_t operator+(difference_type n) noexcept - { - auto result = *this; - result += n; - return result; - } - - friend constexpr difference_type operator-(primitive_iterator_t lhs, primitive_iterator_t rhs) noexcept - { - return lhs.m_it - rhs.m_it; - } - - primitive_iterator_t& operator++() noexcept - { - ++m_it; - return *this; - } - - primitive_iterator_t const operator++(int) noexcept - { - auto result = *this; - ++m_it; - return result; - } - - primitive_iterator_t& operator--() noexcept - { - --m_it; - return *this; - } - - primitive_iterator_t const operator--(int) noexcept - { - auto result = *this; - --m_it; - return result; - } - - primitive_iterator_t& operator+=(difference_type n) noexcept - { - m_it += n; - return *this; - } - - primitive_iterator_t& operator-=(difference_type n) noexcept - { - m_it -= n; - return *this; - } -}; -} // namespace detail -} // namespace nlohmann - - -namespace nlohmann -{ -namespace detail -{ -/*! -@brief an iterator value - -@note This structure could easily be a union, but MSVC currently does not allow -unions members with complex constructors, see https://github.com/nlohmann/json/pull/105. -*/ -template struct internal_iterator -{ - /// iterator for JSON objects - typename BasicJsonType::object_t::iterator object_iterator {}; - /// iterator for JSON arrays - typename BasicJsonType::array_t::iterator array_iterator {}; - /// generic iterator for all other types - primitive_iterator_t primitive_iterator {}; -}; -} // namespace detail -} // namespace nlohmann - -// #include - - -#include // iterator, random_access_iterator_tag, bidirectional_iterator_tag, advance, next -#include // conditional, is_const, remove_const - -// #include - -// #include - -// #include - -// #include - -// #include - -// #include - -// #include - - -namespace nlohmann -{ -namespace detail -{ -// forward declare, to be able to friend it later on -template class iteration_proxy; -template class iteration_proxy_value; - -/*! -@brief a template for a bidirectional iterator for the @ref basic_json class -This class implements a both iterators (iterator and const_iterator) for the -@ref basic_json class. -@note An iterator is called *initialized* when a pointer to a JSON value has - been set (e.g., by a constructor or a copy assignment). If the iterator is - default-constructed, it is *uninitialized* and most methods are undefined. - **The library uses assertions to detect calls on uninitialized iterators.** -@requirement The class satisfies the following concept requirements: -- -[BidirectionalIterator](https://en.cppreference.com/w/cpp/named_req/BidirectionalIterator): - The iterator that can be moved can be moved in both directions (i.e. - incremented and decremented). -@since version 1.0.0, simplified in version 2.0.9, change to bidirectional - iterators in version 3.0.0 (see https://github.com/nlohmann/json/issues/593) -*/ -template -class iter_impl -{ - /// allow basic_json to access private members - friend iter_impl::value, typename std::remove_const::type, const BasicJsonType>::type>; - friend BasicJsonType; - friend iteration_proxy; - friend iteration_proxy_value; - - using object_t = typename BasicJsonType::object_t; - using array_t = typename BasicJsonType::array_t; - // make sure BasicJsonType is basic_json or const basic_json - static_assert(is_basic_json::type>::value, - "iter_impl only accepts (const) basic_json"); - - public: - - /// The std::iterator class template (used as a base class to provide typedefs) is deprecated in C++17. - /// The C++ Standard has never required user-defined iterators to derive from std::iterator. - /// A user-defined iterator should provide publicly accessible typedefs named - /// iterator_category, value_type, difference_type, pointer, and reference. - /// Note that value_type is required to be non-const, even for constant iterators. - using iterator_category = std::bidirectional_iterator_tag; - - /// the type of the values when the iterator is dereferenced - using value_type = typename BasicJsonType::value_type; - /// a type to represent differences between iterators - using difference_type = typename BasicJsonType::difference_type; - /// defines a pointer to the type iterated over (value_type) - using pointer = typename std::conditional::value, - typename BasicJsonType::const_pointer, - typename BasicJsonType::pointer>::type; - /// defines a reference to the type iterated over (value_type) - using reference = - typename std::conditional::value, - typename BasicJsonType::const_reference, - typename BasicJsonType::reference>::type; - - /// default constructor - iter_impl() = default; - - /*! - @brief constructor for a given JSON instance - @param[in] object pointer to a JSON object for this iterator - @pre object != nullptr - @post The iterator is initialized; i.e. `m_object != nullptr`. - */ - explicit iter_impl(pointer object) noexcept : m_object(object) - { - JSON_ASSERT(m_object != nullptr); - - switch (m_object->m_type) - { - case value_t::object: - { - m_it.object_iterator = typename object_t::iterator(); - break; - } - - case value_t::array: - { - m_it.array_iterator = typename array_t::iterator(); - break; - } - - default: - { - m_it.primitive_iterator = primitive_iterator_t(); - break; - } - } - } - - /*! - @note The conventional copy constructor and copy assignment are implicitly - defined. Combined with the following converting constructor and - assignment, they support: (1) copy from iterator to iterator, (2) - copy from const iterator to const iterator, and (3) conversion from - iterator to const iterator. However conversion from const iterator - to iterator is not defined. - */ - - /*! - @brief const copy constructor - @param[in] other const iterator to copy from - @note This copy constructor had to be defined explicitly to circumvent a bug - occurring on msvc v19.0 compiler (VS 2015) debug build. For more - information refer to: https://github.com/nlohmann/json/issues/1608 - */ - iter_impl(const iter_impl& other) noexcept - : m_object(other.m_object), m_it(other.m_it) - {} - - /*! - @brief converting assignment - @param[in] other const iterator to copy from - @return const/non-const iterator - @note It is not checked whether @a other is initialized. - */ - iter_impl& operator=(const iter_impl& other) noexcept - { - m_object = other.m_object; - m_it = other.m_it; - return *this; - } - - /*! - @brief converting constructor - @param[in] other non-const iterator to copy from - @note It is not checked whether @a other is initialized. - */ - iter_impl(const iter_impl::type>& other) noexcept - : m_object(other.m_object), m_it(other.m_it) - {} - - /*! - @brief converting assignment - @param[in] other non-const iterator to copy from - @return const/non-const iterator - @note It is not checked whether @a other is initialized. - */ - iter_impl& operator=(const iter_impl::type>& other) noexcept - { - m_object = other.m_object; - m_it = other.m_it; - return *this; - } - - private: - /*! - @brief set the iterator to the first value - @pre The iterator is initialized; i.e. `m_object != nullptr`. - */ - void set_begin() noexcept - { - JSON_ASSERT(m_object != nullptr); - - switch (m_object->m_type) - { - case value_t::object: - { - m_it.object_iterator = m_object->m_value.object->begin(); - break; - } - - case value_t::array: - { - m_it.array_iterator = m_object->m_value.array->begin(); - break; - } - - case value_t::null: - { - // set to end so begin()==end() is true: null is empty - m_it.primitive_iterator.set_end(); - break; - } - - default: - { - m_it.primitive_iterator.set_begin(); - break; - } - } - } - - /*! - @brief set the iterator past the last value - @pre The iterator is initialized; i.e. `m_object != nullptr`. - */ - void set_end() noexcept - { - JSON_ASSERT(m_object != nullptr); - - switch (m_object->m_type) - { - case value_t::object: - { - m_it.object_iterator = m_object->m_value.object->end(); - break; - } - - case value_t::array: - { - m_it.array_iterator = m_object->m_value.array->end(); - break; - } - - default: - { - m_it.primitive_iterator.set_end(); - break; - } - } - } - - public: - /*! - @brief return a reference to the value pointed to by the iterator - @pre The iterator is initialized; i.e. `m_object != nullptr`. - */ - reference operator*() const - { - JSON_ASSERT(m_object != nullptr); - - switch (m_object->m_type) - { - case value_t::object: - { - JSON_ASSERT(m_it.object_iterator != m_object->m_value.object->end()); - return m_it.object_iterator->second; - } - - case value_t::array: - { - JSON_ASSERT(m_it.array_iterator != m_object->m_value.array->end()); - return *m_it.array_iterator; - } - - case value_t::null: - JSON_THROW(invalid_iterator::create(214, "cannot get value")); - - default: - { - if (JSON_HEDLEY_LIKELY(m_it.primitive_iterator.is_begin())) - { - return *m_object; - } - - JSON_THROW(invalid_iterator::create(214, "cannot get value")); - } - } - } - - /*! - @brief dereference the iterator - @pre The iterator is initialized; i.e. `m_object != nullptr`. - */ - pointer operator->() const - { - JSON_ASSERT(m_object != nullptr); - - switch (m_object->m_type) - { - case value_t::object: - { - JSON_ASSERT(m_it.object_iterator != m_object->m_value.object->end()); - return &(m_it.object_iterator->second); - } - - case value_t::array: - { - JSON_ASSERT(m_it.array_iterator != m_object->m_value.array->end()); - return &*m_it.array_iterator; - } - - default: - { - if (JSON_HEDLEY_LIKELY(m_it.primitive_iterator.is_begin())) - { - return m_object; - } - - JSON_THROW(invalid_iterator::create(214, "cannot get value")); - } - } - } - - /*! - @brief post-increment (it++) - @pre The iterator is initialized; i.e. `m_object != nullptr`. - */ - iter_impl const operator++(int) - { - auto result = *this; - ++(*this); - return result; - } - - /*! - @brief pre-increment (++it) - @pre The iterator is initialized; i.e. `m_object != nullptr`. - */ - iter_impl& operator++() - { - JSON_ASSERT(m_object != nullptr); - - switch (m_object->m_type) - { - case value_t::object: - { - std::advance(m_it.object_iterator, 1); - break; - } - - case value_t::array: - { - std::advance(m_it.array_iterator, 1); - break; - } - - default: - { - ++m_it.primitive_iterator; - break; - } - } - - return *this; - } - - /*! - @brief post-decrement (it--) - @pre The iterator is initialized; i.e. `m_object != nullptr`. - */ - iter_impl const operator--(int) - { - auto result = *this; - --(*this); - return result; - } - - /*! - @brief pre-decrement (--it) - @pre The iterator is initialized; i.e. `m_object != nullptr`. - */ - iter_impl& operator--() - { - JSON_ASSERT(m_object != nullptr); - - switch (m_object->m_type) - { - case value_t::object: - { - std::advance(m_it.object_iterator, -1); - break; - } - - case value_t::array: - { - std::advance(m_it.array_iterator, -1); - break; - } - - default: - { - --m_it.primitive_iterator; - break; - } - } - - return *this; - } - - /*! - @brief comparison: equal - @pre The iterator is initialized; i.e. `m_object != nullptr`. - */ - bool operator==(const iter_impl& other) const - { - // if objects are not the same, the comparison is undefined - if (JSON_HEDLEY_UNLIKELY(m_object != other.m_object)) - { - JSON_THROW(invalid_iterator::create(212, "cannot compare iterators of different containers")); - } - - JSON_ASSERT(m_object != nullptr); - - switch (m_object->m_type) - { - case value_t::object: - return (m_it.object_iterator == other.m_it.object_iterator); - - case value_t::array: - return (m_it.array_iterator == other.m_it.array_iterator); - - default: - return (m_it.primitive_iterator == other.m_it.primitive_iterator); - } - } - - /*! - @brief comparison: not equal - @pre The iterator is initialized; i.e. `m_object != nullptr`. - */ - bool operator!=(const iter_impl& other) const - { - return !operator==(other); - } - - /*! - @brief comparison: smaller - @pre The iterator is initialized; i.e. `m_object != nullptr`. - */ - bool operator<(const iter_impl& other) const - { - // if objects are not the same, the comparison is undefined - if (JSON_HEDLEY_UNLIKELY(m_object != other.m_object)) - { - JSON_THROW(invalid_iterator::create(212, "cannot compare iterators of different containers")); - } - - JSON_ASSERT(m_object != nullptr); - - switch (m_object->m_type) - { - case value_t::object: - JSON_THROW(invalid_iterator::create(213, "cannot compare order of object iterators")); - - case value_t::array: - return (m_it.array_iterator < other.m_it.array_iterator); - - default: - return (m_it.primitive_iterator < other.m_it.primitive_iterator); - } - } - - /*! - @brief comparison: less than or equal - @pre The iterator is initialized; i.e. `m_object != nullptr`. - */ - bool operator<=(const iter_impl& other) const - { - return !other.operator < (*this); - } - - /*! - @brief comparison: greater than - @pre The iterator is initialized; i.e. `m_object != nullptr`. - */ - bool operator>(const iter_impl& other) const - { - return !operator<=(other); - } - - /*! - @brief comparison: greater than or equal - @pre The iterator is initialized; i.e. `m_object != nullptr`. - */ - bool operator>=(const iter_impl& other) const - { - return !operator<(other); - } - - /*! - @brief add to iterator - @pre The iterator is initialized; i.e. `m_object != nullptr`. - */ - iter_impl& operator+=(difference_type i) - { - JSON_ASSERT(m_object != nullptr); - - switch (m_object->m_type) - { - case value_t::object: - JSON_THROW(invalid_iterator::create(209, "cannot use offsets with object iterators")); - - case value_t::array: - { - std::advance(m_it.array_iterator, i); - break; - } - - default: - { - m_it.primitive_iterator += i; - break; - } - } - - return *this; - } - - /*! - @brief subtract from iterator - @pre The iterator is initialized; i.e. `m_object != nullptr`. - */ - iter_impl& operator-=(difference_type i) - { - return operator+=(-i); - } - - /*! - @brief add to iterator - @pre The iterator is initialized; i.e. `m_object != nullptr`. - */ - iter_impl operator+(difference_type i) const - { - auto result = *this; - result += i; - return result; - } - - /*! - @brief addition of distance and iterator - @pre The iterator is initialized; i.e. `m_object != nullptr`. - */ - friend iter_impl operator+(difference_type i, const iter_impl& it) - { - auto result = it; - result += i; - return result; - } - - /*! - @brief subtract from iterator - @pre The iterator is initialized; i.e. `m_object != nullptr`. - */ - iter_impl operator-(difference_type i) const - { - auto result = *this; - result -= i; - return result; - } - - /*! - @brief return difference - @pre The iterator is initialized; i.e. `m_object != nullptr`. - */ - difference_type operator-(const iter_impl& other) const - { - JSON_ASSERT(m_object != nullptr); - - switch (m_object->m_type) - { - case value_t::object: - JSON_THROW(invalid_iterator::create(209, "cannot use offsets with object iterators")); - - case value_t::array: - return m_it.array_iterator - other.m_it.array_iterator; - - default: - return m_it.primitive_iterator - other.m_it.primitive_iterator; - } - } - - /*! - @brief access to successor - @pre The iterator is initialized; i.e. `m_object != nullptr`. - */ - reference operator[](difference_type n) const - { - JSON_ASSERT(m_object != nullptr); - - switch (m_object->m_type) - { - case value_t::object: - JSON_THROW(invalid_iterator::create(208, "cannot use operator[] for object iterators")); - - case value_t::array: - return *std::next(m_it.array_iterator, n); - - case value_t::null: - JSON_THROW(invalid_iterator::create(214, "cannot get value")); - - default: - { - if (JSON_HEDLEY_LIKELY(m_it.primitive_iterator.get_value() == -n)) - { - return *m_object; - } - - JSON_THROW(invalid_iterator::create(214, "cannot get value")); - } - } - } - - /*! - @brief return the key of an object iterator - @pre The iterator is initialized; i.e. `m_object != nullptr`. - */ - const typename object_t::key_type& key() const - { - JSON_ASSERT(m_object != nullptr); - - if (JSON_HEDLEY_LIKELY(m_object->is_object())) - { - return m_it.object_iterator->first; - } - - JSON_THROW(invalid_iterator::create(207, "cannot use key() for non-object iterators")); - } - - /*! - @brief return the value of an iterator - @pre The iterator is initialized; i.e. `m_object != nullptr`. - */ - reference value() const - { - return operator*(); - } - - private: - /// associated JSON instance - pointer m_object = nullptr; - /// the actual iterator of the associated instance - internal_iterator::type> m_it {}; -}; -} // namespace detail -} // namespace nlohmann - -// #include - -// #include - - -#include // ptrdiff_t -#include // reverse_iterator -#include // declval - -namespace nlohmann -{ -namespace detail -{ -////////////////////// -// reverse_iterator // -////////////////////// - -/*! -@brief a template for a reverse iterator class - -@tparam Base the base iterator type to reverse. Valid types are @ref -iterator (to create @ref reverse_iterator) and @ref const_iterator (to -create @ref const_reverse_iterator). - -@requirement The class satisfies the following concept requirements: -- -[BidirectionalIterator](https://en.cppreference.com/w/cpp/named_req/BidirectionalIterator): - The iterator that can be moved can be moved in both directions (i.e. - incremented and decremented). -- [OutputIterator](https://en.cppreference.com/w/cpp/named_req/OutputIterator): - It is possible to write to the pointed-to element (only if @a Base is - @ref iterator). - -@since version 1.0.0 -*/ -template -class json_reverse_iterator : public std::reverse_iterator -{ - public: - using difference_type = std::ptrdiff_t; - /// shortcut to the reverse iterator adapter - using base_iterator = std::reverse_iterator; - /// the reference type for the pointed-to element - using reference = typename Base::reference; - - /// create reverse iterator from iterator - explicit json_reverse_iterator(const typename base_iterator::iterator_type& it) noexcept - : base_iterator(it) {} - - /// create reverse iterator from base class - explicit json_reverse_iterator(const base_iterator& it) noexcept : base_iterator(it) {} - - /// post-increment (it++) - json_reverse_iterator const operator++(int) - { - return static_cast(base_iterator::operator++(1)); - } - - /// pre-increment (++it) - json_reverse_iterator& operator++() - { - return static_cast(base_iterator::operator++()); - } - - /// post-decrement (it--) - json_reverse_iterator const operator--(int) - { - return static_cast(base_iterator::operator--(1)); - } - - /// pre-decrement (--it) - json_reverse_iterator& operator--() - { - return static_cast(base_iterator::operator--()); - } - - /// add to iterator - json_reverse_iterator& operator+=(difference_type i) - { - return static_cast(base_iterator::operator+=(i)); - } - - /// add to iterator - json_reverse_iterator operator+(difference_type i) const - { - return static_cast(base_iterator::operator+(i)); - } - - /// subtract from iterator - json_reverse_iterator operator-(difference_type i) const - { - return static_cast(base_iterator::operator-(i)); - } - - /// return difference - difference_type operator-(const json_reverse_iterator& other) const - { - return base_iterator(*this) - base_iterator(other); - } - - /// access to successor - reference operator[](difference_type n) const - { - return *(this->operator+(n)); - } - - /// return the key of an object iterator - auto key() const -> decltype(std::declval().key()) - { - auto it = --this->base(); - return it.key(); - } - - /// return the value of an iterator - reference value() const - { - auto it = --this->base(); - return it.operator * (); - } -}; -} // namespace detail -} // namespace nlohmann - -// #include - -// #include - - -#include // all_of -#include // isdigit -#include // max -#include // accumulate -#include // string -#include // move -#include // vector - -// #include - -// #include - -// #include - - -namespace nlohmann -{ -template -class json_pointer -{ - // allow basic_json to access private members - NLOHMANN_BASIC_JSON_TPL_DECLARATION - friend class basic_json; - - public: - /*! - @brief create JSON pointer - - Create a JSON pointer according to the syntax described in - [Section 3 of RFC6901](https://tools.ietf.org/html/rfc6901#section-3). - - @param[in] s string representing the JSON pointer; if omitted, the empty - string is assumed which references the whole JSON value - - @throw parse_error.107 if the given JSON pointer @a s is nonempty and does - not begin with a slash (`/`); see example below - - @throw parse_error.108 if a tilde (`~`) in the given JSON pointer @a s is - not followed by `0` (representing `~`) or `1` (representing `/`); see - example below - - @liveexample{The example shows the construction several valid JSON pointers - as well as the exceptional behavior.,json_pointer} - - @since version 2.0.0 - */ - explicit json_pointer(const std::string& s = "") - : reference_tokens(split(s)) - {} - - /*! - @brief return a string representation of the JSON pointer - - @invariant For each JSON pointer `ptr`, it holds: - @code {.cpp} - ptr == json_pointer(ptr.to_string()); - @endcode - - @return a string representation of the JSON pointer - - @liveexample{The example shows the result of `to_string`.,json_pointer__to_string} - - @since version 2.0.0 - */ - std::string to_string() const - { - return std::accumulate(reference_tokens.begin(), reference_tokens.end(), - std::string{}, - [](const std::string & a, const std::string & b) - { - return a + "/" + escape(b); - }); - } - - /// @copydoc to_string() - operator std::string() const - { - return to_string(); - } - - /*! - @brief append another JSON pointer at the end of this JSON pointer - - @param[in] ptr JSON pointer to append - @return JSON pointer with @a ptr appended - - @liveexample{The example shows the usage of `operator/=`.,json_pointer__operator_add} - - @complexity Linear in the length of @a ptr. - - @sa @ref operator/=(std::string) to append a reference token - @sa @ref operator/=(std::size_t) to append an array index - @sa @ref operator/(const json_pointer&, const json_pointer&) for a binary operator - - @since version 3.6.0 - */ - json_pointer& operator/=(const json_pointer& ptr) - { - reference_tokens.insert(reference_tokens.end(), - ptr.reference_tokens.begin(), - ptr.reference_tokens.end()); - return *this; - } - - /*! - @brief append an unescaped reference token at the end of this JSON pointer - - @param[in] token reference token to append - @return JSON pointer with @a token appended without escaping @a token - - @liveexample{The example shows the usage of `operator/=`.,json_pointer__operator_add} - - @complexity Amortized constant. - - @sa @ref operator/=(const json_pointer&) to append a JSON pointer - @sa @ref operator/=(std::size_t) to append an array index - @sa @ref operator/(const json_pointer&, std::size_t) for a binary operator - - @since version 3.6.0 - */ - json_pointer& operator/=(std::string token) - { - push_back(std::move(token)); - return *this; - } - - /*! - @brief append an array index at the end of this JSON pointer - - @param[in] array_idx array index to append - @return JSON pointer with @a array_idx appended - - @liveexample{The example shows the usage of `operator/=`.,json_pointer__operator_add} - - @complexity Amortized constant. - - @sa @ref operator/=(const json_pointer&) to append a JSON pointer - @sa @ref operator/=(std::string) to append a reference token - @sa @ref operator/(const json_pointer&, std::string) for a binary operator - - @since version 3.6.0 - */ - json_pointer& operator/=(std::size_t array_idx) - { - return *this /= std::to_string(array_idx); - } - - /*! - @brief create a new JSON pointer by appending the right JSON pointer at the end of the left JSON pointer - - @param[in] lhs JSON pointer - @param[in] rhs JSON pointer - @return a new JSON pointer with @a rhs appended to @a lhs - - @liveexample{The example shows the usage of `operator/`.,json_pointer__operator_add_binary} - - @complexity Linear in the length of @a lhs and @a rhs. - - @sa @ref operator/=(const json_pointer&) to append a JSON pointer - - @since version 3.6.0 - */ - friend json_pointer operator/(const json_pointer& lhs, - const json_pointer& rhs) - { - return json_pointer(lhs) /= rhs; - } - - /*! - @brief create a new JSON pointer by appending the unescaped token at the end of the JSON pointer - - @param[in] ptr JSON pointer - @param[in] token reference token - @return a new JSON pointer with unescaped @a token appended to @a ptr - - @liveexample{The example shows the usage of `operator/`.,json_pointer__operator_add_binary} - - @complexity Linear in the length of @a ptr. - - @sa @ref operator/=(std::string) to append a reference token - - @since version 3.6.0 - */ - friend json_pointer operator/(const json_pointer& ptr, std::string token) - { - return json_pointer(ptr) /= std::move(token); - } - - /*! - @brief create a new JSON pointer by appending the array-index-token at the end of the JSON pointer - - @param[in] ptr JSON pointer - @param[in] array_idx array index - @return a new JSON pointer with @a array_idx appended to @a ptr - - @liveexample{The example shows the usage of `operator/`.,json_pointer__operator_add_binary} - - @complexity Linear in the length of @a ptr. - - @sa @ref operator/=(std::size_t) to append an array index - - @since version 3.6.0 - */ - friend json_pointer operator/(const json_pointer& ptr, std::size_t array_idx) - { - return json_pointer(ptr) /= array_idx; - } - - /*! - @brief returns the parent of this JSON pointer - - @return parent of this JSON pointer; in case this JSON pointer is the root, - the root itself is returned - - @complexity Linear in the length of the JSON pointer. - - @liveexample{The example shows the result of `parent_pointer` for different - JSON Pointers.,json_pointer__parent_pointer} - - @since version 3.6.0 - */ - json_pointer parent_pointer() const - { - if (empty()) - { - return *this; - } - - json_pointer res = *this; - res.pop_back(); - return res; - } - - /*! - @brief remove last reference token - - @pre not `empty()` - - @liveexample{The example shows the usage of `pop_back`.,json_pointer__pop_back} - - @complexity Constant. - - @throw out_of_range.405 if JSON pointer has no parent - - @since version 3.6.0 - */ - void pop_back() - { - if (JSON_HEDLEY_UNLIKELY(empty())) - { - JSON_THROW(detail::out_of_range::create(405, "JSON pointer has no parent")); - } - - reference_tokens.pop_back(); - } - - /*! - @brief return last reference token - - @pre not `empty()` - @return last reference token - - @liveexample{The example shows the usage of `back`.,json_pointer__back} - - @complexity Constant. - - @throw out_of_range.405 if JSON pointer has no parent - - @since version 3.6.0 - */ - const std::string& back() const - { - if (JSON_HEDLEY_UNLIKELY(empty())) - { - JSON_THROW(detail::out_of_range::create(405, "JSON pointer has no parent")); - } - - return reference_tokens.back(); - } - - /*! - @brief append an unescaped token at the end of the reference pointer - - @param[in] token token to add - - @complexity Amortized constant. - - @liveexample{The example shows the result of `push_back` for different - JSON Pointers.,json_pointer__push_back} - - @since version 3.6.0 - */ - void push_back(const std::string& token) - { - reference_tokens.push_back(token); - } - - /// @copydoc push_back(const std::string&) - void push_back(std::string&& token) - { - reference_tokens.push_back(std::move(token)); - } - - /*! - @brief return whether pointer points to the root document - - @return true iff the JSON pointer points to the root document - - @complexity Constant. - - @exceptionsafety No-throw guarantee: this function never throws exceptions. - - @liveexample{The example shows the result of `empty` for different JSON - Pointers.,json_pointer__empty} - - @since version 3.6.0 - */ - bool empty() const noexcept - { - return reference_tokens.empty(); - } - - private: - /*! - @param[in] s reference token to be converted into an array index - - @return integer representation of @a s - - @throw parse_error.106 if an array index begins with '0' - @throw parse_error.109 if an array index begins not with a digit - @throw out_of_range.404 if string @a s could not be converted to an integer - @throw out_of_range.410 if an array index exceeds size_type - */ - static typename BasicJsonType::size_type array_index(const std::string& s) - { - using size_type = typename BasicJsonType::size_type; - - // error condition (cf. RFC 6901, Sect. 4) - if (JSON_HEDLEY_UNLIKELY(s.size() > 1 && s[0] == '0')) - { - JSON_THROW(detail::parse_error::create(106, 0, - "array index '" + s + - "' must not begin with '0'")); - } - - // error condition (cf. RFC 6901, Sect. 4) - if (JSON_HEDLEY_UNLIKELY(s.size() > 1 && !(s[0] >= '1' && s[0] <= '9'))) - { - JSON_THROW(detail::parse_error::create(109, 0, "array index '" + s + "' is not a number")); - } - - std::size_t processed_chars = 0; - unsigned long long res = 0; - JSON_TRY - { - res = std::stoull(s, &processed_chars); - } - JSON_CATCH(std::out_of_range&) - { - JSON_THROW(detail::out_of_range::create(404, "unresolved reference token '" + s + "'")); - } - - // check if the string was completely read - if (JSON_HEDLEY_UNLIKELY(processed_chars != s.size())) - { - JSON_THROW(detail::out_of_range::create(404, "unresolved reference token '" + s + "'")); - } - - // only triggered on special platforms (like 32bit), see also - // https://github.com/nlohmann/json/pull/2203 - if (res >= static_cast((std::numeric_limits::max)())) - { - JSON_THROW(detail::out_of_range::create(410, "array index " + s + " exceeds size_type")); // LCOV_EXCL_LINE - } - - return static_cast(res); - } - - json_pointer top() const - { - if (JSON_HEDLEY_UNLIKELY(empty())) - { - JSON_THROW(detail::out_of_range::create(405, "JSON pointer has no parent")); - } - - json_pointer result = *this; - result.reference_tokens = {reference_tokens[0]}; - return result; - } - - /*! - @brief create and return a reference to the pointed to value - - @complexity Linear in the number of reference tokens. - - @throw parse_error.109 if array index is not a number - @throw type_error.313 if value cannot be unflattened - */ - BasicJsonType& get_and_create(BasicJsonType& j) const - { - auto result = &j; - - // in case no reference tokens exist, return a reference to the JSON value - // j which will be overwritten by a primitive value - for (const auto& reference_token : reference_tokens) - { - switch (result->type()) - { - case detail::value_t::null: - { - if (reference_token == "0") - { - // start a new array if reference token is 0 - result = &result->operator[](0); - } - else - { - // start a new object otherwise - result = &result->operator[](reference_token); - } - break; - } - - case detail::value_t::object: - { - // create an entry in the object - result = &result->operator[](reference_token); - break; - } - - case detail::value_t::array: - { - // create an entry in the array - result = &result->operator[](array_index(reference_token)); - break; - } - - /* - The following code is only reached if there exists a reference - token _and_ the current value is primitive. In this case, we have - an error situation, because primitive values may only occur as - single value; that is, with an empty list of reference tokens. - */ - default: - JSON_THROW(detail::type_error::create(313, "invalid value to unflatten")); - } - } - - return *result; - } - - /*! - @brief return a reference to the pointed to value - - @note This version does not throw if a value is not present, but tries to - create nested values instead. For instance, calling this function - with pointer `"/this/that"` on a null value is equivalent to calling - `operator[]("this").operator[]("that")` on that value, effectively - changing the null value to an object. - - @param[in] ptr a JSON value - - @return reference to the JSON value pointed to by the JSON pointer - - @complexity Linear in the length of the JSON pointer. - - @throw parse_error.106 if an array index begins with '0' - @throw parse_error.109 if an array index was not a number - @throw out_of_range.404 if the JSON pointer can not be resolved - */ - BasicJsonType& get_unchecked(BasicJsonType* ptr) const - { - for (const auto& reference_token : reference_tokens) - { - // convert null values to arrays or objects before continuing - if (ptr->is_null()) - { - // check if reference token is a number - const bool nums = - std::all_of(reference_token.begin(), reference_token.end(), - [](const unsigned char x) - { - return std::isdigit(x); - }); - - // change value to array for numbers or "-" or to object otherwise - *ptr = (nums || reference_token == "-") - ? detail::value_t::array - : detail::value_t::object; - } - - switch (ptr->type()) - { - case detail::value_t::object: - { - // use unchecked object access - ptr = &ptr->operator[](reference_token); - break; - } - - case detail::value_t::array: - { - if (reference_token == "-") - { - // explicitly treat "-" as index beyond the end - ptr = &ptr->operator[](ptr->m_value.array->size()); - } - else - { - // convert array index to number; unchecked access - ptr = &ptr->operator[](array_index(reference_token)); - } - break; - } - - default: - JSON_THROW(detail::out_of_range::create(404, "unresolved reference token '" + reference_token + "'")); - } - } - - return *ptr; - } - - /*! - @throw parse_error.106 if an array index begins with '0' - @throw parse_error.109 if an array index was not a number - @throw out_of_range.402 if the array index '-' is used - @throw out_of_range.404 if the JSON pointer can not be resolved - */ - BasicJsonType& get_checked(BasicJsonType* ptr) const - { - for (const auto& reference_token : reference_tokens) - { - switch (ptr->type()) - { - case detail::value_t::object: - { - // note: at performs range check - ptr = &ptr->at(reference_token); - break; - } - - case detail::value_t::array: - { - if (JSON_HEDLEY_UNLIKELY(reference_token == "-")) - { - // "-" always fails the range check - JSON_THROW(detail::out_of_range::create(402, - "array index '-' (" + std::to_string(ptr->m_value.array->size()) + - ") is out of range")); - } - - // note: at performs range check - ptr = &ptr->at(array_index(reference_token)); - break; - } - - default: - JSON_THROW(detail::out_of_range::create(404, "unresolved reference token '" + reference_token + "'")); - } - } - - return *ptr; - } - - /*! - @brief return a const reference to the pointed to value - - @param[in] ptr a JSON value - - @return const reference to the JSON value pointed to by the JSON - pointer - - @throw parse_error.106 if an array index begins with '0' - @throw parse_error.109 if an array index was not a number - @throw out_of_range.402 if the array index '-' is used - @throw out_of_range.404 if the JSON pointer can not be resolved - */ - const BasicJsonType& get_unchecked(const BasicJsonType* ptr) const - { - for (const auto& reference_token : reference_tokens) - { - switch (ptr->type()) - { - case detail::value_t::object: - { - // use unchecked object access - ptr = &ptr->operator[](reference_token); - break; - } - - case detail::value_t::array: - { - if (JSON_HEDLEY_UNLIKELY(reference_token == "-")) - { - // "-" cannot be used for const access - JSON_THROW(detail::out_of_range::create(402, - "array index '-' (" + std::to_string(ptr->m_value.array->size()) + - ") is out of range")); - } - - // use unchecked array access - ptr = &ptr->operator[](array_index(reference_token)); - break; - } - - default: - JSON_THROW(detail::out_of_range::create(404, "unresolved reference token '" + reference_token + "'")); - } - } - - return *ptr; - } - - /*! - @throw parse_error.106 if an array index begins with '0' - @throw parse_error.109 if an array index was not a number - @throw out_of_range.402 if the array index '-' is used - @throw out_of_range.404 if the JSON pointer can not be resolved - */ - const BasicJsonType& get_checked(const BasicJsonType* ptr) const - { - for (const auto& reference_token : reference_tokens) - { - switch (ptr->type()) - { - case detail::value_t::object: - { - // note: at performs range check - ptr = &ptr->at(reference_token); - break; - } - - case detail::value_t::array: - { - if (JSON_HEDLEY_UNLIKELY(reference_token == "-")) - { - // "-" always fails the range check - JSON_THROW(detail::out_of_range::create(402, - "array index '-' (" + std::to_string(ptr->m_value.array->size()) + - ") is out of range")); - } - - // note: at performs range check - ptr = &ptr->at(array_index(reference_token)); - break; - } - - default: - JSON_THROW(detail::out_of_range::create(404, "unresolved reference token '" + reference_token + "'")); - } - } - - return *ptr; - } - - /*! - @throw parse_error.106 if an array index begins with '0' - @throw parse_error.109 if an array index was not a number - */ - bool contains(const BasicJsonType* ptr) const - { - for (const auto& reference_token : reference_tokens) - { - switch (ptr->type()) - { - case detail::value_t::object: - { - if (!ptr->contains(reference_token)) - { - // we did not find the key in the object - return false; - } - - ptr = &ptr->operator[](reference_token); - break; - } - - case detail::value_t::array: - { - if (JSON_HEDLEY_UNLIKELY(reference_token == "-")) - { - // "-" always fails the range check - return false; - } - if (JSON_HEDLEY_UNLIKELY(reference_token.size() == 1 && !("0" <= reference_token && reference_token <= "9"))) - { - // invalid char - return false; - } - if (JSON_HEDLEY_UNLIKELY(reference_token.size() > 1)) - { - if (JSON_HEDLEY_UNLIKELY(!('1' <= reference_token[0] && reference_token[0] <= '9'))) - { - // first char should be between '1' and '9' - return false; - } - for (std::size_t i = 1; i < reference_token.size(); i++) - { - if (JSON_HEDLEY_UNLIKELY(!('0' <= reference_token[i] && reference_token[i] <= '9'))) - { - // other char should be between '0' and '9' - return false; - } - } - } - - const auto idx = array_index(reference_token); - if (idx >= ptr->size()) - { - // index out of range - return false; - } - - ptr = &ptr->operator[](idx); - break; - } - - default: - { - // we do not expect primitive values if there is still a - // reference token to process - return false; - } - } - } - - // no reference token left means we found a primitive value - return true; - } - - /*! - @brief split the string input to reference tokens - - @note This function is only called by the json_pointer constructor. - All exceptions below are documented there. - - @throw parse_error.107 if the pointer is not empty or begins with '/' - @throw parse_error.108 if character '~' is not followed by '0' or '1' - */ - static std::vector split(const std::string& reference_string) - { - std::vector result; - - // special case: empty reference string -> no reference tokens - if (reference_string.empty()) - { - return result; - } - - // check if nonempty reference string begins with slash - if (JSON_HEDLEY_UNLIKELY(reference_string[0] != '/')) - { - JSON_THROW(detail::parse_error::create(107, 1, - "JSON pointer must be empty or begin with '/' - was: '" + - reference_string + "'")); - } - - // extract the reference tokens: - // - slash: position of the last read slash (or end of string) - // - start: position after the previous slash - for ( - // search for the first slash after the first character - std::size_t slash = reference_string.find_first_of('/', 1), - // set the beginning of the first reference token - start = 1; - // we can stop if start == 0 (if slash == std::string::npos) - start != 0; - // set the beginning of the next reference token - // (will eventually be 0 if slash == std::string::npos) - start = (slash == std::string::npos) ? 0 : slash + 1, - // find next slash - slash = reference_string.find_first_of('/', start)) - { - // use the text between the beginning of the reference token - // (start) and the last slash (slash). - auto reference_token = reference_string.substr(start, slash - start); - - // check reference tokens are properly escaped - for (std::size_t pos = reference_token.find_first_of('~'); - pos != std::string::npos; - pos = reference_token.find_first_of('~', pos + 1)) - { - JSON_ASSERT(reference_token[pos] == '~'); - - // ~ must be followed by 0 or 1 - if (JSON_HEDLEY_UNLIKELY(pos == reference_token.size() - 1 || - (reference_token[pos + 1] != '0' && - reference_token[pos + 1] != '1'))) - { - JSON_THROW(detail::parse_error::create(108, 0, "escape character '~' must be followed with '0' or '1'")); - } - } - - // finally, store the reference token - unescape(reference_token); - result.push_back(reference_token); - } - - return result; - } - - /*! - @brief replace all occurrences of a substring by another string - - @param[in,out] s the string to manipulate; changed so that all - occurrences of @a f are replaced with @a t - @param[in] f the substring to replace with @a t - @param[in] t the string to replace @a f - - @pre The search string @a f must not be empty. **This precondition is - enforced with an assertion.** - - @since version 2.0.0 - */ - static void replace_substring(std::string& s, const std::string& f, - const std::string& t) - { - JSON_ASSERT(!f.empty()); - for (auto pos = s.find(f); // find first occurrence of f - pos != std::string::npos; // make sure f was found - s.replace(pos, f.size(), t), // replace with t, and - pos = s.find(f, pos + t.size())) // find next occurrence of f - {} - } - - /// escape "~" to "~0" and "/" to "~1" - static std::string escape(std::string s) - { - replace_substring(s, "~", "~0"); - replace_substring(s, "/", "~1"); - return s; - } - - /// unescape "~1" to tilde and "~0" to slash (order is important!) - static void unescape(std::string& s) - { - replace_substring(s, "~1", "/"); - replace_substring(s, "~0", "~"); - } - - /*! - @param[in] reference_string the reference string to the current value - @param[in] value the value to consider - @param[in,out] result the result object to insert values to - - @note Empty objects or arrays are flattened to `null`. - */ - static void flatten(const std::string& reference_string, - const BasicJsonType& value, - BasicJsonType& result) - { - switch (value.type()) - { - case detail::value_t::array: - { - if (value.m_value.array->empty()) - { - // flatten empty array as null - result[reference_string] = nullptr; - } - else - { - // iterate array and use index as reference string - for (std::size_t i = 0; i < value.m_value.array->size(); ++i) - { - flatten(reference_string + "/" + std::to_string(i), - value.m_value.array->operator[](i), result); - } - } - break; - } - - case detail::value_t::object: - { - if (value.m_value.object->empty()) - { - // flatten empty object as null - result[reference_string] = nullptr; - } - else - { - // iterate object and use keys as reference string - for (const auto& element : *value.m_value.object) - { - flatten(reference_string + "/" + escape(element.first), element.second, result); - } - } - break; - } - - default: - { - // add primitive value with its reference string - result[reference_string] = value; - break; - } - } - } - - /*! - @param[in] value flattened JSON - - @return unflattened JSON - - @throw parse_error.109 if array index is not a number - @throw type_error.314 if value is not an object - @throw type_error.315 if object values are not primitive - @throw type_error.313 if value cannot be unflattened - */ - static BasicJsonType - unflatten(const BasicJsonType& value) - { - if (JSON_HEDLEY_UNLIKELY(!value.is_object())) - { - JSON_THROW(detail::type_error::create(314, "only objects can be unflattened")); - } - - BasicJsonType result; - - // iterate the JSON object values - for (const auto& element : *value.m_value.object) - { - if (JSON_HEDLEY_UNLIKELY(!element.second.is_primitive())) - { - JSON_THROW(detail::type_error::create(315, "values in object must be primitive")); - } - - // assign value to reference pointed to by JSON pointer; Note that if - // the JSON pointer is "" (i.e., points to the whole value), function - // get_and_create returns a reference to result itself. An assignment - // will then create a primitive value. - json_pointer(element.first).get_and_create(result) = element.second; - } - - return result; - } - - /*! - @brief compares two JSON pointers for equality - - @param[in] lhs JSON pointer to compare - @param[in] rhs JSON pointer to compare - @return whether @a lhs is equal to @a rhs - - @complexity Linear in the length of the JSON pointer - - @exceptionsafety No-throw guarantee: this function never throws exceptions. - */ - friend bool operator==(json_pointer const& lhs, - json_pointer const& rhs) noexcept - { - return lhs.reference_tokens == rhs.reference_tokens; - } - - /*! - @brief compares two JSON pointers for inequality - - @param[in] lhs JSON pointer to compare - @param[in] rhs JSON pointer to compare - @return whether @a lhs is not equal @a rhs - - @complexity Linear in the length of the JSON pointer - - @exceptionsafety No-throw guarantee: this function never throws exceptions. - */ - friend bool operator!=(json_pointer const& lhs, - json_pointer const& rhs) noexcept - { - return !(lhs == rhs); - } - - /// the reference tokens - std::vector reference_tokens; -}; -} // namespace nlohmann - -// #include - - -#include -#include - -// #include - - -namespace nlohmann -{ -namespace detail -{ -template -class json_ref -{ - public: - using value_type = BasicJsonType; - - json_ref(value_type&& value) - : owned_value(std::move(value)) - , value_ref(&owned_value) - , is_rvalue(true) - {} - - json_ref(const value_type& value) - : value_ref(const_cast(&value)) - , is_rvalue(false) - {} - - json_ref(std::initializer_list init) - : owned_value(init) - , value_ref(&owned_value) - , is_rvalue(true) - {} - - template < - class... Args, - enable_if_t::value, int> = 0 > - json_ref(Args && ... args) - : owned_value(std::forward(args)...) - , value_ref(&owned_value) - , is_rvalue(true) - {} - - // class should be movable only - json_ref(json_ref&&) = default; - json_ref(const json_ref&) = delete; - json_ref& operator=(const json_ref&) = delete; - json_ref& operator=(json_ref&&) = delete; - ~json_ref() = default; - - value_type moved_or_copied() const - { - if (is_rvalue) - { - return std::move(*value_ref); - } - return *value_ref; - } - - value_type const& operator*() const - { - return *static_cast(value_ref); - } - - value_type const* operator->() const - { - return static_cast(value_ref); - } - - private: - mutable value_type owned_value = nullptr; - value_type* value_ref = nullptr; - const bool is_rvalue = true; -}; -} // namespace detail -} // namespace nlohmann - -// #include - -// #include - -// #include - -// #include - - -#include // reverse -#include // array -#include // uint8_t, uint16_t, uint32_t, uint64_t -#include // memcpy -#include // numeric_limits -#include // string -#include // isnan, isinf - -// #include - -// #include - -// #include - - -#include // copy -#include // size_t -#include // streamsize -#include // back_inserter -#include // shared_ptr, make_shared -#include // basic_ostream -#include // basic_string -#include // vector -// #include - - -namespace nlohmann -{ -namespace detail -{ -/// abstract output adapter interface -template struct output_adapter_protocol -{ - virtual void write_character(CharType c) = 0; - virtual void write_characters(const CharType* s, std::size_t length) = 0; - virtual ~output_adapter_protocol() = default; -}; - -/// a type to simplify interfaces -template -using output_adapter_t = std::shared_ptr>; - -/// output adapter for byte vectors -template -class output_vector_adapter : public output_adapter_protocol -{ - public: - explicit output_vector_adapter(std::vector& vec) noexcept - : v(vec) - {} - - void write_character(CharType c) override - { - v.push_back(c); - } - - JSON_HEDLEY_NON_NULL(2) - void write_characters(const CharType* s, std::size_t length) override - { - std::copy(s, s + length, std::back_inserter(v)); - } - - private: - std::vector& v; -}; - -/// output adapter for output streams -template -class output_stream_adapter : public output_adapter_protocol -{ - public: - explicit output_stream_adapter(std::basic_ostream& s) noexcept - : stream(s) - {} - - void write_character(CharType c) override - { - stream.put(c); - } - - JSON_HEDLEY_NON_NULL(2) - void write_characters(const CharType* s, std::size_t length) override - { - stream.write(s, static_cast(length)); - } - - private: - std::basic_ostream& stream; -}; - -/// output adapter for basic_string -template> -class output_string_adapter : public output_adapter_protocol -{ - public: - explicit output_string_adapter(StringType& s) noexcept - : str(s) - {} - - void write_character(CharType c) override - { - str.push_back(c); - } - - JSON_HEDLEY_NON_NULL(2) - void write_characters(const CharType* s, std::size_t length) override - { - str.append(s, length); - } - - private: - StringType& str; -}; - -template> -class output_adapter -{ - public: - output_adapter(std::vector& vec) - : oa(std::make_shared>(vec)) {} - - output_adapter(std::basic_ostream& s) - : oa(std::make_shared>(s)) {} - - output_adapter(StringType& s) - : oa(std::make_shared>(s)) {} - - operator output_adapter_t() - { - return oa; - } - - private: - output_adapter_t oa = nullptr; -}; -} // namespace detail -} // namespace nlohmann - - -namespace nlohmann -{ -namespace detail -{ -/////////////////// -// binary writer // -/////////////////// - -/*! -@brief serialization to CBOR and MessagePack values -*/ -template -class binary_writer -{ - using string_t = typename BasicJsonType::string_t; - using binary_t = typename BasicJsonType::binary_t; - using number_float_t = typename BasicJsonType::number_float_t; - - public: - /*! - @brief create a binary writer - - @param[in] adapter output adapter to write to - */ - explicit binary_writer(output_adapter_t adapter) : oa(adapter) - { - JSON_ASSERT(oa); - } - - /*! - @param[in] j JSON value to serialize - @pre j.type() == value_t::object - */ - void write_bson(const BasicJsonType& j) - { - switch (j.type()) - { - case value_t::object: - { - write_bson_object(*j.m_value.object); - break; - } - - default: - { - JSON_THROW(type_error::create(317, "to serialize to BSON, top-level type must be object, but is " + std::string(j.type_name()))); - } - } - } - - /*! - @param[in] j JSON value to serialize - */ - void write_cbor(const BasicJsonType& j) - { - switch (j.type()) - { - case value_t::null: - { - oa->write_character(to_char_type(0xF6)); - break; - } - - case value_t::boolean: - { - oa->write_character(j.m_value.boolean - ? to_char_type(0xF5) - : to_char_type(0xF4)); - break; - } - - case value_t::number_integer: - { - if (j.m_value.number_integer >= 0) - { - // CBOR does not differentiate between positive signed - // integers and unsigned integers. Therefore, we used the - // code from the value_t::number_unsigned case here. - if (j.m_value.number_integer <= 0x17) - { - write_number(static_cast(j.m_value.number_integer)); - } - else if (j.m_value.number_integer <= (std::numeric_limits::max)()) - { - oa->write_character(to_char_type(0x18)); - write_number(static_cast(j.m_value.number_integer)); - } - else if (j.m_value.number_integer <= (std::numeric_limits::max)()) - { - oa->write_character(to_char_type(0x19)); - write_number(static_cast(j.m_value.number_integer)); - } - else if (j.m_value.number_integer <= (std::numeric_limits::max)()) - { - oa->write_character(to_char_type(0x1A)); - write_number(static_cast(j.m_value.number_integer)); - } - else - { - oa->write_character(to_char_type(0x1B)); - write_number(static_cast(j.m_value.number_integer)); - } - } - else - { - // The conversions below encode the sign in the first - // byte, and the value is converted to a positive number. - const auto positive_number = -1 - j.m_value.number_integer; - if (j.m_value.number_integer >= -24) - { - write_number(static_cast(0x20 + positive_number)); - } - else if (positive_number <= (std::numeric_limits::max)()) - { - oa->write_character(to_char_type(0x38)); - write_number(static_cast(positive_number)); - } - else if (positive_number <= (std::numeric_limits::max)()) - { - oa->write_character(to_char_type(0x39)); - write_number(static_cast(positive_number)); - } - else if (positive_number <= (std::numeric_limits::max)()) - { - oa->write_character(to_char_type(0x3A)); - write_number(static_cast(positive_number)); - } - else - { - oa->write_character(to_char_type(0x3B)); - write_number(static_cast(positive_number)); - } - } - break; - } - - case value_t::number_unsigned: - { - if (j.m_value.number_unsigned <= 0x17) - { - write_number(static_cast(j.m_value.number_unsigned)); - } - else if (j.m_value.number_unsigned <= (std::numeric_limits::max)()) - { - oa->write_character(to_char_type(0x18)); - write_number(static_cast(j.m_value.number_unsigned)); - } - else if (j.m_value.number_unsigned <= (std::numeric_limits::max)()) - { - oa->write_character(to_char_type(0x19)); - write_number(static_cast(j.m_value.number_unsigned)); - } - else if (j.m_value.number_unsigned <= (std::numeric_limits::max)()) - { - oa->write_character(to_char_type(0x1A)); - write_number(static_cast(j.m_value.number_unsigned)); - } - else - { - oa->write_character(to_char_type(0x1B)); - write_number(static_cast(j.m_value.number_unsigned)); - } - break; - } - - case value_t::number_float: - { - if (std::isnan(j.m_value.number_float)) - { - // NaN is 0xf97e00 in CBOR - oa->write_character(to_char_type(0xF9)); - oa->write_character(to_char_type(0x7E)); - oa->write_character(to_char_type(0x00)); - } - else if (std::isinf(j.m_value.number_float)) - { - // Infinity is 0xf97c00, -Infinity is 0xf9fc00 - oa->write_character(to_char_type(0xf9)); - oa->write_character(j.m_value.number_float > 0 ? to_char_type(0x7C) : to_char_type(0xFC)); - oa->write_character(to_char_type(0x00)); - } - else - { - write_compact_float(j.m_value.number_float, detail::input_format_t::cbor); - } - break; - } - - case value_t::string: - { - // step 1: write control byte and the string length - const auto N = j.m_value.string->size(); - if (N <= 0x17) - { - write_number(static_cast(0x60 + N)); - } - else if (N <= (std::numeric_limits::max)()) - { - oa->write_character(to_char_type(0x78)); - write_number(static_cast(N)); - } - else if (N <= (std::numeric_limits::max)()) - { - oa->write_character(to_char_type(0x79)); - write_number(static_cast(N)); - } - else if (N <= (std::numeric_limits::max)()) - { - oa->write_character(to_char_type(0x7A)); - write_number(static_cast(N)); - } - // LCOV_EXCL_START - else if (N <= (std::numeric_limits::max)()) - { - oa->write_character(to_char_type(0x7B)); - write_number(static_cast(N)); - } - // LCOV_EXCL_STOP - - // step 2: write the string - oa->write_characters( - reinterpret_cast(j.m_value.string->c_str()), - j.m_value.string->size()); - break; - } - - case value_t::array: - { - // step 1: write control byte and the array size - const auto N = j.m_value.array->size(); - if (N <= 0x17) - { - write_number(static_cast(0x80 + N)); - } - else if (N <= (std::numeric_limits::max)()) - { - oa->write_character(to_char_type(0x98)); - write_number(static_cast(N)); - } - else if (N <= (std::numeric_limits::max)()) - { - oa->write_character(to_char_type(0x99)); - write_number(static_cast(N)); - } - else if (N <= (std::numeric_limits::max)()) - { - oa->write_character(to_char_type(0x9A)); - write_number(static_cast(N)); - } - // LCOV_EXCL_START - else if (N <= (std::numeric_limits::max)()) - { - oa->write_character(to_char_type(0x9B)); - write_number(static_cast(N)); - } - // LCOV_EXCL_STOP - - // step 2: write each element - for (const auto& el : *j.m_value.array) - { - write_cbor(el); - } - break; - } - - case value_t::binary: - { - if (j.m_value.binary->has_subtype()) - { - write_number(static_cast(0xd8)); - write_number(j.m_value.binary->subtype()); - } - - // step 1: write control byte and the binary array size - const auto N = j.m_value.binary->size(); - if (N <= 0x17) - { - write_number(static_cast(0x40 + N)); - } - else if (N <= (std::numeric_limits::max)()) - { - oa->write_character(to_char_type(0x58)); - write_number(static_cast(N)); - } - else if (N <= (std::numeric_limits::max)()) - { - oa->write_character(to_char_type(0x59)); - write_number(static_cast(N)); - } - else if (N <= (std::numeric_limits::max)()) - { - oa->write_character(to_char_type(0x5A)); - write_number(static_cast(N)); - } - // LCOV_EXCL_START - else if (N <= (std::numeric_limits::max)()) - { - oa->write_character(to_char_type(0x5B)); - write_number(static_cast(N)); - } - // LCOV_EXCL_STOP - - // step 2: write each element - oa->write_characters( - reinterpret_cast(j.m_value.binary->data()), - N); - - break; - } - - case value_t::object: - { - // step 1: write control byte and the object size - const auto N = j.m_value.object->size(); - if (N <= 0x17) - { - write_number(static_cast(0xA0 + N)); - } - else if (N <= (std::numeric_limits::max)()) - { - oa->write_character(to_char_type(0xB8)); - write_number(static_cast(N)); - } - else if (N <= (std::numeric_limits::max)()) - { - oa->write_character(to_char_type(0xB9)); - write_number(static_cast(N)); - } - else if (N <= (std::numeric_limits::max)()) - { - oa->write_character(to_char_type(0xBA)); - write_number(static_cast(N)); - } - // LCOV_EXCL_START - else if (N <= (std::numeric_limits::max)()) - { - oa->write_character(to_char_type(0xBB)); - write_number(static_cast(N)); - } - // LCOV_EXCL_STOP - - // step 2: write each element - for (const auto& el : *j.m_value.object) - { - write_cbor(el.first); - write_cbor(el.second); - } - break; - } - - default: - break; - } - } - - /*! - @param[in] j JSON value to serialize - */ - void write_msgpack(const BasicJsonType& j) - { - switch (j.type()) - { - case value_t::null: // nil - { - oa->write_character(to_char_type(0xC0)); - break; - } - - case value_t::boolean: // true and false - { - oa->write_character(j.m_value.boolean - ? to_char_type(0xC3) - : to_char_type(0xC2)); - break; - } - - case value_t::number_integer: - { - if (j.m_value.number_integer >= 0) - { - // MessagePack does not differentiate between positive - // signed integers and unsigned integers. Therefore, we used - // the code from the value_t::number_unsigned case here. - if (j.m_value.number_unsigned < 128) - { - // positive fixnum - write_number(static_cast(j.m_value.number_integer)); - } - else if (j.m_value.number_unsigned <= (std::numeric_limits::max)()) - { - // uint 8 - oa->write_character(to_char_type(0xCC)); - write_number(static_cast(j.m_value.number_integer)); - } - else if (j.m_value.number_unsigned <= (std::numeric_limits::max)()) - { - // uint 16 - oa->write_character(to_char_type(0xCD)); - write_number(static_cast(j.m_value.number_integer)); - } - else if (j.m_value.number_unsigned <= (std::numeric_limits::max)()) - { - // uint 32 - oa->write_character(to_char_type(0xCE)); - write_number(static_cast(j.m_value.number_integer)); - } - else if (j.m_value.number_unsigned <= (std::numeric_limits::max)()) - { - // uint 64 - oa->write_character(to_char_type(0xCF)); - write_number(static_cast(j.m_value.number_integer)); - } - } - else - { - if (j.m_value.number_integer >= -32) - { - // negative fixnum - write_number(static_cast(j.m_value.number_integer)); - } - else if (j.m_value.number_integer >= (std::numeric_limits::min)() && - j.m_value.number_integer <= (std::numeric_limits::max)()) - { - // int 8 - oa->write_character(to_char_type(0xD0)); - write_number(static_cast(j.m_value.number_integer)); - } - else if (j.m_value.number_integer >= (std::numeric_limits::min)() && - j.m_value.number_integer <= (std::numeric_limits::max)()) - { - // int 16 - oa->write_character(to_char_type(0xD1)); - write_number(static_cast(j.m_value.number_integer)); - } - else if (j.m_value.number_integer >= (std::numeric_limits::min)() && - j.m_value.number_integer <= (std::numeric_limits::max)()) - { - // int 32 - oa->write_character(to_char_type(0xD2)); - write_number(static_cast(j.m_value.number_integer)); - } - else if (j.m_value.number_integer >= (std::numeric_limits::min)() && - j.m_value.number_integer <= (std::numeric_limits::max)()) - { - // int 64 - oa->write_character(to_char_type(0xD3)); - write_number(static_cast(j.m_value.number_integer)); - } - } - break; - } - - case value_t::number_unsigned: - { - if (j.m_value.number_unsigned < 128) - { - // positive fixnum - write_number(static_cast(j.m_value.number_integer)); - } - else if (j.m_value.number_unsigned <= (std::numeric_limits::max)()) - { - // uint 8 - oa->write_character(to_char_type(0xCC)); - write_number(static_cast(j.m_value.number_integer)); - } - else if (j.m_value.number_unsigned <= (std::numeric_limits::max)()) - { - // uint 16 - oa->write_character(to_char_type(0xCD)); - write_number(static_cast(j.m_value.number_integer)); - } - else if (j.m_value.number_unsigned <= (std::numeric_limits::max)()) - { - // uint 32 - oa->write_character(to_char_type(0xCE)); - write_number(static_cast(j.m_value.number_integer)); - } - else if (j.m_value.number_unsigned <= (std::numeric_limits::max)()) - { - // uint 64 - oa->write_character(to_char_type(0xCF)); - write_number(static_cast(j.m_value.number_integer)); - } - break; - } - - case value_t::number_float: - { - write_compact_float(j.m_value.number_float, detail::input_format_t::msgpack); - break; - } - - case value_t::string: - { - // step 1: write control byte and the string length - const auto N = j.m_value.string->size(); - if (N <= 31) - { - // fixstr - write_number(static_cast(0xA0 | N)); - } - else if (N <= (std::numeric_limits::max)()) - { - // str 8 - oa->write_character(to_char_type(0xD9)); - write_number(static_cast(N)); - } - else if (N <= (std::numeric_limits::max)()) - { - // str 16 - oa->write_character(to_char_type(0xDA)); - write_number(static_cast(N)); - } - else if (N <= (std::numeric_limits::max)()) - { - // str 32 - oa->write_character(to_char_type(0xDB)); - write_number(static_cast(N)); - } - - // step 2: write the string - oa->write_characters( - reinterpret_cast(j.m_value.string->c_str()), - j.m_value.string->size()); - break; - } - - case value_t::array: - { - // step 1: write control byte and the array size - const auto N = j.m_value.array->size(); - if (N <= 15) - { - // fixarray - write_number(static_cast(0x90 | N)); - } - else if (N <= (std::numeric_limits::max)()) - { - // array 16 - oa->write_character(to_char_type(0xDC)); - write_number(static_cast(N)); - } - else if (N <= (std::numeric_limits::max)()) - { - // array 32 - oa->write_character(to_char_type(0xDD)); - write_number(static_cast(N)); - } - - // step 2: write each element - for (const auto& el : *j.m_value.array) - { - write_msgpack(el); - } - break; - } - - case value_t::binary: - { - // step 0: determine if the binary type has a set subtype to - // determine whether or not to use the ext or fixext types - const bool use_ext = j.m_value.binary->has_subtype(); - - // step 1: write control byte and the byte string length - const auto N = j.m_value.binary->size(); - if (N <= (std::numeric_limits::max)()) - { - std::uint8_t output_type{}; - bool fixed = true; - if (use_ext) - { - switch (N) - { - case 1: - output_type = 0xD4; // fixext 1 - break; - case 2: - output_type = 0xD5; // fixext 2 - break; - case 4: - output_type = 0xD6; // fixext 4 - break; - case 8: - output_type = 0xD7; // fixext 8 - break; - case 16: - output_type = 0xD8; // fixext 16 - break; - default: - output_type = 0xC7; // ext 8 - fixed = false; - break; - } - - } - else - { - output_type = 0xC4; // bin 8 - fixed = false; - } - - oa->write_character(to_char_type(output_type)); - if (!fixed) - { - write_number(static_cast(N)); - } - } - else if (N <= (std::numeric_limits::max)()) - { - std::uint8_t output_type = use_ext - ? 0xC8 // ext 16 - : 0xC5; // bin 16 - - oa->write_character(to_char_type(output_type)); - write_number(static_cast(N)); - } - else if (N <= (std::numeric_limits::max)()) - { - std::uint8_t output_type = use_ext - ? 0xC9 // ext 32 - : 0xC6; // bin 32 - - oa->write_character(to_char_type(output_type)); - write_number(static_cast(N)); - } - - // step 1.5: if this is an ext type, write the subtype - if (use_ext) - { - write_number(static_cast(j.m_value.binary->subtype())); - } - - // step 2: write the byte string - oa->write_characters( - reinterpret_cast(j.m_value.binary->data()), - N); - - break; - } - - case value_t::object: - { - // step 1: write control byte and the object size - const auto N = j.m_value.object->size(); - if (N <= 15) - { - // fixmap - write_number(static_cast(0x80 | (N & 0xF))); - } - else if (N <= (std::numeric_limits::max)()) - { - // map 16 - oa->write_character(to_char_type(0xDE)); - write_number(static_cast(N)); - } - else if (N <= (std::numeric_limits::max)()) - { - // map 32 - oa->write_character(to_char_type(0xDF)); - write_number(static_cast(N)); - } - - // step 2: write each element - for (const auto& el : *j.m_value.object) - { - write_msgpack(el.first); - write_msgpack(el.second); - } - break; - } - - default: - break; - } - } - - /*! - @param[in] j JSON value to serialize - @param[in] use_count whether to use '#' prefixes (optimized format) - @param[in] use_type whether to use '$' prefixes (optimized format) - @param[in] add_prefix whether prefixes need to be used for this value - */ - void write_ubjson(const BasicJsonType& j, const bool use_count, - const bool use_type, const bool add_prefix = true) - { - switch (j.type()) - { - case value_t::null: - { - if (add_prefix) - { - oa->write_character(to_char_type('Z')); - } - break; - } - - case value_t::boolean: - { - if (add_prefix) - { - oa->write_character(j.m_value.boolean - ? to_char_type('T') - : to_char_type('F')); - } - break; - } - - case value_t::number_integer: - { - write_number_with_ubjson_prefix(j.m_value.number_integer, add_prefix); - break; - } - - case value_t::number_unsigned: - { - write_number_with_ubjson_prefix(j.m_value.number_unsigned, add_prefix); - break; - } - - case value_t::number_float: - { - write_number_with_ubjson_prefix(j.m_value.number_float, add_prefix); - break; - } - - case value_t::string: - { - if (add_prefix) - { - oa->write_character(to_char_type('S')); - } - write_number_with_ubjson_prefix(j.m_value.string->size(), true); - oa->write_characters( - reinterpret_cast(j.m_value.string->c_str()), - j.m_value.string->size()); - break; - } - - case value_t::array: - { - if (add_prefix) - { - oa->write_character(to_char_type('[')); - } - - bool prefix_required = true; - if (use_type && !j.m_value.array->empty()) - { - JSON_ASSERT(use_count); - const CharType first_prefix = ubjson_prefix(j.front()); - const bool same_prefix = std::all_of(j.begin() + 1, j.end(), - [this, first_prefix](const BasicJsonType & v) - { - return ubjson_prefix(v) == first_prefix; - }); - - if (same_prefix) - { - prefix_required = false; - oa->write_character(to_char_type('$')); - oa->write_character(first_prefix); - } - } - - if (use_count) - { - oa->write_character(to_char_type('#')); - write_number_with_ubjson_prefix(j.m_value.array->size(), true); - } - - for (const auto& el : *j.m_value.array) - { - write_ubjson(el, use_count, use_type, prefix_required); - } - - if (!use_count) - { - oa->write_character(to_char_type(']')); - } - - break; - } - - case value_t::binary: - { - if (add_prefix) - { - oa->write_character(to_char_type('[')); - } - - if (use_type && !j.m_value.binary->empty()) - { - JSON_ASSERT(use_count); - oa->write_character(to_char_type('$')); - oa->write_character('U'); - } - - if (use_count) - { - oa->write_character(to_char_type('#')); - write_number_with_ubjson_prefix(j.m_value.binary->size(), true); - } - - if (use_type) - { - oa->write_characters( - reinterpret_cast(j.m_value.binary->data()), - j.m_value.binary->size()); - } - else - { - for (size_t i = 0; i < j.m_value.binary->size(); ++i) - { - oa->write_character(to_char_type('U')); - oa->write_character(j.m_value.binary->data()[i]); - } - } - - if (!use_count) - { - oa->write_character(to_char_type(']')); - } - - break; - } - - case value_t::object: - { - if (add_prefix) - { - oa->write_character(to_char_type('{')); - } - - bool prefix_required = true; - if (use_type && !j.m_value.object->empty()) - { - JSON_ASSERT(use_count); - const CharType first_prefix = ubjson_prefix(j.front()); - const bool same_prefix = std::all_of(j.begin(), j.end(), - [this, first_prefix](const BasicJsonType & v) - { - return ubjson_prefix(v) == first_prefix; - }); - - if (same_prefix) - { - prefix_required = false; - oa->write_character(to_char_type('$')); - oa->write_character(first_prefix); - } - } - - if (use_count) - { - oa->write_character(to_char_type('#')); - write_number_with_ubjson_prefix(j.m_value.object->size(), true); - } - - for (const auto& el : *j.m_value.object) - { - write_number_with_ubjson_prefix(el.first.size(), true); - oa->write_characters( - reinterpret_cast(el.first.c_str()), - el.first.size()); - write_ubjson(el.second, use_count, use_type, prefix_required); - } - - if (!use_count) - { - oa->write_character(to_char_type('}')); - } - - break; - } - - default: - break; - } - } - - private: - ////////// - // BSON // - ////////// - - /*! - @return The size of a BSON document entry header, including the id marker - and the entry name size (and its null-terminator). - */ - static std::size_t calc_bson_entry_header_size(const string_t& name) - { - const auto it = name.find(static_cast(0)); - if (JSON_HEDLEY_UNLIKELY(it != BasicJsonType::string_t::npos)) - { - JSON_THROW(out_of_range::create(409, - "BSON key cannot contain code point U+0000 (at byte " + std::to_string(it) + ")")); - } - - return /*id*/ 1ul + name.size() + /*zero-terminator*/1u; - } - - /*! - @brief Writes the given @a element_type and @a name to the output adapter - */ - void write_bson_entry_header(const string_t& name, - const std::uint8_t element_type) - { - oa->write_character(to_char_type(element_type)); // boolean - oa->write_characters( - reinterpret_cast(name.c_str()), - name.size() + 1u); - } - - /*! - @brief Writes a BSON element with key @a name and boolean value @a value - */ - void write_bson_boolean(const string_t& name, - const bool value) - { - write_bson_entry_header(name, 0x08); - oa->write_character(value ? to_char_type(0x01) : to_char_type(0x00)); - } - - /*! - @brief Writes a BSON element with key @a name and double value @a value - */ - void write_bson_double(const string_t& name, - const double value) - { - write_bson_entry_header(name, 0x01); - write_number(value); - } - - /*! - @return The size of the BSON-encoded string in @a value - */ - static std::size_t calc_bson_string_size(const string_t& value) - { - return sizeof(std::int32_t) + value.size() + 1ul; - } - - /*! - @brief Writes a BSON element with key @a name and string value @a value - */ - void write_bson_string(const string_t& name, - const string_t& value) - { - write_bson_entry_header(name, 0x02); - - write_number(static_cast(value.size() + 1ul)); - oa->write_characters( - reinterpret_cast(value.c_str()), - value.size() + 1); - } - - /*! - @brief Writes a BSON element with key @a name and null value - */ - void write_bson_null(const string_t& name) - { - write_bson_entry_header(name, 0x0A); - } - - /*! - @return The size of the BSON-encoded integer @a value - */ - static std::size_t calc_bson_integer_size(const std::int64_t value) - { - return (std::numeric_limits::min)() <= value && value <= (std::numeric_limits::max)() - ? sizeof(std::int32_t) - : sizeof(std::int64_t); - } - - /*! - @brief Writes a BSON element with key @a name and integer @a value - */ - void write_bson_integer(const string_t& name, - const std::int64_t value) - { - if ((std::numeric_limits::min)() <= value && value <= (std::numeric_limits::max)()) - { - write_bson_entry_header(name, 0x10); // int32 - write_number(static_cast(value)); - } - else - { - write_bson_entry_header(name, 0x12); // int64 - write_number(static_cast(value)); - } - } - - /*! - @return The size of the BSON-encoded unsigned integer in @a j - */ - static constexpr std::size_t calc_bson_unsigned_size(const std::uint64_t value) noexcept - { - return (value <= static_cast((std::numeric_limits::max)())) - ? sizeof(std::int32_t) - : sizeof(std::int64_t); - } - - /*! - @brief Writes a BSON element with key @a name and unsigned @a value - */ - void write_bson_unsigned(const string_t& name, - const std::uint64_t value) - { - if (value <= static_cast((std::numeric_limits::max)())) - { - write_bson_entry_header(name, 0x10 /* int32 */); - write_number(static_cast(value)); - } - else if (value <= static_cast((std::numeric_limits::max)())) - { - write_bson_entry_header(name, 0x12 /* int64 */); - write_number(static_cast(value)); - } - else - { - JSON_THROW(out_of_range::create(407, "integer number " + std::to_string(value) + " cannot be represented by BSON as it does not fit int64")); - } - } - - /*! - @brief Writes a BSON element with key @a name and object @a value - */ - void write_bson_object_entry(const string_t& name, - const typename BasicJsonType::object_t& value) - { - write_bson_entry_header(name, 0x03); // object - write_bson_object(value); - } - - /*! - @return The size of the BSON-encoded array @a value - */ - static std::size_t calc_bson_array_size(const typename BasicJsonType::array_t& value) - { - std::size_t array_index = 0ul; - - const std::size_t embedded_document_size = std::accumulate(std::begin(value), std::end(value), std::size_t(0), [&array_index](std::size_t result, const typename BasicJsonType::array_t::value_type & el) - { - return result + calc_bson_element_size(std::to_string(array_index++), el); - }); - - return sizeof(std::int32_t) + embedded_document_size + 1ul; - } - - /*! - @return The size of the BSON-encoded binary array @a value - */ - static std::size_t calc_bson_binary_size(const typename BasicJsonType::binary_t& value) - { - return sizeof(std::int32_t) + value.size() + 1ul; - } - - /*! - @brief Writes a BSON element with key @a name and array @a value - */ - void write_bson_array(const string_t& name, - const typename BasicJsonType::array_t& value) - { - write_bson_entry_header(name, 0x04); // array - write_number(static_cast(calc_bson_array_size(value))); - - std::size_t array_index = 0ul; - - for (const auto& el : value) - { - write_bson_element(std::to_string(array_index++), el); - } - - oa->write_character(to_char_type(0x00)); - } - - /*! - @brief Writes a BSON element with key @a name and binary value @a value - */ - void write_bson_binary(const string_t& name, - const binary_t& value) - { - write_bson_entry_header(name, 0x05); - - write_number(static_cast(value.size())); - write_number(value.has_subtype() ? value.subtype() : std::uint8_t(0x00)); - - oa->write_characters(reinterpret_cast(value.data()), value.size()); - } - - /*! - @brief Calculates the size necessary to serialize the JSON value @a j with its @a name - @return The calculated size for the BSON document entry for @a j with the given @a name. - */ - static std::size_t calc_bson_element_size(const string_t& name, - const BasicJsonType& j) - { - const auto header_size = calc_bson_entry_header_size(name); - switch (j.type()) - { - case value_t::object: - return header_size + calc_bson_object_size(*j.m_value.object); - - case value_t::array: - return header_size + calc_bson_array_size(*j.m_value.array); - - case value_t::binary: - return header_size + calc_bson_binary_size(*j.m_value.binary); - - case value_t::boolean: - return header_size + 1ul; - - case value_t::number_float: - return header_size + 8ul; - - case value_t::number_integer: - return header_size + calc_bson_integer_size(j.m_value.number_integer); - - case value_t::number_unsigned: - return header_size + calc_bson_unsigned_size(j.m_value.number_unsigned); - - case value_t::string: - return header_size + calc_bson_string_size(*j.m_value.string); - - case value_t::null: - return header_size + 0ul; - - // LCOV_EXCL_START - default: - JSON_ASSERT(false); - return 0ul; - // LCOV_EXCL_STOP - } - } - - /*! - @brief Serializes the JSON value @a j to BSON and associates it with the - key @a name. - @param name The name to associate with the JSON entity @a j within the - current BSON document - @return The size of the BSON entry - */ - void write_bson_element(const string_t& name, - const BasicJsonType& j) - { - switch (j.type()) - { - case value_t::object: - return write_bson_object_entry(name, *j.m_value.object); - - case value_t::array: - return write_bson_array(name, *j.m_value.array); - - case value_t::binary: - return write_bson_binary(name, *j.m_value.binary); - - case value_t::boolean: - return write_bson_boolean(name, j.m_value.boolean); - - case value_t::number_float: - return write_bson_double(name, j.m_value.number_float); - - case value_t::number_integer: - return write_bson_integer(name, j.m_value.number_integer); - - case value_t::number_unsigned: - return write_bson_unsigned(name, j.m_value.number_unsigned); - - case value_t::string: - return write_bson_string(name, *j.m_value.string); - - case value_t::null: - return write_bson_null(name); - - // LCOV_EXCL_START - default: - JSON_ASSERT(false); - return; - // LCOV_EXCL_STOP - } - } - - /*! - @brief Calculates the size of the BSON serialization of the given - JSON-object @a j. - @param[in] j JSON value to serialize - @pre j.type() == value_t::object - */ - static std::size_t calc_bson_object_size(const typename BasicJsonType::object_t& value) - { - std::size_t document_size = std::accumulate(value.begin(), value.end(), std::size_t(0), - [](size_t result, const typename BasicJsonType::object_t::value_type & el) - { - return result += calc_bson_element_size(el.first, el.second); - }); - - return sizeof(std::int32_t) + document_size + 1ul; - } - - /*! - @param[in] j JSON value to serialize - @pre j.type() == value_t::object - */ - void write_bson_object(const typename BasicJsonType::object_t& value) - { - write_number(static_cast(calc_bson_object_size(value))); - - for (const auto& el : value) - { - write_bson_element(el.first, el.second); - } - - oa->write_character(to_char_type(0x00)); - } - - ////////// - // CBOR // - ////////// - - static constexpr CharType get_cbor_float_prefix(float /*unused*/) - { - return to_char_type(0xFA); // Single-Precision Float - } - - static constexpr CharType get_cbor_float_prefix(double /*unused*/) - { - return to_char_type(0xFB); // Double-Precision Float - } - - ///////////// - // MsgPack // - ///////////// - - static constexpr CharType get_msgpack_float_prefix(float /*unused*/) - { - return to_char_type(0xCA); // float 32 - } - - static constexpr CharType get_msgpack_float_prefix(double /*unused*/) - { - return to_char_type(0xCB); // float 64 - } - - //////////// - // UBJSON // - //////////// - - // UBJSON: write number (floating point) - template::value, int>::type = 0> - void write_number_with_ubjson_prefix(const NumberType n, - const bool add_prefix) - { - if (add_prefix) - { - oa->write_character(get_ubjson_float_prefix(n)); - } - write_number(n); - } - - // UBJSON: write number (unsigned integer) - template::value, int>::type = 0> - void write_number_with_ubjson_prefix(const NumberType n, - const bool add_prefix) - { - if (n <= static_cast((std::numeric_limits::max)())) - { - if (add_prefix) - { - oa->write_character(to_char_type('i')); // int8 - } - write_number(static_cast(n)); - } - else if (n <= (std::numeric_limits::max)()) - { - if (add_prefix) - { - oa->write_character(to_char_type('U')); // uint8 - } - write_number(static_cast(n)); - } - else if (n <= static_cast((std::numeric_limits::max)())) - { - if (add_prefix) - { - oa->write_character(to_char_type('I')); // int16 - } - write_number(static_cast(n)); - } - else if (n <= static_cast((std::numeric_limits::max)())) - { - if (add_prefix) - { - oa->write_character(to_char_type('l')); // int32 - } - write_number(static_cast(n)); - } - else if (n <= static_cast((std::numeric_limits::max)())) - { - if (add_prefix) - { - oa->write_character(to_char_type('L')); // int64 - } - write_number(static_cast(n)); - } - else - { - if (add_prefix) - { - oa->write_character(to_char_type('H')); // high-precision number - } - - const auto number = BasicJsonType(n).dump(); - write_number_with_ubjson_prefix(number.size(), true); - for (std::size_t i = 0; i < number.size(); ++i) - { - oa->write_character(to_char_type(static_cast(number[i]))); - } - } - } - - // UBJSON: write number (signed integer) - template < typename NumberType, typename std::enable_if < - std::is_signed::value&& - !std::is_floating_point::value, int >::type = 0 > - void write_number_with_ubjson_prefix(const NumberType n, - const bool add_prefix) - { - if ((std::numeric_limits::min)() <= n && n <= (std::numeric_limits::max)()) - { - if (add_prefix) - { - oa->write_character(to_char_type('i')); // int8 - } - write_number(static_cast(n)); - } - else if (static_cast((std::numeric_limits::min)()) <= n && n <= static_cast((std::numeric_limits::max)())) - { - if (add_prefix) - { - oa->write_character(to_char_type('U')); // uint8 - } - write_number(static_cast(n)); - } - else if ((std::numeric_limits::min)() <= n && n <= (std::numeric_limits::max)()) - { - if (add_prefix) - { - oa->write_character(to_char_type('I')); // int16 - } - write_number(static_cast(n)); - } - else if ((std::numeric_limits::min)() <= n && n <= (std::numeric_limits::max)()) - { - if (add_prefix) - { - oa->write_character(to_char_type('l')); // int32 - } - write_number(static_cast(n)); - } - else if ((std::numeric_limits::min)() <= n && n <= (std::numeric_limits::max)()) - { - if (add_prefix) - { - oa->write_character(to_char_type('L')); // int64 - } - write_number(static_cast(n)); - } - // LCOV_EXCL_START - else - { - if (add_prefix) - { - oa->write_character(to_char_type('H')); // high-precision number - } - - const auto number = BasicJsonType(n).dump(); - write_number_with_ubjson_prefix(number.size(), true); - for (std::size_t i = 0; i < number.size(); ++i) - { - oa->write_character(to_char_type(static_cast(number[i]))); - } - } - // LCOV_EXCL_STOP - } - - /*! - @brief determine the type prefix of container values - */ - CharType ubjson_prefix(const BasicJsonType& j) const noexcept - { - switch (j.type()) - { - case value_t::null: - return 'Z'; - - case value_t::boolean: - return j.m_value.boolean ? 'T' : 'F'; - - case value_t::number_integer: - { - if ((std::numeric_limits::min)() <= j.m_value.number_integer && j.m_value.number_integer <= (std::numeric_limits::max)()) - { - return 'i'; - } - if ((std::numeric_limits::min)() <= j.m_value.number_integer && j.m_value.number_integer <= (std::numeric_limits::max)()) - { - return 'U'; - } - if ((std::numeric_limits::min)() <= j.m_value.number_integer && j.m_value.number_integer <= (std::numeric_limits::max)()) - { - return 'I'; - } - if ((std::numeric_limits::min)() <= j.m_value.number_integer && j.m_value.number_integer <= (std::numeric_limits::max)()) - { - return 'l'; - } - if ((std::numeric_limits::min)() <= j.m_value.number_integer && j.m_value.number_integer <= (std::numeric_limits::max)()) - { - return 'L'; - } - // anything else is treated as high-precision number - return 'H'; // LCOV_EXCL_LINE - } - - case value_t::number_unsigned: - { - if (j.m_value.number_unsigned <= static_cast((std::numeric_limits::max)())) - { - return 'i'; - } - if (j.m_value.number_unsigned <= static_cast((std::numeric_limits::max)())) - { - return 'U'; - } - if (j.m_value.number_unsigned <= static_cast((std::numeric_limits::max)())) - { - return 'I'; - } - if (j.m_value.number_unsigned <= static_cast((std::numeric_limits::max)())) - { - return 'l'; - } - if (j.m_value.number_unsigned <= static_cast((std::numeric_limits::max)())) - { - return 'L'; - } - // anything else is treated as high-precision number - return 'H'; // LCOV_EXCL_LINE - } - - case value_t::number_float: - return get_ubjson_float_prefix(j.m_value.number_float); - - case value_t::string: - return 'S'; - - case value_t::array: // fallthrough - case value_t::binary: - return '['; - - case value_t::object: - return '{'; - - default: // discarded values - return 'N'; - } - } - - static constexpr CharType get_ubjson_float_prefix(float /*unused*/) - { - return 'd'; // float 32 - } - - static constexpr CharType get_ubjson_float_prefix(double /*unused*/) - { - return 'D'; // float 64 - } - - /////////////////////// - // Utility functions // - /////////////////////// - - /* - @brief write a number to output input - @param[in] n number of type @a NumberType - @tparam NumberType the type of the number - @tparam OutputIsLittleEndian Set to true if output data is - required to be little endian - - @note This function needs to respect the system's endianess, because bytes - in CBOR, MessagePack, and UBJSON are stored in network order (big - endian) and therefore need reordering on little endian systems. - */ - template - void write_number(const NumberType n) - { - // step 1: write number to array of length NumberType - std::array vec; - std::memcpy(vec.data(), &n, sizeof(NumberType)); - - // step 2: write array to output (with possible reordering) - if (is_little_endian != OutputIsLittleEndian) - { - // reverse byte order prior to conversion if necessary - std::reverse(vec.begin(), vec.end()); - } - - oa->write_characters(vec.data(), sizeof(NumberType)); - } - - void write_compact_float(const number_float_t n, detail::input_format_t format) - { - if (static_cast(n) >= static_cast(std::numeric_limits::lowest()) && - static_cast(n) <= static_cast((std::numeric_limits::max)()) && - static_cast(static_cast(n)) == static_cast(n)) - { - oa->write_character(format == detail::input_format_t::cbor - ? get_cbor_float_prefix(static_cast(n)) - : get_msgpack_float_prefix(static_cast(n))); - write_number(static_cast(n)); - } - else - { - oa->write_character(format == detail::input_format_t::cbor - ? get_cbor_float_prefix(n) - : get_msgpack_float_prefix(n)); - write_number(n); - } - } - - public: - // The following to_char_type functions are implement the conversion - // between uint8_t and CharType. In case CharType is not unsigned, - // such a conversion is required to allow values greater than 128. - // See for a discussion. - template < typename C = CharType, - enable_if_t < std::is_signed::value && std::is_signed::value > * = nullptr > - static constexpr CharType to_char_type(std::uint8_t x) noexcept - { - return *reinterpret_cast(&x); - } - - template < typename C = CharType, - enable_if_t < std::is_signed::value && std::is_unsigned::value > * = nullptr > - static CharType to_char_type(std::uint8_t x) noexcept - { - static_assert(sizeof(std::uint8_t) == sizeof(CharType), "size of CharType must be equal to std::uint8_t"); - static_assert(std::is_trivial::value, "CharType must be trivial"); - CharType result; - std::memcpy(&result, &x, sizeof(x)); - return result; - } - - template::value>* = nullptr> - static constexpr CharType to_char_type(std::uint8_t x) noexcept - { - return x; - } - - template < typename InputCharType, typename C = CharType, - enable_if_t < - std::is_signed::value && - std::is_signed::value && - std::is_same::type>::value - > * = nullptr > - static constexpr CharType to_char_type(InputCharType x) noexcept - { - return x; - } - - private: - /// whether we can assume little endianess - const bool is_little_endian = little_endianess(); - - /// the output - output_adapter_t oa = nullptr; -}; -} // namespace detail -} // namespace nlohmann - -// #include - -// #include - - -#include // reverse, remove, fill, find, none_of -#include // array -#include // localeconv, lconv -#include // labs, isfinite, isnan, signbit -#include // size_t, ptrdiff_t -#include // uint8_t -#include // snprintf -#include // numeric_limits -#include // string, char_traits -#include // is_same -#include // move - -// #include - - -#include // array -#include // signbit, isfinite -#include // intN_t, uintN_t -#include // memcpy, memmove -#include // numeric_limits -#include // conditional - -// #include - - -namespace nlohmann -{ -namespace detail -{ - -/*! -@brief implements the Grisu2 algorithm for binary to decimal floating-point -conversion. - -This implementation is a slightly modified version of the reference -implementation which may be obtained from -http://florian.loitsch.com/publications (bench.tar.gz). - -The code is distributed under the MIT license, Copyright (c) 2009 Florian Loitsch. - -For a detailed description of the algorithm see: - -[1] Loitsch, "Printing Floating-Point Numbers Quickly and Accurately with - Integers", Proceedings of the ACM SIGPLAN 2010 Conference on Programming - Language Design and Implementation, PLDI 2010 -[2] Burger, Dybvig, "Printing Floating-Point Numbers Quickly and Accurately", - Proceedings of the ACM SIGPLAN 1996 Conference on Programming Language - Design and Implementation, PLDI 1996 -*/ -namespace dtoa_impl -{ - -template -Target reinterpret_bits(const Source source) -{ - static_assert(sizeof(Target) == sizeof(Source), "size mismatch"); - - Target target; - std::memcpy(&target, &source, sizeof(Source)); - return target; -} - -struct diyfp // f * 2^e -{ - static constexpr int kPrecision = 64; // = q - - std::uint64_t f = 0; - int e = 0; - - constexpr diyfp(std::uint64_t f_, int e_) noexcept : f(f_), e(e_) {} - - /*! - @brief returns x - y - @pre x.e == y.e and x.f >= y.f - */ - static diyfp sub(const diyfp& x, const diyfp& y) noexcept - { - JSON_ASSERT(x.e == y.e); - JSON_ASSERT(x.f >= y.f); - - return {x.f - y.f, x.e}; - } - - /*! - @brief returns x * y - @note The result is rounded. (Only the upper q bits are returned.) - */ - static diyfp mul(const diyfp& x, const diyfp& y) noexcept - { - static_assert(kPrecision == 64, "internal error"); - - // Computes: - // f = round((x.f * y.f) / 2^q) - // e = x.e + y.e + q - - // Emulate the 64-bit * 64-bit multiplication: - // - // p = u * v - // = (u_lo + 2^32 u_hi) (v_lo + 2^32 v_hi) - // = (u_lo v_lo ) + 2^32 ((u_lo v_hi ) + (u_hi v_lo )) + 2^64 (u_hi v_hi ) - // = (p0 ) + 2^32 ((p1 ) + (p2 )) + 2^64 (p3 ) - // = (p0_lo + 2^32 p0_hi) + 2^32 ((p1_lo + 2^32 p1_hi) + (p2_lo + 2^32 p2_hi)) + 2^64 (p3 ) - // = (p0_lo ) + 2^32 (p0_hi + p1_lo + p2_lo ) + 2^64 (p1_hi + p2_hi + p3) - // = (p0_lo ) + 2^32 (Q ) + 2^64 (H ) - // = (p0_lo ) + 2^32 (Q_lo + 2^32 Q_hi ) + 2^64 (H ) - // - // (Since Q might be larger than 2^32 - 1) - // - // = (p0_lo + 2^32 Q_lo) + 2^64 (Q_hi + H) - // - // (Q_hi + H does not overflow a 64-bit int) - // - // = p_lo + 2^64 p_hi - - const std::uint64_t u_lo = x.f & 0xFFFFFFFFu; - const std::uint64_t u_hi = x.f >> 32u; - const std::uint64_t v_lo = y.f & 0xFFFFFFFFu; - const std::uint64_t v_hi = y.f >> 32u; - - const std::uint64_t p0 = u_lo * v_lo; - const std::uint64_t p1 = u_lo * v_hi; - const std::uint64_t p2 = u_hi * v_lo; - const std::uint64_t p3 = u_hi * v_hi; - - const std::uint64_t p0_hi = p0 >> 32u; - const std::uint64_t p1_lo = p1 & 0xFFFFFFFFu; - const std::uint64_t p1_hi = p1 >> 32u; - const std::uint64_t p2_lo = p2 & 0xFFFFFFFFu; - const std::uint64_t p2_hi = p2 >> 32u; - - std::uint64_t Q = p0_hi + p1_lo + p2_lo; - - // The full product might now be computed as - // - // p_hi = p3 + p2_hi + p1_hi + (Q >> 32) - // p_lo = p0_lo + (Q << 32) - // - // But in this particular case here, the full p_lo is not required. - // Effectively we only need to add the highest bit in p_lo to p_hi (and - // Q_hi + 1 does not overflow). - - Q += std::uint64_t{1} << (64u - 32u - 1u); // round, ties up - - const std::uint64_t h = p3 + p2_hi + p1_hi + (Q >> 32u); - - return {h, x.e + y.e + 64}; - } - - /*! - @brief normalize x such that the significand is >= 2^(q-1) - @pre x.f != 0 - */ - static diyfp normalize(diyfp x) noexcept - { - JSON_ASSERT(x.f != 0); - - while ((x.f >> 63u) == 0) - { - x.f <<= 1u; - x.e--; - } - - return x; - } - - /*! - @brief normalize x such that the result has the exponent E - @pre e >= x.e and the upper e - x.e bits of x.f must be zero. - */ - static diyfp normalize_to(const diyfp& x, const int target_exponent) noexcept - { - const int delta = x.e - target_exponent; - - JSON_ASSERT(delta >= 0); - JSON_ASSERT(((x.f << delta) >> delta) == x.f); - - return {x.f << delta, target_exponent}; - } -}; - -struct boundaries -{ - diyfp w; - diyfp minus; - diyfp plus; -}; - -/*! -Compute the (normalized) diyfp representing the input number 'value' and its -boundaries. - -@pre value must be finite and positive -*/ -template -boundaries compute_boundaries(FloatType value) -{ - JSON_ASSERT(std::isfinite(value)); - JSON_ASSERT(value > 0); - - // Convert the IEEE representation into a diyfp. - // - // If v is denormal: - // value = 0.F * 2^(1 - bias) = ( F) * 2^(1 - bias - (p-1)) - // If v is normalized: - // value = 1.F * 2^(E - bias) = (2^(p-1) + F) * 2^(E - bias - (p-1)) - - static_assert(std::numeric_limits::is_iec559, - "internal error: dtoa_short requires an IEEE-754 floating-point implementation"); - - constexpr int kPrecision = std::numeric_limits::digits; // = p (includes the hidden bit) - constexpr int kBias = std::numeric_limits::max_exponent - 1 + (kPrecision - 1); - constexpr int kMinExp = 1 - kBias; - constexpr std::uint64_t kHiddenBit = std::uint64_t{1} << (kPrecision - 1); // = 2^(p-1) - - using bits_type = typename std::conditional::type; - - const std::uint64_t bits = reinterpret_bits(value); - const std::uint64_t E = bits >> (kPrecision - 1); - const std::uint64_t F = bits & (kHiddenBit - 1); - - const bool is_denormal = E == 0; - const diyfp v = is_denormal - ? diyfp(F, kMinExp) - : diyfp(F + kHiddenBit, static_cast(E) - kBias); - - // Compute the boundaries m- and m+ of the floating-point value - // v = f * 2^e. - // - // Determine v- and v+, the floating-point predecessor and successor if v, - // respectively. - // - // v- = v - 2^e if f != 2^(p-1) or e == e_min (A) - // = v - 2^(e-1) if f == 2^(p-1) and e > e_min (B) - // - // v+ = v + 2^e - // - // Let m- = (v- + v) / 2 and m+ = (v + v+) / 2. All real numbers _strictly_ - // between m- and m+ round to v, regardless of how the input rounding - // algorithm breaks ties. - // - // ---+-------------+-------------+-------------+-------------+--- (A) - // v- m- v m+ v+ - // - // -----------------+------+------+-------------+-------------+--- (B) - // v- m- v m+ v+ - - const bool lower_boundary_is_closer = F == 0 && E > 1; - const diyfp m_plus = diyfp(2 * v.f + 1, v.e - 1); - const diyfp m_minus = lower_boundary_is_closer - ? diyfp(4 * v.f - 1, v.e - 2) // (B) - : diyfp(2 * v.f - 1, v.e - 1); // (A) - - // Determine the normalized w+ = m+. - const diyfp w_plus = diyfp::normalize(m_plus); - - // Determine w- = m- such that e_(w-) = e_(w+). - const diyfp w_minus = diyfp::normalize_to(m_minus, w_plus.e); - - return {diyfp::normalize(v), w_minus, w_plus}; -} - -// Given normalized diyfp w, Grisu needs to find a (normalized) cached -// power-of-ten c, such that the exponent of the product c * w = f * 2^e lies -// within a certain range [alpha, gamma] (Definition 3.2 from [1]) -// -// alpha <= e = e_c + e_w + q <= gamma -// -// or -// -// f_c * f_w * 2^alpha <= f_c 2^(e_c) * f_w 2^(e_w) * 2^q -// <= f_c * f_w * 2^gamma -// -// Since c and w are normalized, i.e. 2^(q-1) <= f < 2^q, this implies -// -// 2^(q-1) * 2^(q-1) * 2^alpha <= c * w * 2^q < 2^q * 2^q * 2^gamma -// -// or -// -// 2^(q - 2 + alpha) <= c * w < 2^(q + gamma) -// -// The choice of (alpha,gamma) determines the size of the table and the form of -// the digit generation procedure. Using (alpha,gamma)=(-60,-32) works out well -// in practice: -// -// The idea is to cut the number c * w = f * 2^e into two parts, which can be -// processed independently: An integral part p1, and a fractional part p2: -// -// f * 2^e = ( (f div 2^-e) * 2^-e + (f mod 2^-e) ) * 2^e -// = (f div 2^-e) + (f mod 2^-e) * 2^e -// = p1 + p2 * 2^e -// -// The conversion of p1 into decimal form requires a series of divisions and -// modulos by (a power of) 10. These operations are faster for 32-bit than for -// 64-bit integers, so p1 should ideally fit into a 32-bit integer. This can be -// achieved by choosing -// -// -e >= 32 or e <= -32 := gamma -// -// In order to convert the fractional part -// -// p2 * 2^e = p2 / 2^-e = d[-1] / 10^1 + d[-2] / 10^2 + ... -// -// into decimal form, the fraction is repeatedly multiplied by 10 and the digits -// d[-i] are extracted in order: -// -// (10 * p2) div 2^-e = d[-1] -// (10 * p2) mod 2^-e = d[-2] / 10^1 + ... -// -// The multiplication by 10 must not overflow. It is sufficient to choose -// -// 10 * p2 < 16 * p2 = 2^4 * p2 <= 2^64. -// -// Since p2 = f mod 2^-e < 2^-e, -// -// -e <= 60 or e >= -60 := alpha - -constexpr int kAlpha = -60; -constexpr int kGamma = -32; - -struct cached_power // c = f * 2^e ~= 10^k -{ - std::uint64_t f; - int e; - int k; -}; - -/*! -For a normalized diyfp w = f * 2^e, this function returns a (normalized) cached -power-of-ten c = f_c * 2^e_c, such that the exponent of the product w * c -satisfies (Definition 3.2 from [1]) - - alpha <= e_c + e + q <= gamma. -*/ -inline cached_power get_cached_power_for_binary_exponent(int e) -{ - // Now - // - // alpha <= e_c + e + q <= gamma (1) - // ==> f_c * 2^alpha <= c * 2^e * 2^q - // - // and since the c's are normalized, 2^(q-1) <= f_c, - // - // ==> 2^(q - 1 + alpha) <= c * 2^(e + q) - // ==> 2^(alpha - e - 1) <= c - // - // If c were an exact power of ten, i.e. c = 10^k, one may determine k as - // - // k = ceil( log_10( 2^(alpha - e - 1) ) ) - // = ceil( (alpha - e - 1) * log_10(2) ) - // - // From the paper: - // "In theory the result of the procedure could be wrong since c is rounded, - // and the computation itself is approximated [...]. In practice, however, - // this simple function is sufficient." - // - // For IEEE double precision floating-point numbers converted into - // normalized diyfp's w = f * 2^e, with q = 64, - // - // e >= -1022 (min IEEE exponent) - // -52 (p - 1) - // -52 (p - 1, possibly normalize denormal IEEE numbers) - // -11 (normalize the diyfp) - // = -1137 - // - // and - // - // e <= +1023 (max IEEE exponent) - // -52 (p - 1) - // -11 (normalize the diyfp) - // = 960 - // - // This binary exponent range [-1137,960] results in a decimal exponent - // range [-307,324]. One does not need to store a cached power for each - // k in this range. For each such k it suffices to find a cached power - // such that the exponent of the product lies in [alpha,gamma]. - // This implies that the difference of the decimal exponents of adjacent - // table entries must be less than or equal to - // - // floor( (gamma - alpha) * log_10(2) ) = 8. - // - // (A smaller distance gamma-alpha would require a larger table.) - - // NB: - // Actually this function returns c, such that -60 <= e_c + e + 64 <= -34. - - constexpr int kCachedPowersMinDecExp = -300; - constexpr int kCachedPowersDecStep = 8; - - static constexpr std::array kCachedPowers = - { - { - { 0xAB70FE17C79AC6CA, -1060, -300 }, - { 0xFF77B1FCBEBCDC4F, -1034, -292 }, - { 0xBE5691EF416BD60C, -1007, -284 }, - { 0x8DD01FAD907FFC3C, -980, -276 }, - { 0xD3515C2831559A83, -954, -268 }, - { 0x9D71AC8FADA6C9B5, -927, -260 }, - { 0xEA9C227723EE8BCB, -901, -252 }, - { 0xAECC49914078536D, -874, -244 }, - { 0x823C12795DB6CE57, -847, -236 }, - { 0xC21094364DFB5637, -821, -228 }, - { 0x9096EA6F3848984F, -794, -220 }, - { 0xD77485CB25823AC7, -768, -212 }, - { 0xA086CFCD97BF97F4, -741, -204 }, - { 0xEF340A98172AACE5, -715, -196 }, - { 0xB23867FB2A35B28E, -688, -188 }, - { 0x84C8D4DFD2C63F3B, -661, -180 }, - { 0xC5DD44271AD3CDBA, -635, -172 }, - { 0x936B9FCEBB25C996, -608, -164 }, - { 0xDBAC6C247D62A584, -582, -156 }, - { 0xA3AB66580D5FDAF6, -555, -148 }, - { 0xF3E2F893DEC3F126, -529, -140 }, - { 0xB5B5ADA8AAFF80B8, -502, -132 }, - { 0x87625F056C7C4A8B, -475, -124 }, - { 0xC9BCFF6034C13053, -449, -116 }, - { 0x964E858C91BA2655, -422, -108 }, - { 0xDFF9772470297EBD, -396, -100 }, - { 0xA6DFBD9FB8E5B88F, -369, -92 }, - { 0xF8A95FCF88747D94, -343, -84 }, - { 0xB94470938FA89BCF, -316, -76 }, - { 0x8A08F0F8BF0F156B, -289, -68 }, - { 0xCDB02555653131B6, -263, -60 }, - { 0x993FE2C6D07B7FAC, -236, -52 }, - { 0xE45C10C42A2B3B06, -210, -44 }, - { 0xAA242499697392D3, -183, -36 }, - { 0xFD87B5F28300CA0E, -157, -28 }, - { 0xBCE5086492111AEB, -130, -20 }, - { 0x8CBCCC096F5088CC, -103, -12 }, - { 0xD1B71758E219652C, -77, -4 }, - { 0x9C40000000000000, -50, 4 }, - { 0xE8D4A51000000000, -24, 12 }, - { 0xAD78EBC5AC620000, 3, 20 }, - { 0x813F3978F8940984, 30, 28 }, - { 0xC097CE7BC90715B3, 56, 36 }, - { 0x8F7E32CE7BEA5C70, 83, 44 }, - { 0xD5D238A4ABE98068, 109, 52 }, - { 0x9F4F2726179A2245, 136, 60 }, - { 0xED63A231D4C4FB27, 162, 68 }, - { 0xB0DE65388CC8ADA8, 189, 76 }, - { 0x83C7088E1AAB65DB, 216, 84 }, - { 0xC45D1DF942711D9A, 242, 92 }, - { 0x924D692CA61BE758, 269, 100 }, - { 0xDA01EE641A708DEA, 295, 108 }, - { 0xA26DA3999AEF774A, 322, 116 }, - { 0xF209787BB47D6B85, 348, 124 }, - { 0xB454E4A179DD1877, 375, 132 }, - { 0x865B86925B9BC5C2, 402, 140 }, - { 0xC83553C5C8965D3D, 428, 148 }, - { 0x952AB45CFA97A0B3, 455, 156 }, - { 0xDE469FBD99A05FE3, 481, 164 }, - { 0xA59BC234DB398C25, 508, 172 }, - { 0xF6C69A72A3989F5C, 534, 180 }, - { 0xB7DCBF5354E9BECE, 561, 188 }, - { 0x88FCF317F22241E2, 588, 196 }, - { 0xCC20CE9BD35C78A5, 614, 204 }, - { 0x98165AF37B2153DF, 641, 212 }, - { 0xE2A0B5DC971F303A, 667, 220 }, - { 0xA8D9D1535CE3B396, 694, 228 }, - { 0xFB9B7CD9A4A7443C, 720, 236 }, - { 0xBB764C4CA7A44410, 747, 244 }, - { 0x8BAB8EEFB6409C1A, 774, 252 }, - { 0xD01FEF10A657842C, 800, 260 }, - { 0x9B10A4E5E9913129, 827, 268 }, - { 0xE7109BFBA19C0C9D, 853, 276 }, - { 0xAC2820D9623BF429, 880, 284 }, - { 0x80444B5E7AA7CF85, 907, 292 }, - { 0xBF21E44003ACDD2D, 933, 300 }, - { 0x8E679C2F5E44FF8F, 960, 308 }, - { 0xD433179D9C8CB841, 986, 316 }, - { 0x9E19DB92B4E31BA9, 1013, 324 }, - } - }; - - // This computation gives exactly the same results for k as - // k = ceil((kAlpha - e - 1) * 0.30102999566398114) - // for |e| <= 1500, but doesn't require floating-point operations. - // NB: log_10(2) ~= 78913 / 2^18 - JSON_ASSERT(e >= -1500); - JSON_ASSERT(e <= 1500); - const int f = kAlpha - e - 1; - const int k = (f * 78913) / (1 << 18) + static_cast(f > 0); - - const int index = (-kCachedPowersMinDecExp + k + (kCachedPowersDecStep - 1)) / kCachedPowersDecStep; - JSON_ASSERT(index >= 0); - JSON_ASSERT(static_cast(index) < kCachedPowers.size()); - - const cached_power cached = kCachedPowers[static_cast(index)]; - JSON_ASSERT(kAlpha <= cached.e + e + 64); - JSON_ASSERT(kGamma >= cached.e + e + 64); - - return cached; -} - -/*! -For n != 0, returns k, such that pow10 := 10^(k-1) <= n < 10^k. -For n == 0, returns 1 and sets pow10 := 1. -*/ -inline int find_largest_pow10(const std::uint32_t n, std::uint32_t& pow10) -{ - // LCOV_EXCL_START - if (n >= 1000000000) - { - pow10 = 1000000000; - return 10; - } - // LCOV_EXCL_STOP - else if (n >= 100000000) - { - pow10 = 100000000; - return 9; - } - else if (n >= 10000000) - { - pow10 = 10000000; - return 8; - } - else if (n >= 1000000) - { - pow10 = 1000000; - return 7; - } - else if (n >= 100000) - { - pow10 = 100000; - return 6; - } - else if (n >= 10000) - { - pow10 = 10000; - return 5; - } - else if (n >= 1000) - { - pow10 = 1000; - return 4; - } - else if (n >= 100) - { - pow10 = 100; - return 3; - } - else if (n >= 10) - { - pow10 = 10; - return 2; - } - else - { - pow10 = 1; - return 1; - } -} - -inline void grisu2_round(char* buf, int len, std::uint64_t dist, std::uint64_t delta, - std::uint64_t rest, std::uint64_t ten_k) -{ - JSON_ASSERT(len >= 1); - JSON_ASSERT(dist <= delta); - JSON_ASSERT(rest <= delta); - JSON_ASSERT(ten_k > 0); - - // <--------------------------- delta ----> - // <---- dist ---------> - // --------------[------------------+-------------------]-------------- - // M- w M+ - // - // ten_k - // <------> - // <---- rest ----> - // --------------[------------------+----+--------------]-------------- - // w V - // = buf * 10^k - // - // ten_k represents a unit-in-the-last-place in the decimal representation - // stored in buf. - // Decrement buf by ten_k while this takes buf closer to w. - - // The tests are written in this order to avoid overflow in unsigned - // integer arithmetic. - - while (rest < dist - && delta - rest >= ten_k - && (rest + ten_k < dist || dist - rest > rest + ten_k - dist)) - { - JSON_ASSERT(buf[len - 1] != '0'); - buf[len - 1]--; - rest += ten_k; - } -} - -/*! -Generates V = buffer * 10^decimal_exponent, such that M- <= V <= M+. -M- and M+ must be normalized and share the same exponent -60 <= e <= -32. -*/ -inline void grisu2_digit_gen(char* buffer, int& length, int& decimal_exponent, - diyfp M_minus, diyfp w, diyfp M_plus) -{ - static_assert(kAlpha >= -60, "internal error"); - static_assert(kGamma <= -32, "internal error"); - - // Generates the digits (and the exponent) of a decimal floating-point - // number V = buffer * 10^decimal_exponent in the range [M-, M+]. The diyfp's - // w, M- and M+ share the same exponent e, which satisfies alpha <= e <= gamma. - // - // <--------------------------- delta ----> - // <---- dist ---------> - // --------------[------------------+-------------------]-------------- - // M- w M+ - // - // Grisu2 generates the digits of M+ from left to right and stops as soon as - // V is in [M-,M+]. - - JSON_ASSERT(M_plus.e >= kAlpha); - JSON_ASSERT(M_plus.e <= kGamma); - - std::uint64_t delta = diyfp::sub(M_plus, M_minus).f; // (significand of (M+ - M-), implicit exponent is e) - std::uint64_t dist = diyfp::sub(M_plus, w ).f; // (significand of (M+ - w ), implicit exponent is e) - - // Split M+ = f * 2^e into two parts p1 and p2 (note: e < 0): - // - // M+ = f * 2^e - // = ((f div 2^-e) * 2^-e + (f mod 2^-e)) * 2^e - // = ((p1 ) * 2^-e + (p2 )) * 2^e - // = p1 + p2 * 2^e - - const diyfp one(std::uint64_t{1} << -M_plus.e, M_plus.e); - - auto p1 = static_cast(M_plus.f >> -one.e); // p1 = f div 2^-e (Since -e >= 32, p1 fits into a 32-bit int.) - std::uint64_t p2 = M_plus.f & (one.f - 1); // p2 = f mod 2^-e - - // 1) - // - // Generate the digits of the integral part p1 = d[n-1]...d[1]d[0] - - JSON_ASSERT(p1 > 0); - - std::uint32_t pow10; - const int k = find_largest_pow10(p1, pow10); - - // 10^(k-1) <= p1 < 10^k, pow10 = 10^(k-1) - // - // p1 = (p1 div 10^(k-1)) * 10^(k-1) + (p1 mod 10^(k-1)) - // = (d[k-1] ) * 10^(k-1) + (p1 mod 10^(k-1)) - // - // M+ = p1 + p2 * 2^e - // = d[k-1] * 10^(k-1) + (p1 mod 10^(k-1)) + p2 * 2^e - // = d[k-1] * 10^(k-1) + ((p1 mod 10^(k-1)) * 2^-e + p2) * 2^e - // = d[k-1] * 10^(k-1) + ( rest) * 2^e - // - // Now generate the digits d[n] of p1 from left to right (n = k-1,...,0) - // - // p1 = d[k-1]...d[n] * 10^n + d[n-1]...d[0] - // - // but stop as soon as - // - // rest * 2^e = (d[n-1]...d[0] * 2^-e + p2) * 2^e <= delta * 2^e - - int n = k; - while (n > 0) - { - // Invariants: - // M+ = buffer * 10^n + (p1 + p2 * 2^e) (buffer = 0 for n = k) - // pow10 = 10^(n-1) <= p1 < 10^n - // - const std::uint32_t d = p1 / pow10; // d = p1 div 10^(n-1) - const std::uint32_t r = p1 % pow10; // r = p1 mod 10^(n-1) - // - // M+ = buffer * 10^n + (d * 10^(n-1) + r) + p2 * 2^e - // = (buffer * 10 + d) * 10^(n-1) + (r + p2 * 2^e) - // - JSON_ASSERT(d <= 9); - buffer[length++] = static_cast('0' + d); // buffer := buffer * 10 + d - // - // M+ = buffer * 10^(n-1) + (r + p2 * 2^e) - // - p1 = r; - n--; - // - // M+ = buffer * 10^n + (p1 + p2 * 2^e) - // pow10 = 10^n - // - - // Now check if enough digits have been generated. - // Compute - // - // p1 + p2 * 2^e = (p1 * 2^-e + p2) * 2^e = rest * 2^e - // - // Note: - // Since rest and delta share the same exponent e, it suffices to - // compare the significands. - const std::uint64_t rest = (std::uint64_t{p1} << -one.e) + p2; - if (rest <= delta) - { - // V = buffer * 10^n, with M- <= V <= M+. - - decimal_exponent += n; - - // We may now just stop. But instead look if the buffer could be - // decremented to bring V closer to w. - // - // pow10 = 10^n is now 1 ulp in the decimal representation V. - // The rounding procedure works with diyfp's with an implicit - // exponent of e. - // - // 10^n = (10^n * 2^-e) * 2^e = ulp * 2^e - // - const std::uint64_t ten_n = std::uint64_t{pow10} << -one.e; - grisu2_round(buffer, length, dist, delta, rest, ten_n); - - return; - } - - pow10 /= 10; - // - // pow10 = 10^(n-1) <= p1 < 10^n - // Invariants restored. - } - - // 2) - // - // The digits of the integral part have been generated: - // - // M+ = d[k-1]...d[1]d[0] + p2 * 2^e - // = buffer + p2 * 2^e - // - // Now generate the digits of the fractional part p2 * 2^e. - // - // Note: - // No decimal point is generated: the exponent is adjusted instead. - // - // p2 actually represents the fraction - // - // p2 * 2^e - // = p2 / 2^-e - // = d[-1] / 10^1 + d[-2] / 10^2 + ... - // - // Now generate the digits d[-m] of p1 from left to right (m = 1,2,...) - // - // p2 * 2^e = d[-1]d[-2]...d[-m] * 10^-m - // + 10^-m * (d[-m-1] / 10^1 + d[-m-2] / 10^2 + ...) - // - // using - // - // 10^m * p2 = ((10^m * p2) div 2^-e) * 2^-e + ((10^m * p2) mod 2^-e) - // = ( d) * 2^-e + ( r) - // - // or - // 10^m * p2 * 2^e = d + r * 2^e - // - // i.e. - // - // M+ = buffer + p2 * 2^e - // = buffer + 10^-m * (d + r * 2^e) - // = (buffer * 10^m + d) * 10^-m + 10^-m * r * 2^e - // - // and stop as soon as 10^-m * r * 2^e <= delta * 2^e - - JSON_ASSERT(p2 > delta); - - int m = 0; - for (;;) - { - // Invariant: - // M+ = buffer * 10^-m + 10^-m * (d[-m-1] / 10 + d[-m-2] / 10^2 + ...) * 2^e - // = buffer * 10^-m + 10^-m * (p2 ) * 2^e - // = buffer * 10^-m + 10^-m * (1/10 * (10 * p2) ) * 2^e - // = buffer * 10^-m + 10^-m * (1/10 * ((10*p2 div 2^-e) * 2^-e + (10*p2 mod 2^-e)) * 2^e - // - JSON_ASSERT(p2 <= (std::numeric_limits::max)() / 10); - p2 *= 10; - const std::uint64_t d = p2 >> -one.e; // d = (10 * p2) div 2^-e - const std::uint64_t r = p2 & (one.f - 1); // r = (10 * p2) mod 2^-e - // - // M+ = buffer * 10^-m + 10^-m * (1/10 * (d * 2^-e + r) * 2^e - // = buffer * 10^-m + 10^-m * (1/10 * (d + r * 2^e)) - // = (buffer * 10 + d) * 10^(-m-1) + 10^(-m-1) * r * 2^e - // - JSON_ASSERT(d <= 9); - buffer[length++] = static_cast('0' + d); // buffer := buffer * 10 + d - // - // M+ = buffer * 10^(-m-1) + 10^(-m-1) * r * 2^e - // - p2 = r; - m++; - // - // M+ = buffer * 10^-m + 10^-m * p2 * 2^e - // Invariant restored. - - // Check if enough digits have been generated. - // - // 10^-m * p2 * 2^e <= delta * 2^e - // p2 * 2^e <= 10^m * delta * 2^e - // p2 <= 10^m * delta - delta *= 10; - dist *= 10; - if (p2 <= delta) - { - break; - } - } - - // V = buffer * 10^-m, with M- <= V <= M+. - - decimal_exponent -= m; - - // 1 ulp in the decimal representation is now 10^-m. - // Since delta and dist are now scaled by 10^m, we need to do the - // same with ulp in order to keep the units in sync. - // - // 10^m * 10^-m = 1 = 2^-e * 2^e = ten_m * 2^e - // - const std::uint64_t ten_m = one.f; - grisu2_round(buffer, length, dist, delta, p2, ten_m); - - // By construction this algorithm generates the shortest possible decimal - // number (Loitsch, Theorem 6.2) which rounds back to w. - // For an input number of precision p, at least - // - // N = 1 + ceil(p * log_10(2)) - // - // decimal digits are sufficient to identify all binary floating-point - // numbers (Matula, "In-and-Out conversions"). - // This implies that the algorithm does not produce more than N decimal - // digits. - // - // N = 17 for p = 53 (IEEE double precision) - // N = 9 for p = 24 (IEEE single precision) -} - -/*! -v = buf * 10^decimal_exponent -len is the length of the buffer (number of decimal digits) -The buffer must be large enough, i.e. >= max_digits10. -*/ -JSON_HEDLEY_NON_NULL(1) -inline void grisu2(char* buf, int& len, int& decimal_exponent, - diyfp m_minus, diyfp v, diyfp m_plus) -{ - JSON_ASSERT(m_plus.e == m_minus.e); - JSON_ASSERT(m_plus.e == v.e); - - // --------(-----------------------+-----------------------)-------- (A) - // m- v m+ - // - // --------------------(-----------+-----------------------)-------- (B) - // m- v m+ - // - // First scale v (and m- and m+) such that the exponent is in the range - // [alpha, gamma]. - - const cached_power cached = get_cached_power_for_binary_exponent(m_plus.e); - - const diyfp c_minus_k(cached.f, cached.e); // = c ~= 10^-k - - // The exponent of the products is = v.e + c_minus_k.e + q and is in the range [alpha,gamma] - const diyfp w = diyfp::mul(v, c_minus_k); - const diyfp w_minus = diyfp::mul(m_minus, c_minus_k); - const diyfp w_plus = diyfp::mul(m_plus, c_minus_k); - - // ----(---+---)---------------(---+---)---------------(---+---)---- - // w- w w+ - // = c*m- = c*v = c*m+ - // - // diyfp::mul rounds its result and c_minus_k is approximated too. w, w- and - // w+ are now off by a small amount. - // In fact: - // - // w - v * 10^k < 1 ulp - // - // To account for this inaccuracy, add resp. subtract 1 ulp. - // - // --------+---[---------------(---+---)---------------]---+-------- - // w- M- w M+ w+ - // - // Now any number in [M-, M+] (bounds included) will round to w when input, - // regardless of how the input rounding algorithm breaks ties. - // - // And digit_gen generates the shortest possible such number in [M-, M+]. - // Note that this does not mean that Grisu2 always generates the shortest - // possible number in the interval (m-, m+). - const diyfp M_minus(w_minus.f + 1, w_minus.e); - const diyfp M_plus (w_plus.f - 1, w_plus.e ); - - decimal_exponent = -cached.k; // = -(-k) = k - - grisu2_digit_gen(buf, len, decimal_exponent, M_minus, w, M_plus); -} - -/*! -v = buf * 10^decimal_exponent -len is the length of the buffer (number of decimal digits) -The buffer must be large enough, i.e. >= max_digits10. -*/ -template -JSON_HEDLEY_NON_NULL(1) -void grisu2(char* buf, int& len, int& decimal_exponent, FloatType value) -{ - static_assert(diyfp::kPrecision >= std::numeric_limits::digits + 3, - "internal error: not enough precision"); - - JSON_ASSERT(std::isfinite(value)); - JSON_ASSERT(value > 0); - - // If the neighbors (and boundaries) of 'value' are always computed for double-precision - // numbers, all float's can be recovered using strtod (and strtof). However, the resulting - // decimal representations are not exactly "short". - // - // The documentation for 'std::to_chars' (https://en.cppreference.com/w/cpp/utility/to_chars) - // says "value is converted to a string as if by std::sprintf in the default ("C") locale" - // and since sprintf promotes float's to double's, I think this is exactly what 'std::to_chars' - // does. - // On the other hand, the documentation for 'std::to_chars' requires that "parsing the - // representation using the corresponding std::from_chars function recovers value exactly". That - // indicates that single precision floating-point numbers should be recovered using - // 'std::strtof'. - // - // NB: If the neighbors are computed for single-precision numbers, there is a single float - // (7.0385307e-26f) which can't be recovered using strtod. The resulting double precision - // value is off by 1 ulp. -#if 0 - const boundaries w = compute_boundaries(static_cast(value)); -#else - const boundaries w = compute_boundaries(value); -#endif - - grisu2(buf, len, decimal_exponent, w.minus, w.w, w.plus); -} - -/*! -@brief appends a decimal representation of e to buf -@return a pointer to the element following the exponent. -@pre -1000 < e < 1000 -*/ -JSON_HEDLEY_NON_NULL(1) -JSON_HEDLEY_RETURNS_NON_NULL -inline char* append_exponent(char* buf, int e) -{ - JSON_ASSERT(e > -1000); - JSON_ASSERT(e < 1000); - - if (e < 0) - { - e = -e; - *buf++ = '-'; - } - else - { - *buf++ = '+'; - } - - auto k = static_cast(e); - if (k < 10) - { - // Always print at least two digits in the exponent. - // This is for compatibility with printf("%g"). - *buf++ = '0'; - *buf++ = static_cast('0' + k); - } - else if (k < 100) - { - *buf++ = static_cast('0' + k / 10); - k %= 10; - *buf++ = static_cast('0' + k); - } - else - { - *buf++ = static_cast('0' + k / 100); - k %= 100; - *buf++ = static_cast('0' + k / 10); - k %= 10; - *buf++ = static_cast('0' + k); - } - - return buf; -} - -/*! -@brief prettify v = buf * 10^decimal_exponent - -If v is in the range [10^min_exp, 10^max_exp) it will be printed in fixed-point -notation. Otherwise it will be printed in exponential notation. - -@pre min_exp < 0 -@pre max_exp > 0 -*/ -JSON_HEDLEY_NON_NULL(1) -JSON_HEDLEY_RETURNS_NON_NULL -inline char* format_buffer(char* buf, int len, int decimal_exponent, - int min_exp, int max_exp) -{ - JSON_ASSERT(min_exp < 0); - JSON_ASSERT(max_exp > 0); - - const int k = len; - const int n = len + decimal_exponent; - - // v = buf * 10^(n-k) - // k is the length of the buffer (number of decimal digits) - // n is the position of the decimal point relative to the start of the buffer. - - if (k <= n && n <= max_exp) - { - // digits[000] - // len <= max_exp + 2 - - std::memset(buf + k, '0', static_cast(n) - static_cast(k)); - // Make it look like a floating-point number (#362, #378) - buf[n + 0] = '.'; - buf[n + 1] = '0'; - return buf + (static_cast(n) + 2); - } - - if (0 < n && n <= max_exp) - { - // dig.its - // len <= max_digits10 + 1 - - JSON_ASSERT(k > n); - - std::memmove(buf + (static_cast(n) + 1), buf + n, static_cast(k) - static_cast(n)); - buf[n] = '.'; - return buf + (static_cast(k) + 1U); - } - - if (min_exp < n && n <= 0) - { - // 0.[000]digits - // len <= 2 + (-min_exp - 1) + max_digits10 - - std::memmove(buf + (2 + static_cast(-n)), buf, static_cast(k)); - buf[0] = '0'; - buf[1] = '.'; - std::memset(buf + 2, '0', static_cast(-n)); - return buf + (2U + static_cast(-n) + static_cast(k)); - } - - if (k == 1) - { - // dE+123 - // len <= 1 + 5 - - buf += 1; - } - else - { - // d.igitsE+123 - // len <= max_digits10 + 1 + 5 - - std::memmove(buf + 2, buf + 1, static_cast(k) - 1); - buf[1] = '.'; - buf += 1 + static_cast(k); - } - - *buf++ = 'e'; - return append_exponent(buf, n - 1); -} - -} // namespace dtoa_impl - -/*! -@brief generates a decimal representation of the floating-point number value in [first, last). - -The format of the resulting decimal representation is similar to printf's %g -format. Returns an iterator pointing past-the-end of the decimal representation. - -@note The input number must be finite, i.e. NaN's and Inf's are not supported. -@note The buffer must be large enough. -@note The result is NOT null-terminated. -*/ -template -JSON_HEDLEY_NON_NULL(1, 2) -JSON_HEDLEY_RETURNS_NON_NULL -char* to_chars(char* first, const char* last, FloatType value) -{ - static_cast(last); // maybe unused - fix warning - JSON_ASSERT(std::isfinite(value)); - - // Use signbit(value) instead of (value < 0) since signbit works for -0. - if (std::signbit(value)) - { - value = -value; - *first++ = '-'; - } - - if (value == 0) // +-0 - { - *first++ = '0'; - // Make it look like a floating-point number (#362, #378) - *first++ = '.'; - *first++ = '0'; - return first; - } - - JSON_ASSERT(last - first >= std::numeric_limits::max_digits10); - - // Compute v = buffer * 10^decimal_exponent. - // The decimal digits are stored in the buffer, which needs to be interpreted - // as an unsigned decimal integer. - // len is the length of the buffer, i.e. the number of decimal digits. - int len = 0; - int decimal_exponent = 0; - dtoa_impl::grisu2(first, len, decimal_exponent, value); - - JSON_ASSERT(len <= std::numeric_limits::max_digits10); - - // Format the buffer like printf("%.*g", prec, value) - constexpr int kMinExp = -4; - // Use digits10 here to increase compatibility with version 2. - constexpr int kMaxExp = std::numeric_limits::digits10; - - JSON_ASSERT(last - first >= kMaxExp + 2); - JSON_ASSERT(last - first >= 2 + (-kMinExp - 1) + std::numeric_limits::max_digits10); - JSON_ASSERT(last - first >= std::numeric_limits::max_digits10 + 6); - - return dtoa_impl::format_buffer(first, len, decimal_exponent, kMinExp, kMaxExp); -} - -} // namespace detail -} // namespace nlohmann - -// #include - -// #include - -// #include - -// #include - -// #include - -// #include - - -namespace nlohmann -{ -namespace detail -{ -/////////////////// -// serialization // -/////////////////// - -/// how to treat decoding errors -enum class error_handler_t -{ - strict, ///< throw a type_error exception in case of invalid UTF-8 - replace, ///< replace invalid UTF-8 sequences with U+FFFD - ignore ///< ignore invalid UTF-8 sequences -}; - -template -class serializer -{ - using string_t = typename BasicJsonType::string_t; - using number_float_t = typename BasicJsonType::number_float_t; - using number_integer_t = typename BasicJsonType::number_integer_t; - using number_unsigned_t = typename BasicJsonType::number_unsigned_t; - using binary_char_t = typename BasicJsonType::binary_t::value_type; - static constexpr std::uint8_t UTF8_ACCEPT = 0; - static constexpr std::uint8_t UTF8_REJECT = 1; - - public: - /*! - @param[in] s output stream to serialize to - @param[in] ichar indentation character to use - @param[in] error_handler_ how to react on decoding errors - */ - serializer(output_adapter_t s, const char ichar, - error_handler_t error_handler_ = error_handler_t::strict) - : o(std::move(s)) - , loc(std::localeconv()) - , thousands_sep(loc->thousands_sep == nullptr ? '\0' : std::char_traits::to_char_type(* (loc->thousands_sep))) - , decimal_point(loc->decimal_point == nullptr ? '\0' : std::char_traits::to_char_type(* (loc->decimal_point))) - , indent_char(ichar) - , indent_string(512, indent_char) - , error_handler(error_handler_) - {} - - // delete because of pointer members - serializer(const serializer&) = delete; - serializer& operator=(const serializer&) = delete; - serializer(serializer&&) = delete; - serializer& operator=(serializer&&) = delete; - ~serializer() = default; - - /*! - @brief internal implementation of the serialization function - - This function is called by the public member function dump and organizes - the serialization internally. The indentation level is propagated as - additional parameter. In case of arrays and objects, the function is - called recursively. - - - strings and object keys are escaped using `escape_string()` - - integer numbers are converted implicitly via `operator<<` - - floating-point numbers are converted to a string using `"%g"` format - - binary values are serialized as objects containing the subtype and the - byte array - - @param[in] val value to serialize - @param[in] pretty_print whether the output shall be pretty-printed - @param[in] ensure_ascii If @a ensure_ascii is true, all non-ASCII characters - in the output are escaped with `\uXXXX` sequences, and the result consists - of ASCII characters only. - @param[in] indent_step the indent level - @param[in] current_indent the current indent level (only used internally) - */ - void dump(const BasicJsonType& val, - const bool pretty_print, - const bool ensure_ascii, - const unsigned int indent_step, - const unsigned int current_indent = 0) - { - switch (val.m_type) - { - case value_t::object: - { - if (val.m_value.object->empty()) - { - o->write_characters("{}", 2); - return; - } - - if (pretty_print) - { - o->write_characters("{\n", 2); - - // variable to hold indentation for recursive calls - const auto new_indent = current_indent + indent_step; - if (JSON_HEDLEY_UNLIKELY(indent_string.size() < new_indent)) - { - indent_string.resize(indent_string.size() * 2, ' '); - } - - // first n-1 elements - auto i = val.m_value.object->cbegin(); - for (std::size_t cnt = 0; cnt < val.m_value.object->size() - 1; ++cnt, ++i) - { - o->write_characters(indent_string.c_str(), new_indent); - o->write_character('\"'); - dump_escaped(i->first, ensure_ascii); - o->write_characters("\": ", 3); - dump(i->second, true, ensure_ascii, indent_step, new_indent); - o->write_characters(",\n", 2); - } - - // last element - JSON_ASSERT(i != val.m_value.object->cend()); - JSON_ASSERT(std::next(i) == val.m_value.object->cend()); - o->write_characters(indent_string.c_str(), new_indent); - o->write_character('\"'); - dump_escaped(i->first, ensure_ascii); - o->write_characters("\": ", 3); - dump(i->second, true, ensure_ascii, indent_step, new_indent); - - o->write_character('\n'); - o->write_characters(indent_string.c_str(), current_indent); - o->write_character('}'); - } - else - { - o->write_character('{'); - - // first n-1 elements - auto i = val.m_value.object->cbegin(); - for (std::size_t cnt = 0; cnt < val.m_value.object->size() - 1; ++cnt, ++i) - { - o->write_character('\"'); - dump_escaped(i->first, ensure_ascii); - o->write_characters("\":", 2); - dump(i->second, false, ensure_ascii, indent_step, current_indent); - o->write_character(','); - } - - // last element - JSON_ASSERT(i != val.m_value.object->cend()); - JSON_ASSERT(std::next(i) == val.m_value.object->cend()); - o->write_character('\"'); - dump_escaped(i->first, ensure_ascii); - o->write_characters("\":", 2); - dump(i->second, false, ensure_ascii, indent_step, current_indent); - - o->write_character('}'); - } - - return; - } - - case value_t::array: - { - if (val.m_value.array->empty()) - { - o->write_characters("[]", 2); - return; - } - - if (pretty_print) - { - o->write_characters("[\n", 2); - - // variable to hold indentation for recursive calls - const auto new_indent = current_indent + indent_step; - if (JSON_HEDLEY_UNLIKELY(indent_string.size() < new_indent)) - { - indent_string.resize(indent_string.size() * 2, ' '); - } - - // first n-1 elements - for (auto i = val.m_value.array->cbegin(); - i != val.m_value.array->cend() - 1; ++i) - { - o->write_characters(indent_string.c_str(), new_indent); - dump(*i, true, ensure_ascii, indent_step, new_indent); - o->write_characters(",\n", 2); - } - - // last element - JSON_ASSERT(!val.m_value.array->empty()); - o->write_characters(indent_string.c_str(), new_indent); - dump(val.m_value.array->back(), true, ensure_ascii, indent_step, new_indent); - - o->write_character('\n'); - o->write_characters(indent_string.c_str(), current_indent); - o->write_character(']'); - } - else - { - o->write_character('['); - - // first n-1 elements - for (auto i = val.m_value.array->cbegin(); - i != val.m_value.array->cend() - 1; ++i) - { - dump(*i, false, ensure_ascii, indent_step, current_indent); - o->write_character(','); - } - - // last element - JSON_ASSERT(!val.m_value.array->empty()); - dump(val.m_value.array->back(), false, ensure_ascii, indent_step, current_indent); - - o->write_character(']'); - } - - return; - } - - case value_t::string: - { - o->write_character('\"'); - dump_escaped(*val.m_value.string, ensure_ascii); - o->write_character('\"'); - return; - } - - case value_t::binary: - { - if (pretty_print) - { - o->write_characters("{\n", 2); - - // variable to hold indentation for recursive calls - const auto new_indent = current_indent + indent_step; - if (JSON_HEDLEY_UNLIKELY(indent_string.size() < new_indent)) - { - indent_string.resize(indent_string.size() * 2, ' '); - } - - o->write_characters(indent_string.c_str(), new_indent); - - o->write_characters("\"bytes\": [", 10); - - if (!val.m_value.binary->empty()) - { - for (auto i = val.m_value.binary->cbegin(); - i != val.m_value.binary->cend() - 1; ++i) - { - dump_integer(*i); - o->write_characters(", ", 2); - } - dump_integer(val.m_value.binary->back()); - } - - o->write_characters("],\n", 3); - o->write_characters(indent_string.c_str(), new_indent); - - o->write_characters("\"subtype\": ", 11); - if (val.m_value.binary->has_subtype()) - { - dump_integer(val.m_value.binary->subtype()); - } - else - { - o->write_characters("null", 4); - } - o->write_character('\n'); - o->write_characters(indent_string.c_str(), current_indent); - o->write_character('}'); - } - else - { - o->write_characters("{\"bytes\":[", 10); - - if (!val.m_value.binary->empty()) - { - for (auto i = val.m_value.binary->cbegin(); - i != val.m_value.binary->cend() - 1; ++i) - { - dump_integer(*i); - o->write_character(','); - } - dump_integer(val.m_value.binary->back()); - } - - o->write_characters("],\"subtype\":", 12); - if (val.m_value.binary->has_subtype()) - { - dump_integer(val.m_value.binary->subtype()); - o->write_character('}'); - } - else - { - o->write_characters("null}", 5); - } - } - return; - } - - case value_t::boolean: - { - if (val.m_value.boolean) - { - o->write_characters("true", 4); - } - else - { - o->write_characters("false", 5); - } - return; - } - - case value_t::number_integer: - { - dump_integer(val.m_value.number_integer); - return; - } - - case value_t::number_unsigned: - { - dump_integer(val.m_value.number_unsigned); - return; - } - - case value_t::number_float: - { - dump_float(val.m_value.number_float); - return; - } - - case value_t::discarded: - { - o->write_characters("", 11); - return; - } - - case value_t::null: - { - o->write_characters("null", 4); - return; - } - - default: // LCOV_EXCL_LINE - JSON_ASSERT(false); // LCOV_EXCL_LINE - } - } - - private: - /*! - @brief dump escaped string - - Escape a string by replacing certain special characters by a sequence of an - escape character (backslash) and another character and other control - characters by a sequence of "\u" followed by a four-digit hex - representation. The escaped string is written to output stream @a o. - - @param[in] s the string to escape - @param[in] ensure_ascii whether to escape non-ASCII characters with - \uXXXX sequences - - @complexity Linear in the length of string @a s. - */ - void dump_escaped(const string_t& s, const bool ensure_ascii) - { - std::uint32_t codepoint; - std::uint8_t state = UTF8_ACCEPT; - std::size_t bytes = 0; // number of bytes written to string_buffer - - // number of bytes written at the point of the last valid byte - std::size_t bytes_after_last_accept = 0; - std::size_t undumped_chars = 0; - - for (std::size_t i = 0; i < s.size(); ++i) - { - const auto byte = static_cast(s[i]); - - switch (decode(state, codepoint, byte)) - { - case UTF8_ACCEPT: // decode found a new code point - { - switch (codepoint) - { - case 0x08: // backspace - { - string_buffer[bytes++] = '\\'; - string_buffer[bytes++] = 'b'; - break; - } - - case 0x09: // horizontal tab - { - string_buffer[bytes++] = '\\'; - string_buffer[bytes++] = 't'; - break; - } - - case 0x0A: // newline - { - string_buffer[bytes++] = '\\'; - string_buffer[bytes++] = 'n'; - break; - } - - case 0x0C: // formfeed - { - string_buffer[bytes++] = '\\'; - string_buffer[bytes++] = 'f'; - break; - } - - case 0x0D: // carriage return - { - string_buffer[bytes++] = '\\'; - string_buffer[bytes++] = 'r'; - break; - } - - case 0x22: // quotation mark - { - string_buffer[bytes++] = '\\'; - string_buffer[bytes++] = '\"'; - break; - } - - case 0x5C: // reverse solidus - { - string_buffer[bytes++] = '\\'; - string_buffer[bytes++] = '\\'; - break; - } - - default: - { - // escape control characters (0x00..0x1F) or, if - // ensure_ascii parameter is used, non-ASCII characters - if ((codepoint <= 0x1F) || (ensure_ascii && (codepoint >= 0x7F))) - { - if (codepoint <= 0xFFFF) - { - (std::snprintf)(string_buffer.data() + bytes, 7, "\\u%04x", - static_cast(codepoint)); - bytes += 6; - } - else - { - (std::snprintf)(string_buffer.data() + bytes, 13, "\\u%04x\\u%04x", - static_cast(0xD7C0u + (codepoint >> 10u)), - static_cast(0xDC00u + (codepoint & 0x3FFu))); - bytes += 12; - } - } - else - { - // copy byte to buffer (all previous bytes - // been copied have in default case above) - string_buffer[bytes++] = s[i]; - } - break; - } - } - - // write buffer and reset index; there must be 13 bytes - // left, as this is the maximal number of bytes to be - // written ("\uxxxx\uxxxx\0") for one code point - if (string_buffer.size() - bytes < 13) - { - o->write_characters(string_buffer.data(), bytes); - bytes = 0; - } - - // remember the byte position of this accept - bytes_after_last_accept = bytes; - undumped_chars = 0; - break; - } - - case UTF8_REJECT: // decode found invalid UTF-8 byte - { - switch (error_handler) - { - case error_handler_t::strict: - { - std::string sn(3, '\0'); - (std::snprintf)(&sn[0], sn.size(), "%.2X", byte); - JSON_THROW(type_error::create(316, "invalid UTF-8 byte at index " + std::to_string(i) + ": 0x" + sn)); - } - - case error_handler_t::ignore: - case error_handler_t::replace: - { - // in case we saw this character the first time, we - // would like to read it again, because the byte - // may be OK for itself, but just not OK for the - // previous sequence - if (undumped_chars > 0) - { - --i; - } - - // reset length buffer to the last accepted index; - // thus removing/ignoring the invalid characters - bytes = bytes_after_last_accept; - - if (error_handler == error_handler_t::replace) - { - // add a replacement character - if (ensure_ascii) - { - string_buffer[bytes++] = '\\'; - string_buffer[bytes++] = 'u'; - string_buffer[bytes++] = 'f'; - string_buffer[bytes++] = 'f'; - string_buffer[bytes++] = 'f'; - string_buffer[bytes++] = 'd'; - } - else - { - string_buffer[bytes++] = detail::binary_writer::to_char_type('\xEF'); - string_buffer[bytes++] = detail::binary_writer::to_char_type('\xBF'); - string_buffer[bytes++] = detail::binary_writer::to_char_type('\xBD'); - } - - // write buffer and reset index; there must be 13 bytes - // left, as this is the maximal number of bytes to be - // written ("\uxxxx\uxxxx\0") for one code point - if (string_buffer.size() - bytes < 13) - { - o->write_characters(string_buffer.data(), bytes); - bytes = 0; - } - - bytes_after_last_accept = bytes; - } - - undumped_chars = 0; - - // continue processing the string - state = UTF8_ACCEPT; - break; - } - - default: // LCOV_EXCL_LINE - JSON_ASSERT(false); // LCOV_EXCL_LINE - } - break; - } - - default: // decode found yet incomplete multi-byte code point - { - if (!ensure_ascii) - { - // code point will not be escaped - copy byte to buffer - string_buffer[bytes++] = s[i]; - } - ++undumped_chars; - break; - } - } - } - - // we finished processing the string - if (JSON_HEDLEY_LIKELY(state == UTF8_ACCEPT)) - { - // write buffer - if (bytes > 0) - { - o->write_characters(string_buffer.data(), bytes); - } - } - else - { - // we finish reading, but do not accept: string was incomplete - switch (error_handler) - { - case error_handler_t::strict: - { - std::string sn(3, '\0'); - (std::snprintf)(&sn[0], sn.size(), "%.2X", static_cast(s.back())); - JSON_THROW(type_error::create(316, "incomplete UTF-8 string; last byte: 0x" + sn)); - } - - case error_handler_t::ignore: - { - // write all accepted bytes - o->write_characters(string_buffer.data(), bytes_after_last_accept); - break; - } - - case error_handler_t::replace: - { - // write all accepted bytes - o->write_characters(string_buffer.data(), bytes_after_last_accept); - // add a replacement character - if (ensure_ascii) - { - o->write_characters("\\ufffd", 6); - } - else - { - o->write_characters("\xEF\xBF\xBD", 3); - } - break; - } - - default: // LCOV_EXCL_LINE - JSON_ASSERT(false); // LCOV_EXCL_LINE - } - } - } - - /*! - @brief count digits - - Count the number of decimal (base 10) digits for an input unsigned integer. - - @param[in] x unsigned integer number to count its digits - @return number of decimal digits - */ - inline unsigned int count_digits(number_unsigned_t x) noexcept - { - unsigned int n_digits = 1; - for (;;) - { - if (x < 10) - { - return n_digits; - } - if (x < 100) - { - return n_digits + 1; - } - if (x < 1000) - { - return n_digits + 2; - } - if (x < 10000) - { - return n_digits + 3; - } - x = x / 10000u; - n_digits += 4; - } - } - - /*! - @brief dump an integer - - Dump a given integer to output stream @a o. Works internally with - @a number_buffer. - - @param[in] x integer number (signed or unsigned) to dump - @tparam NumberType either @a number_integer_t or @a number_unsigned_t - */ - template < typename NumberType, detail::enable_if_t < - std::is_same::value || - std::is_same::value || - std::is_same::value, - int > = 0 > - void dump_integer(NumberType x) - { - static constexpr std::array, 100> digits_to_99 - { - { - {{'0', '0'}}, {{'0', '1'}}, {{'0', '2'}}, {{'0', '3'}}, {{'0', '4'}}, {{'0', '5'}}, {{'0', '6'}}, {{'0', '7'}}, {{'0', '8'}}, {{'0', '9'}}, - {{'1', '0'}}, {{'1', '1'}}, {{'1', '2'}}, {{'1', '3'}}, {{'1', '4'}}, {{'1', '5'}}, {{'1', '6'}}, {{'1', '7'}}, {{'1', '8'}}, {{'1', '9'}}, - {{'2', '0'}}, {{'2', '1'}}, {{'2', '2'}}, {{'2', '3'}}, {{'2', '4'}}, {{'2', '5'}}, {{'2', '6'}}, {{'2', '7'}}, {{'2', '8'}}, {{'2', '9'}}, - {{'3', '0'}}, {{'3', '1'}}, {{'3', '2'}}, {{'3', '3'}}, {{'3', '4'}}, {{'3', '5'}}, {{'3', '6'}}, {{'3', '7'}}, {{'3', '8'}}, {{'3', '9'}}, - {{'4', '0'}}, {{'4', '1'}}, {{'4', '2'}}, {{'4', '3'}}, {{'4', '4'}}, {{'4', '5'}}, {{'4', '6'}}, {{'4', '7'}}, {{'4', '8'}}, {{'4', '9'}}, - {{'5', '0'}}, {{'5', '1'}}, {{'5', '2'}}, {{'5', '3'}}, {{'5', '4'}}, {{'5', '5'}}, {{'5', '6'}}, {{'5', '7'}}, {{'5', '8'}}, {{'5', '9'}}, - {{'6', '0'}}, {{'6', '1'}}, {{'6', '2'}}, {{'6', '3'}}, {{'6', '4'}}, {{'6', '5'}}, {{'6', '6'}}, {{'6', '7'}}, {{'6', '8'}}, {{'6', '9'}}, - {{'7', '0'}}, {{'7', '1'}}, {{'7', '2'}}, {{'7', '3'}}, {{'7', '4'}}, {{'7', '5'}}, {{'7', '6'}}, {{'7', '7'}}, {{'7', '8'}}, {{'7', '9'}}, - {{'8', '0'}}, {{'8', '1'}}, {{'8', '2'}}, {{'8', '3'}}, {{'8', '4'}}, {{'8', '5'}}, {{'8', '6'}}, {{'8', '7'}}, {{'8', '8'}}, {{'8', '9'}}, - {{'9', '0'}}, {{'9', '1'}}, {{'9', '2'}}, {{'9', '3'}}, {{'9', '4'}}, {{'9', '5'}}, {{'9', '6'}}, {{'9', '7'}}, {{'9', '8'}}, {{'9', '9'}}, - } - }; - - // special case for "0" - if (x == 0) - { - o->write_character('0'); - return; - } - - // use a pointer to fill the buffer - auto buffer_ptr = number_buffer.begin(); - - const bool is_negative = std::is_same::value && !(x >= 0); // see issue #755 - number_unsigned_t abs_value; - - unsigned int n_chars; - - if (is_negative) - { - *buffer_ptr = '-'; - abs_value = remove_sign(static_cast(x)); - - // account one more byte for the minus sign - n_chars = 1 + count_digits(abs_value); - } - else - { - abs_value = static_cast(x); - n_chars = count_digits(abs_value); - } - - // spare 1 byte for '\0' - JSON_ASSERT(n_chars < number_buffer.size() - 1); - - // jump to the end to generate the string from backward - // so we later avoid reversing the result - buffer_ptr += n_chars; - - // Fast int2ascii implementation inspired by "Fastware" talk by Andrei Alexandrescu - // See: https://www.youtube.com/watch?v=o4-CwDo2zpg - while (abs_value >= 100) - { - const auto digits_index = static_cast((abs_value % 100)); - abs_value /= 100; - *(--buffer_ptr) = digits_to_99[digits_index][1]; - *(--buffer_ptr) = digits_to_99[digits_index][0]; - } - - if (abs_value >= 10) - { - const auto digits_index = static_cast(abs_value); - *(--buffer_ptr) = digits_to_99[digits_index][1]; - *(--buffer_ptr) = digits_to_99[digits_index][0]; - } - else - { - *(--buffer_ptr) = static_cast('0' + abs_value); - } - - o->write_characters(number_buffer.data(), n_chars); - } - - /*! - @brief dump a floating-point number - - Dump a given floating-point number to output stream @a o. Works internally - with @a number_buffer. - - @param[in] x floating-point number to dump - */ - void dump_float(number_float_t x) - { - // NaN / inf - if (!std::isfinite(x)) - { - o->write_characters("null", 4); - return; - } - - // If number_float_t is an IEEE-754 single or double precision number, - // use the Grisu2 algorithm to produce short numbers which are - // guaranteed to round-trip, using strtof and strtod, resp. - // - // NB: The test below works if == . - static constexpr bool is_ieee_single_or_double - = (std::numeric_limits::is_iec559 && std::numeric_limits::digits == 24 && std::numeric_limits::max_exponent == 128) || - (std::numeric_limits::is_iec559 && std::numeric_limits::digits == 53 && std::numeric_limits::max_exponent == 1024); - - dump_float(x, std::integral_constant()); - } - - void dump_float(number_float_t x, std::true_type /*is_ieee_single_or_double*/) - { - char* begin = number_buffer.data(); - char* end = ::nlohmann::detail::to_chars(begin, begin + number_buffer.size(), x); - - o->write_characters(begin, static_cast(end - begin)); - } - - void dump_float(number_float_t x, std::false_type /*is_ieee_single_or_double*/) - { - // get number of digits for a float -> text -> float round-trip - static constexpr auto d = std::numeric_limits::max_digits10; - - // the actual conversion - std::ptrdiff_t len = (std::snprintf)(number_buffer.data(), number_buffer.size(), "%.*g", d, x); - - // negative value indicates an error - JSON_ASSERT(len > 0); - // check if buffer was large enough - JSON_ASSERT(static_cast(len) < number_buffer.size()); - - // erase thousands separator - if (thousands_sep != '\0') - { - const auto end = std::remove(number_buffer.begin(), - number_buffer.begin() + len, thousands_sep); - std::fill(end, number_buffer.end(), '\0'); - JSON_ASSERT((end - number_buffer.begin()) <= len); - len = (end - number_buffer.begin()); - } - - // convert decimal point to '.' - if (decimal_point != '\0' && decimal_point != '.') - { - const auto dec_pos = std::find(number_buffer.begin(), number_buffer.end(), decimal_point); - if (dec_pos != number_buffer.end()) - { - *dec_pos = '.'; - } - } - - o->write_characters(number_buffer.data(), static_cast(len)); - - // determine if need to append ".0" - const bool value_is_int_like = - std::none_of(number_buffer.begin(), number_buffer.begin() + len + 1, - [](char c) - { - return c == '.' || c == 'e'; - }); - - if (value_is_int_like) - { - o->write_characters(".0", 2); - } - } - - /*! - @brief check whether a string is UTF-8 encoded - - The function checks each byte of a string whether it is UTF-8 encoded. The - result of the check is stored in the @a state parameter. The function must - be called initially with state 0 (accept). State 1 means the string must - be rejected, because the current byte is not allowed. If the string is - completely processed, but the state is non-zero, the string ended - prematurely; that is, the last byte indicated more bytes should have - followed. - - @param[in,out] state the state of the decoding - @param[in,out] codep codepoint (valid only if resulting state is UTF8_ACCEPT) - @param[in] byte next byte to decode - @return new state - - @note The function has been edited: a std::array is used. - - @copyright Copyright (c) 2008-2009 Bjoern Hoehrmann - @sa http://bjoern.hoehrmann.de/utf-8/decoder/dfa/ - */ - static std::uint8_t decode(std::uint8_t& state, std::uint32_t& codep, const std::uint8_t byte) noexcept - { - static const std::array utf8d = - { - { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 00..1F - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 20..3F - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 40..5F - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 60..7F - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, // 80..9F - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, // A0..BF - 8, 8, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, // C0..DF - 0xA, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x3, 0x4, 0x3, 0x3, // E0..EF - 0xB, 0x6, 0x6, 0x6, 0x5, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, // F0..FF - 0x0, 0x1, 0x2, 0x3, 0x5, 0x8, 0x7, 0x1, 0x1, 0x1, 0x4, 0x6, 0x1, 0x1, 0x1, 0x1, // s0..s0 - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, // s1..s2 - 1, 2, 1, 1, 1, 1, 1, 2, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, // s3..s4 - 1, 2, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 1, 3, 1, 1, 1, 1, 1, 1, // s5..s6 - 1, 3, 1, 1, 1, 1, 1, 3, 1, 3, 1, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 // s7..s8 - } - }; - - const std::uint8_t type = utf8d[byte]; - - codep = (state != UTF8_ACCEPT) - ? (byte & 0x3fu) | (codep << 6u) - : (0xFFu >> type) & (byte); - - std::size_t index = 256u + static_cast(state) * 16u + static_cast(type); - JSON_ASSERT(index < 400); - state = utf8d[index]; - return state; - } - - /* - * Overload to make the compiler happy while it is instantiating - * dump_integer for number_unsigned_t. - * Must never be called. - */ - number_unsigned_t remove_sign(number_unsigned_t x) - { - JSON_ASSERT(false); // LCOV_EXCL_LINE - return x; // LCOV_EXCL_LINE - } - - /* - * Helper function for dump_integer - * - * This function takes a negative signed integer and returns its absolute - * value as unsigned integer. The plus/minus shuffling is necessary as we can - * not directly remove the sign of an arbitrary signed integer as the - * absolute values of INT_MIN and INT_MAX are usually not the same. See - * #1708 for details. - */ - inline number_unsigned_t remove_sign(number_integer_t x) noexcept - { - JSON_ASSERT(x < 0 && x < (std::numeric_limits::max)()); - return static_cast(-(x + 1)) + 1; - } - - private: - /// the output of the serializer - output_adapter_t o = nullptr; - - /// a (hopefully) large enough character buffer - std::array number_buffer{{}}; - - /// the locale - const std::lconv* loc = nullptr; - /// the locale's thousand separator character - const char thousands_sep = '\0'; - /// the locale's decimal point character - const char decimal_point = '\0'; - - /// string buffer - std::array string_buffer{{}}; - - /// the indentation character - const char indent_char; - /// the indentation string - string_t indent_string; - - /// error_handler how to react on decoding errors - const error_handler_t error_handler; -}; -} // namespace detail -} // namespace nlohmann - -// #include - -// #include - -// #include - - -#include // less -#include // allocator -#include // pair -#include // vector - -namespace nlohmann -{ - -/// ordered_map: a minimal map-like container that preserves insertion order -/// for use within nlohmann::basic_json -template , - class Allocator = std::allocator>> - struct ordered_map : std::vector, Allocator> -{ - using key_type = Key; - using mapped_type = T; - using Container = std::vector, Allocator>; - using typename Container::iterator; - using typename Container::const_iterator; - using typename Container::size_type; - using typename Container::value_type; - - // Explicit constructors instead of `using Container::Container` - // otherwise older compilers choke on it (GCC <= 5.5, xcode <= 9.4) - ordered_map(const Allocator& alloc = Allocator()) : Container{alloc} {} - template - ordered_map(It first, It last, const Allocator& alloc = Allocator()) - : Container{first, last, alloc} {} - ordered_map(std::initializer_list init, const Allocator& alloc = Allocator() ) - : Container{init, alloc} {} - - std::pair emplace(const key_type& key, T&& t) - { - for (auto it = this->begin(); it != this->end(); ++it) - { - if (it->first == key) - { - return {it, false}; - } - } - Container::emplace_back(key, t); - return {--this->end(), true}; - } - - T& operator[](const Key& key) - { - return emplace(key, T{}).first->second; - } - - const T& operator[](const Key& key) const - { - return at(key); - } - - T& at(const Key& key) - { - for (auto it = this->begin(); it != this->end(); ++it) - { - if (it->first == key) - { - return it->second; - } - } - - throw std::out_of_range("key not found"); - } - - const T& at(const Key& key) const - { - for (auto it = this->begin(); it != this->end(); ++it) - { - if (it->first == key) - { - return it->second; - } - } - - throw std::out_of_range("key not found"); - } - - size_type erase(const Key& key) - { - for (auto it = this->begin(); it != this->end(); ++it) - { - if (it->first == key) - { - // Since we cannot move const Keys, re-construct them in place - for (auto next = it; ++next != this->end(); ++it) - { - it->~value_type(); // Destroy but keep allocation - new (&*it) value_type{std::move(*next)}; - } - Container::pop_back(); - return 1; - } - } - return 0; - } - - iterator erase(iterator pos) - { - auto it = pos; - - // Since we cannot move const Keys, re-construct them in place - for (auto next = it; ++next != this->end(); ++it) - { - it->~value_type(); // Destroy but keep allocation - new (&*it) value_type{std::move(*next)}; - } - Container::pop_back(); - return pos; - } - - size_type count(const Key& key) const - { - for (auto it = this->begin(); it != this->end(); ++it) - { - if (it->first == key) - { - return 1; - } - } - return 0; - } - - iterator find(const Key& key) - { - for (auto it = this->begin(); it != this->end(); ++it) - { - if (it->first == key) - { - return it; - } - } - return Container::end(); - } - - const_iterator find(const Key& key) const - { - for (auto it = this->begin(); it != this->end(); ++it) - { - if (it->first == key) - { - return it; - } - } - return Container::end(); - } - - std::pair insert( value_type&& value ) - { - return emplace(value.first, std::move(value.second)); - } - - std::pair insert( const value_type& value ) - { - for (auto it = this->begin(); it != this->end(); ++it) - { - if (it->first == value.first) - { - return {it, false}; - } - } - Container::push_back(value); - return {--this->end(), true}; - } -}; - -} // namespace nlohmann - - -/*! -@brief namespace for Niels Lohmann -@see https://github.com/nlohmann -@since version 1.0.0 -*/ -namespace nlohmann -{ - -/*! -@brief a class to store JSON values - -@tparam ObjectType type for JSON objects (`std::map` by default; will be used -in @ref object_t) -@tparam ArrayType type for JSON arrays (`std::vector` by default; will be used -in @ref array_t) -@tparam StringType type for JSON strings and object keys (`std::string` by -default; will be used in @ref string_t) -@tparam BooleanType type for JSON booleans (`bool` by default; will be used -in @ref boolean_t) -@tparam NumberIntegerType type for JSON integer numbers (`int64_t` by -default; will be used in @ref number_integer_t) -@tparam NumberUnsignedType type for JSON unsigned integer numbers (@c -`uint64_t` by default; will be used in @ref number_unsigned_t) -@tparam NumberFloatType type for JSON floating-point numbers (`double` by -default; will be used in @ref number_float_t) -@tparam BinaryType type for packed binary data for compatibility with binary -serialization formats (`std::vector` by default; will be used in -@ref binary_t) -@tparam AllocatorType type of the allocator to use (`std::allocator` by -default) -@tparam JSONSerializer the serializer to resolve internal calls to `to_json()` -and `from_json()` (@ref adl_serializer by default) - -@requirement The class satisfies the following concept requirements: -- Basic - - [DefaultConstructible](https://en.cppreference.com/w/cpp/named_req/DefaultConstructible): - JSON values can be default constructed. The result will be a JSON null - value. - - [MoveConstructible](https://en.cppreference.com/w/cpp/named_req/MoveConstructible): - A JSON value can be constructed from an rvalue argument. - - [CopyConstructible](https://en.cppreference.com/w/cpp/named_req/CopyConstructible): - A JSON value can be copy-constructed from an lvalue expression. - - [MoveAssignable](https://en.cppreference.com/w/cpp/named_req/MoveAssignable): - A JSON value van be assigned from an rvalue argument. - - [CopyAssignable](https://en.cppreference.com/w/cpp/named_req/CopyAssignable): - A JSON value can be copy-assigned from an lvalue expression. - - [Destructible](https://en.cppreference.com/w/cpp/named_req/Destructible): - JSON values can be destructed. -- Layout - - [StandardLayoutType](https://en.cppreference.com/w/cpp/named_req/StandardLayoutType): - JSON values have - [standard layout](https://en.cppreference.com/w/cpp/language/data_members#Standard_layout): - All non-static data members are private and standard layout types, the - class has no virtual functions or (virtual) base classes. -- Library-wide - - [EqualityComparable](https://en.cppreference.com/w/cpp/named_req/EqualityComparable): - JSON values can be compared with `==`, see @ref - operator==(const_reference,const_reference). - - [LessThanComparable](https://en.cppreference.com/w/cpp/named_req/LessThanComparable): - JSON values can be compared with `<`, see @ref - operator<(const_reference,const_reference). - - [Swappable](https://en.cppreference.com/w/cpp/named_req/Swappable): - Any JSON lvalue or rvalue of can be swapped with any lvalue or rvalue of - other compatible types, using unqualified function call @ref swap(). - - [NullablePointer](https://en.cppreference.com/w/cpp/named_req/NullablePointer): - JSON values can be compared against `std::nullptr_t` objects which are used - to model the `null` value. -- Container - - [Container](https://en.cppreference.com/w/cpp/named_req/Container): - JSON values can be used like STL containers and provide iterator access. - - [ReversibleContainer](https://en.cppreference.com/w/cpp/named_req/ReversibleContainer); - JSON values can be used like STL containers and provide reverse iterator - access. - -@invariant The member variables @a m_value and @a m_type have the following -relationship: -- If `m_type == value_t::object`, then `m_value.object != nullptr`. -- If `m_type == value_t::array`, then `m_value.array != nullptr`. -- If `m_type == value_t::string`, then `m_value.string != nullptr`. -The invariants are checked by member function assert_invariant(). - -@internal -@note ObjectType trick from https://stackoverflow.com/a/9860911 -@endinternal - -@see [RFC 7159: The JavaScript Object Notation (JSON) Data Interchange -Format](http://rfc7159.net/rfc7159) - -@since version 1.0.0 - -@nosubgrouping -*/ -NLOHMANN_BASIC_JSON_TPL_DECLARATION -class basic_json -{ - private: - template friend struct detail::external_constructor; - friend ::nlohmann::json_pointer; - - template - friend class ::nlohmann::detail::parser; - friend ::nlohmann::detail::serializer; - template - friend class ::nlohmann::detail::iter_impl; - template - friend class ::nlohmann::detail::binary_writer; - template - friend class ::nlohmann::detail::binary_reader; - template - friend class ::nlohmann::detail::json_sax_dom_parser; - template - friend class ::nlohmann::detail::json_sax_dom_callback_parser; - - /// workaround type for MSVC - using basic_json_t = NLOHMANN_BASIC_JSON_TPL; - - // convenience aliases for types residing in namespace detail; - using lexer = ::nlohmann::detail::lexer_base; - - template - static ::nlohmann::detail::parser parser( - InputAdapterType adapter, - detail::parser_callback_tcb = nullptr, - const bool allow_exceptions = true, - const bool ignore_comments = false - ) - { - return ::nlohmann::detail::parser(std::move(adapter), - std::move(cb), allow_exceptions, ignore_comments); - } - - using primitive_iterator_t = ::nlohmann::detail::primitive_iterator_t; - template - using internal_iterator = ::nlohmann::detail::internal_iterator; - template - using iter_impl = ::nlohmann::detail::iter_impl; - template - using iteration_proxy = ::nlohmann::detail::iteration_proxy; - template using json_reverse_iterator = ::nlohmann::detail::json_reverse_iterator; - - template - using output_adapter_t = ::nlohmann::detail::output_adapter_t; - - template - using binary_reader = ::nlohmann::detail::binary_reader; - template using binary_writer = ::nlohmann::detail::binary_writer; - - using serializer = ::nlohmann::detail::serializer; - - public: - using value_t = detail::value_t; - /// JSON Pointer, see @ref nlohmann::json_pointer - using json_pointer = ::nlohmann::json_pointer; - template - using json_serializer = JSONSerializer; - /// how to treat decoding errors - using error_handler_t = detail::error_handler_t; - /// how to treat CBOR tags - using cbor_tag_handler_t = detail::cbor_tag_handler_t; - /// helper type for initializer lists of basic_json values - using initializer_list_t = std::initializer_list>; - - using input_format_t = detail::input_format_t; - /// SAX interface type, see @ref nlohmann::json_sax - using json_sax_t = json_sax; - - //////////////// - // exceptions // - //////////////// - - /// @name exceptions - /// Classes to implement user-defined exceptions. - /// @{ - - /// @copydoc detail::exception - using exception = detail::exception; - /// @copydoc detail::parse_error - using parse_error = detail::parse_error; - /// @copydoc detail::invalid_iterator - using invalid_iterator = detail::invalid_iterator; - /// @copydoc detail::type_error - using type_error = detail::type_error; - /// @copydoc detail::out_of_range - using out_of_range = detail::out_of_range; - /// @copydoc detail::other_error - using other_error = detail::other_error; - - /// @} - - - ///////////////////// - // container types // - ///////////////////// - - /// @name container types - /// The canonic container types to use @ref basic_json like any other STL - /// container. - /// @{ - - /// the type of elements in a basic_json container - using value_type = basic_json; - - /// the type of an element reference - using reference = value_type&; - /// the type of an element const reference - using const_reference = const value_type&; - - /// a type to represent differences between iterators - using difference_type = std::ptrdiff_t; - /// a type to represent container sizes - using size_type = std::size_t; - - /// the allocator type - using allocator_type = AllocatorType; - - /// the type of an element pointer - using pointer = typename std::allocator_traits::pointer; - /// the type of an element const pointer - using const_pointer = typename std::allocator_traits::const_pointer; - - /// an iterator for a basic_json container - using iterator = iter_impl; - /// a const iterator for a basic_json container - using const_iterator = iter_impl; - /// a reverse iterator for a basic_json container - using reverse_iterator = json_reverse_iterator; - /// a const reverse iterator for a basic_json container - using const_reverse_iterator = json_reverse_iterator; - - /// @} - - - /*! - @brief returns the allocator associated with the container - */ - static allocator_type get_allocator() - { - return allocator_type(); - } - - /*! - @brief returns version information on the library - - This function returns a JSON object with information about the library, - including the version number and information on the platform and compiler. - - @return JSON object holding version information - key | description - ----------- | --------------- - `compiler` | Information on the used compiler. It is an object with the following keys: `c++` (the used C++ standard), `family` (the compiler family; possible values are `clang`, `icc`, `gcc`, `ilecpp`, `msvc`, `pgcpp`, `sunpro`, and `unknown`), and `version` (the compiler version). - `copyright` | The copyright line for the library as string. - `name` | The name of the library as string. - `platform` | The used platform as string. Possible values are `win32`, `linux`, `apple`, `unix`, and `unknown`. - `url` | The URL of the project as string. - `version` | The version of the library. It is an object with the following keys: `major`, `minor`, and `patch` as defined by [Semantic Versioning](http://semver.org), and `string` (the version string). - - @liveexample{The following code shows an example output of the `meta()` - function.,meta} - - @exceptionsafety Strong guarantee: if an exception is thrown, there are no - changes to any JSON value. - - @complexity Constant. - - @since 2.1.0 - */ - JSON_HEDLEY_WARN_UNUSED_RESULT - static basic_json meta() - { - basic_json result; - - result["copyright"] = "(C) 2013-2020 Niels Lohmann"; - result["name"] = "JSON for Modern C++"; - result["url"] = "https://github.com/nlohmann/json"; - result["version"]["string"] = - std::to_string(NLOHMANN_JSON_VERSION_MAJOR) + "." + - std::to_string(NLOHMANN_JSON_VERSION_MINOR) + "." + - std::to_string(NLOHMANN_JSON_VERSION_PATCH); - result["version"]["major"] = NLOHMANN_JSON_VERSION_MAJOR; - result["version"]["minor"] = NLOHMANN_JSON_VERSION_MINOR; - result["version"]["patch"] = NLOHMANN_JSON_VERSION_PATCH; - -#ifdef _WIN32 - result["platform"] = "win32"; -#elif defined __linux__ - result["platform"] = "linux"; -#elif defined __APPLE__ - result["platform"] = "apple"; -#elif defined __unix__ - result["platform"] = "unix"; -#else - result["platform"] = "unknown"; -#endif - -#if defined(__ICC) || defined(__INTEL_COMPILER) - result["compiler"] = {{"family", "icc"}, {"version", __INTEL_COMPILER}}; -#elif defined(__clang__) - result["compiler"] = {{"family", "clang"}, {"version", __clang_version__}}; -#elif defined(__GNUC__) || defined(__GNUG__) - result["compiler"] = {{"family", "gcc"}, {"version", std::to_string(__GNUC__) + "." + std::to_string(__GNUC_MINOR__) + "." + std::to_string(__GNUC_PATCHLEVEL__)}}; -#elif defined(__HP_cc) || defined(__HP_aCC) - result["compiler"] = "hp" -#elif defined(__IBMCPP__) - result["compiler"] = {{"family", "ilecpp"}, {"version", __IBMCPP__}}; -#elif defined(_MSC_VER) - result["compiler"] = {{"family", "msvc"}, {"version", _MSC_VER}}; -#elif defined(__PGI) - result["compiler"] = {{"family", "pgcpp"}, {"version", __PGI}}; -#elif defined(__SUNPRO_CC) - result["compiler"] = {{"family", "sunpro"}, {"version", __SUNPRO_CC}}; -#else - result["compiler"] = {{"family", "unknown"}, {"version", "unknown"}}; -#endif - -#ifdef __cplusplus - result["compiler"]["c++"] = std::to_string(__cplusplus); -#else - result["compiler"]["c++"] = "unknown"; -#endif - return result; - } - - - /////////////////////////// - // JSON value data types // - /////////////////////////// - - /// @name JSON value data types - /// The data types to store a JSON value. These types are derived from - /// the template arguments passed to class @ref basic_json. - /// @{ - -#if defined(JSON_HAS_CPP_14) - // Use transparent comparator if possible, combined with perfect forwarding - // on find() and count() calls prevents unnecessary string construction. - using object_comparator_t = std::less<>; -#else - using object_comparator_t = std::less; -#endif - - /*! - @brief a type for an object - - [RFC 7159](http://rfc7159.net/rfc7159) describes JSON objects as follows: - > An object is an unordered collection of zero or more name/value pairs, - > where a name is a string and a value is a string, number, boolean, null, - > object, or array. - - To store objects in C++, a type is defined by the template parameters - described below. - - @tparam ObjectType the container to store objects (e.g., `std::map` or - `std::unordered_map`) - @tparam StringType the type of the keys or names (e.g., `std::string`). - The comparison function `std::less` is used to order elements - inside the container. - @tparam AllocatorType the allocator to use for objects (e.g., - `std::allocator`) - - #### Default type - - With the default values for @a ObjectType (`std::map`), @a StringType - (`std::string`), and @a AllocatorType (`std::allocator`), the default - value for @a object_t is: - - @code {.cpp} - std::map< - std::string, // key_type - basic_json, // value_type - std::less, // key_compare - std::allocator> // allocator_type - > - @endcode - - #### Behavior - - The choice of @a object_t influences the behavior of the JSON class. With - the default type, objects have the following behavior: - - - When all names are unique, objects will be interoperable in the sense - that all software implementations receiving that object will agree on - the name-value mappings. - - When the names within an object are not unique, it is unspecified which - one of the values for a given key will be chosen. For instance, - `{"key": 2, "key": 1}` could be equal to either `{"key": 1}` or - `{"key": 2}`. - - Internally, name/value pairs are stored in lexicographical order of the - names. Objects will also be serialized (see @ref dump) in this order. - For instance, `{"b": 1, "a": 2}` and `{"a": 2, "b": 1}` will be stored - and serialized as `{"a": 2, "b": 1}`. - - When comparing objects, the order of the name/value pairs is irrelevant. - This makes objects interoperable in the sense that they will not be - affected by these differences. For instance, `{"b": 1, "a": 2}` and - `{"a": 2, "b": 1}` will be treated as equal. - - #### Limits - - [RFC 7159](http://rfc7159.net/rfc7159) specifies: - > An implementation may set limits on the maximum depth of nesting. - - In this class, the object's limit of nesting is not explicitly constrained. - However, a maximum depth of nesting may be introduced by the compiler or - runtime environment. A theoretical limit can be queried by calling the - @ref max_size function of a JSON object. - - #### Storage - - Objects are stored as pointers in a @ref basic_json type. That is, for any - access to object values, a pointer of type `object_t*` must be - dereferenced. - - @sa @ref array_t -- type for an array value - - @since version 1.0.0 - - @note The order name/value pairs are added to the object is *not* - preserved by the library. Therefore, iterating an object may return - name/value pairs in a different order than they were originally stored. In - fact, keys will be traversed in alphabetical order as `std::map` with - `std::less` is used by default. Please note this behavior conforms to [RFC - 7159](http://rfc7159.net/rfc7159), because any order implements the - specified "unordered" nature of JSON objects. - */ - using object_t = ObjectType>>; - - /*! - @brief a type for an array - - [RFC 7159](http://rfc7159.net/rfc7159) describes JSON arrays as follows: - > An array is an ordered sequence of zero or more values. - - To store objects in C++, a type is defined by the template parameters - explained below. - - @tparam ArrayType container type to store arrays (e.g., `std::vector` or - `std::list`) - @tparam AllocatorType allocator to use for arrays (e.g., `std::allocator`) - - #### Default type - - With the default values for @a ArrayType (`std::vector`) and @a - AllocatorType (`std::allocator`), the default value for @a array_t is: - - @code {.cpp} - std::vector< - basic_json, // value_type - std::allocator // allocator_type - > - @endcode - - #### Limits - - [RFC 7159](http://rfc7159.net/rfc7159) specifies: - > An implementation may set limits on the maximum depth of nesting. - - In this class, the array's limit of nesting is not explicitly constrained. - However, a maximum depth of nesting may be introduced by the compiler or - runtime environment. A theoretical limit can be queried by calling the - @ref max_size function of a JSON array. - - #### Storage - - Arrays are stored as pointers in a @ref basic_json type. That is, for any - access to array values, a pointer of type `array_t*` must be dereferenced. - - @sa @ref object_t -- type for an object value - - @since version 1.0.0 - */ - using array_t = ArrayType>; - - /*! - @brief a type for a string - - [RFC 7159](http://rfc7159.net/rfc7159) describes JSON strings as follows: - > A string is a sequence of zero or more Unicode characters. - - To store objects in C++, a type is defined by the template parameter - described below. Unicode values are split by the JSON class into - byte-sized characters during deserialization. - - @tparam StringType the container to store strings (e.g., `std::string`). - Note this container is used for keys/names in objects, see @ref object_t. - - #### Default type - - With the default values for @a StringType (`std::string`), the default - value for @a string_t is: - - @code {.cpp} - std::string - @endcode - - #### Encoding - - Strings are stored in UTF-8 encoding. Therefore, functions like - `std::string::size()` or `std::string::length()` return the number of - bytes in the string rather than the number of characters or glyphs. - - #### String comparison - - [RFC 7159](http://rfc7159.net/rfc7159) states: - > Software implementations are typically required to test names of object - > members for equality. Implementations that transform the textual - > representation into sequences of Unicode code units and then perform the - > comparison numerically, code unit by code unit, are interoperable in the - > sense that implementations will agree in all cases on equality or - > inequality of two strings. For example, implementations that compare - > strings with escaped characters unconverted may incorrectly find that - > `"a\\b"` and `"a\u005Cb"` are not equal. - - This implementation is interoperable as it does compare strings code unit - by code unit. - - #### Storage - - String values are stored as pointers in a @ref basic_json type. That is, - for any access to string values, a pointer of type `string_t*` must be - dereferenced. - - @since version 1.0.0 - */ - using string_t = StringType; - - /*! - @brief a type for a boolean - - [RFC 7159](http://rfc7159.net/rfc7159) implicitly describes a boolean as a - type which differentiates the two literals `true` and `false`. - - To store objects in C++, a type is defined by the template parameter @a - BooleanType which chooses the type to use. - - #### Default type - - With the default values for @a BooleanType (`bool`), the default value for - @a boolean_t is: - - @code {.cpp} - bool - @endcode - - #### Storage - - Boolean values are stored directly inside a @ref basic_json type. - - @since version 1.0.0 - */ - using boolean_t = BooleanType; - - /*! - @brief a type for a number (integer) - - [RFC 7159](http://rfc7159.net/rfc7159) describes numbers as follows: - > The representation of numbers is similar to that used in most - > programming languages. A number is represented in base 10 using decimal - > digits. It contains an integer component that may be prefixed with an - > optional minus sign, which may be followed by a fraction part and/or an - > exponent part. Leading zeros are not allowed. (...) Numeric values that - > cannot be represented in the grammar below (such as Infinity and NaN) - > are not permitted. - - This description includes both integer and floating-point numbers. - However, C++ allows more precise storage if it is known whether the number - is a signed integer, an unsigned integer or a floating-point number. - Therefore, three different types, @ref number_integer_t, @ref - number_unsigned_t and @ref number_float_t are used. - - To store integer numbers in C++, a type is defined by the template - parameter @a NumberIntegerType which chooses the type to use. - - #### Default type - - With the default values for @a NumberIntegerType (`int64_t`), the default - value for @a number_integer_t is: - - @code {.cpp} - int64_t - @endcode - - #### Default behavior - - - The restrictions about leading zeros is not enforced in C++. Instead, - leading zeros in integer literals lead to an interpretation as octal - number. Internally, the value will be stored as decimal number. For - instance, the C++ integer literal `010` will be serialized to `8`. - During deserialization, leading zeros yield an error. - - Not-a-number (NaN) values will be serialized to `null`. - - #### Limits - - [RFC 7159](http://rfc7159.net/rfc7159) specifies: - > An implementation may set limits on the range and precision of numbers. - - When the default type is used, the maximal integer number that can be - stored is `9223372036854775807` (INT64_MAX) and the minimal integer number - that can be stored is `-9223372036854775808` (INT64_MIN). Integer numbers - that are out of range will yield over/underflow when used in a - constructor. During deserialization, too large or small integer numbers - will be automatically be stored as @ref number_unsigned_t or @ref - number_float_t. - - [RFC 7159](http://rfc7159.net/rfc7159) further states: - > Note that when such software is used, numbers that are integers and are - > in the range \f$[-2^{53}+1, 2^{53}-1]\f$ are interoperable in the sense - > that implementations will agree exactly on their numeric values. - - As this range is a subrange of the exactly supported range [INT64_MIN, - INT64_MAX], this class's integer type is interoperable. - - #### Storage - - Integer number values are stored directly inside a @ref basic_json type. - - @sa @ref number_float_t -- type for number values (floating-point) - - @sa @ref number_unsigned_t -- type for number values (unsigned integer) - - @since version 1.0.0 - */ - using number_integer_t = NumberIntegerType; - - /*! - @brief a type for a number (unsigned) - - [RFC 7159](http://rfc7159.net/rfc7159) describes numbers as follows: - > The representation of numbers is similar to that used in most - > programming languages. A number is represented in base 10 using decimal - > digits. It contains an integer component that may be prefixed with an - > optional minus sign, which may be followed by a fraction part and/or an - > exponent part. Leading zeros are not allowed. (...) Numeric values that - > cannot be represented in the grammar below (such as Infinity and NaN) - > are not permitted. - - This description includes both integer and floating-point numbers. - However, C++ allows more precise storage if it is known whether the number - is a signed integer, an unsigned integer or a floating-point number. - Therefore, three different types, @ref number_integer_t, @ref - number_unsigned_t and @ref number_float_t are used. - - To store unsigned integer numbers in C++, a type is defined by the - template parameter @a NumberUnsignedType which chooses the type to use. - - #### Default type - - With the default values for @a NumberUnsignedType (`uint64_t`), the - default value for @a number_unsigned_t is: - - @code {.cpp} - uint64_t - @endcode - - #### Default behavior - - - The restrictions about leading zeros is not enforced in C++. Instead, - leading zeros in integer literals lead to an interpretation as octal - number. Internally, the value will be stored as decimal number. For - instance, the C++ integer literal `010` will be serialized to `8`. - During deserialization, leading zeros yield an error. - - Not-a-number (NaN) values will be serialized to `null`. - - #### Limits - - [RFC 7159](http://rfc7159.net/rfc7159) specifies: - > An implementation may set limits on the range and precision of numbers. - - When the default type is used, the maximal integer number that can be - stored is `18446744073709551615` (UINT64_MAX) and the minimal integer - number that can be stored is `0`. Integer numbers that are out of range - will yield over/underflow when used in a constructor. During - deserialization, too large or small integer numbers will be automatically - be stored as @ref number_integer_t or @ref number_float_t. - - [RFC 7159](http://rfc7159.net/rfc7159) further states: - > Note that when such software is used, numbers that are integers and are - > in the range \f$[-2^{53}+1, 2^{53}-1]\f$ are interoperable in the sense - > that implementations will agree exactly on their numeric values. - - As this range is a subrange (when considered in conjunction with the - number_integer_t type) of the exactly supported range [0, UINT64_MAX], - this class's integer type is interoperable. - - #### Storage - - Integer number values are stored directly inside a @ref basic_json type. - - @sa @ref number_float_t -- type for number values (floating-point) - @sa @ref number_integer_t -- type for number values (integer) - - @since version 2.0.0 - */ - using number_unsigned_t = NumberUnsignedType; - - /*! - @brief a type for a number (floating-point) - - [RFC 7159](http://rfc7159.net/rfc7159) describes numbers as follows: - > The representation of numbers is similar to that used in most - > programming languages. A number is represented in base 10 using decimal - > digits. It contains an integer component that may be prefixed with an - > optional minus sign, which may be followed by a fraction part and/or an - > exponent part. Leading zeros are not allowed. (...) Numeric values that - > cannot be represented in the grammar below (such as Infinity and NaN) - > are not permitted. - - This description includes both integer and floating-point numbers. - However, C++ allows more precise storage if it is known whether the number - is a signed integer, an unsigned integer or a floating-point number. - Therefore, three different types, @ref number_integer_t, @ref - number_unsigned_t and @ref number_float_t are used. - - To store floating-point numbers in C++, a type is defined by the template - parameter @a NumberFloatType which chooses the type to use. - - #### Default type - - With the default values for @a NumberFloatType (`double`), the default - value for @a number_float_t is: - - @code {.cpp} - double - @endcode - - #### Default behavior - - - The restrictions about leading zeros is not enforced in C++. Instead, - leading zeros in floating-point literals will be ignored. Internally, - the value will be stored as decimal number. For instance, the C++ - floating-point literal `01.2` will be serialized to `1.2`. During - deserialization, leading zeros yield an error. - - Not-a-number (NaN) values will be serialized to `null`. - - #### Limits - - [RFC 7159](http://rfc7159.net/rfc7159) states: - > This specification allows implementations to set limits on the range and - > precision of numbers accepted. Since software that implements IEEE - > 754-2008 binary64 (double precision) numbers is generally available and - > widely used, good interoperability can be achieved by implementations - > that expect no more precision or range than these provide, in the sense - > that implementations will approximate JSON numbers within the expected - > precision. - - This implementation does exactly follow this approach, as it uses double - precision floating-point numbers. Note values smaller than - `-1.79769313486232e+308` and values greater than `1.79769313486232e+308` - will be stored as NaN internally and be serialized to `null`. - - #### Storage - - Floating-point number values are stored directly inside a @ref basic_json - type. - - @sa @ref number_integer_t -- type for number values (integer) - - @sa @ref number_unsigned_t -- type for number values (unsigned integer) - - @since version 1.0.0 - */ - using number_float_t = NumberFloatType; - - /*! - @brief a type for a packed binary type - - This type is a type designed to carry binary data that appears in various - serialized formats, such as CBOR's Major Type 2, MessagePack's bin, and - BSON's generic binary subtype. This type is NOT a part of standard JSON and - exists solely for compatibility with these binary types. As such, it is - simply defined as an ordered sequence of zero or more byte values. - - Additionally, as an implementation detail, the subtype of the binary data is - carried around as a `std::uint8_t`, which is compatible with both of the - binary data formats that use binary subtyping, (though the specific - numbering is incompatible with each other, and it is up to the user to - translate between them). - - [CBOR's RFC 7049](https://tools.ietf.org/html/rfc7049) describes this type - as: - > Major type 2: a byte string. The string's length in bytes is represented - > following the rules for positive integers (major type 0). - - [MessagePack's documentation on the bin type - family](https://github.com/msgpack/msgpack/blob/master/spec.md#bin-format-family) - describes this type as: - > Bin format family stores an byte array in 2, 3, or 5 bytes of extra bytes - > in addition to the size of the byte array. - - [BSON's specifications](http://bsonspec.org/spec.html) describe several - binary types; however, this type is intended to represent the generic binary - type which has the description: - > Generic binary subtype - This is the most commonly used binary subtype and - > should be the 'default' for drivers and tools. - - None of these impose any limitations on the internal representation other - than the basic unit of storage be some type of array whose parts are - decomposable into bytes. - - The default representation of this binary format is a - `std::vector`, which is a very common way to represent a byte - array in modern C++. - - #### Default type - - The default values for @a BinaryType is `std::vector` - - #### Storage - - Binary Arrays are stored as pointers in a @ref basic_json type. That is, - for any access to array values, a pointer of the type `binary_t*` must be - dereferenced. - - #### Notes on subtypes - - - CBOR - - Binary values are represented as byte strings. No subtypes are - supported and will be ignored when CBOR is written. - - MessagePack - - If a subtype is given and the binary array contains exactly 1, 2, 4, 8, - or 16 elements, the fixext family (fixext1, fixext2, fixext4, fixext8) - is used. For other sizes, the ext family (ext8, ext16, ext32) is used. - The subtype is then added as singed 8-bit integer. - - If no subtype is given, the bin family (bin8, bin16, bin32) is used. - - BSON - - If a subtype is given, it is used and added as unsigned 8-bit integer. - - If no subtype is given, the generic binary subtype 0x00 is used. - - @sa @ref binary -- create a binary array - - @since version 3.8.0 - */ - using binary_t = nlohmann::byte_container_with_subtype; - /// @} - - private: - - /// helper for exception-safe object creation - template - JSON_HEDLEY_RETURNS_NON_NULL - static T* create(Args&& ... args) - { - AllocatorType alloc; - using AllocatorTraits = std::allocator_traits>; - - auto deleter = [&](T * object) - { - AllocatorTraits::deallocate(alloc, object, 1); - }; - std::unique_ptr object(AllocatorTraits::allocate(alloc, 1), deleter); - AllocatorTraits::construct(alloc, object.get(), std::forward(args)...); - JSON_ASSERT(object != nullptr); - return object.release(); - } - - //////////////////////// - // JSON value storage // - //////////////////////// - - /*! - @brief a JSON value - - The actual storage for a JSON value of the @ref basic_json class. This - union combines the different storage types for the JSON value types - defined in @ref value_t. - - JSON type | value_t type | used type - --------- | --------------- | ------------------------ - object | object | pointer to @ref object_t - array | array | pointer to @ref array_t - string | string | pointer to @ref string_t - boolean | boolean | @ref boolean_t - number | number_integer | @ref number_integer_t - number | number_unsigned | @ref number_unsigned_t - number | number_float | @ref number_float_t - binary | binary | pointer to @ref binary_t - null | null | *no value is stored* - - @note Variable-length types (objects, arrays, and strings) are stored as - pointers. The size of the union should not exceed 64 bits if the default - value types are used. - - @since version 1.0.0 - */ - union json_value - { - /// object (stored with pointer to save storage) - object_t* object; - /// array (stored with pointer to save storage) - array_t* array; - /// string (stored with pointer to save storage) - string_t* string; - /// binary (stored with pointer to save storage) - binary_t* binary; - /// boolean - boolean_t boolean; - /// number (integer) - number_integer_t number_integer; - /// number (unsigned integer) - number_unsigned_t number_unsigned; - /// number (floating-point) - number_float_t number_float; - - /// default constructor (for null values) - json_value() = default; - /// constructor for booleans - json_value(boolean_t v) noexcept : boolean(v) {} - /// constructor for numbers (integer) - json_value(number_integer_t v) noexcept : number_integer(v) {} - /// constructor for numbers (unsigned) - json_value(number_unsigned_t v) noexcept : number_unsigned(v) {} - /// constructor for numbers (floating-point) - json_value(number_float_t v) noexcept : number_float(v) {} - /// constructor for empty values of a given type - json_value(value_t t) - { - switch (t) - { - case value_t::object: - { - object = create(); - break; - } - - case value_t::array: - { - array = create(); - break; - } - - case value_t::string: - { - string = create(""); - break; - } - - case value_t::binary: - { - binary = create(); - break; - } - - case value_t::boolean: - { - boolean = boolean_t(false); - break; - } - - case value_t::number_integer: - { - number_integer = number_integer_t(0); - break; - } - - case value_t::number_unsigned: - { - number_unsigned = number_unsigned_t(0); - break; - } - - case value_t::number_float: - { - number_float = number_float_t(0.0); - break; - } - - case value_t::null: - { - object = nullptr; // silence warning, see #821 - break; - } - - default: - { - object = nullptr; // silence warning, see #821 - if (JSON_HEDLEY_UNLIKELY(t == value_t::null)) - { - JSON_THROW(other_error::create(500, "961c151d2e87f2686a955a9be24d316f1362bf21 3.9.1")); // LCOV_EXCL_LINE - } - break; - } - } - } - - /// constructor for strings - json_value(const string_t& value) - { - string = create(value); - } - - /// constructor for rvalue strings - json_value(string_t&& value) - { - string = create(std::move(value)); - } - - /// constructor for objects - json_value(const object_t& value) - { - object = create(value); - } - - /// constructor for rvalue objects - json_value(object_t&& value) - { - object = create(std::move(value)); - } - - /// constructor for arrays - json_value(const array_t& value) - { - array = create(value); - } - - /// constructor for rvalue arrays - json_value(array_t&& value) - { - array = create(std::move(value)); - } - - /// constructor for binary arrays - json_value(const typename binary_t::container_type& value) - { - binary = create(value); - } - - /// constructor for rvalue binary arrays - json_value(typename binary_t::container_type&& value) - { - binary = create(std::move(value)); - } - - /// constructor for binary arrays (internal type) - json_value(const binary_t& value) - { - binary = create(value); - } - - /// constructor for rvalue binary arrays (internal type) - json_value(binary_t&& value) - { - binary = create(std::move(value)); - } - - void destroy(value_t t) noexcept - { - // flatten the current json_value to a heap-allocated stack - std::vector stack; - - // move the top-level items to stack - if (t == value_t::array) - { - stack.reserve(array->size()); - std::move(array->begin(), array->end(), std::back_inserter(stack)); - } - else if (t == value_t::object) - { - stack.reserve(object->size()); - for (auto&& it : *object) - { - stack.push_back(std::move(it.second)); - } - } - - while (!stack.empty()) - { - // move the last item to local variable to be processed - basic_json current_item(std::move(stack.back())); - stack.pop_back(); - - // if current_item is array/object, move - // its children to the stack to be processed later - if (current_item.is_array()) - { - std::move(current_item.m_value.array->begin(), current_item.m_value.array->end(), - std::back_inserter(stack)); - - current_item.m_value.array->clear(); - } - else if (current_item.is_object()) - { - for (auto&& it : *current_item.m_value.object) - { - stack.push_back(std::move(it.second)); - } - - current_item.m_value.object->clear(); - } - - // it's now safe that current_item get destructed - // since it doesn't have any children - } - - switch (t) - { - case value_t::object: - { - AllocatorType alloc; - std::allocator_traits::destroy(alloc, object); - std::allocator_traits::deallocate(alloc, object, 1); - break; - } - - case value_t::array: - { - AllocatorType alloc; - std::allocator_traits::destroy(alloc, array); - std::allocator_traits::deallocate(alloc, array, 1); - break; - } - - case value_t::string: - { - AllocatorType alloc; - std::allocator_traits::destroy(alloc, string); - std::allocator_traits::deallocate(alloc, string, 1); - break; - } - - case value_t::binary: - { - AllocatorType alloc; - std::allocator_traits::destroy(alloc, binary); - std::allocator_traits::deallocate(alloc, binary, 1); - break; - } - - default: - { - break; - } - } - } - }; - - /*! - @brief checks the class invariants - - This function asserts the class invariants. It needs to be called at the - end of every constructor to make sure that created objects respect the - invariant. Furthermore, it has to be called each time the type of a JSON - value is changed, because the invariant expresses a relationship between - @a m_type and @a m_value. - */ - void assert_invariant() const noexcept - { - JSON_ASSERT(m_type != value_t::object || m_value.object != nullptr); - JSON_ASSERT(m_type != value_t::array || m_value.array != nullptr); - JSON_ASSERT(m_type != value_t::string || m_value.string != nullptr); - JSON_ASSERT(m_type != value_t::binary || m_value.binary != nullptr); - } - - public: - ////////////////////////// - // JSON parser callback // - ////////////////////////// - - /*! - @brief parser event types - - The parser callback distinguishes the following events: - - `object_start`: the parser read `{` and started to process a JSON object - - `key`: the parser read a key of a value in an object - - `object_end`: the parser read `}` and finished processing a JSON object - - `array_start`: the parser read `[` and started to process a JSON array - - `array_end`: the parser read `]` and finished processing a JSON array - - `value`: the parser finished reading a JSON value - - @image html callback_events.png "Example when certain parse events are triggered" - - @sa @ref parser_callback_t for more information and examples - */ - using parse_event_t = detail::parse_event_t; - - /*! - @brief per-element parser callback type - - With a parser callback function, the result of parsing a JSON text can be - influenced. When passed to @ref parse, it is called on certain events - (passed as @ref parse_event_t via parameter @a event) with a set recursion - depth @a depth and context JSON value @a parsed. The return value of the - callback function is a boolean indicating whether the element that emitted - the callback shall be kept or not. - - We distinguish six scenarios (determined by the event type) in which the - callback function can be called. The following table describes the values - of the parameters @a depth, @a event, and @a parsed. - - parameter @a event | description | parameter @a depth | parameter @a parsed - ------------------ | ----------- | ------------------ | ------------------- - parse_event_t::object_start | the parser read `{` and started to process a JSON object | depth of the parent of the JSON object | a JSON value with type discarded - parse_event_t::key | the parser read a key of a value in an object | depth of the currently parsed JSON object | a JSON string containing the key - parse_event_t::object_end | the parser read `}` and finished processing a JSON object | depth of the parent of the JSON object | the parsed JSON object - parse_event_t::array_start | the parser read `[` and started to process a JSON array | depth of the parent of the JSON array | a JSON value with type discarded - parse_event_t::array_end | the parser read `]` and finished processing a JSON array | depth of the parent of the JSON array | the parsed JSON array - parse_event_t::value | the parser finished reading a JSON value | depth of the value | the parsed JSON value - - @image html callback_events.png "Example when certain parse events are triggered" - - Discarding a value (i.e., returning `false`) has different effects - depending on the context in which function was called: - - - Discarded values in structured types are skipped. That is, the parser - will behave as if the discarded value was never read. - - In case a value outside a structured type is skipped, it is replaced - with `null`. This case happens if the top-level element is skipped. - - @param[in] depth the depth of the recursion during parsing - - @param[in] event an event of type parse_event_t indicating the context in - the callback function has been called - - @param[in,out] parsed the current intermediate parse result; note that - writing to this value has no effect for parse_event_t::key events - - @return Whether the JSON value which called the function during parsing - should be kept (`true`) or not (`false`). In the latter case, it is either - skipped completely or replaced by an empty discarded object. - - @sa @ref parse for examples - - @since version 1.0.0 - */ - using parser_callback_t = detail::parser_callback_t; - - ////////////////// - // constructors // - ////////////////// - - /// @name constructors and destructors - /// Constructors of class @ref basic_json, copy/move constructor, copy - /// assignment, static functions creating objects, and the destructor. - /// @{ - - /*! - @brief create an empty value with a given type - - Create an empty JSON value with a given type. The value will be default - initialized with an empty value which depends on the type: - - Value type | initial value - ----------- | ------------- - null | `null` - boolean | `false` - string | `""` - number | `0` - object | `{}` - array | `[]` - binary | empty array - - @param[in] v the type of the value to create - - @complexity Constant. - - @exceptionsafety Strong guarantee: if an exception is thrown, there are no - changes to any JSON value. - - @liveexample{The following code shows the constructor for different @ref - value_t values,basic_json__value_t} - - @sa @ref clear() -- restores the postcondition of this constructor - - @since version 1.0.0 - */ - basic_json(const value_t v) - : m_type(v), m_value(v) - { - assert_invariant(); - } - - /*! - @brief create a null object - - Create a `null` JSON value. It either takes a null pointer as parameter - (explicitly creating `null`) or no parameter (implicitly creating `null`). - The passed null pointer itself is not read -- it is only used to choose - the right constructor. - - @complexity Constant. - - @exceptionsafety No-throw guarantee: this constructor never throws - exceptions. - - @liveexample{The following code shows the constructor with and without a - null pointer parameter.,basic_json__nullptr_t} - - @since version 1.0.0 - */ - basic_json(std::nullptr_t = nullptr) noexcept - : basic_json(value_t::null) - { - assert_invariant(); - } - - /*! - @brief create a JSON value - - This is a "catch all" constructor for all compatible JSON types; that is, - types for which a `to_json()` method exists. The constructor forwards the - parameter @a val to that method (to `json_serializer::to_json` method - with `U = uncvref_t`, to be exact). - - Template type @a CompatibleType includes, but is not limited to, the - following types: - - **arrays**: @ref array_t and all kinds of compatible containers such as - `std::vector`, `std::deque`, `std::list`, `std::forward_list`, - `std::array`, `std::valarray`, `std::set`, `std::unordered_set`, - `std::multiset`, and `std::unordered_multiset` with a `value_type` from - which a @ref basic_json value can be constructed. - - **objects**: @ref object_t and all kinds of compatible associative - containers such as `std::map`, `std::unordered_map`, `std::multimap`, - and `std::unordered_multimap` with a `key_type` compatible to - @ref string_t and a `value_type` from which a @ref basic_json value can - be constructed. - - **strings**: @ref string_t, string literals, and all compatible string - containers can be used. - - **numbers**: @ref number_integer_t, @ref number_unsigned_t, - @ref number_float_t, and all convertible number types such as `int`, - `size_t`, `int64_t`, `float` or `double` can be used. - - **boolean**: @ref boolean_t / `bool` can be used. - - **binary**: @ref binary_t / `std::vector` may be used, - unfortunately because string literals cannot be distinguished from binary - character arrays by the C++ type system, all types compatible with `const - char*` will be directed to the string constructor instead. This is both - for backwards compatibility, and due to the fact that a binary type is not - a standard JSON type. - - See the examples below. - - @tparam CompatibleType a type such that: - - @a CompatibleType is not derived from `std::istream`, - - @a CompatibleType is not @ref basic_json (to avoid hijacking copy/move - constructors), - - @a CompatibleType is not a different @ref basic_json type (i.e. with different template arguments) - - @a CompatibleType is not a @ref basic_json nested type (e.g., - @ref json_pointer, @ref iterator, etc ...) - - @ref @ref json_serializer has a - `to_json(basic_json_t&, CompatibleType&&)` method - - @tparam U = `uncvref_t` - - @param[in] val the value to be forwarded to the respective constructor - - @complexity Usually linear in the size of the passed @a val, also - depending on the implementation of the called `to_json()` - method. - - @exceptionsafety Depends on the called constructor. For types directly - supported by the library (i.e., all types for which no `to_json()` function - was provided), strong guarantee holds: if an exception is thrown, there are - no changes to any JSON value. - - @liveexample{The following code shows the constructor with several - compatible types.,basic_json__CompatibleType} - - @since version 2.1.0 - */ - template < typename CompatibleType, - typename U = detail::uncvref_t, - detail::enable_if_t < - !detail::is_basic_json::value && detail::is_compatible_type::value, int > = 0 > - basic_json(CompatibleType && val) noexcept(noexcept( - JSONSerializer::to_json(std::declval(), - std::forward(val)))) - { - JSONSerializer::to_json(*this, std::forward(val)); - assert_invariant(); - } - - /*! - @brief create a JSON value from an existing one - - This is a constructor for existing @ref basic_json types. - It does not hijack copy/move constructors, since the parameter has different - template arguments than the current ones. - - The constructor tries to convert the internal @ref m_value of the parameter. - - @tparam BasicJsonType a type such that: - - @a BasicJsonType is a @ref basic_json type. - - @a BasicJsonType has different template arguments than @ref basic_json_t. - - @param[in] val the @ref basic_json value to be converted. - - @complexity Usually linear in the size of the passed @a val, also - depending on the implementation of the called `to_json()` - method. - - @exceptionsafety Depends on the called constructor. For types directly - supported by the library (i.e., all types for which no `to_json()` function - was provided), strong guarantee holds: if an exception is thrown, there are - no changes to any JSON value. - - @since version 3.2.0 - */ - template < typename BasicJsonType, - detail::enable_if_t < - detail::is_basic_json::value&& !std::is_same::value, int > = 0 > - basic_json(const BasicJsonType& val) - { - using other_boolean_t = typename BasicJsonType::boolean_t; - using other_number_float_t = typename BasicJsonType::number_float_t; - using other_number_integer_t = typename BasicJsonType::number_integer_t; - using other_number_unsigned_t = typename BasicJsonType::number_unsigned_t; - using other_string_t = typename BasicJsonType::string_t; - using other_object_t = typename BasicJsonType::object_t; - using other_array_t = typename BasicJsonType::array_t; - using other_binary_t = typename BasicJsonType::binary_t; - - switch (val.type()) - { - case value_t::boolean: - JSONSerializer::to_json(*this, val.template get()); - break; - case value_t::number_float: - JSONSerializer::to_json(*this, val.template get()); - break; - case value_t::number_integer: - JSONSerializer::to_json(*this, val.template get()); - break; - case value_t::number_unsigned: - JSONSerializer::to_json(*this, val.template get()); - break; - case value_t::string: - JSONSerializer::to_json(*this, val.template get_ref()); - break; - case value_t::object: - JSONSerializer::to_json(*this, val.template get_ref()); - break; - case value_t::array: - JSONSerializer::to_json(*this, val.template get_ref()); - break; - case value_t::binary: - JSONSerializer::to_json(*this, val.template get_ref()); - break; - case value_t::null: - *this = nullptr; - break; - case value_t::discarded: - m_type = value_t::discarded; - break; - default: // LCOV_EXCL_LINE - JSON_ASSERT(false); // LCOV_EXCL_LINE - } - assert_invariant(); - } - - /*! - @brief create a container (array or object) from an initializer list - - Creates a JSON value of type array or object from the passed initializer - list @a init. In case @a type_deduction is `true` (default), the type of - the JSON value to be created is deducted from the initializer list @a init - according to the following rules: - - 1. If the list is empty, an empty JSON object value `{}` is created. - 2. If the list consists of pairs whose first element is a string, a JSON - object value is created where the first elements of the pairs are - treated as keys and the second elements are as values. - 3. In all other cases, an array is created. - - The rules aim to create the best fit between a C++ initializer list and - JSON values. The rationale is as follows: - - 1. The empty initializer list is written as `{}` which is exactly an empty - JSON object. - 2. C++ has no way of describing mapped types other than to list a list of - pairs. As JSON requires that keys must be of type string, rule 2 is the - weakest constraint one can pose on initializer lists to interpret them - as an object. - 3. In all other cases, the initializer list could not be interpreted as - JSON object type, so interpreting it as JSON array type is safe. - - With the rules described above, the following JSON values cannot be - expressed by an initializer list: - - - the empty array (`[]`): use @ref array(initializer_list_t) - with an empty initializer list in this case - - arrays whose elements satisfy rule 2: use @ref - array(initializer_list_t) with the same initializer list - in this case - - @note When used without parentheses around an empty initializer list, @ref - basic_json() is called instead of this function, yielding the JSON null - value. - - @param[in] init initializer list with JSON values - - @param[in] type_deduction internal parameter; when set to `true`, the type - of the JSON value is deducted from the initializer list @a init; when set - to `false`, the type provided via @a manual_type is forced. This mode is - used by the functions @ref array(initializer_list_t) and - @ref object(initializer_list_t). - - @param[in] manual_type internal parameter; when @a type_deduction is set - to `false`, the created JSON value will use the provided type (only @ref - value_t::array and @ref value_t::object are valid); when @a type_deduction - is set to `true`, this parameter has no effect - - @throw type_error.301 if @a type_deduction is `false`, @a manual_type is - `value_t::object`, but @a init contains an element which is not a pair - whose first element is a string. In this case, the constructor could not - create an object. If @a type_deduction would have be `true`, an array - would have been created. See @ref object(initializer_list_t) - for an example. - - @complexity Linear in the size of the initializer list @a init. - - @exceptionsafety Strong guarantee: if an exception is thrown, there are no - changes to any JSON value. - - @liveexample{The example below shows how JSON values are created from - initializer lists.,basic_json__list_init_t} - - @sa @ref array(initializer_list_t) -- create a JSON array - value from an initializer list - @sa @ref object(initializer_list_t) -- create a JSON object - value from an initializer list - - @since version 1.0.0 - */ - basic_json(initializer_list_t init, - bool type_deduction = true, - value_t manual_type = value_t::array) - { - // check if each element is an array with two elements whose first - // element is a string - bool is_an_object = std::all_of(init.begin(), init.end(), - [](const detail::json_ref& element_ref) - { - return element_ref->is_array() && element_ref->size() == 2 && (*element_ref)[0].is_string(); - }); - - // adjust type if type deduction is not wanted - if (!type_deduction) - { - // if array is wanted, do not create an object though possible - if (manual_type == value_t::array) - { - is_an_object = false; - } - - // if object is wanted but impossible, throw an exception - if (JSON_HEDLEY_UNLIKELY(manual_type == value_t::object && !is_an_object)) - { - JSON_THROW(type_error::create(301, "cannot create object from initializer list")); - } - } - - if (is_an_object) - { - // the initializer list is a list of pairs -> create object - m_type = value_t::object; - m_value = value_t::object; - - std::for_each(init.begin(), init.end(), [this](const detail::json_ref& element_ref) - { - auto element = element_ref.moved_or_copied(); - m_value.object->emplace( - std::move(*((*element.m_value.array)[0].m_value.string)), - std::move((*element.m_value.array)[1])); - }); - } - else - { - // the initializer list describes an array -> create array - m_type = value_t::array; - m_value.array = create(init.begin(), init.end()); - } - - assert_invariant(); - } - - /*! - @brief explicitly create a binary array (without subtype) - - Creates a JSON binary array value from a given binary container. Binary - values are part of various binary formats, such as CBOR, MessagePack, and - BSON. This constructor is used to create a value for serialization to those - formats. - - @note Note, this function exists because of the difficulty in correctly - specifying the correct template overload in the standard value ctor, as both - JSON arrays and JSON binary arrays are backed with some form of a - `std::vector`. Because JSON binary arrays are a non-standard extension it - was decided that it would be best to prevent automatic initialization of a - binary array type, for backwards compatibility and so it does not happen on - accident. - - @param[in] init container containing bytes to use as binary type - - @return JSON binary array value - - @complexity Linear in the size of @a init. - - @exceptionsafety Strong guarantee: if an exception is thrown, there are no - changes to any JSON value. - - @since version 3.8.0 - */ - JSON_HEDLEY_WARN_UNUSED_RESULT - static basic_json binary(const typename binary_t::container_type& init) - { - auto res = basic_json(); - res.m_type = value_t::binary; - res.m_value = init; - return res; - } - - /*! - @brief explicitly create a binary array (with subtype) - - Creates a JSON binary array value from a given binary container. Binary - values are part of various binary formats, such as CBOR, MessagePack, and - BSON. This constructor is used to create a value for serialization to those - formats. - - @note Note, this function exists because of the difficulty in correctly - specifying the correct template overload in the standard value ctor, as both - JSON arrays and JSON binary arrays are backed with some form of a - `std::vector`. Because JSON binary arrays are a non-standard extension it - was decided that it would be best to prevent automatic initialization of a - binary array type, for backwards compatibility and so it does not happen on - accident. - - @param[in] init container containing bytes to use as binary type - @param[in] subtype subtype to use in MessagePack and BSON - - @return JSON binary array value - - @complexity Linear in the size of @a init. - - @exceptionsafety Strong guarantee: if an exception is thrown, there are no - changes to any JSON value. - - @since version 3.8.0 - */ - JSON_HEDLEY_WARN_UNUSED_RESULT - static basic_json binary(const typename binary_t::container_type& init, std::uint8_t subtype) - { - auto res = basic_json(); - res.m_type = value_t::binary; - res.m_value = binary_t(init, subtype); - return res; - } - - /// @copydoc binary(const typename binary_t::container_type&) - JSON_HEDLEY_WARN_UNUSED_RESULT - static basic_json binary(typename binary_t::container_type&& init) - { - auto res = basic_json(); - res.m_type = value_t::binary; - res.m_value = std::move(init); - return res; - } - - /// @copydoc binary(const typename binary_t::container_type&, std::uint8_t) - JSON_HEDLEY_WARN_UNUSED_RESULT - static basic_json binary(typename binary_t::container_type&& init, std::uint8_t subtype) - { - auto res = basic_json(); - res.m_type = value_t::binary; - res.m_value = binary_t(std::move(init), subtype); - return res; - } - - /*! - @brief explicitly create an array from an initializer list - - Creates a JSON array value from a given initializer list. That is, given a - list of values `a, b, c`, creates the JSON value `[a, b, c]`. If the - initializer list is empty, the empty array `[]` is created. - - @note This function is only needed to express two edge cases that cannot - be realized with the initializer list constructor (@ref - basic_json(initializer_list_t, bool, value_t)). These cases - are: - 1. creating an array whose elements are all pairs whose first element is a - string -- in this case, the initializer list constructor would create an - object, taking the first elements as keys - 2. creating an empty array -- passing the empty initializer list to the - initializer list constructor yields an empty object - - @param[in] init initializer list with JSON values to create an array from - (optional) - - @return JSON array value - - @complexity Linear in the size of @a init. - - @exceptionsafety Strong guarantee: if an exception is thrown, there are no - changes to any JSON value. - - @liveexample{The following code shows an example for the `array` - function.,array} - - @sa @ref basic_json(initializer_list_t, bool, value_t) -- - create a JSON value from an initializer list - @sa @ref object(initializer_list_t) -- create a JSON object - value from an initializer list - - @since version 1.0.0 - */ - JSON_HEDLEY_WARN_UNUSED_RESULT - static basic_json array(initializer_list_t init = {}) - { - return basic_json(init, false, value_t::array); - } - - /*! - @brief explicitly create an object from an initializer list - - Creates a JSON object value from a given initializer list. The initializer - lists elements must be pairs, and their first elements must be strings. If - the initializer list is empty, the empty object `{}` is created. - - @note This function is only added for symmetry reasons. In contrast to the - related function @ref array(initializer_list_t), there are - no cases which can only be expressed by this function. That is, any - initializer list @a init can also be passed to the initializer list - constructor @ref basic_json(initializer_list_t, bool, value_t). - - @param[in] init initializer list to create an object from (optional) - - @return JSON object value - - @throw type_error.301 if @a init is not a list of pairs whose first - elements are strings. In this case, no object can be created. When such a - value is passed to @ref basic_json(initializer_list_t, bool, value_t), - an array would have been created from the passed initializer list @a init. - See example below. - - @complexity Linear in the size of @a init. - - @exceptionsafety Strong guarantee: if an exception is thrown, there are no - changes to any JSON value. - - @liveexample{The following code shows an example for the `object` - function.,object} - - @sa @ref basic_json(initializer_list_t, bool, value_t) -- - create a JSON value from an initializer list - @sa @ref array(initializer_list_t) -- create a JSON array - value from an initializer list - - @since version 1.0.0 - */ - JSON_HEDLEY_WARN_UNUSED_RESULT - static basic_json object(initializer_list_t init = {}) - { - return basic_json(init, false, value_t::object); - } - - /*! - @brief construct an array with count copies of given value - - Constructs a JSON array value by creating @a cnt copies of a passed value. - In case @a cnt is `0`, an empty array is created. - - @param[in] cnt the number of JSON copies of @a val to create - @param[in] val the JSON value to copy - - @post `std::distance(begin(),end()) == cnt` holds. - - @complexity Linear in @a cnt. - - @exceptionsafety Strong guarantee: if an exception is thrown, there are no - changes to any JSON value. - - @liveexample{The following code shows examples for the @ref - basic_json(size_type\, const basic_json&) - constructor.,basic_json__size_type_basic_json} - - @since version 1.0.0 - */ - basic_json(size_type cnt, const basic_json& val) - : m_type(value_t::array) - { - m_value.array = create(cnt, val); - assert_invariant(); - } - - /*! - @brief construct a JSON container given an iterator range - - Constructs the JSON value with the contents of the range `[first, last)`. - The semantics depends on the different types a JSON value can have: - - In case of a null type, invalid_iterator.206 is thrown. - - In case of other primitive types (number, boolean, or string), @a first - must be `begin()` and @a last must be `end()`. In this case, the value is - copied. Otherwise, invalid_iterator.204 is thrown. - - In case of structured types (array, object), the constructor behaves as - similar versions for `std::vector` or `std::map`; that is, a JSON array - or object is constructed from the values in the range. - - @tparam InputIT an input iterator type (@ref iterator or @ref - const_iterator) - - @param[in] first begin of the range to copy from (included) - @param[in] last end of the range to copy from (excluded) - - @pre Iterators @a first and @a last must be initialized. **This - precondition is enforced with an assertion (see warning).** If - assertions are switched off, a violation of this precondition yields - undefined behavior. - - @pre Range `[first, last)` is valid. Usually, this precondition cannot be - checked efficiently. Only certain edge cases are detected; see the - description of the exceptions below. A violation of this precondition - yields undefined behavior. - - @warning A precondition is enforced with a runtime assertion that will - result in calling `std::abort` if this precondition is not met. - Assertions can be disabled by defining `NDEBUG` at compile time. - See https://en.cppreference.com/w/cpp/error/assert for more - information. - - @throw invalid_iterator.201 if iterators @a first and @a last are not - compatible (i.e., do not belong to the same JSON value). In this case, - the range `[first, last)` is undefined. - @throw invalid_iterator.204 if iterators @a first and @a last belong to a - primitive type (number, boolean, or string), but @a first does not point - to the first element any more. In this case, the range `[first, last)` is - undefined. See example code below. - @throw invalid_iterator.206 if iterators @a first and @a last belong to a - null value. In this case, the range `[first, last)` is undefined. - - @complexity Linear in distance between @a first and @a last. - - @exceptionsafety Strong guarantee: if an exception is thrown, there are no - changes to any JSON value. - - @liveexample{The example below shows several ways to create JSON values by - specifying a subrange with iterators.,basic_json__InputIt_InputIt} - - @since version 1.0.0 - */ - template < class InputIT, typename std::enable_if < - std::is_same::value || - std::is_same::value, int >::type = 0 > - basic_json(InputIT first, InputIT last) - { - JSON_ASSERT(first.m_object != nullptr); - JSON_ASSERT(last.m_object != nullptr); - - // make sure iterator fits the current value - if (JSON_HEDLEY_UNLIKELY(first.m_object != last.m_object)) - { - JSON_THROW(invalid_iterator::create(201, "iterators are not compatible")); - } - - // copy type from first iterator - m_type = first.m_object->m_type; - - // check if iterator range is complete for primitive values - switch (m_type) - { - case value_t::boolean: - case value_t::number_float: - case value_t::number_integer: - case value_t::number_unsigned: - case value_t::string: - { - if (JSON_HEDLEY_UNLIKELY(!first.m_it.primitive_iterator.is_begin() - || !last.m_it.primitive_iterator.is_end())) - { - JSON_THROW(invalid_iterator::create(204, "iterators out of range")); - } - break; - } - - default: - break; - } - - switch (m_type) - { - case value_t::number_integer: - { - m_value.number_integer = first.m_object->m_value.number_integer; - break; - } - - case value_t::number_unsigned: - { - m_value.number_unsigned = first.m_object->m_value.number_unsigned; - break; - } - - case value_t::number_float: - { - m_value.number_float = first.m_object->m_value.number_float; - break; - } - - case value_t::boolean: - { - m_value.boolean = first.m_object->m_value.boolean; - break; - } - - case value_t::string: - { - m_value = *first.m_object->m_value.string; - break; - } - - case value_t::object: - { - m_value.object = create(first.m_it.object_iterator, - last.m_it.object_iterator); - break; - } - - case value_t::array: - { - m_value.array = create(first.m_it.array_iterator, - last.m_it.array_iterator); - break; - } - - case value_t::binary: - { - m_value = *first.m_object->m_value.binary; - break; - } - - default: - JSON_THROW(invalid_iterator::create(206, "cannot construct with iterators from " + - std::string(first.m_object->type_name()))); - } - - assert_invariant(); - } - - - /////////////////////////////////////// - // other constructors and destructor // - /////////////////////////////////////// - - template, - std::is_same>::value, int> = 0 > - basic_json(const JsonRef& ref) : basic_json(ref.moved_or_copied()) {} - - /*! - @brief copy constructor - - Creates a copy of a given JSON value. - - @param[in] other the JSON value to copy - - @post `*this == other` - - @complexity Linear in the size of @a other. - - @exceptionsafety Strong guarantee: if an exception is thrown, there are no - changes to any JSON value. - - @requirement This function helps `basic_json` satisfying the - [Container](https://en.cppreference.com/w/cpp/named_req/Container) - requirements: - - The complexity is linear. - - As postcondition, it holds: `other == basic_json(other)`. - - @liveexample{The following code shows an example for the copy - constructor.,basic_json__basic_json} - - @since version 1.0.0 - */ - basic_json(const basic_json& other) - : m_type(other.m_type) - { - // check of passed value is valid - other.assert_invariant(); - - switch (m_type) - { - case value_t::object: - { - m_value = *other.m_value.object; - break; - } - - case value_t::array: - { - m_value = *other.m_value.array; - break; - } - - case value_t::string: - { - m_value = *other.m_value.string; - break; - } - - case value_t::boolean: - { - m_value = other.m_value.boolean; - break; - } - - case value_t::number_integer: - { - m_value = other.m_value.number_integer; - break; - } - - case value_t::number_unsigned: - { - m_value = other.m_value.number_unsigned; - break; - } - - case value_t::number_float: - { - m_value = other.m_value.number_float; - break; - } - - case value_t::binary: - { - m_value = *other.m_value.binary; - break; - } - - default: - break; - } - - assert_invariant(); - } - - /*! - @brief move constructor - - Move constructor. Constructs a JSON value with the contents of the given - value @a other using move semantics. It "steals" the resources from @a - other and leaves it as JSON null value. - - @param[in,out] other value to move to this object - - @post `*this` has the same value as @a other before the call. - @post @a other is a JSON null value. - - @complexity Constant. - - @exceptionsafety No-throw guarantee: this constructor never throws - exceptions. - - @requirement This function helps `basic_json` satisfying the - [MoveConstructible](https://en.cppreference.com/w/cpp/named_req/MoveConstructible) - requirements. - - @liveexample{The code below shows the move constructor explicitly called - via std::move.,basic_json__moveconstructor} - - @since version 1.0.0 - */ - basic_json(basic_json&& other) noexcept - : m_type(std::move(other.m_type)), - m_value(std::move(other.m_value)) - { - // check that passed value is valid - other.assert_invariant(); - - // invalidate payload - other.m_type = value_t::null; - other.m_value = {}; - - assert_invariant(); - } - - /*! - @brief copy assignment - - Copy assignment operator. Copies a JSON value via the "copy and swap" - strategy: It is expressed in terms of the copy constructor, destructor, - and the `swap()` member function. - - @param[in] other value to copy from - - @complexity Linear. - - @requirement This function helps `basic_json` satisfying the - [Container](https://en.cppreference.com/w/cpp/named_req/Container) - requirements: - - The complexity is linear. - - @liveexample{The code below shows and example for the copy assignment. It - creates a copy of value `a` which is then swapped with `b`. Finally\, the - copy of `a` (which is the null value after the swap) is - destroyed.,basic_json__copyassignment} - - @since version 1.0.0 - */ - basic_json& operator=(basic_json other) noexcept ( - std::is_nothrow_move_constructible::value&& - std::is_nothrow_move_assignable::value&& - std::is_nothrow_move_constructible::value&& - std::is_nothrow_move_assignable::value - ) - { - // check that passed value is valid - other.assert_invariant(); - - using std::swap; - swap(m_type, other.m_type); - swap(m_value, other.m_value); - - assert_invariant(); - return *this; - } - - /*! - @brief destructor - - Destroys the JSON value and frees all allocated memory. - - @complexity Linear. - - @requirement This function helps `basic_json` satisfying the - [Container](https://en.cppreference.com/w/cpp/named_req/Container) - requirements: - - The complexity is linear. - - All stored elements are destroyed and all memory is freed. - - @since version 1.0.0 - */ - ~basic_json() noexcept - { - assert_invariant(); - m_value.destroy(m_type); - } - - /// @} - - public: - /////////////////////// - // object inspection // - /////////////////////// - - /// @name object inspection - /// Functions to inspect the type of a JSON value. - /// @{ - - /*! - @brief serialization - - Serialization function for JSON values. The function tries to mimic - Python's `json.dumps()` function, and currently supports its @a indent - and @a ensure_ascii parameters. - - @param[in] indent If indent is nonnegative, then array elements and object - members will be pretty-printed with that indent level. An indent level of - `0` will only insert newlines. `-1` (the default) selects the most compact - representation. - @param[in] indent_char The character to use for indentation if @a indent is - greater than `0`. The default is ` ` (space). - @param[in] ensure_ascii If @a ensure_ascii is true, all non-ASCII characters - in the output are escaped with `\uXXXX` sequences, and the result consists - of ASCII characters only. - @param[in] error_handler how to react on decoding errors; there are three - possible values: `strict` (throws and exception in case a decoding error - occurs; default), `replace` (replace invalid UTF-8 sequences with U+FFFD), - and `ignore` (ignore invalid UTF-8 sequences during serialization; all - bytes are copied to the output unchanged). - - @return string containing the serialization of the JSON value - - @throw type_error.316 if a string stored inside the JSON value is not - UTF-8 encoded and @a error_handler is set to strict - - @note Binary values are serialized as object containing two keys: - - "bytes": an array of bytes as integers - - "subtype": the subtype as integer or "null" if the binary has no subtype - - @complexity Linear. - - @exceptionsafety Strong guarantee: if an exception is thrown, there are no - changes in the JSON value. - - @liveexample{The following example shows the effect of different @a indent\, - @a indent_char\, and @a ensure_ascii parameters to the result of the - serialization.,dump} - - @see https://docs.python.org/2/library/json.html#json.dump - - @since version 1.0.0; indentation character @a indent_char, option - @a ensure_ascii and exceptions added in version 3.0.0; error - handlers added in version 3.4.0; serialization of binary values added - in version 3.8.0. - */ - string_t dump(const int indent = -1, - const char indent_char = ' ', - const bool ensure_ascii = false, - const error_handler_t error_handler = error_handler_t::strict) const - { - string_t result; - serializer s(detail::output_adapter(result), indent_char, error_handler); - - if (indent >= 0) - { - s.dump(*this, true, ensure_ascii, static_cast(indent)); - } - else - { - s.dump(*this, false, ensure_ascii, 0); - } - - return result; - } - - /*! - @brief return the type of the JSON value (explicit) - - Return the type of the JSON value as a value from the @ref value_t - enumeration. - - @return the type of the JSON value - Value type | return value - ------------------------- | ------------------------- - null | value_t::null - boolean | value_t::boolean - string | value_t::string - number (integer) | value_t::number_integer - number (unsigned integer) | value_t::number_unsigned - number (floating-point) | value_t::number_float - object | value_t::object - array | value_t::array - binary | value_t::binary - discarded | value_t::discarded - - @complexity Constant. - - @exceptionsafety No-throw guarantee: this member function never throws - exceptions. - - @liveexample{The following code exemplifies `type()` for all JSON - types.,type} - - @sa @ref operator value_t() -- return the type of the JSON value (implicit) - @sa @ref type_name() -- return the type as string - - @since version 1.0.0 - */ - constexpr value_t type() const noexcept - { - return m_type; - } - - /*! - @brief return whether type is primitive - - This function returns true if and only if the JSON type is primitive - (string, number, boolean, or null). - - @return `true` if type is primitive (string, number, boolean, or null), - `false` otherwise. - - @complexity Constant. - - @exceptionsafety No-throw guarantee: this member function never throws - exceptions. - - @liveexample{The following code exemplifies `is_primitive()` for all JSON - types.,is_primitive} - - @sa @ref is_structured() -- returns whether JSON value is structured - @sa @ref is_null() -- returns whether JSON value is `null` - @sa @ref is_string() -- returns whether JSON value is a string - @sa @ref is_boolean() -- returns whether JSON value is a boolean - @sa @ref is_number() -- returns whether JSON value is a number - @sa @ref is_binary() -- returns whether JSON value is a binary array - - @since version 1.0.0 - */ - constexpr bool is_primitive() const noexcept - { - return is_null() || is_string() || is_boolean() || is_number() || is_binary(); - } - - /*! - @brief return whether type is structured - - This function returns true if and only if the JSON type is structured - (array or object). - - @return `true` if type is structured (array or object), `false` otherwise. - - @complexity Constant. - - @exceptionsafety No-throw guarantee: this member function never throws - exceptions. - - @liveexample{The following code exemplifies `is_structured()` for all JSON - types.,is_structured} - - @sa @ref is_primitive() -- returns whether value is primitive - @sa @ref is_array() -- returns whether value is an array - @sa @ref is_object() -- returns whether value is an object - - @since version 1.0.0 - */ - constexpr bool is_structured() const noexcept - { - return is_array() || is_object(); - } - - /*! - @brief return whether value is null - - This function returns true if and only if the JSON value is null. - - @return `true` if type is null, `false` otherwise. - - @complexity Constant. - - @exceptionsafety No-throw guarantee: this member function never throws - exceptions. - - @liveexample{The following code exemplifies `is_null()` for all JSON - types.,is_null} - - @since version 1.0.0 - */ - constexpr bool is_null() const noexcept - { - return m_type == value_t::null; - } - - /*! - @brief return whether value is a boolean - - This function returns true if and only if the JSON value is a boolean. - - @return `true` if type is boolean, `false` otherwise. - - @complexity Constant. - - @exceptionsafety No-throw guarantee: this member function never throws - exceptions. - - @liveexample{The following code exemplifies `is_boolean()` for all JSON - types.,is_boolean} - - @since version 1.0.0 - */ - constexpr bool is_boolean() const noexcept - { - return m_type == value_t::boolean; - } - - /*! - @brief return whether value is a number - - This function returns true if and only if the JSON value is a number. This - includes both integer (signed and unsigned) and floating-point values. - - @return `true` if type is number (regardless whether integer, unsigned - integer or floating-type), `false` otherwise. - - @complexity Constant. - - @exceptionsafety No-throw guarantee: this member function never throws - exceptions. - - @liveexample{The following code exemplifies `is_number()` for all JSON - types.,is_number} - - @sa @ref is_number_integer() -- check if value is an integer or unsigned - integer number - @sa @ref is_number_unsigned() -- check if value is an unsigned integer - number - @sa @ref is_number_float() -- check if value is a floating-point number - - @since version 1.0.0 - */ - constexpr bool is_number() const noexcept - { - return is_number_integer() || is_number_float(); - } - - /*! - @brief return whether value is an integer number - - This function returns true if and only if the JSON value is a signed or - unsigned integer number. This excludes floating-point values. - - @return `true` if type is an integer or unsigned integer number, `false` - otherwise. - - @complexity Constant. - - @exceptionsafety No-throw guarantee: this member function never throws - exceptions. - - @liveexample{The following code exemplifies `is_number_integer()` for all - JSON types.,is_number_integer} - - @sa @ref is_number() -- check if value is a number - @sa @ref is_number_unsigned() -- check if value is an unsigned integer - number - @sa @ref is_number_float() -- check if value is a floating-point number - - @since version 1.0.0 - */ - constexpr bool is_number_integer() const noexcept - { - return m_type == value_t::number_integer || m_type == value_t::number_unsigned; - } - - /*! - @brief return whether value is an unsigned integer number - - This function returns true if and only if the JSON value is an unsigned - integer number. This excludes floating-point and signed integer values. - - @return `true` if type is an unsigned integer number, `false` otherwise. - - @complexity Constant. - - @exceptionsafety No-throw guarantee: this member function never throws - exceptions. - - @liveexample{The following code exemplifies `is_number_unsigned()` for all - JSON types.,is_number_unsigned} - - @sa @ref is_number() -- check if value is a number - @sa @ref is_number_integer() -- check if value is an integer or unsigned - integer number - @sa @ref is_number_float() -- check if value is a floating-point number - - @since version 2.0.0 - */ - constexpr bool is_number_unsigned() const noexcept - { - return m_type == value_t::number_unsigned; - } - - /*! - @brief return whether value is a floating-point number - - This function returns true if and only if the JSON value is a - floating-point number. This excludes signed and unsigned integer values. - - @return `true` if type is a floating-point number, `false` otherwise. - - @complexity Constant. - - @exceptionsafety No-throw guarantee: this member function never throws - exceptions. - - @liveexample{The following code exemplifies `is_number_float()` for all - JSON types.,is_number_float} - - @sa @ref is_number() -- check if value is number - @sa @ref is_number_integer() -- check if value is an integer number - @sa @ref is_number_unsigned() -- check if value is an unsigned integer - number - - @since version 1.0.0 - */ - constexpr bool is_number_float() const noexcept - { - return m_type == value_t::number_float; - } - - /*! - @brief return whether value is an object - - This function returns true if and only if the JSON value is an object. - - @return `true` if type is object, `false` otherwise. - - @complexity Constant. - - @exceptionsafety No-throw guarantee: this member function never throws - exceptions. - - @liveexample{The following code exemplifies `is_object()` for all JSON - types.,is_object} - - @since version 1.0.0 - */ - constexpr bool is_object() const noexcept - { - return m_type == value_t::object; - } - - /*! - @brief return whether value is an array - - This function returns true if and only if the JSON value is an array. - - @return `true` if type is array, `false` otherwise. - - @complexity Constant. - - @exceptionsafety No-throw guarantee: this member function never throws - exceptions. - - @liveexample{The following code exemplifies `is_array()` for all JSON - types.,is_array} - - @since version 1.0.0 - */ - constexpr bool is_array() const noexcept - { - return m_type == value_t::array; - } - - /*! - @brief return whether value is a string - - This function returns true if and only if the JSON value is a string. - - @return `true` if type is string, `false` otherwise. - - @complexity Constant. - - @exceptionsafety No-throw guarantee: this member function never throws - exceptions. - - @liveexample{The following code exemplifies `is_string()` for all JSON - types.,is_string} - - @since version 1.0.0 - */ - constexpr bool is_string() const noexcept - { - return m_type == value_t::string; - } - - /*! - @brief return whether value is a binary array - - This function returns true if and only if the JSON value is a binary array. - - @return `true` if type is binary array, `false` otherwise. - - @complexity Constant. - - @exceptionsafety No-throw guarantee: this member function never throws - exceptions. - - @liveexample{The following code exemplifies `is_binary()` for all JSON - types.,is_binary} - - @since version 3.8.0 - */ - constexpr bool is_binary() const noexcept - { - return m_type == value_t::binary; - } - - /*! - @brief return whether value is discarded - - This function returns true if and only if the JSON value was discarded - during parsing with a callback function (see @ref parser_callback_t). - - @note This function will always be `false` for JSON values after parsing. - That is, discarded values can only occur during parsing, but will be - removed when inside a structured value or replaced by null in other cases. - - @return `true` if type is discarded, `false` otherwise. - - @complexity Constant. - - @exceptionsafety No-throw guarantee: this member function never throws - exceptions. - - @liveexample{The following code exemplifies `is_discarded()` for all JSON - types.,is_discarded} - - @since version 1.0.0 - */ - constexpr bool is_discarded() const noexcept - { - return m_type == value_t::discarded; - } - - /*! - @brief return the type of the JSON value (implicit) - - Implicitly return the type of the JSON value as a value from the @ref - value_t enumeration. - - @return the type of the JSON value - - @complexity Constant. - - @exceptionsafety No-throw guarantee: this member function never throws - exceptions. - - @liveexample{The following code exemplifies the @ref value_t operator for - all JSON types.,operator__value_t} - - @sa @ref type() -- return the type of the JSON value (explicit) - @sa @ref type_name() -- return the type as string - - @since version 1.0.0 - */ - constexpr operator value_t() const noexcept - { - return m_type; - } - - /// @} - - private: - ////////////////// - // value access // - ////////////////// - - /// get a boolean (explicit) - boolean_t get_impl(boolean_t* /*unused*/) const - { - if (JSON_HEDLEY_LIKELY(is_boolean())) - { - return m_value.boolean; - } - - JSON_THROW(type_error::create(302, "type must be boolean, but is " + std::string(type_name()))); - } - - /// get a pointer to the value (object) - object_t* get_impl_ptr(object_t* /*unused*/) noexcept - { - return is_object() ? m_value.object : nullptr; - } - - /// get a pointer to the value (object) - constexpr const object_t* get_impl_ptr(const object_t* /*unused*/) const noexcept - { - return is_object() ? m_value.object : nullptr; - } - - /// get a pointer to the value (array) - array_t* get_impl_ptr(array_t* /*unused*/) noexcept - { - return is_array() ? m_value.array : nullptr; - } - - /// get a pointer to the value (array) - constexpr const array_t* get_impl_ptr(const array_t* /*unused*/) const noexcept - { - return is_array() ? m_value.array : nullptr; - } - - /// get a pointer to the value (string) - string_t* get_impl_ptr(string_t* /*unused*/) noexcept - { - return is_string() ? m_value.string : nullptr; - } - - /// get a pointer to the value (string) - constexpr const string_t* get_impl_ptr(const string_t* /*unused*/) const noexcept - { - return is_string() ? m_value.string : nullptr; - } - - /// get a pointer to the value (boolean) - boolean_t* get_impl_ptr(boolean_t* /*unused*/) noexcept - { - return is_boolean() ? &m_value.boolean : nullptr; - } - - /// get a pointer to the value (boolean) - constexpr const boolean_t* get_impl_ptr(const boolean_t* /*unused*/) const noexcept - { - return is_boolean() ? &m_value.boolean : nullptr; - } - - /// get a pointer to the value (integer number) - number_integer_t* get_impl_ptr(number_integer_t* /*unused*/) noexcept - { - return is_number_integer() ? &m_value.number_integer : nullptr; - } - - /// get a pointer to the value (integer number) - constexpr const number_integer_t* get_impl_ptr(const number_integer_t* /*unused*/) const noexcept - { - return is_number_integer() ? &m_value.number_integer : nullptr; - } - - /// get a pointer to the value (unsigned number) - number_unsigned_t* get_impl_ptr(number_unsigned_t* /*unused*/) noexcept - { - return is_number_unsigned() ? &m_value.number_unsigned : nullptr; - } - - /// get a pointer to the value (unsigned number) - constexpr const number_unsigned_t* get_impl_ptr(const number_unsigned_t* /*unused*/) const noexcept - { - return is_number_unsigned() ? &m_value.number_unsigned : nullptr; - } - - /// get a pointer to the value (floating-point number) - number_float_t* get_impl_ptr(number_float_t* /*unused*/) noexcept - { - return is_number_float() ? &m_value.number_float : nullptr; - } - - /// get a pointer to the value (floating-point number) - constexpr const number_float_t* get_impl_ptr(const number_float_t* /*unused*/) const noexcept - { - return is_number_float() ? &m_value.number_float : nullptr; - } - - /// get a pointer to the value (binary) - binary_t* get_impl_ptr(binary_t* /*unused*/) noexcept - { - return is_binary() ? m_value.binary : nullptr; - } - - /// get a pointer to the value (binary) - constexpr const binary_t* get_impl_ptr(const binary_t* /*unused*/) const noexcept - { - return is_binary() ? m_value.binary : nullptr; - } - - /*! - @brief helper function to implement get_ref() - - This function helps to implement get_ref() without code duplication for - const and non-const overloads - - @tparam ThisType will be deduced as `basic_json` or `const basic_json` - - @throw type_error.303 if ReferenceType does not match underlying value - type of the current JSON - */ - template - static ReferenceType get_ref_impl(ThisType& obj) - { - // delegate the call to get_ptr<>() - auto ptr = obj.template get_ptr::type>(); - - if (JSON_HEDLEY_LIKELY(ptr != nullptr)) - { - return *ptr; - } - - JSON_THROW(type_error::create(303, "incompatible ReferenceType for get_ref, actual type is " + std::string(obj.type_name()))); - } - - public: - /// @name value access - /// Direct access to the stored value of a JSON value. - /// @{ - - /*! - @brief get special-case overload - - This overloads avoids a lot of template boilerplate, it can be seen as the - identity method - - @tparam BasicJsonType == @ref basic_json - - @return a copy of *this - - @complexity Constant. - - @since version 2.1.0 - */ - template::type, basic_json_t>::value, - int> = 0> - basic_json get() const - { - return *this; - } - - /*! - @brief get special-case overload - - This overloads converts the current @ref basic_json in a different - @ref basic_json type - - @tparam BasicJsonType == @ref basic_json - - @return a copy of *this, converted into @tparam BasicJsonType - - @complexity Depending on the implementation of the called `from_json()` - method. - - @since version 3.2.0 - */ - template < typename BasicJsonType, detail::enable_if_t < - !std::is_same::value&& - detail::is_basic_json::value, int > = 0 > - BasicJsonType get() const - { - return *this; - } - - /*! - @brief get a value (explicit) - - Explicit type conversion between the JSON value and a compatible value - which is [CopyConstructible](https://en.cppreference.com/w/cpp/named_req/CopyConstructible) - and [DefaultConstructible](https://en.cppreference.com/w/cpp/named_req/DefaultConstructible). - The value is converted by calling the @ref json_serializer - `from_json()` method. - - The function is equivalent to executing - @code {.cpp} - ValueType ret; - JSONSerializer::from_json(*this, ret); - return ret; - @endcode - - This overloads is chosen if: - - @a ValueType is not @ref basic_json, - - @ref json_serializer has a `from_json()` method of the form - `void from_json(const basic_json&, ValueType&)`, and - - @ref json_serializer does not have a `from_json()` method of - the form `ValueType from_json(const basic_json&)` - - @tparam ValueTypeCV the provided value type - @tparam ValueType the returned value type - - @return copy of the JSON value, converted to @a ValueType - - @throw what @ref json_serializer `from_json()` method throws - - @liveexample{The example below shows several conversions from JSON values - to other types. There a few things to note: (1) Floating-point numbers can - be converted to integers\, (2) A JSON array can be converted to a standard - `std::vector`\, (3) A JSON object can be converted to C++ - associative containers such as `std::unordered_map`.,get__ValueType_const} - - @since version 2.1.0 - */ - template < typename ValueTypeCV, typename ValueType = detail::uncvref_t, - detail::enable_if_t < - !detail::is_basic_json::value && - detail::has_from_json::value && - !detail::has_non_default_from_json::value, - int > = 0 > - ValueType get() const noexcept(noexcept( - JSONSerializer::from_json(std::declval(), std::declval()))) - { - // we cannot static_assert on ValueTypeCV being non-const, because - // there is support for get(), which is why we - // still need the uncvref - static_assert(!std::is_reference::value, - "get() cannot be used with reference types, you might want to use get_ref()"); - static_assert(std::is_default_constructible::value, - "types must be DefaultConstructible when used with get()"); - - ValueType ret; - JSONSerializer::from_json(*this, ret); - return ret; - } - - /*! - @brief get a value (explicit); special case - - Explicit type conversion between the JSON value and a compatible value - which is **not** [CopyConstructible](https://en.cppreference.com/w/cpp/named_req/CopyConstructible) - and **not** [DefaultConstructible](https://en.cppreference.com/w/cpp/named_req/DefaultConstructible). - The value is converted by calling the @ref json_serializer - `from_json()` method. - - The function is equivalent to executing - @code {.cpp} - return JSONSerializer::from_json(*this); - @endcode - - This overloads is chosen if: - - @a ValueType is not @ref basic_json and - - @ref json_serializer has a `from_json()` method of the form - `ValueType from_json(const basic_json&)` - - @note If @ref json_serializer has both overloads of - `from_json()`, this one is chosen. - - @tparam ValueTypeCV the provided value type - @tparam ValueType the returned value type - - @return copy of the JSON value, converted to @a ValueType - - @throw what @ref json_serializer `from_json()` method throws - - @since version 2.1.0 - */ - template < typename ValueTypeCV, typename ValueType = detail::uncvref_t, - detail::enable_if_t < !std::is_same::value && - detail::has_non_default_from_json::value, - int > = 0 > - ValueType get() const noexcept(noexcept( - JSONSerializer::from_json(std::declval()))) - { - static_assert(!std::is_reference::value, - "get() cannot be used with reference types, you might want to use get_ref()"); - return JSONSerializer::from_json(*this); - } - - /*! - @brief get a value (explicit) - - Explicit type conversion between the JSON value and a compatible value. - The value is filled into the input parameter by calling the @ref json_serializer - `from_json()` method. - - The function is equivalent to executing - @code {.cpp} - ValueType v; - JSONSerializer::from_json(*this, v); - @endcode - - This overloads is chosen if: - - @a ValueType is not @ref basic_json, - - @ref json_serializer has a `from_json()` method of the form - `void from_json(const basic_json&, ValueType&)`, and - - @tparam ValueType the input parameter type. - - @return the input parameter, allowing chaining calls. - - @throw what @ref json_serializer `from_json()` method throws - - @liveexample{The example below shows several conversions from JSON values - to other types. There a few things to note: (1) Floating-point numbers can - be converted to integers\, (2) A JSON array can be converted to a standard - `std::vector`\, (3) A JSON object can be converted to C++ - associative containers such as `std::unordered_map`.,get_to} - - @since version 3.3.0 - */ - template < typename ValueType, - detail::enable_if_t < - !detail::is_basic_json::value&& - detail::has_from_json::value, - int > = 0 > - ValueType & get_to(ValueType& v) const noexcept(noexcept( - JSONSerializer::from_json(std::declval(), v))) - { - JSONSerializer::from_json(*this, v); - return v; - } - - // specialization to allow to call get_to with a basic_json value - // see https://github.com/nlohmann/json/issues/2175 - template::value, - int> = 0> - ValueType & get_to(ValueType& v) const - { - v = *this; - return v; - } - - template < - typename T, std::size_t N, - typename Array = T (&)[N], - detail::enable_if_t < - detail::has_from_json::value, int > = 0 > - Array get_to(T (&v)[N]) const - noexcept(noexcept(JSONSerializer::from_json( - std::declval(), v))) - { - JSONSerializer::from_json(*this, v); - return v; - } - - - /*! - @brief get a pointer value (implicit) - - Implicit pointer access to the internally stored JSON value. No copies are - made. - - @warning Writing data to the pointee of the result yields an undefined - state. - - @tparam PointerType pointer type; must be a pointer to @ref array_t, @ref - object_t, @ref string_t, @ref boolean_t, @ref number_integer_t, - @ref number_unsigned_t, or @ref number_float_t. Enforced by a static - assertion. - - @return pointer to the internally stored JSON value if the requested - pointer type @a PointerType fits to the JSON value; `nullptr` otherwise - - @complexity Constant. - - @liveexample{The example below shows how pointers to internal values of a - JSON value can be requested. Note that no type conversions are made and a - `nullptr` is returned if the value and the requested pointer type does not - match.,get_ptr} - - @since version 1.0.0 - */ - template::value, int>::type = 0> - auto get_ptr() noexcept -> decltype(std::declval().get_impl_ptr(std::declval())) - { - // delegate the call to get_impl_ptr<>() - return get_impl_ptr(static_cast(nullptr)); - } - - /*! - @brief get a pointer value (implicit) - @copydoc get_ptr() - */ - template < typename PointerType, typename std::enable_if < - std::is_pointer::value&& - std::is_const::type>::value, int >::type = 0 > - constexpr auto get_ptr() const noexcept -> decltype(std::declval().get_impl_ptr(std::declval())) - { - // delegate the call to get_impl_ptr<>() const - return get_impl_ptr(static_cast(nullptr)); - } - - /*! - @brief get a pointer value (explicit) - - Explicit pointer access to the internally stored JSON value. No copies are - made. - - @warning The pointer becomes invalid if the underlying JSON object - changes. - - @tparam PointerType pointer type; must be a pointer to @ref array_t, @ref - object_t, @ref string_t, @ref boolean_t, @ref number_integer_t, - @ref number_unsigned_t, or @ref number_float_t. - - @return pointer to the internally stored JSON value if the requested - pointer type @a PointerType fits to the JSON value; `nullptr` otherwise - - @complexity Constant. - - @liveexample{The example below shows how pointers to internal values of a - JSON value can be requested. Note that no type conversions are made and a - `nullptr` is returned if the value and the requested pointer type does not - match.,get__PointerType} - - @sa @ref get_ptr() for explicit pointer-member access - - @since version 1.0.0 - */ - template::value, int>::type = 0> - auto get() noexcept -> decltype(std::declval().template get_ptr()) - { - // delegate the call to get_ptr - return get_ptr(); - } - - /*! - @brief get a pointer value (explicit) - @copydoc get() - */ - template::value, int>::type = 0> - constexpr auto get() const noexcept -> decltype(std::declval().template get_ptr()) - { - // delegate the call to get_ptr - return get_ptr(); - } - - /*! - @brief get a reference value (implicit) - - Implicit reference access to the internally stored JSON value. No copies - are made. - - @warning Writing data to the referee of the result yields an undefined - state. - - @tparam ReferenceType reference type; must be a reference to @ref array_t, - @ref object_t, @ref string_t, @ref boolean_t, @ref number_integer_t, or - @ref number_float_t. Enforced by static assertion. - - @return reference to the internally stored JSON value if the requested - reference type @a ReferenceType fits to the JSON value; throws - type_error.303 otherwise - - @throw type_error.303 in case passed type @a ReferenceType is incompatible - with the stored JSON value; see example below - - @complexity Constant. - - @liveexample{The example shows several calls to `get_ref()`.,get_ref} - - @since version 1.1.0 - */ - template::value, int>::type = 0> - ReferenceType get_ref() - { - // delegate call to get_ref_impl - return get_ref_impl(*this); - } - - /*! - @brief get a reference value (implicit) - @copydoc get_ref() - */ - template < typename ReferenceType, typename std::enable_if < - std::is_reference::value&& - std::is_const::type>::value, int >::type = 0 > - ReferenceType get_ref() const - { - // delegate call to get_ref_impl - return get_ref_impl(*this); - } - - /*! - @brief get a value (implicit) - - Implicit type conversion between the JSON value and a compatible value. - The call is realized by calling @ref get() const. - - @tparam ValueType non-pointer type compatible to the JSON value, for - instance `int` for JSON integer numbers, `bool` for JSON booleans, or - `std::vector` types for JSON arrays. The character type of @ref string_t - as well as an initializer list of this type is excluded to avoid - ambiguities as these types implicitly convert to `std::string`. - - @return copy of the JSON value, converted to type @a ValueType - - @throw type_error.302 in case passed type @a ValueType is incompatible - to the JSON value type (e.g., the JSON value is of type boolean, but a - string is requested); see example below - - @complexity Linear in the size of the JSON value. - - @liveexample{The example below shows several conversions from JSON values - to other types. There a few things to note: (1) Floating-point numbers can - be converted to integers\, (2) A JSON array can be converted to a standard - `std::vector`\, (3) A JSON object can be converted to C++ - associative containers such as `std::unordered_map`.,operator__ValueType} - - @since version 1.0.0 - */ - template < typename ValueType, typename std::enable_if < - !std::is_pointer::value&& - !std::is_same>::value&& - !std::is_same::value&& - !detail::is_basic_json::value - && !std::is_same>::value -#if defined(JSON_HAS_CPP_17) && (defined(__GNUC__) || (defined(_MSC_VER) && _MSC_VER >= 1910 && _MSC_VER <= 1914)) - && !std::is_same::value -#endif - && detail::is_detected::value - , int >::type = 0 > - JSON_EXPLICIT operator ValueType() const - { - // delegate the call to get<>() const - return get(); - } - - /*! - @return reference to the binary value - - @throw type_error.302 if the value is not binary - - @sa @ref is_binary() to check if the value is binary - - @since version 3.8.0 - */ - binary_t& get_binary() - { - if (!is_binary()) - { - JSON_THROW(type_error::create(302, "type must be binary, but is " + std::string(type_name()))); - } - - return *get_ptr(); - } - - /// @copydoc get_binary() - const binary_t& get_binary() const - { - if (!is_binary()) - { - JSON_THROW(type_error::create(302, "type must be binary, but is " + std::string(type_name()))); - } - - return *get_ptr(); - } - - /// @} - - - //////////////////// - // element access // - //////////////////// - - /// @name element access - /// Access to the JSON value. - /// @{ - - /*! - @brief access specified array element with bounds checking - - Returns a reference to the element at specified location @a idx, with - bounds checking. - - @param[in] idx index of the element to access - - @return reference to the element at index @a idx - - @throw type_error.304 if the JSON value is not an array; in this case, - calling `at` with an index makes no sense. See example below. - @throw out_of_range.401 if the index @a idx is out of range of the array; - that is, `idx >= size()`. See example below. - - @exceptionsafety Strong guarantee: if an exception is thrown, there are no - changes in the JSON value. - - @complexity Constant. - - @since version 1.0.0 - - @liveexample{The example below shows how array elements can be read and - written using `at()`. It also demonstrates the different exceptions that - can be thrown.,at__size_type} - */ - reference at(size_type idx) - { - // at only works for arrays - if (JSON_HEDLEY_LIKELY(is_array())) - { - JSON_TRY - { - return m_value.array->at(idx); - } - JSON_CATCH (std::out_of_range&) - { - // create better exception explanation - JSON_THROW(out_of_range::create(401, "array index " + std::to_string(idx) + " is out of range")); - } - } - else - { - JSON_THROW(type_error::create(304, "cannot use at() with " + std::string(type_name()))); - } - } - - /*! - @brief access specified array element with bounds checking - - Returns a const reference to the element at specified location @a idx, - with bounds checking. - - @param[in] idx index of the element to access - - @return const reference to the element at index @a idx - - @throw type_error.304 if the JSON value is not an array; in this case, - calling `at` with an index makes no sense. See example below. - @throw out_of_range.401 if the index @a idx is out of range of the array; - that is, `idx >= size()`. See example below. - - @exceptionsafety Strong guarantee: if an exception is thrown, there are no - changes in the JSON value. - - @complexity Constant. - - @since version 1.0.0 - - @liveexample{The example below shows how array elements can be read using - `at()`. It also demonstrates the different exceptions that can be thrown., - at__size_type_const} - */ - const_reference at(size_type idx) const - { - // at only works for arrays - if (JSON_HEDLEY_LIKELY(is_array())) - { - JSON_TRY - { - return m_value.array->at(idx); - } - JSON_CATCH (std::out_of_range&) - { - // create better exception explanation - JSON_THROW(out_of_range::create(401, "array index " + std::to_string(idx) + " is out of range")); - } - } - else - { - JSON_THROW(type_error::create(304, "cannot use at() with " + std::string(type_name()))); - } - } - - /*! - @brief access specified object element with bounds checking - - Returns a reference to the element at with specified key @a key, with - bounds checking. - - @param[in] key key of the element to access - - @return reference to the element at key @a key - - @throw type_error.304 if the JSON value is not an object; in this case, - calling `at` with a key makes no sense. See example below. - @throw out_of_range.403 if the key @a key is is not stored in the object; - that is, `find(key) == end()`. See example below. - - @exceptionsafety Strong guarantee: if an exception is thrown, there are no - changes in the JSON value. - - @complexity Logarithmic in the size of the container. - - @sa @ref operator[](const typename object_t::key_type&) for unchecked - access by reference - @sa @ref value() for access by value with a default value - - @since version 1.0.0 - - @liveexample{The example below shows how object elements can be read and - written using `at()`. It also demonstrates the different exceptions that - can be thrown.,at__object_t_key_type} - */ - reference at(const typename object_t::key_type& key) - { - // at only works for objects - if (JSON_HEDLEY_LIKELY(is_object())) - { - JSON_TRY - { - return m_value.object->at(key); - } - JSON_CATCH (std::out_of_range&) - { - // create better exception explanation - JSON_THROW(out_of_range::create(403, "key '" + key + "' not found")); - } - } - else - { - JSON_THROW(type_error::create(304, "cannot use at() with " + std::string(type_name()))); - } - } - - /*! - @brief access specified object element with bounds checking - - Returns a const reference to the element at with specified key @a key, - with bounds checking. - - @param[in] key key of the element to access - - @return const reference to the element at key @a key - - @throw type_error.304 if the JSON value is not an object; in this case, - calling `at` with a key makes no sense. See example below. - @throw out_of_range.403 if the key @a key is is not stored in the object; - that is, `find(key) == end()`. See example below. - - @exceptionsafety Strong guarantee: if an exception is thrown, there are no - changes in the JSON value. - - @complexity Logarithmic in the size of the container. - - @sa @ref operator[](const typename object_t::key_type&) for unchecked - access by reference - @sa @ref value() for access by value with a default value - - @since version 1.0.0 - - @liveexample{The example below shows how object elements can be read using - `at()`. It also demonstrates the different exceptions that can be thrown., - at__object_t_key_type_const} - */ - const_reference at(const typename object_t::key_type& key) const - { - // at only works for objects - if (JSON_HEDLEY_LIKELY(is_object())) - { - JSON_TRY - { - return m_value.object->at(key); - } - JSON_CATCH (std::out_of_range&) - { - // create better exception explanation - JSON_THROW(out_of_range::create(403, "key '" + key + "' not found")); - } - } - else - { - JSON_THROW(type_error::create(304, "cannot use at() with " + std::string(type_name()))); - } - } - - /*! - @brief access specified array element - - Returns a reference to the element at specified location @a idx. - - @note If @a idx is beyond the range of the array (i.e., `idx >= size()`), - then the array is silently filled up with `null` values to make `idx` a - valid reference to the last stored element. - - @param[in] idx index of the element to access - - @return reference to the element at index @a idx - - @throw type_error.305 if the JSON value is not an array or null; in that - cases, using the [] operator with an index makes no sense. - - @complexity Constant if @a idx is in the range of the array. Otherwise - linear in `idx - size()`. - - @liveexample{The example below shows how array elements can be read and - written using `[]` operator. Note the addition of `null` - values.,operatorarray__size_type} - - @since version 1.0.0 - */ - reference operator[](size_type idx) - { - // implicitly convert null value to an empty array - if (is_null()) - { - m_type = value_t::array; - m_value.array = create(); - assert_invariant(); - } - - // operator[] only works for arrays - if (JSON_HEDLEY_LIKELY(is_array())) - { - // fill up array with null values if given idx is outside range - if (idx >= m_value.array->size()) - { - m_value.array->insert(m_value.array->end(), - idx - m_value.array->size() + 1, - basic_json()); - } - - return m_value.array->operator[](idx); - } - - JSON_THROW(type_error::create(305, "cannot use operator[] with a numeric argument with " + std::string(type_name()))); - } - - /*! - @brief access specified array element - - Returns a const reference to the element at specified location @a idx. - - @param[in] idx index of the element to access - - @return const reference to the element at index @a idx - - @throw type_error.305 if the JSON value is not an array; in that case, - using the [] operator with an index makes no sense. - - @complexity Constant. - - @liveexample{The example below shows how array elements can be read using - the `[]` operator.,operatorarray__size_type_const} - - @since version 1.0.0 - */ - const_reference operator[](size_type idx) const - { - // const operator[] only works for arrays - if (JSON_HEDLEY_LIKELY(is_array())) - { - return m_value.array->operator[](idx); - } - - JSON_THROW(type_error::create(305, "cannot use operator[] with a numeric argument with " + std::string(type_name()))); - } - - /*! - @brief access specified object element - - Returns a reference to the element at with specified key @a key. - - @note If @a key is not found in the object, then it is silently added to - the object and filled with a `null` value to make `key` a valid reference. - In case the value was `null` before, it is converted to an object. - - @param[in] key key of the element to access - - @return reference to the element at key @a key - - @throw type_error.305 if the JSON value is not an object or null; in that - cases, using the [] operator with a key makes no sense. - - @complexity Logarithmic in the size of the container. - - @liveexample{The example below shows how object elements can be read and - written using the `[]` operator.,operatorarray__key_type} - - @sa @ref at(const typename object_t::key_type&) for access by reference - with range checking - @sa @ref value() for access by value with a default value - - @since version 1.0.0 - */ - reference operator[](const typename object_t::key_type& key) - { - // implicitly convert null value to an empty object - if (is_null()) - { - m_type = value_t::object; - m_value.object = create(); - assert_invariant(); - } - - // operator[] only works for objects - if (JSON_HEDLEY_LIKELY(is_object())) - { - return m_value.object->operator[](key); - } - - JSON_THROW(type_error::create(305, "cannot use operator[] with a string argument with " + std::string(type_name()))); - } - - /*! - @brief read-only access specified object element - - Returns a const reference to the element at with specified key @a key. No - bounds checking is performed. - - @warning If the element with key @a key does not exist, the behavior is - undefined. - - @param[in] key key of the element to access - - @return const reference to the element at key @a key - - @pre The element with key @a key must exist. **This precondition is - enforced with an assertion.** - - @throw type_error.305 if the JSON value is not an object; in that case, - using the [] operator with a key makes no sense. - - @complexity Logarithmic in the size of the container. - - @liveexample{The example below shows how object elements can be read using - the `[]` operator.,operatorarray__key_type_const} - - @sa @ref at(const typename object_t::key_type&) for access by reference - with range checking - @sa @ref value() for access by value with a default value - - @since version 1.0.0 - */ - const_reference operator[](const typename object_t::key_type& key) const - { - // const operator[] only works for objects - if (JSON_HEDLEY_LIKELY(is_object())) - { - JSON_ASSERT(m_value.object->find(key) != m_value.object->end()); - return m_value.object->find(key)->second; - } - - JSON_THROW(type_error::create(305, "cannot use operator[] with a string argument with " + std::string(type_name()))); - } - - /*! - @brief access specified object element - - Returns a reference to the element at with specified key @a key. - - @note If @a key is not found in the object, then it is silently added to - the object and filled with a `null` value to make `key` a valid reference. - In case the value was `null` before, it is converted to an object. - - @param[in] key key of the element to access - - @return reference to the element at key @a key - - @throw type_error.305 if the JSON value is not an object or null; in that - cases, using the [] operator with a key makes no sense. - - @complexity Logarithmic in the size of the container. - - @liveexample{The example below shows how object elements can be read and - written using the `[]` operator.,operatorarray__key_type} - - @sa @ref at(const typename object_t::key_type&) for access by reference - with range checking - @sa @ref value() for access by value with a default value - - @since version 1.1.0 - */ - template - JSON_HEDLEY_NON_NULL(2) - reference operator[](T* key) - { - // implicitly convert null to object - if (is_null()) - { - m_type = value_t::object; - m_value = value_t::object; - assert_invariant(); - } - - // at only works for objects - if (JSON_HEDLEY_LIKELY(is_object())) - { - return m_value.object->operator[](key); - } - - JSON_THROW(type_error::create(305, "cannot use operator[] with a string argument with " + std::string(type_name()))); - } - - /*! - @brief read-only access specified object element - - Returns a const reference to the element at with specified key @a key. No - bounds checking is performed. - - @warning If the element with key @a key does not exist, the behavior is - undefined. - - @param[in] key key of the element to access - - @return const reference to the element at key @a key - - @pre The element with key @a key must exist. **This precondition is - enforced with an assertion.** - - @throw type_error.305 if the JSON value is not an object; in that case, - using the [] operator with a key makes no sense. - - @complexity Logarithmic in the size of the container. - - @liveexample{The example below shows how object elements can be read using - the `[]` operator.,operatorarray__key_type_const} - - @sa @ref at(const typename object_t::key_type&) for access by reference - with range checking - @sa @ref value() for access by value with a default value - - @since version 1.1.0 - */ - template - JSON_HEDLEY_NON_NULL(2) - const_reference operator[](T* key) const - { - // at only works for objects - if (JSON_HEDLEY_LIKELY(is_object())) - { - JSON_ASSERT(m_value.object->find(key) != m_value.object->end()); - return m_value.object->find(key)->second; - } - - JSON_THROW(type_error::create(305, "cannot use operator[] with a string argument with " + std::string(type_name()))); - } - - /*! - @brief access specified object element with default value - - Returns either a copy of an object's element at the specified key @a key - or a given default value if no element with key @a key exists. - - The function is basically equivalent to executing - @code {.cpp} - try { - return at(key); - } catch(out_of_range) { - return default_value; - } - @endcode - - @note Unlike @ref at(const typename object_t::key_type&), this function - does not throw if the given key @a key was not found. - - @note Unlike @ref operator[](const typename object_t::key_type& key), this - function does not implicitly add an element to the position defined by @a - key. This function is furthermore also applicable to const objects. - - @param[in] key key of the element to access - @param[in] default_value the value to return if @a key is not found - - @tparam ValueType type compatible to JSON values, for instance `int` for - JSON integer numbers, `bool` for JSON booleans, or `std::vector` types for - JSON arrays. Note the type of the expected value at @a key and the default - value @a default_value must be compatible. - - @return copy of the element at key @a key or @a default_value if @a key - is not found - - @throw type_error.302 if @a default_value does not match the type of the - value at @a key - @throw type_error.306 if the JSON value is not an object; in that case, - using `value()` with a key makes no sense. - - @complexity Logarithmic in the size of the container. - - @liveexample{The example below shows how object elements can be queried - with a default value.,basic_json__value} - - @sa @ref at(const typename object_t::key_type&) for access by reference - with range checking - @sa @ref operator[](const typename object_t::key_type&) for unchecked - access by reference - - @since version 1.0.0 - */ - // using std::is_convertible in a std::enable_if will fail when using explicit conversions - template < class ValueType, typename std::enable_if < - detail::is_getable::value - && !std::is_same::value, int >::type = 0 > - ValueType value(const typename object_t::key_type& key, const ValueType& default_value) const - { - // at only works for objects - if (JSON_HEDLEY_LIKELY(is_object())) - { - // if key is found, return value and given default value otherwise - const auto it = find(key); - if (it != end()) - { - return it->template get(); - } - - return default_value; - } - - JSON_THROW(type_error::create(306, "cannot use value() with " + std::string(type_name()))); - } - - /*! - @brief overload for a default value of type const char* - @copydoc basic_json::value(const typename object_t::key_type&, const ValueType&) const - */ - string_t value(const typename object_t::key_type& key, const char* default_value) const - { - return value(key, string_t(default_value)); - } - - /*! - @brief access specified object element via JSON Pointer with default value - - Returns either a copy of an object's element at the specified key @a key - or a given default value if no element with key @a key exists. - - The function is basically equivalent to executing - @code {.cpp} - try { - return at(ptr); - } catch(out_of_range) { - return default_value; - } - @endcode - - @note Unlike @ref at(const json_pointer&), this function does not throw - if the given key @a key was not found. - - @param[in] ptr a JSON pointer to the element to access - @param[in] default_value the value to return if @a ptr found no value - - @tparam ValueType type compatible to JSON values, for instance `int` for - JSON integer numbers, `bool` for JSON booleans, or `std::vector` types for - JSON arrays. Note the type of the expected value at @a key and the default - value @a default_value must be compatible. - - @return copy of the element at key @a key or @a default_value if @a key - is not found - - @throw type_error.302 if @a default_value does not match the type of the - value at @a ptr - @throw type_error.306 if the JSON value is not an object; in that case, - using `value()` with a key makes no sense. - - @complexity Logarithmic in the size of the container. - - @liveexample{The example below shows how object elements can be queried - with a default value.,basic_json__value_ptr} - - @sa @ref operator[](const json_pointer&) for unchecked access by reference - - @since version 2.0.2 - */ - template::value, int>::type = 0> - ValueType value(const json_pointer& ptr, const ValueType& default_value) const - { - // at only works for objects - if (JSON_HEDLEY_LIKELY(is_object())) - { - // if pointer resolves a value, return it or use default value - JSON_TRY - { - return ptr.get_checked(this).template get(); - } - JSON_INTERNAL_CATCH (out_of_range&) - { - return default_value; - } - } - - JSON_THROW(type_error::create(306, "cannot use value() with " + std::string(type_name()))); - } - - /*! - @brief overload for a default value of type const char* - @copydoc basic_json::value(const json_pointer&, ValueType) const - */ - JSON_HEDLEY_NON_NULL(3) - string_t value(const json_pointer& ptr, const char* default_value) const - { - return value(ptr, string_t(default_value)); - } - - /*! - @brief access the first element - - Returns a reference to the first element in the container. For a JSON - container `c`, the expression `c.front()` is equivalent to `*c.begin()`. - - @return In case of a structured type (array or object), a reference to the - first element is returned. In case of number, string, boolean, or binary - values, a reference to the value is returned. - - @complexity Constant. - - @pre The JSON value must not be `null` (would throw `std::out_of_range`) - or an empty array or object (undefined behavior, **guarded by - assertions**). - @post The JSON value remains unchanged. - - @throw invalid_iterator.214 when called on `null` value - - @liveexample{The following code shows an example for `front()`.,front} - - @sa @ref back() -- access the last element - - @since version 1.0.0 - */ - reference front() - { - return *begin(); - } - - /*! - @copydoc basic_json::front() - */ - const_reference front() const - { - return *cbegin(); - } - - /*! - @brief access the last element - - Returns a reference to the last element in the container. For a JSON - container `c`, the expression `c.back()` is equivalent to - @code {.cpp} - auto tmp = c.end(); - --tmp; - return *tmp; - @endcode - - @return In case of a structured type (array or object), a reference to the - last element is returned. In case of number, string, boolean, or binary - values, a reference to the value is returned. - - @complexity Constant. - - @pre The JSON value must not be `null` (would throw `std::out_of_range`) - or an empty array or object (undefined behavior, **guarded by - assertions**). - @post The JSON value remains unchanged. - - @throw invalid_iterator.214 when called on a `null` value. See example - below. - - @liveexample{The following code shows an example for `back()`.,back} - - @sa @ref front() -- access the first element - - @since version 1.0.0 - */ - reference back() - { - auto tmp = end(); - --tmp; - return *tmp; - } - - /*! - @copydoc basic_json::back() - */ - const_reference back() const - { - auto tmp = cend(); - --tmp; - return *tmp; - } - - /*! - @brief remove element given an iterator - - Removes the element specified by iterator @a pos. The iterator @a pos must - be valid and dereferenceable. Thus the `end()` iterator (which is valid, - but is not dereferenceable) cannot be used as a value for @a pos. - - If called on a primitive type other than `null`, the resulting JSON value - will be `null`. - - @param[in] pos iterator to the element to remove - @return Iterator following the last removed element. If the iterator @a - pos refers to the last element, the `end()` iterator is returned. - - @tparam IteratorType an @ref iterator or @ref const_iterator - - @post Invalidates iterators and references at or after the point of the - erase, including the `end()` iterator. - - @throw type_error.307 if called on a `null` value; example: `"cannot use - erase() with null"` - @throw invalid_iterator.202 if called on an iterator which does not belong - to the current JSON value; example: `"iterator does not fit current - value"` - @throw invalid_iterator.205 if called on a primitive type with invalid - iterator (i.e., any iterator which is not `begin()`); example: `"iterator - out of range"` - - @complexity The complexity depends on the type: - - objects: amortized constant - - arrays: linear in distance between @a pos and the end of the container - - strings and binary: linear in the length of the member - - other types: constant - - @liveexample{The example shows the result of `erase()` for different JSON - types.,erase__IteratorType} - - @sa @ref erase(IteratorType, IteratorType) -- removes the elements in - the given range - @sa @ref erase(const typename object_t::key_type&) -- removes the element - from an object at the given key - @sa @ref erase(const size_type) -- removes the element from an array at - the given index - - @since version 1.0.0 - */ - template < class IteratorType, typename std::enable_if < - std::is_same::value || - std::is_same::value, int >::type - = 0 > - IteratorType erase(IteratorType pos) - { - // make sure iterator fits the current value - if (JSON_HEDLEY_UNLIKELY(this != pos.m_object)) - { - JSON_THROW(invalid_iterator::create(202, "iterator does not fit current value")); - } - - IteratorType result = end(); - - switch (m_type) - { - case value_t::boolean: - case value_t::number_float: - case value_t::number_integer: - case value_t::number_unsigned: - case value_t::string: - case value_t::binary: - { - if (JSON_HEDLEY_UNLIKELY(!pos.m_it.primitive_iterator.is_begin())) - { - JSON_THROW(invalid_iterator::create(205, "iterator out of range")); - } - - if (is_string()) - { - AllocatorType alloc; - std::allocator_traits::destroy(alloc, m_value.string); - std::allocator_traits::deallocate(alloc, m_value.string, 1); - m_value.string = nullptr; - } - else if (is_binary()) - { - AllocatorType alloc; - std::allocator_traits::destroy(alloc, m_value.binary); - std::allocator_traits::deallocate(alloc, m_value.binary, 1); - m_value.binary = nullptr; - } - - m_type = value_t::null; - assert_invariant(); - break; - } - - case value_t::object: - { - result.m_it.object_iterator = m_value.object->erase(pos.m_it.object_iterator); - break; - } - - case value_t::array: - { - result.m_it.array_iterator = m_value.array->erase(pos.m_it.array_iterator); - break; - } - - default: - JSON_THROW(type_error::create(307, "cannot use erase() with " + std::string(type_name()))); - } - - return result; - } - - /*! - @brief remove elements given an iterator range - - Removes the element specified by the range `[first; last)`. The iterator - @a first does not need to be dereferenceable if `first == last`: erasing - an empty range is a no-op. - - If called on a primitive type other than `null`, the resulting JSON value - will be `null`. - - @param[in] first iterator to the beginning of the range to remove - @param[in] last iterator past the end of the range to remove - @return Iterator following the last removed element. If the iterator @a - second refers to the last element, the `end()` iterator is returned. - - @tparam IteratorType an @ref iterator or @ref const_iterator - - @post Invalidates iterators and references at or after the point of the - erase, including the `end()` iterator. - - @throw type_error.307 if called on a `null` value; example: `"cannot use - erase() with null"` - @throw invalid_iterator.203 if called on iterators which does not belong - to the current JSON value; example: `"iterators do not fit current value"` - @throw invalid_iterator.204 if called on a primitive type with invalid - iterators (i.e., if `first != begin()` and `last != end()`); example: - `"iterators out of range"` - - @complexity The complexity depends on the type: - - objects: `log(size()) + std::distance(first, last)` - - arrays: linear in the distance between @a first and @a last, plus linear - in the distance between @a last and end of the container - - strings and binary: linear in the length of the member - - other types: constant - - @liveexample{The example shows the result of `erase()` for different JSON - types.,erase__IteratorType_IteratorType} - - @sa @ref erase(IteratorType) -- removes the element at a given position - @sa @ref erase(const typename object_t::key_type&) -- removes the element - from an object at the given key - @sa @ref erase(const size_type) -- removes the element from an array at - the given index - - @since version 1.0.0 - */ - template < class IteratorType, typename std::enable_if < - std::is_same::value || - std::is_same::value, int >::type - = 0 > - IteratorType erase(IteratorType first, IteratorType last) - { - // make sure iterator fits the current value - if (JSON_HEDLEY_UNLIKELY(this != first.m_object || this != last.m_object)) - { - JSON_THROW(invalid_iterator::create(203, "iterators do not fit current value")); - } - - IteratorType result = end(); - - switch (m_type) - { - case value_t::boolean: - case value_t::number_float: - case value_t::number_integer: - case value_t::number_unsigned: - case value_t::string: - case value_t::binary: - { - if (JSON_HEDLEY_LIKELY(!first.m_it.primitive_iterator.is_begin() - || !last.m_it.primitive_iterator.is_end())) - { - JSON_THROW(invalid_iterator::create(204, "iterators out of range")); - } - - if (is_string()) - { - AllocatorType alloc; - std::allocator_traits::destroy(alloc, m_value.string); - std::allocator_traits::deallocate(alloc, m_value.string, 1); - m_value.string = nullptr; - } - else if (is_binary()) - { - AllocatorType alloc; - std::allocator_traits::destroy(alloc, m_value.binary); - std::allocator_traits::deallocate(alloc, m_value.binary, 1); - m_value.binary = nullptr; - } - - m_type = value_t::null; - assert_invariant(); - break; - } - - case value_t::object: - { - result.m_it.object_iterator = m_value.object->erase(first.m_it.object_iterator, - last.m_it.object_iterator); - break; - } - - case value_t::array: - { - result.m_it.array_iterator = m_value.array->erase(first.m_it.array_iterator, - last.m_it.array_iterator); - break; - } - - default: - JSON_THROW(type_error::create(307, "cannot use erase() with " + std::string(type_name()))); - } - - return result; - } - - /*! - @brief remove element from a JSON object given a key - - Removes elements from a JSON object with the key value @a key. - - @param[in] key value of the elements to remove - - @return Number of elements removed. If @a ObjectType is the default - `std::map` type, the return value will always be `0` (@a key was not - found) or `1` (@a key was found). - - @post References and iterators to the erased elements are invalidated. - Other references and iterators are not affected. - - @throw type_error.307 when called on a type other than JSON object; - example: `"cannot use erase() with null"` - - @complexity `log(size()) + count(key)` - - @liveexample{The example shows the effect of `erase()`.,erase__key_type} - - @sa @ref erase(IteratorType) -- removes the element at a given position - @sa @ref erase(IteratorType, IteratorType) -- removes the elements in - the given range - @sa @ref erase(const size_type) -- removes the element from an array at - the given index - - @since version 1.0.0 - */ - size_type erase(const typename object_t::key_type& key) - { - // this erase only works for objects - if (JSON_HEDLEY_LIKELY(is_object())) - { - return m_value.object->erase(key); - } - - JSON_THROW(type_error::create(307, "cannot use erase() with " + std::string(type_name()))); - } - - /*! - @brief remove element from a JSON array given an index - - Removes element from a JSON array at the index @a idx. - - @param[in] idx index of the element to remove - - @throw type_error.307 when called on a type other than JSON object; - example: `"cannot use erase() with null"` - @throw out_of_range.401 when `idx >= size()`; example: `"array index 17 - is out of range"` - - @complexity Linear in distance between @a idx and the end of the container. - - @liveexample{The example shows the effect of `erase()`.,erase__size_type} - - @sa @ref erase(IteratorType) -- removes the element at a given position - @sa @ref erase(IteratorType, IteratorType) -- removes the elements in - the given range - @sa @ref erase(const typename object_t::key_type&) -- removes the element - from an object at the given key - - @since version 1.0.0 - */ - void erase(const size_type idx) - { - // this erase only works for arrays - if (JSON_HEDLEY_LIKELY(is_array())) - { - if (JSON_HEDLEY_UNLIKELY(idx >= size())) - { - JSON_THROW(out_of_range::create(401, "array index " + std::to_string(idx) + " is out of range")); - } - - m_value.array->erase(m_value.array->begin() + static_cast(idx)); - } - else - { - JSON_THROW(type_error::create(307, "cannot use erase() with " + std::string(type_name()))); - } - } - - /// @} - - - //////////// - // lookup // - //////////// - - /// @name lookup - /// @{ - - /*! - @brief find an element in a JSON object - - Finds an element in a JSON object with key equivalent to @a key. If the - element is not found or the JSON value is not an object, end() is - returned. - - @note This method always returns @ref end() when executed on a JSON type - that is not an object. - - @param[in] key key value of the element to search for. - - @return Iterator to an element with key equivalent to @a key. If no such - element is found or the JSON value is not an object, past-the-end (see - @ref end()) iterator is returned. - - @complexity Logarithmic in the size of the JSON object. - - @liveexample{The example shows how `find()` is used.,find__key_type} - - @sa @ref contains(KeyT&&) const -- checks whether a key exists - - @since version 1.0.0 - */ - template - iterator find(KeyT&& key) - { - auto result = end(); - - if (is_object()) - { - result.m_it.object_iterator = m_value.object->find(std::forward(key)); - } - - return result; - } - - /*! - @brief find an element in a JSON object - @copydoc find(KeyT&&) - */ - template - const_iterator find(KeyT&& key) const - { - auto result = cend(); - - if (is_object()) - { - result.m_it.object_iterator = m_value.object->find(std::forward(key)); - } - - return result; - } - - /*! - @brief returns the number of occurrences of a key in a JSON object - - Returns the number of elements with key @a key. If ObjectType is the - default `std::map` type, the return value will always be `0` (@a key was - not found) or `1` (@a key was found). - - @note This method always returns `0` when executed on a JSON type that is - not an object. - - @param[in] key key value of the element to count - - @return Number of elements with key @a key. If the JSON value is not an - object, the return value will be `0`. - - @complexity Logarithmic in the size of the JSON object. - - @liveexample{The example shows how `count()` is used.,count} - - @since version 1.0.0 - */ - template - size_type count(KeyT&& key) const - { - // return 0 for all nonobject types - return is_object() ? m_value.object->count(std::forward(key)) : 0; - } - - /*! - @brief check the existence of an element in a JSON object - - Check whether an element exists in a JSON object with key equivalent to - @a key. If the element is not found or the JSON value is not an object, - false is returned. - - @note This method always returns false when executed on a JSON type - that is not an object. - - @param[in] key key value to check its existence. - - @return true if an element with specified @a key exists. If no such - element with such key is found or the JSON value is not an object, - false is returned. - - @complexity Logarithmic in the size of the JSON object. - - @liveexample{The following code shows an example for `contains()`.,contains} - - @sa @ref find(KeyT&&) -- returns an iterator to an object element - @sa @ref contains(const json_pointer&) const -- checks the existence for a JSON pointer - - @since version 3.6.0 - */ - template < typename KeyT, typename std::enable_if < - !std::is_same::type, json_pointer>::value, int >::type = 0 > - bool contains(KeyT && key) const - { - return is_object() && m_value.object->find(std::forward(key)) != m_value.object->end(); - } - - /*! - @brief check the existence of an element in a JSON object given a JSON pointer - - Check whether the given JSON pointer @a ptr can be resolved in the current - JSON value. - - @note This method can be executed on any JSON value type. - - @param[in] ptr JSON pointer to check its existence. - - @return true if the JSON pointer can be resolved to a stored value, false - otherwise. - - @post If `j.contains(ptr)` returns true, it is safe to call `j[ptr]`. - - @throw parse_error.106 if an array index begins with '0' - @throw parse_error.109 if an array index was not a number - - @complexity Logarithmic in the size of the JSON object. - - @liveexample{The following code shows an example for `contains()`.,contains_json_pointer} - - @sa @ref contains(KeyT &&) const -- checks the existence of a key - - @since version 3.7.0 - */ - bool contains(const json_pointer& ptr) const - { - return ptr.contains(this); - } - - /// @} - - - /////////////// - // iterators // - /////////////// - - /// @name iterators - /// @{ - - /*! - @brief returns an iterator to the first element - - Returns an iterator to the first element. - - @image html range-begin-end.svg "Illustration from cppreference.com" - - @return iterator to the first element - - @complexity Constant. - - @requirement This function helps `basic_json` satisfying the - [Container](https://en.cppreference.com/w/cpp/named_req/Container) - requirements: - - The complexity is constant. - - @liveexample{The following code shows an example for `begin()`.,begin} - - @sa @ref cbegin() -- returns a const iterator to the beginning - @sa @ref end() -- returns an iterator to the end - @sa @ref cend() -- returns a const iterator to the end - - @since version 1.0.0 - */ - iterator begin() noexcept - { - iterator result(this); - result.set_begin(); - return result; - } - - /*! - @copydoc basic_json::cbegin() - */ - const_iterator begin() const noexcept - { - return cbegin(); - } - - /*! - @brief returns a const iterator to the first element - - Returns a const iterator to the first element. - - @image html range-begin-end.svg "Illustration from cppreference.com" - - @return const iterator to the first element - - @complexity Constant. - - @requirement This function helps `basic_json` satisfying the - [Container](https://en.cppreference.com/w/cpp/named_req/Container) - requirements: - - The complexity is constant. - - Has the semantics of `const_cast(*this).begin()`. - - @liveexample{The following code shows an example for `cbegin()`.,cbegin} - - @sa @ref begin() -- returns an iterator to the beginning - @sa @ref end() -- returns an iterator to the end - @sa @ref cend() -- returns a const iterator to the end - - @since version 1.0.0 - */ - const_iterator cbegin() const noexcept - { - const_iterator result(this); - result.set_begin(); - return result; - } - - /*! - @brief returns an iterator to one past the last element - - Returns an iterator to one past the last element. - - @image html range-begin-end.svg "Illustration from cppreference.com" - - @return iterator one past the last element - - @complexity Constant. - - @requirement This function helps `basic_json` satisfying the - [Container](https://en.cppreference.com/w/cpp/named_req/Container) - requirements: - - The complexity is constant. - - @liveexample{The following code shows an example for `end()`.,end} - - @sa @ref cend() -- returns a const iterator to the end - @sa @ref begin() -- returns an iterator to the beginning - @sa @ref cbegin() -- returns a const iterator to the beginning - - @since version 1.0.0 - */ - iterator end() noexcept - { - iterator result(this); - result.set_end(); - return result; - } - - /*! - @copydoc basic_json::cend() - */ - const_iterator end() const noexcept - { - return cend(); - } - - /*! - @brief returns a const iterator to one past the last element - - Returns a const iterator to one past the last element. - - @image html range-begin-end.svg "Illustration from cppreference.com" - - @return const iterator one past the last element - - @complexity Constant. - - @requirement This function helps `basic_json` satisfying the - [Container](https://en.cppreference.com/w/cpp/named_req/Container) - requirements: - - The complexity is constant. - - Has the semantics of `const_cast(*this).end()`. - - @liveexample{The following code shows an example for `cend()`.,cend} - - @sa @ref end() -- returns an iterator to the end - @sa @ref begin() -- returns an iterator to the beginning - @sa @ref cbegin() -- returns a const iterator to the beginning - - @since version 1.0.0 - */ - const_iterator cend() const noexcept - { - const_iterator result(this); - result.set_end(); - return result; - } - - /*! - @brief returns an iterator to the reverse-beginning - - Returns an iterator to the reverse-beginning; that is, the last element. - - @image html range-rbegin-rend.svg "Illustration from cppreference.com" - - @complexity Constant. - - @requirement This function helps `basic_json` satisfying the - [ReversibleContainer](https://en.cppreference.com/w/cpp/named_req/ReversibleContainer) - requirements: - - The complexity is constant. - - Has the semantics of `reverse_iterator(end())`. - - @liveexample{The following code shows an example for `rbegin()`.,rbegin} - - @sa @ref crbegin() -- returns a const reverse iterator to the beginning - @sa @ref rend() -- returns a reverse iterator to the end - @sa @ref crend() -- returns a const reverse iterator to the end - - @since version 1.0.0 - */ - reverse_iterator rbegin() noexcept - { - return reverse_iterator(end()); - } - - /*! - @copydoc basic_json::crbegin() - */ - const_reverse_iterator rbegin() const noexcept - { - return crbegin(); - } - - /*! - @brief returns an iterator to the reverse-end - - Returns an iterator to the reverse-end; that is, one before the first - element. - - @image html range-rbegin-rend.svg "Illustration from cppreference.com" - - @complexity Constant. - - @requirement This function helps `basic_json` satisfying the - [ReversibleContainer](https://en.cppreference.com/w/cpp/named_req/ReversibleContainer) - requirements: - - The complexity is constant. - - Has the semantics of `reverse_iterator(begin())`. - - @liveexample{The following code shows an example for `rend()`.,rend} - - @sa @ref crend() -- returns a const reverse iterator to the end - @sa @ref rbegin() -- returns a reverse iterator to the beginning - @sa @ref crbegin() -- returns a const reverse iterator to the beginning - - @since version 1.0.0 - */ - reverse_iterator rend() noexcept - { - return reverse_iterator(begin()); - } - - /*! - @copydoc basic_json::crend() - */ - const_reverse_iterator rend() const noexcept - { - return crend(); - } - - /*! - @brief returns a const reverse iterator to the last element - - Returns a const iterator to the reverse-beginning; that is, the last - element. - - @image html range-rbegin-rend.svg "Illustration from cppreference.com" - - @complexity Constant. - - @requirement This function helps `basic_json` satisfying the - [ReversibleContainer](https://en.cppreference.com/w/cpp/named_req/ReversibleContainer) - requirements: - - The complexity is constant. - - Has the semantics of `const_cast(*this).rbegin()`. - - @liveexample{The following code shows an example for `crbegin()`.,crbegin} - - @sa @ref rbegin() -- returns a reverse iterator to the beginning - @sa @ref rend() -- returns a reverse iterator to the end - @sa @ref crend() -- returns a const reverse iterator to the end - - @since version 1.0.0 - */ - const_reverse_iterator crbegin() const noexcept - { - return const_reverse_iterator(cend()); - } - - /*! - @brief returns a const reverse iterator to one before the first - - Returns a const reverse iterator to the reverse-end; that is, one before - the first element. - - @image html range-rbegin-rend.svg "Illustration from cppreference.com" - - @complexity Constant. - - @requirement This function helps `basic_json` satisfying the - [ReversibleContainer](https://en.cppreference.com/w/cpp/named_req/ReversibleContainer) - requirements: - - The complexity is constant. - - Has the semantics of `const_cast(*this).rend()`. - - @liveexample{The following code shows an example for `crend()`.,crend} - - @sa @ref rend() -- returns a reverse iterator to the end - @sa @ref rbegin() -- returns a reverse iterator to the beginning - @sa @ref crbegin() -- returns a const reverse iterator to the beginning - - @since version 1.0.0 - */ - const_reverse_iterator crend() const noexcept - { - return const_reverse_iterator(cbegin()); - } - - public: - /*! - @brief wrapper to access iterator member functions in range-based for - - This function allows to access @ref iterator::key() and @ref - iterator::value() during range-based for loops. In these loops, a - reference to the JSON values is returned, so there is no access to the - underlying iterator. - - For loop without iterator_wrapper: - - @code{cpp} - for (auto it = j_object.begin(); it != j_object.end(); ++it) - { - std::cout << "key: " << it.key() << ", value:" << it.value() << '\n'; - } - @endcode - - Range-based for loop without iterator proxy: - - @code{cpp} - for (auto it : j_object) - { - // "it" is of type json::reference and has no key() member - std::cout << "value: " << it << '\n'; - } - @endcode - - Range-based for loop with iterator proxy: - - @code{cpp} - for (auto it : json::iterator_wrapper(j_object)) - { - std::cout << "key: " << it.key() << ", value:" << it.value() << '\n'; - } - @endcode - - @note When iterating over an array, `key()` will return the index of the - element as string (see example). - - @param[in] ref reference to a JSON value - @return iteration proxy object wrapping @a ref with an interface to use in - range-based for loops - - @liveexample{The following code shows how the wrapper is used,iterator_wrapper} - - @exceptionsafety Strong guarantee: if an exception is thrown, there are no - changes in the JSON value. - - @complexity Constant. - - @note The name of this function is not yet final and may change in the - future. - - @deprecated This stream operator is deprecated and will be removed in - future 4.0.0 of the library. Please use @ref items() instead; - that is, replace `json::iterator_wrapper(j)` with `j.items()`. - */ - JSON_HEDLEY_DEPRECATED_FOR(3.1.0, items()) - static iteration_proxy iterator_wrapper(reference ref) noexcept - { - return ref.items(); - } - - /*! - @copydoc iterator_wrapper(reference) - */ - JSON_HEDLEY_DEPRECATED_FOR(3.1.0, items()) - static iteration_proxy iterator_wrapper(const_reference ref) noexcept - { - return ref.items(); - } - - /*! - @brief helper to access iterator member functions in range-based for - - This function allows to access @ref iterator::key() and @ref - iterator::value() during range-based for loops. In these loops, a - reference to the JSON values is returned, so there is no access to the - underlying iterator. - - For loop without `items()` function: - - @code{cpp} - for (auto it = j_object.begin(); it != j_object.end(); ++it) - { - std::cout << "key: " << it.key() << ", value:" << it.value() << '\n'; - } - @endcode - - Range-based for loop without `items()` function: - - @code{cpp} - for (auto it : j_object) - { - // "it" is of type json::reference and has no key() member - std::cout << "value: " << it << '\n'; - } - @endcode - - Range-based for loop with `items()` function: - - @code{cpp} - for (auto& el : j_object.items()) - { - std::cout << "key: " << el.key() << ", value:" << el.value() << '\n'; - } - @endcode - - The `items()` function also allows to use - [structured bindings](https://en.cppreference.com/w/cpp/language/structured_binding) - (C++17): - - @code{cpp} - for (auto& [key, val] : j_object.items()) - { - std::cout << "key: " << key << ", value:" << val << '\n'; - } - @endcode - - @note When iterating over an array, `key()` will return the index of the - element as string (see example). For primitive types (e.g., numbers), - `key()` returns an empty string. - - @warning Using `items()` on temporary objects is dangerous. Make sure the - object's lifetime exeeds the iteration. See - for more - information. - - @return iteration proxy object wrapping @a ref with an interface to use in - range-based for loops - - @liveexample{The following code shows how the function is used.,items} - - @exceptionsafety Strong guarantee: if an exception is thrown, there are no - changes in the JSON value. - - @complexity Constant. - - @since version 3.1.0, structured bindings support since 3.5.0. - */ - iteration_proxy items() noexcept - { - return iteration_proxy(*this); - } - - /*! - @copydoc items() - */ - iteration_proxy items() const noexcept - { - return iteration_proxy(*this); - } - - /// @} - - - ////////////// - // capacity // - ////////////// - - /// @name capacity - /// @{ - - /*! - @brief checks whether the container is empty. - - Checks if a JSON value has no elements (i.e. whether its @ref size is `0`). - - @return The return value depends on the different types and is - defined as follows: - Value type | return value - ----------- | ------------- - null | `true` - boolean | `false` - string | `false` - number | `false` - binary | `false` - object | result of function `object_t::empty()` - array | result of function `array_t::empty()` - - @liveexample{The following code uses `empty()` to check if a JSON - object contains any elements.,empty} - - @complexity Constant, as long as @ref array_t and @ref object_t satisfy - the Container concept; that is, their `empty()` functions have constant - complexity. - - @iterators No changes. - - @exceptionsafety No-throw guarantee: this function never throws exceptions. - - @note This function does not return whether a string stored as JSON value - is empty - it returns whether the JSON container itself is empty which is - false in the case of a string. - - @requirement This function helps `basic_json` satisfying the - [Container](https://en.cppreference.com/w/cpp/named_req/Container) - requirements: - - The complexity is constant. - - Has the semantics of `begin() == end()`. - - @sa @ref size() -- returns the number of elements - - @since version 1.0.0 - */ - bool empty() const noexcept - { - switch (m_type) - { - case value_t::null: - { - // null values are empty - return true; - } - - case value_t::array: - { - // delegate call to array_t::empty() - return m_value.array->empty(); - } - - case value_t::object: - { - // delegate call to object_t::empty() - return m_value.object->empty(); - } - - default: - { - // all other types are nonempty - return false; - } - } - } - - /*! - @brief returns the number of elements - - Returns the number of elements in a JSON value. - - @return The return value depends on the different types and is - defined as follows: - Value type | return value - ----------- | ------------- - null | `0` - boolean | `1` - string | `1` - number | `1` - binary | `1` - object | result of function object_t::size() - array | result of function array_t::size() - - @liveexample{The following code calls `size()` on the different value - types.,size} - - @complexity Constant, as long as @ref array_t and @ref object_t satisfy - the Container concept; that is, their size() functions have constant - complexity. - - @iterators No changes. - - @exceptionsafety No-throw guarantee: this function never throws exceptions. - - @note This function does not return the length of a string stored as JSON - value - it returns the number of elements in the JSON value which is 1 in - the case of a string. - - @requirement This function helps `basic_json` satisfying the - [Container](https://en.cppreference.com/w/cpp/named_req/Container) - requirements: - - The complexity is constant. - - Has the semantics of `std::distance(begin(), end())`. - - @sa @ref empty() -- checks whether the container is empty - @sa @ref max_size() -- returns the maximal number of elements - - @since version 1.0.0 - */ - size_type size() const noexcept - { - switch (m_type) - { - case value_t::null: - { - // null values are empty - return 0; - } - - case value_t::array: - { - // delegate call to array_t::size() - return m_value.array->size(); - } - - case value_t::object: - { - // delegate call to object_t::size() - return m_value.object->size(); - } - - default: - { - // all other types have size 1 - return 1; - } - } - } - - /*! - @brief returns the maximum possible number of elements - - Returns the maximum number of elements a JSON value is able to hold due to - system or library implementation limitations, i.e. `std::distance(begin(), - end())` for the JSON value. - - @return The return value depends on the different types and is - defined as follows: - Value type | return value - ----------- | ------------- - null | `0` (same as `size()`) - boolean | `1` (same as `size()`) - string | `1` (same as `size()`) - number | `1` (same as `size()`) - binary | `1` (same as `size()`) - object | result of function `object_t::max_size()` - array | result of function `array_t::max_size()` - - @liveexample{The following code calls `max_size()` on the different value - types. Note the output is implementation specific.,max_size} - - @complexity Constant, as long as @ref array_t and @ref object_t satisfy - the Container concept; that is, their `max_size()` functions have constant - complexity. - - @iterators No changes. - - @exceptionsafety No-throw guarantee: this function never throws exceptions. - - @requirement This function helps `basic_json` satisfying the - [Container](https://en.cppreference.com/w/cpp/named_req/Container) - requirements: - - The complexity is constant. - - Has the semantics of returning `b.size()` where `b` is the largest - possible JSON value. - - @sa @ref size() -- returns the number of elements - - @since version 1.0.0 - */ - size_type max_size() const noexcept - { - switch (m_type) - { - case value_t::array: - { - // delegate call to array_t::max_size() - return m_value.array->max_size(); - } - - case value_t::object: - { - // delegate call to object_t::max_size() - return m_value.object->max_size(); - } - - default: - { - // all other types have max_size() == size() - return size(); - } - } - } - - /// @} - - - /////////////// - // modifiers // - /////////////// - - /// @name modifiers - /// @{ - - /*! - @brief clears the contents - - Clears the content of a JSON value and resets it to the default value as - if @ref basic_json(value_t) would have been called with the current value - type from @ref type(): - - Value type | initial value - ----------- | ------------- - null | `null` - boolean | `false` - string | `""` - number | `0` - binary | An empty byte vector - object | `{}` - array | `[]` - - @post Has the same effect as calling - @code {.cpp} - *this = basic_json(type()); - @endcode - - @liveexample{The example below shows the effect of `clear()` to different - JSON types.,clear} - - @complexity Linear in the size of the JSON value. - - @iterators All iterators, pointers and references related to this container - are invalidated. - - @exceptionsafety No-throw guarantee: this function never throws exceptions. - - @sa @ref basic_json(value_t) -- constructor that creates an object with the - same value than calling `clear()` - - @since version 1.0.0 - */ - void clear() noexcept - { - switch (m_type) - { - case value_t::number_integer: - { - m_value.number_integer = 0; - break; - } - - case value_t::number_unsigned: - { - m_value.number_unsigned = 0; - break; - } - - case value_t::number_float: - { - m_value.number_float = 0.0; - break; - } - - case value_t::boolean: - { - m_value.boolean = false; - break; - } - - case value_t::string: - { - m_value.string->clear(); - break; - } - - case value_t::binary: - { - m_value.binary->clear(); - break; - } - - case value_t::array: - { - m_value.array->clear(); - break; - } - - case value_t::object: - { - m_value.object->clear(); - break; - } - - default: - break; - } - } - - /*! - @brief add an object to an array - - Appends the given element @a val to the end of the JSON value. If the - function is called on a JSON null value, an empty array is created before - appending @a val. - - @param[in] val the value to add to the JSON array - - @throw type_error.308 when called on a type other than JSON array or - null; example: `"cannot use push_back() with number"` - - @complexity Amortized constant. - - @liveexample{The example shows how `push_back()` and `+=` can be used to - add elements to a JSON array. Note how the `null` value was silently - converted to a JSON array.,push_back} - - @since version 1.0.0 - */ - void push_back(basic_json&& val) - { - // push_back only works for null objects or arrays - if (JSON_HEDLEY_UNLIKELY(!(is_null() || is_array()))) - { - JSON_THROW(type_error::create(308, "cannot use push_back() with " + std::string(type_name()))); - } - - // transform null object into an array - if (is_null()) - { - m_type = value_t::array; - m_value = value_t::array; - assert_invariant(); - } - - // add element to array (move semantics) - m_value.array->push_back(std::move(val)); - // if val is moved from, basic_json move constructor marks it null so we do not call the destructor - } - - /*! - @brief add an object to an array - @copydoc push_back(basic_json&&) - */ - reference operator+=(basic_json&& val) - { - push_back(std::move(val)); - return *this; - } - - /*! - @brief add an object to an array - @copydoc push_back(basic_json&&) - */ - void push_back(const basic_json& val) - { - // push_back only works for null objects or arrays - if (JSON_HEDLEY_UNLIKELY(!(is_null() || is_array()))) - { - JSON_THROW(type_error::create(308, "cannot use push_back() with " + std::string(type_name()))); - } - - // transform null object into an array - if (is_null()) - { - m_type = value_t::array; - m_value = value_t::array; - assert_invariant(); - } - - // add element to array - m_value.array->push_back(val); - } - - /*! - @brief add an object to an array - @copydoc push_back(basic_json&&) - */ - reference operator+=(const basic_json& val) - { - push_back(val); - return *this; - } - - /*! - @brief add an object to an object - - Inserts the given element @a val to the JSON object. If the function is - called on a JSON null value, an empty object is created before inserting - @a val. - - @param[in] val the value to add to the JSON object - - @throw type_error.308 when called on a type other than JSON object or - null; example: `"cannot use push_back() with number"` - - @complexity Logarithmic in the size of the container, O(log(`size()`)). - - @liveexample{The example shows how `push_back()` and `+=` can be used to - add elements to a JSON object. Note how the `null` value was silently - converted to a JSON object.,push_back__object_t__value} - - @since version 1.0.0 - */ - void push_back(const typename object_t::value_type& val) - { - // push_back only works for null objects or objects - if (JSON_HEDLEY_UNLIKELY(!(is_null() || is_object()))) - { - JSON_THROW(type_error::create(308, "cannot use push_back() with " + std::string(type_name()))); - } - - // transform null object into an object - if (is_null()) - { - m_type = value_t::object; - m_value = value_t::object; - assert_invariant(); - } - - // add element to array - m_value.object->insert(val); - } - - /*! - @brief add an object to an object - @copydoc push_back(const typename object_t::value_type&) - */ - reference operator+=(const typename object_t::value_type& val) - { - push_back(val); - return *this; - } - - /*! - @brief add an object to an object - - This function allows to use `push_back` with an initializer list. In case - - 1. the current value is an object, - 2. the initializer list @a init contains only two elements, and - 3. the first element of @a init is a string, - - @a init is converted into an object element and added using - @ref push_back(const typename object_t::value_type&). Otherwise, @a init - is converted to a JSON value and added using @ref push_back(basic_json&&). - - @param[in] init an initializer list - - @complexity Linear in the size of the initializer list @a init. - - @note This function is required to resolve an ambiguous overload error, - because pairs like `{"key", "value"}` can be both interpreted as - `object_t::value_type` or `std::initializer_list`, see - https://github.com/nlohmann/json/issues/235 for more information. - - @liveexample{The example shows how initializer lists are treated as - objects when possible.,push_back__initializer_list} - */ - void push_back(initializer_list_t init) - { - if (is_object() && init.size() == 2 && (*init.begin())->is_string()) - { - basic_json&& key = init.begin()->moved_or_copied(); - push_back(typename object_t::value_type( - std::move(key.get_ref()), (init.begin() + 1)->moved_or_copied())); - } - else - { - push_back(basic_json(init)); - } - } - - /*! - @brief add an object to an object - @copydoc push_back(initializer_list_t) - */ - reference operator+=(initializer_list_t init) - { - push_back(init); - return *this; - } - - /*! - @brief add an object to an array - - Creates a JSON value from the passed parameters @a args to the end of the - JSON value. If the function is called on a JSON null value, an empty array - is created before appending the value created from @a args. - - @param[in] args arguments to forward to a constructor of @ref basic_json - @tparam Args compatible types to create a @ref basic_json object - - @return reference to the inserted element - - @throw type_error.311 when called on a type other than JSON array or - null; example: `"cannot use emplace_back() with number"` - - @complexity Amortized constant. - - @liveexample{The example shows how `push_back()` can be used to add - elements to a JSON array. Note how the `null` value was silently converted - to a JSON array.,emplace_back} - - @since version 2.0.8, returns reference since 3.7.0 - */ - template - reference emplace_back(Args&& ... args) - { - // emplace_back only works for null objects or arrays - if (JSON_HEDLEY_UNLIKELY(!(is_null() || is_array()))) - { - JSON_THROW(type_error::create(311, "cannot use emplace_back() with " + std::string(type_name()))); - } - - // transform null object into an array - if (is_null()) - { - m_type = value_t::array; - m_value = value_t::array; - assert_invariant(); - } - - // add element to array (perfect forwarding) -#ifdef JSON_HAS_CPP_17 - return m_value.array->emplace_back(std::forward(args)...); -#else - m_value.array->emplace_back(std::forward(args)...); - return m_value.array->back(); -#endif - } - - /*! - @brief add an object to an object if key does not exist - - Inserts a new element into a JSON object constructed in-place with the - given @a args if there is no element with the key in the container. If the - function is called on a JSON null value, an empty object is created before - appending the value created from @a args. - - @param[in] args arguments to forward to a constructor of @ref basic_json - @tparam Args compatible types to create a @ref basic_json object - - @return a pair consisting of an iterator to the inserted element, or the - already-existing element if no insertion happened, and a bool - denoting whether the insertion took place. - - @throw type_error.311 when called on a type other than JSON object or - null; example: `"cannot use emplace() with number"` - - @complexity Logarithmic in the size of the container, O(log(`size()`)). - - @liveexample{The example shows how `emplace()` can be used to add elements - to a JSON object. Note how the `null` value was silently converted to a - JSON object. Further note how no value is added if there was already one - value stored with the same key.,emplace} - - @since version 2.0.8 - */ - template - std::pair emplace(Args&& ... args) - { - // emplace only works for null objects or arrays - if (JSON_HEDLEY_UNLIKELY(!(is_null() || is_object()))) - { - JSON_THROW(type_error::create(311, "cannot use emplace() with " + std::string(type_name()))); - } - - // transform null object into an object - if (is_null()) - { - m_type = value_t::object; - m_value = value_t::object; - assert_invariant(); - } - - // add element to array (perfect forwarding) - auto res = m_value.object->emplace(std::forward(args)...); - // create result iterator and set iterator to the result of emplace - auto it = begin(); - it.m_it.object_iterator = res.first; - - // return pair of iterator and boolean - return {it, res.second}; - } - - /// Helper for insertion of an iterator - /// @note: This uses std::distance to support GCC 4.8, - /// see https://github.com/nlohmann/json/pull/1257 - template - iterator insert_iterator(const_iterator pos, Args&& ... args) - { - iterator result(this); - JSON_ASSERT(m_value.array != nullptr); - - auto insert_pos = std::distance(m_value.array->begin(), pos.m_it.array_iterator); - m_value.array->insert(pos.m_it.array_iterator, std::forward(args)...); - result.m_it.array_iterator = m_value.array->begin() + insert_pos; - - // This could have been written as: - // result.m_it.array_iterator = m_value.array->insert(pos.m_it.array_iterator, cnt, val); - // but the return value of insert is missing in GCC 4.8, so it is written this way instead. - - return result; - } - - /*! - @brief inserts element - - Inserts element @a val before iterator @a pos. - - @param[in] pos iterator before which the content will be inserted; may be - the end() iterator - @param[in] val element to insert - @return iterator pointing to the inserted @a val. - - @throw type_error.309 if called on JSON values other than arrays; - example: `"cannot use insert() with string"` - @throw invalid_iterator.202 if @a pos is not an iterator of *this; - example: `"iterator does not fit current value"` - - @complexity Constant plus linear in the distance between @a pos and end of - the container. - - @liveexample{The example shows how `insert()` is used.,insert} - - @since version 1.0.0 - */ - iterator insert(const_iterator pos, const basic_json& val) - { - // insert only works for arrays - if (JSON_HEDLEY_LIKELY(is_array())) - { - // check if iterator pos fits to this JSON value - if (JSON_HEDLEY_UNLIKELY(pos.m_object != this)) - { - JSON_THROW(invalid_iterator::create(202, "iterator does not fit current value")); - } - - // insert to array and return iterator - return insert_iterator(pos, val); - } - - JSON_THROW(type_error::create(309, "cannot use insert() with " + std::string(type_name()))); - } - - /*! - @brief inserts element - @copydoc insert(const_iterator, const basic_json&) - */ - iterator insert(const_iterator pos, basic_json&& val) - { - return insert(pos, val); - } - - /*! - @brief inserts elements - - Inserts @a cnt copies of @a val before iterator @a pos. - - @param[in] pos iterator before which the content will be inserted; may be - the end() iterator - @param[in] cnt number of copies of @a val to insert - @param[in] val element to insert - @return iterator pointing to the first element inserted, or @a pos if - `cnt==0` - - @throw type_error.309 if called on JSON values other than arrays; example: - `"cannot use insert() with string"` - @throw invalid_iterator.202 if @a pos is not an iterator of *this; - example: `"iterator does not fit current value"` - - @complexity Linear in @a cnt plus linear in the distance between @a pos - and end of the container. - - @liveexample{The example shows how `insert()` is used.,insert__count} - - @since version 1.0.0 - */ - iterator insert(const_iterator pos, size_type cnt, const basic_json& val) - { - // insert only works for arrays - if (JSON_HEDLEY_LIKELY(is_array())) - { - // check if iterator pos fits to this JSON value - if (JSON_HEDLEY_UNLIKELY(pos.m_object != this)) - { - JSON_THROW(invalid_iterator::create(202, "iterator does not fit current value")); - } - - // insert to array and return iterator - return insert_iterator(pos, cnt, val); - } - - JSON_THROW(type_error::create(309, "cannot use insert() with " + std::string(type_name()))); - } - - /*! - @brief inserts elements - - Inserts elements from range `[first, last)` before iterator @a pos. - - @param[in] pos iterator before which the content will be inserted; may be - the end() iterator - @param[in] first begin of the range of elements to insert - @param[in] last end of the range of elements to insert - - @throw type_error.309 if called on JSON values other than arrays; example: - `"cannot use insert() with string"` - @throw invalid_iterator.202 if @a pos is not an iterator of *this; - example: `"iterator does not fit current value"` - @throw invalid_iterator.210 if @a first and @a last do not belong to the - same JSON value; example: `"iterators do not fit"` - @throw invalid_iterator.211 if @a first or @a last are iterators into - container for which insert is called; example: `"passed iterators may not - belong to container"` - - @return iterator pointing to the first element inserted, or @a pos if - `first==last` - - @complexity Linear in `std::distance(first, last)` plus linear in the - distance between @a pos and end of the container. - - @liveexample{The example shows how `insert()` is used.,insert__range} - - @since version 1.0.0 - */ - iterator insert(const_iterator pos, const_iterator first, const_iterator last) - { - // insert only works for arrays - if (JSON_HEDLEY_UNLIKELY(!is_array())) - { - JSON_THROW(type_error::create(309, "cannot use insert() with " + std::string(type_name()))); - } - - // check if iterator pos fits to this JSON value - if (JSON_HEDLEY_UNLIKELY(pos.m_object != this)) - { - JSON_THROW(invalid_iterator::create(202, "iterator does not fit current value")); - } - - // check if range iterators belong to the same JSON object - if (JSON_HEDLEY_UNLIKELY(first.m_object != last.m_object)) - { - JSON_THROW(invalid_iterator::create(210, "iterators do not fit")); - } - - if (JSON_HEDLEY_UNLIKELY(first.m_object == this)) - { - JSON_THROW(invalid_iterator::create(211, "passed iterators may not belong to container")); - } - - // insert to array and return iterator - return insert_iterator(pos, first.m_it.array_iterator, last.m_it.array_iterator); - } - - /*! - @brief inserts elements - - Inserts elements from initializer list @a ilist before iterator @a pos. - - @param[in] pos iterator before which the content will be inserted; may be - the end() iterator - @param[in] ilist initializer list to insert the values from - - @throw type_error.309 if called on JSON values other than arrays; example: - `"cannot use insert() with string"` - @throw invalid_iterator.202 if @a pos is not an iterator of *this; - example: `"iterator does not fit current value"` - - @return iterator pointing to the first element inserted, or @a pos if - `ilist` is empty - - @complexity Linear in `ilist.size()` plus linear in the distance between - @a pos and end of the container. - - @liveexample{The example shows how `insert()` is used.,insert__ilist} - - @since version 1.0.0 - */ - iterator insert(const_iterator pos, initializer_list_t ilist) - { - // insert only works for arrays - if (JSON_HEDLEY_UNLIKELY(!is_array())) - { - JSON_THROW(type_error::create(309, "cannot use insert() with " + std::string(type_name()))); - } - - // check if iterator pos fits to this JSON value - if (JSON_HEDLEY_UNLIKELY(pos.m_object != this)) - { - JSON_THROW(invalid_iterator::create(202, "iterator does not fit current value")); - } - - // insert to array and return iterator - return insert_iterator(pos, ilist.begin(), ilist.end()); - } - - /*! - @brief inserts elements - - Inserts elements from range `[first, last)`. - - @param[in] first begin of the range of elements to insert - @param[in] last end of the range of elements to insert - - @throw type_error.309 if called on JSON values other than objects; example: - `"cannot use insert() with string"` - @throw invalid_iterator.202 if iterator @a first or @a last does does not - point to an object; example: `"iterators first and last must point to - objects"` - @throw invalid_iterator.210 if @a first and @a last do not belong to the - same JSON value; example: `"iterators do not fit"` - - @complexity Logarithmic: `O(N*log(size() + N))`, where `N` is the number - of elements to insert. - - @liveexample{The example shows how `insert()` is used.,insert__range_object} - - @since version 3.0.0 - */ - void insert(const_iterator first, const_iterator last) - { - // insert only works for objects - if (JSON_HEDLEY_UNLIKELY(!is_object())) - { - JSON_THROW(type_error::create(309, "cannot use insert() with " + std::string(type_name()))); - } - - // check if range iterators belong to the same JSON object - if (JSON_HEDLEY_UNLIKELY(first.m_object != last.m_object)) - { - JSON_THROW(invalid_iterator::create(210, "iterators do not fit")); - } - - // passed iterators must belong to objects - if (JSON_HEDLEY_UNLIKELY(!first.m_object->is_object())) - { - JSON_THROW(invalid_iterator::create(202, "iterators first and last must point to objects")); - } - - m_value.object->insert(first.m_it.object_iterator, last.m_it.object_iterator); - } - - /*! - @brief updates a JSON object from another object, overwriting existing keys - - Inserts all values from JSON object @a j and overwrites existing keys. - - @param[in] j JSON object to read values from - - @throw type_error.312 if called on JSON values other than objects; example: - `"cannot use update() with string"` - - @complexity O(N*log(size() + N)), where N is the number of elements to - insert. - - @liveexample{The example shows how `update()` is used.,update} - - @sa https://docs.python.org/3.6/library/stdtypes.html#dict.update - - @since version 3.0.0 - */ - void update(const_reference j) - { - // implicitly convert null value to an empty object - if (is_null()) - { - m_type = value_t::object; - m_value.object = create(); - assert_invariant(); - } - - if (JSON_HEDLEY_UNLIKELY(!is_object())) - { - JSON_THROW(type_error::create(312, "cannot use update() with " + std::string(type_name()))); - } - if (JSON_HEDLEY_UNLIKELY(!j.is_object())) - { - JSON_THROW(type_error::create(312, "cannot use update() with " + std::string(j.type_name()))); - } - - for (auto it = j.cbegin(); it != j.cend(); ++it) - { - m_value.object->operator[](it.key()) = it.value(); - } - } - - /*! - @brief updates a JSON object from another object, overwriting existing keys - - Inserts all values from from range `[first, last)` and overwrites existing - keys. - - @param[in] first begin of the range of elements to insert - @param[in] last end of the range of elements to insert - - @throw type_error.312 if called on JSON values other than objects; example: - `"cannot use update() with string"` - @throw invalid_iterator.202 if iterator @a first or @a last does does not - point to an object; example: `"iterators first and last must point to - objects"` - @throw invalid_iterator.210 if @a first and @a last do not belong to the - same JSON value; example: `"iterators do not fit"` - - @complexity O(N*log(size() + N)), where N is the number of elements to - insert. - - @liveexample{The example shows how `update()` is used__range.,update} - - @sa https://docs.python.org/3.6/library/stdtypes.html#dict.update - - @since version 3.0.0 - */ - void update(const_iterator first, const_iterator last) - { - // implicitly convert null value to an empty object - if (is_null()) - { - m_type = value_t::object; - m_value.object = create(); - assert_invariant(); - } - - if (JSON_HEDLEY_UNLIKELY(!is_object())) - { - JSON_THROW(type_error::create(312, "cannot use update() with " + std::string(type_name()))); - } - - // check if range iterators belong to the same JSON object - if (JSON_HEDLEY_UNLIKELY(first.m_object != last.m_object)) - { - JSON_THROW(invalid_iterator::create(210, "iterators do not fit")); - } - - // passed iterators must belong to objects - if (JSON_HEDLEY_UNLIKELY(!first.m_object->is_object() - || !last.m_object->is_object())) - { - JSON_THROW(invalid_iterator::create(202, "iterators first and last must point to objects")); - } - - for (auto it = first; it != last; ++it) - { - m_value.object->operator[](it.key()) = it.value(); - } - } - - /*! - @brief exchanges the values - - Exchanges the contents of the JSON value with those of @a other. Does not - invoke any move, copy, or swap operations on individual elements. All - iterators and references remain valid. The past-the-end iterator is - invalidated. - - @param[in,out] other JSON value to exchange the contents with - - @complexity Constant. - - @liveexample{The example below shows how JSON values can be swapped with - `swap()`.,swap__reference} - - @since version 1.0.0 - */ - void swap(reference other) noexcept ( - std::is_nothrow_move_constructible::value&& - std::is_nothrow_move_assignable::value&& - std::is_nothrow_move_constructible::value&& - std::is_nothrow_move_assignable::value - ) - { - std::swap(m_type, other.m_type); - std::swap(m_value, other.m_value); - assert_invariant(); - } - - /*! - @brief exchanges the values - - Exchanges the contents of the JSON value from @a left with those of @a right. Does not - invoke any move, copy, or swap operations on individual elements. All - iterators and references remain valid. The past-the-end iterator is - invalidated. implemented as a friend function callable via ADL. - - @param[in,out] left JSON value to exchange the contents with - @param[in,out] right JSON value to exchange the contents with - - @complexity Constant. - - @liveexample{The example below shows how JSON values can be swapped with - `swap()`.,swap__reference} - - @since version 1.0.0 - */ - friend void swap(reference left, reference right) noexcept ( - std::is_nothrow_move_constructible::value&& - std::is_nothrow_move_assignable::value&& - std::is_nothrow_move_constructible::value&& - std::is_nothrow_move_assignable::value - ) - { - left.swap(right); - } - - /*! - @brief exchanges the values - - Exchanges the contents of a JSON array with those of @a other. Does not - invoke any move, copy, or swap operations on individual elements. All - iterators and references remain valid. The past-the-end iterator is - invalidated. - - @param[in,out] other array to exchange the contents with - - @throw type_error.310 when JSON value is not an array; example: `"cannot - use swap() with string"` - - @complexity Constant. - - @liveexample{The example below shows how arrays can be swapped with - `swap()`.,swap__array_t} - - @since version 1.0.0 - */ - void swap(array_t& other) - { - // swap only works for arrays - if (JSON_HEDLEY_LIKELY(is_array())) - { - std::swap(*(m_value.array), other); - } - else - { - JSON_THROW(type_error::create(310, "cannot use swap() with " + std::string(type_name()))); - } - } - - /*! - @brief exchanges the values - - Exchanges the contents of a JSON object with those of @a other. Does not - invoke any move, copy, or swap operations on individual elements. All - iterators and references remain valid. The past-the-end iterator is - invalidated. - - @param[in,out] other object to exchange the contents with - - @throw type_error.310 when JSON value is not an object; example: - `"cannot use swap() with string"` - - @complexity Constant. - - @liveexample{The example below shows how objects can be swapped with - `swap()`.,swap__object_t} - - @since version 1.0.0 - */ - void swap(object_t& other) - { - // swap only works for objects - if (JSON_HEDLEY_LIKELY(is_object())) - { - std::swap(*(m_value.object), other); - } - else - { - JSON_THROW(type_error::create(310, "cannot use swap() with " + std::string(type_name()))); - } - } - - /*! - @brief exchanges the values - - Exchanges the contents of a JSON string with those of @a other. Does not - invoke any move, copy, or swap operations on individual elements. All - iterators and references remain valid. The past-the-end iterator is - invalidated. - - @param[in,out] other string to exchange the contents with - - @throw type_error.310 when JSON value is not a string; example: `"cannot - use swap() with boolean"` - - @complexity Constant. - - @liveexample{The example below shows how strings can be swapped with - `swap()`.,swap__string_t} - - @since version 1.0.0 - */ - void swap(string_t& other) - { - // swap only works for strings - if (JSON_HEDLEY_LIKELY(is_string())) - { - std::swap(*(m_value.string), other); - } - else - { - JSON_THROW(type_error::create(310, "cannot use swap() with " + std::string(type_name()))); - } - } - - /*! - @brief exchanges the values - - Exchanges the contents of a JSON string with those of @a other. Does not - invoke any move, copy, or swap operations on individual elements. All - iterators and references remain valid. The past-the-end iterator is - invalidated. - - @param[in,out] other binary to exchange the contents with - - @throw type_error.310 when JSON value is not a string; example: `"cannot - use swap() with boolean"` - - @complexity Constant. - - @liveexample{The example below shows how strings can be swapped with - `swap()`.,swap__binary_t} - - @since version 3.8.0 - */ - void swap(binary_t& other) - { - // swap only works for strings - if (JSON_HEDLEY_LIKELY(is_binary())) - { - std::swap(*(m_value.binary), other); - } - else - { - JSON_THROW(type_error::create(310, "cannot use swap() with " + std::string(type_name()))); - } - } - - /// @copydoc swap(binary_t) - void swap(typename binary_t::container_type& other) - { - // swap only works for strings - if (JSON_HEDLEY_LIKELY(is_binary())) - { - std::swap(*(m_value.binary), other); - } - else - { - JSON_THROW(type_error::create(310, "cannot use swap() with " + std::string(type_name()))); - } - } - - /// @} - - public: - ////////////////////////////////////////// - // lexicographical comparison operators // - ////////////////////////////////////////// - - /// @name lexicographical comparison operators - /// @{ - - /*! - @brief comparison: equal - - Compares two JSON values for equality according to the following rules: - - Two JSON values are equal if (1) they are from the same type and (2) - their stored values are the same according to their respective - `operator==`. - - Integer and floating-point numbers are automatically converted before - comparison. Note that two NaN values are always treated as unequal. - - Two JSON null values are equal. - - @note Floating-point inside JSON values numbers are compared with - `json::number_float_t::operator==` which is `double::operator==` by - default. To compare floating-point while respecting an epsilon, an alternative - [comparison function](https://github.com/mariokonrad/marnav/blob/master/include/marnav/math/floatingpoint.hpp#L34-#L39) - could be used, for instance - @code {.cpp} - template::value, T>::type> - inline bool is_same(T a, T b, T epsilon = std::numeric_limits::epsilon()) noexcept - { - return std::abs(a - b) <= epsilon; - } - @endcode - Or you can self-defined operator equal function like this: - @code {.cpp} - bool my_equal(const_reference lhs, const_reference rhs) { - const auto lhs_type lhs.type(); - const auto rhs_type rhs.type(); - if (lhs_type == rhs_type) { - switch(lhs_type) - // self_defined case - case value_t::number_float: - return std::abs(lhs - rhs) <= std::numeric_limits::epsilon(); - // other cases remain the same with the original - ... - } - ... - } - @endcode - - @note NaN values never compare equal to themselves or to other NaN values. - - @param[in] lhs first JSON value to consider - @param[in] rhs second JSON value to consider - @return whether the values @a lhs and @a rhs are equal - - @exceptionsafety No-throw guarantee: this function never throws exceptions. - - @complexity Linear. - - @liveexample{The example demonstrates comparing several JSON - types.,operator__equal} - - @since version 1.0.0 - */ - friend bool operator==(const_reference lhs, const_reference rhs) noexcept - { - const auto lhs_type = lhs.type(); - const auto rhs_type = rhs.type(); - - if (lhs_type == rhs_type) - { - switch (lhs_type) - { - case value_t::array: - return *lhs.m_value.array == *rhs.m_value.array; - - case value_t::object: - return *lhs.m_value.object == *rhs.m_value.object; - - case value_t::null: - return true; - - case value_t::string: - return *lhs.m_value.string == *rhs.m_value.string; - - case value_t::boolean: - return lhs.m_value.boolean == rhs.m_value.boolean; - - case value_t::number_integer: - return lhs.m_value.number_integer == rhs.m_value.number_integer; - - case value_t::number_unsigned: - return lhs.m_value.number_unsigned == rhs.m_value.number_unsigned; - - case value_t::number_float: - return lhs.m_value.number_float == rhs.m_value.number_float; - - case value_t::binary: - return *lhs.m_value.binary == *rhs.m_value.binary; - - default: - return false; - } - } - else if (lhs_type == value_t::number_integer && rhs_type == value_t::number_float) - { - return static_cast(lhs.m_value.number_integer) == rhs.m_value.number_float; - } - else if (lhs_type == value_t::number_float && rhs_type == value_t::number_integer) - { - return lhs.m_value.number_float == static_cast(rhs.m_value.number_integer); - } - else if (lhs_type == value_t::number_unsigned && rhs_type == value_t::number_float) - { - return static_cast(lhs.m_value.number_unsigned) == rhs.m_value.number_float; - } - else if (lhs_type == value_t::number_float && rhs_type == value_t::number_unsigned) - { - return lhs.m_value.number_float == static_cast(rhs.m_value.number_unsigned); - } - else if (lhs_type == value_t::number_unsigned && rhs_type == value_t::number_integer) - { - return static_cast(lhs.m_value.number_unsigned) == rhs.m_value.number_integer; - } - else if (lhs_type == value_t::number_integer && rhs_type == value_t::number_unsigned) - { - return lhs.m_value.number_integer == static_cast(rhs.m_value.number_unsigned); - } - - return false; - } - - /*! - @brief comparison: equal - @copydoc operator==(const_reference, const_reference) - */ - template::value, int>::type = 0> - friend bool operator==(const_reference lhs, const ScalarType rhs) noexcept - { - return lhs == basic_json(rhs); - } - - /*! - @brief comparison: equal - @copydoc operator==(const_reference, const_reference) - */ - template::value, int>::type = 0> - friend bool operator==(const ScalarType lhs, const_reference rhs) noexcept - { - return basic_json(lhs) == rhs; - } - - /*! - @brief comparison: not equal - - Compares two JSON values for inequality by calculating `not (lhs == rhs)`. - - @param[in] lhs first JSON value to consider - @param[in] rhs second JSON value to consider - @return whether the values @a lhs and @a rhs are not equal - - @complexity Linear. - - @exceptionsafety No-throw guarantee: this function never throws exceptions. - - @liveexample{The example demonstrates comparing several JSON - types.,operator__notequal} - - @since version 1.0.0 - */ - friend bool operator!=(const_reference lhs, const_reference rhs) noexcept - { - return !(lhs == rhs); - } - - /*! - @brief comparison: not equal - @copydoc operator!=(const_reference, const_reference) - */ - template::value, int>::type = 0> - friend bool operator!=(const_reference lhs, const ScalarType rhs) noexcept - { - return lhs != basic_json(rhs); - } - - /*! - @brief comparison: not equal - @copydoc operator!=(const_reference, const_reference) - */ - template::value, int>::type = 0> - friend bool operator!=(const ScalarType lhs, const_reference rhs) noexcept - { - return basic_json(lhs) != rhs; - } - - /*! - @brief comparison: less than - - Compares whether one JSON value @a lhs is less than another JSON value @a - rhs according to the following rules: - - If @a lhs and @a rhs have the same type, the values are compared using - the default `<` operator. - - Integer and floating-point numbers are automatically converted before - comparison - - In case @a lhs and @a rhs have different types, the values are ignored - and the order of the types is considered, see - @ref operator<(const value_t, const value_t). - - @param[in] lhs first JSON value to consider - @param[in] rhs second JSON value to consider - @return whether @a lhs is less than @a rhs - - @complexity Linear. - - @exceptionsafety No-throw guarantee: this function never throws exceptions. - - @liveexample{The example demonstrates comparing several JSON - types.,operator__less} - - @since version 1.0.0 - */ - friend bool operator<(const_reference lhs, const_reference rhs) noexcept - { - const auto lhs_type = lhs.type(); - const auto rhs_type = rhs.type(); - - if (lhs_type == rhs_type) - { - switch (lhs_type) - { - case value_t::array: - // note parentheses are necessary, see - // https://github.com/nlohmann/json/issues/1530 - return (*lhs.m_value.array) < (*rhs.m_value.array); - - case value_t::object: - return (*lhs.m_value.object) < (*rhs.m_value.object); - - case value_t::null: - return false; - - case value_t::string: - return (*lhs.m_value.string) < (*rhs.m_value.string); - - case value_t::boolean: - return (lhs.m_value.boolean) < (rhs.m_value.boolean); - - case value_t::number_integer: - return (lhs.m_value.number_integer) < (rhs.m_value.number_integer); - - case value_t::number_unsigned: - return (lhs.m_value.number_unsigned) < (rhs.m_value.number_unsigned); - - case value_t::number_float: - return (lhs.m_value.number_float) < (rhs.m_value.number_float); - - case value_t::binary: - return (*lhs.m_value.binary) < (*rhs.m_value.binary); - - default: - return false; - } - } - else if (lhs_type == value_t::number_integer && rhs_type == value_t::number_float) - { - return static_cast(lhs.m_value.number_integer) < rhs.m_value.number_float; - } - else if (lhs_type == value_t::number_float && rhs_type == value_t::number_integer) - { - return lhs.m_value.number_float < static_cast(rhs.m_value.number_integer); - } - else if (lhs_type == value_t::number_unsigned && rhs_type == value_t::number_float) - { - return static_cast(lhs.m_value.number_unsigned) < rhs.m_value.number_float; - } - else if (lhs_type == value_t::number_float && rhs_type == value_t::number_unsigned) - { - return lhs.m_value.number_float < static_cast(rhs.m_value.number_unsigned); - } - else if (lhs_type == value_t::number_integer && rhs_type == value_t::number_unsigned) - { - return lhs.m_value.number_integer < static_cast(rhs.m_value.number_unsigned); - } - else if (lhs_type == value_t::number_unsigned && rhs_type == value_t::number_integer) - { - return static_cast(lhs.m_value.number_unsigned) < rhs.m_value.number_integer; - } - - // We only reach this line if we cannot compare values. In that case, - // we compare types. Note we have to call the operator explicitly, - // because MSVC has problems otherwise. - return operator<(lhs_type, rhs_type); - } - - /*! - @brief comparison: less than - @copydoc operator<(const_reference, const_reference) - */ - template::value, int>::type = 0> - friend bool operator<(const_reference lhs, const ScalarType rhs) noexcept - { - return lhs < basic_json(rhs); - } - - /*! - @brief comparison: less than - @copydoc operator<(const_reference, const_reference) - */ - template::value, int>::type = 0> - friend bool operator<(const ScalarType lhs, const_reference rhs) noexcept - { - return basic_json(lhs) < rhs; - } - - /*! - @brief comparison: less than or equal - - Compares whether one JSON value @a lhs is less than or equal to another - JSON value by calculating `not (rhs < lhs)`. - - @param[in] lhs first JSON value to consider - @param[in] rhs second JSON value to consider - @return whether @a lhs is less than or equal to @a rhs - - @complexity Linear. - - @exceptionsafety No-throw guarantee: this function never throws exceptions. - - @liveexample{The example demonstrates comparing several JSON - types.,operator__greater} - - @since version 1.0.0 - */ - friend bool operator<=(const_reference lhs, const_reference rhs) noexcept - { - return !(rhs < lhs); - } - - /*! - @brief comparison: less than or equal - @copydoc operator<=(const_reference, const_reference) - */ - template::value, int>::type = 0> - friend bool operator<=(const_reference lhs, const ScalarType rhs) noexcept - { - return lhs <= basic_json(rhs); - } - - /*! - @brief comparison: less than or equal - @copydoc operator<=(const_reference, const_reference) - */ - template::value, int>::type = 0> - friend bool operator<=(const ScalarType lhs, const_reference rhs) noexcept - { - return basic_json(lhs) <= rhs; - } - - /*! - @brief comparison: greater than - - Compares whether one JSON value @a lhs is greater than another - JSON value by calculating `not (lhs <= rhs)`. - - @param[in] lhs first JSON value to consider - @param[in] rhs second JSON value to consider - @return whether @a lhs is greater than to @a rhs - - @complexity Linear. - - @exceptionsafety No-throw guarantee: this function never throws exceptions. - - @liveexample{The example demonstrates comparing several JSON - types.,operator__lessequal} - - @since version 1.0.0 - */ - friend bool operator>(const_reference lhs, const_reference rhs) noexcept - { - return !(lhs <= rhs); - } - - /*! - @brief comparison: greater than - @copydoc operator>(const_reference, const_reference) - */ - template::value, int>::type = 0> - friend bool operator>(const_reference lhs, const ScalarType rhs) noexcept - { - return lhs > basic_json(rhs); - } - - /*! - @brief comparison: greater than - @copydoc operator>(const_reference, const_reference) - */ - template::value, int>::type = 0> - friend bool operator>(const ScalarType lhs, const_reference rhs) noexcept - { - return basic_json(lhs) > rhs; - } - - /*! - @brief comparison: greater than or equal - - Compares whether one JSON value @a lhs is greater than or equal to another - JSON value by calculating `not (lhs < rhs)`. - - @param[in] lhs first JSON value to consider - @param[in] rhs second JSON value to consider - @return whether @a lhs is greater than or equal to @a rhs - - @complexity Linear. - - @exceptionsafety No-throw guarantee: this function never throws exceptions. - - @liveexample{The example demonstrates comparing several JSON - types.,operator__greaterequal} - - @since version 1.0.0 - */ - friend bool operator>=(const_reference lhs, const_reference rhs) noexcept - { - return !(lhs < rhs); - } - - /*! - @brief comparison: greater than or equal - @copydoc operator>=(const_reference, const_reference) - */ - template::value, int>::type = 0> - friend bool operator>=(const_reference lhs, const ScalarType rhs) noexcept - { - return lhs >= basic_json(rhs); - } - - /*! - @brief comparison: greater than or equal - @copydoc operator>=(const_reference, const_reference) - */ - template::value, int>::type = 0> - friend bool operator>=(const ScalarType lhs, const_reference rhs) noexcept - { - return basic_json(lhs) >= rhs; - } - - /// @} - - /////////////////// - // serialization // - /////////////////// - - /// @name serialization - /// @{ - - /*! - @brief serialize to stream - - Serialize the given JSON value @a j to the output stream @a o. The JSON - value will be serialized using the @ref dump member function. - - - The indentation of the output can be controlled with the member variable - `width` of the output stream @a o. For instance, using the manipulator - `std::setw(4)` on @a o sets the indentation level to `4` and the - serialization result is the same as calling `dump(4)`. - - - The indentation character can be controlled with the member variable - `fill` of the output stream @a o. For instance, the manipulator - `std::setfill('\\t')` sets indentation to use a tab character rather than - the default space character. - - @param[in,out] o stream to serialize to - @param[in] j JSON value to serialize - - @return the stream @a o - - @throw type_error.316 if a string stored inside the JSON value is not - UTF-8 encoded - - @complexity Linear. - - @liveexample{The example below shows the serialization with different - parameters to `width` to adjust the indentation level.,operator_serialize} - - @since version 1.0.0; indentation character added in version 3.0.0 - */ - friend std::ostream& operator<<(std::ostream& o, const basic_json& j) - { - // read width member and use it as indentation parameter if nonzero - const bool pretty_print = o.width() > 0; - const auto indentation = pretty_print ? o.width() : 0; - - // reset width to 0 for subsequent calls to this stream - o.width(0); - - // do the actual serialization - serializer s(detail::output_adapter(o), o.fill()); - s.dump(j, pretty_print, false, static_cast(indentation)); - return o; - } - - /*! - @brief serialize to stream - @deprecated This stream operator is deprecated and will be removed in - future 4.0.0 of the library. Please use - @ref operator<<(std::ostream&, const basic_json&) - instead; that is, replace calls like `j >> o;` with `o << j;`. - @since version 1.0.0; deprecated since version 3.0.0 - */ - JSON_HEDLEY_DEPRECATED_FOR(3.0.0, operator<<(std::ostream&, const basic_json&)) - friend std::ostream& operator>>(const basic_json& j, std::ostream& o) - { - return o << j; - } - - /// @} - - - ///////////////////// - // deserialization // - ///////////////////// - - /// @name deserialization - /// @{ - - /*! - @brief deserialize from a compatible input - - @tparam InputType A compatible input, for instance - - an std::istream object - - a FILE pointer - - a C-style array of characters - - a pointer to a null-terminated string of single byte characters - - an object obj for which begin(obj) and end(obj) produces a valid pair of - iterators. - - @param[in] i input to read from - @param[in] cb a parser callback function of type @ref parser_callback_t - which is used to control the deserialization by filtering unwanted values - (optional) - @param[in] allow_exceptions whether to throw exceptions in case of a - parse error (optional, true by default) - @param[in] ignore_comments whether comments should be ignored and treated - like whitespace (true) or yield a parse error (true); (optional, false by - default) - - @return deserialized JSON value; in case of a parse error and - @a allow_exceptions set to `false`, the return value will be - value_t::discarded. - - @throw parse_error.101 if a parse error occurs; example: `""unexpected end - of input; expected string literal""` - @throw parse_error.102 if to_unicode fails or surrogate error - @throw parse_error.103 if to_unicode fails - - @complexity Linear in the length of the input. The parser is a predictive - LL(1) parser. The complexity can be higher if the parser callback function - @a cb or reading from the input @a i has a super-linear complexity. - - @note A UTF-8 byte order mark is silently ignored. - - @liveexample{The example below demonstrates the `parse()` function reading - from an array.,parse__array__parser_callback_t} - - @liveexample{The example below demonstrates the `parse()` function with - and without callback function.,parse__string__parser_callback_t} - - @liveexample{The example below demonstrates the `parse()` function with - and without callback function.,parse__istream__parser_callback_t} - - @liveexample{The example below demonstrates the `parse()` function reading - from a contiguous container.,parse__contiguouscontainer__parser_callback_t} - - @since version 2.0.3 (contiguous containers); version 3.9.0 allowed to - ignore comments. - */ - template - JSON_HEDLEY_WARN_UNUSED_RESULT - static basic_json parse(InputType&& i, - const parser_callback_t cb = nullptr, - const bool allow_exceptions = true, - const bool ignore_comments = false) - { - basic_json result; - parser(detail::input_adapter(std::forward(i)), cb, allow_exceptions, ignore_comments).parse(true, result); - return result; - } - - /*! - @brief deserialize from a pair of character iterators - - The value_type of the iterator must be a integral type with size of 1, 2 or - 4 bytes, which will be interpreted respectively as UTF-8, UTF-16 and UTF-32. - - @param[in] first iterator to start of character range - @param[in] last iterator to end of character range - @param[in] cb a parser callback function of type @ref parser_callback_t - which is used to control the deserialization by filtering unwanted values - (optional) - @param[in] allow_exceptions whether to throw exceptions in case of a - parse error (optional, true by default) - @param[in] ignore_comments whether comments should be ignored and treated - like whitespace (true) or yield a parse error (true); (optional, false by - default) - - @return deserialized JSON value; in case of a parse error and - @a allow_exceptions set to `false`, the return value will be - value_t::discarded. - - @throw parse_error.101 if a parse error occurs; example: `""unexpected end - of input; expected string literal""` - @throw parse_error.102 if to_unicode fails or surrogate error - @throw parse_error.103 if to_unicode fails - */ - template - JSON_HEDLEY_WARN_UNUSED_RESULT - static basic_json parse(IteratorType first, - IteratorType last, - const parser_callback_t cb = nullptr, - const bool allow_exceptions = true, - const bool ignore_comments = false) - { - basic_json result; - parser(detail::input_adapter(std::move(first), std::move(last)), cb, allow_exceptions, ignore_comments).parse(true, result); - return result; - } - - JSON_HEDLEY_WARN_UNUSED_RESULT - JSON_HEDLEY_DEPRECATED_FOR(3.8.0, parse(ptr, ptr + len)) - static basic_json parse(detail::span_input_adapter&& i, - const parser_callback_t cb = nullptr, - const bool allow_exceptions = true, - const bool ignore_comments = false) - { - basic_json result; - parser(i.get(), cb, allow_exceptions, ignore_comments).parse(true, result); - return result; - } - - /*! - @brief check if the input is valid JSON - - Unlike the @ref parse(InputType&&, const parser_callback_t,const bool) - function, this function neither throws an exception in case of invalid JSON - input (i.e., a parse error) nor creates diagnostic information. - - @tparam InputType A compatible input, for instance - - an std::istream object - - a FILE pointer - - a C-style array of characters - - a pointer to a null-terminated string of single byte characters - - an object obj for which begin(obj) and end(obj) produces a valid pair of - iterators. - - @param[in] i input to read from - @param[in] ignore_comments whether comments should be ignored and treated - like whitespace (true) or yield a parse error (true); (optional, false by - default) - - @return Whether the input read from @a i is valid JSON. - - @complexity Linear in the length of the input. The parser is a predictive - LL(1) parser. - - @note A UTF-8 byte order mark is silently ignored. - - @liveexample{The example below demonstrates the `accept()` function reading - from a string.,accept__string} - */ - template - static bool accept(InputType&& i, - const bool ignore_comments = false) - { - return parser(detail::input_adapter(std::forward(i)), nullptr, false, ignore_comments).accept(true); - } - - template - static bool accept(IteratorType first, IteratorType last, - const bool ignore_comments = false) - { - return parser(detail::input_adapter(std::move(first), std::move(last)), nullptr, false, ignore_comments).accept(true); - } - - JSON_HEDLEY_WARN_UNUSED_RESULT - JSON_HEDLEY_DEPRECATED_FOR(3.8.0, accept(ptr, ptr + len)) - static bool accept(detail::span_input_adapter&& i, - const bool ignore_comments = false) - { - return parser(i.get(), nullptr, false, ignore_comments).accept(true); - } - - /*! - @brief generate SAX events - - The SAX event lister must follow the interface of @ref json_sax. - - This function reads from a compatible input. Examples are: - - an std::istream object - - a FILE pointer - - a C-style array of characters - - a pointer to a null-terminated string of single byte characters - - an object obj for which begin(obj) and end(obj) produces a valid pair of - iterators. - - @param[in] i input to read from - @param[in,out] sax SAX event listener - @param[in] format the format to parse (JSON, CBOR, MessagePack, or UBJSON) - @param[in] strict whether the input has to be consumed completely - @param[in] ignore_comments whether comments should be ignored and treated - like whitespace (true) or yield a parse error (true); (optional, false by - default); only applies to the JSON file format. - - @return return value of the last processed SAX event - - @throw parse_error.101 if a parse error occurs; example: `""unexpected end - of input; expected string literal""` - @throw parse_error.102 if to_unicode fails or surrogate error - @throw parse_error.103 if to_unicode fails - - @complexity Linear in the length of the input. The parser is a predictive - LL(1) parser. The complexity can be higher if the SAX consumer @a sax has - a super-linear complexity. - - @note A UTF-8 byte order mark is silently ignored. - - @liveexample{The example below demonstrates the `sax_parse()` function - reading from string and processing the events with a user-defined SAX - event consumer.,sax_parse} - - @since version 3.2.0 - */ - template - JSON_HEDLEY_NON_NULL(2) - static bool sax_parse(InputType&& i, SAX* sax, - input_format_t format = input_format_t::json, - const bool strict = true, - const bool ignore_comments = false) - { - auto ia = detail::input_adapter(std::forward(i)); - return format == input_format_t::json - ? parser(std::move(ia), nullptr, true, ignore_comments).sax_parse(sax, strict) - : detail::binary_reader(std::move(ia)).sax_parse(format, sax, strict); - } - - template - JSON_HEDLEY_NON_NULL(3) - static bool sax_parse(IteratorType first, IteratorType last, SAX* sax, - input_format_t format = input_format_t::json, - const bool strict = true, - const bool ignore_comments = false) - { - auto ia = detail::input_adapter(std::move(first), std::move(last)); - return format == input_format_t::json - ? parser(std::move(ia), nullptr, true, ignore_comments).sax_parse(sax, strict) - : detail::binary_reader(std::move(ia)).sax_parse(format, sax, strict); - } - - template - JSON_HEDLEY_DEPRECATED_FOR(3.8.0, sax_parse(ptr, ptr + len, ...)) - JSON_HEDLEY_NON_NULL(2) - static bool sax_parse(detail::span_input_adapter&& i, SAX* sax, - input_format_t format = input_format_t::json, - const bool strict = true, - const bool ignore_comments = false) - { - auto ia = i.get(); - return format == input_format_t::json - ? parser(std::move(ia), nullptr, true, ignore_comments).sax_parse(sax, strict) - : detail::binary_reader(std::move(ia)).sax_parse(format, sax, strict); - } - - /*! - @brief deserialize from stream - @deprecated This stream operator is deprecated and will be removed in - version 4.0.0 of the library. Please use - @ref operator>>(std::istream&, basic_json&) - instead; that is, replace calls like `j << i;` with `i >> j;`. - @since version 1.0.0; deprecated since version 3.0.0 - */ - JSON_HEDLEY_DEPRECATED_FOR(3.0.0, operator>>(std::istream&, basic_json&)) - friend std::istream& operator<<(basic_json& j, std::istream& i) - { - return operator>>(i, j); - } - - /*! - @brief deserialize from stream - - Deserializes an input stream to a JSON value. - - @param[in,out] i input stream to read a serialized JSON value from - @param[in,out] j JSON value to write the deserialized input to - - @throw parse_error.101 in case of an unexpected token - @throw parse_error.102 if to_unicode fails or surrogate error - @throw parse_error.103 if to_unicode fails - - @complexity Linear in the length of the input. The parser is a predictive - LL(1) parser. - - @note A UTF-8 byte order mark is silently ignored. - - @liveexample{The example below shows how a JSON value is constructed by - reading a serialization from a stream.,operator_deserialize} - - @sa parse(std::istream&, const parser_callback_t) for a variant with a - parser callback function to filter values while parsing - - @since version 1.0.0 - */ - friend std::istream& operator>>(std::istream& i, basic_json& j) - { - parser(detail::input_adapter(i)).parse(false, j); - return i; - } - - /// @} - - /////////////////////////// - // convenience functions // - /////////////////////////// - - /*! - @brief return the type as string - - Returns the type name as string to be used in error messages - usually to - indicate that a function was called on a wrong JSON type. - - @return a string representation of a the @a m_type member: - Value type | return value - ----------- | ------------- - null | `"null"` - boolean | `"boolean"` - string | `"string"` - number | `"number"` (for all number types) - object | `"object"` - array | `"array"` - binary | `"binary"` - discarded | `"discarded"` - - @exceptionsafety No-throw guarantee: this function never throws exceptions. - - @complexity Constant. - - @liveexample{The following code exemplifies `type_name()` for all JSON - types.,type_name} - - @sa @ref type() -- return the type of the JSON value - @sa @ref operator value_t() -- return the type of the JSON value (implicit) - - @since version 1.0.0, public since 2.1.0, `const char*` and `noexcept` - since 3.0.0 - */ - JSON_HEDLEY_RETURNS_NON_NULL - const char* type_name() const noexcept - { - { - switch (m_type) - { - case value_t::null: - return "null"; - case value_t::object: - return "object"; - case value_t::array: - return "array"; - case value_t::string: - return "string"; - case value_t::boolean: - return "boolean"; - case value_t::binary: - return "binary"; - case value_t::discarded: - return "discarded"; - default: - return "number"; - } - } - } - - - private: - ////////////////////// - // member variables // - ////////////////////// - - /// the type of the current element - value_t m_type = value_t::null; - - /// the value of the current element - json_value m_value = {}; - - ////////////////////////////////////////// - // binary serialization/deserialization // - ////////////////////////////////////////// - - /// @name binary serialization/deserialization support - /// @{ - - public: - /*! - @brief create a CBOR serialization of a given JSON value - - Serializes a given JSON value @a j to a byte vector using the CBOR (Concise - Binary Object Representation) serialization format. CBOR is a binary - serialization format which aims to be more compact than JSON itself, yet - more efficient to parse. - - The library uses the following mapping from JSON values types to - CBOR types according to the CBOR specification (RFC 7049): - - JSON value type | value/range | CBOR type | first byte - --------------- | ------------------------------------------ | ---------------------------------- | --------------- - null | `null` | Null | 0xF6 - boolean | `true` | True | 0xF5 - boolean | `false` | False | 0xF4 - number_integer | -9223372036854775808..-2147483649 | Negative integer (8 bytes follow) | 0x3B - number_integer | -2147483648..-32769 | Negative integer (4 bytes follow) | 0x3A - number_integer | -32768..-129 | Negative integer (2 bytes follow) | 0x39 - number_integer | -128..-25 | Negative integer (1 byte follow) | 0x38 - number_integer | -24..-1 | Negative integer | 0x20..0x37 - number_integer | 0..23 | Integer | 0x00..0x17 - number_integer | 24..255 | Unsigned integer (1 byte follow) | 0x18 - number_integer | 256..65535 | Unsigned integer (2 bytes follow) | 0x19 - number_integer | 65536..4294967295 | Unsigned integer (4 bytes follow) | 0x1A - number_integer | 4294967296..18446744073709551615 | Unsigned integer (8 bytes follow) | 0x1B - number_unsigned | 0..23 | Integer | 0x00..0x17 - number_unsigned | 24..255 | Unsigned integer (1 byte follow) | 0x18 - number_unsigned | 256..65535 | Unsigned integer (2 bytes follow) | 0x19 - number_unsigned | 65536..4294967295 | Unsigned integer (4 bytes follow) | 0x1A - number_unsigned | 4294967296..18446744073709551615 | Unsigned integer (8 bytes follow) | 0x1B - number_float | *any value representable by a float* | Single-Precision Float | 0xFA - number_float | *any value NOT representable by a float* | Double-Precision Float | 0xFB - string | *length*: 0..23 | UTF-8 string | 0x60..0x77 - string | *length*: 23..255 | UTF-8 string (1 byte follow) | 0x78 - string | *length*: 256..65535 | UTF-8 string (2 bytes follow) | 0x79 - string | *length*: 65536..4294967295 | UTF-8 string (4 bytes follow) | 0x7A - string | *length*: 4294967296..18446744073709551615 | UTF-8 string (8 bytes follow) | 0x7B - array | *size*: 0..23 | array | 0x80..0x97 - array | *size*: 23..255 | array (1 byte follow) | 0x98 - array | *size*: 256..65535 | array (2 bytes follow) | 0x99 - array | *size*: 65536..4294967295 | array (4 bytes follow) | 0x9A - array | *size*: 4294967296..18446744073709551615 | array (8 bytes follow) | 0x9B - object | *size*: 0..23 | map | 0xA0..0xB7 - object | *size*: 23..255 | map (1 byte follow) | 0xB8 - object | *size*: 256..65535 | map (2 bytes follow) | 0xB9 - object | *size*: 65536..4294967295 | map (4 bytes follow) | 0xBA - object | *size*: 4294967296..18446744073709551615 | map (8 bytes follow) | 0xBB - binary | *size*: 0..23 | byte string | 0x40..0x57 - binary | *size*: 23..255 | byte string (1 byte follow) | 0x58 - binary | *size*: 256..65535 | byte string (2 bytes follow) | 0x59 - binary | *size*: 65536..4294967295 | byte string (4 bytes follow) | 0x5A - binary | *size*: 4294967296..18446744073709551615 | byte string (8 bytes follow) | 0x5B - - @note The mapping is **complete** in the sense that any JSON value type - can be converted to a CBOR value. - - @note If NaN or Infinity are stored inside a JSON number, they are - serialized properly. This behavior differs from the @ref dump() - function which serializes NaN or Infinity to `null`. - - @note The following CBOR types are not used in the conversion: - - UTF-8 strings terminated by "break" (0x7F) - - arrays terminated by "break" (0x9F) - - maps terminated by "break" (0xBF) - - byte strings terminated by "break" (0x5F) - - date/time (0xC0..0xC1) - - bignum (0xC2..0xC3) - - decimal fraction (0xC4) - - bigfloat (0xC5) - - expected conversions (0xD5..0xD7) - - simple values (0xE0..0xF3, 0xF8) - - undefined (0xF7) - - half-precision floats (0xF9) - - break (0xFF) - - @param[in] j JSON value to serialize - @return CBOR serialization as byte vector - - @complexity Linear in the size of the JSON value @a j. - - @liveexample{The example shows the serialization of a JSON value to a byte - vector in CBOR format.,to_cbor} - - @sa http://cbor.io - @sa @ref from_cbor(detail::input_adapter&&, const bool, const bool, const cbor_tag_handler_t) for the - analogous deserialization - @sa @ref to_msgpack(const basic_json&) for the related MessagePack format - @sa @ref to_ubjson(const basic_json&, const bool, const bool) for the - related UBJSON format - - @since version 2.0.9; compact representation of floating-point numbers - since version 3.8.0 - */ - static std::vector to_cbor(const basic_json& j) - { - std::vector result; - to_cbor(j, result); - return result; - } - - static void to_cbor(const basic_json& j, detail::output_adapter o) - { - binary_writer(o).write_cbor(j); - } - - static void to_cbor(const basic_json& j, detail::output_adapter o) - { - binary_writer(o).write_cbor(j); - } - - /*! - @brief create a MessagePack serialization of a given JSON value - - Serializes a given JSON value @a j to a byte vector using the MessagePack - serialization format. MessagePack is a binary serialization format which - aims to be more compact than JSON itself, yet more efficient to parse. - - The library uses the following mapping from JSON values types to - MessagePack types according to the MessagePack specification: - - JSON value type | value/range | MessagePack type | first byte - --------------- | --------------------------------- | ---------------- | ---------- - null | `null` | nil | 0xC0 - boolean | `true` | true | 0xC3 - boolean | `false` | false | 0xC2 - number_integer | -9223372036854775808..-2147483649 | int64 | 0xD3 - number_integer | -2147483648..-32769 | int32 | 0xD2 - number_integer | -32768..-129 | int16 | 0xD1 - number_integer | -128..-33 | int8 | 0xD0 - number_integer | -32..-1 | negative fixint | 0xE0..0xFF - number_integer | 0..127 | positive fixint | 0x00..0x7F - number_integer | 128..255 | uint 8 | 0xCC - number_integer | 256..65535 | uint 16 | 0xCD - number_integer | 65536..4294967295 | uint 32 | 0xCE - number_integer | 4294967296..18446744073709551615 | uint 64 | 0xCF - number_unsigned | 0..127 | positive fixint | 0x00..0x7F - number_unsigned | 128..255 | uint 8 | 0xCC - number_unsigned | 256..65535 | uint 16 | 0xCD - number_unsigned | 65536..4294967295 | uint 32 | 0xCE - number_unsigned | 4294967296..18446744073709551615 | uint 64 | 0xCF - number_float | *any value representable by a float* | float 32 | 0xCA - number_float | *any value NOT representable by a float* | float 64 | 0xCB - string | *length*: 0..31 | fixstr | 0xA0..0xBF - string | *length*: 32..255 | str 8 | 0xD9 - string | *length*: 256..65535 | str 16 | 0xDA - string | *length*: 65536..4294967295 | str 32 | 0xDB - array | *size*: 0..15 | fixarray | 0x90..0x9F - array | *size*: 16..65535 | array 16 | 0xDC - array | *size*: 65536..4294967295 | array 32 | 0xDD - object | *size*: 0..15 | fix map | 0x80..0x8F - object | *size*: 16..65535 | map 16 | 0xDE - object | *size*: 65536..4294967295 | map 32 | 0xDF - binary | *size*: 0..255 | bin 8 | 0xC4 - binary | *size*: 256..65535 | bin 16 | 0xC5 - binary | *size*: 65536..4294967295 | bin 32 | 0xC6 - - @note The mapping is **complete** in the sense that any JSON value type - can be converted to a MessagePack value. - - @note The following values can **not** be converted to a MessagePack value: - - strings with more than 4294967295 bytes - - byte strings with more than 4294967295 bytes - - arrays with more than 4294967295 elements - - objects with more than 4294967295 elements - - @note Any MessagePack output created @ref to_msgpack can be successfully - parsed by @ref from_msgpack. - - @note If NaN or Infinity are stored inside a JSON number, they are - serialized properly. This behavior differs from the @ref dump() - function which serializes NaN or Infinity to `null`. - - @param[in] j JSON value to serialize - @return MessagePack serialization as byte vector - - @complexity Linear in the size of the JSON value @a j. - - @liveexample{The example shows the serialization of a JSON value to a byte - vector in MessagePack format.,to_msgpack} - - @sa http://msgpack.org - @sa @ref from_msgpack for the analogous deserialization - @sa @ref to_cbor(const basic_json& for the related CBOR format - @sa @ref to_ubjson(const basic_json&, const bool, const bool) for the - related UBJSON format - - @since version 2.0.9 - */ - static std::vector to_msgpack(const basic_json& j) - { - std::vector result; - to_msgpack(j, result); - return result; - } - - static void to_msgpack(const basic_json& j, detail::output_adapter o) - { - binary_writer(o).write_msgpack(j); - } - - static void to_msgpack(const basic_json& j, detail::output_adapter o) - { - binary_writer(o).write_msgpack(j); - } - - /*! - @brief create a UBJSON serialization of a given JSON value - - Serializes a given JSON value @a j to a byte vector using the UBJSON - (Universal Binary JSON) serialization format. UBJSON aims to be more compact - than JSON itself, yet more efficient to parse. - - The library uses the following mapping from JSON values types to - UBJSON types according to the UBJSON specification: - - JSON value type | value/range | UBJSON type | marker - --------------- | --------------------------------- | ----------- | ------ - null | `null` | null | `Z` - boolean | `true` | true | `T` - boolean | `false` | false | `F` - number_integer | -9223372036854775808..-2147483649 | int64 | `L` - number_integer | -2147483648..-32769 | int32 | `l` - number_integer | -32768..-129 | int16 | `I` - number_integer | -128..127 | int8 | `i` - number_integer | 128..255 | uint8 | `U` - number_integer | 256..32767 | int16 | `I` - number_integer | 32768..2147483647 | int32 | `l` - number_integer | 2147483648..9223372036854775807 | int64 | `L` - number_unsigned | 0..127 | int8 | `i` - number_unsigned | 128..255 | uint8 | `U` - number_unsigned | 256..32767 | int16 | `I` - number_unsigned | 32768..2147483647 | int32 | `l` - number_unsigned | 2147483648..9223372036854775807 | int64 | `L` - number_unsigned | 2147483649..18446744073709551615 | high-precision | `H` - number_float | *any value* | float64 | `D` - string | *with shortest length indicator* | string | `S` - array | *see notes on optimized format* | array | `[` - object | *see notes on optimized format* | map | `{` - - @note The mapping is **complete** in the sense that any JSON value type - can be converted to a UBJSON value. - - @note The following values can **not** be converted to a UBJSON value: - - strings with more than 9223372036854775807 bytes (theoretical) - - @note The following markers are not used in the conversion: - - `Z`: no-op values are not created. - - `C`: single-byte strings are serialized with `S` markers. - - @note Any UBJSON output created @ref to_ubjson can be successfully parsed - by @ref from_ubjson. - - @note If NaN or Infinity are stored inside a JSON number, they are - serialized properly. This behavior differs from the @ref dump() - function which serializes NaN or Infinity to `null`. - - @note The optimized formats for containers are supported: Parameter - @a use_size adds size information to the beginning of a container and - removes the closing marker. Parameter @a use_type further checks - whether all elements of a container have the same type and adds the - type marker to the beginning of the container. The @a use_type - parameter must only be used together with @a use_size = true. Note - that @a use_size = true alone may result in larger representations - - the benefit of this parameter is that the receiving side is - immediately informed on the number of elements of the container. - - @note If the JSON data contains the binary type, the value stored is a list - of integers, as suggested by the UBJSON documentation. In particular, - this means that serialization and the deserialization of a JSON - containing binary values into UBJSON and back will result in a - different JSON object. - - @param[in] j JSON value to serialize - @param[in] use_size whether to add size annotations to container types - @param[in] use_type whether to add type annotations to container types - (must be combined with @a use_size = true) - @return UBJSON serialization as byte vector - - @complexity Linear in the size of the JSON value @a j. - - @liveexample{The example shows the serialization of a JSON value to a byte - vector in UBJSON format.,to_ubjson} - - @sa http://ubjson.org - @sa @ref from_ubjson(detail::input_adapter&&, const bool, const bool) for the - analogous deserialization - @sa @ref to_cbor(const basic_json& for the related CBOR format - @sa @ref to_msgpack(const basic_json&) for the related MessagePack format - - @since version 3.1.0 - */ - static std::vector to_ubjson(const basic_json& j, - const bool use_size = false, - const bool use_type = false) - { - std::vector result; - to_ubjson(j, result, use_size, use_type); - return result; - } - - static void to_ubjson(const basic_json& j, detail::output_adapter o, - const bool use_size = false, const bool use_type = false) - { - binary_writer(o).write_ubjson(j, use_size, use_type); - } - - static void to_ubjson(const basic_json& j, detail::output_adapter o, - const bool use_size = false, const bool use_type = false) - { - binary_writer(o).write_ubjson(j, use_size, use_type); - } - - - /*! - @brief Serializes the given JSON object `j` to BSON and returns a vector - containing the corresponding BSON-representation. - - BSON (Binary JSON) is a binary format in which zero or more ordered key/value pairs are - stored as a single entity (a so-called document). - - The library uses the following mapping from JSON values types to BSON types: - - JSON value type | value/range | BSON type | marker - --------------- | --------------------------------- | ----------- | ------ - null | `null` | null | 0x0A - boolean | `true`, `false` | boolean | 0x08 - number_integer | -9223372036854775808..-2147483649 | int64 | 0x12 - number_integer | -2147483648..2147483647 | int32 | 0x10 - number_integer | 2147483648..9223372036854775807 | int64 | 0x12 - number_unsigned | 0..2147483647 | int32 | 0x10 - number_unsigned | 2147483648..9223372036854775807 | int64 | 0x12 - number_unsigned | 9223372036854775808..18446744073709551615| -- | -- - number_float | *any value* | double | 0x01 - string | *any value* | string | 0x02 - array | *any value* | document | 0x04 - object | *any value* | document | 0x03 - binary | *any value* | binary | 0x05 - - @warning The mapping is **incomplete**, since only JSON-objects (and things - contained therein) can be serialized to BSON. - Also, integers larger than 9223372036854775807 cannot be serialized to BSON, - and the keys may not contain U+0000, since they are serialized a - zero-terminated c-strings. - - @throw out_of_range.407 if `j.is_number_unsigned() && j.get() > 9223372036854775807` - @throw out_of_range.409 if a key in `j` contains a NULL (U+0000) - @throw type_error.317 if `!j.is_object()` - - @pre The input `j` is required to be an object: `j.is_object() == true`. - - @note Any BSON output created via @ref to_bson can be successfully parsed - by @ref from_bson. - - @param[in] j JSON value to serialize - @return BSON serialization as byte vector - - @complexity Linear in the size of the JSON value @a j. - - @liveexample{The example shows the serialization of a JSON value to a byte - vector in BSON format.,to_bson} - - @sa http://bsonspec.org/spec.html - @sa @ref from_bson(detail::input_adapter&&, const bool strict) for the - analogous deserialization - @sa @ref to_ubjson(const basic_json&, const bool, const bool) for the - related UBJSON format - @sa @ref to_cbor(const basic_json&) for the related CBOR format - @sa @ref to_msgpack(const basic_json&) for the related MessagePack format - */ - static std::vector to_bson(const basic_json& j) - { - std::vector result; - to_bson(j, result); - return result; - } - - /*! - @brief Serializes the given JSON object `j` to BSON and forwards the - corresponding BSON-representation to the given output_adapter `o`. - @param j The JSON object to convert to BSON. - @param o The output adapter that receives the binary BSON representation. - @pre The input `j` shall be an object: `j.is_object() == true` - @sa @ref to_bson(const basic_json&) - */ - static void to_bson(const basic_json& j, detail::output_adapter o) - { - binary_writer(o).write_bson(j); - } - - /*! - @copydoc to_bson(const basic_json&, detail::output_adapter) - */ - static void to_bson(const basic_json& j, detail::output_adapter o) - { - binary_writer(o).write_bson(j); - } - - - /*! - @brief create a JSON value from an input in CBOR format - - Deserializes a given input @a i to a JSON value using the CBOR (Concise - Binary Object Representation) serialization format. - - The library maps CBOR types to JSON value types as follows: - - CBOR type | JSON value type | first byte - ---------------------- | --------------- | ---------- - Integer | number_unsigned | 0x00..0x17 - Unsigned integer | number_unsigned | 0x18 - Unsigned integer | number_unsigned | 0x19 - Unsigned integer | number_unsigned | 0x1A - Unsigned integer | number_unsigned | 0x1B - Negative integer | number_integer | 0x20..0x37 - Negative integer | number_integer | 0x38 - Negative integer | number_integer | 0x39 - Negative integer | number_integer | 0x3A - Negative integer | number_integer | 0x3B - Byte string | binary | 0x40..0x57 - Byte string | binary | 0x58 - Byte string | binary | 0x59 - Byte string | binary | 0x5A - Byte string | binary | 0x5B - UTF-8 string | string | 0x60..0x77 - UTF-8 string | string | 0x78 - UTF-8 string | string | 0x79 - UTF-8 string | string | 0x7A - UTF-8 string | string | 0x7B - UTF-8 string | string | 0x7F - array | array | 0x80..0x97 - array | array | 0x98 - array | array | 0x99 - array | array | 0x9A - array | array | 0x9B - array | array | 0x9F - map | object | 0xA0..0xB7 - map | object | 0xB8 - map | object | 0xB9 - map | object | 0xBA - map | object | 0xBB - map | object | 0xBF - False | `false` | 0xF4 - True | `true` | 0xF5 - Null | `null` | 0xF6 - Half-Precision Float | number_float | 0xF9 - Single-Precision Float | number_float | 0xFA - Double-Precision Float | number_float | 0xFB - - @warning The mapping is **incomplete** in the sense that not all CBOR - types can be converted to a JSON value. The following CBOR types - are not supported and will yield parse errors (parse_error.112): - - date/time (0xC0..0xC1) - - bignum (0xC2..0xC3) - - decimal fraction (0xC4) - - bigfloat (0xC5) - - expected conversions (0xD5..0xD7) - - simple values (0xE0..0xF3, 0xF8) - - undefined (0xF7) - - @warning CBOR allows map keys of any type, whereas JSON only allows - strings as keys in object values. Therefore, CBOR maps with keys - other than UTF-8 strings are rejected (parse_error.113). - - @note Any CBOR output created @ref to_cbor can be successfully parsed by - @ref from_cbor. - - @param[in] i an input in CBOR format convertible to an input adapter - @param[in] strict whether to expect the input to be consumed until EOF - (true by default) - @param[in] allow_exceptions whether to throw exceptions in case of a - parse error (optional, true by default) - @param[in] tag_handler how to treat CBOR tags (optional, error by default) - - @return deserialized JSON value; in case of a parse error and - @a allow_exceptions set to `false`, the return value will be - value_t::discarded. - - @throw parse_error.110 if the given input ends prematurely or the end of - file was not reached when @a strict was set to true - @throw parse_error.112 if unsupported features from CBOR were - used in the given input @a v or if the input is not valid CBOR - @throw parse_error.113 if a string was expected as map key, but not found - - @complexity Linear in the size of the input @a i. - - @liveexample{The example shows the deserialization of a byte vector in CBOR - format to a JSON value.,from_cbor} - - @sa http://cbor.io - @sa @ref to_cbor(const basic_json&) for the analogous serialization - @sa @ref from_msgpack(detail::input_adapter&&, const bool, const bool) for the - related MessagePack format - @sa @ref from_ubjson(detail::input_adapter&&, const bool, const bool) for the - related UBJSON format - - @since version 2.0.9; parameter @a start_index since 2.1.1; changed to - consume input adapters, removed start_index parameter, and added - @a strict parameter since 3.0.0; added @a allow_exceptions parameter - since 3.2.0; added @a tag_handler parameter since 3.9.0. - */ - template - JSON_HEDLEY_WARN_UNUSED_RESULT - static basic_json from_cbor(InputType&& i, - const bool strict = true, - const bool allow_exceptions = true, - const cbor_tag_handler_t tag_handler = cbor_tag_handler_t::error) - { - basic_json result; - detail::json_sax_dom_parser sdp(result, allow_exceptions); - auto ia = detail::input_adapter(std::forward(i)); - const bool res = binary_reader(std::move(ia)).sax_parse(input_format_t::cbor, &sdp, strict, tag_handler); - return res ? result : basic_json(value_t::discarded); - } - - /*! - @copydoc from_cbor(detail::input_adapter&&, const bool, const bool, const cbor_tag_handler_t) - */ - template - JSON_HEDLEY_WARN_UNUSED_RESULT - static basic_json from_cbor(IteratorType first, IteratorType last, - const bool strict = true, - const bool allow_exceptions = true, - const cbor_tag_handler_t tag_handler = cbor_tag_handler_t::error) - { - basic_json result; - detail::json_sax_dom_parser sdp(result, allow_exceptions); - auto ia = detail::input_adapter(std::move(first), std::move(last)); - const bool res = binary_reader(std::move(ia)).sax_parse(input_format_t::cbor, &sdp, strict, tag_handler); - return res ? result : basic_json(value_t::discarded); - } - - template - JSON_HEDLEY_WARN_UNUSED_RESULT - JSON_HEDLEY_DEPRECATED_FOR(3.8.0, from_cbor(ptr, ptr + len)) - static basic_json from_cbor(const T* ptr, std::size_t len, - const bool strict = true, - const bool allow_exceptions = true, - const cbor_tag_handler_t tag_handler = cbor_tag_handler_t::error) - { - return from_cbor(ptr, ptr + len, strict, allow_exceptions, tag_handler); - } - - - JSON_HEDLEY_WARN_UNUSED_RESULT - JSON_HEDLEY_DEPRECATED_FOR(3.8.0, from_cbor(ptr, ptr + len)) - static basic_json from_cbor(detail::span_input_adapter&& i, - const bool strict = true, - const bool allow_exceptions = true, - const cbor_tag_handler_t tag_handler = cbor_tag_handler_t::error) - { - basic_json result; - detail::json_sax_dom_parser sdp(result, allow_exceptions); - auto ia = i.get(); - const bool res = binary_reader(std::move(ia)).sax_parse(input_format_t::cbor, &sdp, strict, tag_handler); - return res ? result : basic_json(value_t::discarded); - } - - /*! - @brief create a JSON value from an input in MessagePack format - - Deserializes a given input @a i to a JSON value using the MessagePack - serialization format. - - The library maps MessagePack types to JSON value types as follows: - - MessagePack type | JSON value type | first byte - ---------------- | --------------- | ---------- - positive fixint | number_unsigned | 0x00..0x7F - fixmap | object | 0x80..0x8F - fixarray | array | 0x90..0x9F - fixstr | string | 0xA0..0xBF - nil | `null` | 0xC0 - false | `false` | 0xC2 - true | `true` | 0xC3 - float 32 | number_float | 0xCA - float 64 | number_float | 0xCB - uint 8 | number_unsigned | 0xCC - uint 16 | number_unsigned | 0xCD - uint 32 | number_unsigned | 0xCE - uint 64 | number_unsigned | 0xCF - int 8 | number_integer | 0xD0 - int 16 | number_integer | 0xD1 - int 32 | number_integer | 0xD2 - int 64 | number_integer | 0xD3 - str 8 | string | 0xD9 - str 16 | string | 0xDA - str 32 | string | 0xDB - array 16 | array | 0xDC - array 32 | array | 0xDD - map 16 | object | 0xDE - map 32 | object | 0xDF - bin 8 | binary | 0xC4 - bin 16 | binary | 0xC5 - bin 32 | binary | 0xC6 - ext 8 | binary | 0xC7 - ext 16 | binary | 0xC8 - ext 32 | binary | 0xC9 - fixext 1 | binary | 0xD4 - fixext 2 | binary | 0xD5 - fixext 4 | binary | 0xD6 - fixext 8 | binary | 0xD7 - fixext 16 | binary | 0xD8 - negative fixint | number_integer | 0xE0-0xFF - - @note Any MessagePack output created @ref to_msgpack can be successfully - parsed by @ref from_msgpack. - - @param[in] i an input in MessagePack format convertible to an input - adapter - @param[in] strict whether to expect the input to be consumed until EOF - (true by default) - @param[in] allow_exceptions whether to throw exceptions in case of a - parse error (optional, true by default) - - @return deserialized JSON value; in case of a parse error and - @a allow_exceptions set to `false`, the return value will be - value_t::discarded. - - @throw parse_error.110 if the given input ends prematurely or the end of - file was not reached when @a strict was set to true - @throw parse_error.112 if unsupported features from MessagePack were - used in the given input @a i or if the input is not valid MessagePack - @throw parse_error.113 if a string was expected as map key, but not found - - @complexity Linear in the size of the input @a i. - - @liveexample{The example shows the deserialization of a byte vector in - MessagePack format to a JSON value.,from_msgpack} - - @sa http://msgpack.org - @sa @ref to_msgpack(const basic_json&) for the analogous serialization - @sa @ref from_cbor(detail::input_adapter&&, const bool, const bool, const cbor_tag_handler_t) for the - related CBOR format - @sa @ref from_ubjson(detail::input_adapter&&, const bool, const bool) for - the related UBJSON format - @sa @ref from_bson(detail::input_adapter&&, const bool, const bool) for - the related BSON format - - @since version 2.0.9; parameter @a start_index since 2.1.1; changed to - consume input adapters, removed start_index parameter, and added - @a strict parameter since 3.0.0; added @a allow_exceptions parameter - since 3.2.0 - */ - template - JSON_HEDLEY_WARN_UNUSED_RESULT - static basic_json from_msgpack(InputType&& i, - const bool strict = true, - const bool allow_exceptions = true) - { - basic_json result; - detail::json_sax_dom_parser sdp(result, allow_exceptions); - auto ia = detail::input_adapter(std::forward(i)); - const bool res = binary_reader(std::move(ia)).sax_parse(input_format_t::msgpack, &sdp, strict); - return res ? result : basic_json(value_t::discarded); - } - - /*! - @copydoc from_msgpack(detail::input_adapter&&, const bool, const bool) - */ - template - JSON_HEDLEY_WARN_UNUSED_RESULT - static basic_json from_msgpack(IteratorType first, IteratorType last, - const bool strict = true, - const bool allow_exceptions = true) - { - basic_json result; - detail::json_sax_dom_parser sdp(result, allow_exceptions); - auto ia = detail::input_adapter(std::move(first), std::move(last)); - const bool res = binary_reader(std::move(ia)).sax_parse(input_format_t::msgpack, &sdp, strict); - return res ? result : basic_json(value_t::discarded); - } - - - template - JSON_HEDLEY_WARN_UNUSED_RESULT - JSON_HEDLEY_DEPRECATED_FOR(3.8.0, from_msgpack(ptr, ptr + len)) - static basic_json from_msgpack(const T* ptr, std::size_t len, - const bool strict = true, - const bool allow_exceptions = true) - { - return from_msgpack(ptr, ptr + len, strict, allow_exceptions); - } - - JSON_HEDLEY_WARN_UNUSED_RESULT - JSON_HEDLEY_DEPRECATED_FOR(3.8.0, from_msgpack(ptr, ptr + len)) - static basic_json from_msgpack(detail::span_input_adapter&& i, - const bool strict = true, - const bool allow_exceptions = true) - { - basic_json result; - detail::json_sax_dom_parser sdp(result, allow_exceptions); - auto ia = i.get(); - const bool res = binary_reader(std::move(ia)).sax_parse(input_format_t::msgpack, &sdp, strict); - return res ? result : basic_json(value_t::discarded); - } - - - /*! - @brief create a JSON value from an input in UBJSON format - - Deserializes a given input @a i to a JSON value using the UBJSON (Universal - Binary JSON) serialization format. - - The library maps UBJSON types to JSON value types as follows: - - UBJSON type | JSON value type | marker - ----------- | --------------------------------------- | ------ - no-op | *no value, next value is read* | `N` - null | `null` | `Z` - false | `false` | `F` - true | `true` | `T` - float32 | number_float | `d` - float64 | number_float | `D` - uint8 | number_unsigned | `U` - int8 | number_integer | `i` - int16 | number_integer | `I` - int32 | number_integer | `l` - int64 | number_integer | `L` - high-precision number | number_integer, number_unsigned, or number_float - depends on number string | 'H' - string | string | `S` - char | string | `C` - array | array (optimized values are supported) | `[` - object | object (optimized values are supported) | `{` - - @note The mapping is **complete** in the sense that any UBJSON value can - be converted to a JSON value. - - @param[in] i an input in UBJSON format convertible to an input adapter - @param[in] strict whether to expect the input to be consumed until EOF - (true by default) - @param[in] allow_exceptions whether to throw exceptions in case of a - parse error (optional, true by default) - - @return deserialized JSON value; in case of a parse error and - @a allow_exceptions set to `false`, the return value will be - value_t::discarded. - - @throw parse_error.110 if the given input ends prematurely or the end of - file was not reached when @a strict was set to true - @throw parse_error.112 if a parse error occurs - @throw parse_error.113 if a string could not be parsed successfully - - @complexity Linear in the size of the input @a i. - - @liveexample{The example shows the deserialization of a byte vector in - UBJSON format to a JSON value.,from_ubjson} - - @sa http://ubjson.org - @sa @ref to_ubjson(const basic_json&, const bool, const bool) for the - analogous serialization - @sa @ref from_cbor(detail::input_adapter&&, const bool, const bool, const cbor_tag_handler_t) for the - related CBOR format - @sa @ref from_msgpack(detail::input_adapter&&, const bool, const bool) for - the related MessagePack format - @sa @ref from_bson(detail::input_adapter&&, const bool, const bool) for - the related BSON format - - @since version 3.1.0; added @a allow_exceptions parameter since 3.2.0 - */ - template - JSON_HEDLEY_WARN_UNUSED_RESULT - static basic_json from_ubjson(InputType&& i, - const bool strict = true, - const bool allow_exceptions = true) - { - basic_json result; - detail::json_sax_dom_parser sdp(result, allow_exceptions); - auto ia = detail::input_adapter(std::forward(i)); - const bool res = binary_reader(std::move(ia)).sax_parse(input_format_t::ubjson, &sdp, strict); - return res ? result : basic_json(value_t::discarded); - } - - /*! - @copydoc from_ubjson(detail::input_adapter&&, const bool, const bool) - */ - template - JSON_HEDLEY_WARN_UNUSED_RESULT - static basic_json from_ubjson(IteratorType first, IteratorType last, - const bool strict = true, - const bool allow_exceptions = true) - { - basic_json result; - detail::json_sax_dom_parser sdp(result, allow_exceptions); - auto ia = detail::input_adapter(std::move(first), std::move(last)); - const bool res = binary_reader(std::move(ia)).sax_parse(input_format_t::ubjson, &sdp, strict); - return res ? result : basic_json(value_t::discarded); - } - - template - JSON_HEDLEY_WARN_UNUSED_RESULT - JSON_HEDLEY_DEPRECATED_FOR(3.8.0, from_ubjson(ptr, ptr + len)) - static basic_json from_ubjson(const T* ptr, std::size_t len, - const bool strict = true, - const bool allow_exceptions = true) - { - return from_ubjson(ptr, ptr + len, strict, allow_exceptions); - } - - JSON_HEDLEY_WARN_UNUSED_RESULT - JSON_HEDLEY_DEPRECATED_FOR(3.8.0, from_ubjson(ptr, ptr + len)) - static basic_json from_ubjson(detail::span_input_adapter&& i, - const bool strict = true, - const bool allow_exceptions = true) - { - basic_json result; - detail::json_sax_dom_parser sdp(result, allow_exceptions); - auto ia = i.get(); - const bool res = binary_reader(std::move(ia)).sax_parse(input_format_t::ubjson, &sdp, strict); - return res ? result : basic_json(value_t::discarded); - } - - - /*! - @brief Create a JSON value from an input in BSON format - - Deserializes a given input @a i to a JSON value using the BSON (Binary JSON) - serialization format. - - The library maps BSON record types to JSON value types as follows: - - BSON type | BSON marker byte | JSON value type - --------------- | ---------------- | --------------------------- - double | 0x01 | number_float - string | 0x02 | string - document | 0x03 | object - array | 0x04 | array - binary | 0x05 | still unsupported - undefined | 0x06 | still unsupported - ObjectId | 0x07 | still unsupported - boolean | 0x08 | boolean - UTC Date-Time | 0x09 | still unsupported - null | 0x0A | null - Regular Expr. | 0x0B | still unsupported - DB Pointer | 0x0C | still unsupported - JavaScript Code | 0x0D | still unsupported - Symbol | 0x0E | still unsupported - JavaScript Code | 0x0F | still unsupported - int32 | 0x10 | number_integer - Timestamp | 0x11 | still unsupported - 128-bit decimal float | 0x13 | still unsupported - Max Key | 0x7F | still unsupported - Min Key | 0xFF | still unsupported - - @warning The mapping is **incomplete**. The unsupported mappings - are indicated in the table above. - - @param[in] i an input in BSON format convertible to an input adapter - @param[in] strict whether to expect the input to be consumed until EOF - (true by default) - @param[in] allow_exceptions whether to throw exceptions in case of a - parse error (optional, true by default) - - @return deserialized JSON value; in case of a parse error and - @a allow_exceptions set to `false`, the return value will be - value_t::discarded. - - @throw parse_error.114 if an unsupported BSON record type is encountered - - @complexity Linear in the size of the input @a i. - - @liveexample{The example shows the deserialization of a byte vector in - BSON format to a JSON value.,from_bson} - - @sa http://bsonspec.org/spec.html - @sa @ref to_bson(const basic_json&) for the analogous serialization - @sa @ref from_cbor(detail::input_adapter&&, const bool, const bool, const cbor_tag_handler_t) for the - related CBOR format - @sa @ref from_msgpack(detail::input_adapter&&, const bool, const bool) for - the related MessagePack format - @sa @ref from_ubjson(detail::input_adapter&&, const bool, const bool) for the - related UBJSON format - */ - template - JSON_HEDLEY_WARN_UNUSED_RESULT - static basic_json from_bson(InputType&& i, - const bool strict = true, - const bool allow_exceptions = true) - { - basic_json result; - detail::json_sax_dom_parser sdp(result, allow_exceptions); - auto ia = detail::input_adapter(std::forward(i)); - const bool res = binary_reader(std::move(ia)).sax_parse(input_format_t::bson, &sdp, strict); - return res ? result : basic_json(value_t::discarded); - } - - /*! - @copydoc from_bson(detail::input_adapter&&, const bool, const bool) - */ - template - JSON_HEDLEY_WARN_UNUSED_RESULT - static basic_json from_bson(IteratorType first, IteratorType last, - const bool strict = true, - const bool allow_exceptions = true) - { - basic_json result; - detail::json_sax_dom_parser sdp(result, allow_exceptions); - auto ia = detail::input_adapter(std::move(first), std::move(last)); - const bool res = binary_reader(std::move(ia)).sax_parse(input_format_t::bson, &sdp, strict); - return res ? result : basic_json(value_t::discarded); - } - - template - JSON_HEDLEY_WARN_UNUSED_RESULT - JSON_HEDLEY_DEPRECATED_FOR(3.8.0, from_bson(ptr, ptr + len)) - static basic_json from_bson(const T* ptr, std::size_t len, - const bool strict = true, - const bool allow_exceptions = true) - { - return from_bson(ptr, ptr + len, strict, allow_exceptions); - } - - JSON_HEDLEY_WARN_UNUSED_RESULT - JSON_HEDLEY_DEPRECATED_FOR(3.8.0, from_bson(ptr, ptr + len)) - static basic_json from_bson(detail::span_input_adapter&& i, - const bool strict = true, - const bool allow_exceptions = true) - { - basic_json result; - detail::json_sax_dom_parser sdp(result, allow_exceptions); - auto ia = i.get(); - const bool res = binary_reader(std::move(ia)).sax_parse(input_format_t::bson, &sdp, strict); - return res ? result : basic_json(value_t::discarded); - } - /// @} - - ////////////////////////// - // JSON Pointer support // - ////////////////////////// - - /// @name JSON Pointer functions - /// @{ - - /*! - @brief access specified element via JSON Pointer - - Uses a JSON pointer to retrieve a reference to the respective JSON value. - No bound checking is performed. Similar to @ref operator[](const typename - object_t::key_type&), `null` values are created in arrays and objects if - necessary. - - In particular: - - If the JSON pointer points to an object key that does not exist, it - is created an filled with a `null` value before a reference to it - is returned. - - If the JSON pointer points to an array index that does not exist, it - is created an filled with a `null` value before a reference to it - is returned. All indices between the current maximum and the given - index are also filled with `null`. - - The special value `-` is treated as a synonym for the index past the - end. - - @param[in] ptr a JSON pointer - - @return reference to the element pointed to by @a ptr - - @complexity Constant. - - @throw parse_error.106 if an array index begins with '0' - @throw parse_error.109 if an array index was not a number - @throw out_of_range.404 if the JSON pointer can not be resolved - - @liveexample{The behavior is shown in the example.,operatorjson_pointer} - - @since version 2.0.0 - */ - reference operator[](const json_pointer& ptr) - { - return ptr.get_unchecked(this); - } - - /*! - @brief access specified element via JSON Pointer - - Uses a JSON pointer to retrieve a reference to the respective JSON value. - No bound checking is performed. The function does not change the JSON - value; no `null` values are created. In particular, the special value - `-` yields an exception. - - @param[in] ptr JSON pointer to the desired element - - @return const reference to the element pointed to by @a ptr - - @complexity Constant. - - @throw parse_error.106 if an array index begins with '0' - @throw parse_error.109 if an array index was not a number - @throw out_of_range.402 if the array index '-' is used - @throw out_of_range.404 if the JSON pointer can not be resolved - - @liveexample{The behavior is shown in the example.,operatorjson_pointer_const} - - @since version 2.0.0 - */ - const_reference operator[](const json_pointer& ptr) const - { - return ptr.get_unchecked(this); - } - - /*! - @brief access specified element via JSON Pointer - - Returns a reference to the element at with specified JSON pointer @a ptr, - with bounds checking. - - @param[in] ptr JSON pointer to the desired element - - @return reference to the element pointed to by @a ptr - - @throw parse_error.106 if an array index in the passed JSON pointer @a ptr - begins with '0'. See example below. - - @throw parse_error.109 if an array index in the passed JSON pointer @a ptr - is not a number. See example below. - - @throw out_of_range.401 if an array index in the passed JSON pointer @a ptr - is out of range. See example below. - - @throw out_of_range.402 if the array index '-' is used in the passed JSON - pointer @a ptr. As `at` provides checked access (and no elements are - implicitly inserted), the index '-' is always invalid. See example below. - - @throw out_of_range.403 if the JSON pointer describes a key of an object - which cannot be found. See example below. - - @throw out_of_range.404 if the JSON pointer @a ptr can not be resolved. - See example below. - - @exceptionsafety Strong guarantee: if an exception is thrown, there are no - changes in the JSON value. - - @complexity Constant. - - @since version 2.0.0 - - @liveexample{The behavior is shown in the example.,at_json_pointer} - */ - reference at(const json_pointer& ptr) - { - return ptr.get_checked(this); - } - - /*! - @brief access specified element via JSON Pointer - - Returns a const reference to the element at with specified JSON pointer @a - ptr, with bounds checking. - - @param[in] ptr JSON pointer to the desired element - - @return reference to the element pointed to by @a ptr - - @throw parse_error.106 if an array index in the passed JSON pointer @a ptr - begins with '0'. See example below. - - @throw parse_error.109 if an array index in the passed JSON pointer @a ptr - is not a number. See example below. - - @throw out_of_range.401 if an array index in the passed JSON pointer @a ptr - is out of range. See example below. - - @throw out_of_range.402 if the array index '-' is used in the passed JSON - pointer @a ptr. As `at` provides checked access (and no elements are - implicitly inserted), the index '-' is always invalid. See example below. - - @throw out_of_range.403 if the JSON pointer describes a key of an object - which cannot be found. See example below. - - @throw out_of_range.404 if the JSON pointer @a ptr can not be resolved. - See example below. - - @exceptionsafety Strong guarantee: if an exception is thrown, there are no - changes in the JSON value. - - @complexity Constant. - - @since version 2.0.0 - - @liveexample{The behavior is shown in the example.,at_json_pointer_const} - */ - const_reference at(const json_pointer& ptr) const - { - return ptr.get_checked(this); - } - - /*! - @brief return flattened JSON value - - The function creates a JSON object whose keys are JSON pointers (see [RFC - 6901](https://tools.ietf.org/html/rfc6901)) and whose values are all - primitive. The original JSON value can be restored using the @ref - unflatten() function. - - @return an object that maps JSON pointers to primitive values - - @note Empty objects and arrays are flattened to `null` and will not be - reconstructed correctly by the @ref unflatten() function. - - @complexity Linear in the size the JSON value. - - @liveexample{The following code shows how a JSON object is flattened to an - object whose keys consist of JSON pointers.,flatten} - - @sa @ref unflatten() for the reverse function - - @since version 2.0.0 - */ - basic_json flatten() const - { - basic_json result(value_t::object); - json_pointer::flatten("", *this, result); - return result; - } - - /*! - @brief unflatten a previously flattened JSON value - - The function restores the arbitrary nesting of a JSON value that has been - flattened before using the @ref flatten() function. The JSON value must - meet certain constraints: - 1. The value must be an object. - 2. The keys must be JSON pointers (see - [RFC 6901](https://tools.ietf.org/html/rfc6901)) - 3. The mapped values must be primitive JSON types. - - @return the original JSON from a flattened version - - @note Empty objects and arrays are flattened by @ref flatten() to `null` - values and can not unflattened to their original type. Apart from - this example, for a JSON value `j`, the following is always true: - `j == j.flatten().unflatten()`. - - @complexity Linear in the size the JSON value. - - @throw type_error.314 if value is not an object - @throw type_error.315 if object values are not primitive - - @liveexample{The following code shows how a flattened JSON object is - unflattened into the original nested JSON object.,unflatten} - - @sa @ref flatten() for the reverse function - - @since version 2.0.0 - */ - basic_json unflatten() const - { - return json_pointer::unflatten(*this); - } - - /// @} - - ////////////////////////// - // JSON Patch functions // - ////////////////////////// - - /// @name JSON Patch functions - /// @{ - - /*! - @brief applies a JSON patch - - [JSON Patch](http://jsonpatch.com) defines a JSON document structure for - expressing a sequence of operations to apply to a JSON) document. With - this function, a JSON Patch is applied to the current JSON value by - executing all operations from the patch. - - @param[in] json_patch JSON patch document - @return patched document - - @note The application of a patch is atomic: Either all operations succeed - and the patched document is returned or an exception is thrown. In - any case, the original value is not changed: the patch is applied - to a copy of the value. - - @throw parse_error.104 if the JSON patch does not consist of an array of - objects - - @throw parse_error.105 if the JSON patch is malformed (e.g., mandatory - attributes are missing); example: `"operation add must have member path"` - - @throw out_of_range.401 if an array index is out of range. - - @throw out_of_range.403 if a JSON pointer inside the patch could not be - resolved successfully in the current JSON value; example: `"key baz not - found"` - - @throw out_of_range.405 if JSON pointer has no parent ("add", "remove", - "move") - - @throw other_error.501 if "test" operation was unsuccessful - - @complexity Linear in the size of the JSON value and the length of the - JSON patch. As usually only a fraction of the JSON value is affected by - the patch, the complexity can usually be neglected. - - @liveexample{The following code shows how a JSON patch is applied to a - value.,patch} - - @sa @ref diff -- create a JSON patch by comparing two JSON values - - @sa [RFC 6902 (JSON Patch)](https://tools.ietf.org/html/rfc6902) - @sa [RFC 6901 (JSON Pointer)](https://tools.ietf.org/html/rfc6901) - - @since version 2.0.0 - */ - basic_json patch(const basic_json& json_patch) const - { - // make a working copy to apply the patch to - basic_json result = *this; - - // the valid JSON Patch operations - enum class patch_operations {add, remove, replace, move, copy, test, invalid}; - - const auto get_op = [](const std::string & op) - { - if (op == "add") - { - return patch_operations::add; - } - if (op == "remove") - { - return patch_operations::remove; - } - if (op == "replace") - { - return patch_operations::replace; - } - if (op == "move") - { - return patch_operations::move; - } - if (op == "copy") - { - return patch_operations::copy; - } - if (op == "test") - { - return patch_operations::test; - } - - return patch_operations::invalid; - }; - - // wrapper for "add" operation; add value at ptr - const auto operation_add = [&result](json_pointer & ptr, basic_json val) - { - // adding to the root of the target document means replacing it - if (ptr.empty()) - { - result = val; - return; - } - - // make sure the top element of the pointer exists - json_pointer top_pointer = ptr.top(); - if (top_pointer != ptr) - { - result.at(top_pointer); - } - - // get reference to parent of JSON pointer ptr - const auto last_path = ptr.back(); - ptr.pop_back(); - basic_json& parent = result[ptr]; - - switch (parent.m_type) - { - case value_t::null: - case value_t::object: - { - // use operator[] to add value - parent[last_path] = val; - break; - } - - case value_t::array: - { - if (last_path == "-") - { - // special case: append to back - parent.push_back(val); - } - else - { - const auto idx = json_pointer::array_index(last_path); - if (JSON_HEDLEY_UNLIKELY(idx > parent.size())) - { - // avoid undefined behavior - JSON_THROW(out_of_range::create(401, "array index " + std::to_string(idx) + " is out of range")); - } - - // default case: insert add offset - parent.insert(parent.begin() + static_cast(idx), val); - } - break; - } - - // if there exists a parent it cannot be primitive - default: // LCOV_EXCL_LINE - JSON_ASSERT(false); // LCOV_EXCL_LINE - } - }; - - // wrapper for "remove" operation; remove value at ptr - const auto operation_remove = [&result](json_pointer & ptr) - { - // get reference to parent of JSON pointer ptr - const auto last_path = ptr.back(); - ptr.pop_back(); - basic_json& parent = result.at(ptr); - - // remove child - if (parent.is_object()) - { - // perform range check - auto it = parent.find(last_path); - if (JSON_HEDLEY_LIKELY(it != parent.end())) - { - parent.erase(it); - } - else - { - JSON_THROW(out_of_range::create(403, "key '" + last_path + "' not found")); - } - } - else if (parent.is_array()) - { - // note erase performs range check - parent.erase(json_pointer::array_index(last_path)); - } - }; - - // type check: top level value must be an array - if (JSON_HEDLEY_UNLIKELY(!json_patch.is_array())) - { - JSON_THROW(parse_error::create(104, 0, "JSON patch must be an array of objects")); - } - - // iterate and apply the operations - for (const auto& val : json_patch) - { - // wrapper to get a value for an operation - const auto get_value = [&val](const std::string & op, - const std::string & member, - bool string_type) -> basic_json & - { - // find value - auto it = val.m_value.object->find(member); - - // context-sensitive error message - const auto error_msg = (op == "op") ? "operation" : "operation '" + op + "'"; - - // check if desired value is present - if (JSON_HEDLEY_UNLIKELY(it == val.m_value.object->end())) - { - JSON_THROW(parse_error::create(105, 0, error_msg + " must have member '" + member + "'")); - } - - // check if result is of type string - if (JSON_HEDLEY_UNLIKELY(string_type && !it->second.is_string())) - { - JSON_THROW(parse_error::create(105, 0, error_msg + " must have string member '" + member + "'")); - } - - // no error: return value - return it->second; - }; - - // type check: every element of the array must be an object - if (JSON_HEDLEY_UNLIKELY(!val.is_object())) - { - JSON_THROW(parse_error::create(104, 0, "JSON patch must be an array of objects")); - } - - // collect mandatory members - const auto op = get_value("op", "op", true).template get(); - const auto path = get_value(op, "path", true).template get(); - json_pointer ptr(path); - - switch (get_op(op)) - { - case patch_operations::add: - { - operation_add(ptr, get_value("add", "value", false)); - break; - } - - case patch_operations::remove: - { - operation_remove(ptr); - break; - } - - case patch_operations::replace: - { - // the "path" location must exist - use at() - result.at(ptr) = get_value("replace", "value", false); - break; - } - - case patch_operations::move: - { - const auto from_path = get_value("move", "from", true).template get(); - json_pointer from_ptr(from_path); - - // the "from" location must exist - use at() - basic_json v = result.at(from_ptr); - - // The move operation is functionally identical to a - // "remove" operation on the "from" location, followed - // immediately by an "add" operation at the target - // location with the value that was just removed. - operation_remove(from_ptr); - operation_add(ptr, v); - break; - } - - case patch_operations::copy: - { - const auto from_path = get_value("copy", "from", true).template get(); - const json_pointer from_ptr(from_path); - - // the "from" location must exist - use at() - basic_json v = result.at(from_ptr); - - // The copy is functionally identical to an "add" - // operation at the target location using the value - // specified in the "from" member. - operation_add(ptr, v); - break; - } - - case patch_operations::test: - { - bool success = false; - JSON_TRY - { - // check if "value" matches the one at "path" - // the "path" location must exist - use at() - success = (result.at(ptr) == get_value("test", "value", false)); - } - JSON_INTERNAL_CATCH (out_of_range&) - { - // ignore out of range errors: success remains false - } - - // throw an exception if test fails - if (JSON_HEDLEY_UNLIKELY(!success)) - { - JSON_THROW(other_error::create(501, "unsuccessful: " + val.dump())); - } - - break; - } - - default: - { - // op must be "add", "remove", "replace", "move", "copy", or - // "test" - JSON_THROW(parse_error::create(105, 0, "operation value '" + op + "' is invalid")); - } - } - } - - return result; - } - - /*! - @brief creates a diff as a JSON patch - - Creates a [JSON Patch](http://jsonpatch.com) so that value @a source can - be changed into the value @a target by calling @ref patch function. - - @invariant For two JSON values @a source and @a target, the following code - yields always `true`: - @code {.cpp} - source.patch(diff(source, target)) == target; - @endcode - - @note Currently, only `remove`, `add`, and `replace` operations are - generated. - - @param[in] source JSON value to compare from - @param[in] target JSON value to compare against - @param[in] path helper value to create JSON pointers - - @return a JSON patch to convert the @a source to @a target - - @complexity Linear in the lengths of @a source and @a target. - - @liveexample{The following code shows how a JSON patch is created as a - diff for two JSON values.,diff} - - @sa @ref patch -- apply a JSON patch - @sa @ref merge_patch -- apply a JSON Merge Patch - - @sa [RFC 6902 (JSON Patch)](https://tools.ietf.org/html/rfc6902) - - @since version 2.0.0 - */ - JSON_HEDLEY_WARN_UNUSED_RESULT - static basic_json diff(const basic_json& source, const basic_json& target, - const std::string& path = "") - { - // the patch - basic_json result(value_t::array); - - // if the values are the same, return empty patch - if (source == target) - { - return result; - } - - if (source.type() != target.type()) - { - // different types: replace value - result.push_back( - { - {"op", "replace"}, {"path", path}, {"value", target} - }); - return result; - } - - switch (source.type()) - { - case value_t::array: - { - // first pass: traverse common elements - std::size_t i = 0; - while (i < source.size() && i < target.size()) - { - // recursive call to compare array values at index i - auto temp_diff = diff(source[i], target[i], path + "/" + std::to_string(i)); - result.insert(result.end(), temp_diff.begin(), temp_diff.end()); - ++i; - } - - // i now reached the end of at least one array - // in a second pass, traverse the remaining elements - - // remove my remaining elements - const auto end_index = static_cast(result.size()); - while (i < source.size()) - { - // add operations in reverse order to avoid invalid - // indices - result.insert(result.begin() + end_index, object( - { - {"op", "remove"}, - {"path", path + "/" + std::to_string(i)} - })); - ++i; - } - - // add other remaining elements - while (i < target.size()) - { - result.push_back( - { - {"op", "add"}, - {"path", path + "/-"}, - {"value", target[i]} - }); - ++i; - } - - break; - } - - case value_t::object: - { - // first pass: traverse this object's elements - for (auto it = source.cbegin(); it != source.cend(); ++it) - { - // escape the key name to be used in a JSON patch - const auto key = json_pointer::escape(it.key()); - - if (target.find(it.key()) != target.end()) - { - // recursive call to compare object values at key it - auto temp_diff = diff(it.value(), target[it.key()], path + "/" + key); - result.insert(result.end(), temp_diff.begin(), temp_diff.end()); - } - else - { - // found a key that is not in o -> remove it - result.push_back(object( - { - {"op", "remove"}, {"path", path + "/" + key} - })); - } - } - - // second pass: traverse other object's elements - for (auto it = target.cbegin(); it != target.cend(); ++it) - { - if (source.find(it.key()) == source.end()) - { - // found a key that is not in this -> add it - const auto key = json_pointer::escape(it.key()); - result.push_back( - { - {"op", "add"}, {"path", path + "/" + key}, - {"value", it.value()} - }); - } - } - - break; - } - - default: - { - // both primitive type: replace value - result.push_back( - { - {"op", "replace"}, {"path", path}, {"value", target} - }); - break; - } - } - - return result; - } - - /// @} - - //////////////////////////////// - // JSON Merge Patch functions // - //////////////////////////////// - - /// @name JSON Merge Patch functions - /// @{ - - /*! - @brief applies a JSON Merge Patch - - The merge patch format is primarily intended for use with the HTTP PATCH - method as a means of describing a set of modifications to a target - resource's content. This function applies a merge patch to the current - JSON value. - - The function implements the following algorithm from Section 2 of - [RFC 7396 (JSON Merge Patch)](https://tools.ietf.org/html/rfc7396): - - ``` - define MergePatch(Target, Patch): - if Patch is an Object: - if Target is not an Object: - Target = {} // Ignore the contents and set it to an empty Object - for each Name/Value pair in Patch: - if Value is null: - if Name exists in Target: - remove the Name/Value pair from Target - else: - Target[Name] = MergePatch(Target[Name], Value) - return Target - else: - return Patch - ``` - - Thereby, `Target` is the current object; that is, the patch is applied to - the current value. - - @param[in] apply_patch the patch to apply - - @complexity Linear in the lengths of @a patch. - - @liveexample{The following code shows how a JSON Merge Patch is applied to - a JSON document.,merge_patch} - - @sa @ref patch -- apply a JSON patch - @sa [RFC 7396 (JSON Merge Patch)](https://tools.ietf.org/html/rfc7396) - - @since version 3.0.0 - */ - void merge_patch(const basic_json& apply_patch) - { - if (apply_patch.is_object()) - { - if (!is_object()) - { - *this = object(); - } - for (auto it = apply_patch.begin(); it != apply_patch.end(); ++it) - { - if (it.value().is_null()) - { - erase(it.key()); - } - else - { - operator[](it.key()).merge_patch(it.value()); - } - } - } - else - { - *this = apply_patch; - } - } - - /// @} -}; - -/*! -@brief user-defined to_string function for JSON values - -This function implements a user-defined to_string for JSON objects. - -@param[in] j a JSON object -@return a std::string object -*/ - -NLOHMANN_BASIC_JSON_TPL_DECLARATION -std::string to_string(const NLOHMANN_BASIC_JSON_TPL& j) -{ - return j.dump(); -} -} // namespace nlohmann - -/////////////////////// -// nonmember support // -/////////////////////// - -// specialization of std::swap, and std::hash -namespace std -{ - -/// hash value for JSON objects -template<> -struct hash -{ - /*! - @brief return a hash value for a JSON object - - @since version 1.0.0 - */ - std::size_t operator()(const nlohmann::json& j) const - { - return nlohmann::detail::hash(j); - } -}; - -/// specialization for std::less -/// @note: do not remove the space after '<', -/// see https://github.com/nlohmann/json/pull/679 -template<> -struct less<::nlohmann::detail::value_t> -{ - /*! - @brief compare two value_t enum values - @since version 3.0.0 - */ - bool operator()(nlohmann::detail::value_t lhs, - nlohmann::detail::value_t rhs) const noexcept - { - return nlohmann::detail::operator<(lhs, rhs); - } -}; - -// C++20 prohibit function specialization in the std namespace. -#ifndef JSON_HAS_CPP_20 - -/*! -@brief exchanges the values of two JSON objects - -@since version 1.0.0 -*/ -template<> -inline void swap(nlohmann::json& j1, nlohmann::json& j2) noexcept( - is_nothrow_move_constructible::value&& - is_nothrow_move_assignable::value - ) -{ - j1.swap(j2); -} - -#endif - -} // namespace std - -/*! -@brief user-defined string literal for JSON values - -This operator implements a user-defined string literal for JSON objects. It -can be used by adding `"_json"` to a string literal and returns a JSON object -if no parse error occurred. - -@param[in] s a string representation of a JSON object -@param[in] n the length of string @a s -@return a JSON object - -@since version 1.0.0 -*/ -JSON_HEDLEY_NON_NULL(1) -inline nlohmann::json operator "" _json(const char* s, std::size_t n) -{ - return nlohmann::json::parse(s, s + n); -} - -/*! -@brief user-defined string literal for JSON pointer - -This operator implements a user-defined string literal for JSON Pointers. It -can be used by adding `"_json_pointer"` to a string literal and returns a JSON pointer -object if no parse error occurred. - -@param[in] s a string representation of a JSON Pointer -@param[in] n the length of string @a s -@return a JSON pointer object - -@since version 2.0.0 -*/ -JSON_HEDLEY_NON_NULL(1) -inline nlohmann::json::json_pointer operator "" _json_pointer(const char* s, std::size_t n) -{ - return nlohmann::json::json_pointer(std::string(s, n)); -} - -// #include - - -// restore GCC/clang diagnostic settings -#if defined(__clang__) || defined(__GNUC__) || defined(__GNUG__) - #pragma GCC diagnostic pop -#endif -#if defined(__clang__) - #pragma GCC diagnostic pop -#endif - -// clean up -#undef JSON_ASSERT -#undef JSON_INTERNAL_CATCH -#undef JSON_CATCH -#undef JSON_THROW -#undef JSON_TRY -#undef JSON_HAS_CPP_14 -#undef JSON_HAS_CPP_17 -#undef NLOHMANN_BASIC_JSON_TPL_DECLARATION -#undef NLOHMANN_BASIC_JSON_TPL -#undef JSON_EXPLICIT - -// #include -#undef JSON_HEDLEY_ALWAYS_INLINE -#undef JSON_HEDLEY_ARM_VERSION -#undef JSON_HEDLEY_ARM_VERSION_CHECK -#undef JSON_HEDLEY_ARRAY_PARAM -#undef JSON_HEDLEY_ASSUME -#undef JSON_HEDLEY_BEGIN_C_DECLS -#undef JSON_HEDLEY_CLANG_HAS_ATTRIBUTE -#undef JSON_HEDLEY_CLANG_HAS_BUILTIN -#undef JSON_HEDLEY_CLANG_HAS_CPP_ATTRIBUTE -#undef JSON_HEDLEY_CLANG_HAS_DECLSPEC_DECLSPEC_ATTRIBUTE -#undef JSON_HEDLEY_CLANG_HAS_EXTENSION -#undef JSON_HEDLEY_CLANG_HAS_FEATURE -#undef JSON_HEDLEY_CLANG_HAS_WARNING -#undef JSON_HEDLEY_COMPCERT_VERSION -#undef JSON_HEDLEY_COMPCERT_VERSION_CHECK -#undef JSON_HEDLEY_CONCAT -#undef JSON_HEDLEY_CONCAT3 -#undef JSON_HEDLEY_CONCAT3_EX -#undef JSON_HEDLEY_CONCAT_EX -#undef JSON_HEDLEY_CONST -#undef JSON_HEDLEY_CONSTEXPR -#undef JSON_HEDLEY_CONST_CAST -#undef JSON_HEDLEY_CPP_CAST -#undef JSON_HEDLEY_CRAY_VERSION -#undef JSON_HEDLEY_CRAY_VERSION_CHECK -#undef JSON_HEDLEY_C_DECL -#undef JSON_HEDLEY_DEPRECATED -#undef JSON_HEDLEY_DEPRECATED_FOR -#undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_CAST_QUAL -#undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_CPP98_COMPAT_WRAP_ -#undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED -#undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_CPP_ATTRIBUTES -#undef JSON_HEDLEY_DIAGNOSTIC_DISABLE_UNKNOWN_PRAGMAS -#undef JSON_HEDLEY_DIAGNOSTIC_POP -#undef JSON_HEDLEY_DIAGNOSTIC_PUSH -#undef JSON_HEDLEY_DMC_VERSION -#undef JSON_HEDLEY_DMC_VERSION_CHECK -#undef JSON_HEDLEY_EMPTY_BASES -#undef JSON_HEDLEY_EMSCRIPTEN_VERSION -#undef JSON_HEDLEY_EMSCRIPTEN_VERSION_CHECK -#undef JSON_HEDLEY_END_C_DECLS -#undef JSON_HEDLEY_FLAGS -#undef JSON_HEDLEY_FLAGS_CAST -#undef JSON_HEDLEY_GCC_HAS_ATTRIBUTE -#undef JSON_HEDLEY_GCC_HAS_BUILTIN -#undef JSON_HEDLEY_GCC_HAS_CPP_ATTRIBUTE -#undef JSON_HEDLEY_GCC_HAS_DECLSPEC_ATTRIBUTE -#undef JSON_HEDLEY_GCC_HAS_EXTENSION -#undef JSON_HEDLEY_GCC_HAS_FEATURE -#undef JSON_HEDLEY_GCC_HAS_WARNING -#undef JSON_HEDLEY_GCC_NOT_CLANG_VERSION_CHECK -#undef JSON_HEDLEY_GCC_VERSION -#undef JSON_HEDLEY_GCC_VERSION_CHECK -#undef JSON_HEDLEY_GNUC_HAS_ATTRIBUTE -#undef JSON_HEDLEY_GNUC_HAS_BUILTIN -#undef JSON_HEDLEY_GNUC_HAS_CPP_ATTRIBUTE -#undef JSON_HEDLEY_GNUC_HAS_DECLSPEC_ATTRIBUTE -#undef JSON_HEDLEY_GNUC_HAS_EXTENSION -#undef JSON_HEDLEY_GNUC_HAS_FEATURE -#undef JSON_HEDLEY_GNUC_HAS_WARNING -#undef JSON_HEDLEY_GNUC_VERSION -#undef JSON_HEDLEY_GNUC_VERSION_CHECK -#undef JSON_HEDLEY_HAS_ATTRIBUTE -#undef JSON_HEDLEY_HAS_BUILTIN -#undef JSON_HEDLEY_HAS_CPP_ATTRIBUTE -#undef JSON_HEDLEY_HAS_CPP_ATTRIBUTE_NS -#undef JSON_HEDLEY_HAS_DECLSPEC_ATTRIBUTE -#undef JSON_HEDLEY_HAS_EXTENSION -#undef JSON_HEDLEY_HAS_FEATURE -#undef JSON_HEDLEY_HAS_WARNING -#undef JSON_HEDLEY_IAR_VERSION -#undef JSON_HEDLEY_IAR_VERSION_CHECK -#undef JSON_HEDLEY_IBM_VERSION -#undef JSON_HEDLEY_IBM_VERSION_CHECK -#undef JSON_HEDLEY_IMPORT -#undef JSON_HEDLEY_INLINE -#undef JSON_HEDLEY_INTEL_VERSION -#undef JSON_HEDLEY_INTEL_VERSION_CHECK -#undef JSON_HEDLEY_IS_CONSTANT -#undef JSON_HEDLEY_IS_CONSTEXPR_ -#undef JSON_HEDLEY_LIKELY -#undef JSON_HEDLEY_MALLOC -#undef JSON_HEDLEY_MESSAGE -#undef JSON_HEDLEY_MSVC_VERSION -#undef JSON_HEDLEY_MSVC_VERSION_CHECK -#undef JSON_HEDLEY_NEVER_INLINE -#undef JSON_HEDLEY_NON_NULL -#undef JSON_HEDLEY_NO_ESCAPE -#undef JSON_HEDLEY_NO_RETURN -#undef JSON_HEDLEY_NO_THROW -#undef JSON_HEDLEY_NULL -#undef JSON_HEDLEY_PELLES_VERSION -#undef JSON_HEDLEY_PELLES_VERSION_CHECK -#undef JSON_HEDLEY_PGI_VERSION -#undef JSON_HEDLEY_PGI_VERSION_CHECK -#undef JSON_HEDLEY_PREDICT -#undef JSON_HEDLEY_PRINTF_FORMAT -#undef JSON_HEDLEY_PRIVATE -#undef JSON_HEDLEY_PUBLIC -#undef JSON_HEDLEY_PURE -#undef JSON_HEDLEY_REINTERPRET_CAST -#undef JSON_HEDLEY_REQUIRE -#undef JSON_HEDLEY_REQUIRE_CONSTEXPR -#undef JSON_HEDLEY_REQUIRE_MSG -#undef JSON_HEDLEY_RESTRICT -#undef JSON_HEDLEY_RETURNS_NON_NULL -#undef JSON_HEDLEY_SENTINEL -#undef JSON_HEDLEY_STATIC_ASSERT -#undef JSON_HEDLEY_STATIC_CAST -#undef JSON_HEDLEY_STRINGIFY -#undef JSON_HEDLEY_STRINGIFY_EX -#undef JSON_HEDLEY_SUNPRO_VERSION -#undef JSON_HEDLEY_SUNPRO_VERSION_CHECK -#undef JSON_HEDLEY_TINYC_VERSION -#undef JSON_HEDLEY_TINYC_VERSION_CHECK -#undef JSON_HEDLEY_TI_ARMCL_VERSION -#undef JSON_HEDLEY_TI_ARMCL_VERSION_CHECK -#undef JSON_HEDLEY_TI_CL2000_VERSION -#undef JSON_HEDLEY_TI_CL2000_VERSION_CHECK -#undef JSON_HEDLEY_TI_CL430_VERSION -#undef JSON_HEDLEY_TI_CL430_VERSION_CHECK -#undef JSON_HEDLEY_TI_CL6X_VERSION -#undef JSON_HEDLEY_TI_CL6X_VERSION_CHECK -#undef JSON_HEDLEY_TI_CL7X_VERSION -#undef JSON_HEDLEY_TI_CL7X_VERSION_CHECK -#undef JSON_HEDLEY_TI_CLPRU_VERSION -#undef JSON_HEDLEY_TI_CLPRU_VERSION_CHECK -#undef JSON_HEDLEY_TI_VERSION -#undef JSON_HEDLEY_TI_VERSION_CHECK -#undef JSON_HEDLEY_UNAVAILABLE -#undef JSON_HEDLEY_UNLIKELY -#undef JSON_HEDLEY_UNPREDICTABLE -#undef JSON_HEDLEY_UNREACHABLE -#undef JSON_HEDLEY_UNREACHABLE_RETURN -#undef JSON_HEDLEY_VERSION -#undef JSON_HEDLEY_VERSION_DECODE_MAJOR -#undef JSON_HEDLEY_VERSION_DECODE_MINOR -#undef JSON_HEDLEY_VERSION_DECODE_REVISION -#undef JSON_HEDLEY_VERSION_ENCODE -#undef JSON_HEDLEY_WARNING -#undef JSON_HEDLEY_WARN_UNUSED_RESULT -#undef JSON_HEDLEY_WARN_UNUSED_RESULT_MSG -#undef JSON_HEDLEY_FALL_THROUGH - - - -#endif // INCLUDE_NLOHMANN_JSON_HPP_ diff --git a/Src/Lib/packages.config b/Src/Lib/packages.config new file mode 100644 index 000000000..ac5e593b6 --- /dev/null +++ b/Src/Lib/packages.config @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/Src/Lib/stdafx.h b/Src/Lib/stdafx.h index 122f46672..9f7676bd1 100644 --- a/Src/Lib/stdafx.h +++ b/Src/Lib/stdafx.h @@ -14,6 +14,7 @@ #include #include +#define _ATL_MODULES // compatibility with /permissive- #define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS // some CString constructors will be explicit #include diff --git a/Src/Localization/Chinese/Main.html b/Src/Localization/Chinese/Main.html index f6a23616c..493cf8ad7 100644 --- a/Src/Localization/Chinese/Main.html +++ b/Src/Localization/Chinese/Main.html @@ -33,7 +33,7 @@

系统要求

组件


Open-Shell 包含三个组件: diff --git a/Src/Localization/Chinese/OpenShell.hhp b/Src/Localization/Chinese/OpenShell.hhp index 323719722..29d77f23b 100644 --- a/Src/Localization/Chinese/OpenShell.hhp +++ b/Src/Localization/Chinese/OpenShell.hhp @@ -5,11 +5,11 @@ Contents file=OpenShellTOC.hhc Default topic=Main.html Display compile progress=Yes Language=0x409 English (United States) - +Title=Open-Shell Help [FILES] ClassicExplorer.html -Menu.html +StartMenu.html ClassicIE.html [INFOTYPES] diff --git a/Src/Localization/Chinese/OpenShellTOC.hhc b/Src/Localization/Chinese/OpenShellTOC.hhc index 9835e2363..cbbb5bb83 100644 --- a/Src/Localization/Chinese/OpenShellTOC.hhc +++ b/Src/Localization/Chinese/OpenShellTOC.hhc @@ -15,51 +15,51 @@
  • - +
    • - +
    • - +
    • - - + +
    • - - + +
    • - +
    • - +
    • - +
    • - +
    • - +
    • - +
  • diff --git a/Src/Localization/Chinese/Menu.html b/Src/Localization/Chinese/StartMenu.html similarity index 99% rename from Src/Localization/Chinese/Menu.html rename to Src/Localization/Chinese/StartMenu.html index 497350ae3..039c2e096 100644 --- a/Src/Localization/Chinese/Menu.html +++ b/Src/Localization/Chinese/StartMenu.html @@ -209,7 +209,7 @@

    管理员设置


    在这个例子中,设置“启用右键菜单“一直锁定,任何用户都不能改变。这是实现 -通过添加设置 HKEY_LOCAL_MACHINE\SOFTWARE\OpenShell\Menu registry key. 创建一个 DWORD 值叫 "EnableContextMenu" 并且设置为 0.
    +通过添加设置 HKEY_LOCAL_MACHINE\SOFTWARE\OpenShell\StartMenu registry key. 创建一个 DWORD 值叫 "EnableContextMenu" 并且设置为 0.

    在某些情况下,您可能不希望锁定为所有用户的值,只是修改初始值的设置。在这样的情况下添加“默认”名称的值。例如如果你想上下文菜单默认为禁用,但仍允许用户启用它,如果他们愿意,创建一个DWORD值命名为“EnableContextMenu_Default”并将它设置为0。

    diff --git a/Src/Localization/Chinese/images/OpenShell.png b/Src/Localization/Chinese/images/OpenShell.png index 1c1786845..228453efc 100644 Binary files a/Src/Localization/Chinese/images/OpenShell.png and b/Src/Localization/Chinese/images/OpenShell.png differ diff --git a/Src/Localization/ChineseTW/Main.html b/Src/Localization/ChineseTW/Main.html index d66f3fb4d..7e91858b1 100644 --- a/Src/Localization/ChineseTW/Main.html +++ b/Src/Localization/ChineseTW/Main.html @@ -39,7 +39,7 @@


    Open-Shell 3 ӥDn: diff --git a/Src/Localization/ChineseTW/OpenShell.hhp b/Src/Localization/ChineseTW/OpenShell.hhp index be8ce5caa..bea8a6fd9 100644 --- a/Src/Localization/ChineseTW/OpenShell.hhp +++ b/Src/Localization/ChineseTW/OpenShell.hhp @@ -6,11 +6,11 @@ Default Font= Default topic=Main.html Display compile progress=Yes Language=0x404 (cAxW) - +Title=Open-Shell Help [FILES] ClassicExplorer.html -Menu.html +StartMenu.html ClassicIE.html [INFOTYPES] diff --git a/Src/Localization/ChineseTW/OpenShellTOC.hhc b/Src/Localization/ChineseTW/OpenShellTOC.hhc index c8da1397e..109c7e3cb 100644 --- a/Src/Localization/ChineseTW/OpenShellTOC.hhc +++ b/Src/Localization/ChineseTW/OpenShellTOC.hhc @@ -15,51 +15,51 @@
  • - +
    • - +
    • - +
    • - - + +
    • - - + +
    • - +
    • - +
    • - +
    • - +
    • - +
    • - +
  • diff --git a/Src/Localization/ChineseTW/Menu.html b/Src/Localization/ChineseTW/StartMenu.html similarity index 99% rename from Src/Localization/ChineseTW/Menu.html rename to Src/Localization/ChineseTW/StartMenu.html index 7c03963d3..486837d4f 100644 --- a/Src/Localization/ChineseTW/Menu.html +++ b/Src/Localization/ChineseTW/StartMenu.html @@ -156,7 +156,7 @@

    ]wOCӨϥΪ̥BsbnɡC w]CӨϥΪ̯sҦ]wC tκ޲zww]wA]SϥΪ̯s:

    -bdҡA]wuҥΥk\vwlפBϥΪ̵LkܧC oOzL[J]w HKEY_LOCAL_MACHINE\SOFTWARE\OpenShell\Menu nɾXӹFC إߦW٬uEnableContextMenuv DWORD Ȩó] 0C
    +bdҡA]wuҥΥk\vwlפBϥΪ̵LkܧC oOzL[J]w HKEY_LOCAL_MACHINE\SOFTWARE\OpenShell\StartMenu nɾXӹFC إߦW٬uEnableContextMenuv DWORD Ȩó] 0C

    YDZΤUziणnwҦϥΪwƭȡAӥuO²檺ק]wlȡC bΫhbƭȪW٥[Ju_DefaultvC ҦpApGznw]Τe\\ϥΪ̵ݭnҥΡAإߦW٬uEnableContextMenu_Defaultv DWORD Ȩó] 0C

    diff --git a/Src/Localization/English/ButtonTutorial.html b/Src/Localization/English/ButtonTutorial.html new file mode 100644 index 000000000..8bb0a9c09 --- /dev/null +++ b/Src/Localization/English/ButtonTutorial.html @@ -0,0 +1,143 @@ + + + + Custom Start Buttons + + +

    Custom Start Buttons Tutorial

    +
    +

    Simple Start Buttons

    +A custom start button requires an image that contains 3 distinct parts one for the normal state of the button, one for the hot state (when the mouse is over the button), and one for the pressed state. The 3 parts must be the same size. +
    +
    + +
    +
    +By default the width of the start button equals the width of the image. The height of the button is the height of the image divided by 3. You can scale the image by overriding the width of the button from the Open-Shell settings. The height will be adjusted to preserve the aspect ratio. +
    +
    +The image must be saved in either PNG or BMP format (including 32-bit BMP files). For best results use an image editor that supports transparency, like Photoshop, Gimp or Paint .NET. +
    +
    +

    Where to download

    +You can find many start button images on the Internet. Here are some of the places: +
    +http://www.classicshell.net/forum/viewforum.php?f=18 +
    +https://www.sevenforums.com/themes-styles/34951-custom-start-menu-button-collection.html +
    +https://www.sevenforums.com/customization/78291-big-group-custom-start-orbs.html +
    +https://tutoriales13.deviantart.com/art/Orbs-153450418 +
    +https://www.deviantart.com/?q=start+button+orb +
    +
    +

    Animated Buttons

    +Open-Shell does support animated start buttons. They contain animated transitions between the different states. +
    +
    +The animated image consists of one or more rows of pixels that describe the animation, followed by one or more button frames. The description rows need to be fully opaque (A=255). The frames are counted from 0 frame0, frame1, .... All frames must be the same size. +
    +
    + +
    +
    +

    Main information (stored in the first 6 pixels)

    +The first two pixels of the first row need to be: +
    + Pixel 0: color R=65, G=78, B=77 (This is the text ANM in ASCII) +
    + Pixel 1: color R=66, G=84, B=78 (This is the text BTN in ASCII) +
    +They allow the start button to recognize that this image contains animation. +
    +
    +The next pixel describes the number of frames and the number of description rows: +
    + Pixel 2: The red channel contains the number of description rows (usually 1). The blue channel contains the number of total frames in the bitmap (this limits the number of frames to 255). +
    +If one row is not enough to describe the animations, it can continue on two or more rows. +
    +The contents of this pixel and the total size of the image determine the size of the individual frame. The number of description rows (red channel) is subtracted by the total height of the image, and then it is divided by the number of frames (blue channel). +
    +
    +The next 3 pixels contain the frames for the 3 distinct states of the start button Normal, Hot and Pressed. +
    + Pixel 3: The blue channel contains the index of the frame for the Normal state (usually 0) +
    + Pixel 4: The blue channel contains the index of the frame for the Hot state +
    + Pixel 5: The blue channel contains the index of the frame for the Pressed state +
    +
    + +
    +
    +

    Transitions

    +The rest of the pixels describe the transitions between the different states, in this order: +
    +
      +
    1. Normal to Hot
    2. +
    3. Hot to Normal
    4. +
    5. Normal to Pressed
    6. +
    7. Pressed to Normal
    8. +
    9. Hot to Pressed
    10. +
    11. Pressed to Hot
    12. +
    +The blue channel of the first pixel of each transition contains the duration of the animation in 1/60th of a second (so 60 means 1 second). If this is 0, then there is no transition. +
    +The green channel contains the number of frame ranges that follow. If this is 0, then the transition is a direct transition from the start state to the end state. +
    +The red channel is 1 for the default behavior to cross-blend between frames and 0 to disable blending. +
    +
    +The next few pixels contain pairs or frame ranges that make up the animation between the states. Their count is in the green channel of the first pixel of the transition. The first frame in the range is in the blue channel and the last frame is in the red channel. If the first and last frame of the range are different, then both frames and all frames between them are included. +
    +
    +If the first and the last frame are the same, then the range identifies a single frame. This allows for precise selection of each frame of the animation. +
    +
    + +
    +
    +In this example the Normal to Hot animation contains frames from 0 to 10. They play for 0.3 seconds and allow blending between frames. The Hot to Normal animation is the same but in reverse it plays from frame 10 to frame 0. +
    +The other 4 transitions are empty. +
    +
    +

    Open-Shell Limitations

    +While the format is very flexible and allows for custom animations between all states, Open-Shell does not support all features. +
    +
      +
    1. It only supports animations between the Normal and Hot states. Any transitions involving the Pressed state are instant to improve responsiveness +
      +
      +
    2. +
    3. The animations between Normal and Hot must use the same (or similar) frames in both directions. Potentially the two transitions can play at different speed. The reason is that at any point during the animation it can be interrupted and the opposite animation will start from the current frame. This can happen when the mouse moves in and out of the start button +
      +
    4. +
    +
    +The system also allows you to create a button with a single image. Just set pixels from 3 to 11 to 0. Then frame 0 will be used for all states. +
    + + \ No newline at end of file diff --git a/Src/Localization/English/ClassicExplorer.html b/Src/Localization/English/ClassicExplorer.html index 3d0eb8a4a..496a86b4e 100644 --- a/Src/Localization/English/ClassicExplorer.html +++ b/Src/Localization/English/ClassicExplorer.html @@ -6,16 +6,21 @@ Classic Explorer -

    Open-Shell website  Classic Explorer


    -Classic +Open-Shell website

      Classic Explorer


    +Classic Explorer is a plugin for Windows Explorer that:
      @@ -41,7 +46,7 @@

      New copy UI (Windows 7 only)
      +

      Classic copy UI (Windows 7 only)

      In Vista when you copy files and there is a conflict you are presented @@ -49,7 +54,7 @@

      New copy UI (Windows 7 only)

      -Before
      +Before

      What’s wrong with it?

      @@ -59,8 +64,8 @@

      New copy UI (Windows 7 only)
      move the mouse around to discover the UI like in a Lucas Arts adventure game. And finally the keyboard usability is awful. To tell it -“yes, I know what I’m doing, I want to overwrite all files” you have to -press Alt+D, up, up, up, Space! It is harder than performing the Akuma +“yes, I know what I’m doing, I want to overwrite all files” you have to +press Alt+D, up, up, up, Space! It is harder than performing the Akuma Kara Demon move in Street Fighter 3. There is a time and a place for that stuff and copying files is not it.

      @@ -68,14 +73,14 @@

      New copy UI (Windows 7 only)

      The Classic Explorer plugin brings back the simpler dialog box from Windows XP:

      -

      After
      +

      After

      It is immediately clear what is clickable (clue – the buttons at the -bottom), there is easy keyboard navigation (press Y for “Yes”, A to +bottom), there is easy keyboard navigation (press Y for “Yes”, A to copy all files) and you can still see which file is newer and which is -larger. And of course just like in Windows XP, holding down Shift while clicking on the No button means "No to All" (or just press Shift+N).
      +larger. And of course just like in Windows XP, holding down Shift while clicking on the No button means "No to All" (or just press Shift+N).

      If you click @@ -117,12 +122,12 @@

      Toolbar for Windows Explorer

      To solve the problem, the Classic Explorer plugin adds a new toolbar:

      Explorer Toolbar
      Explorer Toolbar

      The available button are: Go Up, Cut, Copy, Paste, Delete, Properties, Email, Settings. More buttons can be added from the Settings dialog.

      -Hints:
      +Hints:
          - Hold the Control key when clicking the Up button to open the parent folder in a new Explorer window.
          - Hold the Shift key when clicking the Delete button to permanently delete a file
      @@ -131,7 +136,7 @@

      Toolbar for Windows Explorer

      The new toolbar doesn’t show up in Explorer automatically after installation. You have to do a few things before you can use it:
      -
        +
        1. Open a new Windows Explorer window (Win key+E)
        2. Turn on the menu in Explorer – Go to Tools (Alt+T), Folder @@ -154,7 +159,7 @@

          Status bar

          Classic Explorer restores the original Explorer status bar that shows the free disk space and the size of the selected files:

          -File size in status bar
          +File size in status bar

          Unlike the built-in status bar, the selection size is shown even if more than 100 files are selected. When no files are selected the total @@ -166,8 +171,8 @@

          Status bar
          Details Pane you see at the bottom of Explorer. You can turn off the Details Pane from the Organize menu to save space. Also there is a bug in the Windows 7 Explorer that sometimes doesn't show any text in the -status bar. Press F5 to refresh the view and get the status text.
          -
          Windows 8 note: Classic Explorer adds its own +status bar. Press F5 to refresh the view and get the status text.
          +
          Windows 8+ note: Classic Explorer adds its own status bar. You should hide the default status bar to save space. Select the View tab in the ribbon, then click on Options. Select the View tab in the options. Locate the checkbox "Show status bar" and @@ -176,8 +181,8 @@

          Status bar

          -

          Settings

          You can access the settings of Classic Explorer from the toolbar or from the start menu:
          -
          +

          Settings

          You can access the settings of Classic Explorer from the toolbar or from the Start menu:
          +


          You can choose from seeing only the basic settings, or all available settings. Hover over each setting to see a description of what it's for. Type in the search box to find a setting by name.
          @@ -202,10 +207,10 @@

          Settings

          You can access the settings of Classic E
          Here's one example of what can be customized:
          - Title bar tweaks
          + Title bar tweaks

          Click on the Toolbar Buttons tab to customize the toolbar:
          -
          +

          The column on the left shows the current buttons in the toolbar, and the column on the right lists the buttons you can add to the toolbar. You can drag and drop buttons from the right column to the @@ -222,7 +227,7 @@

          Settings

          You can access the settings of Classic E Important Note: Not all available commands have default icons or text. That's because Windows doesn't have icons for things like Undo, Select All, etc. If you want to use such buttons in your toolbar you will have to provide your own icon. See below how to do it.

          After you place a button in the toolbar, you can edit it's attributes. Double-click on the button to edit:
          -Edit toolbar button
          +Edit toolbar button
          Here you can select a command for the button, its text and icon. Press the Restore Defaults button to get the default text and icon for the chosen command.
          The command can be:
            @@ -365,7 +370,7 @@

            Administrative Settings

            The settings are per user and are stored in the registry. By default every user can edit all of their settings. An administrator can lock specific settings, so no user can edit them:
            -
            +
            In this example the setting "Show Up button" is locked to always be "Before Back/Forward" and can't be changed by any user. This is achieved by adding the setting to the HKEY_LOCAL_MACHINE\SOFTWARE\OpenShell\ClassicExplorer registry key. Create a string value called "ShowUpButton" and set it to "BeforeBack".
            @@ -383,7 +388,7 @@

            Administrative Settings

            The settings are
            There is also a global setting EnableSettings. Set it to 0 in the registry to prevent the users from even opening the Settings dialog:
            -Disable all settings
            +Disable all settings

            You can enable or disable Classic Explorer for individual processes using the 2 registry settings "ProcessWhiteList" and diff --git a/Src/Localization/English/ClassicIE.html b/Src/Localization/English/ClassicIE.html index c121d167d..3693fdadf 100644 --- a/Src/Localization/English/ClassicIE.html +++ b/Src/Localization/English/ClassicIE.html @@ -13,45 +13,46 @@ Classic IE -

            Open-Shell website  -Classic IE


            + +Open-Shell website

              Classic IE

            +
            Classic IE
            is a small plugin for Internet Explorer that:
            • Adds a caption to the title -bar so you can see the full title of the page
            • +bar so you can see the full title of a page
            • Shows the security zone in the status bar
            • Shows the loading progress in the status bar

            See the full page title even when it doesn't fit in the tab:
            -
            +

            See the progress and the security zone:
            -
            +

            Installation

            When you run Internet Explorer for the first time after installing -Classic IE it may prompt you that a new add-on called ClassicIEBHO is +Classic IE, it may prompt you that a new add-on called ClassicIEBHO is installed and if you want to enable it. Click on the Enable button. If -you don't get a prompt, go to Tools -> Manage add-ons and make sure ClassicIEBHO is enabled. After enabling the add-on you have to restart Internet Explorer to activate the plugin.
            +you don't get a prompt, go to Tools -> Manage add-ons and make sure ClassicIEBHO is enabled. After enabling the add-on, you have to restart Internet Explorer to activate the plugin.

            Settings

            You can access the settings from Tools -> Classic IE Settings -or from the start menu. The settings control the color and the font of +or from the Start menu. The settings control the color and the font of the caption, and what information to display on the status bar.
            -
            +

            You can choose from seeing only the basic settings, or all available settings. Hover over each setting to see a description of what it's for. Type in the search box to find a setting by name.
            @@ -80,20 +81,20 @@

            Administrative Settings

            no user can edit them. This is achieved by adding the setting to the HKEY_LOCAL_MACHINE\SOFTWARE\OpenShell\ClassicIE registry key.

            You may also wish to not lock the setting but only override its initial -value. Then add "_Default" to the name of the registry value.
            +value. Do this by adding "_Default" to the name of the registry value.

            The easiest way to know the registry name of a setting and its value is to modify it, and then look it up in HKEY_CURRENT_USER\Software\OpenShell\ClassicIE\Settings.
            Sometimes you may want to lock a setting to its default value, but you -don't know what the default value is. Then create a DWORD value and set +don't know what the default value is. Do this by creating a DWORD value and setting it to 0xDEFA.

            There is also a global setting EnableSettings. Set it to 0 in the -registry to prevent the users from even opening the Settings dialog:
            +registry to prevent the users from opening the Settings dialog:
            -
            +

            Editing the settings through group policies is also supported. Extract the file PolicyDefinitions.zip found in the installation folder and read the document PolicyDefinitions.rtf for more details.

            diff --git a/Src/Localization/English/License.html b/Src/Localization/English/License.html index ae628eab6..cfe3306e9 100644 --- a/Src/Localization/English/License.html +++ b/Src/Localization/English/License.html @@ -6,18 +6,20 @@ License Agreement -

            Open-Shell website  License Agreement
            -


            -Open-Shell 2009-2017, Ivo Beltchev

            -http://www.classicshell.net/
            +Open-Shell website

              License Agreement

            + +Classic Shell © 2009-2017, Ivo Beltchev http://www.classicshell.net/
            + +Open-Shell © 2017-2018, The Open-Shell Team https://github.com/Open-Shell

            BY USING THIS SOFTWARE, YOU ACCEPT THESE TERMS. IF YOU DO NOT ACCEPT THEM, DO NOT USE THE SOFTWARE.

            @@ -48,9 +50,8 @@

            IN OTHER WORDS: -Basically you can use this software freely for any purpose but don’t be -surprised if it doesn’t work as you expect. You can’t hold the author -responsible for any damages that come to you from using the software. +You can use this software freely for any purpose, however it is not the author's +responsiblity for any damages that come from using the software. You can’t profit from selling this software. You got it for free after all.

            diff --git a/Src/Localization/English/Links.html b/Src/Localization/English/Links.html index 36f21b45c..589bcc149 100644 --- a/Src/Localization/English/Links.html +++ b/Src/Localization/English/Links.html @@ -7,33 +7,32 @@ Open-Shell -

            Open-Shell website  Links


            The latest version can be found on the Open-Shell website:
            -http://www.classicshell.net/
            -
            -View the project history here:
            -History: http://www.classicshell.net/history/
            -
            -
            -

            Get Help

            -For answers to frequently asked questions look here:
            -FAQ: http://www.classicshell.net/faq/
            +Open-Shell website

              Links

            +
            The latest version can be found on the Open-Shell website:
            +https://github.com/Open-Shell/Open-Shell-Menu/releases/latest/

            -If you don't find your answer in the FAQ, try the discussion forums:
            -Discussion Forums: http://www.classicshell.net/forum/viewforum.php?f=6
            +

            Get Help

            +Discussion forums:
            +https://github.com/Open-Shell/Open-Shell-Menu/discussions

            -
            -

            Report Problems

            +

            Report a Problem

            Report bugs and feature requests in the development forums:
            -Development Forums: http://www.classicshell.net/forum/viewforum.php?f=11
            +https://github.com/Open-Shell/Open-Shell-Menu/issues
            diff --git a/Src/Localization/English/Main.html b/Src/Localization/English/Main.html index ce136c631..b44b117c9 100644 --- a/Src/Localization/English/Main.html +++ b/Src/Localization/English/Main.html @@ -2,48 +2,47 @@ - - - - - - + + + + + Open-Shell -

            Open-Shell website  Open-Shell

            -Version 4.3.1 – general release

            -

            What is Open-Shell?

            -Open-Shell™ is a collection of usability enhancement for Windows. It -has a customizable Start menu and Start button, it adds a -toolbar for Windows Explorer and supports a variety of smaller features.
            -
            +Open-Shell website

              Open-Shell

            +

            What is Open-Shell?

            +Open-Shell™ is a collection of usability enhancements for Windows. It +has a customizable Start menu and Start button, adds a +toolbar for Windows Explorer, and supports a variety of smaller features.

            -

            System Requirements

            -Open-Shell works on Windows 7, Windows 8, Windows 8.1, Windows Server 2008 R2, -Windows Server 2012 and Windows Server 2012 R2. Both 32 and 64-bit versions are -supported (the same installer works for both). Some skins for the start menu -require Aero theme to be enabled. Others require at least Basic theme.
            +

            System Requirements

            +Open-Shell works on Windows 7, Windows 8, Windows 8.1, Windows 10, and Windows 11, along with their server counterparts. Both 32 and 64-bit versions are +supported (the same installer works for both).

            -
            -

            Components


            - +

            Components

            Open-Shell has three major components:
            -

            Uninstallation

            -You can uninstall Open-Shell from Control Panel -> Programs and Features. Another way is  to run the setup again and chose "Remove".
            +

            Uninstallation

            +You can uninstall Open-Shell from Control Panel -> Programs and Features. Another way is to run the setup again and choose "Remove".
            A logoff may be required to complete the process.

            diff --git a/Src/Localization/English/MenuADMX.txt b/Src/Localization/English/MenuADMX.txt index 712f70eaf..a86ff27a2 100644 --- a/Src/Localization/English/MenuADMX.txt +++ b/Src/Localization/English/MenuADMX.txt @@ -190,3 +190,4 @@ StartHoverDelay.nameOverride = Hover delay (for Start button) AllProgramsDelay.nameOverride = Hover delay (for All Programs in Windows 7) CSMHotkey.tipAddition = .\n\nThe base value is the main key's virtual code. Add 256 for Shift, 512 for Control and 1024 for Alt.\nThe best way to get the value is to select the hotkey in the Open-Shell Menu settings dialog and then look up the value named CSMHotkey in HKCU\Software\OpenShell\StartMenu\Settings WSMHotkey.tipAddition = .\n\nThe base value is the main key's virtual code. Add 256 for Shift, 512 for Control and 1024 for Alt.\nThe best way to get the value is to select the hotkey in the Open-Shell Menu settings dialog and then look up the value named WSMHotkey in HKCU\Software\OpenShell\StartMenu\Settings +SearchFiles.tipOverride = When this is checked, the search results will include files, emails and other items from indexed locations diff --git a/Src/Localization/English/OpenShell.hhp b/Src/Localization/English/OpenShell.hhp index 323719722..cf641de9f 100644 --- a/Src/Localization/English/OpenShell.hhp +++ b/Src/Localization/English/OpenShell.hhp @@ -5,12 +5,11 @@ Contents file=OpenShellTOC.hhc Default topic=Main.html Display compile progress=Yes Language=0x409 English (United States) - +Title=Open-Shell Help [FILES] ClassicExplorer.html -Menu.html +StartMenu.html ClassicIE.html [INFOTYPES] - diff --git a/Src/Localization/English/OpenShellEULA.rtf b/Src/Localization/English/OpenShellEULA.rtf index dde44156e..8c3c08114 100644 Binary files a/Src/Localization/English/OpenShellEULA.rtf and b/Src/Localization/English/OpenShellEULA.rtf differ diff --git a/Src/Localization/English/OpenShellReadme.rtf b/Src/Localization/English/OpenShellReadme.rtf index de2d4e631..7435293bc 100644 --- a/Src/Localization/English/OpenShellReadme.rtf +++ b/Src/Localization/English/OpenShellReadme.rtf @@ -1,86 +1,82 @@ -{\rtf1\ansi\ansicpg1252\deff0\nouicompat\deflang1033\deflangfe1033{\fonttbl{\f0\froman\fprq2\fcharset0 Cambria;}{\f1\fswiss\fprq2\fcharset0 Calibri;}{\f2\fnil\fcharset2 Symbol;}} -{\colortbl ;\red23\green54\blue93;\red79\green129\blue189;\red0\green112\blue192;\red0\green0\blue255;\red54\green95\blue145;} +{\rtf1\ansi\ansicpg1252\deff0\nouicompat\deflang1033\deflangfe1033{\fonttbl{\f0\fnil\fcharset0 Segoe UI Semibold;}{\f1\fnil\fcharset0 Segoe UI;}{\f2\fswiss\fprq2\fcharset0 Calibri;}{\f3\fnil\fcharset2 Symbol;}} +{\colortbl ;\red0\green120\blue212;\red43\green136\blue216;\red0\green0\blue255;\red0\green90\blue158;\red54\green95\blue145;\red0\green112\blue192;} {\stylesheet{ Normal;}{\s1 heading 1;}} -{\*\generator Riched20 10.0.17134}{\*\mmathPr\mnaryLim0\mdispDef1\mwrapIndent1440 }\viewkind4\uc1 -\pard\brdrb\brdrs\brdrw20\brsp80 \widctlpar\sa300\qc\cf1\expndtw5\kerning28\f0\fs52 Open-Shell\par +{\*\generator Riched20 10.0.25262}{\*\mmathPr\mdispDef1\mwrapIndent1440 }\viewkind4\uc1 +\pard\brdrb\brdrs\brdrw20\brsp80 \widctlpar\sa300\qc\cf1\expndtw5\kerning28\f0\fs44 Open-Shell\cf0\expndtw0\f1\fs22\par -\pard\widctlpar\cf0\expndtw0\b0\i0\f1\fs22\par -Thank you for installing \cf3\b Open-Shell\'99\cf0\b0 . It adds some missing features to Windows 7, Windows 8, Windows 8.1 and Windows 10 - like a classic start menu, start button, a toolbar for Windows Explorer and others.\par +\pard\widctlpar Thank you for installing \cf2\b Open-Shell\'99\cf0\b0 . It adds some missing features to Windows 7, Windows 8, Windows 8.1 and Windows 10, like a classic Start menu, Start button, a toolbar for Windows Explorer and more.\par \par The latest version can be found on the Open-Shell website:\par -{{\field{\*\fldinst{HYPERLINK http://www.classicshell.net/ }}{\fldrslt{http://www.classicshell.net/\ul0\cf0}}}}\f1\fs22\par +{{\field{\*\fldinst{HYPERLINK https://github.com/Open-Shell/Open-Shell-Menu }}{\fldrslt{https://github.com/Open-Shell/Open-Shell-Menu\ul0\cf0}}}}\f1\fs22\par \par -For answers to frequently asked questions look here:\par -{{\field{\*\fldinst{HYPERLINK http://www.classicshell.net/faq/ }}{\fldrslt{http://www.classicshell.net/faq/\ul0\cf0}}}}\f1\fs22\par -\par -Or use the discussion forums to get help:\par -{{\field{\*\fldinst{HYPERLINK http://www.classicshell.net/forum/viewforum.php?f=6 }}{\fldrslt{http://www.classicshell.net/forum/viewforum.php?f=6\ul0\cf0}}}}\f1\fs22\par +Use the discussion forums to get help:\par +{{\field{\*\fldinst{HYPERLINK https://github.com/Open-Shell/Open-Shell-Menu/discussions }}{\fldrslt{https://github.com/Open-Shell/Open-Shell-Menu/discussions\ul0\cf0}}}}\f1\fs22\par \par Report problems in the Open-Shell development forums:\par -{{\field{\*\fldinst{HYPERLINK http://www.classicshell.net/forum/viewforum.php?f=11 }}{\fldrslt{http://www.classicshell.net/forum/viewforum.php?f=11\ul0\cf0}}}}\f1\fs22\par +{{\field{\*\fldinst{HYPERLINK https://github.com/Open-Shell/Open-Shell-Menu/issues }}{\fldrslt{https://github.com/Open-Shell/Open-Shell-Menu/issues\ul0\cf0}}}}\f1\fs22\par \par -\pard\keep\keepn\widctlpar\s1\sb480\sl276\slmult1\cf5\b\f0\fs28 Open-Shell Menu\par +\pard\keep\keepn\widctlpar\s1\sb480\sl276\slmult1\cf4\f0\fs28 Open-Shell Menu\cf5\f1\par -\pard\widctlpar\cf0\b0\f1\fs22\par -\cf3\b Open-Shell Menu\cf0 \b0 is a flexible start menu that can mimic the menu behavior of Windows 2000, XP and Windows 7. It has a variety of advanced features:\par +\pard\widctlpar\cf0\fs22\par +\cf2\b Open-Shell Menu \cf0\b0 is a flexible start menu that can mimic the menu behavior of Windows 2000, XP and Windows 7. It has a variety of advanced features:\par \par -\pard{\pntext\f2\'B7\tab}{\*\pn\pnlvlblt\pnf2\pnindent0{\pntxtb\'B7}}\widctlpar\fi-360\li720 Choose between \ldblquote Classic\rdblquote and \ldblquote Windows 7\rdblquote styles\par -{\pntext\f2\'B7\tab}Drag and drop to let you organize your applications\par -{\pntext\f2\'B7\tab}Options to show Favorites, expand Control Panel, etc\par -{\pntext\f2\'B7\tab}Shows recently used documents. The number of documents to display is customizable\par -{\pntext\f2\'B7\tab}Translated in 35 languages, including Right-to-left support for Arabic and Hebrew\par -{\pntext\f2\'B7\tab}Does not disable the original start menu in Windows. You can access it by Shift+Click on the start button\par -{\pntext\f2\'B7\tab}Right-click on an item in the menu to delete, rename, sort, or perform other tasks\par -{\pntext\f2\'B7\tab}The search box helps you find your programs and files without getting in the way of your keyboard shortcuts\par -{\pntext\f2\'B7\tab}Supports jumplists for easy access to recent documents and common tasks\par -{\pntext\f2\'B7\tab}Available for 32 and 64-bit operating systems\par -{\pntext\f2\'B7\tab}Has support for skins, including additional 3rd party skins. Make your own!\par -{\pntext\f2\'B7\tab}Fully customizable in both looks and functionality\par -{\pntext\f2\'B7\tab}Support for Microsoft\rquote s Active Accessibility\par -{\pntext\f2\'B7\tab}Converts the \ldblquote All Programs\rdblquote button in the Windows menu into a cascading menu\par -{\pntext\f2\'B7\tab}Implements a customizable start button\par -{\pntext\f2\'B7\tab}Can show, search and launch Windows Store apps (Windows 8)\par - -\pard\keep\keepn\widctlpar\s1\sb480\sl276\slmult1\cf5\b\f0\fs28 Classic Explorer\par - -\pard\widctlpar\cf0\b0\f1\fs22\par -\cf3\b Classic Explorer\cf0 \b0 is a plugin for Windows Explorer that:\par +\pard{\pntext\f3\'B7\tab}{\*\pn\pnlvlblt\pnf3\pnindent0{\pntxtb\'B7}}\fi-360\li720 Choose between \ldblquote Classic\rdblquote and \ldblquote Windows 7\rdblquote styles\par +{\pntext\f3\'B7\tab}Drag and drop to let you organize your applications\par +{\pntext\f3\'B7\tab}Options to show Favorites, expand Control Panel, etc\par +{\pntext\f3\'B7\tab}Shows recently used documents. The number of documents to display is customizable\par +{\pntext\f3\'B7\tab}Translated in 35 languages, including Right-to-left support for Arabic and Hebrew\par +{\pntext\f3\'B7\tab}Does not disable the original start menu in Windows. You can access it by Shift+Click on the start button\par +{\pntext\f3\'B7\tab}Right-click on an item in the menu to delete, rename, sort, or perform other tasks\par +{\pntext\f3\'B7\tab}The search box helps you find your programs and files without getting in the way of your keyboard shortcuts\par +{\pntext\f3\'B7\tab}Supports jumplists for easy access to recent documents and common tasks\par +{\pntext\f3\'B7\tab}Available for 32 and 64-bit operating systems\par +{\pntext\f3\'B7\tab}Has support for skins, including additional 3rd party skins. Make your own!\par +{\pntext\f3\'B7\tab}Fully customizable in both looks and functionality\par +{\pntext\f3\'B7\tab}Support for Microsoft\rquote s Active Accessibility\par +{\pntext\f3\'B7\tab}Converts the \ldblquote All Programs\rdblquote button in the Windows menu into a cascading menu\par +{\pntext\f3\'B7\tab}Implements a customizable start button\par +{\pntext\f3\'B7\tab}Can show, search and launch Windows Store apps (Windows 8)\par + +\pard\keep\keepn\widctlpar\s1\sb480\sl276\slmult1\cf4\f0\fs28 Classic Explorer\cf5\f1\par + +\pard\widctlpar\cf0\fs22\par +\cf2\b Classic Explorer \cf0\b0 is a plugin for Windows Explorer that:\par \par -\pard{\pntext\f2\'B7\tab}{\*\pn\pnlvlblt\pnf2\pnindent0{\pntxtb\'B7}}\widctlpar\fi-360\li720 Adds a toolbar to Explorer for some common operations (Go to parent folder, Cut, Copy, Paste, Delete, Properties, Email). The toolbar is fully customizable\par -{\pntext\f2\'B7\tab}Replaces the copy UI in Windows 7 with the more user-friendly \ldblquote classic\rdblquote version similar to Windows XP\par -{\pntext\f2\'B7\tab}Handles Alt+Enter in the folder panel of Windows Explorer and shows the properties of the selected folder\par -{\pntext\f2\'B7\tab}Has options for customizing the folder panel to look more like the Windows XP version or to not fade the expand buttons\par -{\pntext\f2\'B7\tab}Can show the free disk space and the total size of the selected files in the status bar\par -{\pntext\f2\'B7\tab}Can disable the breadcrumbs in the address bar\par -{\pntext\f2\'B7\tab}Fixes a long list of features that are broken in Windows 7 \endash missing icon overlay for shared folders, the jumping folders in the navigation pane, missing sorting headers in list view, and more\par +\pard{\pntext\f3\'B7\tab}{\*\pn\pnlvlblt\pnf3\pnindent0{\pntxtb\'B7}}\fi-360\li720 Adds a toolbar to Explorer for some common operations (Go to parent folder, Cut, Copy, Paste, Delete, Properties, Email). The toolbar is fully customizable\par +{\pntext\f3\'B7\tab}Replaces the copy UI in Windows 7 with the more user-friendly \ldblquote classic\rdblquote version similar to Windows XP\par +{\pntext\f3\'B7\tab}Handles Alt+Enter in the folder panel of Windows Explorer and shows the properties of the selected folder\par +{\pntext\f3\'B7\tab}Has options for customizing the folder panel to look more like the Windows XP version or to not fade the expand buttons\par +{\pntext\f3\'B7\tab}Can show the free disk space and the total size of the selected files in the status bar\par +{\pntext\f3\'B7\tab}Can disable the breadcrumbs in the address bar\par +{\pntext\f3\'B7\tab}Fixes a long list of features that are broken in Windows 7 \endash missing icon overlay for shared folders, the jumping folders in the navigation pane, missing sorting headers in list view, and more\par -\pard\keep\keepn\widctlpar\s1\sb480\sl276\slmult1\cf5\b\f0\fs28 Classic IE\par +\pard\keep\keepn\widctlpar\s1\sb480\sl276\slmult1\cf4\f0\fs28 Classic IE\par -\pard\widctlpar\cf0\b0\f1\fs22\par -\cf3\b Classic IE is a plugin for Internet Explorer 9 and later versions that:\par +\pard\widctlpar\cf0\f1\fs22\par +\cf2\b Classic IE is a plugin for Internet Explorer 9 and later versions that:\par \cf0\b0\par -\pard{\pntext\f2\'B7\tab}{\*\pn\pnlvlblt\pnf2\pnindent0{\pntxtb\'B7}}\widctlpar\fi-360\li720 Adds a caption to the title bar so you can see the full title of the page\par -{\pntext\f2\'B7\tab}Shows the security zone in the status bar\par -{\pntext\f2\'B7\tab}Shows the loading progress in the status bar\par +\pard{\pntext\f3\'B7\tab}{\*\pn\pnlvlblt\pnf3\pnindent0{\pntxtb\'B7}}\fi-360\li720 Adds a caption to the title bar so you can see the full title of the page\par +{\pntext\f3\'B7\tab}Shows the security zone in the status bar\par +{\pntext\f3\'B7\tab}Shows the loading progress in the status bar\par -\pard\keep\keepn\widctlpar\s1\sb480\sl276\slmult1\cf5\b\f0\fs28 Installation instructions\par +\pard\keep\keepn\widctlpar\s1\sb480\sl276\slmult1\cf4\f0\fs28 Installation Instructions\par -\pard\widctlpar\cf0\b0\f1\fs22\par +\pard\widctlpar\cf0\f1\fs22\par The toolbar for Windows Explorer may not show up automatically after installation. You have to do a few things before you can use it.\par \par -\cf3\b Windows 7:\cf0\b0 Press Alt+V to open the View menu. Open the \ldblquote Toolbars\rdblquote sub-menu and select \ldblquote Classic Exlporer Bar\rdblquote . Keep in mind that the menu will always be displayed as long as the toolbar is visible.\par +\cf6\b Windows 7:\cf0\b0 Press Alt+V to open the View menu. Open the \ldblquote Toolbars\rdblquote sub-menu and select \ldblquote Classic Exlporer Bar\rdblquote . Keep in mind that the menu will always be displayed as long as the toolbar is visible.\par \par -\cf3\b Windows 8:\cf0\b0 Press Alt+V to open the View ribbon. Click on the down arrow in the \ldblquote Options\rdblquote section. Select \ldblquote Classic Explorer Bar\rdblquote\par +\cf6\b Windows 8:\cf0\b0 Press Alt+V to open the View ribbon. Click on the down arrow in the \ldblquote Options\rdblquote section. Select \ldblquote Classic Explorer Bar\rdblquote\par \par If these steps don\rquote t work, it may be possible that the Explorer extensions have been disabled. Check the following, then try to show the toolbar again:\par \pard {\pntext\f1 1)\tab}{\*\pn\pnlvlbody\pnf1\pnindent0\pnstart1\pndec{\pntxta)}} -\widctlpar\fi-360\li720 Open Internet Explorer and go to Tools -> Manage add-ons. Locate the add-ons \ldblquote Classic Explorer Bar\rdblquote and \ldblquote ExplorerBHO Class\rdblquote and make sure they are enabled.\par +\fi-360\li720 Open Internet Explorer and go to Tools -> Manage add-ons. Locate the add-ons \ldblquote Classic Explorer Bar\rdblquote and \ldblquote ExplorerBHO Class\rdblquote and make sure they are enabled.\par {\pntext\f1 2)\tab}Maybe the browser extensions are disabled on your system. This is usually the default for Windows Server. Open the "Internet Options", go to the "Advanced" tab, and check the option "Enable third-party browser extensions".\par \pard\widctlpar\par @@ -89,18 +85,18 @@ On Windows 8 the Classic Explorer status bar is different from the one in Explor \par The caption in Internet Explorer may not show up automatically after installation. You may get a prompt to enable the ClassicIEBHO plugin. If you get the prompt, select \ldblquote Enable\rdblquote . If you don\rquote t get a prompt, go to Tools -> Manage add-ons and make sure the add-on \ldblquote ClassicIEBHO\rdblquote is enabled. After that restart Internet Explorer.\par -\pard\keep\keepn\widctlpar\s1\sb480\sl276\slmult1\cf5\b\f0\fs28 Uninstallation\par +\pard\keep\keepn\widctlpar\s1\sb480\sl276\slmult1\cf4\b\f0\fs28 Uninstallation\par \pard\widctlpar\cf0\b0\f1\fs22\par -To uninstall \cf3\b Open-Shell\cf0\b0 follow these steps:\par +To uninstall \cf2\b Open-Shell\b0 \cf0 follow these steps:\par \pard {\pntext\f1 1)\tab}{\*\pn\pnlvlbody\pnf1\pnindent0\pnstart1\pndec{\pntxta)}} -\widctlpar\fi-360\li720 Open \b Control Panel -> Programs and Features\b0 and double-click on \b Open-Shell\b0 . Then follow the instructions. You may have to restart Windows to complete the process.\par -{\pntext\f1 2)\tab}If you installed any additional skins for the start menu you will have to delete them manually\par +\fi-360\li720 Open \b Control Panel -> Programs and Features\b0 and double-click on \b Open-Shell\b0 . Then follow the instructions. You may have to restart Windows to complete the process.\par +{\pntext\f1 2)\tab}If you installed any additional skins for the start menu you will have to delete them manually.\par -\pard\widctlpar\par +\pard\widctlpar\f2\par \pard\widctlpar\sa200\sl276\slmult1\par } - + \ No newline at end of file diff --git a/Src/Localization/English/OpenShellTOC.hhc b/Src/Localization/English/OpenShellTOC.hhc index 9835e2363..8797f8fdb 100644 --- a/Src/Localization/English/OpenShellTOC.hhc +++ b/Src/Localization/English/OpenShellTOC.hhc @@ -15,51 +15,65 @@
  • - +
    • - +
    • - +
    • - - + +
    • - - + +
    • - + + +
        +
      • + + + +
    • - +
    • - + + +
        +
      • + + + +
    • - +
    • - +
    • - +
  • diff --git a/Src/Localization/English/OpenShellText-en-US.wxl b/Src/Localization/English/OpenShellText-en-US.wxl index dd4bc0213..4a1941857 100644 --- a/Src/Localization/English/OpenShellText-en-US.wxl +++ b/Src/Localization/English/OpenShellText-en-US.wxl @@ -1,6 +1,7 @@ This installer is only for 32-bit version of Windows. For 64-bit Windows you need to run Setup64. + This installer is only for 64-bit version of Windows. For ARM64 Windows you need to run SetupARM64. Open-Shell requires Windows 7 or above. A newer version of [ProductName] is already installed. The setup will now exit. Classic Explorer diff --git a/Src/Localization/English/SkinTutorial.html b/Src/Localization/English/SkinTutorial.html new file mode 100644 index 000000000..a2ca5df55 --- /dev/null +++ b/Src/Localization/English/SkinTutorial.html @@ -0,0 +1,2204 @@ + + + + Start Menu Skinning + + +

    Start Menu Skinning Tutorial

    +
    +

    Introduction

    Open-Shell supports skin files for the start menu. The skin can change things like: +
    +
      +
    • The background image or color of the menu
    • +
    • The font and text color for various elements
    • +
    • Arrows and other icons
    • +
    • Sizes, padding and alignment
    • +
    • The image to use for the menu separators
    • +
    +
    +All information about a skin is stored in a .skin or a .skin7 file (the .skin7 files are for use by the Windows 7 style). The skin files must be installed in the Skins directory of Open-Shell (for example C:\Program Files\Open-Shell\Skins). +
    +
    +Tutorial Contents: +
    + +
    +
    +

    Anatomy of a skin file

    +The skin file is a DLL that contains specific resources like bitmaps, icons, etc. The only mandatory resource is a text resource with ID=1 and type="SKIN". It is the text that describes the skin. The description can refer to other resources like bitmaps and icons. +
    +
    +The easiest way to create a new skin is to start from an existing .skin file. Make a copy of one of the default skins and save it under a new name. Then open it in Visual Studio's resource editor, or another resource editor like Resource Hacker: +
    +
    +Skin file +
    +
    +A great feature of Resource Hacker is that it lets you edit the text directly inside. When you are done, press the "Compile Script" button, then save the file. +
    +Note: Keep in mind that often the Skins folder is protected by the OS. If you want to use a tool to edit a file directly in that folder, the tool must be started as Administrator. +
    +
    +To replace a bitmap resource, select Action > Replace Bitmap. Then pick your new bitmap file, pick the ID of the bitmap resource you want to replace, click Replace and save. You can replace an icon resource in a similar way. +
    +
    +To add a new bitmap, select Action > Add a new Resource. Pick the new bitmap file, enter a new name (must be a number), and you can leave the language blank. Finally click Add Resource and save. +
    +
    +
    +

    Bitmaps

    +The start menu uses various bitmap resources for its graphical elements. Every bitmap in the menu has a name for its setting (for example "Main_pager_arrows" or "Search_bitmap"). You specify the bitmap resource with the setting <name>=<resource index>. For example: +
    + +
    +Main_bitmap=1
    use bitmap resource with index 1 +
    +
    +You can use BMP, PNG and JPG images as resources. Put BMP files into the BITMAP resource section. Put PNG and JPG files into the IMAGE resource section. The menu will first search the BITMAP section for the given resource index, and then the IMAGE section. +
    +BMP and PNG images can have alpha channels to support transparency. JPG images are always opaque, and of course, of lower quality. +
    +
    +A bitmap can optionally have a color mask. The mask determines how the bitmap is mixed with up to 3 additional colors, called "tint colors". The Red channel of the mask controls how much of the first tint color to mix in, the Green channel controls the second tint color and the Blue channel controls the third tint color. By default the first tint color is the system window (Glass) color, and the second tint color is the menu background color. +
    +The mask only applies to the RGB portion of the bitmap. The Alpha channel remains unchanged: +
    +
    +Color masks +
    +In this example the first image is the background, the second is the mask and the third is the end result. The red portions of the mask blend the glass color (purple) with the background. The green portions blend the menu color (gray) with the background. By varying the intensity of red and green in the mask image we control how much the colors are blended. +
    +
    +The mask can be specified in one of two ways either <bitmap>_mask=<resource index> or <bitmap>_mask=#RRGGBB (a color in hexadecimal format). If the mask is a bitmap it must have the same dimensions as the main bitmap. Some examples: +
    + +
    +Main_bitmap_mask=2 use a bitmap resource with index 2
    +Main_bitmap_mask=#FF0000 use a fixed color with Red=255, Green=0, Blue=0
    +
    +
    +To change the tint color: +
    +
    +Main_bitmap_tint1=#000000 The first tint color is black
    +Main_bitmap_tint2=#808080 The second tint color is gray
    +
    +
    +The main bitmap can also be a solid color. If both the bitmap and the mask are solid colors, the end result is a solid-color bitmap that is the result of the bitmap color and the tint colors all mixed together according to the mask. +
    +If the main bitmap is a solid color and the mask is a bitmap, then the dimensions of the mask bitmap determine the dimensions of the final bitmap. In this case the alpha channel of the mask is used as alpha channel of the result. +
    +
    +The masks and tint colors are a powerful system that allows you to achieve a large variation of possibilities without the need for a large number of bitmap resources. For good examples how to use the color tints, look at the Metro skin. +
    +
    +See the reference section at the end for the supported bitmaps.
    +
    +

    Named colors

    +Everywhere a solid color is accepted, you can use one of the predefined named colors. The actual color at any given moment will depend on the current Windows settings. Using named colors allows you to create skins that follow the current Windows color scheme. +
    +
    +A small number of colors are system colors for classic window elements like button color, text highlight color, and so on. For example: +
    +
    +Main_bitmap=$SystemActiveBorder use the system active border color
    +
    +You can see a full list of those system colors in the reference section. +
    +
    +The rest of the named colors are only available on Windows 8 and up. They come from the Metro palette, which is a complete set of hundreds of named colors, designed to look good together. +
    +
    +Main_bitmap_jump=$StartHighlight use the start screen highlight color
    + +
    +
    Not all colors are available on all versions of Windows. Windows 8.1 adds new ones that don't exist in Windows 8, and Windows 10 adds even more colors. To make skins that look good on all versions of Windows, you may use a list of colors in order of preference. If the first one is not available, the menu will use the next one in the list. +
    +
    +Main_selection=$SystemAccentDark2|$StartSelectionBackground use the system accent dark 2 color, or if it is not available, use the start selection background color +
    +
    +You can get a full list of the Metro colors using the Classic Shell Utility. You can find it on the main Downloads page. +
    +
    +For an example how to use the Metro colors, look at the Metro skin. It makes a heavy use of the named colors to achieve look that matches the current color scheme of the start screen. +
    +
    +

    Bitmap slices

    +Since many of the start menu elements are not fixed size (they is resized depending on the number of menu items, the font size, etc) and bitmaps are fixed size, we need a way to resize the bitmap to fill a given area. Simply stretching the whole bitmap will not work because fine details around the border will get blurred. +
    +
    +That's where the "slicing" system comes in. Each bitmap is split into slices horizontally and vertically: +
    +
    +bitmap slices +
    +
    +The 4 corners are never stretched. The left and right slices are stretched only vertically. The top and bottom slices are stretched only horizontally. And the middle portion can be stretched in any direction. This lets us get any size background without sacrificing the sharp edges or the smooth gradient in the middle: +
    +
    +Resized images +
    +
    +Some images can have more than 3 slices. The main menu background has 6 slices 3 for the caption area and 3 for the menu area. +
    +
    +Some images don't need both vertical and horizontal slices. The menu separator image is only split horizontally because all separators have the same height. +
    +
    +
    +

    Backgrounds

    +A background is a combination of a bitmap and its slices. It consists of the following settings: <name>, <name>_mask, <name>_slices_X, <name>_slices_Y. For example if the name is "Main_bitmap": +
    +
    +Main_bitmap=1 use bitmap resource with index 1 +
    +Main_bitmap_mask=2 use a bitmap resource with index 2 +
    +Main_bitmap_slices_X=6,1,1,6,1,13 +
    +Main_bitmap_slices_Y=60,317,8 +
    +
    + +Not all backgrounds have both X and Y slices. For example horizontal separators only have X, and vertical separators only have Y, since they can only stretch in one direction. +
    +
    +See the reference section at the end for the supported backgrounds. +
    +
    +
    +

    Skin items

    +A skin item is a combination of settings that control a particular element of the menu, for example the selected element. The following settings are supported: +
    +<name>_font the font used for the text +
    +<name>_glow_size the glow size for the text (only works in Windows 7) +
    +<name>_text_color the color for the text (4 colors for normal, selected, disabled, disabled+selected) +
    +<name>_text_padding the padding on all sides of the text (left, top, right, bottom) +
    +<name>_icon_padding the padding on all sides of the icon +
    +<name>_selection the background of the item, usually when it is selected (this setting has the _mask, _slices_X and _slices_Y sub-settings, it can also be a solid color in #RRGGBB format) +
    +<name>_arrow_color the color of the sub-menu arrow triangle if the arrow is solid color (2 colors for normal and selected) +
    +<name>_arrow a bitmap for the arrow if the arrow is a bitmap +
    +<name>_arrow_padding the left and right padding of the arrow +
    +<name>_icon_frame a background for the frame of the icon +
    +<name>_icon_frame_offset an X and Y padding between the frame and the icon (X applies for left and right, Y applies to top and bottom) +
    +
    +For example this defines the normal text in the main menu: +
    +Main_font="Segoe UI",normal,-10
    +Main_text_color=#FFFFFF,#FFFFFF,#9F9F9F,#AFAFAF
    +Main_text_padding=1,0,8,0
    +Main_icon_padding=4,3,3,3
    +Main_selection=3
    +Main_selection_slices_X=4,63,4
    +Main_selection_slices_Y=4,20,4
    +Main_arrow_color=#FFFFFF,#FFFFFF
    +Main_arrow_padding=8,9
    +
    +
    +When you specify a font you need to provide the font name, the weight (normal or bold), and a size. The font size is given in points. A point is 1/72 of an inch. So the font size in pixels is: +
    +
    +pixel_size = point_size * DPI / 72 +
    +
    +where DPI is the current DPI display setting. +
    +The font size can be negative or positive. A negative size measures the character height and a positive size measures the cell height of the font. Since the cell is usually taller than a character, a font size -10 is usually slightly larger than 10. +
    +
    +
    +Some items inherit settings from other items. For example the "Main_split" item may only have these settings: +
    +Main_split_selection=11 +
    +Main_split_selection_slices_X=4,63,4,0,16,4
    +Main_split_selection_slices_Y=4,20,4 +
    +
    +
    +The settings that are not specified will come from the "Main" item. +
    +
    +See the reference section at the end for the supported items. +
    +
    +

    Main menu

    +Now that we know what is a Bitmap, Background and Skin item, we are ready to define the look of the main menu. +
    +
    +The main menu can use a solid color for its background or use a bitmap. +
    +
    +If you want solid color, use this in the skin description: +
    +
    +Main_opacity=solid  the menu is a solid rectangle +
    Main_background=#00FF00  green color +
    +
    +The color (and all colors in this file) are in the #RRGGBB hexadecimal format. This is the same format that is used by HTML text. +
    +
    +To specify a bitmap, use: +
    +
    +Main_bitmap=1  use bitmap resource 1
    Main_bitmap_slices_X=8,1,1,5,1,13  the horizontal slices
    Main_bitmap_slices_Y=13,50,9  the vertical slices
    Main_opacity=glass  use glass effect
    +
    +Main_opacity can be solid, region, alpha, glass, fullalpha or fullglass. Solid means the menu will be filled with the Main_background color and the bitmap will be drawn on top. Region means the pixels with alpha=0 will be transparent, and the rest will be opaque. Alpha means that the bitmap will be alpha-blended with the desktop behind it. Glass means the pixels with alpha=0 will be transparent, all the rest will blend between the glass color and the pixel color (alpha=1 is full glass, alpha=255 is fully opaque). Fullalpha and fullglass are the same as alpha/glass but inform the start menu that the background behind the menu items can be transparent. +
    +
    +The bitmap must follow certain restrictions: +
    +
      +
    • The bitmap can be either 24-bit or 32-bit with alpha channel.
    • +
    • For 32-bit images don't premultiply the alpha channel. If you don't know what "premultiply the alpha" means, never mind +
      +
    • +
    • The area where the menu items are going to be must be completely opaque if fullalpha or fullglass are not used +
      +
    • +
    • For region, alpha, glass, fullalpha or fullglass modes there is a limitation where the fully transparent (alpha=0) pixels can be. For every horizontal line of the bitmap there can be transparent pixels on the left end and on the right end, but not in the middle. The non-transparent (alpha>0) pixels must be contiguous with no holes.
    • +
    • For right-to-left versions of Windows (like Arabic and Hebrew) the bitmap will be mirrored. Any text or directionally-sensitive graphics (like a logo) will be backwards. If you want to support right-to-left Windows, either don't use such graphics or provide an option that uses alternative image
    • +
    • The Windows 7 style (skin with extension .skin7) does not support fullalpha or fullglass opacity modes +
      +
    • +
    To create a 32-bit bitmap with alpha channel you need an image editor like Photoshop or GIMP. In Photoshop the alpha channel goes here: +
    +
    +Alpha in Photoshop +d +
    +
    +When saving the bmp file make sure you pick the 32-bit file format. +
    +
    +The first 3 numbers of Main_bitmap_slices_X relate to the caption area. Set them all to 0 if you don't want caption. If you do want caption, set the numbers to to the left, middle and right slice of the caption area of the bitmap. +
    +The second 3 numbers of Main_bitmap_slices_X are for the left, middle, and right slice of the menu area. +
    +The 3 numbers of Main_bitmap_slices_Y are for the top, middle and bottom slice of the whole menu. The same numbers are used for the caption and the menu. +
    +
    +Here's an example of how the slices should look: +
    +Main menu slices +
    +The highlighted vertical slices are single pixel wide and are stretched to fill the width of the caption area and the menu area. +
    +
    +If your menu background is solid color or a completely rectangular bitmap, and you are running in Windows 7's Classic theme, you can select whether the menu will have a 1-pixel thin border or 2-pixel 3D border: +
    +Main_thin_frame=1 use thin frame instead of the thick 3D frame (for Classic mode only)
    +
    +
    +

    The caption

    +The caption is the area on the side of the menu that shows text like Windows 7 Home. If you want caption you must provide a bitmap for the main menu. There are few parameters related to the caption: +
    +
    +Caption_font="Segoe UI",normal,18  the name, weight and size of the caption font
    +Caption_text_color=#FFFFFF  the color of the caption text
    +Caption_glow_color=#FFFFFF  the color of the glow behind the text
    +Caption_glow_size=10  the size of the glow (0 no glow)
    +Caption_padding=4,8,2,16  the padding on the left, top, right and bottom of the caption
    +
    +The padding is the number of pixels to leave on each side of the caption text. +
    +
    +
    +

    Two columns

    +All Classic skins must support either a single column mode or two-column mode. The Windows 7 skins only support two columns. +
    +There is a system option "TWO_COLUMNS", which is set when the skin runs in two-column mode. You may use that option to provide a different bitmap and other settings. For more on options look at the Skin Options section. +
    +
    +The main bitmap for two columns must have 6 vertical slices, just like if the menu has a caption. But instead of having a caption section and the menu section, there are the first column section and the second color section. +
    +
    +The second column can have its own set of properties to specify a different font, colors, selection bitmap, etc.: +
    +
    +Main2_opacity=fullglass +
    +Main2_font="Segoe UI",bold,-10 +
    +Main2_text_color=#FFFFFF,#FFFFFF,#7F7F7F,#7F7F7F +
    Main2_padding=3,10,4,8 +
    +
    +
    These properties are optional. If something is not set, the values from the first column will be used. +
    +
    +
    +

    The menu items

    +The main menu can display different kinds of items. Also some items can have multiple states. Each item is described in the skin as one or more "skin items" (as explained above). Here are some examples of items: +
    +Main the normal items in the main menu +
    +Main_new highlighted new programs +
    +Main2_separator a separator in the second column of the main menu +
    +
    +Note on separators: For simple separators (with no text) the height of the separator is determined by the height of the provided bitmap. If no separator bitmap is given the menu uses the default etched line. +
    +
    +Custom separator +
    +
    +
    For the complete list see the reference section at the end. +
    +
    +

    Patterns

    +The main menu supports overlays of tiled (repeated) textures that are blended with the main background. You can have up to 4 patterns. +
    +
    + +Pattern1=11 the first pattern will use image resource 11
    +Pattern2=15 +
    +
    +
    +Just like regular bitmaps, patterns can have masks and tint colors +
    +
    + +Pattern1_mask=#303000 mask that blends 20% of tint1 and 20% of tint2
    +Pattern1_tint1=#000000 black color
    +Pattern1_tint2=#FFFF00 yellow color
    +
    +
    +By default the patterns will cover the entire menu. You can use a mask image to control where the patterns will be visible. The Red channel controls the first pattern, Green controls the second pattern, Blue controls the third pattern and Alpha controls the fourth pattern. +
    +
    +Color masks +
    +In this example the red areas of the mask are replaced by Pattern1 and the green areas are replaced by Pattern2. +
    +
    + +Main_pattern_mask=19 use image resource 19 for pattern mask +
    +Main_pattern_search_mask=20 mask for the search mode of the menu +
    +Main_pattern_jump_mask=21 mask for the jumplist mode +
    +
    Search_pattern_mask=22 mask for the search portion of the main menu +
    Search_pattern_search_mask=23 mask for the search portion of the main menu in search mode +
    Search_pattern_jump_mask=24 mask for the search portion of the main menu in jumplist mode +
    +
    +
    +The masks must have the same size as the images they correspond Main_bitmap, Main_bitmap_search, Main_bitmap_jump and Search_background. +
    +
    +Note: +
    +Having multiple patterns blended together can be slow. For fastest results, try to limit most areas to a single pattern with the mask at full intensity (100% Red or 100% Blue, etc). If you want to have a semi-transparent pattern, it is more efficient to have the transparency in the alpha channel of the pattern bitmap instead of using half-intensity mask. +
    +
    +For an example on using patterns, take a look at the Metallic skin. +
    +
    +

    Emblems

    +The main menu background can have additional images drawn on it, called "emblems". They are drawn without any stretching. You can have up to 10 of them. The first 4 can use a mask bitmap to control where in the image the emblems will be visible and where they will be hidden. +
    +
    + +Main_emblem1=11 use image resource 11 for the emblem
    +Main_emblem1_padding=20,20,20,20 keep 20 pixels padding on all sides of the emblem
    +Main_emblem1_alignH=right align to the right side of the menu
    +Main_emblem1_alignV=bottom align to the bottom side of the menu
    +Main_emblem_mask=12 use image resource 12 for the emblem mask
    +
    + +Main_emblem + + +_search_mask=20 emblem mask for the search mode of the menu +
    +Main_
    emblem_jump_mask=21 emblem mask for the jumplist mode +
    +
    Search_emblem_mask=22 emblem mask for the search portion of the main menu +
    Search_emblem_search_mask=23 emblem mask for the search portion of the main menu in search mode +
    Search_emblem_jump_mask=24 emblem mask for the search portion of the main menu in jumplist mode +
    +
    +
    +The horizontal alignment can be left, right or center for the entire menu, left1, right1, center1 for the first column, left2, right2, center2 for the second column, or corner. The corner alignment will align the emblem to the same corner of the screen where the start menu is shown. +
    +
    +The certical alignment can be top, bottom, center or corner. +
    +
    +The emblem mask controls where the emblems will be visible. Red is for the first emble, Green for the second, and so on. +
    +
    +
    +

    Other menu elements

    +
    +You can provide a custom bitmap to be used for the arrows: +
    +
    +Main_arrow=3  the resource ID of the sub-menu arrow bitmap +
    +
    +The arrows bitmap (Main_arrow) needs 2 have 2 arrow images like this: +
    +Sub-menu arrows +
    +The top half is used for the normal arrow and the bottom half is for the selected arrow. +
    +
    +The pager is used to scroll items in the menus if they don't fit. The pager needs a background and a bitmap for the arrow: +
    + +
    +Main_pager=2
      the resource ID of the pager bitmap +
    Main_pager_slices_X=3,1,3  the horizontal slices of the pager bitmap +
    Main_pager_slices_Y=4,66,4  the vertical slices of the pager bitmap +
    Main_pager_arrows=3  the resource ID of the pager arrows bitmap +
    +
    +Main_pager has the normal and selected backgrounds for the scroll buttons: +
    +Pager buttons +
    +
    Main_pager_arrows must have 4 arrow images like this: +
    +Pager Arrows +
    +The top 2 point up, the bottom 2 point down, the left 2 are normal and the right 2 are selected. +
    +
    +
    +

    More on padding

    +The start menu uses multiple padding settings to correctly align all graphical elements. You can see from this image: +
    +Padding settings +
    +
    +Tweak the numbers to get the desired alignment of the caption, or the gap between the icon and the text, etc. +
    +
    +
    +

    User Picture (Classic skins)

    +
    +The start menu can also show the user picture. You enable it by setting the size of the user picture. All original skins use 48x48 pixels, but you can choose any size up to 128x128: +
    +
    +User_image_size=48 +
    +
    +You must also set the position of the image inside the menu: +
    +
    +User_frame_position=-10,6 +
    +
    Positive position is measured from the left and top, and negative numbers are from the right and the bottom. So "-10,6" means 10 pixels from the right and 6 pixels from the top. The horizontal position can also be "center", "center1" or "center2". Then the image will be centered over the whole menu, or over the first column, or over the second column: +
    +
    +User_frame_position=center2,6  + center on top of the second column +
    +
    +Optionally, you can specify a frame bitmap: +
    +
    +User_bitmap=12  + the resource ID of the frame bitmap +
    +User_image_offset=8,8  + how many pixels between the top/left corner of the frame and the top/left corner of the user picture +
    +
    +
    The frame is drawn on top of the user picture, so it must have a hole where the picture is supposed to be. That means the frame bitmap must have alpha channel. +
    +
    +By default the user picture is drawn opaque. You can control the transparency of the picture with this property: +
    +
    +User_image_alpha=200  + set the transparency to 200 (out of 255) +
    +
    +
    +

    User Picture (Windows 7 skins)

    +
    +The Windows 7 style shows the user picture as a separate window that can extend beyond the size of the start menu. The user image is restricted to 48x48 pixels and the frame around it is always 64x64 pixels. This limitation is because the size must match the size of the extra-large icons used by the items in the second column of the menu. +
    +
    +You can provide the following settings: +
    +User_bitmap=12  + the resource ID of the frame bitmap +
    +User_bitmap_outside=1 if the frame can go outside of the main menu (but only when the start menu is at the bottom of the screen) +
    +User_image_padding= -4,8 top and bottom padding of the frame (used to fine-tune the vertical position of the frame. the horizontal position is always centered) +
    +
    +
    +

    User Name (Classic skins only)

    +
    +The start menu can also show the user name. To enable that feature you have to provide the location of the name inside the menu, its font and alignment: +
    +
    +User_name_position=10,15,-75,55 +
    +User_name_align=right +
    +User_font="Segoe UI",bold,22 +
    +User_text_color=#FFFFFF +
    +User_glow_color=#000000 +
    +User_glow_size=2 +
    +
    +
    +
    +The four number are the left, top, right and bottom offsets of the rectangle. Positive numbers mean offsets from the left and top. Negative numbers mean offsets from the right and bottom. In this example the rectangle will be 10 pixels from the left, 15 from the top, 75 from the right and the bottom will be 55 from the top. Since the top and bottom numbers (second and fourth) are both positive, the rectangle will be aligned to the top of the menu and will always be 40 pixels tall. +
    +
    +Unlike other fonts in the skin, the font for the user name does not scale when the screen DPI changes. Read more about font scaling in the Scaling section below. +
    +
    +The alignment can be center, center1, center2, left, left1, left2, right, right1 or right2. If this setting is missing, the name is centered by default. Center, left and right align the name relative to the whole menu. Center1, left1 and right1 align inside the first column, and center2, left2 and right2 align inside the second column. +
    +
    +The user name is usually taken from the system. For systems that provide full name it will be something like "Smith, John". Otherwise it will be the login name like "jsmith". You can override the text from the settings, using the User name text setting in the Menu Look tab. +
    +
    +
    +

    Search box

    +The icon next to the search box can be skinned to match the menu background. You need to provide one bitmap that contains 8 images like this: +
    +Search icons +
    +The top row has 16x16 images and the bottom row has 20x20. Then specify the bitmap ID: +
    +
    +Search_bitmap=11
    + +
    +

    Windows 7 style +
    +

    +The Windows 7 style (the .skin7 skins) have some additional requirements for the main menu. +
    +
    +First, it requires 3 separate backgrounds to be set, Main_bitmap (as shown above), Main_bitmap_search (used during search) and Main_bitmap_jump (used when a jumplist is opened). It is recommended that the top and bottom padding for all 3 backgrounds are the same, otherwise the menu items may move around as the menu transitions between different modes. +
    +
    +Second, the skin needs some new skin items to be defined, like Shutdown, List, Programs, etc. For the complete list see the reference section at the end. +
    +
    +There are some additional bitmap resources that need to be defined, also listed in the reference section. These include the background around the search box in various modes, custom pin icon, etc. +
    +
    +
    +

    Sub-menus

    +For sub-menus the parameters are similar to a simple main menu: +
    +
    +Submenu_padding=2,2,2,2 +
    +Submenu_thin_frame=1
    +
    +Submenu_font="Segoe UI",normal,-9
    +Submenu_background=#FFFFFF
    +Submenu_text_color=#000000,#000000,#7F7F7F,#7F7F7F
    +Submenu_selection=2
    Submenu_selection_slices_X=3,1,3
    +Submenu_selection_slices_Y=4,66,4
    +Submenu_separator=3 +
    Submenu_separator_slices_X=3,34,3 +
    +....... +
    +
    +Sub-menus can also have a vertical separator. It is used when a menu has more than one column: +
    +Submenu_separatorV=12  bitmap to use as a vertical separator between multiple columns +
    +Submenu_separator_slices_Y=2,16,2  vertical slices for Submenu_separatorV +
    +
    +
    +

    About box

    +In the settings of the start menu there is a button About This Skin that opens a message box. Use it to provide information about the skin and about yourself. List any requirements of your skin Does it require Aero? Is it intended for Vista only? +
    +
    +The parameters are: +
    +About=Some text  the text you want displayed +
    +AboutIcon=1  the icon resource to use in the About box +
    +
    +In the text you can use \n as a line break, like "Line1\nLine2". The text also supports hyperlinks in the format <A HREF="www.mycoolsite.com">Visit my site</A>. +
    +
    +The icon can be any icon resource you want displayed. If no icon is provided, the system "info" icon is used. +
    +
    +
    +

    Skin variations

    +One skin file can contain multiple skins. The first one (defined in the SKIN resource with ID=1) is the main skin and the rest are variations. The variations are described in the main SKIN resource like this: +
    +Variation1=0, "Large Icons, With Caption"
    +Variation2=2, "Large Icons, No Caption" +
    +
    +Each variation has a resource ID and a text. The ID refers to a secondary SKIN resource, which contains overrides for some parameters (for example an alternative Main_bitmap, or Submenu_font). The text is the name of the skin variation that will be used in the Settings box. +
    +
    +The skin variations make it possible to pack multiple skins into one file, which makes them easier to distribute together. Also all skins can share bitmap resources from the skin file, reducing the total size. +
    +
    +
    +

    Skin options

    +A skin can define a list of options for the user to pick. In the simple case an option is a checkbox that can be ON or OFF. The options are defined like this: +
    +OPTION CAPTION="Caption",1
    +OPTION SMALL_ICONS="Small Icons",0
    +
    +
    +First there is the word OPTION, then the name of the option (like CAPTION), then the label for the checkbox (like "Caption") and finally the default value (1 ON, 0 OFF). +
    +
    +At the end of the skin file you can have one or more sections that provide overrides for some parameters. Each section has a condition, which is evaluated based on the options that the user has selected. The condition can be an expression that uses operations like AND, OR and NOT like OPTION1 AND (OPTION2 OR NOT OPTION3). +
    +For example: +
    +[NOT CAPTION] this section will be used when CAPTION is OFF
    +Main_bitmap_slices_X=0,0,0,15,1,13
    +Main_padding=12,10,10,8
    +
    +
    +[SMALL_ICONS] this section will be used when SMALL_ICONS is ON
    +Main_large_icons=0
    +Main_font="Segoe UI",normal,-9
    +
    +
    +Each section starts from its header and ends at the next section or the end of the file. So it is important to place the sections at the very end of the file. +
    +
    +It is possible to disable an option depending on some other options. You do that by providing an expression for the option, as well as an alternate default value when the expression is false. For example: +
    +OPTION USER_NAME="Show user name",0
    +OPTION CENTER_NAME="Center user name",1, USER_NAME, 0
    +
    +
    +The "Center user name" option will be disabled when USER_NAME is false (that is, when the "Show user name" option is unchecked). When the option is disabled, its value will be fixed to 0. The idea is to make it clear for the user that if you don't show the user name then you can't center it. +
    +
    +Important Note: An option can only depend on other options that are defined before it. So in this example USER_NAME must be defined after CENTER_NAME. +
    +
    +

    Complex options

    +More complex options can have an actual value in addition to being turned ON or OFF. The value can be a number, a text string, a color or an image. +
    + +
    +
    This defines a color option named COLOR_CUSTOM. The default value is FFFFFF. The condition for the option is TRUE, which makes it always enabled. +
    +
    +OPTION_COLOR COLOR_CUSTOM=Custom color,0,TRUE,FFFFFF +
    +[COLOR_CUSTOM] +
    +Main_background=@COLOR_CUSTOM@
    +
    +
    +The option will be displayed as a checkbox and a color picker. When the checkbox is clicked, the value COLOR_CUSTOM will become true, which will enable the [COLOR_CUSTOM] section. The actual color value selected by the user will replace @COLOR_CUSTOM@. +
    +
    +For number, text, or image options, use OPTION_NUMBER, OPTION_STRING and OPTION_IMAGE. +
    +
    +Check out the Metallic skin for many examples of complex options. +
    +
    +

    Skin modes

    +The classic skins (the ones stored in .skin files) can be used in 3 modes "one column", "two columns" and "all programs". The first and the second are used depending on the current menu style. The last one is used on Windows 7 to show the All Programs sub-menu of the Windows start menu. +
    +
    +The skin system defines 2 built-in options TWO_COLUMNS and ALL_PROGRAMS. The skin can use them to detect which of the modes is being requested. For example: +
    +
    +[ALL_PROGRAMS] this section will be used only for the All Programs menu +
    +Submenu_text_color=#0000FF,#0000FF,#7F7F7F,#7F7F7F override the text color +
    +
    +Not all options make sense in all modes, so it is nice to hide them from the user. For example the caption settings can't be used in "two columns" mode, and any main menu settings are ignored in "all programs" mode. +
    +You can define the following settings to restrict what options to show: +
    +Classic1_options a list of options to show in "one column" mode +
    +Classic2_options a list of options to show in "two columns" mode +
    +AllPrograms_options a list of options to show in "all programs" mode +
    +
    +For example: +
    +Classic1_options=CAPTION, USER_IMAGE, USER_NAME, CENTER_NAME, SMALL_ICONS
    +Classic2_options=NO_ICONS, SMALL_ICONS
    +AllPrograms_options=THICK_BORDER, SOLID_SELECTION
    +
    +
    +
    +

    Radio groups

    +Sometimes you may want to present a set of options, such as only one option is active at a time. This is called a radio group. You define it like that: +
    +
    +OPTION RADIOGROUP=<name of the group>,0,<option1>|<option2>
    +OPTION <option1>=<name1>,1
    +OPTION <option2>=<name2>,0

    +
    +
    +The first option in the list defines the group. It has a name, then the value (which is ignored), then the list of the possible options. +
    +The next few options define the possible selections. Exactly one of them must be set to 1 and that will be the default selection. When the user clicks on one of the options the rest will be set to 0 automatically. +
    +
    +For example: +
    +
    +OPTION RADIOGROUP=Transparency,0,TRANSPARENT_LESS|TRANSPARENT_DEF|TRANSPARENT_MORE
    +OPTION TRANSPARENT_LESS=Less,0
    +OPTION TRANSPARENT_DEF=Default,1
    +OPTION TRANSPARENT_MORE=More,0
    +
    +
    +
    +
    +

    Scaling

    +

    DPI scaling

    +The skin parameters are authored for the default resolution of 96 DPI. When the skin is used at higher DPI setting you have the option to scale up some of the parameters. For example: +
    +
    +Main_arrow_padding=8,10,50% +
    +
    +
    +This means that the arrow padding will be scaled by 50% of the increase in DPI. If the current DPI is 120 (25% increase over 96 DPI), then the numbers will be scaled up by 50% of 25%, which is 12.5%. 8 will become 9 and 10 will become 11.25 (rounded to 11). If instead the skin was: +
    +
    +Main_arrow_padding=8,10,100% +
    +
    +Then the full 25% increase will be applied, so 8 will become 10 and 10 will become 12.5 (rounded to 13). +
    +
    +It is also possible to use different scaling values for each number: +
    +
    +Main_icon_padding=4,4,3,4,100%,0%,100%,0%
    +
    +
    +In this case the first and third number will be scaled by 100% and the rest will not be scaled. +
    +
    +Not all skin parameters support scaling. For example bitmap slices cannot be scaled because they represent portions of some bitmap resource. The parameters that can be scaled are marked as such in the reference section. +
    +
    +

    Fonts

    +By default the fonts are scaled with the DPI at 100%. You can overwrite that: +
    +
    +Main_font="Segoe UI",normal,-9,50%
    +
    +
    +This will make the Main_font scale with half of the rate of the DPI increase. +
    +
    +Note: One exception is the User_font. It is not scaled by default because it is intended to fit in the User_name_position box. If you want the font to scale, you should use the same scale for the user name position. +
    +
    +

    High DPI parameters

    +When the DPI is 144 or higher (text size 150% and up), the skin defines a setting HIGH_DPI, which allows you to provide alternative bitmap resources and other parameters that are intended to be used with higher resolutions. Use it for example to define larger graphical elements like arrows and icons. +
    +
    +

    Localization

    +The built-in skins contain localizations for all their options and variations. Instead of providing the text directly in the skin file, the setting refers to a string in the localization DLL. For example: +
    +OPTION USER_IMAGE=#7014,1 +
    +OPTION SMALL_ICONS=#7011,0 +
    +
    +
    #7014 means to look up string number #7014 in the DLL. Custom skins can use the strings that already exist in the DLL, but unfortunately new strings cannot be added by the skin itself. +
    +
    + +
    +

    Custom skin

    +During development it can be a bother to have to Resource-Hack the skin file for every little change. That's why the start menu supports a special "custom" skin. Instead of packing all resources in a DLL, you can leave them as loose files in the Skins directory: +
    +
    +1.txt the main skin description
    +12.bmp bitmap used by 1.txt +
    +2.txt a skin variation
    +7.ico
    +...
    +
    +The file name must be the resource ID of that asset in the skin file. For example 12.bmp will go into a bitmap resource with ID 12. Edit them until you are ready to package them into a skin file. +
    +
    +The "Custom" skin option is available in the settings only if the start menu can find the 1.txt file. +
    +
    +The custom skin has an additional parameter that is not available for other skins: +
    +ForceRTL=1
    +
    +This makes the start menu run in right-to-left mode. Use it to see how your background image will look on an Arabic OS. Note: The RTL emulation is not perfect. One notable difference is that all menu icons are mirrored. On a real RTL Windows they will not be. +
    +
    +
    +

    Troubleshooting

    +If your skin is causing an error, the start menu will drop it and use the Default skin instead. The reason can range from a missing resource to an incompatible version to a bitmap with wrong size, and so on. +
    +
    +To figure out the cause of the problem turn on "Report Skin Errors" in the start menu settings. Then you'll see a popup like this: +
    +Skin error +
    +
    +Note that only errors related to the current skin variation and the current skin options will be reported. So test your skin with every combination to ensure it works in all conditions. +
    +
    +
    +

    Skin reference

    +This section describes all possible settings that can be used in a skin file. Before we can define the individual settings we need to define the types that a setting can have. A setting can be one of the following types: text, number (or multiple numbers), color (or multiple colors), font, icon, bitmap, background or skin item. Some settings like background or skin item have multiple sub-settings described below. The names of the sub-settings begin with the name of the parent setting. +
    +
    +Here are the types in more detail: +
    +
    +A color is represented in the hexadecimal format #RRGGBB, where each color component takes 2 hex digits. For example: +
    +Caption_text_color=#00FF00
    +
    +
    +It can also be a named color. The actual value will depend on the currnt system settings: +
    +Caption_text_color=$StartHighlight +
    +
    +
    These are the main system colors that are available on all versions of Windows: +
    $SystemScrollbar
    +$SystemBackground
    +$SystemActiveCaption
    +$SystemInactiveCaption
    +$SystemMenu
    +$SystemWindow
    +$SystemWindowFrame
    +$SystemMenuText
    +$SystemWindowText
    +$SystemCaptionText
    +$SystemActiveBorder
    +$SystemInactiveBorder
    +$SystemAppWorkspace
    +$SystemHighlight
    +$SystemHighlightText
    +$SystemBtnFace
    +$SystemBtnShadow
    +$SystemGrayText
    +$SystemBtnText
    +$SystemInactiveCaptionText
    +$SystemBtnHighlight
    +$System3DDKShadow
    +$System3DLight
    +$SystemInfoText
    +$SystemInfoBK
    +$SystemHotLight
    +$SystemGradientActiveCaption
    +$SystemGradientInactiveCaption
    +$SystemMenuHilight
    +$SystemMenuBar
    +For Windows 8 and later you can use many more named colors from the Metro palette. Use the Classic Shell Utility to view the full list. +
    +
    +
    +A font selects the font's name, size, and weight (normal or bold). For example: +
    +Main_font="Segoe UI",normal,-10 +
    +
    +
    +
    An icon is a reference to an icon resource number in the skin file: +
    +About=1 +
    +
    +
    +A bitmap is a reference to a bitmap resource number in the skin file. It can have an optional mask that determines how to mix the bitmap resource with the tint colors. The mask can be another bitmap or it can be a solid color: +
    +Main_bitmap=2
    +Main_bitmap_mask=#FF0000 +
    +Main_bitmap_tint1=#E0E000 +
    +
    +
    +
    +A background is a bitmap that can be resized to the necessary size. It consists of a bitmap resource and slice numbers. The number of slices depends on the actual background. Some are 3x3, some are 3x1, some 6x3. +
    +
    +Possible settings for a background with a given <name>: +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameType +
    +
    Notes +
    +
    <name> +
    +
    number or color +
    +
    The main image. It can be a BITMAP or IMAGE resource identifier, or a #RRGGBB color +
    <name>_masknumber or color +
    +
    The color mask. It can be a bitmap resource identifier or a #RRGGBB color. If it is a bitmap then it must have the same size as the original bitmap +
    +
    <name>_slices_Xnumbers +
    +
    The sizes for the horizontal slices. The sum of the numbers must not exceed the width of the bitmap +
    +
    <name>_slices_YnumbersThe sizes for the vertical slices. The sum of the numbers must not exceed the height of the bitmap
    <name>_tint1 +
    +
    color +
    +
    The first tint color. It will be blended with the main image according to the Red channel of the mask. By default it is the glass color +
    +
    <name>_tint2colorThe second tint color. It will be blended with the main image according to the Green channel of the mask. By default it is the menu background color +
    +
    <name>_tint3colorThe third tint color. It will be blended with the main image according to the Blue channel of the mask. By default it is black
    +
    +
    +A skin item controls the complete look for individual menu elements. It sets the font, colors, and other settings. +
    +
    +Possible settings for skin item with a given <name>: +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameType +
    +
    Notes +
    +
    <name>_font +
    +
    font +
    +
    The font for the item's text +
    +
    <name>_text_color +
    +
    4 colors +
    +
    Colors for the text normal, selected, disabled, disabled+selected +
    +
    <name>_glow_size +
    +
    number +
    +
    Size of the glow in pixels (only supported on Windows 7) +
    <name>_text_padding +
    +
    4 numbers (with scale) + Padding on the left, top, right, bottom around the item's text +
    +
    <name>_icon_padding +
    +
    4 numbers (with scale) + Padding on the left, top, right, bottom around the icon +
    <name>_selection +
    +
    background or color +
    +
    Background for the item when it is selected (can also be a solid color) +
    +
    <name>_arrow_color +
    +
    2 colors +
    +
    The arrow colors normal and selected (when the arrow is solid color) +
    +
    <name>_arrow +
    +
    bitmap +
    +
    The arrow bitmap (when the arrow is a bitmap). The bitmap must contain 2 images, the top one is normal and the bottom is selected +
    +
    <name>_arrow_padding +
    +
    2 numbers (with scale) + Padding on the left and right side of the arrow +
    <name>_icon_frame +
    +
    background +
    +
    Background for the icon frame +
    +
    <name>_icon_frame_offset +
    +
    2 numbers (with scale) + Horizontal and vertical padding between the icon and the frame +
    +
    +
    +Now that we know how to define settings of different types, here is a list of all settings used by the menu skins: +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Name + Type +
    +
    Notes +
    +
    About +
    +
    text +
    +
    The text to display in the About box +
    +
    AboutIcon + icon +
    +
    The icon to display in the About box +
    +
    Version + number +
    +
    Use version 2 +
    +
    Caption +
    +
    Caption_font + font +
    +
    The font to use in the caption on the side of the main menu +
    +
    Caption_text_colorcolor +
    +
    Color for the caption text +
    +
    Caption_glow_colorcolor +
    +
    Color for the caption text glow +
    +
    Caption_glow_sizenumber +
    +
    Size of the glow in pixels (only supported on Windows 7) +
    +
    Caption_padding4 numbers (with scale) + Padding on the left, top, right, bottom around the caption text +
    +
    Patterns +
    +
    Pattern1 through Pattern4 +
    +
    background +
    +
    Tileable image for the main menu +
    +
    Main_emblem1 through Main_emblem10 +
    +
    background +
    +
    Emblem images for the main menu +
    +
    Main_emblem1_padding +
    +
    4 numbers (with scale) +
    +
    Padding on the left, top, right, bottom around the emblem image +
    +
    Main_emblem1_alignH +
    +
    stringHorizontal padding for the emblem center, center1, center2, left, left1, left2, right, right1, right2, corner +
    +
    Main_emblem1_alignV +
    +
    string +
    +
    Vertical padding for the emblem center, top, bottom, corner +
    +
    Main menu +
    +
    Main_backgroundcolor +
    +
    Background color for the main menu +
    +
    Main_bitmapbackground +
    +
    Background for the main menu. Needs 6 vertical and 3 horizontal slices +
    +
    Main_opacitytextOpacity of the main menu solid, region, alpha, glass, fullalpha, fullglass +
    +
    Main_large_iconsnumber +
    +
    Set to 1 to use large icons in the main menu +
    +
    Main_thin_framenumber +
    +
    Set to 1 to use a thin border (as opposed to thick 3D border). Only applies to Classic theme in Windows 7 +
    +
    Main_padding4 numbers (with scale) + Padding on the left, top, right, bottom around the items in the main menu +
    +
    Mainskin item +
    +
    The look for the normal items in the main menu +
    +
    Main_splitskin item +
    +
    The look for the split items in the main menu. Inherits from Main
    Main_newskin item +
    +
    The look for the highlighted items (like new programs) in the main menu. Inherits from Main
    Main_separatorskin item +
    +
    The look for the text in the separators in the main menu. Inherits from Main +
    +
    Main_separatorbackgroundThe bitmap for the horizontal separators in the main menu +
    +
    Main_separatorVbackground +
    +
    The vertical separator between the two columns of the main menu +
    +
    Main_pagerbackground +
    +
    The background for the main menu pager. Requires 2 pictures, the top one is normal state, the bottom is highlighted state +
    +
    Main_pager_arrowsbitmap +
    +
    The arrow for the pager. Requires 2x2 grid with up, down, normal and hot states +
    +
    Search_hint_fontfont +
    +
    The font for the hint text in the search box +
    +
    Main_pattern_mask +
    +
    bitmap +
    +
    A bitmap mask that controls the placement of the patterns in the main menu (must match the size of the Main_bitmap) +
    +
    Main_emblem_mask +
    +
    bitmap +
    +
    A bitmap mask that controls the placement of the emblems in the main menu (must match the size of the Main_bitmap)
    Two-column main menu +
    +
    Main2_opacitytextOpacity for the second column of the main menu +
    +
    Main_no_icons2number +
    +
    Set to 1 to hide the icons in the second column +
    +
    Main2_padding4 numbers (with scale) + Padding on the left, top, right, bottom around the items in the second column +
    +
    Main2skin item +
    +
    The look for the normal items in the second column. Inherits from Main +
    +
    Main2_splitskin item +
    +
    The look for the split items in the second column. Inherits from Main2 +
    +
    Main2_newskin item +
    +
    The look for the highlighted items in the second column. Inherits from Main2 +
    +
    Main2_separatorbackground +
    +
    Horizontal separator for the second column. Inherits from Main_separator
    Windows 7-style main menu +
    +
    Main_bitmap_searchbackgroundBackground for the main menu in search mode +
    +
    Main_search_padding4 numbers (with scale) + Padding for the menu items in search mode +
    +
    Main_bitmap_jumpbackgroundBackground for the main menu in jumplist mode +
    +
    Main_jump_padding4 numbers (with scale) + Padding for the jumplist items +
    +
    Main_search_indentnumber (with scale) + The indent in pixels of the search results relative to the search headers +
    +
    Main_pattern_search_mask +
    +
    bitmapPattern mask for the main menu in search mode (must match the size of Main_bitmap_search) +
    +
    Main_pattern_jump_mask +
    +
    bitmapPattern mask for the main menu in jumplist mode (must match the size of Main_bitmap_jump)
    Main_emblem_search_mask +
    +
    bitmapEmblem mask for the main menu in search mode (must match the size of Main_bitmap_search)
    Main_emblem_jump_mask +
    +
    bitmapEmblem mask for the main menu in jumplist mode (must match the size of Main_bitmap_jump)
    Shutdownskin item +
    +
    The look for the shutdown button. Inherits from Main +
    +
    Shutdown_searchskin item +
    +
    The look for the shutdown button in search mode. Inherits from Shutdown +
    +
    Shutdown_jumpskin item +
    +
    The look for the shutdown button in jumplist mode. Inherits from Shutdown +
    +
    Shutdown_padding4 numbers (with scale) + Padding around the shutdown button +
    +
    Listskin item +
    +
    The look for the search results and jumplist items. Inherits from Main +
    +
    List_splitskin item +
    +
    The look for the search results and jumplist items that are split in two parts. Inherits from List +
    +
    List_separatorskin item +
    +
    The look for the text in the separators in the search results and jumplists. Inherits from List +
    +
    List_separatorbackgroundHorizontal separator for the search results and jumplists Inherits from Main_separator
    List_separator_splitskin item +
    +
    The look for the split separators in the search results. Inherits from List_split +
    +
    List_separator_splitbackgroundHorizontal split separator for the search results and jumplists Inherits from Main_separator
    Programs_iconbitmap +
    +
    The icon for the All Programs button. Requires 2 pictures, one for the normal state and one for the selected state +
    +
    Programs_buttonskin item +
    +
    The look for the All Programs button. Inherits from Main +
    +
    Programs_button_newskin item +
    +
    The look for the highlighted All Programs button. Inherits from Main +
    +
    Search_bitmapbitmap +
    +
    A bitmap with various icons used by the search box +
    +
    Search_arrowbitmap +
    +
    A bitmap for the arrow in the search separators. Requires 2 pictures, one for the minimized and one for the maximized state +
    +
    Search_padding4 numbers (with scale) + Padding around the search box +
    +
    Search_framenumber +
    +
    Set to 0 to disable the black frame of the search box, for example if Search_background has a built-in border +
    +
    Search_backgroundbackground +
    +
    Background around the search box +
    +
    Search_background_padding4 numbers (with scale) + Padding around the search background +
    +
    Search_background_searchbackground +
    +
    Background around the search box in search mode +
    +
    Search_background_search_padding4 numbers (with scale)Padding around the search background in search mode +
    +
    Search_background_jumpbackgroundBackground around the search box in jumplist mode
    Search_background_jump_padding4 numbers (with scale)Padding around the search background in jumplist mode
    Search_pattern_mask +
    +
    bitmap +
    +
    Pattern mask around the search box (must match the size of Search_background) +
    +
    Search_pattern_search_mask +
    +
    bitmapPattern mask around the search box in search mode (must match the size of Search_background_search)
    Search_pattern_jump_mask +
    +
    bitmapPattern mask around the search box in jumplist mode (must match the size of Search_background_jump)
    Search_emblem_maskbitmapEmblem mask around the search box (must match the size of Search_background)
    Search_emblem_search_maskbitmapEmblem mask around the search box in search mode (must match the size of Search_background_search)
    Search_emblem_jump_maskbitmapEmblem mask around the search box in jumplist mode (must match the size of Search_background_jump)
    Pin_bitmapbitmap +
    +
    Icon for pinned and unpinned items. Requires 2x2 grid with pinned, unpinned, normal and selected states +
    +
    More_bitmapbitmap +
    +
    Icon for the "More results" item. Requires 2 pictures, one for normal and one for selected state +
    +
    Shutdown_bitmapbitmap +
    +
    Icon that is added to the shutdown button when there are updates to be installed +
    +
    Programs_backgroundcolor +
    +
    Background color for the programs tree +
    +
    Programsskin item +
    +
    The look for the items in the programs tree. Inherits from Main +
    +
    Programs_newskin item +
    +
    The look for the highlighted items in the programs tree. Inherits from Programs +
    +
    Programs_indentnumber (with scale) + Additional indentation (positive or negative) for the nested items in the programs tree +
    +
    User Picture (Classic style) +
    User_bitmapbitmap +
    +
    The frame for the user bitmap +
    +
    User_image_offset2 numbersThe offset of the user picture inside the frame
    User_image_size +
    +
    number (with scale) + The size of the user image +
    +
    User_image_alphanumberOpacity between 0 and 255 for the user picture inside the frame +
    +
    User_frame_position2 values (with scale) + The horizontal and vertical position of the frame. The horizontal can be also "center", "center1", or "center2"
    User Picture (Windows 7 style) +
    +
    User_bitmapbitmapThe frame for the user bitmap. Must be 64x64 or larger
    User_image_offset2 numbers +
    +
    The offset of the user picture inside the frame +
    +
    User_image_sizenumberThe size of the user image (should be no less than the size of User_bitmap). The default is 48
    User_image_padding2 numbers (with scale)Top and bottom padding around the user frame
    User_bitmap_outsidenumberSet to 1 for the user bitmap to appear partially outside of the main menu (only when the menu is at the bottom)
    User_frame_positionnumber (with scale)The amount by which the user frame is partially inside the main menu. The default is 36 +
    +
    User Name (only for Classic style) +
    +
    User_name_position4 numbers +
    +
    Position of the user name +
    +
    User_name_alignstring +
    +
    Alignment of the user name center, center1, center2, left, left1, left2, right, right1, right2 +
    +
    User_fontfont +
    +
    The font for the user name. By default this font is not scaled with the DPI +
    +
    User_text_colorcolor +
    +
    The color for the user name +
    +
    User_glow_colorcolor +
    +
    The glow color for the user name +
    +
    User_glow_sizenumber +
    +
    The glow size in pixels (only supported on Windows 7)
    Sub-Menu +
    +
    Submenu_backgroundcolor +
    +
    Background color for the sub-menus +
    +
    Submenu_bitmapbackground +
    +
    Background image for the sub-menus +
    +
    Submenu_opacitytextOpacity for the sub-menus +
    +
    Submenuskin item +
    +
    The look for the items in the sub-menus +
    +
    Submenu_splitskin item +
    +
    The look for the split items in the sub-menus. Inherits from Submenu +
    +
    Submenu_newskin item +
    +
    The look for the highlighted items in the sub-menus. Inherits from Submenu +
    +
    Submenu_separatorbackgroundThe bitmap for the separators in the submenus +
    +
    Submenu_separatorskin itemThe look for the text in the separators in the sub-menus. Inherits from Submenu
    Submenu_separator_splitbackgroundThe bitmap for the split separators in the submenus. Inherits from Submenu_separator
    Submenu_separator_splitskin itemThe look for the text in the split separators items in the sub-menus. Inherits from Submenu_split
    Submenu_padding4 numbers (with scale) + Padding on all sides of the sub-menu items +
    +
    Submenu_offsetnumber (with scale) + Additional horizontal offset (positive or negative) for sub-menus relative to their parent menu +
    +
    Submenu_thin_framenumber +
    +
    Set to 1 to use a thin border (as opposed to thick 3D border). Only applies to Classic theme in Windows 7
    Submenu_separatorVbackground +
    +
    Vertical separators between the columns of the sub-menus +
    +
    Submenu_pagerbackgroundThe background for the sub-menu pager. Requires 2 pictures, the top one is normal state, the bottom is highlighted state
    Submenu_pager_arrowsbitmap +
    +
    The arrow for the pager. Requires 2x2 grid with up, down, normal and hot states
    AllPrograms_offsetnumber (with scale) + additional horizontal offset (positive or negative) for the first sub-menu in All Programs mode
    +
    + + + + + + \ No newline at end of file diff --git a/Src/Localization/English/Menu.html b/Src/Localization/English/StartMenu.html similarity index 72% rename from Src/Localization/English/Menu.html rename to Src/Localization/English/StartMenu.html index 87e69c793..1f966435a 100644 --- a/Src/Localization/English/Menu.html +++ b/Src/Localization/English/StartMenu.html @@ -12,21 +12,26 @@ Open-Shell Menu -

    Open-Shell website  -Open-Shell Menu


    + +Open-Shell website

      Open-Shell Menu

    +
    Open-Shell Menu
    -is a flexible start menu that can mimic the menu behavior of Windows +is a flexible Start menu that can mimic the menu behavior of Windows 2000, XP and Windows 7. It has a variety of advanced features:
      @@ -34,13 +39,13 @@

      Styles

      -The start menu offers 3 styles to choose from.
      +The Start menu offers 3 styles to choose from.

      1) Single-column classic style

      -
      +
      This style is similar to the menu found in Windows 2000. It has one -column in the main menu with vertical text on the side. you can +column in the main menu with vertical text on the side. You can customize the order of items, icons and text.
      Programs, jumplists and search results show as cascading sub-menus.

      2) Two-column classic style

      -
      +
      This style is similar to the Windows XP menu. There are two columns where you can arrange your menu items. Customize the order, icons and text.
      @@ -79,30 +84,30 @@

      2) Two-column classic style


      3) Windows 7 style

      -
      +
      This style is similar to the Windows Vista and Windows 7 menu. The items in the first column are pre-defined to pinned and recent programs, all programs list and search box. The items in the second column are fully customizable.
      The jumplists and search results show inside the main menu. The programs can be inside the main menu or open as a cascading sub-menu.
      -This style offers less customizing options than the classic styles, but -has look and feel more familiar to people used to Windows 7.
      +This style offers less customization than the classic styles, but +has a look and feel more familiar to people used to Windows 7.


      Operation

      -If you have used the start menu in older versions of Windows you’ll +If you have used the Start menu in older versions of Windows you’ll feel right at home:

      Press the Windows key or click on the orb in the corner of the -screen to open the start menu.

      +screen to open the Start menu.

      Hold down Shift while clicking on the orb to access the operating system's own -start menu. +Start menu.

      Click on an item to execute it. @@ -112,19 +117,18 @@

      Operation

      move it to another folder.

      -Right-click on an item to rename it, delete it, explore it, sort the -menu, or perform other tasks.

      +Right-click on an item to rename it, delete it, or perform other tasks.

      -Right-click on the orb to edit the settings for the start menu, to view this help file, or to -stop the start menu.
      +Right-click on the orb to edit the settings for the Start menu, to view this help file, or to +stop the Start menu process.


      -Settings

      Right-click on the start button to access the settings:
      -
      +SettingsRight-click on the Start button to access the settings:
      +

      You can choose from seeing only the basic settings, or all available settings. Hover over each setting to see a description of what it's for. Type in the search box to find a setting by name.
      @@ -143,9 +147,9 @@


      Most settings will be changed immediately as you edit them. For example -you can edit the start menu, then while the Settings dialog is open, -access the start menu to see the changes. Small number of settings will -require you to exit the start menu before you can see the change.
      +you can edit the Start menu, then while the Settings dialog is open, +access the Start menu to see the changes. Small number of settings will +require you to exit the Start menu before you can see the change.

      @@ -156,17 +160,17 @@


      Click on the Customize Start Menu tab to customize the menu items. Depending on the style you will see different UI.

      -For classic styles you can customize both columns of the start menu and +For classic styles you can customize both columns of the Start menu and create sub-menus. The left column shows the current items in the menu and the right column shows the available menu items. Drag from the right to the left to add items to the menu.
      -
      +

      For the Windows 7 style you can only edit the items for the second column and there are no sub-menus.
      -
      +


      Double-click on the icon to edit the item properties:
      -
      +
      Here you can select a command for the item, its text, icon and other attributes. Press the Restore Defaults button to get the default text and icon for the chosen command.

      The command can be:
      @@ -197,7 +201,7 @@

      is useful when creating a menu that can be used by multiple languages.

      If you check "Insert Sub-items as Buttons", instead of showing the menu -item itself, the start menu will show the sub-items as a row of +item itself, the Start menu will show the sub-items as a row of buttons. By default the buttons are centered. You can align them to the left by adding a separator as the last item, or align them to the right by adding a separator as the first item. One possible use is to replace @@ -210,10 +214,10 @@

      Administrative Settings

      all of their settings. An administrator can lock specific settings, so no user can edit them:
      -
      +
      In this example the setting "Enable right-click menu" is locked to always be unchecked and can't be changed by any user. This is achieved -by adding the setting to the HKEY_LOCAL_MACHINE\SOFTWARE\OpenShell\Menu registry key. Create a DWORD value called "EnableContextMenu" and set it to 0.
      +by adding the setting to the HKEY_LOCAL_MACHINE\SOFTWARE\OpenShell\StartMenu registry key. Create a DWORD value called "EnableContextMenu" and set it to 0.

      In some cases you may not want to lock the value for all users, but simply modify the initial value of the setting. In such case add @@ -233,24 +237,24 @@

      Administrative Settings

      There is also a global setting "EnableSettings". Set it to 0 in the registry to prevent the users from even opening the Settings dialog:
      -
      +

      -The start menu also checks most of the group policies set by the administrator. Run gpedit.msc and go to User Configuration -> Administrative Templates -> Start Menu and Taskbar. From there you can disable Run, Shutdown, Help, and other features. (Not available on Home versions of Windows).
      +The Start menu also checks most of the group policies set by the administrator. Run gpedit.msc and go to User Configuration -> Administrative Templates -> Start Menu and Taskbar. From there you can disable Run, Shutdown, Help, and other features. (Not available on Home versions of Windows).

      Editing the settings through group policies is also supported. Extract the file PolicyDefinitions.zip found in the installation folder and read the document PolicyDefinitions.rtf for more details.


      -

      More About Skins

      +

      Skins

      You can pick from the many pre-installed skins:

      -Skins for Open-Shell Menu
      +Skins for Open-Shell Menu

      Or you can download and install additional 3rd party skins (from the main website or from another place). After you download a new skin you -must copy the .skin file to the Skins directory – usually C:\Program +must copy the .skin file to the Skins directory – usually C:\Program Files\Open-Shell\Skins. After that it will be available in the settings.

      -Note: Some skins may be specifically designed for +Windows 7 Note: Some skins may be specifically designed for Classic, Basic, or Aero mode. For example an Aero skin may require glass support any will look weird if the Classic or Basic theme is selected. Some Aero skins may also require specific glass color to be @@ -259,10 +263,10 @@

      More About Skins

      You can create your own skin. You will need an image editor that supports alpha channel (like Gimp or Photoshop) and a tool to edit resource files (like Resource Hacker or Visual Studio). And of course -some talent for graphical design :). Read the Skinning Tutorial before you begin.
      +some talent for graphical design :). Read the Skinning Tutorial before you begin.



      -

      Search


      +

      Search



      The search box lets you search the contents of the start menu, the programs in the PATH environment variable and the indexed files. You can have the search box @@ -279,10 +283,10 @@

      Search


      +

      This is done by adding sub-items of the SearchBoxItem in the Customize Start Menu tab:
      -
      +

      Open each of the sub-items and enter a command to start the search program. If you use %1 in the command, it will be replaced by the contents of the search box. If you use %2 it will be replaced by the url-style encoded search text. Enter a @@ -297,17 +301,17 @@

      Search

      Custom Start Button
      -Open-Shell can add its own start button to the taskbar. It can -even replace the default start button in Windows 7. You can choose from +Open-Shell can add its own Start button to the taskbar. It can +even replace the default Start button in Windows 7. You can choose from an Aero-style orb, a rectangular classic button, or -you can make your own. For a custom start button you need an image that +you can make your own. For a custom Start button you need an image that contain the 3 states of the button - normal, hot and pressed:
      -Start button images
      +Start button images
      The image must be a 32-bit PNG or BMP. By default the width of the image determines the size of the button. You can override that by entering a custom width.
      -Read the Button Tutorial for more information about creating custom buttons.
      -You can find many custom start button images online. Here are few examples:
      +Read the Button Tutorial for more information about creating custom buttons.
      +You can find many custom Start button images online. Here are few examples:
      http://www.classicshell.net/forum/viewforum.php?f=18
      http://www.sevenforums.com/themes-styles/34951-custom-start-menu-button-collection.html
      http://www.sevenforums.com/customization/78291-big-group-custom-start-orbs.html
      @@ -326,23 +330,23 @@

      Localization



      Command Line

      -The StartMenu.exe supports 5 command line parameters: -open, -toggle, -togglenew, -exit and -settings.
      +StartMenu.exe supports 5 command line parameters: -open, -toggle, -togglenew, -exit and -settings.

      -The first two do what the name suggests. One opens the classic start menu, the other +The first two do what the name suggests. One opens the classic Start menu, the other toggles it. You can use the parameters to create a shortcut in your -QuickLaunch bar that opens the start menu. Or to set a hotkey in +QuickLaunch bar that opens the Start menu. Or to set a hotkey in programs such as WinKey.

      -The third one "-togglenew" toggles the default Windows start menu (or start screen). It is useful if +The third one "-togglenew" toggles the default Windows Start menu (or Start screen). It is useful if you want to create a shortcut or a hotkey to open the default menu and use the Win key for the classic menu.

      -Use "-exit" to exit the start menu. This command will only work if the start menu is not currently busy.
      +Use "-exit" to exit the Start menu. This command will only work if the Start menu is not currently busy.

      -Use "-settings" to open the start menu settings. This is useful for creating a shortcut for editing the settings.
      +Use "-settings" to open the Start menu settings. This is useful for creating a shortcut for editing the settings.


      -

      Accessibility

      The start menu supports screen readers like JAWS, +

      Accessibility

      The Start menu supports screen readers like JAWS, or Microsoft's Narrator. If the accessibility support causes problems it can be disabled from the General Behavior tab of the Settings.

      diff --git a/Src/Localization/English/images/OpenShell.png b/Src/Localization/English/images/OpenShell.png index 1c1786845..228453efc 100644 Binary files a/Src/Localization/English/images/OpenShell.png and b/Src/Localization/English/images/OpenShell.png differ diff --git a/Src/Localization/English/images/button0.png b/Src/Localization/English/images/button0.png new file mode 100644 index 000000000..3d1fffef3 Binary files /dev/null and b/Src/Localization/English/images/button0.png differ diff --git a/Src/Localization/English/images/button1.png b/Src/Localization/English/images/button1.png new file mode 100644 index 000000000..e89b8c1bc Binary files /dev/null and b/Src/Localization/English/images/button1.png differ diff --git a/Src/Localization/English/images/button2.png b/Src/Localization/English/images/button2.png new file mode 100644 index 000000000..e08425b5b Binary files /dev/null and b/Src/Localization/English/images/button2.png differ diff --git a/Src/Localization/English/images/button3.png b/Src/Localization/English/images/button3.png new file mode 100644 index 000000000..5b6ea7f5d Binary files /dev/null and b/Src/Localization/English/images/button3.png differ diff --git a/Src/Localization/English/images/color_mask.png b/Src/Localization/English/images/color_mask.png new file mode 100644 index 000000000..cde0b00aa Binary files /dev/null and b/Src/Localization/English/images/color_mask.png differ diff --git a/Src/Localization/English/images/error_balloon.png b/Src/Localization/English/images/error_balloon.png new file mode 100644 index 000000000..6d00be392 Binary files /dev/null and b/Src/Localization/English/images/error_balloon.png differ diff --git a/Src/Localization/English/images/main_slices.png b/Src/Localization/English/images/main_slices.png new file mode 100644 index 000000000..47d888425 Binary files /dev/null and b/Src/Localization/English/images/main_slices.png differ diff --git a/Src/Localization/English/images/menu_arrows.png b/Src/Localization/English/images/menu_arrows.png new file mode 100644 index 000000000..ba3ba4c62 Binary files /dev/null and b/Src/Localization/English/images/menu_arrows.png differ diff --git a/Src/Localization/English/images/padding.png b/Src/Localization/English/images/padding.png new file mode 100644 index 000000000..0e4be066c Binary files /dev/null and b/Src/Localization/English/images/padding.png differ diff --git a/Src/Localization/English/images/pager_arrows.png b/Src/Localization/English/images/pager_arrows.png new file mode 100644 index 000000000..122e59855 Binary files /dev/null and b/Src/Localization/English/images/pager_arrows.png differ diff --git a/Src/Localization/English/images/pager_buttons.png b/Src/Localization/English/images/pager_buttons.png new file mode 100644 index 000000000..a4ae357dd Binary files /dev/null and b/Src/Localization/English/images/pager_buttons.png differ diff --git a/Src/Localization/English/images/pattern_mask.png b/Src/Localization/English/images/pattern_mask.png new file mode 100644 index 000000000..5736ba331 Binary files /dev/null and b/Src/Localization/English/images/pattern_mask.png differ diff --git a/Src/Localization/English/images/photoshop.png b/Src/Localization/English/images/photoshop.png new file mode 100644 index 000000000..55a47e380 Binary files /dev/null and b/Src/Localization/English/images/photoshop.png differ diff --git a/Src/Localization/English/images/reshacker.png b/Src/Localization/English/images/reshacker.png new file mode 100644 index 000000000..f340136e4 Binary files /dev/null and b/Src/Localization/English/images/reshacker.png differ diff --git a/Src/Localization/English/images/resize.png b/Src/Localization/English/images/resize.png new file mode 100644 index 000000000..4f7ee6bb7 Binary files /dev/null and b/Src/Localization/English/images/resize.png differ diff --git a/Src/Localization/English/images/search_icons.png b/Src/Localization/English/images/search_icons.png new file mode 100644 index 000000000..a17ba8ba5 Binary files /dev/null and b/Src/Localization/English/images/search_icons.png differ diff --git a/Src/Localization/English/images/separator.png b/Src/Localization/English/images/separator.png new file mode 100644 index 000000000..d791bc17b Binary files /dev/null and b/Src/Localization/English/images/separator.png differ diff --git a/Src/Localization/English/images/slices.png b/Src/Localization/English/images/slices.png new file mode 100644 index 000000000..36dd85769 Binary files /dev/null and b/Src/Localization/English/images/slices.png differ diff --git a/Src/Localization/French/Main.html b/Src/Localization/French/Main.html index b6eca137d..61eb94705 100644 --- a/Src/Localization/French/Main.html +++ b/Src/Localization/French/Main.html @@ -34,7 +34,7 @@

      Configuration Système requise

      Composants


      Open-Shell a trois composants majeurs : diff --git a/Src/Localization/French/MenuADMX.txt b/Src/Localization/French/MenuADMX.txt index 1303a761e..d4dc11c92 100644 --- a/Src/Localization/French/MenuADMX.txt +++ b/Src/Localization/French/MenuADMX.txt @@ -190,3 +190,4 @@ StartHoverDelay.nameOverride = Délai du survol (pour le bouton Démarrer) AllProgramsDelay.nameOverride = Délai du survol (Pour Tous les Programmes dans Windows 7) CSMHotkey.tipAddition = .\n\nLa valeur de base est le code virtuel principal de la touche. Ajouter 256 pour Maj, 512 pour Contrôle et 1024 pour and 1024 Alt.\nLa meilleur façon pour obtenir la valeur est de sélectionnez la touche raccourcie dans le boîte de dialogue des Paramètres et de chercher la valeur nommée CSMHotkey dans HKCU\Software\OpenShell\StartMenu\Settings WSMHotkey.tipAddition = .\n\nLa valeur de base est le code virtuel principal de la touche. Ajouter 256 pour Maj, 512 pour Contrôle et 1024 pour and 1024 Alt.\nLa meilleur façon pour obtenir la valeur est de sélectionnez la touche raccourcie dans le boîte de dialogue des Paramètres et de chercher la valeur nommée WSMHotkey in HKCU\Software\OpenShell\StartMenu\Settings +SearchFiles.tipOverride = Lorsque cette case est cochée, les résultats de la recherche incluront les fichiers, e-mails et autres éléments provenant d'emplacements indexés diff --git a/Src/Localization/French/OpenShell.hhp b/Src/Localization/French/OpenShell.hhp index 2966625e8..1713822a4 100644 --- a/Src/Localization/French/OpenShell.hhp +++ b/Src/Localization/French/OpenShell.hhp @@ -5,12 +5,11 @@ Contents file=OpenShellTOC.hhc Default topic=Main.html Display compile progress=Yes Language=0x40C French (France) - +Title=Open-Shell Help [FILES] ClassicExplorer.html -Menu.html +StartMenu.html ClassicIE.html [INFOTYPES] - diff --git a/Src/Localization/French/OpenShellADMX.txt b/Src/Localization/French/OpenShellADMX.txt index d29752a6d..aaac49839 100644 --- a/Src/Localization/French/OpenShellADMX.txt +++ b/Src/Localization/French/OpenShellADMX.txt @@ -1,7 +1,7 @@ ; TRANSLATE =================================================================== Title.text = Paramètres Open-Shell -State.text = Etat: +State.text = État: State1.text = Verrouillé sur cette valeur State2.text = Verrouillé sur le paramètre par défaut State3.text = Déverrouillé @@ -13,7 +13,7 @@ OpenShellCat.text = Open-Shell OpenShellCatHelp.text = Paramètres de la stratégie de groupe de Open-Shell SUPPORTED_CS404.text = Nécessite Open-Shell 4.0.4 ou plus. -Language.nameOverride = Langage pour les composants Open-Shell -Language.tipOverride = Sélectionnez la langue pour être utilisée avec Open-Shell (par exemple en-US ou de-DE). La langue affectera le texte dans le menu démarrer, les barres d'outils, etc. Si la DLL de langue appropriée est installée, les paramètres UI peuvent aussi être traduits +Language.nameOverride = Langue pour les composants Open-Shell +Language.tipOverride = Sélectionnez la langue à utiliser avec Open-Shell (par exemple en-US ou de-DE). Le choix de langue affectera le texte dans le menu démarrer, les barres d'outils, etc. Si la DLL de langue appropriée est installée, les paramètres UI peuvent aussi être traduits Update.nameOverride = Activer la vérification automatique de nouvelles versions -Update.tipOverride = Lorsque ceci est coché, Open-Shell vérifiera s'il y a des nouvelles versions chaque semaine. Vous serez averti s'il y a une nouvelle version du logiciel ou une mise à jour pour votre langage actuel +Update.tipOverride = Lorsque ceci est coché, Open-Shell vérifiera s'il y a des nouvelles versions chaque semaine. Vous serez averti s'il y a une nouvelle version du logiciel ou une mise à jour pour votre langue actuelle diff --git a/Src/Localization/French/OpenShellTOC.hhc b/Src/Localization/French/OpenShellTOC.hhc index 2352b44c4..bc1909814 100644 --- a/Src/Localization/French/OpenShellTOC.hhc +++ b/Src/Localization/French/OpenShellTOC.hhc @@ -15,51 +15,51 @@
  • - +
    • - +
    • - +
    • - - + +
    • - - + +
    • - +
    • - +
    • - +
    • - +
    • - +
    • - +
  • diff --git a/Src/Localization/French/Menu.html b/Src/Localization/French/StartMenu.html similarity index 86% rename from Src/Localization/French/Menu.html rename to Src/Localization/French/StartMenu.html index 4b6854181..e22e58aab 100644 --- a/Src/Localization/French/Menu.html +++ b/Src/Localization/French/StartMenu.html @@ -37,13 +37,13 @@

    Styles

    Le menu démarrer offre 3 choix de styles.

    1) Simple colonne style classique (classic)


    -Ce style est très similaire au menu trouvé dans Windows 2000. Il a une colonne dans le menu principal avec du texte vertical sur le côté, vous pouvez personnaliser l'ordre des éléments, icônes et texte.
    +Ce style est très similaire au menu trouvé dans Windows 2000. Il a une colonne dans le menu principal avec du texte vertical sur le côté, vous pouvez personnaliser l’ordre des éléments, icônes et texte.
    -Programmes, listes de raccourcis, et résultats de recherche s'affichent comme des sous-menus cascadés.
    +Programmes, listes de raccourcis, et résultats de recherche s’affichent comme des sous-menus cascadés.

    2) Style classique (classic) 2 colonnes


    Ceci est similaire au menu de Windows XP. Il y a 2 colonnes où vous pouvez arranger vos éléments de menu. Personnaliser leurs ordres, icônes et texte.
    -Programmes, listes de raccourcis, et résultats de recherche s'affichent comme des sous-menus cascadés.
    +Programmes, listes de raccourcis, et résultats de recherche s’affichent comme des sous-menus cascadés.

    3) Style Windows 7


    Ceci est similaire au menu Windows Vista et Windows 7. Les éléments dans la première colonne sont prédéfinis comme épingler et Programmes Récents, la liste de Tous les Programmes et la zone de recherche. Les éléments dans la seconde colonne sont entièrement personnalisable.
    -Les listes de raccourcis et les résultats de recherche sont affichés à l'intérieur du menu principal. Les programmes peuvent être à l'intérieur du menu principal ou -s'afficher sous la forme d’un sous-menu cascadé.
    +Les listes de raccourcis et les résultats de recherche sont affichés à l’intérieur du menu principal. Les programmes peuvent être à l’intérieur du menu principal ou +s’afficher sous la forme d’un sous-menu cascadé.
    Ce style offre moins d’ options de personnalisation que les styles classiques (classic), mais donne une apparence et un sentiment plus familier aux personnes ayant utilisé Windows 7.


    @@ -87,16 +87,16 @@

    Opération

    Appuyez sur la touche Windows ou cliquez sur l’ orbe de Open-Shell dans le coin de l’ écran pour ouvrir le menu démarrer.

    -Maintenez Majuscule enfoncée pendant que vous cliquez sur l’ orbe de Open-Shell pour accéder au menu démarrer d'origine du système d'exploitation. +Maintenez Majuscule enfoncée pendant que vous cliquez sur l’ orbe de Open-Shell pour accéder au menu démarrer d’origine du système d’exploitation.

    -Cliquez sur un élément pour l'exécuter. +Cliquez sur un élément pour l’exécuter.

    -Glissez un programme pour changer l'ordre des programmes dans un menu, ou pour le déplacer dans un autre dossier. +Glissez un programme pour changer l’ordre des programmes dans un menu, ou pour le déplacer dans un autre dossier.

    -Clic droit sur un élément pour le renomer, le supprimer, l’explorer, trier le menu, ou effectuer d'autres tches.

    +Clic droit sur un élément pour le renomer, le supprimer, l’explorer, trier le menu, ou effectuer d’autres tâches.

    Clic droit sur l’orbe de Open-Shell pour modifier les paramètres du menu démarrer, pour voir ce fichier d’aide, ou pour stopper le menu démarrer.

    @@ -109,7 +109,7 @@



    Vous pouvez choisir d'afficher les paramètres de base ou tous les paramètres disponibles. Survolez chaque paramètre pour obtenir une description de sa fonction. -Saisissez un mot dans la zone de recherche pour trouver un paramètre grce à son nom.
    +Saisissez un mot dans la zone de recherche pour trouver un paramètre grâce à son nom.
    Chaque paramètre à une valeur par défaut. La valeur par défaut peut-être une constante, ou elle peut dépendre des paramètres systèmes actuels. Une fois que vous modifiez un paramètre, celui-ci devient "modifié" et est affiché en gras. Pour revenir au paramètre par défaut, clic droit sur le paramètre.
    @@ -177,14 +177,14 @@

    Paramètres Administratifs

    Les paramètres sont par utilisateur et sont stocker dans la registrerie. Par défaut chaque utilisateur peut modifier n’importe quel paramètre. Un administrateur peut verrouiller des paramètres spécifiques, de façon à ce qu’aucun utilisateur ne puisse les modifier :

    -Dans cet exemple le paramètre "Activer menu clic-droit" est verrouillé non coché et ne peut pas être modifer par aucun utilisateur. Ceci est rendu possible par l’ajout du paramètre HKEY_LOCAL_MACHINE\SOFTWARE\OpenShell\Menu dans la clef de registrerie. Créez une valeur DWORD nommée "EnableContextMenu" et +Dans cet exemple le paramètre "Activer menu clic-droit" est verrouillé non coché et ne peut pas être modifer par aucun utilisateur. Ceci est rendu possible par l’ajout du paramètre HKEY_LOCAL_MACHINE\SOFTWARE\OpenShell\StartMenu dans la clef de registrerie. Créez une valeur DWORD nommée "EnableContextMenu" et configurez là à 0.

    Dans certains cas vous ne voudrez peut être pas verrouiller une valeur pour tous les utilisateurs, mais simplement modifier la valeur initiale du paramètre. Dans ce cas ajoutez "_Default" au nom de la valeur. Par exemple si vous voulez que le menu contextuel soit désactivé par défaut mais que vous voulez autoriser les utilisateurs à modifier cette valeur s’ils le veulent, créez une valeur DWORD nommée "EnableContextMenu_Default" et configurez là à 0.

    -La façon la plus facile de connaître le nom registrerie d'un paramètre et ça valeur pour la modifier, est de la rechercher dans HKEY_CURRENT_USER\Software\OpenShell\StartMenu\Settings.
    +La façon la plus facile de connaître le nom registrerie d’un paramètre et ça valeur pour la modifier, est de la rechercher dans HKEY_CURRENT_USER\Software\OpenShell\StartMenu\Settings.
    Quelqes fois vous voudrez verrouiller un paramètre à sa valeur par défaut, mais vous ne savez quelle est la valeur par défaut. Dans ce cas créez une valeur DWORD et configurez là à 0xDEFA.
    @@ -194,7 +194,7 @@

    Paramètres Administratifs



    -Le menu démarrer vérifie aussi la plupart des stratégies de groupe configurées par l’administrateur. Exécutez gpedit.msc et aller à Configuration User Configuration -> Modèles Administratifs -> Menu Démarrer et Barre des Tches. A partir de là, vous pouvez désactiver Exécuter, Arrêter, Aide, et d'autres fonctions. (Non disponible sur les version Home de Windows).
    +Le menu démarrer vérifie aussi la plupart des stratégies de groupe configurées par l’administrateur. Exécutez gpedit.msc et aller à Configuration User Configuration -> Modèles Administratifs -> Menu Démarrer et Barre des Tâches. A partir de là, vous pouvez désactiver Exécuter, Arrêter, Aide, et d’autres fonctions. (Non disponible sur les version Home de Windows).

    Modifier les paramètres au travers des stratégies de groupe est aussi supporté. Décompressez le fichier PolicyDefinitions.zip qui se trouve dans le dossier d’installation et lisez le document PolicyDefinitions.rtf pour plus de détails.

    @@ -208,24 +208,24 @@

    En savoir plus à propos des Peaux (Skins)

    Files\Open-Shell\Skins. Après cela, elle sera disponible dans les paramètres.

    Note: Certaines peaux (skins) peuvent être spécifiquement conçues pour le mode -Classic, Basic, ou Aero. Par exemple une peau (skin) Aero nécessitera peut être le support de l'option verre, les autres auront une apparence bizarre si le thème Classique (Classic) ou Base (Basic) est sélectionné. Certaines peaux (skins) Aero nécessiteront aussi peut être une couleur de verre spécifique à sélectionner.
    +Classic, Basic, ou Aero. Par exemple une peau (skin) Aero nécessitera peut être le support de l’option verre, les autres auront une apparence bizarre si le thème Classique (Classic) ou Base (Basic) est sélectionné. Certaines peaux (skins) Aero nécessiteront aussi peut être une couleur de verre spécifique à sélectionner.

    -Vous pouvez créer votre propre peau (skin). Vous aurez besoin d'un logiciel de retouche d’image qui supporte le canal Alpha (comme Gimp ou Photoshop) et un outil pour modifier les fichiers ressources (comme Resource Hacker ou Visual Studio). Et bien sûr quelques talents en conception de graphisme :). Lisez le Tutoriel de peaux (Skinning Tutorial) en anglais avant de commencer.
    +Vous pouvez créer votre propre peau (skin). Vous aurez besoin d’un logiciel de retouche d’image qui supporte le canal Alpha (comme Gimp ou Photoshop) et un outil pour modifier les fichiers ressources (comme Resource Hacker ou Visual Studio). Et bien sûr quelques talents en conception de graphisme :). Lisez le Tutoriel de peaux (Skinning Tutorial) en anglais avant de commencer.



    Recherche



    - La zone de recherche vous laisse rechercher du contenu dans le menu démarrer, les programmes qui se trouvent dans la variable d'environnement PATH et les fichiers indexés. -Vous pouvez avoir la zone de recherche apparaître sous forme d'élément de menu normal et ensuite vous pouvez y aller en utilisant les touches claviers flèches haut/bas. -Vous pouvez choisir d'avoir la zone de recherche sélectionné par défaut quand vous ouvrez le menu démarrer. Ou vous pouvez choisir d’activer la zone de recherche seulement avec la touche Tab, de façon que tant que vous n'utilisez pas la touche tab vous pouvez utiliser le clavier pour naviguer comme si la zone de recherche n'était pas là.
    + La zone de recherche vous laisse rechercher du contenu dans le menu démarrer, les programmes qui se trouvent dans la variable d’environnement PATH et les fichiers indexés. +Vous pouvez avoir la zone de recherche apparaître sous forme d’élément de menu normal et ensuite vous pouvez y aller en utilisant les touches claviers flèches haut/bas. +Vous pouvez choisir d’avoir la zone de recherche sélectionné par défaut quand vous ouvrez le menu démarrer. Ou vous pouvez choisir d’activer la zone de recherche seulement avec la touche Tab, de façon que tant que vous n’utilisez pas la touche tab vous pouvez utiliser le clavier pour naviguer comme si la zone de recherche n’était pas là.

    Les résultats de recherche s'affichent dans le menu principal si vous utilisez le style Windows 7 ou dans un sous-menu pour les styles Classiques (Classic).
    Cliquez sur chaque catégorie pour la développer et voir plus de résultats. Cliquez sur l’icône à la fin pour voir tous les résultats dans l’Explorateur.

    -Les styles Classiques (Classic) vous permettent de configurer des "fournisseurs de recherche" additionnels, que vous pouvez utiliser pour rechercher du texte à partir de la zone de recherche. Vous pouvez exécuter ce programme de recherche soit en le sélectionnant à partir du menu, soit en appuyant sur la touche Alt. Dans cet exemple utilisez Alt+A pour l'Agent Ransack.
    +Les styles Classiques (Classic) vous permettent de configurer des "fournisseurs de recherche" additionnels, que vous pouvez utiliser pour rechercher du texte à partir de la zone de recherche. Vous pouvez exécuter ce programme de recherche soit en le sélectionnant à partir du menu, soit en appuyant sur la touche Alt. Dans cet exemple utilisez Alt+A pour l’Agent Ransack.


    -Ceci est fait en ajoutant des sous-éléments à l'élément zone de recherche dans l’onglet Personnaliser le Menu Démarrer :
    +Ceci est fait en ajoutant des sous-éléments à l’élément zone de recherche dans l’onglet Personnaliser le Menu Démarrer :


    Ouvrez chaque sous-élément et saisissez la commande pour démarrer le programme de recherche. Si vous utilisez %1 dans la commande, cela sera remplacé par le contenu de la zone de recherche. Si vous utilisez %2 cela sera remplacé par le texte de la zone de recherche encodé au format url. @@ -240,7 +240,7 @@

    Recherche

    Bouton Démarrer Personnalisable
    -Open-Shell peut ajouter son propre bouton démarrer à la barre des tches. Il peut même remplacer le bouton démarrer par défaut de Windows 7. +Open-Shell peut ajouter son propre bouton démarrer à la barre des tâches. Il peut même remplacer le bouton démarrer par défaut de Windows 7. Vous pouvez choisir entre un bouton orbe style Aero, un bouton classique rectangulaire, ou vous pouvez faire le vôtre. Pour un bouton démarrer personnalisé vous avez besoin d’une image qui contient 3 états du bouton - normal, chaud et cliqué :
    Images du bouton démarrer
    diff --git a/Src/Localization/French/images/OpenShell.png b/Src/Localization/French/images/OpenShell.png index 1c1786845..228453efc 100644 Binary files a/Src/Localization/French/images/OpenShell.png and b/Src/Localization/French/images/OpenShell.png differ diff --git a/Src/Localization/German/Main.html b/Src/Localization/German/Main.html index 2701aa697..9b65db1b5 100644 --- a/Src/Localization/German/Main.html +++ b/Src/Localization/German/Main.html @@ -33,7 +33,7 @@

    System Anforderungen

    Programmteile


    Open-Shell besteht aus drei Hauptprogrammteilen: diff --git a/Src/Localization/German/OpenShell.hhp b/Src/Localization/German/OpenShell.hhp index 323719722..cf641de9f 100644 --- a/Src/Localization/German/OpenShell.hhp +++ b/Src/Localization/German/OpenShell.hhp @@ -5,12 +5,11 @@ Contents file=OpenShellTOC.hhc Default topic=Main.html Display compile progress=Yes Language=0x409 English (United States) - +Title=Open-Shell Help [FILES] ClassicExplorer.html -Menu.html +StartMenu.html ClassicIE.html [INFOTYPES] - diff --git a/Src/Localization/German/OpenShellTOC.hhc b/Src/Localization/German/OpenShellTOC.hhc index 9835e2363..cbbb5bb83 100644 --- a/Src/Localization/German/OpenShellTOC.hhc +++ b/Src/Localization/German/OpenShellTOC.hhc @@ -15,51 +15,51 @@
  • - +
    • - +
    • - +
    • - - + +
    • - - + +
    • - +
    • - +
    • - +
    • - +
    • - +
    • - +
  • diff --git a/Src/Localization/Polish/Main.html b/Src/Localization/Polish/Main.html index 5e444c462..7d3c93217 100644 --- a/Src/Localization/Polish/Main.html +++ b/Src/Localization/Polish/Main.html @@ -34,7 +34,7 @@

    Wymagania systemowe

    Składniki


    Open-Shell składa się z trzech głównych składników: diff --git a/Src/Localization/Polish/OpenShell.hhp b/Src/Localization/Polish/OpenShell.hhp index f9e030867..661febeb1 100644 --- a/Src/Localization/Polish/OpenShell.hhp +++ b/Src/Localization/Polish/OpenShell.hhp @@ -5,12 +5,11 @@ Contents file=OpenShellTOC.hhc Default topic=Main.html Display compile progress=Yes Language=0x415 Polish (Poland) - +Title=Open-Shell Help [FILES] ClassicExplorer.html -Menu.html +StartMenu.html ClassicIE.html [INFOTYPES] - diff --git a/Src/Localization/Polish/OpenShellTOC.hhc b/Src/Localization/Polish/OpenShellTOC.hhc index 7579a7370..914f17989 100644 --- a/Src/Localization/Polish/OpenShellTOC.hhc +++ b/Src/Localization/Polish/OpenShellTOC.hhc @@ -15,51 +15,51 @@
  • - +
    • - +
    • - +
    • - - + +
    • - - + +
    • - +
    • - +
    • - +
    • - +
    • - +
    • - +
  • diff --git a/Src/Localization/Polish/Menu.html b/Src/Localization/Polish/StartMenu.html similarity index 99% rename from Src/Localization/Polish/Menu.html rename to Src/Localization/Polish/StartMenu.html index 04ffcd6ff..1677ec63f 100644 --- a/Src/Localization/Polish/Menu.html +++ b/Src/Localization/Polish/StartMenu.html @@ -192,7 +192,7 @@

    Ustawienia administracyjne


    W tym przykładzie ustawienie "Włącz menu kontekstowe" jest zablokowane, tak aby pole wyboru zawsze było odznaczone i nie mogło być zmienione przez dowolnego użytkownika. Osiąga się to przez -dodanie odpowiednich ustawień w kluczu rejestru HKEY_LOCAL_MACHINE\SOFTWARE\OpenShell\Menu. Należy utworzyć wartość DWORD o nazwie "EnableContextMenu" i ustawić jej wartość na 0.
    +dodanie odpowiednich ustawień w kluczu rejestru HKEY_LOCAL_MACHINE\SOFTWARE\OpenShell\StartMenu. Należy utworzyć wartość DWORD o nazwie "EnableContextMenu" i ustawić jej wartość na 0.

    W niektórych przypadkach możesz nie chcieć zablokować wartości dla wszystkich użytkowników, ale jedynie chcesz zmienić początkową wartość ustawienia. W takim przypadku należy dodać diff --git a/Src/Localization/Russian/Main.html b/Src/Localization/Russian/Main.html index 558aeb73e..6e6503680 100644 --- a/Src/Localization/Russian/Main.html +++ b/Src/Localization/Russian/Main.html @@ -12,7 +12,7 @@

    Веб-узел Open-Shell  Open-Shell

    Версия 4.3.1 общий выпуск

    Что такое Open-Shell?

    Open-Shellпредставляет собой коллекцию улучшений для Windows. Open-Shell имеет настраиваемые главное меню и кнопку Пуск, добавляет панель инструментов для проводника Windows и поддерживает множество мелких функций.



    Системные требования

    Open-Shell работает на Windows 7, Windows 8, Windows 8.1, Windows Server 2008 R2, Windows Server 2012 и Windows Server 2012 R2. Поддерживает 32 и 64-разрядные версии (универсальная программа установки). Для некоторых обложек меню "Пуск" необходимо включить тему Aero. Для других обложек требуется тема упрощенного стиля Windows.


    Компоненты


    Open-Shell имеет три основных компонента:

    Удаление

    Вы можете удалить Open-Shell через Панель управления -> Программы и компоненты. Другой способ удаления заключается в  в повторном запуске программы установки и выборе команды "Удалить".
    Возможно потребуется завершить сеанс для завершения этого процесса.

    diff --git a/Src/Localization/Russian/OpenShell.hhp b/Src/Localization/Russian/OpenShell.hhp index b8e59e062..371c59f73 100644 --- a/Src/Localization/Russian/OpenShell.hhp +++ b/Src/Localization/Russian/OpenShell.hhp @@ -5,12 +5,11 @@ Contents file=OpenShellTOC.hhc Default topic=Main.html Display compile progress=Yes Language=0x419 Russian (Russia) - +Title= Open-Shell [FILES] ClassicExplorer.html -Menu.html +StartMenu.html ClassicIE.html [INFOTYPES] - diff --git a/Src/Localization/Russian/OpenShellTOC.hhc b/Src/Localization/Russian/OpenShellTOC.hhc index 6b13bab3d..c8d482149 100644 --- a/Src/Localization/Russian/OpenShellTOC.hhc +++ b/Src/Localization/Russian/OpenShellTOC.hhc @@ -15,51 +15,51 @@
  • - +
    • - +
    • - +
    • - - + +
    • - - + +
    • - +
    • - +
    • - +
    • - +
    • - +
    • - +
  • diff --git a/Src/Localization/Russian/Menu.html b/Src/Localization/Russian/StartMenu.html similarity index 99% rename from Src/Localization/Russian/Menu.html rename to Src/Localization/Russian/StartMenu.html index 54789712d..0a29c0700 100644 --- a/Src/Localization/Russian/Menu.html +++ b/Src/Localization/Russian/StartMenu.html @@ -112,7 +112,7 @@

    Парамет сможет редактировать их:

    В данном примере параметр "Включить меню правой кнопки мыши" всегда заблокировано и не может быть изменен любым пользователем. Это -достигается путем добавления параметра в разделе реестра HKEY_LOCAL_MACHINE\SOFTWARE\OpenShell\Menu. Создайте значение DWORD под названием "EnableContextMenu" и установите его в 0.

    +достигается путем добавления параметра в разделе реестра HKEY_LOCAL_MACHINE\SOFTWARE\OpenShell\StartMenu. Создайте значение DWORD под названием "EnableContextMenu" и установите его в 0.

    В некоторых случаях возможно вы не захотите заблокировать значение для всех пользователей, просто измените начальное значение параметра. В таком случае добавьте имя значения "_Default". Например, если diff --git a/Src/Localization/Spanish/Main.html b/Src/Localization/Spanish/Main.html index 7a4bda638..64e838a63 100644 --- a/Src/Localization/Spanish/Main.html +++ b/Src/Localization/Spanish/Main.html @@ -34,7 +34,7 @@

    Requisitos del sistema

    Componentes


    Open-Shell tiene tres componentes principales: diff --git a/Src/Localization/Spanish/OpenShell.hhp b/Src/Localization/Spanish/OpenShell.hhp index 3dc1b9426..bb6c4194c 100644 --- a/Src/Localization/Spanish/OpenShell.hhp +++ b/Src/Localization/Spanish/OpenShell.hhp @@ -6,12 +6,11 @@ Default topic=Main.html Display compile progress=Yes Full-text search=Yes Language=0xc0a Espaol (Espaa, internacional) - +Title=Open-Shell Help [FILES] ClassicExplorer.html -Menu.html +StartMenu.html ClassicIE.html [INFOTYPES] - diff --git a/Src/Localization/Spanish/OpenShellTOC.hhc b/Src/Localization/Spanish/OpenShellTOC.hhc index 29b642b34..128fa956f 100644 --- a/Src/Localization/Spanish/OpenShellTOC.hhc +++ b/Src/Localization/Spanish/OpenShellTOC.hhc @@ -15,51 +15,51 @@
  • - +
    • - +
    • - +
    • - - + +
    • - - + +
    • - +
    • - +
    • - +
    • - +
    • - +
    • - +
  • diff --git a/Src/Localization/Spanish/Menu.html b/Src/Localization/Spanish/StartMenu.html similarity index 99% rename from Src/Localization/Spanish/Menu.html rename to Src/Localization/Spanish/StartMenu.html index fe680ba25..f1116027a 100644 --- a/Src/Localization/Spanish/Menu.html +++ b/Src/Localization/Spanish/StartMenu.html @@ -179,7 +179,7 @@

    Configuraci
    En este ejemplo, la configuracin "Habilitar el men del botn secundario" est bloqueada para que siempre est desmarcada y ningn usuario la pueda cambiar. Esto se logra -agregando la configuracin a la clave del registro HKEY_LOCAL_MACHINE\SOFTWARE\OpenShell\Menu. Cree un valor DWORD llamado "EnableContextMenu" y establzcalo en 0.
    +agregando la configuracin a la clave del registro HKEY_LOCAL_MACHINE\SOFTWARE\OpenShell\StartMenu. Cree un valor DWORD llamado "EnableContextMenu" y establzcalo en 0.

    En algunos casos quiz no desee bloquear el valor para todos los usuarios, sino simplemente modificar el valor inicial de la configuracin. En tal caso, agregue diff --git a/Src/Localization/Spanish/images/OpenShell.png b/Src/Localization/Spanish/images/OpenShell.png index 1c1786845..228453efc 100644 Binary files a/Src/Localization/Spanish/images/OpenShell.png and b/Src/Localization/Spanish/images/OpenShell.png differ diff --git a/Src/Localization/WixUI/WixUI_ja-jp.wxl b/Src/Localization/WixUI/WixUI_ja-jp.wxl index f6e5e4faf..5487b6ccf 100644 --- a/Src/Localization/WixUI/WixUI_ja-jp.wxl +++ b/Src/Localization/WixUI/WixUI_ja-jp.wxl @@ -31,7 +31,7 @@ 12 9 8 - "MS UI Gothic", "MS PGothic", "MS Pゴシック", "MS Gothic", "MS ゴシック", Osaka, Tahoma + "MS UI Gothic", "MS PGothic", "MS Pゴシック", "MS Gothic", "MS ゴシック", Yu Gothic UI, Tahoma [ProductName] セットアップ 場所(&L): diff --git a/Src/OpenShell.sln b/Src/OpenShell.sln index 320903968..c53d1eb2f 100644 --- a/Src/OpenShell.sln +++ b/Src/OpenShell.sln @@ -1,18 +1,18 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 16 -VisualStudioVersion = 16.0.29324.140 +# Visual Studio Version 17 +VisualStudioVersion = 17.4.33205.214 MinimumVisualStudioVersion = 10.0.40219.1 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Skins", "Skins", "{409484D8-C0DB-4991-AF03-124128EDEF98}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Setup", "Setup", "{B695E1F6-785D-45CB-BCE0-0E9635DFC1DE}" EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ClassicExplorer", "ClassicExplorer\ClassicExplorer.vcxproj", "{9AF324B7-F786-4D85-B2E1-6E51720F874E}" -EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "StartMenu", "StartMenu\StartMenu.vcxproj", "{87D5FE20-AF86-458A-9AA3-3131EB06179B}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "StartMenuDLL", "StartMenu\StartMenuDLL\StartMenuDLL.vcxproj", "{85DEECBB-1F9B-4983-9D54-3BF42182B7E7}" EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ClassicExplorer", "ClassicExplorer\ClassicExplorer.vcxproj", "{9AF324B7-F786-4D85-B2E1-6E51720F874E}" +EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Setup", "Setup\Setup.vcxproj", "{A4A4D3B1-24E7-401E-A37C-72141D7603DC}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Win7Aero", "Skins\Win7Aero\Win7Aero.vcxproj", "{EA65FDDD-CB77-417F-8BB4-2F3ECB5B3E75}" @@ -54,8 +54,6 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Win8", "Skins\Win8\Win8.vcx EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "StartMenuHelper", "StartMenu\StartMenuHelper\StartMenuHelper.vcxproj", "{A42C6159-ACA8-46D1-A0FB-19C398B137D5}" EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "UpdateBin", "Setup\UpdateBin\UpdateBin.vcxproj", "{F92A5473-F9E0-412F-923C-6632A66D13C1}" -EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Utility", "Setup\Utility\Utility.vcxproj", "{DAE66C9B-05DC-4ACE-97DA-2547B490BBFF}" EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Midnight7", "Skins\Midnight7\Midnight7.vcxproj", "{7BD26CB3-5280-48FD-9A86-C13E321018D5}" @@ -68,326 +66,508 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Metallic7", "Skins\Metallic EndProject Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "DesktopToasts", "Update\DesktopToasts\DesktopToasts.vcxproj", "{D94BD2A6-1872-4F01-B911-F406603AA2E1}" EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Immersive", "Skins\Immersive\Immersive.vcxproj", "{BD28B058-230E-42DF-9FB1-FFBB0153F498}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Immersive7", "Skins\Immersive7\Immersive7.vcxproj", "{75809D15-8403-420A-BBE6-05F478D88D8E}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|ARM64 = Debug|ARM64 Debug|Win32 = Debug|Win32 Debug|x64 = Debug|x64 + Release|ARM64 = Release|ARM64 Release|Win32 = Release|Win32 Release|x64 = Release|x64 + Setup|ARM64 = Setup|ARM64 Setup|Win32 = Setup|Win32 Setup|x64 = Setup|x64 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {9AF324B7-F786-4D85-B2E1-6E51720F874E}.Debug|Win32.ActiveCfg = Debug|Win32 - {9AF324B7-F786-4D85-B2E1-6E51720F874E}.Debug|Win32.Build.0 = Debug|Win32 - {9AF324B7-F786-4D85-B2E1-6E51720F874E}.Debug|x64.ActiveCfg = Debug|x64 - {9AF324B7-F786-4D85-B2E1-6E51720F874E}.Debug|x64.Build.0 = Debug|x64 - {9AF324B7-F786-4D85-B2E1-6E51720F874E}.Release|Win32.ActiveCfg = Release|Win32 - {9AF324B7-F786-4D85-B2E1-6E51720F874E}.Release|Win32.Build.0 = Release|Win32 - {9AF324B7-F786-4D85-B2E1-6E51720F874E}.Release|x64.ActiveCfg = Release|x64 - {9AF324B7-F786-4D85-B2E1-6E51720F874E}.Release|x64.Build.0 = Release|x64 - {9AF324B7-F786-4D85-B2E1-6E51720F874E}.Setup|Win32.ActiveCfg = Setup|Win32 - {9AF324B7-F786-4D85-B2E1-6E51720F874E}.Setup|Win32.Build.0 = Setup|Win32 - {9AF324B7-F786-4D85-B2E1-6E51720F874E}.Setup|x64.ActiveCfg = Setup|x64 - {9AF324B7-F786-4D85-B2E1-6E51720F874E}.Setup|x64.Build.0 = Setup|x64 + {87D5FE20-AF86-458A-9AA3-3131EB06179B}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {87D5FE20-AF86-458A-9AA3-3131EB06179B}.Debug|ARM64.Build.0 = Debug|ARM64 + {87D5FE20-AF86-458A-9AA3-3131EB06179B}.Debug|ARM64.Deploy.0 = Debug|ARM64 {87D5FE20-AF86-458A-9AA3-3131EB06179B}.Debug|Win32.ActiveCfg = Debug|Win32 {87D5FE20-AF86-458A-9AA3-3131EB06179B}.Debug|Win32.Build.0 = Debug|Win32 {87D5FE20-AF86-458A-9AA3-3131EB06179B}.Debug|x64.ActiveCfg = Debug|x64 {87D5FE20-AF86-458A-9AA3-3131EB06179B}.Debug|x64.Build.0 = Debug|x64 + {87D5FE20-AF86-458A-9AA3-3131EB06179B}.Release|ARM64.ActiveCfg = Release|ARM64 + {87D5FE20-AF86-458A-9AA3-3131EB06179B}.Release|ARM64.Build.0 = Release|ARM64 + {87D5FE20-AF86-458A-9AA3-3131EB06179B}.Release|ARM64.Deploy.0 = Release|ARM64 {87D5FE20-AF86-458A-9AA3-3131EB06179B}.Release|Win32.ActiveCfg = Release|Win32 {87D5FE20-AF86-458A-9AA3-3131EB06179B}.Release|Win32.Build.0 = Release|Win32 {87D5FE20-AF86-458A-9AA3-3131EB06179B}.Release|x64.ActiveCfg = Release|x64 {87D5FE20-AF86-458A-9AA3-3131EB06179B}.Release|x64.Build.0 = Release|x64 + {87D5FE20-AF86-458A-9AA3-3131EB06179B}.Setup|ARM64.ActiveCfg = Setup|ARM64 + {87D5FE20-AF86-458A-9AA3-3131EB06179B}.Setup|ARM64.Build.0 = Setup|ARM64 {87D5FE20-AF86-458A-9AA3-3131EB06179B}.Setup|Win32.ActiveCfg = Setup|Win32 {87D5FE20-AF86-458A-9AA3-3131EB06179B}.Setup|Win32.Build.0 = Setup|Win32 {87D5FE20-AF86-458A-9AA3-3131EB06179B}.Setup|x64.ActiveCfg = Setup|x64 {87D5FE20-AF86-458A-9AA3-3131EB06179B}.Setup|x64.Build.0 = Setup|x64 + {85DEECBB-1F9B-4983-9D54-3BF42182B7E7}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {85DEECBB-1F9B-4983-9D54-3BF42182B7E7}.Debug|ARM64.Build.0 = Debug|ARM64 + {85DEECBB-1F9B-4983-9D54-3BF42182B7E7}.Debug|ARM64.Deploy.0 = Debug|ARM64 {85DEECBB-1F9B-4983-9D54-3BF42182B7E7}.Debug|Win32.ActiveCfg = Debug|Win32 {85DEECBB-1F9B-4983-9D54-3BF42182B7E7}.Debug|Win32.Build.0 = Debug|Win32 {85DEECBB-1F9B-4983-9D54-3BF42182B7E7}.Debug|x64.ActiveCfg = Debug|x64 {85DEECBB-1F9B-4983-9D54-3BF42182B7E7}.Debug|x64.Build.0 = Debug|x64 + {85DEECBB-1F9B-4983-9D54-3BF42182B7E7}.Release|ARM64.ActiveCfg = Release|ARM64 + {85DEECBB-1F9B-4983-9D54-3BF42182B7E7}.Release|ARM64.Build.0 = Release|ARM64 + {85DEECBB-1F9B-4983-9D54-3BF42182B7E7}.Release|ARM64.Deploy.0 = Release|ARM64 {85DEECBB-1F9B-4983-9D54-3BF42182B7E7}.Release|Win32.ActiveCfg = Release|Win32 {85DEECBB-1F9B-4983-9D54-3BF42182B7E7}.Release|Win32.Build.0 = Release|Win32 {85DEECBB-1F9B-4983-9D54-3BF42182B7E7}.Release|x64.ActiveCfg = Release|x64 {85DEECBB-1F9B-4983-9D54-3BF42182B7E7}.Release|x64.Build.0 = Release|x64 + {85DEECBB-1F9B-4983-9D54-3BF42182B7E7}.Setup|ARM64.ActiveCfg = Setup|ARM64 + {85DEECBB-1F9B-4983-9D54-3BF42182B7E7}.Setup|ARM64.Build.0 = Setup|ARM64 {85DEECBB-1F9B-4983-9D54-3BF42182B7E7}.Setup|Win32.ActiveCfg = Setup|Win32 {85DEECBB-1F9B-4983-9D54-3BF42182B7E7}.Setup|Win32.Build.0 = Setup|Win32 {85DEECBB-1F9B-4983-9D54-3BF42182B7E7}.Setup|x64.ActiveCfg = Setup|x64 {85DEECBB-1F9B-4983-9D54-3BF42182B7E7}.Setup|x64.Build.0 = Setup|x64 + {9AF324B7-F786-4D85-B2E1-6E51720F874E}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {9AF324B7-F786-4D85-B2E1-6E51720F874E}.Debug|ARM64.Build.0 = Debug|ARM64 + {9AF324B7-F786-4D85-B2E1-6E51720F874E}.Debug|Win32.ActiveCfg = Debug|Win32 + {9AF324B7-F786-4D85-B2E1-6E51720F874E}.Debug|Win32.Build.0 = Debug|Win32 + {9AF324B7-F786-4D85-B2E1-6E51720F874E}.Debug|x64.ActiveCfg = Debug|x64 + {9AF324B7-F786-4D85-B2E1-6E51720F874E}.Debug|x64.Build.0 = Debug|x64 + {9AF324B7-F786-4D85-B2E1-6E51720F874E}.Release|ARM64.ActiveCfg = Release|ARM64 + {9AF324B7-F786-4D85-B2E1-6E51720F874E}.Release|ARM64.Build.0 = Release|ARM64 + {9AF324B7-F786-4D85-B2E1-6E51720F874E}.Release|Win32.ActiveCfg = Release|Win32 + {9AF324B7-F786-4D85-B2E1-6E51720F874E}.Release|Win32.Build.0 = Release|Win32 + {9AF324B7-F786-4D85-B2E1-6E51720F874E}.Release|x64.ActiveCfg = Release|x64 + {9AF324B7-F786-4D85-B2E1-6E51720F874E}.Release|x64.Build.0 = Release|x64 + {9AF324B7-F786-4D85-B2E1-6E51720F874E}.Setup|ARM64.ActiveCfg = Setup|ARM64 + {9AF324B7-F786-4D85-B2E1-6E51720F874E}.Setup|ARM64.Build.0 = Setup|ARM64 + {9AF324B7-F786-4D85-B2E1-6E51720F874E}.Setup|Win32.ActiveCfg = Setup|Win32 + {9AF324B7-F786-4D85-B2E1-6E51720F874E}.Setup|Win32.Build.0 = Setup|Win32 + {9AF324B7-F786-4D85-B2E1-6E51720F874E}.Setup|x64.ActiveCfg = Setup|x64 + {9AF324B7-F786-4D85-B2E1-6E51720F874E}.Setup|x64.Build.0 = Setup|x64 + {A4A4D3B1-24E7-401E-A37C-72141D7603DC}.Debug|ARM64.ActiveCfg = Debug|Win32 + {A4A4D3B1-24E7-401E-A37C-72141D7603DC}.Debug|ARM64.Build.0 = Debug|Win32 {A4A4D3B1-24E7-401E-A37C-72141D7603DC}.Debug|Win32.ActiveCfg = Debug|Win32 {A4A4D3B1-24E7-401E-A37C-72141D7603DC}.Debug|Win32.Build.0 = Debug|Win32 {A4A4D3B1-24E7-401E-A37C-72141D7603DC}.Debug|x64.ActiveCfg = Debug|Win32 + {A4A4D3B1-24E7-401E-A37C-72141D7603DC}.Debug|x64.Build.0 = Debug|Win32 + {A4A4D3B1-24E7-401E-A37C-72141D7603DC}.Release|ARM64.ActiveCfg = Release|Win32 + {A4A4D3B1-24E7-401E-A37C-72141D7603DC}.Release|ARM64.Build.0 = Release|Win32 {A4A4D3B1-24E7-401E-A37C-72141D7603DC}.Release|Win32.ActiveCfg = Release|Win32 {A4A4D3B1-24E7-401E-A37C-72141D7603DC}.Release|Win32.Build.0 = Release|Win32 {A4A4D3B1-24E7-401E-A37C-72141D7603DC}.Release|x64.ActiveCfg = Release|Win32 + {A4A4D3B1-24E7-401E-A37C-72141D7603DC}.Release|x64.Build.0 = Release|Win32 + {A4A4D3B1-24E7-401E-A37C-72141D7603DC}.Setup|ARM64.ActiveCfg = Release|Win32 {A4A4D3B1-24E7-401E-A37C-72141D7603DC}.Setup|Win32.ActiveCfg = Release|Win32 {A4A4D3B1-24E7-401E-A37C-72141D7603DC}.Setup|x64.ActiveCfg = Release|Win32 + {EA65FDDD-CB77-417F-8BB4-2F3ECB5B3E75}.Debug|ARM64.ActiveCfg = Resource|Win32 + {EA65FDDD-CB77-417F-8BB4-2F3ECB5B3E75}.Debug|ARM64.Build.0 = Resource|Win32 {EA65FDDD-CB77-417F-8BB4-2F3ECB5B3E75}.Debug|Win32.ActiveCfg = Resource|Win32 {EA65FDDD-CB77-417F-8BB4-2F3ECB5B3E75}.Debug|Win32.Build.0 = Resource|Win32 {EA65FDDD-CB77-417F-8BB4-2F3ECB5B3E75}.Debug|x64.ActiveCfg = Resource|Win32 {EA65FDDD-CB77-417F-8BB4-2F3ECB5B3E75}.Debug|x64.Build.0 = Resource|Win32 + {EA65FDDD-CB77-417F-8BB4-2F3ECB5B3E75}.Release|ARM64.ActiveCfg = Resource|Win32 + {EA65FDDD-CB77-417F-8BB4-2F3ECB5B3E75}.Release|ARM64.Build.0 = Resource|Win32 {EA65FDDD-CB77-417F-8BB4-2F3ECB5B3E75}.Release|Win32.ActiveCfg = Resource|Win32 {EA65FDDD-CB77-417F-8BB4-2F3ECB5B3E75}.Release|Win32.Build.0 = Resource|Win32 {EA65FDDD-CB77-417F-8BB4-2F3ECB5B3E75}.Release|x64.ActiveCfg = Resource|Win32 {EA65FDDD-CB77-417F-8BB4-2F3ECB5B3E75}.Release|x64.Build.0 = Resource|Win32 + {EA65FDDD-CB77-417F-8BB4-2F3ECB5B3E75}.Setup|ARM64.ActiveCfg = Resource|Win32 {EA65FDDD-CB77-417F-8BB4-2F3ECB5B3E75}.Setup|Win32.ActiveCfg = Resource|Win32 {EA65FDDD-CB77-417F-8BB4-2F3ECB5B3E75}.Setup|Win32.Build.0 = Resource|Win32 {EA65FDDD-CB77-417F-8BB4-2F3ECB5B3E75}.Setup|x64.ActiveCfg = Resource|Win32 + {404821C5-4EE4-4908-A759-5EF6DAC14AB6}.Debug|ARM64.ActiveCfg = Resource|Win32 + {404821C5-4EE4-4908-A759-5EF6DAC14AB6}.Debug|ARM64.Build.0 = Resource|Win32 {404821C5-4EE4-4908-A759-5EF6DAC14AB6}.Debug|Win32.ActiveCfg = Resource|Win32 {404821C5-4EE4-4908-A759-5EF6DAC14AB6}.Debug|Win32.Build.0 = Resource|Win32 {404821C5-4EE4-4908-A759-5EF6DAC14AB6}.Debug|x64.ActiveCfg = Resource|Win32 {404821C5-4EE4-4908-A759-5EF6DAC14AB6}.Debug|x64.Build.0 = Resource|Win32 + {404821C5-4EE4-4908-A759-5EF6DAC14AB6}.Release|ARM64.ActiveCfg = Resource|Win32 + {404821C5-4EE4-4908-A759-5EF6DAC14AB6}.Release|ARM64.Build.0 = Resource|Win32 {404821C5-4EE4-4908-A759-5EF6DAC14AB6}.Release|Win32.ActiveCfg = Resource|Win32 {404821C5-4EE4-4908-A759-5EF6DAC14AB6}.Release|Win32.Build.0 = Resource|Win32 {404821C5-4EE4-4908-A759-5EF6DAC14AB6}.Release|x64.ActiveCfg = Resource|Win32 {404821C5-4EE4-4908-A759-5EF6DAC14AB6}.Release|x64.Build.0 = Resource|Win32 + {404821C5-4EE4-4908-A759-5EF6DAC14AB6}.Setup|ARM64.ActiveCfg = Resource|Win32 {404821C5-4EE4-4908-A759-5EF6DAC14AB6}.Setup|Win32.ActiveCfg = Resource|Win32 {404821C5-4EE4-4908-A759-5EF6DAC14AB6}.Setup|Win32.Build.0 = Resource|Win32 {404821C5-4EE4-4908-A759-5EF6DAC14AB6}.Setup|x64.ActiveCfg = Resource|Win32 + {9EC23CA9-384A-4EEB-979E-69879DC1A78C}.Debug|ARM64.ActiveCfg = Resource|Win32 + {9EC23CA9-384A-4EEB-979E-69879DC1A78C}.Debug|ARM64.Build.0 = Resource|Win32 {9EC23CA9-384A-4EEB-979E-69879DC1A78C}.Debug|Win32.ActiveCfg = Resource|Win32 {9EC23CA9-384A-4EEB-979E-69879DC1A78C}.Debug|Win32.Build.0 = Resource|Win32 {9EC23CA9-384A-4EEB-979E-69879DC1A78C}.Debug|x64.ActiveCfg = Resource|Win32 {9EC23CA9-384A-4EEB-979E-69879DC1A78C}.Debug|x64.Build.0 = Resource|Win32 + {9EC23CA9-384A-4EEB-979E-69879DC1A78C}.Release|ARM64.ActiveCfg = Resource|Win32 + {9EC23CA9-384A-4EEB-979E-69879DC1A78C}.Release|ARM64.Build.0 = Resource|Win32 {9EC23CA9-384A-4EEB-979E-69879DC1A78C}.Release|Win32.ActiveCfg = Resource|Win32 {9EC23CA9-384A-4EEB-979E-69879DC1A78C}.Release|Win32.Build.0 = Resource|Win32 {9EC23CA9-384A-4EEB-979E-69879DC1A78C}.Release|x64.ActiveCfg = Resource|Win32 {9EC23CA9-384A-4EEB-979E-69879DC1A78C}.Release|x64.Build.0 = Resource|Win32 + {9EC23CA9-384A-4EEB-979E-69879DC1A78C}.Setup|ARM64.ActiveCfg = Resource|Win32 {9EC23CA9-384A-4EEB-979E-69879DC1A78C}.Setup|Win32.ActiveCfg = Resource|Win32 {9EC23CA9-384A-4EEB-979E-69879DC1A78C}.Setup|Win32.Build.0 = Resource|Win32 {9EC23CA9-384A-4EEB-979E-69879DC1A78C}.Setup|x64.ActiveCfg = Resource|Win32 + {066C9721-26D5-4C4D-868E-50C2BA0A8196}.Debug|ARM64.ActiveCfg = Resource|Win32 + {066C9721-26D5-4C4D-868E-50C2BA0A8196}.Debug|ARM64.Build.0 = Resource|Win32 {066C9721-26D5-4C4D-868E-50C2BA0A8196}.Debug|Win32.ActiveCfg = Resource|Win32 {066C9721-26D5-4C4D-868E-50C2BA0A8196}.Debug|Win32.Build.0 = Resource|Win32 {066C9721-26D5-4C4D-868E-50C2BA0A8196}.Debug|x64.ActiveCfg = Resource|Win32 {066C9721-26D5-4C4D-868E-50C2BA0A8196}.Debug|x64.Build.0 = Resource|Win32 + {066C9721-26D5-4C4D-868E-50C2BA0A8196}.Release|ARM64.ActiveCfg = Resource|Win32 + {066C9721-26D5-4C4D-868E-50C2BA0A8196}.Release|ARM64.Build.0 = Resource|Win32 {066C9721-26D5-4C4D-868E-50C2BA0A8196}.Release|Win32.ActiveCfg = Resource|Win32 {066C9721-26D5-4C4D-868E-50C2BA0A8196}.Release|Win32.Build.0 = Resource|Win32 {066C9721-26D5-4C4D-868E-50C2BA0A8196}.Release|x64.ActiveCfg = Resource|Win32 {066C9721-26D5-4C4D-868E-50C2BA0A8196}.Release|x64.Build.0 = Resource|Win32 + {066C9721-26D5-4C4D-868E-50C2BA0A8196}.Setup|ARM64.ActiveCfg = Resource|Win32 {066C9721-26D5-4C4D-868E-50C2BA0A8196}.Setup|Win32.ActiveCfg = Resource|Win32 {066C9721-26D5-4C4D-868E-50C2BA0A8196}.Setup|Win32.Build.0 = Resource|Win32 {066C9721-26D5-4C4D-868E-50C2BA0A8196}.Setup|x64.ActiveCfg = Resource|Win32 + {66D1EAA4-65D1-45CC-9989-E616FC0575EB}.Debug|ARM64.ActiveCfg = Resource|Win32 + {66D1EAA4-65D1-45CC-9989-E616FC0575EB}.Debug|ARM64.Build.0 = Resource|Win32 {66D1EAA4-65D1-45CC-9989-E616FC0575EB}.Debug|Win32.ActiveCfg = Resource|Win32 {66D1EAA4-65D1-45CC-9989-E616FC0575EB}.Debug|Win32.Build.0 = Resource|Win32 {66D1EAA4-65D1-45CC-9989-E616FC0575EB}.Debug|x64.ActiveCfg = Resource|Win32 {66D1EAA4-65D1-45CC-9989-E616FC0575EB}.Debug|x64.Build.0 = Resource|Win32 + {66D1EAA4-65D1-45CC-9989-E616FC0575EB}.Release|ARM64.ActiveCfg = Resource|Win32 + {66D1EAA4-65D1-45CC-9989-E616FC0575EB}.Release|ARM64.Build.0 = Resource|Win32 {66D1EAA4-65D1-45CC-9989-E616FC0575EB}.Release|Win32.ActiveCfg = Resource|Win32 {66D1EAA4-65D1-45CC-9989-E616FC0575EB}.Release|Win32.Build.0 = Resource|Win32 {66D1EAA4-65D1-45CC-9989-E616FC0575EB}.Release|x64.ActiveCfg = Resource|Win32 {66D1EAA4-65D1-45CC-9989-E616FC0575EB}.Release|x64.Build.0 = Resource|Win32 + {66D1EAA4-65D1-45CC-9989-E616FC0575EB}.Setup|ARM64.ActiveCfg = Resource|Win32 {66D1EAA4-65D1-45CC-9989-E616FC0575EB}.Setup|Win32.ActiveCfg = Resource|Win32 {66D1EAA4-65D1-45CC-9989-E616FC0575EB}.Setup|Win32.Build.0 = Resource|Win32 {66D1EAA4-65D1-45CC-9989-E616FC0575EB}.Setup|x64.ActiveCfg = Resource|Win32 + {81EB6336-366C-47DD-82CF-FF6C36CCD2B5}.Debug|ARM64.ActiveCfg = Resource|Win32 + {81EB6336-366C-47DD-82CF-FF6C36CCD2B5}.Debug|ARM64.Build.0 = Resource|Win32 {81EB6336-366C-47DD-82CF-FF6C36CCD2B5}.Debug|Win32.ActiveCfg = Resource|Win32 {81EB6336-366C-47DD-82CF-FF6C36CCD2B5}.Debug|Win32.Build.0 = Resource|Win32 {81EB6336-366C-47DD-82CF-FF6C36CCD2B5}.Debug|x64.ActiveCfg = Resource|Win32 {81EB6336-366C-47DD-82CF-FF6C36CCD2B5}.Debug|x64.Build.0 = Resource|Win32 + {81EB6336-366C-47DD-82CF-FF6C36CCD2B5}.Release|ARM64.ActiveCfg = Resource|Win32 + {81EB6336-366C-47DD-82CF-FF6C36CCD2B5}.Release|ARM64.Build.0 = Resource|Win32 {81EB6336-366C-47DD-82CF-FF6C36CCD2B5}.Release|Win32.ActiveCfg = Resource|Win32 {81EB6336-366C-47DD-82CF-FF6C36CCD2B5}.Release|Win32.Build.0 = Resource|Win32 {81EB6336-366C-47DD-82CF-FF6C36CCD2B5}.Release|x64.ActiveCfg = Resource|Win32 {81EB6336-366C-47DD-82CF-FF6C36CCD2B5}.Release|x64.Build.0 = Resource|Win32 + {81EB6336-366C-47DD-82CF-FF6C36CCD2B5}.Setup|ARM64.ActiveCfg = Resource|Win32 {81EB6336-366C-47DD-82CF-FF6C36CCD2B5}.Setup|Win32.ActiveCfg = Resource|Win32 {81EB6336-366C-47DD-82CF-FF6C36CCD2B5}.Setup|Win32.Build.0 = Resource|Win32 {81EB6336-366C-47DD-82CF-FF6C36CCD2B5}.Setup|x64.ActiveCfg = Resource|Win32 + {E1017135-9916-4B11-9AC5-1EC0BD8F8CD6}.Debug|ARM64.ActiveCfg = Debug|Win32 {E1017135-9916-4B11-9AC5-1EC0BD8F8CD6}.Debug|Win32.ActiveCfg = Debug|Win32 {E1017135-9916-4B11-9AC5-1EC0BD8F8CD6}.Debug|Win32.Build.0 = Debug|Win32 {E1017135-9916-4B11-9AC5-1EC0BD8F8CD6}.Debug|x64.ActiveCfg = Debug|Win32 + {E1017135-9916-4B11-9AC5-1EC0BD8F8CD6}.Release|ARM64.ActiveCfg = Release|Win32 {E1017135-9916-4B11-9AC5-1EC0BD8F8CD6}.Release|Win32.ActiveCfg = Release|Win32 {E1017135-9916-4B11-9AC5-1EC0BD8F8CD6}.Release|Win32.Build.0 = Release|Win32 {E1017135-9916-4B11-9AC5-1EC0BD8F8CD6}.Release|x64.ActiveCfg = Release|Win32 + {E1017135-9916-4B11-9AC5-1EC0BD8F8CD6}.Setup|ARM64.ActiveCfg = Release|Win32 {E1017135-9916-4B11-9AC5-1EC0BD8F8CD6}.Setup|Win32.ActiveCfg = Release|Win32 {E1017135-9916-4B11-9AC5-1EC0BD8F8CD6}.Setup|Win32.Build.0 = Release|Win32 {E1017135-9916-4B11-9AC5-1EC0BD8F8CD6}.Setup|x64.ActiveCfg = Release|Win32 + {E93271C8-0252-4A08-8227-1978C64C2D34}.Debug|ARM64.ActiveCfg = Debug|Win32 {E93271C8-0252-4A08-8227-1978C64C2D34}.Debug|Win32.ActiveCfg = Debug|Win32 {E93271C8-0252-4A08-8227-1978C64C2D34}.Debug|Win32.Build.0 = Debug|Win32 {E93271C8-0252-4A08-8227-1978C64C2D34}.Debug|x64.ActiveCfg = Debug|Win32 + {E93271C8-0252-4A08-8227-1978C64C2D34}.Release|ARM64.ActiveCfg = Release|Win32 {E93271C8-0252-4A08-8227-1978C64C2D34}.Release|Win32.ActiveCfg = Release|Win32 {E93271C8-0252-4A08-8227-1978C64C2D34}.Release|Win32.Build.0 = Release|Win32 {E93271C8-0252-4A08-8227-1978C64C2D34}.Release|x64.ActiveCfg = Release|Win32 + {E93271C8-0252-4A08-8227-1978C64C2D34}.Setup|ARM64.ActiveCfg = Setup|Win32 {E93271C8-0252-4A08-8227-1978C64C2D34}.Setup|Win32.ActiveCfg = Setup|Win32 {E93271C8-0252-4A08-8227-1978C64C2D34}.Setup|Win32.Build.0 = Setup|Win32 {E93271C8-0252-4A08-8227-1978C64C2D34}.Setup|x64.ActiveCfg = Setup|Win32 + {0A60FD06-3A81-4651-A869-9850DBC115EA}.Debug|ARM64.ActiveCfg = Resource|Win32 {0A60FD06-3A81-4651-A869-9850DBC115EA}.Debug|Win32.ActiveCfg = Resource|Win32 {0A60FD06-3A81-4651-A869-9850DBC115EA}.Debug|Win32.Build.0 = Resource|Win32 {0A60FD06-3A81-4651-A869-9850DBC115EA}.Debug|x64.ActiveCfg = Resource|Win32 + {0A60FD06-3A81-4651-A869-9850DBC115EA}.Release|ARM64.ActiveCfg = Resource|Win32 {0A60FD06-3A81-4651-A869-9850DBC115EA}.Release|Win32.ActiveCfg = Resource|Win32 {0A60FD06-3A81-4651-A869-9850DBC115EA}.Release|Win32.Build.0 = Resource|Win32 {0A60FD06-3A81-4651-A869-9850DBC115EA}.Release|x64.ActiveCfg = Resource|Win32 + {0A60FD06-3A81-4651-A869-9850DBC115EA}.Setup|ARM64.ActiveCfg = Resource|Win32 {0A60FD06-3A81-4651-A869-9850DBC115EA}.Setup|Win32.ActiveCfg = Resource|Win32 {0A60FD06-3A81-4651-A869-9850DBC115EA}.Setup|Win32.Build.0 = Resource|Win32 {0A60FD06-3A81-4651-A869-9850DBC115EA}.Setup|x64.ActiveCfg = Resource|Win32 + {D42FE717-485B-492D-884A-1999F6D51154}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {D42FE717-485B-492D-884A-1999F6D51154}.Debug|ARM64.Build.0 = Debug|ARM64 {D42FE717-485B-492D-884A-1999F6D51154}.Debug|Win32.ActiveCfg = Debug|Win32 {D42FE717-485B-492D-884A-1999F6D51154}.Debug|Win32.Build.0 = Debug|Win32 {D42FE717-485B-492D-884A-1999F6D51154}.Debug|x64.ActiveCfg = Debug|x64 {D42FE717-485B-492D-884A-1999F6D51154}.Debug|x64.Build.0 = Debug|x64 + {D42FE717-485B-492D-884A-1999F6D51154}.Release|ARM64.ActiveCfg = Release|ARM64 + {D42FE717-485B-492D-884A-1999F6D51154}.Release|ARM64.Build.0 = Release|ARM64 {D42FE717-485B-492D-884A-1999F6D51154}.Release|Win32.ActiveCfg = Release|Win32 {D42FE717-485B-492D-884A-1999F6D51154}.Release|Win32.Build.0 = Release|Win32 {D42FE717-485B-492D-884A-1999F6D51154}.Release|x64.ActiveCfg = Release|x64 {D42FE717-485B-492D-884A-1999F6D51154}.Release|x64.Build.0 = Release|x64 + {D42FE717-485B-492D-884A-1999F6D51154}.Setup|ARM64.ActiveCfg = Release|ARM64 + {D42FE717-485B-492D-884A-1999F6D51154}.Setup|ARM64.Build.0 = Release|ARM64 {D42FE717-485B-492D-884A-1999F6D51154}.Setup|Win32.ActiveCfg = Release|Win32 {D42FE717-485B-492D-884A-1999F6D51154}.Setup|Win32.Build.0 = Release|Win32 {D42FE717-485B-492D-884A-1999F6D51154}.Setup|x64.ActiveCfg = Release|x64 {D42FE717-485B-492D-884A-1999F6D51154}.Setup|x64.Build.0 = Release|x64 + {65D5C193-E807-4094-AE19-19E6A310A312}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {65D5C193-E807-4094-AE19-19E6A310A312}.Debug|ARM64.Build.0 = Debug|ARM64 {65D5C193-E807-4094-AE19-19E6A310A312}.Debug|Win32.ActiveCfg = Debug|Win32 {65D5C193-E807-4094-AE19-19E6A310A312}.Debug|Win32.Build.0 = Debug|Win32 {65D5C193-E807-4094-AE19-19E6A310A312}.Debug|x64.ActiveCfg = Debug|x64 {65D5C193-E807-4094-AE19-19E6A310A312}.Debug|x64.Build.0 = Debug|x64 + {65D5C193-E807-4094-AE19-19E6A310A312}.Release|ARM64.ActiveCfg = Release|ARM64 + {65D5C193-E807-4094-AE19-19E6A310A312}.Release|ARM64.Build.0 = Release|ARM64 {65D5C193-E807-4094-AE19-19E6A310A312}.Release|Win32.ActiveCfg = Release|Win32 {65D5C193-E807-4094-AE19-19E6A310A312}.Release|Win32.Build.0 = Release|Win32 {65D5C193-E807-4094-AE19-19E6A310A312}.Release|x64.ActiveCfg = Release|x64 {65D5C193-E807-4094-AE19-19E6A310A312}.Release|x64.Build.0 = Release|x64 + {65D5C193-E807-4094-AE19-19E6A310A312}.Setup|ARM64.ActiveCfg = Setup|ARM64 + {65D5C193-E807-4094-AE19-19E6A310A312}.Setup|ARM64.Build.0 = Setup|ARM64 {65D5C193-E807-4094-AE19-19E6A310A312}.Setup|Win32.ActiveCfg = Setup|Win32 {65D5C193-E807-4094-AE19-19E6A310A312}.Setup|Win32.Build.0 = Setup|Win32 {65D5C193-E807-4094-AE19-19E6A310A312}.Setup|x64.ActiveCfg = Setup|x64 {65D5C193-E807-4094-AE19-19E6A310A312}.Setup|x64.Build.0 = Setup|x64 + {BC0E6E7C-08C1-4F12-A754-4608E5A22FA8}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {BC0E6E7C-08C1-4F12-A754-4608E5A22FA8}.Debug|ARM64.Build.0 = Debug|ARM64 {BC0E6E7C-08C1-4F12-A754-4608E5A22FA8}.Debug|Win32.ActiveCfg = Debug|Win32 {BC0E6E7C-08C1-4F12-A754-4608E5A22FA8}.Debug|Win32.Build.0 = Debug|Win32 {BC0E6E7C-08C1-4F12-A754-4608E5A22FA8}.Debug|x64.ActiveCfg = Debug|x64 {BC0E6E7C-08C1-4F12-A754-4608E5A22FA8}.Debug|x64.Build.0 = Debug|x64 + {BC0E6E7C-08C1-4F12-A754-4608E5A22FA8}.Release|ARM64.ActiveCfg = Release|ARM64 + {BC0E6E7C-08C1-4F12-A754-4608E5A22FA8}.Release|ARM64.Build.0 = Release|ARM64 {BC0E6E7C-08C1-4F12-A754-4608E5A22FA8}.Release|Win32.ActiveCfg = Release|Win32 {BC0E6E7C-08C1-4F12-A754-4608E5A22FA8}.Release|Win32.Build.0 = Release|Win32 {BC0E6E7C-08C1-4F12-A754-4608E5A22FA8}.Release|x64.ActiveCfg = Release|x64 {BC0E6E7C-08C1-4F12-A754-4608E5A22FA8}.Release|x64.Build.0 = Release|x64 + {BC0E6E7C-08C1-4F12-A754-4608E5A22FA8}.Setup|ARM64.ActiveCfg = Setup|ARM64 + {BC0E6E7C-08C1-4F12-A754-4608E5A22FA8}.Setup|ARM64.Build.0 = Setup|ARM64 {BC0E6E7C-08C1-4F12-A754-4608E5A22FA8}.Setup|Win32.ActiveCfg = Setup|Win32 {BC0E6E7C-08C1-4F12-A754-4608E5A22FA8}.Setup|Win32.Build.0 = Setup|Win32 {BC0E6E7C-08C1-4F12-A754-4608E5A22FA8}.Setup|x64.ActiveCfg = Setup|x64 {BC0E6E7C-08C1-4F12-A754-4608E5A22FA8}.Setup|x64.Build.0 = Setup|x64 + {171B46B0-6083-4D9E-BD33-946EA3BD76FA}.Debug|ARM64.ActiveCfg = Debug|Win32 {171B46B0-6083-4D9E-BD33-946EA3BD76FA}.Debug|Win32.ActiveCfg = Debug|Win32 {171B46B0-6083-4D9E-BD33-946EA3BD76FA}.Debug|Win32.Build.0 = Debug|Win32 {171B46B0-6083-4D9E-BD33-946EA3BD76FA}.Debug|x64.ActiveCfg = Debug|Win32 + {171B46B0-6083-4D9E-BD33-946EA3BD76FA}.Release|ARM64.ActiveCfg = Release|Win32 {171B46B0-6083-4D9E-BD33-946EA3BD76FA}.Release|Win32.ActiveCfg = Release|Win32 {171B46B0-6083-4D9E-BD33-946EA3BD76FA}.Release|Win32.Build.0 = Release|Win32 {171B46B0-6083-4D9E-BD33-946EA3BD76FA}.Release|x64.ActiveCfg = Release|Win32 + {171B46B0-6083-4D9E-BD33-946EA3BD76FA}.Setup|ARM64.ActiveCfg = Release|Win32 {171B46B0-6083-4D9E-BD33-946EA3BD76FA}.Setup|Win32.ActiveCfg = Release|Win32 {171B46B0-6083-4D9E-BD33-946EA3BD76FA}.Setup|Win32.Build.0 = Release|Win32 {171B46B0-6083-4D9E-BD33-946EA3BD76FA}.Setup|x64.ActiveCfg = Release|Win32 + {A2CCDE9F-17CE-461E-8BD9-00261B8855A6}.Debug|ARM64.ActiveCfg = Resource|Win32 + {A2CCDE9F-17CE-461E-8BD9-00261B8855A6}.Debug|ARM64.Build.0 = Resource|Win32 {A2CCDE9F-17CE-461E-8BD9-00261B8855A6}.Debug|Win32.ActiveCfg = Resource|Win32 {A2CCDE9F-17CE-461E-8BD9-00261B8855A6}.Debug|Win32.Build.0 = Resource|Win32 {A2CCDE9F-17CE-461E-8BD9-00261B8855A6}.Debug|x64.ActiveCfg = Resource|Win32 {A2CCDE9F-17CE-461E-8BD9-00261B8855A6}.Debug|x64.Build.0 = Resource|Win32 + {A2CCDE9F-17CE-461E-8BD9-00261B8855A6}.Release|ARM64.ActiveCfg = Resource|Win32 + {A2CCDE9F-17CE-461E-8BD9-00261B8855A6}.Release|ARM64.Build.0 = Resource|Win32 {A2CCDE9F-17CE-461E-8BD9-00261B8855A6}.Release|Win32.ActiveCfg = Resource|Win32 {A2CCDE9F-17CE-461E-8BD9-00261B8855A6}.Release|Win32.Build.0 = Resource|Win32 {A2CCDE9F-17CE-461E-8BD9-00261B8855A6}.Release|x64.ActiveCfg = Resource|Win32 {A2CCDE9F-17CE-461E-8BD9-00261B8855A6}.Release|x64.Build.0 = Resource|Win32 + {A2CCDE9F-17CE-461E-8BD9-00261B8855A6}.Setup|ARM64.ActiveCfg = Resource|Win32 {A2CCDE9F-17CE-461E-8BD9-00261B8855A6}.Setup|Win32.ActiveCfg = Resource|Win32 {A2CCDE9F-17CE-461E-8BD9-00261B8855A6}.Setup|Win32.Build.0 = Resource|Win32 {A2CCDE9F-17CE-461E-8BD9-00261B8855A6}.Setup|x64.ActiveCfg = Resource|Win32 + {31C016FB-9EA1-4AF5-987A-37210C04DA06}.Debug|ARM64.ActiveCfg = Resource|Win32 + {31C016FB-9EA1-4AF5-987A-37210C04DA06}.Debug|ARM64.Build.0 = Resource|Win32 {31C016FB-9EA1-4AF5-987A-37210C04DA06}.Debug|Win32.ActiveCfg = Resource|Win32 {31C016FB-9EA1-4AF5-987A-37210C04DA06}.Debug|Win32.Build.0 = Resource|Win32 {31C016FB-9EA1-4AF5-987A-37210C04DA06}.Debug|x64.ActiveCfg = Resource|Win32 {31C016FB-9EA1-4AF5-987A-37210C04DA06}.Debug|x64.Build.0 = Resource|Win32 + {31C016FB-9EA1-4AF5-987A-37210C04DA06}.Release|ARM64.ActiveCfg = Resource|Win32 + {31C016FB-9EA1-4AF5-987A-37210C04DA06}.Release|ARM64.Build.0 = Resource|Win32 {31C016FB-9EA1-4AF5-987A-37210C04DA06}.Release|Win32.ActiveCfg = Resource|Win32 {31C016FB-9EA1-4AF5-987A-37210C04DA06}.Release|Win32.Build.0 = Resource|Win32 {31C016FB-9EA1-4AF5-987A-37210C04DA06}.Release|x64.ActiveCfg = Resource|Win32 {31C016FB-9EA1-4AF5-987A-37210C04DA06}.Release|x64.Build.0 = Resource|Win32 + {31C016FB-9EA1-4AF5-987A-37210C04DA06}.Setup|ARM64.ActiveCfg = Resource|Win32 {31C016FB-9EA1-4AF5-987A-37210C04DA06}.Setup|Win32.ActiveCfg = Resource|Win32 {31C016FB-9EA1-4AF5-987A-37210C04DA06}.Setup|Win32.Build.0 = Resource|Win32 {31C016FB-9EA1-4AF5-987A-37210C04DA06}.Setup|x64.ActiveCfg = Resource|Win32 + {5C875214-0E3A-4CF0-BC0C-BFF6FAA4C089}.Debug|ARM64.ActiveCfg = Resource|Win32 + {5C875214-0E3A-4CF0-BC0C-BFF6FAA4C089}.Debug|ARM64.Build.0 = Resource|Win32 {5C875214-0E3A-4CF0-BC0C-BFF6FAA4C089}.Debug|Win32.ActiveCfg = Resource|Win32 {5C875214-0E3A-4CF0-BC0C-BFF6FAA4C089}.Debug|Win32.Build.0 = Resource|Win32 {5C875214-0E3A-4CF0-BC0C-BFF6FAA4C089}.Debug|x64.ActiveCfg = Resource|Win32 {5C875214-0E3A-4CF0-BC0C-BFF6FAA4C089}.Debug|x64.Build.0 = Resource|Win32 + {5C875214-0E3A-4CF0-BC0C-BFF6FAA4C089}.Release|ARM64.ActiveCfg = Resource|Win32 + {5C875214-0E3A-4CF0-BC0C-BFF6FAA4C089}.Release|ARM64.Build.0 = Resource|Win32 {5C875214-0E3A-4CF0-BC0C-BFF6FAA4C089}.Release|Win32.ActiveCfg = Resource|Win32 {5C875214-0E3A-4CF0-BC0C-BFF6FAA4C089}.Release|Win32.Build.0 = Resource|Win32 {5C875214-0E3A-4CF0-BC0C-BFF6FAA4C089}.Release|x64.ActiveCfg = Resource|Win32 {5C875214-0E3A-4CF0-BC0C-BFF6FAA4C089}.Release|x64.Build.0 = Resource|Win32 + {5C875214-0E3A-4CF0-BC0C-BFF6FAA4C089}.Setup|ARM64.ActiveCfg = Resource|Win32 {5C875214-0E3A-4CF0-BC0C-BFF6FAA4C089}.Setup|Win32.ActiveCfg = Resource|Win32 {5C875214-0E3A-4CF0-BC0C-BFF6FAA4C089}.Setup|Win32.Build.0 = Resource|Win32 {5C875214-0E3A-4CF0-BC0C-BFF6FAA4C089}.Setup|x64.ActiveCfg = Resource|Win32 + {ED74EBA9-1BCB-4B8F-9AE1-DC63B3C24A94}.Debug|ARM64.ActiveCfg = Resource|Win32 + {ED74EBA9-1BCB-4B8F-9AE1-DC63B3C24A94}.Debug|ARM64.Build.0 = Resource|Win32 {ED74EBA9-1BCB-4B8F-9AE1-DC63B3C24A94}.Debug|Win32.ActiveCfg = Resource|Win32 {ED74EBA9-1BCB-4B8F-9AE1-DC63B3C24A94}.Debug|Win32.Build.0 = Resource|Win32 {ED74EBA9-1BCB-4B8F-9AE1-DC63B3C24A94}.Debug|x64.ActiveCfg = Resource|Win32 {ED74EBA9-1BCB-4B8F-9AE1-DC63B3C24A94}.Debug|x64.Build.0 = Resource|Win32 + {ED74EBA9-1BCB-4B8F-9AE1-DC63B3C24A94}.Release|ARM64.ActiveCfg = Resource|Win32 + {ED74EBA9-1BCB-4B8F-9AE1-DC63B3C24A94}.Release|ARM64.Build.0 = Resource|Win32 {ED74EBA9-1BCB-4B8F-9AE1-DC63B3C24A94}.Release|Win32.ActiveCfg = Resource|Win32 {ED74EBA9-1BCB-4B8F-9AE1-DC63B3C24A94}.Release|Win32.Build.0 = Resource|Win32 {ED74EBA9-1BCB-4B8F-9AE1-DC63B3C24A94}.Release|x64.ActiveCfg = Resource|Win32 {ED74EBA9-1BCB-4B8F-9AE1-DC63B3C24A94}.Release|x64.Build.0 = Resource|Win32 + {ED74EBA9-1BCB-4B8F-9AE1-DC63B3C24A94}.Setup|ARM64.ActiveCfg = Resource|Win32 {ED74EBA9-1BCB-4B8F-9AE1-DC63B3C24A94}.Setup|Win32.ActiveCfg = Resource|Win32 {ED74EBA9-1BCB-4B8F-9AE1-DC63B3C24A94}.Setup|Win32.Build.0 = Resource|Win32 {ED74EBA9-1BCB-4B8F-9AE1-DC63B3C24A94}.Setup|x64.ActiveCfg = Resource|Win32 + {A42C6159-ACA8-46D1-A0FB-19C398B137D5}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {A42C6159-ACA8-46D1-A0FB-19C398B137D5}.Debug|ARM64.Build.0 = Debug|ARM64 + {A42C6159-ACA8-46D1-A0FB-19C398B137D5}.Debug|ARM64.Deploy.0 = Debug|ARM64 {A42C6159-ACA8-46D1-A0FB-19C398B137D5}.Debug|Win32.ActiveCfg = Debug|Win32 {A42C6159-ACA8-46D1-A0FB-19C398B137D5}.Debug|Win32.Build.0 = Debug|Win32 {A42C6159-ACA8-46D1-A0FB-19C398B137D5}.Debug|x64.ActiveCfg = Debug|x64 {A42C6159-ACA8-46D1-A0FB-19C398B137D5}.Debug|x64.Build.0 = Debug|x64 + {A42C6159-ACA8-46D1-A0FB-19C398B137D5}.Release|ARM64.ActiveCfg = Release|ARM64 + {A42C6159-ACA8-46D1-A0FB-19C398B137D5}.Release|ARM64.Build.0 = Release|ARM64 + {A42C6159-ACA8-46D1-A0FB-19C398B137D5}.Release|ARM64.Deploy.0 = Release|ARM64 {A42C6159-ACA8-46D1-A0FB-19C398B137D5}.Release|Win32.ActiveCfg = Release|Win32 {A42C6159-ACA8-46D1-A0FB-19C398B137D5}.Release|Win32.Build.0 = Release|Win32 {A42C6159-ACA8-46D1-A0FB-19C398B137D5}.Release|x64.ActiveCfg = Release|x64 {A42C6159-ACA8-46D1-A0FB-19C398B137D5}.Release|x64.Build.0 = Release|x64 + {A42C6159-ACA8-46D1-A0FB-19C398B137D5}.Setup|ARM64.ActiveCfg = Setup|ARM64 + {A42C6159-ACA8-46D1-A0FB-19C398B137D5}.Setup|ARM64.Build.0 = Setup|ARM64 {A42C6159-ACA8-46D1-A0FB-19C398B137D5}.Setup|Win32.ActiveCfg = Setup|Win32 {A42C6159-ACA8-46D1-A0FB-19C398B137D5}.Setup|Win32.Build.0 = Setup|Win32 {A42C6159-ACA8-46D1-A0FB-19C398B137D5}.Setup|x64.ActiveCfg = Setup|x64 {A42C6159-ACA8-46D1-A0FB-19C398B137D5}.Setup|x64.Build.0 = Setup|x64 - {F92A5473-F9E0-412F-923C-6632A66D13C1}.Debug|Win32.ActiveCfg = update_4.3.1|Win32 - {F92A5473-F9E0-412F-923C-6632A66D13C1}.Debug|x64.ActiveCfg = update_4.2.7|Win32 - {F92A5473-F9E0-412F-923C-6632A66D13C1}.Release|Win32.ActiveCfg = update_4.2.7|Win32 - {F92A5473-F9E0-412F-923C-6632A66D13C1}.Release|Win32.Build.0 = update_4.2.7|Win32 - {F92A5473-F9E0-412F-923C-6632A66D13C1}.Release|x64.ActiveCfg = update_4.2.7|Win32 - {F92A5473-F9E0-412F-923C-6632A66D13C1}.Setup|Win32.ActiveCfg = update_4.2.7|Win32 - {F92A5473-F9E0-412F-923C-6632A66D13C1}.Setup|x64.ActiveCfg = update_4.3.0|Win32 + {DAE66C9B-05DC-4ACE-97DA-2547B490BBFF}.Debug|ARM64.ActiveCfg = Debug|ARM64 + {DAE66C9B-05DC-4ACE-97DA-2547B490BBFF}.Debug|ARM64.Build.0 = Debug|ARM64 {DAE66C9B-05DC-4ACE-97DA-2547B490BBFF}.Debug|Win32.ActiveCfg = Debug|Win32 {DAE66C9B-05DC-4ACE-97DA-2547B490BBFF}.Debug|Win32.Build.0 = Debug|Win32 {DAE66C9B-05DC-4ACE-97DA-2547B490BBFF}.Debug|x64.ActiveCfg = Debug|x64 {DAE66C9B-05DC-4ACE-97DA-2547B490BBFF}.Debug|x64.Build.0 = Debug|x64 + {DAE66C9B-05DC-4ACE-97DA-2547B490BBFF}.Release|ARM64.ActiveCfg = Release|ARM64 + {DAE66C9B-05DC-4ACE-97DA-2547B490BBFF}.Release|ARM64.Build.0 = Release|ARM64 {DAE66C9B-05DC-4ACE-97DA-2547B490BBFF}.Release|Win32.ActiveCfg = Release|Win32 {DAE66C9B-05DC-4ACE-97DA-2547B490BBFF}.Release|Win32.Build.0 = Release|Win32 {DAE66C9B-05DC-4ACE-97DA-2547B490BBFF}.Release|x64.ActiveCfg = Release|x64 {DAE66C9B-05DC-4ACE-97DA-2547B490BBFF}.Release|x64.Build.0 = Release|x64 + {DAE66C9B-05DC-4ACE-97DA-2547B490BBFF}.Setup|ARM64.ActiveCfg = Release|ARM64 + {DAE66C9B-05DC-4ACE-97DA-2547B490BBFF}.Setup|ARM64.Build.0 = Release|ARM64 {DAE66C9B-05DC-4ACE-97DA-2547B490BBFF}.Setup|Win32.ActiveCfg = Release|Win32 {DAE66C9B-05DC-4ACE-97DA-2547B490BBFF}.Setup|Win32.Build.0 = Release|Win32 {DAE66C9B-05DC-4ACE-97DA-2547B490BBFF}.Setup|x64.ActiveCfg = Release|x64 {DAE66C9B-05DC-4ACE-97DA-2547B490BBFF}.Setup|x64.Build.0 = Release|x64 + {7BD26CB3-5280-48FD-9A86-C13E321018D5}.Debug|ARM64.ActiveCfg = Resource|Win32 + {7BD26CB3-5280-48FD-9A86-C13E321018D5}.Debug|ARM64.Build.0 = Resource|Win32 {7BD26CB3-5280-48FD-9A86-C13E321018D5}.Debug|Win32.ActiveCfg = Resource|Win32 {7BD26CB3-5280-48FD-9A86-C13E321018D5}.Debug|Win32.Build.0 = Resource|Win32 {7BD26CB3-5280-48FD-9A86-C13E321018D5}.Debug|x64.ActiveCfg = Resource|Win32 {7BD26CB3-5280-48FD-9A86-C13E321018D5}.Debug|x64.Build.0 = Resource|Win32 + {7BD26CB3-5280-48FD-9A86-C13E321018D5}.Release|ARM64.ActiveCfg = Resource|Win32 + {7BD26CB3-5280-48FD-9A86-C13E321018D5}.Release|ARM64.Build.0 = Resource|Win32 {7BD26CB3-5280-48FD-9A86-C13E321018D5}.Release|Win32.ActiveCfg = Resource|Win32 {7BD26CB3-5280-48FD-9A86-C13E321018D5}.Release|Win32.Build.0 = Resource|Win32 {7BD26CB3-5280-48FD-9A86-C13E321018D5}.Release|x64.ActiveCfg = Resource|Win32 {7BD26CB3-5280-48FD-9A86-C13E321018D5}.Release|x64.Build.0 = Resource|Win32 + {7BD26CB3-5280-48FD-9A86-C13E321018D5}.Setup|ARM64.ActiveCfg = Resource|Win32 {7BD26CB3-5280-48FD-9A86-C13E321018D5}.Setup|Win32.ActiveCfg = Resource|Win32 {7BD26CB3-5280-48FD-9A86-C13E321018D5}.Setup|Win32.Build.0 = Resource|Win32 {7BD26CB3-5280-48FD-9A86-C13E321018D5}.Setup|x64.ActiveCfg = Resource|Win32 + {598AB4AC-008E-4501-90B3-C5213834C1DA}.Debug|ARM64.ActiveCfg = Resource|Win32 + {598AB4AC-008E-4501-90B3-C5213834C1DA}.Debug|ARM64.Build.0 = Resource|Win32 {598AB4AC-008E-4501-90B3-C5213834C1DA}.Debug|Win32.ActiveCfg = Resource|Win32 {598AB4AC-008E-4501-90B3-C5213834C1DA}.Debug|Win32.Build.0 = Resource|Win32 {598AB4AC-008E-4501-90B3-C5213834C1DA}.Debug|x64.ActiveCfg = Resource|Win32 {598AB4AC-008E-4501-90B3-C5213834C1DA}.Debug|x64.Build.0 = Resource|Win32 + {598AB4AC-008E-4501-90B3-C5213834C1DA}.Release|ARM64.ActiveCfg = Resource|Win32 + {598AB4AC-008E-4501-90B3-C5213834C1DA}.Release|ARM64.Build.0 = Resource|Win32 {598AB4AC-008E-4501-90B3-C5213834C1DA}.Release|Win32.ActiveCfg = Resource|Win32 {598AB4AC-008E-4501-90B3-C5213834C1DA}.Release|Win32.Build.0 = Resource|Win32 {598AB4AC-008E-4501-90B3-C5213834C1DA}.Release|x64.ActiveCfg = Resource|Win32 {598AB4AC-008E-4501-90B3-C5213834C1DA}.Release|x64.Build.0 = Resource|Win32 + {598AB4AC-008E-4501-90B3-C5213834C1DA}.Setup|ARM64.ActiveCfg = Resource|Win32 {598AB4AC-008E-4501-90B3-C5213834C1DA}.Setup|Win32.ActiveCfg = Resource|Win32 {598AB4AC-008E-4501-90B3-C5213834C1DA}.Setup|Win32.Build.0 = Resource|Win32 {598AB4AC-008E-4501-90B3-C5213834C1DA}.Setup|x64.ActiveCfg = Resource|Win32 + {63BAF573-170B-4FA0-AEE3-16E04F3E9DF5}.Debug|ARM64.ActiveCfg = Resource|Win32 + {63BAF573-170B-4FA0-AEE3-16E04F3E9DF5}.Debug|ARM64.Build.0 = Resource|Win32 {63BAF573-170B-4FA0-AEE3-16E04F3E9DF5}.Debug|Win32.ActiveCfg = Resource|Win32 {63BAF573-170B-4FA0-AEE3-16E04F3E9DF5}.Debug|Win32.Build.0 = Resource|Win32 {63BAF573-170B-4FA0-AEE3-16E04F3E9DF5}.Debug|x64.ActiveCfg = Resource|Win32 {63BAF573-170B-4FA0-AEE3-16E04F3E9DF5}.Debug|x64.Build.0 = Resource|Win32 + {63BAF573-170B-4FA0-AEE3-16E04F3E9DF5}.Release|ARM64.ActiveCfg = Resource|Win32 + {63BAF573-170B-4FA0-AEE3-16E04F3E9DF5}.Release|ARM64.Build.0 = Resource|Win32 {63BAF573-170B-4FA0-AEE3-16E04F3E9DF5}.Release|Win32.ActiveCfg = Resource|Win32 {63BAF573-170B-4FA0-AEE3-16E04F3E9DF5}.Release|Win32.Build.0 = Resource|Win32 {63BAF573-170B-4FA0-AEE3-16E04F3E9DF5}.Release|x64.ActiveCfg = Resource|Win32 {63BAF573-170B-4FA0-AEE3-16E04F3E9DF5}.Release|x64.Build.0 = Resource|Win32 + {63BAF573-170B-4FA0-AEE3-16E04F3E9DF5}.Setup|ARM64.ActiveCfg = Resource|Win32 {63BAF573-170B-4FA0-AEE3-16E04F3E9DF5}.Setup|Win32.ActiveCfg = Resource|Win32 {63BAF573-170B-4FA0-AEE3-16E04F3E9DF5}.Setup|Win32.Build.0 = Resource|Win32 {63BAF573-170B-4FA0-AEE3-16E04F3E9DF5}.Setup|x64.ActiveCfg = Resource|Win32 + {CA5BFC96-428D-42F5-9F7D-CDDE048A357C}.Debug|ARM64.ActiveCfg = Resource|Win32 + {CA5BFC96-428D-42F5-9F7D-CDDE048A357C}.Debug|ARM64.Build.0 = Resource|Win32 {CA5BFC96-428D-42F5-9F7D-CDDE048A357C}.Debug|Win32.ActiveCfg = Resource|Win32 {CA5BFC96-428D-42F5-9F7D-CDDE048A357C}.Debug|Win32.Build.0 = Resource|Win32 {CA5BFC96-428D-42F5-9F7D-CDDE048A357C}.Debug|x64.ActiveCfg = Resource|Win32 {CA5BFC96-428D-42F5-9F7D-CDDE048A357C}.Debug|x64.Build.0 = Resource|Win32 + {CA5BFC96-428D-42F5-9F7D-CDDE048A357C}.Release|ARM64.ActiveCfg = Resource|Win32 + {CA5BFC96-428D-42F5-9F7D-CDDE048A357C}.Release|ARM64.Build.0 = Resource|Win32 {CA5BFC96-428D-42F5-9F7D-CDDE048A357C}.Release|Win32.ActiveCfg = Resource|Win32 {CA5BFC96-428D-42F5-9F7D-CDDE048A357C}.Release|Win32.Build.0 = Resource|Win32 {CA5BFC96-428D-42F5-9F7D-CDDE048A357C}.Release|x64.ActiveCfg = Resource|Win32 {CA5BFC96-428D-42F5-9F7D-CDDE048A357C}.Release|x64.Build.0 = Resource|Win32 + {CA5BFC96-428D-42F5-9F7D-CDDE048A357C}.Setup|ARM64.ActiveCfg = Resource|Win32 {CA5BFC96-428D-42F5-9F7D-CDDE048A357C}.Setup|Win32.ActiveCfg = Resource|Win32 {CA5BFC96-428D-42F5-9F7D-CDDE048A357C}.Setup|Win32.Build.0 = Resource|Win32 {CA5BFC96-428D-42F5-9F7D-CDDE048A357C}.Setup|x64.ActiveCfg = Resource|Win32 + {D94BD2A6-1872-4F01-B911-F406603AA2E1}.Debug|ARM64.ActiveCfg = Debug|Win32 {D94BD2A6-1872-4F01-B911-F406603AA2E1}.Debug|Win32.ActiveCfg = Debug|Win32 {D94BD2A6-1872-4F01-B911-F406603AA2E1}.Debug|Win32.Build.0 = Debug|Win32 {D94BD2A6-1872-4F01-B911-F406603AA2E1}.Debug|x64.ActiveCfg = Debug|Win32 + {D94BD2A6-1872-4F01-B911-F406603AA2E1}.Release|ARM64.ActiveCfg = Release|Win32 {D94BD2A6-1872-4F01-B911-F406603AA2E1}.Release|Win32.ActiveCfg = Release|Win32 {D94BD2A6-1872-4F01-B911-F406603AA2E1}.Release|Win32.Build.0 = Release|Win32 {D94BD2A6-1872-4F01-B911-F406603AA2E1}.Release|x64.ActiveCfg = Release|Win32 + {D94BD2A6-1872-4F01-B911-F406603AA2E1}.Setup|ARM64.ActiveCfg = Release|Win32 {D94BD2A6-1872-4F01-B911-F406603AA2E1}.Setup|Win32.ActiveCfg = Release|Win32 {D94BD2A6-1872-4F01-B911-F406603AA2E1}.Setup|Win32.Build.0 = Release|Win32 {D94BD2A6-1872-4F01-B911-F406603AA2E1}.Setup|x64.ActiveCfg = Release|Win32 + {BD28B058-230E-42DF-9FB1-FFBB0153F498}.Debug|ARM64.ActiveCfg = Resource|Win32 + {BD28B058-230E-42DF-9FB1-FFBB0153F498}.Debug|ARM64.Build.0 = Resource|Win32 + {BD28B058-230E-42DF-9FB1-FFBB0153F498}.Debug|Win32.ActiveCfg = Resource|Win32 + {BD28B058-230E-42DF-9FB1-FFBB0153F498}.Debug|Win32.Build.0 = Resource|Win32 + {BD28B058-230E-42DF-9FB1-FFBB0153F498}.Debug|x64.ActiveCfg = Resource|Win32 + {BD28B058-230E-42DF-9FB1-FFBB0153F498}.Debug|x64.Build.0 = Resource|Win32 + {BD28B058-230E-42DF-9FB1-FFBB0153F498}.Release|ARM64.ActiveCfg = Resource|Win32 + {BD28B058-230E-42DF-9FB1-FFBB0153F498}.Release|ARM64.Build.0 = Resource|Win32 + {BD28B058-230E-42DF-9FB1-FFBB0153F498}.Release|Win32.ActiveCfg = Resource|Win32 + {BD28B058-230E-42DF-9FB1-FFBB0153F498}.Release|Win32.Build.0 = Resource|Win32 + {BD28B058-230E-42DF-9FB1-FFBB0153F498}.Release|x64.ActiveCfg = Resource|Win32 + {BD28B058-230E-42DF-9FB1-FFBB0153F498}.Release|x64.Build.0 = Resource|Win32 + {BD28B058-230E-42DF-9FB1-FFBB0153F498}.Setup|ARM64.ActiveCfg = Resource|Win32 + {BD28B058-230E-42DF-9FB1-FFBB0153F498}.Setup|ARM64.Build.0 = Resource|Win32 + {BD28B058-230E-42DF-9FB1-FFBB0153F498}.Setup|Win32.ActiveCfg = Resource|Win32 + {BD28B058-230E-42DF-9FB1-FFBB0153F498}.Setup|Win32.Build.0 = Resource|Win32 + {BD28B058-230E-42DF-9FB1-FFBB0153F498}.Setup|x64.ActiveCfg = Resource|Win32 + {BD28B058-230E-42DF-9FB1-FFBB0153F498}.Setup|x64.Build.0 = Resource|Win32 + {75809D15-8403-420A-BBE6-05F478D88D8E}.Debug|ARM64.ActiveCfg = Resource|Win32 + {75809D15-8403-420A-BBE6-05F478D88D8E}.Debug|ARM64.Build.0 = Resource|Win32 + {75809D15-8403-420A-BBE6-05F478D88D8E}.Debug|Win32.ActiveCfg = Resource|Win32 + {75809D15-8403-420A-BBE6-05F478D88D8E}.Debug|Win32.Build.0 = Resource|Win32 + {75809D15-8403-420A-BBE6-05F478D88D8E}.Debug|x64.ActiveCfg = Resource|Win32 + {75809D15-8403-420A-BBE6-05F478D88D8E}.Debug|x64.Build.0 = Resource|Win32 + {75809D15-8403-420A-BBE6-05F478D88D8E}.Release|ARM64.ActiveCfg = Resource|Win32 + {75809D15-8403-420A-BBE6-05F478D88D8E}.Release|ARM64.Build.0 = Resource|Win32 + {75809D15-8403-420A-BBE6-05F478D88D8E}.Release|Win32.ActiveCfg = Resource|Win32 + {75809D15-8403-420A-BBE6-05F478D88D8E}.Release|Win32.Build.0 = Resource|Win32 + {75809D15-8403-420A-BBE6-05F478D88D8E}.Release|x64.ActiveCfg = Resource|Win32 + {75809D15-8403-420A-BBE6-05F478D88D8E}.Release|x64.Build.0 = Resource|Win32 + {75809D15-8403-420A-BBE6-05F478D88D8E}.Setup|ARM64.ActiveCfg = Resource|Win32 + {75809D15-8403-420A-BBE6-05F478D88D8E}.Setup|ARM64.Build.0 = Resource|Win32 + {75809D15-8403-420A-BBE6-05F478D88D8E}.Setup|Win32.ActiveCfg = Resource|Win32 + {75809D15-8403-420A-BBE6-05F478D88D8E}.Setup|Win32.Build.0 = Resource|Win32 + {75809D15-8403-420A-BBE6-05F478D88D8E}.Setup|x64.ActiveCfg = Resource|Win32 + {75809D15-8403-420A-BBE6-05F478D88D8E}.Setup|x64.Build.0 = Resource|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -406,12 +586,13 @@ Global {31C016FB-9EA1-4AF5-987A-37210C04DA06} = {409484D8-C0DB-4991-AF03-124128EDEF98} {5C875214-0E3A-4CF0-BC0C-BFF6FAA4C089} = {409484D8-C0DB-4991-AF03-124128EDEF98} {ED74EBA9-1BCB-4B8F-9AE1-DC63B3C24A94} = {409484D8-C0DB-4991-AF03-124128EDEF98} - {F92A5473-F9E0-412F-923C-6632A66D13C1} = {B695E1F6-785D-45CB-BCE0-0E9635DFC1DE} {DAE66C9B-05DC-4ACE-97DA-2547B490BBFF} = {B695E1F6-785D-45CB-BCE0-0E9635DFC1DE} {7BD26CB3-5280-48FD-9A86-C13E321018D5} = {409484D8-C0DB-4991-AF03-124128EDEF98} {598AB4AC-008E-4501-90B3-C5213834C1DA} = {409484D8-C0DB-4991-AF03-124128EDEF98} {63BAF573-170B-4FA0-AEE3-16E04F3E9DF5} = {409484D8-C0DB-4991-AF03-124128EDEF98} {CA5BFC96-428D-42F5-9F7D-CDDE048A357C} = {409484D8-C0DB-4991-AF03-124128EDEF98} + {BD28B058-230E-42DF-9FB1-FFBB0153F498} = {409484D8-C0DB-4991-AF03-124128EDEF98} + {75809D15-8403-420A-BBE6-05F478D88D8E} = {409484D8-C0DB-4991-AF03-124128EDEF98} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {AF7D0AE8-B556-4840-92EF-CEADC95A5CD1} diff --git a/Src/Setup/BuildArchives.bat b/Src/Setup/BuildArchives.bat index eb5231a6d..b3000d7fd 100644 --- a/Src/Setup/BuildArchives.bat +++ b/Src/Setup/BuildArchives.bat @@ -1,7 +1,7 @@ REM ***** Collect PDBs echo -- Creating symbols package -set CS_SYMBOLS_NAME=OpenShellPDB_%CS_VERSION_STR%.7z +set CS_SYMBOLS_NAME=OpenShellSymbols_%CS_VERSION_STR%.7z 7z a -mx9 .\Final\%CS_SYMBOLS_NAME% .\Output\symbols\* > nul @@ -20,4 +20,10 @@ cd .. cd Setup +copy /B ..\..\build\bin\Release\Utility.exe .\Final > nul + +if defined APPVEYOR ( + appveyor PushArtifact ..\..\build\bin\Release\Utility.exe +) + exit /b 0 diff --git a/Src/Setup/BuildBinaries.bat b/Src/Setup/BuildBinaries.bat index f1f814962..0241c892e 100644 --- a/Src/Setup/BuildBinaries.bat +++ b/Src/Setup/BuildBinaries.bat @@ -1,29 +1,38 @@ if exist Output rd /Q /S Output md Output md Output\x64 +md Output\ARM64 echo -- Compiling for /f "usebackq tokens=*" %%i in (`"%ProgramFiles(x86)%\Microsoft Visual Studio\Installer\vswhere.exe" -latest -products * -requires Microsoft.Component.MSBuild -property installationPath`) do set MSBuildDir=%%i\MSBuild\Current\Bin\ -REM ********* Build 64-bit solution -echo --- 64bit +REM Restore NuGet packages +"%MSBuildDir%MSBuild.exe" ..\OpenShell.sln /m /t:Restore -p:RestorePackagesConfig=true /verbosity:quiet /nologo + +REM ********* Build x64 solution +echo --- x64 "%MSBuildDir%MSBuild.exe" ..\OpenShell.sln /m /t:Rebuild /p:Configuration="Setup" /p:Platform="x64" /verbosity:quiet /nologo @if ERRORLEVEL 1 exit /b 1 +REM ********* Build ARM64 solution +echo --- ARM64 +"%MSBuildDir%MSBuild.exe" ..\OpenShell.sln /m /t:Rebuild /p:Configuration="Setup" /p:Platform="ARM64" /verbosity:quiet /nologo +if ERRORLEVEL 1 exit /b 1 + REM ********* Build 32-bit solution (must be after 64-bit) -echo --- 32bit +echo --- x86 "%MSBuildDir%MSBuild.exe" ..\OpenShell.sln /m /t:Rebuild /p:Configuration="Setup" /p:Platform="Win32" /verbosity:quiet /nologo @if ERRORLEVEL 1 exit /b 1 REM ********* Make en-US.dll cd .. -Setup\Utility\Release\Utility.exe makeEN ClassicExplorer\Setup\ClassicExplorer32.dll StartMenu\Setup\StartMenuDLL.dll ClassicIE\Setup\ClassicIEDLL_32.dll Update\Release\Update.exe +..\build\bin\Release\Utility.exe makeEN ..\build\bin\Setup\ClassicExplorer32.dll ..\build\bin\Setup\StartMenuDLL.dll ..\build\bin\Setup\ClassicIEDLL_32.dll ..\build\bin\Release\Update.exe @if ERRORLEVEL 1 exit /b 1 -Setup\Utility\Release\Utility.exe extract en-US.dll en-US.csv -copy /B en-US.dll Localization\English > nul +..\build\bin\Release\Utility.exe extract en-US.dll en-US.csv +move en-US.dll Localization\English > nul move en-US.csv Localization\English > nul cd Setup @@ -31,90 +40,117 @@ cd Setup REM ********* Copy binaries -copy /B ..\ClassicExplorer\Setup\ClassicExplorer32.dll Output > nul -copy /B ..\ClassicExplorer\Setup\ClassicExplorerSettings.exe Output > nul -copy /B ..\ClassicIE\Setup\ClassicIEDLL_32.dll Output > nul -copy /B ..\ClassicIE\Setup\ClassicIE_32.exe Output > nul -copy /B ..\StartMenu\Setup\StartMenu.exe Output > nul -copy /B ..\StartMenu\Setup\StartMenuDLL.dll Output > nul -copy /B ..\Update\Release\Update.exe Output > nul -copy /B ..\Update\DesktopToasts\Release\DesktopToasts.dll Output > nul -copy /B ..\StartMenu\StartMenuHelper\Setup\StartMenuHelper32.dll Output > nul -copy /B ..\Setup\SetupHelper\Release\SetupHelper.exe Output > nul - -copy /B ..\ClassicExplorer\Setup64\ClassicExplorer64.dll Output\x64 > nul -copy /B ..\ClassicIE\Setup64\ClassicIEDLL_64.dll Output\x64 > nul -copy /B ..\ClassicIE\Setup64\ClassicIE_64.exe Output\x64 > nul -copy /B ..\StartMenu\Setup64\StartMenu.exe Output\x64 > nul -copy /B ..\StartMenu\Setup64\StartMenuDLL.dll Output\x64 > nul -copy /B ..\StartMenu\StartMenuHelper\Setup64\StartMenuHelper64.dll Output\x64 > nul - -copy /B "..\StartMenu\Skins\Classic Skin.skin" Output > nul -copy /B "..\StartMenu\Skins\Full Glass.skin" Output > nul -copy /B "..\StartMenu\Skins\Smoked Glass.skin" Output > nul -copy /B "..\StartMenu\Skins\Windows Aero.skin" Output > nul -copy /B "..\StartMenu\Skins\Windows Basic.skin" Output > nul -copy /B "..\StartMenu\Skins\Windows XP Luna.skin" Output > nul -copy /B "..\StartMenu\Skins\Windows 8.skin" Output > nul -copy /B "..\StartMenu\Skins\Metro.skin" Output > nul -copy /B "..\StartMenu\Skins\Classic Skin.skin7" Output > nul -copy /B "..\StartMenu\Skins\Windows Aero.skin7" Output > nul -copy /B "..\StartMenu\Skins\Windows 8.skin7" Output > nul -copy /B "..\StartMenu\Skins\Midnight.skin7" Output > nul -copy /B "..\StartMenu\Skins\Metro.skin7" Output > nul -copy /B "..\StartMenu\Skins\Metallic.skin7" Output > nul +copy /B ..\..\build\bin\Setup\ClassicExplorer32.dll Output > nul +copy /B ..\..\build\bin\Setup\ClassicExplorerSettings.exe Output > nul +copy /B ..\..\build\bin\Setup\ClassicIEDLL_32.dll Output > nul +copy /B ..\..\build\bin\Setup\ClassicIE_32.exe Output > nul +copy /B ..\..\build\bin\Setup\StartMenu.exe Output > nul +copy /B ..\..\build\bin\Setup\StartMenuDLL.dll Output > nul +copy /B ..\..\build\bin\Setup\StartMenuHelper32.dll Output > nul +copy /B ..\..\build\bin\Release\Update.exe Output > nul +copy /B ..\..\build\bin\Release\DesktopToasts.dll Output > nul +copy /B ..\..\build\bin\Release\SetupHelper.exe Output > nul + +copy /B ..\..\build\bin\SetupARM64\ClassicExplorer64.dll Output\ARM64 > nul +copy /B ..\..\build\bin\SetupARM64\ClassicIEDLL_64.dll Output\ARM64 > nul +copy /B ..\..\build\bin\SetupARM64\ClassicIE_64.exe Output\ARM64 > nul +copy /B ..\..\build\bin\SetupARM64\StartMenu.exe Output\ARM64 > nul +copy /B ..\..\build\bin\SetupARM64\StartMenuDLL.dll Output\ARM64 > nul +copy /B ..\..\build\bin\SetupARM64\StartMenuHelper64.dll Output\ARM64 > nul + +copy /B ..\..\build\bin\Setup64\ClassicExplorer64.dll Output\x64 > nul +copy /B ..\..\build\bin\Setup64\ClassicIEDLL_64.dll Output\x64 > nul +copy /B ..\..\build\bin\Setup64\ClassicIE_64.exe Output\x64 > nul +copy /B ..\..\build\bin\Setup64\StartMenu.exe Output\x64 > nul +copy /B ..\..\build\bin\Setup64\StartMenuDLL.dll Output\x64 > nul +copy /B ..\..\build\bin\Setup64\StartMenuHelper64.dll Output\x64 > nul + +copy /B "..\..\build\bin\Skins\Classic Skin.skin" Output > nul +copy /B "..\..\build\bin\Skins\Full Glass.skin" Output > nul +copy /B "..\..\build\bin\Skins\Smoked Glass.skin" Output > nul +copy /B "..\..\build\bin\Skins\Windows Aero.skin" Output > nul +copy /B "..\..\build\bin\Skins\Windows Basic.skin" Output > nul +copy /B "..\..\build\bin\Skins\Windows XP Luna.skin" Output > nul +copy /B "..\..\build\bin\Skins\Windows 8.skin" Output > nul +copy /B "..\..\build\bin\Skins\Metro.skin" Output > nul +copy /B "..\..\build\bin\Skins\Classic Skin.skin7" Output > nul +copy /B "..\..\build\bin\Skins\Windows Aero.skin7" Output > nul +copy /B "..\..\build\bin\Skins\Windows 8.skin7" Output > nul +copy /B "..\..\build\bin\Skins\Midnight.skin7" Output > nul +copy /B "..\..\build\bin\Skins\Metro.skin7" Output > nul +copy /B "..\..\build\bin\Skins\Metallic.skin7" Output > nul +copy /B "..\..\build\bin\Skins\Immersive.skin" Output > nul +copy /B "..\..\build\bin\Skins\Immersive.skin7" Output > nul REM ********* Collect debug info md Output\PDB32 md Output\PDB64 +md Output\PDBARM64 REM Explorer 32 -copy /B ..\ClassicExplorer\Setup\ClassicExplorer32.pdb Output\PDB32 > nul +copy /B ..\..\build\bin\Setup\ClassicExplorer32.pdb Output\PDB32 > nul copy /B Output\ClassicExplorer32.dll Output\PDB32 > nul -copy /B ..\ClassicExplorer\Setup\ClassicExplorerSettings.pdb Output\PDB32 > nul +copy /B ..\..\build\bin\Setup\ClassicExplorerSettings.pdb Output\PDB32 > nul copy /B Output\ClassicExplorerSettings.exe Output\PDB32 > nul REM Explorer 64 -copy /B ..\ClassicExplorer\Setup64\ClassicExplorer64.pdb Output\PDB64 > nul +copy /B ..\..\build\bin\Setup64\ClassicExplorer64.pdb Output\PDB64 > nul copy /B Output\x64\ClassicExplorer64.dll Output\PDB64 > nul +REM Explorer ARM64 +copy /B ..\..\build\bin\SetupARM64\ClassicExplorer64.pdb Output\PDBARM64 > nul +copy /B Output\ARM64\ClassicExplorer64.dll Output\PDBARM64 > nul + REM IE 32 -copy /B ..\ClassicIE\Setup\ClassicIEDLL_32.pdb Output\PDB32 > nul +copy /B ..\..\build\bin\Setup\ClassicIEDLL_32.pdb Output\PDB32 > nul copy /B Output\ClassicIEDLL_32.dll Output\PDB32 > nul -copy /B ..\ClassicIE\Setup\ClassicIE_32.pdb Output\PDB32 > nul +copy /B ..\..\build\bin\Setup\ClassicIE_32.pdb Output\PDB32 > nul copy /B Output\ClassicIE_32.exe Output\PDB32 > nul REM IE 64 -copy /B ..\ClassicIE\Setup64\ClassicIEDLL_64.pdb Output\PDB64 > nul +copy /B ..\..\build\bin\Setup64\ClassicIEDLL_64.pdb Output\PDB64 > nul copy /B Output\x64\ClassicIEDLL_64.dll Output\PDB64 > nul -copy /B ..\ClassicIE\Setup64\ClassicIE_64.pdb Output\PDB64 > nul +copy /B ..\..\build\bin\Setup64\ClassicIE_64.pdb Output\PDB64 > nul copy /B Output\x64\ClassicIE_64.exe Output\PDB64 > nul +REM IE ARM64 +copy /B ..\..\build\bin\SetupARM64\ClassicIEDLL_64.pdb Output\PDBARM64 > nul +copy /B Output\ARM64\ClassicIEDLL_64.dll Output\PDBARM64 > nul +copy /B ..\..\build\bin\SetupARM64\ClassicIE_64.pdb Output\PDBARM64 > nul +copy /B Output\ARM64\ClassicIE_64.exe Output\PDBARM64 > nul + REM Menu 32 -copy /B ..\StartMenu\Setup\StartMenu.pdb Output\PDB32 > nul +copy /B ..\..\build\bin\Setup\StartMenu.pdb Output\PDB32 > nul copy /B Output\StartMenu.exe Output\PDB32 > nul -copy /B ..\StartMenu\Setup\StartMenuDLL.pdb Output\PDB32 > nul +copy /B ..\..\build\bin\Setup\StartMenuDLL.pdb Output\PDB32 > nul copy /B Output\StartMenuDLL.dll Output\PDB32 > nul -copy /B ..\StartMenu\StartMenuHelper\Setup\StartMenuHelper32.pdb Output\PDB32 > nul +copy /B ..\..\build\bin\Setup\StartMenuHelper32.pdb Output\PDB32 > nul copy /B Output\StartMenuHelper32.dll Output\PDB32 > nul -copy /B ..\Update\Release\Update.pdb Output\PDB32 > nul +copy /B ..\..\build\bin\Release\Update.pdb Output\PDB32 > nul copy /B Output\Update.exe Output\PDB32 > nul -copy /B ..\Update\DesktopToasts\Release\DesktopToasts.pdb Output\PDB32 > nul +copy /B ..\..\build\bin\Release\DesktopToasts.pdb Output\PDB32 > nul copy /B Output\DesktopToasts.dll Output\PDB32 > nul REM Menu 64 -copy /B ..\StartMenu\Setup64\StartMenu.pdb Output\PDB64 > nul +copy /B ..\..\build\bin\Setup64\StartMenu.pdb Output\PDB64 > nul copy /B Output\x64\StartMenu.exe Output\PDB64 > nul -copy /B ..\StartMenu\Setup64\StartMenuDLL.pdb Output\PDB64 > nul +copy /B ..\..\build\bin\Setup64\StartMenuDLL.pdb Output\PDB64 > nul copy /B Output\x64\StartMenuDLL.dll Output\PDB64 > nul -copy /B ..\StartMenu\StartMenuHelper\Setup64\StartMenuHelper64.pdb Output\PDB64 > nul +copy /B ..\..\build\bin\Setup64\StartMenuHelper64.pdb Output\PDB64 > nul copy /B Output\x64\StartMenuHelper64.dll Output\PDB64 > nul +REM Menu ARM64 +copy /B ..\..\build\bin\SetupARM64\StartMenu.pdb Output\PDBARM64 > nul +copy /B Output\ARM64\StartMenu.exe Output\PDBARM64 > nul +copy /B ..\..\build\bin\SetupARM64\StartMenuDLL.pdb Output\PDBARM64 > nul +copy /B Output\ARM64\StartMenuDLL.dll Output\PDBARM64 > nul +copy /B ..\..\build\bin\SetupARM64\StartMenuHelper64.pdb Output\PDBARM64 > nul +copy /B Output\ARM64\StartMenuHelper64.dll Output\PDBARM64 > nul REM ********* Source Index PDBs -set PDBSTR_PATH="C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\srcsrv\pdbstr.exe" +set PDBSTR_PATH="C:\Program Files (x86)\Windows Kits\10\Debuggers\x86\srcsrv\pdbstr.exe" if exist %PDBSTR_PATH% ( echo --- Adding source index to PDBs @@ -122,10 +158,26 @@ if exist %PDBSTR_PATH% ( for %%f in (Output\PDB32\*.pdb) do ( %PDBSTR_PATH% -w -p:%%f -s:srcsrv -i:Output\pdbstr.txt + if not ERRORLEVEL 0 ( + echo Error adding source index to PDB + exit /b 1 + ) ) for %%f in (Output\PDB64\*.pdb) do ( %PDBSTR_PATH% -w -p:%%f -s:srcsrv -i:Output\pdbstr.txt + if not ERRORLEVEL 0 ( + echo Error adding source index to PDB + exit /b 1 + ) + ) + + for %%f in (Output\PDBARM64\*.pdb) do ( + %PDBSTR_PATH% -w -p:%%f -s:srcsrv -i:Output\pdbstr.txt + if not ERRORLEVEL 0 ( + echo Error adding source index to PDB + exit /b 1 + ) ) ) @@ -135,11 +187,13 @@ set SYMSTORE_PATH="C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\symstore %SYMSTORE_PATH% add /r /f Output\PDB32 /s Output\symbols /t OpenShell -:NOREFS > nul %SYMSTORE_PATH% add /r /f Output\PDB64 /s Output\symbols /t OpenShell -:NOREFS > nul +%SYMSTORE_PATH% add /r /f Output\PDBARM64 /s Output\symbols /t OpenShell -:NOREFS > nul rd /Q /S Output\symbols\000Admin > nul del Output\symbols\pingme.txt > nul rd /Q /S Output\PDB32 rd /Q /S Output\PDB64 +rd /Q /S Output\PDBARM64 REM ********* Build ADMX echo --- ADMX @@ -147,11 +201,11 @@ if exist Output\PolicyDefinitions.zip ( del Output\PolicyDefinitions.zip ) cd ..\Localization\English -..\..\StartMenu\Setup\StartMenu.exe -saveadmx en-US +..\..\..\build\bin\Setup\StartMenu.exe -saveadmx en-US @if ERRORLEVEL 1 exit /b 1 -..\..\ClassicExplorer\Setup\ClassicExplorerSettings.exe -saveadmx en-US +..\..\..\build\bin\Setup\ClassicExplorerSettings.exe -saveadmx en-US @if ERRORLEVEL 1 exit /b 1 -..\..\ClassicIE\Setup\ClassicIE_32.exe -saveadmx en-US +..\..\..\build\bin\Setup\ClassicIE_32.exe -saveadmx en-US @if ERRORLEVEL 1 exit /b 1 md en-US copy /B *.adml en-US > nul diff --git a/Src/Setup/BuildInstaller.bat b/Src/Setup/BuildInstaller.bat index a6a76886e..42d444554 100644 --- a/Src/Setup/BuildInstaller.bat +++ b/Src/Setup/BuildInstaller.bat @@ -36,9 +36,9 @@ md Temp @set /a "CS_VERSION_NUM=%%A<<24|%%B<<16|%%C" ) -REM ********* Build 32-bit MSI -echo --- 32bit MSI -candle Setup.wxs -nologo -out Temp\Setup32.wixobj -ext WixUIExtension -ext WixUtilExtension -dx64=0 -dCS_LANG_FOLDER=%CS_LANG_FOLDER% -dCS_LANG_NAME=%CS_LANG_NAME% +REM ********* Build x86 MSI +echo --- x86 MSI +candle Setup.wxs -nologo -out Temp\Setup32.wixobj -ext WixUIExtension -ext WixUtilExtension -dx64=0 -dARM64=0 -dCS_LANG_FOLDER=%CS_LANG_FOLDER% -dCS_LANG_NAME=%CS_LANG_NAME% @if ERRORLEVEL 1 exit /b 1 @REM We need to suppress ICE38 and ICE43 because they apply only to per-user installation. We only support per-machine installs @@ -46,10 +46,9 @@ candle Setup.wxs -nologo -out Temp\Setup32.wixobj -ext WixUIExtension -ext WixUt light Temp\Setup32.wixobj -nologo -out Temp\Setup32.msi -ext WixUIExtension -ext WixUtilExtension -loc ..\Localization\%CS_LANG_FOLDER%\OpenShellText-%CS_LANG_NAME%.wxl -loc ..\Localization\%CS_LANG_FOLDER%\WixUI_%CS_LANG_NAME%.wxl -sice:ICE38 -sice:ICE43 -sice:ICE09 @if ERRORLEVEL 1 exit /b 1 - -REM ********* Build 64-bit MSI -echo --- 64bit MSI -candle Setup.wxs -nologo -out Temp\Setup64.wixobj -ext WixUIExtension -ext WixUtilExtension -dx64=1 -dCS_LANG_FOLDER=%CS_LANG_FOLDER% -dCS_LANG_NAME=%CS_LANG_NAME% +REM ********* Build x64 MSI +echo --- x64 MSI +candle Setup.wxs -nologo -out Temp\Setup64.wixobj -ext WixUIExtension -ext WixUtilExtension -dx64=1 -dARM64=0 -dCS_LANG_FOLDER=%CS_LANG_FOLDER% -dCS_LANG_NAME=%CS_LANG_NAME% @if ERRORLEVEL 1 exit /b 1 @REM We need to suppress ICE38 and ICE43 because they apply only to per-user installation. We only support per-machine installs @@ -57,10 +56,19 @@ candle Setup.wxs -nologo -out Temp\Setup64.wixobj -ext WixUIExtension -ext WixUt light Temp\Setup64.wixobj -nologo -out Temp\Setup64.msi -ext WixUIExtension -ext WixUtilExtension -loc ..\Localization\%CS_LANG_FOLDER%\OpenShellText-%CS_LANG_NAME%.wxl -loc ..\Localization\%CS_LANG_FOLDER%\WixUI_%CS_LANG_NAME%.wxl -sice:ICE38 -sice:ICE43 -sice:ICE09 @if ERRORLEVEL 1 exit /b 1 +REM ********* Build ARM64 MSI +echo --- ARM64 MSI +candle Setup.wxs -nologo -out Temp\SetupARM64.wixobj -ext WixUIExtension -ext WixUtilExtension -dx64=0 -dARM64=1 -dCS_LANG_FOLDER=%CS_LANG_FOLDER% -dCS_LANG_NAME=%CS_LANG_NAME% +@if ERRORLEVEL 1 exit /b 1 + +@REM We need to suppress ICE38 and ICE43 because they apply only to per-user installation. We only support per-machine installs +@REM We need to suppress ICE09 because the helper DLLs need to go into the system directory (for safety reasons) +light Temp\SetupARM64.wixobj -nologo -out Temp\SetupARM64.msi -ext WixUIExtension -ext WixUtilExtension -loc ..\Localization\%CS_LANG_FOLDER%\OpenShellText-%CS_LANG_NAME%.wxl -loc ..\Localization\%CS_LANG_FOLDER%\WixUI_%CS_LANG_NAME%.wxl -sice:ICE38 -sice:ICE43 -sice:ICE09 +@if ERRORLEVEL 1 exit /b 1 REM ********* Build MSI Checksums echo --- MSI Checksums -Utility\Release\Utility.exe crcmsi Temp +..\..\build\bin\Release\Utility.exe crcmsi Temp @if ERRORLEVEL 1 exit /b 1 REM ********* Build bootstrapper @@ -73,10 +81,10 @@ for /f "usebackq tokens=*" %%i in (`"%ProgramFiles(x86)%\Microsoft Visual Studio if exist Final rd /Q /S Final md Final -copy /B Release\Setup.exe Final\%CS_INSTALLER_NAME%.exe > nul +copy /B ..\..\build\bin\Release\Setup.exe Final\%CS_INSTALLER_NAME%.exe > nul if defined APPVEYOR ( - appveyor PushArtifact Release\Setup.exe -FileName %CS_INSTALLER_NAME%.exe + appveyor PushArtifact Final\%CS_INSTALLER_NAME%.exe ) SET CS_LANG_FOLDER= diff --git a/Src/Setup/OpenShell.ico b/Src/Setup/OpenShell.ico index 3ccb8349a..74b9a0d32 100644 Binary files a/Src/Setup/OpenShell.ico and b/Src/Setup/OpenShell.ico differ diff --git a/Src/Setup/Setup.cpp b/Src/Setup/Setup.cpp index d3471af40..c7c144e20 100644 --- a/Src/Setup/Setup.cpp +++ b/Src/Setup/Setup.cpp @@ -12,10 +12,13 @@ #include "StringUtils.h" #include "FNVHash.h" -// Setup.exe is a bootstrap application that contains installers for 32-bit and 64-bit. +// Setup.exe is a bootstrap application that contains installers for x86, x64 and ARM64. // It unpacks the right installer into the temp directory and executes it. typedef BOOL (WINAPI *FIsWow64Process)( HANDLE hProcess, PBOOL Wow64Process ); +typedef BOOL (WINAPI *FIsWow64Process2)( HANDLE hProcess, USHORT *pProcessMachine, USHORT *pNativeMachine ); +typedef BOOL (WINAPI *FWow64DisableWow64FsRedirection)( PVOID* OldValue ); +typedef BOOL (WINAPI *FWow64RevertWow64FsRedirection)( PVOID OldValue ); @@ -31,6 +34,14 @@ enum ERR_MSIEXEC, // msiexec failed to start }; +enum ExtractType +{ + None, + x86, + x64, + ARM64 +}; + struct Chunk { int start1, start2, len; @@ -49,7 +60,7 @@ static void WriteFileXOR( HANDLE hFile, const unsigned char *buf, int size ) } } -static int ExtractMsi( HINSTANCE hInstance, const wchar_t *msiName, bool b64, bool bQuiet ) +static int ExtractMsi( HINSTANCE hInstance, const wchar_t *msiName, ExtractType extractType, bool bQuiet ) { void *pRes=NULL; HRSRC hResInfo=FindResource(hInstance,MAKEINTRESOURCE(IDR_MSI_CHECKSUM),L"MSI_FILE"); @@ -70,13 +81,21 @@ static int ExtractMsi( HINSTANCE hInstance, const wchar_t *msiName, bool b64, bo } return ERR_HASH_NOTFOUND; } - unsigned int hash0=((unsigned int*)pRes)[b64?1:0]; + unsigned int hash0=((unsigned int*)pRes)[extractType-1]; const Chunk *pChunks=NULL; int chunkCount=0; - if (b64) + if (extractType==x64) { - chunkCount=((unsigned int*)pRes)[2]; - pChunks=(Chunk*)((unsigned int*)pRes+3); + chunkCount=((unsigned int*)pRes)[3]; + pChunks=(Chunk*)((unsigned int*)pRes+4); + } + if (extractType==ARM64) + { + int x64chunkCount=((unsigned int*)pRes)[3]; + const Chunk *px64Chunks=(Chunk*)((unsigned int*)pRes+4); + + chunkCount=((unsigned int*)(px64Chunks+x64chunkCount))[0]; + pChunks = (Chunk*)((unsigned int*)(px64Chunks+x64chunkCount)+1); } // extract the installer @@ -99,11 +118,11 @@ static int ExtractMsi( HINSTANCE hInstance, const wchar_t *msiName, bool b64, bo } return ERR_MSIRES_NOTFOUND; } - const unsigned char *pRes64=NULL; + const unsigned char *pRes64=NULL, *pResArm64=NULL; int size32=SizeofResource(hInstance,hResInfo); unsigned int hash; - int size64=0; - if (b64) + int size64=0, sizeArm64=0; + if (extractType==x64) { HRSRC hResInfo=FindResource(hInstance,MAKEINTRESOURCE(IDR_MSI_FILE64),L"MSI_FILE"); if (hResInfo) @@ -140,6 +159,43 @@ static int ExtractMsi( HINSTANCE hInstance, const wchar_t *msiName, bool b64, bo if (pos0;count--,params++) { - if (_wcsicmp(params[0],L"help")==0 || _wcsicmp(params[0],L"/?")==0) + if (_wcsicmp(params[0],L"help")==0 || _wcsicmp(params[0],L"/help")==0 || _wcsicmp(params[0],L"/h")==0 || _wcsicmp(params[0],L"/?")==0) { wchar_t strTitle[256]; if (!LoadString(hInstance,IDS_APP_TITLE,strTitle,_countof(strTitle))) strTitle[0]=0; @@ -233,9 +305,11 @@ int APIENTRY wWinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCm return 0; } if (_wcsicmp(params[0],L"extract32")==0) - extract=32; + extractType=x86; if (_wcsicmp(params[0],L"extract64")==0) - extract=64; + extractType=x64; + if (_wcsicmp(params[0],L"extractARM64")==0) + extractType=ARM64; if (_wcsicmp(params[0],L"/qn")==0 || _wcsicmp(params[0],L"/q")==0 || _wcsicmp(params[0],L"/quiet")==0 || _wcsicmp(params[0],L"/passive")==0) { bQuiet=true; @@ -255,11 +329,11 @@ int APIENTRY wWinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCm return ERR_VERRES_NOTFOUND; } - if (extract) + if (extractType != None) { wchar_t msiName[_MAX_PATH]; - Sprintf(msiName,_countof(msiName),L"OpenShellSetup%d_%d_%d_%d.msi",extract,HIWORD(pVer->dwProductVersionMS),LOWORD(pVer->dwProductVersionMS),HIWORD(pVer->dwProductVersionLS)); - return ExtractMsi(hInstance,msiName,extract==64,bQuiet); + Sprintf(msiName,_countof(msiName),L"OpenShellSetup%s_%d_%d_%d.msi",(extractType==x86?L"32":(extractType==x64?L"64":L"ARM64")),HIWORD(pVer->dwProductVersionMS),LOWORD(pVer->dwProductVersionMS),HIWORD(pVer->dwProductVersionLS)); + return ExtractMsi(hInstance,msiName,extractType,bQuiet); } // check Windows version @@ -282,7 +356,9 @@ int APIENTRY wWinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCm // dynamically link to IsWow64Process because it is not available for Windows 2000 HMODULE hKernel32=GetModuleHandle(L"kernel32.dll"); FIsWow64Process isWow64Process=(FIsWow64Process)GetProcAddress(hKernel32,"IsWow64Process"); - if (!isWow64Process) + FWow64DisableWow64FsRedirection wow64DisableWow64FsRedirection=(FWow64DisableWow64FsRedirection)GetProcAddress(hKernel32,"Wow64DisableWow64FsRedirection"); + FWow64RevertWow64FsRedirection wow64RevertWow64FsRedirection=(FWow64RevertWow64FsRedirection)GetProcAddress(hKernel32,"Wow64RevertWow64FsRedirection"); + if (!isWow64Process || !wow64DisableWow64FsRedirection || !wow64RevertWow64FsRedirection) { if (!bQuiet) { @@ -295,13 +371,25 @@ int APIENTRY wWinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCm return ERR_WRONG_OS; } - BOOL b64=FALSE; - isWow64Process(GetCurrentProcess(),&b64); + // Use IsWow64Process2 if it's available (Windows 10 1511+), otherwise fall back to IsWow64Process + FIsWow64Process2 isWow64Process2=(FIsWow64Process2)GetProcAddress(hKernel32,"IsWow64Process2"); + if (isWow64Process2) + { + USHORT processMachine = 0, nativeMachine = 0; + isWow64Process2(GetCurrentProcess(), &processMachine, &nativeMachine); + extractType=nativeMachine==IMAGE_FILE_MACHINE_AMD64?x64:nativeMachine==IMAGE_FILE_MACHINE_ARM64?ARM64:x86; + } + else + { + BOOL x64=FALSE; + isWow64Process(GetCurrentProcess(),&x64); + extractType=x64?ExtractType::x64:x86; + } wchar_t msiName[_MAX_PATH]; - Sprintf(msiName,_countof(msiName),L"%%ALLUSERSPROFILE%%\\OpenShellSetup%d_%d_%d_%d.msi",b64?64:32,HIWORD(pVer->dwProductVersionMS),LOWORD(pVer->dwProductVersionMS),HIWORD(pVer->dwProductVersionLS)); + Sprintf(msiName,_countof(msiName),L"%%ALLUSERSPROFILE%%\\OpenShellSetup%s_%d_%d_%d.msi",(extractType==x86?L"32":(extractType==x64?L"64":L"ARM64")),HIWORD(pVer->dwProductVersionMS),LOWORD(pVer->dwProductVersionMS),HIWORD(pVer->dwProductVersionLS)); DoEnvironmentSubst(msiName,_countof(msiName)); - int ex=ExtractMsi(hInstance,msiName,b64!=FALSE,bQuiet); + int ex=ExtractMsi(hInstance,msiName,extractType,bQuiet); if (ex) return ex; wchar_t cmdLine[2048]; @@ -316,11 +404,19 @@ int APIENTRY wWinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCm Sprintf(cmdLine,_countof(cmdLine),L"msiexec.exe /i \"%s\" %s",msiName,lpCmdLine); } + // On ARM64 we must launch msiexec.exe from system32 and not syswow64 as would otherwise happen + PVOID wow64FsRedirVal=NULL; + if (extractType == ARM64) + Wow64DisableWow64FsRedirection(&wow64FsRedirVal); + // start the installer STARTUPINFO startupInfo={sizeof(startupInfo)}; PROCESS_INFORMATION processInfo; memset(&processInfo,0,sizeof(processInfo)); - if (!CreateProcess(NULL,cmdLine,NULL,NULL,TRUE,0,NULL,NULL,&startupInfo,&processInfo)) + BOOL ret=CreateProcess(NULL,cmdLine,NULL,NULL,TRUE,0,NULL,NULL,&startupInfo,&processInfo); + if (extractType == ARM64) + Wow64RevertWow64FsRedirection(wow64FsRedirVal); + if (!ret) { DeleteFile(msiName); if (!bQuiet) diff --git a/Src/Setup/Setup.rc b/Src/Setup/Setup.rc index 8d479c126..020a47b53 100644 --- a/Src/Setup/Setup.rc +++ b/Src/Setup/Setup.rc @@ -102,6 +102,7 @@ END IDR_MSI_FILE32 MSI_FILE "Temp\\Setup32.msi_" IDR_MSI_FILE64 MSI_FILE "Temp\\Setup64.msi_" +IDR_MSI_FILEARM64 MSI_FILE "Temp\\SetupARM64.msi_" IDR_MSI_CHECKSUM MSI_FILE "msichecksum.bin" @@ -126,7 +127,7 @@ END STRINGTABLE BEGIN - IDS_HELP "Open-Shell Setup will install Open-Shell on your computer. Possible command lines:\n - runs the installer normally\n extract32 - extracts the 32-bit MSI\n extract64 - extracts the 64-bit MSI\n help, /? - shows the command line help\n - the options are passed to msiexec\n * if the options contain %MSI% (all caps) the token is replaced by the name of the extracted MSI file\n * if %MSI% is not found, the setup runs ""msiexec /i ""\n * run msiexec with no parameters to see the full list of msiexec options\n\nExamples:\n /qn - runs the installer in quiet mode\n /x %MSI% /qb - uninstalls the product in basic UI level\n /f %MSI% - repairs the product\n /l* log.txt - runs the installer and logs the process in the log.txt file\n /qn ADDLOCAL=ClassicExplorer - installs only Classic Explorer in quiet mode\n /qn ADDLOCAL=StartMenu APPLICATIONFOLDER=C:\\OpenShell - installs only Open-Shell Start Menu in quiet mode in the folder C:\\OpenShell\n ADDLOCAL=StartMenu,ClassicIE - runs the installer in full UI mode with Open-Shell Start Menu and Classic IE checked by default" + IDS_HELP "Open-Shell Setup will install Open-Shell on your computer. Possible command lines:\n - runs the installer normally\n extract32 - extracts the 32-bit MSI\n extract64 - extracts the 64-bit MSI\n extractARM64 - extracts the ARM64 MSI\n help, /? - shows the command line help\n - the options are passed to msiexec\n * if the options contain %MSI% (all caps) the token is replaced by the name of the extracted MSI file\n * if %MSI% is not found, the setup runs ""msiexec /i ""\n * run msiexec with no parameters to see the full list of msiexec options\n\nExamples:\n /qn - runs the installer in quiet mode\n /x %MSI% /qb - uninstalls the product in basic UI level\n /f %MSI% - repairs the product\n /l* log.txt - runs the installer and logs the process in the log.txt file\n /qn ADDLOCAL=ClassicExplorer - installs only Classic Explorer in quiet mode\n /qn ADDLOCAL=StartMenu APPLICATIONFOLDER=C:\\OpenShell - installs only Open-Shell Start Menu in quiet mode in the folder C:\\OpenShell\n ADDLOCAL=StartMenu,ClassicIE - runs the installer in full UI mode with Open-Shell Start Menu and Classic IE checked by default" END #endif // English (U.S.) resources diff --git a/Src/Setup/Setup.vcxproj b/Src/Setup/Setup.vcxproj index 62ccbfe77..090492dce 100644 --- a/Src/Setup/Setup.vcxproj +++ b/Src/Setup/Setup.vcxproj @@ -17,85 +17,25 @@ 10.0 - + Application - v142 - Unicode - true - - - Application - v142 + $(DefaultPlatformToolset) Unicode + true - - - - - - - + + - - $(Configuration)\ - $(Configuration)\ - true - - - $(Configuration)\ - $(Configuration)\ - false - - - - Disabled - ..\Lib;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - NotUsing - Level3 - EditAndContinue - true - true - stdcpp17 - - - _DEBUG;%(PreprocessorDefinitions) - - - comctl32.lib;Psapi.lib;version.lib;%(AdditionalDependencies) - true - Windows - - - + - MaxSpeed - ..\Lib;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) - MultiThreaded - true NotUsing - Level3 - ProgramDatabase - true - true - stdcpp17 - - NDEBUG;%(PreprocessorDefinitions) - comctl32.lib;Psapi.lib;version.lib;%(AdditionalDependencies) - true - Windows - true - true @@ -124,6 +64,7 @@ + diff --git a/Src/Setup/Setup.vcxproj.filters b/Src/Setup/Setup.vcxproj.filters index 613885939..00a2d7a1a 100644 --- a/Src/Setup/Setup.vcxproj.filters +++ b/Src/Setup/Setup.vcxproj.filters @@ -61,5 +61,6 @@ + \ No newline at end of file diff --git a/Src/Setup/Setup.wxs b/Src/Setup/Setup.wxs index cedf0723c..b1a2f993f 100644 --- a/Src/Setup/Setup.wxs +++ b/Src/Setup/Setup.wxs @@ -3,7 +3,7 @@ # This comment is generated by WixEdit, the specific commandline # arguments for the WiX Toolset are stored here. - candleArgs: "" -out ".wixobj" -ext WixUIExtension -ext WixUtilExtension -dx64=0 + candleArgs: "" -out ".wixobj" -ext WixUIExtension -ext WixUtilExtension -dx64=0 -dARM64=0 lightArgs: ".wixobj" -out ".msi" -ext WixUIExtension -ext WixUtilExtension -loc OpenShellText-en-US.wxl --> @@ -11,6 +11,11 @@ + + + + + @@ -22,9 +27,13 @@ - + + not Msix64 + + NOT (WIX_NATIVE_MACHINE AND WIX_NATIVE_MACHINE="43620") + VersionNT>=601 NOT NEWERPRODUCTFOUND OR Installed @@ -59,7 +68,7 @@ - + @@ -71,7 +80,7 @@ - + @@ -90,18 +99,19 @@ + + - + - IE_BUILD>=90000 @@ -442,6 +452,25 @@ + + + + + + + + + + + + + + + + + + + @@ -535,6 +564,14 @@ + + + VersionNT>601 + + + + VersionNT>601 + @@ -615,6 +652,11 @@ + + + + + @@ -634,6 +676,9 @@ + + + diff --git a/Src/Setup/SetupHelper/SetupHelper.rc b/Src/Setup/SetupHelper/SetupHelper.rc new file mode 100644 index 000000000..beff246c0 --- /dev/null +++ b/Src/Setup/SetupHelper/SetupHelper.rc @@ -0,0 +1,61 @@ +// Microsoft Visual C++ generated resource script. +// + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include "winres.h" +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// English (U.S.) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) +#ifdef _WIN32 +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US +#pragma code_page(1252) +#endif //_WIN32 + +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +VS_VERSION_INFO VERSIONINFO + FILEVERSION _PRODUCT_VERSION + PRODUCTVERSION _PRODUCT_VERSION + FILEFLAGSMASK 0x3fL +#ifdef _DEBUG + FILEFLAGS 0x1L +#else + FILEFLAGS 0x0L +#endif + FILEOS 0x4L + FILETYPE 0x2L + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904e4" + BEGIN + VALUE "CompanyName", "Open-Shell" + VALUE "FileDescription", "Setup helper" + VALUE "FileVersion", _PRODUCT_VERSION_STR + VALUE "InternalName", "SetupHelper.exe" + VALUE "LegalCopyright", "Copyright (C) 2017-2018, The Open-Shell Team" + VALUE "OriginalFilename", "SetupHelper.exe" + VALUE "ProductName", "Open-Shell" + VALUE "ProductVersion", _PRODUCT_VERSION_STR + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 1252 + END +END + +#endif // English (U.S.) resources +///////////////////////////////////////////////////////////////////////////// diff --git a/Src/Setup/SetupHelper/SetupHelper.vcxproj b/Src/Setup/SetupHelper/SetupHelper.vcxproj index 26e8e932c..4b5e328d2 100644 --- a/Src/Setup/SetupHelper/SetupHelper.vcxproj +++ b/Src/Setup/SetupHelper/SetupHelper.vcxproj @@ -17,81 +17,30 @@ 10.0 - + Application - v142 - Unicode - true - - - Application - v142 + $(DefaultPlatformToolset) Unicode + true - - - - - + + - - $(Configuration)\ - $(Configuration)\ - true - - - $(Configuration)\ - $(Configuration)\ - false - - + - Disabled - ..\..\Lib;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug NotUsing - Level3 - true - EditAndContinue - true - stdcpp17 - - true - Windows - - - - - MaxSpeed - true - ..\..\Lib;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) - MultiThreaded - true - NotUsing - Level3 - true - ProgramDatabase - true - stdcpp17 - - - true - Windows - true - true - + + + diff --git a/Src/Setup/UpdateBin/Flags/gd-GB.bmp b/Src/Setup/UpdateBin/Flags/gd-GB.bmp deleted file mode 100644 index a3cabea63..000000000 Binary files a/Src/Setup/UpdateBin/Flags/gd-GB.bmp and /dev/null differ diff --git a/Src/Setup/UpdateBin/UpdateBin.rc b/Src/Setup/UpdateBin/UpdateBin.rc deleted file mode 100644 index 3849c02d2..000000000 Binary files a/Src/Setup/UpdateBin/UpdateBin.rc and /dev/null differ diff --git a/Src/Setup/UpdateBin/UpdateBin.vcxproj b/Src/Setup/UpdateBin/UpdateBin.vcxproj deleted file mode 100644 index 3cedb1b26..000000000 --- a/Src/Setup/UpdateBin/UpdateBin.vcxproj +++ /dev/null @@ -1,506 +0,0 @@ - - - - - update_4.1.0 - Win32 - - - update_4.2.0 - Win32 - - - update_4.2.1 - Win32 - - - update_4.2.2 - Win32 - - - update_4.2.3 - Win32 - - - update_4.2.4 - Win32 - - - update_4.2.5 - Win32 - - - update_4.2.6 - Win32 - - - update_4.2.7 - Win32 - - - update_4.3.0 - Win32 - - - update_4.3.1 - Win32 - - - - {F92A5473-F9E0-412F-923C-6632A66D13C1} - UpdateBin - Win32Proj - 10.0 - - - - DynamicLibrary - v142 - Unicode - - - DynamicLibrary - v142 - Unicode - - - DynamicLibrary - v142 - Unicode - - - DynamicLibrary - v142 - Unicode - - - DynamicLibrary - v142 - Unicode - - - DynamicLibrary - v142 - Unicode - - - DynamicLibrary - v142 - Unicode - - - DynamicLibrary - v142 - Unicode - - - DynamicLibrary - v142 - Unicode - - - DynamicLibrary - v142 - Unicode - - - DynamicLibrary - v142 - Unicode - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - $(Configuration)\ - $(Configuration)\ - false - false - - - $(Configuration)\ - $(Configuration)\ - false - false - - - $(Configuration)\ - $(Configuration)\ - false - false - - - $(Configuration)\ - $(Configuration)\ - false - false - - - $(Configuration)\ - $(Configuration)\ - false - false - - - $(Configuration)\ - $(Configuration)\ - false - false - - - $(Configuration)\ - $(Configuration)\ - false - false - - - $(Configuration)\ - $(Configuration)\ - false - false - - - $(Configuration)\ - $(Configuration)\ - false - false - - - $(Configuration)\ - $(Configuration)\ - false - false - - - $(Configuration)\ - $(Configuration)\ - false - false - - - - ..\Utility\Debug\Utility.exe update .\$(Configuration).txt .\UpdateBin.rc - - - MaxSpeed - true - WIN32;NDEBUG;_WINDOWS;_USRDLL;UPDATEBIN_EXPORTS;%(PreprocessorDefinitions) - MultiThreadedDLL - true - - Level3 - ProgramDatabase - - - ..\Final\$(Configuration).ver - false - Windows - true - true - true - - - - - ..\Utility\Debug\Utility.exe update .\$(Configuration).txt .\UpdateBin.rc - - - MaxSpeed - true - WIN32;NDEBUG;_WINDOWS;_USRDLL;UPDATEBIN_EXPORTS;%(PreprocessorDefinitions) - MultiThreadedDLL - true - - Level3 - ProgramDatabase - - - ..\Final\$(Configuration).ver - false - Windows - true - true - true - - - - - ..\Utility\Debug\Utility.exe update .\$(Configuration).txt .\UpdateBin.rc - - - MaxSpeed - true - WIN32;NDEBUG;_WINDOWS;_USRDLL;UPDATEBIN_EXPORTS;%(PreprocessorDefinitions) - MultiThreadedDLL - true - - Level3 - ProgramDatabase - - - ..\Final\$(Configuration).ver - false - Windows - true - true - true - - - - - ..\Utility\Debug\Utility.exe update .\$(Configuration).txt .\UpdateBin.rc - - - MaxSpeed - true - WIN32;NDEBUG;_WINDOWS;_USRDLL;UPDATEBIN_EXPORTS;%(PreprocessorDefinitions) - MultiThreadedDLL - true - - Level3 - ProgramDatabase - - - ..\Final\$(Configuration).ver - false - Windows - true - true - true - - - - - ..\Utility\Debug\Utility.exe update .\$(Configuration).txt .\UpdateBin.rc - - - MaxSpeed - true - WIN32;NDEBUG;_WINDOWS;_USRDLL;UPDATEBIN_EXPORTS;%(PreprocessorDefinitions) - MultiThreadedDLL - true - - Level3 - ProgramDatabase - - - ..\Final\$(Configuration).ver - false - Windows - true - true - true - - - - - ..\Utility\Debug\Utility.exe update .\$(Configuration).txt .\UpdateBin.rc - - - MaxSpeed - true - WIN32;NDEBUG;_WINDOWS;_USRDLL;UPDATEBIN_EXPORTS;%(PreprocessorDefinitions) - MultiThreadedDLL - true - - Level3 - ProgramDatabase - - - ..\Final\$(Configuration).ver - false - Windows - true - true - true - - - - - ..\Utility\Debug\Utility.exe update .\$(Configuration).txt .\UpdateBin.rc - - - MaxSpeed - true - WIN32;NDEBUG;_WINDOWS;_USRDLL;UPDATEBIN_EXPORTS;%(PreprocessorDefinitions) - MultiThreadedDLL - true - - Level3 - ProgramDatabase - - - ..\Final\$(Configuration).ver - false - Windows - true - true - true - - - - - ..\Utility\Debug\Utility.exe update .\$(Configuration).txt .\UpdateBin.rc - - - MaxSpeed - true - WIN32;NDEBUG;_WINDOWS;_USRDLL;UPDATEBIN_EXPORTS;%(PreprocessorDefinitions) - MultiThreadedDLL - true - - Level3 - ProgramDatabase - - - ..\Final\$(Configuration).ver - false - Windows - true - true - true - - - - - ..\Utility\Debug\Utility.exe update .\$(Configuration).txt .\UpdateBin.rc - - - MaxSpeed - true - WIN32;NDEBUG;_WINDOWS;_USRDLL;UPDATEBIN_EXPORTS;%(PreprocessorDefinitions) - MultiThreadedDLL - true - - Level3 - ProgramDatabase - - - ..\Final\$(Configuration).ver - false - Windows - true - true - true - - - - - ..\Utility\Debug\Utility.exe update .\$(Configuration).txt .\UpdateBin.rc - - - MaxSpeed - true - WIN32;NDEBUG;_WINDOWS;_USRDLL;UPDATEBIN_EXPORTS;%(PreprocessorDefinitions) - MultiThreadedDLL - true - - Level3 - ProgramDatabase - - - ..\Final\$(Configuration).ver - false - Windows - true - true - true - - - - - ..\Utility\Debug\Utility.exe update .\$(Configuration).txt .\UpdateBin.rc - - - MaxSpeed - true - WIN32;NDEBUG;_WINDOWS;_USRDLL;UPDATEBIN_EXPORTS;%(PreprocessorDefinitions) - MultiThreadedDLL - true - - Level3 - ProgramDatabase - - - ..\Final\$(Configuration).ver - false - Windows - true - true - true - - - - - - - - - - - - - - - - - - - - - - - - {dae66c9b-05dc-4ace-97da-2547b490bbff} - false - - - - - - \ No newline at end of file diff --git a/Src/Setup/UpdateBin/resource.h b/Src/Setup/UpdateBin/resource.h deleted file mode 100644 index 06d0a79cc..000000000 --- a/Src/Setup/UpdateBin/resource.h +++ /dev/null @@ -1,10 +0,0 @@ -#define IDS_VERSION 16 -#define IDS_NEWS 17 -#define IDS_INSTALL_URL 18 -#define IDS_INSTALL_SIGNER 19 -#define IDS_LNG_URL 20 -#define IDS_LNG_VERSION 21 -#define IDS_LNG_CRC 22 -#define IDS_UPDATE_LINK 23 -#define IDS_LANGUAGE_LINK 24 -#define IDS_ALT_URL 25 diff --git a/Src/Setup/UpdateBin/update_4.1.0.txt b/Src/Setup/UpdateBin/update_4.1.0.txt deleted file mode 100644 index 6c4ba5a35..000000000 Binary files a/Src/Setup/UpdateBin/update_4.1.0.txt and /dev/null differ diff --git a/Src/Setup/UpdateBin/update_4.2.0.txt b/Src/Setup/UpdateBin/update_4.2.0.txt deleted file mode 100644 index 3c5e5b82a..000000000 Binary files a/Src/Setup/UpdateBin/update_4.2.0.txt and /dev/null differ diff --git a/Src/Setup/UpdateBin/update_4.2.1.txt b/Src/Setup/UpdateBin/update_4.2.1.txt deleted file mode 100644 index 906eb85a8..000000000 Binary files a/Src/Setup/UpdateBin/update_4.2.1.txt and /dev/null differ diff --git a/Src/Setup/UpdateBin/update_4.2.2.txt b/Src/Setup/UpdateBin/update_4.2.2.txt deleted file mode 100644 index 2b6311e80..000000000 Binary files a/Src/Setup/UpdateBin/update_4.2.2.txt and /dev/null differ diff --git a/Src/Setup/UpdateBin/update_4.2.3.txt b/Src/Setup/UpdateBin/update_4.2.3.txt deleted file mode 100644 index ead837f86..000000000 Binary files a/Src/Setup/UpdateBin/update_4.2.3.txt and /dev/null differ diff --git a/Src/Setup/UpdateBin/update_4.2.4.txt b/Src/Setup/UpdateBin/update_4.2.4.txt deleted file mode 100644 index d8974cbf7..000000000 Binary files a/Src/Setup/UpdateBin/update_4.2.4.txt and /dev/null differ diff --git a/Src/Setup/UpdateBin/update_4.2.5.txt b/Src/Setup/UpdateBin/update_4.2.5.txt deleted file mode 100644 index a82fa45a4..000000000 Binary files a/Src/Setup/UpdateBin/update_4.2.5.txt and /dev/null differ diff --git a/Src/Setup/UpdateBin/update_4.2.6.txt b/Src/Setup/UpdateBin/update_4.2.6.txt deleted file mode 100644 index 5523b9d2a..000000000 Binary files a/Src/Setup/UpdateBin/update_4.2.6.txt and /dev/null differ diff --git a/Src/Setup/UpdateBin/update_4.2.7.txt b/Src/Setup/UpdateBin/update_4.2.7.txt deleted file mode 100644 index b674d78be..000000000 Binary files a/Src/Setup/UpdateBin/update_4.2.7.txt and /dev/null differ diff --git a/Src/Setup/UpdateBin/update_4.3.0.txt b/Src/Setup/UpdateBin/update_4.3.0.txt deleted file mode 100644 index 427001085..000000000 Binary files a/Src/Setup/UpdateBin/update_4.3.0.txt and /dev/null differ diff --git a/Src/Setup/UpdateBin/update_4.3.1.txt b/Src/Setup/UpdateBin/update_4.3.1.txt deleted file mode 100644 index c75f89e2c..000000000 Binary files a/Src/Setup/UpdateBin/update_4.3.1.txt and /dev/null differ diff --git a/Src/Setup/Utility/ManualUninstall.cpp b/Src/Setup/Utility/ManualUninstall.cpp index 6c0b0ad69..59380befa 100644 --- a/Src/Setup/Utility/ManualUninstall.cpp +++ b/Src/Setup/Utility/ManualUninstall.cpp @@ -53,6 +53,7 @@ static const wchar_t *g_InstalledFiles[]= L"ClassicIEDLL_64.dll", L"ClassicIE_32.exe", L"ClassicIE_64.exe", + L"DesktopToasts.dll", L"OpenShell.chm", L"OpenShellReadme.rtf", L"Update.exe", @@ -82,6 +83,8 @@ static const wchar_t *g_InstalledSkins[]= L"Classic Skin.skin", L"Classic Skin.skin7", L"Full Glass.skin", + L"Immersive.skin", + L"Immersive.skin7", L"Metallic.skin7", L"Metro.skin", L"Metro.skin7", @@ -114,6 +117,7 @@ static const wchar_t *g_LocalFiles[]= L"ClassicIELog.txt", L"StartMenuLog.txt", L"DataCache.db", + L"ModernSettings.dat", }; // files to delete from the ALLUSERSPROFILE folder @@ -330,7 +334,7 @@ LRESULT CResultsDlg::OnInitDialog( UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL if (m_bErrors) { SetDlgItemText(IDC_STATICRESULT,L"The Open-Shell removal tool encountered some errors. Please, restart your computer and try again. If the problem is not resolved" - L" seek help in the Open-Shell forums: www.classicshell.net/forum. Copy the following report and post it in the forum. The report is also saved in a file OpenShellReport.txt on your desktop."); + L" seek help in the Open-Shell forums: https://github.com/Open-Shell/Open-Shell-Menu/discussions. Copy the following report and post it in the forum. The report is also saved in a file OpenShellReport.txt on your desktop."); } else if (m_bReboot) { @@ -643,7 +647,7 @@ static void DeleteRegValueSOFTWARE( const wchar_t *keyName, const wchar_t *value int error=RegOpenKeyEx(HKEY_LOCAL_MACHINE,keyName2,0,KEY_WRITE|DELETE|KEY_WOW64_64KEY,&hkey); if (error==ERROR_SUCCESS) { - int error=RegDeleteValue2(hkey,keyName); + int error=RegDeleteValue2(hkey,valueName); if (error!=ERROR_FILE_NOT_FOUND) { LogMessage(-1,L"Deleting registry value HKEY_LOCAL_MACHINE\\SOFTWARE\\%s:%s",keyName,valueName); @@ -666,7 +670,7 @@ static void DeleteRegValueSOFTWARE( const wchar_t *keyName, const wchar_t *value int error=RegOpenKeyEx(HKEY_LOCAL_MACHINE,keyName2,0,KEY_WRITE|DELETE|KEY_WOW64_32KEY,&hkey); if (error==ERROR_SUCCESS) { - int error=RegDeleteValue2(hkey,keyName); + int error=RegDeleteValue2(hkey,valueName); if (error!=ERROR_FILE_NOT_FOUND) { LogMessage(-1,L"Deleting registry value HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\%s:%s",keyName,valueName); @@ -979,6 +983,13 @@ static void ManualUninstallInternal( void ) DeleteRegKeyHKCR(L"ClassicIE.ClassicIEBHO.1"); DeleteRegKeyHKCR(L"StartMenuHelper.StartMenuExt"); DeleteRegKeyHKCR(L"StartMenuHelper.StartMenuExt.1"); + DeleteRegKeyHKCR(L"TypeLib\\{BF8D124A-A4E0-402F-8152-4EF377E62586}"); + DeleteRegKeyHKCR(L"TypeLib\\{FDA50A1E-B8CE-49DE-8D17-B034A84AA280}"); + DeleteRegKeyHKCR(L"Interface\\{2576496C-B58A-4995-8878-8B68F9E8D1FC}"); + DeleteRegKeyHKCR(L"Interface\\{6E00B97F-A4D4-4062-98E4-4F66FC96F32F}"); + DeleteRegKeyHKCR(L"Interface\\{A1678625-A011-4B7C-A1FA-D691E4CDDB79}"); + DeleteRegKeyHKCR(L"Interface\\{BC4C1B8F-0BDE-4E42-9583-E072B2A28E0D}"); + DeleteRegKeyHKCR(L"Interface\\{C698A81E-5D02-42B1-9801-5381CA8BBC2F}"); DeleteRegKeyCLSID(L"{449D0D6E-2412-4E61-B68F-1CB625CD9E52}",bIsWow64); DeleteRegKeyCLSID(L"{553891B7-A0D5-4526-BE18-D3CE461D6310}",bIsWow64); @@ -986,6 +997,10 @@ static void ManualUninstallInternal( void ) DeleteRegKeyCLSID(L"{8C83ACB1-75C3-45D2-882C-EFA32333491C}",bIsWow64); DeleteRegKeyCLSID(L"{D3214FBB-3CA1-406A-B3E8-3EB7C393A15E}",bIsWow64); DeleteRegKeyCLSID(L"{E595F05F-903F-4318-8B0A-7F633B520D2B}",bIsWow64); + DeleteRegKeyCLSID(L"{82E749ED-B971-4550-BAF7-06AA2BF7E836}",bIsWow64); + DeleteRegKeyCLSID(L"{5AB14324-C087-42C1-B905-A0BFDB4E9532}",bIsWow64); + DeleteRegKeyCLSID(L"{E407B70A-1FBD-4D5E-8822-231C69102472}",bIsWow64); + DeleteRegKeyCLSID(L"{EA801577-E6AD-4BD5-8F71-4BE0154331A4}",bIsWow64); DeleteRegKeySOFTWARE(L"Microsoft\\Internet Explorer\\Extensions\\{56753E59-AF1D-4FBA-9E15-31557124ADA2}",bIsWow64); DeleteRegKeySOFTWARE(L"Microsoft\\Internet Explorer\\Low Rights\\ElevationPolicy\\{02E6771D-8375-42B9-9F83-B4730F697900}",bIsWow64); @@ -1001,6 +1016,7 @@ static void ManualUninstallInternal( void ) DeleteRegValueSOFTWARE(L"Microsoft\\Windows\\CurrentVersion\\Policies\\Ext\\CLSID",L"{553891B7-A0D5-4526-BE18-D3CE461D6310}",bIsWow64); DeleteRegValueSOFTWARE(L"Microsoft\\Windows\\CurrentVersion\\Policies\\Ext\\CLSID",L"{EA801577-E6AD-4BD5-8F71-4BE0154331A4}",bIsWow64); DeleteRegValueSOFTWARE(L"Microsoft\\Windows\\CurrentVersion\\Run",L"Open-Shell Menu",bIsWow64); + DeleteRegValueSOFTWARE(L"Microsoft\\Windows\\CurrentVersion\\Run",L"Open-Shell Start Menu",bIsWow64); DeleteInstallerKey(HKEY_CLASSES_ROOT,L"HKEY_CLASSES_ROOT",L"Installer\\Features",L"OpenShell",L""); DeleteInstallerKey(HKEY_CLASSES_ROOT,L"HKEY_CLASSES_ROOT",L"Installer\\Products",L"ProductName",L"Open-Shell"); diff --git a/Src/Setup/Utility/SaveLogFile.cpp b/Src/Setup/Utility/SaveLogFile.cpp index 00b6cdb0c..4149e65a6 100644 --- a/Src/Setup/Utility/SaveLogFile.cpp +++ b/Src/Setup/Utility/SaveLogFile.cpp @@ -53,11 +53,6 @@ void UpdateSettings( void ) { } -const wchar_t *GetDocRelativePath( void ) -{ - return NULL; -} - /////////////////////////////////////////////////////////////////////////////// static const wchar_t *g_Tabs=L"\t\t\t\t\t\t\t\t\t\t"; diff --git a/Src/Setup/Utility/Utility.cpp b/Src/Setup/Utility/Utility.cpp index 003594935..3cc524f4a 100644 --- a/Src/Setup/Utility/Utility.cpp +++ b/Src/Setup/Utility/Utility.cpp @@ -13,7 +13,6 @@ #include "FNVHash.h" #include "SettingsParser.h" #include "resource.h" -#include "..\UpdateBin\resource.h" #include "ResourceHelper.h" #include #include "SaveLogFile.h" @@ -87,7 +86,7 @@ int CalcMsiChecksum( wchar_t *const *params, int count ) // load files wchar_t path1[_MAX_PATH]; - std::vector buf1, buf2; + std::vector buf1, buf2, buf3; Sprintf(path1,_countof(path1),L"%s\\Setup32.msi",params[1]); LoadFile(path1,buf1); if (buf1.empty()) @@ -103,20 +102,30 @@ int CalcMsiChecksum( wchar_t *const *params, int count ) Printf("Failed to open file %s\n",path2); return 1; } + wchar_t path3[_MAX_PATH]; + Sprintf(path3,_countof(path3),L"%s\\SetupARM64.msi",params[1]); + LoadFile(path3,buf3); + if (buf3.empty()) + { + Printf("Failed to open file %s\n",path3); + return 1; + } int len1=(int)buf1.size(); int len2=(int)buf2.size(); + int len3=(int)buf3.size(); for (std::vector::iterator it=buf1.begin();it!=buf1.end();++it) *it^=0xFF; for (std::vector::iterator it=buf2.begin();it!=buf2.end();++it) *it^=0xFF; + for (std::vector::iterator it=buf3.begin();it!=buf3.end();++it) + *it^=0xFF; - // detect common blocks (assuming at least 256K in size and in the same order in both files) - const int BLOCK_SIZE=256*1024; + const int BLOCK_SIZE = 256 * 1024; + // detect x86/x64 common blocks (assuming at least 256K in size and in the same order in both files) std::vector chunks; - int start2=0; - for (int i=0;i chunks2; + for (int i=0,start2=0;i0 && chunk.start2>0 && buf1[chunk.start1-1]==buf3[chunk.start2-1]) + { + chunk.start1--; + chunk.start2--; + chunk.len++; + } + while (chunk.start1+chunk.len::const_iterator it=chunks2.begin();it!=chunks2.end();++it) + { + if (it->start2-start>0) + fwrite(&buf3[start],1,it->start2-start,f); + start=it->start2+it->len; + } + if (len3-start>0) + fwrite(&buf3[start],1,len3-start,f); + fclose(f); + } + + unsigned int fnvs[3]; fnvs[0]=CalcFNVHash(&buf1[0],len1,FNV_HASH0); fnvs[1]=CalcFNVHash(&buf2[0],len2,FNV_HASH0); + fnvs[2]=CalcFNVHash(&buf3[0],len3,FNV_HASH0); // save fnvs and chunks { @@ -194,6 +254,9 @@ int CalcMsiChecksum( wchar_t *const *params, int count ) int count=(int)chunks.size(); fwrite(&count,1,4,f); fwrite(&chunks[0],sizeof(Chunk),count,f); + count=(int)chunks2.size(); + fwrite(&count,1,4,f); + fwrite(&chunks2[0],sizeof(Chunk),count,f); fclose(f); } return 0; @@ -412,256 +475,6 @@ int MakeEnglishDll( wchar_t *const *params, int count ) /////////////////////////////////////////////////////////////////////////////// -struct LanguageData -{ - std::map strings; - CString bitmap; -}; - -int GenerateUpdateFile( wchar_t *const *params, int count ) -{ - if (count<3) return 3; - - std::vector buf; - LoadFile(params[1],buf); - if (buf.empty()) return 1; - buf.push_back(0); - buf.push_back(0); - - wchar_t token[256]; - - std::map languages; - const int DEFAULT_LANGUAGE=0x409; - - const wchar_t *str0=(wchar_t*)&buf[0]; - if (*str0==0xFEFF) str0++; - const wchar_t *str; - - // old (current) version - str=wcsstr(str0,L"{OLD_VER}"); - if (!str) return 1; - GetToken(str+9,token,_countof(token),L"\r\n"); - int v1, v2, v3; - swscanf_s(token,L"%d.%d.%d",&v1,&v2,&v3); - - // new version - str=wcsstr(str0,L"{NEW_VER}"); - if (!str) return 1; - GetToken(str+9,token,_countof(token),L"\r\n"); - languages[DEFAULT_LANGUAGE].strings[IDS_VERSION]=token; - - // signer - str=wcsstr(str0,L"{SIGNER}"); - if (!str) return 1; - GetToken(str+8,token,_countof(token),L"\r\n"); - languages[DEFAULT_LANGUAGE].strings[IDS_INSTALL_SIGNER]=token; - - // update - str=wcsstr(str0,L"{UPDATE}"); - if (!str) return 1; - GetToken(str+8,token,_countof(token),L"\r\n"); - languages[DEFAULT_LANGUAGE].strings[IDS_UPDATE_LINK]=token; - - // languages - str=wcsstr(str0,L"{LANGUAGES}"); - if (!str) return 1; - GetToken(str+11,token,_countof(token),L"\r\n"); - languages[DEFAULT_LANGUAGE].strings[IDS_LANGUAGE_LINK]=token; - - // language folder - str=wcsstr(str0,L"{LANGFOLDER}"); - if (!str) return 1; - wchar_t langFolder[_MAX_PATH]; - GetToken(str+12,langFolder,_countof(langFolder),L"\r\n"); - - // alt url - str=wcsstr(str0,L"{ALT}"); - if (str) - { - GetToken(str+5,token,_countof(token),L"\r\n"); - languages[DEFAULT_LANGUAGE].strings[IDS_ALT_URL]=token; - } - - // news - str=wcsstr(str0,L"{NEWS}"); - if (!str) return 1; - languages[DEFAULT_LANGUAGE].strings[IDS_NEWS]=str+6; - - // look for {INST: - str=str0; - bool res=true; - while (1) - { - str=wcsstr(str,L"{INST: "); - res=true; - if (!str) break; - res=false; - str+=7; - str=GetToken(str,token,_countof(token),L"}\r\n"); - int language; - if (!GetLocaleInfoEx(token,LOCALE_ILANGUAGE|LOCALE_RETURN_NUMBER,(LPWSTR)&language,4)) - break; - str=GetToken(str,token,_countof(token),L"\r\n"); - languages[language].strings[IDS_INSTALL_URL]=token; - // languages[language].strings[IDS_VERSION]=...; // TODO: allow per-language version of the installer - } - - if (!res) return 1; - - str=str0; - while (1) - { - str=wcsstr(str,L"{LANG: "); - res=true; - if (!str) break; - res=false; - str+=7; - str=GetToken(str,token,_countof(token),L"}\r\n"); - int len=Strlen(token); - bool bBasic=(len>0 && token[len-1]=='*'); - if (bBasic) token[len-1]=0; - int language; - if (!GetLocaleInfoEx(token,LOCALE_ILANGUAGE|LOCALE_RETURN_NUMBER,(LPWSTR)&language,4)) - break; - - wchar_t fname[_MAX_PATH]; - Sprintf(fname,_countof(fname),L"%s\\%s.dll",langFolder,token); -/* if (GetFileAttributes(fname)==INVALID_FILE_ATTRIBUTES) - { - fname[0]=0; - wchar_t find[_MAX_PATH]; - Sprintf(find,_countof(find),L"%s\\*.*",langFolder); - WIN32_FIND_DATA data; - HANDLE h=FindFirstFile(find,&data); - while (h!=INVALID_HANDLE_VALUE) - { - if ((data.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY) && data.cFileName[0]!='.') - { - Sprintf(fname,_countof(fname),L"%s\\%s\\%s.dll",langFolder,data.cFileName,token); - if (GetFileAttributes(fname)!=INVALID_FILE_ATTRIBUTES) - { - FindClose(h); - break; - } - } - if (!FindNextFile(h,&data)) - { - FindClose(h); - break; - } - } - }*/ - if (!fname[0]) break; - - unsigned long hash=0; - wchar_t version[100]; - - hash=CalcFileFNV(fname); - if (!hash) break; - - DWORD dllBuild; - DWORD dllVer=GetFileVersion(fname,&dllBuild); - if (!dllVer) break; - if (dllVer>(DWORD)((v1<<24)|(v2<<16)|v3)) break; - - Sprintf(version,_countof(version),L"%d.%d.%d.%d%s",dllVer>>24,(dllVer>>16)&255,dllVer&65535,dllBuild,bBasic?L"*":L""); - - Sprintf(token,_countof(token),L"%08X",hash); - languages[language].strings[IDS_LNG_CRC]=token; - - languages[language].strings[IDS_LNG_VERSION]=version; - str=GetToken(str,token,_countof(token),L"\r\n"); - languages[language].strings[IDS_LNG_URL]=token; - } - - if (!res) return 1; - - // look for {FLAG: - str=str0; - while (1) - { - str=wcsstr(str,L"{FLAG: "); - res=true; - if (!str) break; - res=false; - str+=7; - str=GetToken(str,token,_countof(token),L"}\r\n"); - int language; - if (!GetLocaleInfoEx(token,LOCALE_ILANGUAGE|LOCALE_RETURN_NUMBER,(LPWSTR)&language,4)) - break; - str=GetToken(str,token,_countof(token),L"\r\n"); - languages[language].bitmap=token; - } - - if (!res) return 1; - - FILE *f=NULL; - if (_wfopen_s(&f,params[2],L"wb") || !f) - { - return 1; - } - fwprintf(f,L"\xFEFF"); - for (std::map::const_iterator it=languages.begin();it!=languages.end();++it) - { - fwprintf(f,L"/////////////////////////////////////////////////////////////////////////////\r\n"); - GetLocaleInfo(it->first,LOCALE_SLANGUAGE,token,_countof(token)); - fwprintf(f,L"// %s\r\n\r\n",token); - fwprintf(f,L"LANGUAGE 0x%02X, 0x%X\r\n",it->first&0x3FF,it->first>>10); - fwprintf(f,L"\r\nSTRINGTABLE\r\nBEGIN\r\n"); - for (std::map::const_iterator it2=it->second.strings.begin();it2!=it->second.strings.end();++it2) - { - CString str=it2->second; - str.Replace(L"\r\n",L"\\r\\n"); - str.Replace(L"\"",L"\"\""); - fwprintf(f,L"%4d \"%s\"\r\n",it2->first,(const wchar_t*)str); - } - fwprintf(f,L"END\r\n\r\n"); - - if (it->first==DEFAULT_LANGUAGE) - { - fwprintf(f,L"1 VERSIONINFO\r\n"); - fwprintf(f,L" FILEVERSION %d,%d,%d,0\r\n",v1,v2,v3); - fwprintf(f,L" PRODUCTVERSION %d,%d,%d,0\r\n",v1,v2,v3); - fwprintf(f,L" FILEFLAGSMASK 0x17L\r\n"); - fwprintf(f,L" FILEFLAGS 0x0L\r\n"); - fwprintf(f,L" FILEOS 0x4L\r\n"); - fwprintf(f,L" FILETYPE 0x1L\r\n"); - fwprintf(f,L" FILESUBTYPE 0x0L\r\n"); - fwprintf(f,L"BEGIN\r\n"); - fwprintf(f,L"\tBLOCK \"StringFileInfo\"\r\n"); - fwprintf(f,L"\tBEGIN\r\n"); - fwprintf(f,L"\t\tBLOCK \"040904b0\"\r\n"); - fwprintf(f,L"\t\tBEGIN\r\n"); - fwprintf(f,L"\t\t\tVALUE \"CompanyName\", \"OpenShell\"\r\n"); - fwprintf(f,L"\t\t\tVALUE \"FileDescription\", \"Update information\"\r\n"); - fwprintf(f,L"\t\t\tVALUE \"FileVersion\", \"%d, %d, %d, 0\"\r\n",v1,v2,v3); - fwprintf(f,L"\t\t\tVALUE \"InternalName\", \"Update\"\r\n"); - fwprintf(f,L"\t\t\tVALUE \"LegalCopyright\", \"Copyright (C) 2017-2018, The Open-Shell Team\"\r\n"); - fwprintf(f,L"\t\t\tVALUE \"OriginalFilename\", \"update.ver\"\r\n"); - fwprintf(f,L"\t\t\tVALUE \"ProductName\", \"Open-Shell\"\r\n"); - fwprintf(f,L"\t\t\tVALUE \"ProductVersion\", \"%d, %d, %d, 0\"\r\n",v1,v2,v3); - fwprintf(f,L"\t\tEND\r\n"); - fwprintf(f,L"\tEND\r\n"); - fwprintf(f,L"\tBLOCK \"VarFileInfo\"\r\n"); - fwprintf(f,L"\tBEGIN\r\n"); - fwprintf(f,L"\t\tVALUE \"Translation\", 0x409, 1200\r\n"); - fwprintf(f,L"\tEND\r\n"); - fwprintf(f,L"END\r\n\r\n"); - - for (std::map::const_iterator it3=languages.begin();it3!=languages.end();++it3) - { - if (!it3->second.bitmap.IsEmpty()) - fwprintf(f,L"%d BITMAP \"%s\"\r\n",it3->first,(const wchar_t*)it3->second.bitmap); - } - fwprintf(f,L"\r\n"); - } - } - fclose(f); - return 0; -} - -/////////////////////////////////////////////////////////////////////////////// - static void UnsescapeString( wchar_t *string ) { wchar_t *dst=string; @@ -1092,12 +905,11 @@ static HRESULT CALLBACK TaskDialogCallback( HWND hwnd, UINT uNotification, WPARA // Open-Shell utility - multiple utilities for building and maintaining Open-Shell // Usage: // no parameters - saves a troubleshooting log -// crcmsi // creates a file with checksum of both msi files +// crcmsi // creates a file with checksum of all msi files // makeEN // extracts the localization resources and creates a sample en-US.DLL // extract // extracts the string table, the dialog text, and the L10N text from a DLL and stores it in a CSV // extract en-us.dll // extracts the string table, the dialog text, and the L10N text from two DLL and stores it in a CSV // import // replaces the string table in the DLL with the text from the CSV -// update // generates a resource file for UpdateBin.dll by calculating the DLL hashes int WINAPI wWinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpstrCmdLine, int nCmdShow ) { @@ -1122,7 +934,7 @@ int WINAPI wWinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpstrC tasks.pszMainInstruction=L"Select task to perform"; tasks.cButtons=HIWORD(winVer)>=0x0602?4:3; tasks.pButtons=taskButtons; - tasks.pszFooter=L"www.classicshell.net"; + tasks.pszFooter=L"Open-Shell Homepage"; tasks.pfCallback=TaskDialogCallback; int seleciton; @@ -1176,11 +988,6 @@ int WINAPI wWinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpstrC return ImportStrings(params,count); } - if (_wcsicmp(params[0],L"update")==0) - { - return GenerateUpdateFile(params,count); - } - if (_wcsicmp(params[0],L"colors")==0) { ShowMetroColorViewer(); diff --git a/Src/Setup/Utility/Utility.rc b/Src/Setup/Utility/Utility.rc index 11a290c1f..a544464a8 100644 --- a/Src/Setup/Utility/Utility.rc +++ b/Src/Setup/Utility/Utility.rc @@ -52,7 +52,7 @@ END // FILE // -1 FILE "Release64\\Utility.exe" +1 FILE "..\\..\\..\\build\\bin\\Release64\\Utility.exe" ///////////////////////////////////////////////////////////////////////////// // @@ -207,6 +207,44 @@ BEGIN END #endif // APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +VS_VERSION_INFO VERSIONINFO + FILEVERSION _PRODUCT_VERSION + PRODUCTVERSION _PRODUCT_VERSION + FILEFLAGSMASK 0x3fL +#ifdef _DEBUG + FILEFLAGS 0x1L +#else + FILEFLAGS 0x0L +#endif + FILEOS 0x4L + FILETYPE 0x2L + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904e4" + BEGIN + VALUE "CompanyName", "Open-Shell" + VALUE "FileDescription", "Utility" + VALUE "FileVersion", _PRODUCT_VERSION_STR + VALUE "InternalName", "Utility.exe" + VALUE "LegalCopyright", "Copyright (C) 2017-2018, The Open-Shell Team" + VALUE "OriginalFilename", "Utility.exe" + VALUE "ProductName", "Open-Shell" + VALUE "ProductVersion", _PRODUCT_VERSION_STR + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 1252 + END +END + #endif // English (U.S.) resources ///////////////////////////////////////////////////////////////////////////// diff --git a/Src/Setup/Utility/Utility.vcxproj b/Src/Setup/Utility/Utility.vcxproj index c06b734fe..744de02c8 100644 --- a/Src/Setup/Utility/Utility.vcxproj +++ b/Src/Setup/Utility/Utility.vcxproj @@ -1,6 +1,10 @@ + + Debug + ARM64 + Debug Win32 @@ -9,6 +13,10 @@ Debug x64 + + Release + ARM64 + Release Win32 @@ -25,154 +33,26 @@ 10.0 - - Application - v142 - Static - Unicode - true - - - Application - v142 - Static - Unicode - - - Application - v142 - Static - Unicode - true - - + Application - v142 + $(DefaultPlatformToolset) Static Unicode + true - - - - - - - - - - - + + - - $(Configuration)\ - $(Configuration)\ - true - - - $(Configuration)64\ - $(Configuration)64\ - true - - - $(Configuration)\ - $(Configuration)\ - false - - - $(Configuration)64\ - $(Configuration)64\ - false - - - - Disabled - ..\..\Lib;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - NotUsing - Level3 - EditAndContinue - true - stdcpp17 - - - comctl32.lib;uxtheme.lib;dwmapi.lib;winmm.lib;htmlhelp.lib;psapi.lib;version.lib;Secur32.lib;Netapi32.lib;%(AdditionalDependencies) - true - Windows - - - - - Disabled - ..\..\Lib;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - NotUsing - Level3 - ProgramDatabase - true - stdcpp17 - - - _UNICODE;UNICODE;_WIN64;%(PreprocessorDefinitions) - - - comctl32.lib;uxtheme.lib;dwmapi.lib;winmm.lib;htmlhelp.lib;psapi.lib;version.lib;Secur32.lib.;%(AdditionalDependencies) - true - Windows - - - + - MaxSpeed - true - ..\..\Lib;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) - MultiThreaded - true NotUsing - Level3 - ProgramDatabase - true - stdcpp17 comctl32.lib;uxtheme.lib;dwmapi.lib;winmm.lib;htmlhelp.lib;psapi.lib;version.lib;Secur32.lib;Netapi32.lib;%(AdditionalDependencies) - true - Windows - true - true - - - - - MaxSpeed - true - ..\..\Lib;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) - MultiThreaded - true - NotUsing - Level3 - ProgramDatabase - true - stdcpp17 - - - _UNICODE;UNICODE;_WIN64;%(PreprocessorDefinitions) - - - comctl32.lib;uxtheme.lib;dwmapi.lib;winmm.lib;htmlhelp.lib;psapi.lib;version.lib;Secur32.lib.;%(AdditionalDependencies) - true - Windows - true - true @@ -191,6 +71,7 @@ true + true diff --git a/Src/Setup/__MakeFinal.bat b/Src/Setup/__MakeFinal.bat index 16bcdf1e4..d1b1ebbf3 100644 --- a/Src/Setup/__MakeFinal.bat +++ b/Src/Setup/__MakeFinal.bat @@ -1,5 +1,5 @@ @echo off -set PATH=C:\Program Files\7-Zip\;C:\Program Files (x86)\HTML Help Workshop;C:\Program Files (x86)\WiX Toolset v3.11\bin\;%PATH% +set PATH=C:\Program Files\7-Zip\;C:\Program Files (x86)\HTML Help Workshop;C:\Program Files (x86)\WiX Toolset v3.14\bin\;%PATH% cd %~dp0 diff --git a/Src/Setup/__MakeFinalAllLanguages.bat b/Src/Setup/__MakeFinalAllLanguages.bat index ad73e7a04..161527007 100644 --- a/Src/Setup/__MakeFinalAllLanguages.bat +++ b/Src/Setup/__MakeFinalAllLanguages.bat @@ -1,7 +1,7 @@ @echo off rem This file is to create all the files required for a new release to publish -set PATH=C:\Program Files\7-Zip\;C:\Program Files (x86)\HTML Help Workshop;C:\Program Files (x86)\WiX Toolset v3.11\bin\;%PATH% +set PATH=C:\Program Files\7-Zip\;C:\Program Files (x86)\HTML Help Workshop;C:\Program Files (x86)\WiX Toolset v3.14\bin\;%PATH% cd %~dp0 diff --git a/Src/Setup/banner.jpg b/Src/Setup/banner.jpg index f1d2ce16c..0a5c9ec7d 100644 Binary files a/Src/Setup/banner.jpg and b/Src/Setup/banner.jpg differ diff --git a/Src/Setup/dialog.jpg b/Src/Setup/dialog.jpg index b92341cdb..29c7fdbd1 100644 Binary files a/Src/Setup/dialog.jpg and b/Src/Setup/dialog.jpg differ diff --git a/Src/Setup/dialog2.jpg b/Src/Setup/dialog2.jpg index dc0946ba9..3158905e8 100644 Binary files a/Src/Setup/dialog2.jpg and b/Src/Setup/dialog2.jpg differ diff --git a/Src/Setup/en-US/en-US.vcxproj b/Src/Setup/en-US/en-US.vcxproj index df1d9c699..4c16e2d32 100644 --- a/Src/Setup/en-US/en-US.vcxproj +++ b/Src/Setup/en-US/en-US.vcxproj @@ -13,25 +13,24 @@ 10.0 - + DynamicLibrary - v142 + $(DefaultPlatformToolset) Unicode - - + - + ..\..\ - $(Configuration)\ + ..\..\..\build\obj\$(ProjectName)\ true false - + false Windows diff --git a/Src/Setup/resource.h b/Src/Setup/resource.h index 85076b8d8..e77b7a46d 100644 --- a/Src/Setup/resource.h +++ b/Src/Setup/resource.h @@ -8,6 +8,7 @@ #define IDS_ERR_CORRUPTED 102 #define IDR_MSI_FILE32 132 #define IDR_MSI_FILE64 164 +#define IDR_MSI_FILEARM64 165 #define IDS_ERR_INTERNAL 166 #define IDS_ERR_EXTRACT 167 #define IDR_MSI_CHECKSUM 167 diff --git a/Src/Setup/web.ico b/Src/Setup/web.ico index 1f8c01202..66d0c62c2 100644 Binary files a/Src/Setup/web.ico and b/Src/Setup/web.ico differ diff --git a/Src/Skins/ClassicSkin/ClassicSkin.vcxproj b/Src/Skins/ClassicSkin/ClassicSkin.vcxproj index 15fd50e3b..4bad04b5e 100644 --- a/Src/Skins/ClassicSkin/ClassicSkin.vcxproj +++ b/Src/Skins/ClassicSkin/ClassicSkin.vcxproj @@ -13,35 +13,22 @@ 10.0 - + DynamicLibrary - v142 + $(DefaultPlatformToolset) Unicode - - + + - - $(SolutionDir)StartMenu\Skins\ - $(Configuration)\ - true - false + .skin Classic Skin - - - false - Windows - true - true - true - - diff --git a/Src/Skins/ClassicSkin7/ClassicSkin7.vcxproj b/Src/Skins/ClassicSkin7/ClassicSkin7.vcxproj index ffde5f5a3..d4894296a 100644 --- a/Src/Skins/ClassicSkin7/ClassicSkin7.vcxproj +++ b/Src/Skins/ClassicSkin7/ClassicSkin7.vcxproj @@ -13,35 +13,22 @@ 10.0 - + DynamicLibrary - v142 + $(DefaultPlatformToolset) Unicode - - + + - - $(SolutionDir)StartMenu\Skins\ - $(Configuration)\ - true - false + .skin7 Classic Skin - - - false - Windows - true - true - true - - diff --git a/Src/Skins/FullGlass/FullGlass.vcxproj b/Src/Skins/FullGlass/FullGlass.vcxproj index 4299cf85f..2fcb42a80 100644 --- a/Src/Skins/FullGlass/FullGlass.vcxproj +++ b/Src/Skins/FullGlass/FullGlass.vcxproj @@ -13,35 +13,22 @@ 10.0 - + DynamicLibrary - v142 + $(DefaultPlatformToolset) Unicode - - + + - - $(SolutionDir)StartMenu\Skins\ - $(Configuration)\ - true - false + .skin Full Glass - - - false - Windows - true - true - true - - diff --git a/Src/Skins/Immersive/Immersive.rc b/Src/Skins/Immersive/Immersive.rc new file mode 100644 index 000000000..a64965d32 --- /dev/null +++ b/Src/Skins/Immersive/Immersive.rc @@ -0,0 +1,102 @@ +///////////////////////////////////////////////////////////////////////////// +// +// Icon +// + +// Icon with lowest ID value placed first to ensure application icon +// remains consistent on all systems. +1 ICON "..\\..\\Setup\\OpenShell.ico" + +///////////////////////////////////////////////////////////////////////////// +// +// SKIN +// + +1 SKIN "SkinDescription.txt" + +///////////////////////////////////////////////////////////////////////////// +// +// Image +// + +1 IMAGE "fullglass1.png" +2 IMAGE "submenu.png" +3 IMAGE "submenu_vertsep.png" +4 IMAGE "fullglass_pager.png" +5 IMAGE "pager_arrows.png" +6 IMAGE "pager_arrows144.png" +7 IMAGE "separator.png" +8 IMAGE "arrow.png" +9 IMAGE "search.png" +10 IMAGE "twotone_pager.png" +11 IMAGE "pin.png" +12 IMAGE "user.png" +13 IMAGE "user144.png" +14 IMAGE "fullglass2.png" +15 IMAGE "fullglass3.png" +16 IMAGE "fullglass4.png" +17 IMAGE "fullglass_selector.png" +18 IMAGE "fullglass_splitsel.png" +19 IMAGE "newsel.png" +20 IMAGE "submenu_selector.png" +21 IMAGE "submenu_splitsel.png" +22 IMAGE "arrow144.png" +23 IMAGE "submenu_pager.png" +24 IMAGE "search_arrow.png" +25 IMAGE "search_arrow144.png" +26 IMAGE "pin144.png" +27 IMAGE "fullglass_vertsep.png" +28 IMAGE "separator144.png" +29 IMAGE "submenu_vertsep144.png" +30 IMAGE "pager_arrows120.png" +32 IMAGE "arrow120.png" +33 IMAGE "search120.png" +34 IMAGE "pin120.png" +36 IMAGE "search_arrow120.png" +37 IMAGE "user120.png" +38 IMAGE "arrow_mask.png" +39 IMAGE "arrow_mask120.png" +40 IMAGE "arrow_mask144.png" +41 IMAGE "twotone1.png" +42 IMAGE "twotone2.png" +43 IMAGE "twotone3.png" +44 IMAGE "twotone4.png" +45 IMAGE "twotone5.png" +46 IMAGE "twotone6.png" +47 IMAGE "twotone7.png" +48 IMAGE "twotone8.png" +49 IMAGE "twotone9.png" +50 IMAGE "twotone10.png" +51 IMAGE "twotone11.png" +52 IMAGE "twotone12.png" +53 IMAGE "twotone13.png" +54 IMAGE "twotone14.png" +55 IMAGE "twotone_selector.png" +56 IMAGE "twotone_splitsel.png" +57 IMAGE "twotone15.png" +58 IMAGE "twotone16.png" +59 IMAGE "twotone17.png" +60 IMAGE "twotone18.png" +61 IMAGE "twotone19.png" +62 IMAGE "twotone20.png" +63 IMAGE "twotone21.png" +64 IMAGE "twotone22.png" +65 IMAGE "twotone23.png" +66 IMAGE "twotone24.png" +67 IMAGE "twotone25.png" +68 IMAGE "twotone26.png" +69 IMAGE "twotone27.png" +70 IMAGE "twotone28.png" +71 IMAGE "twotone29.png" +72 IMAGE "twotone30.png" +73 IMAGE "twotone31.png" +74 IMAGE "twotone32.png" +75 IMAGE "twotone33.png" +76 IMAGE "twotone34.png" +77 IMAGE "twotone35.png" +78 IMAGE "pin192.png" +79 IMAGE "arrow192.png" +80 IMAGE "arrow_mask192.png" +81 IMAGE "pager_arrows192.png" +82 IMAGE "search_arrow192.png" +83 IMAGE "search192.png" diff --git a/Src/Skins/Immersive/Immersive.vcxproj b/Src/Skins/Immersive/Immersive.vcxproj new file mode 100644 index 000000000..1c2baacab --- /dev/null +++ b/Src/Skins/Immersive/Immersive.vcxproj @@ -0,0 +1,44 @@ + + + + + Resource + Win32 + + + + {BD28B058-230E-42DF-9FB1-FFBB0153F498} + Immersive + Win32Proj + 10.0 + + + + DynamicLibrary + $(DefaultPlatformToolset) + Unicode + + + + + + + + + + .skin + Immersive + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Src/Skins/Immersive/Immersive.vcxproj.filters b/Src/Skins/Immersive/Immersive.vcxproj.filters new file mode 100644 index 000000000..c787fc950 --- /dev/null +++ b/Src/Skins/Immersive/Immersive.vcxproj.filters @@ -0,0 +1,28 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav + + + + + Source Files + + + + + Resource Files + + + + + Resource Files + + + \ No newline at end of file diff --git a/Src/Skins/Immersive/SkinDescription.txt b/Src/Skins/Immersive/SkinDescription.txt new file mode 100644 index 000000000..703793aa0 --- /dev/null +++ b/Src/Skins/Immersive/SkinDescription.txt @@ -0,0 +1,716 @@ +; Immersive skin + +; About - text to use in the About box for this skin. use \n for new line +About=#7111 + +; AboutIcon - the ID of an icon resource to use in the About box +AboutIcon=1 + +; Version - version of the required skin engine. Set to 2 if the skin uses any of the new features introduced in Open-Shell 1.9.0: +; * full glass +; * skinnable sub-menus +; * skinnable pager buttons +; * skinnable arrows +; Set to 3 if the skin uses any of the new features introduced in Open-Shell 4.2.1: +; * skinnable scrollbars +; * tint colors +; * start screen colors +Version=3 + +Main_opacity=region +Main2_opacity=region +Main_large_icons=1 + +Main_bitmap=$StartPrimaryText +Main_bitmap_tint2=$ImmersiveSystemBackground|$StartPrimaryText +Main_bitmap_tint3=#808080 +Main_bitmap_mask=1 +Main_bitmap_slices_X=2,1,2,2,1,2 +Main_bitmap_slices_Y=2,8,2 +Main_padding=7,7,7,7,100% + +Main_text_padding=5,2,8,2,100% +Main_icon_padding=4,4,4,4,100% + +Main_font="Segoe UI",normal,-9 + +Main_text_color=$StartPrimaryText,$StartSelectionPrimaryText,$StartPrimaryText,$StartSelectionPrimaryText + +Main_selection=$StartPrimaryText +Main_selection_mask=17 +Main_selection_tint1=$StartPrimaryText +Main_selection_slices_X=2,2,2 +Main_selection_slices_Y=2,2,2 + +Main_split_selection=$StartPrimaryText +Main_split_selection_mask=18 +Main_split_selection_tint1=$StartPrimaryText +Main_split_selection_slices_X=2,2,2,2,2,2 +Main_split_selection_slices_Y=2,2,2 + +Caption_font="Segoe UI",normal,18 +Caption_text_color=$StartPrimaryText +Caption_padding=3,3,3,12,100% + + +; Main_pager - a bitmap that contains the background for the pager buttons (the ones that scroll menus up and down) +Main_pager=$SystemAccentDark1|$StartBackground +Main_pager_tint1=$StartPrimaryText +Main_pager_tint2=$StartPrimaryText +Main_pager_mask=4 +Main_pager_slices_X=3,10,3 +Main_pager_slices_Y=3,9,3 +Main_pager_arrows=$SystemAccentDark1|$StartBackground +Main_pager_arrows_tint1=$StartPrimaryText +Main_pager_arrows_tint2=$StartPrimaryText +Main_pager_arrows_mask=5 + +; Main_arrows - bitmap for the sub-menu arrows. The top half of the image is the normal arrow and the bottom half is the selected arrow +Main_arrow=8 +Main_arrow_mask=38 +Main_arrow_tint1=$StartPrimaryText +Main_arrow_tint2=#000000 +Main_arrow_padding=6,9,100% +Main_split_arrow_padding=8,9,100% + +; Main_separator - ID of a bitmap resource to use for the main menu separator. If no value is set the system separator is used +Main_separator=$SystemAccentDark1|$StartBackground +Main_separator_tint1=$StartPrimaryText +Main_separator_mask=7 +Main_separator_slices_X=12,9,12 +Main_search_indent=16 +Main_new_selection=$SystemAccentDark1|$StartBackground +Main_new_selection_tint1=$LightInlineErrorText +Main_new_selection_mask=19 +Main_new_selection_slices_X=2,2,2 +Main_new_selection_slices_Y=2,2,2 + +; Second column + +Main2_text_color=$StartPrimaryText,$StartSelectionPrimaryText,$StartPrimaryText,$StartSelectionPrimaryText +Main2_text_padding=5,2,8,2,100% +Main2_padding=6,7,5,7,84%,100%,100%,100% +Main2_icon_padding=4,4,4,4,100% +Main2_arrow=8 +Main2_arrow_mask=38 +Main2_arrow_tint1=$StartPrimaryText +Main2_arrow_tint2=#000000 +Main2_arrow_padding=6,7,100% +Main2_selection=$StartPrimaryText +Main2_selection_mask=17 +Main2_selection_tint1=$StartPrimaryText +Main2_selection_slices_X=2,2,2 +Main2_selection_slices_Y=2,2,2 +Main2_split_selection=$StartPrimaryText +Main2_split_selection_mask=18 +Main2_split_selection_tint1=$StartPrimaryText +Main2_split_selection_slices_X=2,2,2,2,2,2 +Main2_split_selection_slices_Y=2,2,2 +Main2_new_selection=$SystemAccentDark1|$StartBackground +Main2_new_selection_tint1=$LightInlineErrorText +Main2_new_selection_mask=19 +Main2_new_selection_slices_X=2,2,2 +Main2_new_selection_slices_Y=2,2,2 +Main2_separator_mask=7 +Main2_separator_slices_X=12,9,12 +Main2_separator=$SystemAccentDark1|$StartBackground +Main2_separator_tint1=$StartPrimaryText + +; More_bitmap - a bitmap for the "more" button in search categories. set to 0 to use the default icon. set to "none" to hide the button +More_bitmap=none +Pin_bitmap=11 +Pin_bitmap_tint1=$ImmersiveSystemText|#000000 +Pin_bitmap_mask=#FF0000 + + +Search_padding=0,5,0,5,100% +Search_hint_font="Segoe UI",normal,-9 +Search_text_color=$ImmersiveSystemText|#000000,#808080 +Search_text_background=$SystemAccentDark1|$StartBackground +Search_text_background_tint1=$ImmersiveSystemBackground|$StartPrimaryText +Search_text_background_tint2=$StartPrimaryText +Search_text_background_mask=#FF1700 +Search_bitmap=9 +Search_bitmap_tint1=$StartPrimaryText +Search_bitmap_tint2=#000000 +Search_bitmap_mask=#DF2000 + +Search_arrow=24 +Search_arrow_mask=38 +Search_arrow_tint1=$ImmersiveSystemText|#000000 +Search_arrow_tint2=$ImmersiveSystemBackground|$StartPrimaryText + +;SUB-MENU SECTION - describes the look of the sub-menus + +; The width of the standard window border is subtracted from all sides +Submenu_padding=3,5,3,5,100% +Submenu_text_padding=0,2,8,2,100% +Submenu_icon_padding=8,3,8,3,100% + +; These have the same meaning as the Main_... properties +Submenu_opacity=region +Submenu_bitmap=$ImmersiveSystemBackground|$StartPrimaryText +Submenu_bitmap_tint1=#A0A0A0 +Submenu_bitmap_tint2=#808080 +Submenu_bitmap_tint3=$StartPrimaryText +Submenu_bitmap_mask=2 +Submenu_bitmap_slices_X=4,4,4 +Submenu_bitmap_slices_Y=4,4,4 + +Submenu_font="Segoe UI",normal,-9 +Submenu_text_color=$ImmersiveSystemText|#000000,$ImmersiveSystemText|#000000,#7F7F7F,#7F7F7F +Submenu_selection=$ImmersiveSystemBackground|$StartPrimaryText +Submenu_selection_mask=20 +Submenu_selection_slices_X=2,2,2 +Submenu_selection_slices_Y=2,2,2 +Submenu_selection_tint1=$StartPrimaryText +Submenu_selection_tint2=$ImmersiveSystemText|#000000 +Submenu_split_selection=$ImmersiveSystemBackground|$StartPrimaryText +Submenu_split_selection_mask=21 +Submenu_split_selection_slices_X=2,2,2,2,2,2 +Submenu_split_selection_slices_Y=2,2,2 +Submenu_split_selection_tint1=$StartPrimaryText + +Submenu_pager=$ImmersiveSystemBackground|$StartPrimaryText +Submenu_pager_tint1=$StartPrimaryText +Submenu_pager_tint2=$ImmersiveSystemText|#000000 +Submenu_pager_mask=23 +Submenu_pager_slices_X=3,10,3 +Submenu_pager_slices_Y=3,9,3 +Submenu_pager_arrows=$SystemAccentDark1|$StartBackground +Submenu_pager_arrows_tint1=$ImmersiveSystemText|#000000 +Submenu_pager_arrows_tint2=$ImmersiveSystemText|#000000 +Submenu_pager_arrows_mask=5 + +Submenu_arrow=8 +Submenu_arrow_mask=38 +Submenu_arrow_tint1=$ImmersiveSystemText|#000000 +Submenu_arrow_tint2=$ImmersiveSystemBackground|$StartPrimaryText +Submenu_arrow_padding=3,6,100% +Submenu_split_arrow_padding=5,6,100% +Submenu_separator=$SystemAccentDark1|$StartBackground +Submenu_separator_tint1=$ImmersiveSystemText|#000000 +Submenu_separator_mask=7 +Submenu_separator_slices_X=12,9,12 +Submenu_separator_font="Segoe UI Semibold",normal,-9 +Submenu_separator_text_padding=8,3,0,5,100% +Submenu_separator_text_color=$ImmersiveSystemText|#000000,$ImmersiveSystemText|#000000 +Submenu_separator_icon_padding=10,0,2,0,100% +Submenu_separator_split_font="Segoe UI Semibold",normal,-9 +Submenu_new_selection=$SystemAccentDark1|$StartBackground +Submenu_new_selection_tint1=$LightInlineErrorText +Submenu_new_selection_mask=19 +Submenu_new_selection_slices_X=2,2,2 +Submenu_new_selection_slices_Y=2,2,2 + +Submenu_separatorV=$SystemAccentDark1|$StartBackground +Submenu_separatorV_tint1=$ImmersiveSystemText|#000000 +Submenu_separatorV_mask=3 +Submenu_separatorV_slices_Y=12,9,12 + + +; OPTIONS + +OPTION RADIOGROUP=#7039,0,LIGHT|DARK|AUTO +OPTION LIGHT=#7040,0 +OPTION DARK=#7041,0 +OPTION AUTO=#7042,1 +OPTION NO_ICONS=#7008,1, TWO_COLUMNS +OPTION CAPTION=#7003,0, NOT TWO_COLUMNS, 0 +OPTION USER_IMAGE=#7014,0 +OPTION USER_NAME=#7015,1 +OPTION CENTER_NAME=#7004,0, USER_NAME, 0 +OPTION SMALL_ICONS=#7011,0 +OPTION OPAQUE=#7009,0 +OPTION DISABLE_MASK=#7005,0 +OPTION_NUMBER CUSTOM_TEXT_SIZE=#7038,0,TRUE,12 +OPTION BLACK_TEXT=#7002,0 +OPTION BLACK_FRAMES=#7001,0 +OPTION RADIOGROUP=#7043,0,TRANSPARENT_LESS|TRANSPARENT_MORE +OPTION TRANSPARENT_LESS=#7044,1 +OPTION TRANSPARENT_MORE=#7045,0 + +Classic1_options=LIGHT, DARK, AUTO, CAPTION, USER_IMAGE, USER_NAME, CENTER_NAME, SMALL_ICONS, OPAQUE, DISABLE_MASK, CUSTOM_TEXT_SIZE, BLACK_TEXT, BLACK_FRAMES, TRANSPARENT_LESS, TRANSPARENT_MORE +Classic2_options=LIGHT, DARK, AUTO, NO_ICONS, USER_IMAGE, USER_NAME, CENTER_NAME, SMALL_ICONS, OPAQUE, DISABLE_MASK, CUSTOM_TEXT_SIZE, BLACK_TEXT, BLACK_FRAMES, TRANSPARENT_LESS, TRANSPARENT_MORE +AllPrograms_options=CUSTOM_TEXT_SIZE + +[NOT CAPTION] +Main_bitmap_mask=14 +Main_bitmap_slices_X=0,0,0,4,4,4 + + +[SMALL_ICONS] +Main_large_icons=0 + + +[TWO_COLUMNS] +Main_bitmap_mask=14 +Main_bitmap_slices_X=2,2,2,2,2,2 +Main_separatorV=$SystemAccentDark1|$StartBackground +Main_separatorV_tint1=$StartPrimaryText +Main_separatorV_mask=27 +Main_separatorV_slices_Y=12,9,12 + + +[USER_IMAGE] +; User_image_size - the size of the user image to use. Default is 0, which means the user image is not displayed +; The size must be compatible with the size of the frame bitmap User_bitmap. The value is usually 48 +User_image_size=48 +User_mask=12 + +; User_frame_position - horizontal and vertical position of the user image frame in the main menu. +; Positive numbers mean offset from the left and the top. Negative numbers mean offset from the bottom and the right +; The horizontal position can also be "center", "center1" and "center2" to center the image relative to the whole menu or to the first or second column +User_frame_position=10,10,100% + +[USER_NAME] +User_name_position=75,10,-10,50,100% +User_name_align=left +User_text_color=$StartPrimaryText +User_font="Segoe UI Semibold",normal,18,100% +User_glow_size=0 + +[120_DPI] +Main_pager_arrows_mask=30 +Submenu_pager_arrows_mask=30 +Main_arrow=32 +Main2_arrow=32 +Submenu_arrow=32 +Search_arrow=36 +Pin_bitmap=34 +Search_bitmap=33 +Main_arrow_mask=39 +Main2_arrow_mask=39 +Search_arrow_mask=39 +Submenu_arrow_mask=39 + +[120_DPI AND USER_IMAGE] +User_mask=37 +User_image_size=60 + +[HIGH_DPI] +Main_pager_arrows_mask=6 +Submenu_pager_arrows_mask=6 +Main_arrow=22 +Main2_arrow=22 +Submenu_arrow=22 +Search_arrow=25 +Pin_bitmap=26 +Main_separator_mask=28 +Main2_separator_mask=28 +Submenu_separator_mask=28 +Submenu_separatorV_mask=29 +Main_arrow_mask=40 +Main2_arrow_mask=40 +Search_arrow_mask=40 +Submenu_arrow_mask=40 +User_frame_position=10,15,100%,0% + +[HIGH_DPI AND USER_IMAGE] +User_mask=13 +User_image_size=72 + +[USER_NAME AND HIGH_DPI] +User_name_position=75,15,-10,75,100%,0%,100%,0% + + +; NO CAPTION +[USER_IMAGE] +Main_padding=7,73,7,7,100% +User_name_position=70,15,-15,55,100% + +[USER_NAME AND NOT USER_IMAGE] +Main_padding=7,47,7,7,100% +User_name_position=15,5,-15,45,100% + +[USER_IMAGE AND HIGH_DPI] +Main_padding=7,110,7,7,100%,0%,100%,100% +User_name_position=90,23,-15,83,31%,0%,100%,0% + +[USER_NAME AND NOT USER_IMAGE AND HIGH_DPI] +Main_padding=7,71,7,7,100%,0%,100%,100% +User_name_position=15,8,-15,68,100%,0%,100%,0% + + +; CAPTION +[USER_IMAGE AND NOT TWO_COLUMNS AND CAPTION] +User_frame_position=39,10,100% +User_name_position=99,15,-15,55,100% +Main_padding=7,73,7,7,100% + +[USER_NAME AND NOT USER_IMAGE AND NOT TWO_COLUMNS AND CAPTION] +User_name_position=44,5,-15,45,100% +Main_padding=7,47,7,7,100% + +[USER_IMAGE AND NOT TWO_COLUMNS AND CAPTION AND HIGH_DPI] +User_frame_position=39,15,100%,0% +User_name_position=117,23,-15,83,51%,0%,100%,0% +Main_padding=7,110,7,7,100%,0%,100%,100% + +[USER_NAME AND NOT USER_IMAGE AND NOT TWO_COLUMNS AND CAPTION AND HIGH_DPI] +User_name_position=44,8,-15,68,100%,0%,100%,0% +Main_padding=7,71,7,7,100%,0%,100%,100% + + +; TWO COLUMNS +[USER_IMAGE AND TWO_COLUMNS] +Main2_padding=6,73,5,7,84%,100%,100%,100% + +[USER_NAME AND NOT USER_IMAGE AND TWO_COLUMNS] +Main2_padding=6,47,5,7,84%,100%,100%,100% + +[USER_IMAGE AND TWO_COLUMNS AND HIGH_DPI] +Main2_padding=6,110,5,7,84%,0%,100%,100% + +[USER_NAME AND NOT USER_IMAGE AND TWO_COLUMNS AND HIGH_DPI] +Main2_padding=6,71,5,7,84%,0%,100%,100% + + +[CENTER_NAME] +User_name_align=center + +[NOT USER_NAME] +User_name_position=0,0,0,0 + +[USER_NAME AND 240_DPI] +User_font="Segoe UI Semibold",normal,45 + +[NO_ICONS] +Main_no_icons2=1 +Main2_text_padding=1,8,8,9,100% +Main2_icon_padding=4,4,3,4,100% + +[NO_ICONS AND SMALL_ICONS] +Main2_text_padding=1,4,8,5,100% + +[TOUCH_ENABLED AND NOT SMALL_ICONS] +Submenu_separator_icon_padding=10,8,2,8,100% +Main_arrow_padding=7,10,100% +Main_split_arrow_padding=9,10,100% +Main2_arrow_padding=9,10,100% + +[NOT OPAQUE] +Main_opacity=fullglass +Main2_opacity=fullglass + +Main_bitmap_mask=15 + +[NOT OPAQUE AND NOT CAPTION] +Main_bitmap_mask=16 + +[NOT OPAQUE AND TWO_COLUMNS] +Main_bitmap_mask=16 + +[DISABLE_MASK] +Main_bitmap_tint1=#545454 + +[CUSTOM_TEXT_SIZE] +Main_font="Segoe UI",normal,@CUSTOM_TEXT_SIZE@ +Search_hint_font="Segoe UI",normal,@CUSTOM_TEXT_SIZE@ +Submenu_font="Segoe UI",normal,@CUSTOM_TEXT_SIZE@ +Submenu_separator_font="Segoe UI Semibold",normal,@CUSTOM_TEXT_SIZE@ +Submenu_separator_split_font="Segoe UI Semibold",normal,@CUSTOM_TEXT_SIZE@ + +[BLACK_TEXT] +Main_text_color=#000000,#000000,#000000,#000000 +Main2_text_color=#000000,#000000,#000000,#000000 +Caption_text_color=#000000 +User_text_color=#000000 +Main_arrow_tint1=#000000 +Main_arrow_tint2=$StartPrimaryText +Main2_arrow_tint1=#000000 +Main2_arrow_tint2=$StartPrimaryText +Search_bitmap_tint1=#000000 +Search_bitmap_tint2=$StartPrimaryText +Main_separator_tint1=#000000 +Main_separatorV_tint1=#000000 +Main_pager_arrows_tint1=#000000 +Main_pager_arrows_tint2=#000000 +Main2_separator_tint1=#000000 + +[BLACK_FRAMES] +Main_bitmap=#000000 +Main_selection=#000000 +Main_split_selection=#000000 +Main2_selection=#000000 +Main2_split_selection=#000000 +Main_pager_tint2=#000000 + + +[TRANSPARENT_LESS] +Main_text_color=$ImmersiveSystemText|#000000,$ImmersiveSystemText|#000000,#7F7F7F,#7F7F7F +Main_separator_tint1=$ImmersiveSystemText|#000000 +Main_arrow_tint1=$ImmersiveSystemText|#000000 +Main_arrow_tint2=$ImmersiveSystemBackground|$StartPrimaryText +Main_pager_arrows_tint1=$ImmersiveSystemText|#000000 +Main_pager_arrows_tint2=$ImmersiveSystemText|#000000 +Main_bitmap=$StartPrimaryText +Search_bitmap_tint1=$ImmersiveSystemText|#000000 +Search_bitmap_tint2=$ImmersiveSystemBackground|$StartPrimaryText +Main_separatorV=none +Main_separatorV_mask=none +User_text_color=$ImmersiveSystemText|#000000 +Main_selection=$ImmersiveSystemBackground|$StartPrimaryText +Main_split_selection=$ImmersiveSystemBackground|$StartPrimaryText +Main_selection_mask=55 +Main_split_selection_mask=56 +Main_bitmap_mask=57 +Main_pager_mask=10 +Main_pager=$ImmersiveSystemBackground|$StartPrimaryText +Main_pager_tint1=$StartPrimaryText + +[TRANSPARENT_LESS AND NOT OPAQUE] +Main_opacity=glass +Main2_opacity=fullglass +Main_bitmap_mask=58 + +[TRANSPARENT_LESS AND NOT CAPTION] +Main_bitmap_mask=71 + +[TRANSPARENT_LESS AND TWO_COLUMNS] +Main_bitmap_mask=41 +Main2_padding=5,7,5,7,100% + +[TRANSPARENT_LESS AND TWO_COLUMNS AND NOT OPAQUE] +Main_bitmap_mask=42 + + + + + + +[TRANSPARENT_LESS AND USER_NAME AND NOT USER_IMAGE] +Main_bitmap_slices_Y=49,8,2 +Main_bitmap_mask=59 +Main_padding=7,54,7,7,100% + +[TRANSPARENT_LESS AND USER_NAME AND NOT USER_IMAGE AND NOT OPAQUE] +Main_bitmap_mask=60 + +[TRANSPARENT_LESS AND USER_IMAGE] +Main_bitmap_slices_Y=75,8,2 +Main_padding=7,80,7,7,100% +Main_bitmap_mask=61 + +[TRANSPARENT_LESS AND USER_IMAGE AND NOT OPAQUE] +Main_bitmap_mask=62 + + + + + + +[TRANSPARENT_LESS AND USER_NAME AND NOT USER_IMAGE AND 120_DPI] +Main_bitmap_slices_Y=61,8,2 +Main_bitmap_mask=63 + +[TRANSPARENT_LESS AND USER_NAME AND NOT USER_IMAGE AND NOT OPAQUE AND 120_DPI] +Main_bitmap_mask=64 + +[TRANSPARENT_LESS AND USER_IMAGE AND 120_DPI] +Main_bitmap_slices_Y=93,8,2 +Main_bitmap_mask=65 + +[TRANSPARENT_LESS AND USER_IMAGE AND NOT OPAQUE AND 120_DPI] +Main_bitmap_mask=66 + + + + + + +[TRANSPARENT_LESS AND USER_NAME AND NOT USER_IMAGE AND HIGH_DPI] +Main_bitmap_slices_Y=73,8,2 +Main_padding=7,78,7,7,100%,9%,100%,100% +Main_bitmap_mask=67 + +[TRANSPARENT_LESS AND USER_NAME AND NOT USER_IMAGE AND NOT OPAQUE AND HIGH_DPI] +Main_bitmap_mask=68 + +[TRANSPARENT_LESS AND USER_IMAGE AND HIGH_DPI] +Main_bitmap_slices_Y=112,8,2 +Main_padding=7,117,7,7,100%,6%,100%,100% +Main_bitmap_mask=69 + +[TRANSPARENT_LESS AND USER_IMAGE AND NOT OPAQUE AND HIGH_DPI] +Main_bitmap_mask=70 + + + + + + +[TRANSPARENT_LESS AND USER_NAME AND NOT USER_IMAGE AND NOT CAPTION] +Main_bitmap_mask=72 + +[TRANSPARENT_LESS AND USER_IMAGE AND NOT CAPTION] +Main_bitmap_mask=73 + + + + + + +[TRANSPARENT_LESS AND USER_NAME AND NOT USER_IMAGE AND 120_DPI AND NOT CAPTION] +Main_bitmap_mask=74 + +[TRANSPARENT_LESS AND USER_IMAGE AND 120_DPI AND NOT CAPTION] +Main_bitmap_mask=75 + + + + + + +[TRANSPARENT_LESS AND USER_NAME AND NOT USER_IMAGE AND HIGH_DPI AND NOT CAPTION] +Main_bitmap_mask=76 + +[TRANSPARENT_LESS AND USER_IMAGE AND HIGH_DPI AND NOT CAPTION] +Main_bitmap_mask=77 + + + + + + + + + + + + + + + + + + +[TRANSPARENT_LESS AND TWO_COLUMNS AND USER_NAME AND NOT USER_IMAGE] +Main2_padding=5,54,5,7,100% +Main_bitmap_mask=43 + +[TRANSPARENT_LESS AND TWO_COLUMNS AND USER_NAME AND NOT USER_IMAGE AND NOT OPAQUE] +Main_bitmap_mask=44 + +[TRANSPARENT_LESS AND TWO_COLUMNS AND USER_IMAGE] +Main2_padding=5,80,5,7,100% +Main_bitmap_mask=45 + +[TRANSPARENT_LESS AND TWO_COLUMNS AND USER_IMAGE AND NOT OPAQUE] +Main_bitmap_mask=46 + + +[TRANSPARENT_LESS AND TWO_COLUMNS AND USER_NAME AND NOT USER_IMAGE AND 120_DPI] +Main_bitmap_mask=47 + +[TRANSPARENT_LESS AND TWO_COLUMNS AND USER_NAME AND NOT USER_IMAGE AND NOT OPAQUE AND 120_DPI] +Main_bitmap_mask=48 + +[TRANSPARENT_LESS AND TWO_COLUMNS AND USER_IMAGE AND 120_DPI] +Main_bitmap_mask=49 + +[TRANSPARENT_LESS AND TWO_COLUMNS AND USER_IMAGE AND NOT OPAQUE AND 120_DPI] +Main_bitmap_mask=50 + + +[TRANSPARENT_LESS AND TWO_COLUMNS AND USER_NAME AND NOT USER_IMAGE AND HIGH_DPI] +Main2_padding=5,78,5,7,100%,9%,100%,100% +Main_bitmap_mask=51 + +[TRANSPARENT_LESS AND TWO_COLUMNS AND USER_NAME AND NOT USER_IMAGE AND NOT OPAQUE AND HIGH_DPI] +Main_bitmap_mask=52 + +[TRANSPARENT_LESS AND TWO_COLUMNS AND USER_IMAGE AND HIGH_DPI] +Main2_padding=5,117,5,7,100%,6%,100%,100% +Main_bitmap_mask=53 + +[TRANSPARENT_LESS AND TWO_COLUMNS AND USER_IMAGE AND NOT OPAQUE AND HIGH_DPI] +Main_bitmap_mask=54 + + +[HIGH_DPI AND NOT 144_DPI AND NOT 168_DPI] +Pin_bitmap=78 +Main_arrow=79 +Main2_arrow=79 +Submenu_arrow=79 +Main_arrow_mask=80 +Main2_arrow_mask=80 +Submenu_arrow_mask=80 +Main_pager_arrows_mask=81 +Submenu_pager_arrows_mask=81 +Search_arrow=82 +Search_arrow_mask=80 +Search_bitmap=83 + + +[LIGHT] +Main_bitmap_tint2=#FFFFFF +Search_text_background_tint1=#FFFFFF +Search_arrow_tint2=#FFFFFF +Submenu_bitmap=#FFFFFF +Submenu_selection=#FFFFFF +Submenu_split_selection=#FFFFFF +Submenu_pager=#FFFFFF +Submenu_arrow_tint2=#FFFFFF +Pin_bitmap_tint1=#000000 +Search_text_color=#000000,#808080 +Search_arrow_tint1=#000000 +Submenu_text_color=#000000,#000000,#7F7F7F,#7F7F7F +Submenu_selection_tint2=#000000 +Submenu_pager_tint2=#000000 +Submenu_pager_arrows_tint1=#000000 +Submenu_pager_arrows_tint2=#000000 +Submenu_arrow_tint1=#000000 +Submenu_separator_tint1=#000000 +Submenu_separator_text_color=#000000,#000000 +Submenu_separatorV_tint1=#000000 + +[LIGHT AND TRANSPARENT_LESS] +Main_arrow_tint2=#FFFFFF +Search_bitmap_tint2=#FFFFFF +Main_selection=#FFFFFF +Main_split_selection=#FFFFFF +Main_pager=#FFFFFF +Main_text_color=#000000,#000000,#7F7F7F,#7F7F7F +Main_separator_tint1=#000000 +Main_arrow_tint1=#000000 +Main_pager_arrows_tint1=#000000 +Main_pager_arrows_tint2=#000000 +Search_bitmap_tint1=#000000 +User_text_color=#000000 + +[DARK] +Main_bitmap_tint2=#000000 +Search_text_background_tint1=#000000 +Search_arrow_tint2=#000000 +Submenu_bitmap=#000000 +Submenu_selection=#000000 +Submenu_split_selection=#000000 +Submenu_pager=#000000 +Submenu_arrow_tint2=#000000 +Pin_bitmap_tint1=#FFFFFF +Search_text_color=#FFFFFF,#808080 +Search_arrow_tint1=#FFFFFF +Submenu_text_color=#FFFFFF,#FFFFFF,#7F7F7F,#7F7F7F +Submenu_selection_tint2=#FFFFFF +Submenu_pager_tint2=#FFFFFF +Submenu_pager_arrows_tint1=#FFFFFF +Submenu_pager_arrows_tint2=#FFFFFF +Submenu_arrow_tint1=#FFFFFF +Submenu_separator_tint1=#FFFFFF +Submenu_separator_text_color=#FFFFFF,#FFFFFF +Submenu_separatorV_tint1=#FFFFFF + +[DARK AND TRANSPARENT_LESS] +Main_arrow_tint2=#000000 +Search_bitmap_tint2=#000000 +Main_selection=#000000 +Main_split_selection=#000000 +Main_pager=#000000 +Main_text_color=#FFFFFF,#FFFFFF,#7F7F7F,#7F7F7F +Main_separator_tint1=#FFFFFF +Main_arrow_tint1=#FFFFFF +Main_pager_arrows_tint1=#FFFFFF +Main_pager_arrows_tint2=#FFFFFF +Search_bitmap_tint1=#FFFFFF +User_text_color=#FFFFFF diff --git a/Src/Skins/Immersive/arrow.png b/Src/Skins/Immersive/arrow.png new file mode 100644 index 000000000..f02ec4fc7 Binary files /dev/null and b/Src/Skins/Immersive/arrow.png differ diff --git a/Src/Skins/Immersive/arrow120.png b/Src/Skins/Immersive/arrow120.png new file mode 100644 index 000000000..b3f0709b5 Binary files /dev/null and b/Src/Skins/Immersive/arrow120.png differ diff --git a/Src/Skins/Immersive/arrow144.png b/Src/Skins/Immersive/arrow144.png new file mode 100644 index 000000000..20b2d58d1 Binary files /dev/null and b/Src/Skins/Immersive/arrow144.png differ diff --git a/Src/Skins/Immersive/arrow192.png b/Src/Skins/Immersive/arrow192.png new file mode 100644 index 000000000..4b478dabe Binary files /dev/null and b/Src/Skins/Immersive/arrow192.png differ diff --git a/Src/Skins/Immersive/arrow_mask.png b/Src/Skins/Immersive/arrow_mask.png new file mode 100644 index 000000000..91cff4ee2 Binary files /dev/null and b/Src/Skins/Immersive/arrow_mask.png differ diff --git a/Src/Skins/Immersive/arrow_mask120.png b/Src/Skins/Immersive/arrow_mask120.png new file mode 100644 index 000000000..5edd39fec Binary files /dev/null and b/Src/Skins/Immersive/arrow_mask120.png differ diff --git a/Src/Skins/Immersive/arrow_mask144.png b/Src/Skins/Immersive/arrow_mask144.png new file mode 100644 index 000000000..d62906459 Binary files /dev/null and b/Src/Skins/Immersive/arrow_mask144.png differ diff --git a/Src/Skins/Immersive/arrow_mask192.png b/Src/Skins/Immersive/arrow_mask192.png new file mode 100644 index 000000000..93fc0742d Binary files /dev/null and b/Src/Skins/Immersive/arrow_mask192.png differ diff --git a/Src/Skins/Immersive/fullglass1.png b/Src/Skins/Immersive/fullglass1.png new file mode 100644 index 000000000..f6ac7f240 Binary files /dev/null and b/Src/Skins/Immersive/fullglass1.png differ diff --git a/Src/Skins/Immersive/fullglass2.png b/Src/Skins/Immersive/fullglass2.png new file mode 100644 index 000000000..2aed9da07 Binary files /dev/null and b/Src/Skins/Immersive/fullglass2.png differ diff --git a/Src/Skins/Immersive/fullglass3.png b/Src/Skins/Immersive/fullglass3.png new file mode 100644 index 000000000..ecbe535d7 Binary files /dev/null and b/Src/Skins/Immersive/fullglass3.png differ diff --git a/Src/Skins/Immersive/fullglass4.png b/Src/Skins/Immersive/fullglass4.png new file mode 100644 index 000000000..4f0ec729e Binary files /dev/null and b/Src/Skins/Immersive/fullglass4.png differ diff --git a/Src/Skins/Immersive/fullglass_pager.png b/Src/Skins/Immersive/fullglass_pager.png new file mode 100644 index 000000000..bad0b5645 Binary files /dev/null and b/Src/Skins/Immersive/fullglass_pager.png differ diff --git a/Src/Skins/Immersive/fullglass_selector.png b/Src/Skins/Immersive/fullglass_selector.png new file mode 100644 index 000000000..ba3dafc8f Binary files /dev/null and b/Src/Skins/Immersive/fullglass_selector.png differ diff --git a/Src/Skins/Immersive/fullglass_splitsel.png b/Src/Skins/Immersive/fullglass_splitsel.png new file mode 100644 index 000000000..7b889a86b Binary files /dev/null and b/Src/Skins/Immersive/fullglass_splitsel.png differ diff --git a/Src/Skins/Immersive/fullglass_vertsep.png b/Src/Skins/Immersive/fullglass_vertsep.png new file mode 100644 index 000000000..f39f1c2da Binary files /dev/null and b/Src/Skins/Immersive/fullglass_vertsep.png differ diff --git a/Src/Skins/Immersive/newsel.png b/Src/Skins/Immersive/newsel.png new file mode 100644 index 000000000..f98a29aaa Binary files /dev/null and b/Src/Skins/Immersive/newsel.png differ diff --git a/Src/Skins/Immersive/pager_arrows.png b/Src/Skins/Immersive/pager_arrows.png new file mode 100644 index 000000000..ccb3dbdf9 Binary files /dev/null and b/Src/Skins/Immersive/pager_arrows.png differ diff --git a/Src/Skins/Immersive/pager_arrows120.png b/Src/Skins/Immersive/pager_arrows120.png new file mode 100644 index 000000000..6f54f327f Binary files /dev/null and b/Src/Skins/Immersive/pager_arrows120.png differ diff --git a/Src/Skins/Immersive/pager_arrows144.png b/Src/Skins/Immersive/pager_arrows144.png new file mode 100644 index 000000000..903aa28cc Binary files /dev/null and b/Src/Skins/Immersive/pager_arrows144.png differ diff --git a/Src/Skins/Immersive/pager_arrows192.png b/Src/Skins/Immersive/pager_arrows192.png new file mode 100644 index 000000000..569b978c1 Binary files /dev/null and b/Src/Skins/Immersive/pager_arrows192.png differ diff --git a/Src/Skins/Immersive/pin.png b/Src/Skins/Immersive/pin.png new file mode 100644 index 000000000..a42ccfd32 Binary files /dev/null and b/Src/Skins/Immersive/pin.png differ diff --git a/Src/Skins/Immersive/pin120.png b/Src/Skins/Immersive/pin120.png new file mode 100644 index 000000000..f3c547629 Binary files /dev/null and b/Src/Skins/Immersive/pin120.png differ diff --git a/Src/Skins/Immersive/pin144.png b/Src/Skins/Immersive/pin144.png new file mode 100644 index 000000000..92175d9fe Binary files /dev/null and b/Src/Skins/Immersive/pin144.png differ diff --git a/Src/Skins/Immersive/pin192.png b/Src/Skins/Immersive/pin192.png new file mode 100644 index 000000000..0c267ee93 Binary files /dev/null and b/Src/Skins/Immersive/pin192.png differ diff --git a/Src/Skins/Immersive/search.png b/Src/Skins/Immersive/search.png new file mode 100644 index 000000000..27e7e7293 Binary files /dev/null and b/Src/Skins/Immersive/search.png differ diff --git a/Src/Skins/Immersive/search120.png b/Src/Skins/Immersive/search120.png new file mode 100644 index 000000000..c82740135 Binary files /dev/null and b/Src/Skins/Immersive/search120.png differ diff --git a/Src/Skins/Immersive/search192.png b/Src/Skins/Immersive/search192.png new file mode 100644 index 000000000..e4218af81 Binary files /dev/null and b/Src/Skins/Immersive/search192.png differ diff --git a/Src/Skins/Immersive/search_arrow.png b/Src/Skins/Immersive/search_arrow.png new file mode 100644 index 000000000..2d17e5df5 Binary files /dev/null and b/Src/Skins/Immersive/search_arrow.png differ diff --git a/Src/Skins/Immersive/search_arrow120.png b/Src/Skins/Immersive/search_arrow120.png new file mode 100644 index 000000000..838589c54 Binary files /dev/null and b/Src/Skins/Immersive/search_arrow120.png differ diff --git a/Src/Skins/Immersive/search_arrow144.png b/Src/Skins/Immersive/search_arrow144.png new file mode 100644 index 000000000..dc6db43d9 Binary files /dev/null and b/Src/Skins/Immersive/search_arrow144.png differ diff --git a/Src/Skins/Immersive/search_arrow192.png b/Src/Skins/Immersive/search_arrow192.png new file mode 100644 index 000000000..f0b59b716 Binary files /dev/null and b/Src/Skins/Immersive/search_arrow192.png differ diff --git a/Src/Skins/Immersive/separator.png b/Src/Skins/Immersive/separator.png new file mode 100644 index 000000000..834d5d657 Binary files /dev/null and b/Src/Skins/Immersive/separator.png differ diff --git a/Src/Skins/Immersive/separator144.png b/Src/Skins/Immersive/separator144.png new file mode 100644 index 000000000..14c565562 Binary files /dev/null and b/Src/Skins/Immersive/separator144.png differ diff --git a/Src/Skins/Immersive/submenu.png b/Src/Skins/Immersive/submenu.png new file mode 100644 index 000000000..b35a6dcb7 Binary files /dev/null and b/Src/Skins/Immersive/submenu.png differ diff --git a/Src/Skins/Immersive/submenu_pager.png b/Src/Skins/Immersive/submenu_pager.png new file mode 100644 index 000000000..78f4d01a4 Binary files /dev/null and b/Src/Skins/Immersive/submenu_pager.png differ diff --git a/Src/Skins/Immersive/submenu_selector.png b/Src/Skins/Immersive/submenu_selector.png new file mode 100644 index 000000000..0352d006d Binary files /dev/null and b/Src/Skins/Immersive/submenu_selector.png differ diff --git a/Src/Skins/Immersive/submenu_splitsel.png b/Src/Skins/Immersive/submenu_splitsel.png new file mode 100644 index 000000000..22c73f9cb Binary files /dev/null and b/Src/Skins/Immersive/submenu_splitsel.png differ diff --git a/Src/Skins/Immersive/submenu_vertsep.png b/Src/Skins/Immersive/submenu_vertsep.png new file mode 100644 index 000000000..e962d779d Binary files /dev/null and b/Src/Skins/Immersive/submenu_vertsep.png differ diff --git a/Src/Skins/Immersive/submenu_vertsep144.png b/Src/Skins/Immersive/submenu_vertsep144.png new file mode 100644 index 000000000..664343bbf Binary files /dev/null and b/Src/Skins/Immersive/submenu_vertsep144.png differ diff --git a/Src/Skins/Immersive/twotone1.png b/Src/Skins/Immersive/twotone1.png new file mode 100644 index 000000000..061dfd0a4 Binary files /dev/null and b/Src/Skins/Immersive/twotone1.png differ diff --git a/Src/Skins/Immersive/twotone10.png b/Src/Skins/Immersive/twotone10.png new file mode 100644 index 000000000..5b7ae621a Binary files /dev/null and b/Src/Skins/Immersive/twotone10.png differ diff --git a/Src/Skins/Immersive/twotone11.png b/Src/Skins/Immersive/twotone11.png new file mode 100644 index 000000000..416fc6895 Binary files /dev/null and b/Src/Skins/Immersive/twotone11.png differ diff --git a/Src/Skins/Immersive/twotone12.png b/Src/Skins/Immersive/twotone12.png new file mode 100644 index 000000000..82a54baa9 Binary files /dev/null and b/Src/Skins/Immersive/twotone12.png differ diff --git a/Src/Skins/Immersive/twotone13.png b/Src/Skins/Immersive/twotone13.png new file mode 100644 index 000000000..684729d88 Binary files /dev/null and b/Src/Skins/Immersive/twotone13.png differ diff --git a/Src/Skins/Immersive/twotone14.png b/Src/Skins/Immersive/twotone14.png new file mode 100644 index 000000000..c71845ebe Binary files /dev/null and b/Src/Skins/Immersive/twotone14.png differ diff --git a/Src/Skins/Immersive/twotone15.png b/Src/Skins/Immersive/twotone15.png new file mode 100644 index 000000000..726f60087 Binary files /dev/null and b/Src/Skins/Immersive/twotone15.png differ diff --git a/Src/Skins/Immersive/twotone16.png b/Src/Skins/Immersive/twotone16.png new file mode 100644 index 000000000..6cd632444 Binary files /dev/null and b/Src/Skins/Immersive/twotone16.png differ diff --git a/Src/Skins/Immersive/twotone17.png b/Src/Skins/Immersive/twotone17.png new file mode 100644 index 000000000..ec6cbd386 Binary files /dev/null and b/Src/Skins/Immersive/twotone17.png differ diff --git a/Src/Skins/Immersive/twotone18.png b/Src/Skins/Immersive/twotone18.png new file mode 100644 index 000000000..5d51b9293 Binary files /dev/null and b/Src/Skins/Immersive/twotone18.png differ diff --git a/Src/Skins/Immersive/twotone19.png b/Src/Skins/Immersive/twotone19.png new file mode 100644 index 000000000..cf278c8ed Binary files /dev/null and b/Src/Skins/Immersive/twotone19.png differ diff --git a/Src/Skins/Immersive/twotone2.png b/Src/Skins/Immersive/twotone2.png new file mode 100644 index 000000000..b93c73725 Binary files /dev/null and b/Src/Skins/Immersive/twotone2.png differ diff --git a/Src/Skins/Immersive/twotone20.png b/Src/Skins/Immersive/twotone20.png new file mode 100644 index 000000000..f3ac169da Binary files /dev/null and b/Src/Skins/Immersive/twotone20.png differ diff --git a/Src/Skins/Immersive/twotone21.png b/Src/Skins/Immersive/twotone21.png new file mode 100644 index 000000000..c481d3617 Binary files /dev/null and b/Src/Skins/Immersive/twotone21.png differ diff --git a/Src/Skins/Immersive/twotone22.png b/Src/Skins/Immersive/twotone22.png new file mode 100644 index 000000000..49dca7ddf Binary files /dev/null and b/Src/Skins/Immersive/twotone22.png differ diff --git a/Src/Skins/Immersive/twotone23.png b/Src/Skins/Immersive/twotone23.png new file mode 100644 index 000000000..d80b9798b Binary files /dev/null and b/Src/Skins/Immersive/twotone23.png differ diff --git a/Src/Skins/Immersive/twotone24.png b/Src/Skins/Immersive/twotone24.png new file mode 100644 index 000000000..b68f5a4d8 Binary files /dev/null and b/Src/Skins/Immersive/twotone24.png differ diff --git a/Src/Skins/Immersive/twotone25.png b/Src/Skins/Immersive/twotone25.png new file mode 100644 index 000000000..619f3f2e0 Binary files /dev/null and b/Src/Skins/Immersive/twotone25.png differ diff --git a/Src/Skins/Immersive/twotone26.png b/Src/Skins/Immersive/twotone26.png new file mode 100644 index 000000000..50547d3b5 Binary files /dev/null and b/Src/Skins/Immersive/twotone26.png differ diff --git a/Src/Skins/Immersive/twotone27.png b/Src/Skins/Immersive/twotone27.png new file mode 100644 index 000000000..99c2f4445 Binary files /dev/null and b/Src/Skins/Immersive/twotone27.png differ diff --git a/Src/Skins/Immersive/twotone28.png b/Src/Skins/Immersive/twotone28.png new file mode 100644 index 000000000..859c5adc0 Binary files /dev/null and b/Src/Skins/Immersive/twotone28.png differ diff --git a/Src/Skins/Immersive/twotone29.png b/Src/Skins/Immersive/twotone29.png new file mode 100644 index 000000000..5b7468ac0 Binary files /dev/null and b/Src/Skins/Immersive/twotone29.png differ diff --git a/Src/Skins/Immersive/twotone3.png b/Src/Skins/Immersive/twotone3.png new file mode 100644 index 000000000..a953d80db Binary files /dev/null and b/Src/Skins/Immersive/twotone3.png differ diff --git a/Src/Skins/Immersive/twotone30.png b/Src/Skins/Immersive/twotone30.png new file mode 100644 index 000000000..b3b71d533 Binary files /dev/null and b/Src/Skins/Immersive/twotone30.png differ diff --git a/Src/Skins/Immersive/twotone31.png b/Src/Skins/Immersive/twotone31.png new file mode 100644 index 000000000..608aad8ae Binary files /dev/null and b/Src/Skins/Immersive/twotone31.png differ diff --git a/Src/Skins/Immersive/twotone32.png b/Src/Skins/Immersive/twotone32.png new file mode 100644 index 000000000..82fb06f12 Binary files /dev/null and b/Src/Skins/Immersive/twotone32.png differ diff --git a/Src/Skins/Immersive/twotone33.png b/Src/Skins/Immersive/twotone33.png new file mode 100644 index 000000000..788b5ccb8 Binary files /dev/null and b/Src/Skins/Immersive/twotone33.png differ diff --git a/Src/Skins/Immersive/twotone34.png b/Src/Skins/Immersive/twotone34.png new file mode 100644 index 000000000..371a06c8b Binary files /dev/null and b/Src/Skins/Immersive/twotone34.png differ diff --git a/Src/Skins/Immersive/twotone35.png b/Src/Skins/Immersive/twotone35.png new file mode 100644 index 000000000..70741ecde Binary files /dev/null and b/Src/Skins/Immersive/twotone35.png differ diff --git a/Src/Skins/Immersive/twotone4.png b/Src/Skins/Immersive/twotone4.png new file mode 100644 index 000000000..071126578 Binary files /dev/null and b/Src/Skins/Immersive/twotone4.png differ diff --git a/Src/Skins/Immersive/twotone5.png b/Src/Skins/Immersive/twotone5.png new file mode 100644 index 000000000..a52999e07 Binary files /dev/null and b/Src/Skins/Immersive/twotone5.png differ diff --git a/Src/Skins/Immersive/twotone6.png b/Src/Skins/Immersive/twotone6.png new file mode 100644 index 000000000..bdd664d65 Binary files /dev/null and b/Src/Skins/Immersive/twotone6.png differ diff --git a/Src/Skins/Immersive/twotone7.png b/Src/Skins/Immersive/twotone7.png new file mode 100644 index 000000000..f322c2b37 Binary files /dev/null and b/Src/Skins/Immersive/twotone7.png differ diff --git a/Src/Skins/Immersive/twotone8.png b/Src/Skins/Immersive/twotone8.png new file mode 100644 index 000000000..ad13e67dd Binary files /dev/null and b/Src/Skins/Immersive/twotone8.png differ diff --git a/Src/Skins/Immersive/twotone9.png b/Src/Skins/Immersive/twotone9.png new file mode 100644 index 000000000..fff9499b2 Binary files /dev/null and b/Src/Skins/Immersive/twotone9.png differ diff --git a/Src/Skins/Immersive/twotone_pager.png b/Src/Skins/Immersive/twotone_pager.png new file mode 100644 index 000000000..4febd186c Binary files /dev/null and b/Src/Skins/Immersive/twotone_pager.png differ diff --git a/Src/Skins/Immersive/twotone_selector.png b/Src/Skins/Immersive/twotone_selector.png new file mode 100644 index 000000000..fbfa1be57 Binary files /dev/null and b/Src/Skins/Immersive/twotone_selector.png differ diff --git a/Src/Skins/Immersive/twotone_splitsel.png b/Src/Skins/Immersive/twotone_splitsel.png new file mode 100644 index 000000000..81e742d32 Binary files /dev/null and b/Src/Skins/Immersive/twotone_splitsel.png differ diff --git a/Src/Skins/Immersive/user.png b/Src/Skins/Immersive/user.png new file mode 100644 index 000000000..e6c9debb6 Binary files /dev/null and b/Src/Skins/Immersive/user.png differ diff --git a/Src/Skins/Immersive/user120.png b/Src/Skins/Immersive/user120.png new file mode 100644 index 000000000..7af328221 Binary files /dev/null and b/Src/Skins/Immersive/user120.png differ diff --git a/Src/Skins/Immersive/user144.png b/Src/Skins/Immersive/user144.png new file mode 100644 index 000000000..1320316b9 Binary files /dev/null and b/Src/Skins/Immersive/user144.png differ diff --git a/Src/Skins/Immersive7/Immersive7.rc b/Src/Skins/Immersive7/Immersive7.rc new file mode 100644 index 000000000..d818aa27d --- /dev/null +++ b/Src/Skins/Immersive7/Immersive7.rc @@ -0,0 +1,93 @@ +///////////////////////////////////////////////////////////////////////////// +// +// Icon +// + +// Icon with lowest ID value placed first to ensure application icon +// remains consistent on all systems. +1 ICON "..\\..\\Setup\\OpenShell.ico" + +///////////////////////////////////////////////////////////////////////////// +// +// SKIN +// + +1 SKIN "SkinDescription.txt" + +///////////////////////////////////////////////////////////////////////////// +// +// Image +// + +1 IMAGE "fullglass1.png" +2 IMAGE "fullglasssearch1.png" +3 IMAGE "scrollbkg1.png" +4 IMAGE "fullglass_pager.png" +5 IMAGE "pager_arrows.png" +6 IMAGE "scrollbkg2.png" +7 IMAGE "programs.png" +8 IMAGE "arrow.png" +9 IMAGE "search.png" +10 IMAGE "twotone_pager.png" +11 IMAGE "separator.png" +12 IMAGE "user.png" +13 IMAGE "submenu_selector.png" +14 IMAGE "submenu_splitsel.png" +15 IMAGE "pin.png" +16 IMAGE "scrollbtn1.png" +17 IMAGE "scroll_arrows.png" +18 IMAGE "user144.png" +19 IMAGE "arrow144.png" +20 IMAGE "submenu_pager.png" +21 IMAGE "pager_arrows144.png" +22 IMAGE "programs144.png" +23 IMAGE "submenu.png" +24 IMAGE "submenu_vertsep.png" +25 IMAGE "fullglass2.png" +26 IMAGE "fullglasssearch2.png" +27 IMAGE "search_arrow.png" +28 IMAGE "fullglass_selector.png" +29 IMAGE "fullglass_splitsel.png" +30 IMAGE "searchbkg.png" +31 IMAGE "shutdown_selector.png" +32 IMAGE "scrollbtn2.png" +33 IMAGE "newsel.png" +34 IMAGE "search_arrow144.png" +35 IMAGE "scroll_arrows144.png" +36 IMAGE "pin144.png" +37 IMAGE "separator144.png" +38 IMAGE "submenu_vertsep144.png" +39 IMAGE "scrollthumb1.png" +40 IMAGE "scrollthumb2.png" +41 IMAGE "pager_arrows120.png" +42 IMAGE "programs120.png" +43 IMAGE "arrow120.png" +44 IMAGE "search120.png" +45 IMAGE "pin120.png" +46 IMAGE "scroll_arrows120.png" +47 IMAGE "search_arrow120.png" +48 IMAGE "user120.png" +49 IMAGE "fullglass3.png" +50 IMAGE "fullglass4.png" +51 IMAGE "arrow_mask.png" +52 IMAGE "arrow_mask120.png" +53 IMAGE "arrow_mask144.png" +54 IMAGE "twotone1.png" +55 IMAGE "twotone2.png" +56 IMAGE "twotonesearch.png" +57 IMAGE "twotonejump.png" +58 IMAGE "scrollbtn3.png" +59 IMAGE "scrollthumb3.png" +60 IMAGE "scrollbkg3.png" +61 IMAGE "twotone_selector.png" +62 IMAGE "twotone_splitsel.png" +63 IMAGE "twotone_listsel.png" +64 IMAGE "twotone_listsplitsel.png" +65 IMAGE "programs192.png" +66 IMAGE "pin192.png" +67 IMAGE "arrow192.png" +68 IMAGE "arrow_mask192.png" +69 IMAGE "pager_arrows192.png" +70 IMAGE "scroll_arrows192.png" +71 IMAGE "search_arrow192.png" +72 IMAGE "search192.png" diff --git a/Src/Skins/Immersive7/Immersive7.vcxproj b/Src/Skins/Immersive7/Immersive7.vcxproj new file mode 100644 index 000000000..d2241fabd --- /dev/null +++ b/Src/Skins/Immersive7/Immersive7.vcxproj @@ -0,0 +1,44 @@ + + + + + Resource + Win32 + + + + {75809D15-8403-420A-BBE6-05F478D88D8E} + Immersive7 + Win32Proj + 10.0 + + + + DynamicLibrary + $(DefaultPlatformToolset) + Unicode + + + + + + + + + + .skin7 + Immersive + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Src/Skins/Immersive7/Immersive7.vcxproj.filters b/Src/Skins/Immersive7/Immersive7.vcxproj.filters new file mode 100644 index 000000000..3304916c5 --- /dev/null +++ b/Src/Skins/Immersive7/Immersive7.vcxproj.filters @@ -0,0 +1,28 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav + + + + + Source Files + + + + + Resource Files + + + + + Resource Files + + + \ No newline at end of file diff --git a/Src/Skins/Immersive7/SkinDescription.txt b/Src/Skins/Immersive7/SkinDescription.txt new file mode 100644 index 000000000..0e7b51dca --- /dev/null +++ b/Src/Skins/Immersive7/SkinDescription.txt @@ -0,0 +1,748 @@ +; Immersive skin + +; About - text to use in the About box for this skin. use \n for new line +About=#7111 + +; AboutIcon - the ID of an icon resource to use in the About box +AboutIcon=1 + +; Version - version of the required skin engine. Set to 2 if the skin uses any of the new features introduced in Open-Shell 1.9.0: +; * full glass +; * skinnable sub-menus +; * skinnable pager buttons +; * skinnable arrows +; Set to 3 if the skin uses any of the new features introduced in Open-Shell 4.2.1: +; * skinnable scrollbars +; * tint colors +; * start screen colors +Version=3 + +Main_opacity=region +Main2_opacity=region +Main_large_icons=1 + +Main_bitmap=$StartPrimaryText +Main_bitmap_tint2=$ImmersiveSystemBackground|$StartPrimaryText +Main_bitmap_tint3=#808080 +Main_bitmap_mask=1 +Main_bitmap_slices_X=12,1,6,3,1,3 +Main_bitmap_slices_Y=12,10,11 +Main_padding=7,7,8,7,100%,100%,88%,100% + +Main_text_padding=5,2,8,2,100% +Main_icon_padding=4,4,4,4,100% + +Main_bitmap_search=$StartPrimaryText +Main_bitmap_search_tint2=$ImmersiveSystemBackground|$StartPrimaryText +Main_bitmap_search_tint3=#808080 +Main_bitmap_search_mask=2 +Main_bitmap_search_slices_X=13,1,12 +Main_bitmap_search_slices_Y=12,10,11 +Main_search_padding=7,7,7,7,100% + +Main_bitmap_jump=$StartPrimaryText +Main_bitmap_jump_tint2=$ImmersiveSystemBackground|$StartPrimaryText +Main_bitmap_jump_tint3=#808080 +Main_bitmap_jump_mask=1 +Main_bitmap_jump_slices_X=12,1,6,3,1,3 +Main_bitmap_jump_slices_Y=12,10,11 +Main_jump_padding=5,7,7,7,100% + +Main_font="Segoe UI",normal,-9 + +Main_text_color=$StartPrimaryText,$StartSelectionPrimaryText,$StartPrimaryText,$StartSelectionPrimaryText + +Main_selection=$StartPrimaryText +Main_selection_mask=28 +Main_selection_tint1=$StartPrimaryText +Main_selection_slices_X=2,2,2 +Main_selection_slices_Y=2,2,2 + +Main_split_selection=$StartPrimaryText +Main_split_selection_mask=29 +Main_split_selection_tint1=$StartPrimaryText +Main_split_selection_slices_X=2,2,2,2,2,2 +Main_split_selection_slices_Y=2,2,2 + +; Main_pager - a bitmap that contains the background for the pager buttons (the ones that scroll menus up and down) +Main_pager=$SystemAccentDark1|$StartBackground +Main_pager_tint1=$StartPrimaryText +Main_pager_tint2=$StartPrimaryText +Main_pager_mask=4 +Main_pager_slices_X=3,10,3 +Main_pager_slices_Y=3,9,3 +Main_pager_arrows=$SystemAccentDark1|$StartBackground +Main_pager_arrows_tint1=$StartPrimaryText +Main_pager_arrows_tint2=$StartPrimaryText +Main_pager_arrows_mask=5 + +; Main_arrows - bitmap for the sub-menu arrows. The top half of the image is the normal arrow and the bottom half is the selected arrow +Main_arrow=8 +Main_arrow_mask=51 +Main_arrow_tint1=$StartPrimaryText +Main_arrow_tint2=#000000 +Main_arrow_padding=6,9,100% +Main_split_arrow_padding=8,9,100% + +; Main_separator - ID of a bitmap resource to use for the main menu separator. If no value is set the system separator is used +Main_separator=$SystemAccentDark1|$StartBackground +Main_separator_tint1=$StartPrimaryText +Main_separator_mask=11 +Main_separator_slices_X=12,9,12 +Main_search_indent=0 +Main_new_selection=$SystemAccentDark1|$StartBackground +Main_new_selection_tint1=$LightInlineErrorText +Main_new_selection_mask=33 +Main_new_selection_slices_X=2,2,2 +Main_new_selection_slices_Y=2,2,2 + +; Second column + +Main2_text_color=$StartPrimaryText,$StartSelectionPrimaryText,$StartPrimaryText,$StartSelectionPrimaryText +Main2_text_padding=1,8,8,9,100% +Main2_padding=5,7,5,7,100% +Main2_icon_padding=4,4,3,4,100% +Main2_arrow=8 +Main2_arrow_mask=51 +Main2_arrow_tint1=$StartPrimaryText +Main2_arrow_tint2=#000000 +Main2_arrow_padding=6,7,100% +Main2_selection=$StartPrimaryText +Main2_selection_mask=28 +Main2_selection_tint1=$StartPrimaryText +Main2_selection_slices_X=2,2,2 +Main2_selection_slices_Y=2,2,2 +Main2_split_selection=$StartPrimaryText +Main2_split_selection_mask=29 +Main2_split_selection_tint1=$StartPrimaryText +Main2_split_selection_slices_X=2,2,2,2,2,2 +Main2_split_selection_slices_Y=2,2,2 +Main2_new_selection=$SystemAccentDark1|$StartBackground +Main2_new_selection_tint1=$LightInlineErrorText +Main2_new_selection_mask=33 +Main2_new_selection_slices_X=2,2,2 +Main2_new_selection_slices_Y=2,2,2 +Main2_separator_mask=11 +Main2_separator_slices_X=12,9,12 +Main2_separator=$SystemAccentDark1|$StartBackground +Main2_separator_tint1=$StartPrimaryText + +; Shutdown button + +Shutdown_selection=$StartPrimaryText +Shutdown_selection_mask=31 +Shutdown_selection_tint2=$StartPrimaryText +Shutdown_selection_slices_X=1,4,8,1,4,5 +Shutdown_selection_slices_Y=4,4,4 +Shutdown_search_selection=$StartPrimaryText +Shutdown_search_selection_mask=31 +Shutdown_search_selection_tint2=$StartPrimaryText +Shutdown_search_selection_slices_X=1,4,8,1,4,5 +Shutdown_search_selection_slices_Y=4,4,4 +Shutdown_jump_selection=$StartPrimaryText +Shutdown_jump_selection_mask=31 +Shutdown_jump_selection_tint2=$StartPrimaryText +Shutdown_jump_selection_slices_X=1,4,8,1,4,5 +Shutdown_jump_selection_slices_Y=4,4,4 +Shutdown_padding=0,7,0,4,100% +Shutdown_text_padding=8,5,10,6,100%,91%,90%,91% +Shutdown_icon_padding=5,3,-5,3,100% +Shutdown_text_color=$StartPrimaryText,$StartSelectionPrimaryText +Shutdown_search_text_color=$StartPrimaryText,$StartSelectionPrimaryText +Shutdown_jump_text_color=$StartPrimaryText,$StartSelectionPrimaryText +Shutdown_arrow=8 +Shutdown_arrow_mask=51 +Shutdown_arrow_tint1=$StartPrimaryText +Shutdown_arrow_tint2=#000000 +Shutdown_search_arrow=8 +Shutdown_search_arrow_mask=51 +Shutdown_search_arrow_tint1=$StartPrimaryText +Shutdown_search_arrow_tint2=#000000 +Shutdown_jump_arrow=8 +Shutdown_jump_arrow_mask=51 +Shutdown_jump_arrow_tint1=$StartPrimaryText +Shutdown_jump_arrow_tint2=#000000 +Shutdown_arrow_padding=6,7,100% + +; Programs tree + +Programs_background=$SystemAccentDark1|$StartBackground +Programs_background_tint3=#808080 +Programs_background_mask=#FF0000 +Programs_text_padding=5,2,0,2,100% +Programs_icon_padding=-6,4,6,4,100% +Programs_indent=-11,80% + +Programs_icon=7 +Programs_icon_mask=#FF0000 +Programs_icon_tint1=$StartPrimaryText +Programs_new_selection=$SystemAccentDark1|$StartBackground +Programs_new_selection_tint1=$LightInlineErrorText +Programs_new_selection_mask=33 +Programs_new_selection_slices_X=2,2,2 +Programs_new_selection_slices_Y=2,2,2 + +Programs_button_text_padding=3,2,8,2,100% +Programs_button_new_text_padding=3,2,8,2,100% +Programs_button_icon_padding=4,6,4,6,100% +Programs_button_new_icon_padding=4,6,4,6,100% + +; Scrollbar +Scrollbar_button=$StartPrimaryText +Scrollbar_button_tint2=$StartPrimaryText +Scrollbar_button_tint3=#808080 +Scrollbar_button_mask=16 +Scrollbar_button_slices_X=3,3,3 +Scrollbar_button_slices_Y=3,3,3 +Scrollbar_thumb=$StartPrimaryText +Scrollbar_thumb_tint2=$StartPrimaryText +Scrollbar_thumb_tint3=#808080 +Scrollbar_thumb_mask=39 +Scrollbar_thumb_slices_X=3,3,3 +Scrollbar_thumb_slices_Y=3,3,3 +Scrollbar_background=$StartPrimaryText +Scrollbar_background_tint2=$StartPrimaryText +Scrollbar_background_tint3=#808080 +Scrollbar_background_mask=3 +Scrollbar_background_slices_X=2,2,2 +Scrollbar_background_slices_Y=2,2,2 +Scrollbar_arrows=#StartBackground +Scrollbar_arrows_tint1=$StartPrimaryText +Scrollbar_arrows_tint2=$StartPrimaryText +Scrollbar_arrows_tint3=#000000 +Scrollbar_arrows_mask=17 + + +; LIST SECTION +List_text_padding=0,2,8,2,100% +List_icon_padding=8,3,8,3,100% +List_separator_font="Segoe UI Semibold",normal,-9 +List_separator_text_padding=8,3,0,5,100% +List_separator_icon_padding=10,0,2,0,100% +List_arrow_padding=3,6,100% +List_split_arrow_padding=5,6,100% +List_separator_split_font="Segoe UI Semibold",normal,-9 +List_separator_text_color=$StartPrimaryText,$StartSelectionPrimaryText + +List_selection=$StartPrimaryText +List_selection_mask=28 +List_selection_tint1=$StartPrimaryText +List_selection_slices_X=2,2,2 +List_selection_slices_Y=2,2,2 + +List_split_selection=$StartPrimaryText +List_split_selection_mask=29 +List_split_selection_tint1=$StartPrimaryText +List_split_selection_slices_X=2,2,2,2,2,2 +List_split_selection_slices_Y=2,2,2 + +Search_padding=3,9,3,6,100%,78%,33%,67% +Search_frame=0 +Search_background=$SystemAccentDark1|$StartBackground +Search_background_tint1=$StartPrimaryText +Search_background_tint2=$ImmersiveSystemBackground|$StartPrimaryText +Search_background_tint3=$StartPrimaryText +Search_background_mask=30 +Search_background_slices_X=3,2,3, 0,5,13, 0,1,3 +Search_background_slices_Y=3,1,4, 0,2,0, 3,2,3 +Search_background_padding=2,-3,2,2 +Search_background_search_padding=2,-3,2,2 +Search_background_jump_padding=2,-3,2,2 +Search_hint_font="Segoe UI",normal,-9 +Search_text_color=$ImmersiveSystemText|#000000,#808080 +Search_text_background=$SystemAccentDark1|$StartBackground +Search_text_background_tint1=$ImmersiveSystemBackground|$StartPrimaryText +Search_text_background_tint2=$StartPrimaryText +Search_text_background_mask=#FF1700 +Search_bitmap=9 +Search_bitmap_tint1=#808080 +Search_bitmap_mask=#FF0000 + +Search_arrow=27 +Search_arrow_mask=51 +Search_arrow_tint1=$StartPrimaryText +Search_arrow_tint2=#000000 + +; More_bitmap - a bitmap for the "more" button in search categories. set to 0 to use the default icon. set to "none" to hide the button +More_bitmap=0 +Pin_bitmap=15 +Pin_bitmap_tint1=$StartPrimaryText +Pin_bitmap_mask=#FF0000 + + +;SUB-MENU SECTION - describes the look of the sub-menus + +; The width of the standard window border is subtracted from all sides +Submenu_padding=3,5,3,5,100% +Submenu_text_padding=0,2,8,2,100% +Submenu_icon_padding=8,3,8,3,100% + +; These have the same meaning as the Main_... properties +Submenu_opacity=region +Submenu_bitmap=$ImmersiveSystemBackground|$StartPrimaryText +Submenu_bitmap_tint1=#A0A0A0 +Submenu_bitmap_tint2=#808080 +Submenu_bitmap_tint3=$StartPrimaryText +Submenu_bitmap_mask=23 +Submenu_bitmap_slices_X=4,4,4 +Submenu_bitmap_slices_Y=4,4,4 + +Submenu_font="Segoe UI",normal,-9 +Submenu_text_color=$ImmersiveSystemText|#000000,$ImmersiveSystemText|#000000,#7F7F7F,#7F7F7F +Submenu_selection=$ImmersiveSystemBackground|$StartPrimaryText +Submenu_selection_mask=13 +Submenu_selection_slices_X=2,2,2 +Submenu_selection_slices_Y=2,2,2 +Submenu_selection_tint1=$StartPrimaryText +Submenu_selection_tint2=$ImmersiveSystemText|#000000 +Submenu_split_selection=$ImmersiveSystemBackground|$StartPrimaryText +Submenu_split_selection_mask=14 +Submenu_split_selection_slices_X=2,2,2,2,2,2 +Submenu_split_selection_slices_Y=2,2,2 +Submenu_split_selection_tint1=$StartPrimaryText + +Submenu_pager=$ImmersiveSystemBackground|$StartPrimaryText +Submenu_pager_tint1=$StartPrimaryText +Submenu_pager_tint2=$ImmersiveSystemText|#000000 +Submenu_pager_mask=20 +Submenu_pager_slices_X=3,10,3 +Submenu_pager_slices_Y=3,9,3 +Submenu_pager_arrows=$SystemAccentDark1|$StartBackground +Submenu_pager_arrows_tint1=$ImmersiveSystemText|#000000 +Submenu_pager_arrows_tint2=$ImmersiveSystemText|#000000 +Submenu_pager_arrows_mask=5 + +Submenu_arrow=8 +Submenu_arrow_mask=51 +Submenu_arrow_tint1=$ImmersiveSystemText|#000000 +Submenu_arrow_tint2=$ImmersiveSystemBackground|$StartPrimaryText +Submenu_arrow_padding=3,6,100% +Submenu_split_arrow_padding=5,6,100% +Submenu_separator=$SystemAccentDark1|$StartBackground +Submenu_separator_tint1=$ImmersiveSystemText|#000000 +Submenu_separator_mask=11 +Submenu_separator_slices_X=12,9,12 +Submenu_separator_text_padding=8,3,0,5,100% +Submenu_separator_font="Segoe UI Semibold",normal,-9 +Submenu_separator_text_color=$ImmersiveSystemText|#000000,$ImmersiveSystemText|#000000 +Submenu_new_selection=$SystemAccentDark1|$StartBackground +Submenu_new_selection_tint1=$LightInlineErrorText +Submenu_new_selection_mask=33 +Submenu_new_selection_slices_X=2,2,2 +Submenu_new_selection_slices_Y=2,2,2 + +Submenu_separatorV=$SystemAccentDark1|$StartBackground +Submenu_separatorV_tint1=$ImmersiveSystemText|#000000 +Submenu_separatorV_mask=24 +Submenu_separatorV_slices_Y=12,9,12 + + +; OPTIONS + +OPTION RADIOGROUP=#7039,0,LIGHT|DARK|AUTO +OPTION LIGHT=#7040,0 +OPTION DARK=#7041,0 +OPTION AUTO=#7042,1 +OPTION USER_IMAGE=#7014,1 +OPTION USER_NAME=#7015,0 +OPTION CENTER_NAME=#7004,0, USER_NAME, 0 +OPTION SMALL_ICONS=#7011,0 +OPTION OPAQUE=#7009,0 +OPTION DISABLE_MASK=#7005,0 +OPTION_NUMBER CUSTOM_TEXT_SIZE=#7038,0,TRUE,12 +OPTION BLACK_TEXT=#7002,0 +OPTION BLACK_FRAMES=#7001,0 +OPTION RADIOGROUP=#7043,0,TRANSPARENT_LESS|TRANSPARENT_MORE +OPTION TRANSPARENT_LESS=#7044,1 +OPTION TRANSPARENT_MORE=#7045,0 + +[SMALL_ICONS] +Main_large_icons=0 +Main2_text_padding=1,4,8,5,100% + + +[USER_IMAGE] +; User_bitmap - the frame around the user picture +User_mask=12 +User_image_size=48 +User_image_padding=0,7,100% +User_bitmap_outside=0 + +[USER_NAME] +Main_padding=7,47,8,7,100%,100%,88%,100% +Main_search_padding=7,47,7,7,100% +User_name_position=15,5,-15,45,100% +User_name_align=left1 +User_text_color=$StartPrimaryText +User_font="Segoe UI Semibold",normal,18,100% +User_glow_size=0 + +[CENTER_NAME] +User_name_align=center1 + +[120_DPI] +Programs_icon=42 +Main_pager_arrows_mask=41 +Submenu_pager_arrows_mask=41 +Main_arrow=43 +Main2_arrow=43 +Shutdown_arrow=43 +Shutdown_search_arrow=43 +Shutdown_jump_arrow=43 +Submenu_arrow=43 +Search_arrow=47 +Scrollbar_arrows_mask=46 +Pin_bitmap=45 +Search_bitmap=44 +Main_arrow_mask=52 +Main2_arrow_mask=52 +Shutdown_arrow_mask=52 +Shutdown_search_arrow_mask=52 +Shutdown_jump_arrow_mask=52 +Search_arrow_mask=52 +Submenu_arrow_mask=52 + + +[120_DPI AND USER_IMAGE] +User_mask=48 +User_image_size=60 + + +[HIGH_DPI] +Main_bitmap_mask=49 +Main_bitmap_jump_mask=49 +Programs_icon=22 +Main_pager_arrows_mask=21 +Submenu_pager_arrows_mask=21 +Main_arrow=19 +Main2_arrow=19 +Shutdown_arrow=19 +Shutdown_search_arrow=19 +Shutdown_jump_arrow=19 +Submenu_arrow=19 +Search_arrow=34 +Scrollbar_arrows_mask=35 +Pin_bitmap=36 +Main_separator_mask=37 +Main2_separator_mask=37 +Submenu_separator_mask=37 +Submenu_separatorV_mask=38 +Main_arrow_mask=53 +Main2_arrow_mask=53 +Shutdown_arrow_mask=53 +Shutdown_search_arrow_mask=53 +Shutdown_jump_arrow_mask=53 +Search_arrow_mask=53 +Submenu_arrow_mask=53 + +[HIGH_DPI AND USER_IMAGE] +User_mask=18 +User_image_size=72 + +[TOUCH_ENABLED AND NOT SMALL_ICONS] +List_separator_icon_padding=10,8,2,8,100% +Main_arrow_padding=7,10,100% +Main_split_arrow_padding=9,10,100% +Main2_arrow_padding=9,10,100% + +[NOT OPAQUE] +Main_opacity=fullglass +Main2_opacity=fullglass + +Main_bitmap_mask=25 +Main_bitmap_search_mask=26 +Main_bitmap_jump_mask=25 +Programs_background=#C0000000 + +Scrollbar_button_mask=32 +Scrollbar_thumb_mask=40 +Scrollbar_background_mask=6 + +[NOT OPAQUE AND HIGH_DPI] +Main_bitmap_mask=50 +Main_bitmap_jump_mask=50 + +[DISABLE_MASK] +Main_bitmap_tint1=#545454 +Main_bitmap_search_tint1=#545454 +Main_bitmap_jump_tint1=#545454 +Programs_background_tint1=#545454 +Scrollbar_button_tint1=#545454 +Scrollbar_thumb_tint1=#545454 +Scrollbar_background_tint1=#545454 + +[CUSTOM_TEXT_SIZE] +Main_font="Segoe UI",normal,@CUSTOM_TEXT_SIZE@ +Search_hint_font="Segoe UI",normal,@CUSTOM_TEXT_SIZE@ +Submenu_font="Segoe UI",normal,@CUSTOM_TEXT_SIZE@ +List_separator_font="Segoe UI Semibold",normal,@CUSTOM_TEXT_SIZE@ +List_separator_split_font="Segoe UI Semibold",normal,@CUSTOM_TEXT_SIZE@ +Submenu_separator_font="Segoe UI Semibold",normal,@CUSTOM_TEXT_SIZE@ + +[BLACK_TEXT] +Main_text_color=#000000,#000000,#000000,#000000 +Main2_text_color=#000000,#000000,#000000,#000000 +Shutdown_text_color=#000000,#000000 +Shutdown_search_text_color=#000000,#000000 +Shutdown_jump_text_color=#000000,#000000 +List_separator_text_color=#000000,#000000 +Main_arrow_tint1=#000000 +Main_arrow_tint2=$StartPrimaryText +Main2_arrow_tint1=#000000 +Main2_arrow_tint2=$StartPrimaryText +Search_arrow_tint1=#000000 +Search_arrow_tint2=$StartPrimaryText +Programs_icon_tint1=#000000 +Pin_bitmap_tint1=#000000 +Main_bitmap=#000000 +Main_bitmap_search=#000000 +Main_bitmap_jump=#000000 +Main_separator_tint1=#000000 +Search_background_tint1=#000000 +Scrollbar_arrows_tint1=#000000 +Scrollbar_arrows_tint2=#000000 +Scrollbar_arrows_tint3=$StartPrimaryText +Main_pager_arrows_tint1=#000000 +Main_pager_arrows_tint2=#000000 +Main2_separator_tint1=#000000 +Shutdown_arrow_tint1=#000000 +Shutdown_arrow_tint2=$StartPrimaryText +Shutdown_search_arrow_tint1=#000000 +Shutdown_search_arrow_tint2=$StartPrimaryText +Shutdown_jump_arrow_tint1=#000000 +Shutdown_jump_arrow_tint2=$StartPrimaryText +User_text_color=#000000 + +[BLACK_FRAMES] +Main_selection=#000000 +Main_split_selection=#000000 +Main2_selection=#000000 +Main2_split_selection=#000000 +Shutdown_selection=#000000 +Shutdown_search_selection=#000000 +Shutdown_jump_selection=#000000 +List_selection=#000000 +List_split_selection=#000000 +Scrollbar_button=#000000 +Scrollbar_thumb=#000000 +Scrollbar_background=#000000 +Main_pager_tint2=#000000 + +[TRANSPARENT_LESS] +Main_padding=7,7,7,7,100% +Main_text_color=$ImmersiveSystemText|#000000,$ImmersiveSystemText|#000000,#7F7F7F,#7F7F7F +Shutdown_search_text_color=$ImmersiveSystemText|#000000,$ImmersiveSystemText|#000000 +Shutdown_jump_text_color=$ImmersiveSystemText|#000000,$ImmersiveSystemText|#000000 +Main_bitmap_mask=54 +Main_bitmap_search_mask=56 +Main_bitmap_jump_mask=57 +Programs_background_mask=#C50036 +Programs_background=$StartPrimaryText +Programs_background_tint1=$ImmersiveSystemBackground|$StartPrimaryText +Scrollbar_button_mask=58 +Scrollbar_thumb_mask=59 +Scrollbar_background_mask=60 +Scrollbar_button_tint1=$ImmersiveSystemBackground|$StartPrimaryText +Scrollbar_thumb_tint1=$ImmersiveSystemBackground|$StartPrimaryText +Scrollbar_background_tint1=$ImmersiveSystemBackground|$StartPrimaryText +Scrollbar_button=$ImmersiveSystemText|#000000 +Scrollbar_thumb=$ImmersiveSystemText|#000000 +Scrollbar_background=$ImmersiveSystemText|#000000 +Scrollbar_arrows_tint1=$ImmersiveSystemText|#000000 +Scrollbar_arrows_tint2=$ImmersiveSystemText|#000000 +Scrollbar_arrows_tint3=$ImmersiveSystemBackground|$StartPrimaryText +Search_background_tint1=$ImmersiveSystemText|#000000 +Programs_icon_tint1=$ImmersiveSystemText|#000000 +List_separator_text_color=$ImmersiveSystemText|#000000,$ImmersiveSystemText|#000000 +Search_arrow_tint1=$ImmersiveSystemText|#000000 +Search_arrow_tint2=$ImmersiveSystemBackground|$StartPrimaryText +Main_separator_tint1=$ImmersiveSystemText|#000000 +Main_arrow_tint1=$ImmersiveSystemText|#000000 +Main_arrow_tint2=$ImmersiveSystemBackground|$StartPrimaryText +Shutdown_search_arrow_tint1=$ImmersiveSystemText|#000000 +Shutdown_search_arrow_tint2=$ImmersiveSystemBackground|$StartPrimaryText +Shutdown_jump_arrow_tint1=$ImmersiveSystemText|#000000 +Shutdown_jump_arrow_tint2=$ImmersiveSystemBackground|$StartPrimaryText +Main_pager_arrows_tint1=$ImmersiveSystemText|#000000 +Main_pager_arrows_tint2=$ImmersiveSystemText|#000000 +Pin_bitmap_tint1=$ImmersiveSystemText|#000000 +User_text_color=$ImmersiveSystemText|#000000 +Main_bitmap=$StartPrimaryText +Main_bitmap_search=$StartPrimaryText +Main_bitmap_jump=$StartPrimaryText +Shutdown_search_selection=$ImmersiveSystemText|#000000 +Shutdown_jump_selection=$ImmersiveSystemText|#000000 +List_selection=$ImmersiveSystemBackground|$StartPrimaryText +List_split_selection=$ImmersiveSystemBackground|$StartPrimaryText +Main_selection=$ImmersiveSystemBackground|$StartPrimaryText +Main_split_selection=$ImmersiveSystemBackground|$StartPrimaryText +Main_selection_mask=61 +Main_split_selection_mask=62 +List_selection_mask=63 +List_split_selection_mask=64 +Main_pager_mask=10 +Main_pager=$ImmersiveSystemBackground|$StartPrimaryText +Main_pager_tint1=$StartPrimaryText + +[TRANSPARENT_LESS AND NOT OPAQUE] +Main_bitmap_mask=55 +Programs_background=$StartPrimaryText +Main_opacity=glass +Main2_opacity=fullglass + +[USER_NAME AND TRANSPARENT_LESS] +Main_padding=7,47,7,7,100% + +[SEARCHBOX] +Main_bitmap_jump_slices_Y=12,6,2,0,2,11 + + +[HIGH_DPI AND NOT 144_DPI AND NOT 168_DPI] +Programs_icon=65 +Pin_bitmap=66 +Main_arrow=67 +Main2_arrow=67 +Shutdown_arrow=67 +Shutdown_search_arrow=67 +Shutdown_jump_arrow=67 +Submenu_arrow=67 +Main_arrow_mask=68 +Main2_arrow_mask=68 +Shutdown_arrow_mask=68 +Shutdown_search_arrow_mask=68 +Shutdown_jump_arrow_mask=68 +Submenu_arrow_mask=68 +Main_pager_arrows_mask=69 +Submenu_pager_arrows_mask=69 +Scrollbar_arrows_mask=70 +Search_arrow=71 +Search_arrow_mask=68 +Search_bitmap=72 + + +[LIGHT] +Main_bitmap_tint2=#FFFFFF +Main_bitmap_search_tint2=#FFFFFF +Main_bitmap_jump_tint2=#FFFFFF +Search_background_tint2=#FFFFFF +Search_text_background_tint1=#FFFFFF +Submenu_bitmap=#FFFFFF +Submenu_selection=#FFFFFF +Submenu_split_selection=#FFFFFF +Submenu_pager=#FFFFFF +Submenu_arrow_tint2=#FFFFFF +Search_text_color=#000000,#808080 +Submenu_text_color=#000000,#000000,#7F7F7F,#7F7F7F +Submenu_selection_tint2=#000000 +Submenu_pager_tint2=#000000 +Submenu_pager_arrows_tint1=#000000 +Submenu_pager_arrows_tint2=#000000 +Submenu_arrow_tint1=#000000 +Submenu_separator_tint1=#000000 +Submenu_separator_text_color=#000000,#000000 +Submenu_separatorV_tint1=#000000 + +[LIGHT AND TRANSPARENT_LESS] +Programs_background_tint1=#FFFFFF +Scrollbar_button_tint1=#FFFFFF +Scrollbar_thumb_tint1=#FFFFFF +Scrollbar_background_tint1=#FFFFFF +Scrollbar_arrows_tint3=#FFFFFF +Search_arrow_tint2=#FFFFFF +Main_arrow_tint2=#FFFFFF +Shutdown_search_arrow_tint2=#FFFFFF +Shutdown_jump_arrow_tint2=#FFFFFF +List_selection=#FFFFFF +List_split_selection=#FFFFFF +Main_selection=#FFFFFF +Main_split_selection=#FFFFFF +Main_pager=#FFFFFF +Main_text_color=#000000,#000000,#7F7F7F,#7F7F7F +Shutdown_search_text_color=#000000,#000000 +Shutdown_jump_text_color=#000000,#000000 +Scrollbar_button=#000000 +Scrollbar_thumb=#000000 +Scrollbar_background=#000000 +Scrollbar_arrows_tint1=#000000 +Scrollbar_arrows_tint2=#000000 +Search_background_tint1=#000000 +Programs_icon_tint1=#000000 +List_separator_text_color=#000000,#000000 +Search_arrow_tint1=#000000 +Main_separator_tint1=#000000 +Main_arrow_tint1=#000000 +Shutdown_search_arrow_tint1=#000000 +Shutdown_jump_arrow_tint1=#000000 +Main_pager_arrows_tint1=#000000 +Main_pager_arrows_tint2=#000000 +Pin_bitmap_tint1=#000000 +User_text_color=#000000 +Shutdown_search_selection=#000000 +Shutdown_jump_selection=#000000 + +[DARK] +Main_bitmap_tint2=#000000 +Main_bitmap_search_tint2=#000000 +Main_bitmap_jump_tint2=#000000 +Search_background_tint2=#000000 +Search_text_background_tint1=#000000 +Submenu_bitmap=#000000 +Submenu_selection=#000000 +Submenu_split_selection=#000000 +Submenu_pager=#000000 +Submenu_arrow_tint2=#000000 +Search_text_color=#FFFFFF,#808080 +Submenu_text_color=#FFFFFF,#FFFFFF,#7F7F7F,#7F7F7F +Submenu_selection_tint2=#FFFFFF +Submenu_pager_tint2=#FFFFFF +Submenu_pager_arrows_tint1=#FFFFFF +Submenu_pager_arrows_tint2=#FFFFFF +Submenu_arrow_tint1=#FFFFFF +Submenu_separator_tint1=#FFFFFF +Submenu_separator_text_color=#FFFFFF,#FFFFFF +Submenu_separatorV_tint1=#FFFFFF + +[DARK AND TRANSPARENT_LESS] +Programs_background_tint1=#000000 +Scrollbar_button_tint1=#000000 +Scrollbar_thumb_tint1=#000000 +Scrollbar_background_tint1=#000000 +Scrollbar_arrows_tint3=#000000 +Search_arrow_tint2=#000000 +Main_arrow_tint2=#000000 +Shutdown_search_arrow_tint2=#000000 +Shutdown_jump_arrow_tint2=#000000 +List_selection=#000000 +List_split_selection=#000000 +Main_selection=#000000 +Main_split_selection=#000000 +Main_pager=#000000 +Main_text_color=#FFFFFF,#FFFFFF,#7F7F7F,#7F7F7F +Shutdown_search_text_color=#FFFFFF,#FFFFFF +Shutdown_jump_text_color=#FFFFFF,#FFFFFF +Scrollbar_button=#FFFFFF +Scrollbar_thumb=#FFFFFF +Scrollbar_background=#FFFFFF +Scrollbar_arrows_tint1=#FFFFFF +Scrollbar_arrows_tint2=#FFFFFF +Search_background_tint1=#FFFFFF +Programs_icon_tint1=#FFFFFF +List_separator_text_color=#FFFFFF,#FFFFFF +Search_arrow_tint1=#FFFFFF +Main_separator_tint1=#FFFFFF +Main_arrow_tint1=#FFFFFF +Shutdown_search_arrow_tint1=#FFFFFF +Shutdown_jump_arrow_tint1=#FFFFFF +Main_pager_arrows_tint1=#FFFFFF +Main_pager_arrows_tint2=#FFFFFF +Pin_bitmap_tint1=#FFFFFF +User_text_color=#FFFFFF +Shutdown_search_selection=#FFFFFF +Shutdown_jump_selection=#FFFFFF + + +[BLACK_TEXT AND NOT BLACK_FRAMES AND NOT TRANSPARENT_LESS] +Scrollbar_arrows_tint3=#000000 + +[BLACK_FRAMES AND NOT BLACK_TEXT AND NOT TRANSPARENT_LESS] +Scrollbar_arrows_tint3=#FFFFFF \ No newline at end of file diff --git a/Src/Skins/Immersive7/arrow.png b/Src/Skins/Immersive7/arrow.png new file mode 100644 index 000000000..3c4334ada Binary files /dev/null and b/Src/Skins/Immersive7/arrow.png differ diff --git a/Src/Skins/Immersive7/arrow120.png b/Src/Skins/Immersive7/arrow120.png new file mode 100644 index 000000000..3742f929f Binary files /dev/null and b/Src/Skins/Immersive7/arrow120.png differ diff --git a/Src/Skins/Immersive7/arrow144.png b/Src/Skins/Immersive7/arrow144.png new file mode 100644 index 000000000..8daf62abd Binary files /dev/null and b/Src/Skins/Immersive7/arrow144.png differ diff --git a/Src/Skins/Immersive7/arrow192.png b/Src/Skins/Immersive7/arrow192.png new file mode 100644 index 000000000..85930a057 Binary files /dev/null and b/Src/Skins/Immersive7/arrow192.png differ diff --git a/Src/Skins/Immersive7/arrow_mask.png b/Src/Skins/Immersive7/arrow_mask.png new file mode 100644 index 000000000..f55c557bd Binary files /dev/null and b/Src/Skins/Immersive7/arrow_mask.png differ diff --git a/Src/Skins/Immersive7/arrow_mask120.png b/Src/Skins/Immersive7/arrow_mask120.png new file mode 100644 index 000000000..b501c8f8d Binary files /dev/null and b/Src/Skins/Immersive7/arrow_mask120.png differ diff --git a/Src/Skins/Immersive7/arrow_mask144.png b/Src/Skins/Immersive7/arrow_mask144.png new file mode 100644 index 000000000..2cfb8f3e3 Binary files /dev/null and b/Src/Skins/Immersive7/arrow_mask144.png differ diff --git a/Src/Skins/Immersive7/arrow_mask192.png b/Src/Skins/Immersive7/arrow_mask192.png new file mode 100644 index 000000000..68eca03bb Binary files /dev/null and b/Src/Skins/Immersive7/arrow_mask192.png differ diff --git a/Src/Skins/Immersive7/fullglass1.png b/Src/Skins/Immersive7/fullglass1.png new file mode 100644 index 000000000..f0b166944 Binary files /dev/null and b/Src/Skins/Immersive7/fullglass1.png differ diff --git a/Src/Skins/Immersive7/fullglass2.png b/Src/Skins/Immersive7/fullglass2.png new file mode 100644 index 000000000..baa512f6c Binary files /dev/null and b/Src/Skins/Immersive7/fullglass2.png differ diff --git a/Src/Skins/Immersive7/fullglass3.png b/Src/Skins/Immersive7/fullglass3.png new file mode 100644 index 000000000..f8719aa1f Binary files /dev/null and b/Src/Skins/Immersive7/fullglass3.png differ diff --git a/Src/Skins/Immersive7/fullglass4.png b/Src/Skins/Immersive7/fullglass4.png new file mode 100644 index 000000000..1ea417fb6 Binary files /dev/null and b/Src/Skins/Immersive7/fullglass4.png differ diff --git a/Src/Skins/Immersive7/fullglass_pager.png b/Src/Skins/Immersive7/fullglass_pager.png new file mode 100644 index 000000000..a6f33251b Binary files /dev/null and b/Src/Skins/Immersive7/fullglass_pager.png differ diff --git a/Src/Skins/Immersive7/fullglass_selector.png b/Src/Skins/Immersive7/fullglass_selector.png new file mode 100644 index 000000000..c336982e6 Binary files /dev/null and b/Src/Skins/Immersive7/fullglass_selector.png differ diff --git a/Src/Skins/Immersive7/fullglass_splitsel.png b/Src/Skins/Immersive7/fullglass_splitsel.png new file mode 100644 index 000000000..deab8e7cb Binary files /dev/null and b/Src/Skins/Immersive7/fullglass_splitsel.png differ diff --git a/Src/Skins/Immersive7/fullglasssearch1.png b/Src/Skins/Immersive7/fullglasssearch1.png new file mode 100644 index 000000000..ad7e480e9 Binary files /dev/null and b/Src/Skins/Immersive7/fullglasssearch1.png differ diff --git a/Src/Skins/Immersive7/fullglasssearch2.png b/Src/Skins/Immersive7/fullglasssearch2.png new file mode 100644 index 000000000..1124fa7bb Binary files /dev/null and b/Src/Skins/Immersive7/fullglasssearch2.png differ diff --git a/Src/Skins/Immersive7/newsel.png b/Src/Skins/Immersive7/newsel.png new file mode 100644 index 000000000..3afd0b498 Binary files /dev/null and b/Src/Skins/Immersive7/newsel.png differ diff --git a/Src/Skins/Immersive7/pager_arrows.png b/Src/Skins/Immersive7/pager_arrows.png new file mode 100644 index 000000000..0c737e7ad Binary files /dev/null and b/Src/Skins/Immersive7/pager_arrows.png differ diff --git a/Src/Skins/Immersive7/pager_arrows120.png b/Src/Skins/Immersive7/pager_arrows120.png new file mode 100644 index 000000000..19df5412e Binary files /dev/null and b/Src/Skins/Immersive7/pager_arrows120.png differ diff --git a/Src/Skins/Immersive7/pager_arrows144.png b/Src/Skins/Immersive7/pager_arrows144.png new file mode 100644 index 000000000..7d992202b Binary files /dev/null and b/Src/Skins/Immersive7/pager_arrows144.png differ diff --git a/Src/Skins/Immersive7/pager_arrows192.png b/Src/Skins/Immersive7/pager_arrows192.png new file mode 100644 index 000000000..db3868b39 Binary files /dev/null and b/Src/Skins/Immersive7/pager_arrows192.png differ diff --git a/Src/Skins/Immersive7/pin.png b/Src/Skins/Immersive7/pin.png new file mode 100644 index 000000000..a4c5b67ec Binary files /dev/null and b/Src/Skins/Immersive7/pin.png differ diff --git a/Src/Skins/Immersive7/pin120.png b/Src/Skins/Immersive7/pin120.png new file mode 100644 index 000000000..d51b18b6f Binary files /dev/null and b/Src/Skins/Immersive7/pin120.png differ diff --git a/Src/Skins/Immersive7/pin144.png b/Src/Skins/Immersive7/pin144.png new file mode 100644 index 000000000..cc460a151 Binary files /dev/null and b/Src/Skins/Immersive7/pin144.png differ diff --git a/Src/Skins/Immersive7/pin192.png b/Src/Skins/Immersive7/pin192.png new file mode 100644 index 000000000..d8007dee3 Binary files /dev/null and b/Src/Skins/Immersive7/pin192.png differ diff --git a/Src/Skins/Immersive7/programs.png b/Src/Skins/Immersive7/programs.png new file mode 100644 index 000000000..c42d97dab Binary files /dev/null and b/Src/Skins/Immersive7/programs.png differ diff --git a/Src/Skins/Immersive7/programs120.png b/Src/Skins/Immersive7/programs120.png new file mode 100644 index 000000000..58f400399 Binary files /dev/null and b/Src/Skins/Immersive7/programs120.png differ diff --git a/Src/Skins/Immersive7/programs144.png b/Src/Skins/Immersive7/programs144.png new file mode 100644 index 000000000..18f548d57 Binary files /dev/null and b/Src/Skins/Immersive7/programs144.png differ diff --git a/Src/Skins/Immersive7/programs192.png b/Src/Skins/Immersive7/programs192.png new file mode 100644 index 000000000..0434fbc2c Binary files /dev/null and b/Src/Skins/Immersive7/programs192.png differ diff --git a/Src/Skins/Immersive7/scroll_arrows.png b/Src/Skins/Immersive7/scroll_arrows.png new file mode 100644 index 000000000..ddfb79800 Binary files /dev/null and b/Src/Skins/Immersive7/scroll_arrows.png differ diff --git a/Src/Skins/Immersive7/scroll_arrows120.png b/Src/Skins/Immersive7/scroll_arrows120.png new file mode 100644 index 000000000..673eef4d1 Binary files /dev/null and b/Src/Skins/Immersive7/scroll_arrows120.png differ diff --git a/Src/Skins/Immersive7/scroll_arrows144.png b/Src/Skins/Immersive7/scroll_arrows144.png new file mode 100644 index 000000000..e27aa0fb4 Binary files /dev/null and b/Src/Skins/Immersive7/scroll_arrows144.png differ diff --git a/Src/Skins/Immersive7/scroll_arrows192.png b/Src/Skins/Immersive7/scroll_arrows192.png new file mode 100644 index 000000000..408dad80a Binary files /dev/null and b/Src/Skins/Immersive7/scroll_arrows192.png differ diff --git a/Src/Skins/Immersive7/scrollbkg1.png b/Src/Skins/Immersive7/scrollbkg1.png new file mode 100644 index 000000000..764a63919 Binary files /dev/null and b/Src/Skins/Immersive7/scrollbkg1.png differ diff --git a/Src/Skins/Immersive7/scrollbkg2.png b/Src/Skins/Immersive7/scrollbkg2.png new file mode 100644 index 000000000..822f2355c Binary files /dev/null and b/Src/Skins/Immersive7/scrollbkg2.png differ diff --git a/Src/Skins/Immersive7/scrollbkg3.png b/Src/Skins/Immersive7/scrollbkg3.png new file mode 100644 index 000000000..49b955051 Binary files /dev/null and b/Src/Skins/Immersive7/scrollbkg3.png differ diff --git a/Src/Skins/Immersive7/scrollbtn1.png b/Src/Skins/Immersive7/scrollbtn1.png new file mode 100644 index 000000000..a0e9cb28b Binary files /dev/null and b/Src/Skins/Immersive7/scrollbtn1.png differ diff --git a/Src/Skins/Immersive7/scrollbtn2.png b/Src/Skins/Immersive7/scrollbtn2.png new file mode 100644 index 000000000..11f8bacf9 Binary files /dev/null and b/Src/Skins/Immersive7/scrollbtn2.png differ diff --git a/Src/Skins/Immersive7/scrollbtn3.png b/Src/Skins/Immersive7/scrollbtn3.png new file mode 100644 index 000000000..530c4ca10 Binary files /dev/null and b/Src/Skins/Immersive7/scrollbtn3.png differ diff --git a/Src/Skins/Immersive7/scrollthumb1.png b/Src/Skins/Immersive7/scrollthumb1.png new file mode 100644 index 000000000..ea9ec8536 Binary files /dev/null and b/Src/Skins/Immersive7/scrollthumb1.png differ diff --git a/Src/Skins/Immersive7/scrollthumb2.png b/Src/Skins/Immersive7/scrollthumb2.png new file mode 100644 index 000000000..2df9d7689 Binary files /dev/null and b/Src/Skins/Immersive7/scrollthumb2.png differ diff --git a/Src/Skins/Immersive7/scrollthumb3.png b/Src/Skins/Immersive7/scrollthumb3.png new file mode 100644 index 000000000..951bb96e0 Binary files /dev/null and b/Src/Skins/Immersive7/scrollthumb3.png differ diff --git a/Src/Skins/Immersive7/search.png b/Src/Skins/Immersive7/search.png new file mode 100644 index 000000000..3bb2abac4 Binary files /dev/null and b/Src/Skins/Immersive7/search.png differ diff --git a/Src/Skins/Immersive7/search120.png b/Src/Skins/Immersive7/search120.png new file mode 100644 index 000000000..a58afae4d Binary files /dev/null and b/Src/Skins/Immersive7/search120.png differ diff --git a/Src/Skins/Immersive7/search192.png b/Src/Skins/Immersive7/search192.png new file mode 100644 index 000000000..c8856bb0e Binary files /dev/null and b/Src/Skins/Immersive7/search192.png differ diff --git a/Src/Skins/Immersive7/search_arrow.png b/Src/Skins/Immersive7/search_arrow.png new file mode 100644 index 000000000..943a1157e Binary files /dev/null and b/Src/Skins/Immersive7/search_arrow.png differ diff --git a/Src/Skins/Immersive7/search_arrow120.png b/Src/Skins/Immersive7/search_arrow120.png new file mode 100644 index 000000000..48f23f417 Binary files /dev/null and b/Src/Skins/Immersive7/search_arrow120.png differ diff --git a/Src/Skins/Immersive7/search_arrow144.png b/Src/Skins/Immersive7/search_arrow144.png new file mode 100644 index 000000000..4a5654b6b Binary files /dev/null and b/Src/Skins/Immersive7/search_arrow144.png differ diff --git a/Src/Skins/Immersive7/search_arrow192.png b/Src/Skins/Immersive7/search_arrow192.png new file mode 100644 index 000000000..ebf8f2bcc Binary files /dev/null and b/Src/Skins/Immersive7/search_arrow192.png differ diff --git a/Src/Skins/Immersive7/searchbkg.png b/Src/Skins/Immersive7/searchbkg.png new file mode 100644 index 000000000..2104c6bd8 Binary files /dev/null and b/Src/Skins/Immersive7/searchbkg.png differ diff --git a/Src/Skins/Immersive7/separator.png b/Src/Skins/Immersive7/separator.png new file mode 100644 index 000000000..2fd278caf Binary files /dev/null and b/Src/Skins/Immersive7/separator.png differ diff --git a/Src/Skins/Immersive7/separator144.png b/Src/Skins/Immersive7/separator144.png new file mode 100644 index 000000000..31a1878f3 Binary files /dev/null and b/Src/Skins/Immersive7/separator144.png differ diff --git a/Src/Skins/Immersive7/shutdown_selector.png b/Src/Skins/Immersive7/shutdown_selector.png new file mode 100644 index 000000000..f3f6a1933 Binary files /dev/null and b/Src/Skins/Immersive7/shutdown_selector.png differ diff --git a/Src/Skins/Immersive7/submenu.png b/Src/Skins/Immersive7/submenu.png new file mode 100644 index 000000000..3e06cbff1 Binary files /dev/null and b/Src/Skins/Immersive7/submenu.png differ diff --git a/Src/Skins/Immersive7/submenu_pager.png b/Src/Skins/Immersive7/submenu_pager.png new file mode 100644 index 000000000..1af75fadd Binary files /dev/null and b/Src/Skins/Immersive7/submenu_pager.png differ diff --git a/Src/Skins/Immersive7/submenu_selector.png b/Src/Skins/Immersive7/submenu_selector.png new file mode 100644 index 000000000..0d33d1f1f Binary files /dev/null and b/Src/Skins/Immersive7/submenu_selector.png differ diff --git a/Src/Skins/Immersive7/submenu_splitsel.png b/Src/Skins/Immersive7/submenu_splitsel.png new file mode 100644 index 000000000..24296e902 Binary files /dev/null and b/Src/Skins/Immersive7/submenu_splitsel.png differ diff --git a/Src/Skins/Immersive7/submenu_vertsep.png b/Src/Skins/Immersive7/submenu_vertsep.png new file mode 100644 index 000000000..0a7deb6d1 Binary files /dev/null and b/Src/Skins/Immersive7/submenu_vertsep.png differ diff --git a/Src/Skins/Immersive7/submenu_vertsep144.png b/Src/Skins/Immersive7/submenu_vertsep144.png new file mode 100644 index 000000000..326aec993 Binary files /dev/null and b/Src/Skins/Immersive7/submenu_vertsep144.png differ diff --git a/Src/Skins/Immersive7/twotone1.png b/Src/Skins/Immersive7/twotone1.png new file mode 100644 index 000000000..a1f59f810 Binary files /dev/null and b/Src/Skins/Immersive7/twotone1.png differ diff --git a/Src/Skins/Immersive7/twotone2.png b/Src/Skins/Immersive7/twotone2.png new file mode 100644 index 000000000..c68303b19 Binary files /dev/null and b/Src/Skins/Immersive7/twotone2.png differ diff --git a/Src/Skins/Immersive7/twotone_listsel.png b/Src/Skins/Immersive7/twotone_listsel.png new file mode 100644 index 000000000..63a33b05c Binary files /dev/null and b/Src/Skins/Immersive7/twotone_listsel.png differ diff --git a/Src/Skins/Immersive7/twotone_listsplitsel.png b/Src/Skins/Immersive7/twotone_listsplitsel.png new file mode 100644 index 000000000..e4f9534ad Binary files /dev/null and b/Src/Skins/Immersive7/twotone_listsplitsel.png differ diff --git a/Src/Skins/Immersive7/twotone_pager.png b/Src/Skins/Immersive7/twotone_pager.png new file mode 100644 index 000000000..a03b5b659 Binary files /dev/null and b/Src/Skins/Immersive7/twotone_pager.png differ diff --git a/Src/Skins/Immersive7/twotone_selector.png b/Src/Skins/Immersive7/twotone_selector.png new file mode 100644 index 000000000..faf698f8e Binary files /dev/null and b/Src/Skins/Immersive7/twotone_selector.png differ diff --git a/Src/Skins/Immersive7/twotone_splitsel.png b/Src/Skins/Immersive7/twotone_splitsel.png new file mode 100644 index 000000000..f7e01a469 Binary files /dev/null and b/Src/Skins/Immersive7/twotone_splitsel.png differ diff --git a/Src/Skins/Immersive7/twotonejump.png b/Src/Skins/Immersive7/twotonejump.png new file mode 100644 index 000000000..4b6ac24fb Binary files /dev/null and b/Src/Skins/Immersive7/twotonejump.png differ diff --git a/Src/Skins/Immersive7/twotonesearch.png b/Src/Skins/Immersive7/twotonesearch.png new file mode 100644 index 000000000..5ecc1419f Binary files /dev/null and b/Src/Skins/Immersive7/twotonesearch.png differ diff --git a/Src/Skins/Immersive7/user.png b/Src/Skins/Immersive7/user.png new file mode 100644 index 000000000..c11a15ea0 Binary files /dev/null and b/Src/Skins/Immersive7/user.png differ diff --git a/Src/Skins/Immersive7/user120.png b/Src/Skins/Immersive7/user120.png new file mode 100644 index 000000000..30b06ae10 Binary files /dev/null and b/Src/Skins/Immersive7/user120.png differ diff --git a/Src/Skins/Immersive7/user144.png b/Src/Skins/Immersive7/user144.png new file mode 100644 index 000000000..6bcc7623f Binary files /dev/null and b/Src/Skins/Immersive7/user144.png differ diff --git a/Src/Skins/Metallic7/Metallic7.vcxproj b/Src/Skins/Metallic7/Metallic7.vcxproj index 67a7615ac..056b04cc8 100644 --- a/Src/Skins/Metallic7/Metallic7.vcxproj +++ b/Src/Skins/Metallic7/Metallic7.vcxproj @@ -13,35 +13,22 @@ 10.0 - + DynamicLibrary - v142 + $(DefaultPlatformToolset) Unicode - - + + - - $(SolutionDir)StartMenu\Skins\ - $(Configuration)\ - false - true + Metallic .skin7 - - - false - Windows - true - true - true - - diff --git a/Src/Skins/Metro/Metro.vcxproj b/Src/Skins/Metro/Metro.vcxproj index c806d30d6..566760539 100644 --- a/Src/Skins/Metro/Metro.vcxproj +++ b/Src/Skins/Metro/Metro.vcxproj @@ -13,35 +13,22 @@ 10.0 - + DynamicLibrary - v142 + $(DefaultPlatformToolset) Unicode - - + + - - $(SolutionDir)StartMenu\Skins\ - $(Configuration)\ - true - false + .skin Metro - - - false - Windows - true - true - true - - diff --git a/Src/Skins/Metro7/Metro7.vcxproj b/Src/Skins/Metro7/Metro7.vcxproj index 8710c77ce..ef367e9f2 100644 --- a/Src/Skins/Metro7/Metro7.vcxproj +++ b/Src/Skins/Metro7/Metro7.vcxproj @@ -13,35 +13,22 @@ 10.0 - + DynamicLibrary - v142 + $(DefaultPlatformToolset) Unicode - - + + - - $(SolutionDir)StartMenu\Skins\ - $(Configuration)\ - true - false + Metro .skin7 - - - false - Windows - true - true - true - - diff --git a/Src/Skins/Midnight7/Midnight7.vcxproj b/Src/Skins/Midnight7/Midnight7.vcxproj index 7582b1037..de13b5b0d 100644 --- a/Src/Skins/Midnight7/Midnight7.vcxproj +++ b/Src/Skins/Midnight7/Midnight7.vcxproj @@ -13,35 +13,22 @@ 10.0 - + DynamicLibrary - v142 + $(DefaultPlatformToolset) Unicode - - + + - - $(SolutionDir)StartMenu\Skins\ - $(Configuration)\ - true - false + Midnight .skin7 - - - false - Windows - true - true - true - - diff --git a/Src/Skins/Skin.props b/Src/Skins/Skin.props new file mode 100644 index 000000000..baece5e02 --- /dev/null +++ b/Src/Skins/Skin.props @@ -0,0 +1,19 @@ + + + + $(MSBuildThisFileDirectory)..\..\build\bin\Skins\ + $(MSBuildThisFileDirectory)..\..\build\obj\Skins\$(ProjectName)\ + true + false + true + + + + false + Windows + true + true + true + + + diff --git a/Src/Skins/SmokedGlass/SmokedGlass.vcxproj b/Src/Skins/SmokedGlass/SmokedGlass.vcxproj index 51626e5d9..13b8806a5 100644 --- a/Src/Skins/SmokedGlass/SmokedGlass.vcxproj +++ b/Src/Skins/SmokedGlass/SmokedGlass.vcxproj @@ -13,35 +13,22 @@ 10.0 - + DynamicLibrary - v142 + $(DefaultPlatformToolset) Unicode - - + + - - $(SolutionDir)StartMenu\Skins\ - $(Configuration)\ - true - false + .skin Smoked Glass - - - false - Windows - true - true - true - - diff --git a/Src/Skins/Win7Aero/Win7Aero.vcxproj b/Src/Skins/Win7Aero/Win7Aero.vcxproj index ba959e561..26c74a44a 100644 --- a/Src/Skins/Win7Aero/Win7Aero.vcxproj +++ b/Src/Skins/Win7Aero/Win7Aero.vcxproj @@ -13,35 +13,22 @@ 10.0 - + DynamicLibrary - v142 + $(DefaultPlatformToolset) Unicode - - + + - - $(SolutionDir)StartMenu\Skins\ - $(Configuration)\ - true - false + .skin Windows Aero - - - false - Windows - true - true - true - - diff --git a/Src/Skins/Win7Aero7/Win7Aero7.vcxproj b/Src/Skins/Win7Aero7/Win7Aero7.vcxproj index 8a532dfa1..095805b4f 100644 --- a/Src/Skins/Win7Aero7/Win7Aero7.vcxproj +++ b/Src/Skins/Win7Aero7/Win7Aero7.vcxproj @@ -13,35 +13,22 @@ 10.0 - + DynamicLibrary - v142 + $(DefaultPlatformToolset) Unicode - - + + - - $(SolutionDir)StartMenu\Skins\ - $(Configuration)\ - false - true + Windows Aero .skin7 - - - false - Windows - true - true - true - - diff --git a/Src/Skins/Win7Basic/Win7Basic.vcxproj b/Src/Skins/Win7Basic/Win7Basic.vcxproj index d87982c42..5ee2fc598 100644 --- a/Src/Skins/Win7Basic/Win7Basic.vcxproj +++ b/Src/Skins/Win7Basic/Win7Basic.vcxproj @@ -13,35 +13,22 @@ 10.0 - + DynamicLibrary - v142 + $(DefaultPlatformToolset) Unicode - - + + - - $(SolutionDir)StartMenu\Skins\ - $(Configuration)\ - true - false + .skin Windows Basic - - - false - Windows - true - true - true - - diff --git a/Src/Skins/Win8/Win8.vcxproj b/Src/Skins/Win8/Win8.vcxproj index a5c88b1b5..7928d8651 100644 --- a/Src/Skins/Win8/Win8.vcxproj +++ b/Src/Skins/Win8/Win8.vcxproj @@ -13,35 +13,22 @@ 10.0 - + DynamicLibrary - v142 + $(DefaultPlatformToolset) Unicode - - + + - - $(SolutionDir)StartMenu\Skins\ - $(Configuration)\ - true - false + .skin Windows 8 - - - false - Windows - true - true - true - - diff --git a/Src/Skins/Win87/Win87.vcxproj b/Src/Skins/Win87/Win87.vcxproj index d9d4783e2..1becc0f77 100644 --- a/Src/Skins/Win87/Win87.vcxproj +++ b/Src/Skins/Win87/Win87.vcxproj @@ -13,35 +13,22 @@ 10.0 - + DynamicLibrary - v142 + $(DefaultPlatformToolset) Unicode - - + + - - $(SolutionDir)StartMenu\Skins\ - $(Configuration)\ - true - false + Windows 8 .skin7 - - - false - Windows - true - true - true - - diff --git a/Src/Skins/WinXP/WinXP.vcxproj b/Src/Skins/WinXP/WinXP.vcxproj index f53129389..e790f9629 100644 --- a/Src/Skins/WinXP/WinXP.vcxproj +++ b/Src/Skins/WinXP/WinXP.vcxproj @@ -13,35 +13,22 @@ 10.0 - + DynamicLibrary - v142 + $(DefaultPlatformToolset) Unicode - - + + - - $(SolutionDir)StartMenu\Skins\ - $(Configuration)\ - true - false + .skin Windows XP Luna - - - false - Windows - true - true - true - - diff --git a/Src/StartMenu/StartMenu.cpp b/Src/StartMenu/StartMenu.cpp index 94cfef449..a1abea443 100644 --- a/Src/StartMenu/StartMenu.cpp +++ b/Src/StartMenu/StartMenu.cpp @@ -561,6 +561,7 @@ int WINAPI wWinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpstrC else if (wcsstr(lpstrCmdLine,L"-toggle")!=NULL) open=MSG_TOGGLE; else if (wcsstr(lpstrCmdLine,L"-open")!=NULL) open=MSG_OPEN; else if (wcsstr(lpstrCmdLine,L"-settings")!=NULL) open=MSG_SETTINGS; + else if (wcsstr(lpstrCmdLine,L"-reloadsettings")!=NULL) open=MSG_RELOADSETTINGS; else if (wcsstr(lpstrCmdLine,L"-exit")!=NULL) open=MSG_EXIT; { diff --git a/Src/StartMenu/StartMenu.rc b/Src/StartMenu/StartMenu.rc index f2c965607..00b951f3c 100644 --- a/Src/StartMenu/StartMenu.rc +++ b/Src/StartMenu/StartMenu.rc @@ -52,14 +52,6 @@ END // Version // -// Solution loading fail-safe -#ifndef _PRODUCT_VERSION -#define _PRODUCT_VERSION 4.4.102 -#endif -#ifndef _PRODUCT_VERSION_STR -#define _PRODUCT_VERSION_STR "4.4.102" -#endif - VS_VERSION_INFO VERSIONINFO FILEVERSION _PRODUCT_VERSION PRODUCTVERSION _PRODUCT_VERSION diff --git a/Src/StartMenu/StartMenu.vcxproj b/Src/StartMenu/StartMenu.vcxproj index fa4f31e73..96d346e4c 100644 --- a/Src/StartMenu/StartMenu.vcxproj +++ b/Src/StartMenu/StartMenu.vcxproj @@ -1,6 +1,10 @@ + + Debug + ARM64 + Debug Win32 @@ -9,6 +13,10 @@ Debug x64 + + Release + ARM64 + Release Win32 @@ -17,6 +25,10 @@ Release x64 + + Setup + ARM64 + Setup Win32 @@ -33,246 +45,20 @@ 10.0 - - Application - v142 - Static - Unicode - true - - - Application - v142 - Static - Unicode - true - - - Application - v142 - Static - Unicode - - + Application - v142 - Static - Unicode - true - - - Application - v142 - Static - Unicode - true - - - Application - v142 + $(DefaultPlatformToolset) Static Unicode + true - - - - - - - - - - - - - - - - - - - - - - - + + - - $(Configuration)\ - $(Configuration)\ - true - - - $(Configuration)64\ - $(Configuration)64\ - true - - - $(Configuration)\ - $(Configuration)\ - false - - - $(Configuration)64\ - $(Configuration)64\ - false - - - $(Configuration)\ - $(Configuration)\ - false - - - $(Configuration)64\ - $(Configuration)64\ - false - - - - Disabled - ..\Lib;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - Use - Level3 - EditAndContinue - true - true - stdcpp17 - - - _DEBUG;%(PreprocessorDefinitions) - - - true - Windows - - - - - Disabled - ..\Lib;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - Use - Level3 - ProgramDatabase - true - true - stdcpp17 - - - _DEBUG;%(PreprocessorDefinitions) - - - true - Windows - - - - - MaxSpeed - ..\Lib;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) - MultiThreaded - true - Use - Level3 - ProgramDatabase - true - true - stdcpp17 - - - NDEBUG;%(PreprocessorDefinitions) - - - true - Windows - true - true - - - - - MaxSpeed - ..\Lib;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) - MultiThreaded - true - Use - Level3 - ProgramDatabase - true - true - stdcpp17 - - - NDEBUG;%(PreprocessorDefinitions) - - - true - Windows - true - true - - - - - MaxSpeed - ..\Lib;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_WINDOWS;BUILD_SETUP;%(PreprocessorDefinitions) - MultiThreaded - true - Use - Level3 - true - ProgramDatabase - true - true - stdcpp17 - - - NDEBUG;%(PreprocessorDefinitions) - - - true - Windows - true - true - - - - - MaxSpeed - ..\Lib;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_WINDOWS;BUILD_SETUP;%(PreprocessorDefinitions) - MultiThreaded - true - Use - Level3 - true - ProgramDatabase - true - true - stdcpp17 - - - NDEBUG;%(PreprocessorDefinitions) - - - true - Windows - true - true - - @@ -300,7 +86,9 @@ - + + PreserveNewest + @@ -319,6 +107,14 @@ {066c9721-26d5-4c4d-868e-50c2ba0a8196} false + + {75809d15-8403-420a-bbe6-05f478d88d8e} + false + + + {bd28b058-230e-42df-9fb1-ffbb0153f498} + false + {ca5bfc96-428d-42f5-9f7d-cdde048a357c} false diff --git a/Src/StartMenu/StartMenuDLL/CustomMenu.cpp b/Src/StartMenu/StartMenuDLL/CustomMenu.cpp index 8d8785e38..8e7875c74 100644 --- a/Src/StartMenu/StartMenuDLL/CustomMenu.cpp +++ b/Src/StartMenu/StartMenuDLL/CustomMenu.cpp @@ -94,14 +94,14 @@ CStdCommand7 g_StdCommands7[]={ {L"user_music",0,NULL,L"$Menu.UserMusicTip",NULL,&FOLDERID_Music}, {L"user_videos",0,NULL,L"$Menu.UserVideosTip",NULL,&FOLDERID_Videos}, {L"control_panel",0,L"$Menu.ControlPanel",L"$Menu.ControlPanelTip",NULL,&FOLDERID_ControlPanelFolder,NULL,StdMenuItem::MENU_TRACK}, - {L"pc_settings",IDS_PCSETTINGS,L"$Menu.PCSettings",L"",L"%windir%\\ImmersiveControlPanel\\SystemSettings.exe,10",NULL,NULL,StdMenuItem::MENU_TRACK,CStdCommand7::ITEM_SINGLE}, - {L"network_connections",0,NULL,L"$Menu.NetworkTip",NULL,&FOLDERID_ConnectionsFolder}, + {L"pc_settings",IDS_PCSETTINGS,L"$Menu.PCSettings",L"",NULL,NULL,L"shell:appsfolder\\windows.immersivecontrolpanel_cw5n1h2txyewy!microsoft.windows.immersivecontrolpanel",StdMenuItem::MENU_TRACK,CStdCommand7::ITEM_SINGLE}, + {L"network_connections",0,NULL,L"$Menu.NetworkTip",NULL,&FOLDERID_ConnectionsFolder,NULL,0,CStdCommand7::ITEM_NODRIVES}, {L"network",0,NULL,NULL,NULL,&FOLDERID_NetworkFolder,NULL,0,CStdCommand7::ITEM_SINGLE}, - {L"printers",0,NULL,L"$Menu.PrintersTip",NULL,&FOLDERID_PrintersFolder}, + {L"printers",0,NULL,L"$Menu.PrintersTip",NULL,&FOLDERID_PrintersFolder,NULL,0,CStdCommand7::ITEM_NODRIVES}, {L"fonts",0,NULL,NULL,NULL,&FOLDERID_Fonts}, {L"desktop",0,NULL,NULL,NULL,&FOLDERID_Desktop}, - {L"admin",0,NULL,L"$Menu.AdminToolsTip",L"imageres.dll,114",&FOLDERID_CommonAdminTools,NULL,StdMenuItem::MENU_TRACK}, - {L"startup",0,NULL,NULL,NULL,&FOLDERID_Startup,NULL,StdMenuItem::MENU_TRACK}, + {L"admin",0,NULL,L"$Menu.AdminToolsTip",L"imageres.dll,114",&FOLDERID_CommonAdminTools,NULL,StdMenuItem::MENU_TRACK,CStdCommand7::ITEM_NODRIVES}, + {L"startup",0,NULL,NULL,NULL,&FOLDERID_Startup,NULL,StdMenuItem::MENU_TRACK,CStdCommand7::ITEM_NODRIVES}, {L"downloads",0,NULL,L"$Menu.DownloadTip",NULL,&FOLDERID_Downloads}, {L"games",0,NULL,L"$Menu.GamesTip",NULL,&FOLDERID_Games,NULL,StdMenuItem::MENU_TRACK}, {L"links",0,NULL,NULL,NULL,&FOLDERID_Links}, @@ -112,7 +112,7 @@ CStdCommand7 g_StdCommands7[]={ {L"lib_videos",IDS_LIB_VIDEOS_ITEM,NULL,L"$Menu.VideosLibTip",NULL,&FOLDERID_VideosLibrary}, {L"lib_tv",IDS_LIB_TV_ITEM,NULL,L"$Menu.RecordingsLibTip",NULL,&FOLDERID_RecordedTVLibrary}, {L"homegroup",0,NULL,L"$Menu.HomegroupTip",NULL,&FOLDERID_HomeGroup,NULL,0,CStdCommand7::ITEM_SINGLE}, - {L"devices",0,NULL,NULL,NULL,NULL,L"::{26EE0668-A00A-44D7-9371-BEB064C98683}\\0\\::{A8A91A66-3A7D-4424-8D24-04E180695C7A}"}, + {L"devices",0,NULL,NULL,NULL,NULL,L"::{26EE0668-A00A-44D7-9371-BEB064C98683}\\0\\::{A8A91A66-3A7D-4424-8D24-04E180695C7A}",0,CStdCommand7::ITEM_NODRIVES}, {L"defaults",0,NULL,NULL,NULL,NULL,L"::{26EE0668-A00A-44D7-9371-BEB064C98683}\\0\\::{17CD9488-1228-4B2F-88CE-4298E93E0966}",0,CStdCommand7::ITEM_SINGLE}, {L"apps",IDS_METRO_APPS,L"$Menu.Apps",NULL,L",2",NULL,NULL,StdMenuItem::MENU_TRACK,CStdCommand7::ITEM_FOLDER}, diff --git a/Src/StartMenu/StartMenuDLL/CustomMenu.h b/Src/StartMenu/StartMenuDLL/CustomMenu.h index f2cec3f44..8ecc02df4 100644 --- a/Src/StartMenu/StartMenuDLL/CustomMenu.h +++ b/Src/StartMenu/StartMenuDLL/CustomMenu.h @@ -15,6 +15,7 @@ struct CStdCommand7 ITEM_SINGLE=1, // this item never has sub-menu ITEM_FOLDER=2, // this item always has sub-menu ITEM_COMPUTER=4, // this item can be expanded only one level + ITEM_NODRIVES=8, // this item can never be expanded only one level }; const wchar_t *command; int nameID; diff --git a/Src/StartMenu/StartMenuDLL/ItemManager.cpp b/Src/StartMenu/StartMenuDLL/ItemManager.cpp index 3d756b57b..a2d403bbf 100644 --- a/Src/StartMenu/StartMenuDLL/ItemManager.cpp +++ b/Src/StartMenu/StartMenuDLL/ItemManager.cpp @@ -136,6 +136,8 @@ static void CreateAppResolver( void ) static bool DetectGrayscaleImage( const unsigned int *bits, int stride, int width, int height ) { + if (width==0 || height==0) + return false; int transparent=0; for (int y=0;y resMap; if (SUCCEEDED(resManager->GetMainResourceMap(IID_PPV_ARGS(&resMap)))) { + CComPtr resContext; + if (SUCCEEDED(resManager->GetDefaultContext(IID_PPV_ARGS(&resContext)))) + resContext->SetTargetSize(GetIconSize(iconSizeType)); + CComString location; if (SUCCEEDED(resMap->GetFilePath(logoUri, &location))) return GetCustomIcon(location, -65536, iconSizeType, true); @@ -2867,7 +2882,8 @@ void CItemManager::PreloadItemsThread( void ) else if (g_CacheFolders[i].folder==FOLDERID_ClassicPinned) { if (GetSettingInt(L"PinnedPrograms")!=PINNED_PROGRAMS_PINNED) continue; - wchar_t path[_MAX_PATH]=START_MENU_PINNED_ROOT; + wchar_t path[_MAX_PATH]; + Strcpy(path,_countof(path),GetSettingString(L"PinnedItemsPath")); DoEnvironmentSubst(path,_countof(path)); if (FAILED(SHParseDisplayName(path,NULL,&pidl,0,NULL)) || !pidl) continue; if (FAILED(SHCreateItemFromIDList(pidl,IID_IShellItem,(void**)&pFolder)) || !pFolder) continue; @@ -3575,6 +3591,26 @@ void CItemManager::ClearCache( void ) item.extraLargeIcon=m_DefaultExtraLargeIcon; } +int CItemManager::GetIconSize(TIconSizeType iconSizeType) const +{ + switch (iconSizeType) + { + case ICON_SIZE_TYPE_SMALL: + case ICON_SIZE_TYPE_SMALL_METRO: + return SMALL_ICON_SIZE; + + case ICON_SIZE_TYPE_LARGE: + case ICON_SIZE_TYPE_LARGE_METRO: + return LARGE_ICON_SIZE; + + case ICON_SIZE_TYPE_EXTRA_LARGE: + case ICON_SIZE_TYPE_EXTRA_LARGE_METRO: + return EXTRA_LARGE_ICON_SIZE; + } + + return 0; +} + // retrieves the pidl and the SFGAO_FOLDER, SFGAO_STREAM, SFGAO_LINK flags for the path // for paths starting with \\ tries to guess if it is a folder or a link based on the extension HRESULT MenuParseDisplayName( const wchar_t *path, PIDLIST_ABSOLUTE *pPidl, SFGAOF *pFlags, TNetworkType *pNetworkType ) diff --git a/Src/StartMenu/StartMenuDLL/ItemManager.h b/Src/StartMenu/StartMenuDLL/ItemManager.h index 71666e505..e10775bdf 100644 --- a/Src/StartMenu/StartMenuDLL/ItemManager.h +++ b/Src/StartMenu/StartMenuDLL/ItemManager.h @@ -51,6 +51,8 @@ class CItemManager ICON_SIZE_COUNT }; + int GetIconSize(TIconSizeType iconSizeType) const; + struct IconInfo { TIconSizeType sizeType; @@ -381,7 +383,7 @@ class CItemManager static DWORD CALLBACK StaticRefreshInfoThread( void *param ); static DWORD CALLBACK SaveCacheFileThread( void *param ); - // all paths are in caps and end with \ + // all paths are in caps and end with backslash CString m_RootStartMenu1; CString m_RootStartMenu2; CString m_RootStartMenu3; @@ -470,7 +472,6 @@ STDAPI ShGetKnownFolderItem(REFKNOWNFOLDERID rfid, IShellItem **ppItem ); HBITMAP ColorizeMonochromeImage(HBITMAP bitmap, DWORD color); #define TASKBAR_PINNED_ROOT L"%APPDATA%\\Microsoft\\Internet Explorer\\Quick Launch\\User Pinned\\TaskBar" -#define START_MENU_PINNED_ROOT L"%APPDATA%\\OpenShell\\Pinned" #define STARTSCREEN_COMMAND L"startscreen.lnk" #define USERASSIST_LINKS_KEY L"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\UserAssist\\{F4E57C4B-2036-45F0-A9AB-443BCFE33D9F}\\Count" #define USERASSIST_APPIDS_KEY L"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\UserAssist\\{CEBFF5CD-ACE2-4F4F-9178-9926F41749EA}\\Count" diff --git a/Src/StartMenu/StartMenuDLL/MenuCommands.cpp b/Src/StartMenu/StartMenuDLL/MenuCommands.cpp index 2f6acd026..613bd95a0 100644 --- a/Src/StartMenu/StartMenuDLL/MenuCommands.cpp +++ b/Src/StartMenu/StartMenuDLL/MenuCommands.cpp @@ -11,6 +11,7 @@ #include "Settings.h" #include "SettingsUI.h" #include "SettingsUIHelper.h" +#include "FileHelper.h" #include "Translations.h" #include "LogManager.h" #include "FNVHash.h" @@ -60,17 +61,24 @@ static INT_PTR CALLBACK RenameDlgProc( HWND hwndDlg, UINT uMsg, WPARAM wParam, L return FALSE; } -static void SetShutdownPrivileges( void ) +static bool SetShutdownPrivileges() { + bool retval = false; + HANDLE hToken; - if (OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY,&hToken)) + if (OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY, &hToken)) { TOKEN_PRIVILEGES tp={1}; - if (LookupPrivilegeValue(NULL,L"SeShutdownPrivilege",&tp.Privileges[0].Luid)) - tp.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED; - AdjustTokenPrivileges(hToken,FALSE,&tp,sizeof(TOKEN_PRIVILEGES),NULL,NULL); + if (LookupPrivilegeValue(NULL, L"SeShutdownPrivilege", &tp.Privileges[0].Luid)) + { + tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; + if (AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(TOKEN_PRIVILEGES), NULL, NULL) && GetLastError() == ERROR_SUCCESS) + retval = true; + } CloseHandle(hToken); } + + return retval; } static void DoSearchSubst( wchar_t *buf, int size, const wchar_t *search ) @@ -657,10 +665,337 @@ class ExitGuard bool m_bArmed; }; -#ifndef EWX_HYBRID_SHUTDOWN -#define EWX_HYBRID_SHUTDOWN 0x00400000 -#endif -#define EWX_INSTALL_UPDATES 0x00100000 // undocumented switch to install updates on shutdown +// Win10 +MIDL_INTERFACE("833EE9A0-2999-432C-8EF2-87A8EC2D748D") +IUxUpdateManager_Win10 : public IUnknown +{ + STDMETHOD(GetUxStateVariableBOOL)(enum UxUpdateStateVariable, int*, int*); + STDMETHOD(GetUxStateVariableDWORD)(UxUpdateStateVariable, DWORD*, int*); + STDMETHOD(GetUxStateVariableSYSTEMTIME)(UxUpdateStateVariable, SYSTEMTIME*, int*); + STDMETHOD(SetUxStateVariableBOOL)(UxUpdateStateVariable, int); + STDMETHOD(SetUxStateVariableDWORD)(UxUpdateStateVariable, DWORD); + STDMETHOD(SetUxStateVariableSYSTEMTIME)(UxUpdateStateVariable, SYSTEMTIME); + STDMETHOD(DeleteUxStateVariable)(UxUpdateStateVariable); + STDMETHOD(GetNextRebootTaskRunTime)(int*, SYSTEMTIME*); + STDMETHOD(CreateRebootTasks)(const wchar_t*, SYSTEMTIME); + STDMETHOD(CreateUpdateResultsTaskSchedule)(void); + STDMETHOD(CreateMigrationResultsTaskSchedule)(void); + STDMETHOD(CreateUpdateLogonNotificationTaskSchedule)(void); + STDMETHOD(CreateUpdateNotificationTaskSchedule)(SYSTEMTIME); + STDMETHOD(CreateLogonRebootTaskSchedule)(void); + STDMETHOD(DidUXRebootTaskWakeUpDevice)(int*); + STDMETHOD(RemoveUpdateResultsTaskSchedule)(void); + STDMETHOD(RemoveLogonRebootTaskSchedule)(void); + STDMETHOD(RemoveMigrationResultsTaskSchedule)(void); + STDMETHOD(EnableRebootTasks)(void); + STDMETHOD(DisableRebootTasks)(void); + STDMETHOD(ValidateAndRecoverRebootTasks)(void); + STDMETHOD(RebootToCompleteInstall)(DWORD, int, DWORD*, short, short, DWORD); + STDMETHOD(IsRestartAllowed)(DWORD, int, DWORD, int*); + STDMETHOD(GetIsWaaSOutOfDate)(DWORD, int, int, int*, DWORD*); + STDMETHOD(GetWaaSHoursOutOfDate)(int, int, DWORD*); + STDMETHOD(GetCachedPolicy)(DWORD, VARIANT*, DWORD*, DWORD*); + STDMETHOD(GetEnterpriseCachedPolicy)(DWORD, VARIANT*, DWORD*, DWORD*); + STDMETHOD(GetCachedSettingValue)(DWORD, short, VARIANT*); + STDMETHOD(GetOptInToMU)(int*); + STDMETHOD(SetOptInToMU)(int); + STDMETHOD(SetAndModifyShutdownFlags)(DWORD, DWORD*); + STDMETHOD(GetIsFlightingEnabled)(int*); + STDMETHOD(GetIsCTA)(int*); + STDMETHOD(NotifyStateVariableChange)(void); + STDMETHOD(GetAlwaysAllowMeteredNetwork)(int*); +}; + +// Win11 +MIDL_INTERFACE("B96BA95F-9479-4656-B7A1-6F3A69091910") +IUxUpdateManager_Win11 : public IUnknown +{ + STDMETHOD(GetUxStateVariableBOOL)(enum UxUpdateStateVariable, int*, int*); + STDMETHOD(GetUxStateVariableDWORD)(UxUpdateStateVariable, DWORD*, int*); + STDMETHOD(GetUxStateVariableSYSTEMTIME)(UxUpdateStateVariable, SYSTEMTIME*, int*); + STDMETHOD(SetUxStateVariableBOOL)(UxUpdateStateVariable, int); + STDMETHOD(SetUxStateVariableDWORD)(UxUpdateStateVariable, DWORD); + STDMETHOD(SetUxStateVariableSYSTEMTIME)(UxUpdateStateVariable, SYSTEMTIME); + STDMETHOD(DeleteUxStateVariable)(UxUpdateStateVariable); + STDMETHOD(GetNextScheduledRebootTaskRunTime)(SYSTEMTIME*); + STDMETHOD(GetIsRebootTaskScheduledToRun)(int*); + STDMETHOD(CreateRebootTasks)(const wchar_t*, SYSTEMTIME); + STDMETHOD(CreateUpdateResultsTaskSchedule)(void); + STDMETHOD(CreateMigrationResultsTaskSchedule)(void); + STDMETHOD(CreateUpdateLogonNotificationTaskSchedule)(void); + STDMETHOD(CreateUpdateNotificationTaskSchedule)(SYSTEMTIME); + STDMETHOD(CreateLogonRebootTaskSchedule)(void); + STDMETHOD(DidUXRebootTaskWakeUpDevice)(int*); + STDMETHOD(RemoveUpdateResultsTaskSchedule)(void); + STDMETHOD(RemoveLogonRebootTaskSchedule)(void); + STDMETHOD(RemoveMigrationResultsTaskSchedule)(void); + STDMETHOD(EnableRebootTasks)(void); + STDMETHOD(DisableRebootTasks)(void); + STDMETHOD(ValidateAndRecoverRebootTasks)(void); + STDMETHOD(RebootToCompleteInstall)(DWORD, int, DWORD*, int, int, double); + STDMETHOD(IsRestartAllowed)(DWORD, int, double, int*); + STDMETHOD(GetIsWaaSOutOfDate)(DWORD, int, int, int*, DWORD*); + STDMETHOD(GetWaaSHoursOutOfDate)(int, int, DWORD*); + STDMETHOD(GetDeviceEndOfServiceDate)(int, int*, FILETIME*); + STDMETHOD(GetCachedPolicy)(DWORD, VARIANT*, DWORD*, DWORD*); + STDMETHOD(GetEnterpriseCachedPolicy)(DWORD, VARIANT*, DWORD*, DWORD*); + STDMETHOD(GetOptInToMU)(int*); + STDMETHOD(SetOptInToMU)(int); + STDMETHOD(SetAndModifyShutdownFlags)(DWORD, DWORD*); + STDMETHOD(GetIsFlightingEnabled)(int*); + STDMETHOD(GetIsCTA)(int*); + STDMETHOD(NotifyStateVariableChange)(void); + STDMETHOD(GetAlwaysAllowMeteredNetwork)(int*); + STDMETHOD(SetInstallAtShutdown)(int); + STDMETHOD(GetUxStateVariableValueOrDefaultBOOL)(UxUpdateStateVariable, int, int*); + STDMETHOD(GetUxStateVariableValueOrDefaultDWORD)(UxUpdateStateVariable, DWORD, DWORD*); + STDMETHOD(GetUxStateVariableValueOrDefaultSYSTEMTIME)(UxUpdateStateVariable, SYSTEMTIME, SYSTEMTIME*); + STDMETHOD(GetSuggestedRebootTime)(int, SYSTEMTIME, SYSTEMTIME*, int*); + STDMETHOD(GetSuggestedActiveHours)(DWORD, DWORD*, DWORD*, int*); + STDMETHOD(GetIsIntervalAcceptableForActiveHours)(SYSTEMTIME, SYSTEMTIME, int*); + STDMETHOD(GetSmartScheduledPredictionsAccurate)(int*); + STDMETHOD(EvaluateAndStoreRebootDowntimePrediction)(void); + STDMETHOD(GetCachedRebootDowntimePrediction)(DWORD*); + STDMETHOD(GetAlwaysAllowCTADownload)(int*); +}; + +MIDL_INTERFACE("07F3AFAC-7C8A-4CE7-A5E0-3D24EE8A77E0") +IUpdateSessionOrchestrator : public IUnknown +{ + STDMETHOD(CreateUpdateSession)(enum UpdateSessionType, const GUID&, void**); + STDMETHOD(GetCurrentActiveUpdateSessions)(class IUsoSessionCollection**); + STDMETHOD(LogTaskRunning)(const wchar_t*); + STDMETHOD(CreateUxUpdateManager)(IUnknown**); +}; + +DWORD WindowsUpdateAdjustShutdownFlags(DWORD flags) +{ + DWORD retval = flags; + + { + // "EnhancedShutdownEnabled" value must exist if Windows updates are prepared + // otherwise there is no need to do anything + + CRegKey key; + if (key.Open(HKEY_LOCAL_MACHINE, L"SOFTWARE\\Microsoft\\WindowsUpdate\\Orchestrator", KEY_READ) != ERROR_SUCCESS) + return retval; + + DWORD value; + if (key.QueryDWORDValue(L"EnhancedShutdownEnabled", value) != ERROR_SUCCESS) + return retval; + } + + // this is what standard Windows shutdown handling does inside shutdownux!UsoCommitHelper::SetAndModifyShutdownFlags + + static const GUID CLSID_UpdateSessionOrchestrator = { 0xb91d5831,0xb1bd,0x4608,{0x81,0x98,0xd7,0x2e,0x15,0x50,0x20,0xf7} }; + + CComPtr updateSessionOrchestrator; + if (SUCCEEDED(updateSessionOrchestrator.CoCreateInstance(CLSID_UpdateSessionOrchestrator, nullptr, CLSCTX_LOCAL_SERVER))) + { + CComPtr mgr; + if (SUCCEEDED(updateSessionOrchestrator->CreateUxUpdateManager(&mgr))) + { + // call to IUxUpdateManager::SetAndModifyShutdownFlags will ensure that Windows updates will be dismissed if there is no `SHUTDOWN_INSTALL_UPDATES` flag provided + // it also provides recommended shutdown flags in some cases (so we will use them as advised) + // + // the method is implemented by `UxUpdateManager::SetAndModifyShutdownFlags` in `usosvc.dll` (Win10) / `usosvcimpl.dll` (Win11) + + if (CComPtr updateManager; SUCCEEDED(mgr.QueryInterface(&updateManager))) + { + DWORD newFlags; + if (SUCCEEDED(updateManager->SetAndModifyShutdownFlags(flags, &newFlags))) + retval = newFlags; + } + else if (CComPtr updateManager; SUCCEEDED(mgr.QueryInterface(&updateManager))) + { + DWORD newFlags; + if (SUCCEEDED(updateManager->SetAndModifyShutdownFlags(flags, &newFlags))) + retval = newFlags; + } + } + } + + return retval; +} + +static TOKEN_ELEVATION_TYPE GetCurrentTokenElevationType() +{ + TOKEN_ELEVATION_TYPE retval = TokenElevationTypeDefault; + + HANDLE token; + if (OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &token)) + { + TOKEN_ELEVATION_TYPE elevationType; + DWORD returnLength; + if (GetTokenInformation(token, TokenElevationType, &elevationType, sizeof(elevationType), &returnLength) && returnLength == sizeof(elevationType)) + retval = elevationType; + + CloseHandle(token); + } + + return retval; +} + +static BOOL WINAPI WinStationGetLoggedOnCount(ULONG* pUserSessions, ULONG* pDeviceSessions) +{ + static auto p = static_cast((void*)GetProcAddress(GetModuleHandle(L"winsta.dll"), "WinStationGetLoggedOnCount")); + if (p) + return p(pUserSessions, pDeviceSessions); + + // fall-back + return FALSE; +} + +static bool ProceedWithShutdown(DWORD flags) +{ + // this logic is inspired by user32!DisplayExitWindowsWarnings function (called from ExitWindowsEx) + + ULONG userSessions = 0; + ULONG deviceSessions = 0; + + WinStationGetLoggedOnCount(&userSessions, &deviceSessions); + + // we can proceed if there is at most one user session and no device sessions + if (userSessions <= 1 && deviceSessions == 0) + return true; + + // otherwise inform user that somebody else is using the machine and ask for confirmation + + UINT msgId = 0; + + if (flags & SHUTDOWN_RESTART) + { + if (userSessions <= 1) + msgId = 755; // One or more devices on your network are using the computer resources. Restarting Windows might cause them to lose data. + else if (deviceSessions != 0) + msgId = 756; // Other people and devices are using the computer resources. Restarting Windows might cause them to lose data. + else + msgId = 714; // Other people are logged on to this computer. Restarting Windows might cause them to lose data. + } + else + { + if (userSessions <= 1) + msgId = 753; // One or more devices on your network are using the computer resources.Shutting down Windows might cause them to lose data. + else if (deviceSessions != 0) + msgId = 754; // Other people and devices are are using the computer resources. Shutting down Windows might cause them to lose data. + else + msgId = 713; // Other people are logged on to this computer. Shutting down Windows might cause them to lose data. + } + + WCHAR message[MAX_PATH]{}; + LoadString(GetModuleHandle(L"user32.dll"), msgId, message, _countof(message)); + + return MessageBox(NULL, message, L"Open-Shell", MB_YESNO | MB_ICONEXCLAMATION | MB_DEFBUTTON1 | MB_SYSTEMMODAL | MB_SETFOREGROUND | MB_SERVICE_NOTIFICATION) != IDNO; +} + +static bool ExecuteShutdownCommand(TMenuID menuCommand) +{ + DWORD flags = 0; + + switch (menuCommand) + { + case MENU_RESTART: // restart + case MENU_RESTART_NOUPDATE: + case MENU_RESTART_UPDATE: // update and restart + case MENU_RESTART_ADVANCED: // advanced restart + flags = SHUTDOWN_RESTART; + + if (menuCommand == MENU_RESTART_UPDATE) + flags |= SHUTDOWN_INSTALL_UPDATES; + + if (menuCommand == MENU_RESTART_ADVANCED) + flags |= SHUTDOWN_RESTART_BOOTOPTIONS; + + break; + + case MENU_SHUTDOWN: // shutdown + case MENU_SHUTDOWN_NOUPDATE: + case MENU_SHUTDOWN_UPDATE: // update and shutdown + case MENU_SHUTDOWN_HYBRID: // hybrid shutdown + flags = SHUTDOWN_POWEROFF; + + if (menuCommand == MENU_SHUTDOWN_UPDATE) + flags |= SHUTDOWN_INSTALL_UPDATES; + + if (menuCommand == MENU_SHUTDOWN_HYBRID) + { + CRegKey regPower; + if (regPower.Open(HKEY_LOCAL_MACHINE, L"SYSTEM\\CurrentControlSet\\Control\\Session Manager\\Power", KEY_READ) == ERROR_SUCCESS) + { + DWORD val = 0; + if (regPower.QueryDWORDValue(L"HiberbootEnabled", val) == ERROR_SUCCESS && val == 1) + flags |= SHUTDOWN_HYBRID; + } + } + break; + } + + if (flags) + { + if (!ProceedWithShutdown(flags)) + return true; + + flags |= SHUTDOWN_FORCE_OTHERS; + + if (SetShutdownPrivileges()) + { + flags = WindowsUpdateAdjustShutdownFlags(flags); + InitiateShutdown(NULL, NULL, 0, flags, SHTDN_REASON_FLAG_PLANNED); + } + else + { + // we don't have shutdown rights + // lets try silent elevate via SystemSettingsAdminFlows (for limited admin users only) + if (GetCurrentTokenElevationType() == TokenElevationTypeLimited) + { + flags = WindowsUpdateAdjustShutdownFlags(flags); + + wchar_t cmdLine[32]{}; + Sprintf(cmdLine, _countof(cmdLine), L"Shutdown %d %d", flags, SHTDN_REASON_FLAG_PLANNED); + + SHELLEXECUTEINFO sei{}; + sei.cbSize = sizeof(sei); + sei.lpFile = L"%systemroot%\\system32\\SystemSettingsAdminFlows.exe"; + sei.lpParameters = cmdLine; + sei.lpVerb = L"runas"; + sei.fMask = SEE_MASK_DOENVSUBST | SEE_MASK_FLAG_NO_UI; + + ShellExecuteEx(&sei); + } + } + + return true; + } + + return false; +} + +NTSTATUS +NTAPI +NtPowerInformation( + _In_ POWER_INFORMATION_LEVEL InformationLevel, + _In_reads_bytes_opt_(InputBufferLength) PVOID InputBuffer, + _In_ ULONG InputBufferLength, + _Out_writes_bytes_opt_(OutputBufferLength) PVOID OutputBuffer, + _In_ ULONG OutputBufferLength +); + +static bool ConnectedStandby() +{ + SYSTEM_POWER_CAPABILITIES powerCaps{}; + GetPwrCapabilities(&powerCaps); + + if (powerCaps.AoAc) + { + static auto pNtPowerInformation = static_cast((void*)GetProcAddress(GetModuleHandle(L"ntdll.dll"), "NtPowerInformation")); + if (pNtPowerInformation) + pNtPowerInformation(ScreenOff, NULL, 0, NULL, 0); + + return true; + } + + return false; +} static bool ExecuteSysCommand( TMenuID menuCommand ) { @@ -800,40 +1135,6 @@ static bool ExecuteSysCommand( TMenuID menuCommand ) } return true; - case MENU_RESTART: // restart - case MENU_RESTART_NOUPDATE: - SetShutdownPrivileges(); - ExitWindowsEx(EWX_REBOOT,SHTDN_REASON_FLAG_PLANNED); - return true; - - case MENU_RESTART_ADVANCED: // advanced restart - if (GetWinVersion()>=WIN_VER_WIN8) - { - STARTUPINFO startupInfo={sizeof(startupInfo)}; - PROCESS_INFORMATION processInfo; - memset(&processInfo,0,sizeof(processInfo)); - wchar_t exe[_MAX_PATH]=L"%windir%\\system32\\shutdown.exe"; - DoEnvironmentSubst(exe,_countof(exe)); - if (CreateProcess(exe,(LPWSTR)L"shutdown.exe /r /o /t 0",NULL,NULL,FALSE,CREATE_NO_WINDOW,NULL,NULL,&startupInfo,&processInfo)) - { - CloseHandle(processInfo.hThread); - CloseHandle(processInfo.hProcess); - } - } - else - ExitWindowsEx(EWX_REBOOT,SHTDN_REASON_FLAG_PLANNED); - return true; - - case MENU_RESTART_UPDATE: // update and restart - { - UINT flags=EWX_REBOOT; - if (GetWinVersion()>=WIN_VER_WIN8) - flags|=EWX_INSTALL_UPDATES; - SetShutdownPrivileges(); - ExitWindowsEx(flags,SHTDN_REASON_FLAG_PLANNED); - } - return true; - case MENU_SWITCHUSER: // switch_user if (GetWinVersion()>=WIN_VER_WIN10) { @@ -849,42 +1150,14 @@ static bool ExecuteSysCommand( TMenuID menuCommand ) LockWorkStation(); return true; - case MENU_SHUTDOWN: // shutdown - case MENU_SHUTDOWN_NOUPDATE: - SetShutdownPrivileges(); - ExitWindowsEx(EWX_SHUTDOWN,SHTDN_REASON_FLAG_PLANNED); - return true; - - case MENU_SHUTDOWN_UPDATE: // update and shutdown - SetShutdownPrivileges(); - ExitWindowsEx(EWX_SHUTDOWN|EWX_INSTALL_UPDATES,SHTDN_REASON_FLAG_PLANNED); - return true; - - case MENU_SHUTDOWN_HYBRID: // hybrid shutdown - SetShutdownPrivileges(); - { - UINT flags=EWX_SHUTDOWN; - if (GetWinVersion()>=WIN_VER_WIN8) - { - CRegKey regPower; - if (regPower.Open(HKEY_LOCAL_MACHINE,L"SYSTEM\\CurrentControlSet\\Control\\Session Manager\\Power",KEY_READ)==ERROR_SUCCESS) - { - DWORD val; - if (regPower.QueryDWORDValue(L"HiberbootEnabled",val)==ERROR_SUCCESS && val==1) - flags|=EWX_HYBRID_SHUTDOWN; - } - } - ExitWindowsEx(flags,SHTDN_REASON_FLAG_PLANNED); - } - return true; - case MENU_SLEEP: if (GetSystemMetrics(SM_REMOTESESSION)) { WTSDisconnectSession(WTS_CURRENT_SERVER_HANDLE,WTS_CURRENT_SESSION,FALSE); Sleep(250); } - CreateThread(NULL,0,SleepThread,(void*)FALSE,0,NULL); + if (!ConnectedStandby()) + CreateThread(NULL,0,SleepThread,(void*)FALSE,0,NULL); return true; case MENU_HIBERNATE: @@ -936,6 +1209,8 @@ static bool ExecuteSysCommand( TMenuID menuCommand ) return true; default: + if (ExecuteShutdownCommand(menuCommand)) + return true; return false; } } @@ -2782,12 +3057,19 @@ void CMenuContainer::ActivateItem( int index, TActivateType type, const POINT *p info.lpVerb=MAKEINTRESOURCEA(res-verbOffset); info.lpVerbW=MAKEINTRESOURCEW(res-verbOffset); info.nShow=SW_SHOWNORMAL; + bool bOpenTruePath=false; + wchar_t targetlnkPath[_MAX_PATH]; // path to target.lnk in a fake folder wchar_t dir[_MAX_PATH]; if (SHGetPathFromIDList(pItemPidl1,dir)) { - PathRemoveFileSpec(dir); - if (GetFileAttributes(dir)!=INVALID_FILE_ATTRIBUTES) - info.lpDirectoryW=dir; + if (_stricmp(command,"open")==0 && GetSettingBool(L"OpenTruePath") && GetFakeFolder(targetlnkPath,_countof(targetlnkPath),dir)) + bOpenTruePath=true; + else + { + PathRemoveFileSpec(dir); + if (GetFileAttributes(dir)!=INVALID_FILE_ATTRIBUTES) + info.lpDirectoryW=dir; + } } if (pPt) { @@ -2803,6 +3085,10 @@ void CMenuContainer::ActivateItem( int index, TActivateType type, const POINT *p if (bRefresh || bRefreshMain) info.fMask|=CMIC_MASK_NOASYNC; // wait for delete/link commands to finish so we can refresh the menu + // we don't want our virtual folder to appear in Explorer's frequent list + if (item.pItemInfo && wcsncmp(item.pItemInfo->PATH, L"::{82E749ED-B971-4550-BAF7-06AA2BF7E836}", 40) == 0) + info.fMask &= ~CMIC_MASK_FLAG_LOG_USAGE; + s_bPreventClosing=true; for (auto& it : s_Menus) { @@ -2818,9 +3104,20 @@ void CMenuContainer::ActivateItem( int index, TActivateType type, const POINT *p ::SetForegroundWindow(g_OwnerWindow); ::SetWindowPos(g_OwnerWindow,HWND_TOPMOST,rc.left,rc.top,rc.right-rc.left,rc.bottom-rc.top,0); LOG_MENU(LOG_EXECUTE,L"Invoke command, ptr=%p, command='%S'",this,command); - HRESULT hr=pInvokeMenu->InvokeCommand((LPCMINVOKECOMMANDINFO)&info); - LOG_MENU(LOG_EXECUTE,L"Invoke command, ptr=%p, res=%d",this,hr); - if (type==ACTIVATE_EXECUTE && SUCCEEDED(hr)) + bool executeSuccess; + if (bOpenTruePath) // we are trying to open a fake folder, directly open target.lnk instead + { + HINSTANCE hinst=ShellExecute(NULL,NULL,targetlnkPath,NULL,NULL,SW_SHOWNORMAL); + LOG_MENU(LOG_EXECUTE,L"Invoke command, ptr=%p, res=%d",this,hinst); + executeSuccess=static_cast(reinterpret_cast(hinst))>=32; + } + else + { + HRESULT hr=pInvokeMenu->InvokeCommand((LPCMINVOKECOMMANDINFO)&info); + LOG_MENU(LOG_EXECUTE,L"Invoke command, ptr=%p, res=%d",this,hr); + executeSuccess=SUCCEEDED(hr); + } + if (type==ACTIVATE_EXECUTE && executeSuccess) { if (bTrackRecent) { diff --git a/Src/StartMenu/StartMenuDLL/MenuContainer.cpp b/Src/StartMenu/StartMenuDLL/MenuContainer.cpp index efdeef848..856ead1e4 100644 --- a/Src/StartMenu/StartMenuDLL/MenuContainer.cpp +++ b/Src/StartMenu/StartMenuDLL/MenuContainer.cpp @@ -315,6 +315,7 @@ bool CMenuContainer::s_bShowTopEmpty=false; bool CMenuContainer::s_bNoDragDrop=false; bool CMenuContainer::s_bNoContextMenu=false; bool CMenuContainer::s_bExpandLinks=false; +bool CMenuContainer::s_bSingleClickFolders=false; bool CMenuContainer::s_bLogicalSort=false; bool CMenuContainer::s_bExtensionSort=false; bool CMenuContainer::s_bAllPrograms=false; @@ -343,7 +344,8 @@ bool CMenuContainer::s_bMRULoaded=false; const CItemManager::ItemInfo *CMenuContainer::s_JumpAppInfo; CJumpList CMenuContainer::s_JumpList; int CMenuContainer::s_TaskBarId; -HWND CMenuContainer::s_TaskBar, CMenuContainer::s_StartButton; +HWND CMenuContainer::s_TaskBar; +HWND CMenuContainer::s_StartButton; // custom start button (if any) UINT CMenuContainer::s_TaskBarEdge; RECT CMenuContainer::s_StartRect; HWND CMenuContainer::s_LastFGWindow; @@ -443,7 +445,10 @@ LRESULT CALLBACK CMenuContainer::SubclassSearchBox( HWND hWnd, UINT uMsg, WPARAM SetBkColor(hdc,GetSysColor(COLOR_WINDOW)); SetBkMode(hdc,TRANSPARENT); SetTextColor(hdc,s_Skin.Search_text_colors[1]); - DrawText(hdc,pParent->m_Items[pParent->m_SearchIndex].name,-1,&rc,DT_SINGLELINE|DT_EDITCONTROL|(s_bRTL?DT_RIGHT:DT_LEFT)); + if (GetSettingBool(L"SearchHint")) + DrawText(hdc,GetSettingString(L"SearchHintText"),-1,&rc,DT_SINGLELINE|DT_EDITCONTROL|(s_bRTL?DT_RIGHT:DT_LEFT)); + else + DrawText(hdc,pParent->m_Items[pParent->m_SearchIndex].name,-1,&rc,DT_SINGLELINE|DT_EDITCONTROL|(s_bRTL?DT_RIGHT:DT_LEFT)); SelectObject(hdc,font0); } return res; @@ -563,7 +568,7 @@ LRESULT CALLBACK CMenuContainer::SubclassSearchBox( HWND hWnd, UINT uMsg, WPARAM { pParent->SendMessage(WM_SYSKEYDOWN,wParam,lParam); if (wParam==VK_MENU) - pParent->ShowKeyboardCues(); + pParent->ShowKeyboardCues(true); } else { @@ -1066,7 +1071,7 @@ void CMenuContainer::AddStandardItems( void ) const StdMenuItem *pInlineParent=NULL; int searchProviderIndex=-1; m_SearchProvidersCount=0; - MenuSkin::TIconSize mainIconSize=s_Skin.Main_icon_size; + bool bSecondColumn=false; for (const StdMenuItem *pStdItem=m_pStdItem;;pStdItem++) { if (pStdItem->id==MENU_LAST) @@ -1084,8 +1089,8 @@ void CMenuContainer::AddStandardItems( void ) if (m_bSubMenu && pStdItem->id==s_ShutdownCommand) continue; - if (pStdItem->id==MENU_COLUMN_BREAK && m_bTwoColumns) - mainIconSize=s_Skin.Main2_icon_size; + if (pStdItem->id==MENU_COLUMN_BREAK && !m_bSubMenu && s_Skin.TwoColumns) + bSecondColumn=true; int stdOptions=GetStdOptions(pStdItem->id); if (!(stdOptions&MENU_ENABLED)) continue; @@ -1266,6 +1271,10 @@ void CMenuContainer::AddStandardItems( void ) item.bSplit=item.bFolder && (item.pStdItem->settings&StdMenuItem::MENU_SPLIT_BUTTON)!=0; // get icon + MenuSkin::TIconSize mainIconSize=!bSecondColumn ? s_Skin.Main_icon_size : s_Skin.Main2_icon_size; + if (item.bInline && mainIconSize==MenuSkin::ICON_SIZE_NONE) + mainIconSize=s_Skin.Main_icon_size; + CItemManager::TIconSizeType iconSizeType; int refreshFlags; if (bSearchProvider7 || m_bSubMenu) @@ -1579,6 +1588,23 @@ static const wchar_t *g_MfuIgnoreExes[]={ L"WUAPP.EXE", }; +static bool IgnoreUserAssistItem(const UserAssistItem& uaItem) +{ + static constexpr const wchar_t* ignoredNames[] = + { + DESKTOP_APP_ID, + L"Microsoft.Windows.ShellExperienceHost_cw5n1h2txyewy!App", + }; + + for (const auto& name : ignoredNames) + { + if (_wcsicmp(uaItem.name, name) == 0) + return true; + } + + return false; +} + void CMenuContainer::GetRecentPrograms( std::vector &items, int maxCount ) { bool bShowMetro=GetSettingBool(L"RecentMetroApps"); @@ -1931,9 +1957,9 @@ void CMenuContainer::GetRecentPrograms( std::vector &items, int maxCou continue; } - if (_wcsicmp(uaItem.name,DESKTOP_APP_ID)==0) + if (IgnoreUserAssistItem(uaItem)) { - LOG_MENU(LOG_MFU,L"UserAssist: Dropping: Ignore desktop"); + LOG_MENU(LOG_MFU,L"UserAssist: Dropping: Ignore '%s'",uaItem.name); continue; } @@ -2499,9 +2525,9 @@ void CMenuContainer::InitItems( void ) m_Items.resize(MAX_MENU_ITEMS); } - if (m_Options&CONTAINER_CONTROLPANEL) + if (m_Options&CONTAINER_CONTROLPANEL && !(m_Options&CONTAINER_NOSUBFOLDERS)) { - // expand Administrative Tools. must be done after the sorting because we don't want the folder to jump to the top + // expand Administrative Tools when displaying as a menu. must be done after the sorting because we don't want the folder to jump to the top unsigned int AdminToolsHash=CalcFNVHash(L"::{D20EA4E1-3957-11D2-A40B-0C5020524153}"); for (std::vector::iterator it=m_Items.begin();it!=m_Items.end();++it) if (it->nameHash==AdminToolsHash) @@ -2740,7 +2766,7 @@ bool CMenuContainer::InitSearchItems( void ) { sepHeight=s_Skin.ItemSettings[s_Skin.More_bitmap_Size.cx?MenuSkin::LIST_SEPARATOR_SPLIT:MenuSkin::LIST_SEPARATOR].itemHeight; itemHeight=s_Skin.ItemSettings[MenuSkin::LIST_ITEM].itemHeight; - // total height minus the search box and the "more results"/"search internet" + // total height minus the search box and the "more results"/"search internet", if present maxHeight=m_Items[m_SearchIndex].itemRect.top-s_Skin.Main_search_padding.top-s_Skin.Search_padding.top; maxHeight-=itemHeight*(m_SearchItemCount-1); if (!s_SearchResults.bSearching && !HasMoreResults()) @@ -5083,8 +5109,14 @@ void CMenuContainer::UpdateSearchResults( bool bForceShowAll ) } // Turn on the keyboard cues from now on. This is done when a keyboard action is detected -void CMenuContainer::ShowKeyboardCues( void ) +void CMenuContainer::ShowKeyboardCues( bool alt ) { + if (!GetSettingBool(L"EnableAccelerators")) + return; + + if (GetSettingBool(L"AltAccelerators") && !alt) + return; + if (!s_bKeyboardCues) { s_bKeyboardCues=true; @@ -5116,7 +5148,7 @@ LRESULT CMenuContainer::OnSysCommand( UINT uMsg, WPARAM wParam, LPARAM lParam, B if ((wParam&0xFFF0)==SC_KEYMENU) { // stops Alt from activating the window menu - ShowKeyboardCues(); + ShowKeyboardCues(true); s_bOverrideFirstDown=false; } else @@ -5459,7 +5491,7 @@ bool CMenuContainer::CanSelectItem( int index, bool bKeyboard ) LRESULT CMenuContainer::OnKeyDown( UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled ) { - ShowKeyboardCues(); + ShowKeyboardCues((HIWORD(lParam)&KF_ALTDOWN)!=0); bool bOldOverride=s_bOverrideFirstDown; s_bOverrideFirstDown=false; @@ -6079,6 +6111,12 @@ LRESULT CMenuContainer::OnSysKeyDown( UINT uMsg, WPARAM wParam, LPARAM lParam, B LRESULT CMenuContainer::OnChar( UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled ) { + if (!GetSettingBool(L"EnableAccelerators")) + return TRUE; + + if (GetSettingBool(L"AltAccelerators") && !(HIWORD(lParam) & KF_ALTDOWN)) + return TRUE; + if (wParam>=0xD800 && wParam<=0xDBFF) return TRUE; // don't support supplementary characters @@ -6328,7 +6366,10 @@ LRESULT CMenuContainer::OnRefresh( UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL } } else if (m_Items[m_OriginalCount].id==MENU_SEARCH_CATEGORY) - hotItem=m_OriginalCount+1; + { + if (!bSearching || !s_SearchResults.programs.empty()) + hotItem=m_OriginalCount+1; + } } else hotItem=-1; @@ -6798,7 +6839,7 @@ LRESULT CMenuContainer::OnLButtonDblClick( UINT uMsg, WPARAM wParam, LPARAM lPar ClientToScreen(&pt); if (s_bWin7Style && item.id==MENU_PROGRAMS) // only single clicks for All Programs OnLButtonDown(WM_LBUTTONDOWN,wParam,lParam,bHandled); - else if (!bArrow) // ignore double-click on the split arrow + else if (!bArrow && item.id!=MENU_APPS) // ignore double-click on the split arrow and Apps folder ActivateItem(index,ACTIVATE_EXECUTE,&pt); return 0; } @@ -6822,7 +6863,7 @@ LRESULT CMenuContainer::OnLButtonUp( UINT uMsg, WPARAM wParam, LPARAM lParam, BO const MenuItem &item=m_Items[index]; POINT pt2=pt; ClientToScreen(&pt2); - if (!item.bFolder) + if (!item.bFolder || (s_bSingleClickFolders && item.id!=MENU_PROGRAMS && item.id!=MENU_APPS && !bArrow)) // never open All Programs, Apps folder, or jumplists with single click { if (item.jumpIndex>=0 && m_bHotArrow) { @@ -7395,7 +7436,7 @@ static void CreateStartScreenFile( const wchar_t *fname ) bool CMenuContainer::HasMoreResults( void ) { if (s_HasMoreResults==-1) - s_HasMoreResults=(GetSettingBool(L"SearchFiles") && HasSearchService())?1:0; + s_HasMoreResults=(GetSettingBool(L"MoreResults") && GetSettingBool(L"SearchFiles") && HasSearchService())?1:0; return s_HasMoreResults!=0; } @@ -7467,34 +7508,10 @@ RECT CMenuContainer::CalculateWorkArea( const RECT &taskbarRect ) } } - //calculate offsets - int xOff = GetSettingInt(L"HorizontalMenuOffset"); - int yOff = GetSettingInt(L"VerticalMenuOffset"); - if (s_TaskBarEdge == ABE_BOTTOM) - { - if (xOff != 0) - rc.left += xOff; - if (yOff != 0) - rc.bottom += yOff; - } - else if (s_TaskBarEdge == ABE_TOP || s_TaskBarEdge == ABE_LEFT) - { - if (xOff != 0) - rc.left += xOff; - if (yOff != 0) - rc.top += yOff; - } - else - { - if (xOff != 0) - rc.right += xOff; - if (yOff != 0) - rc.top += yOff; - } - return rc; } +// Calculates start menu position POINT CMenuContainer::CalculateCorner( void ) { RECT margin={0,0,0,0}; @@ -7503,20 +7520,23 @@ POINT CMenuContainer::CalculateCorner( void ) POINT corner; if (m_Options&CONTAINER_LEFT) - corner.x=s_MainMenuLimits.left+margin.left; + corner.x=max(s_MainMenuLimits.left,s_StartRect.left)+margin.left; else - corner.x=s_MainMenuLimits.right+margin.right; + corner.x=min(s_MainMenuLimits.right,s_StartRect.right)+margin.right; if (m_Options&CONTAINER_TOP) { if (s_bBehindTaskbar) - corner.y=s_MainMenuLimits.top+margin.top; + corner.y=max(s_MainMenuLimits.top,s_StartRect.top)+margin.top; else - corner.y=s_MainMenuLimits.top; + corner.y=max(s_MainMenuLimits.top,s_StartRect.top); } else corner.y=s_MainMenuLimits.bottom+margin.bottom; + corner.x+=GetSettingInt(L"HorizontalMenuOffset"); + corner.y+=GetSettingInt(L"VerticalMenuOffset"); + return corner; } @@ -7624,6 +7644,9 @@ HWND CMenuContainer::ToggleStartMenu( int taskbarId, bool bKeyboard, bool bAllPr // initialize all settings bool bErr=false; HMONITOR initialMonitor=MonitorFromWindow(s_TaskBar,MONITOR_DEFAULTTONEAREST); + // note: GetTaskbarPosition properly identifies monitor in case of multi-monitor setup and automatic taskbar hiding + GetTaskbarPosition(s_TaskBar,NULL,&initialMonitor,NULL); + int dpi=CItemManager::GetDPI(true); if (!CItemManager::GetDPIOverride() && GetWinVersion()>=WIN_VER_WIN81) { @@ -7671,6 +7694,7 @@ HWND CMenuContainer::ToggleStartMenu( int taskbarId, bool bKeyboard, bool bAllPr g_ItemManager.ResetTempIcons(); s_ScrollMenus=GetSettingInt(L"ScrollType"); s_bExpandLinks=GetSettingBool(L"ExpandFolderLinks"); + s_bSingleClickFolders=GetSettingBool(L"SingleClickFolders"); s_bLogicalSort=GetSettingBool(L"NumericSort"); s_MaxRecentDocuments=GetSettingInt(L"MaxRecentDocuments"); s_ShellFormat=RegisterClipboardFormat(CFSTR_SHELLIDLIST); @@ -8034,7 +8058,7 @@ HWND CMenuContainer::ToggleStartMenu( int taskbarId, bool bKeyboard, bool bAllPr s_bNoDragDrop=!GetSettingBool(L"EnableDragDrop"); s_bNoContextMenu=!GetSettingBool(L"EnableContextMenu"); - s_bKeyboardCues=bKeyboard; + s_bKeyboardCues=bKeyboard&&GetSettingBool(L"EnableAccelerators")&&!GetSettingBool(L"AltAccelerators"); s_RecentPrograms=(TRecentPrograms)GetSettingInt(L"RecentPrograms"); if (s_RecentPrograms!=RECENT_PROGRAMS_NONE) LoadMRUShortcuts(); @@ -8056,7 +8080,8 @@ HWND CMenuContainer::ToggleStartMenu( int taskbarId, bool bKeyboard, bool bAllPr } else { - wchar_t path[_MAX_PATH]=START_MENU_PINNED_ROOT; + wchar_t path[_MAX_PATH]; + Strcpy(path,_countof(path),GetSettingString(L"PinnedItemsPath")); DoEnvironmentSubst(path,_countof(path)); SHCreateDirectory(NULL,path); s_PinFolder=path; @@ -8068,7 +8093,8 @@ HWND CMenuContainer::ToggleStartMenu( int taskbarId, bool bKeyboard, bool bAllPr { bool bPinned=GetSettingInt(L"PinnedPrograms")==PINNED_PROGRAMS_PINNED; bool bShortcut=GetSettingBool(L"StartScreenShortcut"); - wchar_t path[_MAX_PATH]=START_MENU_PINNED_ROOT L"\\" STARTSCREEN_COMMAND; + wchar_t path[_MAX_PATH]; + Sprintf(path,_countof(path),L"%s\\%s",GetSettingString(L"PinnedItemsPath"),STARTSCREEN_COMMAND); DoEnvironmentSubst(path,_countof(path)); if (bPinned) { @@ -8199,7 +8225,7 @@ HWND CMenuContainer::ToggleStartMenu( int taskbarId, bool bKeyboard, bool bAllPr s_UserPicture.Init(pStartMenu); } dummyRc.right++; - pStartMenu->SetWindowPos(NULL,&dummyRc,SWP_NOZORDER); + pStartMenu->SetWindowPos(NULL,&dummyRc,SWP_NOZORDER|SWP_NOACTIVATE); memset(&s_StartRect,0,sizeof(s_StartRect)); @@ -8528,7 +8554,7 @@ HWND CMenuContainer::ToggleStartMenu( int taskbarId, bool bKeyboard, bool bAllPr // reposition start menu if (bTopMost || !s_bBehindTaskbar) animFlags|=AW_TOPMOST; - pStartMenu->SetWindowPos((animFlags&AW_TOPMOST)?HWND_TOPMOST:HWND_TOP,corner.x,corner.y,0,0,(initialMonitor!=s_MenuMonitor && !bAllPrograms)?SWP_NOMOVE|SWP_NOSIZE:0); + pStartMenu->SetWindowPos((animFlags&AW_TOPMOST)?HWND_TOPMOST:HWND_TOP,corner.x,corner.y,0,0,((initialMonitor!=s_MenuMonitor && !bAllPrograms)?SWP_NOMOVE|SWP_NOSIZE:0)|SWP_NOACTIVATE); pStartMenu->InitItems(); pStartMenu->m_MaxWidth=s_MainMenuLimits.right-s_MainMenuLimits.left; diff --git a/Src/StartMenu/StartMenuDLL/MenuContainer.h b/Src/StartMenu/StartMenuDLL/MenuContainer.h index 696e8db48..057982104 100644 --- a/Src/StartMenu/StartMenuDLL/MenuContainer.h +++ b/Src/StartMenu/StartMenuDLL/MenuContainer.h @@ -808,7 +808,7 @@ class CMenuContainer: public IDropTarget, public IFrameworkInputPaneHandler, pub void ActivateItem( int index, TActivateType type, const POINT *pPt, ActivateData *pData=NULL ); void ActivateTreeItem( const void *treeItem, RECT &itemRect, TActivateType type, const POINT *pPt, ActivateData *pData=NULL ); void DragTreeItem( const void *treeItem, bool bApps ); - void ShowKeyboardCues( void ); + void ShowKeyboardCues( bool alt ); void SetActiveWindow( void ); void CreateBackground( int width1, int width2, int height1, int height2, int &totalWidth, int &totalHeight, bool bCreateRegion ); // width1/2, height1/2 - the first and second content area void BlendPatterns( unsigned int *bits, int width, int height ); @@ -876,6 +876,7 @@ class CMenuContainer: public IDropTarget, public IFrameworkInputPaneHandler, pub static bool s_bNoDragDrop; // disables drag/drop static bool s_bNoContextMenu; // disables the context menu static bool s_bExpandLinks; // expand links to folders + static bool s_bSingleClickFolders; // open links to folders with one click instead of two static bool s_bLogicalSort; // use StrCmpLogical instead of CompareString static bool s_bExtensionSort; // sort file names by extension static bool s_bAllPrograms; // this is the All Programs menu of the Windows start menu diff --git a/Src/StartMenu/StartMenuDLL/MenuPaint.cpp b/Src/StartMenu/StartMenuDLL/MenuPaint.cpp index 94815859f..32bccd387 100644 --- a/Src/StartMenu/StartMenuDLL/MenuPaint.cpp +++ b/Src/StartMenu/StartMenuDLL/MenuPaint.cpp @@ -19,6 +19,7 @@ #include #include #include +#include static BLENDFUNCTION g_AlphaFunc={AC_SRC_OVER,0,255,AC_SRC_ALPHA}; @@ -3006,9 +3007,12 @@ void CProgramsTree::DrawScrollbarBackground( HDC hdc, int iPartId, int iStateId, void CMenuContainer::AnimateMenu( int flags, int speed, const RECT &rect ) { + using namespace std::chrono; + RECT clipRect=m_bSubMenu?s_MenuLimits:s_MainMenuLimits; bool bUserPic=(!m_bSubMenu && s_bWin7Style && s_UserPicture.m_hWnd && s_UserPictureRect.top0) { @@ -3030,10 +3034,10 @@ void CMenuContainer::AnimateMenu( int flags, int speed, const RECT &rect ) } // animate - int time0=GetTickCount(); + auto time0=steady_clock::now(); while (true) { - int dt=GetTickCount()-time0; + auto dt=duration_cast(steady_clock::now()-time0).count(); if (dt>speed) break; float f=dt/(float)speed; int alpha=(int)(f*255); @@ -3041,6 +3045,7 @@ void CMenuContainer::AnimateMenu( int flags, int speed, const RECT &rect ) RedrawWindow(); if (bUserPic) s_UserPicture.Update(alpha); + frames++; } SetWindowLong(GWL_EXSTYLE,GetWindowLong(GWL_EXSTYLE)&~WS_EX_LAYERED); @@ -3085,7 +3090,7 @@ void CMenuContainer::AnimateMenu( int flags, int speed, const RECT &rect ) } // animate - int time0=GetTickCount(); + auto time0=steady_clock::now(); int movex=0, movey=0; if (flags&AW_HOR_POSITIVE) { @@ -3111,7 +3116,7 @@ void CMenuContainer::AnimateMenu( int flags, int speed, const RECT &rect ) HRGN clipRgn=CreateRectRgn(clipRect.left-rect.left,clipRect.top-rect.top,clipRect.right-rect.left,clipRect.bottom-rect.top); // clip region in window space while (true) { - int dt=GetTickCount()-time0; + auto dt=duration_cast(steady_clock::now()-time0).count(); if (dt>speed) break; float f=1-dt/(float)speed; f=powf(f,5); @@ -3139,6 +3144,7 @@ void CMenuContainer::AnimateMenu( int flags, int speed, const RECT &rect ) POINT pos={s_UserPictureRect.left-dx,s_UserPictureRect.top-dy}; s_UserPicture.UpdatePartial(pos,&clipRect); } + frames++; } DeleteObject(clipRgn); @@ -3169,4 +3175,7 @@ void CMenuContainer::AnimateMenu( int flags, int speed, const RECT &rect ) POINT pos={s_UserPictureRect.left,s_UserPictureRect.top}; s_UserPicture.UpdatePartial(pos,NULL); } + + if (frames) + LOG_MENU(LOG_OPEN,L"Menu animation %d frames in %dms (%.0f fps)",frames,speed,1000.0*frames/speed); } diff --git a/Src/StartMenu/StartMenuDLL/SearchManager.cpp b/Src/StartMenu/StartMenuDLL/SearchManager.cpp index b536d7eac..037794941 100644 --- a/Src/StartMenu/StartMenuDLL/SearchManager.cpp +++ b/Src/StartMenu/StartMenuDLL/SearchManager.cpp @@ -639,7 +639,8 @@ void CSearchManager::SearchThread( void ) // pinned folder if (searchRequest.bPinnedFolder) { - wchar_t path[_MAX_PATH]=START_MENU_PINNED_ROOT; + wchar_t path[_MAX_PATH]; + Strcpy(path,_countof(path),GetSettingString(L"PinnedItemsPath")); DoEnvironmentSubst(path,_MAX_PATH); CComPtr pFolder; if (SUCCEEDED(SHCreateItemFromParsingName(path,NULL,IID_IShellItem,(void**)&pFolder))) diff --git a/Src/StartMenu/StartMenuDLL/SettingsUI.cpp b/Src/StartMenu/StartMenuDLL/SettingsUI.cpp index 54007e93c..49383601b 100644 --- a/Src/StartMenu/StartMenuDLL/SettingsUI.cpp +++ b/Src/StartMenu/StartMenuDLL/SettingsUI.cpp @@ -30,6 +30,19 @@ const int DEFAULT_TASK_OPACITY10=85; // 85% /////////////////////////////////////////////////////////////////////////////// +CString RgbToBgr(const wchar_t* str) +{ + CString retval; + retval.Format(L"%06X", RgbToBgr(ParseColor(str))); + + return retval; +} + +CString BgrToRgb(const wchar_t* str) +{ + return RgbToBgr(str); +} + class CSkinSettingsDlg: public CResizeableDlg { public: @@ -422,7 +435,7 @@ void CSkinSettingsDlg::UpdateSkinSettings( void ) if (!option.bEnabled || bLocked) image|=SETTING_STATE_DISABLED; if (option.bValue && option.type>SKIN_OPTION_BOOL) - Sprintf(text,_countof(text),L"%s: %s",option.label,option.sValue); + Sprintf(text,_countof(text),L"%s: %s",option.label,(option.type==SKIN_OPTION_COLOR)?BgrToRgb(option.sValue):option.sValue); else Sprintf(text,_countof(text),L"%s",option.label); @@ -482,9 +495,7 @@ LRESULT CSkinSettingsDlg::OnCustomDraw( int idCtrl, LPNMHDR pnmh, BOOL& bHandled if (TreeView_GetItemRect(m_Tree,(HTREEITEM)pDraw->nmcd.dwItemSpec,&rc,TRUE)) { const wchar_t *str=m_CurrentSkin.Options[pDraw->nmcd.lItemlParam].sValue; - wchar_t *end; - COLORREF color=wcstoul(str,&end,16); - SetDCBrushColor(pDraw->nmcd.hdc,color&0xFFFFFF); + SetDCBrushColor(pDraw->nmcd.hdc,ParseColor(str)); SelectObject(pDraw->nmcd.hdc,GetStockObject(DC_BRUSH)); SelectObject(pDraw->nmcd.hdc,GetStockObject(BLACK_PEN)); Rectangle(pDraw->nmcd.hdc,rc.right,rc.top,rc.right+rc.bottom-rc.top,rc.bottom-1); @@ -690,15 +701,14 @@ LRESULT CSkinSettingsDlg::OnBrowse( WORD wNotifyCode, WORD wID, HWND hWndCtl, BO CString str; m_EditBox.GetWindowText(str); str.TrimLeft(); str.TrimRight(); - wchar_t *end; - COLORREF val=wcstol(str,&end,16)&0xFFFFFF; + COLORREF val=RgbToBgr(ParseColor(str)); static COLORREF customColors[16]; CHOOSECOLOR choose={sizeof(choose),m_hWnd,NULL,val,customColors}; choose.Flags=CC_ANYCOLOR|CC_FULLOPEN|CC_RGBINIT; if (ChooseColor(&choose)) { wchar_t text[100]; - Sprintf(text,_countof(text),L"%06X",choose.rgbResult); + Sprintf(text,_countof(text),L"%06X",BgrToRgb(choose.rgbResult)); m_EditBox.SetWindowText(text); ApplyEditBox(); m_Tree.Invalidate(); @@ -717,7 +727,11 @@ void CSkinSettingsDlg::ApplyEditBox( void ) CString str; m_EditBox.GetWindowText(str); str.TrimLeft(); str.TrimRight(); - m_CurrentSkin.Options[m_EditItemIndex].sValue=str; + auto& option=m_CurrentSkin.Options[m_EditItemIndex]; + if (option.type==SKIN_OPTION_COLOR) + option.sValue=RgbToBgr(str); + else + option.sValue=str; StoreSkinOptions(); } } @@ -730,7 +744,7 @@ void CSkinSettingsDlg::ItemSelected( HTREEITEM hItem, int index, bool bEnabled ) const MenuSkin::Option &option=m_CurrentSkin.Options[m_EditItemIndex]; wchar_t text[256]; if (option.bValue && option.type>SKIN_OPTION_BOOL) - Sprintf(text,_countof(text),L"%s: %s",option.label,option.sValue); + Sprintf(text,_countof(text),L"%s: %s",option.label,(option.type==SKIN_OPTION_COLOR)?BgrToRgb(option.sValue):option.sValue); else Sprintf(text,_countof(text),L"%s",option.label); TVITEM item={TVIF_TEXT,m_EditItem,0,0,text}; @@ -745,7 +759,10 @@ void CSkinSettingsDlg::ItemSelected( HTREEITEM hItem, int index, bool bEnabled ) const MenuSkin::Option &option=m_CurrentSkin.Options[index]; if (option.type>SKIN_OPTION_BOOL) mode=option.type; - text=option.sValue; + if (option.type==SKIN_OPTION_COLOR) + text=BgrToRgb(option.sValue); + else + text=option.sValue; } RECT rc; @@ -1106,7 +1123,7 @@ L"ControlPanelItem.Label=$Menu.ControlPanel\n" L"ControlPanelItem.Tip=$Menu.ControlPanelTip\n" L"ControlPanelItem.Settings=TRACK_RECENT\n" L"PCSettingsItem.Command=pc_settings\n" -L"PCSettingsItem.Icon=%windir%\\ImmersiveControlPanel\\SystemSettings.exe,10\n" +L"PCSettingsItem.Link=shell:appsfolder\\windows.immersivecontrolpanel_cw5n1h2txyewy!microsoft.windows.immersivecontrolpanel\n" L"PCSettingsItem.Label=$Menu.PCSettings\n" L"PCSettingsItem.Settings=TRACK_RECENT\n" L"SecurityItem.Command=windows_security\n" @@ -1229,7 +1246,7 @@ L"ControlPanelItem.Label=$Menu.ControlPanel\n" L"ControlPanelItem.Tip=$Menu.ControlPanelTip\n" L"ControlPanelItem.Settings=TRACK_RECENT\n" L"PCSettingsItem.Command=pc_settings\n" -L"PCSettingsItem.Icon=%windir%\\ImmersiveControlPanel\\SystemSettings.exe,10\n" +L"PCSettingsItem.Link=shell:appsfolder\\windows.immersivecontrolpanel_cw5n1h2txyewy!microsoft.windows.immersivecontrolpanel\n" L"PCSettingsItem.Label=$Menu.PCSettings\n" L"PCSettingsItem.Settings=TRACK_RECENT\n" L"SecurityItem.Command=windows_security\n" @@ -1742,7 +1759,7 @@ LRESULT CEditMenuDlg::OnBrowseLink( WORD wNotifyCode, WORD wID, HWND hWndCtl, BO { wchar_t text[_MAX_PATH]; GetDlgItemText(IDC_COMBOLINK,text,_countof(text)); - if (BrowseLinkHelper(m_hWnd,text)) + if (BrowseLinkHelper(m_hWnd,text,false)) { SetDlgItemText(IDC_COMBOLINK,text); SendMessage(WM_COMMAND,MAKEWPARAM(IDC_COMBOLINK,CBN_KILLFOCUS)); @@ -2437,7 +2454,7 @@ LRESULT CEditMenuDlg7::OnBrowseLink( WORD wNotifyCode, WORD wID, HWND hWndCtl, B { wchar_t text[_MAX_PATH]; GetDlgItemText(IDC_EDITLINK2,text,_countof(text)); - if (BrowseLinkHelper(m_hWnd,text)) + if (BrowseLinkHelper(m_hWnd,text,false)) { SetDlgItemText(IDC_EDITLINK2,text); SendMessage(WM_COMMAND,MAKEWPARAM(IDC_EDITLINK2,EN_KILLFOCUS)); @@ -2725,8 +2742,11 @@ void CCustomMenuDlg7::CItemList::UpdateItem( int index ) str=LoadStringEx(IDS_ITEM_SHOW2); else if ((menuItem.settings&StdMenuItem::MENU_NOEXPAND) && !(g_StdCommands7[menuItem.stdItemIndex].flags&CStdCommand7::ITEM_FOLDER)) str=LoadStringEx(IDS_ITEM_SHOW); - else if ((menuItem.settings&StdMenuItem::MENU_SINGLE_EXPAND) && (g_StdCommands7[menuItem.stdItemIndex].flags&CStdCommand7::ITEM_COMPUTER)) - str=LoadStringEx(IDS_ITEM_DRIVES); + else if ((menuItem.settings&StdMenuItem::MENU_SINGLE_EXPAND) && !(g_StdCommands7[menuItem.stdItemIndex].flags&CStdCommand7::ITEM_NODRIVES)) + if (g_StdCommands7[menuItem.stdItemIndex].flags&CStdCommand7::ITEM_COMPUTER) + str=LoadStringEx(IDS_ITEM_DRIVES); + else + str=LoadStringEx(IDS_ITEM_LINKS); else str=LoadStringEx(IDS_ITEM_MENU); ListView_SetItemText(m_hWnd,index,2,(wchar_t*)(const wchar_t*)str); @@ -3160,7 +3180,7 @@ LRESULT CCustomMenuDlg7::CItemList::OnSelEndOk( WORD wNotifyCode, WORD wID, HWND menuItem.settings|=StdMenuItem::MENU_ITEM_DISABLED; else if (sel==1 && !(g_StdCommands7[menuItem.stdItemIndex].flags&(CStdCommand7::ITEM_SINGLE|CStdCommand7::ITEM_FOLDER))) menuItem.settings|=StdMenuItem::MENU_NOEXPAND; - else if (sel==3 && (g_StdCommands7[menuItem.stdItemIndex].flags&CStdCommand7::ITEM_COMPUTER)) + else if (sel==3 && !(g_StdCommands7[menuItem.stdItemIndex].flags&CStdCommand7::ITEM_NODRIVES)) menuItem.settings|=StdMenuItem::MENU_SINGLE_EXPAND; } UpdateItem(m_Line); @@ -3307,12 +3327,17 @@ void CCustomMenuDlg7::CItemList::CreateCombo( int line, int column ) str=LoadStringEx(IDS_ITEM_DRIVES); m_Combo.SendMessage(CB_ADDSTRING,0,(LPARAM)(const wchar_t*)str); } + else if (!(g_StdCommands7[menuItem.stdItemIndex].flags&CStdCommand7::ITEM_NODRIVES)) + { + str=LoadStringEx(IDS_ITEM_LINKS); + m_Combo.SendMessage(CB_ADDSTRING,0,(LPARAM)(const wchar_t*)str); + } } if (menuItem.settings&StdMenuItem::MENU_ITEM_DISABLED) m_Combo.SendMessage(CB_SETCURSEL,0); else if ((g_StdCommands7[menuItem.stdItemIndex].flags&(CStdCommand7::ITEM_SINGLE|CStdCommand7::ITEM_FOLDER)) || (menuItem.settings&StdMenuItem::MENU_NOEXPAND)) m_Combo.SendMessage(CB_SETCURSEL,1); - else if ((g_StdCommands7[menuItem.stdItemIndex].flags&CStdCommand7::ITEM_COMPUTER) && (menuItem.settings&StdMenuItem::MENU_SINGLE_EXPAND)) + else if (!(g_StdCommands7[menuItem.stdItemIndex].flags&CStdCommand7::ITEM_NODRIVES) && (menuItem.settings&StdMenuItem::MENU_SINGLE_EXPAND)) m_Combo.SendMessage(CB_SETCURSEL,3); else m_Combo.SendMessage(CB_SETCURSEL,2); @@ -4139,38 +4164,50 @@ CSetting g_Settings[]={ {L"Nothing",CSetting::TYPE_RADIO,IDS_OPEN_NOTHING,IDS_OPEN_NOTHING_TIP}, {L"ClassicMenu",CSetting::TYPE_RADIO,IDS_OPEN_CSM,IDS_OPEN_CSM_TIP}, {L"WindowsMenu",CSetting::TYPE_RADIO,IDS_OPEN_WSM,IDS_OPEN_WSM_TIP}, + {L"Command",CSetting::TYPE_RADIO,IDS_OPEN_CMD,IDS_OPEN_CMD_TIP}, {L"Both",CSetting::TYPE_RADIO,IDS_OPEN_BOTH,IDS_OPEN_BOTH_TIP,0,CSetting::FLAG_HIDDEN}, + {L"MouseClickCommand",CSetting::TYPE_STRING,IDS_OPEN_CMD_TEXT,IDS_OPEN_CMD_TEXT_TIP,"%userprofile%",0,L"MouseClick=3",L"Command"}, {L"ShiftClick",CSetting::TYPE_INT,IDS_SHIFT_LCLICK,IDS_SHIFT_LCLICK_TIP,2,CSetting::FLAG_BASIC}, {L"Nothing",CSetting::TYPE_RADIO,IDS_OPEN_NOTHING,IDS_OPEN_NOTHING_TIP}, {L"ClassicMenu",CSetting::TYPE_RADIO,IDS_OPEN_CSM,IDS_OPEN_CSM_TIP}, {L"WindowsMenu",CSetting::TYPE_RADIO,IDS_OPEN_WSM,IDS_OPEN_WSM_TIP}, + {L"Command",CSetting::TYPE_RADIO,IDS_OPEN_CMD,IDS_OPEN_CMD_TIP}, {L"Both",CSetting::TYPE_RADIO,IDS_OPEN_BOTH,IDS_OPEN_BOTH_TIP,0,CSetting::FLAG_HIDDEN}, /* {L"Desktop",CSetting::TYPE_RADIO,IDS_OPEN_DESKTOP,IDS_OPEN_DESKTOP_TIP,0,CSetting::FLAG_HIDDEN}, {L"Cortana",CSetting::TYPE_RADIO,IDS_OPEN_CORTANA,IDS_OPEN_CORTANA_TIP},*/ + {L"ShiftClickCommand",CSetting::TYPE_STRING,IDS_OPEN_CMD_TEXT,IDS_OPEN_CMD_TEXT_TIP,"%systemdrive%",0,L"ShiftClick=3",L"Command"}, {L"WinKey",CSetting::TYPE_INT,IDS_WIN_KEY,IDS_WIN_KEY_TIP,1,CSetting::FLAG_BASIC}, {L"Nothing",CSetting::TYPE_RADIO,IDS_OPEN_NOTHING,IDS_OPEN_NOTHING_TIP}, {L"ClassicMenu",CSetting::TYPE_RADIO,IDS_OPEN_CSM,IDS_OPEN_CSM_TIP}, {L"WindowsMenu",CSetting::TYPE_RADIO,IDS_OPEN_WSM,IDS_OPEN_WSM_TIP}, + {L"Command",CSetting::TYPE_RADIO,IDS_OPEN_CMD,IDS_OPEN_CMD_TIP}, {L"Both",CSetting::TYPE_RADIO,IDS_OPEN_BOTH,IDS_OPEN_BOTH_TIP}, {L"Desktop",CSetting::TYPE_RADIO,IDS_OPEN_DESKTOP,IDS_OPEN_DESKTOP_TIP}, + {L"WinKeyCommand",CSetting::TYPE_STRING,IDS_OPEN_CMD_TEXT,IDS_OPEN_CMD_TEXT_TIP,"cmd",0,L"WinKey=3",L"Command"}, {L"ShiftWin",CSetting::TYPE_INT,IDS_SHIFT_WIN,IDS_SHIFT_WIN_TIP,2,CSetting::FLAG_BASIC}, {L"Nothing",CSetting::TYPE_RADIO,IDS_OPEN_NOTHING,IDS_OPEN_NOTHING_TIP}, {L"ClassicMenu",CSetting::TYPE_RADIO,IDS_OPEN_CSM,IDS_OPEN_CSM_TIP}, {L"WindowsMenu",CSetting::TYPE_RADIO,IDS_OPEN_WSM,IDS_OPEN_WSM_TIP}, + {L"Command",CSetting::TYPE_RADIO,IDS_OPEN_CMD,IDS_OPEN_CMD_TIP}, {L"Both",CSetting::TYPE_RADIO,IDS_OPEN_BOTH,IDS_OPEN_BOTH_TIP}, /* {L"Desktop",CSetting::TYPE_RADIO,IDS_OPEN_DESKTOP,IDS_OPEN_DESKTOP_TIP,0,CSetting::FLAG_HIDDEN}, {L"Cortana",CSetting::TYPE_RADIO,IDS_OPEN_CORTANA,IDS_OPEN_CORTANA_TIP},*/ + {L"ShiftWinCommand",CSetting::TYPE_STRING,IDS_OPEN_CMD_TEXT,IDS_OPEN_CMD_TEXT_TIP,"powershell",0,L"ShiftWin=3",L"Command"}, {L"MiddleClick",CSetting::TYPE_INT,IDS_MCLICK,IDS_MCLICK_TIP,0}, {L"Nothing",CSetting::TYPE_RADIO,IDS_OPEN_NOTHING,IDS_OPEN_NOTHING_TIP}, {L"ClassicMenu",CSetting::TYPE_RADIO,IDS_OPEN_CSM,IDS_OPEN_CSM_TIP}, {L"WindowsMenu",CSetting::TYPE_RADIO,IDS_OPEN_WSM,IDS_OPEN_WSM_TIP}, + {L"Command",CSetting::TYPE_RADIO,IDS_OPEN_CMD,IDS_OPEN_CMD_TIP}, /* {L"Both",CSetting::TYPE_RADIO,IDS_OPEN_BOTH,IDS_OPEN_BOTH_TIP,0,CSetting::FLAG_HIDDEN}, {L"Desktop",CSetting::TYPE_RADIO,IDS_OPEN_DESKTOP,IDS_OPEN_DESKTOP_TIP,0,CSetting::FLAG_HIDDEN}, {L"Cortana",CSetting::TYPE_RADIO,IDS_OPEN_CORTANA,IDS_OPEN_CORTANA_TIP},*/ + {L"MiddleClickCommand",CSetting::TYPE_STRING,IDS_OPEN_CMD_TEXT,IDS_OPEN_CMD_TEXT_TIP,"taskmgr",0,L"MiddleClick=3",L"Command"}, {L"Hover",CSetting::TYPE_INT,IDS_HOVER,IDS_HOVER_TIP,0}, {L"Nothing",CSetting::TYPE_RADIO,IDS_OPEN_NOTHING,IDS_OPEN_NOTHING_TIP}, {L"ClassicMenu",CSetting::TYPE_RADIO,IDS_OPEN_CSM,IDS_OPEN_CSM_TIP}, {L"WindowsMenu",CSetting::TYPE_RADIO,IDS_OPEN_WSM,IDS_OPEN_WSM_TIP}, + {L"Command",CSetting::TYPE_RADIO,IDS_OPEN_CMD,IDS_OPEN_CMD_TIP}, + {L"HoverCommand",CSetting::TYPE_STRING,IDS_OPEN_CMD_TEXT,IDS_OPEN_CMD_TEXT_TIP,"",0,L"Hover=3",L"Command"}, {L"StartHoverDelay",CSetting::TYPE_INT,IDS_HOVER_DELAY,IDS_HOVER_DELAY_TIP,1000,0,L"Hover",L"Hover"}, {L"ShiftRight",CSetting::TYPE_BOOL,IDS_RIGHT_SHIFT,IDS_RIGHT_SHIFT_TIP,0}, {L"CSMHotkey",CSetting::TYPE_HOTKEY,IDS_CSM_HOTKEY,IDS_CSM_HOTKEY_TIP,0}, @@ -4245,6 +4282,7 @@ CSetting g_Settings[]={ {L"PinnedPrograms",CSetting::TYPE_INT,IDS_PINNED_PROGRAMS,IDS_PINNED_PROGRAMS_TIP,PINNED_PROGRAMS_PINNED}, {L"FastItems",CSetting::TYPE_RADIO,IDS_FAST_ITEMS,IDS_FAST_ITEMS_TIP}, {L"PinnedItems",CSetting::TYPE_RADIO,IDS_PINNED_ITEMS,IDS_PINNED_ITEMS_TIP}, + {L"PinnedItemsPath",CSetting::TYPE_DIRECTORY,IDS_PINNED_PATH,IDS_PINNED_PATH_TIP,L"%APPDATA%\\OpenShell\\Pinned",0,L"PinnedPrograms=1",L"PinnedItems"}, {L"RecentPrograms",CSetting::TYPE_INT,IDS_RECENT_PROGRAMS,IDS_RECENT_PROGRAMS_TIP,RECENT_PROGRAMS_RECENT,CSetting::FLAG_BASIC}, {L"None",CSetting::TYPE_RADIO,IDS_NO_RECENT,IDS_NO_RECENT_TIP}, {L"Recent",CSetting::TYPE_RADIO,IDS_SHOW_RECENT,IDS_SHOW_RECENT_TIP}, @@ -4313,12 +4351,17 @@ CSetting g_Settings[]={ {L"UserNameCommand",CSetting::TYPE_STRING,IDS_NAME_COMMAND,IDS_NAME_COMMAND_TIP,L"control nusrmgr.cpl"}, {L"SearchFilesCommand",CSetting::TYPE_STRING,IDS_SEARCH_COMMAND,IDS_SEARCH_COMMAND_TIP,L"search-ms:",CSetting::FLAG_MENU_CLASSIC_BOTH}, {L"ExpandFolderLinks",CSetting::TYPE_BOOL,IDS_EXPAND_LINKS,IDS_EXPAND_LINKS_TIP,1}, + {L"SingleClickFolders",CSetting::TYPE_BOOL,IDS_NO_DBLCLICK,IDS_NO_DBLCLICK_TIP,0}, + {L"OpenTruePath",CSetting::TYPE_BOOL,IDS_OPEN_TRUE_PATH,IDS_OPEN_TRUE_PATH_TIP,1}, {L"EnableTouch",CSetting::TYPE_BOOL,IDS_ENABLE_TOUCH,IDS_ENABLE_TOUCH_TIP,1}, {L"EnableAccessibility",CSetting::TYPE_BOOL,IDS_ACCESSIBILITY,IDS_ACCESSIBILITY_TIP,1}, - {L"ShowNextToTaskbar",CSetting::TYPE_BOOL,IDS_NEXTTASKBAR,IDS_NEXTTASKBAR_TIP,0}, + {L"ShowNextToTaskbar",CSetting::TYPE_BOOL,IDS_NEXTTASKBAR,IDS_NEXTTASKBAR_TIP,1}, {L"PreCacheIcons",CSetting::TYPE_BOOL,IDS_CACHE_ICONS,IDS_CACHE_ICONS_TIP,1,CSetting::FLAG_COLD}, {L"DelayIcons",CSetting::TYPE_BOOL,IDS_DELAY_ICONS,IDS_DELAY_ICONS_TIP,1,CSetting::FLAG_COLD}, + {L"BoldSettings",CSetting::TYPE_BOOL,IDS_BOLD_SETTINGS,IDS_BOLD_SETTINGS_TIP,1}, {L"ReportSkinErrors",CSetting::TYPE_BOOL,IDS_SKIN_ERRORS,IDS_SKIN_ERRORS_TIP,0}, + {L"EnableAccelerators",CSetting::TYPE_BOOL,IDS_ENABLE_ACCELERATORS,IDS_ENABLE_ACCELERATORS_TIP,1}, + {L"AltAccelerators",CSetting::TYPE_BOOL,IDS_ALT_ACCELERATORS,IDS_ALT_ACCELERATORS_TIP,0,0,L"EnableAccelerators",L"EnableAccelerators"}, {L"SearchBoxSettings",CSetting::TYPE_GROUP,IDS_SEARCH_BOX}, {L"SearchBox",CSetting::TYPE_INT,IDS_SHOW_SEARCH_BOX,IDS_SHOW_SEARCH_BOX_TIP,SEARCHBOX_TAB,CSetting::FLAG_BASIC}, @@ -4326,6 +4369,8 @@ CSetting g_Settings[]={ {L"Normal",CSetting::TYPE_RADIO,IDS_SEARCH_BOX_SHOW,IDS_SEARCH_BOX_SHOW_TIP}, {L"Tab",CSetting::TYPE_RADIO,IDS_SEARCH_BOX_TAB,IDS_SEARCH_BOX_TAB_TIP}, {L"SearchSelect",CSetting::TYPE_BOOL,IDS_SEARCH_BOX_SEL,IDS_SEARCH_BOX_SEL_TIP,1,0,L"SearchBox=1",L"Normal"}, + {L"SearchHint",CSetting::TYPE_BOOL,IDS_SEARCH_HINT,IDS_SEARCH_HINT_TIP,0,0,L"SearchBox"}, + {L"SearchHintText",CSetting::TYPE_STRING,IDS_NEW_SEARCH_HINT,IDS_NEW_SEARCH_HINT_TIP,L"",0,L"#SearchHint",L"SearchHint"}, {L"SearchTrack",CSetting::TYPE_BOOL,IDS_SEARCH_TRACK,IDS_SEARCH_TRACK_TIP,1,0,L"SearchBox"}, {L"SearchResults",CSetting::TYPE_INT,IDS_SEARCH_MAX2,IDS_SEARCH_MAX_TIP2,5,CSetting::FLAG_MENU_CLASSIC_BOTH,L"SearchBox"}, {L"SearchResultsMax",CSetting::TYPE_INT,IDS_SEARCH_MAX3,IDS_SEARCH_MAX_TIP3,20,CSetting::FLAG_MENU_CLASSIC_BOTH,L"SearchBox"}, @@ -4340,6 +4385,7 @@ CSetting g_Settings[]={ {L"SearchContents",CSetting::TYPE_BOOL,IDS_SEARCH_CONTENTS,IDS_SEARCH_CONTENTS_TIP,1,0,L"#SearchFiles",L"SearchFiles"}, {L"SearchCategories",CSetting::TYPE_BOOL,IDS_SEARCH_CATEGORIES,IDS_SEARCH_CATEGORIES_TIP,1,0,L"#SearchFiles",L"SearchFiles"}, {L"SearchInternet",CSetting::TYPE_BOOL,IDS_SEARCH_INTERNET,IDS_SEARCH_INTERNET_TIP,1,0,L"SearchBox"}, + {L"MoreResults",CSetting::TYPE_BOOL,IDS_MORE_RESULTS,IDS_MORE_RESULTS_TIP,1,0,L"SearchBox"}, {L"Look",CSetting::TYPE_GROUP,IDS_LOOK_SETTINGS}, {L"SmallIconSize",CSetting::TYPE_INT,IDS_SMALL_SIZE_SM,IDS_SMALL_SIZE_SM_TIP,-1,CSetting::FLAG_COLD}, // 16 for DPI<=96, 20 for DPI<=120, 24 otherwise @@ -4621,6 +4667,48 @@ void UpgradeSettings( bool bShared ) } } +static CString GetWindowsBrandingString() +{ + CString retval; + + if (GetWinVersion() >= WIN_VER_WIN10) + { + auto winbrand = LoadLibraryEx(L"winbrand.dll", nullptr, LOAD_LIBRARY_SEARCH_SYSTEM32); + if (winbrand) + { + PWSTR (WINAPI * BrandingFormatString)(PCWSTR pstrFormat); + BrandingFormatString = (decltype(BrandingFormatString))GetProcAddress(winbrand, "BrandingFormatString"); + if (BrandingFormatString) + { + auto osName = BrandingFormatString(L"%WINDOWS_LONG%"); + if (osName) + { + retval = osName; + GlobalFree(osName); + } + } + + FreeLibrary(winbrand); + } + } + + if (retval.IsEmpty()) + { + // fallback for older Windows + wchar_t title[256] = L"Windows"; + + if (CRegKey reg; reg.Open(HKEY_LOCAL_MACHINE, L"Software\\Microsoft\\Windows NT\\CurrentVersion", KEY_READ) == ERROR_SUCCESS) + { + ULONG size = _countof(title); + reg.QueryStringValue(L"ProductName", title, &size); + } + + retval = title; + } + + return retval; +} + void UpdateSettings( void ) { { @@ -4743,16 +4831,10 @@ void UpdateSettings( void ) UpdateSetting(L"NumericSort",CComVariant(SHRestricted(REST_NOSTRCMPLOGICAL)?0:1),false); - wchar_t title[256]=L"Windows"; - ULONG size=_countof(title); - { - CRegKey regTitle; - if (regTitle.Open(HKEY_LOCAL_MACHINE,L"Software\\Microsoft\\Windows NT\\CurrentVersion",KEY_READ)==ERROR_SUCCESS) - regTitle.QueryStringValue(L"ProductName",title,&size); - } - UpdateSetting(L"MenuCaption",CComVariant(title),false); + UpdateSetting(L"MenuCaption",CComVariant(GetWindowsBrandingString()),false); - size=_countof(title); + wchar_t title[256]{}; + ULONG size=_countof(title); if (!GetUserNameEx(NameDisplay,title,&size)) { // GetUserNameEx may fail (for example on Home editions). use the login name @@ -4883,7 +4965,7 @@ void UpdateSettings( void ) if (GetWinVersion()>WIN_VER_WIN7) { int color=GetSystemGlassColor8(); - UpdateSetting(L"TaskbarColor",CComVariant(((color&0xFF)<<16)|(color&0xFF00)|((color>>16)&0xFF)),false); + UpdateSetting(L"TaskbarColor",CComVariant(RgbToBgr(color)),false); } if (GetWinVersion()<=WIN_VER_WIN7) @@ -4983,15 +5065,15 @@ void UpdateSettings( void ) HIGHCONTRAST contrast={sizeof(contrast)}; if (SystemParametersInfo(SPI_GETHIGHCONTRAST,sizeof(contrast),&contrast,0) && (contrast.dwFlags&HCF_HIGHCONTRASTON)) { - options1=L"CAPTION=1\nUSER_IMAGE=0\nUSER_NAME=0\nCENTER_NAME=0\nSMALL_ICONS=0\nTHICK_BORDER=0\nSOLID_SELECTION=1"; - options2=L"NO_ICONS=1\nUSER_IMAGE=1\nUSER_NAME=0\nCENTER_NAME=0\nSMALL_ICONS=0\nTHICK_BORDER=0\nSOLID_SELECTION=1"; - options3=L"USER_IMAGE=1\nSMALL_ICONS=0\nTHICK_BORDER=0\nSOLID_SELECTION=1"; + options1=L"CAPTION=1\nUSER_IMAGE=0\nUSER_NAME=0\nCENTER_NAME=0\nSMALL_ICONS=0\nTHICK_BORDER=0\nSOLID_SELECTION=1\n"; + options2=L"NO_ICONS=1\nUSER_IMAGE=1\nUSER_NAME=0\nCENTER_NAME=0\nSMALL_ICONS=0\nTHICK_BORDER=0\nSOLID_SELECTION=1\n"; + options3=L"USER_IMAGE=1\nSMALL_ICONS=0\nTHICK_BORDER=0\nSOLID_SELECTION=1\n"; } else { - options1=L"CAPTION=1\nUSER_IMAGE=0\nUSER_NAME=0\nCENTER_NAME=0\nSMALL_ICONS=0\nTHICK_BORDER=0\nSOLID_SELECTION=0"; - options2=L"NO_ICONS=1\nUSER_IMAGE=1\nUSER_NAME=0\nCENTER_NAME=0\nSMALL_ICONS=0\nTHICK_BORDER=0\nSOLID_SELECTION=0"; - options3=L"USER_IMAGE=1\nSMALL_ICONS=0\nTHICK_BORDER=0\nSOLID_SELECTION=0"; + options1=L"CAPTION=1\nUSER_IMAGE=0\nUSER_NAME=0\nCENTER_NAME=0\nSMALL_ICONS=0\nTHICK_BORDER=0\nSOLID_SELECTION=0\n"; + options2=L"NO_ICONS=1\nUSER_IMAGE=1\nUSER_NAME=0\nCENTER_NAME=0\nSMALL_ICONS=0\nTHICK_BORDER=0\nSOLID_SELECTION=0\n"; + options3=L"USER_IMAGE=1\nSMALL_ICONS=0\nTHICK_BORDER=0\nSOLID_SELECTION=0\n"; } } else if (GetWinVersion()>24,(ver>>16)&0xFF,ver&0xFFFF); else Sprintf(title,_countof(title),LoadStringEx(IDS_SETTINGS_TITLE)); - EditSettings(title,bModal,tab); + EditSettings(title,bModal,tab,L"OpenShell.StartMenu.Settings"); } bool DllImportSettingsXml( const wchar_t *fname ) diff --git a/Src/StartMenu/StartMenuDLL/SkinManager.cpp b/Src/StartMenu/StartMenuDLL/SkinManager.cpp index 213a09d8e..5bf2d301a 100644 --- a/Src/StartMenu/StartMenuDLL/SkinManager.cpp +++ b/Src/StartMenu/StartMenuDLL/SkinManager.cpp @@ -503,6 +503,17 @@ SIZE MenuSkin::ScaleSkinElement( const SIZE &size ) const return res; } +_Success_(return != FALSE) +BOOL WINAPI SystemParametersInfoForDpi(_In_ UINT uiAction, _In_ UINT uiParam, _Pre_maybenull_ _Post_valid_ PVOID pvParam, _In_ UINT fWinIni, _In_ UINT dpi) +{ + static auto p = static_cast((void*)GetProcAddress(GetModuleHandle(L"user32.dll"), "SystemParametersInfoForDpi")); + if (p) + return p(uiAction, uiParam, pvParam, fWinIni, dpi); + + // fall-back for older systems + return SystemParametersInfo(uiAction, uiParam, pvParam, fWinIni); +} + HFONT MenuSkin::LoadSkinFont( const wchar_t *str, const wchar_t *name, int weight, float size, bool bScale ) const { DWORD quality=DEFAULT_QUALITY; @@ -545,7 +556,7 @@ HFONT MenuSkin::LoadSkinFont( const wchar_t *str, const wchar_t *name, int weigh { // get the default menu font NONCLIENTMETRICS metrics={sizeof(metrics)}; - SystemParametersInfo(SPI_GETNONCLIENTMETRICS,NULL,&metrics,0); + SystemParametersInfoForDpi(SPI_GETNONCLIENTMETRICS,sizeof(metrics),&metrics,0,Dpi); metrics.lfMenuFont.lfQuality=(BYTE)quality; return CreateFontIndirect(&metrics.lfMenuFont); } @@ -3235,10 +3246,14 @@ void GetSkinsPath( wchar_t *path ) { GetModuleFileName(g_Instance,path,_MAX_PATH); *PathFindFileName(path)=0; -#ifdef BUILD_SETUP Strcat(path,_MAX_PATH,L"Skins\\"); -#else - Strcat(path,_MAX_PATH,L"..\\Skins\\"); + +#ifndef BUILD_SETUP + if (!PathIsDirectory(path)) + { + *PathFindFileName(path) = 0; + Strcat(path,_MAX_PATH,L"..\\Skins\\"); + } #endif } diff --git a/Src/StartMenu/StartMenuDLL/StartButton.cpp b/Src/StartMenu/StartMenuDLL/StartButton.cpp index 074827410..f279fa10f 100644 --- a/Src/StartMenu/StartMenuDLL/StartButton.cpp +++ b/Src/StartMenu/StartMenuDLL/StartButton.cpp @@ -144,7 +144,7 @@ LRESULT CStartButton::OnCreate( UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& b m_Icon=(HICON)LoadImage(g_Instance,MAKEINTRESOURCE(IDI_APPICON),IMAGE_ICON,START_ICON_SIZE,START_ICON_SIZE,LR_DEFAULTCOLOR); } int dpi=CItemManager::GetDPI(false); - m_Font=CreateFont(10*dpi/72,0,0,0,FW_BOLD,0,0,0,DEFAULT_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH,L"Tahoma"); + m_Font=CreateFont(MulDiv(10,dpi,72),0,0,0,FW_BOLD,0,0,0,DEFAULT_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH,L"Tahoma"); int val=1; DwmSetWindowAttribute(m_hWnd,DWMWA_EXCLUDED_FROM_PEEK,&val,sizeof(val)); val=DWMFLIP3D_EXCLUDEABOVE; @@ -154,6 +154,7 @@ LRESULT CStartButton::OnCreate( UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& b OnThemeChanged(WM_THEMECHANGED,0,0,bHandled); m_bPressed=true; SetPressed(false); + ResizeClient(m_Size.cx,m_Size.cy); bHandled=FALSE; return 0; } @@ -525,21 +526,21 @@ void CStartButton::LoadBitmap( void ) } else { + int dpi=GetDpi(GetParent()); bool bResource=false; std::vector buttonAnim; if (*path) { - m_Bitmap=LoadImageFile(path,&size,true,true,&buttonAnim); + m_Bitmap=LoadImageFile(path,&size,true,true,&buttonAnim,dpi); } if (!m_Bitmap) { int id; - int dpi=CItemManager::GetDPI(false); if (dpi<120) id=IDB_BUTTON96; else if (dpi<144) id=IDB_BUTTON120; - else if (dpi<180) + else if (dpi<168) id=IDB_BUTTON144; else id=IDB_BUTTON180; @@ -604,55 +605,12 @@ void CStartButton::LoadBitmap( void ) static std::map g_StartButtons; -HWND CreateStartButton( int taskbarId, HWND taskBar, HWND rebar, const RECT &rcTask ) +HWND CreateStartButton( int taskbarId, HWND taskBar, HWND rebar ) { bool bRTL=(GetWindowLongPtr(rebar,GWL_EXSTYLE)&WS_EX_LAYOUTRTL)!=0; DWORD styleTopmost=GetWindowLongPtr(taskBar,GWL_EXSTYLE)&WS_EX_TOPMOST; CStartButton &button=g_StartButtons[taskbarId]; button.Create(taskBar,NULL,NULL,WS_POPUP,styleTopmost|WS_EX_TOOLWINDOW|WS_EX_LAYERED,0U,(void*)(intptr_t)(taskbarId*2+(bRTL?1:0))); - SIZE size=button.GetSize(); - RECT rcButton; - MONITORINFO info; - UINT uEdge=GetTaskbarPosition(taskBar,&info,NULL,NULL); - if (uEdge==ABE_LEFT || uEdge==ABE_RIGHT) - { - if (GetSettingInt(L"StartButtonType")!=START_BUTTON_CUSTOM || !GetSettingBool(L"StartButtonAlign")) - rcButton.left=(rcTask.left+rcTask.right-size.cx)/2; - else if (uEdge==ABE_LEFT) - rcButton.left=rcTask.left; - else - rcButton.left=rcTask.right-size.cx; - rcButton.top=rcTask.top; - } - else - { - if (bRTL) - rcButton.left=rcTask.right-size.cx; - else - rcButton.left=rcTask.left; - if (GetSettingInt(L"StartButtonType")!=START_BUTTON_CUSTOM || !GetSettingBool(L"StartButtonAlign")) - rcButton.top=(rcTask.top+rcTask.bottom-size.cy)/2; - else if (uEdge==ABE_TOP) - rcButton.top=rcTask.top; - else - rcButton.top=rcTask.bottom-size.cy; - } - rcButton.right=rcButton.left+size.cx; - rcButton.bottom=rcButton.top+size.cy; - g_bAllowMoveButton=true; - button.SetWindowPos(HWND_TOP,&rcButton,SWP_SHOWWINDOW|SWP_NOOWNERZORDER|SWP_NOACTIVATE); - g_bAllowMoveButton=false; - - RECT rc; - IntersectRect(&rc,&rcButton,&info.rcMonitor); - HRGN rgn=CreateRectRgn(rc.left-rcButton.left,rc.top-rcButton.top,rc.right-rcButton.left,rc.bottom-rcButton.top); - if (!SetWindowRgn(button,rgn,FALSE)) - { - AddTrackedObject(rgn); - DeleteObject(rgn); - } - - button.UpdateButton(); return button.m_hWnd; } diff --git a/Src/StartMenu/StartMenuDLL/StartButton.h b/Src/StartMenu/StartMenuDLL/StartButton.h index 13b8686d4..7ff7ffb43 100644 --- a/Src/StartMenu/StartMenuDLL/StartButton.h +++ b/Src/StartMenu/StartMenuDLL/StartButton.h @@ -12,7 +12,7 @@ enum TStartButtonType // START_BUTTON_METRO, }; -HWND CreateStartButton( int taskbarId, HWND taskBar, HWND rebar, const RECT &rcTask ); +HWND CreateStartButton( int taskbarId, HWND taskBar, HWND rebar ); void DestroyStartButton( int taskbarId ); void UpdateStartButton( int taskbarId ); void PressStartButton( int taskbarId, bool bPressed ); diff --git a/Src/StartMenu/StartMenuDLL/StartMenuDLL.cpp b/Src/StartMenu/StartMenuDLL/StartMenuDLL.cpp index fa5bc3e5c..9111cb40c 100644 --- a/Src/StartMenu/StartMenuDLL/StartMenuDLL.cpp +++ b/Src/StartMenu/StartMenuDLL/StartMenuDLL.cpp @@ -47,7 +47,7 @@ static HWND g_Tooltip; static TOOLINFO g_StartButtonTool; static bool g_bHotkeyShift; static int g_HotkeyCSM, g_HotkeyWSM, g_HotkeyShiftID, g_HotkeyCSMID, g_HotkeyWSMID; -static HHOOK g_ProgHook, g_StartHook, g_AppManagerHook, g_NewWindowHook, g_StartMenuHook; +static HHOOK g_ProgHook, g_StartHook, g_StartMouseHook, g_AppManagerHook, g_NewWindowHook, g_StartMenuHook; static bool g_bAllProgramsTimer; static bool g_bInMenu; static DWORD g_LastClickTime; @@ -67,6 +67,8 @@ static SIZE g_TaskbarTextureSize; static TTaskbarTile g_TaskbarTileH, g_TaskbarTileV; static RECT g_TaskbarMargins; int g_CurrentCSMTaskbar=-1, g_CurrentWSMTaskbar=-1; +// ExplorerPatcher taskbar +static bool g_epTaskbar = false; static void FindWindowsMenu( void ); static void RecreateStartButton( size_t taskbarId ); @@ -79,6 +81,7 @@ enum OPEN_NOTHING, OPEN_CLASSIC, OPEN_WINDOWS, + OPEN_CUSTOM, OPEN_BOTH, OPEN_DESKTOP, OPEN_CORTANA, @@ -401,6 +404,7 @@ static TaskbarInfo *FindTaskBarInfoBar( HWND bar ) static LRESULT CALLBACK HookProgManThread( int code, WPARAM wParam, LPARAM lParam ); static LRESULT CALLBACK HookDesktopThread( int code, WPARAM wParam, LPARAM lParam ); +static LRESULT CALLBACK HookDesktopThreadMouse(int code, WPARAM wParam, LPARAM lParam); static BOOL CALLBACK FindTooltipEnum( HWND hwnd, LPARAM lParam ) { @@ -601,6 +605,11 @@ UINT GetTaskbarPosition( HWND taskBar, MONITORINFO *pInfo, HMONITOR *pMonitor, R SHAppBarMessage(ABM_GETTASKBARPOS,&appbar); if (pRc) { + if (RECT rc; GetWindowRgnBox(taskBar,&rc)!=ERROR) + { + MapWindowPoints(taskBar,NULL,(POINT*)&rc,2); + appbar.rc=rc; + } *pRc=appbar.rc; RECT rc; GetWindowRect(taskBar,&rc); @@ -615,12 +624,12 @@ UINT GetTaskbarPosition( HWND taskBar, MONITORINFO *pInfo, HMONITOR *pMonitor, R if (pRc->right>rc.right) pRc->right=rc.right; } } + HMONITOR monitor=MonitorFromRect(&appbar.rc,MONITOR_DEFAULTTONEAREST); + if (pMonitor) *pMonitor=monitor; if (pInfo) { pInfo->cbSize=sizeof(MONITORINFO); - HMONITOR monitor=MonitorFromRect(&appbar.rc,MONITOR_DEFAULTTONEAREST); GetMonitorInfo(monitor,pInfo); - if (pMonitor) *pMonitor=monitor; } return appbar.uEdge; } @@ -670,21 +679,45 @@ UINT GetTaskbarPosition( HWND taskBar, MONITORINFO *pInfo, HMONITOR *pMonitor, R bool PointAroundStartButton( size_t taskbarId, const CPoint &pt ) { const TaskbarInfo *taskBar=GetTaskbarInfo(taskbarId); - if (!taskBar || !taskBar->startButton) return false; - RECT rc; + if (!taskBar || !(taskBar->startButton || taskBar->oldButton)) return false; + CRect rc; GetWindowRect(taskBar->taskBar,&rc); if (!PtInRect(&rc,pt)) return false; - UINT uEdge=GetTaskbarPosition(taskBar->taskBar,NULL,NULL,NULL); + bool rtl=GetWindowLongPtr(taskBar->taskBar,GWL_EXSTYLE)&WS_EX_LAYOUTRTL; + + CRect rcStart; + if (taskBar->startButton) + GetWindowRect(taskBar->startButton,&rcStart); + + CRect rcOld; + if (taskBar->oldButton) + { + GetWindowRect(taskBar->oldButton,&rcOld); + + if (IsWin11()) + { + // on Win11 the Start button rectangle is a bit smaller that actual XAML active area + // lets make it a bit wider to avoid accidental original Start menu triggers + const int adjust=ScaleForDpi(taskBar->taskBar,1); + if (rtl) + rcOld.left-=adjust; + else + rcOld.right+=adjust; + } + } + + rc.UnionRect(&rcStart,&rcOld); + // check if the point is inside the start button rect - GetWindowRect(taskBar->startButton,&rc); + UINT uEdge=GetTaskbarPosition(taskBar->taskBar,NULL,NULL,NULL); if (uEdge==ABE_LEFT || uEdge==ABE_RIGHT) - return pt.ytaskBar,GWL_EXSTYLE)&WS_EX_LAYOUTRTL) - return pt.x>rc.left; + return pt.y>=rc.top && pt.yrc.left && pt.x<=rc.right; else - return pt.x=rc.left && pt.xtaskbarId) != IsTaskbarSmallIcons()) + RecreateStartButton(taskBar->taskbarId); + + RECT rcTask; + GetWindowRect(taskBar->taskBar, &rcTask); + if (IsTouchTaskbar()) + { + if (RECT rc; GetWindowRgnBox(taskBar->taskBar, &rc) != ERROR) + { + MapWindowPoints(taskBar->taskBar, NULL, (POINT*)&rc, 2); + rcTask = rc; + } + } + MONITORINFO info; + UINT uEdge = GetTaskbarPosition(taskBar->taskBar, &info, NULL, NULL); + DWORD buttonFlags = SWP_NOACTIVATE | SWP_NOOWNERZORDER | SWP_NOSIZE; + if (IsWindowVisible(taskBar->taskBar)) + buttonFlags |= SWP_SHOWWINDOW; + else + buttonFlags |= SWP_HIDEWINDOW; + + APPBARDATA appbar = { sizeof(appbar) }; + if (SHAppBarMessage(ABM_GETSTATE, &appbar) & ABS_AUTOHIDE) + { + bool bHide = false; + if (uEdge == ABE_LEFT) + bHide = (rcTask.right < info.rcMonitor.left + 5); + else if (uEdge == ABE_RIGHT) + bHide = (rcTask.left > info.rcMonitor.right - 5); + else if (uEdge == ABE_TOP) + bHide = (rcTask.bottom < info.rcMonitor.top + 5); + else + bHide = (rcTask.top > info.rcMonitor.bottom - 5); + if (bHide) + buttonFlags = (buttonFlags & ~SWP_SHOWWINDOW) | SWP_HIDEWINDOW; + } + if (uEdge == ABE_TOP || uEdge == ABE_BOTTOM) + { + if (rcTask.left < info.rcMonitor.left) rcTask.left = info.rcMonitor.left; + if (rcTask.right > info.rcMonitor.right) rcTask.right = info.rcMonitor.right; + } + else + { + if (rcTask.top < info.rcMonitor.top) rcTask.top = info.rcMonitor.top; + } + + HWND zPos = NULL; + if (pPos->flags & SWP_NOZORDER) + buttonFlags |= SWP_NOZORDER; + else + { + zPos = pPos->hwndInsertAfter; + if (zPos == HWND_TOP && !(GetWindowLongPtr(taskBar->startButton, GWL_EXSTYLE) & WS_EX_TOPMOST)) + zPos = HWND_TOPMOST; + if (zPos == HWND_TOPMOST && !(GetWindowLongPtr(taskBar->taskBar, GWL_EXSTYLE) & WS_EX_TOPMOST)) + zPos = HWND_TOP; + if (zPos == HWND_BOTTOM) + buttonFlags |= SWP_NOZORDER; + if (zPos == taskBar->startButton) + buttonFlags |= SWP_NOZORDER; + } + + if (!IsStartButtonSmallIcons(taskBar->taskbarId)) + { + bool bClassic; + if (GetWinVersion() < WIN_VER_WIN8) + bClassic = !IsAppThemed(); + else + { + HIGHCONTRAST contrast = { sizeof(contrast) }; + bClassic = (SystemParametersInfo(SPI_GETHIGHCONTRAST, sizeof(contrast), &contrast, 0) && (contrast.dwFlags & HCF_HIGHCONTRASTON)); + } + if (!bClassic) + { + if (uEdge == ABE_TOP) + OffsetRect(&rcTask, 0, -1); + else if (uEdge == ABE_BOTTOM) + OffsetRect(&rcTask, 0, 1); + } + } + + RECT rcOldButton; + if (taskBar->oldButton) + GetWindowRect(taskBar->oldButton, &rcOldButton); + + int x, y; + if (uEdge == ABE_LEFT || uEdge == ABE_RIGHT) + { + if (GetSettingInt(L"StartButtonType") != START_BUTTON_CUSTOM || !GetSettingBool(L"StartButtonAlign")) + x = (rcTask.left + rcTask.right - taskBar->startButtonSize.cx) / 2; + else if (uEdge == ABE_LEFT) + x = rcTask.left; + else + x = rcTask.right - taskBar->startButtonSize.cx; + y = taskBar->oldButton ? rcOldButton.top : rcTask.top; + } + else + { + if (GetWindowLongPtr(taskBar->rebar, GWL_EXSTYLE) & WS_EX_LAYOUTRTL) + x = (taskBar->oldButton ? rcOldButton.right : rcTask.right) - taskBar->startButtonSize.cx; + else + x = taskBar->oldButton ? rcOldButton.left : rcTask.left; + if (GetSettingInt(L"StartButtonType") != START_BUTTON_CUSTOM || !GetSettingBool(L"StartButtonAlign")) + y = (rcTask.top + rcTask.bottom - taskBar->startButtonSize.cy) / 2; + else if (uEdge == ABE_TOP) + y = rcTask.top; + else + y = rcTask.bottom - taskBar->startButtonSize.cy; + + // Start button on Win11 is a bit shifted to the right + // We will shift our Aero button to cover original button + if (IsWin11() && (x == info.rcMonitor.left) && (GetStartButtonType() == START_BUTTON_AERO) && !g_epTaskbar) + x += ScaleForDpi(taskBar->taskBar, 6); + } + + RECT rcButton = { x, y, x + taskBar->startButtonSize.cx, y + taskBar->startButtonSize.cy }; + RECT rc; + IntersectRect(&rc, &rcButton, &info.rcMonitor); + HRGN rgn = CreateRectRgn(rc.left - x, rc.top - y, rc.right - x, rc.bottom - y); + if (!SetWindowRgn(taskBar->startButton, rgn, FALSE)) + { + AddTrackedObject(rgn); + DeleteObject(rgn); + } + + SetWindowPos(taskBar->startButton, zPos, x, y, 0, 0, buttonFlags); + + if (buttonFlags & SWP_SHOWWINDOW) + UpdateStartButton(taskBar->taskbarId); +} + static LRESULT CALLBACK SubclassWin81StartButton( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, UINT_PTR uIdSubclass, DWORD_PTR dwRefData ) { + TaskbarInfo* taskBar = GetTaskbarInfo((int)dwRefData); + if (uMsg==WM_WINDOWPOSCHANGING) { // keep the original start button hidden at all times - const TaskbarInfo *taskBar=GetTaskbarInfo((int)dwRefData); if (taskBar && taskBar->bHideButton) { ((WINDOWPOS*)lParam)->flags&=~SWP_SHOWWINDOW; } } + if (uMsg==WM_WINDOWPOSCHANGED) + { + if (taskBar && taskBar->bReplaceButton) + { + UpdateStartButtonPosition(taskBar,(WINDOWPOS*)lParam); + } + } if (uMsg==WM_SIZE) { RECT rc; GetWindowRect(hWnd,&rc); rc.right-=rc.left; rc.bottom-=rc.top; - TaskbarInfo *taskBar=GetTaskbarInfo((int)dwRefData); if (taskBar && (taskBar->oldButtonSize.cx!=rc.right || taskBar->oldButtonSize.cy!=rc.bottom)) { taskBar->oldButtonSize.cx=rc.right; @@ -1438,7 +1624,7 @@ static void ComputeTaskbarColors( int *data ) { bool bDefLook; int look=GetSettingInt(L"TaskbarLook",bDefLook); - if (GetWinVersion()=WIN_VER_WIN10) { CComPtr pImmersiveShell; @@ -1650,116 +1845,7 @@ static LRESULT CALLBACK SubclassTaskBarProc( HWND hWnd, UINT uMsg, WPARAM wParam { if (taskBar->bReplaceButton) { - if (IsStartButtonSmallIcons(taskBar->taskbarId)!=IsTaskbarSmallIcons()) - RecreateStartButton((int)dwRefData); - - WINDOWPOS *pPos=(WINDOWPOS*)lParam; - RECT rcTask; - GetWindowRect(hWnd,&rcTask); - MONITORINFO info; - UINT uEdge=GetTaskbarPosition(hWnd,&info,NULL,NULL); - DWORD buttonFlags=SWP_NOACTIVATE|SWP_NOOWNERZORDER|SWP_NOSIZE; - if (IsWindowVisible(taskBar->taskBar)) - buttonFlags|=SWP_SHOWWINDOW; - else - buttonFlags|=SWP_HIDEWINDOW; - - APPBARDATA appbar={sizeof(appbar)}; - if (SHAppBarMessage(ABM_GETSTATE,&appbar)&ABS_AUTOHIDE) - { - bool bHide=false; - if (uEdge==ABE_LEFT) - bHide=(rcTask.rightinfo.rcMonitor.right-5); - else if (uEdge==ABE_TOP) - bHide=(rcTask.bottominfo.rcMonitor.bottom-5); - if (bHide) - buttonFlags=(buttonFlags&~SWP_SHOWWINDOW)|SWP_HIDEWINDOW; - } - if (uEdge==ABE_TOP || uEdge==ABE_BOTTOM) - { - if (rcTask.leftinfo.rcMonitor.right) rcTask.right=info.rcMonitor.right; - } - else - { - if (rcTask.toptaskbarId)) - { - bool bClassic; - if (GetWinVersion()flags&SWP_NOZORDER) - buttonFlags|=SWP_NOZORDER; - else - { - zPos=pPos->hwndInsertAfter; - if (zPos==HWND_TOP && !(GetWindowLongPtr(taskBar->startButton,GWL_EXSTYLE)&WS_EX_TOPMOST)) - zPos=HWND_TOPMOST; - if (zPos==HWND_TOPMOST && !(GetWindowLongPtr(hWnd,GWL_EXSTYLE)&WS_EX_TOPMOST)) - zPos=HWND_TOP; - if (zPos==HWND_BOTTOM) - buttonFlags|=SWP_NOZORDER; - if (zPos==taskBar->startButton) - buttonFlags|=SWP_NOZORDER; - } - - int x, y; - if (uEdge==ABE_LEFT || uEdge==ABE_RIGHT) - { - if (GetSettingInt(L"StartButtonType")!=START_BUTTON_CUSTOM || !GetSettingBool(L"StartButtonAlign")) - x=(rcTask.left+rcTask.right-taskBar->startButtonSize.cx)/2; - else if (uEdge==ABE_LEFT) - x=rcTask.left; - else - x=rcTask.right-taskBar->startButtonSize.cx; - y=rcTask.top; - } - else - { - if (GetWindowLongPtr(taskBar->rebar,GWL_EXSTYLE)&WS_EX_LAYOUTRTL) - x=rcTask.right-taskBar->startButtonSize.cx; - else - x=rcTask.left; - if (GetSettingInt(L"StartButtonType")!=START_BUTTON_CUSTOM || !GetSettingBool(L"StartButtonAlign")) - y=(rcTask.top+rcTask.bottom-taskBar->startButtonSize.cy)/2; - else if (uEdge==ABE_TOP) - y=rcTask.top; - else - y=rcTask.bottom-taskBar->startButtonSize.cy; - } - RECT rcButton={x,y,x+taskBar->startButtonSize.cx,y+taskBar->startButtonSize.cy}; - RECT rc; - IntersectRect(&rc,&rcButton,&info.rcMonitor); - HRGN rgn=CreateRectRgn(rc.left-x,rc.top-y,rc.right-x,rc.bottom-y); - if (!SetWindowRgn(taskBar->startButton,rgn,FALSE)) - { - AddTrackedObject(rgn); - DeleteObject(rgn); - } - g_bAllowMoveButton=true; - SetWindowPos(taskBar->startButton,zPos,x,y,0,0,buttonFlags); - g_bAllowMoveButton=false; - if (buttonFlags&SWP_SHOWWINDOW) - UpdateStartButton(taskBar->taskbarId); + UpdateStartButtonPosition(taskBar,(WINDOWPOS*)lParam); } if (taskBar->oldButton && GetWinVersion()bCustomLook && SetWindowCompositionAttribute && GetWinVersion()WIN_VER_WIN7) { - color=GetSystemGlassColor8(); - color=((color&0xFF)<<16)|(color&0xFF00)|((color>>16)&0xFF); + if (IsAppThemed()) + { + color=GetSystemGlassColor8(); + color=((color&0xFF)<<16)|(color&0xFF00)|((color>>16)&0xFF); + } + else + { + color=GetSysColor(COLOR_BTNFACE); + } } BITMAPINFO bi={0}; bi.bmiHeader.biSize=sizeof(BITMAPINFOHEADER); @@ -2673,6 +2782,17 @@ static void WINAPI SHFillRectClr2( HDC hdc, const RECT *pRect, COLORREF color ) g_SHFillRectClr(hdc,pRect,color); } +static IatHookData* g_ExtTextOutWHook = nullptr; + +// used by ExplorerPatcher's custom implementation of `SHFillRectClr` +static BOOL WINAPI ExtTextOutW2(HDC hdc, int X, int Y, UINT fuOptions, const RECT* lprc, LPCWSTR lpString, UINT cbCount, const INT* lpDx) +{ + if (fuOptions != ETO_OPAQUE || lpString || cbCount || lpDx || !g_CurrentTaskList || !g_TaskbarTexture || GetCurrentThreadId() != g_TaskbarThreadId) + return ExtTextOutW(hdc, X, Y, fuOptions, lprc, lpString, cbCount, lpDx); + + return FALSE; +} + static HRESULT STDAPICALLTYPE DrawThemeBackground2( HTHEME hTheme, HDC hdc, int iPartId, int iStateId, LPCRECT pRect, LPCRECT pClipRect ) { if (g_CurrentTaskList && g_TaskbarTexture && iPartId==1 && iStateId==0 && GetCurrentThreadId()==g_TaskbarThreadId) @@ -2780,6 +2900,34 @@ static BOOL WINAPI SetWindowCompositionAttribute2( HWND hwnd, WINCOMPATTRDATA *p return SetWindowCompositionAttribute(hwnd,pAttrData); } +/////////////////////////////////////////////////////////////////////////////// +// hooks for preventing shell hotkeys registration on Win11 + +using ShellRegisterHotKey_t = BOOL(WINAPI*)(HWND, int, UINT, UINT, HWND); + +static IatHookData* g_ShellRegisterHotKeyHook; +static ShellRegisterHotKey_t g_ShellRegisterHotKey; + +static BOOL WINAPI ShellRegisterHotKeyHook(HWND hWnd, int id, UINT fsModifiers, UINT vk, HWND hWndTarget) +{ + // Win key + if (fsModifiers == MOD_WIN && vk == 0) + return FALSE; + + // Ctrl+Esc + if (fsModifiers == MOD_CONTROL && vk == VK_ESCAPE) + return FALSE; + + return g_ShellRegisterHotKey(hWnd, id, fsModifiers, vk, hWndTarget); +} + +// one-time APC function to unregister shell hotkeys +void NTAPI DisableShellHotkeysFunc(ULONG_PTR Parameter) +{ + UnregisterHotKey(NULL, 1); + UnregisterHotKey(NULL, 2); +} + /////////////////////////////////////////////////////////////////////////////// static void OpenCortana( void ) @@ -2790,6 +2938,12 @@ static void OpenCortana( void ) static void InitStartMenuDLL( void ) { + static bool initCalled = false; + if (initCalled) + return; + + initCalled = true; + LogToFile(STARTUP_LOG, L"StartMenu DLL: InitStartMenuDLL"); WaitDllInitThread(); @@ -2822,6 +2976,19 @@ static void InitStartMenuDLL( void ) if (GetSettingBool(L"CustomTaskbar")) { + auto module=GetModuleHandle(L"taskbar.dll"); + if (!module) + { + module = GetModuleHandle(L"ep_taskbar.5.dll"); + if (!module) + module = GetModuleHandle(L"ep_taskbar.2.dll"); + + if (module) + g_epTaskbar = true; + } + if (!module) + module=GetModuleHandle(NULL); + if (GetWinVersion()>=WIN_VER_WIN10) { HMODULE shlwapi=GetModuleHandle(L"shlwapi.dll"); @@ -2830,12 +2997,18 @@ static void InitStartMenuDLL( void ) g_SHFillRectClr=(tSHFillRectClr)GetProcAddress(shlwapi,MAKEINTRESOURCEA(197)); if (g_SHFillRectClr) { - g_SHFillRectClrHook=SetIatHook(GetModuleHandle(NULL),"shlwapi.dll",MAKEINTRESOURCEA(197),SHFillRectClr2); + g_SHFillRectClrHook=SetIatHook(module,"shlwapi.dll",MAKEINTRESOURCEA(197),SHFillRectClr2); if (!g_SHFillRectClrHook) - g_SHFillRectClrHook=SetIatHook(GetModuleHandle(NULL),"api-ms-win-shlwapi-winrt-storage-l1-1-1.dll",MAKEINTRESOURCEA(197),SHFillRectClr2); + g_SHFillRectClrHook=SetIatHook(module,"api-ms-win-shlwapi-winrt-storage-l1-1-1.dll",MAKEINTRESOURCEA(197),SHFillRectClr2); } } - g_StretchDIBitsHook=SetIatHook(GetModuleHandle(NULL),"gdi32.dll","StretchDIBits",StretchDIBits2); + g_StretchDIBitsHook=SetIatHook(module,"gdi32.dll","StretchDIBits",StretchDIBits2); + if (!g_StretchDIBitsHook) + g_StretchDIBitsHook=SetIatHook(module,"ext-ms-win-gdi-draw-l1-1-0.dll","StretchDIBits",StretchDIBits2); + + // ExplorerPatcher compatibility + if (g_epTaskbar) + g_ExtTextOutWHook = SetIatHook(module, "gdi32.dll", "ExtTextOutW", ExtTextOutW2); } { @@ -2845,12 +3018,15 @@ static void InitStartMenuDLL( void ) } if (GetWinVersion()<=WIN_VER_WIN81) - g_DrawThemeBackgroundHook=SetIatHook(GetModuleHandle(NULL),"uxtheme.dll","DrawThemeBackground",DrawThemeBackground2); - g_DrawThemeTextHook=SetIatHook(GetModuleHandle(NULL),"uxtheme.dll","DrawThemeText",DrawThemeText2); - g_DrawThemeTextExHook=SetIatHook(GetModuleHandle(NULL),"uxtheme.dll","DrawThemeTextEx",DrawThemeTextEx2); + g_DrawThemeBackgroundHook=SetIatHook(module,"uxtheme.dll","DrawThemeBackground",DrawThemeBackground2); + g_DrawThemeTextHook=SetIatHook(module,"uxtheme.dll","DrawThemeText",DrawThemeText2); + if (IsAppThemed()) + { + g_DrawThemeTextExHook=SetIatHook(module,"uxtheme.dll","DrawThemeTextEx",DrawThemeTextEx2); + } g_DrawThemeTextCtlHook=SetIatHook(GetModuleHandle(L"comctl32.dll"),"uxtheme.dll","DrawThemeText",DrawThemeText2); if (GetWinVersion()>=WIN_VER_WIN10) - g_SetWindowCompositionAttributeHook=SetIatHook(GetModuleHandle(NULL),"user32.dll","SetWindowCompositionAttribute",SetWindowCompositionAttribute2); + g_SetWindowCompositionAttributeHook=SetIatHook(module,"user32.dll","SetWindowCompositionAttribute",SetWindowCompositionAttribute2); } g_TaskbarThreadId=GetCurrentThreadId(); @@ -2871,6 +3047,34 @@ static void InitStartMenuDLL( void ) DWORD progThread=GetWindowThreadProcessId(g_ProgWin,NULL); g_ProgHook=SetWindowsHookEx(WH_GETMESSAGE,HookProgManThread,NULL,progThread); g_StartHook=SetWindowsHookEx(WH_GETMESSAGE,HookDesktopThread,NULL,GetCurrentThreadId()); + if (IsWin11()) + { + g_StartMouseHook=SetWindowsHookEx(WH_MOUSE,HookDesktopThreadMouse,NULL,GetCurrentThreadId()); + + // hook ShellRegisterHotKey to prevent twinui.dll to install shell hotkeys (Win, Ctrl+Esc) + // without these hotkeys there is standard WM_SYSCOMMAND+SC_TASKLIST sent when start menu is invoked by keyboard shortcut + g_ShellRegisterHotKey = (ShellRegisterHotKey_t)GetProcAddress(GetModuleHandle(L"user32.dll"), MAKEINTRESOURCEA(2671)); + auto twinui = GetModuleHandle(L"twinui.dll"); + + if (g_ShellRegisterHotKey && twinui) + { + g_ShellRegisterHotKeyHook = SetIatHook(twinui, "user32.dll" ,MAKEINTRESOURCEA(2671), ShellRegisterHotKeyHook); + + // unregister shell hotkeys as they may be registered already + // this has to be done from context of thread that registered them + auto hwnd = FindWindow(L"ApplicationManager_ImmersiveShellWindow", NULL); + if (hwnd) + { + auto thread = OpenThread(THREAD_SET_CONTEXT, FALSE, GetWindowThreadProcessId(hwnd, NULL)); + if (thread) + { + QueueUserAPC(DisableShellHotkeysFunc, thread, 0); + CloseHandle(thread); + } + } + } + } + HWND hwnd=FindWindow(L"OpenShellMenu.CStartHookWindow",L"StartHookWindow"); LoadLibrary(L"StartMenuDLL.dll"); // keep the DLL from unloading if (hwnd) PostMessage(hwnd,WM_CLEAR,0,0); // tell the exe to unhook this hook @@ -2886,9 +3090,18 @@ static void InitStartMenuDLL( void ) if (taskBar.rebar) { SetWindowSubclass(taskBar.rebar,SubclassRebarProc,'CLSH',taskbarId); + // TaskBand window HWND hwnd=FindWindowEx(taskBar.rebar,NULL,L"MSTaskSwWClass",NULL); if (hwnd) - taskBar.taskList=FindWindowEx(hwnd,NULL,L"MSTaskListWClass",NULL); + { + taskBar.taskList=hwnd; + // TaskList window + // it has to be visible, otherwise it won't receive WM_PAINT that we need to intercept + // in such case we will intercept parent instead + hwnd=FindWindowEx(hwnd,NULL,L"MSTaskListWClass",NULL); + if (hwnd&&IsWindowVisible(hwnd)) + taskBar.taskList=hwnd; + } if (taskBar.taskList) SetWindowSubclass(taskBar.taskList,SubclassTaskListProc,'CLSH',taskbarId); } @@ -2930,6 +3143,9 @@ static void InitStartMenuDLL( void ) taskBar.chevron=FindWindowEx(tray,NULL,L"Button",NULL); if (taskBar.chevron) SetWindowSubclass(taskBar.chevron,SubclassTrayChevronProc,'CLSH',taskBar.taskbarId); + taskBar.news=FindWindowEx(g_TaskBar,NULL,L"DynamicContent2",NULL); + if (taskBar.news) + SetWindowSubclass(taskBar.news,SubclassTrayChevronProc,'CLSH',taskBar.taskbarId); } HandleTaskbarParts(taskBar,true); @@ -2992,39 +3208,6 @@ static void RecreateStartButton( size_t taskbarId ) continue; if (taskBar.bRecreatingButton) continue; - RECT rcTask; - GetWindowRect(taskBar.taskBar,&rcTask); - RECT rcTask2=rcTask; - MONITORINFO info; - UINT uEdge=GetTaskbarPosition(taskBar.taskBar,&info,NULL,NULL); - if (uEdge==ABE_TOP || uEdge==ABE_BOTTOM) - { - if (rcTask2.leftinfo.rcMonitor.right) rcTask2.right=info.rcMonitor.right; - } - else - { - if (rcTask2.topRelease(); @@ -3049,7 +3232,19 @@ static void RecreateStartButton( size_t taskbarId ) taskBar.oldButtonSize.cy=rc.bottom-rc.top; } + RECT rcTask; + GetWindowRect(taskBar.taskBar,&rcTask); PostMessage(taskBar.taskBar,WM_SIZE,SIZE_RESTORED,MAKELONG(rcTask.right-rcTask.left,rcTask.bottom-rcTask.top)); + if (taskBar.taskBar==g_TaskBar) + { + for (auto btn : taskBar.trayButtons) + { + RECT rc; + GetWindowRect(btn,&rc); + MapWindowPoints(NULL,taskBar.taskBar,(POINT*)&rc,2); // convert to taskbar coordinates + SetWindowPos(btn,HWND_TOP,rc.left,rc.top,0,0,SWP_NOSIZE|SWP_NOACTIVATE|SWP_NOZORDER); + } + } } } @@ -3073,6 +3268,8 @@ static void CleanStartMenuDLL( void ) g_SHFillRectClrHook=NULL; ClearIatHook(g_StretchDIBitsHook); g_StretchDIBitsHook=NULL; + ClearIatHook(g_ExtTextOutWHook); + g_ExtTextOutWHook = NULL; ClearIatHook(g_DrawThemeBackgroundHook); g_DrawThemeBackgroundHook=NULL; @@ -3084,6 +3281,8 @@ static void CleanStartMenuDLL( void ) g_DrawThemeTextCtlHook=NULL; ClearIatHook(g_SetWindowCompositionAttributeHook); g_SetWindowCompositionAttributeHook=NULL; + ClearIatHook(g_ShellRegisterHotKeyHook); + g_ShellRegisterHotKeyHook=NULL; CloseManagers(false); ClearIatHooks(); @@ -3098,6 +3297,8 @@ static void CleanStartMenuDLL( void ) HWND hwnd=FindWindow(L"OpenShellMenu.CStartHookWindow",L"StartHookWindow"); UnhookWindowsHookEx(g_ProgHook); UnhookWindowsHookEx(g_StartHook); + if (g_StartMouseHook) UnhookWindowsHookEx(g_StartMouseHook); + g_StartMouseHook=NULL; if (g_AppManagerHook) UnhookWindowsHookEx(g_AppManagerHook); g_AppManagerHook=NULL; if (g_NewWindowHook) UnhookWindowsHookEx(g_NewWindowHook); @@ -3119,7 +3320,8 @@ static void CleanStartMenuDLL( void ) if (it->second.oldButton) { RemoveWindowSubclass(it->second.oldButton,SubclassWin81StartButton,'CLSH'); - SetWindowPos(it->second.oldButton,NULL,0,0,0,0,SWP_NOSIZE|SWP_NOZORDER); + if (GetWinVersion()second.taskBar,NULL,NULL,NULL)==ABE_BOTTOM) + SetWindowPos(it->second.oldButton,NULL,0,0,0,0,SWP_NOSIZE|SWP_NOZORDER); RevokeDragDrop(it->second.oldButton); if (it->second.pOriginalTarget) RegisterDragDrop(it->second.oldButton,it->second.pOriginalTarget); @@ -3136,6 +3338,8 @@ if (!g_bTrimHooks) } if (it->second.chevron) RemoveWindowSubclass(it->second.chevron,SubclassTrayChevronProc,'CLSH'); + if (it->second.news) + RemoveWindowSubclass(it->second.news,SubclassTrayChevronProc,'CLSH'); if (it->second.desktop) RemoveWindowSubclass(it->second.desktop,SubclassDesktopButtonProc,'CLSH'); if (it->second.bTimer) @@ -3348,6 +3552,16 @@ static LRESULT CALLBACK HookProgManThread( int code, WPARAM wParam, LPARAM lPara msg->message=WM_NULL; if (control==OPEN_CLASSIC) PostMessage(g_TaskBar,g_StartMenuMsg,MSG_TOGGLE,0); + else if (control==OPEN_CUSTOM) + { + CString commandText=GetSettingString(L"WinKeyCommand"); + if (!commandText.IsEmpty()) + { + wchar_t expandedCommand[_MAX_PATH]{}; + ::ExpandEnvironmentStrings(commandText, expandedCommand, _countof(expandedCommand)); + ShellExecute(NULL,NULL,expandedCommand,NULL,NULL,SW_SHOWNORMAL); + } + } } } } @@ -3372,6 +3586,35 @@ static LRESULT CALLBACK HookProgManThread( int code, WPARAM wParam, LPARAM lPara return CallNextHookEx(NULL,code,wParam,lParam); } +// WH_MOUSE hook for taskbar thread (Win11+) +static LRESULT CALLBACK HookDesktopThreadMouse(int code, WPARAM wParam, LPARAM lParam) +{ + if (code == HC_ACTION) + { + // we need to steal mouse messages that are issues in start button area + // so that they won't get to XAML framework that is handling original start button + auto info = (const MOUSEHOOKSTRUCT*)lParam; + { + auto taskBar = FindTaskBarInfoButton(info->hwnd); // click on start button + if (!taskBar) + { + taskBar = FindTaskBarInfoBar(GetAncestor(info->hwnd, GA_ROOT)); // click on taskbar + if (taskBar && !PointAroundStartButton(taskBar->taskbarId)) + taskBar = NULL; + } + + if (taskBar && (info->hwnd != taskBar->startButton) && taskBar->oldButton) + { + // steal messages from other than our custom button window + PostMessage(taskBar->oldButton, (UINT)wParam, 0, MAKELPARAM(info->pt.x, info->pt.y)); + return 1; + } + } + } + + return CallNextHookEx(NULL, code, wParam, lParam); +} + // WH_GETMESSAGE hook for the taskbar thread static LRESULT CALLBACK HookDesktopThread( int code, WPARAM wParam, LPARAM lParam ) { @@ -3431,6 +3674,16 @@ if (!g_bTrimHooks) PostMessage(g_ProgWin,WM_SYSCOMMAND,SC_TASKLIST,'WSMK'); else if (control==OPEN_CORTANA) OpenCortana(); + else if (control==OPEN_CUSTOM) + { + CString commandText=GetSettingString(L"ShiftWinCommand"); + if (!commandText.IsEmpty()) + { + wchar_t expandedCommand[_MAX_PATH]{}; + ::ExpandEnvironmentStrings(commandText, expandedCommand, _countof(expandedCommand)); + ShellExecute(NULL,NULL,expandedCommand,NULL,NULL,SW_SHOWNORMAL); + } + } } else if (msg->wParam==MSG_DRAG || msg->wParam==MSG_SHIFTDRAG) { @@ -3590,12 +3843,22 @@ if (!g_bTrimHooks) // left or middle click on start button FindWindowsMenu(); const wchar_t *name; + const wchar_t *command; if (bMiddle) + { name=L"MiddleClick"; + command=L"MiddleClickCommand"; + } else if (GetKeyState(VK_SHIFT)<0) + { name=L"ShiftClick"; + command=L"ShiftClickCommand"; + } else + { name=L"MouseClick"; + command=L"MouseClickCommand"; + } int control=GetSettingInt(name); if (control==OPEN_BOTH && GetWinVersion()>=WIN_VER_WIN10) @@ -3611,6 +3874,16 @@ if (!g_bTrimHooks) PostMessage(g_ProgWin,WM_SYSCOMMAND,SC_TASKLIST,'WSMM'); else if (control==OPEN_CORTANA) OpenCortana(); + else if (control==OPEN_CUSTOM) + { + CString commandText=GetSettingString(command); + if (!commandText.IsEmpty()) + { + wchar_t expandedCommand[_MAX_PATH]{}; + ::ExpandEnvironmentStrings(commandText, expandedCommand, _countof(expandedCommand)); + ShellExecute(NULL,NULL,expandedCommand,NULL,NULL,SW_SHOWNORMAL); + } + } msg->message=WM_NULL; } } @@ -3751,6 +4024,16 @@ if (!g_bTrimHooks) FindWindowsMenu(); PostMessage(g_ProgWin,WM_SYSCOMMAND,SC_TASKLIST,'WSMM'); } + else if (control==OPEN_CUSTOM) + { + CString commandText=GetSettingString(L"HoverCommand"); + if (!commandText.IsEmpty()) + { + wchar_t expandedCommand[_MAX_PATH]{}; + ::ExpandEnvironmentStrings(commandText, expandedCommand, _countof(expandedCommand)); + ShellExecute(NULL,NULL,expandedCommand,NULL,NULL,SW_SHOWNORMAL); + } + } } } taskBar->bTimer=false; @@ -3805,13 +4088,18 @@ if (!g_bTrimHooks) CMD_OPEN, CMD_OPEN_ALL, CMD_EXPLORER, + CMD_OPEN_PINNED, }; // right-click on the start button - open the context menu (Settings, Help, Exit) HMENU menu=CreatePopupMenu(); - CString title=LoadStringEx(IDS_MENU_TITLE); - if (!title.IsEmpty()) + CString titleFmt=LoadStringEx(IDS_MENU_TITLE); + if (!titleFmt.IsEmpty()) { + CString title; + DWORD ver=GetVersionEx(g_Instance); + title.Format(titleFmt,ver>>24,(ver>>16)&0xFF,ver&0xFFFF); + AppendMenu(menu,MF_STRING,0,title); EnableMenuItem(menu,0,MF_BYPOSITION|MF_DISABLED); SetMenuDefaultItem(menu,0,TRUE); @@ -3825,6 +4113,8 @@ if (!g_bTrimHooks) AppendMenu(menu,MF_STRING,CMD_OPEN,FindTranslation(L"Menu.Open",L"&Open")); if (!SHRestricted(REST_NOCOMMONGROUPS)) AppendMenu(menu,MF_STRING,CMD_OPEN_ALL,FindTranslation(L"Menu.OpenAll",L"O&pen All Users")); + if (GetSettingInt(L"PinnedPrograms")==PINNED_PROGRAMS_PINNED) + AppendMenu(menu,MF_STRING,CMD_OPEN_PINNED,FindTranslation(L"Menu.OpenPinned",L"O&pen Pinned")); AppendMenu(menu,MF_SEPARATOR,0,0); } if (GetSettingBool(L"EnableSettings")) @@ -3871,6 +4161,16 @@ if (!g_bTrimHooks) if (SUCCEEDED(ShGetKnownFolderPath((res==CMD_OPEN)?FOLDERID_StartMenu:FOLDERID_CommonStartMenu,&pPath))) ShellExecute(NULL,L"open",pPath,NULL,NULL,SW_SHOWNORMAL); } + if (res==CMD_OPEN_PINNED) // open pinned folder + { + SHELLEXECUTEINFO execute={sizeof(execute)}; + CString path=GetSettingString(L"PinnedItemsPath"); + execute.lpVerb=L"open"; + execute.lpFile=path; + execute.nShow=SW_SHOWNORMAL; + execute.fMask=SEE_MASK_DOENVSUBST; + ShellExecuteEx(&execute); + } if (res==CMD_EXPLORER) { CString path=GetSettingString(L"ExplorerPath"); diff --git a/Src/StartMenu/StartMenuDLL/StartMenuDLL.h b/Src/StartMenu/StartMenuDLL/StartMenuDLL.h index 2601727e9..456a88475 100644 --- a/Src/StartMenu/StartMenuDLL/StartMenuDLL.h +++ b/Src/StartMenu/StartMenuDLL/StartMenuDLL.h @@ -47,22 +47,23 @@ void EnableStartTooltip( bool bEnable ); struct TaskbarInfo { - TaskbarInfo( void ) { taskbarId=pointerId=0; taskBar=startButton=oldButton=rebar=taskList=chevron=desktop=NULL; startButtonSize.cx=startButtonSize.cy=0; oldButtonSize.cx=oldButtonSize.cy=0; bTimer=bCustomLook=bReplaceButton=bHideButton=bRecreatingButton=bThemeChanging=false; } + TaskbarInfo( void ) { taskbarId=pointerId=0; taskBar=startButton=oldButton=rebar=taskList=chevron=news=desktop=NULL; startButtonSize.cx=startButtonSize.cy=0; oldButtonSize.cx=oldButtonSize.cy=0; bTimer=bCustomLook=bReplaceButton=bHideButton=bRecreatingButton=bThemeChanging=false; } int taskbarId; HWND taskBar; HWND startButton; // either own start button or the win7 start button (depending on bReplaceButton) - HWND oldButton; // win81 start button (child of taskBar) + HWND oldButton; // win8.1+ start button (child of taskBar) HWND rebar; HWND taskList; HWND chevron; + HWND news; HWND desktop; SIZE startButtonSize; SIZE oldButtonSize; int pointerId; bool bTimer; bool bCustomLook; - bool bReplaceButton; - bool bHideButton; + bool bReplaceButton; // replace start button with own one + bool bHideButton; // hide old start button (if we have own button) bool bRecreatingButton; bool bThemeChanging; std::vector trayButtons; // ordered by Z order (for win10) diff --git a/Src/StartMenu/StartMenuDLL/StartMenuDLL.rc b/Src/StartMenu/StartMenuDLL/StartMenuDLL.rc index 405d5aa1f..fbaf3e9a2 100644 --- a/Src/StartMenu/StartMenuDLL/StartMenuDLL.rc +++ b/Src/StartMenu/StartMenuDLL/StartMenuDLL.rc @@ -349,6 +349,8 @@ END // remains consistent on all systems. IDI_APPICON ICON "..\\..\\Setup\\OpenShell.ico" IDI_APPSICON ICON "apps.ico" +IDI_APPSICON10 ICON "apps10.ico" +IDI_APPSICON11 ICON "apps11.ico" IDI_BTN_CLASSIC ICON "btn_aero.ico" IDI_START ICON "start.ico" IDI_START10 ICON "start10.ico" @@ -427,7 +429,7 @@ BEGIN IDS_SKIN_ERR_LOAD_FILE "Failed to load the variation skin file %s.\r\n" IDS_SKIN_ERR_LOAD "Error loading %s\n%s" IDS_SKIN_ERR_VERSION "The selected skin is not compatible with this version of the start menu.\r\n" - IDS_MENU_TITLE "== Open-Shell Menu ==" + IDS_MENU_TITLE "Open-Shell Menu %d.%d.%d" IDS_DEFAULT_SKIN "" IDS_CONTROLS_SETTINGS "Controls" IDS_OPEN_NOTHING "Nothing" @@ -637,6 +639,10 @@ BEGIN IDS_MENU_USERNAME "User name text" IDS_MENU_USERNAME_TIP "Enter the text you want to see in the user-name portion of the menu (for skins that show the user name)" IDS_PIC_COMMAND "User picture command" + IDS_ENABLE_ACCELERATORS "Enable accelerators" + IDS_ENABLE_ACCELERATORS_TIP "Use keyboard accelerators to execute menu commands" + IDS_ALT_ACCELERATORS "Require Alt key for accelerators" + IDS_ALT_ACCELERATORS_TIP "Keyboard accelerators will be triggered only if Alt key is pressed" END STRINGTABLE @@ -1044,7 +1050,7 @@ BEGIN IDS_FOLDERS_FIRST "Show folders first" IDS_FOLDERS_FIRST_TIP "When this is checked, the All Programs tree will show the folders first and the programs last" IDS_PINNED_PROGRAMS "Pinned Programs folder" - IDS_PINNED_PROGRAMS_TIP "Select the location to store the pinned programs" + IDS_PINNED_PROGRAMS_TIP "Select the location to store pinned programs. After updating this setting, close this window in order to pin items through the context menu again" IDS_FAST_ITEMS "Use Start Menu folder" END @@ -1075,14 +1081,14 @@ BEGIN IDS_RIGHT_SHIFT_TIP "When this is checked, right-click on the start button will open the standard Windows context menu instead of the Open-Shell menu. Otherwise Shift+right-click will open it" IDS_RIGHT_SHIFTX "Right click opens Win+X menu" IDS_RIGHT_SHIFTX_TIP "When this is checked, right-click on the start button will open the Win+X power menu instead of the Open-Shell menu. Otherwise Shift+right-click will open it" - IDS_STARTSCREEN_ITEM "Show Start screen shortcut" + IDS_STARTSCREEN_ITEM "Show Start Menu/Screen shortcut" IDS_STARTSCREEN_ITEM_TIP - "When this is checked, the main menu will contain a shortcut to open the Start screen" + "When this is checked, the main menu will contain a shortcut to open original Start menu/screen" IDS_MIN_HEIGHT "Minimum menu height" IDS_MIN_HEIGHT_TIP "The main menu will be at least as tall as this many search results" IDS_GLASS_OVERRIDE "Override glass color" IDS_GLASS_OVERRIDE_TIP "Check this to override the system glass color to use in the menu" - IDS_GLASS_COLOR "Menu glass color" + IDS_GLASS_COLOR "Menu glass color (RRGGBB)" IDS_GLASS_COLOR_TIP "Select the glass color to use in the menu. How much this color affects the menu will depend on the selected skin" IDS_GLASS_INTENSITY "Menu glass intensity" IDS_GLASS_INTENSITY_TIP "Select the intensity (brightness) for the glass color in the menu (0 - dark, 100 - bright)" @@ -1144,18 +1150,25 @@ BEGIN IDS_STRING7024 "Shadows on glass#The text and the arrows in the second column of the main menu will have a drop shadow" IDS_STRING7025 "Opaque" IDS_STRING7026 "Main menu color" - IDS_STRING7027 "Custom color#Select custom color for the main menu" + IDS_STRING7027 "Custom color (RRGGBB)#Select custom color for the main menu" IDS_STRING7028 "Sub-menu color" - IDS_STRING7029 "Custom color#Select custom color for the sub-menus" + IDS_STRING7029 "Custom color (RRGGBB)#Select custom color for the sub-menus" IDS_STRING7030 "Silver" IDS_STRING7031 "Gold" IDS_STRING7032 "Steel" IDS_STRING7033 "Titanium" IDS_STRING7034 "Image for first column#Select custom image for the first column of the main menu" IDS_STRING7035 "Image for second column#Select custom image for the second column of the main menu" - IDS_STRING7036 "Text color for first column#Select custom color for the first column of the main menu text" - IDS_STRING7037 "Text color for second column#Select custom color for the second column of the main menu text" + IDS_STRING7036 "Text color for first column (RRGGBB)#Select custom color for the first column of the main menu text" + IDS_STRING7037 "Text color for second column (RRGGBB)#Select custom color for the second column of the main menu text" IDS_STRING7038 "Text size#Select custom size for the main menu text" + IDS_STRING7039 "Menu theme" + IDS_STRING7040 "Light" + IDS_STRING7041 "Dark" + IDS_STRING7042 "Use system setting" + IDS_STRING7043 "Transparency style" + IDS_STRING7044 "Two-tone#The main section of the menu will use system light/dark colors while additional surfaces use transparent glass with accent color." + IDS_STRING7045 "Full glass#The entire main menu will use transparent glass with accent color." END STRINGTABLE @@ -1175,6 +1188,7 @@ BEGIN IDS_STRING7108 "Midnight skin\n\nSkin with dark background.\n\nPart of Open-Shell (c) 2009-2017, Ivo Beltchev" IDS_STRING7109 "Metro skin\n\nSkin that uses the start screen colors.\n\nPart of Open-Shell (c) 2009-2017, Ivo Beltchev" IDS_STRING7110 "Metallic skin\n\nA start menu skin with metallic look.\n\nPart of Open-Shell (c) 2009-2017, Ivo Beltchev" + IDS_STRING7111 "Immersive skin\n\nA skin that uses immersive colors and modern visual elements in the style of Windows 10.\n\nPart of Open-Shell (c) 2023, The Open-Shell Team" END STRINGTABLE @@ -1225,8 +1239,8 @@ BEGIN IDS_SHOW_APPS_MENU_TIP2 "Enable the Apps menu\nWarning: You don't have the Apps item in your custom menu, so this setting will be ignored" IDS_SKIN_ERR_METRO_COLOR "The selected skin is not compatible with Windows 7.\r\n" - IDS_BUTTON_ALIGN "Align to corner of the screen" - IDS_BUTTON_ALIGN_TIP "When this is checked, the button will be aligned to the corner of the screen instead of the middle of the taskbar" + IDS_BUTTON_ALIGN "Align to edge of taskbar" + IDS_BUTTON_ALIGN_TIP "When this is checked, the button will be aligned to the edge the taskbar instead of the middle of the taskbar" IDS_MENU_GLASS2 "Enable menu glass" IDS_MENU_GLASS2_TIP "Check this to use glass transparency in the menu" IDS_GLASS_OPACITY "Glass opacity" @@ -1249,7 +1263,7 @@ BEGIN IDS_TASK_AEROGLASS_TIP "The taskbar will have glass transparency that is compatible with the Aero Glass mod" IDS_TASK_OPACITY "Taskbar opacity" IDS_TASK_OPACITY_TIP "Set the opacity for the taskbar (0 - transparent, 100 - opaque)" - IDS_TASK_COLOR "Taskbar color" + IDS_TASK_COLOR "Taskbar color (RRGGBB)" IDS_TASK_COLOR_TIP "Set the color for the taskbar" IDS_PCSETTINGS "Settings" IDS_PCSETTINGS_TIP "Shows the modern Settings window" @@ -1288,13 +1302,41 @@ BEGIN IDS_TASK_BORDERS "Border sizes" IDS_TASK_BORDERS_TIP "Select how many pixel on each side of the texture to exclude from stretching" IDS_TASKBAR_SETTINGS "Taskbar" - IDS_TASK_TEXTCOLOR "Taskbar text color" + IDS_TASK_TEXTCOLOR "Taskbar text color (RRGGBB)" IDS_TASK_TEXTCOLOR_TIP "Select the color for the text on the taskbar" IDS_SELECT_LAST "Select the last item in shutdown menu" IDS_SELECT_LAST_TIP "When this is checked, the last item will be selected by default when the shutdown menu is opened with the keyboard" IDS_CLEAR_CACHE "Clear cached information" END +STRINGTABLE +BEGIN + IDS_NO_DBLCLICK "Single-click to open folder shortcuts" + IDS_NO_DBLCLICK_TIP "When this is checked, single-clicking shortcuts (links) to folders will open them in explorer. Hovering over the shortcut will still expand sub-menus" + IDS_BOLD_SETTINGS "Highlight modified settings" + IDS_BOLD_SETTINGS_TIP "When this is checked, settings that have been modified will be highlighted in bold" + IDS_SEARCH_HINT "Custom search hint" + IDS_SEARCH_HINT_TIP "When this is checked, the hint text in the search box will be replaced" + IDS_NEW_SEARCH_HINT "Custom search hint text" + IDS_NEW_SEARCH_HINT_TIP "The text to replace the search hint with. Empty text is a valid option" + IDS_MORE_RESULTS "Enable ""See more results"" option" + IDS_MORE_RESULTS_TIP "When this is checked, the search results will include an option to do a more advanced search" + IDS_OPEN_CMD "Custom command" + IDS_OPEN_CMD_TIP "The action will run a user-defined command" + IDS_OPEN_CMD_TEXT "Command to run" + IDS_OPEN_CMD_TEXT_TIP "Enter the command to run when you use this control" + IDS_ITEM_LINKS "Display as a list of links" + IDS_ITEM_LINKS_TIP "This item will appear as a sub-menu showing only its top-level contents" +END + +STRINGTABLE +BEGIN + IDS_OPEN_TRUE_PATH "Open pinned folders to their true path" + IDS_OPEN_TRUE_PATH_TIP "When this is checked, pinned folders will open to their true path instead of the path to their shortcut in the Pinned Programs folder" + IDS_PINNED_PATH "Pinned folder path" + IDS_PINNED_PATH_TIP "The path to use as the Pinned folder. If the path does not exist, it will be created (if possible) after opening the start menu. Close this window after updating this setting to update your context menu.\n\nNote: If you do not have permissions for the selected path, you will not be able to pin items until you take ownership of the new folder" +END + #endif // English (U.S.) resources ///////////////////////////////////////////////////////////////////////////// diff --git a/Src/StartMenu/StartMenuDLL/StartMenuDLL.vcxproj b/Src/StartMenu/StartMenuDLL/StartMenuDLL.vcxproj index 5777b91ae..b60797b41 100644 --- a/Src/StartMenu/StartMenuDLL/StartMenuDLL.vcxproj +++ b/Src/StartMenu/StartMenuDLL/StartMenuDLL.vcxproj @@ -1,6 +1,10 @@ + + Debug + ARM64 + Debug Win32 @@ -9,6 +13,10 @@ Debug x64 + + Release + ARM64 + Release Win32 @@ -17,6 +25,10 @@ Release x64 + + Setup + ARM64 + Setup Win32 @@ -33,256 +45,26 @@ 10.0 - - DynamicLibrary - v142 - Static - Unicode - true - - - DynamicLibrary - v142 - Static - Unicode - true - - - DynamicLibrary - v142 - Static - Unicode - - - DynamicLibrary - v142 - Static - Unicode - true - - - DynamicLibrary - v142 - Static - Unicode - true - - + DynamicLibrary - v142 + $(DefaultPlatformToolset) Static Unicode + true - - - - - - - - - - - - - - - - - - - - - - - + + - - ..\$(Configuration)\ - $(Configuration)\ - true - - - ..\$(Configuration)64\ - $(Configuration)64\ - true - - - ..\$(Configuration)\ - $(Configuration)\ - false - - - ..\$(Configuration)64\ - $(Configuration)64\ - false - - - ..\$(Configuration)\ - $(Configuration)\ - false - - - ..\$(Configuration)64\ - $(Configuration)64\ - false - - - - Disabled - ..\..\Lib;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_WINDOWS;_USRDLL;CLASSICSTARTMENUDLL_EXPORTS;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - Use - Level3 - EditAndContinue - true - true - stdcpp17 - - - _DEBUG;%(PreprocessorDefinitions) - $(IntDir);..\..\Lib;%(AdditionalIncludeDirectories) - - - comctl32.lib;uxtheme.lib;WtsApi32.lib;Secur32.lib;Msimg32.lib;Netapi32.lib;dwmapi.lib;PowrProf.lib;Oleacc.lib;winmm.lib;htmlhelp.lib;wininet.lib;structuredquery.lib;Propsys.lib;wintrust.lib;crypt32.lib;%(AdditionalDependencies) - true - Windows - - - - - Disabled - ..\..\Lib;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_WINDOWS;_USRDLL;CLASSICSTARTMENUDLL_EXPORTS;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - Use - Level3 - ProgramDatabase - true - true - stdcpp17 - - - _DEBUG;%(PreprocessorDefinitions) - $(IntDir);..\..\Lib;%(AdditionalIncludeDirectories) - - - comctl32.lib;uxtheme.lib;WtsApi32.lib;Secur32.lib;Msimg32.lib;Netapi32.lib;dwmapi.lib;PowrProf.lib;Oleacc.lib;winmm.lib;htmlhelp.lib;wininet.lib;structuredquery.lib;Propsys.lib;wintrust.lib;crypt32.lib;%(AdditionalDependencies) - true - Windows - - - - - MaxSpeed - ..\..\Lib;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_WINDOWS;_USRDLL;CLASSICSTARTMENUDLL_EXPORTS;%(PreprocessorDefinitions) - MultiThreaded - true - Use - Level3 - ProgramDatabase - true - true - stdcpp17 - - - NDEBUG;%(PreprocessorDefinitions) - $(IntDir);..\..\Lib;%(AdditionalIncludeDirectories) - - - comctl32.lib;uxtheme.lib;WtsApi32.lib;Secur32.lib;Msimg32.lib;Netapi32.lib;dwmapi.lib;PowrProf.lib;Oleacc.lib;winmm.lib;htmlhelp.lib;wininet.lib;structuredquery.lib;Propsys.lib;wintrust.lib;crypt32.lib;%(AdditionalDependencies) - true - Windows - true - true - - - - - MaxSpeed - ..\..\Lib;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_WINDOWS;_USRDLL;CLASSICSTARTMENUDLL_EXPORTS;%(PreprocessorDefinitions) - MultiThreaded - true - Use - Level3 - ProgramDatabase - true - true - stdcpp17 - - - NDEBUG;%(PreprocessorDefinitions) - $(IntDir);..\..\Lib;%(AdditionalIncludeDirectories) - - - comctl32.lib;uxtheme.lib;WtsApi32.lib;Secur32.lib;Msimg32.lib;Netapi32.lib;dwmapi.lib;PowrProf.lib;Oleacc.lib;winmm.lib;htmlhelp.lib;wininet.lib;structuredquery.lib;Propsys.lib;wintrust.lib;crypt32.lib;%(AdditionalDependencies) - true - Windows - true - true - - - - - MaxSpeed - ..\..\Lib;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_WINDOWS;_USRDLL;CLASSICSTARTMENUDLL_EXPORTS;BUILD_SETUP;%(PreprocessorDefinitions) - MultiThreaded - true - Use - Level3 - true - ProgramDatabase - true - true - stdcpp17 - - - NDEBUG;%(PreprocessorDefinitions) - $(IntDir);..\..\Lib;%(AdditionalIncludeDirectories) - - - comctl32.lib;uxtheme.lib;WtsApi32.lib;Secur32.lib;Msimg32.lib;Netapi32.lib;dwmapi.lib;PowrProf.lib;Oleacc.lib;winmm.lib;htmlhelp.lib;wininet.lib;structuredquery.lib;Propsys.lib;wintrust.lib;crypt32.lib;%(AdditionalDependencies) - true - Windows - true - true - - - + - MaxSpeed - ..\..\Lib;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_WINDOWS;_USRDLL;CLASSICSTARTMENUDLL_EXPORTS;BUILD_SETUP;%(PreprocessorDefinitions) - MultiThreaded - true - Use - Level3 - true - ProgramDatabase - true - true - stdcpp17 + _USRDLL;CLASSICSTARTMENUDLL_EXPORTS;%(PreprocessorDefinitions) - - NDEBUG;%(PreprocessorDefinitions) - $(IntDir);..\..\Lib;%(AdditionalIncludeDirectories) - comctl32.lib;uxtheme.lib;WtsApi32.lib;Secur32.lib;Msimg32.lib;Netapi32.lib;dwmapi.lib;PowrProf.lib;Oleacc.lib;winmm.lib;htmlhelp.lib;wininet.lib;structuredquery.lib;Propsys.lib;wintrust.lib;crypt32.lib;%(AdditionalDependencies) - true - Windows - true - true diff --git a/Src/StartMenu/StartMenuDLL/apps10.ico b/Src/StartMenu/StartMenuDLL/apps10.ico new file mode 100644 index 000000000..b36b27413 Binary files /dev/null and b/Src/StartMenu/StartMenuDLL/apps10.ico differ diff --git a/Src/StartMenu/StartMenuDLL/apps11.ico b/Src/StartMenu/StartMenuDLL/apps11.ico new file mode 100644 index 000000000..59ac8437e Binary files /dev/null and b/Src/StartMenu/StartMenuDLL/apps11.ico differ diff --git a/Src/StartMenu/StartMenuDLL/btn_classic.bmp b/Src/StartMenu/StartMenuDLL/btn_classic.bmp index 82624b0ad..4afd0f815 100644 Binary files a/Src/StartMenu/StartMenuDLL/btn_classic.bmp and b/Src/StartMenu/StartMenuDLL/btn_classic.bmp differ diff --git a/Src/StartMenu/StartMenuDLL/dllmain.cpp b/Src/StartMenu/StartMenuDLL/dllmain.cpp index df2a24e30..89f40af76 100644 --- a/Src/StartMenu/StartMenuDLL/dllmain.cpp +++ b/Src/StartMenu/StartMenuDLL/dllmain.cpp @@ -45,11 +45,6 @@ static int g_LoadDialogs[]= 0 }; -const wchar_t *GetDocRelativePath( void ) -{ - return DOC_PATH; -} - static HANDLE g_DllInitThread; static DWORD CALLBACK DllInitThread( void* ) @@ -62,7 +57,7 @@ static DWORD CALLBACK DllInitThread( void* ) *PathFindFileName(path)=0; wchar_t fname[_MAX_PATH]; - Sprintf(fname,_countof(fname),L"%s" INI_PATH L"StartMenuL10N.ini",path); + Sprintf(fname,_countof(fname),L"%sStartMenuL10N.ini",path); CString language=GetSettingString(L"Language"); ParseTranslations(fname,language); diff --git a/Src/StartMenu/StartMenuDLL/resource.h b/Src/StartMenu/StartMenuDLL/resource.h index ca08926ca..3e5a633ca 100644 --- a/Src/StartMenu/StartMenuDLL/resource.h +++ b/Src/StartMenu/StartMenuDLL/resource.h @@ -4,6 +4,8 @@ // #define IDI_APPICON 1 #define IDI_APPSICON 2 +#define IDI_APPSICON10 3 +#define IDI_APPSICON11 4 #define IDD_RENAME 102 #define IDC_EDITNAME 102 #define IDD_RENAMER 103 @@ -760,6 +762,30 @@ #define IDS_HOR_OFFSET_TIP 3663 #define IDS_VERT_OFFSET 3664 #define IDS_VERT_OFFSET_TIP 3665 +#define IDS_NO_DBLCLICK 3666 +#define IDS_NO_DBLCLICK_TIP 3667 +#define IDS_BOLD_SETTINGS 3668 +#define IDS_BOLD_SETTINGS_TIP 3669 +#define IDS_SEARCH_HINT 3670 +#define IDS_SEARCH_HINT_TIP 3671 +#define IDS_NEW_SEARCH_HINT 3672 +#define IDS_NEW_SEARCH_HINT_TIP 3673 +#define IDS_MORE_RESULTS 3674 +#define IDS_MORE_RESULTS_TIP 3675 +#define IDS_OPEN_CMD 3676 +#define IDS_OPEN_CMD_TIP 3677 +#define IDS_OPEN_CMD_TEXT 3678 +#define IDS_OPEN_CMD_TEXT_TIP 3679 +#define IDS_ITEM_LINKS 3680 +#define IDS_ITEM_LINKS_TIP 3681 +#define IDS_OPEN_TRUE_PATH 3682 +#define IDS_OPEN_TRUE_PATH_TIP 3683 +#define IDS_PINNED_PATH 3684 +#define IDS_PINNED_PATH_TIP 3685 +#define IDS_ENABLE_ACCELERATORS 3686 +#define IDS_ENABLE_ACCELERATORS_TIP 3687 +#define IDS_ALT_ACCELERATORS 3688 +#define IDS_ALT_ACCELERATORS_TIP 3689 #define IDS_STRING7001 7001 #define IDS_STRING7002 7002 #define IDS_STRING7003 7003 @@ -798,6 +824,13 @@ #define IDS_STRING7036 7036 #define IDS_STRING7037 7037 #define IDS_STRING7038 7038 +#define IDS_STRING7039 7039 +#define IDS_STRING7040 7040 +#define IDS_STRING7041 7041 +#define IDS_STRING7042 7042 +#define IDS_STRING7043 7043 +#define IDS_STRING7044 7044 +#define IDS_STRING7045 7045 #define IDS_STRING7100 7100 #define IDS_STRING7101 7101 #define IDS_STRING7102 7102 @@ -809,6 +842,7 @@ #define IDS_STRING7108 7108 #define IDS_STRING7109 7109 #define IDS_STRING7110 7110 +#define IDS_STRING7111 7111 // Next default values for new objects // diff --git a/Src/StartMenu/StartMenuDLL/stdafx.h b/Src/StartMenu/StartMenuDLL/stdafx.h index 47dbfcc7f..30cf4c9ac 100644 --- a/Src/StartMenu/StartMenuDLL/stdafx.h +++ b/Src/StartMenu/StartMenuDLL/stdafx.h @@ -14,6 +14,7 @@ #include #include +#define _ATL_MODULES // compatibility with /permissive- #define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS // some CString constructors will be explicit #include @@ -21,14 +22,6 @@ #include #include -#ifdef BUILD_SETUP -#define INI_PATH L"" -#define DOC_PATH L"" -#else -#define INI_PATH L"..\\" -#define DOC_PATH L"..\\..\\Docs\\Help\\" -#endif - #include "StringUtils.h" #include "TrackResources.h" #include "Assert.h" diff --git a/Src/StartMenu/StartMenuDLL/style_7.png b/Src/StartMenu/StartMenuDLL/style_7.png index b15022a1a..a8ac2f8de 100644 Binary files a/Src/StartMenu/StartMenuDLL/style_7.png and b/Src/StartMenu/StartMenuDLL/style_7.png differ diff --git a/Src/StartMenu/StartMenuDLL/style_7150.png b/Src/StartMenu/StartMenuDLL/style_7150.png index 94111641f..a8c19dd90 100644 Binary files a/Src/StartMenu/StartMenuDLL/style_7150.png and b/Src/StartMenu/StartMenuDLL/style_7150.png differ diff --git a/Src/StartMenu/StartMenuDLL/style_classic.png b/Src/StartMenu/StartMenuDLL/style_classic.png index 6bd468b1e..80fcef112 100644 Binary files a/Src/StartMenu/StartMenuDLL/style_classic.png and b/Src/StartMenu/StartMenuDLL/style_classic.png differ diff --git a/Src/StartMenu/StartMenuDLL/style_classic150.png b/Src/StartMenu/StartMenuDLL/style_classic150.png index f3e910668..1b74a957d 100644 Binary files a/Src/StartMenu/StartMenuDLL/style_classic150.png and b/Src/StartMenu/StartMenuDLL/style_classic150.png differ diff --git a/Src/StartMenu/StartMenuDLL/style_vista.png b/Src/StartMenu/StartMenuDLL/style_vista.png index 6e6d886b1..70ef1e960 100644 Binary files a/Src/StartMenu/StartMenuDLL/style_vista.png and b/Src/StartMenu/StartMenuDLL/style_vista.png differ diff --git a/Src/StartMenu/StartMenuDLL/style_vista150.png b/Src/StartMenu/StartMenuDLL/style_vista150.png index 281901f85..c20897267 100644 Binary files a/Src/StartMenu/StartMenuDLL/style_vista150.png and b/Src/StartMenu/StartMenuDLL/style_vista150.png differ diff --git a/Src/StartMenu/StartMenuHelper/ModernSettings.cpp b/Src/StartMenu/StartMenuHelper/ModernSettings.cpp index ed0aa8d8b..5e6232427 100644 --- a/Src/StartMenu/StartMenuHelper/ModernSettings.cpp +++ b/Src/StartMenu/StartMenuHelper/ModernSettings.cpp @@ -7,8 +7,10 @@ #include "stdafx.h" #include "ModernSettings.h" #include "ResourceHelper.h" +#include #include #include +#include #include #include #include @@ -126,12 +128,80 @@ static void ProcessAttributes(const void* buffer, size_t size, std::function((void*)GetProcAddress(GetModuleHandle(L"kernel32.dll"), "GetPackagesByPackageFamily")); + if (pGetPackagesByPackageFamily) + { + UINT32 count = 0; + UINT32 bufferLength = 0; + + if (pGetPackagesByPackageFamily(packageFamily, &count, nullptr, &bufferLength, nullptr) == ERROR_INSUFFICIENT_BUFFER && count > 0) + { + std::vector names(count); + std::vector buffer(bufferLength); + + if (pGetPackagesByPackageFamily(packageFamily, &count, names.data(), &bufferLength, buffer.data()) == ERROR_SUCCESS && count > 0) + return names[0]; + } + } + + return {}; +} + +static std::pair ParseResourceString(const wchar_t* resourceString) +{ + std::wstring_view str = resourceString; + + if (str[0] == '@' && str[1] == '{') + { + str.remove_prefix(2); + if (str.back() == '}') + str.remove_suffix(1); + + auto pos = str.find('?'); + if (pos != str.npos) + return { str.substr(0, pos), str.substr(pos + 1) }; + } + + return {}; +} + +static std::wstring FormatResourceString(const std::wstring_view& package, const std::wstring_view& resource) +{ + std::wstring retval(L"@{"); + + retval += package; + retval += L"?"; + retval += resource; + retval += L"}"; + + return retval; +} + + static std::wstring TranslateIndirectString(const WCHAR* string) { std::wstring retval; retval.resize(1024); - if (SUCCEEDED(::SHLoadIndirectString(string, retval.data(), (UINT)retval.size(), nullptr))) + auto hr = ::SHLoadIndirectString(string, retval.data(), (UINT)retval.size(), nullptr); + + if (hr == E_INVALIDARG) + { + auto [package, resource] = ParseResourceString(string); + if (!package.empty() && !resource.empty()) + { + auto fullPackage = GetPackageFullName(std::wstring(package).c_str()); + if (!fullPackage.empty()) + { + auto fullStr = FormatResourceString(fullPackage, resource); + hr = ::SHLoadIndirectString(fullStr.c_str(), retval.data(), (UINT)retval.size(), nullptr); + } + } + } + + if (SUCCEEDED(hr)) { retval.resize(wcslen(retval.data())); return retval; @@ -204,15 +274,30 @@ static void ParseApplicationInformation(CComPtr& parent, AttributeW } } +static void ParseSettingIDs(CComPtr& node, AttributeWriter& writer) +{ + writer.addString(Id::PageId, GetTranslatedString(node, L"PageID")); + writer.addString(Id::HostId, GetTranslatedString(node, L"HostID")); + writer.addString(Id::GroupId, GetTranslatedString(node, L"GroupID")); + writer.addString(Id::SettingId, GetTranslatedString(node, L"SettingID")); +} + +static void ParseSettingPaths(CComPtr& parent, AttributeWriter& writer) +{ + CComPtr node; + if (parent->selectSingleNode(CComBSTR(L"SettingPaths/Path"), &node) == S_OK) + ParseSettingIDs(node, writer); +} + static void ParseSettingIdentity(CComPtr& parent, AttributeWriter& writer) { CComPtr node; if (parent->selectSingleNode(CComBSTR(L"SettingIdentity"), &node) == S_OK) { - writer.addString(Id::PageId, GetTranslatedString(node, L"PageID")); - writer.addString(Id::HostId, GetTranslatedString(node, L"HostID")); - writer.addString(Id::GroupId, GetTranslatedString(node, L"GroupID")); - writer.addString(Id::SettingId, GetTranslatedString(node, L"SettingID")); + // Win11 24H2+ + ParseSettingPaths(node, writer); + // older + ParseSettingIDs(node, writer); } } @@ -247,9 +332,9 @@ static std::vector ParseSetting(CComPtr& parent) return writer.buffer(); } -static std::vector ParseModernSettings() +static std::vector> ParseModernSettings() { - AttributeWriter writer; + std::vector> retval; CComPtr doc; if (SUCCEEDED(doc.CoCreateInstance(L"Msxml2.FreeThreadedDOMDocument"))) @@ -257,25 +342,28 @@ static std::vector ParseModernSettings() doc->put_async(VARIANT_FALSE); wchar_t path[MAX_PATH]{}; - wcscpy_s(path, LR"(%windir%\ImmersiveControlPanel\Settings\AllSystemSettings_{253E530E-387D-4BC2-959D-E6F86122E5F2}.xml)"); + wcscpy_s(path, LR"(%windir%\ImmersiveControlPanel\Settings\AllSystemSettings_{FDB289F3-FCFC-4702-8015-18926E996EC1}.xml)"); DoEnvironmentSubst(path, _countof(path)); + if (!PathFileExists(path)) + { + wcscpy_s(path, LR"(%windir%\ImmersiveControlPanel\Settings\AllSystemSettings_{253E530E-387D-4BC2-959D-E6F86122E5F2}.xml)"); + DoEnvironmentSubst(path, _countof(path)); + } + VARIANT_BOOL loaded; if (SUCCEEDED(doc->load(CComVariant(path), &loaded)) && loaded) { CComPtr root; if (doc->selectSingleNode(CComBSTR(L"PCSettings"), &root) == S_OK) { - FileHdr hdr{}; - writer.addBlob(Id::Header, &hdr, sizeof(hdr)); - CComPtr node; root->get_firstChild(&node); while (node) { auto buffer = ParseSetting(node); if (!buffer.empty()) - writer.addBlob(Id::Blob, buffer.data(), buffer.size()); + retval.push_back(std::move(buffer)); CComPtr next; if (FAILED(node->get_nextSibling(&next))) @@ -286,6 +374,19 @@ static std::vector ParseModernSettings() } } + return retval; +} + +static std::vector SerializeModernSettings(const std::vector>& settings) +{ + AttributeWriter writer; + + FileHdr hdr{}; + writer.addBlob(Id::Header, &hdr, sizeof(hdr)); + + for (const auto& setting : settings) + writer.addBlob(Id::Blob, setting.data(), setting.size()); + return writer.buffer(); } @@ -411,11 +512,30 @@ std::shared_ptr GetModernSettings() s_settings.reset(); // re-parse settings - auto buffer = ParseModernSettings(); - if (!buffer.empty()) + auto settings = ParseModernSettings(); + if (!settings.empty()) { + // sort by setting name (in reverse order) + // this way we will have newer settings (like SomeSetting-2) before older ones + std::stable_sort(settings.begin(), settings.end(), [](const auto& a, const auto& b) { + return ModernSettings::Setting(a).fileName > ModernSettings::Setting(b).fileName; + }); + + // now sort by description (strings presented to the user) + // and keep relative order of items with the same description + std::stable_sort(settings.begin(), settings.end(), [](const auto& a, const auto& b) { + return ModernSettings::Setting(a).description < ModernSettings::Setting(b).description; + }); + + // remove duplicates + settings.erase(std::unique(settings.begin(), settings.end(), [](const auto& a, const auto& b) { + return ModernSettings::Setting(a).description == ModernSettings::Setting(b).description; + }), settings.end()); + // store to file { + auto buffer = SerializeModernSettings(settings); + File f(path.c_str(), GENERIC_WRITE, 0, CREATE_ALWAYS); if (f) { diff --git a/Src/StartMenu/StartMenuHelper/ModernSettings.h b/Src/StartMenu/StartMenuHelper/ModernSettings.h index e1c4a1836..16fa9c378 100644 --- a/Src/StartMenu/StartMenuHelper/ModernSettings.h +++ b/Src/StartMenu/StartMenuHelper/ModernSettings.h @@ -4,6 +4,7 @@ #include #include +#include #include #include @@ -120,6 +121,7 @@ class ModernSettings Setting() = default; Setting(const Blob& blob); + Setting(const std::vector& blob) : Setting(Blob{ blob.data(), blob.size() }) {} explicit operator bool() const { diff --git a/Src/StartMenu/StartMenuHelper/ModernSettingsContextMenu.h b/Src/StartMenu/StartMenuHelper/ModernSettingsContextMenu.h index 78fe1f16b..4e7f37e91 100644 --- a/Src/StartMenu/StartMenuHelper/ModernSettingsContextMenu.h +++ b/Src/StartMenu/StartMenuHelper/ModernSettingsContextMenu.h @@ -2,7 +2,7 @@ #pragma once #include "resource.h" -#include "StartMenuHelper_i.h" +#include "StartMenuHelper_h.h" #include // CModernSettingsContextMenu @@ -19,7 +19,7 @@ class ATL_NO_VTABLE CModernSettingsContextMenu : { } -DECLARE_REGISTRY_RESOURCEID(IDR_MODERNSETTINGSCONTEXTMENU) +DECLARE_REGISTRY_RESOURCEID_V2_WITHOUT_MODULE(IDR_MODERNSETTINGSCONTEXTMENU, CModernSettingsContextMenu) DECLARE_NOT_AGGREGATABLE(CModernSettingsContextMenu) diff --git a/Src/StartMenu/StartMenuHelper/ModernSettingsShellFolder.cpp b/Src/StartMenu/StartMenuHelper/ModernSettingsShellFolder.cpp index a9e973ee3..fb2a13e10 100644 --- a/Src/StartMenu/StartMenuHelper/ModernSettingsShellFolder.cpp +++ b/Src/StartMenu/StartMenuHelper/ModernSettingsShellFolder.cpp @@ -9,6 +9,7 @@ #include "stdafx.h" #include "ModernSettings.h" #include "ModernSettingsShellFolder.h" +#include "ResourceHelper.h" #include #include #include @@ -181,7 +182,7 @@ HICON IconFromGlyph(UINT glyph, UINT size) HDC dc = CreateCompatibleDC(nullptr); SelectObject(dc, info.hbmColor); - HFONT font = CreateFontW(size, 0, 0, 0, 400, 0, 0, 0, 1, 0, 0, 0, 0, L"Segoe MDL2 Assets"); + HFONT font = CreateFontW(size, 0, 0, 0, 400, 0, 0, 0, 1, 0, 0, 0, 0, IsWin11() ? L"Segoe Fluent Icons" : L"Segoe MDL2 Assets"); SelectObject(dc, font); RECT rc{}; diff --git a/Src/StartMenu/StartMenuHelper/ModernSettingsShellFolder.h b/Src/StartMenu/StartMenuHelper/ModernSettingsShellFolder.h index e5d0a31ed..dba4f2e7b 100644 --- a/Src/StartMenu/StartMenuHelper/ModernSettingsShellFolder.h +++ b/Src/StartMenu/StartMenuHelper/ModernSettingsShellFolder.h @@ -4,7 +4,7 @@ #pragma once #include "resource.h" #include "ComHelper.h" -#include "StartMenuHelper_i.h" +#include "StartMenuHelper_h.h" #include #include @@ -21,7 +21,7 @@ class ATL_NO_VTABLE CModernSettingsShellFolder : { } -DECLARE_REGISTRY_RESOURCEID(IDR_MODERNSETTINGSSHELLFOLDER) +DECLARE_REGISTRY_RESOURCEID_V2_WITHOUT_MODULE(IDR_MODERNSETTINGSSHELLFOLDER, CModernSettingsShellFolder) DECLARE_NOT_AGGREGATABLE(CModernSettingsShellFolder) diff --git a/Src/StartMenu/StartMenuHelper/StartMenuExt.cpp b/Src/StartMenu/StartMenuHelper/StartMenuExt.cpp index 10a3b3054..5cf4aff21 100644 --- a/Src/StartMenu/StartMenuHelper/StartMenuExt.cpp +++ b/Src/StartMenu/StartMenuHelper/StartMenuExt.cpp @@ -91,7 +91,7 @@ STDMETHODIMP CStartMenuExt::Initialize( PCIDLIST_ABSOLUTE pidlFolder, IDataObjec bUsePinned=(setting==1); if (bUsePinned) { - Strcpy(m_PinFolder1,_countof(m_PinFolder1),L"%APPDATA%\\OpenShell\\Pinned\\"); + Sprintf(m_PinFolder1,_countof(m_PinFolder1),L"%s\\",GetSettingString(L"PinnedItemsPath")); DoEnvironmentSubst(m_PinFolder1,_countof(m_PinFolder1)); m_PinFolder2[0]=0; } diff --git a/Src/StartMenu/StartMenuHelper/StartMenuExt.h b/Src/StartMenu/StartMenuHelper/StartMenuExt.h index 025041a10..8ad501941 100644 --- a/Src/StartMenu/StartMenuHelper/StartMenuExt.h +++ b/Src/StartMenu/StartMenuHelper/StartMenuExt.h @@ -3,7 +3,7 @@ #pragma once #include "resource.h" // main symbols -#include "StartMenuHelper_i.h" +#include "StartMenuHelper_h.h" #include @@ -55,8 +55,8 @@ END_COM_MAP() STDMETHODIMP InvokeCommand( CMINVOKECOMMANDINFO *pInfo ); STDMETHODIMP GetCommandString( UINT_PTR idCmd, UINT uFlags, UINT* pwReserved, LPSTR pszName, UINT cchMax ); - wchar_t m_PinFolder1[_MAX_PATH]; // ending with \ - wchar_t m_PinFolder2[_MAX_PATH]; // ending with \ + wchar_t m_PinFolder1[_MAX_PATH]; // ending with backslash + wchar_t m_PinFolder2[_MAX_PATH]; // ending with backslash wchar_t m_FileName[_MAX_PATH]; LPITEMIDLIST m_FilePidl; bool m_bInPinFolder1, m_bInPinFolder2; diff --git a/Src/StartMenu/StartMenuHelper/StartMenuHelper.cpp b/Src/StartMenu/StartMenuHelper/StartMenuHelper.cpp index d54ce3690..5004cb83e 100644 --- a/Src/StartMenu/StartMenuHelper/StartMenuHelper.cpp +++ b/Src/StartMenu/StartMenuHelper/StartMenuHelper.cpp @@ -3,7 +3,7 @@ #include "stdafx.h" #include "resource.h" -#include "StartMenuHelper_i.h" +#include "StartMenuHelper_h.h" #include "dllmain.h" #include "ResourceHelper.h" #include "Settings.h" diff --git a/Src/StartMenu/StartMenuHelper/StartMenuHelper.vcxproj b/Src/StartMenu/StartMenuHelper/StartMenuHelper.vcxproj index 5e9cd3144..363990fba 100644 --- a/Src/StartMenu/StartMenuHelper/StartMenuHelper.vcxproj +++ b/Src/StartMenu/StartMenuHelper/StartMenuHelper.vcxproj @@ -1,6 +1,14 @@ + + Debug + ARM64 + + + Debug + ARM64EC + Debug Win32 @@ -9,6 +17,14 @@ Debug x64 + + Release + ARM64 + + + Release + ARM64EC + Release Win32 @@ -17,6 +33,14 @@ Release x64 + + Setup + ARM64 + + + Setup + ARM64EC + Setup Win32 @@ -33,329 +57,51 @@ 10.0 - + DynamicLibrary - v142 - Static - Unicode - true - - - DynamicLibrary - v142 - Static - Unicode - true - - - DynamicLibrary - v142 - Static - Unicode - - - DynamicLibrary - v142 - Static - Unicode - true - - - DynamicLibrary - v142 - Static - Unicode - true - - - DynamicLibrary - v142 + $(DefaultPlatformToolset) Static Unicode + true - - - - - - - - - - - - - - - - - - - - - - - + + - - $(Configuration)\ - $(Configuration)\ - true - true + $(ProjectName)32 - - $(Configuration)64\ - $(Configuration)64\ - true - true + $(ProjectName)64 - - $(Configuration)\ - $(Configuration)\ - true - false - $(ProjectName)32 - - - $(Configuration)64\ - $(Configuration)64\ - true - false + $(ProjectName)64 - - $(Configuration)\ - $(Configuration)\ - true - false - $(ProjectName)32 - - - $(Configuration)64\ - $(Configuration)64\ - true - false + $(ProjectName)64 + true - - - _DEBUG;%(PreprocessorDefinitions) - false - true - StartMenuHelper_i.h - StartMenuHelper_i.c - StartMenuHelper_p.c - true - + - Disabled - ..\..\Lib;%(AdditionalIncludeDirectories) - WIN32;_WINDOWS;_DEBUG;_USRDLL;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - Use - Level3 - EditAndContinue - true - true - stdcpp17 + _USRDLL;%(PreprocessorDefinitions) - _DEBUG;%(PreprocessorDefinitions) $(IntDir);%(AdditionalIncludeDirectories) - true comctl32.lib;uxtheme.lib;winmm.lib;htmlhelp.lib;wininet.lib;version.lib;%(AdditionalDependencies) - .\$(TargetName).def - true - Windows - true + $(TargetName).def - - - _DEBUG;%(PreprocessorDefinitions) - false - true - StartMenuHelper_i.h - StartMenuHelper_i.c - StartMenuHelper_p.c - - - Disabled - ..\..\Lib;%(AdditionalIncludeDirectories) - WIN32;_WINDOWS;_DEBUG;_USRDLL;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - Use - Level3 - ProgramDatabase - true - true - stdcpp17 - - - _DEBUG;%(PreprocessorDefinitions) - $(IntDir);%(AdditionalIncludeDirectories) - - - true - comctl32.lib;uxtheme.lib;winmm.lib;htmlhelp.lib;wininet.lib;version.lib;%(AdditionalDependencies) - .\$(TargetName).def - true - Windows - true - - - - - NDEBUG;%(PreprocessorDefinitions) - false - true - StartMenuHelper_i.h - StartMenuHelper_i.c - StartMenuHelper_p.c - true - - - MaxSpeed - ..\..\Lib;%(AdditionalIncludeDirectories) - WIN32;_WINDOWS;NDEBUG;_USRDLL;%(PreprocessorDefinitions) - MultiThreaded - Use - Level3 - ProgramDatabase - true - true - stdcpp17 - - - NDEBUG;%(PreprocessorDefinitions) - $(IntDir);%(AdditionalIncludeDirectories) - - - true - comctl32.lib;uxtheme.lib;winmm.lib;htmlhelp.lib;wininet.lib;version.lib;%(AdditionalDependencies) - .\$(TargetName).def - true - Windows - true - true - true - - - - - NDEBUG;%(PreprocessorDefinitions) - false - true - StartMenuHelper_i.h - StartMenuHelper_i.c - StartMenuHelper_p.c - - - MaxSpeed - ..\..\Lib;%(AdditionalIncludeDirectories) - WIN32;_WINDOWS;NDEBUG;_USRDLL;%(PreprocessorDefinitions) - MultiThreaded - Use - Level3 - ProgramDatabase - true - true - stdcpp17 - - - NDEBUG;%(PreprocessorDefinitions) - $(IntDir);%(AdditionalIncludeDirectories) - + true - comctl32.lib;uxtheme.lib;winmm.lib;htmlhelp.lib;wininet.lib;version.lib;%(AdditionalDependencies) - .\$(TargetName).def - true - Windows - true - true true - - - NDEBUG;%(PreprocessorDefinitions) - false - true - StartMenuHelper_i.h - StartMenuHelper_i.c - StartMenuHelper_p.c - true - - - MaxSpeed - ..\..\Lib;%(AdditionalIncludeDirectories) - WIN32;_WINDOWS;NDEBUG;_USRDLL;BUILD_SETUP;%(PreprocessorDefinitions) - MultiThreaded - Use - Level3 - ProgramDatabase - true - true - stdcpp17 - - - NDEBUG;%(PreprocessorDefinitions) - $(IntDir);%(AdditionalIncludeDirectories) - - - comctl32.lib;uxtheme.lib;winmm.lib;htmlhelp.lib;wininet.lib;version.lib;%(AdditionalDependencies) - .\$(TargetName).def - true - Windows - true - true - - - - - NDEBUG;%(PreprocessorDefinitions) - false - true - StartMenuHelper_i.h - StartMenuHelper_i.c - StartMenuHelper_p.c - - - MaxSpeed - ..\..\Lib;%(AdditionalIncludeDirectories) - WIN32;_WINDOWS;NDEBUG;_USRDLL;BUILD_SETUP;%(PreprocessorDefinitions) - MultiThreaded - Use - Level3 - ProgramDatabase - true - true - stdcpp17 - - - NDEBUG;%(PreprocessorDefinitions) - $(IntDir);%(AdditionalIncludeDirectories) - - - comctl32.lib;uxtheme.lib;winmm.lib;htmlhelp.lib;wininet.lib;version.lib;%(AdditionalDependencies) - .\$(TargetName).def - true - Windows - true - true - - @@ -380,7 +126,9 @@ - + + PreserveNewest + @@ -389,7 +137,7 @@ - + diff --git a/Src/StartMenu/StartMenuHelper/StartMenuHelper.vcxproj.filters b/Src/StartMenu/StartMenuHelper/StartMenuHelper.vcxproj.filters index 942b4e440..119fd0dfb 100644 --- a/Src/StartMenu/StartMenuHelper/StartMenuHelper.vcxproj.filters +++ b/Src/StartMenu/StartMenuHelper/StartMenuHelper.vcxproj.filters @@ -88,7 +88,7 @@ Header Files - + Generated Files diff --git a/Src/StartMenu/StartMenuHelper/dllmain.cpp b/Src/StartMenu/StartMenuHelper/dllmain.cpp index 10c2ced4e..ebecaa183 100644 --- a/Src/StartMenu/StartMenuHelper/dllmain.cpp +++ b/Src/StartMenu/StartMenuHelper/dllmain.cpp @@ -2,7 +2,7 @@ #include "stdafx.h" #include "resource.h" -#include "StartMenuHelper_i.h" +#include "StartMenuHelper_h.h" #include "dllmain.h" #include "Settings.h" #include "Translations.h" @@ -37,11 +37,6 @@ void SettingChangedCallback( const CSetting *pSetting ) { } -const wchar_t *GetDocRelativePath( void ) -{ - return L""; -} - CSetting g_Settings[]={ {L"MenuStyleGroup",CSetting::TYPE_GROUP}, {L"MenuStyle",CSetting::TYPE_INT,0,0,2}, @@ -57,6 +52,7 @@ CSetting g_Settings[]={ {L"DisablePinExt",CSetting::TYPE_BOOL,0,0,0}, {L"FolderStartMenu",CSetting::TYPE_STRING,0,0,L""}, {L"FolderCommonStartMenu",CSetting::TYPE_STRING,0,0,L""}, + {L"PinnedItemsPath",CSetting::TYPE_DIRECTORY,0,0,L"%APPDATA%\\OpenShell\\Pinned"}, {L"Language",CSetting::TYPE_GROUP}, {L"Language",CSetting::TYPE_STRING,0,0,L"",CSetting::FLAG_COLD|CSetting::FLAG_SHARED}, @@ -91,7 +87,7 @@ static DWORD CALLBACK DllInitThread( void* ) } wchar_t fname[_MAX_PATH]; - Sprintf(fname,_countof(fname),L"%s" INI_PATH L"StartMenuHelperL10N.ini",path); + Sprintf(fname,_countof(fname),L"%sStartMenuHelperL10N.ini",path); CString language=GetSettingString(L"Language"); ParseTranslations(fname,language); diff --git a/Src/StartMenu/StartMenuHelper/stdafx.h b/Src/StartMenu/StartMenuHelper/stdafx.h index b1237cc39..4a90cdb03 100644 --- a/Src/StartMenu/StartMenuHelper/stdafx.h +++ b/Src/StartMenu/StartMenuHelper/stdafx.h @@ -12,7 +12,7 @@ #define _ATL_APARTMENT_THREADED #define _ATL_NO_AUTOMATIC_NAMESPACE - +#define _ATL_MODULES // compatibility with /permissive- #define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS // some CString constructors will be explicit #include "resource.h" @@ -22,9 +22,3 @@ #include using namespace ATL; - -#ifdef BUILD_SETUP -#define INI_PATH L"" -#else -#define INI_PATH L"..\\" -#endif diff --git a/Src/StartMenu/StartMenuL10N.ini b/Src/StartMenu/StartMenuL10N.ini index 6df9b5086..8c915b8e4 100644 --- a/Src/StartMenu/StartMenuL10N.ini +++ b/Src/StartMenu/StartMenuL10N.ini @@ -93,6 +93,7 @@ Menu.SearchPeople = عن أ&شخاص... Menu.SortByName = فرز &حسب الاسم Menu.Open = ف&تح Menu.OpenAll = &فتح كافة المستخدمين +Menu.OpenPinned = Open Pinned Menu.Explore = ا&ستكشاف Menu.ExploreAll = است&كشاف كافة المستخدمين Menu.MenuSettings = إعدادات @@ -229,6 +230,7 @@ Menu.SearchPeople = За хо&ра... Menu.SortByName = &Сортирай по име Menu.Open = &Отвори Menu.OpenAll = О&твори "Всички потребители" +Menu.OpenPinned = Отворете фиксираните елементи Menu.Explore = &Преглед Menu.ExploreAll = Пре&глед на "Всички потребители" Menu.MenuSettings = Настройки @@ -365,6 +367,7 @@ Menu.SearchPeople = &Persones... Menu.SortByName = Ordenar per &Nom Menu.Open = &Obrir Menu.OpenAll = Ob&rir tots els usuaris +Menu.OpenPinned = Obre elements fixats Menu.Explore = E&xplorar Menu.ExploreAll = &Explorar tots els usuaris Menu.MenuSettings = Configuració @@ -503,6 +506,7 @@ Menu.SearchPeople = Oso&by... Menu.SortByName = Seřadit podle &názvu Menu.Open = &Otevřít Menu.OpenAll = Ot&evřít položky všech uživatele +Menu.OpenPinned = Otevřít připnuté položky Menu.Explore = Proz&koumat Menu.ExploreAll = P&rocházet položky všech uživatelů Menu.MenuSettings = Nastavení @@ -639,6 +643,7 @@ Menu.SearchPeople = Efter &personer... Menu.SortByName = So&rter efter navn Menu.Open = Å&bn Menu.OpenAll = &Åbn mappen Alle brugere +Menu.OpenPinned = Åbn fastgjorte elementer Menu.Explore = &Stifinder Menu.ExploreAll = &Gennemse mappen Alle brugere Menu.MenuSettings = Indstillinger @@ -705,7 +710,7 @@ Menu.Documents = &Dokumente Menu.Settings = &Einstellungen Menu.Search = &Suchen Menu.SearchBox = Suchen -Menu.SearchPrograms = Programme/Dateien durchsuchen +Menu.SearchPrograms = Programme und Dateien durchsuchen Menu.SearchInternet = Internet durchsuchen Menu.Searching = Suchvorgang... Menu.NoMatch = Es wurden keine Suchergebnisse gefunden. @@ -741,8 +746,8 @@ Menu.UserMusicTip = Enthält Musik- und andere Audiodateien. Menu.UserVideosTip = Enthält Filme und andere Videodateien. Menu.NetworkTip = Zeigt vorhandene Netzwerkverbindungen an und hilft bei der Erstellung von neuen Verbindungen. Menu.PrintersTip = Fügt lokale und Netzwerkdrucker hinzu, entfernt und konfiguriert diese. -Menu.TaskbarTip = Passt das Startmenü und die Taskleiste an, z.B. die Auswahl anzuzeigender Elementtypen und deren Darstellung. -Menu.ControlPanelTip = Ändert Einstellungen, und passt die Funktionalität des Computers an. +Menu.TaskbarTip = Passt das Startmenü und die Taskleiste an, z. B. die Auswahl anzuzeigender Elementtypen und deren Darstellung. +Menu.ControlPanelTip = Ändert Einstellungen und passt die Funktionalität des Computers an. Menu.DocumentsLibTip = Greift auf Briefe, Berichte, Notizen und andere Dokumente zu. Menu.MusicLibTip = Gibt Musik und andere Audiodateien wieder. Menu.PicturesLibTip = Zeigt digitale Bilder an und verwaltet sie. @@ -753,20 +758,20 @@ Menu.HomegroupTip = Greift auf Bibliotheken und Ordner zu, die von anderen Perso Menu.RunTip = Öffnet ein Programm, einen Ordner, ein Dokument oder eine Website. Menu.HelpTip = Sucht Hilfethemen, Lernprogramme, Problembehandlung und andere Supportdienste. Menu.ProgramsTip = Öffnet eine Liste der Programme. -Menu.SearchFilesTip = Sucht nach Dokumenten, Musik, Bildern, E-Mail und mehr. +Menu.SearchFilesTip = Sucht nach Dokumenten, Musik, Bildern, E-Mails und mehr. Menu.GamesTip = Verwaltet Spiele auf dem Computer. Menu.SecurityTip = Öffnet die Windows-Sicherheitsoptionen, um Kennwörter zu ändern, sich als anderer Benutzer anzumelden oder den Task-Manager zu starten. Menu.SearchComputersTip = Nach Computern im Netzwerk suchen Menu.SearchPrintersTip = Nach einem Drucker suchen Menu.AdminToolsTip = Konfigurieren Sie Verwaltungseinstellungen für den Computer. -Menu.ShutdownTip = Schließt alle offenen Programme, fährt Windows herunter, und schaltet den Computer aus. -Menu.RestartTip = Schließt alle offenen Programme, fährt Windows herunter, und führt einen Neustart durch. -Menu.SleepTip = Speichert die Sitzung im Arbeitsspeicher und versetzt den Computer in einen Energiesparmodus, so dass die Sitzung schnell wiederhergestellt werden kann. +Menu.ShutdownTip = Schließt alle offenen Programme, fährt Windows herunter und schaltet den Computer aus. +Menu.RestartTip = Schließt alle offenen Programme, fährt Windows herunter und führt einen Neustart durch. +Menu.SleepTip = Speichert die Sitzung im Arbeitsspeicher und versetzt den Computer in einen Energiesparmodus, sodass die Sitzung schnell wiederhergestellt werden kann. Menu.HibernateTip = Speichert die Sitzung und schaltet den Computer aus. Wenn Sie den Computer einschalten, wird die Sitzung wiederhergestellt. Menu.LogOffTip = Schließt Programme und führt die Abmeldung aus. Menu.DisconnectTip = Trennt diese Sitzung. Sie können eine Verbindung mit dieser Sitzung erneut herstellen, wenn Sie sich das nächste Mal anmelden. Menu.LockTip = Sperrt diesen Computer. -Menu.UndockTip = Entfernt den Laptop- bzw. Notebookcomputer aus der Dockingstation. +Menu.UndockTip = Entfernt den Laptop oder das Notebook aus der Dockingstation. Menu.SwitchUserTip = Wechselt Benutzer, ohne Programme zu schließen. Menu.Empty = (Leer) Menu.Features = Programme und Funktionen @@ -775,6 +780,7 @@ Menu.SearchPeople = &Nach Personen... Menu.SortByName = &Nach Namen sortieren Menu.Open = Ö&ffnen Menu.OpenAll = Öffnen - &Alle Benutzer +Menu.OpenPinned = Öffnen - &Schnellzugriff Menu.Explore = &Explorer Menu.ExploreAll = E&xplorer - Alle Benutzer Menu.MenuSettings = Einstellungen @@ -911,6 +917,7 @@ Menu.SearchPeople = Για ά&τομα... Menu.SortByName = Ταξι&νόμηση κατά όνομα Menu.Open = Άν&οιγμα Menu.OpenAll = Άνοιγμα ό&λων των χρηστών +Menu.OpenPinned = Άνοιγμα καρφιτσωμένων στοιχείων Menu.Explore = Ε&ξερεύνηση Menu.ExploreAll = &Εξερεύνηση όλων των χρηστών Menu.MenuSettings = Ρυθμίσεις @@ -1047,6 +1054,7 @@ Menu.SearchPeople = For &People... Menu.SortByName = Sort &by Name Menu.Open = &Open Menu.OpenAll = O&pen All Users +Menu.OpenPinned = Open Pinned Menu.Explore = &Explore Menu.ExploreAll = E&xplore All Users Menu.MenuSettings = Settings @@ -1183,6 +1191,7 @@ Menu.SearchPeople = &Personas... Menu.SortByName = Ordenar por &Nombre Menu.Open = &Abrir Menu.OpenAll = Ab&rir todos los usuarios +Menu.OpenPinned = Abrir elementos fijados Menu.Explore = E&xplorar Menu.ExploreAll = &Explorar todos los usuarios Menu.MenuSettings = Configuración @@ -1319,6 +1328,7 @@ Menu.SearchPeople = &Inimesi... Menu.SortByName = Sor&di nime järgi Menu.Open = &Ava Menu.OpenAll = A&va kaust Kõik kasutajad +Menu.OpenPinned = Ava kinnitatud üksused Menu.Explore = Uu&ri Menu.ExploreAll = Uur&i kausta Kõik kasutajad Menu.MenuSettings = Sätted @@ -1455,6 +1465,7 @@ Menu.SearchPeople = برای ا&فراد... Menu.SortByName = &ترتیب بر اساس نام Menu.Open = با&ز کردن Menu.OpenAll = باز کردن تمام &کاربرها +Menu.OpenPinned = Open Pinned Menu.Explore = کاو&ش Menu.ExploreAll = کاوش ت&مام کاربرها Menu.MenuSettings = تنظیمات @@ -1593,6 +1604,7 @@ Menu.SearchPeople = &Henkilöitä... Menu.SortByName = &Lajittele nimen mukaan Menu.Open = &Avaa Menu.OpenAll = Avaa &kaikki käyttäjät +Menu.OpenPinned = Avaa kiinnitetyt kohteet Menu.Explore = &Resurssienhallinta Menu.ExploreAll = &Selaa kaikkia käyttäjiä Menu.MenuSettings = Asetukset @@ -1729,6 +1741,7 @@ Menu.SearchPeople = Des &personnes… Menu.SortByName = Trier par &nom Menu.Open = &Ouvrir Menu.OpenAll = Ouvrir &tous les utilisateurs +Menu.OpenPinned = Ouvrir les éléments épinglés Menu.Explore = E&xplorer Menu.ExploreAll = &Explorer Tous les utilisateurs Menu.MenuSettings = Paramètres @@ -1865,6 +1878,7 @@ Menu.SearchPeople = Airson &daoine... Menu.SortByName = Seòrsaich a-rèir ain&m Menu.Open = F&osgail Menu.OpenAll = &Fosgail a h-uile cleachdaiche +Menu.OpenPinned = Fosgail nithean pinnte Menu.Explore = &Rùraich Menu.ExploreAll = Rùraic&h a h-uile cleachdaiche Menu.MenuSettings = Roghainnean @@ -2001,6 +2015,7 @@ Menu.SearchPeople = עבור &אנשים... Menu.SortByName = מיין לפי &שם Menu.Open = &פתח Menu.OpenAll = פתח את &כל המשתמשים +Menu.OpenPinned = Open Pinned Menu.Explore = &סייר Menu.ExploreAll = סיי&ר בכל המשתמשים Menu.MenuSettings = הגדרות @@ -2137,6 +2152,7 @@ Menu.SearchPeople = Za &osobe... Menu.SortByName = Poredaj po i&menu Menu.Open = &Otvori Menu.OpenAll = Ot&vori sve korisnike +Menu.OpenPinned = Otvaranje zakačenih stavki Menu.Explore = Ist&raži Menu.ExploreAll = Istr&aži sve korisnike Menu.MenuSettings = Postavke @@ -2273,6 +2289,7 @@ Menu.SearchPeople = &Személyek... Menu.SortByName = &Név szerinti rendezés Menu.Open = &Megnyitás Menu.OpenAll = M&egnyitás - All Users +Menu.OpenPinned = Open Pinned Menu.Explore = T&allózás Menu.ExploreAll = Ta&llózás - All Users Menu.MenuSettings = Beállítások @@ -2411,6 +2428,7 @@ Menu.SearchPeople = Að &fólki... Menu.SortByName = Raða &eftir heiti Menu.Open = &Opna Menu.OpenAll = O&pna Allir notendur +Menu.OpenPinned = Opnaðu fest atriði Menu.Explore = Opna &möppu Menu.ExploreAll = Opna m&öppu Allir notendur Menu.MenuSettings = Stillingar @@ -2547,6 +2565,7 @@ Menu.SearchPeople = &Contatti... Menu.SortByName = Or&dina per nome Menu.Open = &Apri Menu.OpenAll = Apri &cartella Utenti +Menu.OpenPinned = Apri gli elementi appuntati Menu.Explore = &Esplora Menu.ExploreAll = Esplora cartella &Utenti Menu.MenuSettings = Impostazioni @@ -2683,6 +2702,7 @@ Menu.SearchPeople = 人(&P)... Menu.SortByName = 名前順で並べ替え(&B) Menu.Open = 開く(&O) Menu.OpenAll = 開く - All Users(&P) +Menu.OpenPinned = 開く - Pinned Menu.Explore = エクスプローラー(&E) Menu.ExploreAll = エクスプローラー - All Users(&X) Menu.MenuSettings = 設定 @@ -2819,6 +2839,7 @@ Menu.SearchPeople = 사람 찾기(&P)... Menu.SortByName = 이름순 정렬(&B) Menu.Open = 열기(&O) Menu.OpenAll = 열기 - All Users(&P) +Menu.OpenPinned = 열기 - Pinned Menu.Explore = 탐색(&E) Menu.ExploreAll = 탐색 - All Users(&X) Menu.MenuSettings = 설정 @@ -2955,6 +2976,7 @@ Menu.SearchPeople = &Asmenims... Menu.SortByName = &Rūšiuoti pagal vardus Menu.Open = &Atidaryti Menu.OpenAll = A&tidaryti aplanką Visi vartotojai +Menu.OpenPinned = Atidaryti prisegtus elementus Menu.Explore = Naršyt&i Menu.ExploreAll = Na&ršyti visus vartotojus Menu.MenuSettings = Parametrai @@ -3091,6 +3113,7 @@ Menu.SearchPeople = &Personām... Menu.SortByName = &Kārtot pēc nosaukuma Menu.Open = A&tvērt Menu.OpenAll = &Atvērt visus lietotājus +Menu.OpenPinned = Atvērt piespraustos vienumus Menu.Explore = &Pārlūkot Menu.ExploreAll = Pār&lūkot visus lietotājus Menu.MenuSettings = Iestatījumi @@ -3227,6 +3250,7 @@ Menu.SearchPeople = За луѓе... Menu.SortByName = Сортирај по име Menu.Open = Отвори Menu.OpenAll = Отвори "Сите корисници" +Menu.OpenPinned = Отворете закачени ставки Menu.Explore = Преглед Menu.ExploreAll = Преглед на "Сите корисници" Menu.MenuSettings = Подесувања @@ -3363,6 +3387,7 @@ Menu.SearchPeople = Etter &personer... Menu.SortByName = Sorter etter &navn Menu.Open = Å&pne Menu.OpenAll = &Åpne mappen All users +Menu.OpenPinned = Åpne festede elementer Menu.Explore = &Utforsk Menu.ExploreAll = Utforsk &mappen All users Menu.MenuSettings = Innstillinger @@ -3499,6 +3524,7 @@ Menu.SearchPeople = &Personen... Menu.SortByName = S&orteren op naam Menu.Open = &Openen Menu.OpenAll = &Alle gebruikers weergeven +Menu.OpenPinned = Open vastgezette items Menu.Explore = Ve&rkennen Menu.ExploreAll = Alle &gebruikers verkennen Menu.MenuSettings = Instellingen @@ -3635,6 +3661,7 @@ Menu.SearchPeople = &Do osób... Menu.SortByName = Sortuj w&edług nazw Menu.Open = &Otwórz Menu.OpenAll = Otwórz &wszystkich użytkowników +Menu.OpenPinned = Otwórz przypięte elementy Menu.Explore = &Eksploruj Menu.ExploreAll = E&ksploruj wszystkich użytkowników Menu.MenuSettings = Ustawienia @@ -3722,7 +3749,7 @@ Menu.RestartUpdate = Atualizar e reiniciar Menu.Sleep = &Dormir Menu.Hibernate = &Hibernar Menu.ControlPanel = &Painel de controle -Menu.PCSettings = Configurações do computador +Menu.PCSettings = Configurações Menu.Security = Segurança do Windows Menu.Network = Co&nexões de Rede Menu.Printers = &Impressoras @@ -3771,6 +3798,7 @@ Menu.SearchPeople = Para &Pessoas... Menu.SortByName = C&lassificar por nome Menu.Open = &Abrir Menu.OpenAll = A&brir a pasta All Users +Menu.OpenPinned = Abrir itens fixados Menu.Explore = E&xplorar Menu.ExploreAll = Expl&orar a pasta All Users Menu.MenuSettings = Configurações @@ -3907,6 +3935,7 @@ Menu.SearchPeople = &Pessoas... Menu.SortByName = Ordenar pelo &nome Menu.Open = &Abrir Menu.OpenAll = A&brir All Users +Menu.OpenPinned = Abrir os itens fixados Menu.Explore = E&xplorar Menu.ExploreAll = Explorar All &Users Menu.MenuSettings = Definições @@ -4043,6 +4072,7 @@ Menu.SearchPeople = &Persoane... Menu.SortByName = &Sortare după nume Menu.Open = &Deschidere Menu.OpenAll = Desc&hidere Toți utilizatorii +Menu.OpenPinned = Deschideți elementele fixate Menu.Explore = &Explorare Menu.ExploreAll = E&xplorare Toți utilizatorii Menu.MenuSettings = Setări @@ -4179,6 +4209,7 @@ Menu.SearchPeople = &Людей... Menu.SortByName = &Сортировать по имени Menu.Open = &Открыть Menu.OpenAll = Открыть о&бщее для всех меню +Menu.OpenPinned = Открыть папку "Pinned" Menu.Explore = &Проводник Menu.ExploreAll = Проводни&к в общее для всех меню Menu.MenuSettings = Настройка @@ -4315,6 +4346,7 @@ Menu.SearchPeople = Ľu&dia... Menu.SortByName = &Usporiadať podľa názvov Menu.Open = &Otvoriť Menu.OpenAll = Ot&voriť profil All Users +Menu.OpenPinned = Otvoriť Pinned Menu.Explore = &Preskúmať Menu.ExploreAll = P&reskúmať profil All Users Menu.MenuSettings = Nastavenie @@ -4451,6 +4483,7 @@ Menu.SearchPeople = &Za osebe ... Menu.SortByName = &Razvrsti po imenih Menu.Open = &Odpri Menu.OpenAll = O&dpri mapo »All users« +Menu.OpenPinned = Odpri »Pinned« Menu.Explore = R&azišči Menu.ExploreAll = &Razišči mapo »All users« Menu.MenuSettings = Nastavitve @@ -4587,6 +4620,7 @@ Menu.SearchPeople = &Za osobe... Menu.SortByName = &Sortiraj po imenu Menu.Open = &Otvori Menu.OpenAll = O&tvori sve korisnike +Menu.OpenPinned = Otvori dodato Menu.Explore = &Istraži Menu.ExploreAll = Istraži sve &korisnike Menu.MenuSettings = Postavke @@ -4723,6 +4757,7 @@ Menu.SearchPeople = Efter &personer... Menu.SortByName = Sortera efter &namn Menu.Open = &Öppna Menu.OpenAll = Öppna &delade Start-menyn +Menu.OpenPinned = Öppna fästa objekt Menu.Explore = &Utforska Menu.ExploreAll = Utf&orska delade Start-menyn Menu.MenuSettings = Inställningar @@ -4860,6 +4895,7 @@ Menu.SearchPeople = สำหรับ&บุคคล... Menu.SortByName = เรียงลำดั&บตามชื่อ Menu.Open = เ&ปิด Menu.OpenAll = &เปิดโฟลเดอร์ All Users +Menu.OpenPinned = เ&ปิด Pinned Menu.Explore = สำรว&จ Menu.ExploreAll = &สำรวจโฟลเดอร์ All Users Menu.MenuSettings = การตั้งค่า @@ -4996,6 +5032,7 @@ Menu.SearchPeople = &Kişiler... Menu.SortByName = A&da Göre Sırala Menu.Open = &Aç Menu.OpenAll = Tü&m Kullanıcıları Aç +Menu.OpenPinned = Sabitlenmiş öğeleri Aç Menu.Explore = A&raştır Menu.ExploreAll = &Tüm Kullanıcıları Araştır Menu.MenuSettings = Ayarlar @@ -5132,6 +5169,7 @@ Menu.SearchPeople = Л&юдей... Menu.SortByName = Сортувати за &іменем Menu.Open = &Відкрити Menu.OpenAll = В&ідкрити спільне для всіх меню +Menu.OpenPinned = Open Pinned Menu.Explore = &Провідник Menu.ExploreAll = Пр&овідник до спільного для всіх меню Menu.MenuSettings = Настройки @@ -5268,6 +5306,7 @@ Menu.SearchPeople = 个人(&P)... Menu.SortByName = 按名称排序(&B) Menu.Open = 打开(&O) Menu.OpenAll = 打开所有用户(&P) +Menu.OpenPinned = Open Pinned Menu.Explore = 浏览(&E) Menu.ExploreAll = 浏览所有用户(&X) Menu.MenuSettings = 设置 @@ -5404,6 +5443,7 @@ Menu.SearchPeople = 人員(&P)... Menu.SortByName = 依名稱排序(&B) Menu.Open = 開啟(&O) Menu.OpenAll = 開啟所有使用者(&P) +Menu.OpenPinned = Open Pinned Menu.Explore = 檔案總管(&E) Menu.ExploreAll = 瀏覽所有使用者(&X) Menu.MenuSettings = 設定 @@ -5540,6 +5580,7 @@ Menu.SearchPeople = 人員(&P)... Menu.SortByName = 依名稱排序(&B) Menu.Open = 開啟(&O) Menu.OpenAll = 開啟所有使用者(&P) +Menu.OpenPinned = Open Pinned Menu.Explore = 檔案總管(&E) Menu.ExploreAll = 瀏覽所有使用者(&X) Menu.MenuSettings = 設定 diff --git a/Src/StartMenu/stdafx.h b/Src/StartMenu/stdafx.h index 122f46672..9f7676bd1 100644 --- a/Src/StartMenu/stdafx.h +++ b/Src/StartMenu/stdafx.h @@ -14,6 +14,7 @@ #include #include +#define _ATL_MODULES // compatibility with /permissive- #define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS // some CString constructors will be explicit #include diff --git a/Src/Update/DesktopToasts/DesktopToasts.vcxproj b/Src/Update/DesktopToasts/DesktopToasts.vcxproj index 5d5a7755a..a68cbab4a 100644 --- a/Src/Update/DesktopToasts/DesktopToasts.vcxproj +++ b/Src/Update/DesktopToasts/DesktopToasts.vcxproj @@ -18,73 +18,28 @@ 10.0 - + DynamicLibrary - true - v142 - Unicode - - - DynamicLibrary - false - v142 - true + $(DefaultPlatformToolset) Unicode + true - - - - - - - + + - - true - ..\$(Configuration)\ - - - false - $(Configuration)\ - - - - Level3 - true - WIN32;_DEBUG;DESKTOPTOASTS_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) - true - MultiThreadedDebug - - - Windows - true - false - runtimeobject.lib;%(AdditionalDependencies) - DesktopToasts.def - - - + - Level3 - true - true true - WIN32;NDEBUG;DESKTOPTOASTS_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) - true - stdcpp17 - MultiThreaded + DESKTOPTOASTS_EXPORTS;_USRDLL;%(PreprocessorDefinitions) + NotUsing - Windows - true - true - true false runtimeobject.lib;%(AdditionalDependencies) DesktopToasts.def diff --git a/Src/Update/Update.cpp b/Src/Update/Update.cpp index c7f40e451..5a64b411d 100644 --- a/Src/Update/Update.cpp +++ b/Src/Update/Update.cpp @@ -44,11 +44,6 @@ void UpdateSettings( void ) UpdateSetting(L"Language",language,false); } -const wchar_t *GetDocRelativePath( void ) -{ - return NULL; -} - static int g_LoadDialogs[]= { IDD_UPDATE,0x04000000, @@ -103,7 +98,6 @@ class CUpdateDlg: public CResizeableDlg void Run( void ); void UpdateData( void ); - bool HasNewLanguage( void ) { return (m_Data.bNewLanguage && !m_Data.bIgnoreLanguage) && !(m_Data.bNewVersion && !m_Data.bIgnoreVersion); } protected: // Handler prototypes: @@ -149,7 +143,7 @@ LRESULT CUpdateDlg::OnInitDialog( UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& HDC hdc=::GetDC(NULL); int dpi=GetDeviceCaps(hdc,LOGPIXELSY); ::ReleaseDC(NULL,hdc); - m_Font=CreateFont(-9*dpi/72,0,0,0,FW_NORMAL,0,0,0,DEFAULT_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,FIXED_PITCH,L"Consolas"); + m_Font=CreateFont(-MulDiv(9,dpi,72),0,0,0,FW_NORMAL,0,0,0,DEFAULT_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,FIXED_PITCH,L"Consolas"); if (m_Font) GetDlgItem(IDC_EDITTEXT).SetFont(m_Font); m_Tooltip.Create(TOOLTIPS_CLASS,m_hWnd,NULL,NULL,WS_POPUP|TTS_NOPREFIX); @@ -204,7 +198,7 @@ LRESULT CUpdateDlg::OnCancel( WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bH LRESULT CUpdateDlg::OnColorStatic( UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled ) { - if ((m_Data.bNewVersion || m_Data.bNewLanguage) && lParam==(LPARAM)GetDlgItem(IDC_STATICLATEST).m_hWnd) + if (m_Data.bNewVersion && lParam==(LPARAM)GetDlgItem(IDC_STATICLATEST).m_hWnd) { HDC hdc=(HDC)wParam; SetTextColor(hdc,0xFF); @@ -288,37 +282,6 @@ LRESULT CUpdateDlg::OnDownload( WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& } } } - else if (m_Data.bNewLanguage) - { - for (std::vector::const_iterator it=m_Data.languages.begin();it!=m_Data.languages.end();++it) - { - if (_wcsicmp(m_Data.newLanguage,it->language)==0) - { - CString error; - DWORD res=DownloadLanguageDll(m_hWnd,COMPONENT_UPDATE,*it,error); - if (res==2) - return 0; - if (res) - { - MessageBox(LoadStringEx(it->bBasic?IDS_LANGUAGE_SUCCESS2:IDS_LANGUAGE_SUCCESS),LoadStringEx(IDS_UPDATE_TITLE),MB_OK|(it->bBasic?MB_ICONWARNING:MB_ICONINFORMATION)); - SetDlgItemText(IDC_STATICLATEST,L""); - } - else - { - error+=LoadStringEx(IDS_DOWNLOAD_TIP)+L"\r\n\r\n"+m_Data.languageLink; - TASKDIALOGCONFIG task={sizeof(task),m_hWnd,NULL,TDF_ENABLE_HYPERLINKS|TDF_ALLOW_DIALOG_CANCELLATION|TDF_USE_HICON_MAIN,TDCBF_OK_BUTTON}; - CString title=LoadStringEx(IDS_UPDATE_TITLE); - task.pszWindowTitle=title; - task.pszContent=error; - task.hMainIcon=LoadIcon(NULL,IDI_ERROR); - task.pfCallback=TaskDialogCallbackProc; - TaskDialogIndirect(&task,NULL,NULL,NULL); - } - return 0; - } - } - Assert(0); // NEWLanguage is not in the list - } return 0; } @@ -332,11 +295,6 @@ LRESULT CUpdateDlg::OnDontRemind( WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL m_Data.bIgnoreVersion=(IsDlgButtonChecked(IDC_CHECKDONT)==BST_CHECKED); regKey.SetDWORDValue(L"RemindedVersion",m_Data.bIgnoreVersion?m_Data.newVersion:0); } - else if (m_Data.bNewLanguage) - { - m_Data.bIgnoreLanguage=(IsDlgButtonChecked(IDC_CHECKDONT)==BST_CHECKED); - regKey.SetDWORDValue(L"RemindedLangVersion",m_Data.bIgnoreLanguage?m_Data.encodedLangVersion:0); - } return 0; } @@ -378,28 +336,6 @@ void CUpdateDlg::UpdateUI( void ) tool.lpszText=(LPWSTR)(LPCWSTR)m_Data.downloadUrl; m_Tooltip.SendMessage(TTM_ADDTOOL,0,(LPARAM)&tool); } - else if (m_Data.bNewLanguage) - { - SetDlgItemText(IDC_STATICLATEST,LoadStringEx(IDS_LANG_OUTOFDATE)); - SetDlgItemText(IDC_EDITTEXT,L""); - GetDlgItem(IDC_EDITTEXT).ShowWindow(SW_HIDE); - GetDlgItem(IDC_BUTTONDOWNLOAD).ShowWindow(SW_SHOW); - bool check=true; - if (g_Settings[SETTING_UPDATE].value.vt==VT_I4) - check=g_Settings[SETTING_UPDATE].value.intVal!=0; - GetDlgItem(IDC_CHECKDONT).ShowWindow(check?SW_SHOW:SW_HIDE); - CheckDlgButton(IDC_CHECKDONT,m_Data.bIgnoreLanguage?BST_CHECKED:BST_UNCHECKED); - TOOLINFO tool={sizeof(tool),TTF_SUBCLASS|TTF_IDISHWND,m_hWnd,(UINT_PTR)GetDlgItem(IDC_BUTTONDOWNLOAD).m_hWnd}; - for (std::vector::const_iterator it=m_Data.languages.begin();it!=m_Data.languages.end();++it) - { - if (_wcsicmp(m_Data.newLanguage,it->language)==0) - { - tool.lpszText=(LPWSTR)(LPCWSTR)it->url; - break; - } - } - m_Tooltip.SendMessage(TTM_ADDTOOL,0,(LPARAM)&tool); - } else { SetDlgItemText(IDC_STATICLATEST,LoadStringEx(IDS_UPDATED)); @@ -550,7 +486,7 @@ int WINAPI wWinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpstrC Sleep(sleep); auto title = LoadStringEx(IDS_UPDATE_TITLE); - auto message = LoadStringEx(g_UpdateDlg.HasNewLanguage() ? IDS_LANG_NEWVERSION : IDS_NEWVERSION); + auto message = LoadStringEx(IDS_NEWVERSION); if (toasts) { diff --git a/Src/Update/Update.rc b/Src/Update/Update.rc index 382ed11d1..4f91f0207 100644 --- a/Src/Update/Update.rc +++ b/Src/Update/Update.rc @@ -183,8 +183,6 @@ BEGIN IDS_OUTOFDATE "There is a new version of Open-Shell" IDS_NEWVERSION "There is a new version of Open-Shell.\nClick here to see what's new or to change the reminder settings." IDS_UPDATE_FAIL "Failed to check for new version" - IDS_LANG_OUTOFDATE "There is a new language file for this version of Open-Shell" - IDS_LANG_NEWVERSION "There is a new language file for this version of Open-Shell.\nClick here to install it or to change the reminder settings." END #endif // English (U.S.) resources diff --git a/Src/Update/Update.vcxproj b/Src/Update/Update.vcxproj index 013ace8cf..89e3d4579 100644 --- a/Src/Update/Update.vcxproj +++ b/Src/Update/Update.vcxproj @@ -17,87 +17,26 @@ 10.0 - + Application - v142 - Static - Unicode - true - - - Application - v142 + $(DefaultPlatformToolset) Static Unicode + true - - - - - - - + + - - $(Configuration)\ - $(Configuration)\ - true - - - $(Configuration)\ - $(Configuration)\ - false - - - - Disabled - ..\Lib;%(AdditionalIncludeDirectories) - WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) - EnableFastChecks - MultiThreadedDebug - NotUsing - Level3 - EditAndContinue - true - stdcpp17 - - - $(IntDir);..\Lib;%(AdditionalIncludeDirectories) - - - shlwapi.lib;comctl32.lib;uxtheme.lib;winmm.lib;wininet.lib;htmlhelp.lib;wintrust.lib;crypt32.lib;%(AdditionalDependencies) - true - Windows - - - + - MaxSpeed - false - ..\Lib;%(AdditionalIncludeDirectories) - WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) - MultiThreaded - true NotUsing - Level3 - true - ProgramDatabase - true - stdcpp17 - - $(IntDir);..\Lib;%(AdditionalIncludeDirectories) - shlwapi.lib;comctl32.lib;uxtheme.lib;winmm.lib;wininet.lib;htmlhelp.lib;wintrust.lib;crypt32.lib;%(AdditionalDependencies) - true - Windows - true - true diff --git a/Src/Version.props b/Src/Version.props deleted file mode 100644 index 4345cbde9..000000000 --- a/Src/Version.props +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - 4.4.1000 - - - - _PRODUCT_VERSION=$(CS_VERSION.Replace('.', ',')),0;_PRODUCT_VERSION_STR=\"$(CS_VERSION_ORIG)\";%(PreprocessorDefinitions) - - - - \ No newline at end of file diff --git a/appveyor.yml b/appveyor.yml index 9b62786a9..a9390d421 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,8 +1,11 @@ version: 4.4.{build} +branches: + only: + - master pull_requests: do_not_increment_build_number: true skip_tags: true -image: Visual Studio 2019 +image: Visual Studio 2022 clone_depth: 1 build_script: - cmd: Src\Setup\__MakeFinal.bat @@ -11,3 +14,12 @@ only_commits: files: - Src/ - Localization/ +deploy: +- provider: GitHub + tag: v$(APPVEYOR_BUILD_VERSION) + release: $(APPVEYOR_BUILD_VERSION) + on: + APPVEYOR_ACCOUNT_NAME: passionate-coder + auth_token: + secure: SOu6Y71k0oIxXJR35x+7ZeU/+WRW8kaGnCWcbR3OVOd8HeCJwB1Tw3hUJa5EveLGKaGoMKGqAh01Pwc8tWX4xmphZsYYUr09IVjA0+rqgN5VT87CXD6OQxUxBJ7g+9IN + prerelease: true