diff options
| author | Timothy Pearson <kb9vqf@pearsoncomputing.net> | 2012-05-05 17:47:47 -0500 | 
|---|---|---|
| committer | Timothy Pearson <kb9vqf@pearsoncomputing.net> | 2012-05-05 17:47:47 -0500 | 
| commit | 81dce195f1f6b18b66f2bbbe4ec6b10bb1387379 (patch) | |
| tree | 0c3e06a8a35224dc79a29edfeb502f650add547c /src/autostart.cpp | |
| download | kcmautostart-81dce195f1f6b18b66f2bbbe4ec6b10bb1387379.tar.gz kcmautostart-81dce195f1f6b18b66f2bbbe4ec6b10bb1387379.zip  | |
Initial import
Diffstat (limited to 'src/autostart.cpp')
| -rw-r--r-- | src/autostart.cpp | 349 | 
1 files changed, 349 insertions, 0 deletions
diff --git a/src/autostart.cpp b/src/autostart.cpp new file mode 100644 index 0000000..5c07d5f --- /dev/null +++ b/src/autostart.cpp @@ -0,0 +1,349 @@ +/*************************************************************************** + *   Copyright (C) 2006 by Stephen Leaf                                    * + *   smileaf@smileaf.org                                                   * + *                                                                         * + *   This program is free software; you can redistribute it and/or modify  * + *   it under the terms of the GNU General Public License as published by  * + *   the Free Software Foundation; either version 2 of the License, or     * + *   (at your option) any later version.                                   * + *                                                                         * + *   This program is distributed in the hope that it will be useful,       * + *   but WITHOUT ANY WARRANTY; without even the implied warranty of        * + *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         * + *   GNU General Public License for more details.                          * + *                                                                         * + *   You should have received a copy of the GNU General Public License     * + *   along with this program; if not, write to the                         * + *   Free Software Foundation, Inc.,                                       * + *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             * + ***************************************************************************/ + +/* Adapted for use in the Trinity Desktop Environment */ + +#include <tqlayout.h> + +#include <klocale.h> +#include <kglobal.h> +#include <kparts/genericfactory.h> +#include <ksimpleconfig.h> +#include <kglobalsettings.h> +#include <kstandarddirs.h> +#include <kurlrequester.h> +#include <klistview.h> +#include <kopenwith.h> +#include <kpropertiesdialog.h> +#include <kio/job.h> +#include <tqdir.h> +#include <tqheader.h> + +#include "autostart.h" + +class desktop : public KListViewItem { + +public: +  KService * service; +  bool bisDesktop; +  KURL fileName; +  int iStartOn; +  enum { AutoStart, Shutdown, ENV }; + +desktop( TQString service, int startOn, TQListView *parent ): KListViewItem( parent ) { +  bisDesktop = false; +  iStartOn = startOn; +  fileName = KURL(service); +  if (service.endsWith(".desktop")) { +    this->service = new KService(service); +    bisDesktop = true; +  } +} + +bool isDesktop() { return bisDesktop; } + +int startOn() { return iStartOn; } +TQString fStartOn() { +  switch (iStartOn) { +    case AutoStart: +      return i18n("Startup"); +      break; +    case Shutdown: +      return i18n("Shutdown"); +      break; +    case ENV: +      return i18n("ENV"); +      break; +    default: +      return ""; +      break; +  } +} + +void setStartOn(int start) { +  iStartOn = start; +  setText(2, fStartOn() ); +  KStandardDirs *ksd = new KStandardDirs(); +  KGlobalSettings * kgs = new KGlobalSettings(); +  TQString path; +  switch (iStartOn) { +    case AutoStart: +      path = kgs->autostartPath()+"/"; +      break; +    case Shutdown: +      path = ksd->localtdedir()+"shutdown/"; +      break; +    case ENV: +      path = ksd->localtdedir()+"env/"; +      break; +  } +  KIO::file_move(fileName, KURL( path + fileName.fileName() )); +  fileName = path + fileName.fileName(); +} + +void updateService() { +  if (bisDesktop) service = new KService( fileName.path() ); +  } +  ~desktop() { +    delete service; +  } +}; + +typedef KGenericFactory<autostart, TQWidget> autostartFactory; + +K_EXPORT_COMPONENT_FACTORY( kcm_autostart, autostartFactory("kcmautostart")) + +autostart::autostart(TQWidget *parent, const char *name, const TQStringList&) +    : KCModule(parent, name), myAboutData(0) +{ +  TQGridLayout * AutostartConfigLayout = new TQGridLayout( this, 1, 1, 11, 6, "AutostartConfigLayout"); + +  btnAdd = new KPushButton( this, "btnAdd" ); + +  AutostartConfigLayout->addWidget( btnAdd, 0, 1 ); + +  listCMD = new KListView( this, "listCMD" ); +  listCMD->addColumn( i18n( "Name" ) ); +  listCMD->addColumn( i18n( "Command" ) ); +  listCMD->addColumn( i18n( "Run on" ) ); +  listCMD->setAllColumnsShowFocus( TRUE ); +  listCMD->setShowSortIndicator( TRUE ); + +  AutostartConfigLayout->addMultiCellWidget( listCMD, 0, 4, 0, 0 ); +  TQSpacerItem * spacer1 = new TQSpacerItem( 71, 170, TQSizePolicy::Minimum, TQSizePolicy::Expanding ); +  AutostartConfigLayout->addItem( spacer1, 4, 1 ); + +  btnRemove = new KPushButton( this, "btnRemove" ); + +  AutostartConfigLayout->addWidget( btnRemove, 1, 1 ); + +  btnProperties = new TQPushButton( this, "btnProperties" ); + +  AutostartConfigLayout->addWidget( btnProperties, 2, 1 ); + +  cmbStartOn = new TQComboBox( this, "cmbStartOn" ); + +  AutostartConfigLayout->addWidget( cmbStartOn, 3, 1 ); + +  cmbStartOn->insertItem( i18n("Startup") ); +  cmbStartOn->insertItem( i18n("Shutdown") ); +  cmbStartOn->insertItem( i18n("ENV") ); +  cmbStartOn->setEnabled(false); + +  btnAdd->setText( i18n( "&Add" ) ); +  btnAdd->setAccel( TQKeySequence( i18n( "Alt+A" ) ) ); +  btnRemove->setText( i18n( "&Remove" ) ); +  btnRemove->setAccel( TQKeySequence( i18n( "Alt+R" ) ) ); +  btnProperties->setText( i18n( "&Properties" ) ); +  btnProperties->setAccel( TQKeySequence( i18n( "Alt+P" ) ) ); + +  connect( btnAdd, TQT_SIGNAL(clicked()), TQT_SLOT(addCMD()) ); +  connect( btnRemove, TQT_SIGNAL(clicked()), TQT_SLOT(removeCMD()) ); +  connect( listCMD, TQT_SIGNAL(doubleClicked(TQListViewItem*)), TQT_SLOT(editCMD(TQListViewItem*)) ); +  connect( btnProperties, TQT_SIGNAL(clicked()), TQT_SLOT(editCMD()) ); +  connect( cmbStartOn, TQT_SIGNAL(activated(int)), TQT_SLOT(setStartOn(int)) ); +  connect( listCMD, TQT_SIGNAL(selectionChanged(TQListViewItem*)), TQT_SLOT(selectionChanged(TQListViewItem*)) ); + +  listCMD->setFocus(); + +  load(); + +  KAboutData* about = new KAboutData("autostart", I18N_NOOP("TDE Autostart Manager"), "0.5", +    I18N_NOOP("TDE Autostart Manager Control Panel Module"), +    KAboutData::License_GPL, +    I18N_NOOP("(c) 2006 Stephen Leaf"), 0, 0); + +  about->addAuthor("Stephen Leaf", 0, "smileaf@smileaf.org"); +  setAboutData( about ); + +}; + + +autostart::~autostart() +{} + +void autostart::load() +{ +  kgs = new KGlobalSettings(); +  kdDebug() << "According to TDE your Autostart location is: " << kgs->autostartPath() << endl; +  KStandardDirs *ksd = new KStandardDirs(); + +  TQString path; +  for (int x=0;x<3;x++) { +    if (x==0) +      path = kgs->autostartPath(); +    else if (x==1) +      path = ksd->localtdedir() + "/shutdown"; +    else if (x==2) +      path = ksd->localtdedir() + "/env"; + +    if (! KStandardDirs::exists(path)) +      KStandardDirs::makeDir(path); + +    TQDir *autostartdir = new TQDir( path ); +    autostartdir->setFilter( TQDir::Files); +    const TQFileInfoList *list = autostartdir->entryInfoList(); +    TQFileInfoListIterator it( *list ); +    TQFileInfo *fi; +    while ( (fi = it.current()) != 0 ) { +      TQString filename = fi->fileName(); +      desktop * item = new desktop( fi->absFilePath(), x, listCMD ); +      if ( ! item->isDesktop() ) { +        if ( fi->isSymLink() ) { +          TQString link = fi->readLink(); +          item->setText( 0, filename ); +          item->setText( 1, link ); +          item->setText( 2, item->fStartOn() ); +        } +        else { +          item->setText( 0, filename ); +          item->setText( 1, filename ); +          item->setText( 2, item->fStartOn() ); +        } +      } +      else { +        item->setText( 0, item->service->name() ); +        item->setText( 1, item->service->exec() ); +        item->setText( 2, item->fStartOn() ); +      } +      ++it; +    } +  } +} + +void autostart::addCMD() { +  KService::Ptr service = 0L; +  KOpenWithDlg owdlg( this ); +  if (owdlg.exec() != TQDialog::Accepted) +    return; +  service = owdlg.service(); + +  Q_ASSERT(service); +  if (!service) +    return; // Don't crash if KOpenWith wasn't able to create service. + +  KURL desktopTemplate; + +  if ( service->desktopEntryName().isNull() ) { +    desktopTemplate = KURL( kgs->autostartPath() + service->name() + ".desktop" ); +    KSimpleConfig ksc(desktopTemplate.path()); +    ksc.setGroup("Desktop Entry"); +    ksc.writeEntry("Encoding","UTF-8"); +    ksc.writeEntry("Exec",service->exec()); +    ksc.writeEntry("Icon","exec"); +    ksc.writeEntry("Path",""); +    ksc.writeEntry("Terminal",false); +    ksc.writeEntry("Type","Application"); +    ksc.sync(); + +    // FIXME: Make it so you can't give focus to the parent before this goes away. +    // If the parent closes before this does, a crash is generated. +    KPropertiesDialog dlg( desktopTemplate, this, 0, true /*modal*/, false /*no auto-show*/ ); +    if ( dlg.exec() != TQDialog::Accepted ) +      return; +  } +  else { +    desktopTemplate = KURL( locate("apps", service->desktopEntryPath()) ); + +    // FIXME: Make it so you can't give focus to the parent before this goes away. +    // If the parent closes before this does, a crash is generated. +    KPropertiesDialog dlg( desktopTemplate, KURL(kgs->autostartPath()), +      service->name() + ".desktop", this, 0, true /*modal*/, false /*no auto-show*/ ); +    if ( dlg.exec() != TQDialog::Accepted ) +      return; +  } + +  desktop * item = new desktop( kgs->autostartPath() + service->name() + ".desktop", desktop::AutoStart, listCMD ); +  item->setText( 0, item->service->name() ); +  item->setText( 1, item->service->exec() ); +  item->setText( 2, item->fStartOn() ); +  emit changed(true); +} + +void autostart::removeCMD() { +  if (!listCMD->selectedItem()) +    return; + +  KIO::del(((desktop *)listCMD->selectedItem())->fileName); + +  listCMD->takeItem( listCMD->selectedItem() ); +  kdDebug() << "Deleting file" << endl; + +  emit changed(true); +} + +void autostart::editCMD(TQListViewItem* entry) { +  if (!entry) +    return; + +  ((desktop*)entry)->updateService(); +  KFileItem kfi = KFileItem( KFileItem::Unknown, KFileItem::Unknown, KURL( ((desktop*)entry)->fileName ), true ); +  if (! editCMD( kfi )) return; + +  // Remove and recreate +  if (((desktop*)entry)->isDesktop()) { +    listCMD->takeItem( listCMD->selectedItem() ); +    desktop * item = new desktop( ((desktop*)entry)->fileName.path(), ((desktop*)entry)->startOn(), listCMD ); +    item->setText( 0, ((desktop*)entry)->service->name() ); +    item->setText( 1, ((desktop*)entry)->service->exec() ); +    item->setText( 2, ((desktop*)entry)->fStartOn() ); +  } +} + +bool autostart::editCMD( KFileItem item) { +  KPropertiesDialog dlg( &item, this ); +  if ( dlg.exec() != TQDialog::Accepted ) +    return false; + +  kdDebug() << "Saving file" << endl; +  emit changed(true); +  return true; +} + +void autostart::editCMD() { +  editCMD( listCMD->selectedItem() ); +} + +void autostart::setStartOn( int index ) { +  ((desktop*)listCMD->currentItem())->setStartOn(index); +} + +void autostart::selectionChanged(TQListViewItem* entry) { +  cmbStartOn->setEnabled( (entry != 0) ); +  cmbStartOn->setCurrentItem( ((desktop*)entry)->startOn() ); +} + +void autostart::defaults(){} + + +void autostart::save() +{} + + +int autostart::buttons() +{ +  return KCModule::Apply|KCModule::Help; +} + + +TQString autostart::quickHelp() const +{ +  return i18n("This module helps configure which applications TDE runs when starting and exiting."); +}  | 
