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.
tdebase/kcontrol/bell/bell.cpp

257 lines
8.4 KiB

/*
Copyright (c) 1997 Christian Czezatke (e9025461@student.tuwien.ac.at)
1998 Bernd Wuebben <wuebben@kde.org>
2000 Matthias Elter <elter@kde.org>
2001 Carsten PFeiffer <pfeiffer@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 <tqcheckbox.h>
#include <tqgroupbox.h>
#include <tqlayout.h>
#include <tqpushbutton.h>
#include <tqwhatsthis.h>
#include <kaboutdata.h>
#include <kapplication.h>
#include <kconfig.h>
#include <kdialog.h>
#include <kglobal.h>
#include <knotifyclient.h>
#include <knuminput.h>
#include "bell.h"
#include "bell.moc"
#include <X11/Xlib.h>
extern "C"
{
KDE_EXPORT KCModule *create_bell(TQWidget *parent, const char *)
{
return new KBellConfig(parent, "kcmbell");
}
KDE_EXPORT void init_bell()
{
XKeyboardState kbd;
XKeyboardControl kbdc;
XGetKeyboardControl(kapp->getDisplay(), &kbd);
KConfig config("kcmbellrc", true, false);
config.setGroup("General");
kbdc.bell_percent = config.readNumEntry("Volume", kbd.bell_percent);
kbdc.bell_pitch = config.readNumEntry("Pitch", kbd.bell_pitch);
kbdc.bell_duration = config.readNumEntry("Duration", kbd.bell_duration);
XChangeKeyboardControl(kapp->getDisplay(),
KBBellPercent | KBBellPitch | KBBellDuration,
&kbdc);
}
}
KBellConfig::KBellConfig(TQWidget *parent, const char *name):
KCModule(parent, name)
{
TQBoxLayout *layout = new TQVBoxLayout(this, 0, KDialog::spacingHint());
int row = 0;
TQGroupBox *box = new TQGroupBox( i18n("Bell Settings"), this );
box->setColumnLayout( 0, Qt::Horizontal );
layout->addWidget(box);
layout->addStretch();
TQGridLayout *grid = new TQGridLayout(box->tqlayout(), KDialog::spacingHint());
grid->setColStretch(0, 0);
grid->setColStretch(1, 1);
grid->addColSpacing(0, 30);
m_useBell = new TQCheckBox( i18n("&Use system bell instead of system notification" ), box );
TQWhatsThis::add(m_useBell, i18n("You can use the standard system bell (PC speaker) or a "
"more sophisticated system notification, see the "
"\"System Notifications\" control module for the "
"\"Something Special Happened in the Program\" event."));
connect(m_useBell, TQT_SIGNAL( toggled( bool )), TQT_SLOT( useBell( bool )));
row++;
grid->addMultiCellWidget(m_useBell, row, row, 0, 1);
setQuickHelp( i18n("<h1>System Bell</h1> Here you can customize the sound of the standard system bell,"
" i.e. the \"beep\" you always hear when there is something wrong. Note that you can further"
" customize this sound using the \"Accessibility\" control module; for example, you can choose"
" a sound file to be played instead of the standard bell."));
m_volume = new KIntNumInput(50, box);
m_volume->setLabel(i18n("&Volume:"));
m_volume->setRange(0, 100, 5);
m_volume->setSuffix("%");
m_volume->setSteps(5,25);
grid->addWidget(m_volume, ++row, 1);
TQWhatsThis::add( m_volume, i18n("Here you can customize the volume of the system bell. For further"
" customization of the bell, see the \"Accessibility\" control module.") );
m_pitch = new KIntNumInput(m_volume, 800, box);
m_pitch->setLabel(i18n("&Pitch:"));
m_pitch->setRange(20, 2000, 20);
m_pitch->setSuffix(i18n(" Hz"));
m_pitch->setSteps(40,200);
grid->addWidget(m_pitch, ++row, 1);
TQWhatsThis::add( m_pitch, i18n("Here you can customize the pitch of the system bell. For further"
" customization of the bell, see the \"Accessibility\" control module.") );
m_duration = new KIntNumInput(m_pitch, 100, box);
m_duration->setLabel(i18n("&Duration:"));
m_duration->setRange(1, 1000, 50);
m_duration->setSuffix(i18n(" msec"));
m_duration->setSteps(20,100);
grid->addWidget(m_duration, ++row, 1);
TQWhatsThis::add( m_duration, i18n("Here you can customize the duration of the system bell. For further"
" customization of the bell, see the \"Accessibility\" control module.") );
TQBoxLayout *boxLayout = new TQHBoxLayout();
m_testButton = new TQPushButton(i18n("&Test"), box, "test");
boxLayout->addWidget(m_testButton, 0, AlignRight);
grid->addLayout( boxLayout, ++row, 1 );
connect( m_testButton, TQT_SIGNAL(clicked()), TQT_SLOT(ringBell()));
TQWhatsThis::add( m_testButton, i18n("Click \"Test\" to hear how the system bell will sound using your changed settings.") );
// watch for changes
connect(m_volume, TQT_SIGNAL(valueChanged(int)), TQT_SLOT(changed()));
connect(m_pitch, TQT_SIGNAL(valueChanged(int)), TQT_SLOT(changed()));
connect(m_duration, TQT_SIGNAL(valueChanged(int)), TQT_SLOT(changed()));
KAboutData *about =
new KAboutData(I18N_NOOP("kcmbell"), I18N_NOOP("KDE Bell Control Module"),
0, 0, KAboutData::License_GPL,
I18N_NOOP("(c) 1997 - 2001 Christian Czezatke, Matthias Elter"));
about->addAuthor("Christian Czezatke", I18N_NOOP("Original author"), "e9025461@student.tuwien.ac.at");
about->addAuthor("Bernd Wuebben", 0, "wuebben@kde.org");
about->addAuthor("Matthias Elter", I18N_NOOP("Current maintainer"), "elter@kde.org");
about->addAuthor("Carsten Pfeiffer", 0, "pfeiffer@kde.org");
setAboutData(about);
load();
}
void KBellConfig::load()
{
load( false );
}
void KBellConfig::load( bool useDefaults )
{
XKeyboardState kbd;
XGetKeyboardControl(kapp->getDisplay(), &kbd);
m_volume->setValue(kbd.bell_percent);
m_pitch->setValue(kbd.bell_pitch);
m_duration->setValue(kbd.bell_duration);
KConfig cfg("kdeglobals", false, false);
cfg.setReadDefaults( useDefaults );
cfg.setGroup("General");
m_useBell->setChecked(cfg.readBoolEntry("UseSystemBell", false));
useBell(m_useBell->isChecked());
emit changed( useDefaults );
}
void KBellConfig::save()
{
XKeyboardControl kbd;
int bellVolume = m_volume->value();
int bellPitch = m_pitch->value();
int bellDuration = m_duration->value();
kbd.bell_percent = bellVolume;
kbd.bell_pitch = bellPitch;
kbd.bell_duration = bellDuration;
XChangeKeyboardControl(kapp->getDisplay(),
KBBellPercent | KBBellPitch | KBBellDuration,
&kbd);
KConfig config("kcmbellrc", false, false);
config.setGroup("General");
config.writeEntry("Volume",bellVolume);
config.writeEntry("Pitch",bellPitch);
config.writeEntry("Duration",bellDuration);
config.sync();
KConfig cfg("kdeglobals", false, false);
cfg.setGroup("General");
cfg.writeEntry("UseSystemBell", m_useBell->isChecked());
cfg.sync();
if (!m_useBell->isChecked())
{
KConfig config("kaccessrc", false);
config.setGroup("Bell");
config.writeEntry("SystemBell", false);
config.writeEntry("ArtsBell", false);
config.writeEntry("VisibleBell", false);
}
}
void KBellConfig::ringBell()
{
if (!m_useBell->isChecked()) {
KNotifyClient::beep();
return;
}
// store the old state
XKeyboardState old_state;
XGetKeyboardControl(kapp->getDisplay(), &old_state);
// switch to the test state
XKeyboardControl kbd;
kbd.bell_percent = m_volume->value();
kbd.bell_pitch = m_pitch->value();
if (m_volume->value() > 0)
kbd.bell_duration = m_duration->value();
else
kbd.bell_duration = 0;
XChangeKeyboardControl(kapp->getDisplay(),
KBBellPercent | KBBellPitch | KBBellDuration,
&kbd);
// ring bell
XBell(kapp->getDisplay(),0);
// restore old state
kbd.bell_percent = old_state.bell_percent;
kbd.bell_pitch = old_state.bell_pitch;
kbd.bell_duration = old_state.bell_duration;
XChangeKeyboardControl(kapp->getDisplay(),
KBBellPercent | KBBellPitch | KBBellDuration,
&kbd);
}
void KBellConfig::defaults()
{
load( true );
}
void KBellConfig::useBell( bool on )
{
m_volume->setEnabled( on );
m_pitch->setEnabled( on );
m_duration->setEnabled( on );
m_testButton->setEnabled( on );
changed();
}