On Mon, Aug 13, 2012 at 02:07:52PM +0100, Rob Bradford wrote:
> From: Rob Bradford <[email protected]>
> 
> Place the window in a random position on the output where the first seat with
> a pointer is. When calculating the random position limit the range to the
> area that would ensure that the whole surface is visible. If the surface is
> larger than the output then the surface is placed at the origin of the
> output.

That's a nice improvement indeed.  I've committed it since it's
obviously a step forward, but I think we could use the input region
extents for placement.  There's been talk of a outline region or such,
something to define the "edge" of the window for snapping and
placement, but I haven't yet been able to think of a case where that's
different from the input region.  So we can just use the input region
for now, and if a case for an outline region comes up, we can add that
then.

Kristian

> This change is based on the good work of Scott Moreau <[email protected]>
> ---
>  src/shell.c | 65 
> +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--
>  1 file changed, 63 insertions(+), 2 deletions(-)
> 
> diff --git a/src/shell.c b/src/shell.c
> index 87e688c..df4636e 100644
> --- a/src/shell.c
> +++ b/src/shell.c
> @@ -2587,6 +2587,68 @@ center_on_output(struct weston_surface *surface, 
> struct weston_output *output)
>  }
>  
>  static void
> +weston_surface_set_initial_position (struct weston_surface *surface,
> +                                  struct desktop_shell *shell)
> +{
> +     struct weston_compositor *compositor = shell->compositor;
> +     int ix = 0, iy = 0;
> +     int range_x, range_y;
> +     int dx, dy, x, y, panel_height;
> +     struct weston_output *output, *target_output = NULL;
> +     struct weston_seat *seat;
> +
> +     /* As a heuristic place the new window on the same output as the
> +      * pointer. Falling back to the output containing 0, 0.
> +      *
> +      * TODO: Do something clever for touch too?
> +      */
> +     wl_list_for_each(seat, &compositor->seat_list, link){
> +             if (seat->has_pointer) {
> +                     ix = wl_fixed_to_int(seat->pointer.x);
> +                     iy = wl_fixed_to_int(seat->pointer.y);
> +                     break;
> +             }
> +     }
> +
> +     wl_list_for_each(output, &compositor->output_list, link){
> +             if (pixman_region32_contains_point(&output->region, ix, iy, 
> NULL)){
> +                     target_output = output;
> +                     break;
> +             }
> +     }
> +
> +     if (!target_output) {
> +             weston_surface_set_position(surface, 10 + random() % 400,
> +                                        10 + random() % 400);
> +             return;
> +     }
> +
> +     /* Valid range within output where the surface will still be onscreen.
> +      * 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->current->width - surface->geometry.width;
> +     range_y = (target_output->current->height - panel_height) -
> +               surface->geometry.height;
> +
> +     if (range_x < 0)
> +             dx = 0;
> +     else
> +             dx = random() % range_x;
> +
> +     if (range_y < 0)
> +             dy = panel_height;
> +     else
> +             dy = panel_height + random() % range_y;
> +
> +     x = target_output->x + dx;
> +     y = target_output->y + dy;
> +
> +     weston_surface_set_position (surface, x, y);
> +}
> +
> +static void
>  map(struct desktop_shell *shell, struct weston_surface *surface,
>      int32_t width, int32_t height, int32_t sx, int32_t sy)
>  {
> @@ -2605,8 +2667,7 @@ map(struct desktop_shell *shell, struct weston_surface 
> *surface,
>       /* initial positioning, see also configure() */
>       switch (surface_type) {
>       case SHELL_SURFACE_TOPLEVEL:
> -             weston_surface_set_position(surface, 10 + random() % 400,
> -                                         10 + random() % 400);
> +             weston_surface_set_initial_position(surface, shell);
>               break;
>       case SHELL_SURFACE_FULLSCREEN:
>               center_on_output(surface, shsurf->fullscreen_output);
> -- 
> 1.7.11.2
> 
> _______________________________________________
> wayland-devel mailing list
> [email protected]
> http://lists.freedesktop.org/mailman/listinfo/wayland-devel
_______________________________________________
wayland-devel mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/wayland-devel

Reply via email to