diff options
-rw-r--r-- | clients/window.c | 2 | ||||
-rw-r--r-- | shared/cairo-util.c | 80 | ||||
-rw-r--r-- | shared/cairo-util.h | 3 | ||||
-rw-r--r-- | shared/frame.c | 40 |
4 files changed, 75 insertions, 50 deletions
diff --git a/clients/window.c b/clients/window.c index 3502a95f..17d16ed4 100644 --- a/clients/window.c +++ b/clients/window.c @@ -4456,7 +4456,7 @@ window_show_menu(struct display *display, window_set_buffer_scale (menu->window, window_get_buffer_scale (parent)); window_set_buffer_transform (menu->window, window_get_buffer_transform (parent)); menu->frame = frame_create(window->display->theme, 0, 0, - FRAME_BUTTON_NONE, "Menu"); + FRAME_BUTTON_NONE, NULL); menu->entries = entries; menu->count = count; menu->release_count = 0; diff --git a/shared/cairo-util.c b/shared/cairo-util.c index 5b4b0ff3..39485729 100644 --- a/shared/cairo-util.c +++ b/shared/cairo-util.c @@ -418,7 +418,7 @@ theme_render_frame(struct theme *t, cairo_text_extents_t extents; cairo_font_extents_t font_extents; cairo_surface_t *source; - int x, y, margin; + int x, y, margin, top_margin; cairo_set_operator(cr, CAIRO_OPERATOR_SOURCE); cairo_set_source_rgba(cr, 0, 0, 0, 0); @@ -439,40 +439,47 @@ theme_render_frame(struct theme *t, else source = t->inactive_frame; + if (title) + top_margin = t->titlebar_height; + else + top_margin = t->width; + tile_source(cr, source, margin, margin, width - margin * 2, height - margin * 2, - t->width, t->titlebar_height); - - cairo_rectangle (cr, margin + t->width, margin, - width - (margin + t->width) * 2, - t->titlebar_height - t->width); - cairo_clip(cr); - - 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 = 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); + t->width, top_margin); + + if (title) { + cairo_rectangle (cr, margin + t->width, margin, + width - (margin + t->width) * 2, + t->titlebar_height - t->width); + cairo_clip(cr); + + 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 = 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); + } } } @@ -482,10 +489,15 @@ theme_get_location(struct theme *t, int x, int y, { int vlocation, hlocation, location; const int grip_size = 8; - int margin; + int margin, top_margin; margin = (flags & THEME_FRAME_MAXIMIZED) ? 0 : t->margin; + if (flags & THEME_FRAME_NO_TITLE) + top_margin = t->width; + else + top_margin = t->titlebar_height; + if (x < margin) hlocation = THEME_LOCATION_EXTERIOR; else if (margin <= x && x < margin + grip_size) @@ -512,7 +524,7 @@ theme_get_location(struct theme *t, int x, int y, if (location & THEME_LOCATION_EXTERIOR) location = THEME_LOCATION_EXTERIOR; if (location == THEME_LOCATION_INTERIOR && - y < margin + t->titlebar_height) + y < margin + top_margin) location = THEME_LOCATION_TITLEBAR; else if (location == THEME_LOCATION_INTERIOR) location = THEME_LOCATION_CLIENT_AREA; diff --git a/shared/cairo-util.h b/shared/cairo-util.h index a8eb8741..cce76710 100644 --- a/shared/cairo-util.h +++ b/shared/cairo-util.h @@ -60,7 +60,8 @@ theme_destroy(struct theme *t); enum { THEME_FRAME_ACTIVE = 1, - THEME_FRAME_MAXIMIZED, + THEME_FRAME_MAXIMIZED = 2, + THEME_FRAME_NO_TITLE = 4 }; void diff --git a/shared/frame.c b/shared/frame.c index fc859507..956e104e 100644 --- a/shared/frame.c +++ b/shared/frame.c @@ -291,11 +291,14 @@ frame_create(struct theme *t, int32_t width, int32_t height, uint32_t buttons, wl_list_init(&frame->pointers); wl_list_init(&frame->touches); - button = frame_button_create(frame, DATADIR "/weston/icon_window.png", - FRAME_STATUS_MENU, - FRAME_BUTTON_CLICK_DOWN); - if (!button) - goto free_frame; + if (title) { + button = frame_button_create(frame, + DATADIR "/weston/icon_window.png", + FRAME_STATUS_MENU, + FRAME_BUTTON_CLICK_DOWN); + if (!button) + goto free_frame; + } if (buttons & FRAME_BUTTON_CLOSE) { button = frame_button_create(frame, @@ -400,15 +403,20 @@ void frame_resize_inside(struct frame *frame, int32_t width, int32_t height) { struct theme *t = frame->theme; - int decoration_width, decoration_height; + int decoration_width, decoration_height, titlebar_height; + + if (frame->title) + titlebar_height = t->titlebar_height; + else + titlebar_height = t->width; if (frame->flags & FRAME_FLAG_MAXIMIZED) { decoration_width = t->width * 2; - decoration_height = t->width + t->titlebar_height; + decoration_height = t->width + titlebar_height; } else { decoration_width = (t->width + t->margin) * 2; decoration_height = t->width + - t->titlebar_height + t->margin * 2; + titlebar_height + t->margin * 2; } frame_resize(frame, width + decoration_width, @@ -432,18 +440,23 @@ frame_refresh_geometry(struct frame *frame) { struct frame_button *button; struct theme *t = frame->theme; - int x_l, x_r, y, w, h; + int x_l, x_r, y, w, h, titlebar_height; int32_t decoration_width, decoration_height; if (!frame->geometry_dirty) return; + if (frame->title) + titlebar_height = t->titlebar_height; + else + titlebar_height = t->width; + if (frame->flags & FRAME_FLAG_MAXIMIZED) { decoration_width = t->width * 2; - decoration_height = t->width + t->titlebar_height; + decoration_height = t->width + titlebar_height; frame->interior.x = t->width; - frame->interior.y = t->titlebar_height; + frame->interior.y = titlebar_height; frame->interior.width = frame->width - decoration_width; frame->interior.height = frame->height - decoration_height; @@ -451,11 +464,10 @@ frame_refresh_geometry(struct frame *frame) frame->shadow_margin = 0; } else { decoration_width = (t->width + t->margin) * 2; - decoration_height = t->width + - t->titlebar_height + t->margin * 2; + decoration_height = t->width + titlebar_height + t->margin * 2; frame->interior.x = t->width + t->margin; - frame->interior.y = t->titlebar_height + t->margin; + frame->interior.y = titlebar_height + t->margin; frame->interior.width = frame->width - decoration_width; frame->interior.height = frame->height - decoration_height; |