diff options
Diffstat (limited to 'kcontrol/xinerama/kcmxinerama.cpp')
-rw-r--r-- | kcontrol/xinerama/kcmxinerama.cpp | 254 |
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..d32adc1b8 --- /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 <tdeaboutdata.h> +#include <tdeapplication.h> +#include <tdeconfig.h> +#include <kdialog.h> +#include <tdeglobal.h> +#include <tdeglobalsettings.h> +#include <tdelocale.h> +#include <tdemessagebox.h> +#include <twin.h> + +#include <tqcheckbox.h> +#include <tqlayout.h> +#include <tqlabel.h> +#include <tqcombobox.h> +#include <tqtable.h> +#include <tqcolor.h> +#include <tqpushbutton.h> + + +KCMXinerama::KCMXinerama(TQWidget *parent, const char *name) + : TDECModule(parent, name) { + _indicators.setAutoDelete(true); + + TDEAboutData *about = + new TDEAboutData(I18N_NOOP("kcmxinerama"), + I18N_NOOP("TDE Multiple Monitor Configurator"), + 0, 0, TDEAboutData::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 TDE support" + " for multiple monitors.")); + + config = new TDEConfig("kdeglobals", false, false); + ksplashrc = new TDEConfig("ksplashrc", false, false); + + connect(&_timer, TQT_SIGNAL(timeout()), this, TQT_SLOT(clearIndicator())); + + TQGridLayout *grid = new TQGridLayout(this, 1, 1, KDialog::marginHint(), + KDialog::spacingHint()); + + // Setup the panel + _displays = TQApplication::desktop()->numScreens(); + + if (TQApplication::desktop()->isVirtualDesktop()) { + TQStringList dpyList; + xw = new XineramaWidget(this); + grid->addWidget(xw, 0, 0); + TQString label = i18n("Display %1"); + + xw->headTable->setNumRows(_displays); + + for (int i = 0; i < _displays; i++) { + TQString l = label.arg(i+1); + TQRect geom = TQApplication::desktop()->screenGeometry(i); + xw->_unmanagedDisplay->insertItem(l); + xw->_ksplashDisplay->insertItem(l); + dpyList.append(l); + xw->headTable->setText(i, 0, TQString::number(geom.x())); + xw->headTable->setText(i, 1, TQString::number(geom.y())); + xw->headTable->setText(i, 2, TQString::number(geom.width())); + xw->headTable->setText(i, 3, TQString::number(geom.height())); + } + + xw->_unmanagedDisplay->insertItem(i18n("Display Containing the Pointer")); + + xw->headTable->setRowLabels(dpyList); + + connect(xw->_ksplashDisplay, TQT_SIGNAL(activated(int)), + this, TQT_SLOT(windowIndicator(int))); + connect(xw->_unmanagedDisplay, TQT_SIGNAL(activated(int)), + this, TQT_SLOT(windowIndicator(int))); + connect(xw->_identify, TQT_SIGNAL(clicked()), + this, TQT_SLOT(indicateWindows())); + + connect(xw, TQT_SIGNAL(configChanged()), this, TQT_SLOT(changed())); + } else { // no Xinerama + TQLabel *ql = new TQLabel(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 (TQApplication::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", TQApplication::desktop()->primaryScreen()); + if ((item < 0 || item >= _displays) && (item != -3)) + xw->_unmanagedDisplay->setCurrentItem(TQApplication::desktop()->primaryScreen()); + else if (item == -3) // pointer warp + xw->_unmanagedDisplay->setCurrentItem(_displays); + else xw->_unmanagedDisplay->setCurrentItem(item); + + ksplashrc->setGroup("Xinerama"); + item = ksplashrc->readNumEntry("KSplashScreen", TQApplication::desktop()->primaryScreen()); + if (item < 0 || item >= _displays) + xw->_ksplashDisplay->setCurrentItem(TQApplication::desktop()->primaryScreen()); + else xw->_ksplashDisplay->setCurrentItem(item); + + emit changed(useDefaults); + } + else + emit changed( false ); +} + + +void KCMXinerama::save() { + if (TQApplication::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("twin", "", "reconfigure()", TQString("")); + + 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("TDE 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); +} + +TQWidget *KCMXinerama::indicator(int dpy) { + TQLabel *si = new TQLabel(TQString::number(dpy+1), 0, "Screen Indicator", (WFlags)WX11BypassWM ); + + TQFont fnt = TDEGlobalSettings::generalFont(); + fnt.setPixelSize(100); + si->setFont(fnt); + si->setFrameStyle(TQFrame::Panel); + si->setFrameShadow(TQFrame::Plain); + si->setAlignment(Qt::AlignCenter); + + TQPoint screenCenter(TQApplication::desktop()->screenGeometry(dpy).center()); + TQRect targetGeometry(TQPoint(0,0), si->sizeHint()); + targetGeometry.moveCenter(screenCenter); + si->setGeometry(targetGeometry); + si->show(); + + return si; +} + +void KCMXinerama::clearIndicator() { + _indicators.clear(); +} + +extern "C" { + KDE_EXPORT TDECModule *create_xinerama(TQWidget *parent, const char *name) { + TDEGlobal::locale()->insertCatalogue("kcmxinerama"); + return new KCMXinerama(parent, name); + } + + KDE_EXPORT bool test_xinerama() { + return TQApplication::desktop()->isVirtualDesktop(); + } +} + + +#include "kcmxinerama.moc" + |