diff mbox

[3/5] gtk: Fix -serial vc

Message ID 70aa1ca8ff22603126045ebde42f319379d9d4f4.1398360849.git.crobinso@redhat.com
State New
Headers show

Commit Message

Cole Robinson April 24, 2014, 5:35 p.m. UTC
Try kicking off a rhel5 text install over serial, the text menu navigation
is all messed up, and some of the kernel boot messages are randomly
corrupted.

Drop use of a pty and just use vte infrastructure for reading and writing.
This fixes the above corruption, and is simpler to boot.

(I don't know what was wrong with the original code though. FWIW this is
what virt-manager has done for years).

Signed-off-by: Cole Robinson <crobinso@redhat.com>
---
 ui/gtk.c | 41 +++++++++--------------------------------
 1 file changed, 9 insertions(+), 32 deletions(-)

Comments

Gerd Hoffmann April 25, 2014, 8:49 a.m. UTC | #1
On Do, 2014-04-24 at 13:35 -0400, Cole Robinson wrote:
> Drop use of a pty and just use vte infrastructure for reading and
> writing.

Makes perfect sense.  pty is poinless in our vte usage szenario.

cheers,
  Gerd
Andreas Färber April 25, 2014, 12:11 p.m. UTC | #2
Am 24.04.2014 19:35, schrieb Cole Robinson:
> Try kicking off a rhel5 text install over serial, the text menu navigation
> is all messed up, and some of the kernel boot messages are randomly
> corrupted.
> 
> Drop use of a pty and just use vte infrastructure for reading and writing.
> This fixes the above corruption, and is simpler to boot.
> 
> (I don't know what was wrong with the original code though. FWIW this is
> what virt-manager has done for years).
> 
> Signed-off-by: Cole Robinson <crobinso@redhat.com>
> ---
>  ui/gtk.c | 41 +++++++++--------------------------------
>  1 file changed, 9 insertions(+), 32 deletions(-)
> 
> diff --git a/ui/gtk.c b/ui/gtk.c
> index 816ef15..117b0eb 100644
> --- a/ui/gtk.c
> +++ b/ui/gtk.c
[...]
> @@ -1194,18 +1196,11 @@ void early_gtk_display_init(void)
>  }
>  
>  #if defined(CONFIG_VTE)
> -static gboolean gd_vc_in(GIOChannel *chan, GIOCondition cond, void *opaque)
> +static gboolean gd_vc_in(VteTerminal *terminal, gchar *text, guint size,
> +                         gpointer user_data)
>  {
> -    VirtualConsole *vc = opaque;
> -    uint8_t buffer[1024];
> -    ssize_t len;
> -
> -    len = read(vc->fd, buffer, sizeof(buffer));
> -    if (len <= 0) {
> -        return FALSE;
> -    }
> -
> -    qemu_chr_be_write(vc->chr, buffer, len);
> +    VirtualConsole *vc = user_data;

Gerd, can we retain the white line here please? :)

Andreas

> +    qemu_chr_be_write(vc->chr, (uint8_t  *)text, (unsigned int)size);
>  
>      return TRUE;
>  }
[snip]
Gerd Hoffmann April 25, 2014, 12:24 p.m. UTC | #3
> > -    qemu_chr_be_write(vc->chr, buffer, len);
> > +    VirtualConsole *vc = user_data;
> 
> Gerd, can we retain the white line here please? :)
> 
> Andreas
> 
> > +    qemu_chr_be_write(vc->chr, (uint8_t  *)text, (unsigned int)size);

Fixed in my local copy.

cheers,
  Gerd
diff mbox

Patch

diff --git a/ui/gtk.c b/ui/gtk.c
index 816ef15..117b0eb 100644
--- a/ui/gtk.c
+++ b/ui/gtk.c
@@ -115,7 +115,6 @@  typedef struct VirtualConsole
     GtkWidget *scrolled_window;
     CharDriverState *chr;
 #endif
-    int fd;
 } VirtualConsole;
 
 typedef struct GtkDisplayState
@@ -1166,9 +1165,12 @@  static gboolean gd_focus_out_event(GtkWidget *widget,
 
 static int gd_vc_chr_write(CharDriverState *chr, const uint8_t *buf, int len)
 {
+#if defined(CONFIG_VTE)
     VirtualConsole *vc = chr->opaque;
 
-    return vc ? write(vc->fd, buf, len) : len;
+    vte_terminal_feed(VTE_TERMINAL(vc->terminal), (const char *)buf, len);
+#endif
+    return len;
 }
 
 static int nb_vcs;
@@ -1194,18 +1196,11 @@  void early_gtk_display_init(void)
 }
 
 #if defined(CONFIG_VTE)
-static gboolean gd_vc_in(GIOChannel *chan, GIOCondition cond, void *opaque)
+static gboolean gd_vc_in(VteTerminal *terminal, gchar *text, guint size,
+                         gpointer user_data)
 {
-    VirtualConsole *vc = opaque;
-    uint8_t buffer[1024];
-    ssize_t len;
-
-    len = read(vc->fd, buffer, sizeof(buffer));
-    if (len <= 0) {
-        return FALSE;
-    }
-
-    qemu_chr_be_write(vc->chr, buffer, len);
+    VirtualConsole *vc = user_data;
+    qemu_chr_be_write(vc->chr, (uint8_t  *)text, (unsigned int)size);
 
     return TRUE;
 }
@@ -1218,13 +1213,8 @@  static GSList *gd_vc_init(GtkDisplayState *s, VirtualConsole *vc, int index, GSL
     const char *label;
     char buffer[32];
     char path[32];
-#if VTE_CHECK_VERSION(0, 26, 0)
-    VtePty *pty;
-#endif
-    GIOChannel *chan;
     GtkWidget *scrolled_window;
     GtkAdjustment *vadjustment;
-    int master_fd, slave_fd;
     int width, height;
 
     snprintf(buffer, sizeof(buffer), "vc%d", index);
@@ -1244,16 +1234,7 @@  static GSList *gd_vc_init(GtkDisplayState *s, VirtualConsole *vc, int index, GSL
     gtk_accel_map_add_entry(path, GDK_KEY_2 + index, HOTKEY_MODIFIERS);
 
     vc->terminal = vte_terminal_new();
-
-    master_fd = qemu_openpty_raw(&slave_fd, NULL);
-    g_assert(master_fd != -1);
-
-#if VTE_CHECK_VERSION(0, 26, 0)
-    pty = vte_pty_new_foreign(master_fd, NULL);
-    vte_terminal_set_pty_object(VTE_TERMINAL(vc->terminal), pty);
-#else
-    vte_terminal_set_pty(VTE_TERMINAL(vc->terminal), master_fd);
-#endif
+    g_signal_connect(vc->terminal, "commit", G_CALLBACK(gd_vc_in), vc);
 
     vte_terminal_set_scrollback_lines(VTE_TERMINAL(vc->terminal), -1);
 
@@ -1277,7 +1258,6 @@  static GSList *gd_vc_init(GtkDisplayState *s, VirtualConsole *vc, int index, GSL
     gtk_widget_set_size_request(vc->terminal, width, height);
 #endif
 
-    vc->fd = slave_fd;
     vc->chr->opaque = vc;
     vc->scrolled_window = scrolled_window;
 
@@ -1295,9 +1275,6 @@  static GSList *gd_vc_init(GtkDisplayState *s, VirtualConsole *vc, int index, GSL
         vc->chr->init(vc->chr);
     }
 
-    chan = g_io_channel_unix_new(vc->fd);
-    g_io_add_watch(chan, G_IO_IN, gd_vc_in, vc);
-
 #endif /* CONFIG_VTE */
     return group;
 }