From 166ad6e1dc0d8a2dde2825e14d665a62c44bb3ca Mon Sep 17 00:00:00 2001 From: Johan Malm Date: Fri, 25 Sep 2020 20:25:45 +0100 Subject: [PATCH] Refactor header files --- include/labwc.h | 2 + src/deco.c | 2 - src/desktop.c | 1 - src/graphics/text.c | 94 +++++++++++++++++++++++++++++++++++++++++++++ src/view.c | 1 - src/xdg.c | 2 - src/xwayland.c | 2 - 7 files changed, 96 insertions(+), 8 deletions(-) create mode 100644 src/graphics/text.c diff --git a/include/labwc.h b/include/labwc.h index e869f673..caee1583 100644 --- a/include/labwc.h +++ b/include/labwc.h @@ -28,6 +28,8 @@ #include #include +#include "common/bug-on.h" +#include "common/log.h" #include "config/rcxml.h" #include "config/keybind.h" diff --git a/src/deco.c b/src/deco.c index 8bba5d65..8997168b 100644 --- a/src/deco.c +++ b/src/deco.c @@ -7,8 +7,6 @@ #include "labwc.h" #include "theme/theme.h" #include "config/rcxml.h" -#include "common/bug-on.h" -#include "common/log.h" #define BORDER_WIDTH (2) diff --git a/src/desktop.c b/src/desktop.c index 8729aaf5..177902d6 100644 --- a/src/desktop.c +++ b/src/desktop.c @@ -1,5 +1,4 @@ #include "labwc.h" -#include "common/bug-on.h" static void move_to_front(struct view *view) { diff --git a/src/graphics/text.c b/src/graphics/text.c new file mode 100644 index 00000000..43fc053e --- /dev/null +++ b/src/graphics/text.c @@ -0,0 +1,94 @@ +#include +#include +#include +#include + +void print(cairo_t *cairo, const char *text, const char *font) + PangoLayout *layout = pango_cairo_create_layout(cairo); +PangoAttrList *attrs = pango_attr_list_new(); +pango_layout_set_text(layout, text, -1); +pango_attr_list_insert(attrs, pango_attr_scale_new(1.0)); +PangoFontDescription *desc = pango_font_description_from_string(font); +pango_layout_set_font_description(layout, desc); +pango_layout_set_single_paragraph_mode(layout, 1); +pango_layout_set_attributes(layout, attrs); +pango_attr_list_unref(attrs); +pango_font_description_free(desc); +cairo_font_options_t *fo = cairo_font_options_create(); +cairo_get_font_options(cairo, fo); +pango_cairo_context_set_font_options(pango_layout_get_context(layout), fo); +cairo_font_options_destroy(fo); +pango_cairo_update_layout(cairo, layout); +pango_cairo_show_layout(cairo, layout); +g_object_unref(layout); +} + +void update_title_texture(struct wlr_texture **texture, const char *text) +{ + if (*texture) { + wlr_texture_destroy(*texture); + *texture = NULL; + } + if (!text) + return; + + double scale = output->wlr_output->scale; + int width = 0; + int height = 0; + + cairo_surface_t *dummy_surface = + cairo_image_surface_create(CAIRO_FORMAT_ARGB32, 0, 0); + cairo_t *c = cairo_create(dummy_surface); + cairo_set_antialias(c, CAIRO_ANTIALIAS_BEST); + cairo_font_options_t *fo = cairo_font_options_create(); + cairo_font_options_set_hint_style(fo, CAIRO_HINT_STYLE_FULL); + if (output->wlr_output->subpixel == WL_OUTPUT_SUBPIXEL_NONE) + cairo_font_options_set_antialias(fo, CAIRO_ANTIALIAS_GRAY); + else + cairo_font_options_set_antialias(fo, CAIRO_ANTIALIAS_SUBPIXEL); + cairo_set_font_options(c, fo); + get_text_size(c, config->font, &width, NULL, NULL, scale, + config->pango_markup, "%s", text); + cairo_surface_destroy(dummy_surface); + cairo_destroy(c); + + cairo_surface_t *surface = + cairo_image_surface_create(CAIRO_FORMAT_ARGB32, width, height); + cairo_t *cairo = cairo_create(surface); + cairo_set_antialias(cairo, CAIRO_ANTIALIAS_BEST); + cairo_set_font_options(cairo, fo); + cairo_font_options_destroy(fo); + cairo_set_source_rgba(cairo, class->background[0], class->background[1], + class->background[2], class->background[3]); + cairo_paint(cairo); + PangoContext *pango = pango_cairo_create_context(cairo); + cairo_set_source_rgba(cairo, class->text[0], class->text[1], + class->text[2], class->text[3]); + cairo_move_to(cairo, 0, 0); + + pango_printf(cairo, config->font, scale, config->pango_markup, "%s", + text); + + cairo_surface_flush(surface); + unsigned char *data = cairo_image_surface_get_data(surface); + int stride = cairo_format_stride_for_width(CAIRO_FORMAT_ARGB32, width); + struct wlr_renderer *renderer = + wlr_backend_get_renderer(output->wlr_output->backend); + *texture = wlr_texture_from_pixels(renderer, WL_SHM_FORMAT_ARGB8888, + stride, width, height, data); + cairo_surface_destroy(surface); + g_object_unref(pango); + cairo_destroy(cairo); +} + +// void container_calculate_title_height(struct sway_container *container) +//{ +// cairo_t *cairo = cairo_create(NULL); +// int height; +// int baseline; +// get_text_size(cairo, config->font, NULL, &height, &baseline, 1, +// config->pango_markup, "%s", text); +// cairo_destroy(cairo); +// container->title_height = height; +/// container->title_baseline = baseline; +//} diff --git a/src/view.c b/src/view.c index ee7a4dce..14f15d42 100644 --- a/src/view.c +++ b/src/view.c @@ -1,5 +1,4 @@ #include "labwc.h" -#include "common/bug-on.h" void view_resize(struct view *view, struct wlr_box geo) { diff --git a/src/xdg.c b/src/xdg.c index 5123bc0d..b8354f19 100644 --- a/src/xdg.c +++ b/src/xdg.c @@ -1,6 +1,4 @@ #include "labwc.h" -#include "common/log.h" -#include "common/bug-on.h" struct xdg_deco { struct wlr_xdg_toplevel_decoration_v1 *wlr_decoration; diff --git a/src/xwayland.c b/src/xwayland.c index 836b9c6d..970236fb 100644 --- a/src/xwayland.c +++ b/src/xwayland.c @@ -1,6 +1,4 @@ #include "labwc.h" -#include "common/log.h" -#include "common/bug-on.h" static void handle_commit(struct wl_listener *listener, void *data) {