Source Code (Use browser search to find items of interest.)

Class Index

kcontrol'KBackground (./kdebase/kcontrol/kdm/backgnd.h:66)

class KBackground: public KCModule
{
    Q_OBJECT

public:
    KBackground(QWidget *parent, const char *name);

    virtual void load();
    virtual void save();
    virtual void defaults();

signals:
    void changed(bool);

private slots:
    void slotSelectDesk(int desk);
    void slotCommonDesk(bool common);
    void slotBGMode(int mode);
    void slotBGSetup();
    void slotColor1(const QColor &);
    void slotColor2(const QColor &);
    void slotImageDropped(QString);
    void slotWPMode(int);
    void slotWallpaper(const QString &);
    void slotBrowseWallpaper();
    void slotSetupMulti();
    void slotPreviewDone(int);
    void slotMultiMode(bool);

private:
    void init();
    void apply();

    int m_Desk, m_Max;

    QCheckBox *m_pCBMulti;
    QComboBox *m_pBackgroundBox, *m_pWallpaperBox;
    QComboBox *m_pArrangementBox;
    QPushButton *m_pBGSetupBut, *m_pMSetupBut;
    QPushButton *m_pBrowseBut;
    QMap<QString,int> m_Wallpaper;

    KBackgroundRenderer *m_Renderer[_maxDesktops];
    KColorButton *m_pColor1But, *m_pColor2But;
    KBGMonitor *m_pMonitor;

    KStandardDirs *m_pDirs;
};


kcontrol'KBackground::KBackground() (./kdebase/kcontrol/display/backgnd.cpp:99)

KBackground::KBackground(QWidget *parent, const char *name)
    : KCModule(parent, name)
{
    m_pConfig = new KConfig("kdesktoprc");
    m_pDirs = KGlobal::dirs();

    // Top layout
    QGridLayout *top = new QGridLayout(this, 3, 2);
    top->setSpacing(10); top->setMargin(10);
    top->setColStretch(0, 1);
    top->setColStretch(1, 2);

    // A nice button size. Translators can adapt this
    QPushButton *pbut = new QPushButton(i18n("abcdefgh"), this);
    QSize bsize = pbut->sizeHint();
    delete pbut;

    // Desktop chooser at (0, 0)
    QGroupBox *group = new QGroupBox(i18n("Desktop"), this);
    top->addWidget(group, 0, 0);
    QVBoxLayout *vbox = new QVBoxLayout(group);
    vbox->setMargin(10);
    vbox->setSpacing(10);
    vbox->addSpacing(10);
    m_pDeskList = new QListBox(group);
    connect(m_pDeskList, SIGNAL(highlighted(int)), SLOT(slotSelectDesk(int)));
    vbox->addWidget(m_pDeskList);
    m_pCBCommon = new QCheckBox(i18n("&Common Background"), group);
    vbox->addWidget(m_pCBCommon);
    connect(m_pCBCommon, SIGNAL(toggled(bool)), SLOT(slotCommonDesk(bool)));

    // Background settings
    group = new QGroupBox(i18n("Background"), this);
    top->addWidget(group, 1, 0);
    QGridLayout *grid = new QGridLayout(group, 5, 2);
    grid->setMargin(10);
    grid->setSpacing(10);
    grid->addRowSpacing(0, 10);
    grid->setColStretch(0, 0);

    QLabel *lbl = new QLabel(i18n("&Mode:"), group);
    lbl->setFixedSize(lbl->sizeHint());
    grid->addWidget(lbl, 1, 0, Qt::AlignLeft);
    m_pBackgroundBox = new QComboBox(group);
    connect(m_pBackgroundBox, SIGNAL(activated(int)), SLOT(slotBGMode(int)));
    lbl->setBuddy(m_pBackgroundBox);
    grid->addWidget(m_pBackgroundBox, 1, 1);

    lbl = new QLabel(i18n("Color &1:"), group);
    lbl->setFixedSize(lbl->sizeHint());
    grid->addWidget(lbl, 2, 0, Qt::AlignLeft);
    m_pColor1But = new KColorButton(group);
    connect(m_pColor1But, SIGNAL(changed(const QColor &)),
	    SLOT(slotColor1(const QColor &)));
    grid->addWidget(m_pColor1But, 2, 1);
    lbl->setBuddy(m_pColor1But);

    lbl = new QLabel(i18n("Color &2:"), group);
    lbl->setFixedSize(lbl->sizeHint());
    grid->addWidget(lbl, 3, 0, Qt::AlignLeft);
    m_pColor2But = new KColorButton(group);
    connect(m_pColor2But, SIGNAL(changed(const QColor &)),
	    SLOT(slotColor2(const QColor &)));
    grid->addWidget(m_pColor2But, 3, 1);
    lbl->setBuddy(m_pColor2But);

    QHBoxLayout *hbox = new QHBoxLayout();
    grid->addLayout(hbox, 4, 1);
    m_pBGSetupBut = new QPushButton(i18n("&Setup"), group);
    m_pBGSetupBut->setFixedSize(bsize);
    connect(m_pBGSetupBut, SIGNAL(clicked()), SLOT(slotBGSetup()));
    hbox->addWidget(m_pBGSetupBut);
    hbox->addStretch();


    // Preview monitor at (0,1)
    hbox = new QHBoxLayout();
    top->addLayout(hbox, 0, 1);
    lbl = new QLabel(this);
    lbl->setPixmap(locate("data", "kcontrol/pics/monitor.png"));
    lbl->setFixedSize(lbl->sizeHint());
    hbox->addWidget(lbl);
    m_pMonitor = new KBGMonitor(lbl, "preview monitor");
    m_pMonitor->setGeometry(20, 10, 157, 111);
    connect(m_pMonitor, SIGNAL(imageDropped(QString)), SLOT(slotImageDropped(QString)));

    // Wallpaper at (1,1)
    group = new QGroupBox(i18n("Wallpaper"), this);
    top->addWidget(group, 1, 1);
    grid = new QGridLayout(group, 6, 2);
    grid->setMargin(10); grid->setSpacing(10);
    grid->addRowSpacing(0, 10);
    grid->addRowSpacing(4, 10);

    lbl = new QLabel(i18n("M&ode:"), group);
    lbl->setFixedSize(lbl->sizeHint());
    grid->addWidget(lbl, 1, 0, Qt::AlignLeft);
    m_pArrangementBox = new QComboBox(group);
    connect(m_pArrangementBox, SIGNAL(activated(int)), SLOT(slotWPMode(int)));
    lbl->setBuddy(m_pArrangementBox);
    grid->addWidget(m_pArrangementBox, 1, 1);

    lbl = new QLabel(i18n("&Wallpaper"), group);
    lbl->setFixedSize(lbl->sizeHint());
    grid->addWidget(lbl, 2, 0, Qt::AlignLeft);
    m_pWallpaperBox = new QComboBox(group);
    lbl->setBuddy(m_pWallpaperBox);
    connect(m_pWallpaperBox, SIGNAL(activated(const QString &)),
	    SLOT(slotWallpaper(const QString &)));
    grid->addWidget(m_pWallpaperBox, 2, 1);

    hbox = new QHBoxLayout();
    grid->addLayout(hbox, 3, 1);
    m_pBrowseBut = new QPushButton(i18n("&Browse"), group);
    m_pBrowseBut->setFixedSize(bsize);
    connect(m_pBrowseBut, SIGNAL(clicked()), SLOT(slotBrowseWallpaper()));
    hbox->addWidget(m_pBrowseBut);
    hbox->addStretch();

    m_pCBMulti = new QCheckBox(i18n("M&ultiple:"), group);
    m_pCBMulti->setFixedSize(m_pCBMulti->sizeHint());
    connect(m_pCBMulti, SIGNAL(toggled(bool)), SLOT(slotMultiMode(bool)));
    grid->addWidget(m_pCBMulti, 4, 0);
    hbox = new QHBoxLayout();
    grid->addLayout(hbox, 4, 1);
    m_pMSetupBut = new QPushButton(i18n("S&etup"), group);
    m_pMSetupBut->setFixedSize(bsize);
    connect(m_pMSetupBut, SIGNAL(clicked()), SLOT(slotSetupMulti()));
    hbox->addWidget(m_pMSetupBut);
    hbox->addStretch();

    // Blending
    group = new QGroupBox(i18n("Blending between Background and Wallpaper"),
			  this);
    top->addMultiCellWidget(group, 2,2, 0, 1);
    grid = new QGridLayout(group, 2, 5);
    grid->setMargin(10);
    grid->setSpacing(10);
    grid->addRowSpacing(0, 10);

    lbl = new QLabel(i18n("&Mode:"), group);
    lbl->setFixedSize(lbl->sizeHint());
    grid->addWidget(lbl,1,0);
    m_pBlendBox = new QComboBox(group);
    connect(m_pBlendBox, SIGNAL(activated(int)), SLOT(slotBlendMode(int)));
    lbl->setBuddy(m_pBlendBox);
    grid->addWidget(m_pBlendBox,1,1);


    lbl = new QLabel(i18n("&Balance:"), group);
    lbl->setFixedSize(lbl->sizeHint());
    grid->addWidget(lbl,1,2);
    m_pBlendSlider = new QSlider( QSlider::Horizontal, group );
    m_pBlendSlider->setRange( -200, 200 );
    connect(m_pBlendSlider, SIGNAL(valueChanged(int)),
	    SLOT(slotBlendBalance(int)));
    lbl->setBuddy(m_pBlendSlider);
    grid->addWidget(m_pBlendSlider,1,3);

    m_pReverseBlending = new QCheckBox(i18n("&Reverse"), group);
    m_pReverseBlending->setFixedSize(m_pReverseBlending->sizeHint());
    connect(m_pReverseBlending, SIGNAL(toggled(bool)), 
	    SLOT(slotReverseBlending(bool)));
    grid->addWidget(m_pReverseBlending,1,4);

    m_Desk = KWin::currentDesktop() - 1;
    m_Max = KWin::numberOfDesktops();
    m_pGlobals = new KGlobalBackgroundSettings();
    for (int i=0; i<m_Max; i++) {
	m_Renderer[i] = new KBackgroundRenderer(i);
	connect(m_Renderer[i], SIGNAL(imageDone(int)), SLOT(slotPreviewDone(int)));
    }

    // Doing this only in KBGMonitor only doesn't work, probably due to the
    // reparenting that is done.
    setAcceptDrops(true);

    init();
    apply();

}


/*
 * Fill all check/listboxen
 */

kcontrol'KBackground::init() (./kdebase/kcontrol/display/backgnd.cpp:285)

void KBackground::init()
{
    int i;

    // Desktop names
    for (i=0; i<KWin::numberOfDesktops(); i++)
	m_pDeskList->insertItem(m_pGlobals->deskName(i));

    // Background modes: make sure these match with kdesktop/bgrender.cc !!
    m_pBackgroundBox->insertItem(i18n("Flat"));
    m_pBackgroundBox->insertItem(i18n("Pattern"));
    m_pBackgroundBox->insertItem(i18n("Background Program"));
    m_pBackgroundBox->insertItem(i18n("Horizontal Gradient"));
    m_pBackgroundBox->insertItem(i18n("Vertical Gradient"));
    m_pBackgroundBox->insertItem(i18n("Pyramid Gradient"));
    m_pBackgroundBox->insertItem(i18n("Pipecross Gradient"));
    m_pBackgroundBox->insertItem(i18n("Elliptic Gradient"));

    // Blend modes: make sure these match with kdesktop/bgrender.cc !!
    m_pBlendBox->insertItem(i18n("No Blending"));
    m_pBlendBox->insertItem(i18n("Horizontal Blending"));
    m_pBlendBox->insertItem(i18n("Vertical Blending"));
    m_pBlendBox->insertItem(i18n("Pyramid Blending"));
    m_pBlendBox->insertItem(i18n("Pipecross Blending"));
    m_pBlendBox->insertItem(i18n("Elliptic Blending"));
    m_pBlendBox->insertItem(i18n("Intensity Blending"));
    m_pBlendBox->insertItem(i18n("Saturate Blending"));
    m_pBlendBox->insertItem(i18n("Contrast Blending"));
    m_pBlendBox->insertItem(i18n("Hue Shift Blending"));

    // Use this as a common size for the combo boxen
    int width = m_pBackgroundBox->sizeHint().width();

    // Wallpapers
    QStringList lst = m_pDirs->findAllResources("wallpaper", "*", false, true);
    for (i=0; i<(int)lst.count(); i++) {
	int n = lst[i].findRev('/');
	QString s = lst[i].mid(n+1);
	m_pWallpaperBox->insertItem(s);
	m_Wallpaper[s] = i;
    }

    // I would have prefered to use setMinimumWidth here, but it seems to
    // have no effect. The default width is too large because of the long
    // filenames that are inserted.
    m_pWallpaperBox->setFixedWidth(width);

    // Wallpaper tilings: again they must match the ones from bgrender.cc
    m_pArrangementBox->insertItem(i18n("No Wallpaper"));
    m_pArrangementBox->insertItem(i18n("Centred"));
    m_pArrangementBox->insertItem(i18n("Tiled"));
    m_pArrangementBox->insertItem(i18n("Center Tiled"));
    m_pArrangementBox->insertItem(i18n("Centred Maxpect"));
    m_pArrangementBox->insertItem(i18n("Scaled"));
    m_pArrangementBox->setFixedWidth(width);
}



kcontrol'KBackground::apply() (./kdebase/kcontrol/display/backgnd.cpp:343)

void KBackground::apply()
{
    int desk = m_Desk;
    if (m_pGlobals->commonBackground())
	desk = 0;
    KBackgroundRenderer *r = m_Renderer[desk];

    // Desktop names
    if (m_pGlobals->commonBackground()) {
	m_pCBCommon->setChecked(true);
	m_pDeskList->setEnabled(false);
    } else  {
	m_pCBCommon->setChecked(false);
	m_pDeskList->setEnabled(true);
	m_pDeskList->setCurrentItem(m_Desk);
    }

    // Background mode
    m_pBackgroundBox->setCurrentItem(r->backgroundMode());
    m_pColor1But->setColor(r->colorA());
    m_pColor2But->setColor(r->colorB());
    switch (r->backgroundMode()) {
    case KBackgroundSettings::Program:
	m_pColor1But->setEnabled(false);
	m_pColor2But->setEnabled(false);
	m_pBGSetupBut->setEnabled(true);
	break;
    case KBackgroundSettings::Flat:
	m_pColor1But->setEnabled(true);
	m_pColor2But->setEnabled(false);
	m_pBGSetupBut->setEnabled(false);
	break;
    case KBackgroundSettings::Pattern:
	m_pColor1But->setEnabled(true);
	m_pColor2But->setEnabled(true);
	m_pBGSetupBut->setEnabled(true);
	break;
    default:
	m_pColor1But->setEnabled(true);
	m_pColor2But->setEnabled(true);
	m_pBGSetupBut->setEnabled(false);
	break;
    }

    // Wallpaper mode
    QString wp = r->wallpaper();
    if (wp.isEmpty())
	wp = QString(" ");
    if (!m_Wallpaper.contains(wp)) {
	int count = m_Wallpaper.count();
	m_Wallpaper[wp] = count;
	m_pWallpaperBox->insertItem(wp);
	m_pWallpaperBox->setCurrentItem(count);
    }
    m_pWallpaperBox->setCurrentItem(m_Wallpaper[wp]);
    m_pArrangementBox->setCurrentItem(r->wallpaperMode());
    if (r->wallpaperMode() == KBackgroundSettings::NoWallpaper) {
      m_pCBMulti->setEnabled(false);
      m_pWallpaperBox->setEnabled(false);
      m_pBrowseBut->setEnabled(false);
      m_pMSetupBut->setEnabled(false);

      // Blending not possible without wallpaper
      m_pBlendBox->setEnabled(false);
      m_pBlendSlider->setEnabled(false);
      m_pReverseBlending->setEnabled(false);
    }
    else {
      m_pCBMulti->setEnabled(true);
      m_pBlendBox->setEnabled(true);
      m_pBlendSlider->setEnabled(
	  (r->blendMode()==KBackgroundSettings::NoBlending)?false:true);
      m_pReverseBlending->setEnabled(
	  (r->blendMode()<KBackgroundSettings::IntensityBlending)?false:true);

      // Multi mode
      if (r->multiWallpaperMode() == KBackgroundSettings::NoMulti) {
	m_pCBMulti->setChecked(false);
	m_pWallpaperBox->setEnabled(true);
	m_pBrowseBut->setEnabled(true);
	m_pMSetupBut->setEnabled(false);
      } else {
	m_pCBMulti->setChecked(true);
	m_pWallpaperBox->setEnabled(false);
	m_pBrowseBut->setEnabled(false);
	m_pMSetupBut->setEnabled(true);
      }
    }

    m_pBlendBox->setCurrentItem(r->blendMode());
    m_pBlendSlider->setValue(r->blendBalance());
    m_pReverseBlending->setChecked(r->reverseBlending());

    // Start preview render
    r->setPreview(m_pMonitor->size());
    r->start();
}



kcontrol'KBackground::load() (./kdebase/kcontrol/display/backgnd.cpp:442)

void KBackground::load()
{
    int desk = m_Desk;
    if (m_pGlobals->commonBackground())
	desk = 0;
    m_Renderer[desk]->load(desk);

    apply();
    emit changed(false);
}



kcontrol'KBackground::save() (./kdebase/kcontrol/display/backgnd.cpp:454)

void KBackground::save()
{
    qDebug("Saving stuff...");
    m_pGlobals->writeSettings();
    for (int i=0; i<m_Max; i++)
	m_Renderer[i]->writeSettings();

    // reconfigure kdesktop. kdesktop will notify all clients
    DCOPClient *client = kapp->dcopClient();
    client->send("kdesktop", "KBackgroundIface", "configure()", "");

    emit changed(false);
}



kcontrol'KBackground::defaults() (./kdebase/kcontrol/display/backgnd.cpp:469)

void KBackground::defaults()
{
    int desk = m_Desk;
    if (m_pGlobals->commonBackground())
	desk = 0;
    KBackgroundRenderer *r = m_Renderer[desk];

    if (r->isActive())
	r->stop();
    r->setBackgroundMode(KBackgroundSettings::Flat);
    r->setColorA(_defColorA);
    r->setColorB(_defColorB);
    r->setWallpaperMode(KBackgroundSettings::NoWallpaper);
    r->setMultiWallpaperMode(KBackgroundSettings::NoMulti);
    r->setBlendMode(KBackgroundSettings::NoBlending);
    r->setBlendBalance(_defBlendBalance);
    r->setReverseBlending(_defReverseBlending);
    m_pGlobals->setCommonBackground(_defCommon);
    apply();
    emit changed(true);
}



kcontrol'KBackground::slotSelectDesk() (./kdebase/kcontrol/display/backgnd.cpp:492)

void KBackground::slotSelectDesk(int desk)
{
    if (desk == m_Desk)
	return;

    if (m_Renderer[m_Desk]->isActive())
	m_Renderer[m_Desk]->stop();
    m_Desk = desk;
    apply();
}



kcontrol'KBackground::slotCommonDesk() (./kdebase/kcontrol/display/backgnd.cpp:504)

void KBackground::slotCommonDesk(bool common)
{
    if (common == m_pGlobals->commonBackground())
	return;

    m_pGlobals->setCommonBackground(common);
    apply();
    emit changed(true);
}


/*
 * Called from the "Background Mode" combobox.
 */

kcontrol'KBackground::slotBGMode() (./kdebase/kcontrol/display/backgnd.cpp:518)

void KBackground::slotBGMode(int mode)
{
    int desk = m_Desk;
    if (m_pGlobals->commonBackground())
	desk = 0;
    KBackgroundRenderer *r = m_Renderer[desk];

    if (mode == r->backgroundMode())
	return;

    r->stop();
    r->setBackgroundMode(mode);
    apply();
    emit changed(true);
}

/*
 * Called from the "Blending Mode" combobox.
 */

kcontrol'KBackground::slotBlendMode() (./kdebase/kcontrol/display/backgnd.cpp:537)

void KBackground::slotBlendMode(int mode)
{
    int desk = m_Desk;
    if (m_pGlobals->commonBackground())
	desk = 0;
    KBackgroundRenderer *r = m_Renderer[desk];

    if (mode == r->blendMode())
	return;

    m_pBlendSlider->setEnabled( (mode==KBackgroundSettings::NoBlending)
				?false:true);
    m_pReverseBlending->setEnabled(
	  (r->blendMode()<KBackgroundSettings::IntensityBlending)?false:true);
				
    r->stop();
    r->setBlendMode(mode);
    apply();
    emit changed(true);
}

/*
 * Called from the "Blending" Slider
 */

kcontrol'KBackground::slotBlendBalance() (./kdebase/kcontrol/display/backgnd.cpp:561)

void KBackground::slotBlendBalance(int value)
{
    int desk = m_Desk;
    if (m_pGlobals->commonBackground())
	desk = 0;
    KBackgroundRenderer *r = m_Renderer[desk];

    if (value == r->blendBalance())
	return;

    r->stop();
    r->setBlendBalance(value);
    apply();
    emit changed(true);
}

/*
 * Called from the "Reverse Blending" Checkbox
 */

kcontrol'KBackground::slotReverseBlending() (./kdebase/kcontrol/display/backgnd.cpp:580)

void KBackground::slotReverseBlending(bool value)
{
    int desk = m_Desk;
    if (m_pGlobals->commonBackground())
	desk = 0;
    KBackgroundRenderer *r = m_Renderer[desk];

    if (value == r->reverseBlending())
	return;

    r->stop();
    r->setReverseBlending(value);
    apply();
    emit changed(true);
}


/*
 * Called from the "Background Setup" pushbutton.
 */

kcontrol'KBackground::slotBGSetup() (./kdebase/kcontrol/display/backgnd.cpp:600)

void KBackground::slotBGSetup()
{
    int desk = m_Desk;
    if (m_pGlobals->commonBackground())
	desk = 0;
    KBackgroundRenderer *r = m_Renderer[desk];

    switch (r->backgroundMode()) {
    case KBackgroundSettings::Pattern:
    {
	KPatternSelectDialog dlg;
	QString cur = r->KBackgroundPattern::name();
	dlg.setCurrent(cur);
	if ((dlg.exec() == QDialog::Accepted) && !dlg.pattern().isEmpty()) {
	    r->stop();
	    r->setPattern(dlg.pattern());
	    r->start();
	    emit changed(true);
	}
	break;
    }
    case KBackgroundSettings::Program:
    {
	KProgramSelectDialog dlg;
	QString cur = r->KBackgroundProgram::name();
	dlg.setCurrent(cur);
	if ((dlg.exec() == QDialog::Accepted) && !dlg.program().isEmpty()) {
	    r->stop();
	    r->setProgram(dlg.program());
	    r->start();
	    emit changed(true);
	}
	break;
    }
    default:
	break;
    }
}



kcontrol'KBackground::slotColor1() (./kdebase/kcontrol/display/backgnd.cpp:640)

void KBackground::slotColor1(const QColor &color)
{
    int desk = m_Desk;
    if (m_pGlobals->commonBackground())
	desk = 0;
    KBackgroundRenderer *r = m_Renderer[desk];

    if (color == r->colorA())
	return;

    r->stop();
    r->setColorA(color);
    r->start();
    emit changed(true);
}



kcontrol'KBackground::slotColor2() (./kdebase/kcontrol/display/backgnd.cpp:657)

void KBackground::slotColor2(const QColor &color)
{
    int desk = m_Desk;
    if (m_pGlobals->commonBackground())
	desk = 0;
    KBackgroundRenderer *r = m_Renderer[desk];

    if (color == r->colorB())
	return;

    r->stop();
    r->setColorB(color);
    r->start();
    emit changed(true);
}



kcontrol'KBackground::slotImageDropped() (./kdebase/kcontrol/display/backgnd.cpp:674)

void KBackground::slotImageDropped(QString uri)
{
    int desk = m_Desk;
    if (m_pGlobals->commonBackground())
	desk = 0;
    KBackgroundRenderer *r = m_Renderer[desk];
    if (uri == r->wallpaper())
	return;

    if (!m_Wallpaper.contains(uri)) {
	int count = m_Wallpaper.count();
	m_Wallpaper[uri] = count;
	m_pWallpaperBox->insertItem(uri);
	m_pWallpaperBox->setCurrentItem(count);
    }

    r->stop();
    r->setWallpaper(uri);
    r->start();
    emit changed(true);
}



kcontrol'KBackground::slotMultiMode() (./kdebase/kcontrol/display/backgnd.cpp:697)

void KBackground::slotMultiMode(bool multi)
{
    int desk = m_Desk;
    if (m_pGlobals->commonBackground())
	desk = 0;
    KBackgroundRenderer *r = m_Renderer[desk];
    if (multi == (r->multiWallpaperMode() != KBackgroundSettings::NoMulti))
	return;

    r->stop();
    r->setMultiWallpaperMode(multi ? 1 : 0);
    r->start();

    if (multi) {
	m_pWallpaperBox->setEnabled(false);
	m_pBrowseBut->setEnabled(false);
	m_pMSetupBut->setEnabled(true);
    } else {
	m_pWallpaperBox->setEnabled(true);
	m_pBrowseBut->setEnabled(true);
	m_pMSetupBut->setEnabled(false);
    }
    emit changed(true);
}



kcontrol'KBackground::slotWallpaper() (./kdebase/kcontrol/display/backgnd.cpp:723)

void KBackground::slotWallpaper(const QString &wallpaper)
{
    int desk = m_Desk;
    if (m_pGlobals->commonBackground())
	desk = 0;
    KBackgroundRenderer *r = m_Renderer[desk];

    if (wallpaper == r->wallpaper())
	return;

    r->stop();
    r->setWallpaper(wallpaper);
    r->start();
    emit changed(true);
}



kcontrol'KBackground::slotBrowseWallpaper() (./kdebase/kcontrol/display/backgnd.cpp:740)

void KBackground::slotBrowseWallpaper()
{
    int desk = m_Desk;
    if (m_pGlobals->commonBackground())
	desk = 0;
    KBackgroundRenderer *r = m_Renderer[desk];

    KURL url = KFileDialog::getOpenURL();
    if (url.isEmpty())
      return;
    if (!url.isLocalFile()) {
      KMessageBox::sorry(this, i18n("Currently are only local wallpapers allowed."));
      return;
    }
    QString file = url.path();
    if (file == r->wallpaper())
	return;

    if (!m_Wallpaper.contains(file)) {
	int count = m_Wallpaper.count();
	m_Wallpaper[file] = count;
	m_pWallpaperBox->insertItem(file);
	m_pWallpaperBox->setCurrentItem(count);
    }

    r->stop();
    r->setWallpaper(file);
    r->start();
    emit changed(true);
}


/*
 * Called from the "Wallpaper Arrangement" combobox.
 */

kcontrol'KBackground::slotWPMode() (./kdebase/kcontrol/display/backgnd.cpp:775)

void KBackground::slotWPMode(int mode)
{
    int desk = m_Desk;
    if (m_pGlobals->commonBackground())
	desk = 0;
    KBackgroundRenderer *r = m_Renderer[desk];

    if (mode == r->wallpaperMode())
	return;

    if (mode == KBackgroundSettings::NoWallpaper) {
      m_pCBMulti->setEnabled(false);
      m_pWallpaperBox->setEnabled(false);
      m_pBrowseBut->setEnabled(false);
      m_pMSetupBut->setEnabled(false);

      // Blending not possible without wallpaper
      m_pBlendBox->setEnabled(false);
      m_pBlendSlider->setEnabled(false);
    }
    else {
      m_pCBMulti->setEnabled(true);
      m_pBlendBox->setEnabled(true);
      m_pBlendSlider->setEnabled(
	  (r->blendMode()==KBackgroundSettings::NoBlending)?false:true);

      // Multi mode
      if (r->multiWallpaperMode() == KBackgroundSettings::NoMulti) {
	m_pCBMulti->setChecked(false);
	m_pWallpaperBox->setEnabled(true);
	m_pBrowseBut->setEnabled(true);
	m_pMSetupBut->setEnabled(false);
      } else {
	m_pCBMulti->setChecked(true);
	m_pWallpaperBox->setEnabled(false);
	m_pBrowseBut->setEnabled(false);
	m_pMSetupBut->setEnabled(true);
      }
    }

    r->stop();
    r->setWallpaperMode(mode);
    r->start();
    emit changed(true);
}



kcontrol'KBackground::slotSetupMulti() (./kdebase/kcontrol/display/backgnd.cpp:822)

void KBackground::slotSetupMulti()
{
    int desk = m_Desk;
    if (m_pGlobals->commonBackground())
	desk = 0;
    KBackgroundRenderer *r = m_Renderer[desk];

    KMultiWallpaperDialog dlg(r);
    if (dlg.exec() == QDialog::Accepted) {
	r->stop();
	r->start();
	emit changed(true);
    }
}



kcontrol'KBackground::slotPreviewDone() (./kdebase/kcontrol/display/backgnd.cpp:838)

void KBackground::slotPreviewDone(int desk_done)
{
    qDebug("Preview for desktop %d done", desk_done);

    int desk = m_Desk;
    if (m_pGlobals->commonBackground())
	desk = 0;
    if (desk != desk_done)
	return;
    KBackgroundRenderer *r = m_Renderer[desk];

    KPixmap pm;
    if (QPixmap::defaultDepth() < 15)
	pm.convertFromImage(*r->image(), KPixmap::LowColor);
    else
	pm.convertFromImage(*r->image());

    m_pMonitor->setBackgroundPixmap(pm);
}


kcontrol'KBackground::KBackground() (./kdebase/kcontrol/kdm/backgnd.cpp:89)

KBackground::KBackground(QWidget *parent, const char *name)
    : KCModule(parent, name)
{
    m_pDirs = KGlobal::dirs();

    // Top layout
    QGridLayout *top = new QGridLayout(this, 2, 2);
    top->setSpacing(10); top->setMargin(10);
    top->setColStretch(0, 1);
    top->setColStretch(1, 2);

    // A nice button size. Translators can adapt this
    QPushButton *pbut = new QPushButton(i18n("abcdefgh"), this);
    QSize bsize = pbut->sizeHint();
    delete pbut;

    /*
    // Desktop chooser at (0, 0)
    QGroupBox *group = new QGroupBox(i18n("Desktop"), this);
    top->addWidget(group, 0, 0);
    QVBoxLayout *vbox = new QVBoxLayout(group);
    vbox->setMargin(10);
    vbox->setSpacing(10);
    vbox->addSpacing(10);
    m_pDeskList = new QListBox(group);
    connect(m_pDeskList, SIGNAL(highlighted(int)), SLOT(slotSelectDesk(int)));
    vbox->addWidget(m_pDeskList);
    m_pCBCommon = new QCheckBox(i18n("&Common Background"), group);
    vbox->addWidget(m_pCBCommon);
    connect(m_pCBCommon, SIGNAL(toggled(bool)), SLOT(slotCommonDesk(bool)));
    */

    // Background settings
    QGroupBox *group = new QGroupBox(i18n("Background"), this);
    top->addWidget(group, 1, 0);
    QGridLayout *grid = new QGridLayout(group, 5, 2);
    grid->setMargin(10);
    grid->setSpacing(10);
    grid->addRowSpacing(0, 10);
    grid->setColStretch(0, 0);

    QLabel *lbl = new QLabel(i18n("&Mode:"), group);
    lbl->setFixedSize(lbl->sizeHint());
    grid->addWidget(lbl, 1, 0, Qt::AlignLeft);
    m_pBackgroundBox = new QComboBox(group);
    connect(m_pBackgroundBox, SIGNAL(activated(int)), SLOT(slotBGMode(int)));
    lbl->setBuddy(m_pBackgroundBox);
    grid->addWidget(m_pBackgroundBox, 1, 1);

    lbl = new QLabel(i18n("Color &1:"), group);
    lbl->setFixedSize(lbl->sizeHint());
    grid->addWidget(lbl, 2, 0, Qt::AlignLeft);
    m_pColor1But = new KColorButton(group);
    connect(m_pColor1But, SIGNAL(changed(const QColor &)),
	    SLOT(slotColor1(const QColor &)));
    grid->addWidget(m_pColor1But, 2, 1);
    lbl->setBuddy(m_pColor1But);

    lbl = new QLabel(i18n("Color &2:"), group);
    lbl->setFixedSize(lbl->sizeHint());
    grid->addWidget(lbl, 3, 0, Qt::AlignLeft);
    m_pColor2But = new KColorButton(group);
    connect(m_pColor2But, SIGNAL(changed(const QColor &)),
	    SLOT(slotColor2(const QColor &)));
    grid->addWidget(m_pColor2But, 3, 1);
    lbl->setBuddy(m_pColor2But);

    QHBoxLayout *hbox = new QHBoxLayout();
    grid->addLayout(hbox, 4, 1);
    m_pBGSetupBut = new QPushButton(i18n("&Setup"), group);
    m_pBGSetupBut->setFixedSize(bsize);
    connect(m_pBGSetupBut, SIGNAL(clicked()), SLOT(slotBGSetup()));
    hbox->addWidget(m_pBGSetupBut);
    hbox->addStretch();


    // Preview monitor at (0,1)
    lbl = new QLabel(this);
    lbl->setPixmap(locate("data", "kcontrol/pics/monitor.png"));
    lbl->setFixedSize(lbl->sizeHint());
    top->addMultiCellWidget(lbl, 0,0,0,1, AlignCenter);
    m_pMonitor = new KBGMonitor(lbl);
    m_pMonitor->setGeometry(20, 10, 157, 111);
    connect(m_pMonitor, SIGNAL(imageDropped(QString)), SLOT(slotImageDropped(QString)));

    // Wallpaper at (1,1)
    group = new QGroupBox(i18n("Wallpaper"), this);
    top->addWidget(group, 1, 1);
    grid = new QGridLayout(group, 6, 2);
    grid->setMargin(10); grid->setSpacing(10);
    grid->addRowSpacing(0, 10);
    grid->addRowSpacing(4, 10);

    lbl = new QLabel(i18n("M&ode:"), group);
    lbl->setFixedSize(lbl->sizeHint());
    grid->addWidget(lbl, 1, 0, Qt::AlignLeft);
    m_pArrangementBox = new QComboBox(group);
    connect(m_pArrangementBox, SIGNAL(activated(int)), SLOT(slotWPMode(int)));
    lbl->setBuddy(m_pArrangementBox);
    grid->addWidget(m_pArrangementBox, 1, 1);

    lbl = new QLabel(i18n("&Wallpaper"), group);
    lbl->setFixedSize(lbl->sizeHint());
    grid->addWidget(lbl, 2, 0, Qt::AlignLeft);
    m_pWallpaperBox = new QComboBox(group);
    lbl->setBuddy(m_pWallpaperBox);
    connect(m_pWallpaperBox, SIGNAL(activated(const QString &)),
	    SLOT(slotWallpaper(const QString &)));
    grid->addWidget(m_pWallpaperBox, 2, 1);

    hbox = new QHBoxLayout();
    grid->addLayout(hbox, 3, 1);
    m_pBrowseBut = new QPushButton(i18n("&Browse"), group);
    m_pBrowseBut->setFixedSize(bsize);
    connect(m_pBrowseBut, SIGNAL(clicked()), SLOT(slotBrowseWallpaper()));
    hbox->addWidget(m_pBrowseBut);
    hbox->addStretch();


    m_pCBMulti = new QCheckBox(i18n("M&ultiple:"), group);
    m_pCBMulti->setFixedSize(m_pCBMulti->sizeHint());
    connect(m_pCBMulti, SIGNAL(toggled(bool)), SLOT(slotMultiMode(bool)));
    grid->addWidget(m_pCBMulti, 4, 0);
    hbox = new QHBoxLayout();
    grid->addLayout(hbox, 4, 1);
    m_pMSetupBut = new QPushButton(i18n("S&etup"), group);
    m_pMSetupBut->setFixedSize(bsize);
    connect(m_pMSetupBut, SIGNAL(clicked()), SLOT(slotSetupMulti()));
    hbox->addWidget(m_pMSetupBut);
    hbox->addStretch();

    m_pCBMulti->hide();
    m_pMSetupBut->hide();

    m_Desk = 0;
    m_Max = 1;
    for (int i=0; i<m_Max; i++) {
        KSimpleConfig *c = new KSimpleConfig(locate("config", "kdmdesktoprc"));
	m_Renderer[i] = new KBackgroundRenderer(i, c);
	connect(m_Renderer[i], SIGNAL(imageDone(int)), SLOT(slotPreviewDone(int)));
    }

    init();
    apply();
}


/*
 * Fill all check/listboxen
 */

kcontrol'KBackground::init() (./kdebase/kcontrol/kdm/backgnd.cpp:239)

void KBackground::init()
{
    int i;

    /*
    // Desktop names
    for (i=0; i<KWin::numberOfDesktops(); i++)
	m_pDeskList->insertItem(m_pGlobals->deskName(i));
    */

    // Background modes: make sure these match with kdesktop/bgrender.cc !!
    m_pBackgroundBox->insertItem(i18n("Flat"));
    m_pBackgroundBox->insertItem(i18n("Pattern"));
    m_pBackgroundBox->insertItem(i18n("Background Program"));
    m_pBackgroundBox->insertItem(i18n("Horizontal Gradient"));
    m_pBackgroundBox->insertItem(i18n("Vertical Gradient"));
    m_pBackgroundBox->insertItem(i18n("Pyramid Gradient"));
    m_pBackgroundBox->insertItem(i18n("Pipecross Gradient"));
    m_pBackgroundBox->insertItem(i18n("Elliptic Gradient"));

    // Wallpapers
    QStringList lst = m_pDirs->findAllResources("wallpaper", "*", false, true);
    for (i=0; i<(int)lst.count(); i++) {
	int n = lst[i].findRev('/');
	QString s = lst[i].mid(n+1);
	m_pWallpaperBox->insertItem(s);
	m_Wallpaper[s] = i;
    }

    // Wallpaper tilings: again they must match the ones from bgrender.cc
    m_pArrangementBox->insertItem(i18n("No Wallpaper"));
    m_pArrangementBox->insertItem(i18n("Centred"));
    m_pArrangementBox->insertItem(i18n("Tiled"));
    m_pArrangementBox->insertItem(i18n("Center Tiled"));
    m_pArrangementBox->insertItem(i18n("Centred Maxpect"));
    m_pArrangementBox->insertItem(i18n("Scaled"));
}



kcontrol'KBackground::apply() (./kdebase/kcontrol/kdm/backgnd.cpp:278)

void KBackground::apply()
{
    int desk = m_Desk;
    desk = 0;
    KBackgroundRenderer *r = m_Renderer[desk];

    /*
    // Desktop names
    if (m_pGlobals->commonBackground()) {
	m_pCBCommon->setChecked(true);
	m_pDeskList->setEnabled(false);
    } else  {
	m_pCBCommon->setChecked(false);
	m_pDeskList->setEnabled(true);
	m_pDeskList->setCurrentItem(m_Desk);
    }
    */

    // Background mode
    m_pBackgroundBox->setCurrentItem(r->backgroundMode());
    m_pColor1But->setColor(r->colorA());
    m_pColor2But->setColor(r->colorB());
    switch (r->backgroundMode()) {
    case KBackgroundSettings::Program:
	m_pColor1But->setEnabled(false);
	m_pColor2But->setEnabled(false);
	m_pBGSetupBut->setEnabled(true);
	break;
    case KBackgroundSettings::Flat:
	m_pColor1But->setEnabled(true);
	m_pColor2But->setEnabled(false);
	m_pBGSetupBut->setEnabled(false);
	break;
    case KBackgroundSettings::Pattern:
	m_pColor1But->setEnabled(true);
	m_pColor2But->setEnabled(true);
	m_pBGSetupBut->setEnabled(true);
	break;
    default:
	m_pColor1But->setEnabled(true);
	m_pColor2But->setEnabled(true);
	m_pBGSetupBut->setEnabled(false);
	break;
    }

    // Wallpaper mode
    QString wp = r->wallpaper();
    if (wp.isEmpty())
	wp = QString(" ");
    if (!m_Wallpaper.contains(wp)) {
	int count = m_Wallpaper.count();
	m_Wallpaper[wp] = count;
	m_pWallpaperBox->insertItem(wp);
	m_pWallpaperBox->setCurrentItem(count);
    }
    m_pWallpaperBox->setCurrentItem(m_Wallpaper[wp]);
    m_pArrangementBox->setCurrentItem(r->wallpaperMode());

    // Multi mode
    if (r->multiWallpaperMode() == KBackgroundSettings::NoMulti) {
	m_pCBMulti->setChecked(false);
	m_pWallpaperBox->setEnabled(true);
	m_pBrowseBut->setEnabled(true);
	m_pMSetupBut->setEnabled(false);
    } else {
	m_pCBMulti->setChecked(true);
	m_pWallpaperBox->setEnabled(false);
	m_pBrowseBut->setEnabled(false);
	m_pMSetupBut->setEnabled(true);
    }

    // Start preview render
    r->setPreview(m_pMonitor->size());
    r->start();
}



kcontrol'KBackground::load() (./kdebase/kcontrol/kdm/backgnd.cpp:355)

void KBackground::load()
{
    int desk = m_Desk;
    desk = 0;
    m_Renderer[desk]->load(desk);

    apply();
    emit changed(false);
}



kcontrol'KBackground::save() (./kdebase/kcontrol/kdm/backgnd.cpp:366)

void KBackground::save()
{
    qDebug("Saving stuff...");
    for (int i=0; i<m_Max; i++)
	m_Renderer[i]->writeSettings();

    emit changed(false);
}



kcontrol'KBackground::defaults() (./kdebase/kcontrol/kdm/backgnd.cpp:376)

void KBackground::defaults()
{
    int desk = m_Desk;
    desk = 0;
    KBackgroundRenderer *r = m_Renderer[desk];

    if (r->isActive())
	r->stop();
    r->setBackgroundMode(KBackgroundSettings::Flat);
    r->setColorA(_defColorA);
    r->setColorB(_defColorB);
    r->setWallpaperMode(KBackgroundSettings::NoWallpaper);
    r->setMultiWallpaperMode(KBackgroundSettings::NoMulti);
    apply();
    emit changed(true);
}



kcontrol'KBackground::slotSelectDesk() (./kdebase/kcontrol/kdm/backgnd.cpp:394)

void KBackground::slotSelectDesk(int desk)
{
    if (desk == m_Desk)
	return;

    if (m_Renderer[m_Desk]->isActive())
	m_Renderer[m_Desk]->stop();
    m_Desk = desk;
    apply();
}



kcontrol'KBackground::slotCommonDesk() (./kdebase/kcontrol/kdm/backgnd.cpp:406)

void KBackground::slotCommonDesk(bool /*common*/)
{
    apply();
    emit changed(true);
}


/*
 * Called from the "Background Mode" combobox.
 */

kcontrol'KBackground::slotBGMode() (./kdebase/kcontrol/kdm/backgnd.cpp:416)

void KBackground::slotBGMode(int mode)
{
    int desk = m_Desk;
	desk = 0;
    KBackgroundRenderer *r = m_Renderer[desk];

    if (mode == r->backgroundMode())
	return;

    r->stop();
    r->setBackgroundMode(mode);
    apply();
    emit changed(true);
}


/*
 * Called from the "Background Setup" pushbutton.
 */

kcontrol'KBackground::slotBGSetup() (./kdebase/kcontrol/kdm/backgnd.cpp:435)

void KBackground::slotBGSetup()
{
    int desk = m_Desk;
	desk = 0;
    KBackgroundRenderer *r = m_Renderer[desk];

    switch (r->backgroundMode()) {
    case KBackgroundSettings::Pattern:
    {
	KPatternSelectDialog dlg;
	QString cur = r->KBackgroundPattern::name();
	dlg.setCurrent(cur);
	if ((dlg.exec() == QDialog::Accepted) && !dlg.pattern().isEmpty()) {
	    r->stop();
	    r->setPattern(dlg.pattern());
	    r->start();
	    emit changed(true);
	}
	break;
    }
    case KBackgroundSettings::Program:
    {
	KProgramSelectDialog dlg;
	QString cur = r->KBackgroundProgram::name();
	dlg.setCurrent(cur);
	if ((dlg.exec() == QDialog::Accepted) && !dlg.program().isEmpty()) {
	    r->stop();
	    r->setProgram(dlg.program());
	    r->start();
	    emit changed(true);
	}
	break;
    }
    default:
	break;
    }
}



kcontrol'KBackground::slotColor1() (./kdebase/kcontrol/kdm/backgnd.cpp:474)

void KBackground::slotColor1(const QColor &color)
{
    int desk = m_Desk;
	desk = 0;
    KBackgroundRenderer *r = m_Renderer[desk];

    if (color == r->colorA())
	return;

    r->stop();
    r->setColorA(color);
    r->start();
    emit changed(true);
}



kcontrol'KBackground::slotColor2() (./kdebase/kcontrol/kdm/backgnd.cpp:490)

void KBackground::slotColor2(const QColor &color)
{
    int desk = m_Desk;
	desk = 0;
    KBackgroundRenderer *r = m_Renderer[desk];

    if (color == r->colorB())
	return;

    r->stop();
    r->setColorB(color);
    r->start();
    emit changed(true);
}



kcontrol'KBackground::slotImageDropped() (./kdebase/kcontrol/kdm/backgnd.cpp:506)

void KBackground::slotImageDropped(QString uri)
{
    int desk = m_Desk;
	desk = 0;
    KBackgroundRenderer *r = m_Renderer[desk];
    if (uri == r->wallpaper())
	return;

    if (!m_Wallpaper.contains(uri)) {
	int count = m_Wallpaper.count();
	m_Wallpaper[uri] = count;
	m_pWallpaperBox->insertItem(uri);
	m_pWallpaperBox->setCurrentItem(count);
    }

    r->stop();
    r->setWallpaper(uri);
    r->start();
    emit changed(true);
}



kcontrol'KBackground::slotMultiMode() (./kdebase/kcontrol/kdm/backgnd.cpp:528)

void KBackground::slotMultiMode(bool multi)
{
    int desk = m_Desk;
	desk = 0;
    KBackgroundRenderer *r = m_Renderer[desk];
    if (multi == (r->multiWallpaperMode() != KBackgroundSettings::NoMulti))
	return;

    r->stop();
    r->setMultiWallpaperMode(multi ? 1 : 0);
    r->start();

    if (multi) {
	m_pWallpaperBox->setEnabled(false);
	m_pBrowseBut->setEnabled(false);
	m_pMSetupBut->setEnabled(true);
    } else {
	m_pWallpaperBox->setEnabled(true);
	m_pBrowseBut->setEnabled(true);
	m_pMSetupBut->setEnabled(false);
    }
    emit changed(true);
}



kcontrol'KBackground::slotWallpaper() (./kdebase/kcontrol/kdm/backgnd.cpp:553)

void KBackground::slotWallpaper(const QString &wallpaper)
{
    int desk = m_Desk;
	desk = 0;
    KBackgroundRenderer *r = m_Renderer[desk];

    if (wallpaper == r->wallpaper())
	return;

    r->stop();
    r->setWallpaper(wallpaper);
    r->start();
    emit changed(true);
}



kcontrol'KBackground::slotBrowseWallpaper() (./kdebase/kcontrol/kdm/backgnd.cpp:569)

void KBackground::slotBrowseWallpaper()
{
    int desk = m_Desk;
	desk = 0;
    KBackgroundRenderer *r = m_Renderer[desk];

    KURL url = KFileDialog::getOpenURL();
    if (url.isEmpty())
	return;
    if (!url.isLocalFile()) {
      KMessageBox::sorry(this, i18n("Currently are only local wallpapers allowed."));
      return;
    }
    QString file = url.path();
    if (file == r->wallpaper())
	return;

    if (!m_Wallpaper.contains(file)) {
	int count = m_Wallpaper.count();
	m_Wallpaper[file] = count;
	m_pWallpaperBox->insertItem(file);
	m_pWallpaperBox->setCurrentItem(count);
    }

    r->stop();
    r->setWallpaper(file);
    r->start();
    emit changed(true);
}


/*
 * Called from the "Wallpaper Arrangement" combobox.
 */

kcontrol'KBackground::slotWPMode() (./kdebase/kcontrol/kdm/backgnd.cpp:603)

void KBackground::slotWPMode(int mode)
{
    int desk = m_Desk;
	desk = 0;
    KBackgroundRenderer *r = m_Renderer[desk];

    if (mode == r->wallpaperMode())
	return;

    r->stop();
    r->setWallpaperMode(mode);
    r->start();
    emit changed(true);
}



kcontrol'KBackground::slotSetupMulti() (./kdebase/kcontrol/kdm/backgnd.cpp:619)

void KBackground::slotSetupMulti()
{
    int desk = m_Desk;
	desk = 0;
    KBackgroundRenderer *r = m_Renderer[desk];

    KMultiWallpaperDialog dlg(r);
    if (dlg.exec() == QDialog::Accepted) {
	r->stop();
	r->start();
	emit changed(true);
    }
}



kcontrol'KBackground::slotPreviewDone() (./kdebase/kcontrol/kdm/backgnd.cpp:634)

void KBackground::slotPreviewDone(int desk_done)
{
    qDebug("Preview for desktop %d done", desk_done);

    int desk = m_Desk;
	desk = 0;
    if (desk != desk_done)
	return;
    KBackgroundRenderer *r = m_Renderer[desk];

    KPixmap pm;
    if (QPixmap::defaultDepth() < 15)
	pm.convertFromImage(*r->image(), KPixmap::LowColor);
    else
	pm.convertFromImage(*r->image());

    m_pMonitor->setBackgroundPixmap(pm);
}