Fix memory corruption in wx locales handling on UTF8 system with iconv
[vlc.git] / modules / gui / wxwidgets / wxwidgets.hpp
1 /*****************************************************************************
2  * wxwidgets.hpp: Common headers for the wxwidgets 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_interface.h>
42 #include "vlc_charset.h"
43 #include <vlc_playlist.h>
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.
92  *
93  * Note that if you want to use non-ANSI code page characters on Windows,
94  * you MUST build WxWidgets in “Unicode” mode. wxConvUTF8
95  */
96 static inline char *wxFromLocale (const wxString& string)
97 {
98 #if defined( wxUSE_UNICODE )
99 # if defined( WIN32 )
100     return FromWide ((const wchar_t *)string.c_str());
101 #  define wxLocaleFree free
102 # else
103     return FromLocaleDup (string.mb_str());
104 #  define wxLocaleFree free
105 # endif
106 #else
107 # warning Please use WxWidgets with Unicode.
108     return FromLocale (string.c_str());
109 # define wxLocaleFree LocaleFree
110 #endif
111 }
112         
113 /* From Locale functions to use for File Drop targets ... go figure */
114 #if defined( wxUSE_UNICODE ) && !defined( WIN32 )
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 = 0;
128     while (stupid[n])
129         n++;
130
131     char psz_local[n + 1];
132     for (size_t i = 0; i <= n; i++)
133         psz_local[i] = stupid[i];
134
135     // Kludge for (broken?) apps that adds a LF at the end of DnD
136     if ((n >= 1) && (strchr ("\n\r", stupid[n - 1]) != NULL))
137         psz_local[n - 1] = '\0';
138
139     return FromLocaleDup( psz_local );
140 }
141 #   define wxDnDLocaleFree free
142 #else
143 #   define wxDnDFromLocale wxFromLocale
144 #   define wxDnDLocaleFree wxLocaleFree
145 #endif
146
147 #define WRAPCOUNT 80
148
149 #define OPEN_NORMAL 0
150 #define OPEN_STREAM 1
151
152 enum
153 {
154   ID_CONTROLS_TIMER,
155   ID_SLIDER_TIMER,
156 };
157
158 namespace wxvlc {
159     class WindowSettings;
160     class VideoWindow;
161 };
162
163 using namespace wxvlc;
164
165 /*****************************************************************************
166  * intf_sys_t: description and status of wxwindows interface
167  *****************************************************************************/
168 struct intf_sys_t
169 {
170     /* the wx parent window */
171     wxWindow            *p_wxwindow;
172     wxIcon              *p_icon;
173
174     /* window settings */
175     WindowSettings      *p_window_settings;
176
177     /* special actions */
178     vlc_bool_t          b_playing;
179     vlc_bool_t          b_intf_show;                /* interface to be shown */
180
181     /* The input thread */
182     input_thread_t *    p_input;
183
184     /* The messages window */
185     msg_subscription_t* p_sub;                  /* message bank subscription */
186
187     /* Playlist management */
188     int                 i_playing;                 /* playlist selected item */
189     unsigned            i_playlist_usage;
190
191     /* Send an event to show a dialog */
192     void (*pf_show_dialog) ( intf_thread_t *p_intf, int i_dialog, int i_arg,
193                              intf_dialog_args_t *p_arg );
194
195     /* Popup menu */
196     wxMenu              *p_popup_menu;
197
198     /* Hotkeys */
199     int                 i_first_hotkey_event;
200     int                 i_hotkeys;
201
202     /* Embedded vout */
203     VideoWindow         *p_video_window;
204     wxBoxSizer          *p_video_sizer;
205     vlc_bool_t          b_video_autosize;
206
207     /* Aout */
208     aout_instance_t     *p_aout;
209 };
210
211
212
213 wxArrayString SeparateEntries( wxString );
214 wxWindow *CreateDialogsProvider( intf_thread_t *p_intf, wxWindow *p_parent );
215
216 /*
217  * wxWindows keeps dead locking because the timer tries to lock the playlist
218  * when it's already locked somewhere else in the very wxWindows interface
219  * module. Unless someone implements a "vlc_mutex_trylock", we need that.
220  */
221 inline void LockPlaylist( intf_sys_t *p_sys, playlist_t *p_pl )
222 {
223     if( p_sys->i_playlist_usage++ == 0)
224         vlc_mutex_lock( &p_pl->object_lock );
225 }
226
227 inline void UnlockPlaylist( intf_sys_t *p_sys, playlist_t *p_pl )
228 {
229     if( --p_sys->i_playlist_usage == 0)
230         vlc_mutex_unlock( &p_pl->object_lock );
231 }
232
233 #endif