54
54
#include <iostream>
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
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
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");
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()));
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);
114
114
gui.radioButtonShutdown->setEnabled(false);
115
115
gui.radioButtonReboot->setEnabled(false);
117
117
if (supportedSleepStates.empty())
118
118
gui.radioButtonSleep->setEnabled(false);
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()));
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"),
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"));
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"),
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"));
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"),
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"));
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());
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");
288
289
KConfigGroup groupShutdown = config->group("ActionShutdown");
289
290
gui.checkBoxShutdownForce->setChecked(groupShutdown.readEntry("Force", true));
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();
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."));
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."));
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) {
505
506
switch (conditionCheckedId) {
507
case CONDITION_CPU_ID:
507
508
time = gui.timeEditCPU->time();
509
case RADIOBUTTONMEMORY:
510
case CONDITION_MEMORY_ID:
510
511
time = gui.timeEditMemory->time();
512
case RADIOBUTTONNETWORK:
513
case CONDITION_NETWORK_ID:
513
514
time = gui.timeEditNetwork->time();
525
526
switch (conditionCheckedId) {
527
case CONDITION_CPU_ID:
527
528
condition = new CPU(msecs, 2000, gui.spinBoxCPU->value(), gui.comboBoxCPU->currentIndex()
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);
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,
575
576
group.writeEntry("LastExecuted", conditionCheckedId);
576
577
KConfigGroup configGroup;
577
578
switch (conditionCheckedId) {
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"));
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"));
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());
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());
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);
623
case RADIOBUTTONEXECUTECOMMAND:
624
case ACTION_EXECUTECOMMAND_ID:
624
625
configGroup = config->group("ActionExecuteCommand");
625
626
configGroup.writeEntry("Command", gui.texteditExecuteCommand->toPlainText());
627
case RADIOBUTTONPLAYALARM:
628
case ACTION_PLAYALARM_ID:
628
629
configGroup = config->group("ActionPlayAlarm");
629
630
configGroup.writeEntry("File", availableSounds->at(gui.comboBoxPlayAlarm->currentIndex()));
674
675
action = new Sleep(isKDE, state);
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);
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);
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);