Add support for multiple selectors. #dummy0, dummy1 {}

This commit is contained in:
Dave Davenport 2017-09-06 23:11:03 +02:00
parent ae452271ac
commit 7c1ecb4707
4 changed files with 60 additions and 12 deletions

View file

@ -86,6 +86,12 @@ Property *rofi_theme_property_create ( PropertyType type );
*/ */
void rofi_theme_property_free ( Property *p ); void rofi_theme_property_free ( Property *p );
/**
* @param p The property to free.
*
* @returns a copy of p
*/
Property* rofi_theme_property_copy ( Property *p);
/** /**
* @param widget * @param widget
* *

View file

@ -394,6 +394,7 @@ if ( queue == NULL ){
} }
<NAMESTR>\.|{WHITESPACE} { return T_NSEP; } <NAMESTR>\.|{WHITESPACE} { return T_NSEP; }
<NAMESTR>,{WHITESPACE}* { return T_SSEP; }
<SECTION>{WORD} { yylval->sval = g_strdup(yytext); return T_PROP_NAME;} <SECTION>{WORD} { yylval->sval = g_strdup(yytext); return T_PROP_NAME;}
<NAMESTR>{WORD} { yylval->sval = g_strdup(yytext); return T_NAME_ELEMENT;} <NAMESTR>{WORD} { yylval->sval = g_strdup(yytext); return T_NAME_ELEMENT;}

View file

@ -212,6 +212,7 @@ static ThemeColor hwb_to_rgb ( double h, double w, double b)
%token T_PSEP "property separator (':')" %token T_PSEP "property separator (':')"
%token T_PCLOSE "property close (';')" %token T_PCLOSE "property close (';')"
%token T_NSEP "Name separator (' ' or '.')" %token T_NSEP "Name separator (' ' or '.')"
%token T_SSEP "Selector separator (',')"
%token T_NAME_PREFIX "Element section ('# {name} { ... }')" %token T_NAME_PREFIX "Element section ('# {name} { ... }')"
%token T_WHITESPACE "White space" %token T_WHITESPACE "White space"
%token T_PDEFAULTS "Default settings section ( '* { ... }')" %token T_PDEFAULTS "Default settings section ( '* { ... }')"
@ -224,6 +225,7 @@ static ThemeColor hwb_to_rgb ( double h, double w, double b)
%type <sval> t_entry %type <sval> t_entry
%type <theme> t_entry_list %type <theme> t_entry_list
%type <list> t_entry_name_path %type <list> t_entry_name_path
%type <list> t_entry_name_path_selectors
%type <property> t_property %type <property> t_property
%type <property_list> t_property_list %type <property_list> t_property_list
%type <property_list> t_property_list_optional %type <property_list> t_property_list_optional
@ -263,20 +265,29 @@ t_entry_list:
; ;
t_entry: t_entry:
T_NAME_PREFIX t_entry_name_path T_BOPEN t_property_list_optional T_BCLOSE T_NAME_PREFIX t_entry_name_path_selectors T_BOPEN t_property_list_optional T_BCLOSE
{ {
for ( GList *liter = g_list_first ( $2); liter; liter = g_list_next ( liter ) ) {
ThemeWidget *widget = rofi_theme; ThemeWidget *widget = rofi_theme;
for ( GList *iter = g_list_first ( $2 ); iter ; iter = g_list_next ( iter ) ) { for ( GList *iter = g_list_first ( (GList*)liter->data ); iter ; iter = g_list_next ( iter ) ) {
widget = rofi_theme_find_or_create_name ( widget, iter->data ); widget = rofi_theme_find_or_create_name ( widget, iter->data );
} }
g_list_foreach ( $2, (GFunc)g_free , NULL ); g_list_foreach ( (GList*)liter->data, (GFunc)g_free , NULL );
g_list_free ( $2 ); g_list_free ( (GList*)liter->data );
widget->set = TRUE; widget->set = TRUE;
rofi_theme_widget_add_properties ( widget, $4); rofi_theme_widget_add_properties ( widget, $4);
}
if ( $4 ) {
g_hash_table_destroy ( $4 );
}
g_list_free ( $2 );
} }
| |
T_PDEFAULTS T_BOPEN t_property_list_optional T_BCLOSE { T_PDEFAULTS T_BOPEN t_property_list_optional T_BCLOSE {
rofi_theme_widget_add_properties ( rofi_theme, $3); rofi_theme_widget_add_properties ( rofi_theme, $3);
if ( $3 ) {
g_hash_table_destroy ( $3 );
}
} }
| T_CONFIGURATION T_BOPEN t_config_property_list_optional T_BCLOSE { | T_CONFIGURATION T_BOPEN t_config_property_list_optional T_BCLOSE {
// Dummy at this point. // Dummy at this point.
@ -327,7 +338,7 @@ t_property
: t_property_name T_PSEP T_INHERIT T_PCLOSE { : t_property_name T_PSEP T_INHERIT T_PCLOSE {
$$ = rofi_theme_property_create ( P_INHERIT ); $$ = rofi_theme_property_create ( P_INHERIT );
$$->name = $1; $$->name = $1;
} }
| t_property_name T_PSEP T_INT T_PCLOSE { | t_property_name T_PSEP T_INT T_PCLOSE {
$$ = rofi_theme_property_create ( P_INTEGER ); $$ = rofi_theme_property_create ( P_INTEGER );
$$->name = $1; $$->name = $1;
@ -617,6 +628,16 @@ t_property_name
: T_PROP_NAME { $$ = $1; } : T_PROP_NAME { $$ = $1; }
; ;
t_entry_name_path_selectors:
t_entry_name_path { $$ = g_list_append ( NULL, $1 ); }
| t_entry_name_path_selectors T_SSEP t_entry_name_path {
$$ = g_list_append ( $1, $3);
}
| t_entry_name_path_selectors T_SSEP {
$$ = $1;
}
;
t_entry_name_path: t_entry_name_path:
T_NAME_ELEMENT { $$ = g_list_append ( NULL, $1 );} T_NAME_ELEMENT { $$ = g_list_append ( NULL, $1 );}
| t_entry_name_path T_NSEP T_NAME_ELEMENT { $$ = g_list_append ( $1, $3);} | t_entry_name_path T_NSEP T_NAME_ELEMENT { $$ = g_list_append ( $1, $3);}

View file

@ -74,6 +74,28 @@ Property *rofi_theme_property_create ( PropertyType type )
retv->type = type; retv->type = type;
return retv; return retv;
} }
Property* rofi_theme_property_copy ( Property *p)
{
Property *retv = rofi_theme_property_create ( p->type );
retv->name = g_strdup ( p->name );
switch ( p->type ) {
case P_STRING:
retv->value.s = g_strdup ( p->value.s );
break;
case P_LIST:
retv->value.list = g_list_copy_deep ( p->value.list, (GCopyFunc)g_strdup, NULL );
break;
case P_LINK:
retv->value.link.name = g_strdup ( p->value.link.name );
retv->value.link.ref = NULL;
break;
default:
retv->value = p->value;
}
return retv;
}
void rofi_theme_property_free ( Property *p ) void rofi_theme_property_free ( Property *p )
{ {
if ( p == NULL ) { if ( p == NULL ) {
@ -332,11 +354,11 @@ void yyerror ( YYLTYPE *yylloc, const char *what, const char* s )
rofi_add_error_message ( str ); rofi_add_error_message ( str );
} }
static gboolean rofi_theme_steal_property_int ( gpointer key, gpointer value, gpointer user_data ) static void rofi_theme_copy_property_int ( gpointer key, gpointer value, gpointer user_data )
{ {
GHashTable *table = (GHashTable *) user_data; GHashTable *table = (GHashTable *) user_data;
g_hash_table_replace ( table, key, value ); Property *p = rofi_theme_property_copy( (Property*) value);
return TRUE; g_hash_table_replace ( table, p->name, p );
} }
void rofi_theme_widget_add_properties ( ThemeWidget *widget, GHashTable *table ) void rofi_theme_widget_add_properties ( ThemeWidget *widget, GHashTable *table )
{ {
@ -344,11 +366,9 @@ void rofi_theme_widget_add_properties ( ThemeWidget *widget, GHashTable *table )
return; return;
} }
if ( widget->properties == NULL ) { if ( widget->properties == NULL ) {
widget->properties = table; widget->properties = g_hash_table_new_full ( g_str_hash, g_str_equal, NULL, (GDestroyNotify)rofi_theme_property_free );
return;
} }
g_hash_table_foreach_steal ( table, rofi_theme_steal_property_int, widget->properties ); g_hash_table_foreach ( table, rofi_theme_copy_property_int, widget->properties );
g_hash_table_destroy ( table );
} }
/** /**