mirror of
https://github.com/davatorium/rofi.git
synced 2024-11-25 13:55:34 -05:00
Allow matching highlighting to be set. Fixes #522
This commit is contained in:
parent
baab2047ad
commit
713d41f619
8 changed files with 150 additions and 13 deletions
|
@ -118,6 +118,7 @@ Value supports the following formats:
|
||||||
* {line-style} can be `dash` or `solid` and is optional.
|
* {line-style} can be `dash` or `solid` and is optional.
|
||||||
* padding: `({distance}){1,4}`
|
* padding: `({distance}){1,4}`
|
||||||
* position: (center|north|south|east|west|northeast|northwest|southwest|southeast)
|
* position: (center|north|south|east|west|northeast|northwest|southwest|southeast)
|
||||||
|
* highlight-style: (none|bold|underline|italic)
|
||||||
|
|
||||||
Each property is closed by a semi-colon `;`;
|
Each property is closed by a semi-colon `;`;
|
||||||
|
|
||||||
|
@ -156,6 +157,7 @@ The following properties are currently supports:
|
||||||
* background: color
|
* background: color
|
||||||
* foreground: color
|
* foreground: color
|
||||||
* text: The text color to use (falls back to foreground if not set)
|
* text: The text color to use (falls back to foreground if not set)
|
||||||
|
* highlight: highlight {color}
|
||||||
|
|
||||||
* listview:
|
* listview:
|
||||||
* columns: integer
|
* columns: integer
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
#include "rofi.h"
|
#include "rofi.h"
|
||||||
|
|
||||||
#include <pango/pango.h>
|
#include <pango/pango.h>
|
||||||
|
#include <theme.h>
|
||||||
/**
|
/**
|
||||||
* @defgroup HELPERS Helpers
|
* @defgroup HELPERS Helpers
|
||||||
*/
|
*/
|
||||||
|
@ -195,6 +196,7 @@ char * rofi_force_utf8 ( gchar *data, ssize_t length );
|
||||||
char * rofi_latin_to_utf8_strdup ( const char *input, gssize length );
|
char * rofi_latin_to_utf8_strdup ( const char *input, gssize length );
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
* @param th The ThemeHighlight
|
||||||
* @param tokens Array of regexes used for matching
|
* @param tokens Array of regexes used for matching
|
||||||
* @param input The input string to find the matches on
|
* @param input The input string to find the matches on
|
||||||
* @param retv The Attribute list to update with matches
|
* @param retv The Attribute list to update with matches
|
||||||
|
@ -203,6 +205,6 @@ char * rofi_latin_to_utf8_strdup ( const char *input, gssize length );
|
||||||
*
|
*
|
||||||
* @returns the updated retv list.
|
* @returns the updated retv list.
|
||||||
*/
|
*/
|
||||||
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 );
|
||||||
/*@}*/
|
/*@}*/
|
||||||
#endif // ROFI_HELPER_H
|
#endif // ROFI_HELPER_H
|
||||||
|
|
|
@ -5,6 +5,21 @@
|
||||||
#include <widgets/widget.h>
|
#include <widgets/widget.h>
|
||||||
#include <settings.h>
|
#include <settings.h>
|
||||||
|
|
||||||
|
/** Style of text highlight */
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
/** no highlight */
|
||||||
|
HL_NONE = 0,
|
||||||
|
/** bold */
|
||||||
|
HL_BOLD = 1,
|
||||||
|
/** underline */
|
||||||
|
HL_UNDERLINE = 2,
|
||||||
|
/** italic */
|
||||||
|
HL_ITALIC = 4,
|
||||||
|
/** color */
|
||||||
|
HL_COLOR = 8
|
||||||
|
} HighlightStyle;
|
||||||
|
|
||||||
/** Style of line */
|
/** Style of line */
|
||||||
typedef enum
|
typedef enum
|
||||||
{
|
{
|
||||||
|
@ -69,6 +84,8 @@ typedef enum
|
||||||
P_LINK,
|
P_LINK,
|
||||||
/** Position */
|
/** Position */
|
||||||
P_POSITION,
|
P_POSITION,
|
||||||
|
/** Highlight */
|
||||||
|
P_HIGHLIGHT,
|
||||||
} PropertyType;
|
} PropertyType;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -97,6 +114,16 @@ typedef struct
|
||||||
Distance left;
|
Distance left;
|
||||||
} Padding;
|
} Padding;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Theme highlight.
|
||||||
|
*/
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
/** style to display */
|
||||||
|
HighlightStyle style;
|
||||||
|
/** Color */
|
||||||
|
ThemeColor color;
|
||||||
|
} ThemeHighlight;
|
||||||
/**
|
/**
|
||||||
* Property structure.
|
* Property structure.
|
||||||
*/
|
*/
|
||||||
|
@ -128,7 +155,9 @@ typedef struct Property
|
||||||
char *name;
|
char *name;
|
||||||
/** Cached looked up ref */
|
/** Cached looked up ref */
|
||||||
struct Property *ref;
|
struct Property *ref;
|
||||||
} link;
|
} link;
|
||||||
|
/** Highlight Style */
|
||||||
|
ThemeHighlight highlight;
|
||||||
} value;
|
} value;
|
||||||
} Property;
|
} Property;
|
||||||
/**
|
/**
|
||||||
|
@ -320,6 +349,17 @@ void rofi_theme_get_color ( const widget *widget, const char *property, cairo_t
|
||||||
*/
|
*/
|
||||||
Padding rofi_theme_get_padding ( const widget *widget, const char *property, Padding pad );
|
Padding rofi_theme_get_padding ( const widget *widget, const char *property, Padding pad );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param widget The widget to query
|
||||||
|
* @param property The property to query.
|
||||||
|
* @param th The default value.
|
||||||
|
*
|
||||||
|
* Obtain the highlight .
|
||||||
|
*
|
||||||
|
* @returns The highlight of this property for this widget.
|
||||||
|
*/
|
||||||
|
ThemeHighlight rofi_theme_get_highlight ( widget *widget, const char *property, ThemeHighlight th );
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param d The distance handle.
|
* @param d The distance handle.
|
||||||
* @param ori The orientation.
|
* @param ori The orientation.
|
||||||
|
|
|
@ -69,6 +69,11 @@ SOUTH "south"
|
||||||
EAST "east"
|
EAST "east"
|
||||||
WEST "west"
|
WEST "west"
|
||||||
|
|
||||||
|
NONE "none"
|
||||||
|
BOLD "bold"
|
||||||
|
UNDERLINE "underline"
|
||||||
|
ITALIC "italic"
|
||||||
|
|
||||||
LS_DASH "dash"
|
LS_DASH "dash"
|
||||||
LS_SOLID "solid"
|
LS_SOLID "solid"
|
||||||
|
|
||||||
|
@ -302,10 +307,26 @@ if ( queue == NULL ){
|
||||||
yylval->ival = WL_NORTH;
|
yylval->ival = WL_NORTH;
|
||||||
return T_POSITION;
|
return T_POSITION;
|
||||||
}
|
}
|
||||||
<PROPERTIES>NORTH {
|
<PROPERTIES>{NORTH} {
|
||||||
yylval->ival = WL_NORTH;
|
yylval->ival = WL_NORTH;
|
||||||
return T_POSITION;
|
return T_POSITION;
|
||||||
}
|
}
|
||||||
|
<PROPERTIES>{NONE} {
|
||||||
|
yylval->ival = HL_NONE;
|
||||||
|
return T_HIGHLIGHT_STYLE;
|
||||||
|
}
|
||||||
|
<PROPERTIES>{BOLD} {
|
||||||
|
yylval->ival = HL_BOLD;
|
||||||
|
return T_HIGHLIGHT_STYLE;
|
||||||
|
}
|
||||||
|
<PROPERTIES>{ITALIC} {
|
||||||
|
yylval->ival = HL_ITALIC;
|
||||||
|
return T_HIGHLIGHT_STYLE;
|
||||||
|
}
|
||||||
|
<PROPERTIES>{UNDERLINE} {
|
||||||
|
yylval->ival = HL_UNDERLINE;
|
||||||
|
return T_HIGHLIGHT_STYLE;
|
||||||
|
}
|
||||||
<INITIAL><<EOF>> {
|
<INITIAL><<EOF>> {
|
||||||
g_queue_free ( queue );
|
g_queue_free ( queue );
|
||||||
// Reset pointer to NULL
|
// Reset pointer to NULL
|
||||||
|
|
|
@ -38,6 +38,7 @@ int yylex (YYSTYPE *, YYLTYPE *);
|
||||||
%token <sval> T_STRING
|
%token <sval> T_STRING
|
||||||
%token <sval> N_STRING
|
%token <sval> N_STRING
|
||||||
%token <ival> T_POSITION;
|
%token <ival> T_POSITION;
|
||||||
|
%token <ival> T_HIGHLIGHT_STYLE
|
||||||
%token <sval> NAME_ELEMENT "Element name"
|
%token <sval> NAME_ELEMENT "Element name"
|
||||||
%token <bval> T_BOOLEAN
|
%token <bval> T_BOOLEAN
|
||||||
%token <colorval> T_COLOR
|
%token <colorval> T_COLOR
|
||||||
|
@ -54,6 +55,7 @@ int yylex (YYSTYPE *, YYLTYPE *);
|
||||||
%token WHITESPACE "White space";
|
%token WHITESPACE "White space";
|
||||||
%token PDEFAULTS "Default settings";
|
%token PDEFAULTS "Default settings";
|
||||||
|
|
||||||
|
%type <ival> highlight_styles
|
||||||
%type <sval> entry
|
%type <sval> entry
|
||||||
%type <sval> pvalue
|
%type <sval> pvalue
|
||||||
%type <theme> entries
|
%type <theme> entries
|
||||||
|
@ -171,8 +173,25 @@ property
|
||||||
$$->name = $1;
|
$$->name = $1;
|
||||||
$$->value.i = $3;
|
$$->value.i = $3;
|
||||||
}
|
}
|
||||||
|
| pvalue PSEP highlight_styles T_COLOR PCLOSE {
|
||||||
|
$$ = rofi_theme_property_create ( P_HIGHLIGHT );
|
||||||
|
$$->name = $1;
|
||||||
|
$$->value.highlight.style = $3|HL_COLOR;
|
||||||
|
$$->value.highlight.color = $4;
|
||||||
|
}
|
||||||
|
| pvalue PSEP highlight_styles PCLOSE {
|
||||||
|
$$ = rofi_theme_property_create ( P_HIGHLIGHT );
|
||||||
|
$$->name = $1;
|
||||||
|
$$->value.highlight.style = $3;
|
||||||
|
}
|
||||||
;
|
;
|
||||||
|
|
||||||
|
highlight_styles:
|
||||||
|
T_HIGHLIGHT_STYLE { $$ = $1; }
|
||||||
|
| highlight_styles T_HIGHLIGHT_STYLE {
|
||||||
|
$$ = $1 | $2;
|
||||||
|
}
|
||||||
|
;
|
||||||
pvalue: N_STRING { $$ = $1; }
|
pvalue: N_STRING { $$ = $1; }
|
||||||
|
|
||||||
name_path:
|
name_path:
|
||||||
|
|
|
@ -391,7 +391,7 @@ int find_arg_char ( const char * const key, char *val )
|
||||||
return FALSE;
|
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.
|
// Do a tokenized match.
|
||||||
if ( tokens ) {
|
if ( tokens ) {
|
||||||
|
@ -401,14 +401,35 @@ PangoAttrList *token_match_get_pango_attr ( GRegex **tokens, const char *input,
|
||||||
while ( g_match_info_matches ( gmi ) ) {
|
while ( g_match_info_matches ( gmi ) ) {
|
||||||
int count = g_match_info_get_match_count ( gmi );
|
int count = g_match_info_get_match_count ( gmi );
|
||||||
for ( int index = ( count > 1 ) ? 1 : 0; index < count; index++ ) {
|
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 );
|
g_match_info_fetch_pos ( gmi, index, &start, &end );
|
||||||
PangoAttribute *pa = pango_attr_underline_new ( PANGO_UNDERLINE_SINGLE );
|
if ( th.style & HL_BOLD ) {
|
||||||
PangoAttribute *pa2 = pango_attr_weight_new ( PANGO_WEIGHT_BOLD );
|
PangoAttribute *pa = pango_attr_weight_new ( PANGO_WEIGHT_BOLD );
|
||||||
pa2->start_index = pa->start_index = start;
|
pa->start_index = start;
|
||||||
pa2->end_index = pa->end_index = end;
|
pa->end_index = end;
|
||||||
pango_attr_list_insert ( retv, pa );
|
pango_attr_list_insert ( retv, pa );
|
||||||
pango_attr_list_insert ( retv, pa2 );
|
}
|
||||||
|
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 );
|
g_match_info_next ( gmi, NULL );
|
||||||
}
|
}
|
||||||
|
|
|
@ -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, "" );
|
printf ( "%*s%s:%*s ", depth, "", p->name, (int) pnl - pl, "" );
|
||||||
switch ( p->type )
|
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:
|
case P_POSITION:
|
||||||
printf ( "%s;", WindowLocationStr[p->value.i] );
|
printf ( "%s;", WindowLocationStr[p->value.i] );
|
||||||
break;
|
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 );
|
g_log ( LOG_DOMAIN, G_LOG_LEVEL_DEBUG, "Theme entry: #%s %s property %s unset.", widget->name, widget->state ? widget->state : "", property );
|
||||||
return pad;
|
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 )
|
int distance_get_pixel ( Distance d, Orientation ori )
|
||||||
{
|
{
|
||||||
if ( d.type == PW_EM ) {
|
if ( d.type == PW_EM ) {
|
||||||
|
|
|
@ -834,7 +834,9 @@ static void update_callback ( textbox *t, unsigned int index, void *udata, TextB
|
||||||
else{
|
else{
|
||||||
list = pango_attr_list_new ();
|
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 );
|
textbox_set_pango_attributes ( t, list );
|
||||||
pango_attr_list_unref ( list );
|
pango_attr_list_unref ( list );
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue