From b757807635fddb4824eabd87f72c96a0929c5cb1 Mon Sep 17 00:00:00 2001 From: sandman Date: Wed, 02 Oct 2002 22:06:33 +0000 Subject: - Qtopia 1.6 launcher merge (again - should be finished soon) - Support for O-Menu applets (similiar to Taskbar applets) --- 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 @@ -380,6 +380,9 @@ void DesktopApplication::desktopMessage( const QCString &msg, const QByteArray & else if ( msg == "suspend()" ) { emit power(); } + else if ( msg == "home()" ) { + qpedesktop-> home ( ); + } #endif } @@ -717,10 +720,7 @@ void Desktop::raiseLauncher() 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)" ); @@ -728,6 +728,14 @@ void Desktop::raiseLauncher() } } +void Desktop::home ( ) +{ + if ( isVisibleWindow( launcher->winId() ) ) + launcher->nextView(); + else + launcher->raise(); +} + void Desktop::executeOrModify( const QString& appLnkFile ) { AppLnk lnk( MimeType::appsFolderName() + "/" + appLnkFile ); @@ -837,6 +845,8 @@ void Desktop::togglePower() { static bool excllock = false; + qDebug ( "togglePower (locked == %d)", excllock ? 1 : 0 ); + if ( excllock ) return ; 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 @@ -118,6 +118,8 @@ public slots: void terminateServers(); void rereadVolumes(); + void home ( ); + protected: void executeOrModify( const QString& appLnkFile ); void styleChange( QStyle & ); 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,7 +1,7 @@ /********************************************************************** -** 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 @@ -18,6 +18,8 @@ ** **********************************************************************/ +#define INCLUDE_MENUITEM_DEF + #include "startmenu.h" #include "sidething.h" //#include "mrulist.h" @@ -28,8 +30,10 @@ #include #include #include +#include -#include +#include +#include #include @@ -41,13 +45,20 @@ 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" ); - - createMenu(); + apps = 0; + launchMenu = 0; + applets. setAutoDelete ( true ); + sepId = 0; + + reloadApps ( ); + reloadApplets ( ); } @@ -75,70 +86,157 @@ void StartMenu::loadOptions() 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 ); + launchMenu = new PopupWithLaunchSideThing( this, &popupMenuSidePixmap ); else launchMenu = new StartPopupMenu( this ); - 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 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(); + 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(); - QDict 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 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 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 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; } @@ -147,7 +245,7 @@ void StartMenu::launch() { int y = mapToGlobal( QPoint() ).y() - launchMenu->sizeHint().height(); - if ( launchMenu->isVisible() ) + if ( launchMenu->isVisible() ) launchMenu->hide(); else launchMenu->popup( QPoint( 1, y ) ); @@ -162,10 +260,126 @@ const AppLnk* StartMenu::execToLink(const QString& appname) 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 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,7 +1,7 @@ /********************************************************************** -** 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 @@ -23,9 +23,11 @@ #include #include +#include #include #include +#include class AppLnkSet; class AppLnk; @@ -38,6 +40,19 @@ 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: @@ -53,15 +68,20 @@ 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; @@ -71,6 +91,13 @@ private: QString startButtonPixmap; AppLnkSet *apps; + + QIntDict applets; + QIntDict tabdict; + +// QValueList 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 @@ -102,7 +102,7 @@ void SysTray::addApplets() 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; 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 @@ -191,11 +191,15 @@ TaskBar::TaskBar() : QHBox(0, 0, WStyle_Customize | WStyle_Tool | WStyle_StaysOn 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(); + } } void TaskBar::clearStatusBar() @@ -212,7 +216,7 @@ void TaskBar::startWait() waitTimer->start( 10 * 1000, true ); } -void TaskBar::stopWait(const QString& app) +void TaskBar::stopWait(const QString& /*app*/) { waitTimer->stop(); //mru->addTask(sm->execToLink(app)); @@ -273,9 +277,12 @@ void TaskBar::receive( const QCString &msg, const QByteArray &data ) 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(); } -- cgit v0.9.0.2