[MPlayer-dev-eng] [PATCH] GTK GUI, Correct use filenames on non-utf8 localized systems

xeb at mail.ru xeb at mail.ru
Wed May 30 22:54:24 CEST 2007


Hello.
There is trouble using gmplayer on non-utf8 localized systems, filenames are 
not handled correctly. This patch fixes it.

---------------------
diff -ur mplayer.orig/Gui/mplayer/gtk/fs.c mplayer/Gui/mplayer/gtk/fs.c
--- mplayer.orig/Gui/mplayer/gtk/fs.c   2007-03-21 08:15:03.000000000 +0300
+++ mplayer/Gui/mplayer/gtk/fs.c        2007-05-30 21:28:47.000000000 +0400
@@ -175,10 +175,11 @@
    stat( gg.gl_pathv[i],&fs );
    if( !S_ISDIR( fs.st_mode ) ) continue;

-   str[0][1]=gg.gl_pathv[i];
+   str[0][1]=g_filename_to_utf8( gg.gl_pathv[i],-1,NULL,NULL,NULL );
    pixmap=dpixmap; mask=dmask;
    gtk_clist_append( GTK_CLIST( list ),str[0] );
    gtk_clist_set_pixmap( GTK_CLIST( list ),c++,0,pixmap,mask );
+   g_free(str[0][1]);
   }
  globfree( &gg );

@@ -223,9 +224,10 @@
    stat( gg.gl_pathv[i],&fs );
    if(  S_ISDIR( fs.st_mode ) ) continue;

-   str[0][1]=gg.gl_pathv[i];
+   str[0][1]=g_filename_to_utf8( gg.gl_pathv[i],-1,NULL,NULL,NULL );
    gtk_clist_append( GTK_CLIST( list ),str[0] );
    gtk_clist_set_pixmap( GTK_CLIST( list ),c++,0,pixmap,mask );
+   g_free(str[0][1]);
   }
  globfree( &gg );

@@ -321,21 +323,32 @@
    free( dir );
   }

- if ( fsTopList_items ) g_list_free( fsTopList_items ); fsTopList_items=NULL;
+ if ( fsTopList_items )
+  {
+   GList *item;
+   item=fsTopList_items;
+   while( item )
+    {
+     g_free( item->data );
+     item=item->next;
+    }
+    g_list_free( fsTopList_items );
+  }
+ fsTopList_items=NULL;
  {
   int  i, c = 1;

   if ( fsType == fsVideoSelector )
    {
     for ( i=0;i < fsPersistant_MaxPos;i++ )
-     if ( fsHistory[i] ) { fsTopList_items=g_list_append( 
fsTopList_items,fsHistory[i] ); c=0; }
+     if ( fsHistory[i] ) { fsTopList_items=g_list_append( 
fsTopList_items,g_filename_to_utf8( fsHistory[i],-1,NULL,NULL,NULL ) ); 
c=0; }
    }
-  if ( c ) fsTopList_items=g_list_append( fsTopList_items,(gchar 
*)get_current_dir_name() );
+  if ( c ) {fsTopList_items=g_list_append( fsTopList_items,g_filename_to_utf8 
( get_current_dir_name(),-1,NULL,NULL,NULL ) ); }
  }
- if ( getenv( "HOME" ) ) fsTopList_items=g_list_append( 
fsTopList_items,getenv( "HOME" ) );
- fsTopList_items=g_list_append( fsTopList_items,"/home" );
- fsTopList_items=g_list_append( fsTopList_items,"/mnt" );
- fsTopList_items=g_list_append( fsTopList_items,"/" );
+ if ( getenv( "HOME" ) ) fsTopList_items=g_list_append( 
fsTopList_items,g_filename_to_utf8( getenv( "HOME" ),-1,NULL,NULL,NULL ) );
+ fsTopList_items=g_list_append( fsTopList_items,g_filename_to_utf8
("/home",-1,NULL,NULL,NULL) );
+ fsTopList_items=g_list_append( fsTopList_items,g_filename_to_utf8
("/mnt",-1,NULL,NULL,NULL) );
+ fsTopList_items=g_list_append( fsTopList_items,g_filename_to_utf8
("/",-1,NULL,NULL,NULL) );
  gtk_combo_set_popdown_strings( GTK_COMBO( fsCombo4 ),fsTopList_items );

  gtk_window_set_modal( GTK_WINDOW( fsFileSelect ),modal );
@@ -418,25 +431,36 @@
 {
  unsigned char * str;

- str=gtk_entry_get_text( GTK_ENTRY( user_data ) );
+ str=g_filename_from_utf8( gtk_entry_get_text( GTK_ENTRY( 
user_data ) ),-1,NULL,NULL,NULL );
  if ( chdir( str ) != -1 ) CheckDir( fsFNameList,get_current_dir_name() );
+ g_free(str);
 }

 void fs_fsPathCombo_changed( GtkEditable * editable,gpointer user_data )
 {
  unsigned char * str;

- str=gtk_entry_get_text( GTK_ENTRY( user_data ) );
+ str=g_filename_from_utf8( gtk_entry_get_text( GTK_ENTRY( 
user_data ) ),-1,NULL,NULL,NULL );
  fsPressed=2;
  if ( chdir( str ) != -1 ) CheckDir( fsFNameList,get_current_dir_name() );
+ g_free(str);
+}
+
+static void set_selected_file(const gchar *str)
+{
+ if (fsSelectedFile) g_free(fsSelectedFile);
+ fsSelectedFile=g_filename_from_utf8(str,-1,NULL,NULL,NULL);
 }

 void fs_Up_released( GtkButton * button,gpointer user_data )
 {
+ gchar *str;
  chdir( ".." );
- fsSelectedFile=fsThatDir;
+ set_selected_file(fsThatDir);
  CheckDir( fsFNameList,get_current_dir_name() );
- gtk_entry_set_text( GTK_ENTRY( fsPathCombo ),(unsigned char 
*)get_current_dir_name() );
+ str=g_filename_to_utf8( (unsigned char 
*)get_current_dir_name(),-1,NULL,NULL,NULL );
+ gtk_entry_set_text( GTK_ENTRY( fsPathCombo ),str );
+ g_free(str);
  return;
 }

@@ -459,9 +483,11 @@
  if(  S_ISDIR(fs.st_mode ) )
   {
    chdir( fctedFile );
-   fsSelectedFile=fsThatDir;
+   set_selected_file(fsThatDir);
+   str=g_filename_to_utf8( get_current_dir_name(),-1,NULL,NULL,NULL );
    CheckDir( fsFNameList,get_current_dir_name() );
-   gtk_entry_set_text( GTK_ENTRY( fsPathCombo ),(unsigned char 
*)get_current_dir_name() );
+   gtk_entry_set_text( GTK_ENTRY( fsPathCombo ),str );
+   g_free(str);
    return;
   }

@@ -472,7 +498,7 @@
         break;
    case 2:
         str=gtk_entry_get_text( GTK_ENTRY( fsPathCombo ) );
-        fsSelectedFile=str;
+        set_selected_file(str);
         if ( !fsFileExist( fsSelectedFile ) ) { HideFileSelect(); return; }
         fsSelectedDirectory=fsSelectedFile;
         size=strlen( fsSelectedDirectory );
@@ -522,7 +548,8 @@
    if ( !strcmp( item->data,fsSelectedDirectory ) ) i=0;
    item=item->next;
   }
- if ( i ) fsTopList_items=g_list_prepend( fsTopList_items,(gchar 
*)get_current_dir_name() );
+ if ( i ) fsTopList_items=g_list_prepend( fsTopList_items,g_filename_to_utf8( 
get_current_dir_name(),-1,NULL,NULL,NULL ) );
+
  if ( mplMainAutoPlay ) { mplMainAutoPlay=0; mplEventHandling( evPlay,0 ); }
   else guiGetEvent( guiCEvent,guiSetStop );
 }
@@ -535,7 +562,9 @@

 void fs_fsFNameList_select_row( GtkWidget * widget,gint row,gint 
column,GdkEventButton *bevent,gpointer user_data )
 {
- gtk_clist_get_text( GTK_CLIST(widget ),row,1,&fsSelectedFile );
+ gchar *str;
+ gtk_clist_get_text( GTK_CLIST(widget ),row,1,&str );
+ set_selected_file(str);
  fsPressed=1;
  if( bevent && bevent->type == GDK_BUTTON_PRESS )  gtk_button_released( 
GTK_BUTTON( fsOk ) );
 }
diff -ur mplayer.orig/Gui/mplayer/gtk/pl.c mplayer/Gui/mplayer/gtk/pl.c
--- mplayer.orig/Gui/mplayer/gtk/pl.c   2007-03-21 08:15:03.000000000 +0300
+++ mplayer/Gui/mplayer/gtk/pl.c        2007-05-30 18:54:22.000000000 +0400
@@ -160,9 +160,10 @@
    while ( next || next->next )
     {
      char * text[1][3]; text[0][2]="";
-     text[0][0]=next->name;
+     text[0][0]=g_filename_to_utf8( next->name,-1,NULL,NULL,NULL );
      text[0][1]=next->path;
      gtk_clist_append( GTK_CLIST( CLSelected ),text[0] );
+     g_free(text[0][0]);
      NrOfSelected++;
      if ( next->next ) next=next->next; else break;
     }
@@ -217,7 +218,7 @@
          item=calloc( 1,sizeof( plItem ) );
          gtk_clist_get_text( GTK_CLIST( CLSelected ),i,0,&text[0] );
          gtk_clist_get_text( GTK_CLIST( CLSelected ),i,1,&text[1] );
-         item->name=strdup( text[0] );
+         item->name=g_filename_from_utf8( text[0],-1,NULL,NULL,NULL );
          item->path=strdup( text[1] );
          gtkSet( gtkAddPlItem,0,(void*)item );
         }
@@ -332,7 +333,7 @@
        path=calloc( 1,strlen( DirNode->path ) + strlen( dirent->d_name ) + 
2 );
        if ( !strcmp( current_path,"/" ) ) sprintf( 
path,"/%s",dirent->d_name );
        else sprintf( path,"%s/%s",current_path,dirent->d_name );
-       text=dirent->d_name;
+       text=g_filename_to_utf8( dirent->d_name,-1,NULL,NULL,NULL );

        if ( stat( path,&statbuf ) != -1 && S_ISDIR( statbuf.st_mode ) && 
dirent->d_name[0] != '.' )
        {
@@ -342,6 +343,7 @@
         gtk_ctree_node_set_row_data_full( ctree,node,DirNode,NULL );
         if ( subdir ) node=gtk_ctree_insert_node( 
ctree,node,NULL,&dummy,4,NULL,NULL,NULL,NULL,FALSE,FALSE );
        }
+       g_free( text );
        free( path ); path=NULL;
       }
      closedir( dir );
@@ -369,9 +371,10 @@
         curr=calloc( 1,strlen( path ) + strlen( dirent->d_name ) + 3 ); 
sprintf( curr,"%s/%s",path,dirent->d_name );
         if ( stat( curr,&statbuf ) != -1 && ( S_ISREG( statbuf.st_mode ) || 
S_ISLNK( statbuf.st_mode ) ) )
          {
-          text[0][0]=dirent->d_name;
+          text[0][0]=g_filename_to_utf8( dirent->d_name,-1,NULL,NULL,NULL );
           gtk_clist_append( GTK_CLIST( CLFiles ),text[0] );
           NrOfEntrys++;
+          g_free(text[0][0]);
          }
         free( curr );
        }



More information about the MPlayer-dev-eng mailing list