• Skip to content
  • Skip to link menu
Trinity API Reference
  • Trinity API Reference
  • tdeutils
 

tdeutils

  • tdeutils
  • ksettings
dialog.cpp
1/* This file is part of the KDE project
2 Copyright (C) 2003 Matthias Kretz <kretz@kde.org>
3
4 This library is free software; you can redistribute it and/or
5 modify it under the terms of the GNU Library General Public
6 License version 2 as published by the Free Software Foundation.
7
8 This library is distributed in the hope that it will be useful,
9 but WITHOUT ANY WARRANTY; without even the implied warranty of
10 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11 Library General Public License for more details.
12
13 You should have received a copy of the GNU Library General Public License
14 along with this library; see the file COPYING.LIB. If not, write to
15 the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
16 Boston, MA 02110-1301, USA.
17
18*/
19
20#include "ksettings/dialog.h"
21
22
23#include <kcmultidialog.h>
24#include <tdelocale.h>
25#include <kservicegroup.h>
26#include <kdebug.h>
27#include <ktrader.h>
28#include <kplugininfo.h>
29#include "ksettings/dispatcher.h"
30#include "ksettings/componentsdialog.h"
31#include <ksimpleconfig.h>
32#include <tdestandarddirs.h>
33#include <kiconloader.h>
34#include <tqvbox.h>
35#include <tqlabel.h>
36#include "tdecmoduleinfo.h"
37
38namespace KSettings
39{
40
41struct GroupInfo
42{
43 TQString id;
44 TQString name;
45 TQString comment;
46 TQString icon;
47 int weight;
48 TQString parentid;
49 TQWidget * page;
50};
51
52// The TreeList can get really complicated. That's why a tree data structure
53// is necessary to make it suck less
54class PageNode
55{
56 private:
57 typedef TQValueList<PageNode*> List;
58 enum Type { KCM, Group, Root };
59 union Value
60 {
61 TDECModuleInfo * kcm;
62 GroupInfo * group;
63 };
64 Type m_type;
65 Value m_value;
66
67 Dialog * m_dialog;
68 List m_children;
69 PageNode * m_parent;
70 bool m_visible;
71 bool m_dirty;
72
73 protected:
74 PageNode( TDECModuleInfo * info, PageNode * parent )
75 : m_type( KCM )
76 , m_parent( parent )
77 , m_visible( true )
78 , m_dirty( true )
79 {
80 m_value.kcm = info;
81 m_dialog = parent->m_dialog;
82 }
83
84 PageNode( GroupInfo & group, PageNode * parent )
85 : m_type( Group )
86 , m_parent( parent )
87 , m_visible( true )
88 , m_dirty( true )
89 {
90 m_value.group = new GroupInfo( group );
91 m_value.group->page = 0;
92 m_dialog = parent->m_dialog;
93 }
94
95 void bubbleSort( List::Iterator begin, List::Iterator end )
96 {
97 --end;
98 bool finished;
99 List::Iterator lastswapped = begin;
100 List::Iterator i;
101 List::Iterator j;
102 while( begin != end )
103 {
104 finished = true;
105 i = j = end;
106 do {
107 --j;
108 if( **i < **j )
109 {
110 finished = false;
111 tqSwap( *i, *j );
112 lastswapped = j;
113 }
114 --i;
115 } while( j != begin );
116 if( finished )
117 return;
118 ++lastswapped;
119 begin = lastswapped;
120 }
121 }
122
123 public:
124 PageNode( Dialog * dialog )
125 : m_type( Root )
126 , m_dialog( dialog )
127 , m_parent( 0 )
128 , m_visible( true )
129 , m_dirty( true )
130 {}
131
132 ~PageNode()
133 {
134 if( KCM == m_type )
135 delete m_value.kcm;
136 else if( Group == m_type )
137 delete m_value.group;
138 List::Iterator end = m_children.end();
139 for( List::Iterator it = m_children.begin(); it != end; ++it )
140 delete ( *it );
141 }
142
143 int weight() const
144 {
145 int w = ( KCM == m_type ) ? m_value.kcm->weight()
146 : m_value.group->weight;
147 kdDebug( 700 ) << k_funcinfo << name() << " " << w << endl;
148 return w;
149 }
150
151 bool operator<( const PageNode & rhs ) const
152 {
153 return weight() < rhs.weight();
154 }
155
156 bool isVisible()
157 {
158 if( m_dirty )
159 {
160 if( KCM == m_type )
161 m_visible = m_dialog->isPluginForKCMEnabled( m_value.kcm );
162 else
163 {
164 m_visible = false;
165 List::Iterator end = m_children.end();
166 for( List::Iterator it = m_children.begin(); it != end;
167 ++it )
168 if( ( *it )->isVisible() )
169 {
170 m_visible = true;
171 break;
172 }
173 }
174 m_dirty = false;
175 }
176 kdDebug( 700 ) << k_funcinfo << "returns " << m_visible << endl;
177 return m_visible;
178 }
179
180 void makeDirty()
181 {
182 m_dirty = true;
183 List::Iterator end = m_children.end();
184 for( List::Iterator it = m_children.begin(); it != end; ++it )
185 ( *it )->makeDirty();
186 }
187
188 TQString name() const
189 {
190 if( Root == m_type )
191 return TQString::fromAscii( "root node" );
192 return ( KCM == m_type ) ? m_value.kcm->moduleName()
193 : m_value.group->name;
194 }
195
196 TQStringList parentNames() const
197 {
198 TQStringList ret;
199 PageNode * node = m_parent;
200 while( node && node->m_type != Root )
201 {
202 ret.prepend( node->name() );
203 node = node->m_parent;
204 }
205 return ret;
206 }
207
208 void addToDialog( KCMultiDialog * dlg )
209 {
210 kdDebug( 700 ) << k_funcinfo << "for " << name() << endl;
211 if( ! isVisible() )
212 return;
213
214 if( KCM == m_type )
215 {
216 dlg->addModule( *m_value.kcm, parentNames() );
217 return;
218 }
219 if( Group == m_type && 0 == m_value.group->page )
220 {
221 TQPixmap icon;
222 if( ! m_value.group->icon.isNull() )
223 icon = SmallIcon( m_value.group->icon,
224 IconSize( TDEIcon::Small ) );
225 TQVBox * page = dlg->addVBoxPage( m_value.group->name,
226 TQString::null, icon );
227 TQLabel * comment = new TQLabel( m_value.group->comment, page );
228 comment->setTextFormat( TQt::RichText );
229 m_value.group->page = page;
230 }
231 List::Iterator end = m_children.end();
232 for( List::Iterator it = m_children.begin(); it != end; ++it )
233 ( *it )->addToDialog( dlg );
234 }
235
236 void removeFromDialog( KCMultiDialog * dlg )
237 {
238 kdDebug( 700 ) << k_funcinfo << "for " << name() << endl;
239 if( KCM == m_type )
240 return;
241 if( Root == m_type )
242 dlg->removeAllModules();
243 List::Iterator end = m_children.end();
244 for( List::Iterator it = m_children.begin(); it != end; ++it )
245 ( *it )->removeFromDialog( dlg );
246 if( Group == m_type )
247 {
248 delete m_value.group->page;
249 m_value.group->page = 0;
250 }
251 }
252
253 void sort()
254 {
255 kdDebug( 700 ) << k_funcinfo << name() << endl;
256 List::Iterator begin = m_children.begin();
257 List::Iterator end = m_children.end();
258 bubbleSort( begin, end );
259 for( List::Iterator it = begin ; it != end; ++it )
260 ( *it )->sort();
261 }
262
263 bool insert( GroupInfo & group )
264 {
265 if( group.parentid.isNull() )
266 {
267 if( Root == m_type )
268 {
269 m_children.append( new PageNode( group, this ) );
270 return true;
271 }
272 else
273 kdFatal( 700 ) << "wrong PageNode insertion"
274 << kdBacktrace() << endl;
275 }
276 if( Group == m_type && group.parentid == m_value.group->id )
277 {
278 m_children.append( new PageNode( group, this ) );
279 return true;
280 }
281 List::Iterator end = m_children.end();
282 for( List::Iterator it = m_children.begin(); it != end; ++it )
283 if( ( *it )->insert( group ) )
284 return true;
285 // no parent with the right parentid
286 if( Root == m_type )
287 {
288 m_children.append( new PageNode( group, this ) );
289 return true;
290 }
291 return false;
292 }
293
294 bool insert( TDECModuleInfo * info, const TQString & parentid )
295 {
296 if( parentid.isNull() )
297 {
298 if( Root == m_type )
299 {
300 m_children.append( new PageNode( info, this ) );
301 return true;
302 }
303 else
304 kdFatal( 700 ) << "wrong PageNode insertion"
305 << kdBacktrace() << endl;
306 }
307 if( Group == m_type && parentid == m_value.group->id )
308 {
309 m_children.append( new PageNode( info, this ) );
310 return true;
311 }
312 List::Iterator end = m_children.end();
313 for( List::Iterator it = m_children.begin(); it != end; ++it )
314 if( ( *it )->insert( info, parentid ) )
315 return true;
316 // no parent with the right parentid
317 if( Root == m_type )
318 {
319 m_children.append( new PageNode( info, this ) );
320 return true;
321 }
322 return false;
323 }
324
325 bool needTree()
326 {
327 List::ConstIterator end = m_children.end();
328 for( List::ConstIterator it = m_children.begin(); it != end; ++it )
329 if( ( *it )->m_children.count() > 0 )
330 return true;
331 return false;
332 }
333
334 bool singleChild()
335 {
336 return ( m_children.count() == 1 );
337 }
338};
339
340class Dialog::DialogPrivate
341{
342 public:
343 DialogPrivate( Dialog * parent )
344 : dlg( 0 )
345 , pagetree( parent )
346 {
347 }
348
349 bool staticlistview;
350 KCMultiDialog * dlg;
351 PageNode pagetree;
352 TQWidget * parentwidget;
353 TQStringList registeredComponents;
354 TQValueList<KService::Ptr> services;
355 TQMap<TQString, KPluginInfo*> plugininfomap;
356};
357
358Dialog::Dialog( TQWidget * parent, const char * name )
359 : TQObject( parent, name )
360 , d( new DialogPrivate( this ) )
361{
362 d->parentwidget = parent;
363 d->staticlistview = true;
364 d->services = instanceServices();
365}
366
367Dialog::Dialog( ContentInListView content,
368 TQWidget * parent, const char * name )
369 : TQObject( parent, name )
370 , d( new DialogPrivate( this ) )
371{
372 d->parentwidget = parent;
373 d->staticlistview = ( content == Static );
374 d->services = instanceServices();
375}
376
377Dialog::Dialog( const TQStringList & components,
378 TQWidget * parent, const char * name )
379 : TQObject( parent, name )
380 , d( new DialogPrivate( this ) )
381{
382 d->parentwidget = parent;
383 d->staticlistview = true;
384 d->services = instanceServices() + parentComponentsServices( components );
385}
386
387Dialog::Dialog( const TQStringList & components,
388 ContentInListView content, TQWidget * parent, const char * name )
389 : TQObject( parent, name )
390 , d( new DialogPrivate( this ) )
391{
392 d->parentwidget = parent;
393 d->staticlistview = ( content == Static );
394 d->services = instanceServices() + parentComponentsServices( components );
395}
396
397Dialog::~Dialog()
398{
399 delete d;
400}
401
402void Dialog::addPluginInfos( const TQValueList<KPluginInfo*> & plugininfos )
403{
404 for( TQValueList<KPluginInfo*>::ConstIterator it = plugininfos.begin();
405 it != plugininfos.end(); ++it )
406 {
407 d->registeredComponents.append( ( *it )->pluginName() );
408 d->services += ( *it )->kcmServices();
409 d->plugininfomap[ ( *it )->pluginName() ] = *it;
410 }
411}
412
413void Dialog::show()
414{
415 if( 0 == d->dlg )
416 createDialogFromServices();
417 Dispatcher::self()->syncConfiguration();
418 return d->dlg->show();
419}
420
421KCMultiDialog * Dialog::dialog()
422{
423 if( 0 == d->dlg )
424 createDialogFromServices();
425 return d->dlg;
426}
427
428TQValueList<KService::Ptr> Dialog::instanceServices() const
429{
430 kdDebug( 700 ) << k_funcinfo << endl;
431 TQString instanceName = TDEGlobal::instance()->instanceName();
432 d->registeredComponents.append( instanceName );
433 kdDebug( 700 ) << "calling KServiceGroup::childGroup( " << instanceName
434 << " )" << endl;
435 KServiceGroup::Ptr service = KServiceGroup::childGroup( instanceName );
436
437 TQValueList<KService::Ptr> ret;
438
439 if( service && service->isValid() )
440 {
441 kdDebug( 700 ) << "call was successfull" << endl;
442 KServiceGroup::List list = service->entries();
443 for( KServiceGroup::List::ConstIterator it = list.begin();
444 it != list.end(); ++it )
445 {
446 KSycocaEntry * p = *it;
447 if( p->isType( KST_KService ) )
448 {
449 kdDebug( 700 ) << "found service" << endl;
450 ret << static_cast<KService *>( p );
451 }
452 else
453 kdWarning( 700 ) << "KServiceGroup::childGroup returned"
454 " something else than a KService (kinda)" << endl;
455 }
456 }
457
458 return ret;
459}
460
461TQValueList<KService::Ptr> Dialog::parentComponentsServices(
462 const TQStringList & kcdparents ) const
463{
464 d->registeredComponents += kcdparents;
465 TQString constraint = kcdparents.join(
466 "' in [X-TDE-ParentComponents]) or ('" );
467 constraint = "('" + constraint + "' in [X-TDE-ParentComponents])";
468
469 kdDebug( 700 ) << "constraint = " << constraint << endl;
470 return TDETrader::self()->query( "TDECModule", constraint );
471}
472
473bool Dialog::isPluginForKCMEnabled( TDECModuleInfo * moduleinfo ) const
474{
475 // if the user of this class requested to hide disabled modules
476 // we check whether it should be enabled or not
477 bool enabled = true;
478 kdDebug( 700 ) << "check whether the " << moduleinfo->moduleName()
479 << " KCM should be shown" << endl;
480 // for all parent components
481 TQStringList parentComponents = moduleinfo->service()->property(
482 "X-TDE-ParentComponents" ).toStringList();
483 for( TQStringList::ConstIterator pcit = parentComponents.begin();
484 pcit != parentComponents.end(); ++pcit )
485 {
486 // if the parentComponent is not registered ignore it
487 if( d->registeredComponents.find( *pcit ) ==
488 d->registeredComponents.end() )
489 continue;
490
491 // we check if the parent component is a plugin
492 if( ! d->plugininfomap.contains( *pcit ) )
493 {
494 // if not the TDECModule must be enabled
495 enabled = true;
496 // we're done for this TDECModuleInfo
497 break;
498 }
499 // if it is a plugin we check whether the plugin is enabled
500 KPluginInfo * pinfo = d->plugininfomap[ *pcit ];
501 pinfo->load();
502 enabled = pinfo->isPluginEnabled();
503 kdDebug( 700 ) << "parent " << *pcit << " is "
504 << ( enabled ? "enabled" : "disabled" ) << endl;
505 // if it is enabled we're done for this TDECModuleInfo
506 if( enabled )
507 break;
508 }
509 return enabled;
510}
511
512void Dialog::parseGroupFile( const TQString & filename )
513{
514 KSimpleConfig file( filename );
515 TQStringList groups = file.groupList();
516 for( TQStringList::ConstIterator it = groups.begin(); it != groups.end();
517 ++it )
518 {
519 GroupInfo group;
520 TQString id = *it;
521 file.setGroup( id.utf8() );
522 group.id = id;
523 group.name = file.readEntry( "Name" );
524 group.comment = file.readEntry( "Comment" );
525 group.weight = file.readNumEntry( "Weight", 100 );
526 group.parentid = file.readEntry( "Parent" );
527 group.icon = file.readEntry( "Icon" );
528 d->pagetree.insert( group );
529 }
530}
531
532void Dialog::createDialogFromServices()
533{
534 // read .setdlg files
535 TQString setdlgpath = locate( "appdata",
536 TDEGlobal::instance()->instanceName() + ".setdlg" );
537 TQStringList setdlgaddon = TDEGlobal::dirs()->findAllResources( "appdata",
538 "ksettingsdialog/*.setdlg" );
539 if( ! setdlgpath.isNull() )
540 parseGroupFile( setdlgpath );
541 if( setdlgaddon.size() > 0 )
542 for( TQStringList::ConstIterator it = setdlgaddon.begin();
543 it != setdlgaddon.end(); ++it )
544 parseGroupFile( *it );
545
546 // now we process the TDECModule services
547 for( TQValueList<KService::Ptr>::ConstIterator it = d->services.begin();
548 it != d->services.end(); ++it )
549 {
550 // we create the TDECModuleInfo
551 TDECModuleInfo * info = new TDECModuleInfo( *it );
552 TQString parentid;
553 TQVariant tmp = info->service()->property( "X-TDE-CfgDlgHierarchy",
554 TQVariant::String );
555 if( tmp.isValid() )
556 parentid = tmp.toString();
557 d->pagetree.insert( info, parentid );
558 }
559
560 // At this point d->pagetree holds a nice structure of the pages we want
561 // to show. It's not going to change anymore so we can sort it now.
562 d->pagetree.sort();
563
564 int dialogface = KJanusWidget::IconList;
565 if( d->pagetree.needTree() )
566 dialogface = KJanusWidget::TreeList;
567 else if( d->pagetree.singleChild() )
568 dialogface = KJanusWidget::Plain;
569
570 kdDebug( 700 ) << "creating KCMultiDialog" << endl;
571 d->dlg = new KCMultiDialog( dialogface, i18n( "Configure" ),
572 d->parentwidget );
573
574 if( dialogface == KJanusWidget::TreeList )
575 d->dlg->setShowIconsInTreeList( true );
576
577 // TODO: Don't show the reset button until the issue with the
578 // KPluginSelector::load() method is solved.
579 // Problem:
580 // KCMultiDialog::show() call TDECModule::load() to reset all KCMs
581 // (KPluginSelector::load() resets all plugin selections and all plugin
582 // KCMs).
583 // The reset button calls TDECModule::load(), too but in this case we want the
584 // KPluginSelector to only reset the current visible plugin KCM and not
585 // touch the plugin selections.
586 // I have no idea how to check that in KPluginSelector::load()...
587 //d->dlg->showButton( KDialogBase::User1, true );
588
589 if( ! d->staticlistview )
590 d->dlg->addButtonBelowList( i18n( "Select Components..." ), this,
591 TQ_SLOT( configureTree() ) );
592
593 connect( d->dlg, TQ_SIGNAL( okClicked() ), Dispatcher::self(),
594 TQ_SLOT( syncConfiguration() ) );
595 connect( d->dlg, TQ_SIGNAL( applyClicked() ), Dispatcher::self(),
596 TQ_SLOT( syncConfiguration() ) );
597 connect( d->dlg, TQ_SIGNAL( configCommitted( const TQCString & ) ),
598 Dispatcher::self(), TQ_SLOT( reparseConfiguration( const TQCString & ) ) );
599
600 d->pagetree.addToDialog( d->dlg );
601
602 if( dialogface == KJanusWidget::TreeList )
603 d->dlg->unfoldTreeList();
604}
605
606void Dialog::configureTree()
607{
608 kdDebug( 700 ) << k_funcinfo << endl;
609 ComponentsDialog * subdlg = new ComponentsDialog( d->dlg );
610 subdlg->setPluginInfos( d->plugininfomap );
611 subdlg->show();
612 connect( subdlg, TQ_SIGNAL( okClicked() ), this, TQ_SLOT( updateTreeList() ) );
613 connect( subdlg, TQ_SIGNAL( applyClicked() ), this, TQ_SLOT( updateTreeList() ) );
614 connect( subdlg, TQ_SIGNAL( okClicked() ), this,
615 TQ_SIGNAL( pluginSelectionChanged() ) );
616 connect( subdlg, TQ_SIGNAL( applyClicked() ), this,
617 TQ_SIGNAL( pluginSelectionChanged() ) );
618 connect( subdlg, TQ_SIGNAL( finished() ), subdlg, TQ_SLOT( delayedDestruct() ) );
619}
620
621void Dialog::updateTreeList()
622{
623 kdDebug( 700 ) << k_funcinfo << endl;
624
625 d->pagetree.makeDirty();
626
627 // remove all pages from the dialog and then add them again. This is needed
628 // because KDialogBase/KJanusWidget can only append to the end of the list
629 // and we need to have a predefined order.
630
631 d->pagetree.removeFromDialog( d->dlg );
632 d->pagetree.addToDialog( d->dlg );
633
634 if( d->pagetree.needTree() )
635 d->dlg->unfoldTreeList( true );
636}
637
638} //namespace
639
640#include "dialog.moc"
KCMultiDialog
A method that offers a KDialogBase containing arbitrary KControl Modules.
Definition: kcmultidialog.h:44
KCMultiDialog::addModule
void addModule(const TQString &module, bool withfallback=true, TQStringList args=TQStringList())
Add a module.
Definition: kcmultidialog.cpp:232
KCMultiDialog::removeAllModules
void removeAllModules()
Remove all modules from the dialog.
Definition: kcmultidialog.cpp:333
KDialogBase::addVBoxPage
TQVBox * addVBoxPage(const TQString &itemName, const TQString &header=TQString::null, const TQPixmap &pixmap=TQPixmap())
KJanusWidget::Plain
Plain
KJanusWidget::IconList
IconList
KJanusWidget::TreeList
TreeList
KPluginInfo
Information about a plugin.
Definition: kplugininfo.h:43
KPluginInfo::isPluginEnabled
virtual bool isPluginEnabled() const
Definition: kplugininfo.cpp:198
KPluginInfo::load
virtual void load(TDEConfigGroup *config=0)
Load the state of the plugin - enabled or not.
Definition: kplugininfo.cpp:336
KSettings::Dialog::pluginSelectionChanged
void pluginSelectionChanged()
If you use the dialog in Configurable mode and want to be notified when the user changes the plugin s...
KSettings::Dialog::ContentInListView
ContentInListView
Tells the dialog whether the entries in the listview are all static or whether it should add a Config...
Definition: dialog.h:84
KSettings::Dialog::Static
@ Static
Static listview, while running no entries are added or deleted.
Definition: dialog.h:88
KSettings::Dialog::Dialog
Dialog(TQWidget *parent=0, const char *name=0)
Construct a new Preferences Dialog for the application.
Definition: dialog.cpp:358
KSettings::Dialog::addPluginInfos
void addPluginInfos(const TQValueList< KPluginInfo * > &plugininfos)
If you use a Configurable dialog you need to pass KPluginInfo objects that the dialog should configur...
Definition: dialog.cpp:402
KSettings::Dialog::show
void show()
Show the config dialog.
Definition: dialog.cpp:413
KSettings::Dispatcher::syncConfiguration
void syncConfiguration()
When this slot is called the TDEConfig objects of all the registered instances are sync()ed.
Definition: dispatcher.cpp:127
KSettings::Dispatcher::self
static Dispatcher * self()
Get a reference the the Dispatcher object.
Definition: dispatcher.cpp:40
KSimpleConfig
KSycocaEntry
TDECModuleInfo
A class that provides information about a TDECModule.
Definition: tdecmoduleinfo.h:50
TDECModuleInfo::service
KService::Ptr service() const
Definition: tdecmoduleinfo.h:137
TDECModuleInfo::moduleName
TQString moduleName() const
Definition: tdecmoduleinfo.h:131
TDEGlobal::dirs
static TDEStandardDirs * dirs()
TDEGlobal::instance
static TDEInstance * instance()
TDEIcon::Small
Small
TDEInstance::instanceName
TQCString instanceName() const
TDEShortcut::append
bool append(const KKeySequence &keySeq)
TDEStandardDirs::findAllResources
TQStringList findAllResources(const char *type, const TQString &filter=TQString::null, bool recursive=false, bool unique=false) const
kdFatal
kdbgstream kdFatal(int area=0)
kdBacktrace
TQString kdBacktrace(int levels=-1)
kdWarning
kdbgstream kdWarning(int area=0)
endl
kndbgstream & endl(kndbgstream &s)
kdDebug
kdbgstream kdDebug(int area=0)
locate
TQString locate(const char *type, const TQString &filename, const TDEInstance *instance=TDEGlobal::instance())
KSettings
A collection of classes to create configuration dialogs that work over component boundaries.
Definition: componentsdialog.cpp:33
TDEStdAccel::name
TQString name(StdAccel id)
TDEStdAccel::end
const TDEShortcut & end()
TDEStdAccel::insert
const TDEShortcut & insert()
tdelocale.h

tdeutils

Skip menu "tdeutils"
  • Main Page
  • Modules
  • Namespace List
  • Class Hierarchy
  • Alphabetical List
  • Class List
  • File List
  • Class Members
  • Related Pages

tdeutils

Skip menu "tdeutils"
  • arts
  • dcop
  • dnssd
  • interfaces
  •   kspeech
  •     interface
  •     library
  •   tdetexteditor
  • kate
  • kded
  • kdoctools
  • kimgio
  • kjs
  • libtdemid
  • libtdescreensaver
  • tdeabc
  • tdecmshell
  • tdecore
  • tdefx
  • tdehtml
  • tdeinit
  • tdeio
  •   bookmarks
  •   httpfilter
  •   kpasswdserver
  •   kssl
  •   tdefile
  •   tdeio
  •   tdeioexec
  • tdeioslave
  •   http
  • tdemdi
  •   tdemdi
  • tdenewstuff
  • tdeparts
  • tdeprint
  • tderandr
  • tderesources
  • tdespell2
  • tdesu
  • tdeui
  • tdeunittest
  • tdeutils
  • tdewallet
Generated for tdeutils by doxygen 1.9.4
This website is maintained by Timothy Pearson.