|  |  |  | @ -55,23 +55,31 @@ namespace // anonymous | 
			
		
	
		
			
				
					|  |  |  |  | void Notepad_plus_Window::setStartupBgColor(COLORREF BgColor) | 
			
		
	
		
			
				
					|  |  |  |  | { | 
			
		
	
		
			
				
					|  |  |  |  | 	RECT windowClientArea; | 
			
		
	
		
			
				
					|  |  |  |  | 	/// 定义窗口的变量
 | 
			
		
	
		
			
				
					|  |  |  |  | 	///
 | 
			
		
	
		
			
				
					|  |  |  |  | 	/// 获取对应的设备来方便绘制图形
 | 
			
		
	
		
			
				
					|  |  |  |  | 	/// 该函数用于设置窗口的整体颜色
 | 
			
		
	
		
			
				
					|  |  |  |  | 	///
 | 
			
		
	
		
			
				
					|  |  |  |  | 	HDC hdc = GetDCEx(_hSelf, NULL, DCX_CACHE | DCX_LOCKWINDOWUPDATE); //lock window update flag due to PaintLocker
 | 
			
		
	
		
			
				
					|  |  |  |  | 	GetClientRect(_hSelf, &windowClientArea); | 
			
		
	
		
			
				
					|  |  |  |  | 	FillRect(hdc, &windowClientArea, CreateSolidBrush(BgColor)); | 
			
		
	
		
			
				
					|  |  |  |  | 	ReleaseDC(_hSelf, hdc); | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | void Notepad_plus_Window::init(HINSTANCE hInst, HWND parent, const TCHAR *cmdLine, CmdLineParams *cmdLineParams) | 
			
		
	
		
			
				
					|  |  |  |  | void Notepad_plus_Window::init(HINSTANCE hInst, HWND parent, const TCHAR* cmdLine, CmdLineParams* cmdLineParams) | 
			
		
	
		
			
				
					|  |  |  |  | { | 
			
		
	
		
			
				
					|  |  |  |  | 	/// 该函数用于在最初的时候初始化窗口变量,
 | 
			
		
	
		
			
				
					|  |  |  |  | 	/// 建立窗口变量
 | 
			
		
	
		
			
				
					|  |  |  |  | 	// 初始化时间戳
 | 
			
		
	
		
			
				
					|  |  |  |  | 	time_t timestampBegin = 0; | 
			
		
	
		
			
				
					|  |  |  |  | 	if (cmdLineParams->_showLoadingTime) | 
			
		
	
		
			
				
					|  |  |  |  | 		timestampBegin = time(NULL); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	// 初始化窗口
 | 
			
		
	
		
			
				
					|  |  |  |  | 	Window::init(hInst, parent); | 
			
		
	
		
			
				
					|  |  |  |  | 	WNDCLASS nppClass{}; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	// 设置窗口类属性
 | 
			
		
	
		
			
				
					|  |  |  |  | 	nppClass.style = CS_BYTEALIGNWINDOW | CS_DBLCLKS; | 
			
		
	
		
			
				
					|  |  |  |  | 	nppClass.lpfnWndProc = Notepad_plus_Proc; | 
			
		
	
		
			
				
					|  |  |  |  | 	nppClass.cbClsExtra = 0; | 
			
		
	
	
		
			
				
					|  |  |  | @ -85,49 +93,56 @@ void Notepad_plus_Window::init(HINSTANCE hInst, HWND parent, const TCHAR *cmdLin | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	_isPrelaunch = cmdLineParams->_isPreLaunch; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	// 注册窗口类
 | 
			
		
	
		
			
				
					|  |  |  |  | 	if (!::RegisterClass(&nppClass)) | 
			
		
	
		
			
				
					|  |  |  |  | 	{ | 
			
		
	
		
			
				
					|  |  |  |  | 		throw std::runtime_error("Notepad_plus_Window::init : RegisterClass() function failed"); | 
			
		
	
		
			
				
					|  |  |  |  | 	} | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	// 获取 Notepad++ 参数实例
 | 
			
		
	
		
			
				
					|  |  |  |  | 	NppParameters& nppParams = NppParameters::getInstance(); | 
			
		
	
		
			
				
					|  |  |  |  | 	NppGUI & nppGUI = nppParams.getNppGUI(); | 
			
		
	
		
			
				
					|  |  |  |  | 	NppGUI& nppGUI = nppParams.getNppGUI(); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	// 根据命令行参数禁用插件
 | 
			
		
	
		
			
				
					|  |  |  |  | 	if (cmdLineParams->_isNoPlugin) | 
			
		
	
		
			
				
					|  |  |  |  | 		_notepad_plus_plus_core._pluginsManager.disable(); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	// 设置命令行参数的会话状态
 | 
			
		
	
		
			
				
					|  |  |  |  | 	nppGUI._isCmdlineNosessionActivated = cmdLineParams->_isNoSession; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	// 加载图标
 | 
			
		
	
		
			
				
					|  |  |  |  | 	_hIconAbsent = ::LoadIcon(hInst, MAKEINTRESOURCE(IDI_ICONABSENT)); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	// 创建窗口
 | 
			
		
	
		
			
				
					|  |  |  |  | 	_hSelf = ::CreateWindowEx( | 
			
		
	
		
			
				
					|  |  |  |  | 		WS_EX_ACCEPTFILES | (_notepad_plus_plus_core._nativeLangSpeaker.isRTL() ? WS_EX_LAYOUTRTL : 0), | 
			
		
	
		
			
				
					|  |  |  |  | 		_className, | 
			
		
	
		
			
				
					|  |  |  |  | 		TEXT("Notepad++"), | 
			
		
	
		
			
				
					|  |  |  |  | 		(WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN), | 
			
		
	
		
			
				
					|  |  |  |  | 		// CreateWindowEx bug : set all 0 to walk around the pb
 | 
			
		
	
		
			
				
					|  |  |  |  | 		0, 0, 0, 0, | 
			
		
	
		
			
				
					|  |  |  |  | 		_hParent, nullptr, _hInst, | 
			
		
	
		
			
				
					|  |  |  |  | 		(LPVOID) this); // pass the ptr of this instantiated object
 | 
			
		
	
		
			
				
					|  |  |  |  |         // for retrieve it in Notepad_plus_Proc from
 | 
			
		
	
		
			
				
					|  |  |  |  |         // the CREATESTRUCT.lpCreateParams afterward.
 | 
			
		
	
		
			
				
					|  |  |  |  | 		(LPVOID)this); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	if (NULL == _hSelf) | 
			
		
	
		
			
				
					|  |  |  |  | 		throw std::runtime_error("Notepad_plus_Window::init : CreateWindowEx() function return null"); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	// 锁定绘制
 | 
			
		
	
		
			
				
					|  |  |  |  | 	PaintLocker paintLocker{ _hSelf }; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	PaintLocker paintLocker{_hSelf}; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	// 静态检查菜单和工具栏
 | 
			
		
	
		
			
				
					|  |  |  |  | 	_notepad_plus_plus_core.staticCheckMenuAndTB(); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	// 设置全局窗口句柄
 | 
			
		
	
		
			
				
					|  |  |  |  | 	gNppHWND = _hSelf; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	// 移动窗口位置或设置默认位置
 | 
			
		
	
		
			
				
					|  |  |  |  | 	if (cmdLineParams->isPointValid()) | 
			
		
	
		
			
				
					|  |  |  |  | 	{ | 
			
		
	
		
			
				
					|  |  |  |  | 		::MoveWindow(_hSelf, cmdLineParams->_point.x, cmdLineParams->_point.y, nppGUI._appPos.right, nppGUI._appPos.bottom, TRUE); | 
			
		
	
		
			
				
					|  |  |  |  | 	} | 
			
		
	
		
			
				
					|  |  |  |  | 	else | 
			
		
	
		
			
				
					|  |  |  |  | 	{ | 
			
		
	
		
			
				
					|  |  |  |  | 		// 设置窗口位置信息
 | 
			
		
	
		
			
				
					|  |  |  |  | 		WINDOWPLACEMENT posInfo{}; | 
			
		
	
		
			
				
					|  |  |  |  | 		posInfo.length = sizeof(WINDOWPLACEMENT); | 
			
		
	
		
			
				
					|  |  |  |  | 		posInfo.flags = 0; | 
			
		
	
	
		
			
				
					|  |  |  | @ -136,6 +151,7 @@ void Notepad_plus_Window::init(HINSTANCE hInst, HWND parent, const TCHAR *cmdLin | 
			
		
	
		
			
				
					|  |  |  |  | 		else | 
			
		
	
		
			
				
					|  |  |  |  | 			posInfo.showCmd = nppGUI._isMaximized ? SW_SHOWMAXIMIZED : SW_SHOWNORMAL; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 		// 设置窗口位置
 | 
			
		
	
		
			
				
					|  |  |  |  | 		posInfo.ptMinPosition.x = (LONG)-1; | 
			
		
	
		
			
				
					|  |  |  |  | 		posInfo.ptMinPosition.y = (LONG)-1; | 
			
		
	
		
			
				
					|  |  |  |  | 		posInfo.ptMaxPosition.x = (LONG)-1; | 
			
		
	
	
		
			
				
					|  |  |  | @ -145,36 +161,43 @@ void Notepad_plus_Window::init(HINSTANCE hInst, HWND parent, const TCHAR *cmdLin | 
			
		
	
		
			
				
					|  |  |  |  | 		posInfo.rcNormalPosition.bottom = nppGUI._appPos.top + nppGUI._appPos.bottom; | 
			
		
	
		
			
				
					|  |  |  |  | 		posInfo.rcNormalPosition.right = nppGUI._appPos.left + nppGUI._appPos.right; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 		//SetWindowPlacement will take care of situations, where saved position was in no longer available monitor
 | 
			
		
	
		
			
				
					|  |  |  |  | 		::SetWindowPlacement(_hSelf,&posInfo); | 
			
		
	
		
			
				
					|  |  |  |  | 		// 设置窗口位置
 | 
			
		
	
		
			
				
					|  |  |  |  | 		::SetWindowPlacement(_hSelf, &posInfo); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 		// 绘制暗色背景
 | 
			
		
	
		
			
				
					|  |  |  |  | 		if (NppDarkMode::isEnabled()) | 
			
		
	
		
			
				
					|  |  |  |  | 			setStartupBgColor(NppDarkMode::getBackgroundColor()); //draw dark background when opening Npp without position data
 | 
			
		
	
		
			
				
					|  |  |  |  | 			setStartupBgColor(NppDarkMode::getBackgroundColor()); | 
			
		
	
		
			
				
					|  |  |  |  | 	} | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	// 处理选项卡显示模式
 | 
			
		
	
		
			
				
					|  |  |  |  | 	if ((nppGUI._tabStatus & TAB_MULTILINE) != 0) | 
			
		
	
		
			
				
					|  |  |  |  | 		::SendMessage(_hSelf, WM_COMMAND, IDM_VIEW_DRAWTABBAR_MULTILINE, 0); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	// 隐藏/显示菜单栏
 | 
			
		
	
		
			
				
					|  |  |  |  | 	if (!nppGUI._menuBarShow) | 
			
		
	
		
			
				
					|  |  |  |  | 		::SetMenu(_hSelf, NULL); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	// 隐藏选项卡栏
 | 
			
		
	
		
			
				
					|  |  |  |  | 	if (cmdLineParams->_isNoTab || (nppGUI._tabStatus & TAB_HIDE)) | 
			
		
	
		
			
				
					|  |  |  |  | 	{ | 
			
		
	
		
			
				
					|  |  |  |  | 		const int tabStatusOld = nppGUI._tabStatus; | 
			
		
	
		
			
				
					|  |  |  |  | 		::SendMessage(_hSelf, NPPM_HIDETABBAR, 0, TRUE); | 
			
		
	
		
			
				
					|  |  |  |  | 		if (cmdLineParams->_isNoTab) | 
			
		
	
		
			
				
					|  |  |  |  | 		{ | 
			
		
	
		
			
				
					|  |  |  |  | 			// Restore old settings when tab bar has been hidden from tab bar.
 | 
			
		
	
		
			
				
					|  |  |  |  | 			// 从选项卡栏隐藏后恢复旧设置
 | 
			
		
	
		
			
				
					|  |  |  |  | 			nppGUI._tabStatus = tabStatusOld; | 
			
		
	
		
			
				
					|  |  |  |  | 		} | 
			
		
	
		
			
				
					|  |  |  |  | 	} | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	// 设置窗口置顶
 | 
			
		
	
		
			
				
					|  |  |  |  | 	if (cmdLineParams->_alwaysOnTop) | 
			
		
	
		
			
				
					|  |  |  |  | 		::SendMessage(_hSelf, WM_COMMAND, IDM_VIEW_ALWAYSONTOP, 0); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	// 加载上次会话
 | 
			
		
	
		
			
				
					|  |  |  |  | 	if (nppGUI._rememberLastSession && !nppGUI._isCmdlineNosessionActivated) | 
			
		
	
		
			
				
					|  |  |  |  | 		_notepad_plus_plus_core.loadLastSession(); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	// 导出功能列表或打印并退出
 | 
			
		
	
		
			
				
					|  |  |  |  | 	if (nppParams.doFunctionListExport() || nppParams.doPrintAndExit()) | 
			
		
	
		
			
				
					|  |  |  |  | 	{ | 
			
		
	
		
			
				
					|  |  |  |  | 		::ShowWindow(_hSelf, SW_HIDE); | 
			
		
	
	
		
			
				
					|  |  |  | @ -188,58 +211,53 @@ void Notepad_plus_Window::init(HINSTANCE hInst, HWND parent, const TCHAR *cmdLin | 
			
		
	
		
			
				
					|  |  |  |  | 	} | 
			
		
	
		
			
				
					|  |  |  |  | 	else | 
			
		
	
		
			
				
					|  |  |  |  | 	{ | 
			
		
	
		
			
				
					|  |  |  |  | 		// 加载托盘图标
 | 
			
		
	
		
			
				
					|  |  |  |  | 		HICON icon = nullptr; | 
			
		
	
		
			
				
					|  |  |  |  | 		loadTrayIcon(_hInst, &icon); | 
			
		
	
		
			
				
					|  |  |  |  | 		_notepad_plus_plus_core._pTrayIco = new trayIconControler(_hSelf, IDI_M30ICON, NPPM_INTERNAL_MINIMIZED_TRAY, icon, TEXT("")); | 
			
		
	
		
			
				
					|  |  |  |  | 		_notepad_plus_plus_core._pTrayIco->doTrayIcon(ADD); | 
			
		
	
		
			
				
					|  |  |  |  | 	} | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	if(cmdLineParams->isPointValid() && NppDarkMode::isEnabled()) | 
			
		
	
		
			
				
					|  |  |  |  | 		setStartupBgColor(NppDarkMode::getBackgroundColor()); //draw dark background when opening Npp through cmd with position data
 | 
			
		
	
		
			
				
					|  |  |  |  | 	// 根据命令行参数和暗黑模式设置启动背景颜色
 | 
			
		
	
		
			
				
					|  |  |  |  | 	if (cmdLineParams->isPointValid() && NppDarkMode::isEnabled()) | 
			
		
	
		
			
				
					|  |  |  |  | 		setStartupBgColor(NppDarkMode::getBackgroundColor()); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	// 加载本地化文件
 | 
			
		
	
		
			
				
					|  |  |  |  | 	std::vector<generic_string> fileNames; | 
			
		
	
		
			
				
					|  |  |  |  | 	std::vector<generic_string> patterns; | 
			
		
	
		
			
				
					|  |  |  |  | 	patterns.push_back(TEXT("*.xml")); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	generic_string nppDir = nppParams.getNppPath(); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	LocalizationSwitcher & localizationSwitcher = nppParams.getLocalizationSwitcher(); | 
			
		
	
		
			
				
					|  |  |  |  | 	LocalizationSwitcher& localizationSwitcher = nppParams.getLocalizationSwitcher(); | 
			
		
	
		
			
				
					|  |  |  |  | 	std::wstring localizationDir = nppDir; | 
			
		
	
		
			
				
					|  |  |  |  | 	pathAppend(localizationDir, TEXT("localization\\")); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	_notepad_plus_plus_core.getMatchedFileNames(localizationDir.c_str(), 0, patterns, fileNames, false, false); | 
			
		
	
		
			
				
					|  |  |  |  | 	for (size_t i = 0, len = fileNames.size(); i < len; ++i) | 
			
		
	
		
			
				
					|  |  |  |  | 		localizationSwitcher.addLanguageFromXml(fileNames[i]); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	// 加载主题文件
 | 
			
		
	
		
			
				
					|  |  |  |  | 	fileNames.clear(); | 
			
		
	
		
			
				
					|  |  |  |  | 	ThemeSwitcher & themeSwitcher = nppParams.getThemeSwitcher(); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	//  Get themes from both npp install themes dir and app data themes dir with the per user
 | 
			
		
	
		
			
				
					|  |  |  |  | 	//  overriding default themes of the same name.
 | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	ThemeSwitcher& themeSwitcher = nppParams.getThemeSwitcher(); | 
			
		
	
		
			
				
					|  |  |  |  | 	// 获取应用数据主题目录
 | 
			
		
	
		
			
				
					|  |  |  |  | 	generic_string appDataThemeDir = nppParams.isCloud() ? nppParams.getUserPath() : nppParams.getAppDataNppDir(); | 
			
		
	
		
			
				
					|  |  |  |  | 	if (!appDataThemeDir.empty()) | 
			
		
	
		
			
				
					|  |  |  |  | 	{ | 
			
		
	
		
			
				
					|  |  |  |  | 		pathAppend(appDataThemeDir, TEXT("themes\\")); | 
			
		
	
		
			
				
					|  |  |  |  | 		_notepad_plus_plus_core.getMatchedFileNames(appDataThemeDir.c_str(), 0, patterns, fileNames, false, false); | 
			
		
	
		
			
				
					|  |  |  |  | 		for (size_t i = 0, len = fileNames.size() ; i < len ; ++i) | 
			
		
	
		
			
				
					|  |  |  |  | 		for (size_t i = 0, len = fileNames.size(); i < len; ++i) | 
			
		
	
		
			
				
					|  |  |  |  | 		{ | 
			
		
	
		
			
				
					|  |  |  |  | 			themeSwitcher.addThemeFromXml(fileNames[i]); | 
			
		
	
		
			
				
					|  |  |  |  | 		} | 
			
		
	
		
			
				
					|  |  |  |  | 	} | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	// 加载主题文件
 | 
			
		
	
		
			
				
					|  |  |  |  | 	fileNames.clear(); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	generic_string nppThemeDir = nppDir.c_str(); // <- should use the pointer to avoid the constructor of copy
 | 
			
		
	
		
			
				
					|  |  |  |  | 	generic_string nppThemeDir = nppDir.c_str(); | 
			
		
	
		
			
				
					|  |  |  |  | 	pathAppend(nppThemeDir, TEXT("themes\\")); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	// Set theme directory to their installation directory
 | 
			
		
	
		
			
				
					|  |  |  |  | 	themeSwitcher.setThemeDirPath(nppThemeDir); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	_notepad_plus_plus_core.getMatchedFileNames(nppThemeDir.c_str(), 0, patterns, fileNames, false, false); | 
			
		
	
		
			
				
					|  |  |  |  | 	for (size_t i = 0, len = fileNames.size(); i < len ; ++i) | 
			
		
	
		
			
				
					|  |  |  |  | 	for (size_t i = 0, len = fileNames.size(); i < len; ++i) | 
			
		
	
		
			
				
					|  |  |  |  | 	{ | 
			
		
	
		
			
				
					|  |  |  |  | 		generic_string themeName( themeSwitcher.getThemeFromXmlFileName(fileNames[i].c_str()) ); | 
			
		
	
		
			
				
					|  |  |  |  | 		generic_string themeName(themeSwitcher.getThemeFromXmlFileName(fileNames[i].c_str())); | 
			
		
	
		
			
				
					|  |  |  |  | 		if (!themeSwitcher.themeNameExists(themeName.c_str())) | 
			
		
	
		
			
				
					|  |  |  |  | 		{ | 
			
		
	
		
			
				
					|  |  |  |  | 			themeSwitcher.addThemeFromXml(fileNames[i]); | 
			
		
	
	
		
			
				
					|  |  |  | @ -247,7 +265,6 @@ void Notepad_plus_Window::init(HINSTANCE hInst, HWND parent, const TCHAR *cmdLin | 
			
		
	
		
			
				
					|  |  |  |  | 			if (!appDataThemeDir.empty()) | 
			
		
	
		
			
				
					|  |  |  |  | 			{ | 
			
		
	
		
			
				
					|  |  |  |  | 				generic_string appDataThemePath = appDataThemeDir; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 				if (!::PathFileExists(appDataThemePath.c_str())) | 
			
		
	
		
			
				
					|  |  |  |  | 				{ | 
			
		
	
		
			
				
					|  |  |  |  | 					::CreateDirectory(appDataThemePath.c_str(), NULL); | 
			
		
	
	
		
			
				
					|  |  |  | @ -260,6 +277,7 @@ void Notepad_plus_Window::init(HINSTANCE hInst, HWND parent, const TCHAR *cmdLin | 
			
		
	
		
			
				
					|  |  |  |  | 		} | 
			
		
	
		
			
				
					|  |  |  |  | 	} | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	// 根据暗黑模式设置主题
 | 
			
		
	
		
			
				
					|  |  |  |  | 	if (NppDarkMode::isWindowsModeEnabled()) | 
			
		
	
		
			
				
					|  |  |  |  | 	{ | 
			
		
	
		
			
				
					|  |  |  |  | 		generic_string themePath; | 
			
		
	
	
		
			
				
					|  |  |  | @ -293,36 +311,44 @@ void Notepad_plus_Window::init(HINSTANCE hInst, HWND parent, const TCHAR *cmdLin | 
			
		
	
		
			
				
					|  |  |  |  | 		} | 
			
		
	
		
			
				
					|  |  |  |  | 	} | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	// Restore all dockable panels from the last session
 | 
			
		
	
		
			
				
					|  |  |  |  | 	for (size_t i = 0, len = _notepad_plus_plus_core._internalFuncIDs.size() ; i < len ; ++i) | 
			
		
	
		
			
				
					|  |  |  |  | 	// 恢复上次会话的情况
 | 
			
		
	
		
			
				
					|  |  |  |  | 	for (size_t i = 0, len = _notepad_plus_plus_core._internalFuncIDs.size(); i < len; ++i) | 
			
		
	
		
			
				
					|  |  |  |  | 		::SendMessage(_hSelf, WM_COMMAND, _notepad_plus_plus_core._internalFuncIDs[i], 0); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	// 加载命令行参数中的文件
 | 
			
		
	
		
			
				
					|  |  |  |  | 	std::vector<generic_string> fns; | 
			
		
	
		
			
				
					|  |  |  |  | 	if (cmdLine) | 
			
		
	
		
			
				
					|  |  |  |  | 		fns = _notepad_plus_plus_core.loadCommandlineParams(cmdLine, cmdLineParams); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	// Launch folder as workspace after all this dockable panel being restored from the last session
 | 
			
		
	
		
			
				
					|  |  |  |  | 	// To avoid dockable panel toggle problem.
 | 
			
		
	
		
			
				
					|  |  |  |  | 	if (cmdLineParams->_openFoldersAsWorkspace) | 
			
		
	
		
			
				
					|  |  |  |  | 	bool isSnapshotMode = nppGUI.isSnapshotMode(); | 
			
		
	
		
			
				
					|  |  |  |  | 	if (isSnapshotMode) | 
			
		
	
		
			
				
					|  |  |  |  | 	{ | 
			
		
	
		
			
				
					|  |  |  |  | 		generic_string emptyStr; | 
			
		
	
		
			
				
					|  |  |  |  | 		_notepad_plus_plus_core.launchFileBrowser(fns, emptyStr, true); | 
			
		
	
		
			
				
					|  |  |  |  | 		_notepad_plus_plus_core.checkModifiedDocument(false); | 
			
		
	
		
			
				
					|  |  |  |  | 		_notepad_plus_plus_core.launchDocumentBackupTask(); | 
			
		
	
		
			
				
					|  |  |  |  | 	} | 
			
		
	
		
			
				
					|  |  |  |  | 	::SendMessage(_hSelf, WM_ACTIVATE, WA_ACTIVE, 0); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	::SendMessage(_hSelf, NPPM_INTERNAL_CRLFFORMCHANGED, 0, 0); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	::SendMessage(_hSelf, NPPM_INTERNAL_NPCFORMCHANGED, 0, 0); | 
			
		
	
		
			
				
					|  |  |  |  | 	// 设置单词字符和 NPC
 | 
			
		
	
		
			
				
					|  |  |  |  | 	::SendMessage(_hSelf, NPPM_INTERNAL_SETWORDCHARS, 0, 0); | 
			
		
	
		
			
				
					|  |  |  |  | 	::SendMessage(_hSelf, NPPM_INTERNAL_SETNPC, 0, 0); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	::SendMessage(_hSelf, NPPM_INTERNAL_ENABLECHANGEHISTORY, 0, 0); | 
			
		
	
		
			
				
					|  |  |  |  | 	// 导出功能列表
 | 
			
		
	
		
			
				
					|  |  |  |  | 	if (nppParams.doFunctionListExport()) | 
			
		
	
		
			
				
					|  |  |  |  | 		::SendMessage(_hSelf, NPPM_INTERNAL_EXPORTFUNCLISTANDQUIT, 0, 0); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	// 打印
 | 
			
		
	
		
			
				
					|  |  |  |  | 	if (nppParams.doPrintAndExit()) | 
			
		
	
		
			
				
					|  |  |  |  | 		::SendMessage(_hSelf, NPPM_INTERNAL_PRNTANDQUIT, 0, 0); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	if (nppGUI._newDocDefaultSettings._addNewDocumentOnStartup && nppGUI._rememberLastSession) | 
			
		
	
		
			
				
					|  |  |  |  | 	// 计算加载时间并显示消息框
 | 
			
		
	
		
			
				
					|  |  |  |  | 	if (cmdLineParams->_showLoadingTime) | 
			
		
	
		
			
				
					|  |  |  |  | 	{ | 
			
		
	
		
			
				
					|  |  |  |  | 		::SendMessage(_hSelf, WM_COMMAND, IDM_FILE_NEW, 0); | 
			
		
	
		
			
				
					|  |  |  |  | 		time_t timestampEnd = time(NULL); | 
			
		
	
		
			
				
					|  |  |  |  | 		double loadTime = difftime(timestampEnd, timestampBegin); | 
			
		
	
		
			
				
					|  |  |  |  | 		char dest[256]; | 
			
		
	
		
			
				
					|  |  |  |  | 		sprintf(dest, "Loading time : %.0lf seconds", loadTime); | 
			
		
	
		
			
				
					|  |  |  |  | 		::MessageBoxA(NULL, dest, "", MB_OK); | 
			
		
	
		
			
				
					|  |  |  |  | 	} | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	// Notify plugins that Notepad++ is ready
 | 
			
		
	
		
			
				
					|  |  |  |  | 	SCNotification scnN{}; | 
			
		
	
		
			
				
					|  |  |  |  | 	scnN.nmhdr.code = NPPN_READY; | 
			
		
	
		
			
				
					|  |  |  |  | 	scnN.nmhdr.hwndFrom = _hSelf; | 
			
		
	
	
		
			
				
					|  |  |  | @ -353,10 +379,9 @@ void Notepad_plus_Window::init(HINSTANCE hInst, HWND parent, const TCHAR *cmdLin | 
			
		
	
		
			
				
					|  |  |  |  | 				_quoteParams._speed = QuoteParams::rapid; | 
			
		
	
		
			
				
					|  |  |  |  | 			else if (cmdLineParams->_ghostTypingSpeed == 3) | 
			
		
	
		
			
				
					|  |  |  |  | 				_quoteParams._speed = QuoteParams::speedOfLight; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 			_notepad_plus_plus_core.showQuote(&_quoteParams); | 
			
		
	
		
			
				
					|  |  |  |  | 		} | 
			
		
	
		
			
				
					|  |  |  |  | 		else if (cmdLineParams->_quoteType == 2) // content drom file
 | 
			
		
	
		
			
				
					|  |  |  |  | 		else if (cmdLineParams->_quoteType == 2) // content from file
 | 
			
		
	
		
			
				
					|  |  |  |  | 		{ | 
			
		
	
		
			
				
					|  |  |  |  | 			if (::PathFileExists(cmdLineParams->_easterEggName.c_str())) | 
			
		
	
		
			
				
					|  |  |  |  | 			{ | 
			
		
	
	
		
			
				
					|  |  |  | @ -376,43 +401,18 @@ void Notepad_plus_Window::init(HINSTANCE hInst, HWND parent, const TCHAR *cmdLin | 
			
		
	
		
			
				
					|  |  |  |  | 						_quoteParams._speed = QuoteParams::rapid; | 
			
		
	
		
			
				
					|  |  |  |  | 					else if (cmdLineParams->_ghostTypingSpeed == 3) | 
			
		
	
		
			
				
					|  |  |  |  | 						_quoteParams._speed = QuoteParams::speedOfLight; | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 					_notepad_plus_plus_core.showQuote(&_quoteParams); | 
			
		
	
		
			
				
					|  |  |  |  | 				} | 
			
		
	
		
			
				
					|  |  |  |  | 			} | 
			
		
	
		
			
				
					|  |  |  |  | 		} | 
			
		
	
		
			
				
					|  |  |  |  | 	} | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	if (cmdLineParams->_showLoadingTime) | 
			
		
	
		
			
				
					|  |  |  |  | 	{ | 
			
		
	
		
			
				
					|  |  |  |  | 		time_t timestampEnd = time(NULL); | 
			
		
	
		
			
				
					|  |  |  |  | 		double loadTime = difftime(timestampEnd, timestampBegin); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 		char dest[256]; | 
			
		
	
		
			
				
					|  |  |  |  | 		sprintf(dest, "Loading time : %.0lf seconds", loadTime); | 
			
		
	
		
			
				
					|  |  |  |  | 		::MessageBoxA(NULL, dest, "", MB_OK); | 
			
		
	
		
			
				
					|  |  |  |  | 	} | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	bool isSnapshotMode = nppGUI.isSnapshotMode(); | 
			
		
	
		
			
				
					|  |  |  |  | 	if (isSnapshotMode) | 
			
		
	
		
			
				
					|  |  |  |  | 	{ | 
			
		
	
		
			
				
					|  |  |  |  | 		_notepad_plus_plus_core.checkModifiedDocument(false); | 
			
		
	
		
			
				
					|  |  |  |  | 		// Lauch backup task
 | 
			
		
	
		
			
				
					|  |  |  |  | 		_notepad_plus_plus_core.launchDocumentBackupTask(); | 
			
		
	
		
			
				
					|  |  |  |  | 	} | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	// Make this call later to take effect
 | 
			
		
	
		
			
				
					|  |  |  |  | 	::SendMessage(_hSelf, NPPM_INTERNAL_SETWORDCHARS, 0, 0); | 
			
		
	
		
			
				
					|  |  |  |  | 	::SendMessage(_hSelf, NPPM_INTERNAL_SETNPC, 0, 0); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	if (nppParams.doFunctionListExport()) | 
			
		
	
		
			
				
					|  |  |  |  | 		::SendMessage(_hSelf, NPPM_INTERNAL_EXPORTFUNCLISTANDQUIT, 0, 0); | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 	if (nppParams.doPrintAndExit()) | 
			
		
	
		
			
				
					|  |  |  |  | 		::SendMessage(_hSelf, NPPM_INTERNAL_PRNTANDQUIT, 0, 0); | 
			
		
	
		
			
				
					|  |  |  |  | } | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | 
 | 
			
		
	
		
			
				
					|  |  |  |  | /// <summary>
 | 
			
		
	
		
			
				
					|  |  |  |  | /// 用于检查MSG类型的变量msg是否是一种特定的消息
 | 
			
		
	
		
			
				
					|  |  |  |  | /// </summary>
 | 
			
		
	
		
			
				
					|  |  |  |  | /// <param name="msg"></param>
 | 
			
		
	
		
			
				
					|  |  |  |  | /// <returns></returns>
 | 
			
		
	
		
			
				
					|  |  |  |  | bool Notepad_plus_Window::isDlgsMsg(MSG *msg) const | 
			
		
	
		
			
				
					|  |  |  |  | { | 
			
		
	
		
			
				
					|  |  |  |  | 	for (size_t i = 0, len = _notepad_plus_plus_core._hModelessDlgs.size(); i < len; ++i) | 
			
		
	
	
		
			
				
					|  |  |  | 
 |