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) (ignore whitespace changes)
-rw-r--r--core/launcher/desktop.cpp18
-rw-r--r--core/launcher/desktop.h2
-rw-r--r--core/launcher/startmenu.cpp304
-rw-r--r--core/launcher/startmenu.h31
-rw-r--r--core/launcher/systray.cpp2
-rw-r--r--core/launcher/taskbar.cpp19
6 files changed, 318 insertions, 58 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
@@ -382,2 +382,5 @@ void DesktopApplication::desktopMessage( const QCString &msg, const QByteArray &
}
+ else if ( msg == "home()" ) {
+ qpedesktop-> home ( );
+ }
#endif
@@ -719,6 +722,3 @@ void Desktop::raiseLauncher()
if ( tempItem == "Home" || tempItem.isEmpty() ) {
- if ( isVisibleWindow( launcher->winId() ) )
- launcher->nextView();
- else
- launcher->raise();
+ home ( );
}
@@ -730,2 +730,10 @@ void Desktop::raiseLauncher()
+void Desktop::home ( )
+{
+ if ( isVisibleWindow( launcher->winId() ) )
+ launcher->nextView();
+ else
+ launcher->raise();
+}
+
void Desktop::executeOrModify( const QString& appLnkFile )
@@ -839,2 +847,4 @@ void Desktop::togglePower()
+ qDebug ( "togglePower (locked == %d)", excllock ? 1 : 0 );
+
if ( excllock )
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
@@ -120,2 +120,4 @@ public slots:
+ void home ( );
+
protected:
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,5 +1,5 @@
/**********************************************************************
-** 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.
**
@@ -20,2 +20,4 @@
+#define INCLUDE_MENUITEM_DEF
+
#include "startmenu.h"
@@ -30,4 +32,6 @@
#include <qpe/resource.h>
+#include <qpe/qlibrary.h>
-#include <qdict.h>
+#include <qintdict.h>
+#include <qdir.h>
@@ -43,3 +47,6 @@ StartMenu::StartMenu(QWidget *parent) : QLabel( parent )
- setPixmap( Resource::loadPixmap( startButtonPixmap ) );
+ int sz = AppLnk::smallIconSize()+3;
+ QPixmap pm;
+ pm.convertFromImage(Resource::loadImage(startButtonPixmap).smoothScale(sz,sz));
+ setPixmap(pm);
setFocusPolicy( NoFocus );
@@ -47,5 +54,9 @@ StartMenu::StartMenu(QWidget *parent) : QLabel( parent )
- apps = new AppLnkSet( QPEApplication::qpeDir() + "apps" );
-
- createMenu();
+ apps = 0;
+ launchMenu = 0;
+ applets. setAutoDelete ( true );
+ sepId = 0;
+
+ reloadApps ( );
+ reloadApplets ( );
}
@@ -77,5 +88,5 @@ void StartMenu::loadOptions()
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
@@ -85,3 +96,3 @@ void StartMenu::loadOptions()
startButtonIsFlat = TRUE;
- startButtonPixmap = "launcher/start_button";
+ startButtonPixmap = "launcher/start_button"; // No tr
#endif
@@ -92,4 +103,5 @@ void StartMenu::createMenu()
{
+ delete launchMenu;
if ( useWidePopupMenu )
- launchMenu = new PopupWithLaunchSideThing( this, &popupMenuSidePixmap );
+ launchMenu = new PopupWithLaunchSideThing( this, &popupMenuSidePixmap );
else
@@ -97,4 +109,44 @@ void StartMenu::createMenu()
- loadMenu( apps, launchMenu );
+ 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 ( );
}
@@ -105,3 +157,9 @@ void StartMenu::itemSelected( int id )
if ( app )
- app->execute();
+ app->execute();
+ else {
+ MenuApplet *applet = applets. find ( id );
+
+ if ( applet )
+ applet-> iface-> activated ( );
+ }
}
@@ -112,31 +170,71 @@ bool StartMenu::loadMenu( AppLnkSet *folder, QPopupMenu *menu )
- QStringList typs = folder->types();
- QDict<QPopupMenu> typpop;
- for (QStringList::Iterator tit=typs.begin(); tit!=typs.end(); ++tit) {
- if ( !(*tit).isEmpty() ) {
- QPopupMenu *new_menu = new StartPopupMenu( menu );
- typpop.insert(*tit, new_menu);
- connect( new_menu, SIGNAL(activated(int)), SLOT(itemSelected(int)) );
- menu->insertItem( folder->typePixmap(*tit), folder->typeName(*tit), new_menu );
- }
- }
-
- QListIterator<AppLnk> it( folder->children() );
- for ( ; it.current(); ++it ) {
- AppLnk *app = it.current();
- if ( app->type() == "Separator" ) {
- menu->insertSeparator();
- } else {
- QString t = app->type();
- QPopupMenu* pmenu = typpop.find(t);
- if ( !pmenu )
- pmenu = menu;
- pmenu->insertItem( app->pixmap(), app->name(), app->id() );
- result=TRUE;
- }
+ 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;
+ QStringList typs = folder->types();
+ for (QStringList::Iterator tit=typs.fromLast(); ; --tit) {
+ if ( !(*tit).isEmpty() ) {
+ QPopupMenu *new_menu;
+ if ( ltabs ) {
+ new_menu = new StartPopupMenu( menu );
+ connect( new_menu, SIGNAL(activated(int)), SLOT(itemSelected(int)) );
+ 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" ) { // 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;
+ 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;
@@ -149,3 +247,3 @@ void StartMenu::launch()
- if ( launchMenu->isVisible() )
+ if ( launchMenu->isVisible() )
launchMenu->hide();
@@ -164,8 +262,124 @@ 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 );
+ // "OK" button, little hacky
+ QKeyEvent ke(QEvent::KeyPress, Key_Enter, 13, 0);
+ QPopupMenu::keyPressEvent( &ke );
} else {
- QPopupMenu::keyPressEvent( e );
+ 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,5 +1,5 @@
/**********************************************************************
-** 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.
**
@@ -25,2 +25,3 @@
#include <qlist.h>
+#include <qintdict.h>
#include <qlabel.h>
@@ -28,2 +29,3 @@
+#include <qpe/menuappletinterface.h>
@@ -40,2 +42,15 @@ protected:
+class QLibrary;
+
+struct MenuApplet
+{
+#ifndef QT_NO_COMPONENT
+ QLibrary *library;
+#endif
+ MenuAppletInterface *iface;
+ int id;
+ QPopupMenu *popup;
+};
+
+
class StartMenu : public QLabel {
@@ -55,2 +70,4 @@ public slots:
void createMenu( );
+ void reloadApps( );
+ void reloadApplets( );
@@ -61,2 +78,3 @@ protected:
virtual void mousePressEvent( QMouseEvent * );
+ virtual void timerEvent ( QTimerEvent * );
@@ -64,2 +82,4 @@ private:
bool loadMenu( AppLnkSet *folder, QPopupMenu *menu );
+ void loadApplets( );
+ void clearApplets( );
@@ -73,2 +93,9 @@ private:
AppLnkSet *apps;
+
+ QIntDict<MenuApplet> applets;
+ QIntDict<QPopupMenu> tabdict;
+
+// QValueList<MenuApplet> appletList;
+ int safety_tid;
+ int sepId;
};
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
@@ -104,3 +104,3 @@ void SysTray::addApplets()
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;
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
@@ -193,7 +193,11 @@ 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 );
+ 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();
+ }
}
@@ -214,3 +218,3 @@ void TaskBar::startWait()
-void TaskBar::stopWait(const QString& app)
+void TaskBar::stopWait(const QString& /*app*/)
{
@@ -275,2 +279,4 @@ void TaskBar::receive( const QCString &msg, const QByteArray &data )
inputMethods->loadInputMethods();
+ } else if ( msg == "reloadApps()" ) {
+ sm->reloadApps();
} else if ( msg == "reloadApplets()" ) {
@@ -278,2 +284,3 @@ void TaskBar::receive( const QCString &msg, const QByteArray &data )
sysTray->addApplets();
+ sm->reloadApplets();
} else if ( msg == "soundAlarm()" ) {