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.
21 #include "MainWindow.h"
22 #include "CmdLineParser.h"
25 #include "TortoiseIDiff.h"
26 #include "TaskbarUUID.h"
30 #pragma comment(linker, "\"/manifestdependency:type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")
33 HINSTANCE hInst
; // current instance
34 HINSTANCE hResource
; // the resource dll
38 int APIENTRY
_tWinMain(HINSTANCE hInstance
,
39 HINSTANCE
/*hPrevInstance*/,
45 CRegStdDWORD loc
= CRegStdDWORD(L
"Software\\TortoiseGit\\LanguageID", 1033);
47 CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED
);
48 SCOPE_EXIT
{ CoUninitialize(); };
51 hResource
= langDLL
.Init(L
"TortoiseIDiff", langId
);
53 hResource
= hInstance
;
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
);
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"));
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))
99 LPWSTR
* szArglist
= CommandLineToArgvW(GetCommandLineW(), &nArgs
);
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
);