<br><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div><div>
<br>
</div></div>Shouldn&#39;t we only update position when the user actually presses a<br>
key?  What if you&#39;re dumping a lot of data to the terminal?<br></blockquote><div><br>Yes, you are right. I know about this but never fixed it.<br> </div><blockquote class="gmail_quote" style="margin:0pt 0pt 0pt 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">


<div><br>
&gt;  void<br>
&gt; +window_set_text_cursor_position(struct window *window, int32_t x, int32_t y)<br>
&gt; +{<br>
&gt; +     struct text_cursor_position *text_cursor_position = window-&gt;display-&gt;text_cursor_position;<br>
<br>
</div>Break the line after &#39;=&#39;?<br></blockquote><div><br>Yes.<br> </div><blockquote class="gmail_quote" style="margin:0pt 0pt 0pt 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<div><br>
&gt; +     text_cursor_position_notify(text_cursor_position, window-&gt;surface, x, y);<br>
&gt; +}<br>
<br>
</div>Let&#39;s check for window-&gt;display-&gt;text_cursor_position == NULL so it<br>
will work even if the compositor doesn&#39;t have that extension.<br></blockquote><div><br>Ok.<br> </div><blockquote class="gmail_quote" style="margin:0pt 0pt 0pt 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">


<div><div><br>
&gt;<br>
&gt;  WL_EXPORT void<br>
&gt; +weston_text_cursor_position_notify(struct weston_surface *surface,<br>
&gt; +                                             int32_t x, int32_t y)<br>
&gt; +{<br>
&gt; +     struct weston_output *output;<br>
&gt; +     int32_t surface_x, surface_y;<br>
&gt; +     int32_t cur_pos_x, cur_pos_y;<br>
&gt; +<br>
&gt; +     weston_surface_to_global(surface, 0, 0, &amp;surface_x, &amp;surface_y);<br>
&gt; +<br>
&gt; +     cur_pos_x = surface_x + x;<br>
&gt; +     cur_pos_y = surface_y + y;<br>
<br>
</div></div>This should just be<br>
<br>
  weston_surface_to_global(surface, x, y, &amp;surface_x, &amp;surface_y);<br>
<br>
weston_surface_to_global() takes a coordinate in surface space (which<br>
x, y is) and translates that into global space.<br></blockquote><div><br>Please see v3 of this patch. v2 does not handle transformed surfaces correctly.<br> </div><blockquote class="gmail_quote" style="margin:0pt 0pt 0pt 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">


<div><br>
&gt; +     wl_list_for_each(output, &amp;surface-&gt;compositor-&gt;output_list, link)<br>
&gt; +             if (output-&gt;zoom.active &amp;&amp;<br>
&gt; +                 pixman_region32_contains_point(&amp;output-&gt;region,<br>
&gt; +                                                     cur_pos_x, cur_pos_y, NULL))<br>
&gt; +                     weston_output_update_zoom(output, cur_pos_x * 256, cur_pos_y * 256);<br>
<br>
</div>Use wl_fixed_from_int here.  Alternatively, just make the protocol<br>
take wl_fixed_t for x and y (and change the client to send wl_fixed_t<br>
x and y), and then use weston_surface_to_global_fixed().<br></blockquote><div><br>Ah, I did not realize this function exists.<br> </div><blockquote class="gmail_quote" style="margin:0pt 0pt 0pt 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">


<div><div><br>
&gt; +}<br>
&gt; +<br>
&gt; +WL_EXPORT void<br>
&gt;  weston_output_update_zoom(struct weston_output *output, wl_fixed_t fx, wl_fixed_t fy)<br>
&gt;  {<br>
&gt;       float ratio;<br>
&gt; @@ -2641,6 +2661,7 @@ weston_compositor_init(struct weston_compositor *ec, struct wl_display *display)<br>
&gt;       weston_layer_init(&amp;ec-&gt;cursor_layer, &amp;ec-&gt;fade_layer.link);<br>
&gt;<br>
&gt;       screenshooter_create(ec);<br>
&gt; +     text_cursor_position_notifier_create(ec);<br>
&gt;<br>
&gt;       ec-&gt;ping_handler = NULL;<br>
&gt;<br>
&gt; diff --git a/src/compositor.h b/src/compositor.h<br>
&gt; index 7af423d..59a97a7 100644<br>
&gt; --- a/src/compositor.h<br>
&gt; +++ b/src/compositor.h<br>
&gt; @@ -554,6 +554,8 @@ weston_compositor_shutdown(struct weston_compositor *ec);<br>
&gt;  void<br>
&gt;  weston_output_update_zoom(struct weston_output *output, int x, int y);<br>
&gt;  void<br>
&gt; +weston_text_cursor_position_notify(struct weston_surface *surface, int x, int y);<br>
&gt; +void<br>
&gt;  weston_output_update_matrix(struct weston_output *output);<br>
&gt;  void<br>
&gt;  weston_output_move(struct weston_output *output, int x, int y);<br>
&gt; @@ -589,6 +591,9 @@ tty_activate_vt(struct tty *tty, int vt);<br>
&gt;  void<br>
&gt;  screenshooter_create(struct weston_compositor *ec);<br>
&gt;<br>
&gt; +void<br>
&gt; +text_cursor_position_notifier_create(struct weston_compositor *ec);<br>
&gt; +<br>
&gt;  struct weston_process;<br>
&gt;  typedef void (*weston_process_cleanup_func_t)(struct weston_process *process,<br>
&gt;                                           int status);<br>
&gt; diff --git a/src/text-cursor-position.c b/src/text-cursor-position.c<br>
&gt; new file mode 100644<br>
&gt; index 0000000..2c07dca<br>
&gt; --- /dev/null<br>
&gt; +++ b/src/text-cursor-position.c<br>
&gt; @@ -0,0 +1,86 @@<br>
&gt; +/*<br>
&gt; + * Copyright © 2012 Scott Moreau<br>
&gt; + *<br>
&gt; + * Permission to use, copy, modify, distribute, and sell this software and<br>
&gt; + * its documentation for any purpose is hereby granted without fee, provided<br>
&gt; + * that the above copyright notice appear in all copies and that both that<br>
&gt; + * copyright notice and this permission notice appear in supporting<br>
&gt; + * documentation, and that the name of the copyright holders not be used in<br>
&gt; + * advertising or publicity pertaining to distribution of the software<br>
&gt; + * without specific, written prior permission.  The copyright holders make<br>
&gt; + * no representations about the suitability of this software for any<br>
&gt; + * purpose.  It is provided &quot;as is&quot; without express or implied warranty.<br>
&gt; + *<br>
&gt; + * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS<br>
&gt; + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND<br>
&gt; + * FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY<br>
&gt; + * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER<br>
&gt; + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF<br>
&gt; + * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN<br>
&gt; + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.<br>
&gt; + */<br>
&gt; +<br>
&gt; +#include &lt;stdlib.h&gt;<br>
&gt; +<br>
&gt; +#include &quot;compositor.h&quot;<br>
&gt; +#include &quot;text-cursor-position-server-protocol.h&quot;<br>
&gt; +<br>
&gt; +struct text_cursor_position {<br>
&gt; +     struct wl_object base;<br>
&gt; +     struct weston_compositor *ec;<br>
&gt; +     struct wl_global *global;<br>
&gt; +     struct wl_listener destroy_listener;<br>
&gt; +};<br>
&gt; +<br>
&gt; +static void<br>
&gt; +text_cursor_position_notify(struct wl_client *client,<br>
&gt; +                         struct wl_resource *resource,<br>
&gt; +                         struct wl_resource *surface_resource,<br>
&gt; +                         uint32_t x, uint32_t y)<br>
&gt; +{<br>
&gt; +     weston_text_cursor_position_notify((struct weston_surface *) surface_resource, x, y);<br>
&gt; +}<br>
&gt; +<br>
&gt; +struct text_cursor_position_interface text_cursor_position_implementation = {<br>
&gt; +     text_cursor_position_notify<br>
&gt; +};<br>
&gt; +<br>
&gt; +static void<br>
&gt; +bind_text_cursor_position(struct wl_client *client,<br>
&gt; +          void *data, uint32_t version, uint32_t id)<br>
&gt; +{<br>
&gt; +     wl_client_add_object(client, &amp;text_cursor_position_interface,<br>
&gt; +                          &amp;text_cursor_position_implementation, id, data);<br>
&gt; +}<br>
&gt; +<br>
&gt; +static void<br>
&gt; +text_cursor_position_notifier_destroy(struct wl_listener *listener, void *data)<br>
&gt; +{<br>
&gt; +     struct text_cursor_position *text_cursor_position =<br>
&gt; +             container_of(listener, struct text_cursor_position, destroy_listener);<br>
&gt; +<br>
&gt; +     wl_display_remove_global(text_cursor_position-&gt;ec-&gt;wl_display, text_cursor_position-&gt;global);<br>
&gt; +     free(text_cursor_position);<br>
&gt; +}<br>
&gt; +<br>
&gt; +void<br>
&gt; +text_cursor_position_notifier_create(struct weston_compositor *ec)<br>
&gt; +{<br>
&gt; +     struct text_cursor_position *text_cursor_position;<br>
&gt; +<br>
&gt; +     text_cursor_position = malloc(sizeof *text_cursor_position);<br>
&gt; +     if (text_cursor_position == NULL)<br>
&gt; +             return;<br>
&gt; +<br>
&gt; +     text_cursor_position-&gt;base.interface = &amp;text_cursor_position_interface;<br>
&gt; +     text_cursor_position-&gt;base.implementation =<br>
&gt; +             (void(**)(void)) &amp;text_cursor_position_implementation;<br>
&gt; +     text_cursor_position-&gt;ec = ec;<br>
&gt; +<br>
&gt; +     text_cursor_position-&gt;global = wl_display_add_global(ec-&gt;wl_display,<br>
&gt; +                                             &amp;text_cursor_position_interface,<br>
&gt; +                                             text_cursor_position, bind_text_cursor_position);<br>
&gt; +<br>
&gt; +     text_cursor_position-&gt;destroy_listener.notify = text_cursor_position_notifier_destroy;<br>
&gt; +     wl_signal_add(&amp;ec-&gt;destroy_signal, &amp;text_cursor_position-&gt;destroy_listener);<br>
&gt; +}<br><br></div></div></blockquote><div> </div><div>Please see v3 of this patch.<br><br><br>Scott <br></div></div><br>