1 //****************************************************************************************
2 //
3 // File: DeskbarPulseView.cpp
4 //
5 // Written by: Daniel Switkin
6 //
7 // Copyright 1999, Be Incorporated
8 //
9 //****************************************************************************************
10
11
12 #include "DeskbarPulseView.h"
13
14 #include <stdio.h>
15 #include <stdlib.h>
16 #include <string.h>
17
18 #include <Alert.h>
19 #include <Application.h>
20 #include <Catalog.h>
21 #include <Deskbar.h>
22 #include <Roster.h>
23
24 #include "Common.h"
25 #include "Prefs.h"
26 #include "PulseApp.h"
27
28 #undef B_TRANSLATION_CONTEXT
29 #define B_TRANSLATION_CONTEXT "DeskbarPulseView"
30
31
DeskbarPulseView(BRect rect)32 DeskbarPulseView::DeskbarPulseView(BRect rect)
33 : MiniPulseView(rect, "DeskbarPulseView")
34 {
35 messagerunner = NULL;
36 prefs = NULL;
37 }
38
39
DeskbarPulseView(BMessage * message)40 DeskbarPulseView::DeskbarPulseView(BMessage *message)
41 : MiniPulseView(message)
42 {
43 mode1->SetLabel(B_TRANSLATE("Normal mode"));
44 mode1->SetMessage(new BMessage(PV_NORMAL_MODE));
45 mode2->SetLabel(B_TRANSLATE("Mini mode"));
46 mode2->SetMessage(new BMessage(PV_MINI_MODE));
47 quit = new BMenuItem(B_TRANSLATE("Quit"), new BMessage(PV_QUIT), 0, 0);
48 popupmenu->AddSeparatorItem();
49 popupmenu->AddItem(quit);
50
51 SetViewColor(B_TRANSPARENT_COLOR);
52
53 prefs = new Prefs();
54 active_color.red = (prefs->deskbar_active_color & 0xff000000) >> 24;
55 active_color.green = (prefs->deskbar_active_color & 0x00ff0000) >> 16;
56 active_color.blue = (prefs->deskbar_active_color & 0x0000ff00) >> 8;
57
58 idle_color.red = (prefs->deskbar_idle_color & 0xff000000) >> 24;
59 idle_color.green = (prefs->deskbar_idle_color & 0x00ff0000) >> 16;
60 idle_color.blue = (prefs->deskbar_idle_color & 0x0000ff00) >> 8;
61
62 frame_color.red = (prefs->deskbar_frame_color & 0xff000000) >> 24;
63 frame_color.green = (prefs->deskbar_frame_color & 0x00ff0000) >> 16;
64 frame_color.blue = (prefs->deskbar_frame_color & 0x0000ff00) >> 8;
65 SetViewColor(idle_color);
66
67 messagerunner = NULL;
68 }
69
70
71 void
AttachedToWindow()72 DeskbarPulseView::AttachedToWindow()
73 {
74 BMessenger messenger(this);
75 mode1->SetTarget(messenger);
76 mode2->SetTarget(messenger);
77 preferences->SetTarget(messenger);
78 about->SetTarget(messenger);
79 quit->SetTarget(messenger);
80
81 system_info sys_info;
82 get_system_info(&sys_info);
83 if (sys_info.cpu_count >= 2) {
84 for (unsigned int x = 0; x < sys_info.cpu_count; x++)
85 cpu_menu_items[x]->SetTarget(messenger);
86 }
87
88 // Use a BMessageRunner to deliver periodic messsages instead
89 // of Pulse() events from the Deskbar - this is to avoid changing
90 // the current pulse rate and affecting other replicants
91 messagerunner = new BMessageRunner(messenger, new BMessage(PV_REPLICANT_PULSE),
92 200000, -1);
93 }
94
95
96 void
MouseDown(BPoint point)97 DeskbarPulseView::MouseDown(BPoint point)
98 {
99 BPoint cursor;
100 uint32 buttons;
101 MakeFocus(true);
102 GetMouse(&cursor, &buttons, true);
103
104 if (buttons & B_PRIMARY_MOUSE_BUTTON) {
105 BMessage *message = Window()->CurrentMessage();
106 int32 clicks = message->FindInt32("clicks");
107 if (clicks >= 2) {
108 BMessenger messenger(this);
109 BMessage *m = new BMessage(PV_NORMAL_MODE);
110 messenger.SendMessage(m);
111 }
112 } else MiniPulseView::MouseDown(point);
113 }
114
115
116 void
Pulse()117 DeskbarPulseView::Pulse()
118 {
119 // Override and do nothing here
120 }
121
122
123 void
MessageReceived(BMessage * message)124 DeskbarPulseView::MessageReceived(BMessage *message)
125 {
126 switch (message->what) {
127 case PV_NORMAL_MODE:
128 SetMode(true);
129 Remove();
130 break;
131 case PV_MINI_MODE:
132 SetMode(false);
133 Remove();
134 break;
135 case PV_PREFERENCES:
136 {
137 message->AddMessenger("settingsListener", this);
138 // Spawn the app and open the window there, not in DeskBar process.
139 be_roster->Launch(APP_SIGNATURE, message);
140 break;
141 }
142 case PV_ABOUT:
143 {
144 BMessage aboutRequest(B_ABOUT_REQUESTED);
145 be_roster->Launch(APP_SIGNATURE, &aboutRequest);
146 break;
147 }
148 case PV_QUIT:
149 Remove();
150 break;
151 case PRV_DESKBAR_CHANGE_COLOR:
152 UpdateColors(message);
153 break;
154 case PRV_DESKBAR_ICON_WIDTH: {
155 int width = message->FindInt32("width");
156 ResizeTo(width - 1, Bounds().Height());
157 Draw(Bounds());
158 break;
159 }
160 case PV_REPLICANT_PULSE:
161 Update();
162 Draw(Bounds());
163 break;
164 case PV_CPU_MENU_ITEM:
165 ChangeCPUState(message);
166 break;
167 default:
168 BView::MessageReceived(message);
169 break;
170 }
171 }
172
173
174 DeskbarPulseView *
Instantiate(BMessage * data)175 DeskbarPulseView::Instantiate(BMessage *data)
176 {
177 if (!validate_instantiation(data, "DeskbarPulseView"))
178 return NULL;
179 return new DeskbarPulseView(data);
180 }
181
182 status_t
Archive(BMessage * data,bool deep) const183 DeskbarPulseView::Archive(BMessage *data, bool deep) const
184 {
185 PulseView::Archive(data, deep);
186 data->AddString("add_on", APP_SIGNATURE);
187 data->AddString("class", "DeskbarPulseView");
188 return B_OK;
189 }
190
191
192 void
Remove()193 DeskbarPulseView::Remove()
194 {
195 // Remove ourselves from the deskbar by name
196 BDeskbar *deskbar = new BDeskbar();
197 status_t err = deskbar->RemoveItem("DeskbarPulseView");
198 if (err != B_OK) {
199 BString str;
200 snprintf(str.LockBuffer(512), 512,
201 B_TRANSLATE("Removing from Deskbar failed.\n%s"), strerror(err));
202 str.UnlockBuffer();
203 BAlert *alert = new BAlert(B_TRANSLATE("Info"), str.String(),
204 B_TRANSLATE("OK"));
205 alert->SetFlags(alert->Flags() | B_CLOSE_ON_ESCAPE);
206 alert->Go(NULL);
207 }
208 delete deskbar;
209 }
210
211
212 void
SetMode(bool normal)213 DeskbarPulseView::SetMode(bool normal)
214 {
215 if (normal) prefs->window_mode = NORMAL_WINDOW_MODE;
216 else prefs->window_mode = MINI_WINDOW_MODE;
217 prefs->Save();
218 be_roster->Launch(APP_SIGNATURE);
219 }
220
221
~DeskbarPulseView()222 DeskbarPulseView::~DeskbarPulseView()
223 {
224 if (messagerunner != NULL) delete messagerunner;
225 if (prefs != NULL) delete prefs;
226 }
227