From 56dbedbdf862a469a9cbf20e3ed21d040ec5e2af Mon Sep 17 00:00:00 2001 From: cxl Date: Fri, 1 Feb 2019 18:31:45 +0000 Subject: [PATCH] ide: MacOS improvements git-svn-id: svn://ultimatepp.org/upp/trunk@12727 f0d560ea-af0d-0410-9eb7-867de7ffcac7 --- uppsrc/ide/Debuggers/Gdb.cpp | 19 +++++++++ uppsrc/ide/Debuggers/Gdb.h | 4 +- uppsrc/ide/Debuggers/GdbCmd.cpp | 64 +++++++++++++++++++------------ uppsrc/ide/Debuggers/Terminal.cpp | 4 +- uppsrc/ide/ide.cpp | 31 ++++++++++++--- uppsrc/ide/idewin.cpp | 2 +- 6 files changed, 88 insertions(+), 36 deletions(-) diff --git a/uppsrc/ide/Debuggers/Gdb.cpp b/uppsrc/ide/Debuggers/Gdb.cpp index 87050ea0f..5098dea97 100644 --- a/uppsrc/ide/Debuggers/Gdb.cpp +++ b/uppsrc/ide/Debuggers/Gdb.cpp @@ -351,10 +351,18 @@ String Gdb::DoRun() { if(firstrun) { firstrun = false; + #ifdef PLATFORM_LLDB + Cmd("b main"); + String s = Cmd("r", true); + s << Cmd("settings show prompt"); // Resync stdout + int q = s.FindAfter("Process"); + pid = atoi(~s + q); + #else Cmd("start"); String s = Cmd("info inferior"); int q = s.FindAfter("process"); pid = atoi(~s + q); + #endif IdeSetBar(); } @@ -535,6 +543,16 @@ bool Gdb::Create(One&& _host, const String& exefile, const String& cmdline watches.WhenAcceptEdit = THISBACK(ObtainData); tab <<= THISBACK(ObtainData); +#ifdef PLATFORM_LLDB + Cmd("settings set auto-confirm true"); + #if 0 + Cmd("l"); + Cmd("b main"); + Cmd("r", true); Cmd("settings show prompt"); + Cmd("bt"); + return false; + #endif +#else Cmd("set prompt " GDB_PROMPT); Cmd("set disassembly-flavor intel"); Cmd("set exec-done-display off"); @@ -554,6 +572,7 @@ bool Gdb::Create(One&& _host, const String& exefile, const String& cmdline if(!IsNull(cmdline)) Cmd("set args " + cmdline); +#endif firstrun = true; diff --git a/uppsrc/ide/Debuggers/Gdb.h b/uppsrc/ide/Debuggers/Gdb.h index 023d85842..0b5336fb2 100644 --- a/uppsrc/ide/Debuggers/Gdb.h +++ b/uppsrc/ide/Debuggers/Gdb.h @@ -17,7 +17,7 @@ public: public: String DoRun(); - bool Result(String& result, const String& s); + bool Result(String& result, const String& s, bool run = false); void AddReg(const char *reg, Label *lbl) { regname.Add(reg); reglbl.Add(lbl); } @@ -27,7 +27,7 @@ public: void Lock(); void Unlock(); - String Cmd(const char *command, bool start = false); + String Cmd(const char *command, bool run = false); String FastCmd(const char *command); bool IsProcessExitedNormally(const String& cmd_output) const; diff --git a/uppsrc/ide/Debuggers/GdbCmd.cpp b/uppsrc/ide/Debuggers/GdbCmd.cpp index 301ce6bd7..9b56663aa 100644 --- a/uppsrc/ide/Debuggers/GdbCmd.cpp +++ b/uppsrc/ide/Debuggers/GdbCmd.cpp @@ -91,19 +91,35 @@ void Gdb::Unlock() } } -bool Gdb::Result(String& result, const String& s) +bool Gdb::Result(String& result, const String& s, bool run) { result.Cat(s); int l = result.GetLength(); - int q = result.Find(GDB_PROMPT, max(0, l - 50)); - if(q >= 0) { - result.Trim(q); - return true; + if(run) { + if(result.Find("stopped") >= 0 || result.Find("exited") >= 0) + return true; + } + else { + int q = result.Find(GDB_PROMPT, max(0, l - 50)); + if(q >= 0) { + result.Trim(q); + return true; + } } return false; } -String Gdb::Cmd(const char *command, bool start) +void LLDBFixResult(String& result) +{ + int q = result.Find('\n'); + if(q >= 0 && result.StartsWith("(lldb)")) + result = result.Mid(q + 1); + q = result.ReverseFind('\n'); + if(q >= 0 && result.Find("(lldb)", q) == q + 1) + result.Trim(q); +} + +String Gdb::Cmd(const char *command, bool run) { if(!dbg || !dbg->IsRunning() || IdeIsDebugLock()) return Null; TimeStop ts; @@ -112,6 +128,10 @@ String Gdb::Cmd(const char *command, bool start) LLOG("========= Cmd: " << command); dbg->Write(String(command) + "\n"); PutVerbose(String() << "Command: " << command); + #ifdef PLATFORM_LLDB + if(!run) + dbg->Write("#" + String(GDB_PROMPT) + "\n"); // the echo will mark the end of command... + #endif } String result; int ms0 = msecs(); @@ -123,16 +143,8 @@ String Gdb::Cmd(const char *command, bool start) LLOG("Running: " << dbg->IsRunning()); break; } - if(!s.IsEmpty() && Result(result, s)) { - LLOG(result); - PutVerbose(result); - if(start) { - start = false; - result = s.Mid(result.GetCount()); - } - else - break; - } + if(!s.IsEmpty() && Result(result, s, run)) + break; if(ms0 != msecs()) { ProcessEvents(); ms0 = msecs(); @@ -147,8 +159,10 @@ String Gdb::Cmd(const char *command, bool start) if(command) { PutVerbose(String() << "Time of `" << command <<"` " << ts); } - PutVerbose("=========== Result:"); - PutVerbose(result); +#ifdef PLATFORM_LLDB + LLDBFixResult(result); +#endif + PutVerbose("=========== Result:\n" + result); PutVerbose("==================="); return result; } @@ -160,6 +174,7 @@ String Gdb::FastCmd(const char *command) if(command) { dbg->Write(String(command) + "\n"); PutVerbose(String() << "Fast Command: " << command); + dbg->Write("#" + String(GDB_PROMPT) + "\n"); // the echo will mark the end of command... } String result; TimeStop ts; @@ -176,13 +191,8 @@ String Gdb::FastCmd(const char *command) LLOG("Running: " << dbg->IsRunning()); break; } - if(!s.IsEmpty() && Result(result, s)) { - LLOG(result); - LLOG("Result length: " << result.GetLength()); - if(result.GetLength() < 1000) - PutVerbose(result); + if(!s.IsEmpty() && Result(result, s)) break; - } if(s.GetCount() == 0) Sleep(0); if(ts.Elapsed() > 500) { @@ -200,7 +210,11 @@ String Gdb::FastCmd(const char *command) PutVerbose(String() << "Time of `" << command <<"` " << ts); } #endif - PutVerbose("Result: " + result); +#ifdef PLATFORM_LLDB + LLDBFixResult(result); +#endif + PutVerbose("=========== Fast Result:\n" + result); + PutVerbose("==================="); return result; } diff --git a/uppsrc/ide/Debuggers/Terminal.cpp b/uppsrc/ide/Debuggers/Terminal.cpp index eb094ffed..8b400d68e 100644 --- a/uppsrc/ide/Debuggers/Terminal.cpp +++ b/uppsrc/ide/Debuggers/Terminal.cpp @@ -86,8 +86,8 @@ bool TTYQuit() { return false; } String GdbCommand(bool console) { -#ifdef PLATFORM_COCOA - String gdb = "/usr/local/bin/gdb "; +#ifdef PLATFORM_LLDB + String gdb = "/usr/bin/lldb -X "; #else String gdb = "gdb "; #ifdef PLATFORM_POSIX diff --git a/uppsrc/ide/ide.cpp b/uppsrc/ide/ide.cpp index c3cf17eb9..62f86df51 100644 --- a/uppsrc/ide/ide.cpp +++ b/uppsrc/ide/ide.cpp @@ -554,7 +554,7 @@ void Ide::SetIdeState(int newstate) void Ide::MakeIcon() { Image li = IdeImg::PackageLarge2(); - String mp = main; + WString mp = main.ToWString(); if(!IsNull(mp)) { Size isz = li.GetSize(); @@ -565,20 +565,39 @@ void Ide::MakeIcon() { int fh = DPI(13); Size sz; Font font; - while(fh > 8) { + while(fh > DPI(8)) { font = StdFont(fh); - sz = GetTextSize(mp, font); - sz.cx = min(sz.cx + 4, isz.cx); - sz.cy += 2; - if(sz.cx < isz.cx) + sz = GetTextSize(mp, font) + Size(4, 2); + if(sz.cx <= isz.cx) break; fh--; } + Font font2; + int cx1 = 0; + WString mp2; + Size sz2; + if(sz.cx > isz.cx && mp.GetCount() > 2) { + mp2 = mp.Mid(1); + mp.Trim(1); + cx1 = GetTextSize(mp, font).cx; + while(fh > DPI(5)) { + font2 = StdFont(fh); + sz = GetTextSize(mp2, font2) + Size(4, 2); + sz.cx += cx1; + sz.cy = font.GetCy(); + if(sz.cx <= isz.cx) + break; + fh--; + } + } int x = (isz.cx - sz.cx) / 2; int y = isz.cy - sz.cy; idraw.DrawRect(x, y, sz.cx, sz.cy, White); mdraw.DrawRect(x, y, sz.cx, sz.cy, White); idraw.DrawText(x + 2, y + 1, mp, font, Black); + if(cx1) + idraw.DrawText(x + 2 + cx1, y + 1 + font.GetAscent() - font2.GetAscent(), + mp2, font2, Black); DrawFrame(idraw, x, y, sz.cx, sz.cy, LtBlue); if(state_icon) idraw.DrawImage(0, 0, decode(state_icon, 1, IdeImg::IconDebuggingLarge2(), diff --git a/uppsrc/ide/idewin.cpp b/uppsrc/ide/idewin.cpp index 90f4e6bf9..06841a059 100644 --- a/uppsrc/ide/idewin.cpp +++ b/uppsrc/ide/idewin.cpp @@ -659,7 +659,7 @@ Ide::Ide() #ifdef PLATFORM_COCOA WhenDockMenu = [=](Bar& bar) { - bar.Add("New Window", [=] { + bar.Add("Open main package..", [=] { CreateHost(false, false)->Launch(GetExeFilePath() + " --nosplash"); }); };