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

tdeui

  • tdeui
kpassdlg.cpp
1 // vi: ts=8 sts=4 sw=4
2 /* This file is part of the KDE libraries
3  Copyright (C) 1998 Pietro Iglio <iglio@fub.it>
4  Copyright (C) 1999,2000 Geert Jansen <jansen@kde.org>
5  Copyright (C) 2004,2005 Andrew Coles <andrew_coles@yahoo.co.uk>
6 
7  This library is free software; you can redistribute it and/or
8  modify it under the terms of the GNU Library General Public
9  License version 2 as published by the Free Software Foundation.
10 
11  This library is distributed in the hope that it will be useful,
12  but WITHOUT ANY WARRANTY; without even the implied warranty of
13  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14  Library General Public License for more details.
15 
16  You should have received a copy of the GNU Library General Public License
17  along with this library; see the file COPYING.LIB. If not, write to
18  the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
19  Boston, MA 02110-1301, USA.
20 */
21 #include <unistd.h>
22 
23 #include <tqwidget.h>
24 #include <tqlineedit.h>
25 #include <tqlabel.h>
26 #include <tqlayout.h>
27 #include <tqsize.h>
28 #include <tqevent.h>
29 #include <tqkeycode.h>
30 #include <tqcheckbox.h>
31 #include <tqregexp.h>
32 #include <tqhbox.h>
33 #include <tqwhatsthis.h>
34 #include <tqptrdict.h>
35 #include <tqtimer.h>
36 #include <tqtextcodec.h>
37 
38 #include <tdeglobal.h>
39 #include <kdebug.h>
40 #include <tdeapplication.h>
41 #include <tdelocale.h>
42 #include <kiconloader.h>
43 #include <tdemessagebox.h>
44 #include <tdeaboutdialog.h>
45 #include <tdeconfig.h>
46 #include <kstandarddirs.h>
47 #include <kprogress.h>
48 
49 #include <sys/time.h>
50 #include <sys/resource.h>
51 
52 #include "kpassdlg.h"
53 
54 #include "../tdesu/defaults.h"
55 
56 /*
57  * Password line editor.
58  */
59 
60 const int KPasswordEdit::PassLen = 200;
61 
62 class KPasswordDialog::KPasswordDialogPrivate
63 {
64  public:
65  KPasswordDialogPrivate()
66  : m_MatchLabel( 0 ), iconName( 0 ), allowEmptyPasswords( false ),
67  minimumPasswordLength(0), maximumPasswordLength(KPasswordEdit::PassLen - 1),
68  passwordStrengthWarningLevel(1), m_strengthBar(0),
69  reasonablePasswordLength(8)
70  {}
71  TQLabel *m_MatchLabel;
72  TQString iconName;
73  bool allowEmptyPasswords;
74  int minimumPasswordLength;
75  int maximumPasswordLength;
76  int passwordStrengthWarningLevel;
77  KProgress* m_strengthBar;
78  int reasonablePasswordLength;
79 };
80 
81 
82 KPasswordEdit::KPasswordEdit(TQWidget *parent, const char *name)
83  : TQLineEdit(parent, name)
84 {
85  init();
86 
87  TDEConfig* const cfg = TDEGlobal::config();
88  TDEConfigGroupSaver saver(cfg, "Passwords");
89 
90  const TQString val = cfg->readEntry("EchoMode", "OneStar");
91  if (val == "ThreeStars") {
92  setEchoMode(PasswordThreeStars);
93  }
94  else if (val == "NoEcho") {
95  setEchoMode(TQLineEdit::NoEcho);
96  }
97  else {
98  setEchoMode(TQLineEdit::Password);
99  }
100 
101  setInputMethodEnabled( true );
102 }
103 
104 KPasswordEdit::KPasswordEdit(TQWidget *parent, const char *name, int echoMode)
105  : TQLineEdit(parent, name)
106 {
107  setEchoMode((TQLineEdit::EchoMode)echoMode);
108  init();
109 }
110 
111 KPasswordEdit::KPasswordEdit(EchoMode echoMode, TQWidget *parent, const char *name)
112  : TQLineEdit(parent, name)
113 {
114  setEchoMode(echoMode);
115  init();
116 }
117 
118 KPasswordEdit::KPasswordEdit(EchoModes echoMode, TQWidget *parent, const char *name)
119  : TQLineEdit(parent, name)
120 {
121  if (echoMode == KPasswordEdit::NoEcho) {
122  setEchoMode(TQLineEdit::NoEcho);
123  }
124  else if (echoMode == KPasswordEdit::ThreeStars) {
125  setEchoMode(TQLineEdit::PasswordThreeStars);
126  }
127  else if (echoMode == KPasswordEdit::OneStar) {
128  setEchoMode(TQLineEdit::Password);
129  }
130  init();
131 }
132 
133 void KPasswordEdit::init()
134 {
135  setAcceptDrops(false);
136 }
137 
138 KPasswordEdit::~KPasswordEdit()
139 {
140 }
141 
142 const char *KPasswordEdit::password() const {
143  TQTextCodec *origCStringCodec = TQTextCodec::codecForCStrings();
144  TQTextCodec::setCodecForCStrings(TQTextCodec::codecForLocale());
145  const char *outputPassword = text().ascii();
146  TQTextCodec::setCodecForCStrings(origCStringCodec);
147  return outputPassword;
148 }
149 
150 void KPasswordEdit::erase()
151 {
152  setText("");
153 }
154 
155 void KPasswordEdit::setMaxPasswordLength(int newLength)
156 {
157  setMaxLength(newLength);
158 }
159 
160 int KPasswordEdit::maxPasswordLength() const
161 {
162  return maxLength();
163 }
164 
165 void KPasswordEdit::insert( const TQString &str) {
166  TQLineEdit::insert(str);
167 }
168 
169 void KPasswordEdit::keyPressEvent(TQKeyEvent *e) {
170  TQLineEdit::keyPressEvent(e);
171 }
172 
173 void KPasswordEdit::focusInEvent(TQFocusEvent *e) {
174  TQLineEdit::focusInEvent(e);
175 }
176 
177 bool KPasswordEdit::event(TQEvent *e) {
178  return TQLineEdit::event(e);
179 }
180 
181 /*
182  * Password dialog.
183  */
184 
185 KPasswordDialog::KPasswordDialog(Types type, bool enableKeep, int extraBttn,
186  TQWidget *parent, const char *name)
187  : KDialogBase(parent, name, true, "", Ok|Cancel|extraBttn,
188  Ok, true), m_Keep(enableKeep? 1 : 0), m_Type(type), m_keepWarnLbl(0), d(new KPasswordDialogPrivate)
189 {
190  d->iconName = "password";
191  init();
192 }
193 
194 KPasswordDialog::KPasswordDialog(Types type, bool enableKeep, int extraBttn, const TQString& icon,
195  TQWidget *parent, const char *name )
196  : KDialogBase(parent, name, true, "", Ok|Cancel|extraBttn,
197  Ok, true), m_Keep(enableKeep? 1 : 0), m_Type(type), m_keepWarnLbl(0), d(new KPasswordDialogPrivate)
198 {
199  if ( icon.stripWhiteSpace().isEmpty() )
200  d->iconName = "password";
201  else
202  d->iconName = icon;
203  init();
204 }
205 
206 KPasswordDialog::KPasswordDialog(int type, TQString prompt, bool enableKeep,
207  int extraBttn)
208  : KDialogBase(0L, "Password Dialog", true, "", Ok|Cancel|extraBttn,
209  Ok, true), m_Keep(enableKeep? 1 : 0), m_Type(type), m_keepWarnLbl(0), d(new KPasswordDialogPrivate)
210 {
211  d->iconName = "password";
212  init();
213  setPrompt(prompt);
214 }
215 
216 void KPasswordDialog::init()
217 {
218  m_Row = 0;
219 
220  TDEConfig* const cfg = TDEGlobal::config();
221  const TDEConfigGroupSaver saver(cfg, "Passwords");
222  bool def = ( qstrcmp( tqAppName(), "tdesu" ) == 0 ? defKeep : false );
223  if (m_Keep && cfg->readBoolEntry("Keep", def))
224  ++m_Keep;
225 
226  m_pMain = new TQWidget(this);
227  setMainWidget(m_pMain);
228  m_pGrid = new TQGridLayout(m_pMain, 10, 3, 0, 0);
229  m_pGrid->addColSpacing(1, 10);
230 
231  // Row 1: pixmap + prompt
232  TQLabel *lbl;
233  const TQPixmap pix( TDEGlobal::iconLoader()->loadIcon( d->iconName, TDEIcon::NoGroup, TDEIcon::SizeHuge, 0, 0, true));
234  if (!pix.isNull()) {
235  lbl = new TQLabel(m_pMain);
236  lbl->setPixmap(pix);
237  lbl->setAlignment(AlignHCenter|AlignVCenter);
238  lbl->setFixedSize(lbl->sizeHint());
239  m_pGrid->addWidget(lbl, 0, 0, (TQ_Alignment)AlignCenter);
240  }
241 
242  m_pHelpLbl = new TQLabel(m_pMain);
243  m_pHelpLbl->setAlignment(AlignLeft|AlignVCenter|WordBreak);
244  m_pGrid->addWidget(m_pHelpLbl, 0, 2, (TQ_Alignment)AlignLeft);
245  m_pGrid->addRowSpacing(1, 10);
246  m_pGrid->setRowStretch(1, 12);
247 
248  // Row 2+: space for 4 extra info lines
249  m_pGrid->addRowSpacing(6, 5);
250  m_pGrid->setRowStretch(6, 12);
251 
252  // Row 3: Password editor #1
253  lbl = new TQLabel(m_pMain);
254  lbl->setAlignment(AlignLeft|AlignVCenter);
255  lbl->setText(i18n("&Password:"));
256  lbl->setFixedSize(lbl->sizeHint());
257  m_pGrid->addWidget(lbl, 7, 0, (TQ_Alignment)AlignLeft);
258 
259  TQHBoxLayout *h_lay = new TQHBoxLayout();
260  m_pGrid->addLayout(h_lay, 7, 2);
261  m_pEdit = new KPasswordEdit(m_pMain);
262  m_pEdit2 = 0;
263  lbl->setBuddy(m_pEdit);
264  TQSize size = m_pEdit->sizeHint();
265  m_pEdit->setFixedHeight(size.height());
266  m_pEdit->setMinimumWidth(size.width());
267  h_lay->addWidget(m_pEdit);
268 
269  // Row 4: Password editor #2 or keep password checkbox
270 
271  if ((m_Type == Password) && m_Keep) {
272  m_pGrid->addRowSpacing(8, 10);
273  m_pGrid->setRowStretch(8, 12);
274  TQCheckBox* const cb = new TQCheckBox(i18n("&Keep password"), m_pMain);
275  cb->setFixedSize(cb->sizeHint());
276  m_keepWarnLbl = new TQLabel(m_pMain);
277  m_keepWarnLbl->setAlignment(AlignLeft|AlignVCenter|WordBreak);
278  if (m_Keep > 1) {
279  cb->setChecked(true);
280  m_keepWarnLbl->show();
281  }
282  else {
283  m_Keep = 0;
284  m_keepWarnLbl->hide();
285  }
286  connect(cb, TQT_SIGNAL(toggled(bool)), TQT_SLOT(slotKeep(bool)));
287  m_pGrid->addWidget(cb, 9, 2, (TQ_Alignment)(AlignLeft|AlignVCenter));
288 // m_pGrid->addWidget(m_keepWarnLbl, 13, 2, (TQ_Alignment)(AlignLeft|AlignVCenter));
289  m_pGrid->addMultiCellWidget(m_keepWarnLbl, 13, 13, 0, 3);
290  } else if (m_Type == NewPassword) {
291  m_pGrid->addRowSpacing(8, 10);
292  lbl = new TQLabel(m_pMain);
293  lbl->setAlignment(AlignLeft|AlignVCenter);
294  lbl->setText(i18n("&Verify:"));
295  lbl->setFixedSize(lbl->sizeHint());
296  m_pGrid->addWidget(lbl, 9, 0, (TQ_Alignment)AlignLeft);
297 
298  h_lay = new TQHBoxLayout();
299  m_pGrid->addLayout(h_lay, 9, 2);
300  m_pEdit2 = new KPasswordEdit(m_pMain);
301  lbl->setBuddy(m_pEdit2);
302  size = m_pEdit2->sizeHint();
303  m_pEdit2->setFixedHeight(size.height());
304  m_pEdit2->setMinimumWidth(size.width());
305  h_lay->addWidget(m_pEdit2);
306 
307  // Row 6: Password strength meter
308  m_pGrid->addRowSpacing(10, 10);
309  m_pGrid->setRowStretch(10, 12);
310 
311  TQHBox* const strengthBox = new TQHBox(m_pMain);
312  strengthBox->setSpacing(10);
313  m_pGrid->addMultiCellWidget(strengthBox, 11, 11, 0, 2);
314  TQLabel* const passStrengthLabel = new TQLabel(strengthBox);
315  passStrengthLabel->setAlignment(AlignLeft|AlignVCenter);
316  passStrengthLabel->setText(i18n("Password strength meter:"));
317  d->m_strengthBar = new KProgress(100, strengthBox, "PasswordStrengthMeter");
318  d->m_strengthBar->setPercentageVisible(false);
319 
320  const TQString strengthBarWhatsThis(i18n("The password strength meter gives an indication of the security "
321  "of the password you have entered. To improve the strength of "
322  "the password, try:\n"
323  " - using a longer password;\n"
324  " - using a mixture of upper- and lower-case letters;\n"
325  " - using numbers or symbols, such as #, as well as letters."));
326  TQWhatsThis::add(passStrengthLabel, strengthBarWhatsThis);
327  TQWhatsThis::add(d->m_strengthBar, strengthBarWhatsThis);
328 
329  // Row 6: Label saying whether the passwords match
330  m_pGrid->addRowSpacing(12, 10);
331  m_pGrid->setRowStretch(12, 12);
332 
333  d->m_MatchLabel = new TQLabel(m_pMain);
334  d->m_MatchLabel->setAlignment(AlignLeft|AlignVCenter|WordBreak);
335  m_pGrid->addMultiCellWidget(d->m_MatchLabel, 13, 13, 0, 2);
336  d->m_MatchLabel->setText(i18n("Passwords do not match"));
337 
338 
339  connect( m_pEdit, TQT_SIGNAL(textChanged(const TQString&)), TQT_SLOT(enableOkBtn()) );
340  connect( m_pEdit2, TQT_SIGNAL(textChanged(const TQString&)), TQT_SLOT(enableOkBtn()) );
341  enableOkBtn();
342  }
343 
344  erase();
345 }
346 
347 
348 KPasswordDialog::~KPasswordDialog()
349 {
350  delete d;
351 }
352 
353 
354 void KPasswordDialog::clearPassword()
355 {
356  m_pEdit->erase();
357 }
358 
359 /* KDE 4: Make it const TQString & */
360 void KPasswordDialog::setPrompt(TQString prompt)
361 {
362  m_pHelpLbl->setText(prompt);
363  m_pHelpLbl->setFixedSize(275, m_pHelpLbl->heightForWidth(275));
364 }
365 
366 void KPasswordDialog::setKeepWarning(TQString warn)
367 {
368  if (m_keepWarnLbl) {
369  m_keepWarnLbl->setText(warn);
370  }
371 }
372 
373 
374 TQString KPasswordDialog::prompt() const
375 
376 {
377  return m_pHelpLbl->text();
378 }
379 
380 
381 /* KDE 4: Make them const TQString & */
382 void KPasswordDialog::addLine(TQString key, TQString value)
383 {
384  if (m_Row > 3)
385  return;
386 
387  TQLabel *lbl = new TQLabel(key, m_pMain);
388  lbl->setAlignment(AlignLeft|AlignTop);
389  lbl->setFixedSize(lbl->sizeHint());
390  m_pGrid->addWidget(lbl, m_Row+2, 0, (TQ_Alignment)AlignLeft);
391 
392  lbl = new TQLabel(value, m_pMain);
393  lbl->setAlignment(AlignTop|WordBreak);
394  lbl->setFixedSize(275, lbl->heightForWidth(275));
395  m_pGrid->addWidget(lbl, m_Row+2, 2, (TQ_Alignment)AlignLeft);
396  ++m_Row;
397 }
398 
399 
400 void KPasswordDialog::erase()
401 {
402  m_pEdit->erase();
403  m_pEdit->setFocus();
404  if (m_Type == NewPassword)
405  m_pEdit2->erase();
406 }
407 
408 
409 void KPasswordDialog::slotOk()
410 {
411  if (m_Type == NewPassword) {
412  if (strcmp(m_pEdit->password(), m_pEdit2->password())) {
413  KMessageBox::sorry(this, i18n("You entered two different "
414  "passwords. Please try again."));
415  erase();
416  return;
417  }
418  if (d->m_strengthBar && d->m_strengthBar->progress() < d->passwordStrengthWarningLevel) {
419  int retVal = KMessageBox::warningContinueCancel(this,
420  i18n( "The password you have entered has a low strength. "
421  "To improve the strength of "
422  "the password, try:\n"
423  " - using a longer password;\n"
424  " - using a mixture of upper- and lower-case letters;\n"
425  " - using numbers or symbols as well as letters.\n"
426  "\n"
427  "Would you like to use this password anyway?"),
428  i18n("Low Password Strength"));
429  if (retVal == KMessageBox::Cancel) return;
430  }
431  }
432  if (!checkPassword(m_pEdit->password())) {
433  erase();
434  return;
435  }
436  accept();
437 }
438 
439 
440 void KPasswordDialog::slotCancel()
441 {
442  reject();
443 }
444 
445 
446 void KPasswordDialog::slotKeep(bool keep)
447 {
448  if (m_keepWarnLbl->text() != "") {
449  if (keep) {
450  m_keepWarnLbl->show();
451  }
452  else {
453  m_keepWarnLbl->hide();
454  }
455  TQTimer::singleShot(0, this, SLOT(slotLayout()));
456  }
457 
458  m_Keep = keep;
459 }
460 
461 void KPasswordDialog::slotLayout()
462 {
463  resize(sizeHint());
464 }
465 
466 
467 // static . antlarr: KDE 4: Make it const TQString & prompt
468 int KPasswordDialog::getPassword(TQCString &password, TQString prompt,
469  int *keep)
470 {
471  const bool enableKeep = (keep && *keep);
472  KPasswordDialog* const dlg = new KPasswordDialog(int(Password), prompt, enableKeep);
473  const int ret = dlg->exec();
474  if (ret == Accepted) {
475  password = dlg->password();
476  if (enableKeep)
477  *keep = dlg->keep();
478  }
479  delete dlg;
480  return ret;
481 }
482 
483 
484 // static . antlarr: KDE 4: Make it const TQString & prompt
485 int KPasswordDialog::getNewPassword(TQCString &password, TQString prompt)
486 {
487  KPasswordDialog* const dlg = new KPasswordDialog(NewPassword, prompt);
488  const int ret = dlg->exec();
489  if (ret == Accepted)
490  password = dlg->password();
491  delete dlg;
492  return ret;
493 }
494 
495 
496 // static
497 void KPasswordDialog::disableCoreDumps()
498 {
499  struct rlimit rlim;
500  rlim.rlim_cur = rlim.rlim_max = 0;
501  setrlimit(RLIMIT_CORE, &rlim);
502 }
503 
504 void KPasswordDialog::virtual_hook( int id, void* data )
505 { KDialogBase::virtual_hook( id, data ); }
506 
507 void KPasswordDialog::enableOkBtn()
508 {
509  if (m_Type == NewPassword) {
510  const bool match = strcmp(m_pEdit->password(), m_pEdit2->password()) == 0
511  && (d->allowEmptyPasswords || m_pEdit->password()[0]);
512 
513  const TQString pass(m_pEdit->password());
514 
515  const int minPasswordLength = minimumPasswordLength();
516 
517  if ((int) pass.length() < minPasswordLength) {
518  enableButtonOK(false);
519  } else {
520  enableButtonOK( match );
521  }
522 
523  if ( match && d->allowEmptyPasswords && m_pEdit->password()[0] == 0 ) {
524  d->m_MatchLabel->setText( i18n("Password is empty") );
525  } else {
526  if ((int) pass.length() < minPasswordLength) {
527  d->m_MatchLabel->setText(i18n("Password must be at least 1 character long", "Password must be at least %n characters long", minPasswordLength));
528  } else {
529  d->m_MatchLabel->setText( match? i18n("Passwords match")
530  :i18n("Passwords do not match") );
531  }
532  }
533 
534  // Password strength calculator
535  // Based on code in the Master Password dialog in Firefox
536  // (pref-masterpass.js)
537  // Original code triple-licensed under the MPL, GPL, and LGPL
538  // so is license-compatible with this file
539 
540  const double lengthFactor = d->reasonablePasswordLength / 8.0;
541 
542 
543  int pwlength = (int) (pass.length() / lengthFactor);
544  if (pwlength > 5) pwlength = 5;
545 
546  const TQRegExp numRxp("[0-9]", true, false);
547  int numeric = (int) (pass.contains(numRxp) / lengthFactor);
548  if (numeric > 3) numeric = 3;
549 
550  const TQRegExp symbRxp("\\W", false, false);
551  int numsymbols = (int) (pass.contains(symbRxp) / lengthFactor);
552  if (numsymbols > 3) numsymbols = 3;
553 
554  const TQRegExp upperRxp("[A-Z]", true, false);
555  int upper = (int) (pass.contains(upperRxp) / lengthFactor);
556  if (upper > 3) upper = 3;
557 
558  int pwstrength=((pwlength*10)-20) + (numeric*10) + (numsymbols*15) + (upper*10);
559 
560  if ( pwstrength < 0 ) {
561  pwstrength = 0;
562  }
563 
564  if ( pwstrength > 100 ) {
565  pwstrength = 100;
566  }
567  d->m_strengthBar->setProgress(pwstrength);
568 
569  }
570 }
571 
572 
573 void KPasswordDialog::setAllowEmptyPasswords(bool allowed) {
574  d->allowEmptyPasswords = allowed;
575  enableOkBtn();
576 }
577 
578 
579 bool KPasswordDialog::allowEmptyPasswords() const {
580  return d->allowEmptyPasswords;
581 }
582 
583 void KPasswordDialog::setMinimumPasswordLength(int minLength) {
584  d->minimumPasswordLength = minLength;
585  enableOkBtn();
586 }
587 
588 int KPasswordDialog::minimumPasswordLength() const {
589  return d->minimumPasswordLength;
590 }
591 
592 void KPasswordDialog::setMaximumPasswordLength(int maxLength) {
593 
594  if (maxLength < 0) maxLength = 0;
595  if (maxLength >= KPasswordEdit::PassLen) maxLength = KPasswordEdit::PassLen - 1;
596 
597  d->maximumPasswordLength = maxLength;
598 
599  m_pEdit->setMaxPasswordLength(maxLength);
600  if (m_pEdit2) m_pEdit2->setMaxPasswordLength(maxLength);
601 
602 }
603 
604 int KPasswordDialog::maximumPasswordLength() const {
605  return d->maximumPasswordLength;
606 }
607 
608 // reasonable password length code contributed by Steffen Mthing
609 
610 void KPasswordDialog::setReasonablePasswordLength(int reasonableLength) {
611 
612  if (reasonableLength < 1) reasonableLength = 1;
613  if (reasonableLength >= maximumPasswordLength()) reasonableLength = maximumPasswordLength();
614 
615  d->reasonablePasswordLength = reasonableLength;
616 
617 }
618 
619 int KPasswordDialog::reasonablePasswordLength() const {
620  return d->reasonablePasswordLength;
621 }
622 
623 
624 void KPasswordDialog::setPasswordStrengthWarningLevel(int warningLevel) {
625  if (warningLevel < 0) warningLevel = 0;
626  if (warningLevel > 99) warningLevel = 99;
627  d->passwordStrengthWarningLevel = warningLevel;
628 }
629 
630 int KPasswordDialog::passwordStrengthWarningLevel() const {
631  return d->passwordStrengthWarningLevel;
632 }
633 
634 #include "kpassdlg.moc"

tdeui

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

tdeui

Skip menu "tdeui"
  • 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 tdeui by doxygen 1.8.1.2
This website is maintained by Timothy Pearson.