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 */
};
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);
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);
}
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);
+}
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)
{
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);
}
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)
{
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);
}