Re: MenuStyle

2005-10-20 Thread Dominik Vogt
On Thu, Oct 20, 2005 at 07:42:36AM +0200, Viktor Griph wrote:
 Hi
 
 I am looking into the MenuStyle code trying to understand how some things 
 are done. I plan to enable negation of all on/off menu styles by prefixing 
 ! to them. However looking at the code raise some questions:
 
 First of all what exactly does FreeColors free up?

In certain modes, X colours are managed in so called colour cells.
There may be a limited number of available cells.  They are
reserved with XAllocColor and freed with XFreeColor.  Because
colours are used in many places inside fvwm (colour sets!), fvwm
keeps a reference counter for the allocated colours.  The
corresponding code may be a bit difficult to understand
(libs/PictureUtils.c).

FreeColors eventually decreases the reference counters and frees
the cells if the reference count drops to 0.  Actually the process
is more complicated.  I think Olivier has written most of the
code.

 Answering this might 
 answe some of my other questions; at least if it has some special 
 functionality.
 
 Second: The styles HilightBack and ActiveFore do free the colors if the 
 style have them. Howver the corresponding off-styles does not free them. 
 Is there any reason for this?

No, it's a bug.  Both must free these colours also.  Note that
nobody ever actually tested the code to free colours.  I'm sure
fvwm still has many colour leaks.

 Last: This can't be right can it?:
 -- from menustyle.c: menustyle_copy
   /* HilightBack */
   if (ST_HAS_ACTIVE_BACK(destms))
   {
   FreeColors(ST_MENU_ACTIVE_COLORS(destms).back, 1, True);
   }
   ST_HAS_ACTIVE_BACK(destms) = ST_HAS_ACTIVE_BACK(origms);
   memcpy(ST_MENU_ACTIVE_COLORS(destms),
  ST_MENU_ACTIVE_COLORS(origms), sizeof(ColorPair));
   ST_DO_HILIGHT_BACK(destms) = ST_DO_HILIGHT_BACK(origms);
 
   /* ActiveFore */
   if (ST_HAS_ACTIVE_FORE(destms))
   {
   FreeColors(ST_MENU_ACTIVE_COLORS(destms).fore, 1, True);
   }
 --
 It looks to me as it frees the active fore color after having it copied 
 over, thus freeing the source's color instead of the overwritten.

Yes, without checking what the ST_MENU_ACTIVE_COLORS actually are,
I think you're right.

Furthermore I think the colour reference counts have to be
increased when a menustyle is copied.  Consider this:

  * Menustyle A has a colour x with reference count 1.
  * Copy menustyle A to some other menustyle B.  x still has a
reference count of 1.
  * Copy A over b again.  The reference count of x is decreased to
0 and never increased again.  Ouch.

We should have a CopyColor function somewhere in PictureUtils.c
that takes care of this situation, e.g.

  CopyColor(
sometype* dest_color, sometype* src_color,
int do_free_dest_color);

(where do_free_dest_color indicates whether the destination
colour should be freed).

Ciao

Dominik ^_^  ^_^

 --
Dominik Vogt, [EMAIL PROTECTED]


signature.asc
Description: Digital signature


Re: MenuStyle

2005-10-20 Thread Olivier Chapuis
On Thu, Oct 20, 2005 at 11:06:36AM +0200, Dominik Vogt wrote:
 On Thu, Oct 20, 2005 at 07:42:36AM +0200, Viktor Griph wrote:
  Hi
  
  I am looking into the MenuStyle code trying to understand how some things 
  are done. I plan to enable negation of all on/off menu styles by prefixing 
  ! to them. However looking at the code raise some questions:
  
  First of all what exactly does FreeColors free up?
 
 In certain modes, X colours are managed in so called colour cells.
 There may be a limited number of available cells.  They are
 reserved with XAllocColor and freed with XFreeColor.  Because
 colours are used in many places inside fvwm (colour sets!), fvwm
 keeps a reference counter for the allocated colours.  The
 corresponding code may be a bit difficult to understand
 (libs/PictureUtils.c).
 
 FreeColors eventually decreases the reference counters and frees
 the cells if the reference count drops to 0.  Actually the process
 is more complicated.  I think Olivier has written most of the
 code.


Yes, the code is complex. It allows, in particular, to save in a
fast way the allocated pixels for an image or a gradient with
minimal memory usage. Before that, colours leak was systematic with
gradients and images. Any way, colours management (sharing) at depth 8
is a mess in the X world, I discourage any one to try to understand
the problems :o)

Note that we do not receive complaint anymore on colours at depth 8 on
fvwm-users. Maybe, no body have to use anymore these applications
which need depth 8 to work properly.

Olivier



Re: MenuStyle

2005-10-20 Thread Viktor Griph

On Thu, 20 Oct 2005, Dominik Vogt wrote:


On Thu, Oct 20, 2005 at 07:42:36AM +0200, Viktor Griph wrote:

Hi

I am looking into the MenuStyle code trying to understand how some things
are done. I plan to enable negation of all on/off menu styles by prefixing
! to them. However looking at the code raise some questions:

First of all what exactly does FreeColors free up?


In certain modes, X colours are managed in so called colour cells.
There may be a limited number of available cells.  They are
reserved with XAllocColor and freed with XFreeColor.  Because
colours are used in many places inside fvwm (colour sets!), fvwm
keeps a reference counter for the allocated colours.  The
corresponding code may be a bit difficult to understand
(libs/PictureUtils.c).

FreeColors eventually decreases the reference counters and frees
the cells if the reference count drops to 0.  Actually the process
is more complicated.  I think Olivier has written most of the
code.


Answering this might
answe some of my other questions; at least if it has some special
functionality.



Second: The styles HilightBack and ActiveFore do free the colors if the
style have them. Howver the corresponding off-styles does not free them.
Is there any reason for this?


No, it's a bug.  Both must free these colours also.  Note that
nobody ever actually tested the code to free colours.  I'm sure
fvwm still has many colour leaks.


Last: This can't be right can it?:
-- from menustyle.c: menustyle_copy
/* HilightBack */
if (ST_HAS_ACTIVE_BACK(destms))
{
FreeColors(ST_MENU_ACTIVE_COLORS(destms).back, 1, True);
}
ST_HAS_ACTIVE_BACK(destms) = ST_HAS_ACTIVE_BACK(origms);
memcpy(ST_MENU_ACTIVE_COLORS(destms),
   ST_MENU_ACTIVE_COLORS(origms), sizeof(ColorPair));
ST_DO_HILIGHT_BACK(destms) = ST_DO_HILIGHT_BACK(origms);

/* ActiveFore */
if (ST_HAS_ACTIVE_FORE(destms))
{
FreeColors(ST_MENU_ACTIVE_COLORS(destms).fore, 1, True);
}
--
It looks to me as it frees the active fore color after having it copied
over, thus freeing the source's color instead of the overwritten.


Yes, without checking what the ST_MENU_ACTIVE_COLORS actually are,
I think you're right.

Furthermore I think the colour reference counts have to be
increased when a menustyle is copied.  Consider this:

 * Menustyle A has a colour x with reference count 1.
 * Copy menustyle A to some other menustyle B.  x still has a
   reference count of 1.
 * Copy A over b again.  The reference count of x is decreased to
   0 and never increased again.  Ouch.

We should have a CopyColor function somewhere in PictureUtils.c
that takes care of this situation, e.g.

 CopyColor(
   sometype* dest_color, sometype* src_color,
   int do_free_dest_color);

(where do_free_dest_color indicates whether the destination
colour should be freed).

I found Pixel fvwmlib_clone_color(Pixel p) in ColorUtils.c which can be 
used to reallocate a color. With that creating a CopyColor function is no

problem.


Ciao

Dominik ^_^  ^_^

--
Dominik Vogt, [EMAIL PROTECTED]