From patchwork Tue May 6 12:05:44 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Gerd Hoffmann X-Patchwork-Id: 346156 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 5034114013F for ; Tue, 6 May 2014 22:15:05 +1000 (EST) Received: from localhost ([::1]:34822 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1WheH1-0002no-4K for incoming@patchwork.ozlabs.org; Tue, 06 May 2014 08:15:03 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:51676) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Whe8Y-00061A-KP for qemu-devel@nongnu.org; Tue, 06 May 2014 08:06:26 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Whe8O-0001Y5-5t for qemu-devel@nongnu.org; Tue, 06 May 2014 08:06:18 -0400 Received: from mx1.redhat.com ([209.132.183.28]:63232) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Whe8N-0001XY-UY for qemu-devel@nongnu.org; Tue, 06 May 2014 08:06:08 -0400 Received: from int-mx11.intmail.prod.int.phx2.redhat.com (int-mx11.intmail.prod.int.phx2.redhat.com [10.5.11.24]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id s46C67gU010381 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 6 May 2014 08:06:07 -0400 Received: from nilsson.home.kraxel.org (ovpn-116-108.ams2.redhat.com [10.36.116.108]) by int-mx11.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id s46C64iG001961; Tue, 6 May 2014 08:06:05 -0400 Received: by nilsson.home.kraxel.org (Postfix, from userid 500) id 98A3E807E7; Tue, 6 May 2014 14:06:02 +0200 (CEST) From: Gerd Hoffmann To: qemu-devel@nongnu.org Date: Tue, 6 May 2014 14:05:44 +0200 Message-Id: <1399377958-20076-9-git-send-email-kraxel@redhat.com> In-Reply-To: <1399377958-20076-1-git-send-email-kraxel@redhat.com> References: <1399377958-20076-1-git-send-email-kraxel@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x X-Received-From: 209.132.183.28 Cc: Gerd Hoffmann , Anthony Liguori Subject: [Qemu-devel] [PATCH 08/22] gtk: support multiple gfx displays X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Signed-off-by: Gerd Hoffmann --- ui/gtk.c | 80 ++++++++++++++++++++++++++++++++++------------------------------ 1 file changed, 43 insertions(+), 37 deletions(-) diff --git a/ui/gtk.c b/ui/gtk.c index bc42f68..0756432 100644 --- a/ui/gtk.c +++ b/ui/gtk.c @@ -1206,6 +1206,26 @@ static gboolean gd_focus_out_event(GtkWidget *widget, /** Virtual Console Callbacks **/ +static GSList *gd_vc_menu_init(GtkDisplayState *s, VirtualConsole *vc, + const char *label, int idx, + GSList *group, GtkWidget *view_menu) +{ + char path[32]; + + snprintf(path, sizeof(path), "/View/VC%d", idx); + + vc->menu_item = gtk_radio_menu_item_new_with_mnemonic(group, label); + group = gtk_radio_menu_item_get_group(GTK_RADIO_MENU_ITEM(vc->menu_item)); + gtk_menu_item_set_accel_path(GTK_MENU_ITEM(vc->menu_item), path); + gtk_accel_map_add_entry(path, GDK_KEY_1 + idx, HOTKEY_MODIFIERS); + + g_signal_connect(vc->menu_item, "activate", + G_CALLBACK(gd_menu_switch_vc), s); + gtk_menu_shell_append(GTK_MENU_SHELL(view_menu), vc->menu_item); + + return group; +} + #if defined(CONFIG_VTE) static void gd_vc_adjustment_changed(GtkAdjustment *adjustment, void *opaque) { @@ -1253,32 +1273,22 @@ static gboolean gd_vc_in(VteTerminal *terminal, gchar *text, guint size, return TRUE; } -static GSList *gd_vc_vte_init(GtkDisplayState *s, VirtualConsole *vc, int index, +static GSList *gd_vc_vte_init(GtkDisplayState *s, VirtualConsole *vc, + CharDriverState *chr, int idx, GSList *group, GtkWidget *view_menu) { const char *label; char buffer[32]; - char path[32]; GtkWidget *box; GtkWidget *scrollbar; GtkAdjustment *vadjustment; - snprintf(buffer, sizeof(buffer), "vc%d", index); - snprintf(path, sizeof(path), "/View/VC%d", index); - vc->s = s; - vc->vte.chr = vcs[index]; - - if (vc->vte.chr->label) { - label = vc->vte.chr->label; - } else { - label = buffer; - } + vc->vte.chr = chr; - vc->menu_item = gtk_radio_menu_item_new_with_mnemonic(group, label); - group = gtk_radio_menu_item_get_group(GTK_RADIO_MENU_ITEM(vc->menu_item)); - gtk_menu_item_set_accel_path(GTK_MENU_ITEM(vc->menu_item), path); - gtk_accel_map_add_entry(path, GDK_KEY_2 + index, HOTKEY_MODIFIERS); + snprintf(buffer, sizeof(buffer), "vc%d", idx); + label = vc->vte.chr->label ? vc->vte.chr->label : buffer; + group = gd_vc_menu_init(s, vc, vc->vte.chr->label, idx, group, view_menu); vc->vte.terminal = vte_terminal_new(); g_signal_connect(vc->vte.terminal, "commit", G_CALLBACK(gd_vc_in), vc); @@ -1315,10 +1325,6 @@ static GSList *gd_vc_vte_init(GtkDisplayState *s, VirtualConsole *vc, int index, vc->tab_item = box; gtk_notebook_append_page(GTK_NOTEBOOK(s->notebook), vc->tab_item, gtk_label_new(label)); - g_signal_connect(vc->menu_item, "activate", - G_CALLBACK(gd_menu_switch_vc), s); - - gtk_menu_shell_append(GTK_MENU_SHELL(view_menu), vc->menu_item); qemu_chr_be_generic_open(vc->vte.chr); if (vc->vte.chr->init) { @@ -1328,15 +1334,14 @@ static GSList *gd_vc_vte_init(GtkDisplayState *s, VirtualConsole *vc, int index, return group; } -static void gd_vcs_init(GtkDisplayState *s, int offset, GSList *group, +static void gd_vcs_init(GtkDisplayState *s, GSList *group, GtkWidget *view_menu) { int i; for (i = 0; i < nb_vcs; i++) { - VirtualConsole *vc = &s->vc[offset+i]; - - group = gd_vc_vte_init(s, vc, i, group, view_menu); + VirtualConsole *vc = &s->vc[s->nb_vcs]; + group = gd_vc_vte_init(s, vc, vcs[i], s->nb_vcs, group, view_menu); s->nb_vcs++; } } @@ -1449,7 +1454,7 @@ static const DisplayChangeListenerOps dcl_ops = { }; static GSList *gd_vc_gfx_init(GtkDisplayState *s, VirtualConsole *vc, - QemuConsole *con, int index, + QemuConsole *con, int idx, GSList *group, GtkWidget *view_menu) { vc->s = s; @@ -1475,15 +1480,7 @@ static GSList *gd_vc_gfx_init(GtkDisplayState *s, VirtualConsole *vc, vc->tab_item, gtk_label_new("VGA")); gd_connect_vc_gfx_signals(vc); - vc->menu_item = gtk_radio_menu_item_new_with_mnemonic(group, "_VGA"); - group = gtk_radio_menu_item_get_group(GTK_RADIO_MENU_ITEM(vc->menu_item)); - gtk_menu_item_set_accel_path(GTK_MENU_ITEM(vc->menu_item), - "/View/VGA"); - gtk_accel_map_add_entry("/View/VGA", GDK_KEY_1, HOTKEY_MODIFIERS); - gtk_menu_shell_append(GTK_MENU_SHELL(view_menu), vc->menu_item); - - g_signal_connect(vc->menu_item, "activate", - G_CALLBACK(gd_menu_switch_vc), s); + group = gd_vc_menu_init(s, vc, "VGA", idx, group, view_menu); vc->gfx.dcl.ops = &dcl_ops; vc->gfx.dcl.con = con; @@ -1497,6 +1494,8 @@ static GtkWidget *gd_create_menu_view(GtkDisplayState *s, GtkAccelGroup *accel_g GSList *group = NULL; GtkWidget *view_menu; GtkWidget *separator; + QemuConsole *con; + int vc; view_menu = gtk_menu_new(); gtk_menu_set_accel_group(GTK_MENU(view_menu), accel_group); @@ -1552,12 +1551,19 @@ static GtkWidget *gd_create_menu_view(GtkDisplayState *s, GtkAccelGroup *accel_g gtk_menu_shell_append(GTK_MENU_SHELL(view_menu), separator); /* gfx */ - group = gd_vc_gfx_init(s, &s->vc[0], qemu_console_lookup_by_index(0), 0, - group, view_menu); + for (vc = 0;; vc++) { + con = qemu_console_lookup_by_index(vc); + if (!con || !qemu_console_is_graphic(con)) { + break; + } + group = gd_vc_gfx_init(s, &s->vc[vc], con, + vc, group, view_menu); + s->nb_vcs++; + } #if defined(CONFIG_VTE) /* vte */ - gd_vcs_init(s, 1, group, view_menu); + gd_vcs_init(s, group, view_menu); #endif separator = gtk_separator_menu_item_new();