├── client ├── client.rc ├── resource.h ├── client.c └── client.vcxproj ├── integration.png ├── plugin ├── plugin.rc ├── plugin.def ├── everything-integration.lua ├── resource.h ├── memset32.asm ├── globals.h ├── memset64.asm ├── plugin.vcxproj ├── plugin.c └── plugin.hpp ├── .gitignore ├── clean.bat ├── release.bat ├── FRC.sln └── README.md /client/client.rc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huettenhain/frc/HEAD/client/client.rc -------------------------------------------------------------------------------- /integration.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huettenhain/frc/HEAD/integration.png -------------------------------------------------------------------------------- /plugin/plugin.rc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/huettenhain/frc/HEAD/plugin/plugin.rc -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # ignore build folders 2 | Release 3 | Debug 4 | x64 5 | */Release 6 | */Debug 7 | */x64 8 | */*.vcxproj.* 9 | */*.aps 10 | *.7z 11 | 12 | # ignore visual studio settings 13 | .vs -------------------------------------------------------------------------------- /plugin/plugin.def: -------------------------------------------------------------------------------- 1 | EXPORTS 2 | ProcessSynchroEventW @1 3 | GetGlobalInfoW @2 4 | SetStartupInfoW @3 5 | GetPluginInfoW @4 6 | OpenW @5 -------------------------------------------------------------------------------- /clean.bat: -------------------------------------------------------------------------------- 1 | @echo off 2 | for %%d in (Debug,Release,x64) do ( 3 | 2>NUL rmdir /q /s .\plugin\%%d 4 | 2>NUL rmdir /q /s .\client\%%d 5 | 2>NUL rmdir /q /s .\%%d 6 | ) 7 | 2>NUL del .\plugin\*.aps 8 | 2>NUL del .\client\*.aps -------------------------------------------------------------------------------- /plugin/everything-integration.lua: -------------------------------------------------------------------------------- 1 | local FRC = "5846B0A6-E130-4B20-8FDD-5CCD70C860BD" 2 | 3 | Macro { 4 | area = "Shell QView Tree Search"; 5 | key = "CtrlE"; 6 | condition = function() return Plugin.Exist(FRC) end; 7 | action = function() Plugin.Call(FRC, "everything") end; 8 | description = "Everything integration via FRC Plugin"; 9 | } 10 | -------------------------------------------------------------------------------- /plugin/resource.h: -------------------------------------------------------------------------------- 1 | //{{NO_DEPENDENCIES}} 2 | // Microsoft Visual C++ generated include file. 3 | // Used by plugin.rc 4 | 5 | // Next default values for new objects 6 | // 7 | #ifdef APSTUDIO_INVOKED 8 | #ifndef APSTUDIO_READONLY_SYMBOLS 9 | #define _APS_NEXT_RESOURCE_VALUE 101 10 | #define _APS_NEXT_COMMAND_VALUE 40001 11 | #define _APS_NEXT_CONTROL_VALUE 1001 12 | #define _APS_NEXT_SYMED_VALUE 101 13 | #endif 14 | #endif 15 | -------------------------------------------------------------------------------- /client/resource.h: -------------------------------------------------------------------------------- 1 | //{{NO_DEPENDENCIES}} 2 | // Microsoft Visual C++ generated include file. 3 | // Used by client.rc 4 | // 5 | 6 | // Next default values for new objects 7 | // 8 | #ifdef APSTUDIO_INVOKED 9 | #ifndef APSTUDIO_READONLY_SYMBOLS 10 | #define _APS_NEXT_RESOURCE_VALUE 102 11 | #define _APS_NEXT_COMMAND_VALUE 40001 12 | #define _APS_NEXT_CONTROL_VALUE 1001 13 | #define _APS_NEXT_SYMED_VALUE 101 14 | #endif 15 | #endif 16 | -------------------------------------------------------------------------------- /release.bat: -------------------------------------------------------------------------------- 1 | @echo off 2 | setlocal enabledelayedexpansion 3 | 4 | set FRC7Z=%1 5 | 6 | if "%FRC7Z%" == "" ( 7 | for /f %%c in ('git tag -l') do set FRC7Z=%%c 8 | ) 9 | 10 | echo releasing as !FRC7Z! 11 | 12 | set FRC7Z=frc-!FRC7Z:V=! 13 | 14 | 2>NUL del !FRC7Z!.x64.7z 15 | 2>NUL del !FRC7Z!.x86.7z 16 | 17 | 1>NUL 7za a !FRC7Z!.x64.7z ./x64/Release/client.exe ./x64/Release/plugin.dll 18 | 1>NUL 7za a !FRC7Z!.x86.7z ./Release/client.exe ./Release/plugin.dll -------------------------------------------------------------------------------- /plugin/memset32.asm: -------------------------------------------------------------------------------- 1 | .586 2 | .model flat 3 | .code 4 | 5 | _memset proc ; tos = ret / dest / char / size 6 | push edi 7 | mov ecx, dword ptr [esp+16] 8 | movzx eax, byte ptr [esp+12] 9 | mov edi, dword ptr [esp+ 8] 10 | shr ecx, 2 11 | jz mb 12 | mov edx, eax 13 | shl eax, 8 14 | or eax, edx 15 | mov dx, ax 16 | shl eax, 16 17 | or eax, edx 18 | rep stosd 19 | mb: mov ecx, dword ptr [esp+16] 20 | and ecx, 3 21 | rep stosb 22 | pop edi 23 | ret 24 | _memset endp 25 | 26 | end -------------------------------------------------------------------------------- /plugin/globals.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | 3 | const static GUID FRC_GUID_PLUG = { 4 | 0x5846B0A6, 0xE130, 0x4B20, 0x8F, 0xDD, 0x5C, 0xCD, 0x70, 0xC8, 0x60, 0xBD 5 | }; 6 | 7 | const static GUID FRC_GUID_FMSG = { 8 | 0x5846B0A6, 0xE130, 0x4B20, 0x8F, 0xDD, 0x5C, 0xCD, 0x70, 0xC8, 0x60, 0xBE 9 | }; 10 | 11 | const static wchar_t *FRC_MSLOT = L"\\\\.\\mailslot\\FRC"; 12 | const static wchar_t *FRC_TITLE = L"Far Remote Control"; 13 | 14 | typedef enum { 15 | FRC_NONE = 0, 16 | FRC_INTO = 1, 17 | FRC_COPY = 2, 18 | FRC_QCPY = 3, 19 | FRC_GOTO = 4, 20 | FRC_QUIT = 0xFF, 21 | } FRC_COMMAND_TYPE; 22 | 23 | #define FRC_LAST FRC_GOTO 24 | #define IS_VALID_CMD(_x) ((_x)>=1 && (_x)<=FRC_LAST) 25 | -------------------------------------------------------------------------------- /plugin/memset64.asm: -------------------------------------------------------------------------------- 1 | .code 2 | 3 | memset proc ; rcx=dest, rdx=char, r8=size 4 | mov r9, rdi ; backup rdi (nonvolatile) 5 | mov rdi, rcx 6 | mov rcx, r8 ; rcx=size, rdx=char, rdi=dest 7 | movzx rax, dl ; rax=char (only one byte) 8 | mov r10, rcx ; backup size 9 | shr rcx, 3 ; memset in qword steps 10 | jz mb ; not even one qword 11 | mov rdx, rax ; prepare patch in rax 12 | shl rax, 8 ; rax=000000X0 13 | or rax, rdx ; rax=000000XX 14 | mov dx, ax 15 | shl rax, 16 ; rax=0000XX00 16 | or rax, rdx ; rax=0000XXXX 17 | mov edx, eax 18 | shl rax, 32 ; rax=XXXX0000 19 | or rax, rdx ; rax=XXXXXXXX 20 | rep stosq 21 | mb: mov rcx, r10 ; restore size 22 | and rcx, 7 ; calculate remainder 23 | rep stosb ; write bytes 24 | mov rdi, r9 ; restore rdi 25 | ret 26 | memset endp 27 | 28 | end -------------------------------------------------------------------------------- /FRC.sln: -------------------------------------------------------------------------------- 1 | 2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio 15 4 | VisualStudioVersion = 15.0.27130.2010 5 | MinimumVisualStudioVersion = 10.0.40219.1 6 | Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "plugin", "plugin\plugin.vcxproj", "{86B138EE-DEC6-46B0-A6A2-4291AD88B27F}" 7 | EndProject 8 | Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "client", "client\client.vcxproj", "{DA0A3DEC-2E4E-438F-A5F1-ED40FA5C8D53}" 9 | EndProject 10 | Global 11 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 12 | Debug|x64 = Debug|x64 13 | Debug|x86 = Debug|x86 14 | Release|x64 = Release|x64 15 | Release|x86 = Release|x86 16 | EndGlobalSection 17 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 18 | {86B138EE-DEC6-46B0-A6A2-4291AD88B27F}.Debug|x64.ActiveCfg = Debug|x64 19 | {86B138EE-DEC6-46B0-A6A2-4291AD88B27F}.Debug|x64.Build.0 = Debug|x64 20 | {86B138EE-DEC6-46B0-A6A2-4291AD88B27F}.Debug|x86.ActiveCfg = Debug|Win32 21 | {86B138EE-DEC6-46B0-A6A2-4291AD88B27F}.Debug|x86.Build.0 = Debug|Win32 22 | {86B138EE-DEC6-46B0-A6A2-4291AD88B27F}.Release|x64.ActiveCfg = Release|x64 23 | {86B138EE-DEC6-46B0-A6A2-4291AD88B27F}.Release|x64.Build.0 = Release|x64 24 | {86B138EE-DEC6-46B0-A6A2-4291AD88B27F}.Release|x86.ActiveCfg = Release|Win32 25 | {86B138EE-DEC6-46B0-A6A2-4291AD88B27F}.Release|x86.Build.0 = Release|Win32 26 | {DA0A3DEC-2E4E-438F-A5F1-ED40FA5C8D53}.Debug|x64.ActiveCfg = Debug|x64 27 | {DA0A3DEC-2E4E-438F-A5F1-ED40FA5C8D53}.Debug|x64.Build.0 = Debug|x64 28 | {DA0A3DEC-2E4E-438F-A5F1-ED40FA5C8D53}.Debug|x86.ActiveCfg = Debug|Win32 29 | {DA0A3DEC-2E4E-438F-A5F1-ED40FA5C8D53}.Debug|x86.Build.0 = Debug|Win32 30 | {DA0A3DEC-2E4E-438F-A5F1-ED40FA5C8D53}.Release|x64.ActiveCfg = Release|x64 31 | {DA0A3DEC-2E4E-438F-A5F1-ED40FA5C8D53}.Release|x64.Build.0 = Release|x64 32 | {DA0A3DEC-2E4E-438F-A5F1-ED40FA5C8D53}.Release|x86.ActiveCfg = Release|Win32 33 | {DA0A3DEC-2E4E-438F-A5F1-ED40FA5C8D53}.Release|x86.Build.0 = Release|Win32 34 | EndGlobalSection 35 | GlobalSection(SolutionProperties) = preSolution 36 | HideSolutionNode = FALSE 37 | EndGlobalSection 38 | GlobalSection(ExtensibilityGlobals) = postSolution 39 | SolutionGuid = {5E533D90-5E60-4377-86FC-CA349E9A1DE1} 40 | EndGlobalSection 41 | EndGlobal 42 | -------------------------------------------------------------------------------- /client/client.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | 4 | #include "../plugin/globals.h" 5 | 6 | BYTE ParseArgument(WCHAR* cmd) { 7 | if (!StrCmpIW(cmd, L"goto")) return FRC_GOTO; 8 | if (!StrCmpIW(cmd, L"copy")) return FRC_COPY; 9 | if (!StrCmpIW(cmd, L"qcpy")) return FRC_QCPY; 10 | if (!StrCmpIW(cmd, L"quit")) return FRC_QUIT; 11 | if (!StrCmpIW(cmd, L"into")) return FRC_INTO; 12 | return FRC_NONE; 13 | } 14 | 15 | __declspec(noreturn) void ExitNoSlot() { 16 | MessageBoxA(NULL, 17 | "Unable to open Mailslot handle.", 18 | "FRC Client Error", MB_OK | MB_ICONERROR); 19 | ExitProcess(1); 20 | } 21 | 22 | __declspec(noreturn) void ExitUsage() { 23 | MessageBoxA(NULL, 24 | "The FRC client executable supports the following commands as its first parameter, " 25 | "followed by an optional argument in some cases. All commands are case-insensitive.\n\n" 26 | "GOTO\nNavigate to the file or folder given as the second argument.\n\n" 27 | "INTO\nLike GOTO, but if the given argument is a folder, navigate into it.\n\n" 28 | "COPY\nInsert the second argument as a string into the FAR command line\n\n" 29 | "QCPY\nInsert the second argument into the FAR command line, but wrap it in double " 30 | "quotes if it contains a space character (used to insert path names)\n\n" 31 | "QUIT\nIssue a request for FRC server termination. The second argument is ignored.", 32 | "FRC Client Usage", MB_OK | MB_ICONWARNING); 33 | ExitProcess(1); 34 | } 35 | 36 | __declspec(noreturn) void main() { 37 | int argc; 38 | WCHAR **argv = CommandLineToArgvW(GetCommandLineW(), &argc); 39 | if (argc >= 2) { 40 | BYTE type = ParseArgument(argv[1]); 41 | if (type != FRC_NONE) { 42 | HANDLE slot = CreateFileW( 43 | FRC_MSLOT, 44 | GENERIC_WRITE, 45 | FILE_SHARE_READ, 46 | NULL, 47 | OPEN_EXISTING, 48 | FILE_ATTRIBUTE_NORMAL, 49 | NULL); 50 | if (slot && slot != INVALID_HANDLE_VALUE) { 51 | WCHAR cmdMask = ((WCHAR)type) << 8; 52 | WCHAR *cmd = &cmdMask; 53 | DWORD size = 2; 54 | if (argc >= 3) { 55 | cmd = argv[2]; 56 | size = (lstrlenW(cmd)+1) * sizeof(WCHAR); 57 | cmd[0] = cmdMask | LOBYTE(cmd[0]); 58 | } 59 | WriteFile(slot, cmd, size, &size, NULL); 60 | CloseHandle(slot); 61 | ExitProcess(0); 62 | } else { 63 | ExitNoSlot(); 64 | } 65 | } 66 | } 67 | ExitUsage(); 68 | } -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # FAR Remote Control Plugin 2 | 3 | This is an extension for the [FAR Manager][FAR], mainly designed to integrate FAR with [Everything], a very fast file search tool for Windows. 4 | 5 | ## Concept and Integration 6 | 7 | The integration is achieved by implementing a [FAR plugin](plugin/plugin.c) and a [client executable](client/client.c). The client executable can submit path names to the plugin by means of a [mailslot], and the plugin will then navigate to this path in the active FAR panel. In particular, you can integrate Everything into FAR this way: 8 | 9 | ![Everything Options for Integration with FRC](integration.png) 10 | 11 | Here, the client command `goto` is used, which instructs the FRC plugin to perform a navigation as outlined above. The client also supports the commands `copy` and `qcpy` which insert the second argument as a string into the FAR command line, where `qcpy` also wraps the string in double quotes if it contains spaces, which may be useful for inserting path names. 12 | 13 | ### Design Problem 14 | A difficulty in FRC design is the fact that only one FAR instance at a time can be the mailslot server, so the commands send from an Everything search will cause a navigation to occur only in the FAR instance whose FRC plugin has currently registered the mailslot. 15 | 16 | ### Sneaky Solution 17 | The plugin has a convenience feature that solves this problem. When the FRC plugin is called from a Macro as follows: 18 | 19 | ```lua 20 | local FRC = "5846B0A6-E130-4B20-8FDD-5CCD70C860BD" -- FRC GUID 21 | Plugin.Call(FRC, "everything.exe") 22 | ``` 23 | 24 | Then the plugin will use `ShellExecuteW` to call `everything.exe`. **However**, it will *first* attempt to silently shut down any *other* FRC server by sending a termination command to the existing mailslot. 25 | 26 | The user experience for this feature is quite simple: When you use the provided [LUA Macro](plugin/everything-integration.lua) for integration, then you can simply press Ctrl+E in the FAR instance you are currently using, an Everything search will pop up and you can search for files. When you press Enter, the FAR instance from which the search was initiated will navigate to the selected folder, and it has also become the active FRC server. 27 | 28 | For further customization, note that you can pass commandline parameters to the plugin call as well: 29 | 30 | ```lua 31 | Plugin.Call(FRC, "everything.exe", "-close") 32 | ``` 33 | 34 | ## Recommended Setup 35 | 36 | My recommended setup is the following: 37 | 38 | - Use the provided [LUA Macro](plugin/everything-integration.lua) for integration. 39 | - In the `General` → `Context Menu` section of *Everything*, configure the following commands: 40 | - `$exec(client.exe goto "%1")` for `Open (Folders)` and `Open Path`. 41 | - `$exec(client.exe qcpy "%1")` for `Explore Path` 42 | - In the `General` → `Keyboard` section of *Everything*, set up following shortcuts: 43 | - Shift+Enter for `File | Open` 44 | - Ctrl+Enter for `File | Explore Path` 45 | - Enter for `File | Open Path` 46 | 47 | This allows you to launch an Everything search from FAR by pressing Ctrl+E, and then navigate to any result by simply selecting it and pressing Enter. In order to insert the search results as a (possibly quoted) path to the FAR command line, you can use Ctrl+Enter instead. Finally, if you want to execut a search result directly, press Shift+Enter. 48 | 49 | ## FRC Plugin Interface 50 | 51 | The FRC interface in FAR is quite simplistic. You can call FRC via F11 from the plugins menu. This will allow you to start and stop the FRC server manually through a sequence of prompts. 52 | 53 | ## FRC Client Interface 54 | 55 | The client executable will provide a list of supported commands when it is executed. The currently supported commands are the following: 56 | 57 | - `goto` navigates to the parent directory of the given file or folder and places the cursor on it. 58 | - `into` works as `goto`, but when the argument is a folder then FRC navigates into this folder. 59 | - `copy` inserts the second argument as a string into the FAR command line. 60 | - `qcpy` acts as `copy`, but wraps the string in double quotes if it contains a space character. 61 | - `quit` issues a request for FRC server termination, the second argument is ignored. 62 | 63 | The executable currently encodes the command in a rather dirty way by overwriting the high order byte of the first wide character of the data which is sent to the mailslot `\\.\mailslot\FRC`. This is mostly lazines on my part, and should not be a problem in the use cases that FRC is *intended* for. The worst case that can happen is that you try to use `copy` to insert some _"true"_ unicode data into the FAR command line and your first character gets utterly destroyed. Path names should only start with an ASCII character, so there should not be a problem there. Have a look at [client.c](client/client.c#L49-L56) and 64 | [plugin.c](plugin/plugin.c#L71-L80) to see what exactly is happening. 65 | 66 | ## Expectable Questions 67 | 68 | > Does FRC work with file names as well? What does it do? 69 | 70 | Yes, the client's `goto` command works similar to the `goto:` command in FAR; It will navigate to the parent directory of the given file or folder and move the cursor to the item. 71 | 72 | > Why did you implement `memset` in [`memset32.asm`](plugin/memset32.asm) and [`memset64.asm`](plugin/memset64.asm)? 73 | 74 | Quite frankly, I mostly did it in ASM because it was fun. The reason I wanted to implement memset at all is so that I could compile the project with [`/NODEFAULTLIB`][NODEFAULTLIB] and create really tiny binaries. And that's just something I like to do. 75 | 76 | > I want to write a FAR plugin and I understand most of what is going on here, but where did you get `plugin.hpp`? 77 | 78 | It is [`plugins/common/unicode/plugin.hpp`][plugin.hpp] from the [FAR Project on GitHub][GitHubFAR] and as FAR as I can tell, that's the way to do it. ¯\\\_(ツ)_/¯ 79 | 80 | > Why don't you just use the [LiveFileSearch] plugin? It's a great plugin and does a much better job of being properly integrated into FAR! 81 | 82 | All true. Sadly, it does not update the run count in Everything and I really wanted that. 83 | 84 | > What in the name of the almighty was your thought process when you decided to interlace the command control with the command argument in such a terrible way? 85 | 86 | To do this in a not so awkward way, I'd have to implement a lot more string operations, both in the client and the server. While that is not terribly hard, this was way easier and it works well for me. Feel free to give this a good scrub and submit a PR if it terrifies you ;-). 87 | 88 | [mailslot]: https://en.wikipedia.org/wiki/MailSlot 89 | [Everything]: https://voidtools.com/ 90 | [FAR]: https://www.farmanager.com/ 91 | [LiveFileSearch]: https://plugring.farmanager.com/plugin.php?l=ru&pid=931 92 | [GitHubFAR]: https://github.com/FarGroup/FarManager 93 | [plugin.hpp]: https://github.com/FarGroup/FarManager/blob/master/plugins/common/unicode/plugin.hpp 94 | [NODEFAULTLIB]: https://docs.microsoft.com/en-us/cpp/build/reference/nodefaultlib-ignore-libraries -------------------------------------------------------------------------------- /client/client.vcxproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Debug 6 | Win32 7 | 8 | 9 | Release 10 | Win32 11 | 12 | 13 | Debug 14 | x64 15 | 16 | 17 | Release 18 | x64 19 | 20 | 21 | 22 | 15.0 23 | {da0a3dec-2e4e-438f-a5f1-ed40fa5c8d53} 24 | client 25 | 10.0 26 | 27 | 28 | 29 | Application 30 | true 31 | v142 32 | MultiByte 33 | 34 | 35 | Application 36 | false 37 | v142 38 | true 39 | MultiByte 40 | 41 | 42 | Application 43 | true 44 | v142 45 | Unicode 46 | 47 | 48 | Application 49 | false 50 | v142 51 | true 52 | Unicode 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | false 74 | 75 | 76 | false 77 | 78 | 79 | 80 | Level3 81 | Disabled 82 | MultiThreadedDebug 83 | true 84 | Default 85 | false 86 | 87 | 88 | Windows 89 | 90 | 91 | main 92 | true 93 | false 94 | true 95 | false 96 | false 97 | Shlwapi.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) 98 | 99 | 100 | 101 | 102 | Level3 103 | Disabled 104 | MultiThreadedDebug 105 | true 106 | Default 107 | false 108 | 109 | 110 | main 111 | Windows 112 | Shlwapi.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) 113 | 114 | 115 | 116 | 117 | Level3 118 | MaxSpeed 119 | true 120 | true 121 | true 122 | false 123 | 124 | 125 | true 126 | true 127 | main 128 | true 129 | false 130 | true 131 | false 132 | false 133 | false 134 | Windows 135 | Shlwapi.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) 136 | 137 | 138 | 139 | 140 | Level3 141 | MaxSpeed 142 | true 143 | true 144 | MultiThreaded 145 | true 146 | false 147 | 148 | 149 | true 150 | true 151 | main 152 | Windows 153 | false 154 | Shlwapi.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | -------------------------------------------------------------------------------- /plugin/plugin.vcxproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Debug 6 | Win32 7 | 8 | 9 | Release 10 | Win32 11 | 12 | 13 | Debug 14 | x64 15 | 16 | 17 | Release 18 | x64 19 | 20 | 21 | 22 | 15.0 23 | {86B138EE-DEC6-46B0-A6A2-4291AD88B27F} 24 | FRC 25 | 10.0 26 | plugin 27 | 28 | 29 | 30 | DynamicLibrary 31 | true 32 | v142 33 | Unicode 34 | false 35 | 36 | 37 | DynamicLibrary 38 | false 39 | v142 40 | true 41 | Unicode 42 | false 43 | 44 | 45 | DynamicLibrary 46 | true 47 | v142 48 | Unicode 49 | false 50 | 51 | 52 | DynamicLibrary 53 | false 54 | v142 55 | true 56 | Unicode 57 | false 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | .dll 80 | 81 | 82 | .dll 83 | 84 | 85 | .dll 86 | 87 | 88 | .dll 89 | 90 | 91 | 92 | Level3 93 | Disabled 94 | true 95 | false 96 | stdcpp17 97 | CompileAsC 98 | MultiThreadedDebug 99 | Default 100 | false 101 | 102 | 103 | plugin.def 104 | Shlwapi.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) 105 | true 106 | 107 | 108 | 109 | true 110 | 111 | 112 | 113 | 114 | Level3 115 | Disabled 116 | true 117 | false 118 | stdcpp17 119 | CompileAsC 120 | MultiThreadedDebug 121 | false 122 | Default 123 | 124 | 125 | plugin.def 126 | Shlwapi.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) 127 | true 128 | 129 | 130 | 131 | 132 | 133 | Level3 134 | MaxSpeed 135 | true 136 | true 137 | true 138 | false 139 | stdcpp17 140 | CompileAsC 141 | MultiThreaded 142 | false 143 | 144 | 145 | true 146 | true 147 | plugin.def 148 | Shlwapi.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) 149 | true 150 | false 151 | 152 | 153 | 154 | true 155 | 156 | 157 | 158 | 159 | Level3 160 | MaxSpeed 161 | true 162 | true 163 | true 164 | false 165 | stdcpp17 166 | CompileAsC 167 | MultiThreaded 168 | false 169 | 170 | 171 | true 172 | true 173 | false 174 | plugin.def 175 | Shlwapi.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) 176 | true 177 | 178 | 179 | 180 | 181 | 182 | 183 | 184 | 185 | true 186 | true 187 | 188 | 189 | Document 190 | true 191 | true 192 | 193 | 194 | 195 | 196 | 197 | 198 | 199 | 200 | 201 | 202 | 203 | 204 | 205 | 206 | 207 | -------------------------------------------------------------------------------- /plugin/plugin.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | 4 | #include "plugin.hpp" 5 | #include "globals.h" 6 | 7 | #define TIMEOUT 500 8 | #define PATIENCE 300 9 | 10 | static struct PluginStartupInfo api = { 0 }; 11 | 12 | HANDLE stopEvent = NULL; 13 | HANDLE doneEvent = NULL; 14 | HANDLE frcThread = NULL; 15 | HANDLE mailbox = NULL; 16 | 17 | typedef struct { 18 | FRC_COMMAND_TYPE type; 19 | WCHAR *arg; 20 | } FRC_COMMAND; 21 | 22 | VOID NullHandle(HANDLE *h) { 23 | if (*h && *h != INVALID_HANDLE_VALUE) 24 | CloseHandle(*h); 25 | *h = NULL; 26 | } 27 | 28 | intptr_t FrcMessage(LPCWSTR *messages, size_t count, FARMESSAGEFLAGS flags) { 29 | return api.Message( 30 | &FRC_GUID_PLUG, 31 | &FRC_GUID_FMSG, 32 | flags, NULL, 33 | messages, count+1, 0); 34 | } 35 | 36 | HANDLE FrcCreateFreeForAllMailslot() { 37 | SECURITY_DESCRIPTOR sd = { 0 }; 38 | SECURITY_ATTRIBUTES sa = { 0 }; 39 | InitializeSecurityDescriptor(&sd, SECURITY_DESCRIPTOR_REVISION); 40 | SetSecurityDescriptorDacl(&sd, TRUE, NULL, FALSE); 41 | sa.nLength = sizeof(SECURITY_ATTRIBUTES); 42 | sa.lpSecurityDescriptor = &sd; 43 | sa.bInheritHandle = TRUE; 44 | return CreateMailslotW(FRC_MSLOT, 0, TIMEOUT, &sa); 45 | } 46 | 47 | DWORD WINAPI Receiver(PVOID reserved) { 48 | HANDLE heap = GetProcessHeap(); 49 | DWORD size = MAX_PATH, bytesRead = 0; 50 | BYTE* data = HeapAlloc(heap, HEAP_ZERO_MEMORY, size); 51 | FRC_COMMAND cmd = {0}; 52 | ResetEvent(doneEvent); 53 | if (data) { 54 | OVERLAPPED ov; 55 | ov.hEvent = CreateEvent(NULL, FALSE, FALSE, NULL); 56 | while (WaitForSingleObject(stopEvent, 0) != WAIT_OBJECT_0) { 57 | ov.Offset = ov.OffsetHigh = 0; 58 | ResetEvent(ov.hEvent); 59 | BOOL success = ReadFile(mailbox, data, size, &bytesRead, &ov); 60 | if (!success && GetLastError() == ERROR_IO_PENDING) 61 | success = GetOverlappedResult(mailbox, &ov, &bytesRead, TRUE); 62 | if (!success) { 63 | DWORD err = GetLastError(); 64 | if (err == ERROR_SEM_TIMEOUT) 65 | continue; 66 | if (err == ERROR_INSUFFICIENT_BUFFER) { 67 | DWORD required = 0, sizeNew = size; 68 | PVOID dataNew; 69 | success = GetMailslotInfo(mailbox, NULL, &required, NULL, NULL); 70 | if (success && required != MAILSLOT_NO_MESSAGE && required > size) { 71 | while (sizeNew < required) 72 | sizeNew *= 2; 73 | dataNew = HeapReAlloc(heap, HEAP_ZERO_MEMORY, data, sizeNew); 74 | if (dataNew != NULL) { 75 | data = dataNew; 76 | size = sizeNew; 77 | continue; 78 | } 79 | } 80 | } 81 | break; 82 | } else if (bytesRead > 1) { 83 | if (data[1] == FRC_QUIT) 84 | break; 85 | *(WCHAR*)(data + bytesRead - sizeof(WCHAR)) = L'\0'; 86 | if (IS_VALID_CMD(data[1])) { 87 | cmd.type = data[1]; 88 | cmd.arg = (WCHAR*) data; 89 | data[1] = 0; 90 | api.AdvControl(&FRC_GUID_PLUG, ACTL_SYNCHRO, 0, &cmd); 91 | } 92 | } 93 | } 94 | CloseHandle(ov.hEvent); 95 | HeapFree(heap, 0, data); 96 | } 97 | NullHandle(&mailbox); 98 | SetEvent(doneEvent); 99 | return 0; 100 | } 101 | 102 | 103 | VOID ReceiverTerminate() { 104 | DWORD retVal = 0; 105 | if (frcThread) { 106 | if ((!GetExitCodeThread(frcThread, &retVal) || retVal == STILL_ACTIVE) && 107 | (WaitForSingleObject(frcThread, PATIENCE) != WAIT_OBJECT_0) && 108 | (!TerminateThread(frcThread, 1))) 109 | RaiseException(0, EXCEPTION_NONCONTINUABLE, 0, NULL); 110 | } 111 | NullHandle(&frcThread); 112 | NullHandle(&mailbox); 113 | } 114 | 115 | BOOL isReceiverStarted() { 116 | if (WaitForSingleObject(doneEvent, 0) == WAIT_OBJECT_0) { 117 | ReceiverTerminate(); 118 | return FALSE; 119 | } else 120 | return TRUE; 121 | } 122 | 123 | BOOL TerminateRemoteFRC() { 124 | BOOL success = FALSE; 125 | HANDLE slot = CreateFileW(FRC_MSLOT, GENERIC_WRITE, 126 | FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); 127 | if (slot != INVALID_HANDLE_VALUE) { 128 | DWORD written; 129 | WCHAR stop = (WCHAR)(FRC_QUIT<<8); 130 | WriteFile(slot, (LPCVOID) &stop, sizeof(stop), &written, NULL); 131 | CloseHandle(slot); 132 | #define SLEEP_STEP 10 133 | for (DWORD slept = 0; slept < TIMEOUT + PATIENCE; 134 | Sleep(SLEEP_STEP), slept += SLEEP_STEP) 135 | # undef SLEEP_STEP 136 | { 137 | mailbox = FrcCreateFreeForAllMailslot(); 138 | if (mailbox != INVALID_HANDLE_VALUE) 139 | return TRUE; 140 | } 141 | mailbox = NULL; 142 | } 143 | return FALSE; 144 | } 145 | 146 | 147 | BOOL ReceiverStart(BOOL quietSuccess, BOOL quietFailure, BOOL terminateOther) { 148 | BOOL didKill = FALSE; 149 | if (!isReceiverStarted()) { 150 | mailbox = FrcCreateFreeForAllMailslot(); 151 | if (mailbox == INVALID_HANDLE_VALUE) { 152 | mailbox = NULL; 153 | if (!terminateOther && !quietFailure) { 154 | LPCWSTR msg[] = { FRC_TITLE, 155 | L"Unable to create mailslot, could not start FRC.", 156 | L"Try to shutdown the other FRC instance blocking the slot?" 157 | }; 158 | terminateOther = !FrcMessage(msg, 2, FMSG_WARNING | FMSG_MB_YESNO); 159 | } 160 | if (!terminateOther || !(didKill = TerminateRemoteFRC())) 161 | return FALSE; 162 | } 163 | ResetEvent(doneEvent); 164 | ResetEvent(stopEvent); 165 | frcThread = CreateThread(NULL, 0, 166 | (LPTHREAD_START_ROUTINE) &Receiver, NULL, 0, NULL); 167 | if (frcThread != NULL) { 168 | if (!quietSuccess) { 169 | LPCWSTR msg[] = { 170 | FRC_TITLE, 171 | L"FRC was successfull started.", 172 | L"A remote FRC was terminated." 173 | }; 174 | FrcMessage(msg, didKill ? 2 : 1, FMSG_MB_OK); 175 | } 176 | return TRUE; 177 | } else { 178 | if (!quietFailure) { 179 | LPCWSTR msg[] = { FRC_TITLE, L"FRC main thread could not be started." }; 180 | FrcMessage(msg, 1, FMSG_WARNING | FMSG_MB_OK | FMSG_ERRORTYPE); 181 | } 182 | return FALSE; 183 | } 184 | } else { 185 | return TRUE; 186 | } 187 | } 188 | 189 | BOOL ReceiverStop() { 190 | SetEvent(stopEvent); 191 | if (WaitForSingleObject(doneEvent, TIMEOUT + PATIENCE) != WAIT_OBJECT_0) 192 | ReceiverTerminate(); 193 | return !isReceiverStarted(); 194 | } 195 | 196 | BOOL FrcGoto(WCHAR* path, BOOL navinto) { 197 | LPWSTR file = NULL; 198 | WCHAR fileFirst = L'\0'; 199 | while (!*PathRemoveBackslashW(path)); 200 | BOOL success = PathFileExistsW(path); 201 | if (success) { 202 | struct FarPanelDirectory dir = { sizeof(dir) }; 203 | dir.Name = path; 204 | if (!navinto || (GetFileAttributesW(path) & FILE_ATTRIBUTE_DIRECTORY) == 0) { 205 | file = PathFindFileNameW(path); 206 | if (file == path) 207 | file = NULL; 208 | else { 209 | fileFirst = file[0]; 210 | file[0] = L'\0'; 211 | } 212 | } 213 | success = (BOOL) api.PanelControl(PANEL_ACTIVE, FCTL_SETPANELDIRECTORY, 0, &dir); 214 | if (success && file) { 215 | HANDLE heap = GetProcessHeap(); 216 | struct PanelInfo PanelInfo = { sizeof(PanelInfo) }; 217 | file[0] = fileFirst; 218 | success = (BOOL) api.PanelControl(PANEL_ACTIVE, FCTL_GETPANELINFO, 0, &PanelInfo); 219 | if (success) { 220 | struct FarGetPluginPanelItem PanelItem = { sizeof(PanelItem) }; 221 | unsigned int i; 222 | success = FALSE; 223 | PanelItem.Size = 2 * MAX_PATH * sizeof(WCHAR) + sizeof(*PanelItem.Item); 224 | PanelItem.Item = (struct PluginPanelItem*) HeapAlloc(heap, HEAP_ZERO_MEMORY, PanelItem.Size); 225 | struct PanelRedrawInfo PanelDrawInfo = { sizeof(PanelDrawInfo) }; 226 | for (i = 0; PanelItem.Item && i < PanelInfo.ItemsNumber; i++) { 227 | size_t size = api.PanelControl(PANEL_ACTIVE, FCTL_GETPANELITEM, i, NULL); 228 | if (size > PanelItem.Size) { 229 | PVOID item = HeapReAlloc(heap, HEAP_ZERO_MEMORY, PanelItem.Item, size); 230 | if (!item) continue; 231 | PanelItem.Item = (struct PluginPanelItem*) item; 232 | PanelItem.Size = size; 233 | } 234 | if (api.PanelControl(PANEL_ACTIVE, FCTL_GETPANELITEM, i, &PanelItem)) { 235 | if (!StrCmpIW((LPWSTR)PanelItem.Item->FileName, file)) { 236 | success = TRUE; 237 | PanelDrawInfo.CurrentItem = i; 238 | break; 239 | } 240 | } 241 | } 242 | if (PanelItem.Item) 243 | HeapFree(heap, 0, (PVOID) PanelItem.Item); 244 | if (success) 245 | success = (BOOL) api.PanelControl(PANEL_ACTIVE, FCTL_REDRAWPANEL, 0, &PanelDrawInfo); 246 | } 247 | } 248 | } 249 | return success; 250 | } 251 | 252 | BOOL FrcCopy(WCHAR* arg, BOOL escape) { 253 | if (escape && StrChrW(arg, L' ')) { 254 | int size = lstrlenW(arg)+1; 255 | HANDLE heap = GetProcessHeap(); 256 | WCHAR* quot = HeapAlloc(heap, HEAP_ZERO_MEMORY, sizeof(WCHAR)*(size+2)); 257 | if (quot) { 258 | lstrcpynW(quot+1, arg, size); 259 | quot[size] = quot[0] = L'"'; 260 | quot[size+1] = L'\0'; 261 | api.PanelControl(PANEL_ACTIVE, FCTL_INSERTCMDLINE, 0, quot); 262 | HeapFree(heap, 0, quot); 263 | } else { 264 | return FALSE; 265 | } 266 | } else { 267 | api.PanelControl(PANEL_ACTIVE, FCTL_INSERTCMDLINE, 0, arg); 268 | } 269 | return TRUE; 270 | } 271 | 272 | typedef struct { 273 | HWND leaf; 274 | HWND root; 275 | BOOL done; 276 | } __GPWDATA; 277 | 278 | BOOL CALLBACK EnumChildProc(HWND hWnd, LPARAM lParam) { 279 | __GPWDATA* gpw = (__GPWDATA*)lParam; 280 | if (hWnd == gpw->leaf) { 281 | gpw->done = TRUE; 282 | return FALSE; 283 | } else { 284 | EnumChildWindows(hWnd, EnumChildProc, lParam); 285 | return !gpw->done; 286 | } 287 | } 288 | 289 | BOOL CALLBACK EnumRootsProc(HWND hWnd, LPARAM lParam) { 290 | __GPWDATA* gpw = (__GPWDATA*)lParam; 291 | if (hWnd == gpw->leaf) { 292 | gpw->done = TRUE; 293 | } else { 294 | EnumChildWindows(hWnd, EnumChildProc, lParam); 295 | } 296 | if (gpw->done) { 297 | gpw->root = hWnd; 298 | return FALSE; 299 | } else { 300 | return TRUE; 301 | } 302 | } 303 | 304 | HWND GetRootWindow(HWND hWnd) { 305 | __GPWDATA gpw = { hWnd, NULL, FALSE }; 306 | EnumWindows(EnumRootsProc, (LPARAM) &gpw); 307 | if (!gpw.done || !gpw.root) 308 | return hWnd; 309 | return gpw.root; 310 | } 311 | 312 | intptr_t WINAPI ProcessSynchroEventW(const struct ProcessSynchroEventInfo * Info) { 313 | if (Info->StructSize >= sizeof(*Info) && Info->Event == SE_COMMONSYNCHRO) { 314 | FRC_COMMAND *cmd = (FRC_COMMAND*) Info->Param; 315 | BOOL success = FALSE; 316 | BOOL escaped = FALSE; 317 | BOOL navinto = FALSE; 318 | 319 | // The following code is required to get the terminal window when FAR is running under ConEmu. To 320 | // restore FAR, it is necessary to obtain a handle to the terminal emulator window rather than the 321 | // console window itself. Under ConEmu, a top-down search of all windows appears to be the only 322 | // way to do so. Details: https://github.com/huettenhain/frc/issues/4 323 | HWND hWnd = GetRootWindow(GetConsoleWindow()); 324 | 325 | ShowWindow(hWnd, IsIconic(hWnd) ? SW_RESTORE : SW_SHOW); 326 | BringWindowToTop(hWnd); 327 | SetWindowPos(hWnd, HWND_TOP, 0, 0, 0, 0, SWP_SHOWWINDOW | SWP_NOMOVE | SWP_NOSIZE); 328 | SetForegroundWindow(hWnd); 329 | 330 | if (cmd && cmd->arg) { 331 | switch (cmd->type) { 332 | case FRC_INTO: 333 | navinto = TRUE; 334 | case FRC_GOTO: 335 | success = FrcGoto(cmd->arg, navinto); 336 | break; 337 | case FRC_QCPY: 338 | escaped = TRUE; 339 | case FRC_COPY: 340 | success = FrcCopy(cmd->arg, escaped); 341 | break; 342 | } 343 | } 344 | if (!success) { 345 | LPCWSTR msg[] = { FRC_TITLE, L"An unexpected error occurred." }; 346 | FrcMessage(msg, 1, FMSG_WARNING | FMSG_MB_OK | FMSG_ERRORTYPE); 347 | } 348 | return 1; 349 | } 350 | return 0; 351 | } 352 | 353 | void WINAPI SetStartupInfoW(const struct PluginStartupInfo * Info) { 354 | struct OpenInfo oi = { sizeof(oi) }; 355 | api = *Info; 356 | if (!stopEvent) 357 | stopEvent = CreateEvent(NULL, FALSE, FALSE, NULL); 358 | if (!doneEvent) 359 | doneEvent = CreateEvent(NULL, TRUE, TRUE, NULL); 360 | oi.OpenFrom = OPEN_VIEWER; 361 | OpenW(&oi); 362 | } 363 | 364 | 365 | HANDLE WINAPI OpenW(const struct OpenInfo *Info) { 366 | if (Info->OpenFrom == OPEN_FROMMACRO || Info->OpenFrom == OPEN_LUAMACRO) { 367 | struct OpenMacroInfo *Args = (struct OpenMacroInfo *) Info->Data; 368 | if ((Args != NULL) && (Args->Count > 0) && (Args->Values[0].Type == FMVT_STRING)) { 369 | if (ReceiverStart(TRUE, FALSE, TRUE)) { 370 | LPCWSTR command = Args->Values[0].Value.String; 371 | LPCWSTR parameters = NULL; 372 | if (Args->Count > 1 && Args->Values[1].Type == FMVT_STRING) 373 | parameters = Args->Values[1].Value.String; 374 | return ShellExecuteW(NULL, L"open", command, parameters, NULL, SW_SHOWNORMAL); 375 | } else 376 | return NULL; 377 | } 378 | } 379 | if (isReceiverStarted()) { 380 | LPCWSTR messages[] = { FRC_TITLE, L"FRC is currently running. Do you want to stop it?" }; 381 | if (FrcMessage(messages, 1, FMSG_MB_YESNO) == 0) { 382 | ReceiverStop(); 383 | return (HANDLE)1; 384 | } else { 385 | return frcThread; 386 | } 387 | } else { 388 | BOOL q = (Info->OpenFrom == OPEN_VIEWER); 389 | ReceiverStart(q, q, FALSE); 390 | return frcThread; 391 | } 392 | } 393 | 394 | void WINAPI GetGlobalInfoW(struct GlobalInfo *Info) { 395 | Info->StructSize = sizeof(struct GlobalInfo); 396 | Info->MinFarVersion = MAKEFARVERSION(3, 0, 0, 2927, VS_RELEASE); 397 | Info->Version = MAKEFARVERSION(2, 4, 0, 0, VS_RELEASE); 398 | Info->Guid = FRC_GUID_PLUG; 399 | Info->Title = L"FRC"; 400 | Info->Description = L"FAR Remote Control"; 401 | Info->Author = L"Jesko Hüttenhain"; 402 | } 403 | 404 | EXTERN_C BOOL WINAPI _DllMainCRTStartup(HINSTANCE instance, DWORD reason, LPVOID reserved) { 405 | switch (reason) { 406 | case DLL_PROCESS_ATTACH: 407 | break; 408 | case DLL_PROCESS_DETACH: 409 | ExitFARW(NULL); 410 | break; 411 | } 412 | return TRUE; 413 | } 414 | 415 | void WINAPI ExitFARW(const struct ExitInfo * Info) { 416 | ReceiverStop(); 417 | NullHandle(&stopEvent); 418 | NullHandle(&doneEvent); 419 | } 420 | 421 | void WINAPI GetPluginInfoW(struct PluginInfo *Info) { 422 | Info->StructSize = sizeof(struct PluginInfo); 423 | Info->Flags = PF_DIALOG | PF_PRELOAD; 424 | Info->PluginMenu.Guids = &FRC_GUID_PLUG; 425 | Info->PluginMenu.Strings = &FRC_TITLE; 426 | Info->PluginMenu.Count = 1; 427 | } 428 | -------------------------------------------------------------------------------- /plugin/plugin.hpp: -------------------------------------------------------------------------------- 1 | // validator: no-bom 2 | #ifndef PLUGIN_HPP_3FC978E9_63BE_4FC2_8F96_8188B0AF8363 3 | #define PLUGIN_HPP_3FC978E9_63BE_4FC2_8F96_8188B0AF8363 4 | #pragma once 5 | 6 | /* 7 | plugin.hpp 8 | 9 | Plugin API for Far Manager 3.0 build 5151 10 | */ 11 | /* 12 | Copyright © 1996 Eugene Roshal 13 | Copyright © 2000 Far Group 14 | All rights reserved. 15 | 16 | Redistribution and use in source and binary forms, with or without 17 | modification, are permitted provided that the following conditions 18 | are met: 19 | 1. Redistributions of source code must retain the above copyright 20 | notice, this list of conditions and the following disclaimer. 21 | 2. Redistributions in binary form must reproduce the above copyright 22 | notice, this list of conditions and the following disclaimer in the 23 | documentation and/or other materials provided with the distribution. 24 | 3. The name of the authors may not be used to endorse or promote products 25 | derived from this software without specific prior written permission. 26 | 27 | THIS SOFTWARE IS PROVIDED BY THE AUTHOR `AS IS' AND ANY EXPRESS OR 28 | IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 29 | OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 30 | IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 31 | INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 32 | NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 33 | DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 34 | THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 35 | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 36 | THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 37 | 38 | EXCEPTION: 39 | Far Manager plugins that use this header file can be distributed under any 40 | other possible license with no implications from the above license on them. 41 | */ 42 | 43 | 44 | #define FARMANAGERVERSION_MAJOR 3 45 | #define FARMANAGERVERSION_MINOR 0 46 | #define FARMANAGERVERSION_REVISION 0 47 | #define FARMANAGERVERSION_BUILD 5151 48 | #define FARMANAGERVERSION_STAGE VS_RELEASE 49 | 50 | #ifndef RC_INVOKED 51 | 52 | #include 53 | #include 54 | 55 | #undef DefDlgProc 56 | 57 | 58 | #define CP_UNICODE ((uintptr_t)1200) 59 | #define CP_REVERSEBOM ((uintptr_t)1201) 60 | #define CP_DEFAULT ((uintptr_t)-1) 61 | #define CP_REDETECT ((uintptr_t)-2) 62 | 63 | typedef unsigned long long FARCOLORFLAGS; 64 | static const FARCOLORFLAGS 65 | FCF_FG_4BIT = 0x0000000000000001ULL, 66 | FCF_BG_4BIT = 0x0000000000000002ULL, 67 | FCF_4BITMASK = 0x0000000000000003ULL, // FCF_FG_4BIT|FCF_BG_4BIT 68 | 69 | FCF_RAWATTR_MASK = 0x000000000000FF00ULL, // stored console attributes 70 | 71 | FCF_EXTENDEDFLAGS = 0xFFFFFFFFFFFFFFFCULL, // ~FCF_4BITMASK 72 | 73 | FCF_FG_BOLD = 0x1000000000000000ULL, 74 | FCF_FG_ITALIC = 0x2000000000000000ULL, 75 | FCF_FG_UNDERLINE = 0x4000000000000000ULL, 76 | FCF_STYLEMASK = 0x7000000000000000ULL, // FCF_FG_BOLD|FCF_FG_ITALIC|FCF_FG_UNDERLINE 77 | 78 | FCF_NONE = 0; 79 | 80 | struct rgba { unsigned char r, g, b, a; }; 81 | 82 | struct FarColor 83 | { 84 | FARCOLORFLAGS Flags; 85 | union 86 | { 87 | COLORREF ForegroundColor; 88 | struct rgba ForegroundRGBA; 89 | } 90 | #ifndef __cplusplus 91 | Foreground 92 | #endif 93 | ; 94 | union 95 | { 96 | COLORREF BackgroundColor; 97 | struct rgba BackgroundRGBA; 98 | } 99 | #ifndef __cplusplus 100 | Background 101 | #endif 102 | ; 103 | void* Reserved; 104 | 105 | #ifdef __cplusplus 106 | bool operator ==(const FarColor& rhs) const 107 | { 108 | return Flags == rhs.Flags 109 | && ForegroundColor == rhs.ForegroundColor 110 | && BackgroundColor == rhs.BackgroundColor 111 | && Reserved == rhs.Reserved; 112 | } 113 | 114 | bool operator !=(const FarColor& rhs) const 115 | { 116 | return !(*this == rhs); 117 | } 118 | 119 | bool IsBg4Bit() const 120 | { 121 | return (Flags & FCF_BG_4BIT) != 0; 122 | } 123 | 124 | bool IsFg4Bit() const 125 | { 126 | return (Flags & FCF_FG_4BIT) != 0; 127 | } 128 | 129 | FarColor& SetBg4Bit(bool Value) 130 | { 131 | Value? Flags |= FCF_BG_4BIT : Flags &= ~FCF_BG_4BIT; 132 | return *this; 133 | } 134 | 135 | FarColor& SetFg4Bit(bool Value) 136 | { 137 | Value? Flags |= FCF_FG_4BIT : Flags &= ~FCF_FG_4BIT; 138 | return *this; 139 | } 140 | 141 | #endif 142 | }; 143 | 144 | #define INDEXMASK 0x0000000f 145 | #define COLORMASK 0x00ffffff 146 | #define ALPHAMASK 0xff000000 147 | 148 | #define INDEXVALUE(x) ((x)&INDEXMASK) 149 | #define COLORVALUE(x) ((x)&COLORMASK) 150 | #define ALPHAVALUE(x) ((x)&ALPHAMASK) 151 | 152 | #define IS_OPAQUE(x) (ALPHAVALUE(x)==ALPHAMASK) 153 | #define IS_TRANSPARENT(x) (!ALPHAVALUE(x)) 154 | #define MAKE_OPAQUE(x) (x|=ALPHAMASK) 155 | #define MAKE_TRANSPARENT(x) (x&=COLORMASK) 156 | 157 | typedef unsigned long long COLORDIALOGFLAGS; 158 | static const COLORDIALOGFLAGS 159 | CDF_NONE = 0; 160 | 161 | typedef BOOL (WINAPI *FARAPICOLORDIALOG)( 162 | const GUID* PluginId, 163 | COLORDIALOGFLAGS Flags, 164 | struct FarColor *Color 165 | ); 166 | 167 | typedef unsigned long long FARMESSAGEFLAGS; 168 | static const FARMESSAGEFLAGS 169 | FMSG_WARNING = 0x0000000000000001ULL, 170 | FMSG_ERRORTYPE = 0x0000000000000002ULL, 171 | FMSG_KEEPBACKGROUND = 0x0000000000000004ULL, 172 | FMSG_LEFTALIGN = 0x0000000000000008ULL, 173 | FMSG_ALLINONE = 0x0000000000000010ULL, 174 | FMSG_MB_OK = 0x0000000000010000ULL, 175 | FMSG_MB_OKCANCEL = 0x0000000000020000ULL, 176 | FMSG_MB_ABORTRETRYIGNORE = 0x0000000000030000ULL, 177 | FMSG_MB_YESNO = 0x0000000000040000ULL, 178 | FMSG_MB_YESNOCANCEL = 0x0000000000050000ULL, 179 | FMSG_MB_RETRYCANCEL = 0x0000000000060000ULL, 180 | FMSG_NONE = 0; 181 | 182 | typedef intptr_t (WINAPI *FARAPIMESSAGE)( 183 | const GUID* PluginId, 184 | const GUID* Id, 185 | FARMESSAGEFLAGS Flags, 186 | const wchar_t *HelpTopic, 187 | const wchar_t * const *Items, 188 | size_t ItemsNumber, 189 | intptr_t ButtonsNumber 190 | ); 191 | 192 | enum FARDIALOGITEMTYPES 193 | { 194 | DI_TEXT = 0, 195 | DI_VTEXT = 1, 196 | DI_SINGLEBOX = 2, 197 | DI_DOUBLEBOX = 3, 198 | DI_EDIT = 4, 199 | DI_PSWEDIT = 5, 200 | DI_FIXEDIT = 6, 201 | DI_BUTTON = 7, 202 | DI_CHECKBOX = 8, 203 | DI_RADIOBUTTON = 9, 204 | DI_COMBOBOX = 10, 205 | DI_LISTBOX = 11, 206 | 207 | DI_USERCONTROL =255, 208 | }; 209 | 210 | /* 211 | Check diagol element type has inputstring? 212 | (DI_EDIT, DI_FIXEDIT, DI_PSWEDIT, etc) 213 | */ 214 | static __inline BOOL IsEdit(enum FARDIALOGITEMTYPES Type) 215 | { 216 | switch (Type) 217 | { 218 | case DI_EDIT: 219 | case DI_FIXEDIT: 220 | case DI_PSWEDIT: 221 | case DI_COMBOBOX: 222 | return TRUE; 223 | default: 224 | return FALSE; 225 | } 226 | } 227 | 228 | typedef unsigned long long FARDIALOGITEMFLAGS; 229 | static const FARDIALOGITEMFLAGS 230 | DIF_BOXCOLOR = 0x0000000000000200ULL, 231 | DIF_GROUP = 0x0000000000000400ULL, 232 | DIF_LEFTTEXT = 0x0000000000000800ULL, 233 | DIF_MOVESELECT = 0x0000000000001000ULL, 234 | DIF_SHOWAMPERSAND = 0x0000000000002000ULL, 235 | DIF_CENTERGROUP = 0x0000000000004000ULL, 236 | DIF_NOBRACKETS = 0x0000000000008000ULL, 237 | DIF_MANUALADDHISTORY = 0x0000000000008000ULL, 238 | DIF_SEPARATOR = 0x0000000000010000ULL, 239 | DIF_SEPARATOR2 = 0x0000000000020000ULL, 240 | DIF_EDITOR = 0x0000000000020000ULL, 241 | DIF_LISTNOAMPERSAND = 0x0000000000020000ULL, 242 | DIF_LISTNOBOX = 0x0000000000040000ULL, 243 | DIF_HISTORY = 0x0000000000040000ULL, 244 | DIF_BTNNOCLOSE = 0x0000000000040000ULL, 245 | DIF_CENTERTEXT = 0x0000000000040000ULL, 246 | DIF_SEPARATORUSER = 0x0000000000080000ULL, 247 | DIF_SETSHIELD = 0x0000000000080000ULL, 248 | DIF_EDITEXPAND = 0x0000000000080000ULL, 249 | DIF_DROPDOWNLIST = 0x0000000000100000ULL, 250 | DIF_USELASTHISTORY = 0x0000000000200000ULL, 251 | DIF_MASKEDIT = 0x0000000000400000ULL, 252 | DIF_LISTTRACKMOUSE = 0x0000000000400000ULL, 253 | DIF_LISTTRACKMOUSEINFOCUS = 0x0000000000800000ULL, 254 | DIF_SELECTONENTRY = 0x0000000000800000ULL, 255 | DIF_3STATE = 0x0000000000800000ULL, 256 | DIF_EDITPATH = 0x0000000001000000ULL, 257 | DIF_LISTWRAPMODE = 0x0000000001000000ULL, 258 | DIF_NOAUTOCOMPLETE = 0x0000000002000000ULL, 259 | DIF_LISTAUTOHIGHLIGHT = 0x0000000002000000ULL, 260 | DIF_LISTNOCLOSE = 0x0000000004000000ULL, 261 | DIF_EDITPATHEXEC = 0x0000000004000000ULL, 262 | DIF_HIDDEN = 0x0000000010000000ULL, 263 | DIF_READONLY = 0x0000000020000000ULL, 264 | DIF_NOFOCUS = 0x0000000040000000ULL, 265 | DIF_DISABLE = 0x0000000080000000ULL, 266 | DIF_DEFAULTBUTTON = 0x0000000100000000ULL, 267 | DIF_FOCUS = 0x0000000200000000ULL, 268 | DIF_RIGHTTEXT = 0x0000000400000000ULL, 269 | DIF_WORDWRAP = 0x0000000800000000ULL, 270 | DIF_NONE = 0; 271 | 272 | enum FARMESSAGE 273 | { 274 | DM_FIRST = 0, 275 | DM_CLOSE = 1, 276 | DM_ENABLE = 2, 277 | DM_ENABLEREDRAW = 3, 278 | DM_GETDLGDATA = 4, 279 | DM_GETDLGITEM = 5, 280 | DM_GETDLGRECT = 6, 281 | DM_GETTEXT = 7, 282 | DM_KEY = 9, 283 | DM_MOVEDIALOG = 10, 284 | DM_SETDLGDATA = 11, 285 | DM_SETDLGITEM = 12, 286 | DM_SETFOCUS = 13, 287 | DM_REDRAW = 14, 288 | DM_SETTEXT = 15, 289 | DM_SETMAXTEXTLENGTH = 16, 290 | DM_SHOWDIALOG = 17, 291 | DM_GETFOCUS = 18, 292 | DM_GETCURSORPOS = 19, 293 | DM_SETCURSORPOS = 20, 294 | DM_SETTEXTPTR = 22, 295 | DM_SHOWITEM = 23, 296 | DM_ADDHISTORY = 24, 297 | 298 | DM_GETCHECK = 25, 299 | DM_SETCHECK = 26, 300 | DM_SET3STATE = 27, 301 | 302 | DM_LISTSORT = 28, 303 | DM_LISTGETITEM = 29, 304 | DM_LISTGETCURPOS = 30, 305 | DM_LISTSETCURPOS = 31, 306 | DM_LISTDELETE = 32, 307 | DM_LISTADD = 33, 308 | DM_LISTADDSTR = 34, 309 | DM_LISTUPDATE = 35, 310 | DM_LISTINSERT = 36, 311 | DM_LISTFINDSTRING = 37, 312 | DM_LISTINFO = 38, 313 | DM_LISTGETDATA = 39, 314 | DM_LISTSETDATA = 40, 315 | DM_LISTSETTITLES = 41, 316 | DM_LISTGETTITLES = 42, 317 | 318 | DM_RESIZEDIALOG = 43, 319 | DM_SETITEMPOSITION = 44, 320 | 321 | DM_GETDROPDOWNOPENED = 45, 322 | DM_SETDROPDOWNOPENED = 46, 323 | 324 | DM_SETHISTORY = 47, 325 | 326 | DM_GETITEMPOSITION = 48, 327 | DM_SETINPUTNOTIFY = 49, 328 | DM_SETMOUSEEVENTNOTIFY = DM_SETINPUTNOTIFY, 329 | 330 | DM_EDITUNCHANGEDFLAG = 50, 331 | 332 | DM_GETITEMDATA = 51, 333 | DM_SETITEMDATA = 52, 334 | 335 | DM_LISTSET = 53, 336 | 337 | DM_GETCURSORSIZE = 54, 338 | DM_SETCURSORSIZE = 55, 339 | 340 | DM_LISTGETDATASIZE = 56, 341 | 342 | DM_GETSELECTION = 57, 343 | DM_SETSELECTION = 58, 344 | 345 | DM_GETEDITPOSITION = 59, 346 | DM_SETEDITPOSITION = 60, 347 | 348 | DM_SETCOMBOBOXEVENT = 61, 349 | DM_GETCOMBOBOXEVENT = 62, 350 | 351 | DM_GETCONSTTEXTPTR = 63, 352 | DM_GETDLGITEMSHORT = 64, 353 | DM_SETDLGITEMSHORT = 65, 354 | 355 | DM_GETDIALOGINFO = 66, 356 | 357 | DM_GETDIALOGTITLE = 67, 358 | 359 | DN_FIRST = 4096, 360 | DN_BTNCLICK = 4097, 361 | DN_CTLCOLORDIALOG = 4098, 362 | DN_CTLCOLORDLGITEM = 4099, 363 | DN_CTLCOLORDLGLIST = 4100, 364 | DN_DRAWDIALOG = 4101, 365 | DN_DRAWDLGITEM = 4102, 366 | DN_EDITCHANGE = 4103, 367 | DN_ENTERIDLE = 4104, 368 | DN_GOTFOCUS = 4105, 369 | DN_HELP = 4106, 370 | DN_HOTKEY = 4107, 371 | DN_INITDIALOG = 4108, 372 | DN_KILLFOCUS = 4109, 373 | DN_LISTCHANGE = 4110, 374 | DN_DRAGGED = 4111, 375 | DN_RESIZECONSOLE = 4112, 376 | DN_DRAWDIALOGDONE = 4113, 377 | DN_LISTHOTKEY = 4114, 378 | DN_INPUT = 4115, 379 | DN_CONTROLINPUT = 4116, 380 | DN_CLOSE = 4117, 381 | DN_GETVALUE = 4118, 382 | DN_DROPDOWNOPENED = 4119, 383 | DN_DRAWDLGITEMDONE = 4120, 384 | 385 | DM_USER = 0x4000, 386 | 387 | }; 388 | 389 | enum FARCHECKEDSTATE 390 | { 391 | BSTATE_UNCHECKED = 0, 392 | BSTATE_CHECKED = 1, 393 | BSTATE_3STATE = 2, 394 | BSTATE_TOGGLE = 3, 395 | }; 396 | 397 | enum FARCOMBOBOXEVENTTYPE 398 | { 399 | CBET_KEY = 0x00000001, 400 | CBET_MOUSE = 0x00000002, 401 | }; 402 | 403 | typedef unsigned long long LISTITEMFLAGS; 404 | static const LISTITEMFLAGS 405 | LIF_SELECTED = 0x0000000000010000ULL, 406 | LIF_CHECKED = 0x0000000000020000ULL, 407 | LIF_SEPARATOR = 0x0000000000040000ULL, 408 | LIF_DISABLE = 0x0000000000080000ULL, 409 | LIF_GRAYED = 0x0000000000100000ULL, 410 | LIF_HIDDEN = 0x0000000000200000ULL, 411 | LIF_DELETEUSERDATA = 0x0000000080000000ULL, 412 | LIF_NONE = 0; 413 | 414 | 415 | 416 | struct FarListItem 417 | { 418 | LISTITEMFLAGS Flags; 419 | const wchar_t *Text; 420 | intptr_t Reserved[2]; 421 | }; 422 | 423 | struct FarListUpdate 424 | { 425 | size_t StructSize; 426 | intptr_t Index; 427 | struct FarListItem Item; 428 | }; 429 | 430 | struct FarListInsert 431 | { 432 | size_t StructSize; 433 | intptr_t Index; 434 | struct FarListItem Item; 435 | }; 436 | 437 | struct FarListGetItem 438 | { 439 | size_t StructSize; 440 | intptr_t ItemIndex; 441 | struct FarListItem Item; 442 | }; 443 | 444 | struct FarListPos 445 | { 446 | size_t StructSize; 447 | intptr_t SelectPos; 448 | intptr_t TopPos; 449 | }; 450 | 451 | typedef unsigned long long FARLISTFINDFLAGS; 452 | static const FARLISTFINDFLAGS 453 | LIFIND_EXACTMATCH = 0x0000000000000001ULL, 454 | LIFIND_NONE = 0; 455 | 456 | 457 | struct FarListFind 458 | { 459 | size_t StructSize; 460 | intptr_t StartIndex; 461 | const wchar_t *Pattern; 462 | FARLISTFINDFLAGS Flags; 463 | }; 464 | 465 | struct FarListDelete 466 | { 467 | size_t StructSize; 468 | intptr_t StartIndex; 469 | intptr_t Count; 470 | }; 471 | 472 | typedef unsigned long long FARLISTINFOFLAGS; 473 | static const FARLISTINFOFLAGS 474 | LINFO_SHOWNOBOX = 0x0000000000000400ULL, 475 | LINFO_AUTOHIGHLIGHT = 0x0000000000000800ULL, 476 | LINFO_REVERSEHIGHLIGHT = 0x0000000000001000ULL, 477 | LINFO_WRAPMODE = 0x0000000000008000ULL, 478 | LINFO_SHOWAMPERSAND = 0x0000000000010000ULL, 479 | LINFO_NONE = 0; 480 | 481 | struct FarListInfo 482 | { 483 | size_t StructSize; 484 | FARLISTINFOFLAGS Flags; 485 | size_t ItemsNumber; 486 | intptr_t SelectPos; 487 | intptr_t TopPos; 488 | intptr_t MaxHeight; 489 | intptr_t MaxLength; 490 | }; 491 | 492 | struct FarListItemData 493 | { 494 | size_t StructSize; 495 | intptr_t Index; 496 | size_t DataSize; 497 | void *Data; 498 | }; 499 | 500 | struct FarList 501 | { 502 | size_t StructSize; 503 | size_t ItemsNumber; 504 | struct FarListItem *Items; 505 | }; 506 | 507 | struct FarListTitles 508 | { 509 | size_t StructSize; 510 | size_t TitleSize; 511 | const wchar_t *Title; 512 | size_t BottomSize; 513 | const wchar_t *Bottom; 514 | }; 515 | 516 | struct FarDialogItemColors 517 | { 518 | size_t StructSize; 519 | unsigned long long Flags; 520 | size_t ColorsCount; 521 | struct FarColor* Colors; 522 | }; 523 | 524 | struct FAR_CHAR_INFO 525 | { 526 | WCHAR Char; 527 | struct FarColor Attributes; 528 | 529 | #ifdef __cplusplus 530 | static FAR_CHAR_INFO make(wchar_t Char, const FarColor& Attributes) 531 | { 532 | FAR_CHAR_INFO info = { Char, Attributes }; 533 | return info; 534 | } 535 | 536 | bool operator ==(const FAR_CHAR_INFO& rhs) const 537 | { 538 | return Char == rhs.Char && Attributes == rhs.Attributes; 539 | } 540 | 541 | bool operator !=(const FAR_CHAR_INFO& rhs) const 542 | { 543 | return !(*this == rhs); 544 | } 545 | #endif 546 | }; 547 | 548 | struct FarDialogItem 549 | { 550 | enum FARDIALOGITEMTYPES Type; 551 | intptr_t X1,Y1,X2,Y2; 552 | union 553 | { 554 | intptr_t Selected; 555 | struct FarList *ListItems; 556 | struct FAR_CHAR_INFO *VBuf; 557 | intptr_t Reserved0; 558 | } 559 | #ifndef __cplusplus 560 | Param 561 | #endif 562 | ; 563 | const wchar_t *History; 564 | const wchar_t *Mask; 565 | FARDIALOGITEMFLAGS Flags; 566 | const wchar_t *Data; 567 | size_t MaxLength; // terminate 0 not included (if == 0 string size is unlimited) 568 | intptr_t UserData; 569 | intptr_t Reserved[2]; 570 | }; 571 | 572 | struct FarDialogItemData 573 | { 574 | size_t StructSize; 575 | size_t PtrLength; 576 | wchar_t *PtrData; 577 | }; 578 | 579 | struct FarDialogEvent 580 | { 581 | size_t StructSize; 582 | HANDLE hDlg; 583 | intptr_t Msg; 584 | intptr_t Param1; 585 | void* Param2; 586 | intptr_t Result; 587 | }; 588 | 589 | struct OpenDlgPluginData 590 | { 591 | size_t StructSize; 592 | HANDLE hDlg; 593 | }; 594 | 595 | struct DialogInfo 596 | { 597 | size_t StructSize; 598 | GUID Id; 599 | GUID Owner; 600 | }; 601 | 602 | struct FarGetDialogItem 603 | { 604 | size_t StructSize; 605 | size_t Size; 606 | struct FarDialogItem* Item; 607 | }; 608 | 609 | typedef unsigned long long FARDIALOGFLAGS; 610 | static const FARDIALOGFLAGS 611 | FDLG_WARNING = 0x0000000000000001ULL, 612 | FDLG_SMALLDIALOG = 0x0000000000000002ULL, 613 | FDLG_NODRAWSHADOW = 0x0000000000000004ULL, 614 | FDLG_NODRAWPANEL = 0x0000000000000008ULL, 615 | FDLG_KEEPCONSOLETITLE = 0x0000000000000010ULL, 616 | FDLG_NONMODAL = 0x0000000000000020ULL, 617 | FDLG_NONE = 0; 618 | 619 | typedef intptr_t(WINAPI *FARWINDOWPROC)( 620 | HANDLE hDlg, 621 | intptr_t Msg, 622 | intptr_t Param1, 623 | void* Param2 624 | ); 625 | 626 | typedef intptr_t(WINAPI *FARAPISENDDLGMESSAGE)( 627 | HANDLE hDlg, 628 | intptr_t Msg, 629 | intptr_t Param1, 630 | void* Param2 631 | ); 632 | 633 | typedef intptr_t(WINAPI *FARAPIDEFDLGPROC)( 634 | HANDLE hDlg, 635 | intptr_t Msg, 636 | intptr_t Param1, 637 | void* Param2 638 | ); 639 | 640 | typedef HANDLE(WINAPI *FARAPIDIALOGINIT)( 641 | const GUID* PluginId, 642 | const GUID* Id, 643 | intptr_t X1, 644 | intptr_t Y1, 645 | intptr_t X2, 646 | intptr_t Y2, 647 | const wchar_t *HelpTopic, 648 | const struct FarDialogItem *Item, 649 | size_t ItemsNumber, 650 | intptr_t Reserved, 651 | FARDIALOGFLAGS Flags, 652 | FARWINDOWPROC DlgProc, 653 | void* Param 654 | ); 655 | 656 | typedef intptr_t (WINAPI *FARAPIDIALOGRUN)( 657 | HANDLE hDlg 658 | ); 659 | 660 | typedef void (WINAPI *FARAPIDIALOGFREE)( 661 | HANDLE hDlg 662 | ); 663 | 664 | struct FarKey 665 | { 666 | WORD VirtualKeyCode; 667 | DWORD ControlKeyState; 668 | }; 669 | 670 | typedef unsigned long long MENUITEMFLAGS; 671 | static const MENUITEMFLAGS 672 | MIF_SELECTED = 0x000000000010000ULL, 673 | MIF_CHECKED = 0x000000000020000ULL, 674 | MIF_SEPARATOR = 0x000000000040000ULL, 675 | MIF_DISABLE = 0x000000000080000ULL, 676 | MIF_GRAYED = 0x000000000100000ULL, 677 | MIF_HIDDEN = 0x000000000200000ULL, 678 | MIF_NONE = 0; 679 | 680 | struct FarMenuItem 681 | { 682 | MENUITEMFLAGS Flags; 683 | const wchar_t *Text; 684 | struct FarKey AccelKey; 685 | intptr_t UserData; 686 | intptr_t Reserved[2]; 687 | }; 688 | 689 | typedef unsigned long long FARMENUFLAGS; 690 | static const FARMENUFLAGS 691 | FMENU_SHOWAMPERSAND = 0x0000000000000001ULL, 692 | FMENU_WRAPMODE = 0x0000000000000002ULL, 693 | FMENU_AUTOHIGHLIGHT = 0x0000000000000004ULL, 694 | FMENU_REVERSEAUTOHIGHLIGHT = 0x0000000000000008ULL, 695 | FMENU_CHANGECONSOLETITLE = 0x0000000000000010ULL, 696 | FMENU_NONE = 0; 697 | 698 | typedef intptr_t (WINAPI *FARAPIMENU)( 699 | const GUID* PluginId, 700 | const GUID* Id, 701 | intptr_t X, 702 | intptr_t Y, 703 | intptr_t MaxHeight, 704 | FARMENUFLAGS Flags, 705 | const wchar_t *Title, 706 | const wchar_t *Bottom, 707 | const wchar_t *HelpTopic, 708 | const struct FarKey *BreakKeys, 709 | intptr_t *BreakCode, 710 | const struct FarMenuItem *Item, 711 | size_t ItemsNumber 712 | ); 713 | 714 | 715 | typedef unsigned long long PLUGINPANELITEMFLAGS; 716 | static const PLUGINPANELITEMFLAGS 717 | PPIF_SELECTED = 0x0000000040000000ULL, 718 | PPIF_PROCESSDESCR = 0x0000000080000000ULL, 719 | PPIF_NONE = 0; 720 | 721 | struct FarPanelItemFreeInfo 722 | { 723 | size_t StructSize; 724 | HANDLE hPlugin; 725 | }; 726 | 727 | typedef void (WINAPI *FARPANELITEMFREECALLBACK)(void* UserData, const struct FarPanelItemFreeInfo* Info); 728 | 729 | struct UserDataItem 730 | { 731 | void* Data; 732 | FARPANELITEMFREECALLBACK FreeData; 733 | }; 734 | 735 | 736 | struct PluginPanelItem 737 | { 738 | FILETIME CreationTime; 739 | FILETIME LastAccessTime; 740 | FILETIME LastWriteTime; 741 | FILETIME ChangeTime; 742 | unsigned long long FileSize; 743 | unsigned long long AllocationSize; 744 | const wchar_t *FileName; 745 | const wchar_t *AlternateFileName; 746 | const wchar_t *Description; 747 | const wchar_t *Owner; 748 | const wchar_t * const *CustomColumnData; 749 | size_t CustomColumnNumber; 750 | PLUGINPANELITEMFLAGS Flags; 751 | struct UserDataItem UserData; 752 | uintptr_t FileAttributes; 753 | uintptr_t NumberOfLinks; 754 | uintptr_t CRC32; 755 | intptr_t Reserved[2]; 756 | }; 757 | 758 | struct FarGetPluginPanelItem 759 | { 760 | size_t StructSize; 761 | size_t Size; 762 | struct PluginPanelItem* Item; 763 | }; 764 | 765 | struct SortingPanelItem 766 | { 767 | FILETIME CreationTime; 768 | FILETIME LastAccessTime; 769 | FILETIME LastWriteTime; 770 | FILETIME ChangeTime; 771 | unsigned long long FileSize; 772 | unsigned long long AllocationSize; 773 | const wchar_t *FileName; 774 | const wchar_t *AlternateFileName; 775 | const wchar_t *Description; 776 | const wchar_t *Owner; 777 | const wchar_t * const *CustomColumnData; 778 | size_t CustomColumnNumber; 779 | PLUGINPANELITEMFLAGS Flags; 780 | struct UserDataItem UserData; 781 | uintptr_t FileAttributes; 782 | uintptr_t NumberOfLinks; 783 | uintptr_t CRC32; 784 | intptr_t Position; 785 | intptr_t SortGroup; 786 | uintptr_t NumberOfStreams; 787 | unsigned long long StreamsSize; 788 | }; 789 | 790 | typedef unsigned long long PANELINFOFLAGS; 791 | static const PANELINFOFLAGS 792 | PFLAGS_SHOWHIDDEN = 0x0000000000000001ULL, 793 | PFLAGS_HIGHLIGHT = 0x0000000000000002ULL, 794 | PFLAGS_REVERSESORTORDER = 0x0000000000000004ULL, 795 | PFLAGS_USESORTGROUPS = 0x0000000000000008ULL, 796 | PFLAGS_SELECTEDFIRST = 0x0000000000000010ULL, 797 | PFLAGS_REALNAMES = 0x0000000000000020ULL, 798 | PFLAGS_PANELLEFT = 0x0000000000000080ULL, 799 | PFLAGS_DIRECTORIESFIRST = 0x0000000000000100ULL, 800 | PFLAGS_USECRC32 = 0x0000000000000200ULL, 801 | PFLAGS_PLUGIN = 0x0000000000000800ULL, 802 | PFLAGS_VISIBLE = 0x0000000000001000ULL, 803 | PFLAGS_FOCUS = 0x0000000000002000ULL, 804 | PFLAGS_ALTERNATIVENAMES = 0x0000000000004000ULL, 805 | PFLAGS_SHORTCUT = 0x0000000000008000ULL, 806 | PFLAGS_NONE = 0; 807 | 808 | enum PANELINFOTYPE 809 | { 810 | PTYPE_FILEPANEL = 0, 811 | PTYPE_TREEPANEL = 1, 812 | PTYPE_QVIEWPANEL = 2, 813 | PTYPE_INFOPANEL = 3, 814 | }; 815 | 816 | enum OPENPANELINFO_SORTMODES 817 | { 818 | SM_DEFAULT = 0, 819 | SM_UNSORTED = 1, 820 | SM_NAME = 2, 821 | SM_EXT = 3, 822 | SM_MTIME = 4, 823 | SM_CTIME = 5, 824 | SM_ATIME = 6, 825 | SM_SIZE = 7, 826 | SM_DESCR = 8, 827 | SM_OWNER = 9, 828 | SM_COMPRESSEDSIZE = 10, 829 | SM_NUMLINKS = 11, 830 | SM_NUMSTREAMS = 12, 831 | SM_STREAMSSIZE = 13, 832 | SM_FULLNAME = 14, 833 | SM_CHTIME = 15, 834 | 835 | SM_COUNT 836 | }; 837 | 838 | struct PanelInfo 839 | { 840 | size_t StructSize; 841 | HANDLE PluginHandle; 842 | GUID OwnerGuid; 843 | PANELINFOFLAGS Flags; 844 | size_t ItemsNumber; 845 | size_t SelectedItemsNumber; 846 | RECT PanelRect; 847 | size_t CurrentItem; 848 | size_t TopPanelItem; 849 | intptr_t ViewMode; 850 | enum PANELINFOTYPE PanelType; 851 | enum OPENPANELINFO_SORTMODES SortMode; 852 | }; 853 | 854 | 855 | struct PanelRedrawInfo 856 | { 857 | size_t StructSize; 858 | size_t CurrentItem; 859 | size_t TopPanelItem; 860 | }; 861 | 862 | struct CmdLineSelect 863 | { 864 | size_t StructSize; 865 | intptr_t SelStart; 866 | intptr_t SelEnd; 867 | }; 868 | 869 | struct FarPanelDirectory 870 | { 871 | size_t StructSize; 872 | const wchar_t* Name; 873 | const wchar_t* Param; 874 | GUID PluginId; 875 | const wchar_t* File; 876 | }; 877 | 878 | #define PANEL_NONE ((HANDLE)(-1)) 879 | #define PANEL_ACTIVE ((HANDLE)(-1)) 880 | #define PANEL_PASSIVE ((HANDLE)(-2)) 881 | #define PANEL_STOP ((HANDLE)(-1)) 882 | 883 | enum FILE_CONTROL_COMMANDS 884 | { 885 | FCTL_CLOSEPANEL = 0, 886 | FCTL_GETPANELINFO = 1, 887 | FCTL_UPDATEPANEL = 2, 888 | FCTL_REDRAWPANEL = 3, 889 | FCTL_GETCMDLINE = 4, 890 | FCTL_SETCMDLINE = 5, 891 | FCTL_SETSELECTION = 6, 892 | FCTL_SETVIEWMODE = 7, 893 | FCTL_INSERTCMDLINE = 8, 894 | FCTL_SETUSERSCREEN = 9, 895 | FCTL_SETPANELDIRECTORY = 10, 896 | FCTL_SETCMDLINEPOS = 11, 897 | FCTL_GETCMDLINEPOS = 12, 898 | FCTL_SETSORTMODE = 13, 899 | FCTL_SETSORTORDER = 14, 900 | FCTL_SETCMDLINESELECTION = 15, 901 | FCTL_GETCMDLINESELECTION = 16, 902 | FCTL_CHECKPANELSEXIST = 17, 903 | FCTL_GETUSERSCREEN = 19, 904 | FCTL_ISACTIVEPANEL = 20, 905 | FCTL_GETPANELITEM = 21, 906 | FCTL_GETSELECTEDPANELITEM = 22, 907 | FCTL_GETCURRENTPANELITEM = 23, 908 | FCTL_GETPANELDIRECTORY = 24, 909 | FCTL_GETCOLUMNTYPES = 25, 910 | FCTL_GETCOLUMNWIDTHS = 26, 911 | FCTL_BEGINSELECTION = 27, 912 | FCTL_ENDSELECTION = 28, 913 | FCTL_CLEARSELECTION = 29, 914 | FCTL_SETDIRECTORIESFIRST = 30, 915 | FCTL_GETPANELFORMAT = 31, 916 | FCTL_GETPANELHOSTFILE = 32, 917 | FCTL_GETPANELPREFIX = 34, 918 | FCTL_SETACTIVEPANEL = 35, 919 | }; 920 | 921 | typedef void (WINAPI *FARAPITEXT)( 922 | intptr_t X, 923 | intptr_t Y, 924 | const struct FarColor* Color, 925 | const wchar_t *Str 926 | ); 927 | 928 | typedef HANDLE(WINAPI *FARAPISAVESCREEN)(intptr_t X1, intptr_t Y1, intptr_t X2, intptr_t Y2); 929 | 930 | typedef void (WINAPI *FARAPIRESTORESCREEN)(HANDLE hScreen); 931 | 932 | 933 | typedef intptr_t (WINAPI *FARAPIGETDIRLIST)( 934 | const wchar_t *Dir, 935 | struct PluginPanelItem **pPanelItem, 936 | size_t *pItemsNumber 937 | ); 938 | 939 | typedef intptr_t (WINAPI *FARAPIGETPLUGINDIRLIST)( 940 | const GUID* PluginId, 941 | HANDLE hPanel, 942 | const wchar_t *Dir, 943 | struct PluginPanelItem **pPanelItem, 944 | size_t *pItemsNumber 945 | ); 946 | 947 | typedef void (WINAPI *FARAPIFREEDIRLIST)(struct PluginPanelItem *PanelItem, size_t nItemsNumber); 948 | typedef void (WINAPI *FARAPIFREEPLUGINDIRLIST)(HANDLE hPanel, struct PluginPanelItem *PanelItem, size_t nItemsNumber); 949 | 950 | typedef unsigned long long VIEWER_FLAGS; 951 | static const VIEWER_FLAGS 952 | VF_NONMODAL = 0x0000000000000001ULL, 953 | VF_DELETEONCLOSE = 0x0000000000000002ULL, 954 | VF_ENABLE_F6 = 0x0000000000000004ULL, 955 | VF_DISABLEHISTORY = 0x0000000000000008ULL, 956 | VF_IMMEDIATERETURN = 0x0000000000000100ULL, 957 | VF_DELETEONLYFILEONCLOSE = 0x0000000000000200ULL, 958 | VF_NONE = 0; 959 | 960 | typedef intptr_t (WINAPI *FARAPIVIEWER)( 961 | const wchar_t *FileName, 962 | const wchar_t *Title, 963 | intptr_t X1, 964 | intptr_t Y1, 965 | intptr_t X2, 966 | intptr_t Y2, 967 | VIEWER_FLAGS Flags, 968 | uintptr_t CodePage 969 | ); 970 | 971 | typedef unsigned long long EDITOR_FLAGS; 972 | static const EDITOR_FLAGS 973 | EF_NONMODAL = 0x0000000000000001ULL, 974 | EF_CREATENEW = 0x0000000000000002ULL, 975 | EF_ENABLE_F6 = 0x0000000000000004ULL, 976 | EF_DISABLEHISTORY = 0x0000000000000008ULL, 977 | EF_DELETEONCLOSE = 0x0000000000000010ULL, 978 | EF_IMMEDIATERETURN = 0x0000000000000100ULL, 979 | EF_DELETEONLYFILEONCLOSE = 0x0000000000000200ULL, 980 | EF_LOCKED = 0x0000000000000400ULL, 981 | EF_DISABLESAVEPOS = 0x0000000000000800ULL, 982 | EF_OPENMODE_MASK = 0x00000000F0000000ULL, 983 | EF_OPENMODE_QUERY = 0x0000000000000000ULL, 984 | EF_OPENMODE_NEWIFOPEN = 0x0000000010000000ULL, 985 | EF_OPENMODE_USEEXISTING = 0x0000000020000000ULL, 986 | EF_OPENMODE_BREAKIFOPEN = 0x0000000030000000ULL, 987 | EF_OPENMODE_RELOADIFOPEN = 0x0000000040000000ULL, 988 | EN_NONE = 0; 989 | 990 | enum EDITOR_EXITCODE 991 | { 992 | EEC_OPEN_ERROR = 0, 993 | EEC_MODIFIED = 1, 994 | EEC_NOT_MODIFIED = 2, 995 | EEC_LOADING_INTERRUPTED = 3, 996 | }; 997 | 998 | typedef intptr_t (WINAPI *FARAPIEDITOR)( 999 | const wchar_t *FileName, 1000 | const wchar_t *Title, 1001 | intptr_t X1, 1002 | intptr_t Y1, 1003 | intptr_t X2, 1004 | intptr_t Y2, 1005 | EDITOR_FLAGS Flags, 1006 | intptr_t StartLine, 1007 | intptr_t StartChar, 1008 | uintptr_t CodePage 1009 | ); 1010 | 1011 | typedef const wchar_t*(WINAPI *FARAPIGETMSG)( 1012 | const GUID* PluginId, 1013 | intptr_t MsgId 1014 | ); 1015 | 1016 | typedef unsigned long long FARHELPFLAGS; 1017 | static const FARHELPFLAGS 1018 | FHELP_NOSHOWERROR = 0x0000000080000000ULL, 1019 | FHELP_SELFHELP = 0x0000000000000000ULL, 1020 | FHELP_FARHELP = 0x0000000000000001ULL, 1021 | FHELP_CUSTOMFILE = 0x0000000000000002ULL, 1022 | FHELP_CUSTOMPATH = 0x0000000000000004ULL, 1023 | FHELP_GUID = 0x0000000000000008ULL, 1024 | FHELP_USECONTENTS = 0x0000000040000000ULL, 1025 | FHELP_NONE = 0; 1026 | 1027 | typedef BOOL (WINAPI *FARAPISHOWHELP)( 1028 | const wchar_t *ModuleName, 1029 | const wchar_t *Topic, 1030 | FARHELPFLAGS Flags 1031 | ); 1032 | 1033 | enum ADVANCED_CONTROL_COMMANDS 1034 | { 1035 | ACTL_GETFARMANAGERVERSION = 0, 1036 | ACTL_WAITKEY = 2, 1037 | ACTL_GETCOLOR = 3, 1038 | ACTL_GETARRAYCOLOR = 4, 1039 | ACTL_GETWINDOWINFO = 6, 1040 | ACTL_GETWINDOWCOUNT = 7, 1041 | ACTL_SETCURRENTWINDOW = 8, 1042 | ACTL_COMMIT = 9, 1043 | ACTL_GETFARHWND = 10, 1044 | ACTL_SETARRAYCOLOR = 16, 1045 | ACTL_REDRAWALL = 19, 1046 | ACTL_SYNCHRO = 20, 1047 | ACTL_SETPROGRESSSTATE = 21, 1048 | ACTL_SETPROGRESSVALUE = 22, 1049 | ACTL_QUIT = 23, 1050 | ACTL_GETFARRECT = 24, 1051 | ACTL_GETCURSORPOS = 25, 1052 | ACTL_SETCURSORPOS = 26, 1053 | ACTL_PROGRESSNOTIFY = 27, 1054 | ACTL_GETWINDOWTYPE = 28, 1055 | 1056 | 1057 | }; 1058 | 1059 | 1060 | 1061 | 1062 | enum FAR_MACRO_CONTROL_COMMANDS 1063 | { 1064 | MCTL_LOADALL = 0, 1065 | MCTL_SAVEALL = 1, 1066 | MCTL_SENDSTRING = 2, 1067 | MCTL_GETSTATE = 5, 1068 | MCTL_GETAREA = 6, 1069 | MCTL_ADDMACRO = 7, 1070 | MCTL_DELMACRO = 8, 1071 | MCTL_GETLASTERROR = 9, 1072 | MCTL_EXECSTRING = 10, 1073 | }; 1074 | 1075 | typedef unsigned long long FARKEYMACROFLAGS; 1076 | static const FARKEYMACROFLAGS 1077 | KMFLAGS_SILENTCHECK = 0x0000000000000001, 1078 | KMFLAGS_NOSENDKEYSTOPLUGINS = 0x0000000000000002, 1079 | KMFLAGS_ENABLEOUTPUT = 0x0000000000000004, 1080 | KMFLAGS_LANGMASK = 0x0000000000000070, // 3 bits reserved for 8 languages 1081 | KMFLAGS_LUA = 0x0000000000000000, 1082 | KMFLAGS_MOONSCRIPT = 0x0000000000000010, 1083 | KMFLAGS_NONE = 0; 1084 | 1085 | enum FARMACROSENDSTRINGCOMMAND 1086 | { 1087 | MSSC_POST =0, 1088 | MSSC_CHECK =2, 1089 | }; 1090 | 1091 | enum FARMACROAREA 1092 | { 1093 | MACROAREA_OTHER = 0, // Reserved 1094 | MACROAREA_SHELL = 1, // File panels 1095 | MACROAREA_VIEWER = 2, // Internal viewer program 1096 | MACROAREA_EDITOR = 3, // Editor 1097 | MACROAREA_DIALOG = 4, // Dialogs 1098 | MACROAREA_SEARCH = 5, // Quick search in panels 1099 | MACROAREA_DISKS = 6, // Menu of disk selection 1100 | MACROAREA_MAINMENU = 7, // Main menu 1101 | MACROAREA_MENU = 8, // Other menus 1102 | MACROAREA_HELP = 9, // Help system 1103 | MACROAREA_INFOPANEL = 10, // Info panel 1104 | MACROAREA_QVIEWPANEL = 11, // Quick view panel 1105 | MACROAREA_TREEPANEL = 12, // Folders tree panel 1106 | MACROAREA_FINDFOLDER = 13, // Find folder 1107 | MACROAREA_USERMENU = 14, // User menu 1108 | MACROAREA_SHELLAUTOCOMPLETION = 15, // Autocompletion list in command line 1109 | MACROAREA_DIALOGAUTOCOMPLETION = 16, // Autocompletion list in dialogs 1110 | MACROAREA_GRABBER = 17, // Mode of copying text from the screen 1111 | MACROAREA_DESKTOP = 18, // Desktop 1112 | 1113 | MACROAREA_COMMON = 255, 1114 | }; 1115 | 1116 | enum FARMACROSTATE 1117 | { 1118 | MACROSTATE_NOMACRO = 0, 1119 | MACROSTATE_EXECUTING = 1, 1120 | MACROSTATE_EXECUTING_COMMON = 2, 1121 | MACROSTATE_RECORDING = 3, 1122 | MACROSTATE_RECORDING_COMMON = 4, 1123 | }; 1124 | 1125 | enum FARMACROPARSEERRORCODE 1126 | { 1127 | MPEC_SUCCESS = 0, 1128 | MPEC_ERROR = 1, 1129 | }; 1130 | 1131 | struct MacroParseResult 1132 | { 1133 | size_t StructSize; 1134 | DWORD ErrCode; 1135 | COORD ErrPos; 1136 | const wchar_t *ErrSrc; 1137 | }; 1138 | 1139 | 1140 | struct MacroSendMacroText 1141 | { 1142 | size_t StructSize; 1143 | FARKEYMACROFLAGS Flags; 1144 | INPUT_RECORD AKey; 1145 | const wchar_t *SequenceText; 1146 | }; 1147 | 1148 | typedef unsigned long long FARADDKEYMACROFLAGS; 1149 | static const FARADDKEYMACROFLAGS 1150 | AKMFLAGS_NONE = 0; 1151 | 1152 | typedef intptr_t (WINAPI *FARMACROCALLBACK)(void* Id,FARADDKEYMACROFLAGS Flags); 1153 | 1154 | 1155 | struct MacroAddMacro 1156 | { 1157 | size_t StructSize; 1158 | void* Id; 1159 | const wchar_t *SequenceText; 1160 | const wchar_t *Description; 1161 | FARKEYMACROFLAGS Flags; 1162 | INPUT_RECORD AKey; 1163 | enum FARMACROAREA Area; 1164 | FARMACROCALLBACK Callback; 1165 | intptr_t Priority; 1166 | }; 1167 | 1168 | enum FARMACROVARTYPE 1169 | { 1170 | FMVT_UNKNOWN = 0, 1171 | FMVT_INTEGER = 1, 1172 | FMVT_STRING = 2, 1173 | FMVT_DOUBLE = 3, 1174 | FMVT_BOOLEAN = 4, 1175 | FMVT_BINARY = 5, 1176 | FMVT_POINTER = 6, 1177 | FMVT_NIL = 7, 1178 | FMVT_ARRAY = 8, 1179 | FMVT_PANEL = 9, 1180 | }; 1181 | 1182 | struct FarMacroValue 1183 | { 1184 | enum FARMACROVARTYPE Type; 1185 | union 1186 | { 1187 | long long Integer; 1188 | long long Boolean; 1189 | double Double; 1190 | const wchar_t *String; 1191 | void *Pointer; 1192 | struct 1193 | { 1194 | void *Data; 1195 | size_t Size; 1196 | } Binary; 1197 | struct 1198 | { 1199 | struct FarMacroValue *Values; 1200 | size_t Count; 1201 | } Array; 1202 | } 1203 | #ifndef __cplusplus 1204 | Value 1205 | #endif 1206 | ; 1207 | #ifdef __cplusplus 1208 | FarMacroValue() { Type=FMVT_NIL; } 1209 | FarMacroValue(int v) { Type=FMVT_INTEGER; Integer=v; } 1210 | FarMacroValue(unsigned int v) { Type=FMVT_INTEGER; Integer=v; } 1211 | FarMacroValue(long long v) { Type=FMVT_INTEGER; Integer=v; } 1212 | FarMacroValue(unsigned long long v) { Type=FMVT_INTEGER; Integer=v; } 1213 | FarMacroValue(bool v) { Type=FMVT_BOOLEAN; Boolean=v; } 1214 | FarMacroValue(double v) { Type=FMVT_DOUBLE; Double=v; } 1215 | FarMacroValue(const wchar_t* v) { Type=FMVT_STRING; String=v; } 1216 | FarMacroValue(void* v) { Type=FMVT_POINTER; Pointer=v; } 1217 | FarMacroValue(const GUID& v) { Type=FMVT_BINARY; Binary.Data=&const_cast(v); Binary.Size=sizeof(GUID); } 1218 | FarMacroValue(FarMacroValue* arr,size_t count) { Type=FMVT_ARRAY; Array.Values=arr; Array.Count=count; } 1219 | #endif 1220 | }; 1221 | 1222 | struct FarMacroCall 1223 | { 1224 | size_t StructSize; 1225 | size_t Count; 1226 | struct FarMacroValue *Values; 1227 | void (WINAPI *Callback)(void *CallbackData, struct FarMacroValue *Values, size_t Count); 1228 | void *CallbackData; 1229 | }; 1230 | 1231 | struct FarGetValue 1232 | { 1233 | size_t StructSize; 1234 | intptr_t Type; 1235 | struct FarMacroValue Value; 1236 | }; 1237 | 1238 | struct MacroExecuteString 1239 | { 1240 | size_t StructSize; 1241 | FARKEYMACROFLAGS Flags; 1242 | const wchar_t *SequenceText; 1243 | size_t InCount; 1244 | struct FarMacroValue *InValues; 1245 | size_t OutCount; 1246 | const struct FarMacroValue *OutValues; 1247 | }; 1248 | 1249 | struct FarMacroLoad 1250 | { 1251 | size_t StructSize; 1252 | const wchar_t *Path; 1253 | unsigned long long Flags; 1254 | }; 1255 | 1256 | typedef unsigned long long FARSETCOLORFLAGS; 1257 | static const FARSETCOLORFLAGS 1258 | FSETCLR_REDRAW = 0x0000000000000001ULL, 1259 | FSETCLR_NONE = 0; 1260 | 1261 | struct FarSetColors 1262 | { 1263 | size_t StructSize; 1264 | FARSETCOLORFLAGS Flags; 1265 | size_t StartIndex; 1266 | size_t ColorsCount; 1267 | struct FarColor* Colors; 1268 | }; 1269 | 1270 | enum WINDOWINFO_TYPE 1271 | { 1272 | WTYPE_DESKTOP = 0, 1273 | WTYPE_PANELS = 1, 1274 | WTYPE_VIEWER = 2, 1275 | WTYPE_EDITOR = 3, 1276 | WTYPE_DIALOG = 4, 1277 | WTYPE_VMENU = 5, 1278 | WTYPE_HELP = 6, 1279 | WTYPE_COMBOBOX = 7, 1280 | WTYPE_GRABBER = 8, 1281 | WTYPE_HMENU = 9, 1282 | }; 1283 | 1284 | typedef unsigned long long WINDOWINFO_FLAGS; 1285 | static const WINDOWINFO_FLAGS 1286 | WIF_MODIFIED = 0x0000000000000001ULL, 1287 | WIF_CURRENT = 0x0000000000000002ULL, 1288 | WIF_MODAL = 0x0000000000000004ULL, 1289 | WIF_NONE = 0; 1290 | 1291 | struct WindowInfo 1292 | { 1293 | size_t StructSize; 1294 | intptr_t Id; 1295 | wchar_t *TypeName; 1296 | wchar_t *Name; 1297 | intptr_t TypeNameSize; 1298 | intptr_t NameSize; 1299 | intptr_t Pos; 1300 | enum WINDOWINFO_TYPE Type; 1301 | WINDOWINFO_FLAGS Flags; 1302 | }; 1303 | 1304 | struct WindowType 1305 | { 1306 | size_t StructSize; 1307 | enum WINDOWINFO_TYPE Type; 1308 | }; 1309 | 1310 | enum TASKBARPROGRESSTATE 1311 | { 1312 | TBPS_NOPROGRESS =0x0, 1313 | TBPS_INDETERMINATE=0x1, 1314 | TBPS_NORMAL =0x2, 1315 | TBPS_ERROR =0x4, 1316 | TBPS_PAUSED =0x8, 1317 | }; 1318 | 1319 | struct ProgressValue 1320 | { 1321 | size_t StructSize; 1322 | unsigned long long Completed; 1323 | unsigned long long Total; 1324 | }; 1325 | 1326 | enum VIEWER_CONTROL_COMMANDS 1327 | { 1328 | VCTL_GETINFO = 0, 1329 | VCTL_QUIT = 1, 1330 | VCTL_REDRAW = 2, 1331 | VCTL_SETKEYBAR = 3, 1332 | VCTL_SETPOSITION = 4, 1333 | VCTL_SELECT = 5, 1334 | VCTL_SETMODE = 6, 1335 | VCTL_GETFILENAME = 7, 1336 | }; 1337 | 1338 | typedef unsigned long long VIEWER_OPTIONS; 1339 | static const VIEWER_OPTIONS 1340 | VOPT_SAVEFILEPOSITION = 0x0000000000000001ULL, 1341 | VOPT_AUTODETECTCODEPAGE = 0x0000000000000002ULL, 1342 | VOPT_SHOWTITLEBAR = 0x0000000000000004ULL, 1343 | VOPT_SHOWKEYBAR = 0x0000000000000008ULL, 1344 | VOPT_SHOWSCROLLBAR = 0x0000000000000010ULL, 1345 | VOPT_QUICKVIEW = 0x0000000000000020ULL, 1346 | VOPT_NONE = 0; 1347 | 1348 | enum VIEWER_SETMODE_TYPES 1349 | { 1350 | VSMT_VIEWMODE = 0, 1351 | VSMT_WRAP = 1, 1352 | VSMT_WORDWRAP = 2, 1353 | }; 1354 | 1355 | typedef unsigned long long VIEWER_SETMODEFLAGS_TYPES; 1356 | static const VIEWER_SETMODEFLAGS_TYPES 1357 | VSMFL_REDRAW = 0x0000000000000001ULL, 1358 | VSMFL_NONE = 0; 1359 | 1360 | struct ViewerSetMode 1361 | { 1362 | size_t StructSize; 1363 | enum VIEWER_SETMODE_TYPES Type; 1364 | union 1365 | { 1366 | intptr_t iParam; 1367 | wchar_t *wszParam; 1368 | } 1369 | #ifndef __cplusplus 1370 | Param 1371 | #endif 1372 | ; 1373 | VIEWER_SETMODEFLAGS_TYPES Flags; 1374 | }; 1375 | 1376 | struct ViewerSelect 1377 | { 1378 | size_t StructSize; 1379 | long long BlockStartPos; 1380 | long long BlockLen; 1381 | }; 1382 | 1383 | typedef unsigned long long VIEWER_SETPOS_FLAGS; 1384 | static const VIEWER_SETPOS_FLAGS 1385 | VSP_NOREDRAW = 0x0000000000000001ULL, 1386 | VSP_PERCENT = 0x0000000000000002ULL, 1387 | VSP_RELATIVE = 0x0000000000000004ULL, 1388 | VSP_NORETNEWPOS = 0x0000000000000008ULL, 1389 | VSP_NONE = 0; 1390 | 1391 | struct ViewerSetPosition 1392 | { 1393 | size_t StructSize; 1394 | VIEWER_SETPOS_FLAGS Flags; 1395 | long long StartPos; 1396 | long long LeftPos; 1397 | }; 1398 | 1399 | typedef unsigned long long VIEWER_MODE_FLAGS; 1400 | static const VIEWER_MODE_FLAGS 1401 | VMF_WRAP = 0x0000000000000001ULL, 1402 | VMF_WORDWRAP = 0x0000000000000002ULL, 1403 | VMF_NONE = 0; 1404 | 1405 | enum VIEWER_MODE_TYPE 1406 | { 1407 | VMT_TEXT =0, 1408 | VMT_HEX =1, 1409 | VMT_DUMP =2, 1410 | }; 1411 | 1412 | struct ViewerMode 1413 | { 1414 | uintptr_t CodePage; 1415 | VIEWER_MODE_FLAGS Flags; 1416 | enum VIEWER_MODE_TYPE ViewMode; 1417 | }; 1418 | 1419 | struct ViewerInfo 1420 | { 1421 | size_t StructSize; 1422 | intptr_t ViewerID; 1423 | intptr_t TabSize; 1424 | struct ViewerMode CurMode; 1425 | long long FileSize; 1426 | long long FilePos; 1427 | long long LeftPos; 1428 | VIEWER_OPTIONS Options; 1429 | intptr_t WindowSizeX; 1430 | intptr_t WindowSizeY; 1431 | }; 1432 | 1433 | enum VIEWER_EVENTS 1434 | { 1435 | VE_READ =0, 1436 | VE_CLOSE =1, 1437 | 1438 | VE_GOTFOCUS =6, 1439 | VE_KILLFOCUS =7, 1440 | }; 1441 | 1442 | 1443 | enum EDITOR_EVENTS 1444 | { 1445 | EE_READ =0, 1446 | EE_SAVE =1, 1447 | EE_REDRAW =2, 1448 | EE_CLOSE =3, 1449 | 1450 | EE_GOTFOCUS =6, 1451 | EE_KILLFOCUS =7, 1452 | EE_CHANGE =8, 1453 | }; 1454 | 1455 | enum DIALOG_EVENTS 1456 | { 1457 | DE_DLGPROCINIT =0, 1458 | DE_DEFDLGPROCINIT =1, 1459 | DE_DLGPROCEND =2, 1460 | }; 1461 | 1462 | enum SYNCHRO_EVENTS 1463 | { 1464 | SE_COMMONSYNCHRO =0, 1465 | }; 1466 | 1467 | #define EEREDRAW_ALL (void*)0 1468 | 1469 | #define CURRENT_EDITOR -1 1470 | 1471 | enum EDITOR_CONTROL_COMMANDS 1472 | { 1473 | ECTL_GETSTRING = 0, 1474 | ECTL_SETSTRING = 1, 1475 | ECTL_INSERTSTRING = 2, 1476 | ECTL_DELETESTRING = 3, 1477 | ECTL_DELETECHAR = 4, 1478 | ECTL_INSERTTEXT = 5, 1479 | ECTL_GETINFO = 6, 1480 | ECTL_SETPOSITION = 7, 1481 | ECTL_SELECT = 8, 1482 | ECTL_REDRAW = 9, 1483 | ECTL_TABTOREAL = 10, 1484 | ECTL_REALTOTAB = 11, 1485 | ECTL_EXPANDTABS = 12, 1486 | ECTL_SETTITLE = 13, 1487 | ECTL_READINPUT = 14, 1488 | ECTL_PROCESSINPUT = 15, 1489 | ECTL_ADDCOLOR = 16, 1490 | ECTL_GETCOLOR = 17, 1491 | ECTL_SAVEFILE = 18, 1492 | ECTL_QUIT = 19, 1493 | ECTL_SETKEYBAR = 20, 1494 | 1495 | ECTL_SETPARAM = 22, 1496 | ECTL_GETBOOKMARKS = 23, 1497 | ECTL_DELETEBLOCK = 25, 1498 | ECTL_ADDSESSIONBOOKMARK = 26, 1499 | ECTL_PREVSESSIONBOOKMARK = 27, 1500 | ECTL_NEXTSESSIONBOOKMARK = 28, 1501 | ECTL_CLEARSESSIONBOOKMARKS = 29, 1502 | ECTL_DELETESESSIONBOOKMARK = 30, 1503 | ECTL_GETSESSIONBOOKMARKS = 31, 1504 | ECTL_UNDOREDO = 32, 1505 | ECTL_GETFILENAME = 33, 1506 | ECTL_DELCOLOR = 34, 1507 | ECTL_SUBSCRIBECHANGEEVENT = 36, 1508 | ECTL_UNSUBSCRIBECHANGEEVENT = 37, 1509 | ECTL_GETTITLE = 38, 1510 | }; 1511 | 1512 | enum EDITOR_SETPARAMETER_TYPES 1513 | { 1514 | ESPT_TABSIZE = 0, 1515 | ESPT_EXPANDTABS = 1, 1516 | ESPT_AUTOINDENT = 2, 1517 | ESPT_CURSORBEYONDEOL = 3, 1518 | ESPT_CHARCODEBASE = 4, 1519 | ESPT_CODEPAGE = 5, 1520 | ESPT_SAVEFILEPOSITION = 6, 1521 | ESPT_LOCKMODE = 7, 1522 | ESPT_SETWORDDIV = 8, 1523 | ESPT_GETWORDDIV = 9, 1524 | ESPT_SHOWWHITESPACE = 10, 1525 | ESPT_SETBOM = 11, 1526 | }; 1527 | 1528 | 1529 | 1530 | struct EditorSetParameter 1531 | { 1532 | size_t StructSize; 1533 | enum EDITOR_SETPARAMETER_TYPES Type; 1534 | union 1535 | { 1536 | intptr_t iParam; 1537 | wchar_t *wszParam; 1538 | intptr_t Reserved; 1539 | } 1540 | #ifndef __cplusplus 1541 | Param 1542 | #endif 1543 | ; 1544 | unsigned long long Flags; 1545 | size_t Size; 1546 | }; 1547 | 1548 | 1549 | enum EDITOR_UNDOREDO_COMMANDS 1550 | { 1551 | EUR_BEGIN = 0, 1552 | EUR_END = 1, 1553 | EUR_UNDO = 2, 1554 | EUR_REDO = 3, 1555 | }; 1556 | 1557 | 1558 | struct EditorUndoRedo 1559 | { 1560 | size_t StructSize; 1561 | enum EDITOR_UNDOREDO_COMMANDS Command; 1562 | }; 1563 | 1564 | struct EditorGetString 1565 | { 1566 | size_t StructSize; 1567 | intptr_t StringNumber; 1568 | intptr_t StringLength; 1569 | const wchar_t *StringText; 1570 | const wchar_t *StringEOL; 1571 | intptr_t SelStart; 1572 | intptr_t SelEnd; 1573 | }; 1574 | 1575 | 1576 | struct EditorSetString 1577 | { 1578 | size_t StructSize; 1579 | intptr_t StringNumber; 1580 | intptr_t StringLength; 1581 | const wchar_t *StringText; 1582 | const wchar_t *StringEOL; 1583 | }; 1584 | 1585 | enum EXPAND_TABS 1586 | { 1587 | EXPAND_NOTABS = 0, 1588 | EXPAND_ALLTABS = 1, 1589 | EXPAND_NEWTABS = 2, 1590 | }; 1591 | 1592 | 1593 | enum EDITOR_OPTIONS 1594 | { 1595 | EOPT_EXPANDALLTABS = 0x00000001, 1596 | EOPT_PERSISTENTBLOCKS = 0x00000002, 1597 | EOPT_DELREMOVESBLOCKS = 0x00000004, 1598 | EOPT_AUTOINDENT = 0x00000008, 1599 | EOPT_SAVEFILEPOSITION = 0x00000010, 1600 | EOPT_AUTODETECTCODEPAGE= 0x00000020, 1601 | EOPT_CURSORBEYONDEOL = 0x00000040, 1602 | EOPT_EXPANDONLYNEWTABS = 0x00000080, 1603 | EOPT_SHOWWHITESPACE = 0x00000100, 1604 | EOPT_BOM = 0x00000200, 1605 | EOPT_SHOWLINEBREAK = 0x00000400, 1606 | EOPT_SHOWTITLEBAR = 0x00000800, 1607 | EOPT_SHOWKEYBAR = 0x00001000, 1608 | EOPT_SHOWSCROLLBAR = 0x00002000, 1609 | }; 1610 | 1611 | 1612 | enum EDITOR_BLOCK_TYPES 1613 | { 1614 | BTYPE_NONE = 0, 1615 | BTYPE_STREAM = 1, 1616 | BTYPE_COLUMN = 2, 1617 | }; 1618 | 1619 | enum EDITOR_CURRENTSTATE 1620 | { 1621 | ECSTATE_MODIFIED = 0x00000001, 1622 | ECSTATE_SAVED = 0x00000002, 1623 | ECSTATE_LOCKED = 0x00000004, 1624 | }; 1625 | 1626 | 1627 | struct EditorInfo 1628 | { 1629 | size_t StructSize; 1630 | intptr_t EditorID; 1631 | intptr_t WindowSizeX; 1632 | intptr_t WindowSizeY; 1633 | intptr_t TotalLines; 1634 | intptr_t CurLine; 1635 | intptr_t CurPos; 1636 | intptr_t CurTabPos; 1637 | intptr_t TopScreenLine; 1638 | intptr_t LeftPos; 1639 | intptr_t Overtype; 1640 | intptr_t BlockType; 1641 | intptr_t BlockStartLine; 1642 | uintptr_t Options; 1643 | intptr_t TabSize; 1644 | size_t BookmarkCount; 1645 | size_t SessionBookmarkCount; 1646 | uintptr_t CurState; 1647 | uintptr_t CodePage; 1648 | }; 1649 | 1650 | struct EditorBookmarks 1651 | { 1652 | size_t StructSize; 1653 | size_t Size; 1654 | size_t Count; 1655 | intptr_t *Line; 1656 | intptr_t *Cursor; 1657 | intptr_t *ScreenLine; 1658 | intptr_t *LeftPos; 1659 | }; 1660 | 1661 | struct EditorSetPosition 1662 | { 1663 | size_t StructSize; 1664 | intptr_t CurLine; 1665 | intptr_t CurPos; 1666 | intptr_t CurTabPos; 1667 | intptr_t TopScreenLine; 1668 | intptr_t LeftPos; 1669 | intptr_t Overtype; 1670 | }; 1671 | 1672 | 1673 | struct EditorSelect 1674 | { 1675 | size_t StructSize; 1676 | intptr_t BlockType; 1677 | intptr_t BlockStartLine; 1678 | intptr_t BlockStartPos; 1679 | intptr_t BlockWidth; 1680 | intptr_t BlockHeight; 1681 | }; 1682 | 1683 | 1684 | struct EditorConvertPos 1685 | { 1686 | size_t StructSize; 1687 | intptr_t StringNumber; 1688 | intptr_t SrcPos; 1689 | intptr_t DestPos; 1690 | }; 1691 | 1692 | typedef unsigned long long EDITORCOLORFLAGS; 1693 | static const EDITORCOLORFLAGS 1694 | ECF_TABMARKFIRST = 0x0000000000000001ULL, 1695 | ECF_TABMARKCURRENT = 0x0000000000000002ULL, 1696 | ECF_AUTODELETE = 0x0000000000000004ULL, 1697 | ECF_NONE = 0; 1698 | 1699 | struct EditorColor 1700 | { 1701 | size_t StructSize; 1702 | intptr_t StringNumber; 1703 | intptr_t ColorItem; 1704 | intptr_t StartPos; 1705 | intptr_t EndPos; 1706 | uintptr_t Priority; 1707 | EDITORCOLORFLAGS Flags; 1708 | struct FarColor Color; 1709 | GUID Owner; 1710 | }; 1711 | 1712 | struct EditorDeleteColor 1713 | { 1714 | size_t StructSize; 1715 | GUID Owner; 1716 | intptr_t StringNumber; 1717 | intptr_t StartPos; 1718 | }; 1719 | 1720 | #define EDITOR_COLOR_NORMAL_PRIORITY 0x80000000U 1721 | 1722 | struct EditorSaveFile 1723 | { 1724 | size_t StructSize; 1725 | const wchar_t *FileName; 1726 | const wchar_t *FileEOL; 1727 | uintptr_t CodePage; 1728 | }; 1729 | 1730 | enum EDITOR_CHANGETYPE 1731 | { 1732 | ECTYPE_CHANGED = 0, 1733 | ECTYPE_ADDED = 1, 1734 | ECTYPE_DELETED = 2, 1735 | }; 1736 | 1737 | struct EditorChange 1738 | { 1739 | size_t StructSize; 1740 | enum EDITOR_CHANGETYPE Type; 1741 | intptr_t StringNumber; 1742 | }; 1743 | 1744 | struct EditorSubscribeChangeEvent 1745 | { 1746 | size_t StructSize; 1747 | GUID PluginId; 1748 | }; 1749 | 1750 | typedef unsigned long long INPUTBOXFLAGS; 1751 | static const INPUTBOXFLAGS 1752 | FIB_ENABLEEMPTY = 0x0000000000000001ULL, 1753 | FIB_PASSWORD = 0x0000000000000002ULL, 1754 | FIB_EXPANDENV = 0x0000000000000004ULL, 1755 | FIB_NOUSELASTHISTORY = 0x0000000000000008ULL, 1756 | FIB_BUTTONS = 0x0000000000000010ULL, 1757 | FIB_NOAMPERSAND = 0x0000000000000020ULL, 1758 | FIB_EDITPATH = 0x0000000000000040ULL, 1759 | FIB_EDITPATHEXEC = 0x0000000000000080ULL, 1760 | FIB_NONE = 0; 1761 | 1762 | typedef intptr_t (WINAPI *FARAPIINPUTBOX)( 1763 | const GUID* PluginId, 1764 | const GUID* Id, 1765 | const wchar_t *Title, 1766 | const wchar_t *SubTitle, 1767 | const wchar_t *HistoryName, 1768 | const wchar_t *SrcText, 1769 | wchar_t *DestText, 1770 | size_t DestSize, 1771 | const wchar_t *HelpTopic, 1772 | INPUTBOXFLAGS Flags 1773 | ); 1774 | 1775 | enum FAR_PLUGINS_CONTROL_COMMANDS 1776 | { 1777 | PCTL_LOADPLUGIN = 0, 1778 | PCTL_UNLOADPLUGIN = 1, 1779 | PCTL_FORCEDLOADPLUGIN = 2, 1780 | PCTL_FINDPLUGIN = 3, 1781 | PCTL_GETPLUGININFORMATION = 4, 1782 | PCTL_GETPLUGINS = 5, 1783 | }; 1784 | 1785 | enum FAR_PLUGIN_LOAD_TYPE 1786 | { 1787 | PLT_PATH = 0, 1788 | }; 1789 | 1790 | enum FAR_PLUGIN_FIND_TYPE 1791 | { 1792 | PFM_GUID = 0, 1793 | PFM_MODULENAME = 1, 1794 | }; 1795 | 1796 | typedef unsigned long long FAR_PLUGIN_FLAGS; 1797 | static const FAR_PLUGIN_FLAGS 1798 | FPF_LOADED = 0x0000000000000001ULL, 1799 | FPF_ANSI = 0x1000000000000000ULL, 1800 | FPF_NONE = 0; 1801 | 1802 | enum FAR_FILE_FILTER_CONTROL_COMMANDS 1803 | { 1804 | FFCTL_CREATEFILEFILTER = 0, 1805 | FFCTL_FREEFILEFILTER = 1, 1806 | FFCTL_OPENFILTERSMENU = 2, 1807 | FFCTL_STARTINGTOFILTER = 3, 1808 | FFCTL_ISFILEINFILTER = 4, 1809 | }; 1810 | 1811 | enum FAR_FILE_FILTER_TYPE 1812 | { 1813 | FFT_PANEL = 0, 1814 | FFT_FINDFILE = 1, 1815 | FFT_COPY = 2, 1816 | FFT_SELECT = 3, 1817 | FFT_CUSTOM = 4, 1818 | }; 1819 | 1820 | enum FAR_REGEXP_CONTROL_COMMANDS 1821 | { 1822 | RECTL_CREATE = 0, 1823 | RECTL_FREE = 1, 1824 | RECTL_COMPILE = 2, 1825 | RECTL_OPTIMIZE = 3, 1826 | RECTL_MATCHEX = 4, 1827 | RECTL_SEARCHEX = 5, 1828 | RECTL_BRACKETSCOUNT = 6, 1829 | }; 1830 | 1831 | struct RegExpMatch 1832 | { 1833 | intptr_t start,end; 1834 | }; 1835 | 1836 | struct RegExpSearch 1837 | { 1838 | const wchar_t* Text; 1839 | intptr_t Position; 1840 | intptr_t Length; 1841 | struct RegExpMatch* Match; 1842 | intptr_t Count; 1843 | void* Reserved; 1844 | }; 1845 | 1846 | enum FAR_SETTINGS_CONTROL_COMMANDS 1847 | { 1848 | SCTL_CREATE = 0, 1849 | SCTL_FREE = 1, 1850 | SCTL_SET = 2, 1851 | SCTL_GET = 3, 1852 | SCTL_ENUM = 4, 1853 | SCTL_DELETE = 5, 1854 | SCTL_CREATESUBKEY = 6, 1855 | SCTL_OPENSUBKEY = 7, 1856 | }; 1857 | 1858 | enum FARSETTINGSTYPES 1859 | { 1860 | FST_UNKNOWN = 0, 1861 | FST_SUBKEY = 1, 1862 | FST_QWORD = 2, 1863 | FST_STRING = 3, 1864 | FST_DATA = 4, 1865 | }; 1866 | 1867 | enum FARSETTINGS_SUBFOLDERS 1868 | { 1869 | FSSF_ROOT = 0, 1870 | FSSF_HISTORY_CMD = 1, 1871 | FSSF_HISTORY_FOLDER = 2, 1872 | FSSF_HISTORY_VIEW = 3, 1873 | FSSF_HISTORY_EDIT = 4, 1874 | FSSF_HISTORY_EXTERNAL = 5, 1875 | FSSF_FOLDERSHORTCUT_0 = 6, 1876 | FSSF_FOLDERSHORTCUT_1 = 7, 1877 | FSSF_FOLDERSHORTCUT_2 = 8, 1878 | FSSF_FOLDERSHORTCUT_3 = 9, 1879 | FSSF_FOLDERSHORTCUT_4 = 10, 1880 | FSSF_FOLDERSHORTCUT_5 = 11, 1881 | FSSF_FOLDERSHORTCUT_6 = 12, 1882 | FSSF_FOLDERSHORTCUT_7 = 13, 1883 | FSSF_FOLDERSHORTCUT_8 = 14, 1884 | FSSF_FOLDERSHORTCUT_9 = 15, 1885 | FSSF_CONFIRMATIONS = 16, 1886 | FSSF_SYSTEM = 17, 1887 | FSSF_PANEL = 18, 1888 | FSSF_EDITOR = 19, 1889 | FSSF_SCREEN = 20, 1890 | FSSF_DIALOG = 21, 1891 | FSSF_INTERFACE = 22, 1892 | FSSF_PANELLAYOUT = 23, 1893 | }; 1894 | 1895 | enum FAR_PLUGIN_SETTINGS_LOCATION 1896 | { 1897 | PSL_ROAMING = 0, 1898 | PSL_LOCAL = 1, 1899 | }; 1900 | 1901 | struct FarSettingsCreate 1902 | { 1903 | size_t StructSize; 1904 | GUID Guid; 1905 | HANDLE Handle; 1906 | }; 1907 | 1908 | struct FarSettingsItem 1909 | { 1910 | size_t StructSize; 1911 | size_t Root; 1912 | const wchar_t* Name; 1913 | enum FARSETTINGSTYPES Type; 1914 | union 1915 | { 1916 | unsigned long long Number; 1917 | const wchar_t* String; 1918 | struct 1919 | { 1920 | size_t Size; 1921 | const void* Data; 1922 | } Data; 1923 | } 1924 | #ifndef __cplusplus 1925 | Value 1926 | #endif 1927 | ; 1928 | }; 1929 | 1930 | struct FarSettingsName 1931 | { 1932 | const wchar_t* Name; 1933 | enum FARSETTINGSTYPES Type; 1934 | }; 1935 | 1936 | struct FarSettingsHistory 1937 | { 1938 | const wchar_t* Name; 1939 | const wchar_t* Param; 1940 | GUID PluginId; 1941 | const wchar_t* File; 1942 | FILETIME Time; 1943 | BOOL Lock; 1944 | }; 1945 | 1946 | struct FarSettingsEnum 1947 | { 1948 | size_t StructSize; 1949 | size_t Root; 1950 | size_t Count; 1951 | union 1952 | { 1953 | const struct FarSettingsName* Items; 1954 | const struct FarSettingsHistory* Histories; 1955 | } 1956 | #ifndef __cplusplus 1957 | Value 1958 | #endif 1959 | ; 1960 | }; 1961 | 1962 | struct FarSettingsValue 1963 | { 1964 | size_t StructSize; 1965 | size_t Root; 1966 | const wchar_t* Value; 1967 | }; 1968 | 1969 | typedef intptr_t (WINAPI *FARAPIPANELCONTROL)( 1970 | HANDLE hPanel, 1971 | enum FILE_CONTROL_COMMANDS Command, 1972 | intptr_t Param1, 1973 | void* Param2 1974 | ); 1975 | 1976 | typedef intptr_t(WINAPI *FARAPIADVCONTROL)( 1977 | const GUID* PluginId, 1978 | enum ADVANCED_CONTROL_COMMANDS Command, 1979 | intptr_t Param1, 1980 | void* Param2 1981 | ); 1982 | 1983 | typedef intptr_t (WINAPI *FARAPIVIEWERCONTROL)( 1984 | intptr_t ViewerID, 1985 | enum VIEWER_CONTROL_COMMANDS Command, 1986 | intptr_t Param1, 1987 | void* Param2 1988 | ); 1989 | 1990 | typedef intptr_t (WINAPI *FARAPIEDITORCONTROL)( 1991 | intptr_t EditorID, 1992 | enum EDITOR_CONTROL_COMMANDS Command, 1993 | intptr_t Param1, 1994 | void* Param2 1995 | ); 1996 | 1997 | typedef intptr_t (WINAPI *FARAPIMACROCONTROL)( 1998 | const GUID* PluginId, 1999 | enum FAR_MACRO_CONTROL_COMMANDS Command, 2000 | intptr_t Param1, 2001 | void* Param2 2002 | ); 2003 | 2004 | typedef intptr_t (WINAPI *FARAPIPLUGINSCONTROL)( 2005 | HANDLE hHandle, 2006 | enum FAR_PLUGINS_CONTROL_COMMANDS Command, 2007 | intptr_t Param1, 2008 | void* Param2 2009 | ); 2010 | 2011 | typedef intptr_t (WINAPI *FARAPIFILEFILTERCONTROL)( 2012 | HANDLE hHandle, 2013 | enum FAR_FILE_FILTER_CONTROL_COMMANDS Command, 2014 | intptr_t Param1, 2015 | void* Param2 2016 | ); 2017 | 2018 | typedef intptr_t (WINAPI *FARAPIREGEXPCONTROL)( 2019 | HANDLE hHandle, 2020 | enum FAR_REGEXP_CONTROL_COMMANDS Command, 2021 | intptr_t Param1, 2022 | void* Param2 2023 | ); 2024 | 2025 | typedef intptr_t (WINAPI *FARAPISETTINGSCONTROL)( 2026 | HANDLE hHandle, 2027 | enum FAR_SETTINGS_CONTROL_COMMANDS Command, 2028 | intptr_t Param1, 2029 | void* Param2 2030 | ); 2031 | 2032 | enum FARCLIPBOARD_TYPE 2033 | { 2034 | FCT_ANY=0, 2035 | FCT_STREAM=1, 2036 | FCT_COLUMN=2 2037 | }; 2038 | 2039 | // 2040 | typedef int (WINAPIV *FARSTDSPRINTF)(wchar_t *Buffer,const wchar_t *Format,...); 2041 | typedef int (WINAPIV *FARSTDSNPRINTF)(wchar_t *Buffer,size_t Sizebuf,const wchar_t *Format,...); 2042 | typedef int (WINAPIV *FARSTDSSCANF)(const wchar_t *Buffer, const wchar_t *Format,...); 2043 | // 2044 | typedef void (WINAPI *FARSTDQSORT)(void *base, size_t nelem, size_t width, int (WINAPI *fcmp)(const void *, const void *,void *userparam),void *userparam); 2045 | typedef void *(WINAPI *FARSTDBSEARCH)(const void *key, const void *base, size_t nelem, size_t width, int (WINAPI *fcmp)(const void *, const void *,void *userparam),void *userparam); 2046 | typedef size_t (WINAPI *FARSTDGETFILEOWNER)(const wchar_t *Computer,const wchar_t *Name,wchar_t *Owner,size_t Size); 2047 | typedef size_t (WINAPI *FARSTDGETNUMBEROFLINKS)(const wchar_t *Name); 2048 | typedef int (WINAPI *FARSTDATOI)(const wchar_t *s); 2049 | typedef long long (WINAPI *FARSTDATOI64)(const wchar_t *s); 2050 | typedef wchar_t *(WINAPI *FARSTDITOA64)(long long value, wchar_t *Str, int radix); 2051 | typedef wchar_t *(WINAPI *FARSTDITOA)(int value, wchar_t *Str, int radix); 2052 | typedef wchar_t *(WINAPI *FARSTDLTRIM)(wchar_t *Str); 2053 | typedef wchar_t *(WINAPI *FARSTDRTRIM)(wchar_t *Str); 2054 | typedef wchar_t *(WINAPI *FARSTDTRIM)(wchar_t *Str); 2055 | typedef wchar_t *(WINAPI *FARSTDTRUNCSTR)(wchar_t *Str,intptr_t MaxLength); 2056 | typedef wchar_t *(WINAPI *FARSTDTRUNCPATHSTR)(wchar_t *Str,intptr_t MaxLength); 2057 | typedef wchar_t *(WINAPI *FARSTDQUOTESPACEONLY)(wchar_t *Str); 2058 | typedef const wchar_t*(WINAPI *FARSTDPOINTTONAME)(const wchar_t *Path); 2059 | typedef BOOL (WINAPI *FARSTDADDENDSLASH)(wchar_t *Path); 2060 | typedef BOOL (WINAPI *FARSTDCOPYTOCLIPBOARD)(enum FARCLIPBOARD_TYPE Type, const wchar_t *Data); 2061 | typedef size_t (WINAPI *FARSTDPASTEFROMCLIPBOARD)(enum FARCLIPBOARD_TYPE Type, wchar_t *Data, size_t Size); 2062 | typedef int (WINAPI *FARSTDLOCALISLOWER)(wchar_t Ch); 2063 | typedef int (WINAPI *FARSTDLOCALISUPPER)(wchar_t Ch); 2064 | typedef int (WINAPI *FARSTDLOCALISALPHA)(wchar_t Ch); 2065 | typedef int (WINAPI *FARSTDLOCALISALPHANUM)(wchar_t Ch); 2066 | typedef wchar_t (WINAPI *FARSTDLOCALUPPER)(wchar_t LowerChar); 2067 | typedef wchar_t (WINAPI *FARSTDLOCALLOWER)(wchar_t UpperChar); 2068 | typedef void (WINAPI *FARSTDLOCALUPPERBUF)(wchar_t *Buf,intptr_t Length); 2069 | typedef void (WINAPI *FARSTDLOCALLOWERBUF)(wchar_t *Buf,intptr_t Length); 2070 | typedef void (WINAPI *FARSTDLOCALSTRUPR)(wchar_t *s1); 2071 | typedef void (WINAPI *FARSTDLOCALSTRLWR)(wchar_t *s1); 2072 | typedef int (WINAPI *FARSTDLOCALSTRICMP)(const wchar_t *s1,const wchar_t *s2); // Deprecated, don't use 2073 | typedef int (WINAPI *FARSTDLOCALSTRNICMP)(const wchar_t *s1,const wchar_t *s2,intptr_t n); // Deprecated, don't use 2074 | typedef unsigned long long (WINAPI *FARSTDFARCLOCK)(); 2075 | typedef int (WINAPI *FARSTDCOMPARESTRINGS)(const wchar_t*Str1, size_t Size1, const wchar_t* Str2, size_t Size2); 2076 | 2077 | typedef unsigned long long PROCESSNAME_FLAGS; 2078 | static const PROCESSNAME_FLAGS 2079 | // 0xFFFF - length 2080 | // 0xFF0000 - mode 2081 | // 0xFFFFFFFFFF000000 - flags 2082 | PN_CMPNAME = 0x0000000000000000ULL, 2083 | PN_CMPNAMELIST = 0x0000000000010000ULL, 2084 | PN_GENERATENAME = 0x0000000000020000ULL, 2085 | PN_CHECKMASK = 0x0000000000030000ULL, 2086 | 2087 | PN_SKIPPATH = 0x0000000001000000ULL, 2088 | PN_SHOWERRORMESSAGE = 0x0000000002000000ULL, 2089 | PN_NONE = 0; 2090 | 2091 | typedef size_t (WINAPI *FARSTDPROCESSNAME)(const wchar_t *param1, wchar_t *param2, size_t size, PROCESSNAME_FLAGS flags); 2092 | 2093 | typedef void (WINAPI *FARSTDUNQUOTE)(wchar_t *Str); 2094 | 2095 | typedef unsigned long long XLAT_FLAGS; 2096 | static const XLAT_FLAGS 2097 | XLAT_SWITCHKEYBLAYOUT = 0x0000000000000001ULL, 2098 | XLAT_SWITCHKEYBBEEP = 0x0000000000000002ULL, 2099 | XLAT_USEKEYBLAYOUTNAME = 0x0000000000000004ULL, 2100 | XLAT_CONVERTALLCMDLINE = 0x0000000000010000ULL, 2101 | XLAT_NONE = 0; 2102 | 2103 | typedef size_t (WINAPI *FARSTDINPUTRECORDTOKEYNAME)(const INPUT_RECORD* Key, wchar_t *KeyText, size_t Size); 2104 | 2105 | typedef wchar_t*(WINAPI *FARSTDXLAT)(wchar_t *Line,intptr_t StartPos,intptr_t EndPos,XLAT_FLAGS Flags); 2106 | 2107 | typedef BOOL (WINAPI *FARSTDKEYNAMETOINPUTRECORD)(const wchar_t *Name,INPUT_RECORD* Key); 2108 | 2109 | typedef int (WINAPI *FRSUSERFUNC)( 2110 | const struct PluginPanelItem *FData, 2111 | const wchar_t *FullName, 2112 | void *Param 2113 | ); 2114 | 2115 | typedef unsigned long long FRSMODE; 2116 | static const FRSMODE 2117 | FRS_RETUPDIR = 0x0000000000000001ULL, 2118 | FRS_RECUR = 0x0000000000000002ULL, 2119 | FRS_SCANSYMLINK = 0x0000000000000004ULL, 2120 | FRS_NONE = 0; 2121 | 2122 | typedef void (WINAPI *FARSTDRECURSIVESEARCH)(const wchar_t *InitDir,const wchar_t *Mask,FRSUSERFUNC Func,FRSMODE Flags,void *Param); 2123 | typedef size_t (WINAPI *FARSTDMKTEMP)(wchar_t *Dest, size_t DestSize, const wchar_t *Prefix); 2124 | typedef size_t (WINAPI *FARSTDGETPATHROOT)(const wchar_t *Path,wchar_t *Root, size_t DestSize); 2125 | 2126 | enum LINK_TYPE 2127 | { 2128 | LINK_HARDLINK = 1, 2129 | LINK_JUNCTION = 2, 2130 | LINK_VOLMOUNT = 3, 2131 | LINK_SYMLINKFILE = 4, 2132 | LINK_SYMLINKDIR = 5, 2133 | LINK_SYMLINK = 6, 2134 | }; 2135 | 2136 | typedef unsigned long long MKLINK_FLAGS; 2137 | static const MKLINK_FLAGS 2138 | MLF_SHOWERRMSG = 0x0000000000010000ULL, 2139 | MLF_DONOTUPDATEPANEL = 0x0000000000020000ULL, 2140 | MLF_HOLDTARGET = 0x0000000000040000ULL, 2141 | MLF_NONE = 0; 2142 | 2143 | typedef BOOL (WINAPI *FARSTDMKLINK)(const wchar_t *Src,const wchar_t *Dest,enum LINK_TYPE Type, MKLINK_FLAGS Flags); 2144 | typedef size_t (WINAPI *FARGETREPARSEPOINTINFO)(const wchar_t *Src, wchar_t *Dest, size_t DestSize); 2145 | 2146 | enum CONVERTPATHMODES 2147 | { 2148 | CPM_FULL = 0, 2149 | CPM_REAL = 1, 2150 | CPM_NATIVE = 2, 2151 | }; 2152 | 2153 | typedef size_t (WINAPI *FARCONVERTPATH)(enum CONVERTPATHMODES Mode, const wchar_t *Src, wchar_t *Dest, size_t DestSize); 2154 | 2155 | typedef size_t (WINAPI *FARGETCURRENTDIRECTORY)(size_t Size, wchar_t* Buffer); 2156 | 2157 | typedef unsigned long long FARFORMATFILESIZEFLAGS; 2158 | static const FARFORMATFILESIZEFLAGS 2159 | FFFS_COMMAS = 0x0100000000000000LL, 2160 | FFFS_FLOATSIZE = 0x0200000000000000LL, 2161 | FFFS_SHOWBYTESINDEX = 0x0400000000000000LL, 2162 | FFFS_ECONOMIC = 0x0800000000000000LL, 2163 | FFFS_THOUSAND = 0x1000000000000000LL, 2164 | FFFS_MINSIZEINDEX = 0x2000000000000000LL, 2165 | FFFS_MINSIZEINDEX_MASK = 0x0000000000000003LL, 2166 | FFFS_NONE = 0; 2167 | 2168 | typedef size_t (WINAPI *FARFORMATFILESIZE)(unsigned long long Size, intptr_t Width, FARFORMATFILESIZEFLAGS Flags, wchar_t *Dest, size_t DestSize); 2169 | 2170 | typedef struct FarStandardFunctions 2171 | { 2172 | size_t StructSize; 2173 | 2174 | FARSTDATOI atoi; 2175 | FARSTDATOI64 atoi64; 2176 | FARSTDITOA itoa; 2177 | FARSTDITOA64 itoa64; 2178 | // 2179 | FARSTDSPRINTF sprintf; 2180 | FARSTDSSCANF sscanf; 2181 | // 2182 | FARSTDQSORT qsort; 2183 | FARSTDBSEARCH bsearch; 2184 | // 2185 | FARSTDSNPRINTF snprintf; 2186 | // 2187 | 2188 | FARSTDLOCALISLOWER LIsLower; 2189 | FARSTDLOCALISUPPER LIsUpper; 2190 | FARSTDLOCALISALPHA LIsAlpha; 2191 | FARSTDLOCALISALPHANUM LIsAlphanum; 2192 | FARSTDLOCALUPPER LUpper; 2193 | FARSTDLOCALLOWER LLower; 2194 | FARSTDLOCALUPPERBUF LUpperBuf; 2195 | FARSTDLOCALLOWERBUF LLowerBuf; 2196 | FARSTDLOCALSTRUPR LStrupr; 2197 | FARSTDLOCALSTRLWR LStrlwr; 2198 | FARSTDLOCALSTRICMP LStricmp; // Deprecated, don't use 2199 | FARSTDLOCALSTRNICMP LStrnicmp; // Deprecated, don't use 2200 | 2201 | FARSTDUNQUOTE Unquote; 2202 | FARSTDLTRIM LTrim; 2203 | FARSTDRTRIM RTrim; 2204 | FARSTDTRIM Trim; 2205 | FARSTDTRUNCSTR TruncStr; 2206 | FARSTDTRUNCPATHSTR TruncPathStr; 2207 | FARSTDQUOTESPACEONLY QuoteSpaceOnly; 2208 | FARSTDPOINTTONAME PointToName; 2209 | FARSTDGETPATHROOT GetPathRoot; 2210 | FARSTDADDENDSLASH AddEndSlash; 2211 | FARSTDCOPYTOCLIPBOARD CopyToClipboard; 2212 | FARSTDPASTEFROMCLIPBOARD PasteFromClipboard; 2213 | FARSTDINPUTRECORDTOKEYNAME FarInputRecordToName; 2214 | FARSTDKEYNAMETOINPUTRECORD FarNameToInputRecord; 2215 | FARSTDXLAT XLat; 2216 | FARSTDGETFILEOWNER GetFileOwner; 2217 | FARSTDGETNUMBEROFLINKS GetNumberOfLinks; 2218 | FARSTDRECURSIVESEARCH FarRecursiveSearch; 2219 | FARSTDMKTEMP MkTemp; 2220 | FARSTDPROCESSNAME ProcessName; 2221 | FARSTDMKLINK MkLink; 2222 | FARCONVERTPATH ConvertPath; 2223 | FARGETREPARSEPOINTINFO GetReparsePointInfo; 2224 | FARGETCURRENTDIRECTORY GetCurrentDirectory; 2225 | FARFORMATFILESIZE FormatFileSize; 2226 | FARSTDFARCLOCK FarClock; 2227 | FARSTDCOMPARESTRINGS CompareStrings; 2228 | } FARSTANDARDFUNCTIONS; 2229 | 2230 | struct PluginStartupInfo 2231 | { 2232 | size_t StructSize; 2233 | const wchar_t *ModuleName; 2234 | FARAPIMENU Menu; 2235 | FARAPIMESSAGE Message; 2236 | FARAPIGETMSG GetMsg; 2237 | FARAPIPANELCONTROL PanelControl; 2238 | FARAPISAVESCREEN SaveScreen; 2239 | FARAPIRESTORESCREEN RestoreScreen; 2240 | FARAPIGETDIRLIST GetDirList; 2241 | FARAPIGETPLUGINDIRLIST GetPluginDirList; 2242 | FARAPIFREEDIRLIST FreeDirList; 2243 | FARAPIFREEPLUGINDIRLIST FreePluginDirList; 2244 | FARAPIVIEWER Viewer; 2245 | FARAPIEDITOR Editor; 2246 | FARAPITEXT Text; 2247 | FARAPIEDITORCONTROL EditorControl; 2248 | 2249 | FARSTANDARDFUNCTIONS *FSF; 2250 | 2251 | FARAPISHOWHELP ShowHelp; 2252 | FARAPIADVCONTROL AdvControl; 2253 | FARAPIINPUTBOX InputBox; 2254 | FARAPICOLORDIALOG ColorDialog; 2255 | FARAPIDIALOGINIT DialogInit; 2256 | FARAPIDIALOGRUN DialogRun; 2257 | FARAPIDIALOGFREE DialogFree; 2258 | 2259 | FARAPISENDDLGMESSAGE SendDlgMessage; 2260 | FARAPIDEFDLGPROC DefDlgProc; 2261 | FARAPIVIEWERCONTROL ViewerControl; 2262 | FARAPIPLUGINSCONTROL PluginsControl; 2263 | FARAPIFILEFILTERCONTROL FileFilterControl; 2264 | FARAPIREGEXPCONTROL RegExpControl; 2265 | FARAPIMACROCONTROL MacroControl; 2266 | FARAPISETTINGSCONTROL SettingsControl; 2267 | void *Private; 2268 | void* Instance; 2269 | }; 2270 | 2271 | typedef HANDLE (WINAPI *FARAPICREATEFILE)(const wchar_t *Object,DWORD DesiredAccess,DWORD ShareMode,LPSECURITY_ATTRIBUTES SecurityAttributes,DWORD CreationDistribution,DWORD FlagsAndAttributes,HANDLE TemplateFile); 2272 | typedef DWORD (WINAPI *FARAPIGETFILEATTRIBUTES)(const wchar_t *FileName); 2273 | typedef BOOL (WINAPI *FARAPISETFILEATTRIBUTES)(const wchar_t *FileName,DWORD dwFileAttributes); 2274 | typedef BOOL (WINAPI *FARAPIMOVEFILEEX)(const wchar_t *ExistingFileName,const wchar_t *NewFileName,DWORD dwFlags); 2275 | typedef BOOL (WINAPI *FARAPIDELETEFILE)(const wchar_t *FileName); 2276 | typedef BOOL (WINAPI *FARAPIREMOVEDIRECTORY)(const wchar_t *DirName); 2277 | typedef BOOL (WINAPI *FARAPICREATEDIRECTORY)(const wchar_t *PathName,LPSECURITY_ATTRIBUTES lpSecurityAttributes); 2278 | 2279 | struct ArclitePrivateInfo 2280 | { 2281 | size_t StructSize; 2282 | FARAPICREATEFILE CreateFile; 2283 | FARAPIGETFILEATTRIBUTES GetFileAttributes; 2284 | FARAPISETFILEATTRIBUTES SetFileAttributes; 2285 | FARAPIMOVEFILEEX MoveFileEx; 2286 | FARAPIDELETEFILE DeleteFile; 2287 | FARAPIREMOVEDIRECTORY RemoveDirectory; 2288 | FARAPICREATEDIRECTORY CreateDirectory; 2289 | }; 2290 | 2291 | struct NetBoxPrivateInfo 2292 | { 2293 | size_t StructSize; 2294 | FARAPICREATEFILE CreateFile; 2295 | FARAPIGETFILEATTRIBUTES GetFileAttributes; 2296 | FARAPISETFILEATTRIBUTES SetFileAttributes; 2297 | FARAPIMOVEFILEEX MoveFileEx; 2298 | FARAPIDELETEFILE DeleteFile; 2299 | FARAPIREMOVEDIRECTORY RemoveDirectory; 2300 | FARAPICREATEDIRECTORY CreateDirectory; 2301 | }; 2302 | 2303 | struct MacroPluginReturn 2304 | { 2305 | intptr_t ReturnType; 2306 | size_t Count; 2307 | struct FarMacroValue *Values; 2308 | }; 2309 | 2310 | typedef intptr_t (WINAPI *FARAPICALLFAR)(intptr_t CheckCode, struct FarMacroCall* Data); 2311 | 2312 | struct MacroPrivateInfo 2313 | { 2314 | size_t StructSize; 2315 | FARAPICALLFAR CallFar; 2316 | }; 2317 | 2318 | typedef unsigned long long PLUGIN_FLAGS; 2319 | static const PLUGIN_FLAGS 2320 | PF_PRELOAD = 0x0000000000000001ULL, 2321 | PF_DISABLEPANELS = 0x0000000000000002ULL, 2322 | PF_EDITOR = 0x0000000000000004ULL, 2323 | PF_VIEWER = 0x0000000000000008ULL, 2324 | PF_FULLCMDLINE = 0x0000000000000010ULL, 2325 | PF_DIALOG = 0x0000000000000020ULL, 2326 | PF_NONE = 0; 2327 | 2328 | struct PluginMenuItem 2329 | { 2330 | const GUID *Guids; 2331 | const wchar_t * const *Strings; 2332 | size_t Count; 2333 | }; 2334 | 2335 | enum VERSION_STAGE 2336 | { 2337 | VS_RELEASE = 0, 2338 | VS_ALPHA = 1, 2339 | VS_BETA = 2, 2340 | VS_RC = 3, 2341 | }; 2342 | 2343 | struct VersionInfo 2344 | { 2345 | DWORD Major; 2346 | DWORD Minor; 2347 | DWORD Revision; 2348 | DWORD Build; 2349 | enum VERSION_STAGE Stage; 2350 | }; 2351 | 2352 | static __inline BOOL CheckVersion(const struct VersionInfo* Current, const struct VersionInfo* Required) 2353 | { 2354 | return (Current->Major > Required->Major) || (Current->Major == Required->Major && Current->Minor > Required->Minor) || (Current->Major == Required->Major && Current->Minor == Required->Minor && Current->Revision > Required->Revision) || (Current->Major == Required->Major && Current->Minor == Required->Minor && Current->Revision == Required->Revision && Current->Build >= Required->Build); 2355 | } 2356 | 2357 | static __inline struct VersionInfo MAKEFARVERSION(DWORD Major, DWORD Minor, DWORD Revision, DWORD Build, enum VERSION_STAGE Stage) 2358 | { 2359 | struct VersionInfo Info = {Major, Minor, Revision, Build, Stage}; 2360 | return Info; 2361 | } 2362 | 2363 | #define FARMANAGERVERSION MAKEFARVERSION(FARMANAGERVERSION_MAJOR,FARMANAGERVERSION_MINOR, FARMANAGERVERSION_REVISION, FARMANAGERVERSION_BUILD, FARMANAGERVERSION_STAGE) 2364 | 2365 | struct GlobalInfo 2366 | { 2367 | size_t StructSize; 2368 | struct VersionInfo MinFarVersion; 2369 | struct VersionInfo Version; 2370 | GUID Guid; 2371 | const wchar_t *Title; 2372 | const wchar_t *Description; 2373 | const wchar_t *Author; 2374 | void* Instance; 2375 | }; 2376 | 2377 | struct PluginInfo 2378 | { 2379 | size_t StructSize; 2380 | PLUGIN_FLAGS Flags; 2381 | struct PluginMenuItem DiskMenu; 2382 | struct PluginMenuItem PluginMenu; 2383 | struct PluginMenuItem PluginConfig; 2384 | const wchar_t *CommandPrefix; 2385 | void* Instance; 2386 | }; 2387 | 2388 | struct FarGetPluginInformation 2389 | { 2390 | size_t StructSize; 2391 | const wchar_t *ModuleName; 2392 | FAR_PLUGIN_FLAGS Flags; 2393 | struct PluginInfo *PInfo; 2394 | struct GlobalInfo *GInfo; 2395 | }; 2396 | 2397 | typedef unsigned long long INFOPANELLINE_FLAGS; 2398 | static const INFOPANELLINE_FLAGS 2399 | IPLFLAGS_SEPARATOR = 0x0000000000000001ULL, 2400 | IPLFLAGS_NONE = 0; 2401 | 2402 | struct InfoPanelLine 2403 | { 2404 | const wchar_t *Text; 2405 | const wchar_t *Data; 2406 | INFOPANELLINE_FLAGS Flags; 2407 | }; 2408 | 2409 | typedef unsigned long long PANELMODE_FLAGS; 2410 | static const PANELMODE_FLAGS 2411 | PMFLAGS_FULLSCREEN = 0x0000000000000001ULL, 2412 | PMFLAGS_DETAILEDSTATUS = 0x0000000000000002ULL, 2413 | PMFLAGS_ALIGNEXTENSIONS = 0x0000000000000004ULL, 2414 | PMFLAGS_CASECONVERSION = 0x0000000000000008ULL, 2415 | PMFLAGS_NONE = 0; 2416 | 2417 | struct PanelMode 2418 | { 2419 | const wchar_t *ColumnTypes; 2420 | const wchar_t *ColumnWidths; 2421 | const wchar_t * const *ColumnTitles; 2422 | const wchar_t *StatusColumnTypes; 2423 | const wchar_t *StatusColumnWidths; 2424 | PANELMODE_FLAGS Flags; 2425 | }; 2426 | 2427 | typedef unsigned long long OPENPANELINFO_FLAGS; 2428 | static const OPENPANELINFO_FLAGS 2429 | OPIF_DISABLEFILTER = 0x0000000000000001ULL, 2430 | OPIF_DISABLESORTGROUPS = 0x0000000000000002ULL, 2431 | OPIF_DISABLEHIGHLIGHTING = 0x0000000000000004ULL, 2432 | OPIF_ADDDOTS = 0x0000000000000008ULL, 2433 | OPIF_RAWSELECTION = 0x0000000000000010ULL, 2434 | OPIF_REALNAMES = 0x0000000000000020ULL, 2435 | OPIF_SHOWNAMESONLY = 0x0000000000000040ULL, 2436 | OPIF_SHOWRIGHTALIGNNAMES = 0x0000000000000080ULL, 2437 | OPIF_SHOWPRESERVECASE = 0x0000000000000100ULL, 2438 | OPIF_COMPAREFATTIME = 0x0000000000000400ULL, 2439 | OPIF_EXTERNALGET = 0x0000000000000800ULL, 2440 | OPIF_EXTERNALPUT = 0x0000000000001000ULL, 2441 | OPIF_EXTERNALDELETE = 0x0000000000002000ULL, 2442 | OPIF_EXTERNALMKDIR = 0x0000000000004000ULL, 2443 | OPIF_USEATTRHIGHLIGHTING = 0x0000000000008000ULL, 2444 | OPIF_USECRC32 = 0x0000000000010000ULL, 2445 | OPIF_USEFREESIZE = 0x0000000000020000ULL, 2446 | OPIF_SHORTCUT = 0x0000000000040000ULL, 2447 | OPIF_NONE = 0; 2448 | 2449 | struct KeyBarLabel 2450 | { 2451 | struct FarKey Key; 2452 | const wchar_t *Text; 2453 | const wchar_t *LongText; 2454 | }; 2455 | 2456 | struct KeyBarTitles 2457 | { 2458 | size_t CountLabels; 2459 | struct KeyBarLabel *Labels; 2460 | }; 2461 | 2462 | struct FarSetKeyBarTitles 2463 | { 2464 | size_t StructSize; 2465 | struct KeyBarTitles *Titles; 2466 | }; 2467 | 2468 | typedef unsigned long long OPERATION_MODES; 2469 | static const OPERATION_MODES 2470 | OPM_SILENT =0x0000000000000001ULL, 2471 | OPM_FIND =0x0000000000000002ULL, 2472 | OPM_VIEW =0x0000000000000004ULL, 2473 | OPM_EDIT =0x0000000000000008ULL, 2474 | OPM_TOPLEVEL =0x0000000000000010ULL, 2475 | OPM_DESCR =0x0000000000000020ULL, 2476 | OPM_QUICKVIEW =0x0000000000000040ULL, 2477 | OPM_PGDN =0x0000000000000080ULL, 2478 | OPM_COMMANDS =0x0000000000000100ULL, 2479 | OPM_NONE =0; 2480 | 2481 | struct OpenPanelInfo 2482 | { 2483 | size_t StructSize; 2484 | HANDLE hPanel; 2485 | OPENPANELINFO_FLAGS Flags; 2486 | const wchar_t *HostFile; 2487 | const wchar_t *CurDir; 2488 | const wchar_t *Format; 2489 | const wchar_t *PanelTitle; 2490 | const struct InfoPanelLine *InfoLines; 2491 | size_t InfoLinesNumber; 2492 | const wchar_t * const *DescrFiles; 2493 | size_t DescrFilesNumber; 2494 | const struct PanelMode *PanelModesArray; 2495 | size_t PanelModesNumber; 2496 | intptr_t StartPanelMode; 2497 | enum OPENPANELINFO_SORTMODES StartSortMode; 2498 | intptr_t StartSortOrder; 2499 | const struct KeyBarTitles *KeyBar; 2500 | const wchar_t *ShortcutData; 2501 | unsigned long long FreeSize; 2502 | struct UserDataItem UserData; 2503 | void* Instance; 2504 | }; 2505 | 2506 | struct AnalyseInfo 2507 | { 2508 | size_t StructSize; 2509 | const wchar_t *FileName; 2510 | void *Buffer; 2511 | size_t BufferSize; 2512 | OPERATION_MODES OpMode; 2513 | void* Instance; 2514 | }; 2515 | 2516 | struct OpenAnalyseInfo 2517 | { 2518 | size_t StructSize; 2519 | struct AnalyseInfo* Info; 2520 | HANDLE Handle; 2521 | }; 2522 | 2523 | struct OpenMacroInfo 2524 | { 2525 | size_t StructSize; 2526 | size_t Count; 2527 | struct FarMacroValue *Values; 2528 | }; 2529 | 2530 | typedef unsigned long long FAROPENSHORTCUTFLAGS; 2531 | static const FAROPENSHORTCUTFLAGS 2532 | FOSF_ACTIVE = 0x0000000000000001ULL, 2533 | FOSF_NONE = 0; 2534 | 2535 | struct OpenShortcutInfo 2536 | { 2537 | size_t StructSize; 2538 | const wchar_t *HostFile; 2539 | const wchar_t *ShortcutData; 2540 | FAROPENSHORTCUTFLAGS Flags; 2541 | }; 2542 | 2543 | struct OpenCommandLineInfo 2544 | { 2545 | size_t StructSize; 2546 | const wchar_t *CommandLine; 2547 | }; 2548 | 2549 | enum OPENFROM 2550 | { 2551 | OPEN_LEFTDISKMENU = 0, 2552 | OPEN_PLUGINSMENU = 1, 2553 | OPEN_FINDLIST = 2, 2554 | OPEN_SHORTCUT = 3, 2555 | OPEN_COMMANDLINE = 4, 2556 | OPEN_EDITOR = 5, 2557 | OPEN_VIEWER = 6, 2558 | OPEN_FILEPANEL = 7, 2559 | OPEN_DIALOG = 8, 2560 | OPEN_ANALYSE = 9, 2561 | OPEN_RIGHTDISKMENU = 10, 2562 | OPEN_FROMMACRO = 11, 2563 | OPEN_LUAMACRO = 100, 2564 | }; 2565 | 2566 | enum MACROCALLTYPE 2567 | { 2568 | MCT_MACROPARSE = 0, 2569 | MCT_LOADMACROS = 1, 2570 | MCT_ENUMMACROS = 2, 2571 | MCT_WRITEMACROS = 3, 2572 | MCT_GETMACRO = 4, 2573 | MCT_RECORDEDMACRO = 5, 2574 | MCT_DELMACRO = 6, 2575 | MCT_RUNSTARTMACRO = 7, 2576 | MCT_EXECSTRING = 8, 2577 | MCT_PANELSORT = 9, 2578 | MCT_GETCUSTOMSORTMODES = 10, 2579 | MCT_ADDMACRO = 11, 2580 | MCT_KEYMACRO = 12, 2581 | MCT_CANPANELSORT = 13, 2582 | }; 2583 | 2584 | enum MACROPLUGINRETURNTYPE 2585 | { 2586 | MPRT_NORMALFINISH = 0, 2587 | MPRT_ERRORFINISH = 1, 2588 | MPRT_ERRORPARSE = 2, 2589 | MPRT_KEYS = 3, 2590 | MPRT_PRINT = 4, 2591 | MPRT_PLUGINCALL = 5, 2592 | MPRT_PLUGINMENU = 6, 2593 | MPRT_PLUGINCONFIG = 7, 2594 | MPRT_PLUGINCOMMAND = 8, 2595 | MPRT_USERMENU = 9, 2596 | MPRT_HASNOMACRO = 10, 2597 | }; 2598 | 2599 | struct OpenMacroPluginInfo 2600 | { 2601 | enum MACROCALLTYPE CallType; 2602 | struct FarMacroCall *Data; 2603 | struct MacroPluginReturn Ret; 2604 | }; 2605 | 2606 | 2607 | enum FAR_EVENTS 2608 | { 2609 | FE_CHANGEVIEWMODE =0, 2610 | FE_REDRAW =1, 2611 | FE_IDLE =2, 2612 | FE_CLOSE =3, 2613 | FE_BREAK =4, 2614 | FE_COMMAND =5, 2615 | 2616 | FE_GOTFOCUS =6, 2617 | FE_KILLFOCUS =7, 2618 | FE_CHANGESORTPARAMS =8, 2619 | }; 2620 | 2621 | struct OpenInfo 2622 | { 2623 | size_t StructSize; 2624 | enum OPENFROM OpenFrom; 2625 | const GUID* Guid; 2626 | intptr_t Data; 2627 | void* Instance; 2628 | }; 2629 | 2630 | struct SetDirectoryInfo 2631 | { 2632 | size_t StructSize; 2633 | HANDLE hPanel; 2634 | const wchar_t *Dir; 2635 | intptr_t Reserved; 2636 | OPERATION_MODES OpMode; 2637 | struct UserDataItem UserData; 2638 | void* Instance; 2639 | }; 2640 | 2641 | struct SetFindListInfo 2642 | { 2643 | size_t StructSize; 2644 | HANDLE hPanel; 2645 | const struct PluginPanelItem *PanelItem; 2646 | size_t ItemsNumber; 2647 | void* Instance; 2648 | }; 2649 | 2650 | struct PutFilesInfo 2651 | { 2652 | size_t StructSize; 2653 | HANDLE hPanel; 2654 | struct PluginPanelItem *PanelItem; 2655 | size_t ItemsNumber; 2656 | BOOL Move; 2657 | const wchar_t *SrcPath; 2658 | OPERATION_MODES OpMode; 2659 | void* Instance; 2660 | }; 2661 | 2662 | struct ProcessHostFileInfo 2663 | { 2664 | size_t StructSize; 2665 | HANDLE hPanel; 2666 | struct PluginPanelItem *PanelItem; 2667 | size_t ItemsNumber; 2668 | OPERATION_MODES OpMode; 2669 | void* Instance; 2670 | }; 2671 | 2672 | struct MakeDirectoryInfo 2673 | { 2674 | size_t StructSize; 2675 | HANDLE hPanel; 2676 | const wchar_t *Name; 2677 | OPERATION_MODES OpMode; 2678 | void* Instance; 2679 | }; 2680 | 2681 | struct CompareInfo 2682 | { 2683 | size_t StructSize; 2684 | HANDLE hPanel; 2685 | const struct PluginPanelItem *Item1; 2686 | const struct PluginPanelItem *Item2; 2687 | enum OPENPANELINFO_SORTMODES Mode; 2688 | void* Instance; 2689 | }; 2690 | 2691 | struct GetFindDataInfo 2692 | { 2693 | size_t StructSize; 2694 | HANDLE hPanel; 2695 | struct PluginPanelItem *PanelItem; 2696 | size_t ItemsNumber; 2697 | OPERATION_MODES OpMode; 2698 | void* Instance; 2699 | }; 2700 | 2701 | 2702 | struct FreeFindDataInfo 2703 | { 2704 | size_t StructSize; 2705 | HANDLE hPanel; 2706 | struct PluginPanelItem *PanelItem; 2707 | size_t ItemsNumber; 2708 | void* Instance; 2709 | }; 2710 | 2711 | struct GetFilesInfo 2712 | { 2713 | size_t StructSize; 2714 | HANDLE hPanel; 2715 | struct PluginPanelItem *PanelItem; 2716 | size_t ItemsNumber; 2717 | BOOL Move; 2718 | const wchar_t *DestPath; 2719 | OPERATION_MODES OpMode; 2720 | void* Instance; 2721 | }; 2722 | 2723 | struct DeleteFilesInfo 2724 | { 2725 | size_t StructSize; 2726 | HANDLE hPanel; 2727 | struct PluginPanelItem *PanelItem; 2728 | size_t ItemsNumber; 2729 | OPERATION_MODES OpMode; 2730 | void* Instance; 2731 | }; 2732 | 2733 | struct ProcessPanelInputInfo 2734 | { 2735 | size_t StructSize; 2736 | HANDLE hPanel; 2737 | INPUT_RECORD Rec; 2738 | void* Instance; 2739 | }; 2740 | 2741 | struct ProcessEditorInputInfo 2742 | { 2743 | size_t StructSize; 2744 | INPUT_RECORD Rec; 2745 | void* Instance; 2746 | }; 2747 | 2748 | typedef unsigned long long PROCESSCONSOLEINPUT_FLAGS; 2749 | static const PROCESSCONSOLEINPUT_FLAGS 2750 | PCIF_NONE = 0; 2751 | 2752 | struct ProcessConsoleInputInfo 2753 | { 2754 | size_t StructSize; 2755 | PROCESSCONSOLEINPUT_FLAGS Flags; 2756 | INPUT_RECORD Rec; 2757 | void* Instance; 2758 | }; 2759 | 2760 | struct ExitInfo 2761 | { 2762 | size_t StructSize; 2763 | void* Instance; 2764 | }; 2765 | 2766 | struct ProcessPanelEventInfo 2767 | { 2768 | size_t StructSize; 2769 | intptr_t Event; 2770 | void* Param; 2771 | HANDLE hPanel; 2772 | void* Instance; 2773 | }; 2774 | 2775 | struct ProcessEditorEventInfo 2776 | { 2777 | size_t StructSize; 2778 | intptr_t Event; 2779 | void* Param; 2780 | intptr_t EditorID; 2781 | void* Instance; 2782 | }; 2783 | 2784 | struct ProcessDialogEventInfo 2785 | { 2786 | size_t StructSize; 2787 | intptr_t Event; 2788 | struct FarDialogEvent* Param; 2789 | void* Instance; 2790 | }; 2791 | 2792 | struct ProcessSynchroEventInfo 2793 | { 2794 | size_t StructSize; 2795 | intptr_t Event; 2796 | void* Param; 2797 | void* Instance; 2798 | }; 2799 | 2800 | struct ProcessViewerEventInfo 2801 | { 2802 | size_t StructSize; 2803 | intptr_t Event; 2804 | void* Param; 2805 | intptr_t ViewerID; 2806 | void* Instance; 2807 | }; 2808 | 2809 | struct ClosePanelInfo 2810 | { 2811 | size_t StructSize; 2812 | HANDLE hPanel; 2813 | void* Instance; 2814 | }; 2815 | 2816 | struct CloseAnalyseInfo 2817 | { 2818 | size_t StructSize; 2819 | HANDLE Handle; 2820 | void* Instance; 2821 | }; 2822 | 2823 | struct ConfigureInfo 2824 | { 2825 | size_t StructSize; 2826 | const GUID* Guid; 2827 | void* Instance; 2828 | }; 2829 | 2830 | struct GetContentFieldsInfo 2831 | { 2832 | size_t StructSize; 2833 | size_t Count; 2834 | const wchar_t* const *Names; 2835 | void* Instance; 2836 | }; 2837 | 2838 | struct GetContentDataInfo 2839 | { 2840 | size_t StructSize; 2841 | const wchar_t *FilePath; 2842 | size_t Count; 2843 | const wchar_t* const *Names; 2844 | const wchar_t **Values; 2845 | void* Instance; 2846 | }; 2847 | 2848 | struct ErrorInfo 2849 | { 2850 | size_t StructSize; 2851 | const wchar_t* Summary; 2852 | const wchar_t* Description; 2853 | }; 2854 | 2855 | static const GUID FarGuid = 2856 | {0x00000000, 0x0000, 0x0000, {0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00}}; 2857 | 2858 | #ifdef __cplusplus 2859 | extern "C" 2860 | { 2861 | #endif 2862 | // Exported Functions 2863 | 2864 | HANDLE WINAPI AnalyseW(const struct AnalyseInfo *Info); 2865 | void WINAPI CloseAnalyseW(const struct CloseAnalyseInfo *Info); 2866 | void WINAPI ClosePanelW(const struct ClosePanelInfo *Info); 2867 | intptr_t WINAPI CompareW(const struct CompareInfo *Info); 2868 | intptr_t WINAPI ConfigureW(const struct ConfigureInfo *Info); 2869 | intptr_t WINAPI DeleteFilesW(const struct DeleteFilesInfo *Info); 2870 | void WINAPI ExitFARW(const struct ExitInfo *Info); 2871 | void WINAPI FreeFindDataW(const struct FreeFindDataInfo *Info); 2872 | intptr_t WINAPI GetFilesW(struct GetFilesInfo *Info); 2873 | intptr_t WINAPI GetFindDataW(struct GetFindDataInfo *Info); 2874 | void WINAPI GetGlobalInfoW(struct GlobalInfo *Info); 2875 | void WINAPI GetOpenPanelInfoW(struct OpenPanelInfo *Info); 2876 | void WINAPI GetPluginInfoW(struct PluginInfo *Info); 2877 | intptr_t WINAPI MakeDirectoryW(struct MakeDirectoryInfo *Info); 2878 | HANDLE WINAPI OpenW(const struct OpenInfo *Info); 2879 | intptr_t WINAPI ProcessDialogEventW(const struct ProcessDialogEventInfo *Info); 2880 | intptr_t WINAPI ProcessEditorEventW(const struct ProcessEditorEventInfo *Info); 2881 | intptr_t WINAPI ProcessEditorInputW(const struct ProcessEditorInputInfo *Info); 2882 | intptr_t WINAPI ProcessPanelEventW(const struct ProcessPanelEventInfo *Info); 2883 | intptr_t WINAPI ProcessHostFileW(const struct ProcessHostFileInfo *Info); 2884 | intptr_t WINAPI ProcessPanelInputW(const struct ProcessPanelInputInfo *Info); 2885 | intptr_t WINAPI ProcessConsoleInputW(struct ProcessConsoleInputInfo *Info); 2886 | intptr_t WINAPI ProcessSynchroEventW(const struct ProcessSynchroEventInfo *Info); 2887 | intptr_t WINAPI ProcessViewerEventW(const struct ProcessViewerEventInfo *Info); 2888 | intptr_t WINAPI PutFilesW(const struct PutFilesInfo *Info); 2889 | intptr_t WINAPI SetDirectoryW(const struct SetDirectoryInfo *Info); 2890 | intptr_t WINAPI SetFindListW(const struct SetFindListInfo *Info); 2891 | void WINAPI SetStartupInfoW(const struct PluginStartupInfo *Info); 2892 | intptr_t WINAPI GetContentFieldsW(const struct GetContentFieldsInfo *Info); 2893 | intptr_t WINAPI GetContentDataW(struct GetContentDataInfo *Info); 2894 | void WINAPI FreeContentDataW(const struct GetContentDataInfo *Info); 2895 | 2896 | #ifdef __cplusplus 2897 | }; 2898 | #endif 2899 | 2900 | #endif /* RC_INVOKED */ 2901 | 2902 | #endif // PLUGIN_HPP_3FC978E9_63BE_4FC2_8F96_8188B0AF8363 --------------------------------------------------------------------------------