From 495dfb4c208620b290b51af2fd6d809efba716d8 Mon Sep 17 00:00:00 2001 From: Dave Davenport Date: Tue, 3 Jan 2017 23:51:15 +0100 Subject: [PATCH] Add support for margin. --- include/widgets/widget-internal.h | 1 + source/widgets/widget.c | 33 ++++++++++++++++++++++--------- 2 files changed, 25 insertions(+), 9 deletions(-) diff --git a/include/widgets/widget-internal.h b/include/widgets/widget-internal.h index 976b406f..6279de9e 100644 --- a/include/widgets/widget-internal.h +++ b/include/widgets/widget-internal.h @@ -16,6 +16,7 @@ struct _widget /** Height of the widget */ short h; /** Padding */ + Padding margin; Padding padding; Padding border; diff --git a/source/widgets/widget.c b/source/widgets/widget.c index 5c8342c3..23249eaa 100644 --- a/source/widgets/widget.c +++ b/source/widgets/widget.c @@ -13,6 +13,8 @@ void widget_init ( widget *widget , const char *name, const char *class_name ) widget->border = (Padding){ {0, PW_PX}, {0, PW_PX}, {0, PW_PX}, {0, PW_PX}}; widget->border = rofi_theme_get_padding (widget->class_name, widget->name, NULL, "border", widget->border); + widget->margin = (Padding){ {0, PW_PX}, {0, PW_PX}, {0, PW_PX}, {0, PW_PX}}; + widget->margin = rofi_theme_get_padding (widget->class_name, widget->name, NULL, "margin", widget->margin); } void widget_set_state ( widget *widget, const char *state ) @@ -88,8 +90,17 @@ void widget_draw ( widget *widget, cairo_t *d ) if ( widget && widget->enabled && widget->draw ) { // Store current state. cairo_save ( d ); + int margin_left = distance_get_pixel ( widget->margin.left, ORIENTATION_HORIZONTAL ); + int margin_top = distance_get_pixel ( widget->margin.top, ORIENTATION_HORIZONTAL ); + int margin_right = distance_get_pixel ( widget->margin.right, ORIENTATION_VERTICAL ); + int margin_bottom = distance_get_pixel ( widget->margin.bottom, ORIENTATION_VERTICAL ); // Define a clipmask so we won't draw outside out widget. - cairo_rectangle ( d, widget->x, widget->y, widget->w, widget->h ); + cairo_rectangle ( d, + widget->x+margin_left, + widget->y+margin_top, + widget->w-margin_right-margin_left, + widget->h-margin_top-margin_bottom + ); cairo_clip ( d ); rofi_theme_get_color ( widget->class_name, widget->name, widget->state, "background", d ); @@ -105,26 +116,26 @@ void widget_draw ( widget *widget, cairo_t *d ) rofi_theme_get_color ( widget->class_name, widget->name, widget->state, "foreground", d ); if ( left > 0 ) { cairo_set_line_width ( d, left ); - cairo_move_to ( d, left/2.0, 0); - cairo_line_to ( d, left/2.0, widget->h); + cairo_move_to ( d, left/2.0, 0 ); + cairo_line_to ( d, left/2.0, widget->h-margin_bottom); cairo_stroke ( d ); } if ( right > 0 ) { cairo_set_line_width ( d, right ); - cairo_move_to ( d, widget->w - right/2.0, 0 ); - cairo_line_to ( d, widget->w - right/2.0, widget->h ); + cairo_move_to ( d, widget->w -right/2.0, 0 ); + cairo_line_to ( d, widget->w -right/2.0, widget->h ); cairo_stroke ( d ); } if ( top > 0 ) { cairo_set_line_width ( d, top ); - cairo_move_to ( d, 0, top/2.0); - cairo_line_to ( d, widget->w, top/2.0); + cairo_move_to ( d, 0, top/2.0 ); + cairo_line_to ( d, widget->w, top/2.0 ); cairo_stroke ( d ); } if ( bottom > 0 ) { cairo_set_line_width ( d, bottom ); - cairo_move_to ( d, 0, widget->h-bottom/2.0); - cairo_line_to ( d, widget->w , widget->h-bottom/2.0); + cairo_move_to ( d, 0, widget->h-bottom/2.0); + cairo_line_to ( d, widget->w, widget->h-bottom/2.0); cairo_stroke ( d ); } @@ -252,24 +263,28 @@ int widget_padding_get_left ( const widget *wid ) { int distance = distance_get_pixel ( wid->padding.left, ORIENTATION_HORIZONTAL ); distance += distance_get_pixel ( wid->border.left, ORIENTATION_HORIZONTAL ); + distance += distance_get_pixel ( wid->margin.left, ORIENTATION_HORIZONTAL ); return distance; } int widget_padding_get_right ( const widget *wid ) { int distance = distance_get_pixel ( wid->padding.right, ORIENTATION_HORIZONTAL ); distance += distance_get_pixel ( wid->border.right, ORIENTATION_HORIZONTAL ); + distance += distance_get_pixel ( wid->margin.right, ORIENTATION_HORIZONTAL ); return distance; } int widget_padding_get_top ( const widget *wid ) { int distance = distance_get_pixel ( wid->padding.top, ORIENTATION_VERTICAL ); distance += distance_get_pixel ( wid->border.top, ORIENTATION_VERTICAL ); + distance += distance_get_pixel ( wid->margin.top, ORIENTATION_VERTICAL ); return distance; } int widget_padding_get_bottom ( const widget *wid ) { int distance = distance_get_pixel ( wid->padding.bottom, ORIENTATION_VERTICAL ); distance += distance_get_pixel ( wid->border.bottom, ORIENTATION_VERTICAL ); + distance += distance_get_pixel ( wid->margin.bottom, ORIENTATION_VERTICAL ); return distance; }