summaryrefslogtreecommitdiffstats
path: root/kcontrol/kicker/main.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kcontrol/kicker/main.cpp')
-rw-r--r--kcontrol/kicker/main.cpp398
1 files changed, 398 insertions, 0 deletions
diff --git a/kcontrol/kicker/main.cpp b/kcontrol/kicker/main.cpp
new file mode 100644
index 000000000..4ef0f842f
--- /dev/null
+++ b/kcontrol/kicker/main.cpp
@@ -0,0 +1,398 @@
+/*
+ * Copyright (c) 2000 Matthias Elter <[email protected]>
+ *
+ * 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
+ */
+
+#include <qcombobox.h>
+
+#include <dcopclient.h>
+#include <kaboutdata.h>
+#include <kapplication.h>
+#include <kcmodulecontainer.h>
+#include <kdirwatch.h>
+#include <kimageio.h>
+#include <klistview.h>
+#include <kstaticdeleter.h>
+#include <kstandarddirs.h>
+#include <kdebug.h>
+
+#include "hidingconfig.h"
+#include "kickerSettings.h"
+#include "lookandfeelconfig.h"
+#include "menuconfig.h"
+#include "positionconfig.h"
+
+#include "main.h"
+#include "main.moc"
+
+#include <X11/Xlib.h>
+
+KickerConfig *KickerConfig::m_self = 0;
+static KStaticDeleter<KickerConfig> staticKickerConfigDeleter;
+
+KickerConfig *KickerConfig::the()
+{
+ if (!m_self)
+ {
+ staticKickerConfigDeleter.setObject(m_self, new KickerConfig());
+ }
+ return m_self;
+}
+
+KickerConfig::KickerConfig(QWidget *parent, const char *name)
+ : QObject(parent, name),
+ DCOPObject("KickerConfig"),
+ configFileWatch(new KDirWatch(this)),
+ m_currentPanelIndex(0)
+{
+ m_screenNumber = qt_xdisplay() ? DefaultScreen(qt_xdisplay()) : 0;
+
+ KickerSettings::instance(configName().latin1());
+
+ init();
+
+ kapp->dcopClient()->setNotifications(true);
+ connectDCOPSignal("kicker", "kicker", "configSwitchToPanel(QString)",
+ "jumpToPanel(QString)", false);
+ kapp->dcopClient()->send("kicker", "kicker", "configLaunched()", QByteArray());
+
+ connect(this, SIGNAL(hidingPanelChanged(int)),
+ this, SLOT(setCurrentPanelIndex(int)));
+ connect(this, SIGNAL(positionPanelChanged(int)),
+ this, SLOT(setCurrentPanelIndex(int)));
+}
+
+KickerConfig::~KickerConfig()
+{
+ // QValueList::setAutoDelete where for art thou?
+ ExtensionInfoList::iterator it = m_extensionInfo.begin();
+ while (it != m_extensionInfo.end())
+ {
+ ExtensionInfo* info = *it;
+ it = m_extensionInfo.erase(it);
+ delete info;
+ }
+}
+
+// TODO: This is not true anymore:
+// this method may get called multiple times during the life of the control panel!
+void KickerConfig::init()
+{
+ disconnect(configFileWatch, SIGNAL(dirty(const QString&)), this, SLOT(configChanged(const QString&)));
+ configFileWatch->stopScan();
+ for (ExtensionInfoList::iterator it = m_extensionInfo.begin();
+ it != m_extensionInfo.end();
+ ++it)
+ {
+ configFileWatch->removeFile((*it)->_configPath);
+ }
+
+ QString configname = configName();
+ QString configpath = KGlobal::dirs()->findResource("config", configname);
+ if (configpath.isEmpty())
+ configpath = locateLocal("config", configname);
+ KSharedConfig::Ptr config = KSharedConfig::openConfig(configname);
+
+ if (m_extensionInfo.isEmpty())
+ {
+ // our list is empty, so add the main kicker config
+ m_extensionInfo.append(new ExtensionInfo(QString::null, configname, configpath));
+ configFileWatch->addFile(configpath);
+ }
+ else
+ {
+ // this isn't our first trip through here, which means we are reloading
+ // so reload the kicker config (first we have to find it ;)
+ ExtensionInfoList::iterator it = m_extensionInfo.begin();
+ for (; it != m_extensionInfo.end(); ++it)
+ {
+ if (configpath == (*it)->_configPath)
+ {
+ (*it)->load();
+ break;
+ }
+ }
+ }
+
+ setupExtensionInfo(*config, true, true);
+
+ connect(configFileWatch, SIGNAL(dirty(const QString&)), this, SLOT(configChanged(const QString&)));
+ configFileWatch->startScan();
+}
+
+void KickerConfig::notifyKicker()
+{
+ kdDebug() << "KickerConfig::notifyKicker()" << endl;
+
+ emit aboutToNotifyKicker();
+
+ // Tell kicker about the new config file.
+ if (!kapp->dcopClient()->isAttached())
+ {
+ kapp->dcopClient()->attach();
+ }
+
+ QByteArray data;
+ QCString appname;
+
+ if (m_screenNumber == 0)
+ {
+ appname = "kicker";
+ }
+ else
+ {
+ appname.sprintf("kicker-screen-%d", m_screenNumber);
+ }
+
+ kapp->dcopClient()->send(appname, appname, "configure()", data);
+}
+
+void KickerConfig::setupExtensionInfo(KConfig& config, bool checkExists, bool reloadIfExists)
+{
+ config.setGroup("General");
+ QStringList elist = config.readListEntry("Extensions2");
+
+ // all of our existing extensions
+ // we'll remove ones we find which are still there the oldExtensions, and delete
+ // all the extensions that remain (e.g. are no longer active)
+ ExtensionInfoList oldExtensions(m_extensionInfo);
+
+ for (QStringList::Iterator it = elist.begin(); it != elist.end(); ++it)
+ {
+ // extension id
+ QString group(*it);
+
+ // is there a config group for this extension?
+ if (!config.hasGroup(group) || group.contains("Extension") < 1)
+ {
+ continue;
+ }
+
+ // set config group
+ config.setGroup(group);
+
+ QString df = KGlobal::dirs()->findResource("extensions", config.readEntry("DesktopFile"));
+ QString configname = config.readEntry("ConfigFile");
+ QString configpath = KGlobal::dirs()->findResource("config", configname);
+
+ if (checkExists)
+ {
+ ExtensionInfoList::iterator extIt = m_extensionInfo.begin();
+ for (; extIt != m_extensionInfo.end(); ++extIt)
+ {
+ if (configpath == (*extIt)->_configPath)
+ {
+ // we have found it in the config file and it exists
+ // so remove it from our list of existing extensions
+ oldExtensions.remove(*extIt);
+ if (reloadIfExists)
+ {
+ (*extIt)->load();
+ }
+ break;
+ }
+ }
+
+ if (extIt != m_extensionInfo.end())
+ {
+ continue;
+ }
+ }
+
+ configFileWatch->addFile(configpath);
+ ExtensionInfo* info = new ExtensionInfo(df, configname, configpath);
+ m_extensionInfo.append(info);
+ emit extensionAdded(info);
+ }
+
+ if (checkExists)
+ {
+ // now remove all the left overs that weren't in the file
+ ExtensionInfoList::iterator extIt = oldExtensions.begin();
+ for (; extIt != oldExtensions.end(); ++extIt)
+ {
+ // don't remove the kickerrc!
+ if (!(*extIt)->_configPath.endsWith(configName()))
+ {
+ emit extensionRemoved(*extIt);
+ m_extensionInfo.remove(*extIt);
+ }
+ }
+ }
+}
+
+void KickerConfig::configChanged(const QString& configPath)
+{
+ if (configPath.endsWith(configName()))
+ {
+ KSharedConfig::Ptr config = KSharedConfig::openConfig(configName());
+ config->reparseConfiguration();
+ setupExtensionInfo(*config, true);
+ }
+
+ // find the extension and change it
+ for (ExtensionInfoList::iterator it = m_extensionInfo.begin(); it != m_extensionInfo.end(); ++it)
+ {
+ if (configPath == (*it)->_configPath)
+ {
+ emit extensionAboutToChange(configPath);
+ (*it)->configChanged();
+ break;
+ }
+ }
+
+ emit extensionChanged(configPath);
+}
+
+void KickerConfig::populateExtensionInfoList(QComboBox* list)
+{
+ list->clear();
+ for (ExtensionInfoList::iterator it = m_extensionInfo.begin(); it != m_extensionInfo.end(); ++it)
+ {
+ list->insertItem((*it)->_name);
+ }
+}
+
+const ExtensionInfoList& KickerConfig::extensionsInfo()
+{
+ return m_extensionInfo;
+}
+
+void KickerConfig::reloadExtensionInfo()
+{
+ for (ExtensionInfoList::iterator it = m_extensionInfo.begin(); it != m_extensionInfo.end(); ++it)
+ {
+ (*it)->load();
+ }
+
+ emit extensionInfoChanged();
+}
+
+void KickerConfig::saveExtentionInfo()
+{
+ for (ExtensionInfoList::iterator it = m_extensionInfo.begin(); it != m_extensionInfo.end(); ++it)
+ {
+ (*it)->save();
+ }
+}
+
+void KickerConfig::jumpToPanel(const QString& panelConfig)
+{
+ ExtensionInfoList::iterator it = m_extensionInfo.begin();
+ int index = 0;
+ for (; it != m_extensionInfo.end(); ++it, ++index)
+ {
+ if ((*it)->_configFile == panelConfig)
+ {
+ break;
+ }
+ }
+
+ if (it == m_extensionInfo.end())
+ {
+ return;
+ }
+
+ kdDebug() << "KickerConfig::jumpToPanel: index=" << index << endl;
+
+ emit hidingPanelChanged(index);
+ emit positionPanelChanged(index);
+}
+
+QString KickerConfig::configName()
+{
+ if (m_screenNumber == 0)
+ {
+ return "kickerrc";
+ }
+ else
+ {
+ return QString("kicker-screen-%1rc").arg(m_screenNumber);
+ }
+}
+
+void KickerConfig::setCurrentPanelIndex(int index)
+{
+ m_currentPanelIndex = index;
+}
+
+QString KickerConfig::quickHelp() const
+{
+ return i18n("<h1>Panel</h1> Here you can configure the KDE panel (also"
+ " referred to as 'kicker'). This includes options like the position and"
+ " size of the panel, as well as its hiding behavior and its looks.<p>"
+ " Note that you can also access some of these options directly by clicking"
+ " on the panel, e.g. dragging it with the left mouse button or using the"
+ " context menu on right mouse button click. This context menu also offers you"
+ " manipulation of the panel's buttons and applets.");
+}
+
+KAboutData *KickerConfig::aboutData()
+{
+ // the KAboutDatas are deleted by the KCModules
+ KAboutData *about
+ = new KAboutData(I18N_NOOP("kcmkicker"),
+ I18N_NOOP("KDE Panel Control Module"),
+ 0, 0, KAboutData::License_GPL,
+ I18N_NOOP("(c) 1999 - 2001 Matthias Elter\n"
+ "(c) 2002 - 2003 Aaron J. Seigo"));
+
+ about->addAuthor("Aaron J. Seigo", 0, "[email protected]");
+ about->addAuthor("Matthias Elter", 0, "[email protected]");
+
+ return about;
+}
+
+extern "C"
+{
+ KDE_EXPORT KCModule *create_kicker(QWidget *parent, const char *name)
+ {
+ KCModuleContainer *container = new KCModuleContainer(parent, "kcmkicker");
+ container->addModule("kicker_config_arrangement");
+ container->addModule("kicker_config_hiding");
+ container->addModule("kicker_config_menus");
+ container->addModule("kicker_config_appearance");
+ return container;
+ }
+
+ KDE_EXPORT KCModule *create_kicker_arrangement(QWidget *parent, const char * /*name*/)
+ {
+ KGlobal::dirs()->addResourceType("extensions", KStandardDirs::kde_default("data") +
+ "kicker/extensions");
+ return new PositionConfig(parent, "kcmkicker");
+ }
+
+ KDE_EXPORT KCModule *create_kicker_hiding(QWidget *parent, const char * /*name*/)
+ {
+ KGlobal::dirs()->addResourceType("extensions", KStandardDirs::kde_default("data") +
+ "kicker/extensions");
+ return new HidingConfig(parent, "kcmkicker");
+ }
+
+ KDE_EXPORT KCModule *create_kicker_menus(QWidget *parent, const char * /*name*/)
+ {
+ return new MenuConfig(parent, "kcmkicker");
+ }
+
+ KDE_EXPORT KCModule *create_kicker_appearance(QWidget *parent, const char * /*name*/)
+ {
+ KImageIO::registerFormats();
+ KGlobal::dirs()->addResourceType("tiles", KStandardDirs::kde_default("data") +
+ "kicker/tiles");
+ KGlobal::dirs()->addResourceType("hb_pics", KStandardDirs::kde_default("data") +
+ "kcmkicker/pics");
+ return new LookAndFeelConfig(parent, "kcmkicker");
+ }
+}