xwm: Use Pango to draw title string if available

If Weston is built with Pango, use it to render the title for
X11 applications and Weston toy toolkit clients. It allows us
to ellipsize the title when there isn't enough space to show the
whole string.

Signed-off-by: Louis-Francis Ratté-Boulianne <lfrb@collabora.com>
Reviewed-by: Daniel Stone <daniels@collabora.com>
dev
Louis-Francis Ratté-Boulianne 7 years ago committed by Daniel Stone
parent 864e39bf96
commit 037f056ec3
  1. 2
      Makefile.am
  2. 3
      configure.ac
  3. 60
      shared/cairo-util.c

@ -1138,12 +1138,14 @@ libshared_cairo_la_CFLAGS = \
$(COMPOSITOR_CFLAGS) \ $(COMPOSITOR_CFLAGS) \
$(PIXMAN_CFLAGS) \ $(PIXMAN_CFLAGS) \
$(CAIRO_CFLAGS) \ $(CAIRO_CFLAGS) \
$(PANGO_CFLAGS) \
$(PNG_CFLAGS) \ $(PNG_CFLAGS) \
$(WEBP_CFLAGS) $(WEBP_CFLAGS)
libshared_cairo_la_LIBADD = \ libshared_cairo_la_LIBADD = \
$(PIXMAN_LIBS) \ $(PIXMAN_LIBS) \
$(CAIRO_LIBS) \ $(CAIRO_LIBS) \
$(PANGO_LIBS) \
$(PNG_LIBS) \ $(PNG_LIBS) \
$(WEBP_LIBS) \ $(WEBP_LIBS) \
$(JPEG_LIBS) $(JPEG_LIBS)

@ -448,6 +448,9 @@ if test x$enable_weston_launch = xyes; then
fi fi
AM_CONDITIONAL(HAVE_PANGO, test "x$have_pango" = "xyes") AM_CONDITIONAL(HAVE_PANGO, test "x$have_pango" = "xyes")
if test "x$have_pango" = "xyes"; then
AC_DEFINE([HAVE_PANGO], [1], [Have pango])]
fi
AM_CONDITIONAL(HAVE_CAIRO_GLESV2, AM_CONDITIONAL(HAVE_CAIRO_GLESV2,
[test "x$have_cairo_egl" = "xyes" -a "x$cairo_modules" = "xcairo-glesv2" -a "x$enable_egl" = "xyes"]) [test "x$have_cairo_egl" = "xyes" -a "x$cairo_modules" = "xcairo-glesv2" -a "x$enable_egl" = "xyes"])

@ -39,6 +39,10 @@
#include "image-loader.h" #include "image-loader.h"
#include "config-parser.h" #include "config-parser.h"
#ifdef HAVE_PANGO
#include <pango/pangocairo.h>
#endif
void void
surface_flush_device(cairo_surface_t *surface) surface_flush_device(cairo_surface_t *surface)
{ {
@ -451,14 +455,42 @@ theme_destroy(struct theme *t)
free(t); free(t);
} }
#ifdef HAVE_PANGO
static PangoLayout *
create_layout(cairo_t *cr, const char *title)
{
PangoLayout *layout;
PangoFontDescription *desc;
layout = pango_cairo_create_layout(cr);
pango_layout_set_text(layout, title, -1);
desc = pango_font_description_from_string("Sans Bold 10");
pango_layout_set_font_description(layout, desc);
pango_font_description_free(desc);
pango_layout_set_ellipsize(layout, PANGO_ELLIPSIZE_END);
pango_layout_set_alignment(layout, PANGO_ALIGN_LEFT);
pango_layout_set_auto_dir (layout, FALSE);
pango_layout_set_single_paragraph_mode (layout, TRUE);
pango_layout_set_width (layout, -1);
return layout;
}
#endif
#ifdef HAVE_PANGO
#define SHOW_TEXT(cr) \
pango_cairo_show_layout(cr, title_layout)
#else
#define SHOW_TEXT(cr) \
cairo_show_text(cr, title)
#endif
void void
theme_render_frame(struct theme *t, theme_render_frame(struct theme *t,
cairo_t *cr, int width, int height, cairo_t *cr, int width, int height,
const char *title, cairo_rectangle_int_t *title_rect, const char *title, cairo_rectangle_int_t *title_rect,
struct wl_list *buttons, uint32_t flags) struct wl_list *buttons, uint32_t flags)
{ {
cairo_text_extents_t extents;
cairo_font_extents_t font_extents;
cairo_surface_t *source; cairo_surface_t *source;
int x, y, margin, top_margin; int x, y, margin, top_margin;
int text_width, text_height; int text_width, text_height;
@ -497,6 +529,23 @@ theme_render_frame(struct theme *t,
title_rect->width, title_rect->height); title_rect->width, title_rect->height);
cairo_clip(cr); cairo_clip(cr);
cairo_set_operator(cr, CAIRO_OPERATOR_OVER); cairo_set_operator(cr, CAIRO_OPERATOR_OVER);
#ifdef HAVE_PANGO
PangoLayout *title_layout;
PangoRectangle logical;
title_layout = create_layout(cr, title);
pango_layout_get_pixel_extents (title_layout, NULL, &logical);
text_width = MIN(title_rect->width, logical.width);
text_height = logical.height;
if (text_width < logical.width)
pango_layout_set_width (title_layout, text_width * PANGO_SCALE);
#else
cairo_text_extents_t extents;
cairo_font_extents_t font_extents;
cairo_select_font_face(cr, "sans", cairo_select_font_face(cr, "sans",
CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_SLANT_NORMAL,
CAIRO_FONT_WEIGHT_BOLD); CAIRO_FONT_WEIGHT_BOLD);
@ -505,6 +554,7 @@ theme_render_frame(struct theme *t,
cairo_font_extents (cr, &font_extents); cairo_font_extents (cr, &font_extents);
text_width = extents.width; text_width = extents.width;
text_height = font_extents.descent - font_extents.ascent; text_height = font_extents.descent - font_extents.ascent;
#endif
x = (width - text_width) / 2; x = (width - text_width) / 2;
y = margin + (t->titlebar_height - text_height) / 2; y = margin + (t->titlebar_height - text_height) / 2;
@ -516,14 +566,14 @@ theme_render_frame(struct theme *t,
if (flags & THEME_FRAME_ACTIVE) { if (flags & THEME_FRAME_ACTIVE) {
cairo_move_to(cr, x + 1, y + 1); cairo_move_to(cr, x + 1, y + 1);
cairo_set_source_rgb(cr, 1, 1, 1); cairo_set_source_rgb(cr, 1, 1, 1);
cairo_show_text(cr, title); SHOW_TEXT(cr);
cairo_move_to(cr, x, y); cairo_move_to(cr, x, y);
cairo_set_source_rgb(cr, 0, 0, 0); cairo_set_source_rgb(cr, 0, 0, 0);
cairo_show_text(cr, title); SHOW_TEXT(cr);
} else { } else {
cairo_move_to(cr, x, y); cairo_move_to(cr, x, y);
cairo_set_source_rgb(cr, 0.4, 0.4, 0.4); cairo_set_source_rgb(cr, 0.4, 0.4, 0.4);
cairo_show_text(cr, title); SHOW_TEXT(cr);
} }
} }
} }

Loading…
Cancel
Save