[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-devel
Subject:    Re: Re: KConfigXT and settings external changes
From:       Kevin Funk <krf () gmx ! de>
Date:       2011-09-06 12:36:29
Message-ID: 1659770.4QqWMgvuOg () kerberos
[Download RAW message or body]

On Tuesday 06 September 2011 00:14:21 Milian Wolff wrote:
> Milian Wolff, 06.09.2011:
> > Francesco Di Muccio, 05.09.2011:
> > > Hello all,
> > > 
> > > In my application I'm using KConfigXT, everything works fine when I
> > > change the settings values from the dialog inherited by
> > > KConfigDialog,
> > > but if I write the configuration values using the class generated
> > > from
> > > the kcfg file the changes are not reflected into the settings
> > > dialog.
> > > Here is the flow:
> > > 
> > > 1) Open the settings dialog (it will be cached by KConfigDialog),
> > > change some values and close it
> > > 2) Call some code that writes the same values using the class
> > > generated by kcfg generator
> > > 3) Reopen the dialog cached instance. The values shown by the
> > > widgets
> > > are the old ones.
> > > 
> > > I read the docs and the tutorial at
> > > http://techbase.kde.org/Development/Tutorials/Using_KConfig_XT, but
> > > didn't find anything that pointed me to a wrong use of the
> > > framework,
> > > so maybe it is a bug.
> > > 
> > > To be sure I read the sources of KConfigDialog and maybe spotted the
> > > problem: in KConfigDialog::showEvent() there is a check to a boolean
> > > flag KConfigDialog::KConfigDialogPrivate::shown that get set to
> > > true at the end of the method but never set to false.
> > > In the showEvent() method there is the code that updates the widgets
> > > according to KConfigSkeleton state. Since "shown" is never set to
> > > false that code will not be executed the next time the
> > > dialog->show()
> > > is called.
> > > I didn't find a way to force KConfigDialog to update the widgets;
> > > the
> > > responsible to update them is KConfigDialogManager and it's enclosed
> > > in KConfigDialog::KConfigDialogPrivate.
> > > 
> > > I did an ugly hack to make it work: discarding the cached instance
> > > in
> > > place of a new one each time the settings dialog is opened.
> > > 
> > > I didn't fill a bug report because i was unsure if it was an
> > > expected
> > > behavior or not. Am I missing something?
> > 
> > Do you ever call YourConfig::writeConfig() ?
> > 
> > Otherwise take a look at e.g.
> > 
> > https://projects.kde.org/projects/extragear/sdk/massif-
> > visualizer/repository/revisions/master/changes/app/configdialog.cpp
> > and
> > https://projects.kde.org/projects/extragear/sdk/massif-
> > visualizer/repository/revisions/master/changes/app/mainwindow.cpp
> > 
> > it works like a charm there. To be honest though I'm not sure whether I
> > leak the settings dialogs in app::preferences, I should investigate that
> > 
> > :)
> 
> Ah ok - I delete the dialog on close (via the attribute). Probably that is
> all that is required?
> 
> bye

Yep,

although I would not set the attribute in the dialog's constructor. For 
external users of your class it is quite hidden and modifies normal behaviour.

Assume:
ConfigDialog* dlg = new ConfigDialog();
dlg->show();
// ...
// dlg gets closed
// ...
delete dlg; // error: double-free

Better do:
ConfigDialog* dlg = new ConfigDialog();
dlg->setAttribute(...); // so people *know* it's getting deleted.

Not a serious issue after all.

Sorry for the nit-picking, I was bored.

Greets

-- 
Kevin Funk

>> Visit http://mail.kde.org/mailman/listinfo/kde-devel#unsub to unsubscribe <<
[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic