-rw-r--r-- | library/global.cpp | 16 | ||||
-rw-r--r-- | library/library.pro | 7 | ||||
-rw-r--r-- | library/qpeapplication.cpp | 40 | ||||
-rw-r--r-- | library/qpeapplication.h | 2 | ||||
-rw-r--r-- | library/qt_override.cpp | 166 | ||||
-rw-r--r-- | library/qt_override_p.h | 21 |
6 files changed, 209 insertions, 43 deletions
diff --git a/library/global.cpp b/library/global.cpp index 2162e02..d6ba84f 100644 --- a/library/global.cpp +++ b/library/global.cpp @@ -574,88 +574,74 @@ void Global::invoke(const QString &c) } #endif #ifdef QT_NO_QWS_MULTIPROCESS QMessageBox::warning( 0, "Error", "Could not find the application " + c, "Ok", 0, 0, 0, 1 ); #else QStrList slist; unsigned int j; for ( j = 0; j < list.count(); j++ ) slist.append( list[j].utf8() ); const char **args = new (const char *)[slist.count() + 1]; for ( j = 0; j < slist.count(); j++ ) args[j] = slist.at(j); args[j] = NULL; #if !defined(QT_NO_COP) // an attempt to show a wait... // more logic should be used, but this will be fine for the moment... QCopEnvelope ( "QPE/System", "busy()" ); #endif #ifdef HAVE_QUICKEXEC QString libexe = qpeDir()+"/binlib/lib"+args[0] + ".so"; qDebug("libfile = %s", libexe.latin1() ); if ( QFile::exists( libexe ) ) { qDebug("calling quickexec %s", libexe.latin1() ); quickexecv( libexe.utf8().data(), (const char **)args ); } else #endif - { - char *oldpre = ::getenv ( "LD_PRELOAD" ); - - QString newpre = QPEApplication::qpeDir ( ) + "/lib/libpreload.so"; - if ( QFile::exists ( newpre )) { - if ( oldpre && oldpre [0] ) - newpre = newpre + ":" + oldpre; - ::setenv ( "LD_PRELOAD", newpre. latin1( ), 1 ); - qDebug ( "\nPRELOADING\n" ); - } - + { if ( !::vfork() ) { for ( int fd = 3; fd < 100; fd++ ) ::close( fd ); ::setpgid( ::getpid(), ::getppid() ); // Try bindir first, so that foo/bar works too ::execv( qpeDir()+"/bin/"+args[0], (char * const *)args ); ::execvp( args[0], (char * const *)args ); _exit( -1 ); } - if ( oldpre ) - ::setenv ( "LD_PRELOAD", oldpre, 1 ); - else - ::unsetenv ( "LD_PRELOAD" ); } StartingAppList::add( list[0] ); #endif //QT_NO_QWS_MULTIPROCESS } /*! Executes the application identfied by \a c, passing \a document if it isn't null. Note that a better approach might be to send a QCop message to the application's QPE/Application/\e{appname} channel. */ void Global::execute( const QString &c, const QString& document ) { if ( qApp->type() != QApplication::GuiServer ) { // ask the server to do the work #if !defined(QT_NO_COP) if ( document.isNull() ) { QCopEnvelope e( "QPE/System", "execute(QString)" ); e << c; } else { QCopEnvelope e( "QPE/System", "execute(QString,QString)" ); e << c << document; } #endif return; } // Attempt to execute the app using a builtin class for the app first // else try and find it in the bin directory if (builtin) { diff --git a/library/library.pro b/library/library.pro index 4a06550..d9538fb 100644 --- a/library/library.pro +++ b/library/library.pro @@ -28,116 +28,119 @@ HEADERS = calendar.h \ qmath.h \ datebookdb.h \ alarmserver.h \ process.h \ password.h \ timestring.h \ fontfactoryinterface.h \ fontdatabase.h \ power.h \ storage.h \ qpemessagebox.h \ timeconversion.h \ qpedebug.h \ qpemenubar.h \ qpetoolbar.h \ backend/categories.h \ stringutil.h \ backend/palmtoprecord.h \ backend/task.h \ backend/event.h \ backend/contact.h\ categorymenu.h \ categoryedit_p.h \ categoryselect.h \ categorywidget.h \ ir.h \ backend/vobject_p.h \ findwidget_p.h \ finddialog.h \ lnkproperties.h \ windowdecorationinterface.h \ textcodecinterface.h \ - imagecodecinterface.h + imagecodecinterface.h \ + qt_override_p.h + SOURCES = calendar.cpp \ global.cpp \ xmlreader.cpp \ mimetype.cpp \ menubutton.cpp \ network.cpp \ networkinterface.cpp \ filemanager.cpp \ fontmanager.cpp \ qdawg.cpp \ datebookmonth.cpp \ fileselector.cpp \ imageedit.cpp \ resource.cpp \ qpedecoration_qws.cpp \ qcopenvelope_qws.cpp \ qpeapplication.cpp \ qpestyle.cpp \ qpedialog.cpp \ lightstyle.cpp \ config.cpp \ applnk.cpp \ sound.cpp \ tzselect.cpp \ qmath.c \ datebookdb.cpp \ alarmserver.cpp \ password.cpp \ process.cpp \ process_unix.cpp \ timestring.cpp \ fontdatabase.cpp \ power.cpp \ storage.cpp \ qpemessagebox.cpp \ backend/timeconversion.cpp \ qpedebug.cpp \ qpemenubar.cpp \ qpetoolbar.cpp \ backend/categories.cpp \ backend/stringutil.cpp \ backend/palmtoprecord.cpp \ backend/task.cpp \ backend/event.cpp \ backend/contact.cpp \ categorymenu.cpp \ categoryedit_p.cpp \ categoryselect.cpp \ categorywidget.cpp \ ir.cpp \ backend/vcc_yacc.cpp \ backend/vobject.cpp \ findwidget_p.cpp \ finddialog.cpp \ - lnkproperties.cpp + lnkproperties.cpp \ + qt_override.cpp # Qt 3 compatibility HEADERS += quuid.h qcom.h qlibrary.h qlibrary_p.h SOURCES += quuid.cpp qlibrary.cpp qlibrary_unix.cpp INCLUDEPATH += $(OPIEDIR)/include backend LIBS += -ldl -lcrypt -lm INTERFACES = passwordbase_p.ui categoryeditbase_p.ui findwidgetbase_p.ui lnkpropertiesbase_p.ui TARGET = qpe DESTDIR = $(QTDIR)/lib$(PROJMAK) # This is set by configure$(OPIEDIR). VERSION = 1.5.0.1 TRANSLATIONS = ../i18n/de/libqpe.ts \ ../i18n/en/libqpe.ts \ ../i18n/es/libqpe.ts \ ../i18n/fr/libqpe.ts \ ../i18n/hu/libqpe.ts \ ../i18n/ja/libqpe.ts \ ../i18n/ko/libqpe.ts \ ../i18n/no/libqpe.ts \ ../i18n/pl/libqpe.ts \ ../i18n/pt/libqpe.ts \ ../i18n/pt_BR/libqpe.ts \ ../i18n/sl/libqpe.ts \ ../i18n/zh_CN/libqpe.ts \ ../i18n/it/libqpe.ts \ ../i18n/zh_TW/libqpe.ts \ ../i18n/da/libqpe.ts diff --git a/library/qpeapplication.cpp b/library/qpeapplication.cpp index 7cbda92..4c93111 100644 --- a/library/qpeapplication.cpp +++ b/library/qpeapplication.cpp @@ -57,64 +57,66 @@ #include <qstylefactory.h> #else #include <qplatinumstyle.h> #include <qwindowsstyle.h> #include <qmotifstyle.h> #include <qmotifplusstyle.h> #include "lightstyle.h" #include <qpe/qlibrary.h> #endif #include "global.h" #include "resource.h" #if QT_VERSION <= 230 && defined(QT_NO_CODECS) #include "qutfcodec.h" #endif #include "config.h" #include "network.h" #ifdef QWS #include "fontmanager.h" #endif #include "alarmserver.h" #include "applnk.h" #include "qpemenubar.h" #include "textcodecinterface.h" #include "imagecodecinterface.h" #include <unistd.h> #include <sys/file.h> #include <sys/ioctl.h> #include <sys/soundcard.h> +#include "qt_override_p.h" + class QPEApplicationData { public: QPEApplicationData() : presstimer( 0 ), presswidget( 0 ), rightpressed( FALSE ), kbgrabber( 0 ), kbregrab( FALSE ), notbusysent( FALSE ), preloaded( FALSE ), forceshow( FALSE ), nomaximize( FALSE ), qpe_main_widget( 0 ), keep_running( TRUE ) { qcopq.setAutoDelete( TRUE ); } int presstimer; QWidget* presswidget; QPoint presspos; bool rightpressed : 1; // AEH why not use uint foobar :1; if it's tt style -zecke int kbgrabber; bool kbregrab : 1; bool notbusysent : 1; QString appName; struct QCopRec { QCopRec( const QCString &ch, const QCString &msg, const QByteArray &d ) : channel( ch ), message( msg ), data( d ) { } QCString channel; QCString message; @@ -870,163 +872,145 @@ int QPEApplication::defaultRotation() else if ( d.contains( "Rot270" ) ) { deforient = 270; } else { deforient = 0; } } return deforient; } /*! \internal */ void QPEApplication::setDefaultRotation( int r ) { if ( qApp->type() == GuiServer ) { deforient = r; setenv( "QWS_DISPLAY", QString( "Transformed:Rot%1:0" ).arg( r ).latin1(), 1 ); Config config("qpe"); config.setGroup( "Rotation" ); config.writeEntry( "Screen", getenv("QWS_DISPLAY") ); } else { #ifndef QT_NO_COP { QCopEnvelope e( "QPE/System", "setDefaultRotation(int)" ); e << r; } #endif } } -// exported to libpreload.so -int opie_block_style = 0; /*! \internal */ void QPEApplication::applyStyle() { Config config( "qpe" ); config.setGroup( "Appearance" ); // don't block ourselves ... - opie_block_style = 0; - - - static QString appname; - - if ( appname. isNull ( )) { - char src [32]; - char dst [PATH_MAX + 1]; - ::sprintf ( src, "/proc/%d/exe", ::getpid ( )); - int l = ::readlink ( src, dst, PATH_MAX ); - if ( l > 0 ) { - dst [l] = 0; - const char *b = ::strrchr ( dst, '/' ); - appname = ( b ? b + 1 : dst ); - } - else - appname = ""; - } - + Opie::force_appearance = 0; + + static QString appname = Opie::binaryName ( ); QStringList ex = config. readListEntry ( "NoStyle", ';' ); int nostyle = 0; for ( QStringList::Iterator it = ex. begin ( ); it != ex. end ( ); ++it ) { if ( QRegExp (( *it ). mid ( 1 ), false, true ). find ( appname, 0 ) >= 0 ) { nostyle = ( *it ). left ( 1 ). toInt ( 0, 32 ); break; } } // Widget style QString style = config.readEntry( "Style", "Light" ); // don't set a custom style - if ( nostyle & 0x01 ) + if ( nostyle & Opie::Force_Style ) style = "Light"; internalSetStyle ( style ); // Colors QColor bgcolor( config.readEntry( "Background", "#E5E1D5" ) ); QColor btncolor( config.readEntry( "Button", "#D6CDBB" ) ); QPalette pal( btncolor, bgcolor ); QString color = config.readEntry( "Highlight", "#800000" ); pal.setColor( QColorGroup::Highlight, QColor( color ) ); color = config.readEntry( "HighlightedText", "#FFFFFF" ); pal.setColor( QColorGroup::HighlightedText, QColor( color ) ); color = config.readEntry( "Text", "#000000" ); pal.setColor( QColorGroup::Text, QColor( color ) ); color = config.readEntry( "ButtonText", "#000000" ); pal.setColor( QPalette::Active, QColorGroup::ButtonText, QColor( color ) ); color = config.readEntry( "Base", "#FFFFFF" ); pal.setColor( QColorGroup::Base, QColor( color ) ); pal.setColor( QPalette::Disabled, QColorGroup::Text, pal.color( QPalette::Active, QColorGroup::Background ).dark() ); setPalette( pal, TRUE ); // Window Decoration QString dec = config.readEntry( "Decoration", "Qtopia" ); // don't set a custom deco - if ( nostyle & 0x04 ) + if ( nostyle & Opie::Force_Decoration ) dec = ""; //qDebug ( "Setting Deco: %s -- old %s (%d)", dec.latin1(), d-> decorationName.latin1(), nostyle); if ( dec != d->decorationName ) { qwsSetDecoration( new QPEDecoration( dec ) ); d->decorationName = dec; } // Font QString ff = config.readEntry( "FontFamily", font().family() ); int fs = config.readNumEntry( "FontSize", font().pointSize() ); // don't set a custom font - if ( nostyle & 0x02 ) { + if ( nostyle & Opie::Force_Font ) { ff = "Helvetica"; fs = 10; } setFont ( QFont ( ff, fs ), true ); // revert to global blocking policy ... - opie_block_style = config. readBoolEntry ( "ForceStyle", false ) ? 0xff : 0x00; - opie_block_style -= nostyle; + Opie::force_appearance = config. readBoolEntry ( "ForceStyle", false ) ? Opie::Force_All : Opie::Force_None; + Opie::force_appearance &= ~nostyle; } void QPEApplication::systemMessage( const QCString& msg, const QByteArray& data ) { #ifdef Q_WS_QWS QDataStream stream( data, IO_ReadOnly ); if ( msg == "applyStyle()" ) { applyStyle(); } else if ( msg == "setDefaultRotation(int)" ) { if ( type() == GuiServer ) { int r; stream >> r; setDefaultRotation( r ); } } else if ( msg == "shutdown()" ) { if ( type() == GuiServer ) shutdown(); } else if ( msg == "quit()" ) { if ( type() != GuiServer ) tryQuit(); } else if ( msg == "forceQuit()" ) { if ( type() != GuiServer ) quit(); } else if ( msg == "restart()" ) { if ( type() == GuiServer ) restart(); } @@ -1664,64 +1648,68 @@ void QPEApplication::tryQuit() } #endif processEvents(); quit(); } /*! \internal User initiated quit. Makes the window 'Go Away'. If preloaded this means hiding the window. If not it means quitting the application. As this is user initiated we don't need to check state. */ void QPEApplication::hideOrQuit() { processEvents(); // If we are a preloaded application we don't actually quit, so emit // a System message indicating we're quasi-closing. if ( d->preloaded && d->qpe_main_widget ) #ifndef QT_NO_COP { QCopEnvelope e("QPE/System", "fastAppHiding(QString)" ); e << d->appName; d->qpe_main_widget->hide(); } #endif else quit(); } + +// These 6 stubs below need 1.5K in the binary and besides that - +// we are not using ancient toolchains anymore - sandman + #if defined(QT_QWS_IPAQ) || defined(QT_QWS_SHARP) // The libraries with the skiff package (and possibly others) have // completely useless implementations of builtin new and delete that // use about 50% of your CPU. Here we revert to the simple libc // functions. void* operator new[]( size_t size ) { return malloc( size ); } void* operator new( size_t size ) { return malloc( size ); } void operator delete[]( void* p ) { free( p ); } void operator delete[]( void* p, size_t /*size*/ ) { free( p ); } void operator delete( void* p ) { free( p ); } diff --git a/library/qpeapplication.h b/library/qpeapplication.h index 2515f1b..86affa6 100644 --- a/library/qpeapplication.h +++ b/library/qpeapplication.h @@ -85,64 +85,66 @@ public: int exec(); signals: void clientMoused(); void timeChanged(); void clockChanged( bool pm ); void micChanged( bool muted ); void volumeChanged( bool muted ); void appMessage( const QCString& msg, const QByteArray& data); void weekChanged( bool startOnMonday ); void dateFormatChanged( DateFormat ); void flush(); void reload(); private slots: void systemMessage( const QCString &msg, const QByteArray &data ); void pidMessage( const QCString &msg, const QByteArray &data ); void removeSenderFromStylusDict(); void hideOrQuit(); protected: bool qwsEventFilter( QWSEvent * ); void internalSetStyle( const QString &style ); void prepareForTermination(bool willrestart); virtual void restart(); virtual void shutdown(); bool eventFilter( QObject *, QEvent * ); void timerEvent( QTimerEvent * ); bool raiseAppropriateWindow(); virtual void tryQuit(); + virtual void polish ( QWidget * ); // this is actually implemented in qt_override.cpp (!) + private: void mapToDefaultAction( QWSKeyEvent *ke, int defKey ); #if defined(Q_WS_QWS) && !defined(QT_NO_COP) QCopChannel *sysChannel; QCopChannel *pidChannel; #endif QPEApplicationData *d; bool reserved_sh; }; inline void QPEApplication::showDialog( QDialog* d, bool nomax ) { QSize sh = d->sizeHint(); int w = QMAX(sh.width(),d->width()); int h = QMAX(sh.height(),d->height()); if ( !nomax && ( w > qApp->desktop()->width()*3/4 || h > qApp->desktop()->height()*3/4 ) ) { d->showMaximized(); } else { d->resize(w,h); d->show(); } } inline int QPEApplication::execDialog( QDialog* d, bool nomax ) diff --git a/library/qt_override.cpp b/library/qt_override.cpp new file mode 100644 index 0000000..0d783bd --- a/dev/null +++ b/library/qt_override.cpp @@ -0,0 +1,166 @@ + +#include <qpe/qpeapplication.h> +#include <qwsdecoration_qws.h> +#include <qcommonstyle.h> +#include <qfontdatabase.h> + +#include <unistd.h> +#include <stdlib.h> +#include <stdio.h> + +#include "qt_override_p.h" + + + +struct color_fix_t { + char *m_app; + char *m_class; + char *m_name; + QColorGroup::ColorRole m_set; + QColorGroup::ColorRole m_get; +}; + + + +static const color_fix_t apps_that_need_special_colors [] = { + { "HancomMobileWord", "HTextEdit", 0, QColorGroup::Background, QColorGroup::Base }, + { "neocal", "Display", 0, QColorGroup::Background, QColorGroup::Base }, + + { 0, 0, 0, QColorGroup::Base, QColorGroup::Base } +}; + +static const char * const apps_that_need_pointsizes_times_10 [] = { + "HancomMobileWord", + + 0 +}; + + + + +int Opie::force_appearance = 0; + + +// Return the *real* name of the binary - not just a quick guess +// by looking at argv [0] (which could be anything) + +static void binaryNameFree ( ) +{ + ::free ((void *) Opie::binaryName ( )); // we need to cast away the const here +} + +const char *Opie::binaryName ( ) +{ + static const char *appname = 0; + + if ( !appname ) { + char dst [PATH_MAX + 1]; + int l = ::readlink ( "/proc/self/exe", dst, PATH_MAX ); + + if ( l <= 0 ) + l = 0; + + dst [l] = 0; + const char *b = ::strrchr ( dst, '/' ); + appname = ::strdup ( b ? b + 1 : dst ); + + ::atexit ( binaryNameFree ); + } + return appname; +} + + +// Fix for a toolchain incompatibility (binaries compiled with +// old tcs using shared libs compiled with newer tcs) + +extern "C" { + +extern void __gmon_start__ ( ) __attribute__(( weak )); + +extern void __gmon_start__ ( ) +{ +} + +} + + +// Fix for apps, that use QPainter::eraseRect() which doesn't work with styles +// that set a background pixmap (it would be easier to fix eraseRect(), but +// TT made it an inline ...) + +void QPEApplication::polish ( QWidget *w ) +{ + qDebug ( "QPEApplication::polish()" ); + + for ( const color_fix_t *ptr = apps_that_need_special_colors; ptr-> m_app; ptr++ ) { + if (( ::strcmp ( Opie::binaryName ( ), ptr-> m_app ) == 0 ) && + ( ptr-> m_class ? w-> inherits ( ptr-> m_class ) : true ) && + ( ptr-> m_name ? ( ::strcmp ( w-> name ( ), ptr-> m_name ) == 0 ) : true )) { + QPalette pal = w-> palette ( ); + pal. setColor ( ptr-> m_set, pal. color ( QPalette::Active, ptr-> m_get )); + w-> setPalette ( pal ); + } + } + QApplication::polish ( w ); +} + + +// Fix for the binary incompatibility that TT introduced in Qt/E 2.3.4 -- point sizes +// were multiplied by 10 (which was incorrect) + +QValueList <int> QFontDatabase::pointSizes ( QString const &family, QString const &style, QString const &charset ) +{ + qDebug ( "QFontDatabase::pointSizes()" ); + + QValueList <int> sl = pointSizes_NonWeak ( family, style, charset ); + + for ( const char * const *ptr = apps_that_need_pointsizes_times_10; *ptr; ptr++ ) { + if ( ::strcmp ( Opie::binaryName ( ), *ptr ) == 0 ) { + for ( QValueList <int>::Iterator it = sl. begin ( ); it != sl. end ( ); ++it ) + *it *= 10; + } + } + return sl; +} + + +// Various style/font/color related overrides for weak symbols in Qt/E, +// which allows us to force the usage of the global Opie appearance. + +void QApplication::setStyle ( QStyle *style ) +{ + qDebug ( "QApplication::setStyle()" ); + + if ( Opie::force_appearance & Opie::Force_Style ) + delete style; + else + QApplication::setStyle_NonWeak ( style ); +} + +void QApplication::setPalette ( const QPalette &pal, bool informWidgets, const char *className ) +{ + qDebug ( "QApplication::setPalette()" ); + + if (!( Opie::force_appearance & Opie::Force_Style )) + QApplication::setPalette_NonWeak ( pal, informWidgets, className ); +} + +void QApplication::setFont ( const QFont &fnt, bool informWidgets, const char *className ) +{ + qDebug ( "QApplication::setFont()" ); + + if (!( Opie::force_appearance & Opie::Force_Font )) + QApplication::setFont_NonWeak ( fnt, informWidgets, className ); +} + + +void QApplication::qwsSetDecoration ( QWSDecoration *deco ) +{ + qDebug ( "QApplication::qwsSetDecoration()" ); + + if ( Opie::force_appearance & Opie::Force_Decoration ) + delete deco; + else + QApplication::qwsSetDecoration_NonWeak ( deco ); +} + diff --git a/library/qt_override_p.h b/library/qt_override_p.h new file mode 100644 index 0000000..d11917c --- a/dev/null +++ b/library/qt_override_p.h @@ -0,0 +1,21 @@ +#ifndef __QT_OVERRIDE_H__ +#define __QT_OVERRIDE_H__ + +namespace Opie { + +enum ForceAppearance { + Force_Style = 0x01, + Force_Font = 0x02, + Force_Decoration = 0x04, + + Force_All = 0xff, + Force_None = 0x00, +}; + +extern const char *binaryName ( ); + +extern int force_appearance; + +} + +#endif |