--- xosview-1.11/bitfieldmeter.cc +++ xosview-1.12/bitfieldmeter.cc @@ -319,8 +319,6 @@ } x += twidth; } - - //parent_->flush(); } void BitFieldMeter::checkevent( void ){ --- xosview-1.11/fieldmeter.cc +++ xosview-1.12/fieldmeter.cc @@ -277,8 +277,6 @@ } if ( dousedlegends_ ) drawused( manditory ); - - //parent_->flush(); } void FieldMeter::checkevent( void ){ --- xosview-1.11/fieldmeterdecay.cc +++ xosview-1.12/fieldmeterdecay.cc @@ -160,6 +160,4 @@ decayx += decaytwidth; } - - //parent_->flush(); } --- xosview-1.11/xosview.cc +++ xosview-1.12/xosview.cc @@ -103,6 +103,7 @@ name_ = const_cast("xosview"); _isvisible = false; _ispartiallyvisible = false; + _defer_resize = true; exposed_once_flag_ = 0; expose_flag_ = 1; @@ -145,7 +146,6 @@ title( winname() ); iconname( winname() ); dolegends(); - resize(); } void XOSView::checkVersion(int argc, char *argv[]) const @@ -270,10 +270,7 @@ int topmargin = vmargin_; int rightmargin = hmargin_; int newwidth = width_ - xoff_ - rightmargin; -/* - int newheight = (height_ - (10 + 5 * (nummeters_ - 1) + - nummeters_ * yoff_)) / nummeters_; -*/ + int newheight = (height_ - (topmargin + topmargin + (nummeters_-1)*spacing + nummeters_*yoff_) @@ -284,10 +281,6 @@ int counter = 1; MeterNode *tmp = meters_; while ( tmp != NULL ) { -/* - tmp->meter_->resize( xoff_, 5 * counter + counter * yoff_ + - (counter - 1) * newheight, newwidth, newheight ); -*/ tmp->meter_->resize( xoff_, topmargin + counter*yoff_ + (counter-1)*(newheight+spacing), newwidth, newheight ); @@ -317,7 +310,6 @@ tmp->meter_->draw(); tmp = tmp->next_; } - flush(); expose_flag_ = 0; } @@ -333,14 +325,8 @@ } } } -void XOSView::keyrelease( char *ch ){ -/* WARNING: This code is not called by anything. */ -(void) ch; /* To avoid gcc warnings. */ -} void XOSView::run( void ){ - int counter = 0; - while( !done_ ){ checkevent(); @@ -351,16 +337,29 @@ tmp->meter_->checkevent(); tmp = tmp->next_; } + } + + /* To avoid long streams of redraw, we defer this until + * all events are exhausted, before sleeping */ + + if (_defer_resize) { + resize(); + _defer_resize = false; + expose_flag_ = 1; + _defer_draw = true; + } - flush(); + if (_defer_draw) { + draw(); + _defer_draw = false; } + flush(); + /* First, sleep for the proper integral number of seconds -- * usleep only deals with times less than 1 sec. */ if (sleeptime_) sleep((unsigned int)sleeptime_); if (usleeptime_) usleep( (unsigned int)usleeptime_); - - counter = (counter + 1) % 5; } } @@ -423,17 +422,33 @@ _isvisible = true; if ( event.count == 0 ) { - expose_flag_++; - draw(); + expose_flag_ = 1; + _defer_draw = true; } XOSDEBUG("Got expose event.\n"); - if (!exposed_once_flag_) { exposed_once_flag_ = 1; draw(); } + if (!exposed_once_flag_) { + exposed_once_flag_ = 1; + _defer_draw = true; + } } -void XOSView::resizeEvent( XEvent & ) { - resize(); - expose_flag_++; - draw(); +/* + * All window changes come in via XConfigureEvent (not + * XResizeRequestEvent) + */ + +void XOSView::resizeEvent( XConfigureEvent &event ) { + XOSDEBUG("Got configure event.\n"); + + if (event.width == width_ && event.height == height_) + return; + + XOSDEBUG("Window has resized\n"); + + width(event.width); + height(event.height); + + _defer_resize = true; } --- xosview-1.11/xosview.h +++ xosview-1.12/xosview.h @@ -26,7 +26,6 @@ void reallydraw( void ); void draw ( void ); void run( void ); - void keyrelease( char *ch ); const char *winname( void ); // used by meter makers @@ -67,7 +66,7 @@ void dolegends( void ); void checkOverallResources(); - void resizeEvent( XEvent & ); + void resizeEvent( XConfigureEvent &event ); void exposeEvent( XExposeEvent &event ); void keyPressEvent( XKeyEvent &event ); void visibilityEvent( XVisibilityEvent &event ); @@ -78,6 +77,8 @@ bool _isvisible; bool _ispartiallyvisible; + bool _defer_resize; + bool _defer_draw; }; #ifdef DEBUG --- xosview-1.11/xwin.cc +++ xosview-1.12/xwin.cc @@ -46,7 +46,6 @@ // Set up the default Events events_ = NULL; - addEvent( new Event( this, ConfigureNotify, &XWin::configureEvent ) ); addEvent( new Event( this, ClientMessage, &XWin::deleteEvent ) ); addEvent( new Event( this, MappingNotify, &XWin::mappingNotify ) ); @@ -355,14 +354,6 @@ } //----------------------------------------------------------------------------- -void XWin::configureEvent( XEvent &event ){ - x( event.xconfigure.x ); - y( event.xconfigure.y ); - width( event.xconfigure.width ); - height( event.xconfigure.height ); -} -//----------------------------------------------------------------------------- - void XWin::deleteEvent( XEvent &event ){ if ( (event.xclient.message_type == wm_ ) && ((unsigned)event.xclient.data.l[0] == wmdelete_) ) --- xosview-1.11/xwin.h +++ xosview-1.12/xwin.h @@ -20,10 +20,6 @@ virtual ~XWin( void ); void XWinInit ( int argc, char* argv[], char* geometry, Xrm* xrmp ); - int x( void ) { return x_; } - void x( int val ) { x_ = val; } - int y( void ) { return y_; } - void y( int val ) { y_ = val; } int width( void ) { return width_; } void width( int val ) { width_ = val; } int height( void ) { return height_; }