aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar Dylan Smith <dylan.ah.smith@gmail.com>2010-11-26 13:46:54 -0500
committerGravatar Grissiom <chaos.proton@gmail.com>2010-12-02 23:55:45 +0800
commit11360b018fd797a60705b0aa74c8001d006562ed (patch)
tree21f84027f25a0e3a2177009ed777356a572d837e
parentbdfc62184d303a3bdcea7f500bd8a8b2b8a3b7ed (diff)
mimedb: Search all the defaults.list files rather than just the first.
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.
-rw-r--r--mimedb.c77
1 files changed, 59 insertions, 18 deletions
diff --git a/mimedb.c b/mimedb.c
index 0572023b..00148e0b 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 )
{