logind: Merge PropertiesChanged handlers
This commit is contained in:
parent
74eee486fa
commit
6e6903829e
1 changed files with 32 additions and 102 deletions
|
@ -351,7 +351,7 @@ static int resume_device(sd_bus_message *msg, void *userdata, sd_bus_error *ret_
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int session_properties_changed(sd_bus_message *msg, void *userdata, sd_bus_error *ret_error) {
|
static int properties_changed(sd_bus_message *msg, void *userdata, sd_bus_error *ret_error) {
|
||||||
(void)ret_error;
|
(void)ret_error;
|
||||||
struct backend_logind *session = userdata;
|
struct backend_logind *session = userdata;
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
@ -367,7 +367,9 @@ static int session_properties_changed(sd_bus_message *msg, void *userdata, sd_bu
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (strcmp(interface, "org.freedesktop.login1.Session") != 0) {
|
bool is_session = strcmp(interface, "org.freedesktop.login1.Session") == 0;
|
||||||
|
bool is_seat = strcmp(interface, "org.freedesktop.login1.Seat") == 0;
|
||||||
|
if (!is_session || !is_seat) {
|
||||||
// not interesting for us; ignore
|
// not interesting for us; ignore
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -385,21 +387,26 @@ static int session_properties_changed(sd_bus_message *msg, void *userdata, sd_bu
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (strcmp(s, "Active") == 0) {
|
if ((is_session && strcmp(s, "Active") == 0) ||
|
||||||
|
(is_seat && strcmp(s, "CanGraphical"))) {
|
||||||
int ret;
|
int ret;
|
||||||
ret = sd_bus_message_enter_container(msg, 'v', "b");
|
ret = sd_bus_message_enter_container(msg, 'v', "b");
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool active;
|
bool value;
|
||||||
ret = sd_bus_message_read_basic(msg, 'b', &active);
|
ret = sd_bus_message_read_basic(msg, 'b', &value);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
log_debugf("Active state changed: %d", active);
|
log_debugf("%s state changed: %d", s, value);
|
||||||
set_active(session, active);
|
if (is_session) {
|
||||||
|
set_active(session, value);
|
||||||
|
} else {
|
||||||
|
session->can_graphical = value;
|
||||||
|
}
|
||||||
return 0;
|
return 0;
|
||||||
} else {
|
} else {
|
||||||
sd_bus_message_skip(msg, "{sv}");
|
sd_bus_message_skip(msg, "{sv}");
|
||||||
|
@ -423,111 +430,34 @@ static int session_properties_changed(sd_bus_message *msg, void *userdata, sd_bu
|
||||||
// PropertiesChanged arg 3: changed properties without values
|
// PropertiesChanged arg 3: changed properties without values
|
||||||
sd_bus_message_enter_container(msg, 'a', "s");
|
sd_bus_message_enter_container(msg, 'a', "s");
|
||||||
while ((ret = sd_bus_message_read_basic(msg, 's', &s)) > 0) {
|
while ((ret = sd_bus_message_read_basic(msg, 's', &s)) > 0) {
|
||||||
if (strcmp(s, "Active") == 0) {
|
if ((is_session && strcmp(s, "Active") == 0) ||
|
||||||
|
(is_seat && strcmp(s, "CanGraphical"))) {
|
||||||
sd_bus_error error = SD_BUS_ERROR_NULL;
|
sd_bus_error error = SD_BUS_ERROR_NULL;
|
||||||
bool active;
|
const char *obj = is_session ? "org.freedesktop.login1.Session"
|
||||||
|
: "org.freedesktop.login1.Seat";
|
||||||
|
const char *field = is_session ? "Active" : "CanGraphical";
|
||||||
|
bool value;
|
||||||
ret = sd_bus_get_property_trivial(session->bus, "org.freedesktop.login1",
|
ret = sd_bus_get_property_trivial(session->bus, "org.freedesktop.login1",
|
||||||
session->path,
|
session->path, obj, field, &error, 'b',
|
||||||
"org.freedesktop.login1.Session",
|
&value);
|
||||||
"Active", &error, 'b', &active);
|
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
log_errorf("Could not get 'Active' property: %s", error.message);
|
log_errorf("Could not get '%s' property: %s", field, error.message);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
log_debugf("Active state changed: %d", active);
|
log_debugf("%s state changed: %d", field, value);
|
||||||
set_active(session, active);
|
if (is_session) {
|
||||||
|
set_active(session, value);
|
||||||
|
} else {
|
||||||
|
session->can_graphical = value;
|
||||||
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
error:
|
error:
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
log_errorf("Could not parse D-Bus PropertiesChanged on session: %s", strerror(-ret));
|
log_errorf("Could not parse D-Bus PropertiesChanged: %s", strerror(-ret));
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int seat_properties_changed(sd_bus_message *msg, void *userdata, sd_bus_error *ret_error) {
|
|
||||||
(void)ret_error;
|
|
||||||
struct backend_logind *session = userdata;
|
|
||||||
int ret = 0;
|
|
||||||
|
|
||||||
if (session->has_drm > 0) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// PropertiesChanged arg 1: interface
|
|
||||||
const char *interface;
|
|
||||||
ret = sd_bus_message_read_basic(msg, 's', &interface); // skip path
|
|
||||||
if (ret < 0) {
|
|
||||||
goto error;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (strcmp(interface, "org.freedesktop.login1.Seat") != 0) {
|
|
||||||
// not interesting for us; ignore
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// PropertiesChanged arg 2: changed properties with values
|
|
||||||
ret = sd_bus_message_enter_container(msg, 'a', "{sv}");
|
|
||||||
if (ret < 0) {
|
|
||||||
goto error;
|
|
||||||
}
|
|
||||||
|
|
||||||
const char *s;
|
|
||||||
while ((ret = sd_bus_message_enter_container(msg, 'e', "sv")) > 0) {
|
|
||||||
ret = sd_bus_message_read_basic(msg, 's', &s);
|
|
||||||
if (ret < 0) {
|
|
||||||
goto error;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (strcmp(s, "CanGraphical") == 0) {
|
|
||||||
int ret;
|
|
||||||
ret = sd_bus_message_enter_container(msg, 'v', "b");
|
|
||||||
if (ret < 0) {
|
|
||||||
goto error;
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = sd_bus_message_read_basic(msg, 'b', &session->can_graphical);
|
|
||||||
if (ret < 0) {
|
|
||||||
goto error;
|
|
||||||
}
|
|
||||||
log_debugf("CanGraphical state changed: %d", session->can_graphical);
|
|
||||||
return 0;
|
|
||||||
} else {
|
|
||||||
sd_bus_message_skip(msg, "{sv}");
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = sd_bus_message_exit_container(msg);
|
|
||||||
if (ret < 0) {
|
|
||||||
goto error;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ret < 0) {
|
|
||||||
goto error;
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = sd_bus_message_exit_container(msg);
|
|
||||||
if (ret < 0) {
|
|
||||||
goto error;
|
|
||||||
}
|
|
||||||
|
|
||||||
// PropertiesChanged arg 3: changed properties without values
|
|
||||||
sd_bus_message_enter_container(msg, 'a', "s");
|
|
||||||
while ((ret = sd_bus_message_read_basic(msg, 's', &s)) > 0) {
|
|
||||||
if (strcmp(s, "CanGraphical") == 0) {
|
|
||||||
session->can_graphical = sd_seat_can_graphical(session->seat);
|
|
||||||
log_debugf("CanGraphical state changed: %d", session->can_graphical);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
error:
|
|
||||||
if (ret < 0) {
|
|
||||||
log_errorf("Could not parse D-Bus PropertiesChanged on seat: %s", strerror(-ret));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -554,14 +484,14 @@ static bool add_signal_matches(struct backend_logind *backend) {
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = sd_bus_match_signal(backend->bus, NULL, logind, backend->path, property_interface,
|
ret = sd_bus_match_signal(backend->bus, NULL, logind, backend->path, property_interface,
|
||||||
"PropertiesChanged", session_properties_changed, backend);
|
"PropertiesChanged", properties_changed, backend);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
log_errorf("Could not add D-Bus match: %s", strerror(-ret));
|
log_errorf("Could not add D-Bus match: %s", strerror(-ret));
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = sd_bus_match_signal(backend->bus, NULL, logind, backend->seat_path, property_interface,
|
ret = sd_bus_match_signal(backend->bus, NULL, logind, backend->seat_path, property_interface,
|
||||||
"PropertiesChanged", seat_properties_changed, backend);
|
"PropertiesChanged", properties_changed, backend);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
log_errorf("Could not add D-Bus match: %s", strerror(-ret));
|
log_errorf("Could not add D-Bus match: %s", strerror(-ret));
|
||||||
return false;
|
return false;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue