diff --git a/include/theme.h b/include/theme.h index 043cf6f8..2c9e95d0 100644 --- a/include/theme.h +++ b/include/theme.h @@ -95,4 +95,5 @@ void rofi_theme_get_color ( const char *wclass, const char *name, const char *s Padding rofi_theme_get_padding ( const char *wclass, const char *name, const char *state, const char *property, Padding pad ); int distance_get_pixel ( Distance d ); +void rofi_theme_convert_old_theme ( void ); #endif diff --git a/lexer/theme-parser.y b/lexer/theme-parser.y index 6b0d1aa0..6ee70032 100644 --- a/lexer/theme-parser.y +++ b/lexer/theme-parser.y @@ -80,7 +80,7 @@ entries: %empty { // There is always a base widget. $$ = rofi_theme = (Widget*)g_malloc0 (sizeof(Widget)); - rofi_theme->name = g_strdup ( "Window" ); + rofi_theme->name = g_strdup ( "Root" ); } | entries optional_properties diff --git a/source/rofi.c b/source/rofi.c index b50411fd..e989ebde 100644 --- a/source/rofi.c +++ b/source/rofi.c @@ -905,8 +905,14 @@ int main ( int argc, char *argv[] ) TICK_N ( "Parse theme" ); rofi_theme_parse_file ( config.theme ); TICK_N ( "Parsed theme" ); + } else { + rofi_theme_convert_old_theme ( ); } + if ( find_arg ( "-dump-theme" ) >= 0 ){ + rofi_theme_print ( rofi_theme ); + exit (EXIT_SUCCESS); + } // Dump. // catch help request if ( find_arg ( "-h" ) >= 0 || find_arg ( "-help" ) >= 0 || find_arg ( "--help" ) >= 0 ) { diff --git a/source/theme.c b/source/theme.c index e8b2d97f..96ce7817 100644 --- a/source/theme.c +++ b/source/theme.c @@ -5,6 +5,7 @@ #include "theme.h" #include "lexer/theme-parser.h" #include "helper.h" +#include "settings.h" #include "widgets/textbox.h" void yyerror ( YYLTYPE *ylloc, const char *); @@ -67,64 +68,105 @@ void rofi_theme_free ( Widget *widget ) */ static void rofi_theme_print_property_index ( int depth, Property *p ) { - printf("%*s %s: ", depth, "", p->name ); + printf("%*s%s: ", depth, "", p->name ); switch ( p->type ) { case P_STRING: - printf("\"%s\"", p->value.s); + printf("\"%s\";", p->value.s); break; case P_INTEGER: - printf("%d", p->value.i); + printf("%d;", p->value.i); break; case P_DOUBLE: - printf("%.2f", p->value.f); + printf("%.2f;", p->value.f); break; case P_BOOLEAN: - printf("%s", p->value.b?"true":"false"); + printf("%s;", p->value.b?"true":"false"); break; case P_COLOR: - printf("#%02X%02X%02X%02X", + printf("#%02X%02X%02X%02X;", (unsigned char)(p->value.color.alpha*255.0), (unsigned char)(p->value.color.red*255.0), (unsigned char)(p->value.color.green*255.0), (unsigned char)(p->value.color.blue*255.0)); break; case P_PADDING: - printf("%f%s %f%s %f%s %f%s", - p->value.padding.left.distance, - p->value.padding.left.type == PW_PX? "px":"em", - p->value.padding.right.distance, - p->value.padding.right.type == PW_PX? "px":"em", - p->value.padding.top.distance, - p->value.padding.top.type == PW_PX? "px":"em", - p->value.padding.bottom.distance, - p->value.padding.bottom.type == PW_PX? "px":"em" - ); + if ( p->value.padding.left.type == PW_PX ) { + printf("%upx ", (int)p->value.padding.left.distance ); + } else { + printf("%fem ", p->value.padding.left.distance ); + } + if ( p->value.padding.right.type == PW_PX ) { + printf("%upx ", (int)p->value.padding.right.distance ); + } else { + printf("%fem ", p->value.padding.right.distance ); + } + if ( p->value.padding.top.type == PW_PX ) { + printf("%upx ", (int)p->value.padding.top.distance ); + } else { + printf("%fem ", p->value.padding.top.distance ); + } + if ( p->value.padding.bottom.type == PW_PX ) { + printf("%upx ", (int)p->value.padding.bottom.distance ); + } else { + printf("%fem ", p->value.padding.bottom.distance ); + } + printf(";\n"); } putchar ( '\n' ); } -static void rofi_theme_print_index ( int depth, Widget *widget ) +static void rofi_theme_print_index ( Widget *widget ) { - printf ( "%*sName: %s \n", depth, "", widget->name ); - GHashTableIter iter; gpointer key, value; if ( widget->properties ){ + int index = 0; + GList *list = NULL; + Widget *w = widget; + while ( w){ + if ( g_strcmp0(w->name,"Root") == 0 ) { + break; + } + list = g_list_prepend ( list, w->name ); + w = w->parent; + } + if ( g_list_length ( list ) > 0 ) { + index = 4; + for ( GList *iter = g_list_first ( list ); iter != NULL; iter = g_list_next ( iter ) ) { + char *name = (char *)iter->data; + if ( iter->prev == NULL && name[0] != '@' ){ + putchar ( '#' ); + } + fputs(name, stdout); + if ( name[0] == '@' ) { + putchar(' '); + } else { + if ( iter->next ) { + putchar('.'); + } + } + } + printf(" {\n"); + } g_hash_table_iter_init (&iter, widget->properties); while (g_hash_table_iter_next (&iter, &key, &value)) { Property *p = (Property*)value; - rofi_theme_print_property_index ( depth, p ); + rofi_theme_print_property_index ( index, p ); } + if ( g_list_length ( list ) > 0 ) { + printf("}\n"); + } + g_list_free ( list ); } for ( unsigned int i = 0; i < widget->num_widgets;i++){ - rofi_theme_print_index ( depth+2, widget->widgets[i] ); + rofi_theme_print_index ( widget->widgets[i] ); } } void rofi_theme_print ( Widget *widget ) { - rofi_theme_print_index ( 0, widget); + rofi_theme_print_index ( widget ); } int yyparse(); @@ -332,3 +374,141 @@ int distance_get_pixel ( Distance d ) } return d.distance; } + +static Property* rofi_theme_convert_get_color ( const char *color, const char *name ) +{ + Color c = color_get ( color ); + Property *p = rofi_theme_property_create ( P_COLOR ); + p->name = g_strdup(name); + p->value.color.alpha = c.alpha; + p->value.color.red = c.red; + p->value.color.green = c.green; + p->value.color.blue = c.blue; + + return p; +} +static GHashTable * rofi_theme_convert_create_property_ht ( void ) +{ + return g_hash_table_new_full ( g_str_hash, g_str_equal, NULL, (GDestroyNotify)rofi_theme_property_free ); +} + +void rofi_theme_convert_old_theme ( void ) +{ + if ( rofi_theme != NULL ){ + return; + } + rofi_theme = (Widget*)g_malloc0 ( sizeof ( Widget ) ); + rofi_theme->name = g_strdup ( "Root" ); + rofi_theme->properties = rofi_theme_convert_create_property_ht ( ); + { + gchar **vals = g_strsplit ( config.color_window, ",", 3 ); + if ( vals != NULL ){ + if ( vals[0] != NULL ) { + Property *p = rofi_theme_convert_get_color ( vals[0], "background" ); + g_hash_table_replace ( rofi_theme->properties, p->name, p ); + p = rofi_theme_property_create ( P_INTEGER ); + p->name = g_strdup("padding"); + p->value.i = config.padding; + g_hash_table_replace ( rofi_theme->properties, p->name, p ); + + if ( vals[1] != NULL ) { + p = rofi_theme_convert_get_color ( vals[1], "foreground" ); + g_hash_table_replace ( rofi_theme->properties, p->name, p ); + + if ( vals[2] != NULL ) { + Widget *widget = rofi_theme_find_or_create_class ( rofi_theme , "@separator" ); + widget->properties = rofi_theme_convert_create_property_ht (); + p = rofi_theme_convert_get_color ( vals[1], "foreground" ); + g_hash_table_replace ( widget->properties, p->name, p ); + } + } + + } + } + g_strfreev ( vals ); + { + Property *p = NULL; + Widget *widget = rofi_theme_find_or_create_class ( rofi_theme , "@textbox" ); + + Widget *wnormal = rofi_theme_find_or_create_class ( widget, "normal" ); + Widget *wselected = rofi_theme_find_or_create_class ( widget, "selected" ); + Widget *walternate = rofi_theme_find_or_create_class ( widget, "alternate" ); + + + gchar **vals = g_strsplit ( config.color_normal, ",", 5 ); + if ( g_strv_length (vals) == 5 ) { + Widget *wnn = rofi_theme_find_or_create_class ( wnormal, "normal" ); + wnn->properties = rofi_theme_convert_create_property_ht (); + p = rofi_theme_convert_get_color ( vals[0], "background" ); + g_hash_table_replace ( wnn->properties, p->name, p ); + p = rofi_theme_convert_get_color ( vals[1], "foreground" ); + g_hash_table_replace ( wnn->properties, p->name, p ); + + Widget *wsl = rofi_theme_find_or_create_class ( wselected, "normal" ); + wsl->properties = rofi_theme_convert_create_property_ht (); + p = rofi_theme_convert_get_color ( vals[3], "background" ); + g_hash_table_replace ( wsl->properties, p->name, p ); + p = rofi_theme_convert_get_color ( vals[4], "foreground" ); + g_hash_table_replace ( wsl->properties, p->name, p ); + + Widget *wal = rofi_theme_find_or_create_class ( walternate, "normal" ); + wal->properties = rofi_theme_convert_create_property_ht (); + p = rofi_theme_convert_get_color ( vals[2], "background" ); + g_hash_table_replace ( wal->properties, p->name, p ); + p = rofi_theme_convert_get_color ( vals[1], "foreground" ); + g_hash_table_replace ( wal->properties, p->name, p ); + } + g_strfreev ( vals ); + + vals = g_strsplit ( config.color_urgent, ",", 5 ); + if ( g_strv_length (vals) == 5 ) { + Widget *wnn = rofi_theme_find_or_create_class ( wnormal, "urgent" ); + wnn->properties = rofi_theme_convert_create_property_ht (); + p = rofi_theme_convert_get_color ( vals[0], "background" ); + g_hash_table_replace ( wnn->properties, p->name, p ); + p = rofi_theme_convert_get_color ( vals[1], "foreground" ); + g_hash_table_replace ( wnn->properties, p->name, p ); + + Widget *wsl = rofi_theme_find_or_create_class ( wselected, "urgent" ); + wsl->properties = rofi_theme_convert_create_property_ht (); + p = rofi_theme_convert_get_color ( vals[3], "background" ); + g_hash_table_replace ( wsl->properties, p->name, p ); + p = rofi_theme_convert_get_color ( vals[4], "foreground" ); + g_hash_table_replace ( wsl->properties, p->name, p ); + + Widget *wal = rofi_theme_find_or_create_class ( walternate, "urgent" ); + wal->properties = rofi_theme_convert_create_property_ht (); + p = rofi_theme_convert_get_color ( vals[2], "background" ); + g_hash_table_replace ( wal->properties, p->name, p ); + p = rofi_theme_convert_get_color ( vals[1], "foreground" ); + g_hash_table_replace ( wal->properties, p->name, p ); + } + g_strfreev ( vals ); + + vals = g_strsplit ( config.color_active, ",", 5 ); + if ( g_strv_length (vals) == 5 ) { + Widget *wnn = rofi_theme_find_or_create_class ( wnormal, "active" ); + wnn->properties = rofi_theme_convert_create_property_ht (); + p = rofi_theme_convert_get_color ( vals[0], "background" ); + g_hash_table_replace ( wnn->properties, p->name, p ); + p = rofi_theme_convert_get_color ( vals[1], "foreground" ); + g_hash_table_replace ( wnn->properties, p->name, p ); + + Widget *wsl = rofi_theme_find_or_create_class ( wselected, "active" ); + wsl->properties = rofi_theme_convert_create_property_ht (); + p = rofi_theme_convert_get_color ( vals[3], "background" ); + g_hash_table_replace ( wsl->properties, p->name, p ); + p = rofi_theme_convert_get_color ( vals[4], "foreground" ); + g_hash_table_replace ( wsl->properties, p->name, p ); + + Widget *wal = rofi_theme_find_or_create_class ( walternate, "active" ); + wal->properties = rofi_theme_convert_create_property_ht (); + p = rofi_theme_convert_get_color ( vals[2], "background" ); + g_hash_table_replace ( wal->properties, p->name, p ); + p = rofi_theme_convert_get_color ( vals[1], "foreground" ); + g_hash_table_replace ( wal->properties, p->name, p ); + } + g_strfreev ( vals ); + } + } +}