mirror of
				https://github.com/labwc/labwc.git
				synced 2025-11-03 09:01:51 -05:00 
			
		
		
		
	common/graphic-helpers: Add cairo helpers
This commit is contained in:
		
							parent
							
								
									8c8583ef94
								
							
						
					
					
						commit
						fb36463c34
					
				
					 4 changed files with 48 additions and 61 deletions
				
			
		| 
						 | 
					@ -32,3 +32,13 @@ struct multi_rect *multi_rect_create(struct wlr_scene_tree *parent,
 | 
				
			||||||
		float *colors[3], int line_width);
 | 
							float *colors[3], int line_width);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void multi_rect_set_size(struct multi_rect *rect, int width, int height);
 | 
					void multi_rect_set_size(struct multi_rect *rect, int width, int height);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					 * Sets the cairo color.
 | 
				
			||||||
 | 
					 * Splits a float[4] single color array into its own arguments
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					void set_cairo_color(cairo_t *cairo, float *color);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Draws a border with a specified line width */
 | 
				
			||||||
 | 
					void draw_cairo_border(cairo_t *cairo, double width, double height,
 | 
				
			||||||
 | 
							double line_width);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,6 +1,7 @@
 | 
				
			||||||
// SPDX-License-Identifier: GPL-2.0-only
 | 
					// SPDX-License-Identifier: GPL-2.0-only
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <assert.h>
 | 
					#include <assert.h>
 | 
				
			||||||
 | 
					#include <cairo.h>
 | 
				
			||||||
#include <stdlib.h>
 | 
					#include <stdlib.h>
 | 
				
			||||||
#include <wlr/types/wlr_scene.h>
 | 
					#include <wlr/types/wlr_scene.h>
 | 
				
			||||||
#include "common/graphic-helpers.h"
 | 
					#include "common/graphic-helpers.h"
 | 
				
			||||||
| 
						 | 
					@ -58,3 +59,28 @@ multi_rect_set_size(struct multi_rect *rect, int width, int height)
 | 
				
			||||||
			line_width, height - i * line_width * 2);
 | 
								line_width, height - i * line_width * 2);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Draws a border with a specified line width */
 | 
				
			||||||
 | 
					void
 | 
				
			||||||
 | 
					draw_cairo_border(cairo_t *cairo, double width, double height, double line_width)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						cairo_save(cairo);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						double x, y, w, h;
 | 
				
			||||||
 | 
						/* The anchor point of a line is in the center */
 | 
				
			||||||
 | 
						x = y = line_width / 2;
 | 
				
			||||||
 | 
						w = width - line_width;
 | 
				
			||||||
 | 
						h = height - line_width;
 | 
				
			||||||
 | 
						cairo_set_line_width(cairo, line_width);
 | 
				
			||||||
 | 
						cairo_rectangle(cairo, x, y, w, h);
 | 
				
			||||||
 | 
						cairo_stroke(cairo);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						cairo_restore(cairo);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Sets the cairo color. Splits the single color channels */
 | 
				
			||||||
 | 
					void
 | 
				
			||||||
 | 
					set_cairo_color(cairo_t *cairo, float *c)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						cairo_set_source_rgba(cairo, c[0], c[1], c[2], c[3]);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										35
									
								
								src/osd.c
									
										
									
									
									
								
							
							
						
						
									
										35
									
								
								src/osd.c
									
										
									
									
									
								
							| 
						 | 
					@ -7,6 +7,7 @@
 | 
				
			||||||
#include "buffer.h"
 | 
					#include "buffer.h"
 | 
				
			||||||
#include "common/buf.h"
 | 
					#include "common/buf.h"
 | 
				
			||||||
#include "common/font.h"
 | 
					#include "common/font.h"
 | 
				
			||||||
 | 
					#include "common/graphic-helpers.h"
 | 
				
			||||||
#include "config/rcxml.h"
 | 
					#include "config/rcxml.h"
 | 
				
			||||||
#include "labwc.h"
 | 
					#include "labwc.h"
 | 
				
			||||||
#include "theme.h"
 | 
					#include "theme.h"
 | 
				
			||||||
| 
						 | 
					@ -20,30 +21,6 @@
 | 
				
			||||||
#define OSD_TAB1 (120)
 | 
					#define OSD_TAB1 (120)
 | 
				
			||||||
#define OSD_TAB2 (300)
 | 
					#define OSD_TAB2 (300)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void
 | 
					 | 
				
			||||||
set_source(cairo_t *cairo, float *c)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	cairo_set_source_rgba(cairo, c[0], c[1], c[2], c[3]);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* Draws a border with a specified line width */
 | 
					 | 
				
			||||||
static void
 | 
					 | 
				
			||||||
draw_border(cairo_t *cairo, double width, double height, double line_width)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	cairo_save(cairo);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	double x, y, w, h;
 | 
					 | 
				
			||||||
	/* The anchor point of a line is in the center */
 | 
					 | 
				
			||||||
	x = y = line_width / 2;
 | 
					 | 
				
			||||||
	w = width - line_width;
 | 
					 | 
				
			||||||
	h = height - line_width;
 | 
					 | 
				
			||||||
	cairo_set_line_width(cairo, line_width);
 | 
					 | 
				
			||||||
	cairo_rectangle(cairo, x, y, w, h);
 | 
					 | 
				
			||||||
	cairo_stroke(cairo);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	cairo_restore(cairo);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/* is title different from app_id/class? */
 | 
					/* is title different from app_id/class? */
 | 
				
			||||||
static int
 | 
					static int
 | 
				
			||||||
is_title_different(struct view *view)
 | 
					is_title_different(struct view *view)
 | 
				
			||||||
| 
						 | 
					@ -155,13 +132,13 @@ osd_update(struct server *server)
 | 
				
			||||||
		cairo_surface_t *surf = cairo_get_target(cairo);
 | 
							cairo_surface_t *surf = cairo_get_target(cairo);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		/* background */
 | 
							/* background */
 | 
				
			||||||
		set_source(cairo, theme->osd_bg_color);
 | 
							set_cairo_color(cairo, theme->osd_bg_color);
 | 
				
			||||||
		cairo_rectangle(cairo, 0, 0, w, h);
 | 
							cairo_rectangle(cairo, 0, 0, w, h);
 | 
				
			||||||
		cairo_fill(cairo);
 | 
							cairo_fill(cairo);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		/* Border */
 | 
							/* Border */
 | 
				
			||||||
		set_source(cairo, theme->osd_border_color);
 | 
							set_cairo_color(cairo, theme->osd_border_color);
 | 
				
			||||||
		draw_border(cairo, w, h, theme->osd_border_width);
 | 
							draw_cairo_border(cairo, w, h, theme->osd_border_width);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		int y = OSD_BORDER_WIDTH;
 | 
							int y = OSD_BORDER_WIDTH;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -177,7 +154,7 @@ osd_update(struct server *server)
 | 
				
			||||||
				continue;
 | 
									continue;
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			if (view == server->cycle_view) {
 | 
								if (view == server->cycle_view) {
 | 
				
			||||||
				set_source(cairo, theme->osd_label_text_color);
 | 
									set_cairo_color(cairo, theme->osd_label_text_color);
 | 
				
			||||||
				cairo_rectangle(cairo, OSD_BORDER_WIDTH, y,
 | 
									cairo_rectangle(cairo, OSD_BORDER_WIDTH, y,
 | 
				
			||||||
					OSD_ITEM_WIDTH, OSD_ITEM_HEIGHT);
 | 
										OSD_ITEM_WIDTH, OSD_ITEM_HEIGHT);
 | 
				
			||||||
				cairo_stroke(cairo);
 | 
									cairo_stroke(cairo);
 | 
				
			||||||
| 
						 | 
					@ -187,7 +164,7 @@ osd_update(struct server *server)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		/* text */
 | 
							/* text */
 | 
				
			||||||
		set_source(cairo, theme->osd_label_text_color);
 | 
							set_cairo_color(cairo, theme->osd_label_text_color);
 | 
				
			||||||
		PangoLayout *layout = pango_cairo_create_layout(cairo);
 | 
							PangoLayout *layout = pango_cairo_create_layout(cairo);
 | 
				
			||||||
		pango_layout_set_width(layout,
 | 
							pango_layout_set_width(layout,
 | 
				
			||||||
			(OSD_ITEM_WIDTH - 2 * OSD_ITEM_PADDING) * PANGO_SCALE);
 | 
								(OSD_ITEM_WIDTH - 2 * OSD_ITEM_PADDING) * PANGO_SCALE);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -9,6 +9,7 @@
 | 
				
			||||||
#include <strings.h>
 | 
					#include <strings.h>
 | 
				
			||||||
#include "labwc.h"
 | 
					#include "labwc.h"
 | 
				
			||||||
#include "common/font.h"
 | 
					#include "common/font.h"
 | 
				
			||||||
 | 
					#include "common/graphic-helpers.h"
 | 
				
			||||||
#include "common/zfree.h"
 | 
					#include "common/zfree.h"
 | 
				
			||||||
#include "workspaces.h"
 | 
					#include "workspaces.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -45,33 +46,6 @@ parse_workspace_index(const char *name)
 | 
				
			||||||
	return index;
 | 
						return index;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					 | 
				
			||||||
 * TODO: set_source and draw_border are straight up copies from src/osd.c
 | 
					 | 
				
			||||||
 * find some proper place for them instead of duplicating stuff.
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
static void
 | 
					 | 
				
			||||||
set_source(cairo_t *cairo, float *c)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	cairo_set_source_rgba(cairo, c[0], c[1], c[2], c[3]);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static void
 | 
					 | 
				
			||||||
draw_border(cairo_t *cairo, double width, double height, double line_width)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	cairo_save(cairo);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	double x, y, w, h;
 | 
					 | 
				
			||||||
	/* The anchor point of a line is in the center */
 | 
					 | 
				
			||||||
	x = y = line_width / 2;
 | 
					 | 
				
			||||||
	w = width - line_width;
 | 
					 | 
				
			||||||
	h = height - line_width;
 | 
					 | 
				
			||||||
	cairo_set_line_width(cairo, line_width);
 | 
					 | 
				
			||||||
	cairo_rectangle(cairo, x, y, w, h);
 | 
					 | 
				
			||||||
	cairo_stroke(cairo);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	cairo_restore(cairo);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static void
 | 
					static void
 | 
				
			||||||
_osd_update(struct server *server)
 | 
					_osd_update(struct server *server)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
| 
						 | 
					@ -110,18 +84,18 @@ _osd_update(struct server *server)
 | 
				
			||||||
		cairo = buffer->cairo;
 | 
							cairo = buffer->cairo;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		/* Background */
 | 
							/* Background */
 | 
				
			||||||
		set_source(cairo, theme->osd_bg_color);
 | 
							set_cairo_color(cairo, theme->osd_bg_color);
 | 
				
			||||||
		cairo_rectangle(cairo, 0, 0, width, height);
 | 
							cairo_rectangle(cairo, 0, 0, width, height);
 | 
				
			||||||
		cairo_fill(cairo);
 | 
							cairo_fill(cairo);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		/* Border */
 | 
							/* Border */
 | 
				
			||||||
		set_source(cairo, theme->osd_border_color);
 | 
							set_cairo_color(cairo, theme->osd_border_color);
 | 
				
			||||||
		draw_border(cairo, width, height, theme->osd_border_width);
 | 
							draw_cairo_border(cairo, width, height, theme->osd_border_width);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		uint16_t x = (width - marker_width) / 2;
 | 
							uint16_t x = (width - marker_width) / 2;
 | 
				
			||||||
		wl_list_for_each(workspace, &server->workspaces, link) {
 | 
							wl_list_for_each(workspace, &server->workspaces, link) {
 | 
				
			||||||
			bool active =  workspace == server->workspace_current;
 | 
								bool active =  workspace == server->workspace_current;
 | 
				
			||||||
			set_source(cairo, server->theme->osd_label_text_color);
 | 
								set_cairo_color(cairo, server->theme->osd_label_text_color);
 | 
				
			||||||
			cairo_rectangle(cairo, x, margin,
 | 
								cairo_rectangle(cairo, x, margin,
 | 
				
			||||||
				rect_width - padding, rect_height);
 | 
									rect_width - padding, rect_height);
 | 
				
			||||||
			cairo_stroke(cairo);
 | 
								cairo_stroke(cairo);
 | 
				
			||||||
| 
						 | 
					@ -134,7 +108,7 @@ _osd_update(struct server *server)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		/* Text */
 | 
							/* Text */
 | 
				
			||||||
		set_source(cairo, server->theme->osd_label_text_color);
 | 
							set_cairo_color(cairo, server->theme->osd_label_text_color);
 | 
				
			||||||
		PangoLayout *layout = pango_cairo_create_layout(cairo);
 | 
							PangoLayout *layout = pango_cairo_create_layout(cairo);
 | 
				
			||||||
		pango_layout_set_width(layout, (width - 2 * margin) * PANGO_SCALE);
 | 
							pango_layout_set_width(layout, (width - 2 * margin) * PANGO_SCALE);
 | 
				
			||||||
		pango_layout_set_ellipsize(layout, PANGO_ELLIPSIZE_END);
 | 
							pango_layout_set_ellipsize(layout, PANGO_ELLIPSIZE_END);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue