summaryrefslogtreecommitdiffstats
path: root/lexer/theme-parser.y
diff options
context:
space:
mode:
authorDave Davenport <DaveDavenport@users.noreply.github.com>2019-09-20 15:05:36 +0200
committerGitHub <noreply@github.com>2019-09-20 15:05:36 +0200
commit7c613f6a4ca4354165e2cab987d0db1e7ce32c5a (patch)
tree7cede72023c550462342a9eb13123580a6e5ddaa /lexer/theme-parser.y
parentf28cf0207e7641890617e8b946977dc204e05ce2 (diff)
Issue893: Add support for @media in the theme format. (#1015)
* [Lexer] Add support for @media. Issue: #893 * [Theme] @media limit to px. * [Theme@Media] add *{} support. * [Theme@Media] Add support for monitor-id media. * [Theme@Media] Code cleanup. * [Theme@Media] Add min/max-aspect-ratio. * [Theme@Media] Remove some debug output Fixes: #893
Diffstat (limited to 'lexer/theme-parser.y')
-rw-r--r--lexer/theme-parser.y102
1 files changed, 101 insertions, 1 deletions
diff --git a/lexer/theme-parser.y b/lexer/theme-parser.y
index 23b0a5dc..c85a5bbe 100644
--- a/lexer/theme-parser.y
+++ b/lexer/theme-parser.y
@@ -172,6 +172,8 @@ static ThemeColor hwb_to_rgb ( double h, double w, double b)
%token T_POS_NORTH "North"
%token T_POS_SOUTH "South"
+%token T_MEDIA "@media"
+
%token T_NONE "None"
%token T_BOLD "Bold"
%token T_ITALIC "Italic"
@@ -223,8 +225,17 @@ static ThemeColor hwb_to_rgb ( double h, double w, double b)
%token T_INHERIT "Inherit"
+%token T_MEDIA_WIDTH "Width"
+%token T_MEDIA_HEIGHT "Height"
+
+%token T_MEDIA_MIN "Min"
+%token T_MEDIA_MONITOR_ID "Monitor-ID"
+%token T_MEDIA_MAX "Max"
+%token T_MEDIA_SEP "-"
+
%type <sval> t_entry
%type <theme> t_entry_list
+%type <theme> t_media_entry_list
%type <list> t_entry_name_path
%type <list> t_entry_name_path_selectors
%type <property> t_property
@@ -280,6 +291,56 @@ t_entry_list:
}
;
+t_media_entry_list:
+t_name_prefix_optional t_entry_name_path_selectors T_BOPEN t_property_list_optional T_BCLOSE {
+ ThemeWidget *widget = $$ = g_slice_new0 ( ThemeWidget );
+ for ( GList *liter = g_list_first ( $2); liter; liter = g_list_next ( liter ) ) {
+ for ( GList *iter = g_list_first ( (GList*)liter->data ); widget && iter ; iter = g_list_next ( iter ) ) {
+ widget = rofi_theme_find_or_create_name ( widget, iter->data );
+ }
+ g_list_free_full ( (GList*)liter->data, g_free );
+ widget->set = TRUE;
+ 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 {
+ ThemeWidget *widget = $$ = g_slice_new0( ThemeWidget ) ;
+ widget = rofi_theme_find_or_create_name ( widget, "*" );
+ widget->set = TRUE;
+ rofi_theme_widget_add_properties ( widget, $3);
+ if ( $3 ) {
+ g_hash_table_destroy ( $3 );
+ }
+}
+| t_media_entry_list T_PDEFAULTS T_BOPEN t_property_list_optional T_BCLOSE {
+ ThemeWidget *widget = $$ = $1 ;
+ widget = rofi_theme_find_or_create_name ( widget, "*" );
+ widget->set = TRUE;
+ rofi_theme_widget_add_properties ( widget, $4);
+ if ( $4 ) {
+ g_hash_table_destroy ( $4 );
+ }
+}
+| t_media_entry_list t_name_prefix_optional t_entry_name_path_selectors T_BOPEN t_property_list_optional T_BCLOSE {
+ ThemeWidget *widget = $$ = $1 ;
+ for ( GList *liter = g_list_first ( $3); liter; liter = g_list_next ( liter ) ) {
+ for ( GList *iter = g_list_first ( (GList*)liter->data ); widget && iter ; iter = g_list_next ( iter ) ) {
+ widget = rofi_theme_find_or_create_name ( widget, iter->data );
+ }
+ g_list_free_full ( (GList*)liter->data, g_free );
+ widget->set = TRUE;
+ rofi_theme_widget_add_properties ( widget, $5);
+ }
+ if ( $5 ) {
+ g_hash_table_destroy ( $5 );
+ }
+ g_list_free ( $3 );
+};
+
/**
* Small dummy object to make the prefix optional.
*/
@@ -293,7 +354,7 @@ t_name_prefix_optional t_entry_name_path_selectors T_BOPEN t_property_list_optio
{
for ( GList *liter = g_list_first ( $2); liter; liter = g_list_next ( liter ) ) {
ThemeWidget *widget = rofi_theme;
- for ( GList *iter = g_list_first ( (GList*)liter->data ); iter ; iter = g_list_next ( iter ) ) {
+ for ( GList *iter = g_list_first ( (GList*)liter->data ); widget && iter ; iter = g_list_next ( iter ) ) {
widget = rofi_theme_find_or_create_name ( widget, iter->data );
}
g_list_free_full ( (GList*)liter->data, g_free );
@@ -312,6 +373,45 @@ t_name_prefix_optional t_entry_name_path_selectors T_BOPEN t_property_list_optio
g_hash_table_destroy ( $3 );
}
}
+| T_MEDIA T_PARENT_LEFT T_STRING T_PSEP T_INT T_PARENT_RIGHT T_BOPEN t_media_entry_list T_BCLOSE {
+ gchar *name = g_strdup_printf("@media ( %s: %d )",$3, $5);
+ ThemeWidget *widget = rofi_theme_find_or_create_name ( rofi_theme, name );
+ widget->set = TRUE;
+ widget->media = g_malloc0(sizeof(ThemeMedia));
+ widget->media->type = rofi_theme_parse_media_type ( $3 );
+ widget->media->value = (double)$5;
+ for ( unsigned int i = 0; i < $8->num_widgets;i++) {
+ ThemeWidget *d = $8->widgets[i];
+ rofi_theme_parse_merge_widgets(widget, d);
+ }
+ g_free ( name );
+}
+| T_MEDIA T_PARENT_LEFT T_STRING T_PSEP T_DOUBLE T_PARENT_RIGHT T_BOPEN t_media_entry_list T_BCLOSE {
+ gchar *name = g_strdup_printf("@media ( %s: %f )",$3, $5);
+ ThemeWidget *widget = rofi_theme_find_or_create_name ( rofi_theme, name );
+ widget->set = TRUE;
+ widget->media = g_malloc0(sizeof(ThemeMedia));
+ widget->media->type = rofi_theme_parse_media_type ( $3 );
+ widget->media->value = $5;
+ for ( unsigned int i = 0; i < $8->num_widgets;i++) {
+ ThemeWidget *d = $8->widgets[i];
+ rofi_theme_parse_merge_widgets(widget, d);
+ }
+ g_free ( name );
+}
+| T_MEDIA T_PARENT_LEFT T_STRING T_PSEP T_INT T_UNIT_PX T_PARENT_RIGHT T_BOPEN t_media_entry_list T_BCLOSE {
+ gchar *name = g_strdup_printf("@media ( %s: %d px )",$3, $5);
+ ThemeWidget *widget = rofi_theme_find_or_create_name ( rofi_theme, name );
+ widget->set = TRUE;
+ widget->media = g_malloc0(sizeof(ThemeMedia));
+ widget->media->type = rofi_theme_parse_media_type ( $3 );
+ widget->media->value = (double)$5;
+ for ( unsigned int i = 0; i < $9->num_widgets;i++) {
+ ThemeWidget *d = $9->widgets[i];
+ rofi_theme_parse_merge_widgets(widget, d);
+ }
+ g_free ( name );
+}
;
t_config_property_list_optional