frontport [17255]
[vlc.git] / modules / gui / wxwidgets / wxwidgets.hpp
1 /*****************************************************************************
2  * wxwidgets.hpp: Common headers for the wxwidges interface
3  *****************************************************************************
4  * Copyright (C) 1999-2005 the VideoLAN team
5  * $Id$
6  *
7  * Authors: Gildas Bazin <gbazin@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., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
22  *****************************************************************************/
23
24 #ifndef _WXVLC_WIDGETS_H_
25 #define _WXVLC_WIDGETS_H_
26
27 #ifdef WIN32                                                 /* mingw32 hack */
28 #undef Yield
29 #undef CreateDialog
30 #endif
31
32 #ifdef _MSC_VER
33 // turn off 'identifier was truncated to '255' characters in the debug info'
34 #   pragma warning( disable:4786 )
35 #endif
36
37 /* Let vlc take care of the i18n stuff */
38 #define WXINTL_NO_GETTEXT_MACRO
39
40 #include <vlc/vlc.h>
41 #include <vlc/intf.h>
42 #include "charset.h"
43
44 #include <wx/wx.h>
45 #define SLIDER_MAX_POS 10000
46
47 /*
48 #include <wx/listctrl.h>
49 #include <wx/textctrl.h>
50 #include <wx/notebook.h>
51 #include <wx/spinctrl.h>
52 #include <wx/dnd.h>
53 #include <wx/treectrl.h>
54 #include <wx/gauge.h>
55 #include <wx/accel.h>
56 #include <wx/checkbox.h>
57 #include <wx/wizard.h>
58 #include <wx/taskbar.h>
59 #include "vlc_keys.h"
60 */
61 #if (!wxCHECK_VERSION(2,5,0))
62 typedef long wxTreeItemIdValue;
63 #endif
64
65 DECLARE_LOCAL_EVENT_TYPE( wxEVT_DIALOG, 0 );
66 DECLARE_LOCAL_EVENT_TYPE( wxEVT_INTF, 1 );
67
68 /***************************************************************************
69  * I18N macros
70  ***************************************************************************/
71
72 /*
73  * wxU() is used to convert UTF-8 strings (typically from gettext)
74  * to unicode strings (wchar_t).
75  */
76 #if wxUSE_UNICODE
77 #   define wxU(utf8) wxString(utf8, wxConvUTF8)
78 #else
79 #   define wxU(utf8) wxString(wxConvUTF8.cMB2WC(utf8), *wxConvCurrent)
80 #endif
81
82 /*
83  * wxL2U() use to convert localized “data” strings (while wxU() would convert
84  * strings from gettext messages). Nowadays, the core use UTF-8 internally
85  * and wxL2U() is only an obsoleted name for wxU().
86  */
87 #define wxL2U(utf8) wxU(utf8)
88
89 /*
90  * wxFromLocale() is a replacement for LibVLC FromLocale() that accepts
91  * a wxString. It was originally introduced because wxString::mb_str()
92  * sucks on Linux with Unicode wxWidgets. It then turned out wxWidgets
93  * did not support wc_str() when Unicode was not enabled.
94  *
95  * But heh, that's wxWidgets; you can't really expect it to actually
96  * work, let alone work like its documentation says.
97  *
98  * Did it work, we would be able to catch non-ANSI characters on Windows
99  * through wxString::wc_str(); while they are lost when using mb_str().
100  * This would be particularly useful to open files whose names contain
101  * non-ACP characters.
102  */
103 #if wxUSE_UNICODE
104 #   define wxFromLocale(wxstring) FromWide(wxstring.wc_str())
105 #   define wxLocaleFree(string) free(string)
106 #else
107 #   define wxFromLocale(wxstring) FromLocale(wxstring.mb_str())
108 #   define wxLocaleFree(string) LocaleFree(string)
109 #endif
110         
111 /* From Locale functions to use for File Drop targets ... go figure */
112 #ifdef wxUSE_UNICODE
113 #include <wchar.h>
114
115 static inline char *wxDnDFromLocale( const wxChar *stupid )
116 {
117     /*
118      * In Unicode mode, wxWidgets will encode file names in the locale
119      * encoding with each **bytes** (rather than characters) represented
120      * by a 32 bits unsigned integer. If you are lucky enough to be using
121      * ISO-8859-1 as your local character encoding, that lame encoding
122      * scheme happens to be identical to UTF-32 with your arch native
123      * byte-endianess. If you are using anything else, including not only
124      * UTF-8 but also Windows-1252(!) and ISO-8859-15(!) or any
125      * non-western encoding, it obviously fails.
126      */
127     size_t n = wcslen ((const wchar_t *)stupid);
128     char psz_local[n + 1];
129
130     for (size_t i = 0; i < n; i++)
131         psz_local[i] = stupid[i];
132
133     psz_local[n] = '\0';
134     if ((n >= 1) && (stupid[n - 1] == '\n'))
135         psz_local[n - 1] = '\0';
136
137     return FromLocaleDup( psz_local );
138 }
139 #   define wxDnDLocaleFree( string ) free( string )
140 #else
141 #   define wxDnDFromLocale( string ) wxFromLocale( string )
142 #   define wxDnDLocaleFree( string ) wxLocaleFree( string )
143 #endif
144
145 #define WRAPCOUNT 80
146
147 #define OPEN_NORMAL 0
148 #define OPEN_STREAM 1
149
150 enum
151 {
152   ID_CONTROLS_TIMER,
153   ID_SLIDER_TIMER,
154 };
155
156 namespace wxvlc {
157     class WindowSettings;
158     class VideoWindow;
159 };
160
161 using namespace wxvlc;
162
163 /*****************************************************************************
164  * intf_sys_t: description and status of wxwindows interface
165  *****************************************************************************/
166 struct intf_sys_t
167 {
168     /* the wx parent window */
169     wxWindow            *p_wxwindow;
170     wxIcon              *p_icon;
171
172     /* window settings */
173     WindowSettings      *p_window_settings;
174
175     /* special actions */
176     vlc_bool_t          b_playing;
177     vlc_bool_t          b_intf_show;                /* interface to be shown */
178
179     /* The input thread */
180     input_thread_t *    p_input;
181
182     /* The messages window */
183     msg_subscription_t* p_sub;                  /* message bank subscription */
184
185     /* Playlist management */
186     int                 i_playing;                 /* playlist selected item */
187     unsigned            i_playlist_usage;
188
189     /* Send an event to show a dialog */
190     void (*pf_show_dialog) ( intf_thread_t *p_intf, int i_dialog, int i_arg,
191                              intf_dialog_args_t *p_arg );
192
193     /* Popup menu */
194     wxMenu              *p_popup_menu;
195
196     /* Hotkeys */
197     int                 i_first_hotkey_event;
198     int                 i_hotkeys;
199
200     /* Embedded vout */
201     VideoWindow         *p_video_window;
202     wxBoxSizer          *p_video_sizer;
203     vlc_bool_t          b_video_autosize;
204
205     /* Aout */
206     aout_instance_t     *p_aout;
207 };
208
209
210
211 wxArrayString SeparateEntries( wxString );
212 wxWindow *CreateDialogsProvider( intf_thread_t *p_intf, wxWindow *p_parent );
213
214 /*
215  * wxWindows keeps dead locking because the timer tries to lock the playlist
216  * when it's already locked somewhere else in the very wxWindows interface
217  * module. Unless someone implements a "vlc_mutex_trylock", we need that.
218  */
219 inline void LockPlaylist( intf_sys_t *p_sys, playlist_t *p_pl )
220 {
221     if( p_sys->i_playlist_usage++ == 0)
222         vlc_mutex_lock( &p_pl->object_lock );
223 }
224
225 inline void UnlockPlaylist( intf_sys_t *p_sys, playlist_t *p_pl )
226 {
227     if( --p_sys->i_playlist_usage == 0)
228         vlc_mutex_unlock( &p_pl->object_lock );
229 }
230
231 #endif