diff --git a/kcontrol/dateandtime/CMakeLists.txt b/kcontrol/dateandtime/CMakeLists.txt index 14bddf70..49f60b85 100644 --- a/kcontrol/dateandtime/CMakeLists.txt +++ b/kcontrol/dateandtime/CMakeLists.txt @@ -1,8 +1,7 @@ ########### next target ############### set(kcm_clock_PART_SRCS - dtime.cpp - main.cpp + kcm_clock.cpp ) kde4_add_plugin(kcm_clock ${kcm_clock_PART_SRCS}) @@ -18,16 +17,14 @@ install( ########### next target ############### -add_executable(kcmdatetimehelper helper.cpp) - -target_link_libraries(kcmdatetimehelper KDE4::kdecore) +add_executable(kcmclockhelper kcm_clock_helper.cpp) +target_link_libraries(kcmclockhelper KDE4::kdecore) install( - TARGETS kcmdatetimehelper + TARGETS kcmclockhelper DESTINATION ${KDE4_LIBEXEC_INSTALL_DIR} ) - -kde4_install_auth_helper_files(kcmdatetimehelper org.kde.kcontrol.kcmclock) +kde4_install_auth_helper_files(kcmclockhelper org.kde.kcontrol.kcmclock) ########### install files ############### diff --git a/kcontrol/dateandtime/dateandtime.ui b/kcontrol/dateandtime/dateandtime.ui deleted file mode 100644 index f5ea6296..00000000 --- a/kcontrol/dateandtime/dateandtime.ui +++ /dev/null @@ -1,200 +0,0 @@ - - - Davide Bettio <davide.bettio@kdemail.net> - DateAndTime - - - - 0 - 0 - 613 - 463 - - - - - - - 0 - - - - Date and Time - - - - - - - - Set date and time &automatically: - - - - - - - Qt::Horizontal - - - QSizePolicy::Fixed - - - - 13 - 21 - - - - - - - - Time server: - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - timeServerList - - - - - - - - 0 - 0 - - - - - - - - - - - - - - - Here you can change the system date's day of the month, month and year. - - - - - - - - 0 - 0 - - - - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - - Time Zone - - - - - - To change the local time zone, select your area from the list below. - - - - - - - Qt::Vertical - - - QSizePolicy::Fixed - - - - 20 - 5 - - - - - - - - Current local time zone: - - - - - - - true - - - Search - - - - - - - true - - - - - - - - - - - - KTimeZoneWidget - QTreeWidget -
ktimezonewidget.h
-
- - KTreeWidgetSearchLine - KLineEdit -
ktreewidgetsearchline.h
-
- - KLineEdit - QLineEdit -
klineedit.h
-
- - KSeparator - QFrame -
kseparator.h
-
- - KCalendarWidget - QCalendarWidget -
kcalendarwidget.h
-
-
- -
diff --git a/kcontrol/dateandtime/dtime.cpp b/kcontrol/dateandtime/dtime.cpp deleted file mode 100644 index d3514280..00000000 --- a/kcontrol/dateandtime/dtime.cpp +++ /dev/null @@ -1,485 +0,0 @@ -/* - * dtime.cpp - * - * Copyright (C) 1998 Luca Montecchiani - * - * Plasma analog-clock drawing code: - * - * Copyright 2007 by Aaron Seigo - * Copyright 2007 by Riccardo Iaconelli - * - * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - */ -#include "dtime.h" - -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include - -#include - -#include "moc_dtime.cpp" - -#include "helper.h" - -Dtime::Dtime(QWidget * parent) - : QWidget(parent) -{ - setupUi(this); - - connect(setDateTimeAuto, SIGNAL(toggled(bool)), this, SLOT(serverTimeCheck())); - connect(setDateTimeAuto, SIGNAL(toggled(bool)), this, SLOT(configChanged())); - - timeServerList->setEditable(false); - connect(timeServerList, SIGNAL(activated(int)), this, SLOT(configChanged())); - connect(timeServerList, SIGNAL(editTextChanged(QString)), this, SLOT(configChanged())); - connect(setDateTimeAuto, SIGNAL(toggled(bool)), timeServerList, SLOT(setEnabled(bool))); - timeServerList->setEnabled(false); - timeServerList->setEditable(true); - findNTPutility(); - if (ntpUtility.isEmpty()) { - setDateTimeAuto->setEnabled(false); - setDateTimeAuto->setToolTip( - i18n( - "No NTP utility has been found. " - "Install 'ntpdate' or 'rdate' command to enable automatic " - "updating of date and time." - ) - ); - } - - QVBoxLayout *v2 = new QVBoxLayout(timeBox); - v2->setMargin(0); - - kclock = new Kclock(timeBox); - kclock->setObjectName("Kclock"); - kclock->setMinimumSize(150,150); - v2->addWidget(kclock); - - v2->addSpacing(KDialog::spacingHint()); - - QHBoxLayout *v3 = new QHBoxLayout(); - v2->addLayout(v3); - - v3->addStretch(); - - timeEdit = new QTimeEdit(timeBox); - timeEdit->setLocale(KGlobal::locale()->toLocale()); - v3->addWidget(timeEdit); - - v3->addStretch(); - - QString wtstr = i18n( - "Here you can change the system time. Click into the" - " hours, minutes or seconds field to change the relevant value, either" - " using the up and down buttons to the right or by entering a new value." - ); - timeEdit->setWhatsThis(wtstr); - - connect(timeEdit, SIGNAL(timeChanged(QTime)), this, SLOT(set_time())); - cal->setContentsMargins(2, 2, 2, 2); - connect(cal, SIGNAL(activated(QDate)), this, SLOT(changeDate(QDate))); - connect(cal, SIGNAL(clicked(QDate)), this, SLOT(changeDate(QDate))); - - connect(&internalTimer, SIGNAL(timeout()), this, SLOT(timeout())); - - kclock->setEnabled(false); - - //Timezone - connect(tzonelist, SIGNAL(itemSelectionChanged()), this, SLOT(configChanged())); - tzonesearch->setTreeWidget(tzonelist); -} - -void Dtime::currentZone() -{ - KTimeZone localZone = KSystemTimeZones::local(); - - if (localZone.abbreviations().isEmpty()) { - m_local->setText( - i18nc( - "%1 is name of time zone", "Current local time zone: %1", - KSystemTimeZones::zoneName(localZone.name()) - ) - ); - } else { - m_local->setText( - i18nc( - "%1 is name of time zone, %2 is its abbreviation", - "Current local time zone: %1 (%2)", - KSystemTimeZones::zoneName(localZone.name()), - QString::fromUtf8(localZone.abbreviations().first()) - ) - ); - } -} - -void Dtime::serverTimeCheck() -{ - bool enabled = !setDateTimeAuto->isChecked(); - cal->setEnabled(enabled); - timeEdit->setEnabled(enabled); - // kclock->setEnabled(enabled); -} - -void Dtime::findNTPutility() -{ - static const QStringList possible_ntputilities = QStringList() - << QString::fromLatin1("ntpdate") - << QString::fromLatin1("rdate"); - foreach(const QString &possible_ntputility, possible_ntputilities) { - ntpUtility = KStandardDirs::findRootExe(possible_ntputility); - if (!ntpUtility.isEmpty()) { - return; - } - } -} - -void Dtime::set_time() -{ - if (ontimeout) { - return; - } - - internalTimer.stop(); - - time = timeEdit->time(); - kclock->setTime(time); - - emit timeChanged(true); -} - -void Dtime::changeDate(const QDate &d) -{ - date = d; - emit timeChanged(true); -} - -void Dtime::configChanged() -{ - emit timeChanged(true); -} - -void Dtime::load() -{ - // The config is actually written to the system config, but the user does not have any local config, - // since there is nothing writing it. - KConfig _config( "kcmclockrc", KConfig::NoGlobals ); - KConfigGroup config(&_config, "NTP"); - timeServerList->clear(); - timeServerList->addItems( - config.readEntry( - "servers", - i18n("Public Time Server (pool.ntp.org),\ -asia.pool.ntp.org,\ -europe.pool.ntp.org,\ -north-america.pool.ntp.org,\ -oceania.pool.ntp.org") - ).split(',', QString::SkipEmptyParts) - ); - setDateTimeAuto->setChecked(config.readEntry("enabled", false)); - - // Reset to the current date and time - time = QTime::currentTime(); - date = QDate::currentDate(); - cal->setSelectedDate(date); - - // start internal timer - internalTimer.start(1000); - - timeout(); - - // Timezone - currentZone(); - - // read the currently set time zone - tzonelist->setSelected(KSystemTimeZones::local().name(), true); -} - -void Dtime::save( QVariantMap& helperargs ) -{ - // Save the order, but don't duplicate! - QStringList list; - if (timeServerList->count() != 0) { - list.append(timeServerList->currentText()); - } - for (int i = 0; i < timeServerList->count(); i++) { - QString text = timeServerList->itemText(i); - if (!list.contains(text)) { - list.append(text); - } - // Limit so errors can go away and not stored forever - if (list.count() == 10) { - break; - } - } - - helperargs["ntp"] = true; - helperargs["ntpServers"] = list; - helperargs["ntpEnabled"] = setDateTimeAuto->isChecked(); - - if (setDateTimeAuto->isChecked() && !ntpUtility.isEmpty()){ - // NTP Time setting - done in helper - timeServer = timeServerList->currentText(); - kDebug() << "Setting date from time server " << timeServer; - } else { - // User time setting - QDateTime dt(date, QTime(timeEdit->time())); - - kDebug() << "Set date " << dt; - - helperargs["date"] = true; - helperargs["newdate"] = QString::number(dt.toTime_t()); - helperargs["olddate"] = QString::number(::time(0)); - } - - // restart time - internalTimer.start(1000); - - QStringList selectedZones(tzonelist->selection()); - if (selectedZones.count() > 0) { - helperargs["tz"] = true; - helperargs["tzone"] = selectedZones[0]; - } else { - helperargs["tzreset"] = true; // make the helper reset the timezone - } - - currentZone(); -} - -void Dtime::processHelperErrors(int code) -{ - if (code & ClockHelper::NTPError) { - KMessageBox::error(this, i18n("Unable to contact time server: %1.", timeServer)); - setDateTimeAuto->setChecked(false); - } - if (code & ClockHelper::DateError) { - KMessageBox::error(this, i18n("Can not set date.")); - } - if (code & ClockHelper::TimezoneError) { - KMessageBox::error(this, i18n("Error setting new time zone."), i18n("Time zone Error")); - } -} - -void Dtime::timeout() -{ - // get current time - time = QTime::currentTime(); - - ontimeout = true; - timeEdit->setTime(time); - ontimeout = false; - - kclock->setTime(time); -} - -QString Dtime::quickHelp() const -{ - return i18n( - "

Date & Time

This system settings module can be used to set the system date and" - " time. As these settings do not only affect you as a user, but rather the whole system, you" - " can only change these settings when you start the System Settings as root. If you do not have" - " the root password, but feel the system time should be corrected, please contact your system" - " administrator." - ); -} - -Kclock::Kclock(QWidget *parent) - : QWidget(parent) -{ - m_theme = new Plasma::Svg(this); - m_theme->setImagePath("widgets/clock"); - m_theme->setContainsMultipleImages(true); -} - -Kclock::~Kclock() -{ - delete m_theme; -} - -void Kclock::showEvent(QShowEvent *event) -{ - setClockSize(size()); - QWidget::showEvent(event); -} - -void Kclock::resizeEvent(QResizeEvent *event) -{ - Q_UNUSED(event); - setClockSize(size()); -} - -void Kclock::setClockSize(const QSize &size) -{ - int dim = qMin(size.width(), size.height()); - QSize newSize = QSize(dim, dim); - - if (newSize != m_faceCache.size()) { - m_faceCache = QPixmap(newSize); - m_handsCache = QPixmap(newSize); - m_glassCache = QPixmap(newSize); - - m_theme->resize(newSize); - m_repaintCache = RepaintAll; - } -} - -void Kclock::setTime(const QTime &t) -{ - if (t.minute() != time.minute() || t.hour() != time.hour()) { - if (m_repaintCache == RepaintNone) { - m_repaintCache = RepaintHands; - } - } - time = t; - update(); -} - -void Kclock::drawHand(QPainter *p, const QRect &rect, const qreal verticalTranslation, const qreal rotation, const QString &handName) -{ - // this code assumes the following conventions in the svg file: - // - the _vertical_ position of the hands should be set with respect to the center of the face - // - the _horizontal_ position of the hands does not matter - // - the _shadow_ elements should have the same vertical position as their _hand_ element counterpart - - QRectF elementRect; - QString name = handName + "HandShadow"; - if (m_theme->hasElement(name)) { - p->save(); - - elementRect = m_theme->elementRect(name); - if (rect.height() < 64) { - elementRect.setWidth(elementRect.width() * 2.5); - } - static const QPoint offset = QPoint(2, 3); - - p->translate(rect.x() + (rect.width() / 2) + offset.x(), rect.y() + (rect.height() / 2) + offset.y()); - p->rotate(rotation); - p->translate(-elementRect.width()/2, elementRect.y()-verticalTranslation); - m_theme->paint(p, QRectF(QPointF(0, 0), elementRect.size()), name); - - p->restore(); - } - - p->save(); - - name = handName + "Hand"; - elementRect = m_theme->elementRect(name); - if (rect.height() < 64) { - elementRect.setWidth(elementRect.width() * 2.5); - } - - p->translate(rect.x() + rect.width()/2, rect.y() + rect.height()/2); - p->rotate(rotation); - p->translate(-elementRect.width()/2, elementRect.y()-verticalTranslation); - m_theme->paint(p, QRectF(QPointF(0, 0), elementRect.size()), name); - - p->restore(); -} - -void Kclock::paintInterface(QPainter *p, const QRect &rect) -{ - const bool m_showSecondHand = true; - - // compute hand angles - const qreal minutes = 6.0 * time.minute() - 180; - const qreal hours = 30.0 * time.hour() - 180 + ((time.minute() / 59.0) * 30.0); - qreal seconds = 0; - if (m_showSecondHand) { - static const double anglePerSec = 6; - seconds = anglePerSec * time.second() - 180; - } - - // paint face and glass cache - QRect faceRect = m_faceCache.rect(); - if (m_repaintCache == RepaintAll) { - m_faceCache.fill(Qt::transparent); - m_glassCache.fill(Qt::transparent); - - QPainter facePainter(&m_faceCache); - QPainter glassPainter(&m_glassCache); - facePainter.setRenderHint(QPainter::SmoothPixmapTransform); - glassPainter.setRenderHint(QPainter::SmoothPixmapTransform); - - m_theme->paint(&facePainter, m_faceCache.rect(), "ClockFace"); - - glassPainter.save(); - QRectF elementRect = QRectF(QPointF(0, 0), m_theme->elementSize("HandCenterScrew")); - glassPainter.translate(faceRect.width() / 2 - elementRect.width() / 2, faceRect.height() / 2 - elementRect.height() / 2); - m_theme->paint(&glassPainter, elementRect, "HandCenterScrew"); - glassPainter.restore(); - - m_theme->paint(&glassPainter, faceRect, "Glass"); - - // get vertical translation, see drawHand() for more details - m_verticalTranslation = m_theme->elementRect("ClockFace").center().y(); - } - - // paint hour and minute hands cache - if (m_repaintCache == RepaintHands || m_repaintCache == RepaintAll) { - m_handsCache.fill(Qt::transparent); - - QPainter handsPainter(&m_handsCache); - handsPainter.drawPixmap(faceRect, m_faceCache, faceRect); - handsPainter.setRenderHint(QPainter::SmoothPixmapTransform); - - drawHand(&handsPainter, faceRect, m_verticalTranslation, hours, "Hour"); - drawHand(&handsPainter, faceRect, m_verticalTranslation, minutes, "Minute"); - } - - // reset repaint cache flag - m_repaintCache = RepaintNone; - - // paint caches and second hand - QRect targetRect = faceRect; - if (targetRect.width() < rect.width()) { - targetRect.moveLeft((rect.width() - targetRect.width()) / 2); - } - - p->drawPixmap(targetRect, m_handsCache, faceRect); - if (m_showSecondHand) { - p->setRenderHint(QPainter::SmoothPixmapTransform); - drawHand(p, targetRect, m_verticalTranslation, seconds, "Second"); - } - p->drawPixmap(targetRect, m_glassCache, faceRect); -} - -void Kclock::paintEvent(QPaintEvent *event) -{ - Q_UNUSED(event); - QPainter paint(this); - paint.setRenderHint(QPainter::Antialiasing); - paintInterface(&paint, rect()); -} diff --git a/kcontrol/dateandtime/dtime.h b/kcontrol/dateandtime/dtime.h deleted file mode 100644 index 8f12153e..00000000 --- a/kcontrol/dateandtime/dtime.h +++ /dev/null @@ -1,117 +0,0 @@ -/* - * dtime.h - * - * Copyright (C) 1998 Luca Montecchiani - * - * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - */ - -#ifndef dtime_included -#define dtime_included - -#include "ui_dateandtime.h" - -#include -#include -#include -#include -#include -#include -#include - -#include - -class Kclock; - -namespace Plasma { - class Svg; -} - -class Dtime : public QWidget, public Ui::DateAndTime -{ - Q_OBJECT -public: - Dtime( QWidget *parent = nullptr); - - void save(QVariantMap &helperargs); - void processHelperErrors(int code); - void load(); - - QString quickHelp() const; - -Q_SIGNALS: - void timeChanged(bool); - -private Q_SLOTS: - void configChanged(); - void serverTimeCheck(); - void timeout(); - void set_time(); - void changeDate(const QDate &d); - -private: - void currentZone(); - void findNTPutility(); - QString ntpUtility; - - QTimeEdit *timeEdit; - - Kclock *kclock; - - QTime time; - QDate date; - QTimer internalTimer; - - QString timeServer; - bool ontimeout; -}; - -class Kclock : public QWidget -{ - Q_OBJECT - -public: - Kclock(QWidget *parent = nullptr); - ~Kclock(); - - void setTime(const QTime &t); - -protected: - virtual void paintEvent(QPaintEvent *event); - virtual void showEvent(QShowEvent *event); - virtual void resizeEvent(QResizeEvent *event); - -private: - void setClockSize(const QSize &size); - void drawHand(QPainter *p, const QRect &rect, const qreal verticalTranslation, const qreal rotation, const QString &handName); - void paintInterface(QPainter *p, const QRect &rect); - -private: - QTime time; - Plasma::Svg *m_theme; - enum RepaintCache { - RepaintNone, - RepaintAll, - RepaintHands - }; - RepaintCache m_repaintCache; - QPixmap m_faceCache; - QPixmap m_handsCache; - QPixmap m_glassCache; - qreal m_verticalTranslation; -}; - -#endif // dtime_included diff --git a/kcontrol/dateandtime/helper.cpp b/kcontrol/dateandtime/helper.cpp deleted file mode 100644 index aa04e8d1..00000000 --- a/kcontrol/dateandtime/helper.cpp +++ /dev/null @@ -1,176 +0,0 @@ -/* - * tzone.cpp - * - * Copyright (C) 1998 Luca Montecchiani - * - * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - */ - -/* - - A helper that's run using KAuth and does the system modifications. - -*/ - -#include "helper.h" - -#include - -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include - -static QString findNtpUtility() -{ - static const QStringList possible_ntputilities = QStringList() - << QString::fromLatin1("ntpdate") - << QString::fromLatin1("rdate"); - foreach(const QString &possible_ntputility, possible_ntputilities) { - const QString ntpUtility = KStandardDirs::findRootExe(possible_ntputility); - if (!ntpUtility.isEmpty()) { - return ntpUtility; - } - } - return QString(); -} - -ClockHelper::ClockHelper(const char* const helper, QObject *parent) - : KAuthorization(helper, parent) -{ -} - -int ClockHelper::save(const QVariantMap &args) -{ - bool _ntp = args.value("ntp").toBool(); - bool _date = args.value("date").toBool(); - bool _tz = args.value("tz").toBool(); - bool _tzreset = args.value("tzreset").toBool(); - - KComponentData data("kcmdatetimehelper"); - - int ret = NoError; // error code - // The order here is important - if (_ntp) { - ret |= ntp(args.value("ntpServers").toStringList(), args.value("ntpEnabled").toBool()); - } - if (_date) { - ret |= date(args.value("newdate").toString(), args.value("olddate").toString()); - } - if (_tz) { - ret |= tz(args.value("tzone").toString()); - } - if (_tzreset) { - ret |= tzreset(); - } - - return ret; -} - -ClockHelper::CH_Error ClockHelper::ntp(const QStringList &ntpServers, bool ntpEnabled) -{ - // write to the system config file - QFile config_file(KDE_CONFDIR "/kcmclockrc"); - if(!config_file.exists()) { - config_file.open(QIODevice::WriteOnly); - config_file.close(); - config_file.setPermissions(QFile::ReadOwner | QFile::WriteOwner | QFile::ReadGroup | QFile::ReadOther); - } - KConfig _config(config_file.fileName(), KConfig::SimpleConfig); - KConfigGroup config(&_config, "NTP"); - config.writeEntry("servers", ntpServers); - config.writeEntry("enabled", ntpEnabled); - - const QString ntpUtility = findNtpUtility(); - if (ntpEnabled && !ntpUtility.isEmpty()) { - // NTP Time setting - QString timeServer = ntpServers.first(); - if(timeServer.indexOf(QRegExp(".*\\(.*\\)$")) != -1) { - timeServer.replace(QRegExp(".*\\("), ""); - timeServer.replace(QRegExp("\\).*"), ""); - // Would this be better?: s/^.*\(([^)]*)\).*$/\1/ - } - - if (QProcess::execute(ntpUtility, QStringList() << timeServer) != 0) { - return NTPError; - } - } else if(ntpEnabled) { - return NTPError; - } - - return NoError; -} - -ClockHelper::CH_Error ClockHelper::date(const QString &newdate, const QString &olddate) -{ - struct timeval tv; - tv.tv_sec = newdate.toULong() - olddate.toULong() + time(0); - tv.tv_usec = 0; - if (::settimeofday(&tv, 0)) { - return DateError; - } - - QString hwclock = KStandardDirs::findRootExe("hwclock"); - if (!hwclock.isEmpty()) { - QProcess::execute(hwclock, QStringList() << "--systohc"); - } - return NoError; -} - -ClockHelper::CH_Error ClockHelper::tz( const QString& selectedzone ) -{ - //only allow letters, numbers hyphen underscore plus and forward slash - //allowed pattern taken from time-util.c in systemd - if (!QRegExp("[a-zA-Z0-9-_+/]*").exactMatch(selectedzone)) { - return TimezoneError; - } - - const QString tzdir = KSystemTimeZones::zoneinfoDir(); - const QString tz = QDir::cleanPath(tzdir + QDir::separator() + selectedzone); - - unlink( "/etc/localtime" ); - - if (!QFile::link(tz, "/etc/localtime")) { - return TimezoneError; - } - - QByteArray val = ':' + tz.toAscii(); - - setenv("TZ", val.constData(), 1); - tzset(); - - return NoError; -} - -ClockHelper::CH_Error ClockHelper::tzreset() -{ - unlink( "/etc/localtime" ); - - setenv("TZ", "", 1); - tzset(); - return NoError; -} - -K_AUTH_MAIN("org.kde.kcontrol.kcmclock", ClockHelper) diff --git a/kcontrol/dateandtime/helper.h b/kcontrol/dateandtime/helper.h deleted file mode 100644 index 2595f7aa..00000000 --- a/kcontrol/dateandtime/helper.h +++ /dev/null @@ -1,51 +0,0 @@ -/* - * main.h - * - * Copyright (C) 1998 Luca Montecchiani - * - * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - */ -#ifndef CLOCK_HELPER_H -#define CLOCK_HELPER_H - -#include - -class ClockHelper : public KAuthorization -{ - Q_OBJECT - -public: - enum CH_Error { - NoError = 0, - CallError = 1, - TimezoneError = 2, - NTPError = 4, - DateError = 8 - }; - - ClockHelper(const char* const helper, QObject *parent = nullptr); - -public slots: - int save(const QVariantMap &map); - -private: - CH_Error ntp(const QStringList &ntpServers, bool ntpEnabled); - CH_Error date(const QString &newdate, const QString &olddate); - CH_Error tz(const QString &selectedzone); - CH_Error tzreset(); -}; - -#endif // CLOCK_HELPER_H diff --git a/kcontrol/dateandtime/kcm_clock.cpp b/kcontrol/dateandtime/kcm_clock.cpp new file mode 100644 index 00000000..0c9d1d94 --- /dev/null +++ b/kcontrol/dateandtime/kcm_clock.cpp @@ -0,0 +1,215 @@ +/* + This file is part of the KDE project + Copyright (C) 2024 Ivailo Monev + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License version 2, as published by the Free Software Foundation. + + This library 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#include "kcm_clock.h" + +#include +#include +#include +#include +#include +#include +#include +#include + +static const int s_updatetime = 1000; +static const int s_waittime = 100; +static const QString s_dateformat = QString::fromLatin1("yyyy-MM-dd HH:mm:ss"); + +static void kWatiForTimeZone(const QString &zone) +{ + while (KSystemTimeZones::local().name() != zone) { + QCoreApplication::processEvents(QEventLoop::AllEvents, s_waittime); + QThread::msleep(s_waittime); + } +} + +static bool kCanChangeCLock() +{ + return (!KStandardDirs::findRootExe("hwclock").isEmpty() || !KStandardDirs::findRootExe("timedatectl").isEmpty()); +} + +K_PLUGIN_FACTORY(KCMCLockFactory, registerPlugin();) +K_EXPORT_PLUGIN(KCMCLockFactory("kcmclock", "kcmclock")) + +KCMCLock::KCMCLock(QWidget *parent, const QVariantList &args) + : KCModule(KCMCLockFactory::componentData(), parent), + m_layout(nullptr), + m_datetimebox(nullptr), + m_datetimelayout(nullptr), + m_timeedit(nullptr), + m_dateedit(nullptr), + m_timezonebox(nullptr), + m_timezonelayout(nullptr), + m_timezonewidget(nullptr), + m_timer(nullptr), + m_timechanged(false), + m_datechanged(false), + m_zonechanged(false) +{ + Q_UNUSED(args); + + setButtons(KCModule::Apply); + setQuickHelp(i18n("

Date and Time

This module allows you to change system date and time options.")); + + KAboutData *about = new KAboutData( + I18N_NOOP("kcmclock"), 0, + ki18n("KDE Date and Time Module"), + 0, KLocalizedString(), KAboutData::License_GPL, + ki18n("Copyright 2024, Ivailo Monev xakepa10@gmail.com") + ); + about->addAuthor(ki18n("Ivailo Monev"), KLocalizedString(), "xakepa10@gmail.com"); + setAboutData(about); + + m_layout = new QVBoxLayout(this); + setLayout(m_layout); + + m_datetimebox = new QGroupBox(this); + m_datetimebox->setTitle(i18n("Date and time")); + m_datetimelayout = new QHBoxLayout(m_datetimebox); + m_datetimebox->setLayout(m_datetimelayout); + m_timeedit = new QTimeEdit(m_datetimebox); + // to show seconds the time format has to be in C locale + m_timeedit->setLocale(QLocale::c()); + connect(m_timeedit, SIGNAL(timeChanged(QTime)), this, SLOT(slotTimeChanged())); + m_datetimelayout->addWidget(m_timeedit); + m_dateedit = new QDateEdit(m_datetimebox); + m_dateedit->setLocale(KGlobal::locale()->toLocale()); + connect(m_dateedit, SIGNAL(dateChanged(QDate)), this, SLOT(slotDateChanged())); + m_datetimelayout->addWidget(m_dateedit); + m_layout->addWidget(m_datetimebox); + + m_timezonebox = new QGroupBox(this); + m_timezonebox->setTitle(i18n("Time zone")); + m_timezonelayout = new QHBoxLayout(m_timezonebox); + m_timezonebox->setLayout(m_timezonelayout); + m_timezonewidget = new KTimeZoneWidget(m_timezonebox); + m_timezonewidget->setSelectionMode(QAbstractItemView::SingleSelection); + connect(m_timezonewidget, SIGNAL(itemSelectionChanged()), this, SLOT(slotZoneChanged())); + m_timezonelayout->addWidget(m_timezonewidget); + m_layout->addWidget(m_timezonebox); + + m_timer = new QTimer(this); + m_timer->setInterval(s_updatetime); + connect(m_timer, SIGNAL(timeout()), this, SLOT(slotUpdate())); + + if (!KAuthorization::isAuthorized("org.kde.kcontrol.kcmclock")) { + setUseRootOnlyMessage(true); + setRootOnlyMessage(i18n("You are not allowed to save the configuration")); + setDisabled(true); + } else if (!kCanChangeCLock()) { + setUseRootOnlyMessage(true); + setRootOnlyMessage(i18n("Neither 'hwclock' nor 'timedatectl' utility not found, setting the date is not possible")); + m_timeedit->setEnabled(false); + m_dateedit->setEnabled(false); + } +} + +void KCMCLock::save() +{ + setEnabled(false); + m_timer->stop(); + m_timechanged = false; + m_datechanged = false; + m_zonechanged = false; + QVariantMap savearguments; + if (kCanChangeCLock()) { + const QDateTime datetime = QDateTime(m_dateedit->date(), m_timeedit->time()); + savearguments.insert("datetime", datetime.toString(s_dateformat)); + // qDebug() << Q_FUNC_INFO << datetime; + } + QString zone; + const QStringList selectedzones = m_timezonewidget->selection(); + if (selectedzones.isEmpty()) { + zone = QLatin1String("UTC"); // what else? + } else { + zone = selectedzones.at(0); + } + // qDebug() << Q_FUNC_INFO << zone; + savearguments.insert("zone", zone); + const int clockreply = KAuthorization::execute( + "org.kde.kcontrol.kcmclock", "save", savearguments + ); + if (clockreply > 0) { + if (clockreply == 1) { + KMessageBox::error(this, i18n("Unable to set date and time")); + kWatiForTimeZone(zone); + } else if (clockreply == 2) { + KMessageBox::error(this, i18n("Unable to set timezone")); + } + } else if (clockreply != KAuthorization::NoError) { + KMessageBox::error(this, i18n("Unable to authenticate/execute the action: %1", KAuthorization::errorString(clockreply))); + } else { + kWatiForTimeZone(zone); + } + slotUpdate(); + emit changed(false); + m_timer->start(); + setEnabled(true); +} + +void KCMCLock::load() +{ + setEnabled(false); + m_timechanged = false; + m_datechanged = false; + m_zonechanged = false; + slotUpdate(); + emit changed(false); + m_timer->start(); + setEnabled(true); +} + +void KCMCLock::slotUpdate() +{ + const QDateTime now = QDateTime::currentDateTime(); + if (!m_timechanged) { + m_timeedit->blockSignals(true); + m_timeedit->setTime(now.time()); + m_timeedit->blockSignals(false); + } + if (!m_datechanged) { + m_dateedit->blockSignals(true); + m_dateedit->setDate(now.date()); + m_dateedit->blockSignals(false); + } + if (!m_zonechanged) { + m_timezonewidget->setSelected(KSystemTimeZones::local().name(), true); + } +} + +void KCMCLock::slotTimeChanged() +{ + m_timechanged = true; + emit changed(true); +} + +void KCMCLock::slotDateChanged() +{ + m_datechanged = true; + emit changed(true); +} + +void KCMCLock::slotZoneChanged() +{ + m_zonechanged = true; + emit changed(true); +} + +#include "moc_kcm_clock.cpp" diff --git a/kcontrol/dateandtime/kcm_clock.h b/kcontrol/dateandtime/kcm_clock.h new file mode 100644 index 00000000..9dd31b0d --- /dev/null +++ b/kcontrol/dateandtime/kcm_clock.h @@ -0,0 +1,63 @@ +/* + This file is part of the KDE project + Copyright (C) 2024 Ivailo Monev + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License version 2, as published by the Free Software Foundation. + + This library 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#ifndef KCM_CLOCK_H +#define KCM_CLOCK_H + +#include +#include +#include +#include +#include +#include +#include + +class KCMCLock : public KCModule +{ + Q_OBJECT +public: + KCMCLock(QWidget *parent, const QVariantList &arg); + + // KCModule reimplementations +public Q_SLOTS: + void load() final; + void save() final; + +private Q_SLOTS: + void slotUpdate(); + void slotTimeChanged(); + void slotDateChanged(); + void slotZoneChanged(); + +private: + QVBoxLayout* m_layout; + QGroupBox* m_datetimebox; + QHBoxLayout* m_datetimelayout; + QTimeEdit* m_timeedit; + QDateEdit* m_dateedit; + QGroupBox* m_timezonebox; + QHBoxLayout* m_timezonelayout; + KTimeZoneWidget* m_timezonewidget; + QTimer* m_timer; + bool m_timechanged; + bool m_datechanged; + bool m_zonechanged; +}; + +#endif // main_included diff --git a/kcontrol/dateandtime/kcm_clock_helper.cpp b/kcontrol/dateandtime/kcm_clock_helper.cpp new file mode 100644 index 00000000..b296cdcc --- /dev/null +++ b/kcontrol/dateandtime/kcm_clock_helper.cpp @@ -0,0 +1,71 @@ +/* + This file is part of the KDE project + Copyright (C) 2024 Ivailo Monev + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License version 2, as published by the Free Software Foundation. + + This library 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#include "kcm_clock_helper.h" + +#include +#include +#include +#include +#include +#include + +static const QString s_localtime = QString::fromLatin1("/etc/localtime"); + +KCMClockHelper::KCMClockHelper(const char* const helper, QObject *parent) + : KAuthorization(helper, parent) +{ +} + +int KCMClockHelper::save(const QVariantMap ¶meters) +{ + if (!parameters.contains("zone")) { + return KAuthorization::HelperError; + } + + if (parameters.contains("datetime")) { + const QString datetime = parameters.value("datetime").toString(); + const QString timedatectlexe = KStandardDirs::findRootExe("timedatectl"); + if (!timedatectlexe.isEmpty()) { + const QStringList timedatectlargs = QStringList() + << "set-time" << datetime; + if (QProcess::execute(timedatectlexe, timedatectlargs) != 0) { + return 1; + } + } else { + const QString hwclockexe = KStandardDirs::findRootExe("hwclock"); + const QStringList hwclockargs = QStringList() + << "--set" << "--date" << datetime; + if (QProcess::execute(hwclockexe, hwclockargs) != 0) { + return 1; + } + } + } + + const QString zone = parameters.value("zone").toString(); + const QString zonefile = KSystemTimeZones::zoneinfoDir() + QDir::separator() + zone; + QFile::remove(s_localtime); + if (!QFile::link(zonefile, s_localtime)) { + return 2; + } + + return KAuthorization::NoError; +} + +K_AUTH_MAIN("org.kde.kcontrol.kcmclock", KCMClockHelper) diff --git a/kcontrol/dateandtime/kcm_clock_helper.h b/kcontrol/dateandtime/kcm_clock_helper.h new file mode 100644 index 00000000..be4b86e1 --- /dev/null +++ b/kcontrol/dateandtime/kcm_clock_helper.h @@ -0,0 +1,34 @@ +/* + This file is part of the KDE project + Copyright (C) 2024 Ivailo Monev + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License version 2, as published by the Free Software Foundation. + + This library 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 + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#ifndef KCMCLOCKHELPER_H +#define KCMCLOCKHELPER_H + +#include + +class KCMClockHelper : public KAuthorization +{ + Q_OBJECT +public: + KCMClockHelper(const char* const helper, QObject *parent = nullptr); +public slots: + int save(const QVariantMap ¶meters); +}; + +#endif // KCMCLOCKHELPER_H diff --git a/kcontrol/dateandtime/main.cpp b/kcontrol/dateandtime/main.cpp deleted file mode 100644 index 51072e9d..00000000 --- a/kcontrol/dateandtime/main.cpp +++ /dev/null @@ -1,137 +0,0 @@ -/* - * main.cpp - * - * Copyright (C) 1998 Luca Montecchiani - * - * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - */ -#include "main.h" - -#include - -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "moc_main.cpp" - -#include "dtime.h" -#include "helper.h" - -static const int s_checktime = 1000; // 1sec - -K_PLUGIN_FACTORY(KlockModuleFactory, registerPlugin();) -K_EXPORT_PLUGIN(KlockModuleFactory("kcmkclock")) - -KclockModule::KclockModule(QWidget *parent, const QVariantList &) - : KCModule(KlockModuleFactory::componentData(), parent) -{ - KAboutData *about = - new KAboutData( - I18N_NOOP("kcmclock"), 0, ki18n("KDE Clock Control Module"), - 0, KLocalizedString(), KAboutData::License_GPL, - ki18n("(c) 1996 - 2001 Luca Montecchiani\n(c) 2014 Ivailo Monev") - ); - - about->addAuthor(ki18n("Luca Montecchiani"), ki18n("Original author"), "m.luca@usa.net"); - about->addAuthor(ki18n("Paul Campbell"), ki18n("Past Maintainer"), "paul@taniwha.com"); - about->addAuthor(ki18n("Benjamin Meyer"), ki18n("Added NTP support"), "ben+kcmclock@meyerhome.net"); - about->addAuthor(ki18n("Ivailo Monev"), ki18n("Current Maintainer"), "xakepa10@gmail.com"); - setAboutData(about); - setQuickHelp( - i18n( - "

Date & Time

This control module can be used to set the system date and" - " time. As these settings do not only affect you as a user, but rather the whole system, you" - " can only change these settings when you start the System Settings as root. If you do not have" - " the root password, but feel the system time should be corrected, please contact your system" - " administrator." - ) - ); - - QVBoxLayout *layout = new QVBoxLayout(this); - layout->setMargin(0); - layout->setSpacing(KDialog::spacingHint()); - - dtime = new Dtime(this); - layout->addWidget(dtime); - connect(dtime, SIGNAL(timeChanged(bool)), this, SIGNAL(changed(bool))); - - setButtons(Help|Apply); - - if (!KAuthorization::isAuthorized("org.kde.kcontrol.kcmclock")) { - setUseRootOnlyMessage(true); - setRootOnlyMessage(i18n("You are not allowed to save the configuration")); - setDisabled(true); - } - - m_tz = KSystemTimeZones::local().name(); - QTimer::singleShot(s_checktime, this, SLOT(checkTZ())); -} - -void KclockModule::save() -{ - setDisabled(true); - - QVariantMap helperargs; - dtime->save(helperargs); - - const int reply = KAuthorization::execute( - "org.kde.kcontrol.kcmclock", "save", helperargs - ); - if (reply != KAuthorization::NoError) { - if (reply < KAuthorization::NoError) { - KMessageBox::error(this, i18n("Unable to authenticate/execute the action: %1", KAuthorization::errorString(reply))); - } else { - dtime->processHelperErrors(reply); - } - setDisabled(false); - } else { - // explicit load() in case its not the timezone that is changed - load(); - // not watched for -#if 0 - QDBusMessage msg = QDBusMessage::createSignal("/org/kde/kcmshell_clock", "org.kde.kcmshell_clock", "clockUpdated"); - QDBusConnection::sessionBus().send(msg); -#endif - } -} - -void KclockModule::load() -{ - dtime->load(); - setDisabled(useRootOnlyMessage()); - emit changed(false); -} - -void KclockModule::checkTZ() -{ - const QString localtz = KSystemTimeZones::local().name(); - if (localtz != m_tz) { - m_tz = localtz; - - load(); - } - QTimer::singleShot(s_checktime, this, SLOT(checkTZ())); -} diff --git a/kcontrol/dateandtime/main.h b/kcontrol/dateandtime/main.h deleted file mode 100644 index 93d1a3fe..00000000 --- a/kcontrol/dateandtime/main.h +++ /dev/null @@ -1,47 +0,0 @@ -/* - * main.h - * - * Copyright (C) 1998 Luca Montecchiani - * - * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - * - */ -#ifndef main_included -#define main_included - -#include -#include - -class Dtime; - -class KclockModule : public KCModule -{ - Q_OBJECT - -public: - KclockModule(QWidget *parent, const QVariantList &); - - void save(); - void load(); - -protected Q_SLOTS: - void checkTZ(); - -private: - Dtime *dtime; - QString m_tz; -}; - -#endif // main_included