diff --git a/libweston-desktop/libweston-desktop.h b/libweston-desktop/libweston-desktop.h index 03b04c7b..a0fb9381 100644 --- a/libweston-desktop/libweston-desktop.h +++ b/libweston-desktop/libweston-desktop.h @@ -164,6 +164,9 @@ weston_desktop_surface_set_size(struct weston_desktop_surface *surface, int32_t width, int32_t height); void weston_desktop_surface_close(struct weston_desktop_surface *surface); +void +weston_desktop_surface_add_metadata_listener(struct weston_desktop_surface *surface, + struct wl_listener *listener); void * weston_desktop_surface_get_user_data(struct weston_desktop_surface *surface); diff --git a/libweston-desktop/surface.c b/libweston-desktop/surface.c index d3be9364..cbfa5ee0 100644 --- a/libweston-desktop/surface.c +++ b/libweston-desktop/surface.c @@ -64,6 +64,7 @@ struct weston_desktop_surface { char *title; char *app_id; pid_t pid; + struct wl_signal metadata_signal; }; struct { struct weston_desktop_surface *parent; @@ -287,6 +288,8 @@ weston_desktop_surface_create(struct weston_desktop *desktop, wl_list_init(&surface->view_list); wl_list_init(&surface->grab_link); + wl_signal_init(&surface->metadata_signal); + return surface; } @@ -511,6 +514,13 @@ weston_desktop_surface_close(struct weston_desktop_surface *surface) surface->implementation_data); } +WL_EXPORT void +weston_desktop_surface_add_metadata_listener(struct weston_desktop_surface *surface, + struct wl_listener *listener) +{ + wl_signal_add(&surface->metadata_signal, listener); +} + struct weston_desktop_surface * weston_desktop_surface_from_client_link(struct wl_list *link) { @@ -679,28 +689,32 @@ void weston_desktop_surface_set_title(struct weston_desktop_surface *surface, const char *title) { - char *tmp; + char *tmp, *old; tmp = strdup(title); if (tmp == NULL) return; - free(surface->title); + old = surface->title; surface->title = tmp; + wl_signal_emit(&surface->metadata_signal, surface); + free(old); } void weston_desktop_surface_set_app_id(struct weston_desktop_surface *surface, const char *app_id) { - char *tmp; + char *tmp, *old; tmp = strdup(app_id); if (tmp == NULL) return; - free(surface->app_id); + old = surface->app_id; surface->app_id = tmp; + wl_signal_emit(&surface->metadata_signal, surface); + free(old); } void