mirror of
https://github.com/davatorium/rofi.git
synced 2024-11-18 13:54:36 -05:00
Support converting old theme internally, add first option to dump theme
This commit is contained in:
parent
05871703d5
commit
d35e70d817
4 changed files with 210 additions and 23 deletions
|
@ -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 );
|
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 );
|
int distance_get_pixel ( Distance d );
|
||||||
|
void rofi_theme_convert_old_theme ( void );
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -80,7 +80,7 @@ entries:
|
||||||
%empty {
|
%empty {
|
||||||
// There is always a base widget.
|
// There is always a base widget.
|
||||||
$$ = rofi_theme = (Widget*)g_malloc0 (sizeof(Widget));
|
$$ = rofi_theme = (Widget*)g_malloc0 (sizeof(Widget));
|
||||||
rofi_theme->name = g_strdup ( "Window" );
|
rofi_theme->name = g_strdup ( "Root" );
|
||||||
}
|
}
|
||||||
| entries
|
| entries
|
||||||
optional_properties
|
optional_properties
|
||||||
|
|
|
@ -905,8 +905,14 @@ int main ( int argc, char *argv[] )
|
||||||
TICK_N ( "Parse theme" );
|
TICK_N ( "Parse theme" );
|
||||||
rofi_theme_parse_file ( config.theme );
|
rofi_theme_parse_file ( config.theme );
|
||||||
TICK_N ( "Parsed 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.
|
// Dump.
|
||||||
// catch help request
|
// catch help request
|
||||||
if ( find_arg ( "-h" ) >= 0 || find_arg ( "-help" ) >= 0 || find_arg ( "--help" ) >= 0 ) {
|
if ( find_arg ( "-h" ) >= 0 || find_arg ( "-help" ) >= 0 || find_arg ( "--help" ) >= 0 ) {
|
||||||
|
|
224
source/theme.c
224
source/theme.c
|
@ -5,6 +5,7 @@
|
||||||
#include "theme.h"
|
#include "theme.h"
|
||||||
#include "lexer/theme-parser.h"
|
#include "lexer/theme-parser.h"
|
||||||
#include "helper.h"
|
#include "helper.h"
|
||||||
|
#include "settings.h"
|
||||||
#include "widgets/textbox.h"
|
#include "widgets/textbox.h"
|
||||||
|
|
||||||
void yyerror ( YYLTYPE *ylloc, const char *);
|
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 )
|
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 )
|
switch ( p->type )
|
||||||
{
|
{
|
||||||
case P_STRING:
|
case P_STRING:
|
||||||
printf("\"%s\"", p->value.s);
|
printf("\"%s\";", p->value.s);
|
||||||
break;
|
break;
|
||||||
case P_INTEGER:
|
case P_INTEGER:
|
||||||
printf("%d", p->value.i);
|
printf("%d;", p->value.i);
|
||||||
break;
|
break;
|
||||||
case P_DOUBLE:
|
case P_DOUBLE:
|
||||||
printf("%.2f", p->value.f);
|
printf("%.2f;", p->value.f);
|
||||||
break;
|
break;
|
||||||
case P_BOOLEAN:
|
case P_BOOLEAN:
|
||||||
printf("%s", p->value.b?"true":"false");
|
printf("%s;", p->value.b?"true":"false");
|
||||||
break;
|
break;
|
||||||
case P_COLOR:
|
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.alpha*255.0),
|
||||||
(unsigned char)(p->value.color.red*255.0),
|
(unsigned char)(p->value.color.red*255.0),
|
||||||
(unsigned char)(p->value.color.green*255.0),
|
(unsigned char)(p->value.color.green*255.0),
|
||||||
(unsigned char)(p->value.color.blue*255.0));
|
(unsigned char)(p->value.color.blue*255.0));
|
||||||
break;
|
break;
|
||||||
case P_PADDING:
|
case P_PADDING:
|
||||||
printf("%f%s %f%s %f%s %f%s",
|
if ( p->value.padding.left.type == PW_PX ) {
|
||||||
p->value.padding.left.distance,
|
printf("%upx ", (int)p->value.padding.left.distance );
|
||||||
p->value.padding.left.type == PW_PX? "px":"em",
|
} else {
|
||||||
p->value.padding.right.distance,
|
printf("%fem ", p->value.padding.left.distance );
|
||||||
p->value.padding.right.type == PW_PX? "px":"em",
|
}
|
||||||
p->value.padding.top.distance,
|
if ( p->value.padding.right.type == PW_PX ) {
|
||||||
p->value.padding.top.type == PW_PX? "px":"em",
|
printf("%upx ", (int)p->value.padding.right.distance );
|
||||||
p->value.padding.bottom.distance,
|
} else {
|
||||||
p->value.padding.bottom.type == PW_PX? "px":"em"
|
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' );
|
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;
|
GHashTableIter iter;
|
||||||
gpointer key, value;
|
gpointer key, value;
|
||||||
if ( widget->properties ){
|
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);
|
g_hash_table_iter_init (&iter, widget->properties);
|
||||||
while (g_hash_table_iter_next (&iter, &key, &value))
|
while (g_hash_table_iter_next (&iter, &key, &value))
|
||||||
{
|
{
|
||||||
Property *p = (Property*)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++){
|
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 )
|
void rofi_theme_print ( Widget *widget )
|
||||||
{
|
{
|
||||||
rofi_theme_print_index ( 0, widget);
|
rofi_theme_print_index ( widget );
|
||||||
}
|
}
|
||||||
|
|
||||||
int yyparse();
|
int yyparse();
|
||||||
|
@ -332,3 +374,141 @@ int distance_get_pixel ( Distance d )
|
||||||
}
|
}
|
||||||
return d.distance;
|
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 );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue