Fixed issue #4174: Fix double words typo
[TortoiseGit.git] / src / TortoiseIDiff / TortoiseIDiff.cpp
bloba41cb82aff29829a06162ce85cf26f48cfa96b0e
1 // TortoiseIDiff - an image diff viewer in TortoiseSVN and TortoiseGit
3 // Copyright (C) 2015-2016, 2019-2020, 2023 - TortoiseGit
4 // Copyright (C) 2006-2007, 2010-2014 - TortoiseSVN
6 // This program is free software; you can redistribute it and/or
7 // modify it under the terms of the GNU General Public License
8 // as published by the Free Software Foundation; either version 2
9 // of the License, or (at your option) any later version.
11 // This program is distributed in the hope that it will be useful,
12 // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 // GNU General Public License for more details.
16 // You should have received a copy of the GNU General Public License
17 // along with this program; if not, write to the Free Software Foundation,
18 // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
20 #include "stdafx.h"
21 #include "MainWindow.h"
22 #include "CmdLineParser.h"
23 #include "registry.h"
24 #include "LangDll.h"
25 #include "TortoiseIDiff.h"
26 #include "TaskbarUUID.h"
27 #include "Monitor.h"
28 #include <Shellapi.h>
30 #pragma comment(linker, "\"/manifestdependency:type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")
32 // Global Variables:
33 HINSTANCE hInst; // current instance
34 HINSTANCE hResource; // the resource dll
35 HCURSOR curHand;
36 HCURSOR curHandDown;
38 int APIENTRY _tWinMain(HINSTANCE hInstance,
39 HINSTANCE /*hPrevInstance*/,
40 LPWSTR lpCmdLine,
41 int /*nCmdShow*/)
43 SetDllDirectory(L"");
44 SetTaskIDPerUUID();
45 CRegStdDWORD loc = CRegStdDWORD(L"Software\\TortoiseGit\\LanguageID", 1033);
46 long langId = loc;
47 CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED);
48 SCOPE_EXIT { CoUninitialize(); };
50 CLangDll langDLL;
51 hResource = langDLL.Init(L"TortoiseIDiff", langId);
52 if (!hResource)
53 hResource = hInstance;
55 git_libgit2_init();
56 SCOPE_EXIT { git_libgit2_shutdown(); };
58 CCmdLineParser parser(lpCmdLine);
60 if (parser.HasKey(L"?") || parser.HasKey(L"help"))
62 wchar_t buf[1024] = { 0 };
63 LoadString(hResource, IDS_COMMANDLINEHELP, buf, _countof(buf));
64 MessageBox(nullptr, buf, L"TortoiseIDiff", MB_ICONINFORMATION);
65 langDLL.Close();
66 return 0;
69 SCOPE_EXIT
71 if (parser.HasKey(L"deletebasetheirsmineonclose") && parser.HasVal(L"base") && parser.HasVal(L"mine") && parser.HasVal(L"theirs"))
73 ::DeleteFile(parser.GetVal(L"base"));
74 ::DeleteFile(parser.GetVal(L"mine"));
75 ::DeleteFile(parser.GetVal(L"theirs"));
79 MSG msg;
80 hInst = hInstance;
82 INITCOMMONCONTROLSEX used = {
83 sizeof(INITCOMMONCONTROLSEX),
84 ICC_STANDARD_CLASSES | ICC_BAR_CLASSES | ICC_WIN95_CLASSES
86 InitCommonControlsEx(&used);
88 // load the cursors we need
89 curHand = static_cast<HCURSOR>(LoadImage(hInst, MAKEINTRESOURCE(IDC_PANCUR), IMAGE_CURSOR, 0, 0, LR_DEFAULTSIZE));
90 curHandDown = static_cast<HCURSOR>(LoadImage(hInst, MAKEINTRESOURCE(IDC_PANDOWNCUR), IMAGE_CURSOR, 0, 0, LR_DEFAULTSIZE));
92 auto mainWindow = std::make_unique<CMainWindow>(hResource);
93 mainWindow->SetRegistryPath(L"Software\\TortoiseGit\\TortoiseIDiffWindowPos_" + GetMonitorSetupHash());
94 std::wstring leftfile = parser.HasVal(L"left") ? parser.GetVal(L"left") : L"";
95 std::wstring rightfile = parser.HasVal(L"right") ? parser.GetVal(L"right") : L"";
96 if ((leftfile.empty()) && (lpCmdLine[0] != 0))
98 int nArgs;
99 LPWSTR * szArglist = CommandLineToArgvW(GetCommandLineW(), &nArgs);
100 if (szArglist)
102 if (nArgs == 3)
104 // Four parameters:
105 // [0]: Program name
106 // [1]: left file
107 // [2]: right file
108 if (PathFileExists(szArglist[1]) && PathFileExists(szArglist[2]))
110 leftfile = szArglist[1];
111 rightfile = szArglist[2];
116 // Free memory allocated for CommandLineToArgvW arguments.
117 LocalFree(szArglist);
119 mainWindow->SetLeft(leftfile.c_str(), parser.HasVal(L"lefttitle") ? parser.GetVal(L"lefttitle") : L"");
120 mainWindow->SetRight(rightfile.c_str(), parser.HasVal(L"righttitle") ? parser.GetVal(L"righttitle") : L"");
121 if (parser.HasVal(L"base"))
122 mainWindow->SetSelectionImage(FileType::Base, parser.GetVal(L"base"), parser.HasVal(L"basetitle") ? parser.GetVal(L"basetitle") : L"");
123 if (parser.HasVal(L"mine"))
124 mainWindow->SetSelectionImage(FileType::Mine, parser.GetVal(L"mine"), parser.HasVal(L"minetitle") ? parser.GetVal(L"minetitle") : L"");
125 if (parser.HasVal(L"theirs"))
126 mainWindow->SetSelectionImage(FileType::Theirs, parser.GetVal(L"theirs"), parser.HasVal(L"theirstitle") ? parser.GetVal(L"theirstitle") : L"");
127 if (parser.HasVal(L"result"))
128 mainWindow->SetSelectionResult(parser.GetVal(L"result"));
129 mainWindow->resolveMsgWnd = parser.HasVal(L"resolvemsghwnd") ? reinterpret_cast<HWND>(parser.GetLongLongVal(L"resolvemsghwnd")) : 0;
130 mainWindow->resolveMsgWParam = parser.HasVal(L"resolvemsgwparam") ? static_cast<WPARAM>(parser.GetLongLongVal(L"resolvemsgwparam")) : 0;
131 mainWindow->resolveMsgLParam = parser.HasVal(L"resolvemsglparam") ? static_cast<LPARAM>(parser.GetLongLongVal(L"resolvemsglparam")) : 0;
132 if (mainWindow->RegisterAndCreateWindow())
134 HACCEL hAccelTable = LoadAccelerators(hResource, MAKEINTRESOURCE(IDR_TORTOISEIDIFF));
135 if (!parser.HasVal(L"left") && parser.HasVal(L"base") && !parser.HasVal(L"mine") && !parser.HasVal(L"theirs"))
137 PostMessage(*mainWindow, WM_COMMAND, ID_FILE_OPEN, 0);
139 if (parser.HasKey(L"overlay"))
141 PostMessage(*mainWindow, WM_COMMAND, ID_VIEW_OVERLAPIMAGES, 0);
143 if (parser.HasKey(L"fit"))
145 PostMessage(*mainWindow, WM_COMMAND, ID_VIEW_FITIMAGEHEIGHTS, 0);
146 PostMessage(*mainWindow, WM_COMMAND, ID_VIEW_FITIMAGEWIDTHS, 0);
148 if (parser.HasKey(L"fitwidth"))
150 PostMessage(*mainWindow, WM_COMMAND, ID_VIEW_FITIMAGEWIDTHS, 0);
152 if (parser.HasKey(L"fitheight"))
154 PostMessage(*mainWindow, WM_COMMAND, ID_VIEW_FITIMAGEHEIGHTS, 0);
156 if (parser.HasKey(L"showinfo"))
158 PostMessage(*mainWindow, WM_COMMAND, ID_VIEW_IMAGEINFO, 0);
160 // Main message loop:
161 while (GetMessage(&msg, nullptr, 0, 0))
163 if (!TranslateAccelerator(*mainWindow, hAccelTable, &msg))
165 TranslateMessage(&msg);
166 DispatchMessage(&msg);
169 return static_cast<int>(msg.wParam);
171 return 1;