Jump to content

Problem redrawing parent containers


ForTest

Recommended Posts

 Hello,

I am experiencing an anomaly involving containers and I wanted to understand if it is an intentional thing or it happens due to my settings/programming.

I have a menu cotainer declared as follow:

	
void createWidgetsMenuTST(GDisplay* _display1)
{

GWidgetInit wi;
gwinWidgetClearInit(&wi);

wi.g.show = FALSE;
wi.g.width = 800;
wi.g.height = 480;
wi.g.y = 0;
wi.g.x = 0;
wi.customStyle = &MyCustomStyleContainerTST;
ghContainerTST = gwinGContainerCreate(_display1 , 0,&wi,0);

 

I have a second container that contains buttons, like it was a keyboard and I want to make the keyboard and all the buttons in it disappear/appear.

To do this I use the gwinHide and gwinShow methods

 

void createWidgetsKeyboard(GDisplay* _displayToUse)
{

GWidgetInit wi;

gwinWidgetClearInit(&wi);

wi.g.show = FALSE;
wi.g.width = 799;
wi.g.height = 279;
wi.g.y = 200;
wi.g.x = 0;
wi.g.parent = ghContainerTST;
wi.customStyle = 0;
wi.customDraw = ContainerCustomDrawKeyboard;

ghContainerNumericKeyboard = gwinGContainerCreate(_displayToUse , 0,&wi,0);


gwinWidgetClearInit(&wi);


wi.g.show = TRUE;
wi.g.width = 124;
wi.g.height = 124;
wi.g.y = 11; 
wi.g.x = 15;
wi.text = "1";

wi.g.parent = ghContainerNumericKeyboard;

wi.customParam = 1;

wi.customDraw = gwinButtonKeyboardDraw_Rounded;

ghButtonKey[0] = gwinButtonCreate(NULL, &wi);


gwinWidgetClearInit(&wi);

 

What happens to me is that when I call the gwinHide functions and specify ghContainerNumericKeyboard as parameter i get that also the main container (ghContainerTST) is alswo redraw.

  I think the problem is in function void WM_Redraw(GHandle gh) inside "gwin_wm.c"

  In particular i think that the redraw is done by gdispGFillArea function called on the "else" statement.

  I don't quite understand if it is avoidable this thing of redrawing containers of containers for example by editing the configuration file or if there are other ways to avoid it

 

static void WM_Redraw(GHandle gh) {

gU32 flags;


flags = gh->flags;

gh->flags &= ~(GWIN_FLG_NEEDREDRAW|GWIN_FLG_BGREDRAW|GWIN_FLG_PARENTREVEAL);


#if GWIN_NEED_CONTAINERS

redo_redraw:

#endif

if ((flags & GWIN_FLG_SYSVISIBLE)) {

if (gh->vmt->Redraw)

gh->vmt->Redraw(gh);

else if ((flags & GWIN_FLG_BGREDRAW)) {

// We can't redraw but we want full coverage so just clear the area

gdispGFillArea(gh->display, gh->x, gh->y, gh->width, gh->height, gh->bgcolor);


// Only do an after clear if this is not a parent reveal

if (!(flags & GWIN_FLG_PARENTREVEAL) && gh->vmt->AfterClear)

gh->vmt->AfterClear(gh);

}


#if GWIN_NEED_CONTAINERS

// If this is container but not a parent reveal, mark any visible children for redraw

// We redraw our children here as we have overwritten them in redrawing the parent

// as GDISP/GWIN doesn't support complex clipping regions.

if ((flags & (GWIN_FLG_CONTAINER|GWIN_FLG_PARENTREVEAL)) == GWIN_FLG_CONTAINER) {


// Container redraw is done


for(gh = gwinGetFirstChild(gh); gh; gh = gwinGetSibling(gh))

_gwinUpdate(gh);

return;

}

#endif


} else {

if ((flags & GWIN_FLG_BGREDRAW)) {

GHandle gx;


#if GWIN_NEED_CONTAINERS

if (gh->parent) {

// Child redraw is done


// Get the parent to redraw the area

gh = gh->parent;


// The parent is already marked for redraw - don't do it now.

if ((gh->flags & GWIN_FLG_NEEDREDRAW))

return;


// Use the existing clipping region and redraw now

gh->flags |= (GWIN_FLG_BGREDRAW|GWIN_FLG_PARENTREVEAL);

goto redo_redraw;

}

#endif


// Clear the area to the background color

gdispGFillArea(gh->display, gh->x, gh->y, gh->width, gh->height, gwinGetDefaultBgColor());


// Now loop over all windows looking for overlaps. Redraw them if they overlap the newly exposed area.

for(gx = gwinGetNextWindow(0); gx; gx = gwinGetNextWindow(gx)) {

if ((gx->flags & GWIN_FLG_SYSVISIBLE)

&& gx->display == gh->display

&& gx->x < gh->x+gh->width && gx->y < gh->y+gh->height && gx->x+gx->width >= gh->x && gx->y+gx->height >= gh->y) {

if (gx->vmt->Redraw)

gx->vmt->Redraw(gx);

else

// We can't redraw this window but we want full coverage so just clear the area

gdispGFillArea(gx->display, gx->x, gx->y, gx->width, gx->height, gx->bgcolor);

}

}


}

}

}

			 

 

Edited by ForTest
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...