window: Move frame rendering to cairo-util
This commit is contained in:
+64
-3
@@ -315,12 +315,14 @@ load_cairo_surface(const char *filename)
|
|||||||
width, height, stride);
|
width, height, stride);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
struct theme *
|
||||||
display_render_theme(struct theme *t)
|
theme_create(void)
|
||||||
{
|
{
|
||||||
|
struct theme *t;
|
||||||
cairo_t *cr;
|
cairo_t *cr;
|
||||||
cairo_pattern_t *pattern;
|
cairo_pattern_t *pattern;
|
||||||
|
|
||||||
|
t = malloc(sizeof *t);
|
||||||
t->margin = 32;
|
t->margin = 32;
|
||||||
t->width = 6;
|
t->width = 6;
|
||||||
t->titlebar_height = 27;
|
t->titlebar_height = 27;
|
||||||
@@ -357,12 +359,71 @@ display_render_theme(struct theme *t)
|
|||||||
rounded_rect(cr, 0, 0, 128, 128, t->frame_radius);
|
rounded_rect(cr, 0, 0, 128, 128, t->frame_radius);
|
||||||
cairo_fill(cr);
|
cairo_fill(cr);
|
||||||
cairo_destroy(cr);
|
cairo_destroy(cr);
|
||||||
|
|
||||||
|
return t;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
fini_theme(struct theme *t)
|
theme_destroy(struct theme *t)
|
||||||
{
|
{
|
||||||
cairo_surface_destroy(t->active_frame);
|
cairo_surface_destroy(t->active_frame);
|
||||||
cairo_surface_destroy(t->inactive_frame);
|
cairo_surface_destroy(t->inactive_frame);
|
||||||
cairo_surface_destroy(t->shadow);
|
cairo_surface_destroy(t->shadow);
|
||||||
|
free(t);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
theme_render_frame(struct theme *t,
|
||||||
|
cairo_t *cr, int width, int height,
|
||||||
|
const char *title, uint32_t flags)
|
||||||
|
{
|
||||||
|
cairo_text_extents_t extents;
|
||||||
|
cairo_font_extents_t font_extents;
|
||||||
|
cairo_surface_t *source;
|
||||||
|
int x, y;
|
||||||
|
|
||||||
|
cairo_set_operator(cr, CAIRO_OPERATOR_SOURCE);
|
||||||
|
cairo_set_source_rgba(cr, 0, 0, 0, 0);
|
||||||
|
cairo_paint(cr);
|
||||||
|
|
||||||
|
cairo_set_source_rgba(cr, 0, 0, 0, 0.45);
|
||||||
|
tile_mask(cr, t->shadow,
|
||||||
|
2, 2, width + 8, height + 8,
|
||||||
|
64, 64);
|
||||||
|
|
||||||
|
if (flags & THEME_FRAME_ACTIVE)
|
||||||
|
source = t->active_frame;
|
||||||
|
else
|
||||||
|
source = t->inactive_frame;
|
||||||
|
|
||||||
|
tile_source(cr, source,
|
||||||
|
t->margin, t->margin,
|
||||||
|
width - t->margin * 2, height - t->margin * 2,
|
||||||
|
t->width, t->titlebar_height);
|
||||||
|
|
||||||
|
cairo_set_operator(cr, CAIRO_OPERATOR_OVER);
|
||||||
|
cairo_select_font_face(cr, "sans",
|
||||||
|
CAIRO_FONT_SLANT_NORMAL,
|
||||||
|
CAIRO_FONT_WEIGHT_BOLD);
|
||||||
|
cairo_set_font_size(cr, 14);
|
||||||
|
cairo_text_extents(cr, title, &extents);
|
||||||
|
cairo_font_extents (cr, &font_extents);
|
||||||
|
x = (width - extents.width) / 2;
|
||||||
|
y = t->margin +
|
||||||
|
(t->titlebar_height -
|
||||||
|
font_extents.ascent - font_extents.descent) / 2 +
|
||||||
|
font_extents.ascent;
|
||||||
|
|
||||||
|
if (flags & THEME_FRAME_ACTIVE) {
|
||||||
|
cairo_move_to(cr, x + 1, y + 1);
|
||||||
|
cairo_set_source_rgb(cr, 1, 1, 1);
|
||||||
|
cairo_show_text(cr, title);
|
||||||
|
cairo_move_to(cr, x, y);
|
||||||
|
cairo_set_source_rgb(cr, 0, 0, 0);
|
||||||
|
cairo_show_text(cr, title);
|
||||||
|
} else {
|
||||||
|
cairo_move_to(cr, x, y);
|
||||||
|
cairo_set_source_rgb(cr, 0.4, 0.4, 0.4);
|
||||||
|
cairo_show_text(cr, title);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -53,9 +53,16 @@ struct theme {
|
|||||||
int titlebar_height;
|
int titlebar_height;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct theme *
|
||||||
|
theme_create(void);
|
||||||
void
|
void
|
||||||
display_render_theme(struct theme *t);
|
theme_destroy(struct theme *t);
|
||||||
|
|
||||||
|
#define THEME_FRAME_ACTIVE 1
|
||||||
|
|
||||||
void
|
void
|
||||||
fini_theme(struct theme *t);
|
theme_render_frame(struct theme *t,
|
||||||
|
cairo_t *cr, int width, int height,
|
||||||
|
const char *title, uint32_t flags);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
+10
-56
@@ -91,7 +91,7 @@ struct display {
|
|||||||
struct wl_list input_list;
|
struct wl_list input_list;
|
||||||
struct wl_list output_list;
|
struct wl_list output_list;
|
||||||
|
|
||||||
struct theme theme;
|
struct theme *theme;
|
||||||
|
|
||||||
struct {
|
struct {
|
||||||
struct xkb_rule_names names;
|
struct xkb_rule_names names;
|
||||||
@@ -1171,7 +1171,7 @@ frame_resize_handler(struct widget *widget,
|
|||||||
struct rectangle allocation;
|
struct rectangle allocation;
|
||||||
struct display *display = widget->window->display;
|
struct display *display = widget->window->display;
|
||||||
struct frame_button * button;
|
struct frame_button * button;
|
||||||
struct theme *t = &display->theme;
|
struct theme *t = display->theme;
|
||||||
int x_l, x_r, y, w, h;
|
int x_l, x_r, y, w, h;
|
||||||
int decoration_width, decoration_height;
|
int decoration_width, decoration_height;
|
||||||
int opaque_margin;
|
int opaque_margin;
|
||||||
@@ -1420,65 +1420,19 @@ static void
|
|||||||
frame_redraw_handler(struct widget *widget, void *data)
|
frame_redraw_handler(struct widget *widget, void *data)
|
||||||
{
|
{
|
||||||
cairo_t *cr;
|
cairo_t *cr;
|
||||||
cairo_text_extents_t extents;
|
|
||||||
cairo_font_extents_t font_extents;
|
|
||||||
cairo_surface_t *source;
|
|
||||||
int x, y, width, height;
|
|
||||||
struct window *window = widget->window;
|
struct window *window = widget->window;
|
||||||
struct theme *t = &window->display->theme;
|
struct theme *t = window->display->theme;
|
||||||
|
uint32_t flags = 0;
|
||||||
|
|
||||||
if (window->type == TYPE_FULLSCREEN)
|
if (window->type == TYPE_FULLSCREEN)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
width = widget->allocation.width;
|
|
||||||
height = widget->allocation.height;
|
|
||||||
|
|
||||||
cr = cairo_create(window->cairo_surface);
|
cr = cairo_create(window->cairo_surface);
|
||||||
|
|
||||||
cairo_set_operator(cr, CAIRO_OPERATOR_SOURCE);
|
|
||||||
cairo_set_source_rgba(cr, 0, 0, 0, 0);
|
|
||||||
cairo_paint(cr);
|
|
||||||
|
|
||||||
cairo_set_source_rgba(cr, 0, 0, 0, 0.45);
|
|
||||||
tile_mask(cr, t->shadow,
|
|
||||||
2, 2, width + 8, height + 8,
|
|
||||||
64, 64);
|
|
||||||
|
|
||||||
if (window->keyboard_device)
|
if (window->keyboard_device)
|
||||||
source = t->active_frame;
|
flags |= THEME_FRAME_ACTIVE;
|
||||||
else
|
theme_render_frame(t, cr, widget->allocation.width,
|
||||||
source = t->inactive_frame;
|
widget->allocation.height, window->title, flags);
|
||||||
|
|
||||||
tile_source(cr, source,
|
|
||||||
t->margin, t->margin,
|
|
||||||
width - t->margin * 2, height - t->margin * 2,
|
|
||||||
t->width, t->titlebar_height);
|
|
||||||
|
|
||||||
cairo_set_operator(cr, CAIRO_OPERATOR_OVER);
|
|
||||||
cairo_select_font_face(cr, "sans",
|
|
||||||
CAIRO_FONT_SLANT_NORMAL,
|
|
||||||
CAIRO_FONT_WEIGHT_BOLD);
|
|
||||||
cairo_set_font_size(cr, 14);
|
|
||||||
cairo_text_extents(cr, window->title, &extents);
|
|
||||||
cairo_font_extents (cr, &font_extents);
|
|
||||||
x = (width - extents.width) / 2;
|
|
||||||
y = t->margin +
|
|
||||||
(t->titlebar_height -
|
|
||||||
font_extents.ascent - font_extents.descent) / 2 +
|
|
||||||
font_extents.ascent;
|
|
||||||
|
|
||||||
if (window->keyboard_device) {
|
|
||||||
cairo_move_to(cr, x + 1, y + 1);
|
|
||||||
cairo_set_source_rgb(cr, 1, 1, 1);
|
|
||||||
cairo_show_text(cr, window->title);
|
|
||||||
cairo_move_to(cr, x, y);
|
|
||||||
cairo_set_source_rgb(cr, 0, 0, 0);
|
|
||||||
cairo_show_text(cr, window->title);
|
|
||||||
} else {
|
|
||||||
cairo_move_to(cr, x, y);
|
|
||||||
cairo_set_source_rgb(cr, 0.4, 0.4, 0.4);
|
|
||||||
cairo_show_text(cr, window->title);
|
|
||||||
}
|
|
||||||
|
|
||||||
cairo_destroy(cr);
|
cairo_destroy(cr);
|
||||||
}
|
}
|
||||||
@@ -1489,7 +1443,7 @@ frame_get_pointer_location(struct frame *frame, int32_t x, int32_t y)
|
|||||||
struct widget *widget = frame->widget;
|
struct widget *widget = frame->widget;
|
||||||
int vlocation, hlocation, location;
|
int vlocation, hlocation, location;
|
||||||
const int grip_size = 8;
|
const int grip_size = 8;
|
||||||
struct theme *t = &widget->window->display->theme;
|
struct theme *t = widget->window->display->theme;
|
||||||
|
|
||||||
if (x < t->margin)
|
if (x < t->margin)
|
||||||
hlocation = WINDOW_EXTERIOR;
|
hlocation = WINDOW_EXTERIOR;
|
||||||
@@ -3320,7 +3274,7 @@ display_create(int argc, char *argv[])
|
|||||||
|
|
||||||
create_cursors(d);
|
create_cursors(d);
|
||||||
|
|
||||||
display_render_theme(&d->theme);
|
d->theme = theme_create();
|
||||||
|
|
||||||
wl_list_init(&d->window_list);
|
wl_list_init(&d->window_list);
|
||||||
|
|
||||||
@@ -3363,7 +3317,7 @@ display_destroy(struct display *display)
|
|||||||
|
|
||||||
fini_xkb(display);
|
fini_xkb(display);
|
||||||
|
|
||||||
fini_theme(&display->theme);
|
theme_destroy(display->theme);
|
||||||
destroy_cursors(display);
|
destroy_cursors(display);
|
||||||
|
|
||||||
#ifdef HAVE_CAIRO_EGL
|
#ifdef HAVE_CAIRO_EGL
|
||||||
|
|||||||
Reference in New Issue
Block a user