It brings back a feature we removed previously:

  #4 drawing scheduling and window activation (21c685d9)

Signed-off-by: Tiago Vignatti <tiago.vigna...@intel.com>
---
 clients/xwm.c                 |   40 +++++++++++++++++++++++++++++++++++-----
 src/xwayland/window-manager.c |   12 +-----------
 2 files changed, 36 insertions(+), 16 deletions(-)

diff --git a/clients/xwm.c b/clients/xwm.c
index 41d446b..c421380 100644
--- a/clients/xwm.c
+++ b/clients/xwm.c
@@ -99,8 +99,13 @@ struct motif_wm_hints {
 struct xwm_window {
        struct xwm_wm *wm;
        xcb_window_t id;
+
+       /* frame border */
        xcb_window_t frame_id;
        cairo_surface_t *cairo_surface;
+       struct task paint_task;
+       int repaint_scheduled;
+
        int properties_dirty;
        int pid;
        char *machine;
@@ -118,6 +123,29 @@ struct xwm_window {
 static void
 xwm_window_draw_decoration(struct xwm_window *window);
 
+static void
+xwm_schedule_task(struct task *task, uint32_t events)
+{
+       struct xwm_window *window =
+               container_of(task, struct xwm_window, paint_task);
+
+       xwm_window_draw_decoration(window);
+       window->repaint_scheduled = 0;
+}
+
+static void
+xwm_window_schedule_repaint(struct xwm_window *window)
+{
+       struct xwm_wm *wm = window->wm;
+
+       if (window->repaint_scheduled)
+               return;
+
+       window->paint_task.run = xwm_schedule_task;
+       display_defer(wm->xwm->display, &window->paint_task);
+       window->repaint_scheduled = 1;
+}
+
 const char *
 get_atom_name(xcb_connection_t *c, xcb_atom_t atom)
 {
@@ -454,7 +482,7 @@ xwm_handle_configure_request(struct xwm_wm *wm, 
xcb_generic_event_t *event)
        mask = XCB_CONFIG_WINDOW_WIDTH | XCB_CONFIG_WINDOW_HEIGHT;
        xcb_configure_window(wm->conn, window->frame_id, mask, values);
 
-       xwm_window_draw_decoration(window);
+       xwm_window_schedule_repaint(window);
 }
 
 static void
@@ -517,10 +545,10 @@ set_state_activate(struct xwm *xwm, uint32_t id)
        }
 
        if (wm->focus_window)
-               xwm_window_draw_decoration(wm->focus_window);
+               xwm_window_schedule_repaint(wm->focus_window);
        wm->focus_window = window;
        if (wm->focus_window)
-               xwm_window_draw_decoration(wm->focus_window);
+               xwm_window_schedule_repaint(wm->focus_window);
 }
 
 static void
@@ -765,6 +793,7 @@ xwm_window_draw_decoration(struct xwm_window *window)
                cairo_set_source_rgba(cr, 0, 0, 0, 0.45);
                tile_mask(cr, t->shadow, 2, 2, width + 8, height + 8, 64, 64);
        }
+       xcb_flush(window->wm->conn);
 
        cairo_destroy(cr);
 #if 0
@@ -812,7 +841,7 @@ xwm_handle_property_notify(struct xwm_wm *wm, 
xcb_generic_event_t *event)
 
        if (property_notify->atom == wm->atom.net_wm_name ||
            property_notify->atom == XCB_ATOM_WM_NAME)
-               xwm_window_draw_decoration(window);
+               xwm_window_schedule_repaint(window);
 }
 
 static void
@@ -834,6 +863,7 @@ xwm_window_create(struct xwm_wm *wm,
        memset(window, 0, sizeof *window);
        window->wm = wm;
        window->id = id;
+       window->repaint_scheduled = 0;
        window->properties_dirty = 1;
        window->override_redirect = override;
        window->width = width;
@@ -1532,7 +1562,7 @@ get_configure(void *data, struct wm *w, uint32_t id, 
uint32_t edges,
                             values);
        xcb_flush(wm->conn);
 
-       xwm_window_draw_decoration(window);
+       xwm_window_schedule_repaint(window);
 }
 
 static void
diff --git a/src/xwayland/window-manager.c b/src/xwayland/window-manager.c
index 4ffa533..39bac18 100644
--- a/src/xwayland/window-manager.c
+++ b/src/xwayland/window-manager.c
@@ -97,17 +97,11 @@ xserver_get_window_surface(struct wl_client *client,
                return;
        }
 
-       fprintf(stderr, "set_window_id %d for surface %p\n", id, surface);
-
-//     weston_wm_window_read_properties(window);
-
        window->surface = surface;
        window->surface_destroy_listener.notify = surface_destroy;
        wl_signal_add(&surface->resource.destroy_signal,
                      &window->surface_destroy_listener);
 
-//     weston_wm_window_draw_decoration(window);
-
        window->shsurf =
                shell_interface->create_shell_surface(shell_interface->shell,
                                                      weston_surface,
@@ -127,8 +121,6 @@ wm_get_window(struct wl_client *client, struct wl_resource 
*resource,
        struct weston_xserver *wxs = resource->data;
        struct xserver_window *w;
 
-       fprintf(stderr, "%s: ", __func__);
-
        w = hash_table_lookup(wxs->window_hash, id);
        if (!w) {
                w = malloc(sizeof *w);
@@ -140,9 +132,7 @@ wm_get_window(struct wl_client *client, struct wl_resource 
*resource,
                w->shsurf = NULL;
                w->wxs = wxs;
                w->id = id;
-               fprintf(stderr, "insert: %d, flags: %d\n", id, flags);
-       } else
-               fprintf(stderr, "found: %d, flags: %d\n", id, flags);
+       }
 
        w->x = x;
        w->y = y;
-- 
1.7.9.5

_______________________________________________
wayland-devel mailing list
wayland-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/wayland-devel

Reply via email to