summaryrefslogtreecommitdiffstats
path: root/kcontrol/xinerama/kcmxinerama.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kcontrol/xinerama/kcmxinerama.cpp')
-rw-r--r--kcontrol/xinerama/kcmxinerama.cpp254
1 files changed, 254 insertions, 0 deletions
diff --git a/kcontrol/xinerama/kcmxinerama.cpp b/kcontrol/xinerama/kcmxinerama.cpp
new file mode 100644
index 000000000..229672f6e
--- /dev/null
+++ b/kcontrol/xinerama/kcmxinerama.cpp
@@ -0,0 +1,254 @@
+/**
+ * kcmxinerama.cpp
+ *
+ * Copyright (c) 2002-2004 George Staikos <[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
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+
+#include "kcmxinerama.h"
+#include <dcopclient.h>
+#include <kaboutdata.h>
+#include <kapplication.h>
+#include <kconfig.h>
+#include <kdialog.h>
+#include <kglobal.h>
+#include <kglobalsettings.h>
+#include <klocale.h>
+#include <kmessagebox.h>
+#include <kwin.h>
+
+#include <qcheckbox.h>
+#include <qlayout.h>
+#include <qlabel.h>
+#include <qcombobox.h>
+#include <qtable.h>
+#include <qcolor.h>
+#include <qpushbutton.h>
+
+
+KCMXinerama::KCMXinerama(QWidget *parent, const char *name)
+ : KCModule(parent, name) {
+ _indicators.setAutoDelete(true);
+
+ KAboutData *about =
+ new KAboutData(I18N_NOOP("kcmxinerama"),
+ I18N_NOOP("KDE Multiple Monitor Configurator"),
+ 0, 0, KAboutData::License_GPL,
+ I18N_NOOP("(c) 2002-2003 George Staikos"));
+
+ about->addAuthor("George Staikos", 0, "[email protected]");
+ setAboutData( about );
+
+ setQuickHelp( i18n("<h1>Multiple Monitors</h1> This module allows you to configure KDE support"
+ " for multiple monitors."));
+
+ config = new KConfig("kdeglobals", false, false);
+ ksplashrc = new KConfig("ksplashrc", false, false);
+
+ connect(&_timer, SIGNAL(timeout()), this, SLOT(clearIndicator()));
+
+ QGridLayout *grid = new QGridLayout(this, 1, 1, KDialog::marginHint(),
+ KDialog::spacingHint());
+
+ // Setup the panel
+ _displays = QApplication::desktop()->numScreens();
+
+ if (QApplication::desktop()->isVirtualDesktop()) {
+ QStringList dpyList;
+ xw = new XineramaWidget(this);
+ grid->addWidget(xw, 0, 0);
+ QString label = i18n("Display %1");
+
+ xw->headTable->setNumRows(_displays);
+
+ for (int i = 0; i < _displays; i++) {
+ QString l = label.arg(i+1);
+ QRect geom = QApplication::desktop()->screenGeometry(i);
+ xw->_unmanagedDisplay->insertItem(l);
+ xw->_ksplashDisplay->insertItem(l);
+ dpyList.append(l);
+ xw->headTable->setText(i, 0, QString::number(geom.x()));
+ xw->headTable->setText(i, 1, QString::number(geom.y()));
+ xw->headTable->setText(i, 2, QString::number(geom.width()));
+ xw->headTable->setText(i, 3, QString::number(geom.height()));
+ }
+
+ xw->_unmanagedDisplay->insertItem(i18n("Display Containing the Pointer"));
+
+ xw->headTable->setRowLabels(dpyList);
+
+ connect(xw->_ksplashDisplay, SIGNAL(activated(int)),
+ this, SLOT(windowIndicator(int)));
+ connect(xw->_unmanagedDisplay, SIGNAL(activated(int)),
+ this, SLOT(windowIndicator(int)));
+ connect(xw->_identify, SIGNAL(clicked()),
+ this, SLOT(indicateWindows()));
+
+ connect(xw, SIGNAL(configChanged()), this, SLOT(changed()));
+ } else { // no Xinerama
+ QLabel *ql = new QLabel(i18n("<qt><p>This module is only for configuring systems with a single desktop spread across multiple monitors. You do not appear to have this configuration.</p></qt>"), this);
+ grid->addWidget(ql, 0, 0);
+ }
+
+ grid->activate();
+
+ load();
+}
+
+KCMXinerama::~KCMXinerama() {
+ _timer.stop();
+ delete ksplashrc;
+ ksplashrc = 0;
+ delete config;
+ config = 0;
+ clearIndicator();
+}
+
+#define KWIN_XINERAMA "XineramaEnabled"
+#define KWIN_XINERAMA_MOVEMENT "XineramaMovementEnabled"
+#define KWIN_XINERAMA_PLACEMENT "XineramaPlacementEnabled"
+#define KWIN_XINERAMA_MAXIMIZE "XineramaMaximizeEnabled"
+#define KWIN_XINERAMA_FULLSCREEN "XineramaFullscreenEnabled"
+
+void KCMXinerama::load() {
+ load( false );
+}
+
+void KCMXinerama::load(bool useDefaults) {
+ if (QApplication::desktop()->isVirtualDesktop()) {
+ int item = 0;
+ config->setReadDefaults( useDefaults );
+ config->setGroup("Windows");
+ xw->_enableXinerama->setChecked(config->readBoolEntry(KWIN_XINERAMA, true));
+ xw->_enableResistance->setChecked(config->readBoolEntry(KWIN_XINERAMA_MOVEMENT, true));
+ xw->_enablePlacement->setChecked(config->readBoolEntry(KWIN_XINERAMA_PLACEMENT, true));
+ xw->_enableMaximize->setChecked(config->readBoolEntry(KWIN_XINERAMA_MAXIMIZE, true));
+ xw->_enableFullscreen->setChecked(config->readBoolEntry(KWIN_XINERAMA_FULLSCREEN, true));
+ item = config->readNumEntry("Unmanaged", QApplication::desktop()->primaryScreen());
+ if ((item < 0 || item >= _displays) && (item != -3))
+ xw->_unmanagedDisplay->setCurrentItem(QApplication::desktop()->primaryScreen());
+ else if (item == -3) // pointer warp
+ xw->_unmanagedDisplay->setCurrentItem(_displays);
+ else xw->_unmanagedDisplay->setCurrentItem(item);
+
+ ksplashrc->setGroup("Xinerama");
+ item = ksplashrc->readNumEntry("KSplashScreen", QApplication::desktop()->primaryScreen());
+ if (item < 0 || item >= _displays)
+ xw->_ksplashDisplay->setCurrentItem(QApplication::desktop()->primaryScreen());
+ else xw->_ksplashDisplay->setCurrentItem(item);
+
+ emit changed(useDefaults);
+ }
+ else
+ emit changed( false );
+}
+
+
+void KCMXinerama::save() {
+ if (QApplication::desktop()->isVirtualDesktop()) {
+ config->setGroup("Windows");
+ config->writeEntry(KWIN_XINERAMA,
+ xw->_enableXinerama->isChecked());
+ config->writeEntry(KWIN_XINERAMA_MOVEMENT,
+ xw->_enableResistance->isChecked());
+ config->writeEntry(KWIN_XINERAMA_PLACEMENT,
+ xw->_enablePlacement->isChecked());
+ config->writeEntry(KWIN_XINERAMA_MAXIMIZE,
+ xw->_enableMaximize->isChecked());
+ config->writeEntry(KWIN_XINERAMA_FULLSCREEN,
+ xw->_enableFullscreen->isChecked());
+ int item = xw->_unmanagedDisplay->currentItem();
+ config->writeEntry("Unmanaged", item == _displays ? -3 : item);
+ config->sync();
+
+ if (!kapp->dcopClient()->isAttached())
+ kapp->dcopClient()->attach();
+ kapp->dcopClient()->send("kwin", "", "reconfigure()", "");
+
+ ksplashrc->setGroup("Xinerama");
+ ksplashrc->writeEntry("KSplashScreen", xw->_enableXinerama->isChecked() ? xw->_ksplashDisplay->currentItem() : -2 /* ignore Xinerama */);
+ ksplashrc->sync();
+ }
+
+ KMessageBox::information(this, i18n("Your settings will only affect newly started applications."), i18n("KDE Multiple Monitors"), "nomorexineramaplease");
+
+ emit changed(false);
+}
+
+void KCMXinerama::defaults() {
+ load( true );
+}
+
+void KCMXinerama::indicateWindows() {
+ _timer.stop();
+
+ clearIndicator();
+ for (int i = 0; i < _displays; i++)
+ _indicators.append(indicator(i));
+
+ _timer.start(1500, true);
+}
+
+void KCMXinerama::windowIndicator(int dpy) {
+ if (dpy >= _displays)
+ return;
+
+ _timer.stop();
+
+ clearIndicator();
+ _indicators.append(indicator(dpy));
+
+ _timer.start(1500, true);
+}
+
+QWidget *KCMXinerama::indicator(int dpy) {
+ QLabel *si = new QLabel(QString::number(dpy+1), 0, "Screen Indicator", WX11BypassWM );
+
+ QFont fnt = KGlobalSettings::generalFont();
+ fnt.setPixelSize(100);
+ si->setFont(fnt);
+ si->setFrameStyle(QFrame::Panel);
+ si->setFrameShadow(QFrame::Plain);
+ si->setAlignment(Qt::AlignCenter);
+
+ QPoint screenCenter(QApplication::desktop()->screenGeometry(dpy).center());
+ QRect targetGeometry(QPoint(0,0), si->sizeHint());
+ targetGeometry.moveCenter(screenCenter);
+ si->setGeometry(targetGeometry);
+ si->show();
+
+ return si;
+}
+
+void KCMXinerama::clearIndicator() {
+ _indicators.clear();
+}
+
+extern "C" {
+ KDE_EXPORT KCModule *create_xinerama(QWidget *parent, const char *name) {
+ KGlobal::locale()->insertCatalogue("kcmxinerama");
+ return new KCMXinerama(parent, name);
+ }
+
+ KDE_EXPORT bool test_xinerama() {
+ return QApplication::desktop()->isVirtualDesktop();
+ }
+}
+
+
+#include "kcmxinerama.moc"
+