[Modes] Support icons off multiple icons.

This commit is contained in:
Dave Davenport
2022-06-27 20:52:12 +02:00
parent 9c18aaef22
commit ceb2b9d295
7 changed files with 37 additions and 6 deletions

View File

@@ -12,6 +12,7 @@ typedef struct {
char *icon_name; char *icon_name;
/** Async icon fetch handler. */ /** Async icon fetch handler. */
uint32_t icon_fetch_uid; uint32_t icon_fetch_uid;
uint32_t icon_fetch_size;
/** Hidden meta keywords. */ /** Hidden meta keywords. */
char *meta; char *meta;

View File

@@ -127,6 +127,7 @@ static void read_add_block(DmenuModePrivateData *pd, Block **block, char *data,
gsize data_len = len; gsize data_len = len;
// Init. // Init.
(*block)->values[(*block)->length].icon_fetch_uid = 0; (*block)->values[(*block)->length].icon_fetch_uid = 0;
(*block)->values[(*block)->length].icon_fetch_size = 0;
(*block)->values[(*block)->length].icon_name = NULL; (*block)->values[(*block)->length].icon_name = NULL;
(*block)->values[(*block)->length].meta = NULL; (*block)->values[(*block)->length].meta = NULL;
(*block)->values[(*block)->length].info = NULL; (*block)->values[(*block)->length].info = NULL;
@@ -156,6 +157,7 @@ static void read_add(DmenuModePrivateData *pd, char *data, gsize len) {
} }
// Init. // Init.
pd->cmd_list[pd->cmd_list_length].icon_fetch_uid = 0; pd->cmd_list[pd->cmd_list_length].icon_fetch_uid = 0;
pd->cmd_list[pd->cmd_list_length].icon_fetch_size = 0;
pd->cmd_list[pd->cmd_list_length].icon_name = NULL; pd->cmd_list[pd->cmd_list_length].icon_name = NULL;
pd->cmd_list[pd->cmd_list_length].meta = NULL; pd->cmd_list[pd->cmd_list_length].meta = NULL;
pd->cmd_list[pd->cmd_list_length].info = NULL; pd->cmd_list[pd->cmd_list_length].info = NULL;
@@ -629,11 +631,12 @@ static cairo_surface_t *dmenu_get_icon(const Mode *sw,
if (dr->icon_name == NULL) { if (dr->icon_name == NULL) {
return NULL; return NULL;
} }
if (dr->icon_fetch_uid > 0) { if (dr->icon_fetch_uid > 0 && dr->icon_fetch_size == height) {
return rofi_icon_fetcher_get(dr->icon_fetch_uid); return rofi_icon_fetcher_get(dr->icon_fetch_uid);
} }
uint32_t uid = dr->icon_fetch_uid = uint32_t uid = dr->icon_fetch_uid =
rofi_icon_fetcher_query(dr->icon_name, height); rofi_icon_fetcher_query(dr->icon_name, height);
dr->icon_fetch_size = height;
return rofi_icon_fetcher_get(uid); return rofi_icon_fetcher_get(uid);
} }

View File

@@ -130,6 +130,7 @@ typedef struct {
gint sort_index; gint sort_index;
/* UID for the icon to display */ /* UID for the icon to display */
uint32_t icon_fetch_uid; uint32_t icon_fetch_uid;
uint32_t icon_fetch_size;
/* Type of desktop file */ /* Type of desktop file */
DRunDesktopEntryType type; DRunDesktopEntryType type;
} DRunModeEntry; } DRunModeEntry;
@@ -620,6 +621,7 @@ static void read_desktop_file(DRunModePrivateData *pd, const char *root,
} }
pd->entry_list[pd->cmd_list_length].icon_size = 0; pd->entry_list[pd->cmd_list_length].icon_size = 0;
pd->entry_list[pd->cmd_list_length].icon_fetch_uid = 0; pd->entry_list[pd->cmd_list_length].icon_fetch_uid = 0;
pd->entry_list[pd->cmd_list_length].icon_fetch_size = 0;
pd->entry_list[pd->cmd_list_length].root = g_strdup(root); pd->entry_list[pd->cmd_list_length].root = g_strdup(root);
pd->entry_list[pd->cmd_list_length].path = g_strdup(path); pd->entry_list[pd->cmd_list_length].path = g_strdup(path);
pd->entry_list[pd->cmd_list_length].desktop_id = g_strdup(id); pd->entry_list[pd->cmd_list_length].desktop_id = g_strdup(id);
@@ -1336,11 +1338,12 @@ static cairo_surface_t *_get_icon(const Mode *sw, unsigned int selected_line,
g_return_val_if_fail(pd->entry_list != NULL, NULL); g_return_val_if_fail(pd->entry_list != NULL, NULL);
DRunModeEntry *dr = &(pd->entry_list[selected_line]); DRunModeEntry *dr = &(pd->entry_list[selected_line]);
if (dr->icon_name != NULL) { if (dr->icon_name != NULL) {
if (dr->icon_fetch_uid > 0) { if (dr->icon_fetch_uid > 0 && dr->icon_fetch_size == height) {
cairo_surface_t *icon = rofi_icon_fetcher_get(dr->icon_fetch_uid); cairo_surface_t *icon = rofi_icon_fetcher_get(dr->icon_fetch_uid);
return icon; return icon;
} }
dr->icon_fetch_uid = rofi_icon_fetcher_query(dr->icon_name, height); dr->icon_fetch_uid = rofi_icon_fetcher_query(dr->icon_name, height);
dr->icon_fetch_size = height;
cairo_surface_t *icon = rofi_icon_fetcher_get(dr->icon_fetch_uid); cairo_surface_t *icon = rofi_icon_fetcher_get(dr->icon_fetch_uid);
return icon; return icon;
} }

View File

@@ -84,6 +84,7 @@ typedef struct {
char *path; char *path;
enum FBFileType type; enum FBFileType type;
uint32_t icon_fetch_uid; uint32_t icon_fetch_uid;
uint32_t icon_fetch_size;
gboolean link; gboolean link;
time_t time; time_t time;
} FBFile; } FBFile;
@@ -234,6 +235,7 @@ static void get_file_browser(Mode *sw) {
pd->array[pd->array_length].path = NULL; pd->array[pd->array_length].path = NULL;
pd->array[pd->array_length].type = UP; pd->array[pd->array_length].type = UP;
pd->array[pd->array_length].icon_fetch_uid = 0; pd->array[pd->array_length].icon_fetch_uid = 0;
pd->array[pd->array_length].icon_fetch_size = 0;
pd->array[pd->array_length].link = FALSE; pd->array[pd->array_length].link = FALSE;
pd->array[pd->array_length].time = -1; pd->array[pd->array_length].time = -1;
pd->array_length++; pd->array_length++;
@@ -265,6 +267,7 @@ static void get_file_browser(Mode *sw) {
pd->array[pd->array_length].type = pd->array[pd->array_length].type =
(rd->d_type == DT_DIR) ? DIRECTORY : RFILE; (rd->d_type == DT_DIR) ? DIRECTORY : RFILE;
pd->array[pd->array_length].icon_fetch_uid = 0; pd->array[pd->array_length].icon_fetch_uid = 0;
pd->array[pd->array_length].icon_fetch_size = 0;
pd->array[pd->array_length].link = FALSE; pd->array[pd->array_length].link = FALSE;
if (file_browser_config.sorting_method == FB_SORT_TIME) { if (file_browser_config.sorting_method == FB_SORT_TIME) {
@@ -284,6 +287,7 @@ static void get_file_browser(Mode *sw) {
pd->array[pd->array_length].path = pd->array[pd->array_length].path =
g_build_filename(cdir, rd->d_name, NULL); g_build_filename(cdir, rd->d_name, NULL);
pd->array[pd->array_length].icon_fetch_uid = 0; pd->array[pd->array_length].icon_fetch_uid = 0;
pd->array[pd->array_length].icon_fetch_size = 0;
pd->array[pd->array_length].link = TRUE; pd->array[pd->array_length].link = TRUE;
// Default to file. // Default to file.
pd->array[pd->array_length].type = RFILE; pd->array[pd->array_length].type = RFILE;
@@ -562,7 +566,7 @@ static cairo_surface_t *_get_icon(const Mode *sw, unsigned int selected_line,
(FileBrowserModePrivateData *)mode_get_private_data(sw); (FileBrowserModePrivateData *)mode_get_private_data(sw);
g_return_val_if_fail(pd->array != NULL, NULL); g_return_val_if_fail(pd->array != NULL, NULL);
FBFile *dr = &(pd->array[selected_line]); FBFile *dr = &(pd->array[selected_line]);
if (dr->icon_fetch_uid > 0) { if (dr->icon_fetch_uid > 0 && dr->icon_fetch_size == height) {
return rofi_icon_fetcher_get(dr->icon_fetch_uid); return rofi_icon_fetcher_get(dr->icon_fetch_uid);
} }
if (rofi_icon_fetcher_file_is_image(dr->path)) { if (rofi_icon_fetcher_file_is_image(dr->path)) {
@@ -570,6 +574,7 @@ static cairo_surface_t *_get_icon(const Mode *sw, unsigned int selected_line,
} else { } else {
dr->icon_fetch_uid = rofi_icon_fetcher_query(icon_name[dr->type], height); dr->icon_fetch_uid = rofi_icon_fetcher_query(icon_name[dr->type], height);
} }
dr->icon_fetch_size = height;
return rofi_icon_fetcher_get(dr->icon_fetch_uid); return rofi_icon_fetcher_get(dr->icon_fetch_uid);
} }

View File

@@ -65,6 +65,7 @@
typedef struct { typedef struct {
char *entry; char *entry;
uint32_t icon_fetch_uid; uint32_t icon_fetch_uid;
uint32_t icon_fetch_size;
/* Surface holding the icon. */ /* Surface holding the icon. */
cairo_surface_t *icon; cairo_surface_t *icon;
} RunEntry; } RunEntry;
@@ -203,6 +204,7 @@ static RunEntry *get_apps_external(RunEntry *retv, unsigned int *length,
retv[(*length)].entry = g_strdup(buffer); retv[(*length)].entry = g_strdup(buffer);
retv[(*length)].icon = NULL; retv[(*length)].icon = NULL;
retv[(*length)].icon_fetch_uid = 0; retv[(*length)].icon_fetch_uid = 0;
retv[(*length)].icon_fetch_size = 0;
(*length)++; (*length)++;
} }
@@ -218,6 +220,7 @@ static RunEntry *get_apps_external(RunEntry *retv, unsigned int *length,
retv[(*length)].entry = NULL; retv[(*length)].entry = NULL;
retv[(*length)].icon = NULL; retv[(*length)].icon = NULL;
retv[(*length)].icon_fetch_uid = 0; retv[(*length)].icon_fetch_uid = 0;
retv[(*length)].icon_fetch_size = 0;
return retv; return retv;
} }
@@ -328,9 +331,11 @@ static RunEntry *get_apps(unsigned int *length) {
retv[(*length)].entry = name; retv[(*length)].entry = name;
retv[(*length)].icon = NULL; retv[(*length)].icon = NULL;
retv[(*length)].icon_fetch_uid = 0; retv[(*length)].icon_fetch_uid = 0;
retv[(*length)].icon_fetch_size = 0;
retv[(*length) + 1].entry = NULL; retv[(*length) + 1].entry = NULL;
retv[(*length) + 1].icon = NULL; retv[(*length) + 1].icon = NULL;
retv[(*length) + 1].icon_fetch_uid = 0; retv[(*length) + 1].icon_fetch_uid = 0;
retv[(*length) + 1].icon_fetch_size = 0;
(*length)++; (*length)++;
} }
@@ -537,7 +542,7 @@ static cairo_surface_t *_get_icon(const Mode *sw, unsigned int selected_line,
g_return_val_if_fail(pd->cmd_list != NULL, NULL); g_return_val_if_fail(pd->cmd_list != NULL, NULL);
RunEntry *dr = &(pd->cmd_list[selected_line]); RunEntry *dr = &(pd->cmd_list[selected_line]);
if (dr->icon_fetch_uid > 0) { if (dr->icon_fetch_uid > 0 && dr->icon_fetch_size == height) {
cairo_surface_t *icon = rofi_icon_fetcher_get(dr->icon_fetch_uid); cairo_surface_t *icon = rofi_icon_fetcher_get(dr->icon_fetch_uid);
return icon; return icon;
} }
@@ -545,6 +550,7 @@ static cairo_surface_t *_get_icon(const Mode *sw, unsigned int selected_line,
char **str = g_strsplit(dr->entry, " ", 2); char **str = g_strsplit(dr->entry, " ", 2);
if (str) { if (str) {
dr->icon_fetch_uid = rofi_icon_fetcher_query(str[0], height); dr->icon_fetch_uid = rofi_icon_fetcher_query(str[0], height);
dr->icon_fetch_size = height;
g_strfreev(str); g_strfreev(str);
cairo_surface_t *icon = rofi_icon_fetcher_get(dr->icon_fetch_uid); cairo_surface_t *icon = rofi_icon_fetcher_get(dr->icon_fetch_uid);
return icon; return icon;

View File

@@ -224,6 +224,7 @@ static DmenuScriptEntry *execute_executor(Mode *sw, char *arg,
retv[(*length)].meta = NULL; retv[(*length)].meta = NULL;
retv[(*length)].info = NULL; retv[(*length)].info = NULL;
retv[(*length)].icon_fetch_uid = 0; retv[(*length)].icon_fetch_uid = 0;
retv[(*length)].icon_fetch_size = 0;
retv[(*length)].nonselectable = FALSE; retv[(*length)].nonselectable = FALSE;
if (buf_length > 0 && (read_length > (ssize_t)buf_length)) { if (buf_length > 0 && (read_length > (ssize_t)buf_length)) {
dmenuscript_parse_entry_extras(sw, &(retv[(*length)]), dmenuscript_parse_entry_extras(sw, &(retv[(*length)]),
@@ -430,10 +431,11 @@ script_get_icon(const Mode *sw, unsigned int selected_line, int height) {
if (dr->icon_name == NULL) { if (dr->icon_name == NULL) {
return NULL; return NULL;
} }
if (dr->icon_fetch_uid > 0) { if (dr->icon_fetch_uid > 0 && dr->icon_fetch_size == height) {
return rofi_icon_fetcher_get(dr->icon_fetch_uid); return rofi_icon_fetcher_get(dr->icon_fetch_uid);
} }
dr->icon_fetch_uid = rofi_icon_fetcher_query(dr->icon_name, height); dr->icon_fetch_uid = rofi_icon_fetcher_query(dr->icon_name, height);
dr->icon_fetch_size = height;
return rofi_icon_fetcher_get(dr->icon_fetch_uid); return rofi_icon_fetcher_get(dr->icon_fetch_uid);
} }
@@ -467,7 +469,8 @@ void script_mode_gather_user_scripts(void) {
const char *file = NULL; const char *file = NULL;
while ((file = g_dir_read_name(sd)) != NULL) { while ((file = g_dir_read_name(sd)) != NULL) {
char *sp = g_build_filename(cpath, "rofi", "scripts", file, NULL); char *sp = g_build_filename(cpath, "rofi", "scripts", file, NULL);
user_scripts = g_realloc(user_scripts, sizeof(ScriptUser)*(num_scripts + 1)); user_scripts =
g_realloc(user_scripts, sizeof(ScriptUser) * (num_scripts + 1));
user_scripts[num_scripts].path = sp; user_scripts[num_scripts].path = sp;
user_scripts[num_scripts].name = g_strdup(file); user_scripts[num_scripts].name = g_strdup(file);
char *dot = strrchr(user_scripts[num_scripts].name, '.'); char *dot = strrchr(user_scripts[num_scripts].name, '.');

View File

@@ -125,6 +125,7 @@ typedef struct {
cairo_surface_t *icon; cairo_surface_t *icon;
gboolean icon_checked; gboolean icon_checked;
uint32_t icon_fetch_uid; uint32_t icon_fetch_uid;
uint32_t icon_fetch_size;
gboolean thumbnail_checked; gboolean thumbnail_checked;
} client; } client;
@@ -1028,6 +1029,14 @@ static cairo_surface_t *_get_icon(const Mode *sw, unsigned int selected_line,
if (c == NULL) { if (c == NULL) {
return NULL; return NULL;
} }
if (c->icon_fetch_size != size) {
if (c->icon) {
cairo_surface_destroy(c->icon);
c->icon = NULL;
c->thumbnail_checked = FALSE;
c->icon_checked = FALSE;
}
}
if (config.window_thumbnail && c->thumbnail_checked == FALSE) { if (config.window_thumbnail && c->thumbnail_checked == FALSE) {
c->icon = x11_helper_get_screenshot_surface_window(c->window, size); c->icon = x11_helper_get_screenshot_surface_window(c->window, size);
c->thumbnail_checked = TRUE; c->thumbnail_checked = TRUE;
@@ -1045,6 +1054,7 @@ static cairo_surface_t *_get_icon(const Mode *sw, unsigned int selected_line,
g_free(class_lower); g_free(class_lower);
return rofi_icon_fetcher_get(c->icon_fetch_uid); return rofi_icon_fetcher_get(c->icon_fetch_uid);
} }
c->icon_fetch_size = size;
return c->icon; return c->icon;
} }