diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-10 18:07:22 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-10 18:07:22 +0000 |
commit | c04dcc2e7d834218ef2d4194331e383402495ae1 (patch) | |
tree | 7333e38d10d75386e60f336b80c2443c1166031d /xbmc/guilib/GUIVideoControl.cpp | |
parent | Initial commit. (diff) | |
download | kodi-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.cpp | 108 |
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); +} |