diff options
author | Dave Davenport <qball@gmpclient.org> | 2017-01-09 00:09:02 +0100 |
---|---|---|
committer | Dave Davenport <qball@gmpclient.org> | 2017-01-09 00:09:02 +0100 |
commit | 713d41f619a1a8b311c3028a97e909e79cf88353 (patch) | |
tree | 8f30db8856307c2ebbc156573fc1dfc54969ba21 /source | |
parent | baab2047adf24642cbc727b50a77dc544e934a76 (diff) |
Allow matching highlighting to be set. Fixes #522
Diffstat (limited to 'source')
-rw-r--r-- | source/helper.c | 37 | ||||
-rw-r--r-- | source/theme.c | 30 | ||||
-rw-r--r-- | source/view.c | 4 |
3 files changed, 62 insertions, 9 deletions
diff --git a/source/helper.c b/source/helper.c index 84307bdd..48fbf13d 100644 --- a/source/helper.c +++ b/source/helper.c @@ -391,7 +391,7 @@ int find_arg_char ( const char * const key, char *val ) return FALSE; } -PangoAttrList *token_match_get_pango_attr ( GRegex **tokens, const char *input, PangoAttrList *retv ) +PangoAttrList *token_match_get_pango_attr ( ThemeHighlight th, GRegex **tokens, const char *input, PangoAttrList *retv ) { // Do a tokenized match. if ( tokens ) { @@ -401,14 +401,35 @@ PangoAttrList *token_match_get_pango_attr ( GRegex **tokens, const char *input, while ( g_match_info_matches ( gmi ) ) { int count = g_match_info_get_match_count ( gmi ); for ( int index = ( count > 1 ) ? 1 : 0; index < count; index++ ) { - int start, end; + int start, end; g_match_info_fetch_pos ( gmi, index, &start, &end ); - PangoAttribute *pa = pango_attr_underline_new ( PANGO_UNDERLINE_SINGLE ); - PangoAttribute *pa2 = pango_attr_weight_new ( PANGO_WEIGHT_BOLD ); - pa2->start_index = pa->start_index = start; - pa2->end_index = pa->end_index = end; - pango_attr_list_insert ( retv, pa ); - pango_attr_list_insert ( retv, pa2 ); + if ( th.style & HL_BOLD ) { + PangoAttribute *pa = pango_attr_weight_new ( PANGO_WEIGHT_BOLD ); + pa->start_index = start; + pa->end_index = end; + pango_attr_list_insert ( retv, pa ); + } + if ( th.style & HL_UNDERLINE ) { + PangoAttribute *pa = pango_attr_underline_new ( PANGO_UNDERLINE_SINGLE ); + pa->start_index = start; + pa->end_index = end; + pango_attr_list_insert ( retv, pa ); + } + if ( th.style & HL_ITALIC ) { + PangoAttribute *pa = pango_attr_style_new ( PANGO_STYLE_ITALIC ); + pa->start_index = start; + pa->end_index = end; + pango_attr_list_insert ( retv, pa ); + } + if ( th.style & HL_COLOR ) { + PangoAttribute *pa = pango_attr_foreground_new ( + th.color.red * 65535, + th.color.green * 65535, + th.color.blue * 65535 ); + pa->start_index = start; + pa->end_index = end; + pango_attr_list_insert ( retv, pa ); + } } g_match_info_next ( gmi, NULL ); } diff --git a/source/theme.c b/source/theme.c index 0defa28b..b7e89ec9 100644 --- a/source/theme.c +++ b/source/theme.c @@ -111,6 +111,25 @@ static void rofi_theme_print_property_index ( size_t pnl, int depth, Property *p printf ( "%*s%s:%*s ", depth, "", p->name, (int) pnl - pl, "" ); switch ( p->type ) { + case P_HIGHLIGHT: + if ( p->value.highlight.style & HL_BOLD ) { + printf ( "bold " ); + } + if ( p->value.highlight.style & HL_UNDERLINE ) { + printf ( "underline " ); + } + if ( p->value.highlight.style & HL_ITALIC ) { + printf ( "italic " ); + } + if ( p->value.highlight.style & HL_COLOR ) { + printf ( "#%02X%02X%02X%02X", + (unsigned char) ( p->value.highlight.color.alpha * 255.0 ), + (unsigned char) ( p->value.highlight.color.red * 255.0 ), + (unsigned char) ( p->value.highlight.color.green * 255.0 ), + (unsigned char) ( p->value.highlight.color.blue * 255.0 ) ); + } + printf ( ";" ); + break; case P_POSITION: printf ( "%s;", WindowLocationStr[p->value.i] ); break; @@ -486,6 +505,17 @@ Padding rofi_theme_get_padding ( const widget *widget, const char *property, Pad g_log ( LOG_DOMAIN, G_LOG_LEVEL_DEBUG, "Theme entry: #%s %s property %s unset.", widget->name, widget->state ? widget->state : "", property ); return pad; } +ThemeHighlight rofi_theme_get_highlight ( widget *widget, const char *property, ThemeHighlight th ) +{ + ThemeWidget *wid = rofi_theme_find_widget ( widget->name, widget->state, FALSE ); + Property *p = rofi_theme_find_property ( wid, P_HIGHLIGHT, property, FALSE ); + if ( p ) { + return p->value.highlight; + } + g_log ( LOG_DOMAIN, G_LOG_LEVEL_DEBUG, "Theme entry: #%s %s property %s unset.", widget->name, widget->state ? widget->state : "", property ); + return th; +} + int distance_get_pixel ( Distance d, Orientation ori ) { if ( d.type == PW_EM ) { diff --git a/source/view.c b/source/view.c index 814a18c3..e0b5c46c 100644 --- a/source/view.c +++ b/source/view.c @@ -834,7 +834,9 @@ static void update_callback ( textbox *t, unsigned int index, void *udata, TextB else{ list = pango_attr_list_new (); } - token_match_get_pango_attr ( state->tokens, textbox_get_visible_text ( t ), list ); + ThemeHighlight th = { HL_BOLD | HL_UNDERLINE, { 0.0, 0.0, 0.0, 0.0 } }; + th = rofi_theme_get_highlight ( WIDGET ( t ), "highlight", th ); + token_match_get_pango_attr ( th, state->tokens, textbox_get_visible_text ( t ), list ); textbox_set_pango_attributes ( t, list ); pango_attr_list_unref ( list ); } |