main: don't force text mode in console_setup()

When systemd starts, plymouth may be already displaying progress
graphically. Do not switch the console to text mode at that time.
All other users of reset_terminal_fd() do the switch as before.

This avoids a graphical glitch with plymouth, especially visible with
vesafb, but could be also seen as a sub-second blink with radeon.

https://bugzilla.redhat.com/show_bug.cgi?id=785548
This commit is contained in:
Michal Schmidt
2012-01-29 21:55:51 +01:00
parent 9c07474c6f
commit 512947d46f
3 changed files with 13 additions and 7 deletions
+6 -2
View File
@@ -200,12 +200,16 @@ static int console_setup(bool do_reset) {
if (!do_reset)
return 0;
if ((tty_fd = open_terminal("/dev/console", O_WRONLY|O_NOCTTY|O_CLOEXEC)) < 0) {
tty_fd = open_terminal("/dev/console", O_WRONLY|O_NOCTTY|O_CLOEXEC);
if (tty_fd < 0) {
log_error("Failed to open /dev/console: %s", strerror(-tty_fd));
return -tty_fd;
}
if ((r = reset_terminal_fd(tty_fd)) < 0)
/* We don't want to force text mode.
* plymouth may be showing pictures already from initrd. */
r = reset_terminal_fd(tty_fd, false);
if (r < 0)
log_error("Failed to reset /dev/console: %s", strerror(-r));
close_nointr_nofail(tty_fd);
+6 -4
View File
@@ -2544,7 +2544,7 @@ int ask(char *ret, const char *replies, const char *text, ...) {
}
}
int reset_terminal_fd(int fd) {
int reset_terminal_fd(int fd, bool switch_to_text) {
struct termios termios;
int r = 0;
@@ -2560,7 +2560,8 @@ int reset_terminal_fd(int fd) {
ioctl(fd, TIOCNXCL);
/* Switch to text mode */
ioctl(fd, KDSETMODE, KD_TEXT);
if (switch_to_text)
ioctl(fd, KDSETMODE, KD_TEXT);
/* Enable console unicode mode */
ioctl(fd, KDSKBMODE, K_UNICODE);
@@ -2614,7 +2615,7 @@ int reset_terminal(const char *name) {
if (fd < 0)
return fd;
r = reset_terminal_fd(fd);
r = reset_terminal_fd(fd, true);
close_nointr_nofail(fd);
return r;
@@ -2808,7 +2809,8 @@ int acquire_terminal(const char *name, bool fail, bool force, bool ignore_tiocst
if (notify >= 0)
close_nointr_nofail(notify);
if ((r = reset_terminal_fd(fd)) < 0)
r = reset_terminal_fd(fd, true);
if (r < 0)
log_warning("Failed to reset terminal: %s", strerror(-r));
return fd;
+1 -1
View File
@@ -330,7 +330,7 @@ int chvt(int vt);
int read_one_char(FILE *f, char *ret, usec_t timeout, bool *need_nl);
int ask(char *ret, const char *replies, const char *text, ...);
int reset_terminal_fd(int fd);
int reset_terminal_fd(int fd, bool switch_to_text);
int reset_terminal(const char *name);
int open_terminal(const char *name, int mode);