|
|
|
// -*- c-basic-offset: 2 -*-
|
|
|
|
/**
|
|
|
|
* Copyright (c) 2000 Matthias Elter <elter@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 <tqlabel.h>
|
|
|
|
#include <tqgroupbox.h>
|
|
|
|
#include <tqlayout.h>
|
|
|
|
#include <tqwhatsthis.h>
|
|
|
|
#include <tqcheckbox.h>
|
|
|
|
#include <tqslider.h>
|
|
|
|
|
|
|
|
#include <kapplication.h>
|
|
|
|
#include <kglobal.h>
|
|
|
|
#include <dcopclient.h>
|
|
|
|
#include <klocale.h>
|
|
|
|
#include <kdialog.h>
|
|
|
|
#include <klineedit.h>
|
|
|
|
#include <knuminput.h>
|
|
|
|
#include <kconfig.h>
|
|
|
|
|
|
|
|
#include <netwm.h>
|
|
|
|
|
|
|
|
#include "desktop.h"
|
|
|
|
#include "desktop.moc"
|
|
|
|
|
|
|
|
extern "C"
|
|
|
|
{
|
|
|
|
KDE_EXPORT KCModule *create_virtualdesktops(TQWidget *parent, const char * /*name*/)
|
|
|
|
{
|
|
|
|
return new KDesktopConfig(parent, "kcmkonq");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// I'm using lineedits by intention as it makes sence to be able
|
|
|
|
// to see all desktop names at the same time. It also makes sense to
|
|
|
|
// be able to TAB through those line edits fast. So don't send me mails
|
|
|
|
// asking why I did not implement a more intelligent/smaller GUI.
|
|
|
|
|
|
|
|
KDesktopConfig::KDesktopConfig(TQWidget *parent, const char * /*name*/)
|
|
|
|
: KCModule(parent, "kcmkonq")
|
|
|
|
{
|
|
|
|
|
|
|
|
setQuickHelp( i18n("<h1>Multiple Desktops</h1>In this module, you can configure how many virtual desktops you want and how these should be labeled."));
|
|
|
|
|
|
|
|
Q_ASSERT(maxDesktops % 2 == 0);
|
|
|
|
|
|
|
|
TQVBoxLayout *layout = new TQVBoxLayout(this, 0, KDialog::spacingHint());
|
|
|
|
|
|
|
|
// number group
|
|
|
|
TQGroupBox *number_group = new TQGroupBox(this);
|
|
|
|
|
|
|
|
TQHBoxLayout *lay = new TQHBoxLayout(number_group,
|
|
|
|
KDialog::marginHint(),
|
|
|
|
KDialog::spacingHint());
|
|
|
|
|
|
|
|
TQLabel *label = new TQLabel(i18n("N&umber of desktops: "), number_group);
|
|
|
|
_numInput = new KIntNumInput(4, number_group);
|
|
|
|
_numInput->setRange(1, maxDesktops, 1, true);
|
|
|
|
connect(_numInput, TQT_SIGNAL(valueChanged(int)), TQT_SLOT(slotValueChanged(int)));
|
|
|
|
connect(_numInput, TQT_SIGNAL(valueChanged(int)), TQT_SLOT( changed() ));
|
|
|
|
label->setBuddy( _numInput );
|
|
|
|
TQString wtstr = i18n( "Here you can set how many virtual desktops you want on your KDE desktop. Move the slider to change the value." );
|
|
|
|
TQWhatsThis::add( label, wtstr );
|
|
|
|
TQWhatsThis::add( _numInput, wtstr );
|
|
|
|
|
|
|
|
lay->addWidget(label);
|
|
|
|
lay->addWidget(_numInput);
|
|
|
|
lay->setStretchFactor( _numInput, 2 );
|
|
|
|
|
|
|
|
layout->addWidget(number_group);
|
|
|
|
|
|
|
|
// name group
|
|
|
|
TQGroupBox *name_group = new TQGroupBox(i18n("Desktop &Names"), this);
|
|
|
|
|
|
|
|
name_group->setColumnLayout(4, Qt::Horizontal);
|
|
|
|
|
|
|
|
for(int i = 0; i < (maxDesktops/2); i++)
|
|
|
|
{
|
|
|
|
_nameLabel[i] = new TQLabel(i18n("Desktop %1:").arg(i+1), name_group);
|
|
|
|
_nameInput[i] = new KLineEdit(name_group);
|
|
|
|
_nameLabel[i+(maxDesktops/2)] = new TQLabel(i18n("Desktop %1:").arg(i+(maxDesktops/2)+1), name_group);
|
|
|
|
_nameInput[i+(maxDesktops/2)] = new KLineEdit(name_group);
|
|
|
|
TQWhatsThis::add( _nameLabel[i], i18n( "Here you can enter the name for desktop %1" ).arg( i+1 ) );
|
|
|
|
TQWhatsThis::add( _nameInput[i], i18n( "Here you can enter the name for desktop %1" ).arg( i+1 ) );
|
|
|
|
TQWhatsThis::add( _nameLabel[i+(maxDesktops/2)], i18n( "Here you can enter the name for desktop %1" ).arg( i+(maxDesktops/2)+1 ) );
|
|
|
|
TQWhatsThis::add( _nameInput[i+(maxDesktops/2)], i18n( "Here you can enter the name for desktop %1" ).arg( i+(maxDesktops/2)+1 ) );
|
|
|
|
|
|
|
|
connect(_nameInput[i], TQT_SIGNAL(textChanged(const TQString&)),
|
|
|
|
TQT_SLOT( changed() ));
|
|
|
|
connect(_nameInput[i+(maxDesktops/2)], TQT_SIGNAL(textChanged(const TQString&)),
|
|
|
|
TQT_SLOT( changed() ));
|
|
|
|
}
|
|
|
|
|
|
|
|
for(int i = 1; i < maxDesktops; i++)
|
|
|
|
setTabOrder( _nameInput[i-1], _nameInput[i] );
|
|
|
|
|
|
|
|
layout->addWidget(name_group);
|
|
|
|
|
|
|
|
_wheelOption = new TQCheckBox(i18n("Mouse wheel over desktop background switches desktop"), this);
|
|
|
|
connect(_wheelOption,TQT_SIGNAL(toggled(bool)), TQT_SLOT( changed() ));
|
|
|
|
|
|
|
|
layout->addWidget(_wheelOption);
|
|
|
|
layout->addStretch(1);
|
|
|
|
|
|
|
|
load();
|
|
|
|
}
|
|
|
|
|
|
|
|
void KDesktopConfig::load()
|
|
|
|
{
|
|
|
|
load( false );
|
|
|
|
}
|
|
|
|
|
|
|
|
void KDesktopConfig::load( bool useDefaults )
|
|
|
|
{
|
|
|
|
// get number of desktops
|
|
|
|
NETRootInfo info( qt_xdisplay(), NET::NumberOfDesktops | NET::DesktopNames );
|
|
|
|
int n = info.numberOfDesktops();
|
|
|
|
|
|
|
|
int konq_screen_number = 0;
|
|
|
|
if (qt_xdisplay())
|
|
|
|
konq_screen_number = DefaultScreen(qt_xdisplay());
|
|
|
|
|
|
|
|
TQCString groupname;
|
|
|
|
if (konq_screen_number == 0)
|
|
|
|
groupname = "Desktops";
|
|
|
|
else
|
|
|
|
groupname.sprintf("Desktops-screen-%d", konq_screen_number);
|
|
|
|
|
|
|
|
KConfig * kwinconfig = new KConfig("kwinrc");
|
|
|
|
|
|
|
|
kwinconfig->setReadDefaults( useDefaults );
|
|
|
|
|
|
|
|
kwinconfig->setGroup("Desktops");
|
|
|
|
for(int i = 1; i <= maxDesktops; i++)
|
|
|
|
{
|
|
|
|
TQString key_name(TQString("Name_") + TQString::number(i));
|
|
|
|
TQString name = TQString::fromUtf8(info.desktopName(i));
|
|
|
|
if (name.isEmpty()) // Get name from configuration if none is set in the WM.
|
|
|
|
{
|
|
|
|
name = kwinconfig->readEntry(key_name, i18n("Desktop %1").arg(i));
|
|
|
|
}
|
|
|
|
_nameInput[i-1]->setText(name);
|
|
|
|
|
|
|
|
// Is this entry immutable or not in the range of configured desktops?
|
|
|
|
_labelImmutable[i - 1] = kwinconfig->entryIsImmutable(key_name);
|
|
|
|
_nameInput[i-1]->setEnabled(i <= n && !_labelImmutable[i - 1]);
|
|
|
|
}
|
|
|
|
|
|
|
|
_numInput->setEnabled(!kwinconfig->entryIsImmutable("Number"));
|
|
|
|
|
|
|
|
delete kwinconfig;
|
|
|
|
kwinconfig = 0;
|
|
|
|
|
|
|
|
TQString configfile;
|
|
|
|
if (konq_screen_number == 0)
|
|
|
|
configfile = "kdesktoprc";
|
|
|
|
else
|
|
|
|
configfile.sprintf("kdesktop-screen-%drc", konq_screen_number);
|
|
|
|
|
|
|
|
KConfig *config = new KConfig(configfile, false, false);
|
|
|
|
|
|
|
|
config->setReadDefaults( useDefaults );
|
|
|
|
|
|
|
|
config->setGroup("Mouse Buttons");
|
|
|
|
_wheelOption->setChecked(config->readBoolEntry("WheelSwitchesWorkspace",false));
|
|
|
|
|
|
|
|
_wheelOptionImmutable = config->entryIsImmutable("WheelSwitchesWorkspace");
|
|
|
|
|
|
|
|
if (_wheelOptionImmutable || n<2)
|
|
|
|
_wheelOption->setEnabled( false );
|
|
|
|
|
|
|
|
delete config;
|
|
|
|
config = 0;
|
|
|
|
|
|
|
|
_numInput->setValue(n);
|
|
|
|
emit changed( useDefaults );
|
|
|
|
}
|
|
|
|
|
|
|
|
void KDesktopConfig::save()
|
|
|
|
{
|
|
|
|
NETRootInfo info( qt_xdisplay(), NET::NumberOfDesktops | NET::DesktopNames );
|
|
|
|
// set desktop names
|
|
|
|
for(int i = 1; i <= maxDesktops; i++)
|
|
|
|
{
|
|
|
|
info.setDesktopName(i, (_nameInput[i-1]->text()).utf8());
|
|
|
|
info.activate();
|
|
|
|
}
|
|
|
|
// set number of desktops
|
|
|
|
info.setNumberOfDesktops(_numInput->value());
|
|
|
|
info.activate();
|
|
|
|
|
|
|
|
XSync(qt_xdisplay(), FALSE);
|
|
|
|
|
|
|
|
int konq_screen_number = 0;
|
|
|
|
if (qt_xdisplay())
|
|
|
|
konq_screen_number = DefaultScreen(qt_xdisplay());
|
|
|
|
|
|
|
|
TQCString appname;
|
|
|
|
if (konq_screen_number == 0)
|
|
|
|
appname = "kdesktop";
|
|
|
|
else
|
|
|
|
appname.sprintf("kdesktop-screen-%d", konq_screen_number);
|
|
|
|
|
|
|
|
KConfig *config = new KConfig(appname + "rc");
|
|
|
|
config->setGroup("Mouse Buttons");
|
|
|
|
config->writeEntry("WheelSwitchesWorkspace", _wheelOption->isChecked());
|
|
|
|
delete config;
|
|
|
|
|
|
|
|
// Tell kdesktop about the new config file
|
|
|
|
if ( !kapp->dcopClient()->isAttached() )
|
|
|
|
kapp->dcopClient()->attach();
|
|
|
|
TQByteArray data;
|
|
|
|
|
|
|
|
kapp->dcopClient()->send( appname, "KDesktopIface", "configure()", data );
|
|
|
|
|
|
|
|
emit changed(false);
|
|
|
|
}
|
|
|
|
|
|
|
|
void KDesktopConfig::defaults()
|
|
|
|
{
|
|
|
|
load( true );
|
|
|
|
}
|
|
|
|
|
|
|
|
void KDesktopConfig::slotValueChanged(int n)
|
|
|
|
{
|
|
|
|
for(int i = 0; i < maxDesktops; i++)
|
|
|
|
{ _nameInput[i]->setEnabled(i < n && !_labelImmutable[i]); }
|
|
|
|
if (!_wheelOptionImmutable)
|
|
|
|
{ _wheelOption->setEnabled(n>1); }
|
|
|
|
emit changed(true);
|
|
|
|
}
|