summaryrefslogtreecommitdiff
authorsandman <sandman>2002-12-07 19:58:03 (UTC)
committer sandman <sandman>2002-12-07 19:58:03 (UTC)
commitd856a53635479f5ace72159aa513480ecd90bf1e (patch) (side-by-side diff)
treeaba6aaa2cc9168ebd364308f37cdc9c4286c6703
parent09aa2b9a766e02e52ad64c0294e8b72e6fda8c85 (diff)
downloadopie-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
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
@@ -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