mirror of
https://github.com/davatorium/rofi.git
synced 2024-11-25 13:55:34 -05:00
[1633][Mode] Add generic fallback option for modes.
Add config option: ```css configuration { <mode> { fallback-icon: "<icon name>"; } } ``` fixes: #1633
This commit is contained in:
parent
f488b41ed5
commit
fc64265343
3 changed files with 34 additions and 3 deletions
|
@ -203,6 +203,10 @@ struct rofi_mode {
|
||||||
|
|
||||||
/** Module */
|
/** Module */
|
||||||
GModule *module;
|
GModule *module;
|
||||||
|
|
||||||
|
/** Fallack icon.*/
|
||||||
|
uint32_t fallback_icon_fetch_uid;
|
||||||
|
uint32_t fallback_icon_not_found;
|
||||||
};
|
};
|
||||||
G_END_DECLS
|
G_END_DECLS
|
||||||
#endif // ROFI_MODE_PRIVATE_H
|
#endif // ROFI_MODE_PRIVATE_H
|
||||||
|
|
|
@ -138,7 +138,7 @@ char *mode_get_display_value(const Mode *mode, unsigned int selected_line,
|
||||||
*
|
*
|
||||||
* @returns allocated new cairo_surface_t if applicable
|
* @returns allocated new cairo_surface_t if applicable
|
||||||
*/
|
*/
|
||||||
cairo_surface_t *mode_get_icon(const Mode *mode, unsigned int selected_line,
|
cairo_surface_t *mode_get_icon(Mode *mode, unsigned int selected_line,
|
||||||
int height);
|
int height);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -32,6 +32,7 @@
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
|
#include "rofi-icon-fetcher.h"
|
||||||
// This one should only be in mode implementations.
|
// This one should only be in mode implementations.
|
||||||
#include "mode-private.h"
|
#include "mode-private.h"
|
||||||
/**
|
/**
|
||||||
|
@ -42,6 +43,9 @@
|
||||||
int mode_init(Mode *mode) {
|
int mode_init(Mode *mode) {
|
||||||
g_return_val_if_fail(mode != NULL, FALSE);
|
g_return_val_if_fail(mode != NULL, FALSE);
|
||||||
g_return_val_if_fail(mode->_init != NULL, FALSE);
|
g_return_val_if_fail(mode->_init != NULL, FALSE);
|
||||||
|
// to make sure this is initialized correctly.
|
||||||
|
mode->fallback_icon_fetch_uid = 0;
|
||||||
|
mode->fallback_icon_not_found = FALSE;
|
||||||
return mode->_init(mode);
|
return mode->_init(mode);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -68,13 +72,36 @@ char *mode_get_display_value(const Mode *mode, unsigned int selected_line,
|
||||||
get_entry);
|
get_entry);
|
||||||
}
|
}
|
||||||
|
|
||||||
cairo_surface_t *mode_get_icon(const Mode *mode, unsigned int selected_line,
|
cairo_surface_t *mode_get_icon(Mode *mode, unsigned int selected_line,
|
||||||
int height) {
|
int height) {
|
||||||
g_assert(mode != NULL);
|
g_assert(mode != NULL);
|
||||||
|
|
||||||
if (mode->_get_icon != NULL) {
|
if (mode->_get_icon != NULL) {
|
||||||
return mode->_get_icon(mode, selected_line, height);
|
cairo_surface_t *icon = mode->_get_icon(mode, selected_line, height);
|
||||||
|
if ( icon ) {
|
||||||
|
return icon;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if ( mode->fallback_icon_not_found == TRUE) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
if (mode->fallback_icon_fetch_uid > 0) {
|
||||||
|
cairo_surface_t *icon = rofi_icon_fetcher_get(mode->fallback_icon_fetch_uid);
|
||||||
|
return icon;
|
||||||
|
}
|
||||||
|
ThemeWidget *wid = rofi_config_find_widget(mode->name, NULL, TRUE);
|
||||||
|
if ( wid ) {
|
||||||
|
/** Load user entires */
|
||||||
|
Property *p = rofi_theme_find_property(wid, P_STRING, "fallback-icon", TRUE);
|
||||||
|
if (p != NULL && (p->type == P_STRING && p->value.s)) {
|
||||||
|
mode->fallback_icon_fetch_uid =
|
||||||
|
rofi_icon_fetcher_query(p->value.s, height);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
mode->fallback_icon_not_found = TRUE;
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue