-rw-r--r-- | core/launcher/taskbar.cpp | 277 |
1 files changed, 168 insertions, 109 deletions
diff --git a/core/launcher/taskbar.cpp b/core/launcher/taskbar.cpp index e8a81c3..37fdb30 100644 --- a/core/launcher/taskbar.cpp +++ b/core/launcher/taskbar.cpp @@ -1,315 +1,374 @@ /********************************************************************** -** Copyright (C) 2000 Trolltech AS. All rights reserved. +** Copyright (C) 2000-2002 Trolltech AS. All rights reserved. ** -** This file is part of Qtopia Environment. +** This file is part of the Qtopia Environment. ** ** This file may be distributed and/or modified under the terms of the ** GNU General Public License version 2 as published by the Free Software ** Foundation and appearing in the file LICENSE.GPL included in the ** packaging of this file. ** ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. ** ** See http://www.trolltech.com/gpl/ for GPL licensing information. ** ** Contact info@trolltech.com if any conditions of this licensing are ** not clear to you. ** -*********************************************************************/ +**********************************************************************/ #include "startmenu.h" #include "inputmethods.h" #include "runningappbar.h" #include "systray.h" -#include "calibrate.h" #include "wait.h" #include "appicons.h" #include "taskbar.h" -#include "desktop.h" +#include "server.h" -#include <qpe/qpeapplication.h> -#include <qpe/qcopenvelope_qws.h> -#include <qpe/global.h> - -#if defined( QT_QWS_SL5XXX ) || defined( QT_QWS_IPAQ ) || defined( QT_QWS_RAMSES) -#include <qpe/custom.h> +#include <qtopia/qpeapplication.h> +#ifdef QWS +#include <qtopia/qcopenvelope_qws.h> #endif - -#include <opie/odevice.h> +#include <qtopia/global.h> +#include <qtopia/custom.h> #include <qlabel.h> #include <qlayout.h> #include <qtimer.h> +#ifdef QWS #include <qwindowsystem_qws.h> +#endif #include <qwidgetstack.h> #if defined( Q_WS_QWS ) #include <qwsdisplay_qws.h> #include <qgfx_qws.h> #endif -using namespace Opie; - -static Global::Command builtins[] = { - -#if defined(QT_QWS_IPAQ) || defined(QT_QWS_CASSIOPEIA) || defined(QT_QWS_SL5XXX) || defined(QT_QWS_RAMSES) - { "calibrate", TaskBar::calibrate, 1, 0 }, -#endif -#if !defined(QT_QWS_CASSIOPEIA) - { "shutdown", Global::shutdown, 1, 0 }, -// { "run", run, 1, 0 }, -#endif - - { 0, TaskBar::calibrate, 0, 0 }, -}; - static bool initNumLock() { #ifdef QPE_INITIAL_NUMLOCK_STATE QPE_INITIAL_NUMLOCK_STATE #endif return FALSE; } +//--------------------------------------------------------------------------- + +class SafeMode : public QWidget +{ + Q_OBJECT +public: + SafeMode( QWidget *parent ) : QWidget( parent ), menu(0) + { + message = tr("Safe Mode"); + QFont f( font() ); + f.setWeight( QFont::Bold ); + setFont( f ); + } + + void mousePressEvent( QMouseEvent *); + QSize sizeHint() const; + void paintEvent( QPaintEvent* ); + +private slots: + void action(int i); + +private: + QString message; + QPopupMenu *menu; +}; + +void SafeMode::mousePressEvent( QMouseEvent *) +{ + if ( !menu ) { + menu = new QPopupMenu(this); + menu->insertItem( tr("Plugin Manager..."), 0 ); + menu->insertItem( tr("Restart Qtopia"), 1 ); + menu->insertItem( tr("Help..."), 2 ); + connect(menu, SIGNAL(activated(int)), this, SLOT(action(int))); + } + QPoint curPos = mapToGlobal( QPoint(0,0) ); + QSize sh = menu->sizeHint(); + menu->popup( curPos-QPoint((sh.width()-width())/2,sh.height()) ); +} + +void SafeMode::action(int i) +{ + switch (i) { + case 0: + Global::execute( "pluginmanager" ); + break; + case 1: + Global::restart(); + break; + case 2: + Global::execute( "helpbrowser", "safemode.html" ); + break; + } +} + +QSize SafeMode::sizeHint() const +{ + QFontMetrics fm = fontMetrics(); + + return QSize( fm.width(message), fm.height() ); +} + +void SafeMode::paintEvent( QPaintEvent* ) +{ + QPainter p(this); + p.drawText( rect(), AlignCenter, message ); +} + +//--------------------------------------------------------------------------- + class LockKeyState : public QWidget { public: LockKeyState( QWidget *parent ) : - QWidget(parent), - nl(initNumLock()), cl(FALSE) + QWidget(parent), + nl(initNumLock()), cl(FALSE) { - nl_pm = Resource::loadPixmap("numlock"); - cl_pm = Resource::loadPixmap("capslock"); + nl_pm = Resource::loadPixmap("numlock"); + cl_pm = Resource::loadPixmap("capslock"); } QSize sizeHint() const { - return QSize(nl_pm.width()+2,nl_pm.width()+nl_pm.height()+1); + return QSize(nl_pm.width()+2,nl_pm.width()+nl_pm.height()+1); } void toggleNumLockState() { - nl = !nl; repaint(); + nl = !nl; repaint(); } void toggleCapsLockState() { - cl = !cl; repaint(); + cl = !cl; repaint(); } void paintEvent( QPaintEvent * ) { - int y = (height()-sizeHint().height())/2; - QPainter p(this); - if ( nl ) - p.drawPixmap(1,y,nl_pm); - if ( cl ) - p.drawPixmap(1,y+nl_pm.height()+1,cl_pm); + int y = (height()-sizeHint().height())/2; + QPainter p(this); + if ( nl ) + p.drawPixmap(1,y,nl_pm); + if ( cl ) + p.drawPixmap(1,y+nl_pm.height()+1,cl_pm); } private: QPixmap nl_pm, cl_pm; bool nl, cl; }; +//--------------------------------------------------------------------------- + TaskBar::~TaskBar() { } TaskBar::TaskBar() : QHBox(0, 0, WStyle_Customize | WStyle_Tool | WStyle_StaysOnTop | WGroupLeader) { - Global::setBuiltinCommands(builtins); - sm = new StartMenu( this ); + connect( sm, SIGNAL(tabSelected(const QString&)), this, + SIGNAL(tabSelected(const QString&)) ); inputMethods = new InputMethods( this ); connect( inputMethods, SIGNAL(inputToggled(bool)), - this, SLOT(calcMaxWindowRect()) ); + this, SLOT(calcMaxWindowRect()) ); stack = new QWidgetStack( this ); stack->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Minimum ) ); label = new QLabel(stack); runningAppBar = new RunningAppBar(stack); stack->raiseWidget(runningAppBar); waitIcon = new Wait( this ); (void) new AppIcons( this ); sysTray = new SysTray( this ); - // ## make customizable in some way? + /* ### FIXME plugin loader and safe mode */ +#if 0 + if (PluginLoader::inSafeMode()) + (void)new SafeMode( this ); +#endif + + // ## make customizable in some way? +#ifdef QT_QWS_CUSTOM lockState = new LockKeyState( this ); +#else + lockState = 0; +#endif #if defined(Q_WS_QWS) #if !defined(QT_NO_COP) QCopChannel *channel = new QCopChannel( "QPE/TaskBar", this ); connect( channel, SIGNAL(received(const QCString&, const QByteArray&)), - this, SLOT(receive(const QCString&, const QByteArray&)) ); + this, SLOT(receive(const QCString&, const QByteArray&)) ); #endif #endif waitTimer = new QTimer( this ); connect( waitTimer, SIGNAL( timeout() ), this, SLOT( stopWait() ) ); clearer = new QTimer( this ); QObject::connect(clearer, SIGNAL(timeout()), SLOT(clearStatusBar())); - QObject::connect(clearer, SIGNAL(timeout()), sysTray, SLOT(show())); + + connect( qApp, SIGNAL(symbol()), this, SLOT(toggleSymbolInput()) ); + connect( qApp, SIGNAL(numLockStateToggle()), this, SLOT(toggleNumLockState()) ); + connect( qApp, SIGNAL(capsLockStateToggle()), this, SLOT(toggleCapsLockState()) ); } void TaskBar::setStatusMessage( const QString &text ) { if ( !text.isEmpty() ) { label->setText( text ); stack->raiseWidget( label ); if ( sysTray && ( label->fontMetrics().width( text ) > label->width() ) ) sysTray->hide(); clearer->start( 3000, TRUE ); } else { clearStatusBar(); } } void TaskBar::clearStatusBar() { label->clear(); stack->raiseWidget(runningAppBar); - // stack->raiseWidget( mru ); + if ( sysTray ) + sysTray->show(); + // stack->raiseWidget( mru ); } void TaskBar::startWait() { waitIcon->setWaiting( true ); // a catchall stop after 10 seconds... waitTimer->start( 10 * 1000, true ); } -void TaskBar::stopWait(const QString& /*app*/) +void TaskBar::stopWait(const QString&) { waitTimer->stop(); - //mru->addTask(sm->execToLink(app)); waitIcon->setWaiting( false ); } void TaskBar::stopWait() { waitTimer->stop(); - waitIcon->setWaiting( false ); } +/* + * This resizeEvent will be captured by + * the ServerInterface and it'll layout + * and calc rect. Now if we go from bigger + * to smaller screen the SysTray is out of + * bounds and repaint() won't trigger an Event + */ void TaskBar::resizeEvent( QResizeEvent *e ) { + if ( sysTray ) + sysTray->hide(); + QHBox::resizeEvent( e ); - calcMaxWindowRect(); + + if ( sysTray ) + sysTray->show(); + + qWarning("TaskBar::resize event"); } void TaskBar::styleChange( QStyle &s ) { QHBox::styleChange( s ); calcMaxWindowRect(); } void TaskBar::calcMaxWindowRect() { + /* #ifdef Q_WS_QWS QRect wr; int displayWidth = qApp->desktop()->width(); QRect ir = inputMethods->inputRect(); if ( ir.isValid() ) { - wr.setCoords( 0, 0, displayWidth-1, ir.top()-1 ); + wr.setCoords( 0, 0, displayWidth-1, ir.top()-1 ); } else { - wr.setCoords( 0, 0, displayWidth-1, y()-1 ); + wr.setCoords( 0, 0, displayWidth-1, y()-1 ); } -#if QT_VERSION < 300 +#if QT_VERSION < 0x030000 QWSServer::setMaxWindowRect( qt_screen->mapToDevice(wr, - QSize(qt_screen->width(),qt_screen->height())) - ); + QSize(qt_screen->width(),qt_screen->height())) + ); #else QWSServer::setMaxWindowRect( wr ); #endif #endif + */ } void TaskBar::receive( const QCString &msg, const QByteArray &data ) { QDataStream stream( data, IO_ReadOnly ); if ( msg == "message(QString)" ) { QString text; stream >> text; setStatusMessage( text ); } else if ( msg == "hideInputMethod()" ) { - inputMethods->hideInputMethod(); + inputMethods->hideInputMethod(); } else if ( msg == "showInputMethod()" ) { - inputMethods->showInputMethod(); + inputMethods->showInputMethod(); + } else if ( msg == "showInputMethod(QString)" ) { + QString name; + stream >> name; + inputMethods->showInputMethod(name); } else if ( msg == "reloadInputMethods()" ) { - inputMethods->loadInputMethods(); - } else if ( msg == "toggleInputMethod()" ) { - inputMethods->shown() ? inputMethods->hideInputMethod() : inputMethods->showInputMethod(); - } else if ( msg == "reloadApps()" ) { - sm->reloadApps(); + inputMethods->loadInputMethods(); } else if ( msg == "reloadApplets()" ) { - sysTray->clearApplets(); - sysTray->addApplets(); - sm->reloadApplets(); - } else if ( msg == "soundAlarm()" ) { - DesktopApplication::soundAlarm ( ); - } - else if ( msg == "setLed(int,bool)" ) { - int led, status; - stream >> led >> status; - - QValueList <OLed> ll = ODevice::inst ( )-> ledList ( ); - if ( ll. count ( )) { - OLed l = ll. contains ( Led_Mail ) ? Led_Mail : ll [0]; - bool canblink = ODevice::inst ( )-> ledStateList ( l ). contains ( Led_BlinkSlow ); - - ODevice::inst ( )-> setLedState ( l, status ? ( canblink ? Led_BlinkSlow : Led_On ) : Led_Off ); - } - } - else if ( msg == "toggleMenu()" ) { - if ( sm-> launchMenu-> isVisible ( )) - sm-> launch ( ); - else { - QCopEnvelope e ( "QPE/System", "toggleApplicationMenu()" ); - } - } - else if ( msg == "toggleStartMenu()" ) { - sm-> launch ( ); - } + sysTray->clearApplets(); + sm->createMenu(); + sysTray->addApplets(); + }else if ( msg == "toggleMenu()" ) { + if ( sm-> launchMenu-> isVisible() ) + sm-> launch(); + else + QCopEnvelope e( "QPE/System", "toggleApplicationMenu()" ); + }else if ( msg == "toggleStartMenu()" ) + sm->launch(); } -QWidget *TaskBar::calibrate(bool) +void TaskBar::setApplicationState( const QString &name, ServerInterface::ApplicationState state ) { -#ifdef Q_WS_QWS - Calibrate *c = new Calibrate; - c->show(); - return c; -#else - return 0; -#endif + if ( state == ServerInterface::Launching ) + runningAppBar->applicationLaunched( name ); + else if ( state == ServerInterface::Terminated ) + runningAppBar->applicationTerminated( name ); } void TaskBar::toggleNumLockState() { if ( lockState ) lockState->toggleNumLockState(); } void TaskBar::toggleCapsLockState() { if ( lockState ) lockState->toggleCapsLockState(); } void TaskBar::toggleSymbolInput() { - if ( inputMethods->currentShown() == "Unicode" ) { - inputMethods->hideInputMethod(); + QString unicodeInput = qApp->translate( "InputMethods", "Unicode" ); + if ( inputMethods->currentShown() == unicodeInput ) { + inputMethods->hideInputMethod(); } else { - inputMethods->showInputMethod("Unicode"); + inputMethods->showInputMethod( unicodeInput ); } } -bool TaskBar::recoverMemory() -{ - //mru->quitOldApps() is no longer supported - return true; -} - +#include "taskbar.moc" |