summaryrefslogtreecommitdiff
authorsandman <sandman>2002-10-02 22:06:33 (UTC)
committer sandman <sandman>2002-10-02 22:06:33 (UTC)
commitb757807635fddb4824eabd87f72c96a0929c5cb1 (patch) (side-by-side diff)
tree831e4870fe1562507540b386cbcbd1ea93ecb9a8
parent2682a282dc87074bdc61d241d5b2d76e8533982c (diff)
downloadopie-b757807635fddb4824eabd87f72c96a0929c5cb1.zip
opie-b757807635fddb4824eabd87f72c96a0929c5cb1.tar.gz
opie-b757807635fddb4824eabd87f72c96a0929c5cb1.tar.bz2
- Qtopia 1.6 launcher merge (again - should be finished soon)
- Support for O-Menu applets (similiar to Taskbar applets)
Diffstat (more/less context) (show whitespace changes)
-rw-r--r--core/launcher/desktop.cpp18
-rw-r--r--core/launcher/desktop.h2
-rw-r--r--core/launcher/startmenu.cpp252
-rw-r--r--core/launcher/startmenu.h31
-rw-r--r--core/launcher/systray.cpp2
-rw-r--r--core/launcher/taskbar.cpp11
6 files changed, 288 insertions, 28 deletions
diff --git a/core/launcher/desktop.cpp b/core/launcher/desktop.cpp
index 68949e6..1a33b36 100644
--- a/core/launcher/desktop.cpp
+++ b/core/launcher/desktop.cpp
@@ -319,128 +319,131 @@ private:
void DesktopApplication::switchLCD ( bool on )
{
if ( qApp ) {
DesktopApplication *dapp = (DesktopApplication *) qApp;
if ( dapp-> m_screensaver ) {
if ( on )
dapp-> m_screensaver-> restore ( ); //setBacklight ( on ? -3 : -1 );
else
dapp-> m_screensaver-> save ( 1 );
}
}
}
DesktopApplication::DesktopApplication( int& argc, char **argv, Type appType )
: QPEApplication( argc, argv, appType )
{
QTimer * t = new QTimer( this );
connect( t, SIGNAL( timeout() ), this, SLOT( psTimeout() ) );
t->start( 10000 );
ps = new PowerStatus;
pa = new DesktopPowerAlerter( 0 );
channel = new QCopChannel( "QPE/Desktop", this );
connect( channel, SIGNAL( received( const QCString&, const QByteArray& ) ),
this, SLOT( desktopMessage( const QCString&, const QByteArray& ) ) );
channel = new QCopChannel( "QPE/System", this );
connect( channel, SIGNAL( received( const QCString&, const QByteArray& ) ),
this, SLOT( systemMessage( const QCString&, const QByteArray& ) ) );
m_screensaver = new QPEScreenSaver;
m_screensaver-> setInterval ( -1 );
QWSServer::setScreenSaver( m_screensaver );
}
DesktopApplication::~DesktopApplication()
{
delete ps;
delete pa;
}
void DesktopApplication::desktopMessage( const QCString &msg, const QByteArray &data )
{
#ifdef Q_WS_QWS
QDataStream stream( data, IO_ReadOnly );
if ( msg == "keyRegister(int key, QString channel, QString message)" ) {
int k;
QString c, m;
stream >> k;
stream >> c;
stream >> m;
qWarning( "KeyRegisterReceived: %i, %s, %s", k, ( const char* ) c, ( const char * ) m );
keyRegisterList.append( QCopKeyRegister( k, c, m ) );
}
else if ( msg == "suspend()" ) {
emit power();
}
+ else if ( msg == "home()" ) {
+ qpedesktop-> home ( );
+ }
#endif
}
void DesktopApplication::systemMessage( const QCString & msg, const QByteArray & data )
{
#ifdef Q_WS_QWS
QDataStream stream ( data, IO_ReadOnly );
if ( msg == "setScreenSaverInterval(int)" ) {
int time;
stream >> time;
m_screensaver-> setInterval( time );
}
else if ( msg == "setScreenSaverIntervals(int,int,int)" ) {
int t1, t2, t3;
stream >> t1 >> t2 >> t3;
m_screensaver-> setIntervals( t1, t2, t3 );
}
else if ( msg == "setBacklight(int)" ) {
int bright;
stream >> bright;
m_screensaver-> setBacklight( bright );
}
else if ( msg == "setScreenSaverMode(int)" ) {
int mode;
stream >> mode;
m_screensaver-> setMode ( mode );
}
#endif
}
enum MemState { Unknown, VeryLow, Low, Normal } memstate = Unknown;
#ifdef Q_WS_QWS
bool DesktopApplication::qwsEventFilter( QWSEvent *e )
{
qpedesktop->checkMemory();
if ( e->type == QWSEvent::Key ) {
QWSKeyEvent * ke = ( QWSKeyEvent * ) e;
if ( !loggedin && ke->simpleData.keycode != Key_F34 )
return TRUE;
bool press = ke->simpleData.is_press;
bool autoRepeat = ke->simpleData.is_auto_repeat;
/*
app that registers key/message to be sent back to the app, when it doesn't have focus,
when user presses key, unless keyboard has been requested from app.
will not send multiple repeats if user holds key
i.e. one shot
*/
if ( !keyRegisterList.isEmpty() && ke->simpleData.keycode !=0 && press) {
// qDebug("<<<<<<<<<<<<<keycode %d", ke->simpleData.keycode);
KeyRegisterList::Iterator it;
for ( it = keyRegisterList.begin(); it != keyRegisterList.end(); ++it ) {
if ( ( *it ).getKeyCode() == ke->simpleData.keycode && !autoRepeat && !keyboardGrabbed() ) {
if ( press )
qDebug( "press" );
else
qDebug( "release" );
QCopEnvelope( ( *it ).getChannel().utf8(), ( *it ).getMessage().utf8() );
}
}
@@ -656,248 +659,255 @@ void Desktop::checkMemory()
return ; // don't show a second message while still on first
existingMessage = TRUE;
switch ( memstate ) {
case Unknown:
break;
case Low:
memstate = Unknown;
if ( recoverMemory() )
ignoreNormal = TRUE;
else
QMessageBox::warning( 0 , "Memory Status",
"The memory smacks of shortage. \n"
"Please save data. " );
break;
case Normal:
memstate = Unknown;
if ( ignoreNormal )
ignoreNormal = FALSE;
else
QMessageBox::information ( 0 , "Memory Status",
"There is enough memory again." );
break;
case VeryLow:
memstate = Unknown;
QMessageBox::critical( 0 , "Memory Status",
"The memory is very low. \n"
"Please end this application \n"
"immediately." );
recoverMemory();
}
existingMessage = FALSE;
#endif
}
static bool isVisibleWindow( int wid )
{
const QList<QWSWindow> &list = qwsServer->clientWindows();
QWSWindow* w;
for ( QListIterator<QWSWindow> it( list ); ( w = it.current() ); ++it ) {
if ( w->winId() == wid )
return !w->isFullyObscured();
}
return FALSE;
}
static bool hasVisibleWindow( const QString& clientname )
{
const QList<QWSWindow> &list = qwsServer->clientWindows();
QWSWindow* w;
for ( QListIterator<QWSWindow> it( list ); ( w = it.current() ); ++it ) {
if ( w->client() ->identity() == clientname && !w->isFullyObscured() )
return TRUE;
}
return FALSE;
}
void Desktop::raiseLauncher()
{
Config cfg( "qpe" ); //F12 'Home'
cfg.setGroup( "AppsKey" );
QString tempItem;
tempItem = cfg.readEntry( "Middle", "Home" );
if ( tempItem == "Home" || tempItem.isEmpty() ) {
- if ( isVisibleWindow( launcher->winId() ) )
- launcher->nextView();
- else
- launcher->raise();
+ home ( );
}
else {
QCopEnvelope e( "QPE/System", "execute(QString)" );
e << tempItem;
}
}
+void Desktop::home ( )
+{
+ if ( isVisibleWindow( launcher->winId() ) )
+ launcher->nextView();
+ else
+ launcher->raise();
+}
+
void Desktop::executeOrModify( const QString& appLnkFile )
{
AppLnk lnk( MimeType::appsFolderName() + "/" + appLnkFile );
if ( lnk.isValid() ) {
QCString app = lnk.exec().utf8();
Global::terminateBuiltin( "calibrate" );
if ( QCopChannel::isRegistered( "QPE/Application/" + app ) ) {
// MRUList::addTask( &lnk );
if ( hasVisibleWindow( app ) )
QCopChannel::send( "QPE/Application/" + app, "nextView()" );
else
QCopChannel::send( "QPE/Application/" + app, "raise()" );
}
else {
lnk.execute();
}
}
}
void Desktop::raiseDatebook()
{
Config cfg( "qpe" ); //F9 'Activity'
cfg.setGroup( "AppsKey" );
QString tempItem;
tempItem = cfg.readEntry( "LeftEnd" , "Calendar" );
if ( tempItem == "Calendar" || tempItem.isEmpty() ) {
tempItem = "datebook";
}
QCopEnvelope e( "QPE/System", "execute(QString)" );
e << tempItem;
}
void Desktop::raiseContacts()
{
Config cfg( "qpe" ); //F10, 'Contacts'
cfg.setGroup( "AppsKey" );
QString tempItem;
tempItem = cfg.readEntry( "Left2nd", "Address Book" );
if ( tempItem == "Address Book" || tempItem.isEmpty() ) {
tempItem = "addressbook";
}
QCopEnvelope e( "QPE/System", "execute(QString)" );
e << tempItem;
}
void Desktop::raiseMenu()
{
Config cfg( "qpe" ); //F11, 'Menu
cfg.setGroup( "AppsKey" );
QString tempItem;
tempItem = cfg.readEntry( "Right2nd" , "Popup Menu" );
if ( tempItem == "Popup Menu" || tempItem.isEmpty() ) {
Global::terminateBuiltin( "calibrate" );
tb->startMenu() ->launch();
}
else {
QCopEnvelope e( "QPE/System", "execute(QString)" );
e << tempItem;
}
}
void Desktop::raiseEmail()
{
Config cfg( "qpe" ); //F13, 'Mail' // only in zaurus, on ipaq mail key is F11
cfg.setGroup( "AppsKey" );
QString tempItem;
tempItem = cfg.readEntry( "RightEnd", "Mail" );
if ( tempItem == "Mail" || tempItem == "qtmail" || tempItem.isEmpty() ) {
tempItem = "mail";
}
QCopEnvelope e( "QPE/System", "execute(QString)" );
e << tempItem;
}
// autoStarts apps on resume and start
void Desktop::execAutoStart()
{
QString appName;
int delay;
QDateTime now = QDateTime::currentDateTime();
Config cfg( "autostart" );
cfg.setGroup( "AutoStart" );
appName = cfg.readEntry( "Apps", "" );
delay = ( cfg.readEntry( "Delay", "0" ) ).toInt();
// If the time between suspend and resume was longer then the
// value saved as delay, start the app
if ( suspendTime.secsTo( now ) >= ( delay * 60 ) && !appName.isEmpty() ) {
QCopEnvelope e( "QPE/System", "execute(QString)" );
e << QString( appName );
}
}
#if defined(QPE_HAVE_TOGGLELIGHT)
#include <qpe/config.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
#include <linux/ioctl.h>
#include <time.h>
#endif
void Desktop::togglePower()
{
static bool excllock = false;
+ qDebug ( "togglePower (locked == %d)", excllock ? 1 : 0 );
+
if ( excllock )
return ;
excllock = true;
bool wasloggedin = loggedin;
loggedin = 0;
suspendTime = QDateTime::currentDateTime();
ODevice::inst ( ) -> suspend ( );
QWSServer::screenSaverActivate ( false );
DesktopApplication::switchLCD ( true ); // force LCD on without slow qcop call
{
QCopEnvelope( "QPE/Card", "mtabChanged()" ); // might have changed while asleep
}
if ( wasloggedin )
login( TRUE );
execAutoStart();
//qcopBridge->closeOpenConnections();
excllock = false;
}
void Desktop::toggleLight()
{
QCopEnvelope e( "QPE/System", "setBacklight(int)" );
e << -2; // toggle
}
void Desktop::toggleSymbolInput()
{
tb->toggleSymbolInput();
}
void Desktop::toggleNumLockState()
{
tb->toggleNumLockState();
}
void Desktop::toggleCapsLockState()
{
tb->toggleCapsLockState();
}
void Desktop::styleChange( QStyle &s )
{
QWidget::styleChange( s );
int displayw = qApp->desktop() ->width();
int displayh = qApp->desktop() ->height();
QSize sz = tb->sizeHint();
tb->setGeometry( 0, displayh - sz.height(), displayw, sz.height() );
}
void DesktopApplication::shutdown()
{
if ( type() != GuiServer )
return ;
ShutdownImpl *sd = new ShutdownImpl( 0, 0, WDestructiveClose );
diff --git a/core/launcher/desktop.h b/core/launcher/desktop.h
index f7c3e3f..09ffe1c 100644
--- a/core/launcher/desktop.h
+++ b/core/launcher/desktop.h
@@ -57,88 +57,90 @@ signals:
void backlight();
void power();
void symbol();
void numLockStateToggle();
void capsLockStateToggle();
void prepareForRestart();
protected:
#ifdef Q_WS_QWS
bool qwsEventFilter( QWSEvent * );
#endif
void shutdown();
void restart();
public slots:
virtual void desktopMessage ( const QCString &msg, const QByteArray &data );
virtual void systemMessage ( const QCString &msg, const QByteArray &data );
protected slots:
void shutdown( ShutdownImpl::Type );
void psTimeout();
void sendCard();
private:
DesktopPowerAlerter *pa;
PowerStatus *ps;
QTimer *cardSendTimer;
QCopChannel *channel;
QPEScreenSaver *m_screensaver;
};
class Desktop : public QWidget
{
Q_OBJECT
public:
Desktop();
~Desktop();
static bool screenLocked();
void show();
void checkMemory();
void keyClick();
void screenClick();
static void soundAlarm();
public slots:
void raiseDatebook();
void raiseContacts();
void raiseMenu();
void raiseLauncher();
void raiseEmail();
void execAutoStart();
void togglePower();
void toggleLight();
void toggleNumLockState();
void toggleCapsLockState();
void toggleSymbolInput();
void terminateServers();
void rereadVolumes();
+ void home ( );
+
protected:
void executeOrModify( const QString& appLnkFile );
void styleChange( QStyle & );
void timerEvent( QTimerEvent *e );
QWidget *bg;
Launcher *launcher;
TaskBar *tb;
private:
void startTransferServer();
bool recoverMemory();
QCopBridge *qcopBridge;
TransferServer *transferServer;
PackageSlave *packageSlave;
QDateTime suspendTime;
bool keyclick, touchclick, alarmsound;
};
#endif // __DESKTOP_H__
diff --git a/core/launcher/startmenu.cpp b/core/launcher/startmenu.cpp
index b008a30..647d0f2 100644
--- a/core/launcher/startmenu.cpp
+++ b/core/launcher/startmenu.cpp
@@ -1,171 +1,385 @@
/**********************************************************************
-** 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.
**
**********************************************************************/
+#define INCLUDE_MENUITEM_DEF
+
#include "startmenu.h"
#include "sidething.h"
//#include "mrulist.h"
#include "info.h"
#include <qpe/qpeapplication.h>
#include <qpe/config.h>
#include <qpe/applnk.h>
#include <qpe/global.h>
#include <qpe/resource.h>
+#include <qpe/qlibrary.h>
-#include <qdict.h>
+#include <qintdict.h>
+#include <qdir.h>
#include <stdlib.h>
// #define USE_CONFIG_FILE
StartMenu::StartMenu(QWidget *parent) : QLabel( parent )
{
loadOptions();
- setPixmap( Resource::loadPixmap( startButtonPixmap ) );
+ int sz = AppLnk::smallIconSize()+3;
+ QPixmap pm;
+ pm.convertFromImage(Resource::loadImage(startButtonPixmap).smoothScale(sz,sz));
+ setPixmap(pm);
setFocusPolicy( NoFocus );
//setFlat( startButtonIsFlat );
- apps = new AppLnkSet( QPEApplication::qpeDir() + "apps" );
+ apps = 0;
+ launchMenu = 0;
+ applets. setAutoDelete ( true );
+ sepId = 0;
- createMenu();
+ reloadApps ( );
+ reloadApplets ( );
}
void StartMenu::mousePressEvent( QMouseEvent * )
{
launch();
if (desktopInfo)
desktopInfo->menuClicked();
}
StartMenu::~StartMenu()
{
delete apps;
}
void StartMenu::loadOptions()
{
#ifdef USE_CONFIG_FILE
// Read configuration file
Config config("StartMenu");
config.setGroup( "StartMenu" );
QString tmpBoolString1 = config.readEntry( "UseWidePopupMenu", "FALSE" );
useWidePopupMenu = ( tmpBoolString1 == "TRUE" ) ? TRUE : FALSE;
QString tmpBoolString2 = config.readEntry( "StartButtonIsFlat", "TRUE" );
startButtonIsFlat = ( tmpBoolString2 == "TRUE" ) ? TRUE : FALSE;
-// QString tmpBoolString3 = config.readEntry( "UseMRUList", "TRUE" );
+ QString tmpBoolString3 = config.readEntry( "UseMRUList", "TRUE" );
popupMenuSidePixmap = config.readEntry( "PopupMenuSidePixmap", "launcher/sidebar" );
- startButtonPixmap = config.readEntry( "StartButtonPixmap", "go" );
+ startButtonPixmap = config.readEntry( "StartButtonPixmap", "launcher/start_button" );
#else
// Basically just #include the .qpe_menu.conf file settings
useWidePopupMenu = FALSE;
popupMenuSidePixmap = "launcher/sidebar";
startButtonIsFlat = TRUE;
- startButtonPixmap = "launcher/start_button";
+ startButtonPixmap = "launcher/start_button"; // No tr
#endif
}
void StartMenu::createMenu()
{
+ delete launchMenu;
if ( useWidePopupMenu )
launchMenu = new PopupWithLaunchSideThing( this, &popupMenuSidePixmap );
else
launchMenu = new StartPopupMenu( this );
loadMenu( apps, launchMenu );
+ loadApplets ( );
+
+ connect( launchMenu, SIGNAL(activated(int)), SLOT(itemSelected(int)) );
+}
+void StartMenu::reloadApps()
+{
+ Config cfg("StartMenu");
+ cfg.setGroup("Menu");
+ bool ltabs = cfg.readBoolEntry("LauncherTabs",TRUE);
+ bool lot = cfg.readBoolEntry("LauncherOther",TRUE);
+ bool lt = ltabs || lot;
+ if ( launchMenu && apps && !lt )
+ return; // nothing to do
+
+ if ( lt ) {
+ delete apps;
+ apps = new AppLnkSet( QPEApplication::qpeDir() + "apps" );
+ }
+ if ( launchMenu ) {
+ launchMenu-> hide ( );
+
+ for ( QIntDictIterator<QPopupMenu> it ( tabdict ); it. current ( ); ++it ) {
+ launchMenu-> removeItem ( it. currentKey ( ));
+ delete it.current ( );
+ }
+ tabdict. clear ( );
+ loadMenu(apps,launchMenu);
+ } else {
+ createMenu();
+ }
+}
+
+void StartMenu::reloadApplets()
+{
+ if ( launchMenu ) {
+ clearApplets ( );
+ loadApplets ( );
+ }
+ else
+ createMenu ( );
}
void StartMenu::itemSelected( int id )
{
const AppLnk *app = apps->find( id );
if ( app )
app->execute();
+ else {
+ MenuApplet *applet = applets. find ( id );
+
+ if ( applet )
+ applet-> iface-> activated ( );
+ }
}
bool StartMenu::loadMenu( AppLnkSet *folder, QPopupMenu *menu )
{
bool result = FALSE;
- QStringList typs = folder->types();
+ Config cfg("StartMenu");
+ cfg.setGroup("Menu");
+
+ bool ltabs = cfg.readBoolEntry("LauncherTabs",TRUE);
+ bool lot = cfg.readBoolEntry("LauncherOther",TRUE);
+
+ tabdict. clear ( );
+
+ if ( sepId )
+ menu-> removeItem ( sepId );
+ sepId = ( menu-> count ( )) ? menu-> insertSeparator ( 0 ) : 0;
+
+ if ( ltabs || lot ) {
QDict<QPopupMenu> typpop;
- for (QStringList::Iterator tit=typs.begin(); tit!=typs.end(); ++tit) {
+ QStringList typs = folder->types();
+ for (QStringList::Iterator tit=typs.fromLast(); ; --tit) {
if ( !(*tit).isEmpty() ) {
- QPopupMenu *new_menu = new StartPopupMenu( menu );
- typpop.insert(*tit, new_menu);
+ QPopupMenu *new_menu;
+ if ( ltabs ) {
+ new_menu = new StartPopupMenu( menu );
connect( new_menu, SIGNAL(activated(int)), SLOT(itemSelected(int)) );
- menu->insertItem( folder->typePixmap(*tit), folder->typeName(*tit), new_menu );
+ int id = menu->insertItem( folder->typePixmap(*tit), folder->typeName(*tit), new_menu, -1, 0 );
+ tabdict. insert ( id, new_menu );
+ } else {
+ new_menu = (QPopupMenu*)1;
}
+ typpop.insert(*tit, new_menu);
+ }
+ if ( tit == typs. begin ( ))
+ break;
}
-
QListIterator<AppLnk> it( folder->children() );
+ bool f=TRUE;
for ( ; it.current(); ++it ) {
AppLnk *app = it.current();
- if ( app->type() == "Separator" ) {
+ if ( app->type() == "Separator" ) { // No tr
+ if ( lot ) {
menu->insertSeparator();
+ }
} else {
+ f = FALSE;
QString t = app->type();
QPopupMenu* pmenu = typpop.find(t);
+ if ( ltabs ) {
+ if ( !pmenu && lot )
+ pmenu = menu;
+ } else {
if ( !pmenu )
pmenu = menu;
- pmenu->insertItem( app->pixmap(), app->name(), app->id() );
+ else
+ pmenu = 0;
+ }
+ if ( pmenu ) {
+ QString t = app->name();
+ t.replace(QRegExp("&"),"&&"); // escape shortcut character
+ pmenu->insertItem( app->pixmap(), t, app->id() );
+ }
result=TRUE;
}
}
+ }
- if ( result )
- connect( menu, SIGNAL(activated(int)), SLOT(itemSelected(int)) );
+ if ( sepId && ( menu-> idAt ( 0 ) == sepId )) { // no tabs entries
+ menu-> removeItem ( sepId );
+ sepId = 0;
+ }
+ if ( !menu-> count ( )) // if we don't do this QPopupMenu will insert a dummy Separator, which won't go away later
+ sepId = menu-> insertSeparator ( );
return result;
}
void StartMenu::launch()
{
int y = mapToGlobal( QPoint() ).y() - launchMenu->sizeHint().height();
if ( launchMenu->isVisible() )
launchMenu->hide();
else
launchMenu->popup( QPoint( 1, y ) );
}
const AppLnk* StartMenu::execToLink(const QString& appname)
{
const AppLnk* a = apps->findExec( appname );
return a;
}
void StartPopupMenu::keyPressEvent( QKeyEvent *e )
{
if ( e->key() == Key_F33 || e->key() == Key_Space ) {
// "OK" button, little hacky
QKeyEvent ke(QEvent::KeyPress, Key_Enter, 13, 0);
QPopupMenu::keyPressEvent( &ke );
} else {
QPopupMenu::keyPressEvent( e );
}
}
+
+static int compareAppletPositions(const void *a, const void *b)
+{
+ const MenuApplet* aa = *(const MenuApplet**)a;
+ const MenuApplet* ab = *(const MenuApplet**)b;
+ int d = ab->iface->position() - aa->iface->position();
+ if ( d ) return d;
+ return QString::compare(ab->library->library(),aa->library->library());
+}
+
+void StartMenu::clearApplets()
+{
+ launchMenu-> hide();
+
+ for ( QIntDictIterator<MenuApplet> it ( applets ); it. current ( ); ++it ) {
+ MenuApplet *applet = it. current ( );
+ if ( launchMenu ) {
+ launchMenu-> removeItem ( applet-> id );
+ delete applet-> popup;
+ }
+
+ applet-> iface-> release();
+ applet-> library-> unload();
+ delete applet-> library;
+ }
+ applets.clear();
+}
+
+
+
+void StartMenu::loadApplets()
+{
+ Config cfg( "StartMenu" );
+ cfg.setGroup( "Applets" );
+
+ // SafeMode causes too much problems, so we disable it for now --
+ // maybe we should reenable it for OPIE 1.0 - sandman 26.09.02
+
+ bool safe = false; //cfg.readBoolEntry("SafeMode",FALSE);
+ if ( safe && !safety_tid )
+ return;
+ cfg.writeEntry("SafeMode",TRUE);
+ cfg.write();
+ QStringList exclude = cfg.readListEntry( "ExcludeApplets", ',' );
+
+ QString path = QPEApplication::qpeDir() + "/plugins/applets";
+ QDir dir( path, "lib*.so" );
+ QStringList list = dir.entryList();
+ QStringList::Iterator it;
+ int napplets=0;
+ MenuApplet* *xapplets = new MenuApplet*[list.count()];
+ for ( it = list.begin(); it != list.end(); ++it ) {
+ if ( exclude.find( *it ) != exclude.end() )
+ continue;
+ MenuAppletInterface *iface = 0;
+ QLibrary *lib = new QLibrary( path + "/" + *it );
+ if (( lib->queryInterface( IID_MenuApplet, (QUnknownInterface**)&iface ) == QS_OK ) && iface ) {
+ MenuApplet *applet = new MenuApplet;
+ xapplets[napplets++] = applet;
+ applet->library = lib;
+ applet->iface = iface;
+ } else {
+ exclude += *it;
+ delete lib;
+ }
+ }
+ cfg.writeEntry( "ExcludeApplets", exclude, ',' );
+ qsort(xapplets,napplets,sizeof(applets[0]),compareAppletPositions);
+
+ if ( sepId )
+ launchMenu-> removeItem ( sepId );
+ sepId = ( launchMenu-> count ( )) ? launchMenu-> insertSeparator ( ) : 0;
+
+ while (napplets--) {
+ MenuApplet *applet = xapplets[napplets];
+ QString lang = getenv( "LANG" );
+ QTranslator * trans = new QTranslator(qApp);
+ QString type = (*it).left( (*it).find(".") );
+ QString tfn = QPEApplication::qpeDir()+"/i18n/"+lang+"/"+type+".qm";
+ if ( trans->load( tfn ))
+ qApp->installTranslator( trans );
+ else
+ delete trans;
+
+ applet-> popup = applet-> iface-> popup ( this );
+
+ if ( applet-> popup )
+ applet-> id = launchMenu-> insertItem ( applet-> iface-> icon ( ), applet-> iface-> text ( ), applet-> popup );
+ else
+ applet-> id = launchMenu-> insertItem ( applet-> iface-> icon ( ), applet-> iface-> text ( ) );
+ applets.insert ( applet-> id, new MenuApplet(*applet));
+ }
+ delete xapplets;
+
+ if ( sepId && ( launchMenu-> idAt ( launchMenu-> count ( ) - 1 ) == sepId )) { // no applets
+ launchMenu-> removeItem ( sepId );
+ sepId = 0;
+ }
+ if ( !launchMenu-> count ( )) // if we don't do this QPopupMenu will insert a dummy Separator, which won't go away later
+ sepId = launchMenu-> insertSeparator ( );
+
+ if ( !safety_tid )
+ safety_tid = startTimer(2000); // TT has 5000, but this is a PITA for a developer ;) (sandman)
+}
+
+void StartMenu::timerEvent(QTimerEvent* e)
+{
+ if ( e->timerId() == safety_tid ) {
+ Config cfg( "StartMenu" );
+ cfg.setGroup( "Applets" );
+ cfg.writeEntry( "SafeMode", FALSE );
+ killTimer(safety_tid);
+ safety_tid = 0;
+ }
+}
+
diff --git a/core/launcher/startmenu.h b/core/launcher/startmenu.h
index a02f39e..0a91bb8 100644
--- a/core/launcher/startmenu.h
+++ b/core/launcher/startmenu.h
@@ -1,76 +1,103 @@
/**********************************************************************
-** 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.
**
**********************************************************************/
#ifndef __START_MENU_H__
#define __START_MENU_H__
#include <qstring.h>
#include <qlist.h>
+#include <qintdict.h>
#include <qlabel.h>
#include <qpopupmenu.h>
+#include <qpe/menuappletinterface.h>
class AppLnkSet;
class AppLnk;
class StartPopupMenu : public QPopupMenu
{
public:
StartPopupMenu( QWidget *parent ) : QPopupMenu( parent ) {}
protected:
void keyPressEvent( QKeyEvent *e );
};
+class QLibrary;
+
+struct MenuApplet
+{
+#ifndef QT_NO_COMPONENT
+ QLibrary *library;
+#endif
+ MenuAppletInterface *iface;
+ int id;
+ QPopupMenu *popup;
+};
+
+
class StartMenu : public QLabel {
Q_OBJECT
public:
StartMenu( QWidget * );
~StartMenu();
const AppLnk* execToLink(const QString& appname);
public:
StartPopupMenu *launchMenu;
public slots:
void launch( );
void loadOptions( );
void createMenu( );
+ void reloadApps( );
+ void reloadApplets( );
protected slots:
void itemSelected( int id );
protected:
virtual void mousePressEvent( QMouseEvent * );
+ virtual void timerEvent ( QTimerEvent * );
private:
bool loadMenu( AppLnkSet *folder, QPopupMenu *menu );
+ void loadApplets( );
+ void clearApplets( );
private:
bool useWidePopupMenu;
QString popupMenuSidePixmap;
bool startButtonIsFlat;
QString startButtonPixmap;
AppLnkSet *apps;
+
+ QIntDict<MenuApplet> applets;
+ QIntDict<QPopupMenu> tabdict;
+
+// QValueList<MenuApplet> appletList;
+ int safety_tid;
+ int sepId;
};
#endif // __START_MENU_H__
diff --git a/core/launcher/systray.cpp b/core/launcher/systray.cpp
index 697971d..406c662 100644
--- a/core/launcher/systray.cpp
+++ b/core/launcher/systray.cpp
@@ -41,112 +41,112 @@ SysTray::SysTray( QWidget *parent ) : QFrame( parent ), layout(0)
//setFrameStyle( QFrame::Panel | QFrame::Sunken );
loadApplets();
}
static int compareAppletPositions(const void *a, const void *b)
{
const TaskbarApplet* aa = *(const TaskbarApplet**)a;
const TaskbarApplet* ab = *(const TaskbarApplet**)b;
int d = ab->iface->position() - aa->iface->position();
if ( d ) return d;
return QString::compare(ab->library->library(),aa->library->library());
}
void SysTray::loadApplets()
{
clearApplets();
addApplets();
}
void SysTray::clearApplets()
{
hide();
#ifndef SINGLE_APP
QValueList<TaskbarApplet>::Iterator mit;
for ( mit = appletList.begin(); mit != appletList.end(); ++mit ) {
(*mit).iface->release();
(*mit).library->unload();
delete (*mit).library;
}
#endif
appletList.clear();
if ( layout )
delete layout;
layout = new QHBoxLayout( this, 0, 1 );
layout->setAutoAdd(TRUE);
}
void SysTray::addApplets()
{
#ifndef SINGLE_APP
Config cfg( "Taskbar" );
cfg.setGroup( "Applets" );
// SafeMode causes too much problems, so we disable it for now --
// maybe we should reenable it for OPIE 1.0 - sandman 26.09.02
bool safe = false; //cfg.readBoolEntry("SafeMode",FALSE);
if ( safe && !safety_tid )
return;
cfg.writeEntry("SafeMode",TRUE);
cfg.write();
QStringList exclude = cfg.readListEntry( "ExcludeApplets", ',' );
QString path = QPEApplication::qpeDir() + "/plugins/applets";
QDir dir( path, "lib*.so" );
QStringList list = dir.entryList();
QStringList::Iterator it;
int napplets=0;
TaskbarApplet* *applets = new TaskbarApplet*[list.count()];
for ( it = list.begin(); it != list.end(); ++it ) {
if ( exclude.find( *it ) != exclude.end() )
continue;
TaskbarAppletInterface *iface = 0;
QLibrary *lib = new QLibrary( path + "/" + *it );
- if ( lib->queryInterface( IID_TaskbarApplet, (QUnknownInterface**)&iface ) == QS_OK ) {
+ if (( lib->queryInterface( IID_TaskbarApplet, (QUnknownInterface**)&iface ) == QS_OK ) && iface ) {
TaskbarApplet *applet = new TaskbarApplet;
applets[napplets++] = applet;
applet->library = lib;
applet->iface = iface;
} else {
exclude += *it;
delete lib;
}
}
cfg.writeEntry( "ExcludeApplets", exclude, ',' );
qsort(applets,napplets,sizeof(applets[0]),compareAppletPositions);
while (napplets--) {
TaskbarApplet *applet = applets[napplets];
applet->applet = applet->iface->applet( this );
appletList.append(*applet);
QString lang = getenv( "LANG" );
QTranslator * trans = new QTranslator(qApp);
QString type = (*it).left( (*it).find(".") );
QString tfn = QPEApplication::qpeDir()+"/i18n/"+lang+"/"+type+".qm";
if ( trans->load( tfn ))
qApp->installTranslator( trans );
else
delete trans;
}
delete applets;
#else
TaskbarApplet applet;
applet.iface = new ClockAppletImpl();
applet.applet = applet.iface->applet( this );
appletList.append( a );
#endif
show();
if ( !safety_tid )
safety_tid = startTimer(2000); // TT has 5000, but this is a PITA for a developer ;) (sandman)
}
void SysTray::timerEvent(QTimerEvent* e)
{
if ( e->timerId() == safety_tid ) {
Config cfg( "Taskbar" );
cfg.setGroup( "Applets" );
cfg.writeEntry( "SafeMode", FALSE );
killTimer(safety_tid);
safety_tid = 0;
}
}
diff --git a/core/launcher/taskbar.cpp b/core/launcher/taskbar.cpp
index 46bcdb3..7d1aaf1 100644
--- a/core/launcher/taskbar.cpp
+++ b/core/launcher/taskbar.cpp
@@ -130,202 +130,209 @@ public:
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 );
runningAppBar = new RunningAppBar(stack);
stack->raiseWidget(runningAppBar);
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 )
{
+ if ( !text.isEmpty() ) {
label->setText( text );
stack->raiseWidget( label );
if ( sysTray && ( label->fontMetrics().width( text ) > label->width() ) )
sysTray->hide();
- clearer->start( 3000 );
+ clearer->start( 3000, TRUE );
+ } else {
+ clearStatusBar();
+ }
}
void TaskBar::clearStatusBar()
{
label->clear();
stack->raiseWidget(runningAppBar);
// 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& /*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 == "reloadApps()" ) {
+ sm->reloadApps();
} else if ( msg == "reloadApplets()" ) {
sysTray->clearApplets();
sysTray->addApplets();
+ sm->reloadApplets();
} else if ( msg == "soundAlarm()" ) {
Desktop::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 );
}
}
}
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()
{
//eturn mru->quitOldApps();
return true;
}