diff options
-rw-r--r-- | include/theme.h | 12 | ||||
-rw-r--r-- | include/widgets/box.h | 13 | ||||
-rw-r--r-- | lexer/theme-lexer.l | 9 | ||||
-rw-r--r-- | lexer/theme-parser.y | 14 | ||||
-rw-r--r-- | source/theme.c | 10 | ||||
-rw-r--r-- | source/view.c | 16 | ||||
-rw-r--r-- | source/widgets/box.c | 20 |
7 files changed, 64 insertions, 30 deletions
diff --git a/include/theme.h b/include/theme.h index bfb628b0..7c8f76a9 100644 --- a/include/theme.h +++ b/include/theme.h @@ -120,6 +120,8 @@ typedef enum P_HIGHLIGHT, /** List */ P_LIST, + /** Orientation */ + P_ORIENTATION, } PropertyType; /** @@ -359,6 +361,16 @@ int rofi_theme_get_boolean ( const widget *widget, const char *property, int * @param property The property to query. * @param def The default value. * + * Obtain the orientation indicated by %property of the widget. + * + * @returns The orientation of this property for this widget or %def not found. + */ +Orientation rofi_theme_get_orientation ( const widget *widget, const char *property, Orientation def ); +/** + * @param widget The widget to query + * @param property The property to query. + * @param def The default value. + * * Obtain the string of the widget. * * @returns The string value of this property for this widget. diff --git a/include/widgets/box.h b/include/widgets/box.h index 46d0fdb1..70132475 100644 --- a/include/widgets/box.h +++ b/include/widgets/box.h @@ -48,23 +48,12 @@ typedef struct _box box; /** - * The packing direction of the box - */ -typedef enum -{ - /** Pack widgets horizontal */ - BOX_HORIZONTAL = 0, - /** Pack widgets vertical */ - BOX_VERTICAL = 1 -} boxType; - -/** * @param name The name of the widget. * @param type The packing direction of the newly created box. * * @returns a newly created box, free with #widget_free */ -box * box_create ( const char *name, boxType type ); +box * box_create ( const char *name, Orientation type ); /** * @param box Handle to the box widget. diff --git a/lexer/theme-lexer.l b/lexer/theme-lexer.l index 4bb1c60a..38647f60 100644 --- a/lexer/theme-lexer.l +++ b/lexer/theme-lexer.l @@ -199,6 +199,12 @@ ANGLE_GRAD "grad" ANGLE_RAD "rad" ANGLE_TURN "turn" + +/* Orientation */ + +ORIENTATION_HORI "horizontal" +ORIENTATION_VERT "vertical" + /* Color schema */ RGBA rgb[a]? HWB "hwb" @@ -484,6 +490,9 @@ if ( queue == NULL ){ <PROPERTIES>{ANGLE_GRAD} { return T_ANGLE_GRAD; } <PROPERTIES>{ANGLE_TURN} { return T_ANGLE_TURN; } +<PROPERTIES>{ORIENTATION_HORI} { return ORIENTATION_HORI; } +<PROPERTIES>{ORIENTATION_VERT} { return ORIENTATION_VERT; } + <PROPERTIES>{COLOR_TRANSPARENT} { return T_COLOR_TRANSPARENT; } diff --git a/lexer/theme-parser.y b/lexer/theme-parser.y index fd290e85..0ed5391b 100644 --- a/lexer/theme-parser.y +++ b/lexer/theme-parser.y @@ -188,6 +188,9 @@ static ThemeColor hwb_to_rgb ( double h, double w, double b) %token T_ANGLE_RAD "Radians" %token T_ANGLE_TURN "Turns" +%token ORIENTATION_HORI "Horizontal" +%token ORIENTATION_VERT "Vertical" + %token T_COL_RGBA "rgb[a] colorscheme" %token T_COL_HSL "hsl colorscheme" %token T_COL_HWB "hwb colorscheme" @@ -236,6 +239,7 @@ static ThemeColor hwb_to_rgb ( double h, double w, double b) %type <ival> t_property_highlight_style %type <ival> t_property_line_style %type <list> t_property_element_list +%type <ival> t_property_orientation %start t_entry_list %% @@ -372,6 +376,11 @@ t_property $$->name = $1; $$->value.list = $4; } +| t_property_name T_PSEP t_property_orientation T_PCLOSE { + $$ = rofi_theme_property_create ( P_ORIENTATION ); + $$->name = $1; + $$->value.i = $3; +} ; /** List of elements */ @@ -569,6 +578,11 @@ t_property_color_value | T_INT { $$ = $1; } ; +t_property_orientation +: ORIENTATION_HORI { $$ = ORIENTATION_HORIZONTAL; } +| ORIENTATION_VERT { $$ = ORIENTATION_VERTICAL; } +; + /** Property name */ t_property_name : T_PROP_NAME { $$ = $1; } diff --git a/source/theme.c b/source/theme.c index cebe29e3..fc72307a 100644 --- a/source/theme.c +++ b/source/theme.c @@ -541,6 +541,16 @@ int rofi_theme_get_boolean ( const widget *widget, const char *property, int def g_debug ( "Theme entry: #%s %s property %s unset.", widget->name, widget->state ? widget->state : "", property ); return def; } +Orientation rofi_theme_get_orientation ( const widget *widget, const char *property, Orientation def ) +{ + ThemeWidget *wid = rofi_theme_find_widget ( widget->name, widget->state, FALSE ); + Property *p = rofi_theme_find_property ( wid, P_ORIENTATION, property, FALSE ); + if ( p ) { + return p->value.b; + } + g_debug ( "Theme entry: #%s %s property %s unset.", widget->name, widget->state ? widget->state : "", property ); + return def; +} const char *rofi_theme_get_string ( const widget *widget, const char *property, char *def ) { diff --git a/source/view.c b/source/view.c index 3ea8962d..4d636191 100644 --- a/source/view.c +++ b/source/view.c @@ -709,7 +709,7 @@ void __create_window ( MenuFlags menu_flags ) } // Setup font. // Dummy widget. - box *win = box_create ( "window.box_window", BOX_HORIZONTAL ); + box *win = box_create ( "window.box_window", ORIENTATION_HORIZONTAL); const char *font = rofi_theme_get_string ( WIDGET ( win ), "font", config.menu_font ); if ( font ) { PangoFontDescription *pfd = pango_font_description_from_string ( font ); @@ -1497,7 +1497,7 @@ static void rofi_view_add_widget ( RofiViewState *state, widget *parent_widget, * MAINBOX */ if ( strcmp ( name, "mainbox") == 0 ){ - wid = (widget *)box_create ( strbox, BOX_VERTICAL ); + wid = (widget *)box_create ( strbox, ORIENTATION_VERTICAL ); box_add ( (box *)parent_widget, WIDGET ( wid ), TRUE, 0 ); defaults = "inputbar,message,listview"; } @@ -1505,7 +1505,7 @@ static void rofi_view_add_widget ( RofiViewState *state, widget *parent_widget, * INPUTBAR */ else if ( strcmp ( name, "inputbar" ) == 0 ){ - wid = (widget *)box_create ( strbox, BOX_HORIZONTAL ); + wid = (widget *)box_create ( strbox, ORIENTATION_HORIZONTAL ); defaults = "prompt,entry,case-indicator"; box_add ( (box *)parent_widget, WIDGET ( wid ), FALSE, 0 ); @@ -1571,7 +1571,7 @@ static void rofi_view_add_widget ( RofiViewState *state, widget *parent_widget, */ else if ( strcmp( name, "sidebar" ) == 0 ) { if ( config.sidebar_mode ){ - state->sidebar_bar = box_create ( strbox, BOX_HORIZONTAL ); + state->sidebar_bar = box_create ( strbox, ORIENTATION_HORIZONTAL ); box_add ( (box*)parent_widget, WIDGET ( state->sidebar_bar ), FALSE, 10 ); state->num_modi = rofi_get_num_enabled_modi (); state->modi = g_malloc0 ( state->num_modi * sizeof ( textbox * ) ); @@ -1589,7 +1589,7 @@ static void rofi_view_add_widget ( RofiViewState *state, widget *parent_widget, textbox *t = textbox_create ( str, TB_WRAP, NORMAL, ""); box_add ( (box *)parent_widget, WIDGET(t), TRUE, 0); } else { - wid = box_create ( strbox, BOX_VERTICAL ); + wid = box_create ( strbox, ORIENTATION_VERTICAL ); box_add ( (box *)parent_widget, WIDGET ( wid ), TRUE, 0 ); //g_error("The widget %s does not exists. Invalid layout.", name); } @@ -1632,7 +1632,7 @@ RofiViewState *rofi_view_create ( Mode *sw, TICK_N ( "Get active monitor" ); - state->main_window = box_create ( "window.box", BOX_VERTICAL ); + state->main_window = box_create ( "window.box", ORIENTATION_VERTICAL ); // Get children. GList *list = rofi_theme_get_list ( WIDGET(state->main_window), "children", "mainbox"); for ( const GList *iter = list; iter != NULL; iter = g_list_next ( iter )){ @@ -1683,8 +1683,8 @@ int rofi_view_error_dialog ( const char *msg, int markup ) state->menu_flags = MENU_ERROR_DIALOG; state->finalize = process_result; - state->main_window = box_create ( "window.box", BOX_VERTICAL ); - box *box = box_create ( "window.mainbox.message.box", BOX_VERTICAL ); + state->main_window = box_create ( "window.box", ORIENTATION_VERTICAL ); + box *box = box_create ( "window.mainbox.message.box", ORIENTATION_VERTICAL ); box_add ( state->main_window, WIDGET ( box ), TRUE, 0 ); state->text = textbox_create ( "window.mainbox.message.textbox", ( TB_AUTOHEIGHT | TB_WRAP ) + ( ( markup ) ? TB_MARKUP : 0 ), NORMAL, ( msg != NULL ) ? msg : "" ); diff --git a/source/widgets/box.c b/source/widgets/box.c index f781f3db..1063625d 100644 --- a/source/widgets/box.c +++ b/source/widgets/box.c @@ -40,7 +40,7 @@ struct _box { widget widget; - boxType type; + Orientation type; int max_size; // Padding between elements Distance spacing; @@ -54,9 +54,9 @@ static void box_update ( widget *wid ); static int box_get_desired_width ( widget *wid ) { box *b = (box *) wid; - int spacing = distance_get_pixel ( b->spacing, b->type == BOX_VERTICAL ? ORIENTATION_VERTICAL : ORIENTATION_HORIZONTAL ); + int spacing = distance_get_pixel ( b->spacing, b->type ); int width = 0; - if ( b->type == BOX_HORIZONTAL ) { + if ( b->type == ORIENTATION_HORIZONTAL ) { int active_widgets = 0; for ( GList *iter = g_list_first ( b->children ); iter != NULL; iter = g_list_next ( iter ) ) { widget * child = (widget *) iter->data; @@ -89,9 +89,9 @@ static int box_get_desired_width ( widget *wid ) static int box_get_desired_height ( widget *wid ) { box *b = (box *) wid; - int spacing = distance_get_pixel ( b->spacing, b->type == BOX_VERTICAL ? ORIENTATION_VERTICAL : ORIENTATION_HORIZONTAL ); + int spacing = distance_get_pixel ( b->spacing, b->type ); int height = 0; - if ( b->type == BOX_VERTICAL ) { + if ( b->type == ORIENTATION_VERTICAL) { int active_widgets = 0; for ( GList *iter = g_list_first ( b->children ); iter != NULL; iter = g_list_next ( iter ) ) { widget * child = (widget *) iter->data; @@ -287,7 +287,7 @@ void box_add ( box *box, widget *child, gboolean expand, int index ) return; } // Make sure box is width/heigh enough. - if ( box->type == BOX_VERTICAL ) { + if ( box->type == ORIENTATION_VERTICAL ) { int width = box->widget.w; width = MAX ( width, child->w + widget_padding_get_padding_width ( WIDGET ( box ) ) ); box->widget.w = width; @@ -335,7 +335,7 @@ static widget *box_find_mouse_target ( widget *wid, WidgetType type, gint x, gin return NULL; } -box * box_create ( const char *name, boxType type ) +box * box_create ( const char *name, Orientation type ) { box *b = g_malloc0 ( sizeof ( box ) ); // Initialize widget. @@ -350,7 +350,7 @@ box * box_create ( const char *name, boxType type ) b->widget.get_desired_width = box_get_desired_width; b->widget.enabled = rofi_theme_get_boolean ( WIDGET ( b ), "enabled", TRUE ); - b->type = rofi_theme_get_boolean ( WIDGET (b), "vertical",b->type ); + b->type = rofi_theme_get_orientation ( WIDGET (b), "orientation",b->type ); b->spacing = rofi_theme_get_distance ( WIDGET ( b ), "spacing", DEFAULT_SPACING ); return b; @@ -361,10 +361,10 @@ static void box_update ( widget *wid ) box *b = (box *) wid; switch ( b->type ) { - case BOX_VERTICAL: + case ORIENTATION_VERTICAL: vert_calculate_size ( b ); break; - case BOX_HORIZONTAL: + case ORIENTATION_HORIZONTAL: default: hori_calculate_size ( b ); } |