#include "toonz/screensavermaker.h" #include "texception.h" #include "tsystem.h" #include #ifdef _MSC_VER #pragma warning(disable : 4996) #endif #ifdef _WIN32 #include #include //#include #include #include #include #include void makeScreenSaver(TFilePath scrFn, TFilePath swfFn, std::string screenSaverName) { struct _stat results; if (_wstat(swfFn.getWideString().c_str(), &results) != 0) throw TException(L"Can't stat file " + swfFn.getWideString()); int swfSize = results.st_size; std::unique_ptr swf(new char[swfSize]); FILE *chan = _wfopen(swfFn.getWideString().c_str(), L"rb"); if (!chan) throw TException(L"fopen failed on " + swfFn.getWideString()); fread(swf.get(), swfSize, 1, chan); fclose(chan); TFilePath svscrn = TSystem::getBinDir() + "screensaver.dat"; if (!TFileStatus(svscrn).doesExist()) { throw TException(std::wstring(L"Screensaver template not found: ") + svscrn.getWideString()); } TSystem::copyFile(scrFn, svscrn); HANDLE hUpdateRes = BeginUpdateResourceW(scrFn.getWideString().c_str(), FALSE); if (hUpdateRes == NULL) throw TException(L"can't write " + scrFn.getWideString()); BOOL result = UpdateResource(hUpdateRes, "FLASHFILE", MAKEINTRESOURCE(101), MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL), swf.get(), swfSize); if (result == FALSE) throw TException(L"can't add resource to " + scrFn.getWideString()); /* result = UpdateResource( hUpdateRes, RT_STRING, MAKEINTRESOURCE(1), MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL), (void*)screenSaverName.c_str(), screenSaverName.size()); if (result == FALSE) throw TException(L"can't add name to "+scrFn.getWideString()); */ if (!EndUpdateResource(hUpdateRes, FALSE)) throw TException(L"Couldn't write " + scrFn.getWideString()); } void previewScreenSaver(TFilePath scr) { try { TSystem::showDocument(scr); } catch (...) { } } void installScreenSaver(TFilePath scr) { std::wstring cmd = L"desk.cpl,InstallScreenSaver " + scr.getWideString(); int ret = (int)ShellExecuteW(0, L"open", L"rundll32.exe", cmd.c_str(), 0, SW_SHOWNORMAL); if (ret <= 32) throw; } #else void makeScreenSaver(TFilePath scrFn, TFilePath swfFn, std::string screenSaverName) {} /* void previewScreenSaver(TFilePath scr) { } */ void installScreenSaver(TFilePath scr) {} #endif