mirror of
				https://github.com/cmderdev/cmder.git
				synced 2025-11-01 01:42:17 +08:00 
			
		
		
		
	Merge branch 'master' into taskdialog
This commit is contained in:
		| @@ -21,6 +21,8 @@ | ||||
| #define MB_TITLE L"Cmder Launcher" | ||||
| #define SHELL_MENU_REGISTRY_PATH_BACKGROUND L"Directory\\Background\\shell\\Cmder" | ||||
| #define SHELL_MENU_REGISTRY_PATH_LISTITEM L"Directory\\shell\\Cmder" | ||||
| #define SHELL_MENU_REGISTRY_DRIVE_PATH_BACKGROUND L"Drive\\Background\\shell\\Cmder" | ||||
| #define SHELL_MENU_REGISTRY_DRIVE_PATH_LISTITEM L"Drive\\shell\\Cmder" | ||||
|  | ||||
| #define streqi(a, b) (_wcsicmp((a), (b)) == 0) | ||||
|  | ||||
| @@ -44,7 +46,7 @@ void TaskDialogOpen( PCWSTR mainStr, PCWSTR contentStr ) | ||||
| 	tsk.hInstance = hInstance; | ||||
| 	tsk.pszMainIcon = MAKEINTRESOURCE(IDI_CMDER); | ||||
| 	tsk.pszWindowTitle = tskTitle; | ||||
| 	tsk.pszMainInstruction = mainStr;  | ||||
| 	tsk.pszMainInstruction = mainStr; | ||||
| 	tsk.pszContent = contentStr; | ||||
|  | ||||
| 	TASKDIALOG_BUTTON btns[1] = { | ||||
| @@ -103,7 +105,7 @@ bool FileExists(const wchar_t * filePath) | ||||
| 	return false; | ||||
| } | ||||
|  | ||||
| void StartCmder(std::wstring  path = L"", bool is_single_mode = false, std::wstring taskName = L"", std::wstring cfgRoot = L"") | ||||
| void StartCmder(std::wstring  path = L"", bool is_single_mode = false, std::wstring taskName = L"", std::wstring iconPath = L"", std::wstring cfgRoot = L"", bool use_user_cfg = true, std::wstring conemu_args = L"") | ||||
| { | ||||
| #if USE_TASKBAR_API | ||||
| 	wchar_t appId[MAX_PATH] = { 0 }; | ||||
| @@ -122,10 +124,15 @@ void StartCmder(std::wstring  path = L"", bool is_single_mode = false, std::wstr | ||||
| 	wchar_t userProfiledDirPath[MAX_PATH] = { 0 }; | ||||
| 	wchar_t userProfilePath[MAX_PATH] = { 0 }; | ||||
| 	wchar_t legacyUserProfilePath[MAX_PATH] = { 0 }; | ||||
| 	wchar_t userAliasesPath[MAX_PATH] = { 0 }; | ||||
| 	wchar_t legacyUserAliasesPath[MAX_PATH] = { 0 }; | ||||
| 	wchar_t args[MAX_PATH * 2 + 256] = { 0 }; | ||||
| 	wchar_t userConEmuCfgPath[MAX_PATH] = { 0 }; | ||||
|  | ||||
|  | ||||
| 	std::wstring cmderStart = path; | ||||
| 	std::wstring cmderTask = taskName; | ||||
| 	std::wstring cmderConEmuArgs = conemu_args; | ||||
|  | ||||
| 	std::copy(cfgRoot.begin(), cfgRoot.end(), userConfigDirPath); | ||||
| 	userConfigDirPath[cfgRoot.length()] = 0; | ||||
| @@ -138,12 +145,24 @@ void StartCmder(std::wstring  path = L"", bool is_single_mode = false, std::wstr | ||||
|  | ||||
| 	PathRemoveFileSpec(exeDir); | ||||
|  | ||||
| 	PathCombine(icoPath, exeDir, L"icons\\cmder.ico"); | ||||
| 	if (PathFileExists(iconPath.c_str())) | ||||
| 	{ | ||||
| 		std::copy(iconPath.begin(), iconPath.end(), icoPath); | ||||
| 		icoPath[iconPath.length()] = 0; | ||||
| 	} | ||||
| 	else | ||||
| 	{ | ||||
| 		PathCombine(icoPath, exeDir, L"icons\\cmder.ico"); | ||||
| 	} | ||||
|  | ||||
| 	PathCombine(configDirPath, exeDir, L"config"); | ||||
|  | ||||
| 	/* | ||||
| 	Convert legacy user-profile.cmd to new name user_profile.cmd | ||||
| 	*/ | ||||
| 	PathCombine(legacyUserProfilePath, configDirPath, L"user-profile.cmd"); | ||||
| 	if (PathFileExists(legacyUserProfilePath)) { | ||||
| 	if (PathFileExists(legacyUserProfilePath)) | ||||
| 	{ | ||||
| 		PathCombine(userProfilePath, configDirPath, L"user_profile.cmd"); | ||||
|  | ||||
| 		char      *lPr = (char *)malloc(MAX_PATH); | ||||
| @@ -156,12 +175,35 @@ void StartCmder(std::wstring  path = L"", bool is_single_mode = false, std::wstr | ||||
| 		rename(lPr, pR); | ||||
| 	} | ||||
|  | ||||
| 	/* | ||||
| 	Convert legacy user-aliases.cmd to new name user_aliases.cmd | ||||
| 	*/ | ||||
| 	PathCombine(legacyUserAliasesPath, configDirPath, L"user-aliases.cmd"); | ||||
| 	if (PathFileExists(legacyUserAliasesPath)) | ||||
| 	{ | ||||
| 		PathCombine(userAliasesPath, configDirPath, L"user_aliases.cmd"); | ||||
|  | ||||
| 		char      *lPr = (char *)malloc(MAX_PATH); | ||||
| 		char      *pR = (char *)malloc(MAX_PATH); | ||||
| 		size_t i; | ||||
| 		wcstombs_s(&i, lPr, (size_t)MAX_PATH, | ||||
| 			legacyUserAliasesPath, (size_t)MAX_PATH); | ||||
| 		wcstombs_s(&i, pR, (size_t)MAX_PATH, | ||||
| 			userAliasesPath, (size_t)MAX_PATH); | ||||
| 		rename(lPr, pR); | ||||
| 	} | ||||
| 	 | ||||
| 	/* | ||||
| 	Was /c [path] specified? | ||||
| 	*/ | ||||
| 	if (wcscmp(userConfigDirPath, L"") == 0) | ||||
| 	{ | ||||
| 		// No - It wasn't. | ||||
| 		PathCombine(userConfigDirPath, exeDir, L"config"); | ||||
| 	} | ||||
| 	else | ||||
| 	{ | ||||
| 		// Yes - It was. | ||||
| 		PathCombine(userBinDirPath, userConfigDirPath, L"bin"); | ||||
| 		SHCreateDirectoryEx(0, userBinDirPath, 0); | ||||
|  | ||||
| @@ -170,9 +212,13 @@ void StartCmder(std::wstring  path = L"", bool is_single_mode = false, std::wstr | ||||
|  | ||||
| 		PathCombine(userProfiledDirPath, userConfigDirPath, L"profile.d"); | ||||
| 		SHCreateDirectoryEx(0, userProfiledDirPath, 0); | ||||
| 		 | ||||
|  | ||||
| 		/* | ||||
| 		Convert legacy user-profile.cmd to new name user_profile.cmd | ||||
| 		*/ | ||||
| 		PathCombine(legacyUserProfilePath, userConfigDirPath, L"user-profile.cmd"); | ||||
| 		if (PathFileExists(legacyUserProfilePath)) { | ||||
| 		if (PathFileExists(legacyUserProfilePath)) | ||||
| 		{ | ||||
| 			PathCombine(userProfilePath, userConfigDirPath, L"user_profile.cmd"); | ||||
|  | ||||
| 			char      *lPr = (char *)malloc(MAX_PATH); | ||||
| @@ -184,112 +230,213 @@ void StartCmder(std::wstring  path = L"", bool is_single_mode = false, std::wstr | ||||
| 				userProfilePath, (size_t)MAX_PATH); | ||||
| 			rename(lPr, pR); | ||||
| 		} | ||||
|  | ||||
| 		/* | ||||
| 		Convert legacy user-aliases.cmd to new name user_aliases.cmd | ||||
| 		*/ | ||||
| 		PathCombine(legacyUserAliasesPath, userConfigDirPath, L"user-aliases.cmd"); | ||||
| 		if (PathFileExists(legacyUserAliasesPath)) | ||||
| 		{ | ||||
| 			PathCombine(userAliasesPath, userConfigDirPath, L"user_aliases.cmd"); | ||||
|  | ||||
| 			char      *lPr = (char *)malloc(MAX_PATH); | ||||
| 			char      *pR = (char *)malloc(MAX_PATH); | ||||
| 			size_t i; | ||||
| 			wcstombs_s(&i, lPr, (size_t)MAX_PATH, | ||||
| 				legacyUserAliasesPath, (size_t)MAX_PATH); | ||||
| 			wcstombs_s(&i, pR, (size_t)MAX_PATH, | ||||
| 				userAliasesPath, (size_t)MAX_PATH); | ||||
| 			rename(lPr, pR); | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	// Set path to vendored ConEmu config file | ||||
| 	PathCombine(cfgPath, exeDir, L"vendor\\conemu-maximus5\\ConEmu.xml"); | ||||
|  | ||||
| 	// Set path to Cmder default ConEmu config file | ||||
| 	PathCombine(defaultCfgPath, exeDir, L"config\\ConEmu.xml"); | ||||
| 	PathCombine(defaultCfgPath, exeDir, L"vendor\\ConEmu.xml.default"); | ||||
|  | ||||
| 	// Check for machine-specific then user config source file. | ||||
| 	PathCombine(cpuCfgPath, userConfigDirPath, L"ConEmu-%COMPUTERNAME%.xml"); | ||||
| 	ExpandEnvironmentStrings(cpuCfgPath, cpuCfgPath, sizeof(cpuCfgPath) / sizeof(cpuCfgPath[0])); | ||||
|  | ||||
| 	// Set path to Cmder user ConEmu config file | ||||
| 	PathCombine(userCfgPath, userConfigDirPath, L"user-ConEmu.xml"); | ||||
| 	if (PathFileExists(cpuCfgPath)) { | ||||
| 		if (PathFileExists(cfgPath)) { | ||||
| 			if (!CopyFile(cfgPath, cpuCfgPath, FALSE)) | ||||
|  | ||||
| 	if ( PathFileExists(cpuCfgPath) || use_user_cfg == false ) // config/ConEmu-%COMPUTERNAME%.xml file exists or /m was specified on command line, use machine specific config. | ||||
| 	{ | ||||
| 		if (cfgRoot.length() == 0) // '/c [path]' was NOT specified | ||||
| 		{ | ||||
| 			if (PathFileExists(cfgPath)) // vendor/conemu-maximus5/ConEmu.xml file exists, copy vendor/conemu-maximus5/ConEmu.xml to config/ConEmu-%COMPUTERNAME%.xml. | ||||
| 			{ | ||||
| 				MessageBox(NULL, | ||||
| 					(GetLastError() == ERROR_ACCESS_DENIED) | ||||
| 					? L"Failed to copy ConEmu.xml file to ConEmu-%COMPUTERNAME%.xml backup location! Restart Cmder as Administrator." | ||||
| 					: L"Failed to copy ConEmu.xml file to ConEmu-%COMPUTERNAME%.xml backup location!", MB_TITLE, MB_ICONSTOP); | ||||
| 				exit(1); | ||||
| 				if (!CopyFile(cfgPath, cpuCfgPath, FALSE)) | ||||
| 				{ | ||||
| 					MessageBox(NULL, | ||||
| 						(GetLastError() == ERROR_ACCESS_DENIED) | ||||
| 						? L"Failed to copy vendor/conemu-maximus5/ConEmu.xml file to config/ConEmu-%COMPUTERNAME%.xml! Access Denied." | ||||
| 						: L"Failed to copy vendor/conemu-maximus5/ConEmu.xml file to config/ConEmu-%COMPUTERNAME%.xml!", MB_TITLE, MB_ICONSTOP); | ||||
| 					exit(1); | ||||
| 				} | ||||
| 			} | ||||
| 			else // vendor/conemu-maximus5/ConEmu.xml config file does not exist, copy config/ConEmu-%COMPUTERNAME%.xml to vendor/conemu-maximus5/ConEmu.xml file | ||||
| 			{ | ||||
| 				if (!CopyFile(cpuCfgPath, cfgPath, FALSE)) | ||||
| 				{ | ||||
| 					MessageBox(NULL, | ||||
| 						(GetLastError() == ERROR_ACCESS_DENIED) | ||||
| 						? L"Failed to copy config/ConEmu-%COMPUTERNAME%.xml file to vendor/conemu-maximus5/ConEmu.xml! Access Denied." | ||||
| 						: L"Failed to copy config/ConEmu-%COMPUTERNAME%.xml file to vendor/conemu-maximus5/ConEmu.xml!", MB_TITLE, MB_ICONSTOP); | ||||
| 					exit(1); | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 		else | ||||
| 		else // '/c [path]' was specified, don't copy anything and use existing conemu-%COMPUTERNAME%.xml to start comemu. | ||||
| 		{ | ||||
| 			if (!CopyFile(cpuCfgPath, cfgPath, FALSE)) | ||||
| 			if (use_user_cfg == false && PathFileExists(cfgPath) && !PathFileExists(cpuCfgPath)) // vendor/conemu-maximus5/ConEmu.xml file exists, copy vendor/conemu-maximus5/ConEmu.xml to config/ConEmu-%COMPUTERNAME%.xml. | ||||
| 			{ | ||||
| 				MessageBox(NULL, | ||||
| 					(GetLastError() == ERROR_ACCESS_DENIED) | ||||
| 					? L"Failed to copy ConEmu-%COMPUTERNAME%.xml file to vendored ConEmu.xml location! Restart Cmder as Administrator." | ||||
| 					: L"Failed to copy ConEmu-%COMPUTERNAME%.xml file to vendored ConEmu.xml location!", MB_TITLE, MB_ICONSTOP); | ||||
| 				exit(1); | ||||
| 				if (!CopyFile(cfgPath, cpuCfgPath, FALSE)) | ||||
| 				{ | ||||
| 					MessageBox(NULL, | ||||
| 						(GetLastError() == ERROR_ACCESS_DENIED) | ||||
| 						? L"Failed to copy vendor/conemu-maximus5/ConEmu.xml file to config/ConEmu-%COMPUTERNAME%.xml! Access Denied." | ||||
| 						: L"Failed to copy vendor/conemu-maximus5/ConEmu.xml file to config/ConEmu-%COMPUTERNAME%.xml!", MB_TITLE, MB_ICONSTOP); | ||||
| 					exit(1); | ||||
| 				} | ||||
| 			} | ||||
|  | ||||
| 			PathCombine(userConEmuCfgPath, userConfigDirPath, L"ConEmu-%COMPUTERNAME%.xml"); | ||||
| 			ExpandEnvironmentStrings(userConEmuCfgPath, userConEmuCfgPath, sizeof(userConEmuCfgPath) / sizeof(userConEmuCfgPath[0])); | ||||
| 		} | ||||
| 	} | ||||
| 	else if (PathFileExists(userCfgPath)) { | ||||
| 		if (PathFileExists(cfgPath)) { | ||||
| 	else if (PathFileExists(userCfgPath)) // config/user_conemu.xml exists, use it.  | ||||
| 	{ | ||||
| 		if (cfgRoot.length() == 0) // '/c [path]' was NOT specified | ||||
| 		{ | ||||
| 			if (PathFileExists(cfgPath)) // vendor/conemu-maximus5/ConEmu.xml exists, copy vendor/conemu-maximus5/ConEmu.xml to config/user_conemu.xml. | ||||
| 			{ | ||||
| 				if (!CopyFile(cfgPath, userCfgPath, FALSE)) | ||||
| 				{ | ||||
| 					MessageBox(NULL, | ||||
| 						(GetLastError() == ERROR_ACCESS_DENIED) | ||||
| 						? L"Failed to copy vendor/conemu-maximus5/ConEmu.xml file to config/user-conemu.xml! Access Denied." | ||||
| 						: L"Failed to copy vendor/conemu-maximus5/ConEmu.xml file to config/user-conemu.xml!", MB_TITLE, MB_ICONSTOP); | ||||
| 					exit(1); | ||||
| 				} | ||||
| 			} | ||||
| 			else // vendor/conemu-maximus5/ConEmu.xml does not exist, copy config/user-conemu.xml to vendor/conemu-maximus5/ConEmu.xml | ||||
| 			{ | ||||
| 				if (!CopyFile(userCfgPath, cfgPath, FALSE)) | ||||
| 				{ | ||||
| 					MessageBox(NULL, | ||||
| 						(GetLastError() == ERROR_ACCESS_DENIED) | ||||
| 						? L"Failed to copy config/user-conemu.xml file to vendor/conemu-maximus5/ConEmu.xml! Access Denied." | ||||
| 						: L"Failed to copy config/user-conemu.xml file to vendor/conemu-maximus5/ConEmu.xml!", MB_TITLE, MB_ICONSTOP); | ||||
| 					exit(1); | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 		else // '/c [path]' was specified, don't copy anything and use existing user_conemu.xml to start comemu. | ||||
| 		{ | ||||
| 			PathCombine(userConEmuCfgPath, userConfigDirPath, L"user-ConEmu.xml"); | ||||
| 		} | ||||
| 	} | ||||
| 	else if (cfgRoot.length() == 0) // '/c [path]' was NOT specified | ||||
| 	{ | ||||
| 		if (PathFileExists(cfgPath)) // vendor/conemu-maximus5/ConEmu.xml exists, copy vendor/conemu-maximus5/ConEmu.xml to config/user_conemu.xml | ||||
| 		{ | ||||
| 			if (!CopyFile(cfgPath, userCfgPath, FALSE)) | ||||
| 			{ | ||||
| 				MessageBox(NULL, | ||||
| 					(GetLastError() == ERROR_ACCESS_DENIED) | ||||
| 					? L"Failed to copy ConEmu.xml file to backup location! Restart Cmder as Administrator." | ||||
| 					: L"Failed to copy ConEmu.xml file to backup location!", MB_TITLE, MB_ICONSTOP); | ||||
| 					? L"Failed to copy vendor/conemu-maximus5/ConEmu.xml file to config/user-conemu.xml! Access Denied." | ||||
| 					: L"Failed to copy vendor/conemu-maximus5/ConEmu.xml file to config/user-conemu.xml!", MB_TITLE, MB_ICONSTOP); | ||||
| 				exit(1); | ||||
| 			} | ||||
| 			else // vendor/ConEmu.xml.default config exists, copy Cmder vendor/ConEmu.xml.default file to vendor/conemu-maximus5/ConEmu.xml. | ||||
| 			{ | ||||
| 				if (!CopyFile(defaultCfgPath, cfgPath, FALSE)) | ||||
| 				{ | ||||
| 					MessageBox(NULL, | ||||
| 						(GetLastError() == ERROR_ACCESS_DENIED) | ||||
| 						? L"Failed to copy vendor/ConEmu.xml.default file to vendor/conemu-maximus5/ConEmu.xml! Access Denied." | ||||
| 						: L"Failed to copy vendor/ConEmu.xml.default file to vendor/conemu-maximus5/ConEmu.xml!", MB_TITLE, MB_ICONSTOP); | ||||
| 					exit(1); | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 		else | ||||
| 		{ | ||||
| 			if (!CopyFile(userCfgPath, cfgPath, FALSE)) | ||||
| 		else { | ||||
| 			if (!CopyFile(defaultCfgPath, cfgPath, FALSE)) | ||||
| 			{ | ||||
| 				MessageBox(NULL, | ||||
| 					(GetLastError() == ERROR_ACCESS_DENIED) | ||||
| 					? L"Failed to copy ConEmu.xml file to vendored ConEmu.xml location! Restart Cmder as Administrator." | ||||
| 					: L"Failed to copy ConEmu.xml file to vendored ConEmu.xml location!", MB_TITLE, MB_ICONSTOP); | ||||
| 					? L"Failed to copy vendor/ConEmu.xml.default file to vendor/conemu-maximus5/ConEmu.xml! Access Denied." | ||||
| 					: L"Failed to copy vendor/ConEmu.xml.default file to vendor/conemu-maximus5/ConEmu.xml!", MB_TITLE, MB_ICONSTOP); | ||||
| 				exit(1); | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 	else if (PathFileExists(cfgPath)) { | ||||
| 	else if (PathFileExists(cfgPath)) // vendor/conemu-maximus5/ConEmu.xml exists, copy vendor/conemu-maximus5/ConEmu.xml to config/user_conemu.xml | ||||
| 	{ | ||||
| 		if (!CopyFile(cfgPath, userCfgPath, FALSE)) | ||||
| 		{ | ||||
| 			MessageBox(NULL, | ||||
| 				(GetLastError() == ERROR_ACCESS_DENIED) | ||||
| 				? L"Failed to copy ConEmu.xml file to user-conemu.xml backup location! Restart Cmder as Administrator." | ||||
| 				: L"Failed to copy ConEmu.xml file to user-conemu.xml backup location!", MB_TITLE, MB_ICONSTOP); | ||||
| 				? L"Failed to copy vendor/conemu-maximus5/ConEmu.xml file to config/user-conemu.xml! Access Denied." | ||||
| 				: L"Failed to copy vendor/conemu-maximus5/ConEmu.xml file to config/user-conemu.xml!", MB_TITLE, MB_ICONSTOP); | ||||
| 			exit(1); | ||||
| 		} | ||||
|  | ||||
| 		PathCombine(userConEmuCfgPath, userConfigDirPath, L"user-ConEmu.xml"); | ||||
| 	} | ||||
| 	else { | ||||
| 		if (!CopyFile(defaultCfgPath, cfgPath, FALSE)) | ||||
| 	else // '/c [path]' was specified and 'vendor/ConEmu.xml.default' config exists, copy Cmder 'vendor/ConEmu.xml.default' file to '[user specified path]/config/user_ConEmu.xml'. | ||||
| 	{ | ||||
| 		if ( ! CopyFile(defaultCfgPath, userCfgPath, FALSE)) | ||||
| 		{ | ||||
| 			MessageBox(NULL, | ||||
| 				(GetLastError() == ERROR_ACCESS_DENIED) | ||||
| 				? L"Failed to copy Cmder default ConEmu.xml file to vendored ConEmu.xml location! Restart Cmder as Administrator." | ||||
| 				: L"Failed to copy Cmder default ConEmu.xml file to vendored ConEmu.xml location!", MB_TITLE, MB_ICONSTOP); | ||||
| 				? L"Failed to copy vendor/ConEmu.xml.default file to [user specified path]/config/user_ConEmu.xml! Access Denied." | ||||
| 				: L"Failed to copy vendor/ConEmu.xml.default file to [user specified path]/config/user_ConEmu.xml!", MB_TITLE, MB_ICONSTOP); | ||||
| 			exit(1); | ||||
| 		} | ||||
| 		PathCombine(userConEmuCfgPath, userConfigDirPath, L"user-ConEmu.xml"); | ||||
| 	} | ||||
|  | ||||
| 	SYSTEM_INFO sysInfo; | ||||
| 	GetNativeSystemInfo(&sysInfo); | ||||
| 	if (sysInfo.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64) { | ||||
| 	if (sysInfo.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64) | ||||
| 	{ | ||||
| 		PathCombine(conEmuPath, exeDir, L"vendor\\conemu-maximus5\\ConEmu64.exe"); | ||||
| 	} | ||||
| 	else { | ||||
| 	else | ||||
| 	{ | ||||
| 		PathCombine(conEmuPath, exeDir, L"vendor\\conemu-maximus5\\ConEmu.exe"); | ||||
| 	} | ||||
|  | ||||
| 	swprintf_s(args, L"%s /Icon \"%s\" /Title Cmder", args, icoPath); | ||||
|  | ||||
| 	if (!streqi(cmderStart.c_str(), L"")) | ||||
| 	{ | ||||
| 		swprintf_s(args, L"%s /dir \"%s\"", args, cmderStart.c_str()); | ||||
| 	} | ||||
|  | ||||
| 	if (is_single_mode) | ||||
| 	{ | ||||
| 		if (!streqi(cmderTask.c_str(), L"")) { | ||||
| 			swprintf_s(args, L"%s /single /Icon \"%s\" /Title Cmder /dir \"%s\" /run {%s}", args, icoPath, cmderStart.c_str(), cmderTask.c_str()); | ||||
| 		} | ||||
| 		else { | ||||
| 			swprintf_s(args, L"%s /single /Icon \"%s\" /Title Cmder /dir \"%s\"", args, icoPath, cmderStart.c_str()); | ||||
| 		} | ||||
| 		swprintf_s(args, L"%s /single", args); | ||||
| 	} | ||||
| 	else | ||||
|  | ||||
| 	if (!streqi(cmderTask.c_str(), L"")) | ||||
| 	{ | ||||
| 		if (!streqi(cmderTask.c_str(), L"")) { | ||||
| 			swprintf_s(args, L"/Icon \"%s\" /Title Cmder /dir \"%s\" /run {%s}", icoPath, cmderStart.c_str(), cmderTask.c_str()); | ||||
| 		} | ||||
| 		else { | ||||
| 			swprintf_s(args, L"%s /Icon \"%s\" /Title Cmder /dir \"%s\"", args, icoPath, cmderStart.c_str()); | ||||
| 		} | ||||
| 		swprintf_s(args, L"%s /run {%s}", args, cmderTask.c_str()); | ||||
| 	} | ||||
|  | ||||
| 	if (cfgRoot.length() != 0) | ||||
| 	{ | ||||
| 		swprintf_s(args, L"%s  -loadcfgfile \"%s\"", args, userConEmuCfgPath); | ||||
| 	} | ||||
|  | ||||
| 	if (!streqi(cmderConEmuArgs.c_str(), L"")) | ||||
| 	{ | ||||
| 		swprintf_s(args, L"%s %s", args, cmderConEmuArgs.c_str()); | ||||
| 	} | ||||
|  | ||||
| 	SetEnvironmentVariable(L"CMDER_ROOT", exeDir); | ||||
| @@ -355,8 +502,10 @@ HKEY GetRootKey(std::wstring opt) | ||||
| 	return root; | ||||
| } | ||||
|  | ||||
| void RegisterShellMenu(std::wstring opt, wchar_t* keyBaseName) | ||||
| void RegisterShellMenu(std::wstring opt, wchar_t* keyBaseName, std::wstring cfgRoot, bool single) | ||||
| { | ||||
| 	wchar_t userConfigDirPath[MAX_PATH] = { 0 }; | ||||
|  | ||||
| 	// First, get the paths we will use | ||||
|  | ||||
| 	wchar_t exePath[MAX_PATH] = { 0 }; | ||||
| @@ -365,7 +514,23 @@ void RegisterShellMenu(std::wstring opt, wchar_t* keyBaseName) | ||||
| 	GetModuleFileName(NULL, exePath, sizeof(exePath)); | ||||
|  | ||||
| 	wchar_t commandStr[MAX_PATH + 20] = { 0 }; | ||||
| 	swprintf_s(commandStr, L"\"%s\" \"%%V\"", exePath); | ||||
| 	wchar_t baseCommandStr[MAX_PATH + 20] = { 0 }; | ||||
| 	if (!single) { | ||||
| 		swprintf_s(baseCommandStr, L"\"%s\"", exePath); | ||||
| 	} | ||||
| 	else { | ||||
| 		swprintf_s(baseCommandStr, L"\"%s\" /single", exePath); | ||||
| 	} | ||||
|  | ||||
| 	if (cfgRoot.length() == 0) // '/c [path]' was NOT specified | ||||
| 	{ | ||||
| 		swprintf_s(commandStr, L"%s \"%%V\"", baseCommandStr); | ||||
| 	} | ||||
| 	else { | ||||
| 		std::copy(cfgRoot.begin(), cfgRoot.end(), userConfigDirPath); | ||||
| 		userConfigDirPath[cfgRoot.length()] = 0; | ||||
| 		swprintf_s(commandStr, L"%s /c \"%s\" \"%%V\"", baseCommandStr, userConfigDirPath); | ||||
| 	} | ||||
|  | ||||
| 	// Now that we have `commandStr`, it's OK to change `exePath`... | ||||
| 	PathRemoveFileSpec(exePath); | ||||
| @@ -409,8 +574,11 @@ struct cmderOptions | ||||
| 	std::wstring cmderCfgRoot = L""; | ||||
| 	std::wstring cmderStart = L""; | ||||
| 	std::wstring cmderTask = L""; | ||||
| 	std::wstring cmderIcon = L""; | ||||
| 	std::wstring cmderRegScope = L"USER"; | ||||
| 	std::wstring cmderConEmuArgs = L""; | ||||
| 	bool cmderSingle = false; | ||||
| 	bool cmderUserCfg = true; | ||||
| 	bool registerApp = false; | ||||
| 	bool unRegisterApp = false; | ||||
| 	bool error = false; | ||||
| @@ -426,82 +594,138 @@ cmderOptions GetOption() | ||||
|  | ||||
| 	for (int i = 1; i < argCount; i++) | ||||
| 	{ | ||||
|  | ||||
| 		// MessageBox(NULL, szArgList[i], L"Arglist contents", MB_OK); | ||||
|  | ||||
| 		if (_wcsicmp(L"/c", szArgList[i]) == 0) | ||||
| 		{ | ||||
| 			TCHAR userProfile[MAX_PATH]; | ||||
| 			const DWORD ret = GetEnvironmentVariable(L"USERPROFILE", userProfile, MAX_PATH); | ||||
|  | ||||
| 			wchar_t cmderCfgRoot[MAX_PATH] = { 0 }; | ||||
| 			PathCombine(cmderCfgRoot, userProfile, L"cmder_cfg"); | ||||
|  | ||||
| 			cmderOptions.cmderCfgRoot = cmderCfgRoot; | ||||
|  | ||||
| 			if (szArgList[i + 1] != NULL && szArgList[i + 1][0] != '/') { | ||||
| 				cmderOptions.cmderCfgRoot = szArgList[i + 1]; | ||||
| 				i++; | ||||
| 			} | ||||
| 		} | ||||
| 		else if (_wcsicmp(L"/start", szArgList[i]) == 0) | ||||
| 		{ | ||||
| 			if (PathFileExists(szArgList[i + 1])) | ||||
| 		if (cmderOptions.error == false) { | ||||
| 			if (_wcsicmp(L"/c", szArgList[i]) == 0) | ||||
| 			{ | ||||
| 				cmderOptions.cmderStart = szArgList[i + 1]; | ||||
| 				i++; | ||||
| 			} | ||||
| 			else { | ||||
| 				MessageBox(NULL, szArgList[i + 1], L"/START - Folder does not exist!", MB_OK); | ||||
| 			} | ||||
| 		} | ||||
| 		else if (_wcsicmp(L"/task", szArgList[i]) == 0) | ||||
| 		{ | ||||
| 			cmderOptions.cmderTask = szArgList[i + 1]; | ||||
| 			i++; | ||||
| 		} | ||||
| 		else if (_wcsicmp(L"/single", szArgList[i]) == 0) | ||||
| 		{ | ||||
| 			cmderOptions.cmderSingle = true; | ||||
| 		} | ||||
| 		else if (_wcsicmp(L"/register", szArgList[i]) == 0) | ||||
| 		{ | ||||
| 			cmderOptions.registerApp = true; | ||||
| 			cmderOptions.unRegisterApp = false; | ||||
| 			if (szArgList[i + 1] != NULL) | ||||
| 			{ | ||||
| 				if (_wcsicmp(L"all", szArgList[i + 1]) == 0 || _wcsicmp(L"user", szArgList[i + 1]) == 0) | ||||
| 				TCHAR userProfile[MAX_PATH]; | ||||
| 				const DWORD ret = GetEnvironmentVariable(L"USERPROFILE", userProfile, MAX_PATH); | ||||
|  | ||||
| 				wchar_t cmderCfgRoot[MAX_PATH] = { 0 }; | ||||
| 				PathCombine(cmderCfgRoot, userProfile, L"cmder_cfg"); | ||||
|  | ||||
| 				cmderOptions.cmderCfgRoot = cmderCfgRoot; | ||||
|  | ||||
| 				if (szArgList[i + 1] != NULL && szArgList[i + 1][0] != '/') | ||||
| 				{ | ||||
| 					cmderOptions.cmderRegScope = szArgList[i + 1]; | ||||
| 					cmderOptions.cmderCfgRoot = szArgList[i + 1]; | ||||
| 					i++; | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 		else if (_wcsicmp(L"/unregister", szArgList[i]) == 0) | ||||
| 		{ | ||||
| 			cmderOptions.unRegisterApp = true; | ||||
| 			cmderOptions.registerApp = false; | ||||
| 			if (szArgList[i + 1] != NULL) | ||||
| 			else if (_wcsicmp(L"/start", szArgList[i]) == 0) | ||||
| 			{ | ||||
| 				if (_wcsicmp(L"all", szArgList[i + 1]) == 0 || _wcsicmp(L"user", szArgList[i + 1]) == 0) | ||||
| 				int len = wcslen(szArgList[i + 1]); | ||||
| 				if (wcscmp(&szArgList[i + 1][len - 1], L"\"") == 0) | ||||
| 				{ | ||||
| 					cmderOptions.cmderRegScope = szArgList[i + 1]; | ||||
| 					szArgList[i + 1][len - 1] = '\0'; | ||||
| 				} | ||||
|  | ||||
| 				if (PathFileExists(szArgList[i + 1])) | ||||
| 				{ | ||||
| 					cmderOptions.cmderStart = szArgList[i + 1]; | ||||
| 					i++; | ||||
| 				} | ||||
| 				else | ||||
| 				{ | ||||
| 					MessageBox(NULL, szArgList[i + 1], L"/START - Folder does not exist!", MB_OK); | ||||
| 				} | ||||
| 			} | ||||
| 			else if (_wcsicmp(L"/task", szArgList[i]) == 0) | ||||
| 			{ | ||||
| 				cmderOptions.cmderTask = szArgList[i + 1]; | ||||
| 				i++; | ||||
| 			} | ||||
| 			else if (_wcsicmp(L"/icon", szArgList[i]) == 0) | ||||
| 			{ | ||||
| 				cmderOptions.cmderIcon = szArgList[i + 1]; | ||||
| 				i++; | ||||
| 			} | ||||
| 			else if (_wcsicmp(L"/single", szArgList[i]) == 0) | ||||
| 			{ | ||||
| 				cmderOptions.cmderSingle = true; | ||||
| 			} | ||||
| 			else if (_wcsicmp(L"/m", szArgList[i]) == 0) | ||||
| 			{ | ||||
| 				cmderOptions.cmderUserCfg = false; | ||||
| 			} | ||||
| 			else if (_wcsicmp(L"/register", szArgList[i]) == 0) | ||||
| 			{ | ||||
| 				cmderOptions.registerApp = true; | ||||
| 				cmderOptions.unRegisterApp = false; | ||||
| 				if (szArgList[i + 1] != NULL) | ||||
| 				{ | ||||
| 					if (_wcsicmp(L"all", szArgList[i + 1]) == 0 || _wcsicmp(L"user", szArgList[i + 1]) == 0) | ||||
| 					{ | ||||
| 						cmderOptions.cmderRegScope = szArgList[i + 1]; | ||||
| 						i++; | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 			else if (_wcsicmp(L"/unregister", szArgList[i]) == 0) | ||||
| 			{ | ||||
| 				cmderOptions.unRegisterApp = true; | ||||
| 				cmderOptions.registerApp = false; | ||||
| 				if (szArgList[i + 1] != NULL) | ||||
| 				{ | ||||
| 					if (_wcsicmp(L"all", szArgList[i + 1]) == 0 || _wcsicmp(L"user", szArgList[i + 1]) == 0) | ||||
| 					{ | ||||
| 						cmderOptions.cmderRegScope = szArgList[i + 1]; | ||||
| 						i++; | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 			/* Used for passing arguments to conemu prog */ | ||||
| 			else if (_wcsicmp(L"/x", szArgList[i]) == 0) | ||||
| 			{ | ||||
| 				cmderOptions.cmderConEmuArgs = szArgList[i + 1]; | ||||
| 				i++; | ||||
| 			} | ||||
| 			/* Bare double dash, remaining commandline is for conemu */ | ||||
| 			else if (_wcsicmp(L"--", szArgList[i]) == 0) | ||||
| 			{ | ||||
| 				std::wstring cmdline = std::wstring(GetCommandLineW()); | ||||
| 				auto doubledash = cmdline.find(L" -- "); | ||||
| 				if (doubledash != std::string::npos) | ||||
| 				{ | ||||
| 					cmderOptions.cmderConEmuArgs = cmdline.substr(doubledash + 4); | ||||
| 				} | ||||
| 				break; | ||||
| 			} | ||||
| 			else if (cmderOptions.cmderStart == L"") | ||||
| 			{ | ||||
| 				int len = wcslen(szArgList[i]); | ||||
| 				if (wcscmp(&szArgList[i][len - 1], L"\"") == 0) | ||||
| 				{ | ||||
| 					szArgList[i][len - 1] = '\0'; | ||||
| 				} | ||||
|  | ||||
| 				if (PathFileExists(szArgList[i])) | ||||
| 				{ | ||||
| 					cmderOptions.cmderStart = szArgList[i]; | ||||
| 					i++; | ||||
| 				} | ||||
| 				else | ||||
| 				{ | ||||
| 					cmderOptions.error = true; | ||||
| 				} | ||||
| 			} | ||||
| 			else | ||||
| 			{ | ||||
| 				cmderOptions.error = true; | ||||
| 			} | ||||
| 		} | ||||
| 		else if (cmderOptions.cmderStart == L"" && PathFileExists(szArgList[i])) | ||||
| 		{ | ||||
| 			cmderOptions.cmderStart = szArgList[i]; | ||||
| 		} | ||||
| 		else { | ||||
| 			wchar_t validOptions[512]; | ||||
| 			HMODULE hMod = GetModuleHandle(NULL); | ||||
| 			LoadString(hMod, IDS_SWITCHES, validOptions, 512); | ||||
|  | ||||
| 			// display list of valid options on unrecognized parameter | ||||
| 			TaskDialogOpen( L"Unrecognized parameter.", validOptions ); | ||||
| 			cmderOptions.error = true; | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| 	if (cmderOptions.error == true) | ||||
| 	{ | ||||
| 		wchar_t validOptions[512]; | ||||
| 		HMODULE hMod = GetModuleHandle(NULL); | ||||
| 		LoadString(hMod, IDS_SWITCHES, validOptions, 512); | ||||
|  | ||||
| 		// display list of valid options on unrecognized parameter | ||||
| 		TaskDialogOpen( L"Unrecognized parameter.", validOptions ); | ||||
| 	} | ||||
|  | ||||
| 	LocalFree(szArgList); | ||||
| @@ -520,14 +744,19 @@ int APIENTRY _tWinMain(_In_ HINSTANCE hInstance, | ||||
|  | ||||
| 	cmderOptions cmderOptions = GetOption(); | ||||
|  | ||||
| 	if (cmderOptions.registerApp == true) { | ||||
| 		RegisterShellMenu(cmderOptions.cmderRegScope, SHELL_MENU_REGISTRY_PATH_BACKGROUND); | ||||
| 		RegisterShellMenu(cmderOptions.cmderRegScope, SHELL_MENU_REGISTRY_PATH_LISTITEM); | ||||
| 	if (cmderOptions.registerApp == true) | ||||
| 	{ | ||||
| 		RegisterShellMenu(cmderOptions.cmderRegScope, SHELL_MENU_REGISTRY_PATH_BACKGROUND, cmderOptions.cmderCfgRoot, cmderOptions.cmderSingle); | ||||
| 		RegisterShellMenu(cmderOptions.cmderRegScope, SHELL_MENU_REGISTRY_PATH_LISTITEM, cmderOptions.cmderCfgRoot, cmderOptions.cmderSingle); | ||||
| 		RegisterShellMenu(cmderOptions.cmderRegScope, SHELL_MENU_REGISTRY_DRIVE_PATH_BACKGROUND, cmderOptions.cmderCfgRoot, cmderOptions.cmderSingle); | ||||
| 		RegisterShellMenu(cmderOptions.cmderRegScope, SHELL_MENU_REGISTRY_DRIVE_PATH_LISTITEM, cmderOptions.cmderCfgRoot, cmderOptions.cmderSingle); | ||||
| 	} | ||||
| 	else if (cmderOptions.unRegisterApp == true) | ||||
| 	{ | ||||
| 		UnregisterShellMenu(cmderOptions.cmderRegScope, SHELL_MENU_REGISTRY_PATH_BACKGROUND); | ||||
| 		UnregisterShellMenu(cmderOptions.cmderRegScope, SHELL_MENU_REGISTRY_PATH_LISTITEM); | ||||
| 		UnregisterShellMenu(cmderOptions.cmderRegScope, SHELL_MENU_REGISTRY_DRIVE_PATH_BACKGROUND); | ||||
| 		UnregisterShellMenu(cmderOptions.cmderRegScope, SHELL_MENU_REGISTRY_DRIVE_PATH_LISTITEM); | ||||
| 	} | ||||
| 	else if (cmderOptions.error == true) | ||||
| 	{ | ||||
| @@ -535,8 +764,8 @@ int APIENTRY _tWinMain(_In_ HINSTANCE hInstance, | ||||
| 	} | ||||
| 	else | ||||
| 	{ | ||||
| 		StartCmder(cmderOptions.cmderStart, cmderOptions.cmderSingle, cmderOptions.cmderTask, cmderOptions.cmderCfgRoot); | ||||
| 		StartCmder(cmderOptions.cmderStart, cmderOptions.cmderSingle, cmderOptions.cmderTask, cmderOptions.cmderIcon, cmderOptions.cmderCfgRoot, cmderOptions.cmderUserCfg, cmderOptions.cmderConEmuArgs); | ||||
| 	} | ||||
|  | ||||
| 	return 0; | ||||
| } | ||||
| } | ||||
		Reference in New Issue
	
	Block a user