diff --git a/src/ratbagd-resolution.c b/src/ratbagd-resolution.c index 0dc9b4e5..bd54e6ed 100644 --- a/src/ratbagd-resolution.c +++ b/src/ratbagd-resolution.c @@ -45,12 +45,52 @@ struct ratbagd_resolution { sd_bus_slot *profile_enum_slot; }; +static int ratbagd_resolution_set_report_rate(sd_bus_message *m, + void *userdata, + sd_bus_error *error) +{ + struct ratbagd_resolution *resolution = userdata; + unsigned int rate; + int r; + + r = sd_bus_message_read(m, "u", &rate); + if (r < 0) + return r; + + /* basic sanity check */ + if (rate > 5000 || rate % 100) + return 0; + + r = ratbag_resolution_set_report_rate(resolution->lib_resolution, + rate); + return sd_bus_reply_method_return(m, "u", r); +} + +static int ratbagd_resolution_set_resolution(sd_bus_message *m, + void *userdata, + sd_bus_error *error) +{ + struct ratbagd_resolution *resolution = userdata; + unsigned int xres, yres; + int r; + + r = sd_bus_message_read(m, "uu", &xres, &yres); + if (r < 0) + return r; + + r = ratbag_resolution_set_dpi_xy(resolution->lib_resolution, + xres, yres); + return sd_bus_reply_method_return(m, "u", r); +} + const sd_bus_vtable ratbagd_resolution_vtable[] = { SD_BUS_VTABLE_START(0), SD_BUS_PROPERTY("Index", "u", NULL, offsetof(struct ratbagd_resolution, index), SD_BUS_VTABLE_PROPERTY_CONST), - SD_BUS_PROPERTY("XResolution", "u", NULL, offsetof(struct ratbagd_resolution, xres), SD_BUS_VTABLE_PROPERTY_CONST), - SD_BUS_PROPERTY("YResolution", "u", NULL, offsetof(struct ratbagd_resolution, yres), SD_BUS_VTABLE_PROPERTY_CONST), - SD_BUS_PROPERTY("ReportRate", "u", NULL, offsetof(struct ratbagd_resolution, rate), SD_BUS_VTABLE_PROPERTY_CONST), + SD_BUS_PROPERTY("XResolution", "u", NULL, offsetof(struct ratbagd_resolution, xres), 0), + SD_BUS_PROPERTY("YResolution", "u", NULL, offsetof(struct ratbagd_resolution, yres), 0), + SD_BUS_PROPERTY("ReportRate", "u", NULL, offsetof(struct ratbagd_resolution, rate), 0), + SD_BUS_METHOD("SetReportRate", "u", "u", ratbagd_resolution_set_report_rate, SD_BUS_VTABLE_UNPRIVILEGED), + SD_BUS_METHOD("SetResolution", "uu", "u", ratbagd_resolution_set_resolution, SD_BUS_VTABLE_UNPRIVILEGED), SD_BUS_VTABLE_END, };