author | mickeyl <mickeyl> | 2004-02-24 16:24:03 (UTC) |
---|---|---|
committer | mickeyl <mickeyl> | 2004-02-24 16:24:03 (UTC) |
commit | f02547005d26a1f3816f5475116bbdf094a31ccb (patch) (side-by-side diff) | |
tree | 86c1c9b21ae48aba81a24f6c412d881386708f35 | |
parent | e3e4d0cca07dfa5487acb54596ac978f2343fc40 (diff) | |
download | opie-f02547005d26a1f3816f5475116bbdf094a31ccb.zip opie-f02547005d26a1f3816f5475116bbdf094a31ccb.tar.gz opie-f02547005d26a1f3816f5475116bbdf094a31ccb.tar.bz2 |
fix a regression bug when an interface appears or disappears
-rw-r--r-- | noncore/applets/wirelessapplet/wireless.cpp | 74 |
1 files changed, 40 insertions, 34 deletions
diff --git a/noncore/applets/wirelessapplet/wireless.cpp b/noncore/applets/wirelessapplet/wireless.cpp index 72ac380..cee789c 100644 --- a/noncore/applets/wirelessapplet/wireless.cpp +++ b/noncore/applets/wirelessapplet/wireless.cpp @@ -37,34 +37,34 @@ #include <qslider.h> #include <qbuttongroup.h> #include <qlayout.h> #include <qframe.h> #include <qpixmap.h> #include <qstring.h> #include <qfile.h> #include <qtextstream.h> /* STD */ #include <sys/types.h> #include <signal.h> #define STYLE_BARS 0 #define STYLE_ANTENNA 1 -#define MDEBUG -//#undef MDEBUG +//#define MDEBUG +#undef MDEBUG WirelessControl::WirelessControl( WirelessApplet *applet, QWidget *parent, const char *name ) : QFrame( parent, name, WStyle_StaysOnTop | WType_Popup ), applet( applet ) { readConfig(); writeConfigEntry( "UpdateFrequency", updateFrequency ); writeConfigEntry( "DisplayStyle", displayStyle ); setFrameStyle( QFrame::PopupPanel | QFrame::Raised ); QGridLayout *grid = new QGridLayout( this, 3, 2, 6, 2, "top layout" ); /* status label */ statusLabel = new QLabel( this, "statuslabel" ); QString text( "Wireless Status:<br>" @@ -206,32 +206,33 @@ void WirelessControl::writeConfigEntry( const char *entry, int val ) //=========================================================================== WirelessApplet::WirelessApplet( QWidget *parent, const char *name ) : QWidget( parent, name ), visualStyle( STYLE_ANTENNA ), timer( 0 ), interface( 0 ), oldiface( 0 ), rocESSID( false ), rocFREQ( false ), rocAP( false ), rocMODE( false ) { setFixedHeight( 18 ); setFixedWidth( 14 ); status = new WirelessControl( this, this, "wireless status" ); } void WirelessApplet::checkInterface() { interface = 0L; ONetwork* net = ONetwork::instance(); + net->synchronize(); ONetwork::InterfaceIterator it = net->iterator(); while ( it.current() && !it.current()->isWireless() ) ++it; if ( it.current() && it.current()->isWireless() ) interface = static_cast<OWirelessNetworkInterface*>( it.current() ); if ( interface ) { #ifdef MDEBUG qDebug( "WIFIAPPLET: using interface '%s'", ( const char* ) interface->name() ); #endif } else { @@ -311,205 +312,210 @@ void WirelessApplet::updateDelayChange( int delay ) if ( delay == 0 ) delay = 50; timer = startTimer( delay ); } void WirelessApplet::displayStyleChange( int style ) { visualStyle = style; repaint(); } WirelessApplet::~WirelessApplet() {} void WirelessApplet::timerEvent( QTimerEvent* ) { +#ifdef MDEBUG qDebug( "WirelessApplet::timerEvent" ); - OWirelessNetworkInterface* iface = interface; - - if ( iface ) +#endif + if ( interface ) + { + if ( !ONetwork::instance()->isPresent( (const char*) interface->name() ) ) { +#ifdef MDEBUG + qDebug( "WIFIAPPLET: Interface no longer present." ); +#endif + interface = 0L; + mustRepaint(); + return; + } + if ( mustRepaint() ) { +#ifdef MDEBUG qDebug( "WIFIAPPLET: A value has changed -> repainting." ); +#endif repaint(); } if ( status->isVisible() ) { updatePopupWindow(); } } else { checkInterface(); } } void WirelessApplet::mousePressEvent( QMouseEvent * ) { if ( status->isVisible() ) status->hide(); else status->show( true ); } bool WirelessApplet::mustRepaint() { - OWirelessNetworkInterface* iface = interface; - // check if there are enough changes to justify a (flickering) repaint // has the interface changed? - if ( iface != oldiface ) + if ( interface != oldiface ) { - oldiface = iface; - if ( iface ) + oldiface = interface; + if ( interface ) { #ifdef MDEBUG qDebug( "WIFIAPPLET: We had no interface but now we have one! :-)" ); #endif show(); } else { #ifdef MDEBUG qDebug( "WIFIAPPLET: We had a interface but now we don't have one! ;-(" ); #endif hide(); return true; } } const char** pixmap = getQualityPixmap(); if ( pixmap && ( pixmap != oldpixmap ) ) { oldpixmap = pixmap; return true; } int noiseH = 50; // iface->noisePercent() * ( height() - 3 ) / 100; - int signalH = iface->signalStrength() * ( height() - 3 ) / 100; + int signalH = interface->signalStrength() * ( height() - 3 ) / 100; int qualityH = 50; // iface->qualityPercent() * ( height() - 3 ) / 100; if ( ( noiseH != oldnoiseH ) || ( signalH != oldsignalH ) || ( qualityH != oldqualityH ) ) { oldnoiseH = noiseH; oldsignalH = signalH; oldqualityH = qualityH; return true; } - if ( rocESSID && ( oldESSID != iface->SSID() ) ) + if ( rocESSID && ( oldESSID != interface->SSID() ) ) { #ifdef MDEBUG qDebug( "WIFIAPPLET: ESSID has changed." ); #endif renewDHCP(); } - else if ( rocFREQ && ( oldFREQ != iface->frequency() ) ) + else if ( rocFREQ && ( oldFREQ != interface->frequency() ) ) { #ifdef MDEBUG qDebug( "WIFIAPPLET: FREQ has changed." ); #endif renewDHCP(); } - else if ( rocAP && ( oldAP != iface->associatedAP().toString() ) ) + else if ( rocAP && ( oldAP != interface->associatedAP().toString() ) ) { #ifdef MDEBUG qDebug( "WIFIAPPLET: AP has changed." ); #endif renewDHCP(); } - else if ( rocMODE && ( oldMODE != iface->mode() ) ) + else if ( rocMODE && ( oldMODE != interface->mode() ) ) { #ifdef MDEBUG qDebug( "WIFIAPPLET: MODE has changed." ); #endif renewDHCP(); } - oldESSID = iface->SSID(); - oldMODE = iface->mode(); - oldFREQ = iface->frequency(); - oldAP = iface->associatedAP().toString(); + oldESSID = interface->SSID(); + oldMODE = interface->mode(); + oldFREQ = interface->frequency(); + oldAP = interface->associatedAP().toString(); return false; } void WirelessApplet::updatePopupWindow() { - OWirelessNetworkInterface* iface = interface; - int qualityH = iface->signalStrength(); + int qualityH = interface->signalStrength(); if ( status->mgraph ) status->mgraph->addValue( qualityH, false ); QString freqString; - QString cell = ( iface->mode() == "Managed" ) ? "AP: " : "Cell: "; - freqString.sprintf( "%.3f GHz", iface->frequency() ); - status->statusLabel->setText( "Station: " + iface->nickName() + "<br>" + - "ESSID: " + iface->SSID() + "<br>" + - "MODE: " + iface->mode() + "<br>" + + QString cell = ( interface->mode() == "Managed" ) ? "AP: " : "Cell: "; + freqString.sprintf( "%.3f GHz", interface->frequency() ); + status->statusLabel->setText( "Station: " + interface->nickName() + "<br>" + + "ESSID: " + interface->SSID() + "<br>" + + "MODE: " + interface->mode() + "<br>" + "FREQ: " + freqString + "<br>" + - cell + " " + iface->associatedAP().toString() ); + cell + " " + interface->associatedAP().toString() ); } const char** WirelessApplet::getQualityPixmap() { - OWirelessNetworkInterface* iface = interface; - - if ( !iface ) return ( const char** ) nowireless_xpm; - int qualityH = iface->signalStrength(); + if ( !interface ) return ( const char** ) nowireless_xpm; + int qualityH = interface->signalStrength(); if ( qualityH < 0 ) return ( const char** ) nowireless_xpm; if ( visualStyle == STYLE_ANTENNA ) { if ( qualityH < 1 ) return ( const char** ) connect0_xpm; if ( qualityH < 17 ) return ( const char** ) connect1_xpm; if ( qualityH < 34 ) return ( const char** ) connect2_xpm; if ( qualityH < 50 ) return ( const char** ) connect3_xpm; if ( qualityH < 65 ) return ( const char** ) connect4_xpm; return ( const char** ) connect5_xpm; } return 0; // please draw your bars } void WirelessApplet::paintEvent( QPaintEvent* ) { - OWirelessNetworkInterface* iface = interface; - QPainter p( this ); QColor color; const char** pixmap = getQualityPixmap(); if ( pixmap ) p.drawPixmap( 0, 1, pixmap ); else { int noiseH = 30; // iface->noisePercent() * ( height() - 3 ) / 100; int signalH = 50; // iface->signalPercent() * ( height() - 3 ) / 100; - int qualityH = iface->signalStrength(); // iface->qualityPercent() * ( height() - 3 ) / 100; + int qualityH = interface->signalStrength(); // iface->qualityPercent() * ( height() - 3 ) / 100; double intensity; int pixelHeight; int pixelWidth = 2; int Hue; int barSpace = 3; int leftoffset = 0; int bottomoffset = 2; // draw noise indicator pixelHeight = noiseH; Hue = 50; for ( int i = 0; i < pixelHeight; ++i ) { intensity = 50 + ( ( double ) i / ( double ) pixelHeight ) * 205; color.setHsv( Hue, 255, intensity ); |