~niels-thykier/sentinella/master

« back to all changes in this revision

Viewing changes to src/MainWindow.cpp

  • Committer: Carlos Olmedo Escobar
  • Date: 2011-05-06 18:26:40 UTC
  • Revision ID: git-v1:f1253f64338d149cd14cb39a14504336a94929fa
Using always the constants instead of numbers.

Show diffs side-by-side

added added

removed removed

Lines of Context:
54
54
#include <iostream>
55
55
 
56
56
// Ids of the condition radiobuttons
57
 
#define RADIOBUTTONCPU 0
58
 
#define RADIOBUTTONMEMORY 1
59
 
#define RADIOBUTTONNETWORK 2
60
 
#define RADIOBUTTONDATETIME 3
61
 
#define RADIOBUTTONPROCESSDIES 4
 
57
#define CONDITION_CPU_ID 0
 
58
#define CONDITION_MEMORY_ID 1
 
59
#define CONDITION_NETWORK_ID 2
 
60
#define CONDITION_DATETIME_ID 3
 
61
#define CONDITION_PROCESSDIES_ID 4
62
62
 
63
 
// Ids of the action radiobuttons (shutdown and reboot are the same because they use the same QStackedWiget page)
64
 
#define RADIOBUTTONSHUTDOWN 0
65
 
#define RADIOBUTTONREBOOT 1
66
 
#define RADIOBUTTONSLEEP 2
67
 
#define RADIOBUTTONEXECUTECOMMAND 3
68
 
#define RADIOBUTTONPLAYALARM 4
69
 
#define RADIOBUTTONKILLPROCESS 5
 
63
// Ids of the action radiobuttons
 
64
#define ACTION_SHUTDOWN_ID 0
 
65
#define ACTION_REBOOT_ID 1
 
66
#define ACTION_SLEEP_ID 2
 
67
#define ACTION_EXECUTECOMMAND_ID 3
 
68
#define ACTION_PLAYALARM_ID 4
 
69
#define ACTION_KILLPROCESS_ID 5
70
70
 
71
71
MainWindow::MainWindow(const KAboutData& aboutData, KCmdLineArgs* cmdLineArgs,
72
72
                const short cmdChosenCondition, const short cmdChosenAction) :
98
98
                        trayIcon.contextMenu()));
99
99
        trayIcon.setIconByName("sentinella");
100
100
 
101
 
        conditionsGroup.addButton(gui.radioButtonCPU, RADIOBUTTONCPU);
102
 
        conditionsGroup.addButton(gui.radioButtonMemory, RADIOBUTTONMEMORY);
103
 
        conditionsGroup.addButton(gui.radioButtonNetwork, RADIOBUTTONNETWORK);
104
 
        conditionsGroup.addButton(gui.radioButtonDateTime, RADIOBUTTONDATETIME);
105
 
        conditionsGroup.addButton(gui.radioButtonProcessDies, RADIOBUTTONPROCESSDIES);
 
101
        conditionsGroup.addButton(gui.radioButtonCPU, CONDITION_CPU_ID);
 
102
        conditionsGroup.addButton(gui.radioButtonMemory, CONDITION_MEMORY_ID);
 
103
        conditionsGroup.addButton(gui.radioButtonNetwork, CONDITION_NETWORK_ID);
 
104
        conditionsGroup.addButton(gui.radioButtonDateTime, CONDITION_DATETIME_ID);
 
105
        conditionsGroup.addButton(gui.radioButtonProcessDies, CONDITION_PROCESSDIES_ID);
106
106
        connect(gui.radioButtonNetwork, SIGNAL(toggled(bool)), this, SLOT(radioButtonNetworkToggled(bool)));
107
107
        connect(&conditionsGroup, SIGNAL(buttonClicked(int)), gui.stackedWidgetConditions, SLOT(setCurrentIndex(int)));
108
108
        connect(gui.pushButtonProcessDies, SIGNAL(clicked(bool)), this, SLOT(programDiesClicked()));
109
109
 
110
110
        if (supportedShutdown) {
111
 
                actionsGroup.addButton(gui.radioButtonShutdown, RADIOBUTTONSHUTDOWN);
112
 
                actionsGroup.addButton(gui.radioButtonReboot, RADIOBUTTONREBOOT);
 
111
                actionsGroup.addButton(gui.radioButtonShutdown, ACTION_SHUTDOWN_ID);
 
112
                actionsGroup.addButton(gui.radioButtonReboot, ACTION_REBOOT_ID);
113
113
        } else {
114
114
                gui.radioButtonShutdown->setEnabled(false);
115
115
                gui.radioButtonReboot->setEnabled(false);
117
117
        if (supportedSleepStates.empty())
118
118
                gui.radioButtonSleep->setEnabled(false);
119
119
        else
120
 
                actionsGroup.addButton(gui.radioButtonSleep, RADIOBUTTONSLEEP);
121
 
        actionsGroup.addButton(gui.radioButtonExecuteCommand, RADIOBUTTONEXECUTECOMMAND);
122
 
        actionsGroup.addButton(gui.radioButtonPlayAlarm, RADIOBUTTONPLAYALARM);
123
 
        actionsGroup.addButton(gui.radioButtonKillProcess, RADIOBUTTONKILLPROCESS);
 
120
                actionsGroup.addButton(gui.radioButtonSleep, ACTION_SLEEP_ID);
 
121
        actionsGroup.addButton(gui.radioButtonExecuteCommand, ACTION_EXECUTECOMMAND_ID);
 
122
        actionsGroup.addButton(gui.radioButtonPlayAlarm, ACTION_PLAYALARM_ID);
 
123
        actionsGroup.addButton(gui.radioButtonKillProcess, ACTION_KILLPROCESS_ID);
124
124
        connect(gui.radioButtonPlayAlarm, SIGNAL(toggled(bool)), this, SLOT(radioButtonPlayAlarmToggled(bool)));
125
125
        connect(&actionsGroup, SIGNAL(buttonClicked(int)), this, SLOT(actionButtonClicked(int)));
126
126
        connect(gui.pushButtonKillProcess, SIGNAL(clicked(bool)), this, SLOT(killProcessClicked()));
197
197
        else {
198
198
                KConfigGroup group = config->group("Conditions");
199
199
                aux = group.readEntry("LastExecuted", 0);
200
 
                if (aux < 0 || aux > 4)
201
 
                        aux = 0;
 
200
                if (aux < CONDITION_CPU_ID || aux > CONDITION_PROCESSDIES_ID)
 
201
                        aux = CONDITION_CPU_ID;
202
202
        }
203
203
 
204
204
        conditionsGroup.button(aux)->setChecked(true);
213
213
 
214
214
        KConfigGroup groupCPU = config->group("ConditionCPU");
215
215
        gui.comboBoxCPU->setCurrentIndex(aux != -1 ? aux : groupCPU.readEntry("Higher", 1));
216
 
        gui.spinBoxCPU->setValue(cmdChosenCondition == 0 ? cmdLineArgs->getOption("cpu").toInt()
217
 
                        : groupCPU.readEntry("Percentage", 10));
218
 
        gui.timeEditCPU->setTime(QTime::fromString(cmdChosenCondition == 0 && cmdLineArgs->isSet(
219
 
                        "during") ? cmdLineArgs->getOption("during") : groupCPU.readEntry("Time", "01:00"),
220
 
                        "mm:ss"));
 
216
        gui.spinBoxCPU->setValue(
 
217
                        cmdChosenCondition == CONDITION_CPU_ID ? cmdLineArgs->getOption("cpu").toInt()
 
218
                                        : groupCPU.readEntry("Percentage", 10));
 
219
        gui.timeEditCPU->setTime(QTime::fromString(cmdChosenCondition == CONDITION_CPU_ID
 
220
                        && cmdLineArgs->isSet("during") ? cmdLineArgs->getOption("during")
 
221
                        : groupCPU.readEntry("Time", "01:00"), "mm:ss"));
221
222
 
222
223
        KConfigGroup groupMemory = config->group("ConditionMemory");
223
224
        gui.comboBoxMemory->setCurrentIndex(aux != -1 ? aux : groupMemory.readEntry("Higher", 1));
224
 
        gui.spinBoxMemory->setValue(cmdChosenCondition == 1 ? cmdLineArgs->getOption("memory").toInt()
225
 
                        : groupMemory.readEntry("Amount", 512));
226
 
        gui.timeEditMemory->setTime(QTime::fromString(cmdChosenCondition == 1 && cmdLineArgs->isSet(
227
 
                        "during") ? cmdLineArgs->getOption("during") : groupMemory.readEntry("Time", "01:00"),
228
 
                        "mm:ss"));
 
225
        gui.spinBoxMemory->setValue(cmdChosenCondition == CONDITION_MEMORY_ID ? cmdLineArgs->getOption(
 
226
                        "memory").toInt() : groupMemory.readEntry("Amount", 512));
 
227
        gui.timeEditMemory->setTime(QTime::fromString(cmdChosenCondition == CONDITION_MEMORY_ID
 
228
                        && cmdLineArgs->isSet("during") ? cmdLineArgs->getOption("during")
 
229
                        : groupMemory.readEntry("Time", "01:00"), "mm:ss"));
229
230
 
230
231
        KConfigGroup groupNetwork = config->group("ConditionNetwork");
231
232
        gui.comboBoxNetworkDirection->setCurrentIndex(groupNetwork.readEntry("Direction", 0));
232
233
        gui.comboBoxNetworkHigher->setCurrentIndex(aux != -1 ? aux
233
234
                        : groupNetwork.readEntry("Higher", 0));
234
235
        gui.spinBoxNetwork->setValue(
235
 
                        cmdChosenCondition == 2 ? cmdLineArgs->getOption("network").toInt()
 
236
                        cmdChosenCondition == CONDITION_NETWORK_ID ? cmdLineArgs->getOption("network").toInt()
236
237
                                        : groupNetwork.readEntry("Amount", 10));
237
 
        gui.timeEditNetwork->setTime(QTime::fromString(cmdChosenCondition == 2 && cmdLineArgs->isSet(
238
 
                        "during") ? cmdLineArgs->getOption("during") : groupNetwork.readEntry("Time", "01:00"),
239
 
                        "mm:ss"));
 
238
        gui.timeEditNetwork->setTime(QTime::fromString(cmdChosenCondition == CONDITION_NETWORK_ID
 
239
                        && cmdLineArgs->isSet("during") ? cmdLineArgs->getOption("during")
 
240
                        : groupNetwork.readEntry("Time", "01:00"), "mm:ss"));
240
241
 
241
242
        QDateTime dateTime;
242
 
        if (cmdChosenCondition == 3)
 
243
        if (cmdChosenCondition == CONDITION_DATETIME_ID)
243
244
                dateTime = QDateTime::fromString(cmdLineArgs->getOption("date-time"), Qt::ISODate);
244
 
        if (cmdChosenCondition != 3 || !dateTime.isValid()) {
 
245
        if (cmdChosenCondition != CONDITION_DATETIME_ID || !dateTime.isValid()) {
245
246
                KConfigGroup groupDateTime = config->group("ConditionDateTime");
246
247
                dateTime = QDateTime::currentDateTime().addSecs(
247
248
                                groupDateTime.readEntry("Interval", "1800").toInt());
250
251
        dateTime.setTime(readTime);
251
252
        gui.kdatetimewidgetDateTime->setDateTime(dateTime);
252
253
 
253
 
        if (cmdChosenCondition == 4) {
 
254
        if (cmdChosenCondition == CONDITION_PROCESSDIES_ID) {
254
255
                if (processAPI != NULL || createProcess()) {
255
256
                        struct sa_process procInfo;
256
257
                        procInfo.pid = cmdLineArgs->getOption("program-dies").toInt();
272
273
        else {
273
274
                KConfigGroup group = config->group("Actions");
274
275
                chosen = group.readEntry("LastExecuted", 0);
275
 
                if (chosen < 0 || chosen > 5)
276
 
                        chosen = 0;
 
276
                if (chosen < ACTION_SHUTDOWN_ID || chosen > ACTION_KILLPROCESS_ID)
 
277
                        chosen = ACTION_SHUTDOWN_ID;
277
278
        }
278
279
 
279
280
        actionsGroup.button(chosen)->click();
281
282
        if (!isKDE) {
282
283
                gui.checkBoxShutdownForce->setChecked(false);
283
284
                gui.checkBoxShutdownForce->setEnabled(false);
284
 
        } else if (cmdChosenAction == 0 || cmdChosenAction == 1) {
285
 
                gui.checkBoxShutdownForce->setChecked(cmdLineArgs->getOption(
286
 
                                cmdChosenAction == 0 ? "shutdown" : "reboot") == "yes");
 
285
        } else if (cmdChosenAction == ACTION_SHUTDOWN_ID || cmdChosenAction == ACTION_REBOOT_ID) {
 
286
                gui.checkBoxShutdownForce->setChecked(cmdLineArgs->getOption(cmdChosenAction
 
287
                                == ACTION_SHUTDOWN_ID ? "shutdown" : "reboot") == "yes");
287
288
        } else {
288
289
                KConfigGroup groupShutdown = config->group("ActionShutdown");
289
290
                gui.checkBoxShutdownForce->setChecked(groupShutdown.readEntry("Force", true));
298
299
                                Solid::PowerManagement::HibernateState));
299
300
 
300
301
                Solid::PowerManagement::SleepState state;
301
 
                if (cmdChosenAction == 2) { // cmd arg
 
302
                if (cmdChosenAction == ACTION_SLEEP_ID) { // cmd arg
302
303
                        QString cmdSleepArg = cmdLineArgs->getOption("sleep");
303
304
                        if (cmdSleepArg == "Standby")
304
305
                                state = Solid::PowerManagement::StandbyState;
329
330
                }
330
331
        }
331
332
 
332
 
        if (cmdChosenAction == 3) {
 
333
        if (cmdChosenAction == ACTION_EXECUTECOMMAND_ID) {
333
334
                QTextStream textStream(stdin);
334
335
                gui.texteditExecuteCommand->setPlainText(textStream.readLine());
335
 
        } else if (chosen == 3) {
 
336
        } else if (chosen == ACTION_EXECUTECOMMAND_ID) {
336
337
                KConfigGroup groupExecuteCommand = config->group("ActionExecuteCommand");
337
338
                gui.texteditExecuteCommand->setPlainText(groupExecuteCommand.readEntry("Command"));
338
 
        } else if (cmdChosenAction == 5) {
 
339
        } else if (cmdChosenAction == ACTION_KILLPROCESS_ID) {
339
340
                if (processAPI != NULL || createProcess()) {
340
341
                        struct sa_process procInfo;
341
342
                        procInfo.pid = cmdLineArgs->getOption("terminate-program").toInt();
470
471
        // validating actions
471
472
        int actionCheckedId = actionsGroup.checkedId();
472
473
        switch (actionCheckedId) {
473
 
        case RADIOBUTTONSLEEP:
 
474
        case ACTION_SLEEP_ID:
474
475
                if (!gui.radioButtonSleepStandBy->isChecked() && !gui.radioButtonSleepSuspend->isChecked()
475
476
                                && !gui.radioButtonSleepHibernate->isChecked()) {
476
477
                        KMessageBox::sorry(this, i18nc(
479
480
                        return;
480
481
                }
481
482
                break;
482
 
        case RADIOBUTTONEXECUTECOMMAND:
 
483
        case ACTION_EXECUTECOMMAND_ID:
483
484
                if (gui.texteditExecuteCommand->toPlainText().isEmpty()) {
484
485
                        KMessageBox::sorry(this, i18n("A command must be specified."));
485
486
                        return;
486
487
                }
487
488
                break;
488
 
        case RADIOBUTTONKILLPROCESS:
 
489
        case ACTION_KILLPROCESS_ID:
489
490
                if (pidKillProcess == 0) {
490
491
                        KMessageBox::sorry(this, i18n("You must select a program to kill."));
491
492
                        return;
499
500
        // validating conditions
500
501
        qint64 msecs = 0;
501
502
        int conditionCheckedId = conditionsGroup.checkedId();
502
 
        if (conditionCheckedId == RADIOBUTTONCPU || conditionCheckedId == RADIOBUTTONMEMORY
503
 
                        || conditionCheckedId == RADIOBUTTONNETWORK) {
 
503
        if (conditionCheckedId == CONDITION_CPU_ID || conditionCheckedId == CONDITION_MEMORY_ID
 
504
                        || conditionCheckedId == CONDITION_NETWORK_ID) {
504
505
                QTime time;
505
506
                switch (conditionCheckedId) {
506
 
                case RADIOBUTTONCPU:
 
507
                case CONDITION_CPU_ID:
507
508
                        time = gui.timeEditCPU->time();
508
509
                        break;
509
 
                case RADIOBUTTONMEMORY:
 
510
                case CONDITION_MEMORY_ID:
510
511
                        time = gui.timeEditMemory->time();
511
512
                        break;
512
 
                case RADIOBUTTONNETWORK:
 
513
                case CONDITION_NETWORK_ID:
513
514
                        time = gui.timeEditNetwork->time();
514
515
                        break;
515
516
                }
523
524
        }
524
525
 
525
526
        switch (conditionCheckedId) {
526
 
        case RADIOBUTTONCPU:
 
527
        case CONDITION_CPU_ID:
527
528
                condition = new CPU(msecs, 2000, gui.spinBoxCPU->value(), gui.comboBoxCPU->currentIndex()
528
529
                                == 0);
529
530
                break;
530
 
        case RADIOBUTTONMEMORY:
 
531
        case CONDITION_MEMORY_ID:
531
532
                condition = new Memory(msecs, 4000, gui.spinBoxMemory->value() * 1048576,
532
533
                                gui.comboBoxMemory->currentIndex() == 0);
533
534
                break;
534
 
        case RADIOBUTTONNETWORK:
 
535
        case CONDITION_NETWORK_ID:
535
536
                if (networkInterfaceAPI == NULL)
536
537
                        networkInterfaceAPI = new NetworkInterface();
537
538
                condition = new Network(networkInterfaceAPI, msecs, 2000,
539
540
                                gui.comboBoxNetworkHigher->currentIndex() == 0,
540
541
                                gui.comboBoxNetworkDirection->currentIndex() == 0 ? DOWNLOAD : UPLOAD);
541
542
                break;
542
 
        case RADIOBUTTONDATETIME:
 
543
        case CONDITION_DATETIME_ID:
543
544
                msecs = QDateTime::currentDateTime().msecsTo(gui.kdatetimewidgetDateTime->dateTime());
544
545
                if (msecs <= 0) {
545
546
                        KMessageBox::sorry(this, i18nc("@info",
548
549
                }
549
550
                condition = new DateTime(msecs);
550
551
                break;
551
 
        case RADIOBUTTONPROCESSDIES:
 
552
        case CONDITION_PROCESSDIES_ID:
552
553
                if (pidProcessDies == 0) {
553
554
                        KMessageBox::sorry(this, i18nc("@info", "You must select a program to monitor."));
554
555
                        return;
575
576
        group.writeEntry("LastExecuted", conditionCheckedId);
576
577
        KConfigGroup configGroup;
577
578
        switch (conditionCheckedId) {
578
 
        case RADIOBUTTONCPU:
 
579
        case CONDITION_CPU_ID:
579
580
                configGroup = config->group("ConditionCPU");
580
581
                configGroup.writeEntry("Higher", gui.comboBoxCPU->currentIndex());
581
582
                configGroup.writeEntry("Percentage", gui.spinBoxCPU->value());
582
583
                configGroup.writeEntry("Time", gui.timeEditCPU->time().toString("mm:ss"));
583
584
                break;
584
 
        case RADIOBUTTONMEMORY:
 
585
        case CONDITION_MEMORY_ID:
585
586
                configGroup = config->group("ConditionMemory");
586
587
                configGroup.writeEntry("Higher", gui.comboBoxMemory->currentIndex());
587
588
                configGroup.writeEntry("Amount", gui.spinBoxMemory->value());
588
589
                configGroup.writeEntry("Time", gui.timeEditMemory->time().toString("mm:ss"));
589
590
                break;
590
 
        case RADIOBUTTONNETWORK:
 
591
        case CONDITION_NETWORK_ID:
591
592
                configGroup = config->group("ConditionNetwork");
592
593
                configGroup.writeEntry("Direction", gui.comboBoxNetworkDirection->currentIndex());
593
594
                configGroup.writeEntry("Higher", gui.comboBoxNetworkHigher->currentIndex());
595
596
                configGroup.writeEntry("Interface", gui.comboBoxNetworkInterface->currentText());
596
597
                configGroup.writeEntry("Time", gui.timeEditNetwork->time().toString("mm:ss"));
597
598
                break;
598
 
        case RADIOBUTTONDATETIME:
 
599
        case CONDITION_DATETIME_ID:
599
600
                configGroup = config->group("ConditionDateTime");
600
601
                configGroup.writeEntry("Interval", msecs / 1000);
601
602
                break;
604
605
        group = config->group("Actions");
605
606
        group.writeEntry("LastExecuted", actionCheckedId);
606
607
        switch (actionCheckedId) {
607
 
        case RADIOBUTTONSHUTDOWN:
608
 
        case RADIOBUTTONREBOOT:
 
608
        case ACTION_SHUTDOWN_ID:
 
609
        case ACTION_REBOOT_ID:
609
610
                configGroup = config->group("ActionShutdown");
610
611
                configGroup.writeEntry("Force", gui.checkBoxShutdownForce->isChecked());
611
612
                break;
612
 
        case RADIOBUTTONSLEEP:
 
613
        case ACTION_SLEEP_ID:
613
614
                Solid::PowerManagement::SleepState state;
614
615
                configGroup = config->group("ActionSleep");
615
616
                if (gui.radioButtonSleepStandBy->isChecked())
620
621
                        state = Solid::PowerManagement::HibernateState;
621
622
                configGroup.writeEntry("Mode", (int) state);
622
623
                break;
623
 
        case RADIOBUTTONEXECUTECOMMAND:
 
624
        case ACTION_EXECUTECOMMAND_ID:
624
625
                configGroup = config->group("ActionExecuteCommand");
625
626
                configGroup.writeEntry("Command", gui.texteditExecuteCommand->toPlainText());
626
627
                break;
627
 
        case RADIOBUTTONPLAYALARM:
 
628
        case ACTION_PLAYALARM_ID:
628
629
                configGroup = config->group("ActionPlayAlarm");
629
630
                configGroup.writeEntry("File", availableSounds->at(gui.comboBoxPlayAlarm->currentIndex()));
630
631
        }
645
646
 
646
647
        int actionCheckedId = actionsGroup.checkedId();
647
648
        switch (actionCheckedId) {
648
 
        case RADIOBUTTONSHUTDOWN:
649
 
        case RADIOBUTTONREBOOT:
 
649
        case ACTION_SHUTDOWN_ID:
 
650
        case ACTION_REBOOT_ID:
650
651
                action = new Shutdown(isKDE, gui.radioButtonShutdown->isChecked(),
651
652
                                gui.checkBoxShutdownForce->isChecked());
652
653
                if (gui.radioButtonShutdown->isChecked())
656
657
                        KPassivePopup::message(PASSIVE_POPUP_TITLE, i18nc("@info",
657
658
                                        "Condition met. Rebooting the system."), this);
658
659
                break;
659
 
        case RADIOBUTTONSLEEP:
 
660
        case ACTION_SLEEP_ID:
660
661
                Solid::PowerManagement::SleepState state;
661
662
                if (gui.radioButtonSleepStandBy->isChecked()) {
662
663
                        state = Solid::PowerManagement::StandbyState;
673
674
                }
674
675
                action = new Sleep(isKDE, state);
675
676
                break;
676
 
        case RADIOBUTTONEXECUTECOMMAND:
 
677
        case ACTION_EXECUTECOMMAND_ID:
677
678
                action = new ExecuteCommand(gui.texteditExecuteCommand->toPlainText());
678
679
                KPassivePopup::message(PASSIVE_POPUP_TITLE, i18nc("@info",
679
680
                                "Condition met. Executing command."), this);
680
681
                break;
681
 
        case RADIOBUTTONPLAYALARM:
 
682
        case ACTION_PLAYALARM_ID:
682
683
                action = new PlayAlarm(availableSounds->at(gui.comboBoxPlayAlarm->currentIndex()));
683
684
                KPassivePopup::message(PASSIVE_POPUP_TITLE,
684
685
                                i18nc("@info", "Condition met. Throwing alarm."), this);
685
686
                break;
686
 
        case RADIOBUTTONKILLPROCESS:
 
687
        case ACTION_KILLPROCESS_ID:
687
688
                action = new KillProcess(pidKillProcess);
688
689
                KPassivePopup::message(PASSIVE_POPUP_TITLE, i18nc("@info",
689
690
                                "Condition met. Killing the selected program."), this);
691
692
        }
692
693
        action->execute();
693
694
 
694
 
        if (actionCheckedId == RADIOBUTTONPLAYALARM) {
 
695
        if (actionCheckedId == ACTION_PLAYALARM_ID) {
695
696
                KMessageBox::information(this, i18n("Close this message to turn off the alarm."));
696
697
                ((PlayAlarm*) action)->stop();
697
698
                delete action;