X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fvconsole%2Fvconsole-setup.c;h=c1f662baa6e6c546526e437c8934049e568ec19d;hb=614e5fbb8ba192526990a840eef382d0ee94b22d;hp=679dc1aafb77cba7e532a22ee476c3ec5affd261;hpb=d3b37e846950aab3ce940c46204b729552093df8;p=elogind.git diff --git a/src/vconsole/vconsole-setup.c b/src/vconsole/vconsole-setup.c index 679dc1aaf..c1f662baa 100644 --- a/src/vconsole/vconsole-setup.c +++ b/src/vconsole/vconsole-setup.c @@ -39,6 +39,7 @@ #include "log.h" #include "macro.h" #include "virt.h" +#include "fileio.h" static bool is_vconsole(int fd) { unsigned char data[1]; @@ -68,9 +69,22 @@ static int disable_utf8(int fd) { static int enable_utf8(int fd) { int r = 0, k; - - if (ioctl(fd, KDSKBMODE, K_UNICODE) < 0) - r = -errno; + 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; + } if (loop_write(fd, "\033%G", 3, false) < 0) r = -errno; @@ -183,11 +197,12 @@ static void font_copy_to_all_vcs(int fd) { if (i == vcs.v_active) continue; - /* skip unused VTs above tty6 to avoid allocating them */ - if (i > 6 && ((vcs.v_state >> i) & 1) == 0) + /* skip non-allocated ttys */ + snprintf(vcname, sizeof(vcname), "/dev/vcs%i", i); + if (access(vcname, F_OK) < 0) continue; - snprintf(vcname , sizeof(vcname), "/dev/tty%i", i); + snprintf(vcname, sizeof(vcname), "/dev/tty%i", i); vcfd = open_terminal(vcname, O_RDWR|O_CLOEXEC); if (vcfd < 0) continue;