Added cache invalidation

This commit is contained in:
Scoopta
2020-01-02 14:36:54 -08:00
parent 17a99d5609
commit e037fa7b4e
5 changed files with 84 additions and 19 deletions

View File

@@ -29,16 +29,10 @@ void wofi_dmenu_init(struct map* config) {
struct map* cached = map_init();
struct wl_list* cache = wofi_read_cache(MODE);
struct cache_line* node, *tmp;
wl_list_for_each_safe(node, tmp, cache, link) {
wofi_insert_widget(MODE, &node->line, node->line, &node->line, 1);
map_put(cached, node->line, "true");
free(node->line);
wl_list_remove(&node->link);
free(node);
}
struct wl_list entries;
wl_list_init(&entries);
free(cache);
struct map* entry_map = map_init();
char* line = NULL;
size_t size = 0;
@@ -47,12 +41,37 @@ void wofi_dmenu_init(struct map* config) {
if(lf != NULL) {
*lf = 0;
}
if(map_contains(cached, line)) {
continue;
}
wofi_insert_widget(MODE, &line, line, &line, 1);
struct cache_line* node = malloc(sizeof(struct cache_line));
node->line = strdup(line);
wl_list_insert(&entries, &node->link);
map_put(entry_map, line, "true");
}
free(line);
struct cache_line* node, *tmp;
wl_list_for_each_safe(node, tmp, cache, link) {
if(map_contains(entry_map, node->line)) {
map_put(cached, node->line, "true");
wofi_insert_widget(MODE, &node->line, node->line, &node->line, 1);
} else {
wofi_remove_cache(MODE, node->line);
}
free(node->line);
wl_list_remove(&node->link);
free(node);
}
free(cache);
map_free(entry_map);
wl_list_for_each_reverse_safe(node, tmp, &entries, link) {
if(!map_contains(cached, node->line)) {
wofi_insert_widget(MODE, &node->line, node->line, &node->line, 1);
}
free(node->line);
wl_list_remove(&node->link);
free(node);
}
map_free(cached);
}

View File

@@ -185,6 +185,7 @@ void wofi_drun_init() {
size_t action_count;
char** text = get_action_text(node->line, &action_count);
if(text == NULL) {
wofi_remove_cache(MODE, node->line);
goto cache_cont;
}

View File

@@ -42,9 +42,15 @@ void wofi_run_init(struct map* config) {
} else {
text = final_slash + 1;
}
wofi_insert_widget(MODE, &text, text, &node->line, 1);
map_put(cached, node->line, "true");
map_put(entries, text, "true");
struct stat info;
stat(node->line, &info);
if(access(node->line, X_OK) == 0 && S_ISREG(info.st_mode)) {
wofi_insert_widget(MODE, &text, text, &node->line, 1);
map_put(cached, node->line, "true");
map_put(entries, text, "true");
} else {
wofi_remove_cache(MODE, node->line);
}
free(node->line);
wl_list_remove(&node->link);
free(node);