diff --git a/include/lgi/win/LgiOsDefs.h b/include/lgi/win/LgiOsDefs.h --- a/include/lgi/win/LgiOsDefs.h +++ b/include/lgi/win/LgiOsDefs.h @@ -1,307 +1,308 @@ // // FILE: LgiOsDefs.h (Win32) // AUTHOR: Matthew Allen // DATE: 24/9/99 // DESCRIPTION: Lgi Win32 OS defines // // Copyright (C) 1999, Matthew Allen // fret@memecode.com // #pragma once #pragma warning(disable : 4251 4275) #define WIN32GTK 0 #define WINNATIVE 1 #define LGI_VIEW_HANDLE 1 #define LGI_VIEW_HASH 0 #ifndef WINDOWS #error "Define WINDOWS in your project" #endif #ifdef _WIN64 #define LGI_64BIT 1 #ifndef WIN64 #define WIN64 1 #endif #else #define LGI_32BIT 1 #ifndef WIN32 #define WIN32 1 #endif #endif #include #include #include "lgi/common/LgiInc.h" #include "lgi/common/LgiDefs.h" +#define _MSC_VER_VS2022 1930 // MSVC++ 17.0 (really all 193x values) #define _MSC_VER_VS2019 1920 // MSVC++ 16.0 (really all 192x values) #define _MSC_VER_VS2017 1910 // MSVC++ 15.0 #define _MSC_VER_VS2015 1900 // MSVC++ 14.0 #define _MSC_VER_VS2013 1800 // MSVC++ 12.0 #define _MSC_VER_VS2012 1700 // MSVC++ 11.0 #define _MSC_VER_VS2010 1600 // MSVC++ 10.0 #define _MSC_VER_VS2008 1500 // MSVC++ 9.0 #define _MSC_VER_VS2005 1400 // MSVC++ 8.0 #define _MSC_VER_VS2003 1310 // MSVC++ 7.1 #define _MSC_VER_VC7 1300 // MSVC++ 7.0 #define _MSC_VER_VC6 1200 // MSVC++ 6.0 #define _MSC_VER_VC5 1100 // MSVC++ 5.0 #if _MSC_VER >= _MSC_VER_VS2019 #define _MSC_VER_STR "16" #define _MSC_YEAR_STR "19" #elif _MSC_VER >= _MSC_VER_VS2017 #define _MSC_VER_STR "15" #define _MSC_YEAR_STR "17" #elif _MSC_VER >= _MSC_VER_VS2015 #define _MSC_VER_STR "14" #define _MSC_YEAR_STR "15" #elif _MSC_VER >= _MSC_VER_VS2013 #define _MSC_VER_STR "12" #define _MSC_YEAR_STR "13" #elif _MSC_VER >= _MSC_VER_VS2012 #define _MSC_VER_STR "11" #define _MSC_YEAR_STR "12" #elif _MSC_VER >= _MSC_VER_VS2010 #define _MSC_VER_STR "10" #define _MSC_YEAR_STR "10" #else #define _MSC_VER_STR "9" #endif ////////////////////////////////////////////////////////////////// // Includes #define WIN32_LEAN_AND_MEAN #include "winsock2.h" #include "windows.h" #include "SHELLAPI.H" #include "COMMDLG.H" #include ////////////////////////////////////////////////////////////////// // Typedefs typedef HWND OsWindow; typedef HWND OsView; typedef HANDLE OsThread; typedef HANDLE OsProcess; typedef char16 OsChar; typedef HBITMAP OsBitmap; typedef HDC OsPainter; typedef HFONT OsFont; #if _MSC_VER <= _MSC_VER_VC6 typedef unsigned long ULONG_PTR, *PULONG_PTR; #define sprintf_s _snprintf #endif typedef BOOL (__stdcall *pSHGetSpecialFolderPathA)(HWND hwndOwner, LPSTR lpszPath, int nFolder, BOOL fCreate); typedef BOOL (__stdcall *pSHGetSpecialFolderPathW)(HWND hwndOwner, LPWSTR lpszPath, int nFolder, BOOL fCreate); typedef int (__stdcall *pSHFileOperationA)(LPSHFILEOPSTRUCTA lpFileOp); typedef int (__stdcall *pSHFileOperationW)(LPSHFILEOPSTRUCTW lpFileOp); typedef int (__stdcall *p_vscprintf)(const char *format, va_list argptr); #include "lgi/common/Message.h" class LgiClass OsAppArguments { LAutoWString CmdLine; void _Default(); public: HINSTANCE hInstance; DWORD Pid; char16 *lpCmdLine; int nCmdShow; OsAppArguments(); OsAppArguments(int Args, const char **Arg); OsAppArguments &operator =(OsAppArguments &p); void Set(char *Utf); void Set(int Args, const char **Arg); }; ////////////////////////////////////////////////////////////////// // Defines #define IsWin9x (LApp::Win9x) #define DefaultOsView(t) NULL #define GWL_LGI_MAGIC 8 #define GWL_EXTRA_BYTES 12 // Key redefs enum LgiKeys { LK_TAB = VK_TAB, LK_RETURN = VK_RETURN, LK_SPACE = VK_SPACE, LK_DELETE = VK_DELETE, LK_ESCAPE = VK_ESCAPE, LK_PAGEUP = VK_PRIOR, LK_PAGEDOWN = VK_NEXT, LK_BACKSPACE = VK_BACK, LK_F1 = VK_F1, LK_F2 = VK_F2, LK_F3 = VK_F3, LK_F4 = VK_F4, LK_F5 = VK_F5, LK_F6 = VK_F6, LK_F7 = VK_F7, LK_F8 = VK_F8, LK_F9 = VK_F9, LK_F10 = VK_F10, LK_F11 = VK_F11, LK_F12 = VK_F12, LK_LEFT = VK_LEFT, LK_RIGHT = VK_RIGHT, LK_UP = VK_UP, LK_DOWN = VK_DOWN, LK_HOME = VK_HOME, LK_END = VK_END, LK_INSERT = VK_INSERT, LK_SHIFT = VK_SHIFT, LK_ALT = VK_MENU, LK_CTRL = VK_CONTROL, LK_DECIMAL = VK_DECIMAL, LK_COMMA = VK_OEM_COMMA, // , . LK_MINUS = VK_OEM_MINUS, // - _ LK_EQUALS = VK_OEM_PLUS, // = + LK_SEMI_COLON = VK_OEM_1, // ; : LK_SLASH = VK_OEM_2, // / ? LK_TILDE = VK_OEM_3, // ~ LK_OPEN_BRACKET = VK_OEM_4, // [ { LK_BACK_SLASH = VK_OEM_5, // \ | LK_CLOSE_BRACKET = VK_OEM_6, // ] } LK_SINGLE_QUOTE = VK_OEM_7, // ' " }; // Sleep the current thread LgiFunc void LSleep(DWORD i); // Process typedef DWORD OsProcessId; LgiExtern HINSTANCE _lgi_app_instance; #define LProcessInst() _lgi_app_instance extern p_vscprintf lgi_vscprintf; #define LGetCurrentProcess() GetCurrentProcessId() // Threads typedef DWORD OsThreadId; typedef CRITICAL_SECTION OsSemaphore; #define LGetCurrentThread() GetCurrentThread() // #define GetCurrentThreadId() GetCurrentThreadId() // Socket/Network #define ValidSocket(s) ((s) != INVALID_SOCKET) typedef SOCKET OsSocket; #define LGI_GViewMagic 0x14412662 #define LGI_FileDropFormat "CF_HDROP" #define LGI_StreamDropFormat CFSTR_FILEDESCRIPTORW #define LGI_WideCharset "ucs-2" #define LPrintfInt64 "%I64i" #define LPrintfHex64 "%I64x" #if LGI_64BIT #define LPrintfSizeT "%I64u" #define LPrintfSSizeT "%I64d" #else #define LPrintfSizeT "%u" #define LPrintfSSizeT "%d" #endif #define LGI_IllegalFileNameChars "\t\r\n/\\:*?\"<>|" #define MK_LEFT MK_LBUTTON #define MK_RIGHT MK_RBUTTON #define MK_MIDDLE MK_MBUTTON #define MK_CTRL MK_CONTROL // Stupid mouse wheel defines don't work. hmmm #define WM_MOUSEWHEEL 0x020A #define WHEEL_DELTA 120 #ifndef SPI_GETWHEELSCROLLLINES #define SPI_GETWHEELSCROLLLINES 104 #endif // Window flags #define GWF_VISIBLE WS_VISIBLE #define GWF_DISABLED WS_DISABLED #define GWF_BORDER WS_BORDER #define GWF_TABSTOP WS_TABSTOP #define GWF_FOCUS 0x00000001 #define GWF_OVER 0x00000002 #define GWF_DROP_TARGET 0x00000004 #define GWF_SUNKEN 0x00000008 #define GWF_FLAT 0x00000010 #define GWF_RAISED 0x00000020 #define GWF_DIALOG 0x00000040 #define GWF_DESTRUCTOR 0x00000080 #define GWF_QUIT_WND 0x00000100 #define GWF_SYS_BORDER 0x00000200 // ask the system to draw the border // Widgets #define DialogToPixelX(i) (((i)*Bx)/4) #define DialogToPixelY(i) (((i)*By)/8) #define PixelToDialogX(i) (((i)*4)/Bx) #define PixelToDialogY(i) (((i)*8)/By) #define DIALOG_X 1.56 #define DIALOG_Y 1.85 #define CTRL_X 1.50 #define CTRL_Y 1.64 // Directories #define DIR_CHAR '\\' #define DIR_STR "\\" #define EOL_SEQUENCE "\r\n" #define LGI_PATH_SEPARATOR ";" #define LGI_ALL_FILES "*.*" #define LGI_LIBRARY_EXT "dll" #define LGI_EXECUTABLE_EXT ".exe" ///////////////////////////////////////////////////////////////////////////////////// // Typedefs typedef HWND OsView; ///////////////////////////////////////////////////////////////////////////////////// // Externs LgiFunc class LViewI *LWindowFromHandle(OsView hWnd); LgiFunc int GetMouseWheelLines(); LgiFunc int WinPointToHeight(int Pt, HDC hDC = NULL); LgiFunc int WinHeightToPoint(int Ht, HDC hDC = NULL); LgiExtern class LString WinGetSpecialFolderPath(int Id); /// Convert a string d'n'd format to an OS dependant integer. LgiFunc int FormatToInt(LString s); /// Convert a Os dependant integer d'n'd format to a string. LgiFunc char *FormatToStr(int f); extern bool LgiToWindowsCursor(OsView Hnd, LCursor Cursor); #ifdef _MSC_VER #define snprintf _snprintf //#define vsnprintf _vsnprintf #define vsnwprintf _vsnwprintf #define stricmp _stricmp #define strlwr _strlwr #define strnicmp _strnicmp #define vsnprintf _vsnprintf_s // #define getcwd _getcwd #endif #define atoi64 _atoi64 #ifdef __GNUC__ // #define stricmp strcasecmp // #define strnicmp strncasecmp #define vsnprintf_s vsnprintf #define swprintf_s snwprintf #define vsprintf_s vsnprintf #if !defined(_TRUNCATE) #define _TRUNCATE ((size_t)-1) #endif #endif diff --git a/test/HtmlViewer/TestSuite.cpp b/test/HtmlViewer/TestSuite.cpp --- a/test/HtmlViewer/TestSuite.cpp +++ b/test/HtmlViewer/TestSuite.cpp @@ -1,631 +1,630 @@ #include "lgi/common/Lgi.h" #include "lgi/common/Html.h" #include "lgi/common/List.h" #include "lgi/common/DateTime.h" #include "lgi/common/ClipBoard.h" #include "lgi/common/Scripting.h" #include "lgi/common/Box.h" #include "lgi/common/TextView3.h" #include "lgi/common/ProgressDlg.h" #include "lgi/common/Combo.h" #include "lgi/common/Net.h" #include "lgi/common/Http.h" #include "lgi/common/Filter.h" -#include "lgi/common/NetTools.h" #include "lgi/common/ImageComparison.h" #include "lgi/common/OpenSSLSocket.h" #include "lgi/common/Net.h" #include "lgi/common/EmojiFont.h" #include "lgi/common/Http.h" #include "lgi/common/Menu.h" #include "resdefs.h" #define HAS_LOG_VIEW 0 #define HAS_IMAGE_LOADER 1 enum Controls { IDC_HTML = 100, IDC_LOG, IDC_LIST }; class FileInf { public: char *File; LDateTime Date; FileInf() { File = 0; } ~FileInf() { DeleteArray(File); } }; int InfCmp(FileInf *a, FileInf *b, NativeInt d) { return -a->Date.Compare(&b->Date); } class HtmlItem : public LListItem { char *Base; public: HtmlItem(char *b, char *n) { Base = b; SetText(n); } void OnMouseClick(LMouse &m) { if (m.IsContextMenu()) { LSubMenu s; s.AppendItem("Copy Path", 100); m.ToScreen(); if (s.Float(GetList(), m.x, m.y, m.Left()) == 100) { LClipBoard c(GetList()); char Path[MAX_PATH_LEN]; LMakePath(Path, sizeof(Path), Base, GetText(0)); c.Text(Path); } } } }; class HtmlScriptContext : #ifdef _GHTML2_H public Html2::LHtml2, #else public Html1::LHtml, #endif public LScriptContext { LScriptEngine *Eng; public: static LHostFunc Methods[]; HtmlScriptContext(int Id, LDocumentEnv *Env) : #ifdef _GHTML2_H Html2::LHtml2 #else Html1::LHtml #endif (Id, 0, 0, 100, 100, Env) { Eng = NULL; LFont *f = new LFont; if (f) { f->Face("Times New Roman"); f->PointSize(12); // Size '16' is about 12 pt. Maybe they mean 16px? SetFont(f, true); } } LHostFunc *GetCommands() { return Methods; } void SetEngine(LScriptEngine *Eng) { } LString GetIncludeFile(const char *FileName) { return NULL; } LAutoString GetDataFolder() { return LAutoString(); } }; LHostFunc HtmlScriptContext::Methods[] = { LHostFunc(0, 0, 0), }; class HtmlImageLoader : public LThread, public LMutex, public LCancel { LArray In; public: HtmlImageLoader() : LThread("HtmlImageLoader.Thread"), LMutex("HtmlImageLoader.Mutex") { Run(); } ~HtmlImageLoader() { Cancel(true); while (!IsExited()) LSleep(1); } void Add(LDocumentEnv::LoadJob *j) { if (Lock(_FL)) { In.Add(j); Unlock(); } } LAutoPtr CreateSock(const char *Proto) { LAutoPtr s; if (Proto && !_stricmp(Proto, "https")) { SslSocket *ss; s.Reset(ss = new SslSocket); ss->SetSslOnConnect(false); } else s.Reset(new LSocket); return s; } int Main() { while (!IsCancelled()) { LAutoPtr j; if (Lock(_FL)) { if (In.Length()) { j.Reset(In[0]); In.DeleteAt(0, true); } Unlock(); } LDocumentEnv::LoadJob *Job = dynamic_cast(j.Get()); if (Job) { LUri u(Job->Uri); if (u.IsFile()) { // Local document? if (Job->pDC.Reset(GdcD->Load(Job->Uri))) { LDocumentEnv *e = Job->Env; if (e) { // LgiTrace("Loaded '%s' as image %ix%i\n", u.Path, j->pDC->X(), j->pDC->Y()); e->OnDone(j); } } } else { LMemQueue p(1024); LString Err; auto r = LgiGetUri(this, &p, &Err, Job->Uri); if (r) { uchar Hint[16]; p.Peek(Hint, sizeof(Hint)); auto Filter = LFilterFactory::New(u.sPath, FILTER_CAP_READ, Hint); if (Filter) { LAutoPtr Img(new LMemDC); LFilter::IoStatus Rd = Filter->ReadImage(Img, &p); if (Rd == LFilter::IoSuccess) { Job->pDC = Img; if (Job->Env) { // LgiTrace("Loaded '%s' as image %ix%i\n", u.Path, j->pDC->X(), j->pDC->Y()); Job->Env->OnDone(j); } else { LgiTrace("%s:%i - No env for '%s'\n", _FL, u.sPath.Get()); LAssert(0); } } else LgiTrace("%s:%i - Failed to read '%s'\n", _FL, u.sPath.Get()); } else LgiTrace("%s:%i - Failed to find filter for '%s'\n", _FL, u.sPath.Get()); } else LgiTrace("%s:%i - Failed to get '%s'\n", _FL, Job->Uri.Get()); } } else LSleep(10); } return 0; } }; class AppWnd : public LWindow, public LDefaultDocumentEnv { LList *Lst; HtmlScriptContext *Html; LTextView3 *Text; char Base[256]; LAutoPtr Script; LAutoPtr Worker; LAutoPtr Emoji; LoadType GetContent(LoadJob *&j) { LUri u(j->Uri); if (!u.sProtocol) { char p[MAX_PATH_LEN]; if (LMakePath(p, sizeof(p), Base, j->Uri) && LFileExists(p)) { LString Ext = LGetExtension(p); if (Ext.Equals("css") || Ext.Equals("html")) { LAutoPtr f(new LFile); if (f && f->Open(p, O_READ)) { j->Stream.Reset(f.Release()); return LoadImmediate; } } else { j->pDC.Reset(GdcD->Load(p)); if (j->pDC) return LoadImmediate; } return LoadError; } } #if HAS_IMAGE_LOADER if (!Worker) Worker.Reset(new HtmlImageLoader); Worker->Add(j); j = NULL; return LoadDeferred; #else return LoadNotImpl; // GDefaultDocumentEnv::GetContent(j); #endif } public: AppWnd() { Html = 0; Lst = 0; Text = NULL; Base[0] = 0; Emoji.Reset(new LEmojiFont()); Name("Html Test Suite"); SetQuitOnClose(true); if (Attach(0)) { Menu = new LMenu(); if (Menu) { Menu->Attach(this); Menu->Load(this, "IDM_MENU"); } LBox *s = new LBox; if (s) { AddView(s); s->AddView(Lst = new LList(IDC_LIST, 0, 0, 100, 100)); Lst->Sunken(false); Lst->AddColumn("File", 400); Lst->CssStyles("width: 200px;"); s->Value(200); #if HAS_LOG_VIEW LBox *vert = new LBox; vert->SetVertical(true); s->AddView(vert); vert->AddView(Html = new HtmlScriptContext(IDC_HTML, this)); Html->SetCssStyle("height: 70%;"); vert->AddView(Text = new LTextView3(IDC_LOG, 0, 0, 100, 100)); LBox::Spacer *sp = s->GetSpacer(0); if (sp) { sp->Colour.Rgb(64, 64, 64); sp->SizePx = 2; } sp = vert->GetSpacer(0); if (sp) { sp->Colour.Rgb(64, 64, 64); sp->SizePx = 2; } #else s->AddView(Html = new HtmlScriptContext(IDC_HTML, this)); #endif Script.Reset(new LScriptEngine(this, Html, NULL)); if (Html) Html->SetEnv(this); #if HAS_IMAGE_LOADER Html->SetLoadImages(true); #endif if (sprintf_s(Base, sizeof(Base), "%s", LGetExePath().Get()) > 0) { #if defined(WIN32) if (stristr(Base, "Release") || stristr(Base, "Debug")) LTrimDir(Base); #endif #if defined(MAC) && defined(__GTK_H__) LMakePath(Base, sizeof(Base), Base, "../../../.."); #endif List Files; LDirectory *d = new LDirectory; if (d) { LMakePath(Base, sizeof(Base), Base, "Files"); for (bool b = d->First(Base); b; b = d->Next()) { if (!d->IsDir() && MatchStr("*.html", d->GetName())) { char p[256]; if (d->Path(p, sizeof(p))) { FileInf *f = new FileInf; if (f) { f->File = NewStr(p); f->Date.Set(d->GetLastWriteTime()); Files.Insert(f); } } } } DeleteObj(d); Files.Sort(InfCmp); for (auto f: Files) { char *d = strrchr(f->File, DIR_CHAR); if (d) { HtmlItem *i = new HtmlItem(Base, d + 1); if (i) Lst->Insert(i); } } Files.DeleteObjects(); } } } LRect r(0, 0, 1200, 800); SetPos(r); MoveToCenter(); AttachChildren(); Visible(true); OnNotify(FindControl(IDC_LIST), LNotifyItemSelect); } else LExitApp(); } ~AppWnd() { } int OnCommand(int Cmd, int Event, OsView Wnd) { switch (Cmd) { case IDM_SAVE_IMGS: { LPoint PageSize(1000, 2000); LProgressDlg Prog(this, true); Prog.SetDescription("Scanning for HTML..."); char p[MAX_PATH_LEN]; LGetSystemPath(LSP_APP_INSTALL, p, sizeof(p)); LArray Ext; LArray Files; Ext.Add("*.html"); Ext.Add("*.htm"); if (LRecursiveFileSearch(p, &Ext, &Files)) { LDateTime Now; Now.SetNow(); char OutPath[MAX_PATH_LEN], NowStr[32]; sprintf_s( NowStr, sizeof(NowStr), "%.4i-%.2i-%.2i_%.2i-%.2i-%.2i", Now.Year(), Now.Month(), Now.Day(), Now.Hours(), Now.Minutes(), Now.Seconds()); LMakePath(OutPath, sizeof(OutPath), p, "Output"); if (!LDirExists(OutPath)) FileDev->CreateFolder(OutPath); LMakePath(OutPath, sizeof(OutPath), OutPath, NowStr); if (!LDirExists(OutPath)) FileDev->CreateFolder(OutPath); Prog.SetDescription("Saving renders..."); Prog.SetRange(Files.Length()); for (int i=0; iSave(p, &Screen)) LAssert(0); Prog.Value(i); LYield(); } Files.DeleteArrays(); } break; } case IDM_COMPARE_IMAGES: { char p[MAX_PATH_LEN]; LGetSystemPath(LSP_APP_INSTALL, p, sizeof(p)); LArray Ext; LArray Files; Ext.Add("*.png"); // if (LRecursiveFileSearch(p, &Ext, &Files)) char OutPath[MAX_PATH_LEN]; LMakePath(OutPath, sizeof(OutPath), p, "Output"); if (!LDirExists(OutPath)) { LgiMsg(this, "No output render folder.", "Html Test Suite"); break; } new ImageCompareDlg(this, OutPath); break; } } return 0; } int OnNotify(LViewI *c, LNotification n) { switch (c->GetId()) { case IDC_LIST: { if (n.Type == LNotifyItemSelect) { LListItem *s = Lst->GetSelected(); if (s) { char p[256]; LMakePath(p, sizeof(p), Base, s->GetText(0)); if (LFileExists(p)) { char *h = LReadTextFile(p); if (h) { if (Html) Html->Name(h); DeleteArray(h); } } } } break; } case IDC_HTML: { switch (n.Type) { case LNotifySelectionChanged: { if (Text) { LAutoString s(Html->GetSelection()); if (s) Text->Name(s); else Text->Name("(null)"); } break; } default: break; } break; } } return 0; } bool OnCompileScript(LDocView *Parent, char *Script, const char *Language, const char *MimeType) { // return Script->Compile(Code, true); return false; } bool OnExecuteScript(LDocView *Parent, char *Script) { return false; // Script->RunTemporary(Code); } }; void FontSz() { for (int i=6; i<32; i++) { LFont f; if (f.Create("verdana", LCss::Len(LCss::LenPx, i))) { double a = (double) f.GetHeight() / f.Ascent(); LgiTrace("%i: %i, ascent=%f, a=%f\n", i, f.GetHeight(), f.Ascent(), a); } } } int LgiMain(OsAppArguments &AppArgs) { LApp a(AppArgs, "HtmlTestSuite"); if (a.IsOk()) { //FontSz(); a.AppWnd = new AppWnd; a.Run(); } return 0; } diff --git a/utils/VsLaunch/Main.cpp b/utils/VsLaunch/Main.cpp --- a/utils/VsLaunch/Main.cpp +++ b/utils/VsLaunch/Main.cpp @@ -1,166 +1,171 @@ #include "lgi/common/Lgi.h" #include "resdefs.h" #include "lgi/common/TextLog.h" ////////////////////////////////////////////////////////////////// const char *AppName = "VsLaunch"; struct VsInfo { int Year; int MscVer; double Ver; + bool x64; } Versions[] = { - {2019, _MSC_VER_VS2019, 16.0}, - {2017, _MSC_VER_VS2017, 15.0}, - {2015, _MSC_VER_VS2015, 14.0}, - {2013, _MSC_VER_VS2013, 12.0}, - {2012, _MSC_VER_VS2012, 11.0}, - {2010, _MSC_VER_VS2010, 10.0}, - {2008, _MSC_VER_VS2008, 9.0}, - {2005, _MSC_VER_VS2005, 8.0}, - {2003, _MSC_VER_VS2003, 7.1}, - {7, _MSC_VER_VC7, 7.0}, - {6, _MSC_VER_VC6, 6.0}, - {5, _MSC_VER_VC5, 5.0}, + {2022, _MSC_VER_VS2022, 17.0, true}, + {2019, _MSC_VER_VS2019, 16.0, false}, + {2017, _MSC_VER_VS2017, 15.0, false}, + {2015, _MSC_VER_VS2015, 14.0, false}, + {2013, _MSC_VER_VS2013, 12.0, false} }; +VsInfo *GetVsInfo(int VsYear) +{ + for (int i=0; i &Files) { Log->Print("Got %i files...\n", Files.Length()); for (unsigned i=0; iPrint("\t%s...\n", File); - const char *Ext = LGetExtension(File); + auto Ext = LGetExtension(File); if (Ext && !_stricmp(Ext, "sln")) { LFile f; if (f.Open(File, O_READ)) { - LString::Array a = f.Read().Split("\n"); + auto a = f.Read().Split("\n"); f.Close(); double FileVersion = 0.0; int64 VsYear = -1; double VsVersion = 0.0; for (unsigned i=0; i= 0) { - LString::Array p = a[i].Split(" "); + auto p = a[i].Split(" "); FileVersion = p.Last().Float(); } else if (a[i](0) == '#') { LString::Array p = a[i].Split(" "); for (auto s : p) { auto i = s.Int(); if (i > 2000 && i < 2030) { VsYear = i; VsVersion = YearToVer(VsYear); break; } else if (i >= 10 && i <= 16) { VsVersion = (double)i; VsYear = VerToYear(VsVersion); } } } } if (VsVersion > 0.0) { - // C:\Program Files (x86)\Microsoft Visual Studio 9.0\Common7\IDE\devenv.exe - LFile::Path p(LSP_USER_APPS, 32); + auto Info = GetVsInfo(VsYear); + LFile::Path p(LSP_USER_APPS, Info && Info->x64 ? 64 : 32); LString v; if (VsVersion >= 16.0) v.Printf("Microsoft Visual Studio\\%" PRIi64 "\\Community", VsYear); else v.Printf("Microsoft Visual Studio %.1f", VsVersion); p += v; p += "Common7\\IDE\\devenv.exe"; if (p.IsFile()) { LExecute(p, File); LCloseApp(); } else Log->Print("\t\tError: The file '%s' doesn't exist.", p.GetFull().Get()); } else Log->Print("\t\tError: No version in '%s'.", File); } else Log->Print("\t\tError: Failed to open '%s'\n", File); } } } }; ////////////////////////////////////////////////////////////////// int LgiMain(OsAppArguments &AppArgs) { LApp a(AppArgs, AppName); if (a.IsOk()) { a.AppWnd = new App; a.Run(); } return 0; } diff --git a/win/Lgi_vs2022.vcxproj b/win/Lgi_vs2022.vcxproj --- a/win/Lgi_vs2022.vcxproj +++ b/win/Lgi_vs2022.vcxproj @@ -1,630 +1,624 @@  Debug x64 ReleaseNoOptimize x64 Release x64 Lgi {95DF9CA4-6D37-4A85-A648-80C2712E0DA1} 10.0 DynamicLibrary v143 false Unicode DynamicLibrary v143 false Unicode DynamicLibrary v143 false Unicode <_ProjectFileVersion>12.0.30501.0 ..\Lib\ $(Platform)$(Configuration)22\ false $(VC_IncludePath);$(WindowsSDK_IncludePath);..\..\..\CodeLib\libiconv-1.14\include Lgi22 ..\Lib\ $(Platform)$(Configuration)22\ true $(VC_IncludePath);$(WindowsSDK_IncludePath);..\..\..\CodeLib\libiconv-1.14\include Lgi22d ..\Lib\ $(Platform)$(Configuration)22\ false $(VC_IncludePath);$(WindowsSDK_IncludePath);..\..\..\CodeLib\libiconv-1.14\include Lgi22nop NDEBUG;%(PreprocessorDefinitions) true true X64 .\Release/Lgi.tlb MinSpace OnlyExplicitInline ..\include;..\include\lgi\win;..\private\common;..\private\win;..\..\..\..\CodeLib\libiconv\include;..\..\..\scribe\libs\build-x64\libiconv-1.17\include;%(AdditionalIncludeDirectories) WIN64;NDEBUG;WINDOWS;LGI_RES;LGI_LIBRARY;%(PreprocessorDefinitions) true MultiThreadedDLL true true $(IntDir)$(TargetName).pch $(IntDir) $(IntDir) $(IntDir) Level2 true ProgramDatabase Default true NDEBUG;%(PreprocessorDefinitions) 0x0c09 ComCtl32.lib;Ws2_32.lib;UxTheme.lib;imm32.lib;%(AdditionalDependencies) $(OutDir)$(TargetFileName) true true $(OutDir)$(TargetName).pdb Windows true false $(OutDir)$(TargetName).lib MachineX64 _DEBUG;%(PreprocessorDefinitions) true true X64 .\Debug/Lgi.tlb Disabled ..\include;..\include\lgi\win;..\private\common;..\private\win;..\..\..\..\CodeLib\libiconv\include;..\..\..\scribe\libs\build-x64\libiconv-1.17\include;%(AdditionalIncludeDirectories) WIN64;LGI_LIBRARY;_DEBUG;WINDOWS;LGI_RES;%(PreprocessorDefinitions) EnableFastChecks MultiThreadedDebugDLL true $(IntDir)$(TargetName).pch $(IntDir) $(IntDir) $(IntDir) Level3 true ProgramDatabase Default false true _DEBUG;%(PreprocessorDefinitions) 0x0c09 ComCtl32.lib;Ws2_32.lib;UxTheme.lib;imm32.lib;%(AdditionalDependencies) NotSet $(OutDir)$(TargetFileName) true true $(OutDir)$(TargetName).pdb Windows false $(OutDir)$(TargetName).lib MachineX64 NDEBUG;%(PreprocessorDefinitions) true true X64 .\Release/Lgi.tlb MinSpace OnlyExplicitInline ..\include;..\include\lgi\win;..\private\common;..\private\win;..\..\..\..\CodeLib\libiconv\include;..\..\..\scribe\libs\build-x64\libiconv-1.17\include;%(AdditionalIncludeDirectories) WIN64;NDEBUG;WINDOWS;LGI_RES;LGI_LIBRARY;%(PreprocessorDefinitions) true MultiThreadedDLL true true $(IntDir)$(TargetName).pch $(IntDir) $(IntDir) $(IntDir) Level2 true ProgramDatabase Default false true NDEBUG;%(PreprocessorDefinitions) 0x0c09 ComCtl32.lib;Ws2_32.lib;UxTheme.lib;imm32.lib;%(AdditionalDependencies) $(OutDir)$(TargetFileName) true true $(OutDir)$(TargetName).pdb Windows true false $(OutDir)$(TargetName).lib MachineX64 - - false true true false false false true true true true true true false false false true true true true true true - - - - \ No newline at end of file diff --git a/win/Lgi_vs2022.vcxproj.filters b/win/Lgi_vs2022.vcxproj.filters --- a/win/Lgi_vs2022.vcxproj.filters +++ b/win/Lgi_vs2022.vcxproj.filters @@ -1,1236 +1,1226 @@  {afe8cb77-9ad1-4536-bbdd-3c127e7ed08c} cpp;c;cxx;rc;def;r;odl;idl;hpj;bat {66a64573-871b-4499-ae26-c19e9e2a514a} {3fc23ef0-f144-4f1f-a9b4-18d3392bb63d} {c6cd6d73-d33c-4413-ade1-9dad78e2dc9c} {c8684fc7-2e3c-4f15-8284-9d44b044f6c6} {87b1c801-b9ce-4f6c-97ab-a8f89aee9594} {c06c25f2-2c07-4900-a517-4a6a324069e9} {2c01a737-36cf-4197-bfa1-20395060263f} {1e4cd802-8b94-4328-930e-37bfbfbedff5} {01075698-dde2-4ed0-808f-7dd54414b597} {4a6845a8-e6ec-47d5-8f6c-aa0cfdbc68df} {f567a76b-edd5-434d-b0d9-d51481f34845} {3dee0237-b01c-44e8-a730-08dc661df82f} {bbaaace6-0ac7-4e76-90ae-9e5d5a0cb899} {71e7b970-a070-40a7-a99f-88c215e14e44} {6e115ea1-09fb-492b-82b6-428afe17fed9} {719ef36f-419f-46f9-aef9-2f8158e4d106} {fb221556-3700-4dd8-ba9a-10b5d66bfe54} {8e9f0321-56ae-4485-a338-e87d714c7f50} {c6050f41-574b-4a92-9ce5-860be2719ecf} {a07cd969-801e-4ec9-9394-e34912a3271d} {e067fae0-ef98-4e7a-8434-6f36590ba0e6} {0a3e2151-b13a-407a-8cd9-ccb20f15cacf} {c72248a4-c2f0-43b9-950d-89d09bfddbb3} {dad60202-c763-4f32-9dfb-fe7def4637ee} {532dfa4a-58d3-4133-9ed6-a9fbf7f1556e} {5409aca4-2a55-4b2f-a719-d3db4e3cd7e4} {e3a3aadd-47ef-4723-9bcc-7db1f75a18b0} {c4327acf-78c3-4ef1-b8bc-3aac9ea52b41} {b3c906b8-595e-4641-8eec-8ad03ab13f6f} {baf0a65b-4a9c-4b11-850d-a957c19a22bf} {6e349f5b-36a8-4821-9574-4040a3784204} {ddfdebae-8bcf-4224-8938-2716aba03822} {a126c55a-edee-489f-a852-25cbd1b433b2} {ab5fd4a0-3862-42fd-b4ff-d5d8b0443f53} {048d5e0a-220f-4911-999d-96965eb53691} {258aef64-8cd0-4838-8131-147196656a99} {814a5d81-3fd5-461b-a4a3-cda593ea404b} {5fe450b8-5fa9-440e-9fb0-03860b3548d0} h;hpp;hxx;hm;inl + + Source Files\Graphics\Applicators + + + Source Files\Graphics\Applicators + - Source Files + Source Files\Graphics\Applicators - Source Files + Source Files\Graphics\Applicators - Source Files + Source Files\Graphics\Applicators - Source Files + Source Files\Graphics\Applicators - Source Files + Source Files\Graphics\Applicators - - Source Files - - - Source Files + + Source Files\Dialogs - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files + Source Files\Graphics\Applicators - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files + + Source Files\Core - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files + + Source Files\Core - Source Files + Source Files\General + + + Source Files\Widgets + + + Source Files\Widgets - - Source Files + + Source Files\Widgets\Native Windows - - Source Files + + Source Files\Widgets\Native Windows + + + Source Files\Widgets - - Source Files + + Source Files\Widgets\Native Windows - - Source Files + + Source Files\Graphics\Font + + + Source Files\Widgets - - Source Files + + Source Files\General\Clipboard + + + Source Files\Graphics - - Source Files + + Source Files\Graphics\Colour Reduction + + + Source Files\Core\Memory Subsystem - Source Files + Source Files\Widgets\Css - Source Files + Source Files\Widgets\Css + + + Source Files\Core\DateTime + + + Source Files\Widgets\Native Windows + + + Source Files\Graphics\Font + + + Source Files\Dialogs + + + Source Files\Core\Drag and Drop - Source Files + Source Files\Core\Drag and Drop - Source Files + Source Files\Core\Drag and Drop + + + Source Files\Widgets + + + Source Files\Widgets\Native Windows + + + Source Files\General + + + Source Files\Core\File + + + Source Files\Core\File + + + Source Files\Dialogs + + + Source Files\Graphics\Filters - Source Files + Source Files\Dialogs + + + Source Files\Graphics\Font + + + Source Files\Graphics\Font + + + Source Files\Graphics\Font - Source Files + Source Files\Dialogs + + + Source Files\Graphics + + + Source Files\Graphics + + + Source Files\Graphics\Gdi Leak + + + Source Files\Core\Skin + + + Source Files\General + + + Source Files\General\Growl - Source Files + Source Files\Core - Source Files + Source Files\Dialogs + + + Source Files\General\Hash + + + Source Files\General + + + Source Files\General + + + Source Files\Core\Resources - Source Files + Source Files\Core\Libraries + + + Source Files\Dialogs + + + Source Files\General\Hash + + + Source Files\Core\Memory Subsystem + + + Source Files\Graphics\Surfaces - Source Files + Source Files\Core\Memory Subsystem + + + Source Files\Core\Menus - Source Files + Source Files\Core\Menus + + + Source Files\Network - Source Files + Source Files\Core + + + Source Files\Core\Threads + + + Source Files\Network - Source Files + Source Files\General - Source Files + Source Files\General + + + Source Files\Widgets + + + Source Files\General + + + Source Files\Graphics + + + Source Files\Widgets + + + Source Files\Graphics\Surfaces + + + Source Files\Graphics\Surfaces + + + Source Files\Widgets\Native Windows + + + Source Files\Widgets\Layout + + + Source Files\Dialogs + + + Source Files\Widgets\Native Windows + + + Source Files\Widgets + + + Source Files\Widgets\Native Windows + + + Source Files\General + + + Source Files\General\Hash + + + Source Files\Graphics\Rect/Region + + + Source Files\Core\Resources + + + Source Files\Graphics\Surfaces + + + Source Files\Widgets + + + Source Files\Widgets + + + Source Files\Widgets\Native Windows + + + Source Files\Widgets\Layout + + + Source Files\Widgets - Source Files + Source Files\Core\Memory Subsystem + + + Source Files\Text + + + Source Files\Widgets - Source Files + Source Files\Core\Process + + + Source Files\Graphics\Surfaces + + + Source Files\Widgets\Layout - - Source Files + + Source Files\Widgets\Layout + + + Source Files\Widgets\Container + + + Source Files\Widgets\Container + + + Source Files\Text - Source Files - - - Source Files - - - Source Files - - - Source Files + Source Files\Widgets - - Source Files - - - Source Files - - - Source Files - - - Source Files + + Source Files\Core\Threads - Source Files + Source Files\Core\Threads - - Source Files - - - Source Files + + Source Files\Core\Threads - - Source Files - - - Source Files + + Source Files\Widgets - - Source Files - - - Source Files + + Source Files\Widgets - Source Files + Source Files\Widgets - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files + Source Files\Widgets - Source Files + Source Files\Widgets + + + Source Files\Widgets - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files + Source Files\Widgets\Container - Source Files + Source Files\Core + + + Source Files\Core - Source Files + Source Files\Core - - Source Files + + Source Files\Core - - Source Files + + Source Files\Graphics\Font - - Source Files - - - Source Files + + Source Files\General - - Source Files + + Source Files\Text - - Source Files - - - Source Files + + Source Files\Text - - Source Files + + Source Files\Text - - Source Files - - - Source Files + + Source Files\Network Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files Header Files - - - - \ No newline at end of file