On Wed, 20 Aug 2014 15:53:20 +0200 Jonny Lamb <jonny.l...@collabora.co.uk> wrote:
> Now the client can let us know where the panel is using > desktop_shell.set_panel_position, we can correctly calculate where to > put new views and how big maximized views should be. > --- > desktop-shell/shell.c | 173 > ++++++++++++++++++++++++++++++++++---------------- > 1 file changed, 120 insertions(+), 53 deletions(-) > > diff --git a/desktop-shell/shell.c b/desktop-shell/shell.c > index d307e48..e3abaad 100644 > --- a/desktop-shell/shell.c > +++ b/desktop-shell/shell.c > @@ -251,9 +251,10 @@ shell_fade_startup(struct desktop_shell *shell); > static struct shell_seat * > get_shell_seat(struct weston_seat *seat); > > -static int > -get_output_panel_height(struct desktop_shell *shell, > - struct weston_output *output); > +static void > +get_output_panel_size(struct desktop_shell *shell, > + struct weston_output *output, > + int *width, int *height); > > static void > shell_surface_update_child_surface_layers(struct shell_surface *shsurf); > @@ -351,24 +352,85 @@ shell_grab_start(struct shell_grab *grab, > } > } > > -static int > -get_output_panel_height(struct desktop_shell *shell, > - struct weston_output *output) > +static void > +get_output_panel_size(struct desktop_shell *shell, > + struct weston_output *output, > + int *width, > + int *height) > { > struct weston_view *view; > - int panel_height = 0; > + > + *width = 0; > + *height = 0; > > if (!output) > - return 0; > + return; > > wl_list_for_each(view, &shell->panel_layer.view_list.link, > layer_link.link) { > - if (view->surface->output == output) { > - panel_height = view->surface->height; > + float x, y; > + > + if (view->surface->output != output) > + continue; > + > + switch (shell->panel_position) { > + case DESKTOP_SHELL_PANEL_POSITION_TOP: > + case DESKTOP_SHELL_PANEL_POSITION_BOTTOM: > + > + weston_view_to_global_float(view, > + view->surface->width, 0, > + &x, &y); > + > + *width = (int) x; > + *height = view->surface->height + (int) y; > + return; > + > + case DESKTOP_SHELL_PANEL_POSITION_LEFT: > + case DESKTOP_SHELL_PANEL_POSITION_RIGHT: > + weston_view_to_global_float(view, > + 0, view->surface->height, > + &x, &y); > + > + *width = view->surface->width + (int) x; > + *height = (int) y; > + return; > + > + default: > + /* we've already set width and height to > + * fallback values. */ > break; > } > } > > - return panel_height; > + /* the correct view wasn't found */ > +} > + > +static void > +get_output_work_area(struct desktop_shell *shell, > + struct weston_output *output, > + pixman_rectangle32_t *area) > +{ > + int32_t panel_width = 0, panel_height = 0; > + > + area->x = 0; > + area->y = 0; > + > + get_output_panel_size(shell, output, &panel_width, &panel_height); > + > + switch (shell->panel_position) { > + case DESKTOP_SHELL_PANEL_POSITION_TOP: > + default: > + area->y = panel_height; > + case DESKTOP_SHELL_PANEL_POSITION_BOTTOM: > + area->width = output->width; > + area->height = output->height - panel_height; > + break; > + case DESKTOP_SHELL_PANEL_POSITION_LEFT: > + area->x = panel_width; > + case DESKTOP_SHELL_PANEL_POSITION_RIGHT: > + area->width = output->width - panel_width; > + area->height = output->height; > + break; > + } > } > > static void > @@ -389,13 +451,13 @@ send_configure_for_surface(struct shell_surface *shsurf) > height = shsurf->output->height; > } else if (state->maximized) { > struct desktop_shell *shell; > - uint32_t panel_height = 0; > + pixman_rectangle32_t area; > > shell = shell_surface_get_shell(shsurf); > - panel_height = get_output_panel_height(shell, shsurf->output); > + get_output_work_area(shell, shsurf->output, &area); > > - width = shsurf->output->width; > - height = shsurf->output->height - panel_height; > + width = area.width; > + height = area.height; > } else { > width = 0; > height = 0; > @@ -1550,20 +1612,25 @@ constrain_position(struct weston_move_grab *move, int > *cx, int *cy) > { > struct shell_surface *shsurf = move->base.shsurf; > struct weston_pointer *pointer = move->base.grab.pointer; > - int x, y, panel_height, bottom; > + int x, y, panel_width, panel_height, bottom; > const int safety = 50; > > x = wl_fixed_to_int(pointer->x + move->dx); > y = wl_fixed_to_int(pointer->y + move->dy); > > - panel_height = get_output_panel_height(shsurf->shell, > - shsurf->surface->output); > - bottom = y + shsurf->geometry.height; > - if (bottom - panel_height < safety) > - y = panel_height + safety - shsurf->geometry.height; > + if (shsurf->shell->panel_position == DESKTOP_SHELL_PANEL_POSITION_TOP) { > + get_output_panel_size(shsurf->shell, shsurf->surface->output, > + &panel_width, &panel_height); > > - if (move->client_initiated && y + shsurf->geometry.y < panel_height) > - y = panel_height - shsurf->geometry.y; > + bottom = y + shsurf->geometry.height; > + if (bottom - panel_height < safety) > + y = panel_height + safety - > + shsurf->geometry.height; > + > + if (move->client_initiated && > + y + shsurf->geometry.y < panel_height) > + y = panel_height - shsurf->geometry.y; > + } > > *cx = x; > *cy = y; > @@ -4974,10 +5041,11 @@ weston_view_set_initial_position(struct weston_view > *view, > { > struct weston_compositor *compositor = shell->compositor; > int ix = 0, iy = 0; > - int range_x, range_y; > - int dx, dy, x, y, panel_height; > + int32_t range_x, range_y; > + int32_t dx, dy, x, y; > struct weston_output *output, *target_output = NULL; > struct weston_seat *seat; > + pixman_rectangle32_t area; > > /* As a heuristic place the new window on the same output as the > * pointer. Falling back to the output containing 0, 0. > @@ -5009,20 +5077,18 @@ weston_view_set_initial_position(struct weston_view > *view, > * If this is negative it means that the surface is bigger than > * output. > */ > - panel_height = get_output_panel_height(shell, target_output); > - range_x = target_output->width - view->surface->width; > - range_y = (target_output->height - panel_height) - > - view->surface->height; > + get_output_work_area(shell, target_output, &area); > + > + dx = area.x; > + dy = area.y; > + range_x = area.width - view->surface->width; > + range_y = area.height - view->surface->height; > > if (range_x > 0) > - dx = random() % range_x; > - else > - dx = 0; > + dx += random() % range_x; > > if (range_y > 0) > - dy = panel_height + random() % range_y; > - else > - dy = panel_height; > + dy += random() % range_y; > > x = target_output->x + dx; > y = target_output->y + dy; > @@ -5031,13 +5097,28 @@ weston_view_set_initial_position(struct weston_view > *view, > } > > static void > +set_maximized_position(struct desktop_shell *shell, > + struct shell_surface *shsurf) > +{ > + int32_t surf_x, surf_y; > + pixman_rectangle32_t area; > + > + /* use surface configure to set the geometry */ > + get_output_work_area(shell, shsurf->output, &area); > + surface_subsurfaces_boundingbox(shsurf->surface, > + &surf_x, &surf_y, NULL, NULL); > + > + weston_view_set_position(shsurf->view, > + area.x - surf_x, > + area.y - surf_y); > +} > + > +static void > map(struct desktop_shell *shell, struct shell_surface *shsurf, > int32_t sx, int32_t sy) > { > struct weston_compositor *compositor = shell->compositor; > struct weston_seat *seat; > - int panel_height = 0; > - int32_t surf_x, surf_y; > > /* initial positioning, see also configure() */ > switch (shsurf->type) { > @@ -5046,14 +5127,7 @@ map(struct desktop_shell *shell, struct shell_surface > *shsurf, > center_on_output(shsurf->view, > shsurf->fullscreen_output); > shell_map_fullscreen(shsurf); > } else if (shsurf->state.maximized) { > - /* use surface configure to set the geometry */ > - panel_height = get_output_panel_height(shell, > shsurf->output); > - surface_subsurfaces_boundingbox(shsurf->surface, > - &surf_x, &surf_y, NULL, > NULL); > - weston_view_set_position(shsurf->view, > - shsurf->output->x - surf_x, > - shsurf->output->y + > - panel_height - surf_y); > + set_maximized_position(shell, shsurf); > } else if (!shsurf->state.relative) { > weston_view_set_initial_position(shsurf->view, shell); > } > @@ -5126,7 +5200,6 @@ configure(struct desktop_shell *shell, struct > weston_surface *surface, > { > struct shell_surface *shsurf; > struct weston_view *view; > - int32_t mx, my, surf_x, surf_y; > > shsurf = get_shell_surface(surface); > > @@ -5135,13 +5208,7 @@ configure(struct desktop_shell *shell, struct > weston_surface *surface, > if (shsurf->state.fullscreen) > shell_configure_fullscreen(shsurf); > else if (shsurf->state.maximized) { > - /* setting x, y and using configure to change that geometry */ > - surface_subsurfaces_boundingbox(shsurf->surface, &surf_x, > &surf_y, > - NULL, NULL); > - mx = shsurf->output->x - surf_x; > - my = shsurf->output->y + > - get_output_panel_height(shell,shsurf->output) - surf_y; > - weston_view_set_position(shsurf->view, mx, my); > + set_maximized_position(shell, shsurf); > } else { > weston_view_set_position(shsurf->view, x, y); > } Hi, these 2 patches pushed, but I am still looking at 3/3. Thanks, pq _______________________________________________ wayland-devel mailing list wayland-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/wayland-devel