You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
255 lines
7.9 KiB
255 lines
7.9 KiB
/**
|
|
* kcmxinerama.cpp
|
|
*
|
|
* Copyright (c) 2002-2004 George Staikos <staikos@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 "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 <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)
|
|
: 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, "staikos@kde.org");
|
|
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, 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("kwin", "", "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("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);
|
|
}
|
|
|
|
TQWidget *KCMXinerama::indicator(int dpy) {
|
|
TQLabel *si = new TQLabel(TQString::number(dpy+1), 0, "Screen Indicator", (WFlags)WX11BypassWM );
|
|
|
|
TQFont fnt = KGlobalSettings::generalFont();
|
|
fnt.setPixelSize(100);
|
|
si->setFont(fnt);
|
|
si->setFrameStyle(TQFrame::Panel);
|
|
si->setFrameShadow(TQFrame::Plain);
|
|
si->tqsetAlignment(Qt::AlignCenter);
|
|
|
|
TQPoint screenCenter(TQApplication::desktop()->screenGeometry(dpy).center());
|
|
TQRect targetGeometry(TQPoint(0,0), si->tqsizeHint());
|
|
targetGeometry.moveCenter(screenCenter);
|
|
si->setGeometry(targetGeometry);
|
|
si->show();
|
|
|
|
return si;
|
|
}
|
|
|
|
void KCMXinerama::clearIndicator() {
|
|
_indicators.clear();
|
|
}
|
|
|
|
extern "C" {
|
|
KDE_EXPORT KCModule *create_xinerama(TQWidget *parent, const char *name) {
|
|
KGlobal::locale()->insertCatalogue("kcmxinerama");
|
|
return new KCMXinerama(parent, name);
|
|
}
|
|
|
|
KDE_EXPORT bool test_xinerama() {
|
|
return TQApplication::desktop()->isVirtualDesktop();
|
|
}
|
|
}
|
|
|
|
|
|
#include "kcmxinerama.moc"
|
|
|