The first defaults.list file found should not override all the other ones,
it just needs to be searched first.

E.g. For me (cat ~/.local/share/applications/defaults.list) returns
[Default Applications]
text/html=chromium-browser.desktop

So this should be used for text/html mimetypes, but the other defaults.list
files should be searched for other mimetypes.

I had to refactor get_filename so that it can return all the filenames, so
I changed it to append_filenames that appends all the filenames to a list
and provided a wrapper function called get_filename.
---
 mimedb.c |   77 +++++++++++++++++++++++++++++++++++++++++++++++--------------
 1 files changed, 59 insertions(+), 18 deletions(-)

diff --git a/mimedb.c b/mimedb.c
index 0572023..00148e0 100644
--- a/mimedb.c
+++ b/mimedb.c
@@ -289,9 +289,15 @@ static char *file_exists( const char *dir, const char *in )
    Try to find the specified file in any of the possible directories
    where mime files can be located.  This code is shamelessly stolen
    from xdg_run_command_on_dirs.
+
+   \param list Full file paths will be appended to this list.
+   \param f The relative filename search for the the data directories.
+   \param all If zero, then stop after the first filename.
+   \return The number of filenames added to the list.
 */
-static char *get_filename( char *f )
+static int append_filenames( array_list_t *list, char *f, int all )
 {
+       int prev_count = al_get_count( list );
        char *result;
        const char *xdg_data_home;
        const char *xdg_data_dirs;
@@ -301,8 +307,12 @@ static char *get_filename( char *f )
        if (xdg_data_home)
     {
                result = file_exists( xdg_data_home, f );
-               if (result)
-                       return result;
+               if ( result )
+               {
+                       al_push( list, result );
+                       if ( !all )
+                               return 1;
+               }
     }
        else
     {
@@ -322,8 +332,12 @@ static char *get_filename( char *f )
                        result = file_exists( guessed_xdg_home, f );
                        free (guessed_xdg_home);
 
-                       if (result)
-                               return result;
+                       if ( result )
+                       {
+                               al_push( list, result );
+                               if ( !all )
+                                       return 1;
+                       }
                }
     }
 
@@ -349,10 +363,7 @@ static char *get_filename( char *f )
                        continue;
                }
 
-               if (*end_ptr == ':')
-                       len = end_ptr - ptr;
-               else
-                       len = end_ptr - ptr + 1;
+               len = end_ptr - ptr;
                dir = my_malloc (len + 1);
                if( !dir )
                        return 0;
@@ -363,12 +374,32 @@ static char *get_filename( char *f )
 
                free (dir);
 
-               if (result)
-                       return result;
+               if ( result )
+               {
+                       al_push( list, result );
+                       if ( !all ) {
+                               return 1;
+                       }
+               }
 
                ptr = end_ptr;
     }
-       return 0;
+       return al_get_count( list ) - prev_count;
+}
+
+/**
+   Find at most one file relative to the XDG data directories.
+*/
+static char *get_filename( char *f )
+{
+       array_list_t list;
+       char *first = NULL;
+
+       al_init( &list );
+       append_filenames( &list, f, 0 );
+       first = al_pop( &list );
+       al_destroy( &list );
+       return first;
 }
 
 /**
@@ -642,22 +673,32 @@ static char *get_description( const char *mimetype )
 static char *get_action( const char *mimetype )
 {
        char *res=0;
+       int i;
 
        char *launcher;
        char *end;
-       char *mime_filename;
+       array_list_t mime_filenames;
 
-       char *launcher_str;
+       char *launcher_str = NULL;
        char *launcher_filename, *launcher_command_str, *launcher_command;
        char *launcher_full;
 
-       mime_filename = get_filename( DESKTOP_DEFAULT );
-       if( !mime_filename )
+       al_init( &mime_filenames );
+       if( !append_filenames( &mime_filenames, DESKTOP_DEFAULT, 1 ) )
+       {
+               al_destroy( &mime_filenames );
                return 0;
+       }
 
-       launcher_str = search_ini( mime_filename, mimetype );
+       for ( i = 0; i < al_get_count( &mime_filenames ); i++ )
+       {
+               launcher_str = search_ini( al_get( &mime_filenames, i ), 
mimetype );
+               if ( launcher_str )
+                       break;
+       }
 
-       free( mime_filename );
+       al_foreach( &mime_filenames, free );
+       al_destroy( &mime_filenames );
 
        if( !launcher_str )
        {
-- 
1.7.2.3


------------------------------------------------------------------------------
Increase Visibility of Your 3D Game App & Earn a Chance To Win $500!
Tap into the largest installed PC base & get more eyes on your game by
optimizing for Intel(R) Graphics Technology. Get started today with the
Intel(R) Software Partner Program. Five $500 cash prizes are up for grabs.
http://p.sf.net/sfu/intelisp-dev2dev
_______________________________________________
Fish-users mailing list
Fish-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/fish-users

Reply via email to