[PATCH weston] cairo-util: Draw solid titlebar for frames with only buttons

Pekka Paalanen ppaalanen at gmail.com
Tue Aug 19 06:43:57 PDT 2014


On Tue,  5 Aug 2014 15:22:04 +0800
Boyan Ding <stu_dby at 126.com> wrote:

> Previously geometry was changed to leave space for titlebar if a frame
> has only buttons but no title. This patch fixes theme_render_frame to
> avoid transparent titlebar.
> 
> Signed-off-by: Boyan Ding <stu_dby at 126.com>
> ---
>  shared/cairo-util.c | 8 +++++---
>  shared/cairo-util.h | 5 ++++-
>  shared/frame.c      | 2 +-
>  3 files changed, 10 insertions(+), 5 deletions(-)
> 
> diff --git a/shared/cairo-util.c b/shared/cairo-util.c
> index 2a33249..26286c5 100644
> --- a/shared/cairo-util.c
> +++ b/shared/cairo-util.c
> @@ -28,6 +28,7 @@
>  #include <string.h>
>  #include <stdio.h>
>  #include <math.h>
> +#include <wayland-util.h>
>  #include <cairo.h>
>  #include "cairo-util.h"
>  
> @@ -413,7 +414,8 @@ theme_destroy(struct theme *t)
>  void
>  theme_render_frame(struct theme *t,
>  		   cairo_t *cr, int width, int height,
> -		   const char *title, uint32_t flags)
> +		   const char *title, struct wl_list *buttons,
> +		   uint32_t flags)
>  {
>  	cairo_text_extents_t extents;
>  	cairo_font_extents_t font_extents;
> @@ -439,7 +441,7 @@ theme_render_frame(struct theme *t,
>  	else
>  		source = t->inactive_frame;
>  
> -	if (title)
> +	if (title || !wl_list_empty(buttons))
>  		top_margin = t->titlebar_height;
>  	else
>  		top_margin = t->width;
> @@ -449,7 +451,7 @@ theme_render_frame(struct theme *t,
>  		    width - margin * 2, height - margin * 2,
>  		    t->width, top_margin);
>  
> -	if (title) {
> +	if (title || !wl_list_empty(buttons)) {
>  		cairo_rectangle (cr, margin + t->width, margin,
>  				 width - (margin + t->width) * 2,
>  				 t->titlebar_height - t->width);
> diff --git a/shared/cairo-util.h b/shared/cairo-util.h
> index 4493b0d..fb25c34 100644
> --- a/shared/cairo-util.h
> +++ b/shared/cairo-util.h
> @@ -26,6 +26,8 @@
>  #include <stdint.h>
>  #include <cairo.h>
>  
> +#include <wayland-util.h>
> +
>  void
>  surface_flush_device(cairo_surface_t *surface);
>  
> @@ -69,7 +71,8 @@ theme_set_background_source(struct theme *t, cairo_t *cr, uint32_t flags);
>  void
>  theme_render_frame(struct theme *t, 
>  		   cairo_t *cr, int width, int height,
> -		   const char *title, uint32_t flags);
> +		   const char *title, struct wl_list *buttons,
> +		   uint32_t flags);
>  
>  enum theme_location {
>  	THEME_LOCATION_INTERIOR = 0,
> diff --git a/shared/frame.c b/shared/frame.c
> index 53f3f5f..5ea0e12 100644
> --- a/shared/frame.c
> +++ b/shared/frame.c
> @@ -853,7 +853,7 @@ frame_repaint(struct frame *frame, cairo_t *cr)
>  
>  	cairo_save(cr);
>  	theme_render_frame(frame->theme, cr, frame->width, frame->height,
> -			   frame->title, flags);
> +			   frame->title, &frame->buttons, flags);
>  	cairo_restore(cr);
>  
>  	wl_list_for_each(button, &frame->buttons, link)

Not sure how I'd test it, but it looks okay to me... pushed.


Thanks,
pq


More information about the wayland-devel mailing list