From: Jan Arne Petersen <[email protected]>

Signed-off-by: Jan Arne Petersen <[email protected]>
---
 protocol/input-method.xml | 10 ++++++++++
 src/input-panel.c         | 37 ++++++++++++++++++++++++-------------
 2 files changed, 34 insertions(+), 13 deletions(-)

diff --git a/protocol/input-method.xml b/protocol/input-method.xml
index f0c1184..5666e7b 100644
--- a/protocol/input-method.xml
+++ b/protocol/input-method.xml
@@ -269,5 +269,15 @@
         window hwne a text model is active.
       </description>
     </request>
+
+    <event name="cursor_rectangle">
+      <description summary="cursor rectangle">
+        Notify when the cursor rectangle relative to the input panel surface 
change.
+      </description>
+      <arg name="x" type="int"/>
+      <arg name="y" type="int"/>
+      <arg name="width" type="int"/>
+      <arg name="height" type="int"/>
+    </event>
   </interface>
 </protocol>
diff --git a/src/input-panel.c b/src/input-panel.c
index 711c164..70b1125 100644
--- a/src/input-panel.c
+++ b/src/input-panel.c
@@ -138,17 +138,19 @@ hide_input_panels(struct wl_listener *listener, void 
*data)
 }
 
 static void
-overlay_panel_get_position(struct input_panel_surface *surface,
-                          float *x, float *y)
+text_input_surface_get_cursor_rectangle(struct input_panel_surface *surface,
+                                       float *x1, float *y1,
+                                       float *x2, float *y2)
 {
        struct input_panel *input_panel = surface->input_panel;
 
-       if (!surface->overlay_panel) {
+       if (!input_panel->text_input.surface || 
!weston_surface_is_mapped(input_panel->text_input.surface))
                return;
-       }
 
-       *x = input_panel->text_input.surface->geometry.x + 
input_panel->text_input.cursor_rectangle.x2;
-       *y = input_panel->text_input.surface->geometry.y + 
input_panel->text_input.cursor_rectangle.y2;
+       *x1 = input_panel->text_input.surface->geometry.x + 
input_panel->text_input.cursor_rectangle.x1;
+       *y1 = input_panel->text_input.surface->geometry.y + 
input_panel->text_input.cursor_rectangle.y1;
+       *x2 = input_panel->text_input.surface->geometry.x + 
input_panel->text_input.cursor_rectangle.x2;
+       *y2 = input_panel->text_input.surface->geometry.y + 
input_panel->text_input.cursor_rectangle.y2;
 }
 
 static void
@@ -158,19 +160,24 @@ update_input_panels(struct wl_listener *listener, void 
*data)
                container_of(listener, struct input_panel,
                             update_input_panel_listener);
        struct input_panel_surface *surface, *next;
-       float x = 0, y = 0;
+       float x1 = 0, y1 = 0, x2 = 0, y2 = 0;
 
        memcpy(&input_panel->text_input.cursor_rectangle, data, 
sizeof(pixman_box32_t));
 
        wl_list_for_each_safe(surface, next,
                              &input_panel->surfaces, link) {
-               if (!surface->overlay_panel)
-                       continue;
+               text_input_surface_get_cursor_rectangle(surface, &x1, &y1, &x2, 
&y2);
                if (!weston_surface_is_mapped(surface->surface))
                        continue;
-               overlay_panel_get_position(surface, &x, &y);
-               weston_surface_set_position(surface->surface, x, y);
-               weston_surface_update_transform(surface->surface);
+               if (surface->overlay_panel) {
+                       weston_surface_set_position(surface->surface, x2, y2);
+                       weston_surface_update_transform(surface->surface);
+               }
+               wl_input_panel_surface_send_cursor_rectangle(&surface->resource,
+                                                            x1 - 
surface->surface->geometry.x,
+                                                            y1 - 
surface->surface->geometry.y,
+                                                            x2 - 
surface->surface->geometry.x,
+                                                            y2 - 
surface->surface->geometry.y);
        }
 }
 
@@ -187,7 +194,11 @@ input_panel_configure(struct weston_surface *surface, 
int32_t sx, int32_t sy, in
                return;
 
        if (ip_surface->overlay_panel) {
-               overlay_panel_get_position(ip_surface, &x, &y);
+               float x1, y1, x2, y2;
+               text_input_surface_get_cursor_rectangle(ip_surface, &x1, &y1, 
&x2, &y2);
+
+               x = x2;
+               y = y2;
        } else {
                mode = ip_surface->output->current;
 
-- 
1.8.1.4

_______________________________________________
wayland-devel mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/wayland-devel

Reply via email to