author | sandman <sandman> | 2002-12-07 19:58:03 (UTC) |
---|---|---|
committer | sandman <sandman> | 2002-12-07 19:58:03 (UTC) |
commit | d856a53635479f5ace72159aa513480ecd90bf1e (patch) (side-by-side diff) | |
tree | aba6aaa2cc9168ebd364308f37cdc9c4286c6703 | |
parent | 09aa2b9a766e02e52ad64c0294e8b72e6fda8c85 (diff) | |
download | opie-d856a53635479f5ace72159aa513480ecd90bf1e.zip opie-d856a53635479f5ace72159aa513480ecd90bf1e.tar.gz opie-d856a53635479f5ace72159aa513480ecd90bf1e.tar.bz2 |
- removed the libpreload stuff from global.cpp
- added qt_override.* which provides the same functionality as libpreload
(the new -override patch for Qt/E is needed for this to work/compile)
- changed qpeapplication a bit to accomodate the new interface
-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 @@ -590,56 +590,42 @@ void Global::invoke(const QString &c) 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 ) { diff --git a/library/library.pro b/library/library.pro index 4a06550..d9538fb 100644 --- a/library/library.pro +++ b/library/library.pro @@ -44,33 +44,35 @@ HEADERS = calendar.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 \ @@ -99,33 +101,34 @@ SOURCES = calendar.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 \ diff --git a/library/qpeapplication.cpp b/library/qpeapplication.cpp index 7cbda92..4c93111 100644 --- a/library/qpeapplication.cpp +++ b/library/qpeapplication.cpp @@ -73,32 +73,34 @@ #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 : @@ -886,131 +888,113 @@ void QPEApplication::setDefaultRotation( int r ) 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 ); } } @@ -1680,32 +1664,36 @@ void QPEApplication::hideOrQuit() // 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 ); } diff --git a/library/qpeapplication.h b/library/qpeapplication.h index 2515f1b..86affa6 100644 --- a/library/qpeapplication.h +++ b/library/qpeapplication.h @@ -101,32 +101,34 @@ 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 ) 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 |