_ A GPLed French language synth is available at
      http://www.cam.org/~nico/cicero
      
_ Possible bug. "<" characters not being properly stored in the .xml file?

_ DBUS Interface
    _ Refactor so that each job is an object and emits signals from
      object path /org/kde/KSpeechJob_NN.  Apps can receive these signals
      using
      
          QDBus::sessionBus().connect("org.kde.kttsd", QString(),
          "org.kde.KSpeechJob", "signalname", this, SLOT(slotName()));
        
      Thiago tells me that the QString() for object path name will
      filter on all objects with interface org.kde.KSpeechJob.
      This is because QtDBus receives all signals.
      
      <thiago> right now, I gave it only two rules: "all signals"
      and "everything whose destination is me"
      
      and then filters on what the connect specifies.
      Once in place, the only signals emitted by KSpeech will be
      kttsdStarted and kttsdExiting.  Everything else will come
      from the jobs.  In theory, this means that apps that aren't
      interesting in tracking jobs don't need to receive those events,
      but OTOH, if an app is receiving any events, then it
      chances are it is interested in most/all of the events.
      The only real advantage to this change is that apps that are
      interesting in tracking only a single job can receive those
      signals and don't have to check the appId (assuming they
      created the job in the first place).  Is this advantage
      worth the pain of refactoring kttsd?  Thoughts:
          _ I want to make everything (text, messages, warnings, and SR)
            jobs so that KttsJobMgr can track all speech.
          _ There's already an mlTextJob structure, so converting that
            to an object won't be that hard.
      
    _ Add setFriendlyName(QString &name) to interface and
      QString getFriendlyName(QString &appId) so that friendly names
      can be displayed in KttsJobMgr.  
      
      <thiago> hint: connect to the nameOwnerChange signal from
      QDBus::sessionBus().busService() to find out when the application
      :1.120 goes away, so that you can release the resource
        
KDE4 above this line
-------------------------------------------------------------------------
_ Filters:
    _ XHTMLtoSSML stylesheet needs work to provide better mappings for most web pages.
    _ Add KNewStuff capability for folks to upload/download filter configs.
    _ There should be a default set of filters configured when user first runs KTTSMgr.
      If user presses Default button, it should ask user whether to replace all existing
      filters with the standard set.  The standard set should probably include
      the Qt to Plain Text and Fix Festival Unspeakable Characters filters, but I'm not
      sure about the latter when desktop is not ISO 8859-1.

_ Handbook:
    _ Mention that "Root element is" and "DOCTYPE" are case sensitive.  "html" is not
      the same as "HTML".  It should stay this way, BTW.  Proper xhtml requires lowercase
      tags.
_ KTTSMgr:
    _ Speech is paused when showing tooltip when mouse cursor is placed over tray icon.
    _ Add ability to quickly pick default Talker in systray menu.
    _ Add drag N drop for the Talkers so it is easier to change the ordering.
    _ It is possible to configure multiple instances of Talkers with the exact same configuration.
    _ In kcmkttsmgr, use setHelp() to set help anchor based on current tab.
    _ Add playback controls to kttsmgr.  Volume, pause.  Maybe rewind?
_ KTTSD:
    _ I am told that when kttsd crashes, it can take knotify down with it.  See about
      "disconnecting" knotify from kttsd (using post to Qt event queue).
    _ While kttsd currently configures a Talker automatically, would be nice if it could
      autoconfigure talkers for each requested language, if one has not already been configured.
    _ Add support for speech markers.
    _ Implement error signal handling in KTTSD.
    _ Add support for JSML and other Speech Markup languages.
    _ Add method for apps to play a sound file, including in the middle of a job.
      Could be done with SSML or with special Talker Code = "sound".
_ Other/General:
    _ Save buttons should confirm if user chooses an existing file.  KFileDialog doesn't seem to
      offer this option, but shouldn't it?
    _ .desktop files must have a Type keyword, but what to use for kcmkttsd_testmessage.desktop?
    _ Convert to KConfig XT.
    _ Add a plugin for TuxTalk, http://tuxtalk.sourceforge.net/.  Since it only supports
      English (at the moment) and is alpha, don't think it is worth it now.
    _ IBM ViaVoice speech-dispatcher plugin?
    _ Add KTTS plugin to aKregator.
