summaryrefslogtreecommitdiff
Side-by-side diff
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--library/global.cpp16
-rw-r--r--library/library.pro7
-rw-r--r--library/qpeapplication.cpp40
-rw-r--r--library/qpeapplication.h2
-rw-r--r--library/qt_override.cpp166
-rw-r--r--library/qt_override_p.h21
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
@@ -602,19 +602,9 @@ void Global::invoke(const QString &c)
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() );
@@ -622,12 +612,8 @@ void Global::invoke(const QString &c)
::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
}
diff --git a/library/library.pro b/library/library.pro
index 4a06550..d9538fb 100644
--- a/library/library.pro
+++ b/library/library.pro
@@ -56,9 +56,11 @@ HEADERS = calendar.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 \
@@ -111,9 +113,10 @@ SOURCES = calendar.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
diff --git a/library/qpeapplication.cpp b/library/qpeapplication.cpp
index 7cbda92..4c93111 100644
--- a/library/qpeapplication.cpp
+++ b/library/qpeapplication.cpp
@@ -85,8 +85,10 @@
#include <sys/file.h>
#include <sys/ioctl.h>
#include <sys/soundcard.h>
+#include "qt_override_p.h"
+
class QPEApplicationData
{
public:
@@ -898,10 +900,8 @@ void QPEApplication::setDefaultRotation( int r )
}
}
-// exported to libpreload.so
-int opie_block_style = 0;
/*!
\internal
*/
@@ -910,27 +910,11 @@ 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 ) {
@@ -943,9 +927,9 @@ void QPEApplication::applyStyle()
// 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 );
@@ -972,9 +956,9 @@ void QPEApplication::applyStyle()
// 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);
@@ -987,18 +971,18 @@ void QPEApplication::applyStyle()
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 )
{
@@ -1692,8 +1676,12 @@ void QPEApplication::hideOrQuit()
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
diff --git a/library/qpeapplication.h b/library/qpeapplication.h
index 2515f1b..86affa6 100644
--- a/library/qpeapplication.h
+++ b/library/qpeapplication.h
@@ -113,8 +113,10 @@ protected:
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)
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