mirror of
				https://github.com/swaywm/sway.git
				synced 2025-11-03 09:01:43 -05:00 
			
		
		
		
	Merge pull request #2222 from RyanDwyer/fix-utf8-titles
Fix titles when container titles contain UTF-8 characters
This commit is contained in:
		
						commit
						305fac293a
					
				
					 3 changed files with 34 additions and 10 deletions
				
			
		| 
						 | 
					@ -521,7 +521,7 @@ static void render_titlebar(struct sway_output *output,
 | 
				
			||||||
	size_t inner_width = width - TITLEBAR_H_PADDING * 2;
 | 
						size_t inner_width = width - TITLEBAR_H_PADDING * 2;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Marks
 | 
						// Marks
 | 
				
			||||||
	size_t marks_width = 0;
 | 
						size_t marks_ob_width = 0; // output-buffer-local
 | 
				
			||||||
	if (config->show_marks && marks_texture) {
 | 
						if (config->show_marks && marks_texture) {
 | 
				
			||||||
		struct wlr_box texture_box;
 | 
							struct wlr_box texture_box;
 | 
				
			||||||
		wlr_texture_get_size(marks_texture,
 | 
							wlr_texture_get_size(marks_texture,
 | 
				
			||||||
| 
						 | 
					@ -540,11 +540,23 @@ static void render_titlebar(struct sway_output *output,
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		render_texture(output->wlr_output, output_damage, marks_texture,
 | 
							render_texture(output->wlr_output, output_damage, marks_texture,
 | 
				
			||||||
			&texture_box, matrix, con->alpha);
 | 
								&texture_box, matrix, con->alpha);
 | 
				
			||||||
		marks_width = texture_box.width;
 | 
							marks_ob_width = texture_box.width;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// Gap between the marks and bottom padding, for when the marks texture
 | 
				
			||||||
 | 
							// height is smaller than the config's font height
 | 
				
			||||||
 | 
							memcpy(&color, colors->background, sizeof(float) * 4);
 | 
				
			||||||
 | 
							premultiply_alpha(color, con->alpha);
 | 
				
			||||||
 | 
							box.x = texture_box.x;
 | 
				
			||||||
 | 
							box.y = texture_box.y + texture_box.height;
 | 
				
			||||||
 | 
							box.width = texture_box.width;
 | 
				
			||||||
 | 
							box.height = config->font_height * output_scale - texture_box.height;
 | 
				
			||||||
 | 
							if (box.height > 0) {
 | 
				
			||||||
 | 
								render_rect(output->wlr_output, output_damage, &box, color);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Title text
 | 
						// Title text
 | 
				
			||||||
	size_t title_width = 0;
 | 
						size_t title_ob_width = 0; // output-buffer-local
 | 
				
			||||||
	if (title_texture) {
 | 
						if (title_texture) {
 | 
				
			||||||
		struct wlr_box texture_box;
 | 
							struct wlr_box texture_box;
 | 
				
			||||||
		wlr_texture_get_size(title_texture,
 | 
							wlr_texture_get_size(title_texture,
 | 
				
			||||||
| 
						 | 
					@ -557,12 +569,24 @@ static void render_titlebar(struct sway_output *output,
 | 
				
			||||||
			WL_OUTPUT_TRANSFORM_NORMAL,
 | 
								WL_OUTPUT_TRANSFORM_NORMAL,
 | 
				
			||||||
			0.0, output->wlr_output->transform_matrix);
 | 
								0.0, output->wlr_output->transform_matrix);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (inner_width * output_scale - marks_width < texture_box.width) {
 | 
							if (inner_width * output_scale - marks_ob_width < texture_box.width) {
 | 
				
			||||||
			texture_box.width = inner_width * output_scale - marks_width;
 | 
								texture_box.width = inner_width * output_scale - marks_ob_width;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		render_texture(output->wlr_output, output_damage, title_texture,
 | 
							render_texture(output->wlr_output, output_damage, title_texture,
 | 
				
			||||||
			&texture_box, matrix, con->alpha);
 | 
								&texture_box, matrix, con->alpha);
 | 
				
			||||||
		title_width = texture_box.width;
 | 
							title_ob_width = texture_box.width;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// Gap between the title and bottom padding, for when the title texture
 | 
				
			||||||
 | 
							// height is smaller than the config's font height
 | 
				
			||||||
 | 
							memcpy(&color, colors->background, sizeof(float) * 4);
 | 
				
			||||||
 | 
							premultiply_alpha(color, con->alpha);
 | 
				
			||||||
 | 
							box.x = texture_box.x;
 | 
				
			||||||
 | 
							box.y = texture_box.y + texture_box.height;
 | 
				
			||||||
 | 
							box.width = texture_box.width;
 | 
				
			||||||
 | 
							box.height = config->font_height * output_scale - texture_box.height;
 | 
				
			||||||
 | 
							if (box.height > 0) {
 | 
				
			||||||
 | 
								render_rect(output->wlr_output, output_damage, &box, color);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Padding above title
 | 
						// Padding above title
 | 
				
			||||||
| 
						 | 
					@ -580,9 +604,9 @@ static void render_titlebar(struct sway_output *output,
 | 
				
			||||||
	render_rect(output->wlr_output, output_damage, &box, color);
 | 
						render_rect(output->wlr_output, output_damage, &box, color);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Filler between title and marks
 | 
						// Filler between title and marks
 | 
				
			||||||
	box.width = inner_width * output_scale - title_width - marks_width;
 | 
						box.width = inner_width * output_scale - title_ob_width - marks_ob_width;
 | 
				
			||||||
	if (box.width > 0) {
 | 
						if (box.width > 0) {
 | 
				
			||||||
		box.x = (x + TITLEBAR_H_PADDING) * output_scale + title_width;
 | 
							box.x = (x + TITLEBAR_H_PADDING) * output_scale + title_ob_width;
 | 
				
			||||||
		box.y = (y + TITLEBAR_V_PADDING) * output_scale;
 | 
							box.y = (y + TITLEBAR_V_PADDING) * output_scale;
 | 
				
			||||||
		box.height = config->font_height * output_scale;
 | 
							box.height = config->font_height * output_scale;
 | 
				
			||||||
		render_rect(output->wlr_output, output_damage, &box, color);
 | 
							render_rect(output->wlr_output, output_damage, &box, color);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -783,7 +783,7 @@ static void update_title_texture(struct sway_container *con,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	double scale = output->sway_output->wlr_output->scale;
 | 
						double scale = output->sway_output->wlr_output->scale;
 | 
				
			||||||
	int width = 0;
 | 
						int width = 0;
 | 
				
			||||||
	int height = config->font_height * scale;
 | 
						int height = con->title_height * scale;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	cairo_t *c = cairo_create(NULL);
 | 
						cairo_t *c = cairo_create(NULL);
 | 
				
			||||||
	get_text_size(c, config->font, &width, NULL, scale, config->pango_markup,
 | 
						get_text_size(c, config->font, &width, NULL, scale, config->pango_markup,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -923,7 +923,7 @@ static void update_marks_texture(struct sway_view *view,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	double scale = output->sway_output->wlr_output->scale;
 | 
						double scale = output->sway_output->wlr_output->scale;
 | 
				
			||||||
	int width = 0;
 | 
						int width = 0;
 | 
				
			||||||
	int height = config->font_height * scale;
 | 
						int height = view->swayc->title_height * scale;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	cairo_t *c = cairo_create(NULL);
 | 
						cairo_t *c = cairo_create(NULL);
 | 
				
			||||||
	get_text_size(c, config->font, &width, NULL, scale, false, "%s", buffer);
 | 
						get_text_size(c, config->font, &width, NULL, scale, false, "%s", buffer);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue