mirror of
https://github.com/labwc/labwc.git
synced 2026-02-28 01:40:29 -05:00
Base rc.title_height on font vertical extents
This commit is contained in:
parent
4d1363dcae
commit
2297e43cc0
11 changed files with 123 additions and 26 deletions
10
include/common/font.h
Normal file
10
include/common/font.h
Normal file
|
|
@ -0,0 +1,10 @@
|
||||||
|
#ifndef __LABWC_FONT_H
|
||||||
|
#define __LABWC_FONT_H
|
||||||
|
|
||||||
|
/*
|
||||||
|
* font_height - get font vertical extents
|
||||||
|
* @font_description: string describing font, for example 'sans 10'
|
||||||
|
*/
|
||||||
|
int font_height(const char *font_description);
|
||||||
|
|
||||||
|
#endif /* __LABWC_FONT_H */
|
||||||
|
|
@ -13,6 +13,7 @@ struct rcxml {
|
||||||
char *font_name_activewindow;
|
char *font_name_activewindow;
|
||||||
int font_size_activewindow;
|
int font_size_activewindow;
|
||||||
struct wl_list keybinds;
|
struct wl_list keybinds;
|
||||||
|
int title_height; /* not set in rc.xml, but derived from font, etc */
|
||||||
};
|
};
|
||||||
|
|
||||||
extern struct rcxml rc;
|
extern struct rcxml rc;
|
||||||
|
|
|
||||||
12
meson.build
12
meson.build
|
|
@ -43,19 +43,21 @@ xkbcommon = dependency('xkbcommon')
|
||||||
xml2 = dependency('libxml-2.0')
|
xml2 = dependency('libxml-2.0')
|
||||||
glib = dependency('glib-2.0')
|
glib = dependency('glib-2.0')
|
||||||
cairo = dependency('cairo')
|
cairo = dependency('cairo')
|
||||||
pango = dependency('pango')
|
pangocairo = dependency('pangocairo')
|
||||||
|
|
||||||
labwc_inc = include_directories('include')
|
labwc_inc = include_directories('include')
|
||||||
|
|
||||||
subdir('protocols')
|
subdir('protocols')
|
||||||
|
|
||||||
|
labwc_deps = [
|
||||||
|
server_protos, wayland_server, wlroots, xkbcommon, xml2, glib,
|
||||||
|
cairo, pangocairo
|
||||||
|
]
|
||||||
|
|
||||||
subdir('src')
|
subdir('src')
|
||||||
subdir('tests')
|
subdir('tests')
|
||||||
subdir('docs')
|
subdir('docs')
|
||||||
|
|
||||||
labwc_deps = [
|
|
||||||
server_protos, wayland_server, wlroots, xkbcommon, xml2, glib, cairo, pango
|
|
||||||
]
|
|
||||||
|
|
||||||
executable(
|
executable(
|
||||||
meson.project_name(),
|
meson.project_name(),
|
||||||
labwc_sources,
|
labwc_sources,
|
||||||
|
|
|
||||||
41
src/common/font.c
Normal file
41
src/common/font.c
Normal file
|
|
@ -0,0 +1,41 @@
|
||||||
|
#include <cairo.h>
|
||||||
|
#include <pango/pangocairo.h>
|
||||||
|
|
||||||
|
#include "common/font.h"
|
||||||
|
|
||||||
|
static PangoRectangle font_extents(const char *font_description,
|
||||||
|
const char *string)
|
||||||
|
{
|
||||||
|
PangoRectangle rect;
|
||||||
|
cairo_surface_t *surface;
|
||||||
|
cairo_t *c;
|
||||||
|
PangoLayout *layout;
|
||||||
|
PangoFontDescription *font;
|
||||||
|
|
||||||
|
surface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, 1, 1);
|
||||||
|
c = cairo_create(surface);
|
||||||
|
layout = pango_cairo_create_layout(c);
|
||||||
|
font = pango_font_description_from_string(font_description);
|
||||||
|
|
||||||
|
pango_layout_set_font_description(layout, font);
|
||||||
|
pango_layout_set_text(layout, string, -1);
|
||||||
|
pango_layout_set_single_paragraph_mode(layout, TRUE);
|
||||||
|
pango_layout_set_width(layout, -1);
|
||||||
|
pango_layout_set_ellipsize(layout, PANGO_ELLIPSIZE_MIDDLE);
|
||||||
|
pango_layout_get_extents(layout, NULL, &rect);
|
||||||
|
pango_extents_to_pixels(&rect, NULL);
|
||||||
|
|
||||||
|
/* we put a 2 px edge on each side - because Openbox does it :) */
|
||||||
|
rect.width += 4;
|
||||||
|
|
||||||
|
g_object_unref(layout);
|
||||||
|
pango_font_description_free(font);
|
||||||
|
return rect;
|
||||||
|
}
|
||||||
|
|
||||||
|
int font_height(const char *font_description)
|
||||||
|
{
|
||||||
|
PangoRectangle rectangle;
|
||||||
|
rectangle = font_extents(font_description, "abcdefg");
|
||||||
|
return rectangle.height;
|
||||||
|
}
|
||||||
|
|
@ -1,4 +1,5 @@
|
||||||
labwc_sources += files(
|
labwc_sources += files(
|
||||||
'buf.c',
|
'buf.c',
|
||||||
|
'font.c',
|
||||||
'spawn.c',
|
'spawn.c',
|
||||||
)
|
)
|
||||||
|
|
|
||||||
|
|
@ -14,6 +14,7 @@
|
||||||
#include "config/keybind.h"
|
#include "config/keybind.h"
|
||||||
#include "config/config-dir.h"
|
#include "config/config-dir.h"
|
||||||
#include "common/bug-on.h"
|
#include "common/bug-on.h"
|
||||||
|
#include "common/font.h"
|
||||||
|
|
||||||
static bool in_keybind = false;
|
static bool in_keybind = false;
|
||||||
static bool is_attribute = false;
|
static bool is_attribute = false;
|
||||||
|
|
@ -232,6 +233,14 @@ static void bind(const char *binding, const char *action)
|
||||||
fprintf(stderr, "binding: %s: %s\n", binding, action);
|
fprintf(stderr, "binding: %s: %s\n", binding, action);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void set_title_height(void)
|
||||||
|
{
|
||||||
|
char buf[256];
|
||||||
|
snprintf(buf, sizeof(buf), "%s %d", rc.font_name_activewindow,
|
||||||
|
rc.font_size_activewindow);
|
||||||
|
rc.title_height = font_height(buf);
|
||||||
|
}
|
||||||
|
|
||||||
static void post_processing(void)
|
static void post_processing(void)
|
||||||
{
|
{
|
||||||
if (!wl_list_length(&rc.keybinds)) {
|
if (!wl_list_length(&rc.keybinds)) {
|
||||||
|
|
@ -241,6 +250,8 @@ static void post_processing(void)
|
||||||
bind("A-F3", "Execute");
|
bind("A-F3", "Execute");
|
||||||
}
|
}
|
||||||
/* TODO: Set all char* variables if NULL */
|
/* TODO: Set all char* variables if NULL */
|
||||||
|
|
||||||
|
set_title_height();
|
||||||
}
|
}
|
||||||
|
|
||||||
static void rcxml_path(char *buf, size_t len, const char *filename)
|
static void rcxml_path(char *buf, size_t len, const char *filename)
|
||||||
|
|
|
||||||
38
src/deco.c
38
src/deco.c
|
|
@ -6,18 +6,18 @@
|
||||||
|
|
||||||
#include "labwc.h"
|
#include "labwc.h"
|
||||||
#include "theme/theme.h"
|
#include "theme/theme.h"
|
||||||
|
#include "config/rcxml.h"
|
||||||
|
|
||||||
/* Based on expected font height of Sans 8 */
|
/* Based on expected font height of Sans 8 */
|
||||||
#define TITLE_HEIGHT (14)
|
|
||||||
#define BORDER_WIDTH (1)
|
#define BORDER_WIDTH (1)
|
||||||
|
|
||||||
struct wlr_box deco_max_extents(struct view *view)
|
struct wlr_box deco_max_extents(struct view *view)
|
||||||
{
|
{
|
||||||
struct wlr_box box = {
|
struct wlr_box box = {
|
||||||
.x = view->x - BORDER_WIDTH,
|
.x = view->x - BORDER_WIDTH,
|
||||||
.y = view->y - TITLE_HEIGHT - BORDER_WIDTH,
|
.y = view->y - rc.title_height - BORDER_WIDTH,
|
||||||
.width = view->surface->current.width + 2 * BORDER_WIDTH,
|
.width = view->surface->current.width + 2 * BORDER_WIDTH,
|
||||||
.height = view->surface->current.height + TITLE_HEIGHT +
|
.height = view->surface->current.height + rc.title_height +
|
||||||
2 * BORDER_WIDTH,
|
2 * BORDER_WIDTH,
|
||||||
};
|
};
|
||||||
return box;
|
return box;
|
||||||
|
|
@ -33,44 +33,44 @@ struct wlr_box deco_box(struct view *view, enum deco_part deco_part)
|
||||||
switch (deco_part) {
|
switch (deco_part) {
|
||||||
case LAB_DECO_BUTTON_CLOSE:
|
case LAB_DECO_BUTTON_CLOSE:
|
||||||
wlr_texture_get_size(theme.xbm_close, &box.width, &box.height);
|
wlr_texture_get_size(theme.xbm_close, &box.width, &box.height);
|
||||||
margin = (TITLE_HEIGHT - box.height) / 2;
|
margin = (rc.title_height - box.height) / 2;
|
||||||
box.x = view->x + view->surface->current.width + margin -
|
box.x = view->x + view->surface->current.width + margin -
|
||||||
TITLE_HEIGHT;
|
rc.title_height;
|
||||||
box.y = view->y - TITLE_HEIGHT + margin;
|
box.y = view->y - rc.title_height + margin;
|
||||||
break;
|
break;
|
||||||
case LAB_DECO_BUTTON_MAXIMIZE:
|
case LAB_DECO_BUTTON_MAXIMIZE:
|
||||||
wlr_texture_get_size(theme.xbm_maximize, &box.width,
|
wlr_texture_get_size(theme.xbm_maximize, &box.width,
|
||||||
&box.height);
|
&box.height);
|
||||||
margin = (TITLE_HEIGHT - box.height) / 2;
|
margin = (rc.title_height - box.height) / 2;
|
||||||
box.x = view->x + view->surface->current.width + margin -
|
box.x = view->x + view->surface->current.width + margin -
|
||||||
TITLE_HEIGHT * 2;
|
rc.title_height * 2;
|
||||||
box.y = view->y - TITLE_HEIGHT + margin;
|
box.y = view->y - rc.title_height + margin;
|
||||||
break;
|
break;
|
||||||
case LAB_DECO_BUTTON_ICONIFY:
|
case LAB_DECO_BUTTON_ICONIFY:
|
||||||
wlr_texture_get_size(theme.xbm_iconify, &box.width,
|
wlr_texture_get_size(theme.xbm_iconify, &box.width,
|
||||||
&box.height);
|
&box.height);
|
||||||
margin = (TITLE_HEIGHT - box.height) / 2;
|
margin = (rc.title_height - box.height) / 2;
|
||||||
box.x = view->x + view->surface->current.width + margin -
|
box.x = view->x + view->surface->current.width + margin -
|
||||||
TITLE_HEIGHT * 3;
|
rc.title_height * 3;
|
||||||
box.y = view->y - TITLE_HEIGHT + margin;
|
box.y = view->y - rc.title_height + margin;
|
||||||
break;
|
break;
|
||||||
case LAB_DECO_PART_TITLE:
|
case LAB_DECO_PART_TITLE:
|
||||||
box.x = view->x;
|
box.x = view->x;
|
||||||
box.y = view->y - TITLE_HEIGHT;
|
box.y = view->y - rc.title_height;
|
||||||
box.width = view->surface->current.width;
|
box.width = view->surface->current.width;
|
||||||
box.height = TITLE_HEIGHT;
|
box.height = rc.title_height;
|
||||||
break;
|
break;
|
||||||
case LAB_DECO_PART_TOP:
|
case LAB_DECO_PART_TOP:
|
||||||
box.x = view->x - BORDER_WIDTH;
|
box.x = view->x - BORDER_WIDTH;
|
||||||
box.y = view->y - TITLE_HEIGHT - BORDER_WIDTH;
|
box.y = view->y - rc.title_height - BORDER_WIDTH;
|
||||||
box.width = view->surface->current.width + 2 * BORDER_WIDTH;
|
box.width = view->surface->current.width + 2 * BORDER_WIDTH;
|
||||||
box.height = BORDER_WIDTH;
|
box.height = BORDER_WIDTH;
|
||||||
break;
|
break;
|
||||||
case LAB_DECO_PART_RIGHT:
|
case LAB_DECO_PART_RIGHT:
|
||||||
box.x = view->x + view->surface->current.width;
|
box.x = view->x + view->surface->current.width;
|
||||||
box.y = view->y - TITLE_HEIGHT;
|
box.y = view->y - rc.title_height;
|
||||||
box.width = BORDER_WIDTH;
|
box.width = BORDER_WIDTH;
|
||||||
box.height = view->surface->current.height + TITLE_HEIGHT;
|
box.height = view->surface->current.height + rc.title_height;
|
||||||
break;
|
break;
|
||||||
case LAB_DECO_PART_BOTTOM:
|
case LAB_DECO_PART_BOTTOM:
|
||||||
box.x = view->x - BORDER_WIDTH;
|
box.x = view->x - BORDER_WIDTH;
|
||||||
|
|
@ -80,9 +80,9 @@ struct wlr_box deco_box(struct view *view, enum deco_part deco_part)
|
||||||
break;
|
break;
|
||||||
case LAB_DECO_PART_LEFT:
|
case LAB_DECO_PART_LEFT:
|
||||||
box.x = view->x - BORDER_WIDTH;
|
box.x = view->x - BORDER_WIDTH;
|
||||||
box.y = view->y - TITLE_HEIGHT;
|
box.y = view->y - rc.title_height;
|
||||||
box.width = BORDER_WIDTH;
|
box.width = BORDER_WIDTH;
|
||||||
box.height = view->surface->current.height + TITLE_HEIGHT;
|
box.height = view->surface->current.height + rc.title_height;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
|
|
|
||||||
|
|
@ -4,9 +4,10 @@ rcxml_lib = static_library(
|
||||||
'../src/config/rcxml.c',
|
'../src/config/rcxml.c',
|
||||||
'../src/config/keybind.c',
|
'../src/config/keybind.c',
|
||||||
'../src/config/config-dir.c',
|
'../src/config/config-dir.c',
|
||||||
'../src/common/buf.c'
|
'../src/common/buf.c',
|
||||||
|
'../src/common/font.c',
|
||||||
),
|
),
|
||||||
dependencies: [xml2, wayland_server, xkbcommon, glib, wlroots],
|
dependencies: labwc_deps,
|
||||||
include_directories: [labwc_inc],
|
include_directories: [labwc_inc],
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
||||||
2
tools/pango/.gitignore
vendored
Normal file
2
tools/pango/.gitignore
vendored
Normal file
|
|
@ -0,0 +1,2 @@
|
||||||
|
*.o
|
||||||
|
font-height
|
||||||
15
tools/pango/Makefile
Normal file
15
tools/pango/Makefile
Normal file
|
|
@ -0,0 +1,15 @@
|
||||||
|
CFLAGS += -g -Wall -O0 -std=c11
|
||||||
|
CFLAGS += `pkg-config cairo pango pangocairo --cflags`
|
||||||
|
CFLAGS += -I../../include
|
||||||
|
LIBS += `pkg-config cairo pango pangocairo --libs`
|
||||||
|
LDFLAGS += $(LIBS)
|
||||||
|
|
||||||
|
PROGS = font-height
|
||||||
|
|
||||||
|
all: $(PROGS)
|
||||||
|
|
||||||
|
font-height: font-height.c ../../src/common/font.c
|
||||||
|
$(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS)
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm -f $(PROGS) *.o
|
||||||
13
tools/pango/font-height.c
Normal file
13
tools/pango/font-height.c
Normal file
|
|
@ -0,0 +1,13 @@
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#include "common/font.h"
|
||||||
|
|
||||||
|
int main(int argc, char **argv)
|
||||||
|
{
|
||||||
|
if (argc < 2) {
|
||||||
|
printf("Usage: %s <font-description> (e.g. 'sans 10')\n", argv[0]);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
printf("height=%d\n", font_height(argv[1]));
|
||||||
|
}
|
||||||
Loading…
Add table
Add a link
Reference in a new issue