1
0
Fork 0
mirror of https://github.com/davatorium/rofi.git synced 2024-11-18 13:54:36 -05:00

Merge List and Array type into one. (#1572)

* Merge list and array into one.

* [Lexer] Only use string without " in list

* Some cleanups

* Cleanups based on feedback.
This commit is contained in:
Dave Davenport 2022-01-25 09:57:59 +01:00 committed by GitHub
parent 6e3feee179
commit 85c6545a43
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
14 changed files with 154 additions and 178 deletions

View file

@ -319,6 +319,8 @@ a cursor
.IP \(bu 2 .IP \(bu 2
a list of keywords a list of keywords
.IP \(bu 2 .IP \(bu 2
an array of values
.IP \(bu 2
an environment variable an environment variable
.IP \(bu 2 .IP \(bu 2
Inherit Inherit
@ -866,6 +868,16 @@ Format: \fB\fC[ keyword, keyword ]\fR
A list starts with a '[' and ends with a ']'. The entries in the list are comma\-separated. A list starts with a '[' and ends with a ']'. The entries in the list are comma\-separated.
The \fB\fCkeyword\fR in the list refers to an widget name. The \fB\fCkeyword\fR in the list refers to an widget name.
.SH List of values
.RS
.IP \(bu 2
Format: \fB\fC[ value, value, ... ]\fR
.RE
.PP
An list starts with a '[' and ends with a ']'. The entries in the list are comma\-separated.
.SH Environment variable .SH Environment variable
.RS .RS
.IP \(bu 2 .IP \(bu 2
@ -1251,6 +1263,11 @@ This option is only available on the \fB\fCelement\-text\fR widget.
\fBblink\fP: Enable/Disable blinking on an input textbox (Boolean). \fBblink\fP: Enable/Disable blinking on an input textbox (Boolean).
.IP \(bu 2 .IP \(bu 2
\fBmarkup\fP: Force markup on, beware that only valid pango markup strings are shown. \fBmarkup\fP: Force markup on, beware that only valid pango markup strings are shown.
.IP \(bu 2
\fBtab\-stops\fP: array of distances
Set the location of tab stops by their distance from the beginning of the line.
Each distance should be greater than the previous one.
The text appears to the right of the tab stop position (other alignments are not supported yet).
.RE .RE

View file

@ -535,12 +535,11 @@ Specify the type of mouse cursor that is set when the mouse pointer is over the
A list starts with a '[' and ends with a ']'. The entries in the list are comma-separated. A list starts with a '[' and ends with a ']'. The entries in the list are comma-separated.
The `keyword` in the list refers to an widget name. The `keyword` in the list refers to an widget name.
## Array of values ## List of values
* Format: `{ value, value, ... }` * Format: `[ value, value, ... ]`
An array starts with a '{' and ends with a '}'. The entries in the array are comma-separated. An list starts with a '[' and ends with a ']'. The entries in the list are comma-separated.
Currently, only the integer and distance types are supported as array values.
## Environment variable ## Environment variable

View file

@ -920,6 +920,35 @@ rofi \-show combi \-combi\-modi "window,run,ssh" \-modi combi
\fBNOTE\fP: The i3 window manager dislikes commas in the command when specifying an exec command. \fBNOTE\fP: The i3 window manager dislikes commas in the command when specifying an exec command.
For that case, \fB\fC#\fR can be used as a separator. For that case, \fB\fC#\fR can be used as a separator.
.PP
\fB\fC\-combi\-display\-format\fR
.PP
The format string for entries in the \fB\fCcombi\fR dialog:
.RS
.IP \(bu 2
\fBmode\fP: the mode display name
.IP \(bu 2
\fBtext\fP: the entry text
.RE
.PP
Pango markup can be used to formatting the output.
.PP
.RS
.nf
Default: {mode} {text}
.fi
.RE
.PP
Note: This setting is ignored if \fB\fCcombi\-hide\-mode\-prefix\fR is eanbled.
.SS History and Sorting .SS History and Sorting
.PP .PP
\fB\fC\-disable\-history\fR \fB\fC\-disable\-history\fR

View file

@ -32,8 +32,6 @@ typedef enum {
P_HIGHLIGHT, P_HIGHLIGHT,
/** List */ /** List */
P_LIST, P_LIST,
/** Array */
P_ARRAY,
/** Orientation */ /** Orientation */
P_ORIENTATION, P_ORIENTATION,
/** Cursor */ /** Cursor */

View file

@ -392,19 +392,6 @@ ThemeWidget *rofi_config_find_widget(const char *name, const char *state,
Property *rofi_theme_find_property(ThemeWidget *widget, PropertyType type, Property *rofi_theme_find_property(ThemeWidget *widget, PropertyType type,
const char *property, gboolean exact); const char *property, gboolean exact);
/**
* @param widget The widget to query
* @param property The property to query.
* @param defaults The default value.
*
* Obtain list of elements (strings) of the widget.
*
* @returns a GList holding the names in the list of this property for this
* widget.
*/
GList *rofi_theme_get_list(const widget *widget, const char *property,
const char *defaults);
/** /**
* Reset the current theme. * Reset the current theme.
*/ */
@ -471,6 +458,6 @@ void rofi_theme_print_parsed_files(int is_term);
* Returns a list of allocated RofiDistance objects that should be * Returns a list of allocated RofiDistance objects that should be
* freed. * freed.
*/ */
GList *rofi_theme_get_array_distance(const widget *widget, GList *rofi_theme_get_list_distance(const widget *widget, const char *property);
const char *property); GList *rofi_theme_get_list_strings(const widget *widget, const char *property);
#endif #endif

View file

@ -176,6 +176,7 @@ UANYNP {ASCNP}|{U2}{U}|{U3}{U}{U}|{U4}{U}{U}{U}
WHITESPACE [[:blank:]] WHITESPACE [[:blank:]]
WSO [[:blank:]]* WSO [[:blank:]]*
WORD [[:alnum:]-]+ WORD [[:alnum:]-]+
WORD_ELEMENT [[:alpha:]][[:alnum:]-]*
WORD_ENV [[:alpha:]_][[:alnum:]_]* WORD_ENV [[:alpha:]_][[:alnum:]_]*
MEDIA_NAME [[:alpha:]-]+ MEDIA_NAME [[:alpha:]-]+
COLOR_NAME [[:alpha:]]+ COLOR_NAME [[:alpha:]]+
@ -275,9 +276,6 @@ FORWARD_SLASH \/
LIST_OPEN \[ LIST_OPEN \[
LIST_CLOSE \] LIST_CLOSE \]
ARRAY_OPEN \{
ARRAY_CLOSE \}
VAR_START "var" VAR_START "var"
ENV_START "env" ENV_START "env"
@ -299,7 +297,6 @@ CONFIGURATION (?i:configuration)
%x PROPERTIES_VAR %x PROPERTIES_VAR
%x PROPERTIES_ENV_VAR %x PROPERTIES_ENV_VAR
%x PROPERTIES_VAR_DEFAULT %x PROPERTIES_VAR_DEFAULT
%x PROPERTIES_LIST
%x PROPERTIES_ARRAY %x PROPERTIES_ARRAY
%x NAMESTR %x NAMESTR
%x SECTION %x SECTION
@ -496,18 +493,19 @@ if ( queue == NULL ) {
/* Alias color to text-color */ /* Alias color to text-color */
<SECTION>"color" { yylval->sval = g_strdup("text-color"); return T_PROP_NAME;} <SECTION>"color" { yylval->sval = g_strdup("text-color"); return T_PROP_NAME;}
<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_ELEMENT} { yylval->sval = g_strdup(yytext); return T_NAME_ELEMENT;}
/* After Namestr/Classstr we want to go to state str, then to { */ /* After Namestr/Classstr we want to go to state str, then to { */
<INITIAL,SECTION>{WHITESPACE}+ ; // ignore all whitespace <INITIAL,SECTION>{WHITESPACE}+ ; // ignore all whitespace
<PROPERTIES,PROPERTIES_ENV,PROPERTIES_VAR_DEFAULT,PROPERTIES_LIST,PROPERTIES_ARRAY,PROPERTIES_ENV_VAR,PROPERTIES_VAR,MEDIA_CONTENT>{WHITESPACE}+ ; // ignore all whitespace <PROPERTIES,PROPERTIES_ENV,PROPERTIES_VAR_DEFAULT,PROPERTIES_ARRAY,PROPERTIES_ENV_VAR,PROPERTIES_VAR,MEDIA_CONTENT>{WHITESPACE}+ ; // ignore all whitespace
<SECTION>":" { g_queue_push_head ( queue, GINT_TO_POINTER (YY_START) ); BEGIN(PROPERTIES); return T_PSEP; } <SECTION>":" { g_queue_push_head ( queue, GINT_TO_POINTER (YY_START) ); BEGIN(PROPERTIES); return T_PSEP; }
<PROPERTIES>";" { BEGIN(GPOINTER_TO_INT ( g_queue_pop_head ( queue ))); return T_PCLOSE;} <PROPERTIES>";" { BEGIN(GPOINTER_TO_INT ( g_queue_pop_head ( queue ))); return T_PCLOSE;}
<PROPERTIES,PROPERTIES_ARRAY,PROPERTIES_ENV,PROPERTIES_VAR_DEFAULT>(true|false) { yylval->bval= g_strcmp0(yytext, "true") == 0; return T_BOOLEAN;} <PROPERTIES,PROPERTIES_ARRAY,PROPERTIES_ENV,PROPERTIES_VAR_DEFAULT>(true|false) { yylval->bval= g_strcmp0(yytext, "true") == 0; return T_BOOLEAN;}
<PROPERTIES,PROPERTIES_ARRAY,PROPERTIES_ENV,PROPERTIES_VAR_DEFAULT,MEDIA_CONTENT>{PNNUMBER}\.{NUMBER}+ { yylval->fval = g_ascii_strtod(yytext, NULL); return T_DOUBLE;} <PROPERTIES,PROPERTIES_ARRAY,PROPERTIES_ENV,PROPERTIES_VAR_DEFAULT,MEDIA_CONTENT>{PNNUMBER}\.{NUMBER}+ { yylval->fval = g_ascii_strtod(yytext, NULL); return T_DOUBLE;}
<PROPERTIES,PROPERTIES_ARRAY,PROPERTIES_ENV,PROPERTIES_VAR_DEFAULT,MEDIA_CONTENT>{PNNUMBER} { yylval->ival = (int)g_ascii_strtoll(yytext, NULL, 10); return T_INT;} <PROPERTIES,PROPERTIES_ARRAY,PROPERTIES_ENV,PROPERTIES_VAR_DEFAULT,MEDIA_CONTENT>{PNNUMBER} { yylval->ival = (int)g_ascii_strtoll(yytext, NULL, 10); return T_INT;}
<PROPERTIES,PROPERTIES_ARRAY,PROPERTIES_ENV,PROPERTIES_VAR_DEFAULT>{STRING} { yytext[yyleng-1] = '\0'; yylval->sval = g_strcompress(&yytext[1]); return T_STRING;} <PROPERTIES,PROPERTIES_ENV,PROPERTIES_VAR_DEFAULT>{STRING} { yytext[yyleng-1] = '\0'; yylval->sval = g_strcompress(&yytext[1]); return T_STRING;}
<PROPERTIES_ARRAY>{STRING_LIST} { yytext[yyleng-1] = '\0'; yylval->sval = g_strcompress(&yytext[1]); return T_STRING;}
<PROPERTIES,PROPERTIES_ARRAY,PROPERTIES_ENV,PROPERTIES_VAR_DEFAULT>{CHAR} { yytext[yyleng-1] = '\0'; yylval->cval = g_strcompress(&yytext[1])[0]; return T_CHAR;} <PROPERTIES,PROPERTIES_ARRAY,PROPERTIES_ENV,PROPERTIES_VAR_DEFAULT>{CHAR} { yytext[yyleng-1] = '\0'; yylval->cval = g_strcompress(&yytext[1])[0]; return T_CHAR;}
<PROPERTIES,PROPERTIES_ARRAY,PROPERTIES_ENV,PROPERTIES_VAR_DEFAULT>@{WORD} { <PROPERTIES,PROPERTIES_ARRAY,PROPERTIES_ENV,PROPERTIES_VAR_DEFAULT>@{WORD} {
@ -674,25 +672,16 @@ if ( queue == NULL ) {
} }
<PROPERTIES,PROPERTIES_ENV,PROPERTIES_VAR_DEFAULT>{S_T_PARENT_LEFT} { return T_PARENT_LEFT; } <PROPERTIES,PROPERTIES_ENV,PROPERTIES_VAR_DEFAULT>{S_T_PARENT_LEFT} { return T_PARENT_LEFT; }
<PROPERTIES,PROPERTIES_ENV,PROPERTIES_VAR_DEFAULT>{S_T_PARENT_RIGHT} { return T_PARENT_RIGHT; } <PROPERTIES,PROPERTIES_ENV,PROPERTIES_VAR_DEFAULT>{S_T_PARENT_RIGHT} { return T_PARENT_RIGHT; }
<PROPERTIES,PROPERTIES_ARRAY,PROPERTIES_ENV,PROPERTIES_VAR_DEFAULT,PROPERTIES_LIST>{COMMA} { return T_COMMA; } <PROPERTIES,PROPERTIES_ARRAY,PROPERTIES_ENV,PROPERTIES_VAR_DEFAULT>{COMMA} { return T_COMMA; }
<PROPERTIES,PROPERTIES_ENV,PROPERTIES_VAR_DEFAULT>{LIST_OPEN} { <PROPERTIES,PROPERTIES_ENV,PROPERTIES_VAR_DEFAULT>{LIST_OPEN} {
g_queue_push_head ( queue, GINT_TO_POINTER (YY_START) ); g_queue_push_head ( queue, GINT_TO_POINTER (YY_START) );
BEGIN(PROPERTIES_LIST); BEGIN(PROPERTIES_ARRAY);
return T_LIST_OPEN; return T_LIST_OPEN;
} }
<PROPERTIES_LIST>{LIST_CLOSE} { <PROPERTIES_ARRAY>{LIST_CLOSE} {
BEGIN(GPOINTER_TO_INT(g_queue_pop_head ( queue ))); BEGIN(GPOINTER_TO_INT(g_queue_pop_head ( queue )));
return T_LIST_CLOSE; return T_LIST_CLOSE;
} }
<PROPERTIES,PROPERTIES_ENV,PROPERTIES_VAR_DEFAULT>{ARRAY_OPEN} {
g_queue_push_head ( queue, GINT_TO_POINTER (YY_START) );
BEGIN(PROPERTIES_ARRAY);
return T_ARRAY_OPEN;
}
<PROPERTIES_ARRAY>{ARRAY_CLOSE} {
BEGIN(GPOINTER_TO_INT(g_queue_pop_head ( queue )));
return T_ARRAY_CLOSE;
}
<PROPERTIES,PROPERTIES_ARRAY,PROPERTIES_ENV,PROPERTIES_VAR_DEFAULT>{FORWARD_SLASH} { return T_FORWARD_SLASH; } <PROPERTIES,PROPERTIES_ARRAY,PROPERTIES_ENV,PROPERTIES_VAR_DEFAULT>{FORWARD_SLASH} { return T_FORWARD_SLASH; }
/* Position */ /* Position */
<PROPERTIES,PROPERTIES_ARRAY,PROPERTIES_ENV,PROPERTIES_VAR_DEFAULT>{CENTER} { return T_POS_CENTER; } <PROPERTIES,PROPERTIES_ARRAY,PROPERTIES_ENV,PROPERTIES_VAR_DEFAULT>{CENTER} { return T_POS_CENTER; }
@ -819,7 +808,7 @@ if ( queue == NULL ) {
* If we just encounter a word, we assume it is a Widget name. * If we just encounter a word, we assume it is a Widget name.
* This makes include,theme, configuration a reserved keyword. * This makes include,theme, configuration a reserved keyword.
*/ */
<INITIAL>{WORD} { <INITIAL>{WORD_ELEMENT} {
g_queue_push_head ( queue, GINT_TO_POINTER (YY_START) ); g_queue_push_head ( queue, GINT_TO_POINTER (YY_START) );
BEGIN(NAMESTR); BEGIN(NAMESTR);
yylval->sval = g_strdup(yytext); yylval->sval = g_strdup(yytext);
@ -834,17 +823,12 @@ if ( queue == NULL ) {
fprintf(stderr,"section found: |%s|\n", yytext); fprintf(stderr,"section found: |%s|\n", yytext);
return T_ERROR_SECTION; return T_ERROR_SECTION;
} }
<PROPERTIES_LIST,PROPERTIES_VAR>{WORD} { <PROPERTIES_ARRAY,PROPERTIES_VAR>{WORD_ELEMENT} {
yylval->sval = g_strdup(yytext); yylval->sval = g_strdup(yytext);
return T_ELEMENT; return T_ELEMENT;
} }
<PROPERTIES_LIST>{STRING_LIST} {
yytext[yyleng-1] = '\0';
yylval->sval = g_strdup(yytext+1);
return T_ELEMENT;
}
<PROPERTIES_ENV_VAR,PROPERTIES_VAR,PROPERTIES_ARRAY,PROPERTIES,PROPERTIES_ENV,PROPERTIES_VAR_DEFAULT,PROPERTIES_LIST>. { <PROPERTIES_ENV_VAR,PROPERTIES_VAR,PROPERTIES_ARRAY,PROPERTIES,PROPERTIES_ENV,PROPERTIES_VAR_DEFAULT>. {
yytext[yyleng-1] = '\0'; yytext[yyleng-1] = '\0';
return T_ERROR_PROPERTY; return T_ERROR_PROPERTY;
} }

View file

@ -231,12 +231,10 @@ static ThemeColor hwb_to_rgb ( double h, double w, double b )
%token T_OPTIONAL_COMMA "Optional comma separator (',')" %token T_OPTIONAL_COMMA "Optional comma separator (',')"
%token T_FORWARD_SLASH "forward slash ('/')" %token T_FORWARD_SLASH "forward slash ('/')"
%token T_PERCENT "Percent sign ('%')" %token T_PERCENT "Percent sign ('%')"
%token T_LIST_OPEN "List open ('[')" %token T_LIST_OPEN "List open ('[')"
%token T_LIST_CLOSE "List close (']')" %token T_LIST_CLOSE "List close (']')"
%token T_ARRAY_OPEN "Set open ('{')"
%token T_ARRAY_CLOSE "Set close ('}')"
%token T_MODIFIER_ADD "Add ('+')" %token T_MODIFIER_ADD "Add ('+')"
%token T_MODIFIER_SUBTRACT "Subtract ('-')" %token T_MODIFIER_SUBTRACT "Subtract ('-')"
%token T_MODIFIER_MULTIPLY "Multiply ('*')" %token T_MODIFIER_MULTIPLY "Multiply ('*')"
@ -308,8 +306,6 @@ static ThemeColor hwb_to_rgb ( double h, double w, double b )
%type <ival> t_property_line_style %type <ival> t_property_line_style
%type <list> t_property_element_list %type <list> t_property_element_list
%type <list> t_property_element_list_optional %type <list> t_property_element_list_optional
%type <list> t_property_element_set
%type <list> t_property_element_set_optional
%type <ival> t_property_orientation %type <ival> t_property_orientation
%type <ival> t_property_cursor %type <ival> t_property_cursor
%type <ival> t_name_prefix_optional %type <ival> t_name_prefix_optional
@ -585,10 +581,6 @@ t_property_element
$$ = rofi_theme_property_create ( P_LIST ); $$ = rofi_theme_property_create ( P_LIST );
$$->value.list = $2; $$->value.list = $2;
} }
| T_ARRAY_OPEN t_property_element_set_optional T_ARRAY_CLOSE {
$$ = rofi_theme_property_create ( P_ARRAY );
$$->value.list = $2;
}
| t_property_orientation { | t_property_orientation {
$$ = rofi_theme_property_create ( P_ORIENTATION ); $$ = rofi_theme_property_create ( P_ORIENTATION );
$$->value.i = $1; $$->value.i = $1;
@ -661,20 +653,18 @@ t_property_element_list_optional
; ;
t_property_element_list t_property_element_list
: T_ELEMENT { $$ = g_list_append ( NULL, $1); }
| t_property_element_list T_COMMA T_ELEMENT {
$$ = g_list_append ( $1, $3 );
}
;
/** List of elements */
t_property_element_set_optional
: %empty { $$ = NULL; }
| t_property_element_set { $$ = $1; }
;
t_property_element_set
: t_property_element { $$ = g_list_append ( NULL, $1); } : t_property_element { $$ = g_list_append ( NULL, $1); }
| t_property_element_set T_COMMA t_property_element { | T_ELEMENT {
Property *p = rofi_theme_property_create ( P_STRING );
p->value.s = $1;
$$ = g_list_append ( NULL, p);
}
| t_property_element_list T_COMMA T_ELEMENT {
Property *p = rofi_theme_property_create ( P_STRING );
p->value.s = $3;
$$ = g_list_append ( $1, p);
}
| t_property_element_list T_COMMA t_property_element {
$$ = g_list_append ( $1, $3 ); $$ = g_list_append ( $1, $3 );
} }
; ;

View file

@ -28,8 +28,6 @@ const char *const PropertyTypeName[P_NUM_TYPES] = {
"Highlight", "Highlight",
/** List */ /** List */
"List", "List",
/** Array */
"Array",
/** Orientation */ /** Orientation */
"Orientation", "Orientation",
/** Cursor */ /** Cursor */

View file

@ -70,11 +70,6 @@ static gboolean distance_compare(RofiDistance d, RofiDistance e) {
d.style == e.style; d.style == e.style;
} }
static gpointer rofi_g_list_strdup(gconstpointer data,
G_GNUC_UNUSED gpointer user_data) {
return g_strdup(data);
}
ThemeWidget *rofi_theme_find_or_create_name(ThemeWidget *base, ThemeWidget *rofi_theme_find_or_create_name(ThemeWidget *base,
const char *name) { const char *name) {
for (unsigned int i = 0; i < base->num_widgets; i++) { for (unsigned int i = 0; i < base->num_widgets; i++) {
@ -134,10 +129,6 @@ Property *rofi_theme_property_copy(const Property *p) {
retv->value.s = g_strdup(p->value.s); retv->value.s = g_strdup(p->value.s);
break; break;
case P_LIST: case P_LIST:
retv->value.list =
g_list_copy_deep(p->value.list, rofi_g_list_strdup, NULL);
break;
case P_ARRAY:
retv->value.list = g_list_copy_deep( retv->value.list = g_list_copy_deep(
p->value.list, (GCopyFunc)rofi_theme_property_copy, NULL); p->value.list, (GCopyFunc)rofi_theme_property_copy, NULL);
break; break;
@ -208,9 +199,6 @@ void rofi_theme_property_free(Property *p) {
if (p->type == P_STRING) { if (p->type == P_STRING) {
g_free(p->value.s); g_free(p->value.s);
} else if (p->type == P_LIST) { } else if (p->type == P_LIST) {
g_list_free_full(p->value.list, g_free);
p->value.list = 0;
} else if (p->type == P_ARRAY) {
g_list_free_full(p->value.list, (GDestroyNotify)rofi_theme_property_free); g_list_free_full(p->value.list, (GDestroyNotify)rofi_theme_property_free);
p->value.list = 0; p->value.list = 0;
} else if (p->type == P_LINK) { } else if (p->type == P_LINK) {
@ -367,23 +355,13 @@ static void int_rofi_theme_print_property(Property *p) {
switch (p->type) { switch (p->type) {
case P_LIST: case P_LIST:
printf("[ "); printf("[ ");
for (GList *iter = p->value.list; iter != NULL; iter = g_list_next(iter)) {
printf("%s", (char *)(iter->data));
if (iter->next != NULL) {
printf(",");
}
}
printf(" ]");
break;
case P_ARRAY:
printf("{ ");
for (GList *iter = p->value.list; iter != NULL; iter = g_list_next(iter)) { for (GList *iter = p->value.list; iter != NULL; iter = g_list_next(iter)) {
int_rofi_theme_print_property((Property *)iter->data); int_rofi_theme_print_property((Property *)iter->data);
if (iter->next != NULL) { if (iter->next != NULL) {
printf(","); printf(",");
} }
} }
printf(" }"); printf(" ]");
break; break;
case P_ORIENTATION: case P_ORIENTATION:
printf("%s", (p->value.i == ROFI_ORIENTATION_HORIZONTAL) ? "horizontal" printf("%s", (p->value.i == ROFI_ORIENTATION_HORIZONTAL) ? "horizontal"
@ -1229,7 +1207,7 @@ RofiPadding rofi_theme_get_padding(const widget *widget, const char *property,
static GList *rofi_theme_get_list_inside(Property *p, const widget *widget, static GList *rofi_theme_get_list_inside(Property *p, const widget *widget,
const char *property, const char *property,
const char *defaults) { PropertyType child_type) {
if (p) { if (p) {
if (p->type == P_INHERIT) { if (p->type == P_INHERIT) {
if (widget->parent) { if (widget->parent) {
@ -1238,55 +1216,20 @@ static GList *rofi_theme_get_list_inside(Property *p, const widget *widget,
Property *pv = Property *pv =
rofi_theme_find_property(parent, P_LIST, property, FALSE); rofi_theme_find_property(parent, P_LIST, property, FALSE);
return rofi_theme_get_list_inside(pv, widget->parent, property, return rofi_theme_get_list_inside(pv, widget->parent, property,
defaults);
}
} else if (p->type == P_LIST) {
return g_list_copy_deep(p->value.list, rofi_g_list_strdup, NULL);
}
}
char **r = defaults ? g_strsplit(defaults, ",", 0) : NULL;
if (r) {
GList *l = NULL;
for (int i = 0; r[i] != NULL; i++) {
l = g_list_append(l, r[i]);
}
g_free(r);
return l;
}
return NULL;
}
GList *rofi_theme_get_list(const widget *widget, const char *property,
const char *defaults) {
ThemeWidget *wid2 = rofi_theme_find_widget(widget->name, widget->state, TRUE);
Property *p = rofi_theme_find_property(wid2, P_LIST, property, TRUE);
return rofi_theme_get_list_inside(p, widget, property, defaults);
}
static GList *rofi_theme_get_array_inside(Property *p, const widget *widget,
const char *property,
PropertyType child_type) {
if (p) {
if (p->type == P_INHERIT) {
if (widget->parent) {
ThemeWidget *parent =
rofi_theme_find_widget(widget->parent->name, widget->state, FALSE);
Property *pv =
rofi_theme_find_property(parent, P_ARRAY, property, FALSE);
return rofi_theme_get_array_inside(pv, widget->parent, property,
child_type); child_type);
} }
} else if (p->type == P_ARRAY) { } else if (p->type == P_LIST) {
return p->value.list; return p->value.list;
} }
} }
return NULL; return NULL;
} }
GList *rofi_theme_get_array_distance(const widget *widget, GList *rofi_theme_get_list_distance(const widget *widget,
const char *property) { const char *property) {
ThemeWidget *wid2 = ThemeWidget *wid2 =
rofi_theme_find_widget(widget->name, widget->state, FALSE); rofi_theme_find_widget(widget->name, widget->state, FALSE);
Property *p = rofi_theme_find_property(wid2, P_ARRAY, property, FALSE); Property *p = rofi_theme_find_property(wid2, P_LIST, property, FALSE);
GList *list = rofi_theme_get_array_inside(p, widget, property, P_PADDING); GList *list = rofi_theme_get_list_inside(p, widget, property, P_PADDING);
GList *retv = NULL; GList *retv = NULL;
for (GList *iter = g_list_first(list); iter != NULL; for (GList *iter = g_list_first(list); iter != NULL;
iter = g_list_next(iter)) { iter = g_list_next(iter)) {
@ -1309,6 +1252,23 @@ GList *rofi_theme_get_array_distance(const widget *widget,
} }
return retv; return retv;
} }
GList *rofi_theme_get_list_strings(const widget *widget, const char *property) {
ThemeWidget *wid2 =
rofi_theme_find_widget(widget->name, widget->state, FALSE);
Property *p = rofi_theme_find_property(wid2, P_LIST, property, FALSE);
GList *list = rofi_theme_get_list_inside(p, widget, property, P_STRING);
GList *retv = NULL;
for (GList *iter = g_list_first(list); iter != NULL;
iter = g_list_next(iter)) {
Property *prop = (Property *)(iter->data);
if (prop->type == P_STRING) {
retv = g_list_append(retv, g_strdup(prop->value.s));
} else {
g_warning("Invalid type detected in list.");
}
}
return retv;
}
static RofiHighlightColorStyle static RofiHighlightColorStyle
rofi_theme_get_highlight_inside(Property *p, widget *widget, rofi_theme_get_highlight_inside(Property *p, widget *widget,

View file

@ -1951,12 +1951,23 @@ static void rofi_view_add_widget(RofiViewState *state, widget *parent_widget,
// g_error("The widget %s does not exists. Invalid layout.", name); // g_error("The widget %s does not exists. Invalid layout.", name);
} }
if (wid) { if (wid) {
GList *list = rofi_theme_get_list(wid, "children", defaults); GList *list = rofi_theme_get_list_strings(wid, "children");
for (const GList *iter = list; iter != NULL; iter = g_list_next(iter)) { if (list == NULL) {
if (defaults) {
char **a = g_strsplit(defaults, ",", 0);
for (int i = 0; a && a[i]; i++) {
rofi_view_add_widget(state, wid, a[i]);
}
g_strfreev(a);
}
} else {
for (const GList *iter = g_list_first(list); iter != NULL;
iter = g_list_next(iter)) {
rofi_view_add_widget(state, wid, (const char *)iter->data); rofi_view_add_widget(state, wid, (const char *)iter->data);
} }
g_list_free_full(list, g_free); g_list_free_full(list, g_free);
} }
}
} }
static void rofi_view_ping_mouse(RofiViewState *state) { static void rofi_view_ping_mouse(RofiViewState *state) {
@ -2011,12 +2022,16 @@ RofiViewState *rofi_view_create(Mode *sw, const char *input,
state->main_window = box_create(NULL, "window", ROFI_ORIENTATION_VERTICAL); state->main_window = box_create(NULL, "window", ROFI_ORIENTATION_VERTICAL);
// Get children. // Get children.
GList *list = GList *list =
rofi_theme_get_list(WIDGET(state->main_window), "children", "mainbox"); rofi_theme_get_list_strings(WIDGET(state->main_window), "children");
if (list == NULL) {
rofi_view_add_widget(state, WIDGET(state->main_window), "mainbox");
} else {
for (const GList *iter = list; iter != NULL; iter = g_list_next(iter)) { for (const GList *iter = list; iter != NULL; iter = g_list_next(iter)) {
rofi_view_add_widget(state, WIDGET(state->main_window), rofi_view_add_widget(state, WIDGET(state->main_window),
(const char *)iter->data); (const char *)iter->data);
} }
g_list_free_full(list, g_free); g_list_free_full(list, g_free);
}
if (state->text && input) { if (state->text && input) {
textbox_text(state->text, input); textbox_text(state->text, input);

View file

@ -176,7 +176,9 @@ static void listview_add_widget(listview *lv, _listview_row *row, widget *wid,
} else { } else {
widget *wid2 = (widget *)box_create(wid, label, ROFI_ORIENTATION_VERTICAL); widget *wid2 = (widget *)box_create(wid, label, ROFI_ORIENTATION_VERTICAL);
box_add((box *)wid, WIDGET(wid2), TRUE); box_add((box *)wid, WIDGET(wid2), TRUE);
GList *list = rofi_theme_get_list(WIDGET(wid2), "children", ""); GList *list = rofi_theme_get_list_strings(
WIDGET(wid2),
"children"); // rofi_theme_get_list(WIDGET(wid2), "children", "");
for (GList *iter = g_list_first(list); iter != NULL; for (GList *iter = g_list_first(list); iter != NULL;
iter = g_list_next(iter)) { iter = g_list_next(iter)) {
listview_add_widget(lv, row, wid2, (const char *)iter->data); listview_add_widget(lv, row, wid2, (const char *)iter->data);
@ -188,11 +190,14 @@ static void listview_create_row(listview *lv, _listview_row *row) {
row->box = box_create(WIDGET(lv), "element", ROFI_ORIENTATION_HORIZONTAL); row->box = box_create(WIDGET(lv), "element", ROFI_ORIENTATION_HORIZONTAL);
widget_set_type(WIDGET(row->box), WIDGET_TYPE_LISTVIEW_ELEMENT); widget_set_type(WIDGET(row->box), WIDGET_TYPE_LISTVIEW_ELEMENT);
GList *list = NULL; GList *list = NULL;
list = rofi_theme_get_list_strings(WIDGET(row->box), "children");
if (list == NULL) {
if (config.show_icons) { if (config.show_icons) {
list = rofi_theme_get_list(WIDGET(row->box), "children", list = g_list_append(list, g_strdup("element-icon"));
"element-icon,element-text"); list = g_list_append(list, g_strdup("element-text"));
} else { } else {
list = rofi_theme_get_list(WIDGET(row->box), "children", "element-text"); list = g_list_append(list, g_strdup("element-text"));
}
} }
row->textbox = NULL; row->textbox = NULL;

View file

@ -164,13 +164,14 @@ static void textbox_initialize_font(textbox *tb) {
} }
static void textbox_tab_stops(textbox *tb) { static void textbox_tab_stops(textbox *tb) {
GList *dists = rofi_theme_get_array_distance(WIDGET(tb), "tab-stops"); GList *dists = rofi_theme_get_list_distance(WIDGET(tb), "tab-stops");
if (dists != NULL) { if (dists != NULL) {
PangoTabArray *tabs = pango_tab_array_new(g_list_length(dists), TRUE); PangoTabArray *tabs = pango_tab_array_new(g_list_length(dists), TRUE);
int i = 0, ppx = 0; int i = 0, ppx = 0;
for (const GList *iter = g_list_first(dists); iter != NULL; iter = g_list_next(iter), i++) { for (const GList *iter = g_list_first(dists); iter != NULL;
iter = g_list_next(iter), i++) {
const RofiDistance *dist = iter->data; const RofiDistance *dist = iter->data;
int px = distance_get_pixel(*dist, ROFI_ORIENTATION_HORIZONTAL); int px = distance_get_pixel(*dist, ROFI_ORIENTATION_HORIZONTAL);

View file

@ -612,10 +612,11 @@ static gboolean __config_parser_set_property(XrmOption *option,
if (p->type == P_LIST) { if (p->type == P_LIST) {
for (GList *iter = p->value.list; iter != NULL; for (GList *iter = p->value.list; iter != NULL;
iter = g_list_next(iter)) { iter = g_list_next(iter)) {
Property *p = (Property *)iter->data;
if (value == NULL) { if (value == NULL) {
value = g_strdup((char *)(iter->data)); value = g_strdup((char *)(p->value.s));
} else { } else {
char *nv = g_strjoin(",", value, (char *)(iter->data), NULL); char *nv = g_strjoin(",", value, (char *)(p->value.s), NULL);
g_free(value); g_free(value);
value = nv; value = nv;
} }

View file

@ -1153,29 +1153,22 @@ START_TEST(test_properties_list) {
wid.state = NULL; wid.state = NULL;
rofi_theme_parse_string( rofi_theme_parse_string(
"#blaat { liste: []; list1: [ one ]; list2: [ one, two ];}"); "#blaat { liste: []; list1: [ one ]; list2: [ one, two ];}");
GList *list = rofi_theme_get_list(&wid, "liste", NULL); GList *list = rofi_theme_get_list_strings(&wid, "liste");
ck_assert_ptr_null(list); ck_assert_ptr_null(list);
list = rofi_theme_get_list(&wid, "list1", NULL); list = rofi_theme_get_list_strings(&wid, "list1");
ck_assert_ptr_nonnull(list); ck_assert_ptr_nonnull(list);
ck_assert_str_eq((char *)list->data, "one"); ck_assert_str_eq((char *)list->data, "one");
g_list_free_full(list, (GDestroyNotify)g_free); g_list_free_full(list, (GDestroyNotify)g_free);
list = rofi_theme_get_list(&wid, "list2", NULL);
list = rofi_theme_get_list_strings(&wid, "list2");
ck_assert_ptr_nonnull(list); ck_assert_ptr_nonnull(list);
ck_assert_int_eq(g_list_length(list), 2); ck_assert_int_eq(g_list_length(list), 2);
list = g_list_first(list);
ck_assert_str_eq((char *)list->data, "one"); ck_assert_str_eq((char *)list->data, "one");
ck_assert_str_eq((char *)list->next->data, "two"); ck_assert_str_eq((char *)list->next->data, "two");
g_list_free_full(list, (GDestroyNotify)g_free); g_list_free_full(list, (GDestroyNotify)g_free);
list = rofi_theme_get_list(&wid, "blaat", "aap,noot,mies");
ck_assert_ptr_nonnull(list);
ck_assert_int_eq(g_list_length(list), 3);
ck_assert_str_eq((char *)list->data, "aap");
ck_assert_str_eq((char *)list->next->data, "noot");
ck_assert_str_eq((char *)list->next->next->data, "mies");
g_list_free_full(list, (GDestroyNotify)g_free);
} }
END_TEST END_TEST
START_TEST(test_configuration) { START_TEST(test_configuration) {
rofi_theme_parse_string("configuration { font: \"blaat€\"; yoffset: 4; }"); rofi_theme_parse_string("configuration { font: \"blaat€\"; yoffset: 4; }");
ck_assert_int_eq(g_utf8_collate(config.menu_font, "blaat€"), 0); ck_assert_int_eq(g_utf8_collate(config.menu_font, "blaat€"), 0);
@ -1262,13 +1255,13 @@ START_TEST(test_prepare_array) {
widget wid; widget wid;
wid.name = "element-text"; wid.name = "element-text";
wid.state = "normal.normal"; wid.state = "normal.normal";
rofi_theme_parse_string("element-text { tabs: { 10, 20px, 30px, 40px };}"); rofi_theme_parse_string("element-text { tabs: [ 10, 20px, 30px, 40px ];}");
ck_assert_ptr_nonnull(rofi_theme); ck_assert_ptr_nonnull(rofi_theme);
// ck_assert_ptr_null ( rofi_theme->widgets ); // ck_assert_ptr_null ( rofi_theme->widgets );
ck_assert_ptr_null(rofi_theme->properties); ck_assert_ptr_null(rofi_theme->properties);
ck_assert_ptr_null(rofi_theme->parent); ck_assert_ptr_null(rofi_theme->parent);
ck_assert_str_eq(rofi_theme->name, "Root"); ck_assert_str_eq(rofi_theme->name, "Root");
GList *l = rofi_theme_get_array_distance(&wid, "tabs"); GList *l = rofi_theme_get_list_distance(&wid, "tabs");
ck_assert_int_eq(g_list_length(l), 4); ck_assert_int_eq(g_list_length(l), 4);
@ -1318,7 +1311,6 @@ START_TEST(test_properties_types_names) {
ck_assert_str_eq(PropertyTypeName[P_POSITION], "Position"); ck_assert_str_eq(PropertyTypeName[P_POSITION], "Position");
ck_assert_str_eq(PropertyTypeName[P_HIGHLIGHT], "Highlight"); ck_assert_str_eq(PropertyTypeName[P_HIGHLIGHT], "Highlight");
ck_assert_str_eq(PropertyTypeName[P_LIST], "List"); ck_assert_str_eq(PropertyTypeName[P_LIST], "List");
ck_assert_str_eq(PropertyTypeName[P_ARRAY], "Array");
ck_assert_str_eq(PropertyTypeName[P_ORIENTATION], "Orientation"); ck_assert_str_eq(PropertyTypeName[P_ORIENTATION], "Orientation");
} }
END_TEST END_TEST
@ -1455,13 +1447,6 @@ static Suite *theme_parser_suite(void) {
tcase_add_test(tc_prop_cursor, test_properties_cursor_case); tcase_add_test(tc_prop_cursor, test_properties_cursor_case);
suite_add_tcase(s, tc_prop_cursor); suite_add_tcase(s, tc_prop_cursor);
} }
{
TCase *tc_prop_list = tcase_create("Propertieslist");
tcase_add_checked_fixture(tc_prop_list, theme_parser_setup,
theme_parser_teardown);
tcase_add_test(tc_prop_list, test_properties_list);
suite_add_tcase(s, tc_prop_list);
}
{ {
TCase *tc_prop_configuration = tcase_create("Configuration"); TCase *tc_prop_configuration = tcase_create("Configuration");
tcase_add_checked_fixture(tc_prop_configuration, theme_parser_setup, tcase_add_checked_fixture(tc_prop_configuration, theme_parser_setup,
@ -1469,6 +1454,13 @@ static Suite *theme_parser_suite(void) {
tcase_add_test(tc_prop_configuration, test_configuration); tcase_add_test(tc_prop_configuration, test_configuration);
suite_add_tcase(s, tc_prop_configuration); suite_add_tcase(s, tc_prop_configuration);
} }
{
TCase *tc_prop_list = tcase_create("Propertieslist");
tcase_add_checked_fixture(tc_prop_list, theme_parser_setup,
theme_parser_teardown);
tcase_add_test(tc_prop_list, test_properties_list);
suite_add_tcase(s, tc_prop_list);
}
{ {
TCase *tc_prop_parse_file = tcase_create("ParseFile"); TCase *tc_prop_parse_file = tcase_create("ParseFile");
tcase_add_checked_fixture(tc_prop_parse_file, theme_parser_setup, tcase_add_checked_fixture(tc_prop_parse_file, theme_parser_setup,