From patchwork Thu Dec 29 17:24:50 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Programmingkid X-Patchwork-Id: 709544 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (unknown [208.118.235.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3tqGhx3jKsz9sxS for ; Fri, 30 Dec 2016 04:25:51 +1100 (AEDT) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="Cyf30bA2"; dkim-atps=neutral Received: from localhost ([::1]:36629 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cMeSQ-00036Q-5c for incoming@patchwork.ozlabs.org; Thu, 29 Dec 2016 12:25:38 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:37705) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cMeRl-0002jn-Fb for qemu-devel@nongnu.org; Thu, 29 Dec 2016 12:24:58 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cMeRi-0008ON-BH for qemu-devel@nongnu.org; Thu, 29 Dec 2016 12:24:57 -0500 Received: from mail-io0-x244.google.com ([2607:f8b0:4001:c06::244]:36253) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1cMeRi-0008OE-67 for qemu-devel@nongnu.org; Thu, 29 Dec 2016 12:24:54 -0500 Received: by mail-io0-x244.google.com with SMTP id m204so13857406ioe.3 for ; Thu, 29 Dec 2016 09:24:54 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:content-transfer-encoding:subject:date:message-id:cc:to :mime-version; bh=1L5yV2PL8sJuMFGyYSz0LhVJfbX/dK2YUO9mMTVxhdM=; b=Cyf30bA2lL+eGm8DwQgEVLdP5vgF66kKhLeX81bpweAIAb9LzfUOTnza4V6EpSxx9S vhPQ4Sljxec2ejABD7dJdrpTEwpRVmeac5yJiZ+gRN/vG5gLYiOpVefPbQ9tI7R/0IcT VPIPIpbyu5oZu2oy/J7jspsg+ggl8n9p8Z2wTY9KodpehAEP176vzyM2r65UCxDLVslv GlR14OZ9oU5ldaz7hvuFrL59vkuuU7Bwp6f26zfLDHUA8L7wQEMmfLmmmi/jOktoMn/q M/xBwpIeVmLY7zRbPFPTaE96UWrA6OTC2fbcNjIkPZWotVcq++i12Ur3Y5cIQMsohKLj NtCA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:content-transfer-encoding:subject:date :message-id:cc:to:mime-version; bh=1L5yV2PL8sJuMFGyYSz0LhVJfbX/dK2YUO9mMTVxhdM=; b=MnmAJ3UBMsI8P1VCIM/fQsaN1xjCP4besQgi2XndYyYgRByZTyy/7jQmicVzRYsBj8 olhf0FwJqyk1DWpxhOHwEtSCdWJosXXF4MqlbXFyPV2VWMAPY/58EoDH1NgUqXmrMT7b 9ad8450GiBrfSDds8E91AU2a6CqzzGV6AbujC/aqCSoDzTRWBEhj9SNCKvJIqOTAXLRz qNRIKwuYZIqOFT+GFJD+fCifeG5lJos8j1vIE3oIZHICKnOVzT6AFRqpl+llZ17EbFpG gYjP63QB1sKUP1B1qeH8H8w1wLscjtUZGvkrsIQQAvW9Ct0caoMh76pocGac2PXDfKp0 BfvA== X-Gm-Message-State: AIkVDXLtxeae2PjfgseIk+8ZPuTROnxmmUOSU45UFAIha2itGaIsO6lT1i1f8Kw/EFJpIA== X-Received: by 10.107.6.10 with SMTP id 10mr30392800iog.78.1483032293334; Thu, 29 Dec 2016 09:24:53 -0800 (PST) Received: from [192.168.0.7] (d199-74-164-53.col.wideopenwest.com. [74.199.53.164]) by smtp.gmail.com with ESMTPSA id t20sm24180089ita.11.2016.12.29.09.24.51 (version=TLS1 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Thu, 29 Dec 2016 09:24:52 -0800 (PST) From: Programmingkid Date: Thu, 29 Dec 2016 12:24:50 -0500 Message-Id: To: Peter Maydell Mime-Version: 1.0 (Apple Message framework v1084) X-Mailer: Apple Mail (2.1084) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 2607:f8b0:4001:c06::244 Subject: [Qemu-devel] [PATCH] ui/cocoa.m: add Speed menu X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: qemu-devel qemu-devel Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" Programs running inside of QEMU can sometimes use more CPU time than is really needed. To solve this problem, we just need to throttle the virtual CPU. This feature will stop laptops from burning up. This patch adds a menu called Speed that has menu items from 10 to 1. They represent the speed options. 10 is full speed and 1 is slowest. Signed-off-by: John Arbuckle --- ui/cocoa.m | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) diff --git a/ui/cocoa.m b/ui/cocoa.m index 26d4a1c..293e910 100644 --- a/ui/cocoa.m +++ b/ui/cocoa.m @@ -35,6 +35,7 @@ #include "sysemu/blockdev.h" #include "qemu-version.h" #include +#include "qom/cpu.h" #ifndef MAC_OS_X_VERSION_10_5 #define MAC_OS_X_VERSION_10_5 1050 @@ -828,6 +829,7 @@ QemuCocoaView *cocoaView; - (void)openDocumentation:(NSString *)filename; - (IBAction) do_about_menu_item: (id) sender; - (void)make_about_window; +- (void)adjustSpeed:(id)sender; @end @implementation QemuCocoaAppController @@ -1234,6 +1236,41 @@ QemuCocoaView *cocoaView; [superView addSubview: copyright_label]; } +/* Used by the Speed menu items */ +- (void)adjustSpeed:(id)sender +{ + /* 10 has two digits in it - plus the NULL termination at the end */ + const int max_title_size = 3; + char menu_item_title[max_title_size]; + int speed, menu_number, count, item; + NSMenu *menu; + NSArray *itemArray; + + // uncheck all the menu items in the Speed menu + menu = [sender menu]; + if(menu != nil) + { + count = [[menu itemArray] count]; + itemArray = [menu itemArray]; + for(item = 0; item < count; item++) // unselect each item + [[itemArray objectAtIndex: item] setState: NSOffState]; + } + + // check the menu item + [sender setState: NSOnState]; + + // get the menu number + snprintf(menu_item_title, max_title_size, "%s", [[sender title] cStringUsingEncoding: NSASCIIStringEncoding]); + sscanf(menu_item_title, "%d", &menu_number); + + /* Calculate the speed */ + // inverse relationship between menu item number and speed + speed = -1 * menu_number + 10; + speed = speed * 10; + cpu_throttle_set(speed); + COCOA_DEBUG("cpu throttling at %d%c\n", cpu_throttle_get_percentage(), '%'); +} + @end @@ -1316,6 +1353,25 @@ int main (int argc, const char * argv[]) { [menuItem setSubmenu:menu]; [[NSApp mainMenu] addItem:menuItem]; + // Speed menu + menu = [[NSMenu alloc] initWithTitle:@"Speed"]; + menuItem = [[[NSMenuItem alloc] initWithTitle:@"10 (fastest)" action:@selector(adjustSpeed:) keyEquivalent:@""] autorelease]; + [menuItem setState: NSOnState]; + [menu addItem: menuItem]; + [menu addItem: [[[NSMenuItem alloc] initWithTitle:@"9" action:@selector(adjustSpeed:) keyEquivalent:@""] autorelease]]; + [menu addItem: [[[NSMenuItem alloc] initWithTitle:@"8" action:@selector(adjustSpeed:) keyEquivalent:@""] autorelease]]; + [menu addItem: [[[NSMenuItem alloc] initWithTitle:@"7" action:@selector(adjustSpeed:) keyEquivalent:@""] autorelease]]; + [menu addItem: [[[NSMenuItem alloc] initWithTitle:@"6" action:@selector(adjustSpeed:) keyEquivalent:@""] autorelease]]; + [menu addItem: [[[NSMenuItem alloc] initWithTitle:@"5" action:@selector(adjustSpeed:) keyEquivalent:@""] autorelease]]; + [menu addItem: [[[NSMenuItem alloc] initWithTitle:@"4" action:@selector(adjustSpeed:) keyEquivalent:@""] autorelease]]; + [menu addItem: [[[NSMenuItem alloc] initWithTitle:@"3" action:@selector(adjustSpeed:) keyEquivalent:@""] autorelease]]; + [menu addItem: [[[NSMenuItem alloc] initWithTitle:@"2" action:@selector(adjustSpeed:) keyEquivalent:@""] autorelease]]; + [menu addItem: [[[NSMenuItem alloc] initWithTitle:@"1" action:@selector(adjustSpeed:) keyEquivalent:@""] autorelease]]; + [menu addItem: [[[NSMenuItem alloc] initWithTitle:@"0 (slowest)" action:@selector(adjustSpeed:) keyEquivalent:@""] autorelease]]; + menuItem = [[[NSMenuItem alloc] initWithTitle:@"Speed" action:nil keyEquivalent:@""] autorelease]; + [menuItem setSubmenu:menu]; + [[NSApp mainMenu] addItem:menuItem]; + // Window menu menu = [[NSMenu alloc] initWithTitle:@"Window"]; [menu addItem: [[[NSMenuItem alloc] initWithTitle:@"Minimize" action:@selector(performMiniaturize:) keyEquivalent:@"m"] autorelease]]; // Miniaturize