summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichele Calgaro <michele.calgaro@yahoo.it>2018-04-27 14:52:38 (GMT)
committer Michele Calgaro <michele.calgaro@yahoo.it>2018-04-27 14:52:38 (GMT)
commite5262dc3bee960e7391ec10296b1ed3d0a1b359e (patch)
tree0b1517941ec789db9dc70cdf8f96793b91d3098c
parent05f478ee16a88bffe9598edf0625844e54f52355 (diff)
downloadkcmautostart-e5262dc3.zip
kcmautostart-e5262dc3.tar.gz
Fixed up and improve code. Remove crashes when a service desktop file
was selected. Fixed crashes when ESC was pressed on the property dialog. This relates to bug 2734, although not enough to close it. Signed-off-by: Michele Calgaro <michele.calgaro@yahoo.it>
-rw-r--r--src/autostart.cpp147
-rw-r--r--src/autostart.h7
2 files changed, 75 insertions, 79 deletions
diff --git a/src/autostart.cpp b/src/autostart.cpp
index 30ac0c0..14387ab 100644
--- a/src/autostart.cpp
+++ b/src/autostart.cpp
@@ -35,10 +35,10 @@
#include <tdeio/job.h>
#include <tqdir.h>
#include <tqheader.h>
-
+#include <tdemessagebox.h>
#include "autostart.h"
-class desktop : public TDEListViewItem {
+class CDesktopItem : public TDEListViewItem {
public:
KService * service;
@@ -47,8 +47,7 @@ public:
int iStartOn;
enum { AutoStart, Shutdown, ENV };
-desktop( TQString service, int startOn, TQListView *parent ): TDEListViewItem( parent ) {
- bisDesktop = false;
+CDesktopItem( TQString service, int startOn, TQListView *parent ): TDEListViewItem( parent ) {
iStartOn = startOn;
fileName = KURL(service);
if (service.endsWith(".desktop")) {
@@ -57,9 +56,17 @@ desktop( TQString service, int startOn, TQListView *parent ): TDEListViewItem( p
}
}
+~CDesktopItem() {
+ if(service) {
+ delete service;
+ service = NULL;
+ }
+}
+
bool isDesktop() { return bisDesktop; }
int startOn() { return iStartOn; }
+
TQString fStartOn() {
switch (iStartOn) {
case AutoStart:
@@ -99,27 +106,30 @@ void setStartOn(int start) {
}
void updateService() {
- if (bisDesktop) service = new KService( fileName.path() );
+ if (bisDesktop) {
+ if (service) {
+ delete service;
+ service = NULL;
+ }
+ service = new KService( fileName.path() );
+ setText( 0, service->name() );
+ setText( 1, service->exec() );
+ setText( 2, fStartOn() );
}
- ~desktop() {
- if(service) {
- service = NULL;
- delete service;
- }
- }
-};
+}
-typedef KGenericFactory<autostart, TQWidget> autostartFactory;
+}; //class CDesktopItem
+
+typedef KGenericFactory<CAutostart, TQWidget> autostartFactory;
K_EXPORT_COMPONENT_FACTORY( kcm_autostart, autostartFactory("kcmautostart"))
-autostart::autostart(TQWidget *parent, const char *name, const TQStringList&)
+CAutostart::CAutostart(TQWidget *parent, const char *name, const TQStringList&)
: TDECModule(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 TDEListView( this, "listCMD" );
@@ -134,15 +144,12 @@ autostart::autostart(TQWidget *parent, const char *name, const TQStringList&)
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") );
@@ -159,7 +166,7 @@ autostart::autostart(TQWidget *parent, const char *name, const TQStringList&)
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( listCMD, TQT_SIGNAL(doubleClicked(TQListViewItem*)), TQT_SLOT(editCMD() ));
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*)) );
@@ -179,10 +186,10 @@ autostart::autostart(TQWidget *parent, const char *name, const TQStringList&)
};
-autostart::~autostart()
+CAutostart::~CAutostart()
{}
-void autostart::load()
+void CAutostart::load()
{
kgs = new TDEGlobalSettings();
kdDebug() << "According to TDE your Autostart location is: " << kgs->autostartPath() << endl;
@@ -207,7 +214,7 @@ void autostart::load()
TQFileInfo *fi;
while ( (fi = it.current()) != 0 ) {
TQString filename = fi->fileName();
- desktop * item = new desktop( fi->absFilePath(), x, listCMD );
+ CDesktopItem * item = new CDesktopItem( fi->absFilePath(), x, listCMD );
if ( ! item->isDesktop() ) {
if ( fi->isSymLink() ) {
TQString link = fi->readLink();
@@ -231,7 +238,7 @@ void autostart::load()
}
}
-void autostart::addCMD() {
+void CAutostart::addCMD() {
KService::Ptr service = 0L;
KOpenWithDlg owdlg( this );
if (owdlg.exec() != TQDialog::Accepted)
@@ -243,8 +250,12 @@ void autostart::addCMD() {
return; // Don't crash if KOpenWith wasn't able to create service.
KURL desktopTemplate;
-
- if ( service->desktopEntryName().isNull() ) {
+
+ if ( service->type() == "Service") {
+ KMessageBox::error(0, i18n("Cannot add a Service entry to the list of autostart modules.\n") + service->desktopEntryPath());
+ return;
+ }
+ else if ( service->desktopEntryName().isNull() ) {
desktopTemplate = KURL( kgs->autostartPath() + service->name() + ".desktop" );
KSimpleConfig ksc(desktopTemplate.path());
ksc.setGroup("Desktop Entry");
@@ -256,97 +267,83 @@ void autostart::addCMD() {
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 )
+ KPropertiesDialog *dlg = new KPropertiesDialog( 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()),
+ // Make sure the URL is not empty to avoid crashing the application
+ if (desktopTemplate.isEmpty()) {
+ KMessageBox::error(0, i18n("Can't find a matching entry for the selected item.\n") + service->desktopEntryPath());
+ return;
+ }
+
+ KPropertiesDialog *dlg = new KPropertiesDialog( desktopTemplate, KURL(kgs->autostartPath()),
service->name() + ".desktop", this, 0, true /*modal*/, false /*no auto-show*/ );
- if ( dlg.exec() != TQDialog::Accepted )
+ if ( dlg->exec() != TQDialog::Accepted )
return;
}
- desktop * item = new desktop( kgs->autostartPath() + service->name() + ".desktop", desktop::AutoStart, listCMD );
+ CDesktopItem * item = new CDesktopItem( kgs->autostartPath() + service->name() + ".desktop", CDesktopItem::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() {
+void CAutostart::removeCMD() {
if (!listCMD->selectedItem())
return;
- TDEIO::del(((desktop *)listCMD->selectedItem())->fileName);
-
- listCMD->takeItem( listCMD->selectedItem() );
+ TQListViewItem *currItem = listCMD->selectedItem();
+ TDEIO::del(((CDesktopItem *)currItem)->fileName);
+ listCMD->takeItem(currItem);
+ delete currItem;
+
kdDebug() << "Deleting file" << endl;
-
emit changed(true);
}
-void autostart::editCMD(TQListViewItem* entry) {
- if (!entry)
- return;
+void CAutostart::editCMD() {
+ CDesktopItem *currItem = (CDesktopItem*)(listCMD->selectedItem());
+ if (!currItem) return;
+
+ KFileItem kfi = KFileItem(KFileItem::Unknown, KFileItem::Unknown, KURL(currItem->fileName), true);
+ if (!editCMD(kfi)) 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() );
- }
+ currItem->updateService();
}
-bool autostart::editCMD( KFileItem item) {
- KPropertiesDialog dlg( &item, this );
- if ( dlg.exec() != TQDialog::Accepted )
+bool CAutostart::editCMD( KFileItem item) {
+ KPropertiesDialog *dlg = new KPropertiesDialog(&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 CAutostart::setStartOn( int index ) {
+ ((CDesktopItem*)listCMD->currentItem())->setStartOn(index);
}
-void autostart::setStartOn( int index ) {
- ((desktop*)listCMD->currentItem())->setStartOn(index);
-}
-
-void autostart::selectionChanged(TQListViewItem* entry) {
+void CAutostart::selectionChanged(TQListViewItem* entry) {
cmbStartOn->setEnabled( (entry != 0) );
- cmbStartOn->setCurrentItem( ((desktop*)entry)->startOn() );
+ cmbStartOn->setCurrentItem( ((CDesktopItem*)entry)->startOn() );
}
-void autostart::defaults(){}
-
-
-void autostart::save()
-{}
+void CAutostart::defaults(){}
+void CAutostart::save(){}
-int autostart::buttons()
+int CAutostart::buttons()
{
return TDECModule::Apply|TDECModule::Help;
}
-
-TQString autostart::quickHelp() const
+TQString CAutostart::quickHelp() const
{
return i18n("This module helps configure which applications TDE runs when starting and exiting.");
}
diff --git a/src/autostart.h b/src/autostart.h
index 78122d5..25381e1 100644
--- a/src/autostart.h
+++ b/src/autostart.h
@@ -33,13 +33,13 @@
#include <tqpushbutton.h>
#include <tqcombobox.h>
-class autostart: public TDECModule
+class CAutostart: public TDECModule
{
Q_OBJECT
public:
- autostart( TQWidget *parent=0, const char *name=0, const TQStringList& = TQStringList() );
- ~autostart();
+ CAutostart( TQWidget *parent=0, const char *name=0, const TQStringList& = TQStringList() );
+ ~CAutostart();
virtual void load();
virtual void save();
@@ -52,7 +52,6 @@ public:
public slots:
void addCMD();
void removeCMD();
- void editCMD(TQListViewItem*);
bool editCMD(KFileItem);
void editCMD();
void setStartOn(int);