227 lines
5.3 KiB
C++
227 lines
5.3 KiB
C++
//****************************************************************************************
|
|
//
|
|
// File: DeskbarPulseView.cpp
|
|
//
|
|
// Written by: Daniel Switkin
|
|
//
|
|
// Copyright 1999, Be Incorporated
|
|
//
|
|
//****************************************************************************************
|
|
|
|
|
|
#include "DeskbarPulseView.h"
|
|
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
|
|
#include <Alert.h>
|
|
#include <Application.h>
|
|
#include <Catalog.h>
|
|
#include <Deskbar.h>
|
|
#include <Roster.h>
|
|
|
|
#include "Common.h"
|
|
#include "Prefs.h"
|
|
#include "PulseApp.h"
|
|
|
|
#undef B_TRANSLATION_CONTEXT
|
|
#define B_TRANSLATION_CONTEXT "DeskbarPulseView"
|
|
|
|
|
|
DeskbarPulseView::DeskbarPulseView(BRect rect)
|
|
: MiniPulseView(rect, "DeskbarPulseView")
|
|
{
|
|
messagerunner = NULL;
|
|
prefs = NULL;
|
|
}
|
|
|
|
|
|
DeskbarPulseView::DeskbarPulseView(BMessage *message)
|
|
: MiniPulseView(message)
|
|
{
|
|
mode1->SetLabel(B_TRANSLATE("Normal mode"));
|
|
mode1->SetMessage(new BMessage(PV_NORMAL_MODE));
|
|
mode2->SetLabel(B_TRANSLATE("Mini mode"));
|
|
mode2->SetMessage(new BMessage(PV_MINI_MODE));
|
|
quit = new BMenuItem(B_TRANSLATE("Quit"), new BMessage(PV_QUIT), 0, 0);
|
|
popupmenu->AddSeparatorItem();
|
|
popupmenu->AddItem(quit);
|
|
|
|
SetViewColor(B_TRANSPARENT_COLOR);
|
|
|
|
prefs = new Prefs();
|
|
active_color.red = (prefs->deskbar_active_color & 0xff000000) >> 24;
|
|
active_color.green = (prefs->deskbar_active_color & 0x00ff0000) >> 16;
|
|
active_color.blue = (prefs->deskbar_active_color & 0x0000ff00) >> 8;
|
|
|
|
idle_color.red = (prefs->deskbar_idle_color & 0xff000000) >> 24;
|
|
idle_color.green = (prefs->deskbar_idle_color & 0x00ff0000) >> 16;
|
|
idle_color.blue = (prefs->deskbar_idle_color & 0x0000ff00) >> 8;
|
|
|
|
frame_color.red = (prefs->deskbar_frame_color & 0xff000000) >> 24;
|
|
frame_color.green = (prefs->deskbar_frame_color & 0x00ff0000) >> 16;
|
|
frame_color.blue = (prefs->deskbar_frame_color & 0x0000ff00) >> 8;
|
|
SetViewColor(idle_color);
|
|
|
|
messagerunner = NULL;
|
|
}
|
|
|
|
|
|
void
|
|
DeskbarPulseView::AttachedToWindow()
|
|
{
|
|
BMessenger messenger(this);
|
|
mode1->SetTarget(messenger);
|
|
mode2->SetTarget(messenger);
|
|
preferences->SetTarget(messenger);
|
|
about->SetTarget(messenger);
|
|
quit->SetTarget(messenger);
|
|
|
|
system_info sys_info;
|
|
get_system_info(&sys_info);
|
|
if (sys_info.cpu_count >= 2) {
|
|
for (unsigned int x = 0; x < sys_info.cpu_count; x++)
|
|
cpu_menu_items[x]->SetTarget(messenger);
|
|
}
|
|
|
|
// Use a BMessageRunner to deliver periodic messsages instead
|
|
// of Pulse() events from the Deskbar - this is to avoid changing
|
|
// the current pulse rate and affecting other replicants
|
|
messagerunner = new BMessageRunner(messenger, new BMessage(PV_REPLICANT_PULSE),
|
|
200000, -1);
|
|
}
|
|
|
|
|
|
void
|
|
DeskbarPulseView::MouseDown(BPoint point)
|
|
{
|
|
BPoint cursor;
|
|
uint32 buttons;
|
|
MakeFocus(true);
|
|
GetMouse(&cursor, &buttons, true);
|
|
|
|
if (buttons & B_PRIMARY_MOUSE_BUTTON) {
|
|
BMessage *message = Window()->CurrentMessage();
|
|
int32 clicks = message->FindInt32("clicks");
|
|
if (clicks >= 2) {
|
|
BMessenger messenger(this);
|
|
BMessage *m = new BMessage(PV_NORMAL_MODE);
|
|
messenger.SendMessage(m);
|
|
}
|
|
} else MiniPulseView::MouseDown(point);
|
|
}
|
|
|
|
|
|
void
|
|
DeskbarPulseView::Pulse()
|
|
{
|
|
// Override and do nothing here
|
|
}
|
|
|
|
|
|
void
|
|
DeskbarPulseView::MessageReceived(BMessage *message)
|
|
{
|
|
switch (message->what) {
|
|
case PV_NORMAL_MODE:
|
|
SetMode(true);
|
|
Remove();
|
|
break;
|
|
case PV_MINI_MODE:
|
|
SetMode(false);
|
|
Remove();
|
|
break;
|
|
case PV_PREFERENCES:
|
|
{
|
|
message->AddMessenger("settingsListener", this);
|
|
// Spawn the app and open the window there, not in DeskBar process.
|
|
be_roster->Launch(APP_SIGNATURE, message);
|
|
break;
|
|
}
|
|
case PV_ABOUT:
|
|
{
|
|
BMessage aboutRequest(B_ABOUT_REQUESTED);
|
|
be_roster->Launch(APP_SIGNATURE, &aboutRequest);
|
|
break;
|
|
}
|
|
case PV_QUIT:
|
|
Remove();
|
|
break;
|
|
case PRV_DESKBAR_CHANGE_COLOR:
|
|
UpdateColors(message);
|
|
break;
|
|
case PRV_DESKBAR_ICON_WIDTH: {
|
|
int width = message->FindInt32("width");
|
|
ResizeTo(width - 1, Bounds().Height());
|
|
Draw(Bounds());
|
|
break;
|
|
}
|
|
case PV_REPLICANT_PULSE:
|
|
Update();
|
|
Draw(Bounds());
|
|
break;
|
|
case PV_CPU_MENU_ITEM:
|
|
ChangeCPUState(message);
|
|
break;
|
|
default:
|
|
BView::MessageReceived(message);
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
DeskbarPulseView *
|
|
DeskbarPulseView::Instantiate(BMessage *data)
|
|
{
|
|
if (!validate_instantiation(data, "DeskbarPulseView"))
|
|
return NULL;
|
|
return new DeskbarPulseView(data);
|
|
}
|
|
|
|
status_t
|
|
DeskbarPulseView::Archive(BMessage *data, bool deep) const
|
|
{
|
|
PulseView::Archive(data, deep);
|
|
data->AddString("add_on", APP_SIGNATURE);
|
|
data->AddString("class", "DeskbarPulseView");
|
|
return B_OK;
|
|
}
|
|
|
|
|
|
void
|
|
DeskbarPulseView::Remove()
|
|
{
|
|
// Remove ourselves from the deskbar by name
|
|
BDeskbar *deskbar = new BDeskbar();
|
|
status_t err = deskbar->RemoveItem("DeskbarPulseView");
|
|
if (err != B_OK) {
|
|
BString str;
|
|
snprintf(str.LockBuffer(512), 512,
|
|
B_TRANSLATE("Removing from Deskbar failed.\n%s"), strerror(err));
|
|
str.UnlockBuffer();
|
|
BAlert *alert = new BAlert(B_TRANSLATE("Info"), str.String(),
|
|
B_TRANSLATE("OK"));
|
|
alert->SetFlags(alert->Flags() | B_CLOSE_ON_ESCAPE);
|
|
alert->Go(NULL);
|
|
}
|
|
delete deskbar;
|
|
}
|
|
|
|
|
|
void
|
|
DeskbarPulseView::SetMode(bool normal)
|
|
{
|
|
if (normal) prefs->window_mode = NORMAL_WINDOW_MODE;
|
|
else prefs->window_mode = MINI_WINDOW_MODE;
|
|
prefs->Save();
|
|
be_roster->Launch(APP_SIGNATURE);
|
|
}
|
|
|
|
|
|
DeskbarPulseView::~DeskbarPulseView()
|
|
{
|
|
if (messagerunner != NULL) delete messagerunner;
|
|
if (prefs != NULL) delete prefs;
|
|
}
|