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 <QtGui/QAction> |
31 | #define IFACES4 VideoWidgetInterface44 |
32 | #define IFACES0 VideoWidgetInterface, IFACES4 |
33 | #define PHONON_INTERFACENAME IFACES0 |
34 | |
35 | QT_BEGIN_NAMESPACE |
36 | |
37 | #ifndef QT_NO_PHONON_VIDEO |
38 | |
39 | namespace Phonon |
40 | { |
41 | |
42 | VideoWidget::VideoWidget(QWidget *parent) |
43 | : QWidget(parent) |
44 | , Phonon::AbstractVideoOutput(*new VideoWidgetPrivate(this)) |
45 | { |
46 | K_D(VideoWidget); |
47 | d->init(); |
48 | d->createBackendObject(); |
49 | setMouseTracking(true); |
50 | } |
51 | |
52 | |
53 | |
54 | VideoWidget::VideoWidget(VideoWidgetPrivate &dd, QWidget *parent) |
55 | : QWidget(parent), |
56 | Phonon::AbstractVideoOutput(dd) |
57 | { |
58 | K_D(VideoWidget); |
59 | d->init(); |
60 | } |
61 | |
62 | void VideoWidgetPrivate::init() |
63 | { |
64 | Q_Q(VideoWidget); |
65 | changeFlags = q->windowFlags() & (Qt::SubWindow | Qt::Window); |
66 | } |
67 | |
68 | void VideoWidget::mouseMoveEvent(QMouseEvent *e) |
69 | { |
70 | QWidget::mouseMoveEvent(e); |
71 | } |
72 | |
73 | void VideoWidgetPrivate::createBackendObject() |
74 | { |
75 | if (m_backendObject) |
76 | return; |
77 | Q_Q(VideoWidget); |
78 | m_backendObject = Factory::createVideoWidget(q); |
79 | if (m_backendObject) { |
80 | setupBackendObject(); |
81 | } |
82 | } |
83 | |
84 | #define PHONON_CLASSNAME VideoWidget |
85 | |
86 | PHONON_INTERFACE_GETTER(Phonon::VideoWidget::AspectRatio, aspectRatio, d->aspectRatio) |
87 | PHONON_INTERFACE_SETTER(setAspectRatio, aspectRatio, Phonon::VideoWidget::AspectRatio) |
88 | |
89 | PHONON_INTERFACE_GETTER(Phonon::VideoWidget::ScaleMode, scaleMode, d->scaleMode) |
90 | PHONON_INTERFACE_SETTER(setScaleMode, scaleMode, Phonon::VideoWidget::ScaleMode) |
91 | |
92 | PHONON_INTERFACE_GETTER(qreal, brightness, d->brightness) |
93 | PHONON_INTERFACE_SETTER(setBrightness, brightness, qreal) |
94 | |
95 | PHONON_INTERFACE_GETTER(qreal, contrast, d->contrast) |
96 | PHONON_INTERFACE_SETTER(setContrast, contrast, qreal) |
97 | |
98 | PHONON_INTERFACE_GETTER(qreal, hue, d->hue) |
99 | PHONON_INTERFACE_SETTER(setHue, hue, qreal) |
100 | |
101 | PHONON_INTERFACE_GETTER(qreal, saturation, d->saturation) |
102 | PHONON_INTERFACE_SETTER(setSaturation, saturation, qreal) |
103 | |
104 | |
105 | QImage VideoWidget::snapshot() const { |
106 | K_D(const VideoWidget); |
107 | ConstIface<IFACES4> iface(d); |
108 | if(iface) return iface->snapshot(); |
109 | return QImage(); // TODO not implemented in VideoInterface |
110 | } |
111 | |
112 | |
113 | void VideoWidget::setFullScreen(bool newFullScreen) |
114 | { |
115 | pDebug() << Q_FUNC_INFO << newFullScreen; |
116 | K_D(VideoWidget); |
117 | // TODO: disable screensaver? or should we leave that responsibility to the |
118 | // application? |
119 | Qt::WindowFlags flags = windowFlags(); |
120 | if (newFullScreen) { |
121 | if (!isFullScreen()) { |
122 | //we only update that value if it is not already fullscreen |
123 | d->changeFlags = flags & (Qt::Window | Qt::SubWindow); |
124 | flags |= Qt::Window; |
125 | flags ^= Qt::SubWindow; |
126 | setWindowFlags(flags); |
127 | #ifdef Q_WS_X11 |
128 | // This works around a bug with Compiz |
129 | // as the window must be visible before we can set the state |
130 | show(); |
131 | raise(); |
132 | setWindowState( windowState() | Qt::WindowFullScreen ); // set |
133 | #else |
134 | setWindowState( windowState() | Qt::WindowFullScreen ); // set |
135 | show(); |
136 | #endif |
137 | } |
138 | } else if (isFullScreen()) { |
139 | flags ^= (Qt::Window | Qt::SubWindow); //clear the flags... |
140 | flags |= d->changeFlags; //then we reset the flags (window and subwindow) |
141 | setWindowFlags(flags); |
142 | setWindowState( windowState() ^ Qt::WindowFullScreen ); // reset |
143 | show(); |
144 | } |
145 | } |
146 | |
147 | void VideoWidget::exitFullScreen() |
148 | { |
149 | setFullScreen(false); |
150 | } |
151 | |
152 | void VideoWidget::enterFullScreen() |
153 | { |
154 | setFullScreen(true); |
155 | } |
156 | |
157 | bool VideoWidgetPrivate::aboutToDeleteBackendObject() |
158 | { |
159 | aspectRatio = pINTERFACE_CALL(aspectRatio()); |
160 | scaleMode = pINTERFACE_CALL(scaleMode()); |
161 | return AbstractVideoOutputPrivate::aboutToDeleteBackendObject(); |
162 | } |
163 | |
164 | void VideoWidgetPrivate::setupBackendObject() |
165 | { |
166 | Q_Q(VideoWidget); |
167 | Q_ASSERT(m_backendObject); |
168 | //AbstractVideoOutputPrivate::setupBackendObject(); |
169 | pDebug() << "calling setAspectRatio on the backend " << aspectRatio; |
170 | pINTERFACE_CALL(setAspectRatio(aspectRatio)); |
171 | pINTERFACE_CALL(setScaleMode(scaleMode)); |
172 | |
173 | QWidget *w = pINTERFACE_CALL(widget()); |
174 | if (w) { |
175 | layout.addWidget(w); |
176 | q->setSizePolicy(w->sizePolicy()); |
177 | w->setMouseTracking(true); |
178 | } |
179 | } |
180 | |
181 | bool VideoWidget::event(QEvent *e) |
182 | { |
183 | return QWidget::event(e); |
184 | } |
185 | |
186 | } //namespace Phonon |
187 | |
188 | #endif //QT_NO_PHONON_VIDEO |
189 | |
190 | QT_END_NAMESPACE |
191 | |
192 | #include "moc_videowidget.cpp" |
193 | |
194 | #undef PHONON_CLASSNAME |
195 | // vim: sw=4 ts=4 tw=80 |
196 | |