]> git.sesse.net Git - vlc/blob - modules/misc/notify/xosd.c
Remove useless test before free and delete.
[vlc] / modules / misc / notify / xosd.c
1 /*****************************************************************************
2  * xosd.c : X On Screen Display interface
3  *****************************************************************************
4  * Copyright (C) 2001 the VideoLAN team
5  * $Id$
6  *
7  * Authors: Loïc Minier <lool@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 /*****************************************************************************
25  * Preamble
26  *****************************************************************************/
27
28 #include <xosd.h>
29 #ifdef HAVE_CONFIG_H
30 # include "config.h"
31 #endif
32
33 #include <vlc/vlc.h>
34 #include <vlc_playlist.h>
35 #include <vlc_input.h>
36 #include <vlc_interface.h>
37
38 #ifdef HAVE_UNISTD_H
39 #    include <unistd.h>
40 #endif
41
42 /*****************************************************************************
43  * intf_sys_t: description and status of rc interface
44  *****************************************************************************/
45 struct intf_sys_t
46 {
47     xosd * p_osd;               /* libxosd handle */
48     vlc_bool_t  b_need_update;   /* Update display ? */
49 };
50
51 #define MAX_LINE_LENGTH 256
52
53 /*****************************************************************************
54  * Local prototypes.
55  *****************************************************************************/
56 static int  Open         ( vlc_object_t * );
57 static void Close        ( vlc_object_t * );
58
59 static void Run          ( intf_thread_t * );
60
61 static int PlaylistNext( vlc_object_t *p_this, const char *psz_variable,
62                 vlc_value_t oval, vlc_value_t nval, void *param );
63
64 /*****************************************************************************
65  * Module descriptor
66  *****************************************************************************/
67 #define POSITION_TEXT N_("Flip vertical position")
68 #define POSITION_LONGTEXT N_("Display XOSD output at the bottom of the " \
69                              "screen instead of the top.")
70
71 #define TXT_OFS_TEXT N_("Vertical offset")
72 #define TXT_OFS_LONGTEXT N_("Vertical offset between the border of the screen "\
73                             "and the displayed text (in pixels, defaults to "\
74                             "30 pixels)." )
75
76 #define SHD_OFS_TEXT N_("Shadow offset")
77 #define SHD_OFS_LONGTEXT N_("Offset between the text and the shadow (in " \
78                             "pixels, defaults to 2 pixels)." )
79
80 #define FONT_TEXT N_("Font")
81 #define FONT_LONGTEXT N_("Font used to display text in the XOSD output.")
82 #define COLOUR_TEXT N_("Color")
83 #define COLOUR_LONGTEXT N_("Color used to display text in the XOSD output.")
84
85 vlc_module_begin();
86     set_category( CAT_INTERFACE );
87     set_subcategory( SUBCAT_INTERFACE_CONTROL );
88     set_description( _("XOSD interface") );
89     set_shortname( "XOSD" );
90     add_bool( "xosd-position", 1, NULL, POSITION_TEXT, POSITION_LONGTEXT, VLC_TRUE );
91     add_integer( "xosd-text-offset", 30, NULL, TXT_OFS_TEXT, TXT_OFS_LONGTEXT, VLC_TRUE );
92     add_integer( "xosd-shadow-offset", 2, NULL,
93                  SHD_OFS_TEXT, SHD_OFS_LONGTEXT, VLC_TRUE );
94     add_string( "xosd-font",
95                 "-adobe-helvetica-bold-r-normal-*-*-160-*-*-p-*-iso8859-1",
96                 NULL, FONT_TEXT, FONT_LONGTEXT, VLC_TRUE );
97     add_string( "xosd-colour", "LawnGreen",
98                     NULL, COLOUR_TEXT, COLOUR_LONGTEXT, VLC_TRUE );
99     set_capability( "interface", 10 );
100     set_callbacks( Open, Close );
101 vlc_module_end();
102
103 /*****************************************************************************
104  * Open: initialize and create stuff
105  *****************************************************************************/
106 static int Open( vlc_object_t *p_this )
107 {
108     intf_thread_t *p_intf = (intf_thread_t *)p_this;
109     xosd *p_osd;
110
111     /* Allocate instance and initialize some members */
112     p_intf->p_sys = (intf_sys_t *)malloc( sizeof( intf_sys_t ) );
113     if( p_intf->p_sys == NULL )
114     {
115         msg_Err( p_intf, "out of memory" );
116         return VLC_ENOMEM;
117     }
118
119     if( getenv( "DISPLAY" ) == NULL )
120     {
121         msg_Err( p_intf, "no display, please set the DISPLAY variable" );
122         return VLC_EGENERIC;
123     }
124
125     /* Initialize library */
126 #if defined(HAVE_XOSD_VERSION_0) || defined(HAVE_XOSD_VERSION_1)
127     p_osd  = p_intf->p_sys->p_osd =
128         xosd_init( config_GetPsz( p_intf, "xosd-font" ),
129                    config_GetPsz( p_intf,"xosd-colour" ), 3,
130                    XOSD_top, 0, 1 );
131     if( p_intf->p_sys->p_osd == NULL )
132     {
133         msg_Err( p_intf, "couldn't initialize libxosd" );
134         return VLC_EGENERIC;
135     }
136 #else
137     p_osd = p_intf->p_sys->p_osd = xosd_create( 1 );
138     if( p_osd == NULL )
139     {
140         msg_Err( p_intf, "couldn't initialize libxosd" );
141         return VLC_EGENERIC;
142     }
143     xosd_set_colour( p_osd, config_GetPsz( p_intf,"xosd-colour" ) );
144     xosd_set_timeout( p_osd, 3 );
145 #endif
146
147
148     playlist_t *p_playlist = pl_Yield( p_intf );
149     var_AddCallback( p_playlist, "playlist-current", PlaylistNext, p_this );
150     var_AddCallback( p_playlist, "item-change", PlaylistNext, p_this );
151     pl_Release( p_intf );
152
153     /* Set user preferences */
154     xosd_set_font( p_intf->p_sys->p_osd,
155                     config_GetPsz( p_intf, "xosd-font" ) );
156     xosd_set_outline_colour( p_intf->p_sys->p_osd,"black" );
157 #ifdef HAVE_XOSD_VERSION_2
158     xosd_set_horizontal_offset( p_intf->p_sys->p_osd,
159                     config_GetInt( p_intf, "xosd-text-offset" ) );
160     xosd_set_vertical_offset( p_intf->p_sys->p_osd,
161                     config_GetInt( p_intf, "xosd-text-offset" ) );
162 #else
163     xosd_set_offset( p_intf->p_sys->p_osd,
164                     config_GetInt( p_intf, "xosd-text-offset" ) );
165 #endif
166     xosd_set_shadow_offset( p_intf->p_sys->p_osd,
167                     config_GetInt( p_intf, "xosd-shadow-offset" ));
168     xosd_set_pos( p_intf->p_sys->p_osd,
169                     config_GetInt( p_intf, "xosd-position" ) ?
170                                          XOSD_bottom: XOSD_top );
171
172     /* Initialize to NULL */
173     xosd_display( p_osd, 0, XOSD_string, "XOSD interface initialized" );
174
175     p_intf->pf_run = Run;
176
177     p_intf->p_sys->b_need_update = VLC_TRUE;
178
179     return VLC_SUCCESS;
180 }
181
182 /*****************************************************************************
183  * Close: destroy interface stuff
184  *****************************************************************************/
185 static void Close( vlc_object_t *p_this )
186 {
187     intf_thread_t *p_intf = (intf_thread_t *)p_this;
188     playlist_t *p_playlist = pl_Yield( p_intf );
189     var_DelCallback( p_playlist, "playlist-current", PlaylistNext, p_this );
190     var_DelCallback( p_playlist, "item-change", PlaylistNext, p_this );
191     pl_Release( p_intf );
192
193     /* Uninitialize library */
194     xosd_destroy( p_intf->p_sys->p_osd );
195
196     /* Destroy structure */
197     free( p_intf->p_sys );
198 }
199
200 /*****************************************************************************
201  * Run: xosd thread
202  *****************************************************************************
203  * This part of the interface runs in a separate thread
204  *****************************************************************************/
205 static void Run( intf_thread_t *p_intf )
206 {
207     playlist_t *p_playlist;
208     playlist_item_t *p_item = NULL;
209     input_item_t *p_input;
210     char psz_duration[MSTRTIME_MAX_SIZE+2];
211     char *psz_display = NULL;
212
213     while( !p_intf->b_die )
214     {
215         if( p_intf->p_sys->b_need_update == VLC_TRUE )
216         {
217             p_intf->p_sys->b_need_update = VLC_FALSE;
218             p_playlist = pl_Yield( p_intf );
219
220             if( playlist_IsEmpty( p_playlist ) )
221             {
222                 vlc_object_release( p_playlist );
223                 continue;
224             }
225             free( psz_display );
226             psz_display = NULL;
227             if( p_playlist->status.i_status == PLAYLIST_STOPPED )
228             {
229                 psz_display = strdup(_("Stop"));
230                 vlc_object_release( p_playlist );
231             }
232             else if( p_playlist->status.i_status == PLAYLIST_PAUSED )
233             {
234                 psz_display = strdup(_("Pause"));
235                 vlc_object_release( p_playlist );
236             }
237             else
238             {
239                 p_item = p_playlist->status.p_item;
240                 p_input = p_item->p_input;
241                 if( !p_item )
242                 {
243                     vlc_object_release( p_playlist );
244                     continue;
245                 }
246
247                 vlc_object_release( p_playlist );
248
249                 mtime_t i_duration = input_item_GetDuration( p_input );
250                 if( i_duration != -1 )
251                 {
252                     char psz_durationstr[MSTRTIME_MAX_SIZE];
253                     secstotimestr( psz_durationstr, i_duration / 1000000 );
254                     sprintf( psz_duration, "(%s)", psz_durationstr );
255                 }
256                 else
257                 {
258                     sprintf( psz_duration," " );
259                 }
260
261                 psz_display = (char *)malloc( sizeof(char )*
262                                           (strlen( p_input->psz_name ) +
263                                           MSTRTIME_MAX_SIZE + 2+6 + 10 +10 ));
264                 sprintf( psz_display,"%s %s",
265                          p_input->psz_name, psz_duration);
266             }
267
268             /* Display */
269             xosd_display( p_intf->p_sys->p_osd,
270                             0,                               /* first line */
271                             XOSD_string,
272                             psz_display );
273         }
274
275         msleep( INTF_IDLE_SLEEP );
276     }
277 }
278
279 static int PlaylistNext( vlc_object_t *p_this, const char *psz_variable,
280                 vlc_value_t oval, vlc_value_t nval, void *param )
281 {
282     intf_thread_t *p_intf = (intf_thread_t *)param;
283
284     p_intf->p_sys->b_need_update = VLC_TRUE;
285     return VLC_SUCCESS;
286 }
287