author | mickeyl <mickeyl> | 2005-02-06 22:53:53 (UTC) |
---|---|---|
committer | mickeyl <mickeyl> | 2005-02-06 22:53:53 (UTC) |
commit | ab32151cd8e85deb354bab04e25efb1f3f399dee (patch) (side-by-side diff) | |
tree | 66ab72d210bbc50c0e535986c61ca23f68efbfd1 /libopie2 | |
parent | ec33239c6edd9927fe2f82953fa48dec47d19567 (diff) | |
download | opie-ab32151cd8e85deb354bab04e25efb1f3f399dee.zip opie-ab32151cd8e85deb354bab04e25efb1f3f399dee.tar.gz opie-ab32151cd8e85deb354bab04e25efb1f3f399dee.tar.bz2 |
make autorotate also work on kernel 2.6
-rw-r--r-- | libopie2/opiecore/device/odevice.cpp | 88 | ||||
-rw-r--r-- | libopie2/opiecore/device/odevice_zaurus.cpp | 22 |
2 files changed, 35 insertions, 75 deletions
diff --git a/libopie2/opiecore/device/odevice.cpp b/libopie2/opiecore/device/odevice.cpp index 3d69614..2c5190c 100644 --- a/libopie2/opiecore/device/odevice.cpp +++ b/libopie2/opiecore/device/odevice.cpp @@ -164,49 +164,49 @@ ODevice *ODevice::inst() return dev; } ODevice::ODevice() { d = new ODeviceData; d->m_modelstr = "Unknown"; d->m_model = Model_Unknown; d->m_vendorstr = "Unknown"; d->m_vendor = Vendor_Unknown; d->m_systemstr = "Unknown"; d->m_system = System_Unknown; d->m_sysverstr = "0.0"; d->m_rotation = Rot0; d->m_direction = CW; d->m_holdtime = 1000; // 1000ms d->m_buttons = 0; d->m_cpu_frequencies = new QStrList; /* mixer */ d->m_sound = d->m_vol = d->m_mixer = -1; - + /* System QCopChannel created */ d->m_initializedButtonQcop = false; // New distribution detection code first checks for legacy distributions, // identified by /etc/familiar-version or /etc/oz_version. // Then check for OpenEmbedded and lastly, read /etc/issue for ( unsigned int i = 0; i < sizeof distributions; ++i ) { if ( QFile::exists( distributions[i].sysvfile ) ) { d->m_systemstr = distributions[i].sysstr; d->m_system = distributions[i].system; d->m_sysverstr = "<Unknown>"; QFile f( distributions[i].sysvfile ); if ( f.open( IO_ReadOnly ) ) { QTextStream ts( &f ); d->m_sysverstr = ts.readLine().replace( QRegExp( "\\\\." ), "" ); } break; } } } @@ -250,154 +250,115 @@ ODevice::~ODevice() { // we leak m_devicebuttons and m_cpu_frequency // but it's a singleton and it is not so importantant // -zecke delete d; } //#include <linux/apm_bios.h> #define APM_IOC_SUSPEND OD_IO( 'A', 2 ) /** * This method will try to suspend the device * It only works if the user is the QWS Server and the apm application * is installed. * It tries to suspend and then waits some time cause some distributions * do have asynchronus apm implementations. * This method will either fail and return false or it'll suspend the * device and return once the device got woken up * * @return if the device got suspended */ bool ODevice::suspend() { - if ( !isQWS( ) ) // only qwsserver is allowed to suspend - return false; - - if ( d->m_model == Model_Unknown ) // better don't suspend in qvfb / on unkown devices - return false; - - bool res = false; - ODevice::sendSuspendmsg(); - - struct timeval tvs, tvn; - ::gettimeofday ( &tvs, 0 ); - - ::sync(); // flush fs caches - res = ( ::system ( "apm --suspend" ) == 0 ); - - // This is needed because the iPAQ apm implementation is asynchronous and we - // can not be sure when exactly the device is really suspended - // This can be deleted as soon as a stable familiar with a synchronous apm implementation exists. - - if ( res ) { - do { // wait at most 1.5 sec: either suspend didn't work or the device resumed - ::usleep ( 200 * 1000 ); - ::gettimeofday ( &tvn, 0 ); - } while ((( tvn. tv_sec - tvs. tv_sec ) * 1000 + ( tvn. tv_usec - tvs. tv_usec ) / 1000 ) < 1500 ); - } - - return res; + return false; // default implementation == unknown device or qvfb } //#include <linux/fb.h> better not rely on kernel headers in userspace ... #define FBIOBLANK OD_IO( 'F', 0x11 ) // 0x4611 /* VESA Blanking Levels */ #define VESA_NO_BLANKING 0 #define VESA_VSYNC_SUSPEND 1 #define VESA_HSYNC_SUSPEND 2 #define VESA_POWERDOWN 3 /** * This sets the display on or off */ -bool ODevice::setDisplayStatus ( bool on ) +bool ODevice::setDisplayStatus( bool on ) { - qDebug("ODevice::setDisplayStatus(%d)", on); - - if ( d->m_model == Model_Unknown ) - return false; - - bool res = false; - int fd; - -#ifdef QT_QWS_DEVFS - if (( fd = ::open ( "/dev/fb/0", O_RDWR )) >= 0 ) { -#else - if (( fd = ::open ( "/dev/fb0", O_RDWR )) >= 0 ) { -#endif - res = ( ::ioctl ( fd, FBIOBLANK, on ? VESA_NO_BLANKING : VESA_POWERDOWN ) == 0 ); - ::close ( fd ); - } - return res; + qDebug( "ODevice::setDisplayStatus( %d ) - please override me.", on ); + return false; // don't do anything for unknown models } /** * This sets the display brightness * * @param b The brightness to be set on a scale from 0 to 255 * @return success or failure */ -bool ODevice::setDisplayBrightness ( int b) +bool ODevice::setDisplayBrightness( int b ) { - Q_UNUSED( b ) + qDebug( "ODevice::setDisplayBrightness( %d ) - please override me.", b ); return false; } /** - * - * @return Returns the number of steppings on the brightness slider - * in the Light-'n-Power settings. Values smaller zero and bigger + * + * @returns the number of steppings on the brightness slider + * in the Light-'n-Power settings. Values smaller than zero and bigger * than 255 do not make sense. * * \sa QSlider::setLineStep * \sa QSlider::setPageStep */ int ODevice::displayBrightnessResolution() const { + qDebug( "ODevice::displayBrightnessResolution() - please override me." ); return 16; } /** * This sets the display contrast * @param p The contrast to be set on a scale from 0 to 255 -* @return success or failure +* @returns success or failure */ -bool ODevice::setDisplayContrast ( int p) +bool ODevice::setDisplayContrast( int p ) { - Q_UNUSED( p ) + qDebug( "ODevice::setDisplayContrast( %d ) - please override me.", p ); return false; } /** -* @return return the max value for the brightness settings slider +* @returns the maximum value for the contrast settings slider * or 0 if the device doesn't support setting of a contrast */ int ODevice::displayContrastResolution() const { + qDebug( "ODevice::displayBrightnessResolution() - please override me." ); return 0; } /** * This returns the vendor as string * @return Vendor as QString */ QString ODevice::vendorString() const { return d->m_vendorstr; } /** * This returns the vendor as one of the values of OVendor * @return OVendor */ OVendor ODevice::vendor() const { return d->m_vendor; } /** * This returns the model as a string * @return A string representing the model @@ -618,89 +579,88 @@ const QValueList <ODeviceButton> &ODevice::buttons() return *d->m_buttons; } /** * @return The amount of time that would count as a hold */ uint ODevice::buttonHoldTime() const { return d->m_holdtime; } /** * This method return a ODeviceButton for a key code * or 0 if no special hardware button is available for the device * * @return The devicebutton or 0l * @see ODeviceButton */ const ODeviceButton *ODevice::buttonForKeycode ( ushort code ) { initButtons(); for ( QValueListConstIterator<ODeviceButton> it = d->m_buttons->begin(); it != d->m_buttons->end(); ++it ) { - if ( (*it). keycode() == code ) + if ( (*it).keycode() == code ) return &(*it); } return 0; } void ODevice::reloadButtonMapping() { if(!d->m_buttons) initButtons(); - + if(!d->m_initializedButtonQcop) { QCopChannel *chan = new QCopChannel("QPE/System", this, "ODevice button channel"); connect(chan,SIGNAL(received(const QCString&,const QByteArray&)), this,SLOT(systemMessage(const QCString&,const QByteArray&))); d->m_initializedButtonQcop = true; } Config cfg ( "ButtonSettings" ); for ( uint i = 0; i < d->m_buttons->count(); i++ ) { ODeviceButton &b = ( *d->m_buttons ) [i]; QString group = "Button" + QString::number ( i ); QCString pch, hch; QCString pm, hm; QByteArray pdata, hdata; if ( cfg. hasGroup ( group )) { cfg. setGroup ( group ); pch = cfg. readEntry ( "PressedActionChannel" ). latin1(); pm = cfg. readEntry ( "PressedActionMessage" ). latin1(); // pdata = decodeBase64 ( buttonFile. readEntry ( "PressedActionArgs" )); hch = cfg. readEntry ( "HeldActionChannel" ). latin1(); hm = cfg. readEntry ( "HeldActionMessage" ). latin1(); // hdata = decodeBase64 ( buttonFile. readEntry ( "HeldActionArgs" )); } b. setPressedAction ( OQCopMessage ( pch, pm, pdata )); - b. setHeldAction ( OQCopMessage ( hch, hm, hdata )); } } void ODevice::remapPressedAction ( int button, const OQCopMessage &action ) { initButtons(); QString mb_chan; if ( button >= (int) d->m_buttons->count()) return; ODeviceButton &b = ( *d->m_buttons ) [button]; b. setPressedAction ( action ); mb_chan=b. pressedAction(). channel(); Config buttonFile ( "ButtonSettings" ); buttonFile. setGroup ( "Button" + QString::number ( button )); buttonFile. writeEntry ( "PressedActionChannel", (const char*) mb_chan); buttonFile. writeEntry ( "PressedActionMessage", (const char*) b. pressedAction(). message()); // buttonFile. writeEntry ( "PressedActionArgs", encodeBase64 ( b. pressedAction(). data())); @@ -720,143 +680,143 @@ void ODevice::remapHeldAction ( int button, const OQCopMessage &action ) Config buttonFile ( "ButtonSettings" ); buttonFile. setGroup ( "Button" + QString::number ( button )); buttonFile. writeEntry ( "HeldActionChannel", (const char *) b. heldAction(). channel()); buttonFile. writeEntry ( "HeldActionMessage", (const char *) b. heldAction(). message()); // buttonFile. writeEntry ( "HeldActionArgs", decodeBase64 ( b. heldAction(). data())); QCopEnvelope ( "QPE/System", "deviceButtonMappingChanged()" ); } /** * @internal */ void ODevice::virtual_hook(int, void* ){ } /** * \brief Send a QCOP Message before suspending * * Sends a QCOP message to channel QPE/System * with the message "aboutToSuspend()" if this * is the windowing server. - * + * * Call this in your custom \sa suspend() Method * before going to suspend. - * + * */ void ODevice::sendSuspendmsg() { if ( isQWS() ) return; QCopEnvelope ( "QPE/System", "aboutToSuspend()" ); } /** * \brief Prepend the QWSServer::KeyboardFilter to the list of installed KeyFilters * * Prepend a QWSServer::KeyboardFilter to the List of Keyboard * Filters. This function is the only way to prepend a KeyFilter. * * @param aFilter The KeyFilter to be prepended to the list of filters * * @see Opie::Core::OKeyFilter * @see Opie::Core::OKeyFilter::inst() */ void ODevice::addPreHandler(QWSServer::KeyboardFilter*aFilter) { Opie::Core::OKeyFilter::inst()->addPreHandler(aFilter); } /** * \brief Remove the QWSServer::KeyboardFilter in the param from the list * * Remove the QWSServer::KeyboardFilter \par aFilter from the List * of Keyfilters. Call this when you delete the KeyFilter! * * @param aFilter The filter to be removed from the Opie::Core::OKeyFilter * @see Opie::Core::ODevice::addPreHandler */ void ODevice::remPreHandler(QWSServer::KeyboardFilter*aFilter) { Opie::Core::OKeyFilter::inst()->remPreHandler(aFilter); } /** * @internal - * + * * @see changeMixerForAlarm */ void ODevice::playingStopped() { if ( sender() ) const_cast<QObject*>(sender())->disconnect( this ); #ifndef QT_NO_SOUND if ( d->m_sound >= 0 ) { ::ioctl ( d->m_sound, MIXER_WRITE( d->m_mixer ), &d->m_vol ); ::close ( d->m_sound ); } #endif } /** * \brief Change the Volume for the Alarm and set it back after playing is finished * * If you play an Alarm Sound you might want to change the Mixer to * full volume and ignore the user setting. After it \sa Sound::isFinished * you would turn the volume back to the user preference. * The problem is that we used to enter the event loop while waiting * for the sound to be finished triggering all kind of reentrance * problems what a library shouldn't introduce. * Instead of manually waiting for the sound to be finished use * this Method and it will automatically restore the Mixer to * the user configuration after the sound finished playing. * * Note: The onwership of \param snd is not transfered and playing * is not started in this method. If 'snd' gets deleted before * playing is finished the volume doesn't get set back to * the user preference! * * \code * static Sound snd("alarm"); * if(!snd.isFinished()) * return; * * changeMixerForAlarm( my_channel, "/dev/mixer", &snd ); * snd.play() * \endcode - * - * + * + * * * @param mixer The mixer number/channel to use * @param file The file name. If you convert from QString use QFile::encodeName * @param snd The sound to wait for finishing - * + * */ void ODevice::changeMixerForAlarm( int mixer, const char* file, Sound *snd ) { #ifndef QT_NO_SOUND if (( d->m_sound = ::open ( file, O_RDWR )) >= 0 ) { if ( ::ioctl ( d->m_sound, MIXER_READ( mixer ), &d->m_vol ) >= 0 ) { Config cfg ( "qpe" ); cfg. setGroup ( "Volume" ); int volalarm = cfg. readNumEntry ( "AlarmPercent", 50 ); if ( volalarm < 0 ) volalarm = 0; else if ( volalarm > 100 ) volalarm = 100; volalarm |= ( volalarm << 8 ); if ( ::ioctl ( d->m_sound, MIXER_WRITE( mixer ), &volalarm ) >= 0 ) register_qpe_sound_finished(snd, this, SLOT(playingStopped())); } d->m_mixer = mixer; } #endif } } diff --git a/libopie2/opiecore/device/odevice_zaurus.cpp b/libopie2/opiecore/device/odevice_zaurus.cpp index 7377965..82e127e 100644 --- a/libopie2/opiecore/device/odevice_zaurus.cpp +++ b/libopie2/opiecore/device/odevice_zaurus.cpp @@ -81,60 +81,60 @@ struct z_button z_buttons [] = { }; struct z_button z_buttons_c700 [] = { { Qt::Key_F9, QT_TRANSLATE_NOOP("Button", "Calendar Button"), "devicebuttons/z_calendar", "datebook", "nextView()", "today", "raise()" }, { Qt::Key_F10, QT_TRANSLATE_NOOP("Button", "Contacts Button"), "devicebuttons/z_contact", "addressbook", "raise()", "addressbook", "beamBusinessCard()" }, { Qt::Key_F12, QT_TRANSLATE_NOOP("Button", "Home Button"), "devicebuttons/z_home", "QPE/Launcher", "home()", "buttonsettings", "raise()" }, { Qt::Key_F11, QT_TRANSLATE_NOOP("Button", "Menu Button"), "devicebuttons/z_menu", "QPE/TaskBar", "toggleMenu()", "QPE/TaskBar", "toggleStartMenu()" }, { Qt::Key_F13, QT_TRANSLATE_NOOP("Button", "Mail Button"), "devicebuttons/z_mail", "opiemail", "raise()", "opiemail", "newMail()" }, - { Qt::Key_F15, QT_TRANSLATE_NOOP("Button", "Display Rotate"), - "devicebuttons/z_hinge", + { Qt::Key_F15, QT_TRANSLATE_NOOP("Button", "Hinge1"), + "devicebuttons/z_hinge1", "QPE/Rotation", "rotateDefault()", - "QPE/Dummy", "doNothing()" }, - { Qt::Key_F16, QT_TRANSLATE_NOOP("Button", "Display Rotate"), - "devicebuttons/z_hinge", + "QPE/Rotation", "rotateDefault()" }, + { Qt::Key_F16, QT_TRANSLATE_NOOP("Button", "Hinge2"), + "devicebuttons/z_hinge2", "QPE/Rotation", "rotateDefault()", - "QPE/Dummy", "doNothing()" }, - { Qt::Key_F17, QT_TRANSLATE_NOOP("Button", "Display Rotate"), - "devicebuttons/z_hinge", + "QPE/Rotation", "rotateDefault()" }, + { Qt::Key_F17, QT_TRANSLATE_NOOP("Button", "Hinge3"), + "devicebuttons/z_hinge3", "QPE/Rotation", "rotateDefault()", - "QPE/Dummy", "doNothing()" }, + "QPE/Rotation", "rotateDefault()" }, }; // FIXME This gets unnecessary complicated. We should think about splitting the Zaurus // class up into individual classes. We need three classes // // Zaurus-Collie (SA-model w/ 320x240 lcd, for SL5500 and SL5000) // Zaurus-Poodle (PXA-model w/ 320x240 lcd, for SL5600) // Zaurus-Corgi (PXA-model w/ 640x480 lcd, for C700, C750, C760, C860, C3000) // Zaurus-Tosa (PXA-model w/ 480x640 lcd, for SL6000) // // Only question right now is: Do we really need to do it? Because as soon // as the OpenZaurus kernel is ready, there will be a unified interface for all // Zaurus models (concerning apm, backlight, buttons, etc.) // // Comments? - mickeyl. void Zaurus::init(const QString& cpu_info) { // generic distribution code already scanned /etc/issue at that point - // embedix releases contain "Embedix <version> | Linux for Embedded Devices" if ( d->m_sysverstr.contains( "embedix", false ) ) { d->m_vendorstr = "Sharp"; d->m_vendor = Vendor_Sharp; @@ -467,95 +467,95 @@ bool Zaurus::setDisplayStatus( bool on ) ::close ( fd ); } } else { int fd = ::open( "/sys/class/backlight/corgi-bl/power", O_WRONLY|O_NONBLOCK ); if ( fd ) { char buf[10]; buf[0] = on ? FB_BLANK_UNBLANK : FB_BLANK_POWERDOWN; buf[1] = '\0'; res = ( ::write( fd, &buf[0], 2 ) == 0 ); ::close( fd ); } } return res; } bool Zaurus::suspend() { qDebug("ODevice::suspend"); if ( !isQWS( ) ) // only qwsserver is allowed to suspend return false; - if ( d->m_model == Model_Unknown ) // better don't suspend in qvfb / on unkown devices + if ( d->m_model == Model_Unknown ) // better don't suspend on unknown devices return false; bool res = false; ODevice::sendSuspendmsg(); struct timeval tvs, tvn; ::gettimeofday ( &tvs, 0 ); ::sync(); // flush fs caches res = ( ::system ( "apm --suspend" ) == 0 ); // This is needed because the apm implementation is asynchronous and we // can not be sure when exactly the device is really suspended if ( res ) { do { // Yes, wait 15 seconds. This APM sucks big time. ::usleep ( 200 * 1000 ); ::gettimeofday ( &tvn, 0 ); } while ((( tvn. tv_sec - tvs. tv_sec ) * 1000 + ( tvn. tv_usec - tvs. tv_usec ) / 1000 ) < 15000 ); } QCopEnvelope ( "QPE/Rotation", "rotateDefault()" ); return res; } Transformation Zaurus::rotation() const { qDebug( "Zaurus::rotation()" ); Transformation rot; switch ( d->m_model ) { case Model_Zaurus_SLC3000: // fallthrough case Model_Zaurus_SLC7x0: { OHingeStatus hs = readHingeSensor(); qDebug( "Zaurus::rotation() - hinge sensor = %d", (int) hs ); if ( m_embedix ) { if ( hs == CASE_PORTRAIT ) rot = Rot0; else if ( hs == CASE_UNKNOWN ) rot = Rot0; else rot = Rot270; } else { - if ( hs == CASE_PORTRAIT ) rot = Rot270; + if ( hs == CASE_PORTRAIT ) rot = Rot90; else if ( hs == CASE_UNKNOWN ) rot = Rot0; else rot = Rot0; } } break; case Model_Zaurus_SL6000: case Model_Zaurus_SLB600: case Model_Zaurus_SLA300: case Model_Zaurus_SL5500: case Model_Zaurus_SL5000: default: rot = d->m_rotation; break; } return rot; } ODirection Zaurus::direction() const { ODirection dir; switch ( d->m_model ) { case Model_Zaurus_SLC3000: // fallthrough case Model_Zaurus_SLC7x0: { |