vconsole: add two new toggle functions, remove old enable/disable ones
Add toggle_utf8() and toggle_utf8_sysfs() and use them in place of old enable/disable functions. toggle_utf8() also adds iutf8 setting and is set up to be called per-console (in subsequent patches). Note, that old disable_utf8() didn't bother checking if it was ok to change the kbdmode.
This commit is contained in:
@@ -27,6 +27,7 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <sys/ioctl.h>
|
||||
#include <termios.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include "alloc-util.h"
|
||||
@@ -50,56 +51,38 @@ static bool is_vconsole(int fd) {
|
||||
return ioctl(fd, TIOCLINUX, data) >= 0;
|
||||
}
|
||||
|
||||
static int disable_utf8(int fd) {
|
||||
int r = 0, k;
|
||||
|
||||
if (ioctl(fd, KDSKBMODE, K_XLATE) < 0)
|
||||
r = -errno;
|
||||
|
||||
k = loop_write(fd, "\033%@", 3, false);
|
||||
if (k < 0)
|
||||
r = k;
|
||||
|
||||
k = write_string_file("/sys/module/vt/parameters/default_utf8", "0", 0);
|
||||
if (k < 0)
|
||||
r = k;
|
||||
static int toggle_utf8(int fd, bool utf8) {
|
||||
int r;
|
||||
struct termios tc = {};
|
||||
|
||||
r = ioctl(fd, KDSKBMODE, utf8 ? K_UNICODE : K_XLATE);
|
||||
if (r < 0)
|
||||
log_warning_errno(r, "Failed to disable UTF-8: %m");
|
||||
return log_warning_errno(errno, "Failed to %s UTF-8 kbdmode: %m", utf8 ? "enable" : "disable");
|
||||
|
||||
return r;
|
||||
r = loop_write(fd, utf8 ? "\033%G" : "\033%@", 3, false);
|
||||
if (r < 0)
|
||||
return log_warning_errno(r, "Failed to %s UTF-8 term processing: %m", utf8 ? "enable" : "disable");
|
||||
|
||||
r = tcgetattr(fd, &tc);
|
||||
if (r >= 0) {
|
||||
if (utf8)
|
||||
tc.c_iflag |= IUTF8;
|
||||
else
|
||||
tc.c_iflag &= ~IUTF8;
|
||||
r = tcsetattr(fd, TCSANOW, &tc);
|
||||
}
|
||||
if (r < 0)
|
||||
return log_warning_errno(errno, "Failed to %s iutf8 flag: %m", utf8 ? "enable" : "disable");
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int enable_utf8(int fd) {
|
||||
int r = 0, k;
|
||||
long current = 0;
|
||||
|
||||
if (ioctl(fd, KDGKBMODE, ¤t) < 0 || current == K_XLATE) {
|
||||
/*
|
||||
* Change the current keyboard to unicode, unless it
|
||||
* is currently in raw or off mode anyway. We
|
||||
* shouldn't interfere with X11's processing of the
|
||||
* key events.
|
||||
*
|
||||
* http://lists.freedesktop.org/archives/systemd-devel/2013-February/008573.html
|
||||
*
|
||||
*/
|
||||
|
||||
if (ioctl(fd, KDSKBMODE, K_UNICODE) < 0)
|
||||
r = -errno;
|
||||
}
|
||||
|
||||
k = loop_write(fd, "\033%G", 3, false);
|
||||
if (k < 0)
|
||||
r = k;
|
||||
|
||||
k = write_string_file("/sys/module/vt/parameters/default_utf8", "1", 0);
|
||||
if (k < 0)
|
||||
r = k;
|
||||
static int toggle_utf8_sysfs(bool utf8) {
|
||||
int r;
|
||||
|
||||
r = write_string_file("/sys/module/vt/parameters/default_utf8", one_zero(utf8), 0);
|
||||
if (r < 0)
|
||||
log_warning_errno(r, "Failed to enable UTF-8: %m");
|
||||
|
||||
log_warning_errno(r, "Failed to %s sysfs UTF-8 flag: %m", utf8 ? "enable" : "disable");
|
||||
return r;
|
||||
}
|
||||
|
||||
@@ -306,10 +289,8 @@ int main(int argc, char **argv) {
|
||||
log_warning_errno(r, "Failed to read /proc/cmdline: %m");
|
||||
}
|
||||
|
||||
if (utf8)
|
||||
(void) enable_utf8(fd);
|
||||
else
|
||||
(void) disable_utf8(fd);
|
||||
toggle_utf8_sysfs(utf8);
|
||||
toggle_utf8(fd, utf8);
|
||||
|
||||
font_ok = font_load_and_wait(vc, vc_font, vc_font_map, vc_font_unimap) > 0;
|
||||
keyboard_ok = keyboard_load_and_wait(vc, vc_keymap, vc_keymap_toggle, utf8) > 0;
|
||||
|
||||
Reference in New Issue
Block a user