From patchwork Fri Feb 22 19:53:33 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jan Kiszka X-Patchwork-Id: 222626 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)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id 3B4F82C02AD for ; Sat, 23 Feb 2013 06:53:55 +1100 (EST) Received: from localhost ([::1]:45635 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1U8ygr-0007Ll-Fr for incoming@patchwork.ozlabs.org; Fri, 22 Feb 2013 14:53:53 -0500 Received: from eggs.gnu.org ([208.118.235.92]:33601) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1U8yge-0007KJ-S8 for qemu-devel@nongnu.org; Fri, 22 Feb 2013 14:53:46 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1U8ygZ-0008Qy-GS for qemu-devel@nongnu.org; Fri, 22 Feb 2013 14:53:40 -0500 Received: from goliath.siemens.de ([192.35.17.28]:29397) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1U8ygZ-0008Qm-6j for qemu-devel@nongnu.org; Fri, 22 Feb 2013 14:53:35 -0500 Received: from mail1.siemens.de (localhost [127.0.0.1]) by goliath.siemens.de (8.13.6/8.13.6) with ESMTP id r1MJrX3q018245; Fri, 22 Feb 2013 20:53:33 +0100 Received: from mchn199C.mchp.siemens.de ([139.25.109.49]) by mail1.siemens.de (8.13.6/8.13.6) with ESMTP id r1MJrXON022881; Fri, 22 Feb 2013 20:53:33 +0100 Message-ID: <5127CCBD.9090301@siemens.com> Date: Fri, 22 Feb 2013 20:53:33 +0100 From: Jan Kiszka User-Agent: Mozilla/5.0 (X11; U; Linux i686 (x86_64); de; rv:1.8.1.12) Gecko/20080226 SUSE/2.0.0.12-1.1 Thunderbird/2.0.0.12 Mnenhy/0.7.5.666 MIME-Version: 1.0 To: Anthony Liguori References: <51279CFC.2060601@siemens.com> <871uc8tgkp.fsf@codemonkey.ws> <5127A82F.4070000@siemens.com> <87a9qw8cbv.fsf@codemonkey.ws> <5127B1FC.6040103@siemens.com> <87bobcupvp.fsf@codemonkey.ws> In-Reply-To: <87bobcupvp.fsf@codemonkey.ws> X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.4.x X-Received-From: 192.35.17.28 Cc: qemu-devel Subject: [Qemu-devel] [PATCH v4] gtk: Rename File to Machine menu and add pause, reset and power down items 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 This adds basic guest control commands to the "Machine" menu - a nice added-value for the GTK UI. We use "pause" as the term for stopping the machine here. So reword also the related caption tag. Signed-off-by: Jan Kiszka --- Changes in v3: - stop -> pause renaming ui/gtk.c | 80 ++++++++++++++++++++++++++++++++++++++++++++++++++++--------- 1 files changed, 68 insertions(+), 12 deletions(-) diff --git a/ui/gtk.c b/ui/gtk.c index bc4ec67..9762e26 100644 --- a/ui/gtk.c +++ b/ui/gtk.c @@ -80,8 +80,11 @@ typedef struct GtkDisplayState GtkAccelGroup *accel_group; - GtkWidget *file_menu_item; - GtkWidget *file_menu; + GtkWidget *machine_menu_item; + GtkWidget *machine_menu; + GtkWidget *pause_item; + GtkWidget *reset_item; + GtkWidget *powerdown_item; GtkWidget *quit_item; GtkWidget *view_menu_item; @@ -117,6 +120,8 @@ typedef struct GtkDisplayState GdkCursor *null_cursor; Notifier mouse_mode_notifier; gboolean free_scale; + + bool external_pause_update; } GtkDisplayState; static GtkDisplayState *global_state; @@ -160,14 +165,19 @@ static void gd_update_caption(GtkDisplayState *s) const char *status = ""; gchar *title; const char *grab = ""; + bool is_paused = !runstate_is_running(); if (gd_is_grab_active(s)) { grab = " - Press Ctrl+Alt+G to release grab"; } - if (!runstate_is_running()) { - status = " [Stopped]"; + if (is_paused) { + status = " [Paused]"; } + s->external_pause_update = true; + gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(s->pause_item), + is_paused); + s->external_pause_update = false; if (qemu_name) { title = g_strdup_printf("QEMU (%s)%s%s", qemu_name, status, grab); @@ -584,6 +594,30 @@ static gboolean gd_key_event(GtkWidget *widget, GdkEventKey *key, void *opaque) /** Window Menu Actions **/ +static void gd_menu_pause(GtkMenuItem *item, void *opaque) +{ + GtkDisplayState *s = opaque; + + if (s->external_pause_update) { + return; + } + if (runstate_is_running()) { + qmp_stop(NULL); + } else { + qmp_cont(NULL); + } +} + +static void gd_menu_reset(GtkMenuItem *item, void *opaque) +{ + qmp_system_reset(NULL); +} + +static void gd_menu_powerdown(GtkMenuItem *item, void *opaque) +{ + qmp_system_powerdown(NULL); +} + static void gd_menu_quit(GtkMenuItem *item, void *opaque) { qmp_quit(NULL); @@ -952,6 +986,12 @@ static void gd_connect_signals(GtkDisplayState *s) g_signal_connect(s->drawing_area, "key-release-event", G_CALLBACK(gd_key_event), s); + g_signal_connect(s->pause_item, "activate", + G_CALLBACK(gd_menu_pause), s); + g_signal_connect(s->reset_item, "activate", + G_CALLBACK(gd_menu_reset), s); + g_signal_connect(s->powerdown_item, "activate", + G_CALLBACK(gd_menu_powerdown), s); g_signal_connect(s->quit_item, "activate", G_CALLBACK(gd_menu_quit), s); g_signal_connect(s->full_screen_item, "activate", @@ -985,15 +1025,31 @@ static void gd_create_menus(GtkDisplayState *s) int i; accel_group = gtk_accel_group_new(); - s->file_menu = gtk_menu_new(); - gtk_menu_set_accel_group(GTK_MENU(s->file_menu), accel_group); - s->file_menu_item = gtk_menu_item_new_with_mnemonic(_("_File")); + s->machine_menu = gtk_menu_new(); + gtk_menu_set_accel_group(GTK_MENU(s->machine_menu), accel_group); + s->machine_menu_item = gtk_menu_item_new_with_mnemonic(_("_Machine")); + + s->pause_item = gtk_check_menu_item_new_with_mnemonic(_("_Pause")); + gtk_menu_append(GTK_MENU(s->machine_menu), s->pause_item); + + separator = gtk_separator_menu_item_new(); + gtk_menu_append(GTK_MENU(s->machine_menu), separator); + + s->reset_item = gtk_image_menu_item_new_with_mnemonic(_("_Reset")); + gtk_menu_append(GTK_MENU(s->machine_menu), s->reset_item); + + s->powerdown_item = gtk_image_menu_item_new_with_mnemonic(_("Power _Down")); + gtk_menu_append(GTK_MENU(s->machine_menu), s->powerdown_item); + + separator = gtk_separator_menu_item_new(); + gtk_menu_append(GTK_MENU(s->machine_menu), separator); s->quit_item = gtk_image_menu_item_new_from_stock(GTK_STOCK_QUIT, NULL); gtk_stock_lookup(GTK_STOCK_QUIT, &item); gtk_menu_item_set_accel_path(GTK_MENU_ITEM(s->quit_item), - "/File/Quit"); - gtk_accel_map_add_entry("/File/Quit", item.keyval, item.modifier); + "/Machine/Quit"); + gtk_accel_map_add_entry("/Machine/Quit", item.keyval, item.modifier); + gtk_menu_append(GTK_MENU(s->machine_menu), s->quit_item); s->view_menu = gtk_menu_new(); gtk_menu_set_accel_group(GTK_MENU(s->view_menu), accel_group); @@ -1068,9 +1124,9 @@ static void gd_create_menus(GtkDisplayState *s) gtk_window_add_accel_group(GTK_WINDOW(s->window), accel_group); s->accel_group = accel_group; - gtk_menu_append(GTK_MENU(s->file_menu), s->quit_item); - gtk_menu_item_set_submenu(GTK_MENU_ITEM(s->file_menu_item), s->file_menu); - gtk_menu_shell_append(GTK_MENU_SHELL(s->menu_bar), s->file_menu_item); + gtk_menu_item_set_submenu(GTK_MENU_ITEM(s->machine_menu_item), + s->machine_menu); + gtk_menu_shell_append(GTK_MENU_SHELL(s->menu_bar), s->machine_menu_item); gtk_menu_item_set_submenu(GTK_MENU_ITEM(s->view_menu_item), s->view_menu); gtk_menu_shell_append(GTK_MENU_SHELL(s->menu_bar), s->view_menu_item);