* beginning of event processing in X11 skins
[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.3 2003/05/13 20:36:29 asmax 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 #include <wx/wx.h>
32
33 //--- VLC -------------------------------------------------------------------
34 #include <vlc/intf.h>
35
36 //--- SKIN ------------------------------------------------------------------
37 #include "../os_api.h"
38 #include "../src/event.h"
39 #include "../os_event.h"
40 #include "../src/banks.h"
41 #include "../src/window.h"
42 #include "../os_window.h"
43 #include "../src/theme.h"
44 #include "../os_theme.h"
45 #include "../src/skin_common.h"
46 #include "../src/vlcproc.h"
47 #include "../../wxwindows/wxwindows.h"
48
49 // include the icon graphic
50 #include "share/vlc32x32.xpm"
51
52
53 //---------------------------------------------------------------------------
54 // Specific method
55 //---------------------------------------------------------------------------
56 bool IsVLCEvent( unsigned int msg );
57 int  SkinManage( intf_thread_t *p_intf );
58
59
60 //---------------------------------------------------------------------------
61 // Local classes declarations.
62 //---------------------------------------------------------------------------
63 class Instance: public wxApp
64 {
65 public:
66     Instance();
67     Instance( intf_thread_t *_p_intf );
68
69     bool OnInit();
70     OpenDialog *open;
71
72 private:
73     intf_thread_t *p_intf;
74 };
75
76
77 //---------------------------------------------------------------------------
78 // GTK2 interface
79 //---------------------------------------------------------------------------
80 /*void GTK2Proc( GdkEvent *event, gpointer data )
81 {
82     // Get objects from data
83     CallBackObjects *obj = (CallBackObjects *)data;
84     VlcProc *proc        = obj->Proc;
85
86     // Get pointer to thread info
87     intf_thread_t *p_intf = proc->GetpIntf();
88
89     // Variables
90     unsigned int msg;
91     Event *evt;
92     list<SkinWindow *>::const_iterator win;
93     GdkWindow *gwnd = ((GdkEventAny *)event)->window;
94
95     // Create event to dispatch in windows
96     // Skin event
97     if( event->type == GDK_CLIENT_EVENT )
98     {
99         msg = ( (GdkEventClient *)event )->data.l[0];
100         evt = (Event *)new OSEvent( p_intf, 
101             ((GdkEventAny *)event)->window,
102             msg,
103             ( (GdkEventClient *)event )->data.l[1],
104             ( (GdkEventClient *)event )->data.l[2] );
105     }
106     // System event
107     else
108     {
109         msg = event->type;
110         evt = (Event *)new OSEvent( p_intf,
111             ((GdkEventAny *)event)->window, msg, 0, (long)event );
112     }
113
114     // Process keyboard shortcuts
115     if( msg == GDK_KEY_PRESS )
116     {
117         int KeyModifier = 0;
118         // If key is ALT
119         if( ((GdkEventKey *)event)->state & GDK_MOD1_MASK )
120         {
121             KeyModifier = 1;
122         }
123         // If key is CTRL
124         else if( ((GdkEventKey *)event)->state & GDK_CONTROL_MASK )
125         {
126             KeyModifier = 2;
127         }
128         int key = ((GdkEventKey *)event)->keyval;
129         // Translate into lower case
130         if( key >= 'a' && key <= 'z' )
131         {
132             key -= ('a' - 'A');
133         }
134         if( KeyModifier > 0 )
135             p_intf->p_sys->p_theme->EvtBank->TestShortcut( key , KeyModifier );
136     }
137
138     // Send event
139     else if( IsVLCEvent( msg ) )
140     {
141         if( !proc->EventProc( evt ) )
142         {
143             wxExit();
144             return;      // Exit VLC !
145         }
146     }
147     else if( gwnd == NULL )
148     {
149         for( win = p_intf->p_sys->p_theme->WindowList.begin();
150              win != p_intf->p_sys->p_theme->WindowList.end(); win++ )
151         {
152             (*win)->ProcessEvent( evt );
153         }
154     }
155     else
156     {
157         // Find window matching with gwnd
158         for( win = p_intf->p_sys->p_theme->WindowList.begin();
159              win != p_intf->p_sys->p_theme->WindowList.end(); win++ )
160         {
161             // If it is the correct window
162             if( gwnd == ( (GTK2Window *)(*win) )->GetHandle() )
163             {
164                 // Send event and check if processed
165                 if( (*win)->ProcessEvent( evt ) )
166                 {
167                     delete (OSEvent *)evt;
168                     return;
169                 }
170                 else
171                 {
172                     break;
173                 }
174             }
175         }
176     }
177
178     evt->DestructParameters();
179     delete (OSEvent *)evt;
180
181     // Check if vlc is closing
182     proc->IsClosing();
183
184     gtk_main_do_event( event )
185 }*/
186 //---------------------------------------------------------------------------
187
188 //---------------------------------------------------------------------------
189 // REFRESH TIMER CALLBACK
190 //---------------------------------------------------------------------------
191 /*gboolean RefreshTimer( gpointer data )
192 {
193     intf_thread_t *p_intf = (intf_thread_t *)data;
194     SkinManage( p_intf );
195     return true;
196 }*/
197 //---------------------------------------------------------------------------
198
199
200 //---------------------------------------------------------------------------
201 // Implementation of Instance class
202 //---------------------------------------------------------------------------
203 Instance::Instance( )
204 {
205 }
206
207 Instance::Instance( intf_thread_t *_p_intf )
208 {
209     // Initialization
210     p_intf = _p_intf;
211 }
212
213 IMPLEMENT_APP_NO_MAIN(Instance)
214
215 bool Instance::OnInit()
216 {
217     // Set event callback. Yes, it's a big hack ;)
218 //    gdk_event_handler_set( GTK2Proc, (gpointer)callbackobj, NULL );
219
220     p_intf->p_sys->p_icon = new wxIcon( vlc_xpm );
221     p_intf->p_sys->OpenDlg = new OpenDialog( p_intf, NULL, FILE_ACCESS );
222     p_intf->p_sys->MessagesDlg = new Messages( p_intf, NULL );
223     p_intf->p_sys->SoutDlg = new SoutDialog( p_intf, NULL );
224     p_intf->p_sys->PrefsDlg = new PrefsDialog( p_intf, NULL );
225     p_intf->p_sys->InfoDlg = new FileInfo( p_intf, NULL );
226     
227     // Add timer
228 //    g_timeout_add( 200, (GSourceFunc)RefreshTimer, (gpointer)p_intf );
229
230     return TRUE;
231 }
232
233
234
235 //---------------------------------------------------------------------------
236 // X11 event processing
237 //---------------------------------------------------------------------------
238 void ProcessEvent( intf_thread_t *p_intf, VlcProc *proc, XEvent *event )
239 {
240     // Variables
241     list<SkinWindow *>::const_iterator win;
242     unsigned int msg;
243     Event *evt;
244
245     Window wnd = ((XAnyEvent *)event)->window;
246     
247     fprintf(stderr,"event %d %x\n", event->type, wnd);
248
249     // Create event to dispatch in windows
250     // Skin event
251     if( event->type == ClientMessage )
252     {
253 /*        msg = ( (GdkEventClient *)event )->data.l[0];
254         evt = (Event *)new OSEvent( p_intf, 
255             ((GdkEventAny *)event)->window,
256             msg,
257             ( (GdkEventClient *)event )->data.l[1],
258             ( (GdkEventClient *)event )->data.l[2] );*/
259     }
260     // System event
261     else
262     {
263         msg = event->type;
264         evt = (Event *)new OSEvent( p_intf,
265             ((XAnyEvent *)event)->window, msg, 0, (long)event );
266     }
267
268     // Process keyboard shortcuts
269     if( msg == KeyPress )
270     {
271 /*        int KeyModifier = 0;
272         // If key is ALT
273         if( ((GdkEventKey *)event)->state & GDK_MOD1_MASK )
274         {
275             KeyModifier = 1;
276         }
277         // If key is CTRL
278         else if( ((GdkEventKey *)event)->state & GDK_CONTROL_MASK )
279         {
280             KeyModifier = 2;
281         }
282         int key = ((GdkEventKey *)event)->keyval;
283         // Translate into lower case
284         if( key >= 'a' && key <= 'z' )
285         {
286             key -= ('a' - 'A');
287         }
288         if( KeyModifier > 0 )
289             p_intf->p_sys->p_theme->EvtBank->TestShortcut( key , KeyModifier );*/
290     }
291
292     // Send event
293     else if( IsVLCEvent( msg ) )
294     {
295         if( !proc->EventProc( evt ) )
296         {
297 //            wxExit();
298             return;      // Exit VLC !
299         }
300     }
301     else if( wnd == NULL )
302     {
303         for( win = p_intf->p_sys->p_theme->WindowList.begin();
304              win != p_intf->p_sys->p_theme->WindowList.end(); win++ )
305         {
306             (*win)->ProcessEvent( evt );
307         }
308     }
309     else
310     {
311         // Find window matching with gwnd
312         for( win = p_intf->p_sys->p_theme->WindowList.begin();
313              win != p_intf->p_sys->p_theme->WindowList.end(); win++ )
314         {
315             // If it is the correct window
316             if( wnd == ( (X11Window *)(*win) )->GetHandle() )
317             {
318                 // Send event and check if processed
319                 if( (*win)->ProcessEvent( evt ) )
320                 {
321                     delete (OSEvent *)evt;
322                     return;
323                 }
324                 else
325                 {
326                     break;
327                 }
328             }
329         }
330     }
331
332     evt->DestructParameters();
333     delete (OSEvent *)evt;
334
335 // Check if vlc is closing
336     proc->IsClosing();
337
338 }
339
340
341 //---------------------------------------------------------------------------
342 // X11 interface
343 //---------------------------------------------------------------------------
344 void OSRun( intf_thread_t *p_intf )
345 {
346     static char  *p_args[] = { "" };
347
348     VlcProc *proc = new VlcProc( p_intf );
349     
350 /*    wxTheApp = new Instance( p_intf, callbackobj );
351     wxEntry( 1, p_args );*/
352
353     Display *display = ((OSTheme *)p_intf->p_sys->p_theme)->GetDisplay();
354     
355     // Main event loop
356     while( 1 )
357     {
358         XEvent *event;
359         XNextEvent( display, event );
360         
361         ProcessEvent( p_intf, proc, event );
362     }
363     
364 }
365 //---------------------------------------------------------------------------
366 bool IsVLCEvent( unsigned int msg )
367 {
368     return( msg > VLC_MESSAGE && msg < VLC_WINDOW );
369 }
370 //---------------------------------------------------------------------------
371
372 #endif