return 0;
}
-static int vconsole_convert_to_x11_and_emit(Context *c, sd_bus_message *m) {
- int r;
-
- assert(c);
- assert(m);
-
- r = x11_read_data(c, m);
- if (r < 0)
- return r;
-
- r = vconsole_convert_to_x11(c);
- if (r <= 0)
- return r;
-
- /* modified */
- r = x11_write_data(c);
- if (r < 0)
- return log_error_errno(r, "Failed to write X11 keyboard layout: %m");
-
- sd_bus_emit_properties_changed(sd_bus_message_get_bus(m),
- "/org/freedesktop/locale1",
- "org.freedesktop.locale1",
- "X11Layout", "X11Model", "X11Variant", "X11Options", NULL);
-
- return 1;
-}
-
-static int x11_convert_to_vconsole_and_emit(Context *c, sd_bus_message *m) {
- int r;
-
- assert(c);
- assert(m);
-
- r = vconsole_read_data(c, m);
- if (r < 0)
- return r;
-
- r = x11_convert_to_vconsole(c);
- if (r <= 0)
- return r;
-
- /* modified */
- r = vconsole_write_data(c);
- if (r < 0)
- log_error_errno(r, "Failed to save virtual console keymap: %m");
-
- sd_bus_emit_properties_changed(sd_bus_message_get_bus(m),
- "/org/freedesktop/locale1",
- "org.freedesktop.locale1",
- "VConsoleKeymap", "VConsoleKeymapToggle", NULL);
-
- return vconsole_reload(sd_bus_message_get_bus(m));
-}
-
static int property_get_locale(
sd_bus *bus,
const char *path,
free_and_strdup(&c->vc_keymap_toggle, keymap_toggle) < 0)
return -ENOMEM;
+ if (convert) {
+ r = x11_read_data(c, m);
+ if (r < 0) {
+ log_error_errno(r, "Failed to read X11 keyboard layout data: %m");
+ return sd_bus_error_set_errnof(error, r, "Failed to read X11 keyboard layout data: %m");
+ }
+
+ r = vconsole_convert_to_x11(c);
+ if (r < 0) {
+ log_error_errno(r, "Failed to convert keymap data: %m");
+ return sd_bus_error_set_errnof(error, r, "Failed to convert keymap data: %m");
+ }
+
+ /* save the result of conversion to emit changed properties later. */
+ convert = r > 0;
+ }
+
r = vconsole_write_data(c);
if (r < 0) {
log_error_errno(r, "Failed to set virtual console keymap: %m");
return sd_bus_error_set_errnof(error, r, "Failed to set virtual console keymap: %m");
}
+ if (convert) {
+ r = x11_write_data(c);
+ if (r < 0)
+ log_warning_errno(r, "Failed to write X11 keyboard layout, ignoring: %m");
+ }
+
log_info("Changed virtual console keymap to '%s' toggle '%s'",
strempty(c->vc_keymap), strempty(c->vc_keymap_toggle));
sd_bus_message_get_bus(m),
"/org/freedesktop/locale1",
"org.freedesktop.locale1",
- "VConsoleKeymap", "VConsoleKeymapToggle", NULL);
-
- if (convert) {
- r = vconsole_convert_to_x11_and_emit(c, m);
- if (r < 0)
- log_error_errno(r, "Failed to convert keymap data: %m");
- }
+ "VConsoleKeymap", "VConsoleKeymapToggle",
+ convert ? "X11Layout" : NULL,
+ convert ? "X11Model" : NULL,
+ convert ? "X11Variant" : NULL,
+ convert ? "X11Options" : NULL,
+ NULL);
return sd_bus_reply_method_return(m, NULL);
}
if (r < 0)
return log_oom();
+ if (convert) {
+ r = vconsole_read_data(c, m);
+ if (r < 0) {
+ log_error_errno(r, "Failed to read virtual console keymap data: %m");
+ return sd_bus_error_set_errnof(error, r, "Failed to read virtual console keymap data: %m");
+ }
+
+ r = x11_convert_to_vconsole(c);
+ if (r < 0) {
+ log_error_errno(r, "Failed to convert keymap data: %m");
+ return sd_bus_error_set_errnof(error, r, "Failed to convert keymap data: %m");
+ }
+
+ /* save the result of conversion to emit changed properties later. */
+ convert = r > 0;
+ }
+
+ if (convert) {
+ r = vconsole_write_data(c);
+ if (r < 0)
+ log_warning_errno(r, "Failed to update vconsole.conf, ignoring: %m");
+ }
+
r = x11_write_data(c);
if (r < 0) {
log_error_errno(r, "Failed to set X11 keyboard layout: %m");
sd_bus_message_get_bus(m),
"/org/freedesktop/locale1",
"org.freedesktop.locale1",
- "X11Layout", "X11Model", "X11Variant", "X11Options", NULL);
+ "X11Layout", "X11Model", "X11Variant", "X11Options",
+ convert ? "VConsoleKeymap" : NULL,
+ convert ? "VConsoleKeymapToggle" : NULL,
+ NULL);
- if (convert) {
- r = x11_convert_to_vconsole_and_emit(c, m);
- if (r < 0)
- log_error_errno(r, "Failed to convert keymap data: %m");
- }
+ if (convert)
+ (void) vconsole_reload(sd_bus_message_get_bus(m));
return sd_bus_reply_method_return(m, NULL);
}