window.c: Don't put titlebars on menu windows
authorKristian Høgsberg <krh@bitplanet.net>
Thu, 24 Oct 2013 05:12:13 +0000 (22:12 -0700)
committerKristian Høgsberg <krh@bitplanet.net>
Thu, 24 Oct 2013 05:12:13 +0000 (22:12 -0700)
clients/window.c
shared/cairo-util.c
shared/cairo-util.h
shared/frame.c

index 3502a95..17d16ed 100644 (file)
@@ -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;
index 5b4b0ff..3948572 100644 (file)
@@ -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;
index a8eb874..cce7671 100644 (file)
@@ -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
index fc85950..956e104 100644 (file)
@@ -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;