[PATCH v2 weston] Partially revert "xwm: Add icon support to the frame" and friends
Quentin Glidic
sardemff7+wayland at sardemff7.net
Mon Apr 2 16:30:12 UTC 2018
On 3/30/18 6:56 PM, Derek Foreman wrote:
> This (partially) reverts commit bef761796c2ada6344d227142af4a0f40b9760dd.
> This (partially) reverts commit 4d1cd36c9ea041688f92cd8981e43b5fe3b52409.
> This (partially) reverts commit 44fc1be913ab2faad0414f50e51d58310302d065.
> This (partially) reverts commit 6b58ea8c43ac81e519bd418efbf24687a5d731b8.
>
> The new xwm icon code has proven to be leaky and incomplete, and while
> we have patches under consideration to fix the rest of its known problems
> they still require changes and review cycles. Currently the known
> leaks have been squashed, but it still picks wrong sized icons and
> does no scaling, which can lead to very strange rendering. At window
> close time the wrong sized icon appears above the window during fade out.
>
> This patch reverts the mostly solid bits and keeps the unfinished
> bits behind in favor of a simpler revert than removing the whole
> thing.
>
> Signed-off-by: Derek Foreman <derekf at osg.samsung.com> > ---
>
> Changes from v1:
>
> Only reverts the changes in window-manager.c (and updates frame_create call
> to pass NULL for icon surface.
Yeah, looks safer to me:
Reviewed-by: Quentin Glidic <sardemff7+git at sardemff7.net>
I’m sure Scott will submit a complete feature soon, this way we can
focus the review on the real bits. :-)
Thanks,
>
> xwayland/window-manager.c | 88 ++---------------------------------------------
> 1 file changed, 2 insertions(+), 86 deletions(-)
>
> diff --git a/xwayland/window-manager.c b/xwayland/window-manager.c
> index 62087941..06370b70 100644
> --- a/xwayland/window-manager.c
> +++ b/xwayland/window-manager.c
> @@ -138,8 +138,6 @@ struct weston_wm_window {
> xcb_window_t frame_id;
> struct frame *frame;
> cairo_surface_t *cairo_surface;
> - int icon;
> - cairo_surface_t *icon_surface; /* A temporary slot, to be passed to frame on creation */
> uint32_t surface_id;
> struct weston_surface *surface;
> struct weston_desktop_xwayland_surface *shsurf;
> @@ -475,7 +473,6 @@ weston_wm_window_read_properties(struct weston_wm_window *window)
> { wm->atom.net_wm_state, TYPE_NET_WM_STATE, NULL },
> { wm->atom.net_wm_window_type, XCB_ATOM_ATOM, F(type) },
> { wm->atom.net_wm_name, XCB_ATOM_STRING, F(name) },
> - { wm->atom.net_wm_icon, XCB_ATOM_CARDINAL, F(icon) },
> { wm->atom.net_wm_pid, XCB_ATOM_CARDINAL, F(pid) },
> { wm->atom.motif_wm_hints, TYPE_MOTIF_WM_HINTS, NULL },
> { wm->atom.wm_client_machine, XCB_ATOM_WM_CLIENT_MACHINE, F(machine) },
> @@ -976,10 +973,8 @@ weston_wm_window_create_frame(struct weston_wm_window *window)
> buttons |= FRAME_BUTTON_MAXIMIZE;
>
> window->frame = frame_create(window->wm->theme,
> - window->width, window->height,
> - buttons, window->name,
> - window->icon_surface);
> - window->icon_surface = NULL;
> + window->width, window->height,
> + buttons, window->name, NULL);
> frame_resize_inside(window->frame, window->width, window->height);
>
> weston_wm_window_get_frame_size(window, &width, &height);
> @@ -1318,70 +1313,6 @@ weston_wm_window_schedule_repaint(struct weston_wm_window *window)
> weston_wm_window_do_repaint, window);
> }
>
> -static void
> -handle_icon_surface_destroy(void *data)
> -{
> - free(data);
> -}
> -
> -static void
> -weston_wm_handle_icon(struct weston_wm *wm, struct weston_wm_window *window)
> -{
> - xcb_get_property_reply_t *reply;
> - xcb_get_property_cookie_t cookie;
> - uint32_t length;
> - uint32_t *data, width, height;
> - cairo_surface_t *new_surface;
> -
> - /* TODO: icons don’t have any specified order, we should pick the
> - * closest one to the target dimension instead of the first one. */
> -
> - cookie = xcb_get_property(wm->conn, 0, window->id,
> - wm->atom.net_wm_icon, XCB_ATOM_ANY, 0,
> - UINT32_MAX);
> - reply = xcb_get_property_reply(wm->conn, cookie, NULL);
> - length = xcb_get_property_value_length(reply);
> -
> - /* This is in 32-bit words, not in bytes. */
> - if (length < 2) {
> - free(reply);
> - return;
> - }
> -
> - data = xcb_get_property_value(reply);
> - width = *data++;
> - height = *data++;
> -
> - /* Some checks against malformed input. */
> - if (width == 0 || height == 0 || length < 2 + width * height) {
> - free(reply);
> - return;
> - }
> -
> - new_surface =
> - cairo_image_surface_create_for_data((unsigned char *)data,
> - CAIRO_FORMAT_ARGB32,
> - width, height, width * 4);
> -
> - /* Bail out in case anything wrong happened during surface creation. */
> - if (cairo_surface_status(new_surface) != CAIRO_STATUS_SUCCESS) {
> - cairo_surface_destroy(new_surface);
> - free(reply);
> - return;
> - }
> -
> - if (window->icon_surface)
> - cairo_surface_destroy(window->icon_surface);
> -
> - cairo_surface_set_user_data(new_surface, NULL, reply,
> - &handle_icon_surface_destroy);
> -
> - if (window->frame)
> - frame_set_icon(window->frame, new_surface);
> - else /* We don’t have a frame yet */
> - window->icon_surface = new_surface;
> -}
> -
> static void
> weston_wm_handle_property_notify(struct weston_wm *wm, xcb_generic_event_t *event)
> {
> @@ -1402,19 +1333,6 @@ weston_wm_handle_property_notify(struct weston_wm *wm, xcb_generic_event_t *even
> read_and_dump_property(wm, property_notify->window,
> property_notify->atom);
>
> - if (property_notify->atom == wm->atom.net_wm_icon) {
> - if (property_notify->state != XCB_PROPERTY_DELETE) {
> - weston_wm_handle_icon(wm, window);
> - } else {
> - if (window->frame)
> - frame_set_icon(window->frame, NULL);
> - if (window->icon_surface)
> - cairo_surface_destroy(window->icon_surface);
> - window->icon_surface = NULL;
> - }
> - weston_wm_window_schedule_repaint(window);
> - }
> -
> if (property_notify->atom == wm->atom.net_wm_name ||
> property_notify->atom == XCB_ATOM_WM_NAME)
> weston_wm_window_schedule_repaint(window);
> @@ -1475,8 +1393,6 @@ weston_wm_window_destroy(struct weston_wm_window *window)
> wl_event_source_remove(window->repaint_source);
> if (window->cairo_surface)
> cairo_surface_destroy(window->cairo_surface);
> - if (window->icon_surface)
> - cairo_surface_destroy(window->icon_surface);
>
> if (window->frame_id) {
> xcb_reparent_window(wm->conn, window->id, wm->wm_window, 0, 0);
>
--
Quentin “Sardem FF7” Glidic
More information about the wayland-devel
mailing list