On Fri, Sep 28, 2012 at 02:45:06AM -0600, Scott Moreau wrote:
> Add THEME_FRAME_MAXIMIZED flag so the theming system can know not to draw
> shadows for maximized windows. This allows maximized surfaces' content to be
> sized and placed in a more expectable fashion.
> 
> ---
> 
> >On Tue, Aug 07, 2012 at 06:16:14AM -0600, Scott Moreau wrote:
> >> This effectively fixes a bug where maximized windows appear to not 
> >> maximize fully
> >> bacause of the shadow margin. Instead, we maximize the window to the input 
> >> region.
> >> ---
> >>
> >> v3:
> >>
> >> * Applied the same logic to both instances of theme_get_location() so the 
> >> resize
> >> cursors show properly for maximized windows
> >> * Fixed window-manager.c flags
> >> * Fixed a small indentation mishap
> >> * Simplified the assignment case in theme_get_location()
> >
> >What we need here is to tell the theme code "draw maximized window
> >decorations" not a "no shadow" flag.
> >
> >Kristian
> 
> I agree, this makes more sense.
> 
> One thing I was thinking about is what to do in the case where a
> window has a maximum (or minimum?) size that is inconsistent with
> the maximized area determined by the compositor. For instance,
> weston-terminal snaps to character cell increments and may not
> always agree with the maximized size. Should the toolkit go ahead
> and resize the decorations to the mazimized size always, centering
> the client content if it doesn't match and just solid color the rest
> (black)? Should a client be expected to resize it's content to the
> lesser maximized diminsion (width or height) if it wants to maintain
> a certain aspect ratio? For instance, gears rendered width and
> height are interdependent. I guess I'm wondering what should be
> responsible for handling this, the toolkit or client.  Another
> consideration is, do we want to handle fullscreen windows in a
> similar way?

That looks good, applied.  As for resizing constraints, the
application should just disable those when maximized or fullscreen and
fill the extra space somehow.  I fixed terminal to not adjust the resize
in case of maximized as well.

Kristian

> v4:
> 
> * Changed THEME_FRAME_NO_SHADOW to THEME_FRAME_MAXIMIZED.
> * Removed the opacity flag value change.
> 
> 
>  clients/window.c              | 75 
> +++++++++++++++++++++++++++++--------------
>  shared/cairo-util.c           | 51 +++++++++++++++++------------
>  shared/cairo-util.h           |  7 ++--
>  src/xwayland/window-manager.c |  4 +--
>  4 files changed, 88 insertions(+), 49 deletions(-)
> 
> diff --git a/clients/window.c b/clients/window.c
> index f3b61de..41f9d2c 100644
> --- a/clients/window.c
> +++ b/clients/window.c
> @@ -1381,9 +1381,37 @@ frame_resize_handler(struct widget *widget,
>       struct theme *t = display->theme;
>       int x_l, x_r, y, w, h;
>       int decoration_width, decoration_height;
> -     int opaque_margin;
> +     int opaque_margin, shadow_margin;
>  
> -     if (widget->window->type != TYPE_FULLSCREEN) {
> +     switch (widget->window->type) {
> +     case TYPE_FULLSCREEN:
> +             decoration_width = 0;
> +             decoration_height = 0;
> +
> +             allocation.x = 0;
> +             allocation.y = 0;
> +             allocation.width = width;
> +             allocation.height = height;
> +             opaque_margin = 0;
> +
> +             wl_list_for_each(button, &frame->buttons_list, link)
> +                     button->widget->opaque = 1;
> +             break;
> +     case TYPE_MAXIMIZED:
> +             decoration_width = t->width * 2;
> +             decoration_height = t->width + t->titlebar_height;
> +
> +             allocation.x = t->width;
> +             allocation.y = t->titlebar_height;
> +             allocation.width = width - decoration_width;
> +             allocation.height = height - decoration_height;
> +
> +             opaque_margin = 0;
> +
> +             wl_list_for_each(button, &frame->buttons_list, link)
> +                     button->widget->opaque = 0;
> +             break;
> +     default:
>               decoration_width = (t->width + t->margin) * 2;
>               decoration_height = t->width +
>                       t->titlebar_height + t->margin * 2;
> @@ -1397,18 +1425,7 @@ frame_resize_handler(struct widget *widget,
>  
>               wl_list_for_each(button, &frame->buttons_list, link)
>                       button->widget->opaque = 0;
> -     } else {
> -             decoration_width = 0;
> -             decoration_height = 0;
> -
> -             allocation.x = 0;
> -             allocation.y = 0;
> -             allocation.width = width;
> -             allocation.height = height;
> -             opaque_margin = 0;
> -
> -             wl_list_for_each(button, &frame->buttons_list, link)
> -                     button->widget->opaque = 1;
> +             break;
>       }
>  
>       widget_set_allocation(child, allocation.x, allocation.y,
> @@ -1423,13 +1440,15 @@ frame_resize_handler(struct widget *widget,
>       width = child->allocation.width + decoration_width;
>       height = child->allocation.height + decoration_height;
>  
> +     shadow_margin = widget->window->type == TYPE_MAXIMIZED ? 0 : t->margin;
> +
>       if (widget->window->type != TYPE_FULLSCREEN) {
>               widget->window->input_region =
>                       wl_compositor_create_region(display->compositor);
>               wl_region_add(widget->window->input_region,
> -                           t->margin, t->margin,
> -                           width - 2 * t->margin,
> -                           height - 2 * t->margin);
> +                           shadow_margin, shadow_margin,
> +                           width - 2 * shadow_margin,
> +                           height - 2 * shadow_margin);
>       }
>  
>       widget_set_allocation(widget, 0, 0, width, height);
> @@ -1444,9 +1463,9 @@ frame_resize_handler(struct widget *widget,
>       }
>  
>       /* frame internal buttons */
> -     x_r = frame->widget->allocation.width - t->width - t->margin;
> -     x_l = t->width + t->margin;
> -     y = t->width + t->margin;
> +     x_r = frame->widget->allocation.width - t->width - shadow_margin;
> +     x_l = t->width + shadow_margin;
> +     y = t->width + shadow_margin;
>       wl_list_for_each(button, &frame->buttons_list, link) {
>               const int button_padding = 4;
>               w = cairo_image_surface_get_width(button->icon);
> @@ -1673,6 +1692,8 @@ frame_redraw_handler(struct widget *widget, void *data)
>  
>       if (window->focus_count)
>               flags |= THEME_FRAME_ACTIVE;
> +     if (window->type == TYPE_MAXIMIZED)
> +             flags |= THEME_FRAME_MAXIMIZED;
>       theme_render_frame(t, cr, widget->allocation.width,
>                          widget->allocation.height, window->title, flags);
>  
> @@ -1683,11 +1704,14 @@ static int
>  frame_get_pointer_image_for_location(struct frame *frame, struct input 
> *input)
>  {
>       struct theme *t = frame->widget->window->display->theme;
> +     struct window *window = frame->widget->window;
>       int location;
>  
>       location = theme_get_location(t, input->sx, input->sy,
>                                     frame->widget->allocation.width,
> -                                   frame->widget->allocation.height);
> +                                   frame->widget->allocation.height,
> +                                   window->type == TYPE_MAXIMIZED ?
> +                                   THEME_FRAME_MAXIMIZED : 0);
>  
>       switch (location) {
>       case THEME_LOCATION_RESIZING_TOP:
> @@ -1794,7 +1818,9 @@ frame_button_handler(struct widget *widget,
>  
>       location = theme_get_location(display->theme, input->sx, input->sy,
>                                     frame->widget->allocation.width,
> -                                   frame->widget->allocation.height);
> +                                   frame->widget->allocation.height,
> +                                   window->type == TYPE_MAXIMIZED ?
> +                                   THEME_FRAME_MAXIMIZED : 0);
>  
>       if (window->display->shell && button == BTN_LEFT &&
>           state == WL_POINTER_BUTTON_STATE_PRESSED) {
> @@ -1884,11 +1910,12 @@ frame_set_child_size(struct widget *widget, int 
> child_width, int child_height)
>       struct theme *t = display->theme;
>       int decoration_width, decoration_height;
>       int width, height;
> +     int margin = widget->window->type == TYPE_MAXIMIZED ? 0 : t->margin;
>  
>       if (widget->window->type != TYPE_FULLSCREEN) {
> -             decoration_width = (t->width + t->margin) * 2;
> +             decoration_width = (t->width + margin) * 2;
>               decoration_height = t->width +
> -                     t->titlebar_height + t->margin * 2;
> +                     t->titlebar_height + margin * 2;
>  
>               width = child_width + decoration_width;
>               height = child_height + decoration_height;
> diff --git a/shared/cairo-util.c b/shared/cairo-util.c
> index c64ace2..360099e 100644
> --- a/shared/cairo-util.c
> +++ b/shared/cairo-util.c
> @@ -373,23 +373,28 @@ theme_destroy(struct theme *t)
>  }
>  
>  void
> -theme_render_frame(struct theme *t, 
> +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;
> +     int x, y, margin;
>  
>       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_MAXIMIZED)
> +             margin = 0;
> +     else {
> +             cairo_set_source_rgba(cr, 0, 0, 0, 0.45);
> +             tile_mask(cr, t->shadow,
> +                       2, 2, width + 8, height + 8,
> +                       64, 64);
> +             margin = t->margin;
> +     }
>  
>       if (flags & THEME_FRAME_ACTIVE)
>               source = t->active_frame;
> @@ -397,12 +402,12 @@ theme_render_frame(struct theme *t,
>               source = t->inactive_frame;
>  
>       tile_source(cr, source,
> -                 t->margin, t->margin,
> -                 width - t->margin * 2, height - t->margin * 2,
> +                 margin, margin,
> +                 width - margin * 2, height - margin * 2,
>                   t->width, t->titlebar_height);
>  
> -     cairo_rectangle (cr, t->margin + t->width, t->margin,
> -                      width - (t->margin + t->width) * 2,
> +     cairo_rectangle (cr, margin + t->width, margin,
> +                      width - (margin + t->width) * 2,
>                        t->titlebar_height - t->width);
>       cairo_clip(cr);
>  
> @@ -414,7 +419,7 @@ theme_render_frame(struct theme *t,
>       cairo_text_extents(cr, title, &extents);
>       cairo_font_extents (cr, &font_extents);
>       x = (width - extents.width) / 2;
> -     y = t->margin +
> +     y = margin +
>               (t->titlebar_height -
>                font_extents.ascent - font_extents.descent) / 2 +
>               font_extents.ascent;
> @@ -434,29 +439,33 @@ theme_render_frame(struct theme *t,
>  }
>  
>  enum theme_location
> -theme_get_location(struct theme *t, int x, int y, int width, int height)
> +theme_get_location(struct theme *t, int x, int y,
> +                             int width, int height, int flags)
>  {
>       int vlocation, hlocation, location;
>       const int grip_size = 8;
> +     int margin;
> +
> +     margin = (flags & THEME_FRAME_MAXIMIZED) ? 0 : t->margin;
>  
> -     if (x < t->margin)
> +     if (x < margin)
>               hlocation = THEME_LOCATION_EXTERIOR;
> -     else if (t->margin <= x && x < t->margin + grip_size)
> +     else if (margin <= x && x < margin + grip_size)
>               hlocation = THEME_LOCATION_RESIZING_LEFT;
> -     else if (x < width - t->margin - grip_size)
> +     else if (x < width - margin - grip_size)
>               hlocation = THEME_LOCATION_INTERIOR;
> -     else if (x < width - t->margin)
> +     else if (x < width - margin)
>               hlocation = THEME_LOCATION_RESIZING_RIGHT;
>       else
>               hlocation = THEME_LOCATION_EXTERIOR;
>  
> -     if (y < t->margin)
> +     if (y < margin)
>               vlocation = THEME_LOCATION_EXTERIOR;
> -     else if (t->margin <= y && y < t->margin + grip_size)
> +     else if (margin <= y && y < margin + grip_size)
>               vlocation = THEME_LOCATION_RESIZING_TOP;
> -     else if (y < height - t->margin - grip_size)
> +     else if (y < height - margin - grip_size)
>               vlocation = THEME_LOCATION_INTERIOR;
> -     else if (y < height - t->margin)
> +     else if (y < height - margin)
>               vlocation = THEME_LOCATION_RESIZING_BOTTOM;
>       else
>               vlocation = THEME_LOCATION_EXTERIOR;
> @@ -465,7 +474,7 @@ theme_get_location(struct theme *t, int x, int y, int 
> width, int height)
>       if (location & THEME_LOCATION_EXTERIOR)
>               location = THEME_LOCATION_EXTERIOR;
>       if (location == THEME_LOCATION_INTERIOR &&
> -         y < t->margin + t->titlebar_height)
> +         y < margin + t->titlebar_height)
>               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 2fec389..3a760a4 100644
> --- a/shared/cairo-util.h
> +++ b/shared/cairo-util.h
> @@ -58,7 +58,10 @@ theme_create(void);
>  void
>  theme_destroy(struct theme *t);
>  
> -#define THEME_FRAME_ACTIVE 1
> +enum {
> +     THEME_FRAME_ACTIVE = 1,
> +     THEME_FRAME_MAXIMIZED,
> +};
>  
>  void
>  theme_render_frame(struct theme *t, 
> @@ -82,6 +85,6 @@ enum theme_location {
>  };
>  
>  enum theme_location
> -theme_get_location(struct theme *t, int x, int y, int width, int height);
> +theme_get_location(struct theme *t, int x, int y, int width, int height, int 
> flags);
>  
>  #endif
> diff --git a/src/xwayland/window-manager.c b/src/xwayland/window-manager.c
> index 65eb11a..063460f 100644
> --- a/src/xwayland/window-manager.c
> +++ b/src/xwayland/window-manager.c
> @@ -1009,7 +1009,7 @@ weston_wm_destroy_cursors(struct weston_wm *wm)
>  static int
>  get_cursor_for_location(struct theme *t, int width, int height, int x, int y)
>  {
> -     int location = theme_get_location(t, x, y, width, height);
> +     int location = theme_get_location(t, x, y, width, height, 0);
>  
>       switch (location) {
>               case THEME_LOCATION_RESIZING_TOP:
> @@ -1076,7 +1076,7 @@ weston_wm_handle_button(struct weston_wm *wm, 
> xcb_generic_event_t *event)
>               location = theme_get_location(t,
>                                             button->event_x,
>                                             button->event_y,
> -                                           width, height);
> +                                           width, height, 0);
>  
>               switch (location) {
>               case THEME_LOCATION_TITLEBAR:
> -- 
> 1.7.11.4
> 
> _______________________________________________
> wayland-devel mailing list
> wayland-devel@lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/wayland-devel
_______________________________________________
wayland-devel mailing list
wayland-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/wayland-devel

Reply via email to