summaryrefslogtreecommitdiff
authorbrad <brad>2004-06-17 12:03:55 (UTC)
committer brad <brad>2004-06-17 12:03:55 (UTC)
commit36c12db68a3caddee0c3385a1838222e9ab596aa (patch) (side-by-side diff)
treec861d988d3e6e8754ae217c1e69420c7798f8675
parent9875d0391f21f4d7518dba946455d844f04c1668 (diff)
downloadopie-36c12db68a3caddee0c3385a1838222e9ab596aa.zip
opie-36c12db68a3caddee0c3385a1838222e9ab596aa.tar.gz
opie-36c12db68a3caddee0c3385a1838222e9ab596aa.tar.bz2
A hack workaround to prevent the launcher segfaulting after adding/removing
a launcher tab. This only appears to happen if you insert/remove removable media that contains apps that would insert a tab (like games perhaps). It has a deeper root cause but for the moment this works around it.
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--core/launcher/launcher.cpp19
1 files changed, 17 insertions, 2 deletions
diff --git a/core/launcher/launcher.cpp b/core/launcher/launcher.cpp
index 779fe54..87a54bf 100644
--- a/core/launcher/launcher.cpp
+++ b/core/launcher/launcher.cpp
@@ -215,264 +215,279 @@ LauncherView* LauncherTabWidget::newView( const QString& id, const QPixmap& pm,
this, SIGNAL(clicked(const AppLnk*)));
connect( view, SIGNAL(rightPressed(AppLnk*)),
this, SIGNAL(rightPressed(AppLnk*)));
int n = categoryBar->count();
stack->addWidget( view, n );
LauncherTab *tab = new LauncherTab( id, view, pm, label );
categoryBar->insertTab( tab, n-1 );
if ( id == "Documents" )
docview = view;
odebug << "inserting " << id << " at " << n-1 << "" << oendl;
Config cfg("Launcher");
setTabAppearance( tab, cfg );
cfg.setGroup( "GUI" );
view->setBusyIndicatorType( cfg.readEntry( "BusyType", QString::null ) );
return view;
}
LauncherView *LauncherTabWidget::view( const QString &id )
{
LauncherTab *t = categoryBar->launcherTab(id);
if ( !t )
return 0;
return t->view;
}
LauncherView *LauncherTabWidget::docView()
{
return docview;
}
void LauncherTabWidget::setLoadingWidgetEnabled( bool v )
{
if ( v != docLoadingWidgetEnabled && docLoadingWidget ) {
docLoadingWidgetEnabled = v;
raiseTabWidget();
}
}
void LauncherTabWidget::setLoadingProgress( int percent )
{
docLoadingWidgetProgress->setProgress( (percent / 4) * 4 );
}
// ### this function could more to LauncherView
void LauncherTabWidget::setTabViewAppearance( LauncherView *v, Config &cfg )
{
// View
QString view = cfg.readEntry( "View", "Icon" );
if ( view == "List" ) // No tr
v->setViewMode( LauncherView::List );
QString bgType = cfg.readEntry( "BackgroundType", "Image" );
if ( bgType == "Image" ) { // No tr
QString pm = cfg.readEntry( "BackgroundImage", "launcher/opie-background" );
v->setBackgroundType( LauncherView::Image, pm );
} else if ( bgType == "SolidColor" ) {
QString c = cfg.readEntry( "BackgroundColor" );
v->setBackgroundType( LauncherView::SolidColor, c );
} else {
v->setBackgroundType( LauncherView::Ruled, QString::null );
}
QString textCol = cfg.readEntry( "TextColor" );
if ( textCol.isEmpty() )
v->setTextColor( QColor() );
else
v->setTextColor( QColor(textCol) );
// bool customFont = cfg.readBoolEntry( "CustomFont", FALSE );
QStringList font = cfg.readListEntry( "Font", ',' );
if ( font.count() == 4 )
v->setViewFont( QFont(font[0], font[1].toInt(), font[2].toInt(), font[3].toInt()!=0) );
// ### FIXME TabColor TabTextColor
}
// ### Could move to LauncherTab
void LauncherTabWidget::setTabAppearance( LauncherTab *tab, Config &cfg )
{
cfg.setGroup( QString( "Tab %1" ).arg(tab->type) ); // No tr
setTabViewAppearance( tab->view, cfg );
// Tabs
QString tabCol = cfg.readEntry( "TabColor" );
if ( tabCol.isEmpty() )
tab->bgColor = QColor();
else
tab->bgColor = QColor(tabCol);
QString tabTextCol = cfg.readEntry( "TabTextColor" );
if ( tabTextCol.isEmpty() )
tab->fgColor = QColor();
else
tab->fgColor = QColor(tabTextCol);
}
void LauncherTabWidget::paletteChange( const QPalette &p )
{
QVBox::paletteChange( p );
QPalette pal = palette();
pal.setColor( QColorGroup::Light, pal.color(QPalette::Active,QColorGroup::Shadow) );
pal.setColor( QColorGroup::Background, pal.active().background().light(110) );
categoryBar->setPalette( pal );
categoryBar->update();
}
void LauncherTabWidget::styleChange( QStyle & )
{
QTimer::singleShot( 0, this, SLOT(setProgressStyle()) );
}
void LauncherTabWidget::setProgressStyle()
{
if (docLoadingWidgetProgress) {
docLoadingWidgetProgress->setFrameShape( QProgressBar::Box );
docLoadingWidgetProgress->setFrameShadow( QProgressBar::Plain );
docLoadingWidgetProgress->setMargin( 1 );
docLoadingWidgetProgress->setLineWidth( 1 );
}
}
+/*
+ * FIXME
+ * The following NULL check is triggered by inserting, then removing a tab on the fly
+ * as you would if you had removable media (which I do). Without this check
+ * the first app launched after a tab removal causes qpe to Segfault.
+ * This obviously has a more sinister cause, but this works around it with no
+ * obvious adverse effects. Please FIXME
+ * bkc - 17/6/2004
+ *
+ */
+
void LauncherTabWidget::setBusy(bool on)
{
if ( on )
currentView()->setBusy(TRUE);
else {
for ( int i = 0; i < categoryBar->count(); i++ ) {
- LauncherView *view = ((LauncherTab *)categoryBar->tab(i))->view;
- view->setBusy( FALSE );
+ if (categoryBar->tab(i)) {
+ LauncherView *view = ((LauncherTab *)categoryBar->tab(i))->view;
+ view->setBusy( FALSE );
+ } else {
+ odebug << "Averting Disaster with tab " << i << " == NULL! " << oendl;
+ }
}
}
}
void LauncherTabWidget::setBusyIndicatorType( const QString& str ) {
for (int i = 0; i < categoryBar->count(); i++ ) {
LauncherView* view = static_cast<LauncherTab*>( categoryBar->tab(i) )->view;
view->setBusyIndicatorType( str );
}
}
LauncherView *LauncherTabWidget::currentView(void)
{
return (LauncherView*)stack->visibleWidget();
}
void LauncherTabWidget::launcherMessage( const QCString &msg, const QByteArray &data)
{
QDataStream stream( data, IO_ReadOnly );
if ( msg == "setTabView(QString,int)" ) {
QString id;
stream >> id;
int mode;
stream >> mode;
if ( view(id) )
view(id)->setViewMode( (LauncherView::ViewMode)mode );
} else if ( msg == "setTabBackground(QString,int,QString)" ) {
QString id;
stream >> id;
int mode;
stream >> mode;
QString pixmapOrColor;
stream >> pixmapOrColor;
if ( view(id) )
view(id)->setBackgroundType( (LauncherView::BackgroundType)mode, pixmapOrColor );
if ( id == "Documents" )
docLoadingWidget->setBackgroundType( (LauncherView::BackgroundType)mode, pixmapOrColor );
} else if ( msg == "setTextColor(QString,QString)" ) {
QString id;
stream >> id;
QString color;
stream >> color;
if ( view(id) )
view(id)->setTextColor( QColor(color) );
if ( id == "Documents" )
docLoadingWidget->setTextColor( QColor(color) );
} else if ( msg == "setFont(QString,QString,int,int,int)" ) {
QString id;
stream >> id;
QString fam;
stream >> fam;
int size;
stream >> size;
int weight;
stream >> weight;
int italic;
stream >> italic;
if ( view(id) ) {
if ( !fam.isEmpty() ) {
view(id)->setViewFont( QFont(fam, size, weight, italic!=0) );
odebug << "setFont: " << fam << ", " << size << ", " << weight << ", " << italic << "" << oendl;
} else {
view(id)->clearViewFont();
}
}
}else if ( msg == "setBusyIndicatorType(QString)" ) {
QString type;
stream >> type;
setBusyIndicatorType( type );
}else if ( msg == "home()" ) {
if ( isVisibleWindow( static_cast<QWidget*>(parent())->winId() ) ) {
if (categoryBar)
categoryBar->nextTab();
}else
static_cast<QWidget*>(parent())->raise();
}
}
//---------------------------------------------------------------------------
Launcher::Launcher()
: QMainWindow( 0, "PDA User Interface", QWidget::WStyle_Customize | QWidget::WGroupLeader )
{
tabs = 0;
tb = 0;
Config cfg( "Launcher" );
cfg.setGroup( "DocTab" );
docTabEnabled = cfg.readBoolEntry( "Enable", true );
}
void Launcher::createGUI()
{
setCaption( tr("Launcher") );
// we have a pretty good idea how big we'll be
setGeometry( 0, 0, qApp->desktop()->width(), qApp->desktop()->height() );
tb = new TaskBar;
tabs = new LauncherTabWidget( this );
setCentralWidget( tabs );
ServerInterface::dockWidget( tb, ServerInterface::Bottom );
tb->show();
qApp->installEventFilter( this );
connect( qApp, SIGNAL(symbol()), this, SLOT(toggleSymbolInput()) );
connect( qApp, SIGNAL(numLockStateToggle()), this, SLOT(toggleNumLockState()) );
connect( qApp, SIGNAL(capsLockStateToggle()), this, SLOT(toggleCapsLockState()) );
connect( tb, SIGNAL(tabSelected(const QString&)),
this, SLOT(showTab(const QString&)) );
connect( tabs, SIGNAL(selected(const QString&)),
this, SLOT(viewSelected(const QString&)) );
connect( tabs, SIGNAL(clicked(const AppLnk*)),
this, SLOT(select(const AppLnk*)));
connect( tabs, SIGNAL(rightPressed(AppLnk*)),
this, SLOT(properties(AppLnk*)));
#if defined(Q_WS_QWS) && !defined(QT_NO_COP)
QCopChannel* sysChannel = new QCopChannel( "QPE/System", this );
connect( sysChannel, SIGNAL(received(const QCString&,const QByteArray&)),
this, SLOT(systemMessage(const QCString&,const QByteArray&)) );