]> git.saurik.com Git - wxWidgets.git/blame_incremental - utils/wxMMedia2/lib/vidxanm.cpp
makefile typo
[wxWidgets.git] / utils / wxMMedia2 / lib / vidxanm.cpp
... / ...
CommitLineData
1////////////////////////////////////////////////////////////////////////////////
2// Name: vidxanm.cpp
3// Purpose: wxMMedia
4// Author: Guilhem Lavaux
5// Created: 1997
6// Updated: 1998
7// Copyright: (C) 1997, 1998, 1999 Guilhem Lavaux
8// License: wxWindows license
9////////////////////////////////////////////////////////////////////////////////
10#ifdef __GNUG__
11#pragma implementation "vidxanm.h"
12#endif
13#ifdef WX_PRECOMP
14#include <wx_prec.h>
15#else
16#include <wx/wx.h>
17#endif
18#include <X11/Xlib.h>
19#include <X11/Intrinsic.h>
20#ifdef __WXGTK__
21#include <gtk/gtkwidget.h>
22#include <gtk/gtkwindow.h>
23#include <gdk/gdk.h>
24#include <gdk/gdkprivate.h>
25#endif
26
27#include <wx/filefn.h>
28#include <wx/wfstream.h>
29
30#define WXMMEDIA_INTERNAL
31#include "vidbase.h"
32#include "vidxanm.h"
33
34#if !USE_SHARED_LIBRARY
35IMPLEMENT_DYNAMIC_CLASS(wxVideoXANIM, wxVideoBaseDriver)
36#endif
37
38wxVideoXANIM::wxVideoXANIM()
39 : wxVideoBaseDriver()
40{
41 m_internal = new wxXANIMinternal;
42 m_xanim_started = FALSE;
43 m_paused = FALSE;
44 m_filename = "";
45}
46
47wxVideoXANIM::wxVideoXANIM(wxInputStream& str)
48 : wxVideoBaseDriver(str)
49{
50 m_internal = new wxXANIMinternal;
51 m_xanim_started = FALSE;
52 m_paused = FALSE;
53
54 m_filename = wxGetTempFileName("vidxa");
55 wxFileOutputStream fout(m_filename);
56
57 fout << str;
58}
59
60wxVideoXANIM::~wxVideoXANIM()
61{
62 if (m_xanim_started)
63 StopPlay();
64 delete m_internal;
65
66 wxRemoveFile(m_filename);
67}
68
69bool wxVideoXANIM::StartPlay()
70{
71 if (!m_paused && m_xanim_started)
72 return TRUE;
73 if (!m_video_output) {
74 wxVideoCreateFrame(this);
75 return TRUE;
76 }
77
78 if (SendCommand(" ")) {
79 m_paused = FALSE;
80 return TRUE;
81 }
82 return FALSE;
83}
84
85bool wxVideoXANIM::Pause()
86{
87 if (!m_paused && SendCommand(" ")) {
88 m_paused = TRUE;
89 return TRUE;
90 }
91 return FALSE;
92}
93
94bool wxVideoXANIM::Resume()
95{
96 if (m_paused && SendCommand(" ")) {
97 m_paused = FALSE;
98 return TRUE;
99 }
100 return FALSE;
101}
102
103void wxVideoXANIM::StopPlay()
104{
105 if (!m_xanim_started)
106 return;
107
108 SendCommand("q");
109
110 m_xanim_started = FALSE;
111 m_paused = FALSE;
112}
113
114bool wxVideoXANIM::SetVolume(wxUint8 vol)
115{
116 if (vol > 100)
117 vol = 100;
118
119 wxString str_vol("v%d", vol);
120 return SendCommand(str_vol.GetData());
121}
122
123bool wxVideoXANIM::Resize(wxUint16 WXUNUSED(w), wxUint16 WXUNUSED(h))
124{
125 // Not implemented
126 // Actually, I think that we just need to resize the output window ...
127 return FALSE;
128}
129
130bool wxVideoXANIM::IsCapable(wxVideoType v_type)
131{
132 if (v_type == wxVIDEO_MSAVI || v_type == wxVIDEO_MPEG ||
133 v_type == wxVIDEO_QT || v_type == wxVIDEO_GIF || v_type == wxVIDEO_JMOV ||
134 v_type == wxVIDEO_FLI || v_type == wxVIDEO_IFF || v_type == wxVIDEO_SGI)
135 return TRUE;
136 else
137 return FALSE;
138}
139
140bool wxVideoXANIM::AttachOutput(wxVideoOutput& out)
141{
142 if (!wxVideoBaseDriver::AttachOutput(out))
143 return FALSE;
144
145 return RestartXANIM();
146}
147
148void wxVideoXANIM::DetachOutput()
149{
150 SendCommand("q");
151 m_xanim_started = FALSE;
152 m_paused = FALSE;
153
154 wxVideoBaseDriver::DetachOutput();
155}
156
157bool wxVideoXANIM::SendCommand(const char *command, char **ret,
158 wxUint32 *size)
159{
160 if (!m_xanim_started)
161 if (!RestartXANIM())
162 return FALSE;
163
164 // Send a command to XAnim through X11 Property
165 XChangeProperty(m_internal->xanim_dpy, m_internal->xanim_window,
166 m_internal->xanim_atom,
167 XA_STRING, 8, PropModeReplace, (unsigned char *)command,
168 strlen(command));
169 XFlush(m_internal->xanim_dpy);
170 if (ret) {
171 int prop_format;
172 Atom prop_type;
173 unsigned long extra;
174
175 XGetWindowProperty(m_internal->xanim_dpy, m_internal->xanim_window,
176 m_internal->xanim_ret, 0, 16, True, AnyPropertyType,
177 &prop_type, &prop_format, (unsigned long *)size,
178 &extra, (unsigned char **)ret);
179 }
180 return TRUE;
181}
182
183bool wxVideoXANIM::RestartXANIM()
184{
185 wxString xanim_command;
186 int ret;
187 Atom prop_type;
188 int prop_format;
189 unsigned long nitems;
190 unsigned long extra;
191 char prop[4];
192 bool xanim_chg_size;
193
194 if (!m_video_output || m_xanim_started)
195 return FALSE;
196
197 // Check if we can change the size of the window dynamicly
198 xanim_chg_size = m_video_output->DynamicSize();
199 // Get current display
200#ifdef __WXGTK__
201 m_internal->xanim_dpy = gdk_display;
202 // We absolutely need the window to be realized.
203 gtk_widget_realize(m_video_output->m_wxwindow);
204 m_internal->xanim_window =
205 ((GdkWindowPrivate *)m_video_output->m_wxwindow->window)->xwindow;
206#endif
207 // Get the XANIM atom
208 m_internal->xanim_atom = XInternAtom(m_internal->xanim_dpy,
209 "XANIM_PROPERTY", False);
210
211 // Build the command
212 xanim_command.Printf(_T("xanim -Zr +Ze +Sr +f +W%d +f +q "
213 "+Av70 %s %s"), m_internal->xanim_window,
214 (xanim_chg_size) ? _T("") : _T(""),
215 WXSTRINGCAST m_filename);
216
217 // Execute it
218 if (!wxExecute(xanim_command, FALSE))
219 return FALSE;
220
221 // Wait for XAnim to be ready
222 nitems = 0;
223 while (nitems == 0) {
224 ret = XGetWindowProperty(m_internal->xanim_dpy, m_internal->xanim_window,
225 m_internal->xanim_atom,
226 0, 4, False, AnyPropertyType, &prop_type,
227 &prop_format, &nitems, &extra,
228 (unsigned char **)&prop);
229// wxYield();
230 }
231
232// m_paused = TRUE;
233 m_xanim_started = TRUE;
234
235 return TRUE;
236}