xdg/wayland-shell: handle set_app_id and set_class events

This commit is contained in:
Johan Malm 2021-10-16 21:50:56 +01:00
parent e140682528
commit e2ae63a7cf
5 changed files with 38 additions and 6 deletions

View file

@ -259,6 +259,7 @@ struct view {
struct wl_listener request_maximize; struct wl_listener request_maximize;
struct wl_listener request_fullscreen; struct wl_listener request_fullscreen;
struct wl_listener set_title; 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_popup; /* xdg-shell only */
struct wl_listener new_subsurface; /* 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); wlr_surface_iterator_func_t iterator, void *data);
void view_move_to_edge(struct view *view, const char *direction); void view_move_to_edge(struct view *view, const char *direction);
void view_update_title(struct view *view); void view_update_title(struct view *view);
void view_update_app_id(struct view *view);
void view_impl_map(struct view *view); void view_impl_map(struct view *view);

View file

@ -10,13 +10,8 @@ view_impl_map(struct view *view)
desktop_focus_and_activate_view(&view->server->seat, view); desktop_focus_and_activate_view(&view->server->seat, view);
desktop_raise_view(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_title(view);
view_update_app_id(view);
damage_all_outputs(view->server); damage_all_outputs(view->server);
} }

View file

@ -242,3 +242,14 @@ view_update_title(struct view *view)
ssd_update_title(view); ssd_update_title(view);
wlr_foreign_toplevel_handle_v1_set_title(view->toplevel_handle, title); 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);
}

View file

@ -160,6 +160,14 @@ handle_set_title(struct wl_listener *listener, void *data)
view_update_title(view); 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 static void
xdg_toplevel_view_configure(struct view *view, struct wlr_box geo) 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; view->request_fullscreen.notify = handle_request_fullscreen;
wl_signal_add(&toplevel->events.request_fullscreen, wl_signal_add(&toplevel->events.request_fullscreen,
&view->request_fullscreen); &view->request_fullscreen);
view->set_title.notify = handle_set_title; view->set_title.notify = handle_set_title;
wl_signal_add(&toplevel->events.set_title, &view->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); wl_list_insert(&server->views, &view->link);
} }

View file

@ -93,6 +93,14 @@ handle_set_title(struct wl_listener *listener, void *data)
view_update_title(view); 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 static void
configure(struct view *view, struct wlr_box geo) 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; view->request_fullscreen.notify = handle_request_fullscreen;
wl_signal_add(&xsurface->events.request_fullscreen, wl_signal_add(&xsurface->events.request_fullscreen,
&view->request_fullscreen); &view->request_fullscreen);
view->set_title.notify = handle_set_title; view->set_title.notify = handle_set_title;
wl_signal_add(&xsurface->events.set_title, &view->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); wl_list_insert(&view->server->views, &view->link);
} }