vfs: check userland buffers before reading them.
[haiku.git] / src / apps / pulse / MiniPulseView.cpp
blob5ec4c67e37113dcc6f7ff1727194fbed0ca63609
1 //*****************************************************************************
2 //
3 // File: MiniPulseView.cpp
4 //
5 // Written by: Arve Hjonnevag and Daniel Switkin
6 //
7 // Copyright 1999, Be Incorporated
8 //
9 //*****************************************************************************
11 #include "MiniPulseView.h"
12 #include "Common.h"
13 #include <Catalog.h>
14 #include <interface/Window.h>
16 #undef B_TRANSLATION_CONTEXT
17 #define B_TRANSLATION_CONTEXT "MiniPulseView"
20 MiniPulseView::MiniPulseView(BRect rect, const char *name, Prefs *prefs) :
21 PulseView(rect, name) {
23 mode1->SetLabel(B_TRANSLATE("Normal mode"));
24 mode1->SetMessage(new BMessage(PV_NORMAL_MODE));
25 mode2->SetLabel(B_TRANSLATE("Deskbar mode"));
26 mode2->SetMessage(new BMessage(PV_DESKBAR_MODE));
27 quit = new BMenuItem(B_TRANSLATE("Quit"), new BMessage(PV_QUIT), 0, 0);
28 popupmenu->AddSeparatorItem();
29 popupmenu->AddItem(quit);
31 // Our drawing covers every pixel in the view, so no reason to
32 // take the time (and to flicker) by resetting the view color
33 SetViewColor(B_TRANSPARENT_COLOR);
35 active_color.red = (prefs->mini_active_color & 0xff000000) >> 24;
36 active_color.green = (prefs->mini_active_color & 0x00ff0000) >> 16;
37 active_color.blue = (prefs->mini_active_color & 0x0000ff00) >> 8;
39 idle_color.red = (prefs->mini_idle_color & 0xff000000) >> 24;
40 idle_color.green = (prefs->mini_idle_color & 0x00ff0000) >> 16;
41 idle_color.blue = (prefs->mini_idle_color & 0x0000ff00) >> 8;
43 frame_color.red = (prefs->mini_frame_color & 0xff000000) >> 24;
44 frame_color.green = (prefs->mini_frame_color & 0x00ff0000) >> 16;
45 frame_color.blue = (prefs->mini_frame_color & 0x0000ff00) >> 8;
48 // These two are only used by DeskbarPulseView, and so do nothing
49 MiniPulseView::MiniPulseView(BRect rect, const char *name)
51 PulseView(rect, name)
56 MiniPulseView::MiniPulseView(BMessage *message)
58 PulseView(message)
63 // This method is used by DeskbarPulseView as well
64 void MiniPulseView::Draw(BRect rect) {
65 system_info sys_info;
66 get_system_info(&sys_info);
67 if (sys_info.cpu_count <= 0)
68 return;
70 BRect bounds(Bounds());
71 SetDrawingMode(B_OP_COPY);
73 int h = bounds.IntegerHeight() - 2;
74 float top = 1, left = 1;
75 float bottom = top + h;
76 float bar_width = (bounds.Width()) / sys_info.cpu_count - 2;
77 float right = bar_width + left;
79 for (unsigned int x = 0; x < sys_info.cpu_count; x++) {
80 int bar_height = (int)(cpu_times[x] * (h + 1));
81 if (bar_height > h) bar_height = h;
82 double rem = cpu_times[x] * (h + 1) - bar_height;
84 rgb_color fraction_color;
85 fraction_color.red = (uint8)(idle_color.red + rem
86 * (active_color.red - idle_color.red));
87 fraction_color.green = (uint8)(idle_color.green + rem
88 * (active_color.green - idle_color.green));
89 fraction_color.blue = (uint8)(idle_color.blue + rem
90 * (active_color.blue - idle_color.blue));
91 fraction_color.alpha = 0xff;
93 int idle_height = h - bar_height;
94 SetHighColor(frame_color);
95 StrokeRect(BRect(left - 1, top - 1, right + 1, bottom + 1));
96 if (idle_height > 0) {
97 SetHighColor(idle_color);
98 FillRect(BRect(left, top, right, top + idle_height - 1));
100 SetHighColor(fraction_color);
101 FillRect(BRect(left, bottom - bar_height, right, bottom - bar_height));
102 if (bar_height > 0) {
103 SetHighColor(active_color);
104 FillRect(BRect(left, bottom - bar_height + 1, right, bottom));
106 left += bar_width + 2;
107 right += bar_width + 2;
111 void MiniPulseView::Pulse() {
112 // Don't recalculate and redraw if this view is hidden
113 if (!IsHidden()) {
114 Update();
115 Draw(Bounds());
119 void MiniPulseView::FrameResized(float width, float height) {
120 Draw(Bounds());
123 void MiniPulseView::AttachedToWindow() {
124 BMessenger messenger(Window());
125 mode1->SetTarget(messenger);
126 mode2->SetTarget(messenger);
127 preferences->SetTarget(messenger);
128 about->SetTarget(messenger);
129 quit->SetTarget(messenger);
131 system_info sys_info;
132 get_system_info(&sys_info);
133 if (sys_info.cpu_count >= 2) {
134 for (unsigned int x = 0; x < sys_info.cpu_count; x++)
135 cpu_menu_items[x]->SetTarget(messenger);
139 // Redraw the view with the new colors but do not call
140 // Update() again - we don't want to recalculate activity
141 void MiniPulseView::UpdateColors(BMessage *message) {
142 int32 ac = message->FindInt32("active_color");
143 int32 ic = message->FindInt32("idle_color");
144 int32 fc = message->FindInt32("frame_color");
146 active_color.red = (ac & 0xff000000) >> 24;
147 active_color.green = (ac & 0x00ff0000) >> 16;
148 active_color.blue = (ac & 0x0000ff00) >> 8;
150 idle_color.red = (ic & 0xff000000) >> 24;
151 idle_color.green = (ic & 0x00ff0000) >> 16;
152 idle_color.blue = (ic & 0x0000ff00) >> 8;
154 frame_color.red = (fc & 0xff000000) >> 24;
155 frame_color.green = (fc & 0x00ff0000) >> 16;
156 frame_color.blue = (fc & 0x0000ff00) >> 8;
158 Draw(Bounds());
161 MiniPulseView::~MiniPulseView() {