1 /* 2 * Copyright 2000, Georges-Edouard Berenger. All rights reserved. 3 * Distributed under the terms of the MIT License. 4 */ 5 6 7 #include "PriorityMenu.h" 8 #include "ProcessController.h" 9 10 #include <Catalog.h> 11 #include <MenuItem.h> 12 #include <Window.h> 13 14 #include <stdio.h> 15 16 #undef B_TRANSLATION_CONTEXT 17 #define B_TRANSLATION_CONTEXT "ProcessController" 18 19 PriorityMenu::PriorityMenu(thread_id thread, int32 priority) 20 : BMenu(B_EMPTY_STRING), 21 fThreadID(thread), 22 fPriority(priority) 23 { 24 } 25 26 27 void 28 PriorityMenu::Update(int32 priority) 29 { 30 if (priority != fPriority && CountItems() > 0) 31 RemoveItems(0, CountItems(), true); 32 if (CountItems() < 1) 33 BuildMenu(); 34 35 fPriority = priority; 36 } 37 38 39 typedef struct { 40 const char* name; 41 long priority; 42 } PriorityRec; 43 44 static PriorityRec priorities[] = { 45 { B_TRANSLATE("Idle priority"), 0 }, 46 { B_TRANSLATE("Lowest active priority"), 1 }, 47 { B_TRANSLATE("Low priority"), 5 }, 48 { B_TRANSLATE("Normal priority"), 10 }, 49 { B_TRANSLATE("Display priority"), 15 }, 50 { B_TRANSLATE("Urgent display priority"), 20 }, 51 { B_TRANSLATE("Real-time display priority"), 100 }, 52 { B_TRANSLATE("Urgent priority"), 110 }, 53 { B_TRANSLATE("Real-time priority"), 120 }, 54 { "", -1 } 55 }; 56 57 PriorityRec customPriority = { B_TRANSLATE("Custom priority"), 0 }; 58 59 60 void 61 PriorityMenu::BuildMenu() 62 { 63 BMenuItem* item; 64 BMessage* message; 65 long found = false; 66 67 for (long index = 0; ; index++) { 68 PriorityRec *priority = &priorities[index]; 69 if (priority->priority < 0) 70 break; 71 if (!found && fPriority < priority->priority) { 72 priority = &customPriority; 73 priority->priority = fPriority; 74 index--; 75 } 76 message = new BMessage('PrTh'); 77 message->AddInt32("thread", fThreadID); 78 message->AddInt32("priority", priority->priority); 79 BString name; 80 const size_t size = B_OS_NAME_LENGTH * 4; 81 snprintf(name.LockBuffer(size), size, 82 "%s [%d]", priority->name, (int)priority->priority); 83 name.UnlockBuffer(); 84 item = new BMenuItem(name.String(), message); 85 item->SetTarget(gPCView); 86 if (fPriority == priority->priority) 87 found = true, item->SetMarked(true); 88 AddItem(item); 89 } 90 } 91 92