/* * main.cpp * * Copyright (C) 2004 Jonathan Riddell * * Based on kcm_kvaio * Copyright (C) 2003 Mirko Boehm (mirko@kde.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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * */ #include #include #include #include #include #include #include #include #include #include #include #include #include #ifdef Q_OS_FREEBSD #include #include #endif #include "kcmthinkpad_general.h" #include #include "main.h" #include "main.moc" typedef KGenericFactory KCMThinkpadModuleFactory; K_EXPORT_COMPONENT_FACTORY( kcm_thinkpad, KCMThinkpadModuleFactory("kcmthinkpad")) #define CONFIG_FILE "kmilodrc" KCMThinkpadModule::KCMThinkpadModule(TQWidget* parent, const char* name, const TQStringList&) : TDECModule(KCMThinkpadModuleFactory::instance(), parent, name) { TDEAboutData* about = new TDEAboutData(I18N_NOOP("kcmthinkpad"), I18N_NOOP("TDE Control Module for IBM Thinkpad " "Laptop Hardware"), 0, 0, TDEAboutData::License_GPL, "(c) 2004 Jonathan Riddell"); about->addAuthor("Jonathan Riddell", I18N_NOOP("Original author"), "jr@jriddell.org"); setAboutData( about ); TQVBoxLayout* layout = new TQVBoxLayout(this); m_KCMThinkpadGeneral = new KCMThinkpadGeneral(this); layout->addWidget( m_KCMThinkpadGeneral ); layout->addStretch(); load(); //try and open /dev/nvram m_nvramReadable = false; m_nvramWriteable = false; #ifdef Q_OS_FREEBSD // Look if the sysctl tree of acpi_ibm is in place u_int n = 0; size_t len = sizeof(n); if (m_nvramReadable = ( sysctlbyname("dev.acpi_ibm.0.volume", &n, &len, NULL, 0) != -1 )) m_nvramWriteable = ( sysctlbyname("dev.acpi_ibm.0.volume", NULL, NULL, &n, len) != -1 ); if (!m_nvramReadable) { setButtons(buttons() & ~Default); m_KCMThinkpadGeneral->bgGeneral->setEnabled(false); m_KCMThinkpadGeneral->tlOff->setText(i18n("In order to use the Thinkpad Buttons KMilo Plugin, " "you have to load the acpi_ibm(4) driver.")); } else if (!m_nvramWriteable) { m_KCMThinkpadGeneral->tlOff->setText(i18n("Could not write to dev.acpi_ibm.0.volume. " "Using software volume, required for " "R30/R31 models, or using a custom volume " "change step is disabled.")); #else TQFile nvramFile(m_nvramFile); if ( nvramFile.open(IO_ReadOnly) ) { m_nvramReadable = true; nvramFile.close(); } if ( nvramFile.open(IO_WriteOnly) ) { m_nvramWriteable = true; nvramFile.close(); } if (!m_nvramReadable) { setButtons(buttons() & ~Default); m_KCMThinkpadGeneral->bgGeneral->setEnabled(false); } else if (!m_nvramWriteable) { m_KCMThinkpadGeneral->tlOff->setText(i18n("Could not write to %1. " "To use the software volume, required for " "R30/R31 models and to use a custom volume " "change step, set the nvram device to world " "writeable: chmod 666 " "/dev/nvram").arg(m_nvramFile)); #endif } else { m_KCMThinkpadGeneral->tlOff->setText(i18n("Thinkpad Buttons KMilo Plugin Ready For Configuration")); } connect( m_KCMThinkpadGeneral, TQT_SIGNAL(changed()), TQT_SLOT(changed())); } void KCMThinkpadModule::save() { if (!m_nvramReadable) { return; } DCOPClient client; TDEConfig config(CONFIG_FILE); config.setGroup("thinkpad"); config.writeEntry("run", m_KCMThinkpadGeneral->mCbRun->isChecked()); config.writeEntry("softwareVolume", m_KCMThinkpadGeneral->mCbSoftwareVolume->isChecked()); config.writeEntry("volumeStep", m_KCMThinkpadGeneral->mSpinboxVolumeStep->value()); config.writeEntry("buttonThinkpad", m_KCMThinkpadGeneral->commandExec->url()); config.writeEntry("buttonHome", m_KCMThinkpadGeneral->commandExecHome->url()); config.writeEntry("buttonSearch", m_KCMThinkpadGeneral->commandExecSearch->url()); config.writeEntry("buttonMail", m_KCMThinkpadGeneral->commandExecMail->url()); config.writeEntry("buttonZoom", m_KCMThinkpadGeneral->commandExecZoom->url()); config.sync(); if (client.attach()) { TQByteArray data, replyData; TQCString replyType; if (!client.call("kded", "kmilod", "reconfigure()", data, replyType, replyData)) { kdDebug() << "KCMThinkpad::showTextMsg: " << "there was an error using DCOP on kmilod::reconfigure()." << endl; } } else { kdDebug() << "KCMThinkpadModule: cannot attach to DCOP server, " << "no automatic config update." << endl; } } void KCMThinkpadModule::load() { load( false ); } void KCMThinkpadModule::load(bool useDefaults) { TDEConfig config(CONFIG_FILE); config.setReadDefaults( useDefaults ); config.setGroup("thinkpad"); m_KCMThinkpadGeneral->mCbRun->setChecked(config.readBoolEntry("run", false)); m_KCMThinkpadGeneral->mCbSoftwareVolume->setChecked(config.readBoolEntry("softwareVolume", true)); m_KCMThinkpadGeneral->mSpinboxVolumeStep->setValue(config.readNumEntry("volumeStep", 14)); m_KCMThinkpadGeneral->commandExec->setURL(config.readEntry("buttonThinkpad", KDE_BINDIR "/konsole")); m_KCMThinkpadGeneral->commandExecHome->setURL(config.readEntry("buttonHome", KDE_BINDIR "/konqueror")); m_KCMThinkpadGeneral->commandExecSearch->setURL(config.readEntry("buttonSearch", KDE_BINDIR "/kfind")); m_KCMThinkpadGeneral->commandExecMail->setURL(config.readEntry("buttonMail", KDE_BINDIR "/kmail")); m_KCMThinkpadGeneral->commandExecZoom->setURL(config.readEntry("buttonZoom", KDE_BINDIR "/ksnapshot")); m_nvramFile = config.readEntry("nvram", "/dev/nvram"); emit changed( useDefaults ); } void KCMThinkpadModule::defaults() { load( true ); }