* src/video_output/video_output.c: new "deinterlace" object variable.
[vlc.git] / modules / gui / skins / x11 / x11_run.cpp
1 /*****************************************************************************
2  * x11_run.cpp:
3  *****************************************************************************
4  * Copyright (C) 2003 VideoLAN
5  * $Id: x11_run.cpp,v 1.7 2003/05/24 20:54:27 gbazin Exp $
6  *
7  * Authors: Cyril Deguet     <asmax@videolan.org>
8  *
9  * This program is free software; you can redistribute it and/or modify
10  * it under the terms of the GNU General Public License as published by
11  * the Free Software Foundation; either version 2 of the License, or
12  * (at your option) any later version.
13  *
14  * This program is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17  * GNU General Public License for more details.
18  *
19  * You should have received a copy of the GNU General Public License
20  * along with this program; if not, write to the Free Software
21  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111,
22  * USA.
23  *****************************************************************************/
24
25 #ifdef X11_SKINS
26
27 //--- X11 -------------------------------------------------------------------
28 #include <X11/Xlib.h>
29
30 //--- WWWINDOWS -------------------------------------------------------------
31 #ifndef BASIC_SKINS
32 #include <wx/wx.h>
33 #endif
34
35 //--- VLC -------------------------------------------------------------------
36 #include <vlc/intf.h>
37
38 //--- SKIN ------------------------------------------------------------------
39 #include "../os_api.h"
40 #include "../src/event.h"
41 #include "../os_event.h"
42 #include "../src/banks.h"
43 #include "../src/window.h"
44 #include "../os_window.h"
45 #include "../src/theme.h"
46 #include "../os_theme.h"
47 #include "../src/skin_common.h"
48 #include "../src/vlcproc.h"
49 #ifndef BASIC_SKINS
50 #include "../../wxwindows/wxwindows.h"
51 #endif
52
53 // include the icon graphic
54 #include "share/vlc32x32.xpm"
55
56 #include <unistd.h>
57
58
59 //---------------------------------------------------------------------------
60 // Specific method
61 //---------------------------------------------------------------------------
62 bool IsVLCEvent( unsigned int msg );
63 int  SkinManage( intf_thread_t *p_intf );
64
65
66 //---------------------------------------------------------------------------
67 // Local classes declarations.
68 //---------------------------------------------------------------------------
69 #ifndef BASIC_SKINS
70 class Instance: public wxApp
71 {
72 public:
73     Instance();
74     Instance( intf_thread_t *_p_intf );
75
76     bool OnInit();
77     OpenDialog *open;
78
79 private:
80     intf_thread_t *p_intf;
81 };
82 #endif
83
84
85 //---------------------------------------------------------------------------
86 // GTK2 interface
87 //---------------------------------------------------------------------------
88 /*void GTK2Proc( GdkEvent *event, gpointer data )
89 {
90     // Get objects from data
91     CallBackObjects *obj = (CallBackObjects *)data;
92     VlcProc *proc        = obj->Proc;
93
94     // Get pointer to thread info
95     intf_thread_t *p_intf = proc->GetpIntf();
96
97     // Variables
98     unsigned int msg;
99     Event *evt;
100     list<SkinWindow *>::const_iterator win;
101     GdkWindow *gwnd = ((GdkEventAny *)event)->window;
102
103     // Create event to dispatch in windows
104     // Skin event
105     if( event->type == GDK_CLIENT_EVENT )
106     {
107         msg = ( (GdkEventClient *)event )->data.l[0];
108         evt = (Event *)new OSEvent( p_intf, 
109             ((GdkEventAny *)event)->window,
110             msg,
111             ( (GdkEventClient *)event )->data.l[1],
112             ( (GdkEventClient *)event )->data.l[2] );
113     }
114     // System event
115     else
116     {
117         msg = event->type;
118         evt = (Event *)new OSEvent( p_intf,
119             ((GdkEventAny *)event)->window, msg, 0, (long)event );
120     }
121
122     // Process keyboard shortcuts
123     if( msg == GDK_KEY_PRESS )
124     {
125         int KeyModifier = 0;
126         // If key is ALT
127         if( ((GdkEventKey *)event)->state & GDK_MOD1_MASK )
128         {
129             KeyModifier = 1;
130         }
131         // If key is CTRL
132         else if( ((GdkEventKey *)event)->state & GDK_CONTROL_MASK )
133         {
134             KeyModifier = 2;
135         }
136         int key = ((GdkEventKey *)event)->keyval;
137         // Translate into lower case
138         if( key >= 'a' && key <= 'z' )
139         {
140             key -= ('a' - 'A');
141         }
142         if( KeyModifier > 0 )
143             p_intf->p_sys->p_theme->EvtBank->TestShortcut( key , KeyModifier );
144     }
145
146     // Send event
147     else if( IsVLCEvent( msg ) )
148     {
149         if( !proc->EventProc( evt ) )
150         {
151             wxExit();
152             return;      // Exit VLC !
153         }
154     }
155     else if( gwnd == NULL )
156     {
157         for( win = p_intf->p_sys->p_theme->WindowList.begin();
158              win != p_intf->p_sys->p_theme->WindowList.end(); win++ )
159         {
160             (*win)->ProcessEvent( evt );
161         }
162     }
163     else
164     {
165         // Find window matching with gwnd
166         for( win = p_intf->p_sys->p_theme->WindowList.begin();
167              win != p_intf->p_sys->p_theme->WindowList.end(); win++ )
168         {
169             // If it is the correct window
170             if( gwnd == ( (GTK2Window *)(*win) )->GetHandle() )
171             {
172                 // Send event and check if processed
173                 if( (*win)->ProcessEvent( evt ) )
174                 {
175                     delete (OSEvent *)evt;
176                     return;
177                 }
178                 else
179                 {
180                     break;
181                 }
182             }
183         }
184     }
185
186     evt->DestructParameters();
187     delete (OSEvent *)evt;
188
189     // Check if vlc is closing
190     proc->IsClosing();
191
192     gtk_main_do_event( event )
193 }*/
194 //---------------------------------------------------------------------------
195
196
197 //---------------------------------------------------------------------------
198 // Implementation of Instance class
199 //---------------------------------------------------------------------------
200 #ifndef BASIC_SKINS
201 Instance::Instance( )
202 {
203 }
204
205 Instance::Instance( intf_thread_t *_p_intf )
206 {
207     // Initialization
208     p_intf = _p_intf;
209 }
210
211 IMPLEMENT_APP_NO_MAIN(Instance)
212
213 bool Instance::OnInit()
214 {
215     // Set event callback. Yes, it's a big hack ;)
216 //    gdk_event_handler_set( GTK2Proc, (gpointer)callbackobj, NULL );
217
218     p_intf->p_sys->p_icon = new wxIcon( vlc_xpm );
219     p_intf->p_sys->OpenDlg = new OpenDialog( p_intf, NULL, FILE_ACCESS );
220     p_intf->p_sys->MessagesDlg = new Messages( p_intf, NULL );
221     p_intf->p_sys->SoutDlg = new SoutDialog( p_intf, NULL );
222     p_intf->p_sys->PrefsDlg = new PrefsDialog( p_intf, NULL );
223     p_intf->p_sys->InfoDlg = new FileInfo( p_intf, NULL );
224     
225     // Add timer
226 //    g_timeout_add( 200, (GSourceFunc)RefreshTimer, (gpointer)p_intf );
227
228     return TRUE;
229 }
230 #endif
231
232
233 //---------------------------------------------------------------------------
234 // X11 event processing
235 //---------------------------------------------------------------------------
236 void ProcessEvent( intf_thread_t *p_intf, VlcProc *proc, XEvent *event )
237 {
238     // Variables
239     list<SkinWindow *>::const_iterator win;
240     unsigned int msg;
241     Event *evt;
242
243     Window wnd = ((XAnyEvent *)event)->window;
244     
245 //    fprintf(stderr,"event %d %x\n", event->type, wnd);
246
247     // Create event to dispatch in windows
248     // Skin event
249     if( event->type == ClientMessage )
250     {
251         msg = ( (XClientMessageEvent *)event )->data.l[0];
252         evt = (Event *)new OSEvent( p_intf, 
253             ((XAnyEvent *)event)->window, msg,
254             ( (XClientMessageEvent *)event )->data.l[1],
255             ( (XClientMessageEvent *)event )->data.l[2] );
256     }
257     // System event
258     else
259     {
260         msg = event->type;
261         evt = (Event *)new OSEvent( p_intf,
262             ((XAnyEvent *)event)->window, msg, 0, (long)event );
263     }
264
265     // Process keyboard shortcuts
266     if( msg == KeyPress )
267     {
268 /*        int KeyModifier = 0;
269         // If key is ALT
270         if( ((GdkEventKey *)event)->state & GDK_MOD1_MASK )
271         {
272             KeyModifier = 1;
273         }
274         // If key is CTRL
275         else if( ((GdkEventKey *)event)->state & GDK_CONTROL_MASK )
276         {
277             KeyModifier = 2;
278         }
279         int key = ((GdkEventKey *)event)->keyval;
280         // Translate into lower case
281         if( key >= 'a' && key <= 'z' )
282         {
283             key -= ('a' - 'A');
284         }
285         if( KeyModifier > 0 )
286             p_intf->p_sys->p_theme->EvtBank->TestShortcut( key , KeyModifier );*/
287     }
288
289     // Send event
290     else if( IsVLCEvent( msg ) )
291     {
292         if( !proc->EventProc( evt ) )
293         {
294 //            wxExit();
295             return;      // Exit VLC !
296         }
297     }
298     else if( wnd == NULL )
299     {
300         for( win = p_intf->p_sys->p_theme->WindowList.begin();
301              win != p_intf->p_sys->p_theme->WindowList.end(); win++ )
302         {
303             (*win)->ProcessEvent( evt );
304         }
305     }
306     else
307     {
308         // Find window matching with gwnd
309         for( win = p_intf->p_sys->p_theme->WindowList.begin();
310              win != p_intf->p_sys->p_theme->WindowList.end(); win++ )
311         {
312             // If it is the correct window
313             if( wnd == ( (X11Window *)(*win) )->GetHandle() )
314             {
315                 // Send event and check if processed
316                 if( (*win)->ProcessEvent( evt ) )
317                 {
318                     delete (OSEvent *)evt;
319                     return;
320                 }
321                 else
322                 {
323                     break;
324                 }
325             }
326         }
327     }
328
329     evt->DestructParameters();
330     delete (OSEvent *)evt;
331
332 // Check if vlc is closing
333     proc->IsClosing();
334
335 }
336
337
338 //---------------------------------------------------------------------------
339 // X11 interface
340 //---------------------------------------------------------------------------
341 void OSRun( intf_thread_t *p_intf )
342 {
343     static char  *p_args[] = { "" };
344
345     VlcProc *proc = new VlcProc( p_intf );
346     
347 #ifndef BASIC_SKINS
348     wxTheApp = new Instance( p_intf );
349     wxEntry( 1, p_args );
350 #endif
351
352     Display *display = ((OSTheme *)p_intf->p_sys->p_theme)->GetDisplay();
353     
354     // Main event loop
355     int count = 0;
356     while( 1 )
357     {
358         XEvent event;
359         while( XPending( display ) > 0 )
360         {
361             XNextEvent( display, &event );
362             ProcessEvent( p_intf, proc, &event );
363         }
364         usleep( 1000 );
365         if( ++count == 100 )
366         {
367             count = 0;
368             SkinManage( p_intf );    // Call every 100 ms
369         }
370     }
371     
372 }
373 //---------------------------------------------------------------------------
374 bool IsVLCEvent( unsigned int msg )
375 {
376     return( msg > VLC_MESSAGE && msg < VLC_WINDOW );
377 }
378 //---------------------------------------------------------------------------
379
380 #endif