diff --git a/include/labwc.h b/include/labwc.h index 5dfebafb..03d13330 100644 --- a/include/labwc.h +++ b/include/labwc.h @@ -259,6 +259,7 @@ struct view { struct wl_listener request_maximize; struct wl_listener request_fullscreen; struct wl_listener set_title; + struct wl_listener set_app_id; /* class on xwayland */ struct wl_listener new_popup; /* xdg-shell only */ struct wl_listener new_subsurface; /* xdg-shell only */ }; @@ -337,6 +338,7 @@ void view_for_each_popup_surface(struct view *view, wlr_surface_iterator_func_t iterator, void *data); void view_move_to_edge(struct view *view, const char *direction); void view_update_title(struct view *view); +void view_update_app_id(struct view *view); void view_impl_map(struct view *view); diff --git a/src/view-impl.c b/src/view-impl.c index f92d5d40..8b948b12 100644 --- a/src/view-impl.c +++ b/src/view-impl.c @@ -10,13 +10,8 @@ view_impl_map(struct view *view) desktop_focus_and_activate_view(&view->server->seat, view); desktop_raise_view(view); - const char *app_id = view->impl->get_string_prop(view, "app_id"); - if (app_id) { - wlr_foreign_toplevel_handle_v1_set_app_id( - view->toplevel_handle, app_id); - } - view_update_title(view); + view_update_app_id(view); damage_all_outputs(view->server); } diff --git a/src/view.c b/src/view.c index 3a9c4a33..35c6e6bd 100644 --- a/src/view.c +++ b/src/view.c @@ -242,3 +242,14 @@ view_update_title(struct view *view) ssd_update_title(view); wlr_foreign_toplevel_handle_v1_set_title(view->toplevel_handle, title); } + +void +view_update_app_id(struct view *view) +{ + const char *app_id = view->impl->get_string_prop(view, "app_id"); + if (!view->toplevel_handle || !app_id) { + return; + } + wlr_foreign_toplevel_handle_v1_set_app_id( + view->toplevel_handle, app_id); +} diff --git a/src/xdg.c b/src/xdg.c index 18a0e843..0b9deefe 100644 --- a/src/xdg.c +++ b/src/xdg.c @@ -160,6 +160,14 @@ handle_set_title(struct wl_listener *listener, void *data) view_update_title(view); } +static void +handle_set_app_id(struct wl_listener *listener, void *data) +{ + struct view *view = wl_container_of(listener, view, set_app_id); + assert(view); + view_update_app_id(view); +} + static void xdg_toplevel_view_configure(struct view *view, struct wlr_box geo) { @@ -408,8 +416,12 @@ xdg_surface_new(struct wl_listener *listener, void *data) view->request_fullscreen.notify = handle_request_fullscreen; wl_signal_add(&toplevel->events.request_fullscreen, &view->request_fullscreen); + view->set_title.notify = handle_set_title; wl_signal_add(&toplevel->events.set_title, &view->set_title); + view->set_app_id.notify = handle_set_app_id; + wl_signal_add(&toplevel->events.set_app_id, &view->set_app_id); + wl_list_insert(&server->views, &view->link); } diff --git a/src/xwayland.c b/src/xwayland.c index bd17c55d..6e08fc46 100644 --- a/src/xwayland.c +++ b/src/xwayland.c @@ -93,6 +93,14 @@ handle_set_title(struct wl_listener *listener, void *data) view_update_title(view); } +static void +handle_set_class(struct wl_listener *listener, void *data) +{ + struct view *view = wl_container_of(listener, view, set_app_id); + assert(view); + view_update_app_id(view); +} + static void configure(struct view *view, struct wlr_box geo) { @@ -300,8 +308,12 @@ xwayland_surface_new(struct wl_listener *listener, void *data) view->request_fullscreen.notify = handle_request_fullscreen; wl_signal_add(&xsurface->events.request_fullscreen, &view->request_fullscreen); + view->set_title.notify = handle_set_title; wl_signal_add(&xsurface->events.set_title, &view->set_title); + view->set_app_id.notify = handle_set_class; + wl_signal_add(&xsurface->events.set_class, &view->set_app_id); + wl_list_insert(&view->server->views, &view->link); }