AtlatestRepositorysigil-wm
1
/* SPDX-License-Identifier: BSD-3-Clause2
* Client virtual devices are inert until a copied permission request is granted. */3
struct permission {4
struct wl_list link;5
struct server *server;6
uint64_t token,deadline;7
struct wl_resource *resource;8
struct wlr_input_device *device;9
struct wl_listener destroy;10
};11
static void permission_destroy(struct wl_listener *listener,void *data) {12
(void)data;13
struct permission *p=wl_container_of(listener,p,destroy);14
EVENT(72,p->token);15
wl_list_remove(&p->destroy.link); wl_list_remove(&p->link); free(p);16
}17
static void permission_request(struct server *s,struct wl_resource *resource,struct wlr_input_device *device) {18
struct permission *p=calloc(1,sizeof(*p));19
if(!p) return;20
p->server=s; p->resource=resource; p->device=device;21
p->token=++s->next_token; p->deadline=now_ms()+bridge.request_deadline;22
wl_resource_add_destroy_listener(resource,&p->destroy);23
p->destroy.notify=permission_destroy;24
wl_list_insert(&s->permissions,&p->link);25
pid_t pid; uid_t uid; gid_t gid;26
wl_client_get_credentials(wl_resource_get_client(resource),&pid,&uid,&gid);27
EVENT(70,p->token,device->type,pid,uid,gid);28
}29
static void virtual_keyboard(struct wl_listener *listener,void *data) {30
struct server *s=wl_container_of(listener,s,new_virtual_keyboard);31
struct wlr_virtual_keyboard_v1 *k=data;32
permission_request(s,k->resource,&k->keyboard.base);33
}34
static void virtual_pointer(struct wl_listener *listener,void *data) {35
struct server *s=wl_container_of(listener,s,new_virtual_pointer);36
struct wlr_virtual_pointer_v1_new_pointer_event *e=data;37
permission_request(s,e->new_pointer->resource,&e->new_pointer->pointer.base);38
}39
static bool permission_reply(struct server *s,uint64_t token,bool allow) {40
struct permission *p;41
wl_list_for_each(p,&s->permissions,link) {42
if(p->token!=token) continue;43
struct wl_resource *resource=p->resource;44
struct wlr_input_device *device=p->device;45
wl_list_remove(&p->destroy.link); wl_list_remove(&p->link); free(p);46
if(allow && !s->lock_state) {47
attach_input(s,device,true);48
} else wl_resource_destroy(resource);49
EVENT(71,token,allow && !s->lock_state);50
return true;51
}52
return false;53
}54
static void permissions_expire(struct server *s) {55
struct permission *p,*next;56
wl_list_for_each_safe(p,next,&s->permissions,link)57
if(now_ms()>=p->deadline) permission_reply(s,p->token,false);58
}