Panel design [was: Re: About the clock updates]
Jasper Huijsmans
jasper at moongroup.com
Thu Sep 26 11:01:54 CEST 2002
Hi Olivier,
Olivier Fourdan wrote:
> Jasper,
>
> Regarding the size, it's the way it has to be, as we discussed on IRC.
>
> If the clock is too big, either change the mode to digital and choose a
> smaller font or use the analog clock, or choose horiz. mode or remove
> the clock. That's it. This said, it's doesn't look that big to me
> anyway.
>
Ok, agreed. Just thought I'd let you know in case you overlooked. It's
still useable. It's just that it used to fit and now it doesn't, so it's
a small regression, but that's alright in this stage of the development.
> As for the settigns, yes, I saw. Probably some side effects because I
> did not touch the save/load part at all.
>
My guess is that the clock structure (not the widget) contains a value
for the mode and that it isn't updated anymore. This should be an easy fix.
> Regarding this side effect, and also the double free bug (which appears
> to happen on any module, even if only one instance is displayed, so it's
> been there for a while) I'm not too happy with the current design. It's
> far too complicated and it showed yesterday that it's unmaintainable
> (neither Botsie, nor Xavier nor me could figure out what was done, how
> and why).
>
I cannot agree more. It has evolved from a prototype I wrote from just a
basic idea that it would be nice to have plugins. There has never been a
good audit of the design.
Keep in mind that I'm really learning all this stuff as I go along. Two
years ago I didn't know anything about memory management in C. Now I can
at least discuss it with you. Before I started xfce4 I didn't know
anything about dynamically loading modules. Now I'm starting to
understand things little by little.
It's been a great experience for me so far, but designing a software
application is something totally new. I really appreciate any help you
can give me on that.
> For me, the plugin part is a great idea, and you did a wonderfull work
> in writting this first, but we have to provide a rock solid base if we
> want to be able to build reliably uppon it (as I said, we are in the
> developpment process, we can break just everything that needs to be.
> Xine is a project that we should learn from, they are not affraid of
> breaking the API several times to improve things before the 1.0
> release).
>
I have no problems at all with breaking API. The panel is small enough
to not make this rather easy to do.
> So here is my proposal :
>
> - Current design :
> Load all modules from disk, all builtins modules, create widgets and
> all every time the user click on the control dialog.
>
> - Proposed design :
> Write a plugin manager that loads all modules once and only once at
> startup. If the dialog needs to change a module, it simply build a new
> instance of the module (using the "new" function) and unrefs the
> previous one.
I think this is what gkrellm does as well. It will take a bit more
memory, but it will be a lot more robust.
This is quite interesting. GObject has some functions for making a
'GBoxed' type. We could make a panel control a boxed type and add a copy
function to the structure. Then if you choose a module in the dialog it
is copied from the module module manger list. May not be worth the
trouble though.
> No need to load all modules for nothing. The list of modules is given by
> the module manager that keeps a track of all existing loaded modules.
> Drawback: If the user install a new module, from a third party (!!) then
> it doesn't show in his control dialog until he quits/restarts the panel.
> That's however, very unlikely to happen. 1) there are no third party
> modules available yet and 2) even if that happens, I think the overhead
> of restarting the panel is nothing compared to headaches caused to
> developpers by the current design :)
>
;-)
Perhaps we could even make a new tab on the global config dialog for
modules and let the user install or uninstall modules. Or just a button
saying 'Update module list'. Well, I'm just brainstorming here.
> This doesn't necessarily mean a lot of woek. Most of the stuff are
> already written. It mainly requires a "reorganization" of the existing
> routines.
>
> For sure, the controls_dialogs.c part will became a lot simpler. FYI,
> the bug comes from controls_dialogs.c
>
Yes, I have to look into this more deeply. I changed it a bit this
morning, but I don't think it will be solved.
> Also, I really don't understand why you need to ref() yourself the
> pc->base. It should not be required and if it is, it might be because
> there is problem with the design.
>
Well the ref() part is there because I have to remove the widget from
it's container every time the button position changes. The ref() is
necessary to prevent it from being destroyed.
However, the unreffing is a different story. When I started writing all
this code I was under the impression that I had to unref it again before
destruction. This is not the case I think. I just need to do a
gtk_widget_destroy() if I want to get rid of it.
There are probably more places in the code where I do this. Every time I
unref a gtk widget (as oposed to a pixbuf, which may be unreffed) it has
to be considered a bug!
> I really suspect that the numerous problems we have with the panel and
> its momory management come from the design.
>
> Hope that helps, or at least I hope that makes sense. I' m willing to
> help on this if you wish.
>
As I said, you're help is very welcome. Ever since I made the big
changes to have all panel components use the same interface I have a
feeling that it's too complicated and there must be a way to simplify stuff.
Thanks,
Jasper
More information about the Xfce4-dev
mailing list