summaryrefslogtreecommitdiffstats
path: root/xbmc/windows/GUIWindowDebugInfo.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'xbmc/windows/GUIWindowDebugInfo.cpp')
-rw-r--r--xbmc/windows/GUIWindowDebugInfo.cpp185
1 files changed, 185 insertions, 0 deletions
diff --git a/xbmc/windows/GUIWindowDebugInfo.cpp b/xbmc/windows/GUIWindowDebugInfo.cpp
new file mode 100644
index 0000000..764e6b0
--- /dev/null
+++ b/xbmc/windows/GUIWindowDebugInfo.cpp
@@ -0,0 +1,185 @@
+/*
+ * Copyright (C) 2005-2018 Team Kodi
+ * This file is part of Kodi - https://kodi.tv
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ * See LICENSES/README.md for more information.
+ */
+
+#include "GUIWindowDebugInfo.h"
+
+#include "CompileInfo.h"
+#include "GUIInfoManager.h"
+#include "ServiceBroker.h"
+#include "addons/Skin.h"
+#include "filesystem/SpecialProtocol.h"
+#include "guilib/GUIComponent.h"
+#include "guilib/GUIControlFactory.h"
+#include "guilib/GUIControlProfiler.h"
+#include "guilib/GUIFontManager.h"
+#include "guilib/GUITextLayout.h"
+#include "guilib/GUIWindowManager.h"
+#include "input/WindowTranslator.h"
+#include "settings/AdvancedSettings.h"
+#include "settings/SettingsComponent.h"
+#include "utils/CPUInfo.h"
+#include "utils/MemUtils.h"
+#include "utils/StringUtils.h"
+#include "utils/Variant.h"
+#include "utils/log.h"
+
+#include <inttypes.h>
+
+CGUIWindowDebugInfo::CGUIWindowDebugInfo(void)
+ : CGUIDialog(WINDOW_DEBUG_INFO, "", DialogModalityType::MODELESS)
+{
+ m_needsScaling = false;
+ m_layout = nullptr;
+ m_renderOrder = RENDER_ORDER_WINDOW_DEBUG;
+}
+
+CGUIWindowDebugInfo::~CGUIWindowDebugInfo(void) = default;
+
+void CGUIWindowDebugInfo::UpdateVisibility()
+{
+ if (LOG_LEVEL_DEBUG_FREEMEM <= CServiceBroker::GetSettingsComponent()->GetAdvancedSettings()->m_logLevel || g_SkinInfo->IsDebugging())
+ Open();
+ else
+ Close();
+}
+
+bool CGUIWindowDebugInfo::OnMessage(CGUIMessage &message)
+{
+ if (message.GetMessage() == GUI_MSG_WINDOW_DEINIT)
+ {
+ delete m_layout;
+ m_layout = nullptr;
+ }
+ else if (message.GetMessage() == GUI_MSG_REFRESH_TIMER)
+ MarkDirtyRegion();
+
+ return CGUIDialog::OnMessage(message);
+}
+
+void CGUIWindowDebugInfo::Process(unsigned int currentTime, CDirtyRegionList &dirtyregions)
+{
+ CServiceBroker::GetWinSystem()->GetGfxContext().SetRenderingResolution(CServiceBroker::GetWinSystem()->GetGfxContext().GetResInfo(), false);
+
+ CServiceBroker::GetCPUInfo()->GetUsedPercentage(); // must call it to recalculate pct values
+
+ static int yShift = 20;
+ static int xShift = 40;
+ static unsigned int lastShift = time(nullptr);
+ time_t now = time(nullptr);
+ if (now - lastShift > 10)
+ {
+ yShift *= -1;
+ if (now % 5 == 0)
+ xShift *= -1;
+ lastShift = now;
+ MarkDirtyRegion();
+ }
+
+ if (!m_layout)
+ {
+ CGUIFont *font13 = g_fontManager.GetDefaultFont();
+ CGUIFont *font13border = g_fontManager.GetDefaultFont(true);
+ if (font13)
+ m_layout = new CGUITextLayout(font13, true, 0, font13border);
+ }
+ if (!m_layout)
+ return;
+
+ std::string info;
+ if (LOG_LEVEL_DEBUG_FREEMEM <= CServiceBroker::GetSettingsComponent()->GetAdvancedSettings()->m_logLevel)
+ {
+ KODI::MEMORY::MemoryStatus stat;
+ KODI::MEMORY::GetMemoryStatus(&stat);
+ std::string profiling = CGUIControlProfiler::IsRunning() ? " (profiling)" : "";
+ std::string strCores;
+ if (CServiceBroker::GetCPUInfo()->SupportsCPUUsage())
+ strCores = CServiceBroker::GetCPUInfo()->GetCoresUsageString();
+ else
+ strCores = "N/A";
+ std::string lcAppName = CCompileInfo::GetAppName();
+ StringUtils::ToLower(lcAppName);
+#if !defined(TARGET_POSIX)
+ info = StringUtils::Format("LOG: {}{}.log\nMEM: {}/{} KB - FPS: {:2.1f} fps\nCPU: {}{}",
+ CSpecialProtocol::TranslatePath("special://logpath"), lcAppName,
+ stat.availPhys / 1024, stat.totalPhys / 1024,
+ CServiceBroker::GetGUI()
+ ->GetInfoManager()
+ .GetInfoProviders()
+ .GetSystemInfoProvider()
+ .GetFPS(),
+ strCores, profiling);
+#else
+ double dCPU = m_resourceCounter.GetCPUUsage();
+ std::string ucAppName = lcAppName;
+ StringUtils::ToUpper(ucAppName);
+ info = StringUtils::Format("LOG: {}{}.log\n"
+ "MEM: {}/{} KB - FPS: {:2.1f} fps\n"
+ "CPU: {} (CPU-{} {:4.2f}%{})",
+ CSpecialProtocol::TranslatePath("special://logpath"), lcAppName,
+ stat.availPhys / 1024, stat.totalPhys / 1024,
+ CServiceBroker::GetGUI()
+ ->GetInfoManager()
+ .GetInfoProviders()
+ .GetSystemInfoProvider()
+ .GetFPS(),
+ strCores, ucAppName, dCPU, profiling);
+#endif
+ }
+
+ // render the skin debug info
+ if (g_SkinInfo->IsDebugging())
+ {
+ if (!info.empty())
+ info += "\n";
+ CGUIWindow *window = CServiceBroker::GetGUI()->GetWindowManager().GetWindow(CServiceBroker::GetGUI()->GetWindowManager().GetActiveWindowOrDialog());
+ CGUIWindow *pointer = CServiceBroker::GetGUI()->GetWindowManager().GetWindow(WINDOW_DIALOG_POINTER);
+ CPoint point;
+ if (pointer)
+ point = CPoint(pointer->GetXPosition(), pointer->GetYPosition());
+ if (window)
+ {
+ std::string windowName = CWindowTranslator::TranslateWindow(window->GetID());
+ if (!windowName.empty())
+ windowName += " (" + window->GetProperty("xmlfile").asString() + ")";
+ else
+ windowName = window->GetProperty("xmlfile").asString();
+ info += "Window: " + windowName + "\n";
+ // transform the mouse coordinates to this window's coordinates
+ CServiceBroker::GetWinSystem()->GetGfxContext().SetScalingResolution(window->GetCoordsRes(), true);
+ point.x *= CServiceBroker::GetWinSystem()->GetGfxContext().GetGUIScaleX();
+ point.y *= CServiceBroker::GetWinSystem()->GetGfxContext().GetGUIScaleY();
+ CServiceBroker::GetWinSystem()->GetGfxContext().SetRenderingResolution(CServiceBroker::GetWinSystem()->GetGfxContext().GetResInfo(), false);
+ }
+ info += StringUtils::Format("Mouse: ({},{}) ", static_cast<int>(point.x),
+ static_cast<int>(point.y));
+ if (window)
+ {
+ CGUIControl *control = window->GetFocusedControl();
+ if (control)
+ info += StringUtils::Format(
+ "Focused: {} ({})", control->GetID(),
+ CGUIControlFactory::TranslateControlType(control->GetControlType()));
+ }
+ }
+
+ float w, h;
+ if (m_layout->Update(info))
+ MarkDirtyRegion();
+ m_layout->GetTextExtent(w, h);
+
+ float x = xShift + 0.04f * CServiceBroker::GetWinSystem()->GetGfxContext().GetWidth();
+ float y = yShift + 0.04f * CServiceBroker::GetWinSystem()->GetGfxContext().GetHeight();
+ m_renderRegion.SetRect(x, y, x+w, y+h);
+}
+
+void CGUIWindowDebugInfo::Render()
+{
+ CServiceBroker::GetWinSystem()->GetGfxContext().SetRenderingResolution(CServiceBroker::GetWinSystem()->GetGfxContext().GetResInfo(), false);
+ if (m_layout)
+ m_layout->RenderOutline(m_renderRegion.x1, m_renderRegion.y1, 0xffffffff, 0xff000000, 0, 0);
+}