[PATCH 1/2 weston] toytoolkit: Correct improper usage of opaque for button widgets.

Ander Conselvan de Oliveira conselvan2 at gmail.com
Tue Aug 7 06:54:25 PDT 2012

On 08/07/2012 02:03 PM, Scott Moreau wrote:
>   Hi Ander,
> On Tue, Aug 7, 2012 at 2:57 AM, Ander Conselvan de Oliveira
> <conselvan2 at gmail.com <mailto:conselvan2 at gmail.com>> wrote:
>     What exactly does this fix? Your commit message doesn't make it that
>     obvious.
> I assumed the problem was obvious. The definition of the word opaque
> makes it clear. In frame_button_redraw_handler() the code returns (i.e.
> does not draw the buttons) if widget->opaque is set. It should be the
> other way around.
>     Weston commit 010f98b0 added the opaque field to struct widget to
>     "track and report [...] opaque regions", i.e., the region of a
>     surface whose alpha channel is 1.
> I don't think this commit is relevant here. What is relevant is the
> meaning of opaque.

My point exactly. The reason I pointed this commit out is because it 
introduced the opaque field with the purpose of tracking the opaque 
region of a window.

The protocol defines the opaque region as "the region of the surface 
that contain opaque content.  The opaque region is an optimization hint 
for the compositor that lets it optimize out redrawing of content behind 
opaque regions.  Setting an opaque region is not required for correct 
behaviour, but marking transparent content as opaque will result in 
repaint artifacts."

So if the opaque field is 0 for a given widget it does *not* mean that 
this widget is hidden or invisible. It only means that the contents 
might contain pixels whose alpha component is different than one. In 
other words, if a surface is opaque its contents obscure whatever is 
below them while otherwise alpha blending is needed.

Later the frame_button code started to use opaque as a visibility field.

(since cgit.fd.o is down at the moment I will post
> some snippets) For widget_set_transparent() you have
> widget_set_transparent(struct widget *widget, int transparent)
> {
>      widget->opaque = !transparent;
> }
>     It seems to me the frame button code is abusing this field to hide
>     the buttons in fullscreen mode.
> This may be the case but see window.c~:1300 frame_resize_handler()
>      if (child->opaque) {
>          widget->window->opaque_region =
>              wl_compositor_create_region(display->compositor);
>          wl_region_add(widget->window->opaque_region,
>                    opaque_margin, opaque_margin,
>                    widget->allocation.width - 2 * opaque_margin,
>                    widget->allocation.height - 2 * opaque_margin);
>      }
> it adds the region if opaque is set.
>     IMO, either way you define a visibility value based on the opacity
>     value results in improper usage.
> I did not write this code, I'm just building on top of it while trying
> to improve it.

My point was that since opacity and visibility are not the same thing, 
defining visibility as opaque == 0 or opaque == 1 is equally wrong. Your 
patch doesn't change any behavior, it only changes if we go with the 
former or the latter.

> If you have a better idea, I would be interested to know
> what you think.

One simple solution is to add a visibility field to struct frame_button. 
Or have a general visibility switch on every widget.

Best regards,

More information about the wayland-devel mailing list