[gtk: 5/8] broadway: Track surface position correctly



commit 03d6d272f79fde6a0dc2583ab4f105969d227599
Author: Alexander Larsson <alexl redhat com>
Date:   Fri Mar 13 14:33:07 2020 +0100

    broadway: Track surface position correctly
    
    surface->x/y (and various x,y arguments) should be in the parent
    coordinates, so treat it as such. We also keep track of the root coords
    as these are needed for popup positioning.
    
    Also, drop the isTemp property server side and the weird initial
    placement at (100, 100) in the daemon. We now fully control window
    placement from the client instead. If this is not we want we should do
    a serious design for that but until then lets do the simplest thing.

 gdk/broadway/broadway-output.c     |   4 +-
 gdk/broadway/broadway-output.h     |   3 +-
 gdk/broadway/broadway-protocol.h   |   1 -
 gdk/broadway/broadway-server.c     |  17 ++----
 gdk/broadway/broadway-server.h     |   3 +-
 gdk/broadway/broadway.js           |   9 ++--
 gdk/broadway/broadwayd.c           |   3 +-
 gdk/broadway/gdkbroadway-server.c  |   4 +-
 gdk/broadway/gdkbroadway-server.h  |   3 +-
 gdk/broadway/gdkeventsource.c      |   5 --
 gdk/broadway/gdkprivate-broadway.h |   1 -
 gdk/broadway/gdksurface-broadway.c | 106 +++++++++++++++++++++++++------------
 gdk/broadway/gdksurface-broadway.h |   4 +-
 13 files changed, 85 insertions(+), 78 deletions(-)
---
diff --git a/gdk/broadway/broadway-output.c b/gdk/broadway/broadway-output.c
index b2b15f8362..15d76cda75 100644
--- a/gdk/broadway/broadway-output.c
+++ b/gdk/broadway/broadway-output.c
@@ -200,8 +200,7 @@ broadway_output_ungrab_pointer (BroadwayOutput *output)
 
 void
 broadway_output_new_surface(BroadwayOutput *output,
-                            int id, int x, int y, int w, int h,
-                            gboolean is_temp)
+                            int id, int x, int y, int w, int h)
 {
   write_header (output, BROADWAY_OP_NEW_SURFACE);
   append_uint16 (output, id);
@@ -209,7 +208,6 @@ broadway_output_new_surface(BroadwayOutput *output,
   append_uint16 (output, y);
   append_uint16 (output, w);
   append_uint16 (output, h);
-  append_bool (output, is_temp);
 }
 
 void
diff --git a/gdk/broadway/broadway-output.h b/gdk/broadway/broadway-output.h
index 036aa05c37..58c1005727 100644
--- a/gdk/broadway/broadway-output.h
+++ b/gdk/broadway/broadway-output.h
@@ -30,8 +30,7 @@ void            broadway_output_new_surface         (BroadwayOutput *output,
                                                      int             x,
                                                      int             y,
                                                      int             w,
-                                                     int             h,
-                                                     gboolean        is_temp);
+                                                     int             h);
 void            broadway_output_disconnected        (BroadwayOutput *output);
 void            broadway_output_show_surface        (BroadwayOutput *output,
                                                      int             id);
diff --git a/gdk/broadway/broadway-protocol.h b/gdk/broadway/broadway-protocol.h
index 436d60da49..35fb02cab2 100644
--- a/gdk/broadway/broadway-protocol.h
+++ b/gdk/broadway/broadway-protocol.h
@@ -276,7 +276,6 @@ typedef struct {
   gint32 y;
   guint32 width;
   guint32 height;
-  guint32 is_temp;
 } BroadwayRequestNewSurface;
 
 typedef struct {
diff --git a/gdk/broadway/broadway-server.c b/gdk/broadway/broadway-server.c
index f7a380ec26..64f3e236de 100644
--- a/gdk/broadway/broadway-server.c
+++ b/gdk/broadway/broadway-server.c
@@ -120,7 +120,6 @@ struct BroadwaySurface {
   gint32 y;
   gint32 width;
   gint32 height;
-  gboolean is_temp;
   gboolean visible;
   gint32 transient_for;
   guint32 texture;
@@ -2074,8 +2073,7 @@ broadway_server_new_surface (BroadwayServer *server,
                              int x,
                              int y,
                              int width,
-                             int height,
-                             gboolean is_temp)
+                             int height)
 {
   BroadwaySurface *surface;
 
@@ -2084,15 +2082,8 @@ broadway_server_new_surface (BroadwayServer *server,
   surface->id = server->id_counter++;
   surface->x = x;
   surface->y = y;
-  if (x == 0 && y == 0 && !is_temp)
-    {
-      /* TODO: Better way to know if we should pick default pos */
-      surface->x = 100;
-      surface->y = 100;
-    }
   surface->width = width;
   surface->height = height;
-  surface->is_temp = is_temp;
   surface->node_lookup = g_hash_table_new (g_direct_hash, g_direct_equal);
 
   g_hash_table_insert (server->surface_id_hash,
@@ -2107,8 +2098,7 @@ broadway_server_new_surface (BroadwayServer *server,
                                  surface->x,
                                  surface->y,
                                  surface->width,
-                                 surface->height,
-                                 surface->is_temp);
+                                 surface->height);
   else
     fake_configure_notify (server, surface);
 
@@ -2148,8 +2138,7 @@ broadway_server_resync_surfaces (BroadwayServer *server)
                                    surface->x,
                                    surface->y,
                                    surface->width,
-                                   surface->height,
-                                   surface->is_temp);
+                                   surface->height);
     }
 
   /* Then do everything that may reference other surfaces */
diff --git a/gdk/broadway/broadway-server.h b/gdk/broadway/broadway-server.h
index 10181c3d79..7c5d97e4aa 100644
--- a/gdk/broadway/broadway-server.h
+++ b/gdk/broadway/broadway-server.h
@@ -91,8 +91,7 @@ guint32             broadway_server_new_surface               (BroadwayServer  *
                                                                int              x,
                                                                int              y,
                                                                int              width,
-                                                               int              height,
-                                                               gboolean         is_temp);
+                                                               int              height);
 void                broadway_server_destroy_surface           (BroadwayServer  *server,
                                                                gint             id);
 gboolean            broadway_server_surface_show              (BroadwayServer  *server,
diff --git a/gdk/broadway/broadway.js b/gdk/broadway/broadway.js
index da1e06fb92..267ef205ee 100644
--- a/gdk/broadway/broadway.js
+++ b/gdk/broadway/broadway.js
@@ -298,10 +298,9 @@ function sendConfigureNotify(surface)
     sendInput(BROADWAY_EVENT_CONFIGURE_NOTIFY, [surface.id, surface.x, surface.y, surface.width, 
surface.height]);
 }
 
-function cmdCreateSurface(id, x, y, width, height, isTemp)
+function cmdCreateSurface(id, x, y, width, height)
 {
-    var surface = { id: id, x: x, y:y, width: width, height: height, isTemp: isTemp };
-    surface.positioned = isTemp;
+    var surface = { id: id, x: x, y:y, width: width, height: height };
     surface.transientParent = 0;
     surface.visible = false;
     surface.imageData = null;
@@ -1039,8 +1038,7 @@ function handleCommands(cmd, display_commands, new_textures, modified_trees)
             y = cmd.get_16s();
             w = cmd.get_16();
             h = cmd.get_16();
-            var isTemp = cmd.get_bool();
-            var div = cmdCreateSurface(id, x, y, w, h, isTemp);
+            var div = cmdCreateSurface(id, x, y, w, h);
             display_commands.push([DISPLAY_OP_APPEND_ROOT, div]);
             need_restack = true;
             break;
@@ -1109,7 +1107,6 @@ function handleCommands(cmd, display_commands, new_textures, modified_trees)
             var has_size = ops & 2;
             surface = surfaces[id];
             if (has_pos) {
-                surface.positioned = true;
                 surface.x = cmd.get_16s();
                 surface.y = cmd.get_16s();
                 display_commands.push([DISPLAY_OP_MOVE_NODE, surface.div, surface.x, surface.y]);
diff --git a/gdk/broadway/broadwayd.c b/gdk/broadway/broadwayd.c
index d65e69c4ce..a7a759c2ad 100644
--- a/gdk/broadway/broadwayd.c
+++ b/gdk/broadway/broadwayd.c
@@ -238,8 +238,7 @@ client_handle_request (BroadwayClient *client,
                                      request->new_surface.x,
                                      request->new_surface.y,
                                      request->new_surface.width,
-                                     request->new_surface.height,
-                                     request->new_surface.is_temp);
+                                     request->new_surface.height);
       client->surfaces =
         g_list_prepend (client->surfaces,
                         GUINT_TO_POINTER (reply_new_surface.id));
diff --git a/gdk/broadway/gdkbroadway-server.c b/gdk/broadway/gdkbroadway-server.c
index 4b8fe4fd9b..23207916db 100644
--- a/gdk/broadway/gdkbroadway-server.c
+++ b/gdk/broadway/gdkbroadway-server.c
@@ -482,8 +482,7 @@ _gdk_broadway_server_new_surface (GdkBroadwayServer *server,
                                  int x,
                                  int y,
                                  int width,
-                                 int height,
-                                 gboolean is_temp)
+                                 int height)
 {
   BroadwayRequestNewSurface msg;
   guint32 serial, id;
@@ -493,7 +492,6 @@ _gdk_broadway_server_new_surface (GdkBroadwayServer *server,
   msg.y = y;
   msg.width = width;
   msg.height = height;
-  msg.is_temp = is_temp;
   serial = gdk_broadway_server_send_message (server, msg,
                                              BROADWAY_REQUEST_NEW_SURFACE);
   reply = gdk_broadway_server_wait_for_reply (server, serial);
diff --git a/gdk/broadway/gdkbroadway-server.h b/gdk/broadway/gdkbroadway-server.h
index b30e38a5a6..f399ff458c 100644
--- a/gdk/broadway/gdkbroadway-server.h
+++ b/gdk/broadway/gdkbroadway-server.h
@@ -43,8 +43,7 @@ guint32            _gdk_broadway_server_new_surface               (GdkBroadwaySe
                                                                  int                 x,
                                                                  int                 y,
                                                                  int                 width,
-                                                                 int                 height,
-                                                                 gboolean            is_temp);
+                                                                 int                 height);
 void               _gdk_broadway_server_destroy_surface           (GdkBroadwayServer  *server,
                                                                  gint                id);
 gboolean           _gdk_broadway_server_surface_show              (GdkBroadwayServer  *server,
diff --git a/gdk/broadway/gdkeventsource.c b/gdk/broadway/gdkeventsource.c
index 9e8f56296c..0f83b8b6f6 100644
--- a/gdk/broadway/gdkeventsource.c
+++ b/gdk/broadway/gdkeventsource.c
@@ -294,11 +294,6 @@ _gdk_broadway_events_got_input (GdkDisplay *display,
     surface = g_hash_table_lookup (display_broadway->id_ht, GINT_TO_POINTER (message->configure_notify.id));
     if (surface)
       {
-        surface->x = message->configure_notify.x;
-        surface->y = message->configure_notify.y;
-
-        gdk_broadway_surface_update_popups (surface);
-
         event = gdk_event_configure_new (surface,
                                          message->configure_notify.width,
                                          message->configure_notify.height);
diff --git a/gdk/broadway/gdkprivate-broadway.h b/gdk/broadway/gdkprivate-broadway.h
index f4f19cd534..5a4499b408 100644
--- a/gdk/broadway/gdkprivate-broadway.h
+++ b/gdk/broadway/gdkprivate-broadway.h
@@ -67,7 +67,6 @@ void     _gdk_broadway_roundtrip_notify           (GdkSurface  *surface,
 void     _gdk_broadway_surface_grab_check_destroy (GdkSurface *surface);
 void     _gdk_broadway_surface_grab_check_unmap   (GdkSurface *surface,
                                                    gulong     serial);
-void     gdk_broadway_surface_update_popups       (GdkSurface *surface);
 
 void gdk_broadway_surface_move_resize (GdkSurface *surface,
                                        gint        x,
diff --git a/gdk/broadway/gdksurface-broadway.c b/gdk/broadway/gdksurface-broadway.c
index 0193f499b2..bb3acf2f98 100644
--- a/gdk/broadway/gdksurface-broadway.c
+++ b/gdk/broadway/gdksurface-broadway.c
@@ -253,12 +253,19 @@ _gdk_broadway_display_create_surface (GdkDisplay     *display,
   broadway_display = GDK_BROADWAY_DISPLAY (display);
 
   impl = GDK_BROADWAY_SURFACE (surface);
+  impl->root_x = x;
+  impl->root_y = y;
+  if (parent)
+    {
+      impl->root_x += GDK_BROADWAY_SURFACE (parent)->root_x;
+      impl->root_y += GDK_BROADWAY_SURFACE (parent)->root_y;
+    }
+
   impl->id = _gdk_broadway_server_new_surface (broadway_display->server,
-                                               surface->x,
-                                               surface->y,
+                                               impl->root_x,
+                                               impl->root_y,
                                                surface->width,
-                                               surface->height,
-                                               surface_type == GDK_SURFACE_TEMP);
+                                               surface->height);
   g_hash_table_insert (broadway_display->id_ht, GINT_TO_POINTER(impl->id), surface);
 
   if (!surface->parent)
@@ -399,6 +406,41 @@ gdk_broadway_surface_get_scale_factor (GdkSurface *surface)
   return broadway_display->scale_factor;
 }
 
+static void
+sync_child_root_pos (GdkSurface *parent)
+{
+  GdkBroadwaySurface *parent_impl = GDK_BROADWAY_SURFACE (parent);
+  GdkBroadwayDisplay *broadway_display;
+  GList *l;
+
+  broadway_display = GDK_BROADWAY_DISPLAY (gdk_surface_get_display (parent));
+
+  for (l = parent->children; l; l = l->next)
+    {
+      GdkBroadwaySurface *child_impl = l->data;
+      GdkSurface *child = GDK_SURFACE (child_impl);
+      int root_x, root_y;
+
+      root_x = child->x + parent_impl->root_x;
+      root_y = child->y + parent_impl->root_y;
+
+      if (root_x != child_impl->root_x ||
+          root_y != child_impl->root_y)
+        {
+          child_impl->root_x = root_x;
+          child_impl->root_y = root_y;
+
+          _gdk_broadway_server_surface_move_resize (broadway_display->server,
+                                                    child_impl->id,
+                                                    TRUE,
+                                                    child_impl->root_x, child_impl->root_y,
+                                                    child->width, child->height);
+          sync_child_root_pos (child);
+        }
+    }
+}
+
+/* x, y is relative to parent */
 static void
 gdk_broadway_surface_move_resize_internal (GdkSurface *surface,
                                            gboolean    with_move,
@@ -411,6 +453,20 @@ gdk_broadway_surface_move_resize_internal (GdkSurface *surface,
   GdkBroadwayDisplay *broadway_display;
   gboolean size_changed;
 
+  if (with_move)
+    {
+      surface->x = x;
+      surface->y = y;
+      impl->root_x = x;
+      impl->root_y = y;
+      if (surface->parent)
+        {
+          GdkBroadwaySurface *parent_impl = GDK_BROADWAY_SURFACE (surface->parent);
+          impl->root_x += parent_impl->root_x;
+          impl->root_y += parent_impl->root_y;
+        }
+    }
+
   size_changed = FALSE;
 
   broadway_display = GDK_BROADWAY_DISPLAY (gdk_surface_get_display (surface));
@@ -437,17 +493,13 @@ gdk_broadway_surface_move_resize_internal (GdkSurface *surface,
         }
     }
 
-  if (surface->parent)
-    {
-      impl->offset_x = x - surface->parent->x;
-      impl->offset_y = y - surface->parent->y;
-    }
-
   _gdk_broadway_server_surface_move_resize (broadway_display->server,
                                             impl->id,
                                             with_move,
-                                            x, y,
+                                            impl->root_x, impl->root_y,
                                             surface->width, surface->height);
+  sync_child_root_pos (surface);
+
   queue_flush (surface);
   if (size_changed)
     {
@@ -501,9 +553,8 @@ gdk_broadway_surface_layout_popup (GdkSurface     *surface,
                                    layout,
                                    &final_rect);
 
-  gdk_surface_get_origin (surface->parent, &x, &y);
-  x += final_rect.x;
-  y += final_rect.y;
+  x = final_rect.x;
+  y = final_rect.y;
 
   if (final_rect.width != surface->width ||
       final_rect.height != surface->height)
@@ -658,10 +709,14 @@ gdk_broadway_surface_get_root_coords (GdkSurface *surface,
                                       gint       *root_x,
                                       gint       *root_y)
 {
+  GdkBroadwaySurface *impl;
+
+  impl = GDK_BROADWAY_SURFACE (surface);
+
   if (root_x)
-    *root_x = x + surface->x;
+    *root_x = x + impl->root_x;
   if (root_y)
-    *root_y = y + surface->y;
+    *root_y = y + impl->root_y;
 }
 
 static gboolean
@@ -762,25 +817,6 @@ gdk_broadway_surface_unmaximize (GdkSurface *surface)
                                     impl->pre_maximize_height);
 }
 
-void
-gdk_broadway_surface_update_popups (GdkSurface *parent)
-{
-  GList *l;
-
-  for (l = parent ->children; l; l = l->next)
-    {
-      GdkBroadwaySurface *popup_impl = l->data;
-      GdkSurface *popup = GDK_SURFACE (popup_impl);
-      int new_x = parent->x + popup_impl->offset_x;
-      int new_y = parent->y + popup_impl->offset_y;
-
-      if (new_x != popup->x || new_y != popup->y)
-        gdk_broadway_surface_move_resize (popup,
-                                          new_x, new_y,
-                                          popup->width, popup->height);
-    }
-}
-
 typedef struct _MoveResizeData MoveResizeData;
 
 struct _MoveResizeData
diff --git a/gdk/broadway/gdksurface-broadway.h b/gdk/broadway/gdksurface-broadway.h
index b2940f2b08..33ef70eb03 100644
--- a/gdk/broadway/gdksurface-broadway.h
+++ b/gdk/broadway/gdksurface-broadway.h
@@ -61,8 +61,8 @@ struct _GdkBroadwaySurface
   GArray *node_data;
   GPtrArray *node_data_textures;
 
-  int offset_x;
-  int offset_y;
+  int root_x;
+  int root_y;
 };
 
 struct _GdkBroadwaySurfaceClass


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]