1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
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);
}
|