1 /*  This file is part of the KDE project
2     Copyright (C) 2005-2007 Matthias Kretz <kretz@kde.org>
3 
4     This library is free software; you can redistribute it and/or
5     modify it under the terms of the GNU Lesser General Public
6     License as published by the Free Software Foundation; either
7     version 2.1 of the License, or (at your option) version 3, or any
8     later version accepted by the membership of KDE e.V. (or its
9     successor approved by the membership of KDE e.V.), Nokia Corporation
10     (or its successors, if any) and the KDE Free Qt Foundation, which shall
11     act as a proxy defined in Section 6 of version 3 of the license.
12 
13     This library is distributed in the hope that it will be useful,
14     but WITHOUT ANY WARRANTY; without even the implied warranty of
15     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16     Lesser General Public License for more details.
17 
18     You should have received a copy of the GNU Lesser General Public
19     License along with this library.  If not, see <http://www.gnu.org/licenses/>.
20 
21 */
22 
23 #include "videowidget.h"
24 #include "videowidget_p.h"
25 #include "videowidgetinterface.h"
26 #include "factory_p.h"
27 #include "phonondefs_p.h"
28 #include "phononnamespace_p.h"
29 
30 #include <QAction>
31 #define IFACES4 VideoWidgetInterface44
32 #define IFACES0 VideoWidgetInterface, IFACES4
33 #define PHONON_INTERFACENAME IFACES0
34 
35 #ifndef QT_NO_PHONON_VIDEO
36 
37 namespace Phonon
38 {
39 
VideoWidget(QWidget * parent)40 VideoWidget::VideoWidget(QWidget *parent)
41     : QWidget(parent)
42     , Phonon::AbstractVideoOutput(*new VideoWidgetPrivate(this))
43 {
44     P_D(VideoWidget);
45     d->init();
46     d->createBackendObject();
47     setMouseTracking(true);
48 }
49 
50 
51 
VideoWidget(VideoWidgetPrivate & dd,QWidget * parent)52 VideoWidget::VideoWidget(VideoWidgetPrivate &dd, QWidget *parent)
53     : QWidget(parent),
54     Phonon::AbstractVideoOutput(dd)
55 {
56     P_D(VideoWidget);
57     d->init();
58 }
59 
init()60 void VideoWidgetPrivate::init()
61 {
62     P_Q(VideoWidget);
63     changeFlags = q->windowFlags() & (Qt::SubWindow | Qt::Window);
64 }
65 
mouseMoveEvent(QMouseEvent * e)66 void VideoWidget::mouseMoveEvent(QMouseEvent *e)
67 {
68     QWidget::mouseMoveEvent(e);
69 }
70 
createBackendObject()71 void VideoWidgetPrivate::createBackendObject()
72 {
73     if (m_backendObject)
74         return;
75     P_Q(VideoWidget);
76     m_backendObject = Factory::createVideoWidget(q);
77     if (m_backendObject) {
78         setupBackendObject();
79     }
80 }
81 
82 #define PHONON_CLASSNAME VideoWidget
83 
84 PHONON_INTERFACE_GETTER(Phonon::VideoWidget::AspectRatio, aspectRatio, d->aspectRatio)
PHONON_INTERFACE_SETTER(setAspectRatio,aspectRatio,Phonon::VideoWidget::AspectRatio)85 PHONON_INTERFACE_SETTER(setAspectRatio, aspectRatio, Phonon::VideoWidget::AspectRatio)
86 
87 PHONON_INTERFACE_GETTER(Phonon::VideoWidget::ScaleMode, scaleMode, d->scaleMode)
88 PHONON_INTERFACE_SETTER(setScaleMode, scaleMode, Phonon::VideoWidget::ScaleMode)
89 
90 PHONON_INTERFACE_GETTER(qreal, brightness, d->brightness)
91 PHONON_INTERFACE_SETTER(setBrightness, brightness, qreal)
92 
93 PHONON_INTERFACE_GETTER(qreal, contrast, d->contrast)
94 PHONON_INTERFACE_SETTER(setContrast, contrast, qreal)
95 
96 PHONON_INTERFACE_GETTER(qreal, hue, d->hue)
97 PHONON_INTERFACE_SETTER(setHue, hue, qreal)
98 
99 PHONON_INTERFACE_GETTER(qreal, saturation, d->saturation)
100 PHONON_INTERFACE_SETTER(setSaturation, saturation, qreal)
101 
102 
103 QImage VideoWidget::snapshot() const {
104     P_D(const VideoWidget);
105     ConstIface<IFACES4> iface(d);
106     if(iface) return iface->snapshot();
107     return QImage(); // TODO not implemented in VideoInterface
108 }
109 
110 
setFullScreen(bool newFullScreen)111 void VideoWidget::setFullScreen(bool newFullScreen)
112 {
113     pDebug() << Q_FUNC_INFO << newFullScreen;
114     P_D(VideoWidget);
115     // TODO: disable screensaver? or should we leave that responsibility to the
116     // application?
117     Qt::WindowFlags flags = windowFlags();
118     if (newFullScreen) {
119         if (!isFullScreen()) {
120             //we only update that value if it is not already fullscreen
121             d->changeFlags = flags & (Qt::Window | Qt::SubWindow);
122             flags |= Qt::Window;
123             flags ^= Qt::SubWindow;
124             setWindowFlags(flags);
125 #ifdef Q_WS_X11
126             // This works around a bug with Compiz
127             // as the window must be visible before we can set the state
128             show();
129             raise();
130             setWindowState( windowState() | Qt::WindowFullScreen ); // set
131 #else
132             setWindowState( windowState() | Qt::WindowFullScreen ); // set
133             show();
134 #endif
135         }
136     } else if (isFullScreen()) {
137         flags ^= (Qt::Window | Qt::SubWindow); //clear the flags...
138         flags |= d->changeFlags; //then we reset the flags (window and subwindow)
139         setWindowFlags(flags);
140         setWindowState( windowState()  ^ Qt::WindowFullScreen ); // reset
141         show();
142     }
143 }
144 
exitFullScreen()145 void VideoWidget::exitFullScreen()
146 {
147     setFullScreen(false);
148 }
149 
enterFullScreen()150 void VideoWidget::enterFullScreen()
151 {
152     setFullScreen(true);
153 }
154 
aboutToDeleteBackendObject()155 bool VideoWidgetPrivate::aboutToDeleteBackendObject()
156 {
157     aspectRatio = pINTERFACE_CALL(aspectRatio());
158     scaleMode = pINTERFACE_CALL(scaleMode());
159     return AbstractVideoOutputPrivate::aboutToDeleteBackendObject();
160 }
161 
setupBackendObject()162 void VideoWidgetPrivate::setupBackendObject()
163 {
164     P_Q(VideoWidget);
165     Q_ASSERT(m_backendObject);
166     //AbstractVideoOutputPrivate::setupBackendObject();
167     pDebug() << "calling setAspectRatio on the backend " << aspectRatio;
168     pINTERFACE_CALL(setAspectRatio(aspectRatio));
169     pINTERFACE_CALL(setScaleMode(scaleMode));
170 
171     QWidget *w = pINTERFACE_CALL(widget());
172     if (w) {
173         layout.addWidget(w);
174         q->setSizePolicy(w->sizePolicy());
175         w->setMouseTracking(true);
176     }
177 }
178 
event(QEvent * e)179 bool VideoWidget::event(QEvent *e)
180 {
181     return QWidget::event(e);
182 }
183 
184 } //namespace Phonon
185 
186 #endif //QT_NO_PHONON_VIDEO
187 
188 #include "moc_videowidget.cpp"
189 
190 #undef PHONON_CLASSNAME
191 // vim: sw=4 ts=4 tw=80
192