summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDave Davenport <qball@gmpclient.org>2016-12-26 15:18:52 +0100
committerDave Davenport <qball@gmpclient.org>2016-12-26 15:18:52 +0100
commit5a638b1fa04ab2b0a23ac4ea6fb816d25c7b2bc7 (patch)
tree4c4ded6b3b2d187679dea22abb1da82513705712
parentc06aa59a629a72e44cc4a52a58c4f9adb3583792 (diff)
Search categories when searching Desktop Files.
Issue: #499
-rw-r--r--source/dialogs/drun.c28
1 files changed, 19 insertions, 9 deletions
diff --git a/source/dialogs/drun.c b/source/dialogs/drun.c
index dc88aadd..ba86cb79 100644
--- a/source/dialogs/drun.c
+++ b/source/dialogs/drun.c
@@ -92,12 +92,12 @@ typedef struct
char *path;
/* Executable */
char *exec;
- /* Path */
- char *exec_path;
/* Name of the Entry */
char *name;
/* Generic Name */
char *generic_name;
+
+ GKeyFile *key_file;
/* Application needs to be launched in terminal. */
unsigned int terminal;
} DRunModeEntry;
@@ -193,13 +193,15 @@ static void exec_cmd_entry ( DRunModeEntry *e )
return;
}
gchar *fp = rofi_expand_path ( g_strstrip ( str ) );
- if ( execsh ( e->exec_path, fp, e->terminal ) ) {
+ gchar *exec_path = g_key_file_get_string ( e->key_file, "Desktop Entry", "Path", NULL );
+ if ( execsh ( exec_path, fp, e->terminal ) ) {
char *path = g_build_filename ( cache_dir, DRUN_CACHE_FILE, NULL );
char *key = g_strdup_printf ( "%s:::%s", e->root, e->path );
history_set ( path, key );
g_free ( key );
g_free ( path );
}
+ g_free ( exec_path );
g_free ( str );
g_free ( fp );
}
@@ -289,13 +291,11 @@ static void read_desktop_file ( DRunModePrivateData *pd, const char *root, const
// Returns false if not found, if key not found, we don't want run in terminal.
pd->entry_list[pd->cmd_list_length].terminal = g_key_file_get_boolean ( kf, "Desktop Entry", "Terminal", NULL );
- // Returns NULL if not found.
- pd->entry_list[pd->cmd_list_length].exec_path = g_key_file_get_string ( kf, "Desktop Entry", "Path", NULL );
+ // Keep keyfile around.
+ pd->entry_list[pd->cmd_list_length].key_file = kf;
// We don't want to parse items with this id anymore.
g_hash_table_add ( pd->disabled_entries, g_strdup ( id ) );
( pd->cmd_list_length )++;
-
- g_key_file_free ( kf );
}
/**
@@ -429,9 +429,9 @@ static void drun_entry_clear ( DRunModeEntry *e )
g_free ( e->root );
g_free ( e->path );
g_free ( e->exec );
- g_free ( e->exec_path );
g_free ( e->name );
g_free ( e->generic_name );
+ g_key_file_free ( e->key_file );
}
static ModeMode drun_mode_result ( Mode *sw, int mretv, char **input, unsigned int selected_line )
@@ -524,18 +524,28 @@ static int drun_token_match ( const Mode *data, GRegex **tokens, unsigned int in
for ( int j = 0; match && tokens != NULL && tokens[j] != NULL; j++ ) {
int test = 0;
GRegex *ftokens[2] = { tokens[j], NULL };
+ // Match name
if ( !test && rmpd->entry_list[index].name &&
token_match ( ftokens, rmpd->entry_list[index].name ) ) {
test = 1;
}
+ // Match generic name
if ( !test && rmpd->entry_list[index].generic_name &&
token_match ( ftokens, rmpd->entry_list[index].generic_name ) ) {
test = 1;
}
-
+ // Match executable name.
if ( !test && token_match ( ftokens, rmpd->entry_list[index].exec ) ) {
test = 1;
}
+ // Match against category.
+ if ( !test ){
+ gchar **list = g_key_file_get_locale_string_list ( rmpd->entry_list[index].key_file, "Desktop Entry", "Categories" , NULL, NULL,NULL );
+ for ( int iter = 0; !test && list && list[iter]; iter++){
+ test = token_match ( ftokens, list[iter]);
+ }
+ g_strfreev(list);
+ }
if ( test == 0 ) {
match = 0;
}