summaryrefslogtreecommitdiffstats
path: root/xbmc/guilib/GUIVideoControl.cpp
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-10 18:07:22 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-10 18:07:22 +0000
commitc04dcc2e7d834218ef2d4194331e383402495ae1 (patch)
tree7333e38d10d75386e60f336b80c2443c1166031d /xbmc/guilib/GUIVideoControl.cpp
parentInitial commit. (diff)
downloadkodi-c04dcc2e7d834218ef2d4194331e383402495ae1.tar.xz
kodi-c04dcc2e7d834218ef2d4194331e383402495ae1.zip
Adding upstream version 2:20.4+dfsg.upstream/2%20.4+dfsg
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'xbmc/guilib/GUIVideoControl.cpp')
-rw-r--r--xbmc/guilib/GUIVideoControl.cpp108
1 files changed, 108 insertions, 0 deletions
diff --git a/xbmc/guilib/GUIVideoControl.cpp b/xbmc/guilib/GUIVideoControl.cpp
new file mode 100644
index 0000000..91a949f
--- /dev/null
+++ b/xbmc/guilib/GUIVideoControl.cpp
@@ -0,0 +1,108 @@
+/*
+ * 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 "GUIVideoControl.h"
+
+#include "GUIComponent.h"
+#include "GUIWindowManager.h"
+#include "ServiceBroker.h"
+#include "application/ApplicationComponents.h"
+#include "application/ApplicationPlayer.h"
+#include "application/ApplicationPowerHandling.h"
+#include "input/Key.h"
+#include "utils/ColorUtils.h"
+
+CGUIVideoControl::CGUIVideoControl(int parentID, int controlID, float posX, float posY, float width, float height)
+ : CGUIControl(parentID, controlID, posX, posY, width, height)
+{
+ ControlType = GUICONTROL_VIDEO;
+}
+
+CGUIVideoControl::~CGUIVideoControl(void) = default;
+
+void CGUIVideoControl::Process(unsigned int currentTime, CDirtyRegionList &dirtyregions)
+{
+ //! @todo Proper processing which marks when its actually changed. Just mark always for now.
+ const auto& components = CServiceBroker::GetAppComponents();
+ const auto appPlayer = components.GetComponent<CApplicationPlayer>();
+ if (appPlayer->IsRenderingGuiLayer())
+ MarkDirtyRegion();
+
+ CGUIControl::Process(currentTime, dirtyregions);
+}
+
+void CGUIVideoControl::Render()
+{
+ auto& components = CServiceBroker::GetAppComponents();
+ const auto appPlayer = components.GetComponent<CApplicationPlayer>();
+ if (appPlayer->IsRenderingVideo())
+ {
+ if (!appPlayer->IsPausedPlayback())
+ {
+ auto& appComponents = CServiceBroker::GetAppComponents();
+ const auto appPower = appComponents.GetComponent<CApplicationPowerHandling>();
+ appPower->ResetScreenSaver();
+ }
+
+ CServiceBroker::GetWinSystem()->GetGfxContext().SetViewWindow(m_posX, m_posY, m_posX + m_width, m_posY + m_height);
+ TransformMatrix mat;
+ CServiceBroker::GetWinSystem()->GetGfxContext().SetTransform(mat, 1.0, 1.0);
+
+ UTILS::COLOR::Color alpha =
+ CServiceBroker::GetWinSystem()->GetGfxContext().MergeAlpha(0xFF000000) >> 24;
+ if (appPlayer->IsRenderingVideoLayer())
+ {
+ CRect old = CServiceBroker::GetWinSystem()->GetGfxContext().GetScissors();
+ CRect region = GetRenderRegion();
+ region.Intersect(old);
+ CServiceBroker::GetWinSystem()->GetGfxContext().SetScissors(region);
+ CServiceBroker::GetWinSystem()->GetGfxContext().Clear(0);
+ CServiceBroker::GetWinSystem()->GetGfxContext().SetScissors(old);
+ }
+ else
+ appPlayer->Render(false, alpha);
+
+ CServiceBroker::GetWinSystem()->GetGfxContext().RemoveTransform();
+ }
+ CGUIControl::Render();
+}
+
+void CGUIVideoControl::RenderEx()
+{
+ auto& components = CServiceBroker::GetAppComponents();
+ const auto appPlayer = components.GetComponent<CApplicationPlayer>();
+ if (appPlayer->IsRenderingVideo())
+ appPlayer->Render(false, 255, false);
+
+ CGUIControl::RenderEx();
+}
+
+EVENT_RESULT CGUIVideoControl::OnMouseEvent(const CPoint &point, const CMouseEvent &event)
+{
+ const auto& components = CServiceBroker::GetAppComponents();
+ const auto appPlayer = components.GetComponent<CApplicationPlayer>();
+ if (!appPlayer->IsPlayingVideo())
+ return EVENT_RESULT_UNHANDLED;
+ if (event.m_id == ACTION_MOUSE_LEFT_CLICK)
+ { // switch to fullscreen
+ CGUIMessage message(GUI_MSG_FULLSCREEN, GetID(), GetParentID());
+ CServiceBroker::GetGUI()->GetWindowManager().SendMessage(message);
+ return EVENT_RESULT_HANDLED;
+ }
+ return EVENT_RESULT_UNHANDLED;
+}
+
+bool CGUIVideoControl::CanFocus() const
+{ // unfocusable
+ return false;
+}
+
+bool CGUIVideoControl::CanFocusFromPoint(const CPoint &point) const
+{ // mouse is allowed to focus this control, but it doesn't actually receive focus
+ return IsVisible() && HitTest(point);
+}