1 //*****************************************************************************
3 // File: MiniPulseView.cpp
5 // Written by: Arve Hjonnevag and Daniel Switkin
7 // Copyright 1999, Be Incorporated
9 //*****************************************************************************
11 #include "MiniPulseView.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
)
56 MiniPulseView::MiniPulseView(BMessage
*message
)
63 // This method is used by DeskbarPulseView as well
64 void MiniPulseView::Draw(BRect rect
) {
66 get_system_info(&sys_info
);
67 if (sys_info
.cpu_count
<= 0)
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
119 void MiniPulseView::FrameResized(float width
, float height
) {
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;
161 MiniPulseView::~MiniPulseView() {