AtlatestRepositorysigil-wm

sigil-wm / tree / src / clegacy-decorations.h

1/* SPDX-License-Identifier: BSD-3-Clause
2 * Legacy protocol ownership and copied mode facts, without presentation policy. */
3struct legacy_decoration {
4 struct wl_list link;
5 struct server *server;
6 struct wlr_server_decoration *native;
7 struct wl_listener mode,destroy;
8 uint64_t id,window;
9 uint32_t copied_mode;
10 bool published;
11};
12static void legacy_decoration_state(struct legacy_decoration *owner) {
13 uint64_t window=window_for_surface(owner->server,owner->native->surface);
14 if(owner->published && owner->window==window && owner->copied_mode==owner->native->mode) return;
15 owner->published=true;
16 owner->window=window;
17 owner->copied_mode=owner->native->mode;
18 EVENT(116,owner->id,window,owner->copied_mode,1);
20static void refresh_decorations(struct server *s) {
21 struct legacy_decoration *owner;
22 wl_list_for_each(owner,&s->legacy_decorations,link) legacy_decoration_state(owner);
24static void legacy_decoration_mode(struct wl_listener *listener,void *data) {
25 (void)data;
26 struct legacy_decoration *owner=wl_container_of(listener,owner,mode);
27 legacy_decoration_state(owner);
29static void legacy_decoration_destroy(struct wl_listener *listener,void *data) {
30 (void)data;
31 struct legacy_decoration *owner=wl_container_of(listener,owner,destroy);
32 EVENT(117,owner->id);
33 wl_list_remove(&owner->mode.link); wl_list_remove(&owner->destroy.link);
34 wl_list_remove(&owner->link);
35 owner->server->decoration_count--;
36 atomic_fetch_sub(&bridge.objects,1);
37 free(owner);
39static void new_legacy_decoration(struct wl_listener *listener,void *data) {
40 struct server *s=wl_container_of(listener,s,new_legacy_decoration);
41 struct wlr_server_decoration *native=data;
42 if(s->decoration_count>=256) { wl_resource_destroy(native->resource); return; }
43 struct legacy_decoration *owner=calloc(1,sizeof(*owner));
44 if(!owner) { wl_resource_post_no_memory(native->resource); return; }
45 owner->id=++s->next_id; owner->server=s; owner->native=native;
46 wl_list_insert(&s->legacy_decorations,&owner->link); s->decoration_count++;
47 listen(&native->events.mode,&owner->mode,legacy_decoration_mode);
48 listen(&native->events.destroy,&owner->destroy,legacy_decoration_destroy);
49 atomic_fetch_add(&bridge.objects,1);
50 legacy_decoration_state(owner);