@@ -225,21 +225,20 @@ namespace lsp
225225
226226 // Estimate palette
227227 ws::rectangle_t xr;
228+ lsp::Color bg_color, border_color;
229+ float scaling = lsp_max (0 .0f , sScaling .get ());
230+ float bright = select_brightness ();
231+ size_t border = (sBorder .get () > 0 ) ? lsp_max (1 .0f , sBorder .get () * scaling) : 0 ;
232+ get_actual_bg_color (bg_color);
228233
229- if (force)
234+ // Draw backround of the widget if needed
230235 {
231- lsp::Color bg_color, border_color;
232- float scaling = lsp_max (0 .0f , sScaling .get ());
233- float bright = select_brightness ();
234- size_t border = (sBorder .get () > 0 ) ? lsp_max (1 .0f , sBorder .get () * scaling) : 0 ;
235- get_actual_bg_color (bg_color);
236-
237236 // Enable clipping
238237 s->clip_begin (area);
239238 lsp_finally { s->clip_end (); };
240239
241240 // Draw background if no child widget is present
242- if (vVisible.is_empty ())
241+ if (( vVisible.is_empty ()) && (force ))
243242 {
244243 s->fill_rect (bg_color, SURFMASK_NONE , 0 .0f , &sSize );
245244 if (border > 0 )
@@ -262,40 +261,44 @@ namespace lsp
262261 cell_t *wc = vVisible.uget (i);
263262 Widget *w = wc->pWidget ;
264263
265- w->get_actual_bg_color (bg_color);
266- if (Size::overlap (area, &wc->a ))
267- s->fill_frame (bg_color, SURFMASK_NONE , 0 .0f , &wc->a , &wc->s );
268-
269- // Draw spacing
270- if (((i + 1 ) < n) && (spacing > 0 ))
264+ // Render the frame around child widget
265+ if ((force) || (w->redraw_bg_pending ()))
271266 {
272- get_actual_bg_color (bg_color);
273- if (horizontal)
267+ w->get_actual_bg_color (bg_color);
268+ if (Size::overlap (area, &wc->a ))
269+ s->fill_frame (bg_color, SURFMASK_NONE , 0 .0f , &wc->a , &wc->s );
270+
271+ // Draw spacing
272+ if (((i + 1 ) < n) && (spacing > 0 ))
274273 {
275- xr.nLeft = wc->a .nLeft + wc->a .nWidth ;
276- xr.nTop = wc->a .nTop ;
277- xr.nWidth = spacing;
278- xr.nHeight = wc->a .nHeight ;
274+ get_actual_bg_color (bg_color);
275+ if (horizontal)
276+ {
277+ xr.nLeft = wc->a .nLeft + wc->a .nWidth ;
278+ xr.nTop = wc->a .nTop ;
279+ xr.nWidth = spacing;
280+ xr.nHeight = wc->a .nHeight ;
281+ }
282+ else
283+ {
284+ xr.nLeft = wc->a .nLeft ;
285+ xr.nTop = wc->a .nTop + wc->a .nHeight ;
286+ xr.nWidth = wc->a .nWidth ;
287+ xr.nHeight = spacing;
288+ }
289+
290+ if (Size::overlap (area, &xr))
291+ s->fill_rect (bg_color, SURFMASK_NONE , 0 .0f , &xr);
279292 }
280- else
293+
294+ // Draw border
295+ if (border > 0 )
281296 {
282- xr. nLeft = wc-> a . nLeft ;
283- xr. nTop = wc-> a . nTop + wc-> a . nHeight ;
284- xr. nWidth = wc-> a . nWidth ;
285- xr. nHeight = spacing ;
297+ border_color. copy ( sBorderColor ) ;
298+ border_color. scale_lch_luminance (bright) ;
299+ Rectangle::enter_border (&xr, & sSize , border) ;
300+ s-> fill_frame (border_color, SURFMASK_NONE , 0 . 0f , & sSize , &xr) ;
286301 }
287-
288- if (Size::overlap (area, &xr))
289- s->fill_rect (bg_color, SURFMASK_NONE , 0 .0f , &xr);
290- }
291-
292- // Draw border
293- if (border > 0 )
294- {
295- border_color.copy (sBorderColor );
296- border_color.scale_lch_luminance (bright);
297- Rectangle::enter_border (&xr, &sSize , border);
298- s->fill_frame (border_color, SURFMASK_NONE , 0 .0f , &sSize , &xr);
299302 }
300303 }
301304 }
0 commit comments