From 15318cad33835e4e2dc620d033e43cd930676cdd Mon Sep 17 00:00:00 2001 From: kergoth Date: Fri, 25 Jan 2002 22:14:26 +0000 Subject: Initial revision --- (limited to 'core/launcher/taskbar.cpp') diff --git a/core/launcher/taskbar.cpp b/core/launcher/taskbar.cpp new file mode 100644 index 0000000..d7f36bd --- a/dev/null +++ b/core/launcher/taskbar.cpp @@ -0,0 +1,314 @@ +/********************************************************************** +** Copyright (C) 2000 Trolltech AS. All rights reserved. +** +** This file is part of 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 "mrulist.h" +#include "systray.h" +#include "calibrate.h" +#include "wait.h" +#include "appicons.h" + +#include "taskbar.h" +#include "desktop.h" + +#include +#include +#include +#ifdef QT_QWS_CUSTOM +#include +#endif + +#include +#include +#include +#include +#include + +#if defined( Q_WS_QWS ) +#include +#include +#endif + + +#define FACTORY(T) \ + static QWidget *new##T( bool maximized ) { \ + QWidget *w = new T( 0, "test", QWidget::WDestructiveClose | QWidget::WGroupLeader ); \ + if ( maximized ) { \ + if ( qApp->desktop()->width() <= 350 ) { \ + w->showMaximized(); \ + } else { \ + w->resize( QSize( 300, 300 ) ); \ + } \ + } \ + w->show(); \ + return w; \ + } + + +#ifdef SINGLE_APP +#define APP(a,b,c,d) FACTORY(b) +#include "../taskbar/apps.h" +#undef APP +#endif // SINGLE_APP + +static Global::Command builtins[] = { + +#ifdef SINGLE_APP +#define APP(a,b,c,d) { a, new##b, c }, +#include "../taskbar/apps.h" +#undef APP +#endif + +#if defined(QT_QWS_IPAQ) || defined(QT_QWS_CASSIOPEIA) || defined(QT_QWS_EBX) + { "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 LockKeyState : public QWidget +{ +public: + LockKeyState( QWidget *parent ) : + QWidget(parent), + nl(initNumLock()), cl(FALSE) + { + 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); + } + void toggleNumLockState() + { + nl = !nl; repaint(); + } + void toggleCapsLockState() + { + 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); + } +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 ); + + inputMethods = new InputMethods( this ); + connect( inputMethods, SIGNAL(inputToggled(bool)), + this, SLOT(calcMaxWindowRect()) ); + //new QuickLauncher( this ); + + stack = new QWidgetStack( this ); + stack->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Minimum ) ); + label = new QLabel(stack); + + mru = new MRUList( stack ); + stack->raiseWidget( mru ); + + waitIcon = new Wait( this ); + (void) new AppIcons( this ); + + sysTray = new SysTray( this ); + + // ## 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&)) ); +#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())); +} + +void TaskBar::setStatusMessage( const QString &text ) +{ + label->setText( text ); + stack->raiseWidget( label ); + if ( sysTray && ( label->fontMetrics().width( text ) > label->width() ) ) + sysTray->hide(); + clearer->start( 3000 ); +} + +void TaskBar::clearStatusBar() +{ + label->clear(); + 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) +{ + waitTimer->stop(); + mru->addTask(sm->execToLink(app)); + waitIcon->setWaiting( false ); +} + +void TaskBar::stopWait() +{ + waitTimer->stop(); + waitIcon->setWaiting( false ); +} + +void TaskBar::resizeEvent( QResizeEvent *e ) +{ + QHBox::resizeEvent( e ); + calcMaxWindowRect(); +} + +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 ); + } else { + wr.setCoords( 0, 0, displayWidth-1, y()-1 ); + } + +#if QT_VERSION < 300 + QWSServer::setMaxWindowRect( qt_screen->mapToDevice(wr, + 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(); + } else if ( msg == "showInputMethod()" ) { + inputMethods->showInputMethod(); + } else if ( msg == "reloadInputMethods()" ) { + inputMethods->loadInputMethods(); + } else if ( msg == "reloadApplets()" ) { + sysTray->loadApplets(); + } else if ( msg == "soundAlarm()" ) { + Desktop::soundAlarm(); + } +#ifdef CUSTOM_LEDS + else if ( msg == "setLed(int,bool)" ) { + int led, status; + stream >> led >> status; + CUSTOM_LEDS( led, status ); + } +#endif +} + +QWidget *TaskBar::calibrate(bool) +{ +#ifdef Q_WS_QWS + Calibrate *c = new Calibrate; + c->show(); + return c; +#else + return 0; +#endif +} + +void TaskBar::toggleNumLockState() +{ + if ( lockState ) lockState->toggleNumLockState(); +} + +void TaskBar::toggleCapsLockState() +{ + if ( lockState ) lockState->toggleCapsLockState(); +} + +void TaskBar::toggleSymbolInput() +{ + if ( inputMethods->currentShown() == "Unicode" ) { + inputMethods->hideInputMethod(); + } else { + inputMethods->showInputMethod("Unicode"); + } +} + +bool TaskBar::recoverMemory() +{ + return mru->quitOldApps(); +} + -- cgit v0.9.0.2