mirror of
https://gitlab.freedesktop.org/libinput/libei.git
synced 2026-05-08 15:08:04 +02:00
oeffis: Make ConnectToEIS call async
A blocking call can be problematic when done from inside Xwayland to the compositor as the compositor could be doing a blocking X call at the same time. In this instance we found it's likely to happen because this call will happen shortly after the user accepted the This is not a problem for the other calls because the portal API is async for these via request response signalling.
This commit is contained in:
parent
865d7152e0
commit
e8a844355f
1 changed files with 41 additions and 25 deletions
|
|
@ -327,43 +327,31 @@ xdp_session_path(char *sender_name, char *token)
|
||||||
return xaprintf("/org/freedesktop/portal/desktop/session/%s/%s", sender_name, token);
|
return xaprintf("/org/freedesktop/portal/desktop/session/%s/%s", sender_name, token);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
portal_connect_to_eis(struct oeffis *oeffis)
|
static int
|
||||||
|
connect_to_eis_returned(sd_bus_message *m, void *userdata, sd_bus_error *ret_error)
|
||||||
{
|
{
|
||||||
_cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL;
|
|
||||||
_unref_(sd_bus_message) *response = NULL;
|
|
||||||
sd_bus *bus = oeffis->bus;
|
|
||||||
int eisfd;
|
int eisfd;
|
||||||
|
struct oeffis *oeffis = userdata;
|
||||||
|
int rc = sd_bus_message_get_errno(m);
|
||||||
|
|
||||||
int rc = 0;
|
if (rc > 0) {
|
||||||
with_signals_blocked(SIGALRM) {
|
oeffis_disconnect(oeffis, "Error calling ConnectToEIS: %s", strerror(rc));
|
||||||
rc = sd_bus_call_method(bus, oeffis->busname,
|
return rc;
|
||||||
"/org/freedesktop/portal/desktop",
|
|
||||||
"org.freedesktop.portal.RemoteDesktop",
|
|
||||||
"ConnectToEIS",
|
|
||||||
&error,
|
|
||||||
&response,
|
|
||||||
"oa{sv}",
|
|
||||||
oeffis->session_path,
|
|
||||||
0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (rc < 0) {
|
rc = sd_bus_message_read(m, "h", &eisfd);
|
||||||
oeffis_disconnect(oeffis, "Failed to call ConnectToEIS: %s", strerror(-rc));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
rc = sd_bus_message_read(response, "h", &eisfd);
|
|
||||||
if (rc < 0) {
|
if (rc < 0) {
|
||||||
oeffis_disconnect(oeffis, "Unable to get fd from portal: %s", strerror(-rc));
|
oeffis_disconnect(oeffis, "Unable to get fd from portal: %s", strerror(-rc));
|
||||||
return;
|
return -rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* the fd is owned by the message */
|
/* the fd is owned by the message */
|
||||||
rc = xerrno(xdup(eisfd));
|
rc = xerrno(xdup(eisfd));
|
||||||
if (rc < 0) {
|
if (rc < 0) {
|
||||||
oeffis_disconnect(oeffis, "Failed to dup fd: %s", strerror(-rc));
|
oeffis_disconnect(oeffis, "Failed to dup fd: %s", strerror(-rc));
|
||||||
return;
|
return -rc;
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
eisfd = rc;
|
eisfd = rc;
|
||||||
int flags = fcntl(eisfd, F_GETFL, 0);
|
int flags = fcntl(eisfd, F_GETFL, 0);
|
||||||
|
|
@ -373,8 +361,36 @@ portal_connect_to_eis(struct oeffis *oeffis)
|
||||||
log_debug("Got fd %d from portal", eisfd);
|
log_debug("Got fd %d from portal", eisfd);
|
||||||
|
|
||||||
rc = oeffis_set_eis_fd(oeffis, eisfd);
|
rc = oeffis_set_eis_fd(oeffis, eisfd);
|
||||||
if (rc < 0)
|
if (rc < 0) {
|
||||||
oeffis_disconnect(oeffis, "Failed to set the fd: %s", strerror(-rc));
|
oeffis_disconnect(oeffis, "Failed to set the fd: %s", strerror(-rc));
|
||||||
|
return -rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
portal_connect_to_eis(struct oeffis *oeffis)
|
||||||
|
{
|
||||||
|
sd_bus *bus = oeffis->bus;
|
||||||
|
|
||||||
|
int rc = 0;
|
||||||
|
with_signals_blocked(SIGALRM) {
|
||||||
|
rc = sd_bus_call_method_async(bus, NULL, oeffis->busname,
|
||||||
|
"/org/freedesktop/portal/desktop",
|
||||||
|
"org.freedesktop.portal.RemoteDesktop",
|
||||||
|
"ConnectToEIS",
|
||||||
|
&connect_to_eis_returned,
|
||||||
|
oeffis,
|
||||||
|
"oa{sv}",
|
||||||
|
oeffis->session_path,
|
||||||
|
0);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (rc < 0) {
|
||||||
|
oeffis_disconnect(oeffis, "Failed to call ConnectToEIS: %s", strerror(-rc));
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue