X-Git-Url: http://winboard.nl/cgi-bin?a=blobdiff_plain;f=xoptions.c;h=a475c588edeb020459f1106e64c22d691228392c;hb=fbefb9f0b24c20920d7ac2ddf8d2503de9365821;hp=e9cc0c43c5337ccab8081a8c5c10bd51cf6e94ba;hpb=75855598371def570546c23ee8712f74f5c61643;p=xboard.git diff --git a/xoptions.c b/xoptions.c index e9cc0c4..a475c58 100644 --- a/xoptions.c +++ b/xoptions.c @@ -551,23 +551,30 @@ GraphEventProc(Widget widget, caddr_t client_data, XEvent *event) XtSetArg(args[j], XtNwidth, &w); j++; XtSetArg(args[j], XtNheight, &h); j++; XtGetValues(widget, args, j); - sizing = ((w != graph->max || h != graph->value) && ((XExposeEvent*)event)->count >= 0); - graph->max = w; graph->value = h; + + if(w < graph->max || w > graph->max + 1 || h != graph->value) { // use width fudge of 1 pixel + if(((XExposeEvent*)event)->count >= 0) { // suppress sizing on expose for ordered redraw in response to sizing. + sizing = 1; + graph->max = w; graph->value = h; // note: old values are kept if we we don't exceed width fudge + } + } else w = graph->max; + if(sizing && ((XExposeEvent*)event)->count > 0) { graph->max = 0; return; } // don't bother if further exposure is pending during resize if(!graph->textValue || sizing) { // create surfaces of new size for display widget if(graph->textValue) cairo_surface_destroy((cairo_surface_t *)graph->textValue); graph->textValue = (char*) cairo_xlib_surface_create(xDisplay, XtWindow(widget), DefaultVisual(xDisplay, 0), w, h); } if(sizing) { // the memory buffer was already created in GenericPopup(), - // to give drawing routines opportunity to use it befor first expose event + // to give drawing routines opportunity to use it before first expose event // (which are only processed when main gets to the event loop, so after all init!) // so only change when size is no longer good if(graph->choice) cairo_surface_destroy((cairo_surface_t *) graph->choice); graph->choice = (char**) cairo_image_surface_create (CAIRO_FORMAT_ARGB32, w, h); break; } - ExposeRedraw(graph, ((XExposeEvent*)event)->x, ((XExposeEvent*)event)->y, - ((XExposeEvent*)event)->width, ((XExposeEvent*)event)->height); + w = ((XExposeEvent*)event)->width; + if(((XExposeEvent*)event)->x + w > graph->max) w--; // cut off fudge pixel + if(w) ExposeRedraw(graph, ((XExposeEvent*)event)->x, ((XExposeEvent*)event)->y, w, ((XExposeEvent*)event)->height); return; case MotionNotify: f = 0;