diff --git a/Core/Config.cpp b/Core/Config.cpp index e33a48acc..da8b93f9d 100644 --- a/Core/Config.cpp +++ b/Core/Config.cpp @@ -239,6 +239,7 @@ void Config::Load(const char *iniFileName, const char *controllerIniFilename) debugConfig->Get("FontWidth", &iFontWidth, 8); debugConfig->Get("FontHeight", &iFontHeight, 12); debugConfig->Get("DisplayStatusBar", &bDisplayStatusBar, true); + debugConfig->Get("ShowBottomTabTitles",&bShowBottomTabTitles,true); debugConfig->Get("ShowDeveloperMenu", &bShowDeveloperMenu, false); IniFile::Section *gleshacks = iniFile.GetOrCreateSection("GLESHacks"); @@ -395,6 +396,7 @@ void Config::Save() { debugConfig->Set("FontWidth", iFontWidth); debugConfig->Set("FontHeight", iFontHeight); debugConfig->Set("DisplayStatusBar", bDisplayStatusBar); + debugConfig->Set("ShowBottomTabTitles",bShowBottomTabTitles); debugConfig->Set("ShowDeveloperMenu", bShowDeveloperMenu); if (!iniFile.Save(iniFilename_.c_str())) { diff --git a/Core/Config.h b/Core/Config.h index c71999e35..a9494ed53 100644 --- a/Core/Config.h +++ b/Core/Config.h @@ -165,6 +165,7 @@ public: int iFontWidth; int iFontHeight; bool bDisplayStatusBar; + bool bShowBottomTabTitles; bool bShowDeveloperMenu; std::string currentDirectory; diff --git a/Windows/Debugger/Debugger_Disasm.cpp b/Windows/Debugger/Debugger_Disasm.cpp index ace871fa1..f686d004c 100644 --- a/Windows/Debugger/Debugger_Disasm.cpp +++ b/Windows/Debugger/Debugger_Disasm.cpp @@ -135,6 +135,7 @@ CDisasm::CDisasm(HINSTANCE _hInstance, HWND _hParent, DebugInterface *_cpu) : Di stackTraceView->loadStackTrace(); bottomTabs->AddTab(stackTraceView->GetHandle(),L"Stack frames"); + bottomTabs->SetShowTabTitles(g_Config.bShowBottomTabTitles); bottomTabs->ShowTab(memHandle); // init status bar diff --git a/Windows/W32Util/TabControl.cpp b/Windows/W32Util/TabControl.cpp index 9747f9725..8c55ad219 100644 --- a/Windows/W32Util/TabControl.cpp +++ b/Windows/W32Util/TabControl.cpp @@ -10,10 +10,15 @@ TabControl::TabControl(HWND handle): hwnd(handle), showTabTitles(true),currentTa { SetWindowLongPtr(hwnd,GWLP_USERDATA,(LONG_PTR)this); oldProc = (WNDPROC) SetWindowLongPtr(hwnd,GWLP_WNDPROC,(LONG_PTR)wndProc); + + hasButtons = (GetWindowLong(handle,GWL_STYLE) & TCS_BUTTONS) != 0; } HWND TabControl::AddTabWindow(wchar_t* className, wchar_t* title, DWORD style) { + TabInfo info; + info.hasBorder = (style & WS_BORDER) != 0; + style = (style |WS_CHILD) & tabControlStyleMask; if (showTabTitles) AppendPageToControl(title); @@ -27,8 +32,15 @@ HWND TabControl::AddTabWindow(wchar_t* className, wchar_t* title, DWORD style) HWND tabHandle = CreateWindowEx(0,className,title,style, tabRect.left,tabRect.top,tabRect.right-tabRect.left,tabRect.bottom-tabRect.top, GetParent(hwnd),0,MainWindow::GetHInstance(),0); + + info.hasClientEdge = (GetWindowLong(tabHandle,GWL_EXSTYLE) & WS_EX_CLIENTEDGE) != 0; + if (hasButtons == false) + { + SetWindowLong(tabHandle, GWL_STYLE, GetWindowLong(tabHandle,GWL_STYLE) & (~WS_BORDER)); + SetWindowLong(tabHandle, GWL_EXSTYLE, GetWindowLong(tabHandle,GWL_EXSTYLE) & (~WS_EX_CLIENTEDGE)); + } - TabInfo info; + info.lastFocus = tabHandle; info.pageHandle = tabHandle; wcscpy(info.title,title); tabs.push_back(info); @@ -55,11 +67,21 @@ void TabControl::AddTab(HWND handle, wchar_t* title) TabCtrl_AdjustRect(hwnd, FALSE, &tabRect); SetParent(handle,GetParent(hwnd)); - DWORD style = (GetWindowLong(handle,GWL_STYLE) | WS_CHILD) & tabControlStyleMask; - SetWindowLong(handle, GWL_STYLE, style); + DWORD style = (GetWindowLong(handle,GWL_STYLE) | WS_CHILD); + + TabInfo info; + info.hasBorder = (style & WS_BORDER) != 0; + info.hasClientEdge = (GetWindowLong(handle,GWL_EXSTYLE) & WS_EX_CLIENTEDGE) != 0; + if (hasButtons == false) + { + style &= (~WS_BORDER); + SetWindowLong(handle, GWL_EXSTYLE, GetWindowLong(handle,GWL_EXSTYLE) & (~WS_EX_CLIENTEDGE)); + } + + SetWindowLong(handle, GWL_STYLE, style & tabControlStyleMask); MoveWindow(handle,tabRect.left,tabRect.top,tabRect.right-tabRect.left,tabRect.bottom-tabRect.top,TRUE); - TabInfo info; + info.lastFocus = handle; info.pageHandle = handle; wcscpy(info.title,title); tabs.push_back(info); @@ -82,23 +104,48 @@ int TabControl::AppendPageToControl(wchar_t* title) return index; } +bool OffspringHasFocus(HWND handle) +{ + HWND offspring = GetFocus(); + HWND start = offspring; + + while (offspring != NULL) + { + if (offspring == handle) return true; + offspring = GetParent(offspring); + + // no idea if this can potentially go in circles, make sure to stop just in case + if (offspring == start) break; + } + + return false; +} + void TabControl::ShowTab(int index, bool setControlIndex) { + bool oldFocus = OffspringHasFocus(CurrentTabHandle()); + if (oldFocus) + tabs[CurrentTabIndex()].lastFocus = GetFocus(); + currentTab = index; for (size_t i = 0; i < tabs.size(); i++) { + if (oldFocus && i == index) + SetFocus(tabs[i].lastFocus); ShowWindow(tabs[i].pageHandle,i == index ? SW_NORMAL : SW_HIDE); } if (setControlIndex && showTabTitles) - { TabCtrl_SetCurSel(hwnd,index); - } } void TabControl::ShowTab(HWND pageHandle) { + bool oldFocus = OffspringHasFocus(CurrentTabHandle()); + if (oldFocus) + tabs[CurrentTabIndex()].lastFocus = GetFocus(); + for (size_t i = 0; i < tabs.size(); i++) { if (tabs[i].pageHandle == pageHandle) @@ -106,6 +153,8 @@ void TabControl::ShowTab(HWND pageHandle) currentTab = i; if (showTabTitles) TabCtrl_SetCurSel(hwnd,i); + if (oldFocus) + SetFocus(tabs[i].lastFocus); } ShowWindow(tabs[i].pageHandle,tabs[i].pageHandle == pageHandle ? SW_NORMAL : SW_HIDE); } @@ -126,8 +175,33 @@ void TabControl::SetShowTabTitles(bool enabled) for (int i = 0; i < (int) tabs.size(); i++) { AppendPageToControl(tabs[i].title); + + if (hasButtons == false) + { + DWORD style = GetWindowLong(tabs[i].pageHandle,GWL_STYLE) & (~WS_BORDER); + SetWindowLong(tabs[i].pageHandle,GWL_STYLE,style); + + DWORD exStyle = GetWindowLong(tabs[i].pageHandle,GWL_EXSTYLE) & (~WS_EX_CLIENTEDGE); + SetWindowLong(tabs[i].pageHandle,GWL_EXSTYLE,exStyle); + } } TabCtrl_SetCurSel(hwnd,CurrentTabIndex()); + } else if (hasButtons == false) + { + for (int i = 0; i < (int) tabs.size(); i++) + { + if (tabs[i].hasBorder) + { + DWORD style = GetWindowLong(tabs[i].pageHandle,GWL_STYLE) | WS_BORDER; + SetWindowLong(tabs[i].pageHandle,GWL_STYLE,style); + } + + if (tabs[i].hasClientEdge) + { + DWORD exStyle = GetWindowLong(tabs[i].pageHandle,GWL_EXSTYLE) | WS_EX_CLIENTEDGE; + SetWindowLong(tabs[i].pageHandle,GWL_EXSTYLE,exStyle); + } + } } OnResize(); @@ -182,9 +256,13 @@ void TabControl::OnResize() UpdateWindow(hwnd); // now resize tab children - int bottom = tabRect.bottom; - TabCtrl_AdjustRect(hwnd, FALSE, &tabRect); - if (ignoreBottomMargin) tabRect.bottom = bottom; + if (showTabTitles) + { + int bottom = tabRect.bottom; + TabCtrl_AdjustRect(hwnd, FALSE, &tabRect); + if (ignoreBottomMargin) tabRect.bottom = bottom; + } + int current = CurrentTabIndex(); for (size_t i = 0; i < tabs.size(); i++) diff --git a/Windows/W32Util/TabControl.h b/Windows/W32Util/TabControl.h index 95c1dd15c..94f0d4b34 100644 --- a/Windows/W32Util/TabControl.h +++ b/Windows/W32Util/TabControl.h @@ -28,6 +28,9 @@ private: struct TabInfo { + bool hasBorder; + bool hasClientEdge; + HWND lastFocus; HWND pageHandle; wchar_t title[128]; }; @@ -38,4 +41,5 @@ private: bool showTabTitles; bool ignoreBottomMargin; int currentTab; + bool hasButtons; }; \ No newline at end of file diff --git a/Windows/ppsspp.rc b/Windows/ppsspp.rc index 4149bd765..c2aa65308 100644 --- a/Windows/ppsspp.rc +++ b/Windows/ppsspp.rc @@ -160,10 +160,10 @@ BEGIN CONTROL "",IDC_LEFTTABS,"SysTabControl32",TCS_BUTTONS | TCS_FOCUSNEVER,1,63,78,15 LISTBOX IDC_FUNCTIONLIST,1,83,103,255,LBS_SORT | LBS_NOINTEGRALHEIGHT | NOT WS_VISIBLE | WS_VSCROLL | WS_TABSTOP PUSHBUTTON "VFPU",IDC_SHOWVFPU,83,63,24,12 - CONTROL "",IDC_BREAKPOINTLIST,"SysListView32",LVS_ALIGNLEFT | LVS_SHOWSELALWAYS | LVS_REPORT,1,338,513,93 - CONTROL "Custom2",IDC_DEBUGMEMVIEW,"CtrlMemView",0,1,338,513,93 - CONTROL "",IDC_THREADLIST,"SysListView32",LVS_ALIGNLEFT | LVS_SHOWSELALWAYS | LVS_REPORT,1,338,513,93 - CONTROL "",IDC_STACKFRAMES,"SysListView32",LVS_ALIGNLEFT | LVS_SHOWSELALWAYS | LVS_REPORT,1,338,513,93 + CONTROL "",IDC_BREAKPOINTLIST,"SysListView32",LVS_ALIGNLEFT | LVS_SHOWSELALWAYS | LVS_REPORT | WS_BORDER,1,338,513,93 + CONTROL "Custom2",IDC_DEBUGMEMVIEW,"CtrlMemView",WS_BORDER,1,338,513,93 + CONTROL "",IDC_THREADLIST,"SysListView32",LVS_ALIGNLEFT | LVS_SHOWSELALWAYS | LVS_REPORT | WS_BORDER,1,338,513,93 + CONTROL "",IDC_STACKFRAMES,"SysListView32",LVS_ALIGNLEFT | LVS_SHOWSELALWAYS | LVS_REPORT | WS_BORDER,1,338,513,93 CONTROL "",IDC_DEBUG_BOTTOMTABS,"SysTabControl32",TCS_TABS | TCS_FOCUSNEVER,1,338,513,93 END