1
0
Fork 0
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:
Dave Davenport 2022-05-11 17:02:13 +02:00
parent f488b41ed5
commit fc64265343
3 changed files with 34 additions and 3 deletions

View file

@ -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

View file

@ -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);
/** /**

View file

@ -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;
} }