]> git.sesse.net Git - vlc/blobdiff - modules/misc/notify/xosd.c
Fix xosd memleaks.
[vlc] / modules / misc / notify / xosd.c
index b3435d07c435a8750f1724a343124521d2972397..0b61f3eb626b544ccf3ef526cc2c942bfb2ed17e 100644 (file)
@@ -30,7 +30,7 @@
 # include "config.h"
 #endif
 
-#include <vlc/vlc.h>
+#include <vlc_common.h>
 #include <vlc_plugin.h>
 #include <vlc_playlist.h>
 #include <vlc_input.h>
@@ -86,7 +86,7 @@ static int PlaylistNext( vlc_object_t *p_this, const char *psz_variable,
 vlc_module_begin();
     set_category( CAT_INTERFACE );
     set_subcategory( SUBCAT_INTERFACE_CONTROL );
-    set_description( _("XOSD interface") );
+    set_description( N_("XOSD interface") );
     set_shortname( "XOSD" );
     add_bool( "xosd-position", 1, NULL, POSITION_TEXT, POSITION_LONGTEXT, true );
     add_integer( "xosd-text-offset", 30, NULL, TXT_OFS_TEXT, TXT_OFS_LONGTEXT, true );
@@ -108,6 +108,7 @@ static int Open( vlc_object_t *p_this )
 {
     intf_thread_t *p_intf = (intf_thread_t *)p_this;
     xosd *p_osd;
+    char *psz_font, psz_colour;
 
     /* Allocate instance and initialize some members */
     p_intf->p_sys = (intf_sys_t *)malloc( sizeof( intf_sys_t ) );
@@ -125,10 +126,13 @@ static int Open( vlc_object_t *p_this )
 
     /* Initialize library */
 #if defined(HAVE_XOSD_VERSION_0) || defined(HAVE_XOSD_VERSION_1)
-    p_osd  = p_intf->p_sys->p_osd =
-        xosd_init( config_GetPsz( p_intf, "xosd-font" ),
-                   config_GetPsz( p_intf,"xosd-colour" ), 3,
-                   XOSD_top, 0, 1 );
+    psz_font = config_GetPsz( p_intf, "xosd-font" );
+    psz_colour = config_GetPsz( p_intf,"xosd-colour" );
+    p_osd  = p_intf->p_sys->p_osd = xosd_init( psz_font, psz_colour, 3,
+                                               XOSD_top, 0, 1 );
+    free( psz_font );
+    free( psz_colour );
+
     if( p_intf->p_sys->p_osd == NULL )
     {
         msg_Err( p_intf, "couldn't initialize libxosd" );
@@ -141,8 +145,11 @@ static int Open( vlc_object_t *p_this )
         msg_Err( p_intf, "couldn't initialize libxosd" );
         return VLC_EGENERIC;
     }
-    xosd_set_colour( p_osd, config_GetPsz( p_intf,"xosd-colour" ) );
+
+    psz_colour = config_GetPsz( p_intf,"xosd-colour" );
+    xosd_set_colour( p_osd, psz_colour );
     xosd_set_timeout( p_osd, 3 );
+    free( psz_colour );
 #endif
 
 
@@ -152,8 +159,9 @@ static int Open( vlc_object_t *p_this )
     pl_Release( p_intf );
 
     /* Set user preferences */
-    xosd_set_font( p_intf->p_sys->p_osd,
-                    config_GetPsz( p_intf, "xosd-font" ) );
+    psz_font = config_GetPsz( p_intf, "xosd-font" );
+    xosd_set_font( p_intf->p_sys->p_osd, psz_font );
+    free( psz_font );
     xosd_set_outline_colour( p_intf->p_sys->p_osd,"black" );
 #ifdef HAVE_XOSD_VERSION_2
     xosd_set_horizontal_offset( p_intf->p_sys->p_osd,
@@ -211,7 +219,7 @@ static void Run( intf_thread_t *p_intf )
     char psz_duration[MSTRTIME_MAX_SIZE+2];
     char *psz_display = NULL;
 
-    while( !p_intf->b_die )
+    while( vlc_object_alive (p_intf) )
     {
         if( p_intf->p_sys->b_need_update == true )
         {
@@ -220,7 +228,7 @@ static void Run( intf_thread_t *p_intf )
 
             if( playlist_IsEmpty( p_playlist ) )
             {
-                vlc_object_release( p_playlist );
+                pl_Release( p_intf );
                 continue;
             }
             free( psz_display );
@@ -228,24 +236,21 @@ static void Run( intf_thread_t *p_intf )
             if( p_playlist->status.i_status == PLAYLIST_STOPPED )
             {
                 psz_display = strdup(_("Stop"));
-                vlc_object_release( p_playlist );
+                pl_Release( p_intf );
             }
             else if( p_playlist->status.i_status == PLAYLIST_PAUSED )
             {
                 psz_display = strdup(_("Pause"));
-                vlc_object_release( p_playlist );
+                pl_Release( p_intf );
             }
             else
             {
                 p_item = p_playlist->status.p_item;
                 p_input = p_item->p_input;
+
+                pl_Release( p_intf );
                 if( !p_item )
-                {
-                    vlc_object_release( p_playlist );
                     continue;
-                }
-
-                vlc_object_release( p_playlist );
 
                 mtime_t i_duration = input_item_GetDuration( p_input );
                 if( i_duration != -1 )