-rw-r--r-- | core/launcher/startmenu.cpp | 253 |
1 files changed, 154 insertions, 99 deletions
diff --git a/core/launcher/startmenu.cpp b/core/launcher/startmenu.cpp index 08ae885..f17c7f8 100644 --- a/core/launcher/startmenu.cpp +++ b/core/launcher/startmenu.cpp | |||
@@ -15,12 +15,17 @@ | |||
15 | ** | 15 | ** |
16 | ** Contact info@trolltech.com if any conditions of this licensing are | 16 | ** Contact info@trolltech.com if any conditions of this licensing are |
17 | ** not clear to you. | 17 | ** not clear to you. |
18 | ** | 18 | ** |
19 | **********************************************************************/ | 19 | **********************************************************************/ |
20 | 20 | ||
21 | // TODO. During startup | ||
22 | // Launcher::typeAdded | ||
23 | // is called for each new tab and calls then each time the refresh of startmenu | ||
24 | // suboptimal | ||
25 | |||
21 | #define INCLUDE_MENUITEM_DEF | 26 | #define INCLUDE_MENUITEM_DEF |
22 | 27 | ||
23 | #include "startmenu.h" | 28 | #include "startmenu.h" |
24 | 29 | ||
25 | #include <qtopia/qpeapplication.h> | 30 | #include <qtopia/qpeapplication.h> |
26 | #include <qtopia/config.h> | 31 | #include <qtopia/config.h> |
@@ -29,15 +34,19 @@ | |||
29 | #include <qtopia/resource.h> | 34 | #include <qtopia/resource.h> |
30 | #include <qtopia/mimetype.h> | 35 | #include <qtopia/mimetype.h> |
31 | #include <qtopia/qlibrary.h> | 36 | #include <qtopia/qlibrary.h> |
32 | 37 | ||
33 | #include <qdict.h> | 38 | #include <qdict.h> |
34 | #include <qdir.h> | 39 | #include <qdir.h> |
35 | #include <qpainter.h> | 40 | //#include <qpainter.h> |
41 | |||
42 | //#include <stdlib.h> | ||
43 | |||
36 | 44 | ||
37 | #include <stdlib.h> | 45 | #define APPLNK_ID_OFFSET 250 |
46 | #define NO_ID -1 | ||
38 | 47 | ||
39 | 48 | ||
40 | void StartPopupMenu::keyPressEvent( QKeyEvent *e ) | 49 | void StartPopupMenu::keyPressEvent( QKeyEvent *e ) |
41 | { | 50 | { |
42 | if ( e->key() == Key_F33 || e->key() == Key_Space ) { | 51 | if ( e->key() == Key_F33 || e->key() == Key_Space ) { |
43 | // "OK" button, little hacky | 52 | // "OK" button, little hacky |
@@ -57,12 +66,13 @@ StartMenu::StartMenu(QWidget *parent) : QLabel( parent ) | |||
57 | int sz = AppLnk::smallIconSize()+3; | 66 | int sz = AppLnk::smallIconSize()+3; |
58 | QPixmap pm; | 67 | QPixmap pm; |
59 | pm.convertFromImage(Resource::loadImage(startButtonPixmap).smoothScale(sz,sz)); | 68 | pm.convertFromImage(Resource::loadImage(startButtonPixmap).smoothScale(sz,sz)); |
60 | setPixmap(pm); | 69 | setPixmap(pm); |
61 | setFocusPolicy( NoFocus ); | 70 | setFocusPolicy( NoFocus ); |
62 | 71 | ||
72 | useWidePopupMenu = true; | ||
63 | launchMenu = 0; | 73 | launchMenu = 0; |
64 | refreshMenu(); | 74 | refreshMenu(); |
65 | } | 75 | } |
66 | 76 | ||
67 | 77 | ||
68 | void StartMenu::mousePressEvent( QMouseEvent * ) | 78 | void StartMenu::mousePressEvent( QMouseEvent * ) |
@@ -82,122 +92,174 @@ void StartMenu::createMenu() | |||
82 | delete launchMenu; | 92 | delete launchMenu; |
83 | 93 | ||
84 | launchMenu = new StartPopupMenu( this ); | 94 | launchMenu = new StartPopupMenu( this ); |
85 | loadMenu( launchMenu ); | 95 | loadMenu( launchMenu ); |
86 | loadApplets(); | 96 | loadApplets(); |
87 | 97 | ||
88 | bool result = nother || ntabs || m_applets.count(); | 98 | bool result = currentItem || menuApplets.count(); |
89 | if ( result ) | 99 | if ( result ) |
90 | connect( launchMenu, SIGNAL(activated(int)), SLOT(itemSelected(int)) ); | 100 | connect( launchMenu, SIGNAL(activated(int)), SLOT(itemSelected(int)) ); |
91 | |||
92 | } | 101 | } |
93 | 102 | ||
94 | void StartMenu::refreshMenu() | 103 | void StartMenu::refreshMenu() |
95 | { | 104 | { |
96 | Config cfg("Taskbar"); | 105 | Config cfg( "StartMenu" ); |
97 | cfg.setGroup("Menu"); | 106 | cfg.setGroup("Menu"); |
98 | bool ltabs = cfg.readBoolEntry("LauncherTabs",TRUE); | 107 | bool ltabs = cfg.readBoolEntry("LauncherTabs",TRUE); |
99 | bool lot = cfg.readBoolEntry("LauncherOther",TRUE); | 108 | bool lot = cfg.readBoolEntry("LauncherOther",TRUE); |
100 | bool lt = ltabs || lot; | 109 | useWidePopupMenu = cfg.readBoolEntry( "LauncherSubPopup", TRUE ); |
101 | if ( launchMenu && !lt ) | 110 | |
102 | return; // nothing to do | 111 | if ( launchMenu && !(ltabs || lot) ) return; // nothing to do |
103 | 112 | ||
104 | if ( launchMenu ) { | ||
105 | int i; | ||
106 | /* find the first entry we want to remove */ | ||
107 | for (i=0; i<(int)launchMenu->count(); i++) { | ||
108 | QMenuItem* item = launchMenu->findItem(launchMenu->idAt(i)); | ||
109 | if ( item && item->id() >= 0 && item->id() < ntabs ) { | ||
110 | break; | ||
111 | } | ||
112 | if ( item && item->isSeparator() ) { | ||
113 | i++; | ||
114 | break; | ||
115 | } | ||
116 | } | ||
117 | /* remove them */ | ||
118 | while (i<(int)launchMenu->count()) | ||
119 | launchMenu->removeItemAt(i); | ||
120 | loadMenu(launchMenu); | ||
121 | addApplets(launchMenu); | ||
122 | } else { | ||
123 | createMenu(); | 113 | createMenu(); |
124 | } | 114 | } |
125 | } | ||
126 | 115 | ||
127 | void StartMenu::itemSelected( int id ) | 116 | void StartMenu::itemSelected( int id ) |
128 | { | 117 | { |
129 | if ( id >= 0 && id < ntabs ) { | 118 | if ( id == NO_ID ) return; |
130 | emit tabSelected(tabs[id]); | 119 | |
131 | } else if ( id >= 20 && id < 20+nother ) { | 120 | if ( id < 0 ) { |
132 | other.at(id-20)->execute(); | 121 | MenuApplet *applet = menuApplets.find( id ); |
133 | }else { | ||
134 | MenuApplet *applet = m_applets.find ( id ); | ||
135 | if ( applet ) { | 122 | if ( applet ) { |
136 | qWarning("activated"); | ||
137 | applet-> iface-> activated(); | 123 | applet-> iface-> activated(); |
138 | } | 124 | } |
125 | } else if ( id >= APPLNK_ID_OFFSET ) { | ||
126 | AppLnk * appLnk = appLnks.find( id ); | ||
127 | if ( appLnk ) { | ||
128 | appLnk->execute(); | ||
129 | } | ||
130 | } else { | ||
131 | QString *tabName = tabNames.find( id ); | ||
132 | if ( tabName ) { | ||
133 | emit tabSelected( *tabName ); | ||
134 | } | ||
139 | } | 135 | } |
140 | } | 136 | } |
141 | 137 | ||
142 | bool StartMenu::loadMenu( QPopupMenu *menu ) | 138 | void StartMenu::createAppEntry( QPopupMenu *menu, QDir dir, QString file ) |
143 | { | 139 | { |
144 | Config cfg("Taskbar"); | 140 | if ( file.right(8) == ".desktop" ) { |
145 | cfg.setGroup("Menu"); | 141 | AppLnk* applnk = new AppLnk( dir.path() + "/" + file ); |
146 | 142 | if ( !applnk->isValid() ) { | |
147 | bool ltabs = cfg.readBoolEntry("LauncherTabs",TRUE); | 143 | delete applnk; |
148 | bool lot = cfg.readBoolEntry("LauncherOther",TRUE); | 144 | return; |
149 | bool sepfirst = !ltabs && !lot; | 145 | } |
150 | |||
151 | tabs.clear(); | ||
152 | other.setAutoDelete(TRUE); | ||
153 | other.clear(); | ||
154 | ntabs = 0; | ||
155 | nother = 0; | ||
156 | 146 | ||
157 | bool f=TRUE; | ||
158 | if ( ltabs || lot ) { | ||
159 | QDir dir( MimeType::appsFolderName(), QString::null, QDir::Name ); | ||
160 | for (int i=0; i<(int)dir.count(); i++) { | ||
161 | QString d = dir[i]; | ||
162 | Config cfg(dir.path()+"/"+d+"/.directory",Config::File); | ||
163 | if ( cfg.isValid() ) { | ||
164 | QString nm = cfg.readEntry("Name"); | ||
165 | QString ic = cfg.readEntry("Icon"); | ||
166 | if ( !!nm && !!ic ) { | ||
167 | tabs.append(d); | ||
168 | menu->insertItem( Resource::loadIconSet(ic), nm, ntabs++ ); | ||
169 | } | ||
170 | } else if ( lot && d.right(8)==".desktop") { | ||
171 | AppLnk* applnk = new AppLnk(dir.path()+"/"+d); | ||
172 | if ( applnk->isValid() ) { | ||
173 | if ( applnk->type() == "Separator" ) { // No tr | 147 | if ( applnk->type() == "Separator" ) { // No tr |
174 | if ( lot ) { | ||
175 | menu->insertSeparator(); | 148 | menu->insertSeparator(); |
176 | sepfirst = f && !ltabs; | ||
177 | } | ||
178 | delete applnk; | 149 | delete applnk; |
179 | } else { | 150 | } else { |
180 | f = FALSE; | 151 | QPixmap test; |
181 | other.append(applnk); | 152 | test.convertFromImage( |
182 | menu->insertItem( Resource::loadIconSet(applnk->icon()), | 153 | Resource::loadImage( applnk->icon() ).smoothScale( |
183 | applnk->name(), 20+nother++ ); | 154 | AppLnk::smallIconSize(), AppLnk::smallIconSize() ), 0 ); |
155 | |||
156 | menu->insertItem( test, applnk->name(), | ||
157 | currentItem + APPLNK_ID_OFFSET ); | ||
158 | appLnks.insert( currentItem + APPLNK_ID_OFFSET, applnk ); | ||
159 | currentItem++; | ||
160 | } | ||
184 | } | 161 | } |
162 | |||
163 | } | ||
164 | |||
165 | void StartMenu::createDirEntry( QPopupMenu *menu, QDir dir, QString file, bool lot ) | ||
166 | { | ||
167 | // do some sanity checks and collect information | ||
168 | |||
169 | if ( file == "." || file == ".." ) return; | ||
170 | |||
171 | Config cfg( dir.path() + "/" + file + "/.directory", Config::File ); | ||
172 | if ( !cfg.isValid() ) return; | ||
173 | |||
174 | QString name = cfg.readEntry( "Name" ); | ||
175 | QString icon = cfg.readEntry( "Icon" ); | ||
176 | if ( !name || !icon ) return; | ||
177 | |||
178 | QDir subdir = QDir( dir ); | ||
179 | subdir.cd( file ); | ||
180 | subdir.setFilter( QDir::Files ); | ||
181 | subdir.setNameFilter( "*.desktop" ); | ||
182 | // we don' t show the menu if there are no entries | ||
183 | // perhaps one should check if there exist subsubdirs with entries... | ||
184 | if ( subdir.entryList().isEmpty() ) return; | ||
185 | |||
186 | // checks were ok | ||
187 | |||
188 | QPixmap test; | ||
189 | test.convertFromImage( Resource::loadImage( icon ).smoothScale( | ||
190 | AppLnk::smallIconSize(), AppLnk::smallIconSize() ), 0 ); | ||
191 | |||
192 | if ( useWidePopupMenu ) { | ||
193 | // generate submenu | ||
194 | QPopupMenu *submenu = new QPopupMenu( menu ); | ||
195 | connect( submenu, SIGNAL(activated(int)), SLOT(itemSelected(int)) ); | ||
196 | menu->insertItem( test, name, submenu, NO_ID ); | ||
197 | |||
198 | // ltabs is true cause else we wouldn't stuck around.. | ||
199 | createMenuEntries( submenu, subdir, true, lot ); | ||
185 | } else { | 200 | } else { |
186 | delete applnk; | 201 | // no submenus - just bring corresponding tab to front |
202 | menu->insertItem( test, name, currentItem ); | ||
203 | tabNames.insert( currentItem, new QString( file ) ); | ||
204 | currentItem++; | ||
187 | } | 205 | } |
188 | } | 206 | } |
207 | |||
208 | void StartMenu::createMenuEntries( QPopupMenu *menu, QDir dir, bool ltabs, bool lot ) | ||
209 | { | ||
210 | if ( lot ) { | ||
211 | dir.setFilter( QDir::Files ); | ||
212 | dir.setNameFilter( "*.desktop" ); | ||
213 | QStringList files = dir.entryList(); | ||
214 | files.sort(); | ||
215 | |||
216 | for ( QStringList::Iterator it = files.begin(); it != files.end(); it++ ) { | ||
217 | createAppEntry( menu, dir, *it ); | ||
218 | } | ||
189 | } | 219 | } |
220 | if ( ltabs ) { | ||
221 | dir.setNameFilter( "*" ); | ||
222 | dir.setFilter( QDir::Dirs ); | ||
223 | QStringList dirs = dir.entryList(); | ||
224 | dirs.sort(); | ||
190 | 225 | ||
191 | if ( !menu->count() ) | 226 | for ( QStringList::Iterator it = dirs.begin(); it != dirs.end(); it++ ) { |
192 | sepfirst = TRUE; | 227 | createDirEntry( menu, dir, *it, lot ); |
193 | } | 228 | } |
229 | } | ||
230 | } | ||
231 | |||
232 | bool StartMenu::loadMenu( QPopupMenu *menu ) | ||
233 | { | ||
234 | Config cfg("StartMenu"); | ||
235 | cfg.setGroup("Menu"); | ||
236 | |||
237 | bool ltabs = cfg.readBoolEntry("LauncherTabs", TRUE); | ||
238 | bool lot = cfg.readBoolEntry("LauncherOther", TRUE); | ||
239 | useWidePopupMenu = cfg.readBoolEntry( "LauncherSubPopup", TRUE ); | ||
240 | bool sepfirst = !ltabs && !lot; | ||
241 | |||
242 | currentItem = 0; | ||
243 | launchMenu->clear(); | ||
244 | |||
245 | appLnks.setAutoDelete( true ); | ||
246 | tabNames.setAutoDelete( true ); | ||
247 | appLnks.clear(); | ||
248 | tabNames.clear(); | ||
249 | appLnks.setAutoDelete( false ); | ||
250 | tabNames.setAutoDelete( false ); | ||
251 | |||
252 | QDir dir( MimeType::appsFolderName(), QString::null, QDir::Name ); | ||
253 | createMenuEntries( menu, dir, ltabs, lot ); | ||
254 | |||
255 | if ( !menu->count() ) sepfirst = TRUE; | ||
194 | 256 | ||
195 | launchMenu->setName(sepfirst ? "accessories" : "accessories_need_sep"); // No tr | 257 | launchMenu->setName(sepfirst ? "accessories" : "accessories_need_sep"); // No tr |
196 | 258 | ||
197 | return (nother || ntabs ); | 259 | return currentItem; |
198 | } | 260 | } |
199 | 261 | ||
200 | 262 | ||
201 | void StartMenu::launch() | 263 | void StartMenu::launch() |
202 | { | 264 | { |
203 | int y = mapToGlobal( QPoint() ).y() - launchMenu->sizeHint().height(); | 265 | int y = mapToGlobal( QPoint() ).y() - launchMenu->sizeHint().height(); |
@@ -208,13 +270,13 @@ void StartMenu::launch() | |||
208 | launchMenu->popup( QPoint( 1, y ) ); | 270 | launchMenu->popup( QPoint( 1, y ) ); |
209 | } | 271 | } |
210 | 272 | ||
211 | 273 | ||
212 | 274 | ||
213 | 275 | ||
214 | static int compareAppletPositions(const void *a, const void *b) | 276 | static int compareAppletPositions(const void *b, const void *a) |
215 | { | 277 | { |
216 | const MenuApplet* aa = *(const MenuApplet**)a; | 278 | const MenuApplet* aa = *(const MenuApplet**)a; |
217 | const MenuApplet* ab = *(const MenuApplet**)b; | 279 | const MenuApplet* ab = *(const MenuApplet**)b; |
218 | int d = aa->iface->position() - ab->iface->position(); | 280 | int d = aa->iface->position() - ab->iface->position(); |
219 | if ( d ) return d; | 281 | if ( d ) return d; |
220 | return QString::compare(aa->library->library(),ab->library->library()); | 282 | return QString::compare(aa->library->library(),ab->library->library()); |
@@ -222,24 +284,24 @@ static int compareAppletPositions(const void *a, const void *b) | |||
222 | 284 | ||
223 | void StartMenu::clearApplets() | 285 | void StartMenu::clearApplets() |
224 | { | 286 | { |
225 | if (launchMenu ) | 287 | if (launchMenu ) |
226 | launchMenu-> hide(); | 288 | launchMenu-> hide(); |
227 | 289 | ||
228 | for ( QIntDictIterator<MenuApplet> it ( m_applets ); it. current ( ); ++it ) { | 290 | for ( QIntDictIterator<MenuApplet> it( menuApplets ); it.current(); ++it ) { |
229 | MenuApplet *applet = it. current ( ); | 291 | MenuApplet *applet = it. current ( ); |
230 | if ( launchMenu ) { | 292 | if ( launchMenu ) { |
231 | launchMenu-> removeItem ( applet-> id ); | 293 | launchMenu-> removeItem ( applet-> id ); |
232 | delete applet-> popup; | 294 | delete applet-> popup; |
233 | } | 295 | } |
234 | 296 | ||
235 | applet-> iface-> release(); | 297 | applet-> iface-> release(); |
236 | applet-> library-> unload(); | 298 | applet-> library-> unload(); |
237 | delete applet-> library; | 299 | delete applet-> library; |
238 | } | 300 | } |
239 | m_applets.clear(); | 301 | menuApplets.clear(); |
240 | } | 302 | } |
241 | 303 | ||
242 | 304 | ||
243 | 305 | ||
244 | 306 | ||
245 | void StartMenu::loadApplets() | 307 | void StartMenu::loadApplets() |
@@ -253,17 +315,13 @@ void StartMenu::loadApplets() | |||
253 | // we don't currently use it -zecke | 315 | // we don't currently use it -zecke |
254 | 316 | ||
255 | QStringList exclude = cfg.readListEntry( "ExcludeApplets", ',' ); | 317 | QStringList exclude = cfg.readListEntry( "ExcludeApplets", ',' ); |
256 | 318 | ||
257 | QString lang = getenv( "LANG" ); | 319 | QString lang = getenv( "LANG" ); |
258 | QString path = QPEApplication::qpeDir() + "/plugins/applets"; | 320 | QString path = QPEApplication::qpeDir() + "/plugins/applets"; |
259 | #ifdef Q_OS_MACX | ||
260 | QDir dir( path, "lib*.dylib" ); | ||
261 | #else | ||
262 | QDir dir( path, "lib*.so" ); | 321 | QDir dir( path, "lib*.so" ); |
263 | #endif /* Q_OS_MACX */ | ||
264 | QStringList list = dir.entryList(); | 322 | QStringList list = dir.entryList(); |
265 | QStringList::Iterator it; | 323 | QStringList::Iterator it; |
266 | int napplets=0; | 324 | int napplets=0; |
267 | MenuApplet* *xapplets = new MenuApplet*[list.count()]; | 325 | MenuApplet* *xapplets = new MenuApplet*[list.count()]; |
268 | for ( it = list.begin(); it != list.end(); ++it ) { | 326 | for ( it = list.begin(); it != list.end(); ++it ) { |
269 | if ( exclude.find( *it ) != exclude.end() ) | 327 | if ( exclude.find( *it ) != exclude.end() ) |
@@ -286,52 +344,49 @@ void StartMenu::loadApplets() | |||
286 | } else { | 344 | } else { |
287 | exclude += *it; | 345 | exclude += *it; |
288 | delete lib; | 346 | delete lib; |
289 | } | 347 | } |
290 | } | 348 | } |
291 | cfg.writeEntry( "ExcludeApplets", exclude, ',' ); | 349 | cfg.writeEntry( "ExcludeApplets", exclude, ',' ); |
292 | qsort(xapplets,napplets,sizeof(m_applets[0]),compareAppletPositions); | 350 | qsort(xapplets, napplets, sizeof(menuApplets[0]), compareAppletPositions); |
293 | 351 | ||
294 | 352 | ||
295 | int foo = ( launchMenu-> count ( )) ? launchMenu-> insertSeparator ( ) : 0; | ||
296 | |||
297 | while (napplets--) { | 353 | while (napplets--) { |
298 | MenuApplet *applet = xapplets[napplets]; | 354 | MenuApplet *applet = xapplets[napplets]; |
299 | 355 | ||
300 | applet-> popup = applet-> iface-> popup ( this ); | 356 | applet-> popup = applet-> iface-> popup ( this ); |
301 | 357 | ||
302 | if ( applet-> popup ) | 358 | // menuApplets got an id < -1 |
303 | applet-> id = launchMenu-> insertItem ( applet-> iface-> icon ( ), applet-> iface-> text ( ), applet-> popup ); | 359 | menuApplets.insert( -( currentItem + 2 ), new MenuApplet( *applet ) ); |
304 | else | 360 | currentItem++; |
305 | applet-> id = launchMenu-> insertItem ( applet-> iface-> icon ( ), applet-> iface-> text ( ) ); | ||
306 | |||
307 | |||
308 | m_applets.insert ( applet-> id, new MenuApplet(*applet)); | ||
309 | } | 361 | } |
310 | delete [] xapplets; | 362 | delete [] xapplets; |
311 | 363 | ||
364 | addApplets( launchMenu ); | ||
312 | } | 365 | } |
313 | 366 | ||
314 | 367 | ||
315 | /* | 368 | /* |
316 | * Launcher calls loadMenu too often fix that | 369 | * Launcher calls loadMenu too often fix that |
317 | */ | 370 | */ |
318 | void StartMenu::addApplets(QPopupMenu* pop) { | 371 | void StartMenu::addApplets(QPopupMenu* pop) { |
319 | QIntDict<MenuApplet> dict; | 372 | QIntDict<MenuApplet> dict; |
320 | if( pop-> count ( )) | 373 | if( pop-> count ( )) |
321 | pop-> insertSeparator ( ); | 374 | pop-> insertSeparator ( ); |
322 | 375 | ||
323 | for ( QIntDictIterator<MenuApplet> it ( m_applets ); it. current ( ); ++it ) { | 376 | for ( QIntDictIterator<MenuApplet> it( menuApplets ); it.current(); ++it ) { |
324 | MenuApplet *applet = it. current ( ); | 377 | MenuApplet *applet = it. current ( ); |
325 | if ( applet-> popup ) | 378 | if ( applet-> popup ) |
326 | applet-> id = pop-> insertItem ( applet-> iface-> icon ( ), applet-> iface-> text ( ), applet-> popup ); | 379 | applet->id = pop->insertItem( applet->iface->icon(), |
380 | applet->iface->text(), applet->popup ); | ||
327 | else | 381 | else |
328 | applet-> id = pop-> insertItem ( applet-> iface-> icon ( ), applet-> iface-> text ( ) ); | 382 | applet->id = pop->insertItem( applet->iface->icon(), |
383 | applet->iface->text() ); | ||
329 | 384 | ||
330 | dict.insert( applet->id, new MenuApplet(*applet) ); | 385 | dict.insert( applet->id, new MenuApplet(*applet) ); |
331 | } | 386 | } |
332 | /* need to update the key */ | 387 | /* need to update the key */ |
333 | m_applets.setAutoDelete( true ); | 388 | menuApplets.setAutoDelete( true ); |
334 | m_applets.clear(); | 389 | menuApplets.clear(); |
335 | m_applets.setAutoDelete( false ); | 390 | menuApplets.setAutoDelete( false ); |
336 | m_applets = dict; | 391 | menuApplets = dict; |
337 | } | 392 | } |