summaryrefslogtreecommitdiffstats
path: root/source
diff options
context:
space:
mode:
authorDave Davenport <qball@gmpclient.org>2017-01-09 00:09:02 +0100
committerDave Davenport <qball@gmpclient.org>2017-01-09 00:09:02 +0100
commit713d41f619a1a8b311c3028a97e909e79cf88353 (patch)
tree8f30db8856307c2ebbc156573fc1dfc54969ba21 /source
parentbaab2047adf24642cbc727b50a77dc544e934a76 (diff)
Allow matching highlighting to be set. Fixes #522
Diffstat (limited to 'source')
-rw-r--r--source/helper.c37
-rw-r--r--source/theme.c30
-rw-r--r--source/view.c4
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 );
}