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:
+6
-2
@@ -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
@@ -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
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user