void VolumeControl::AttachedToWindow() { BSlider::AttachedToWindow(); if (_IsReplicant()) SetEventMask(0, 0); else SetEventMask(B_POINTER_EVENTS, B_NO_POINTER_HISTORY); be_roster->StartWatching(this, B_REQUEST_LAUNCHED | B_REQUEST_QUIT); _ConnectVolume(); if (!fMixerControl->Connected()) { // Wait a bit, and try again - the media server might not have been // ready yet BMessage reconnect(kMsgReconnectVolume); BMessageRunner::StartSending(this, &reconnect, 1000000LL, 1); fConnectRetries = 3; } }
void VolumeControl::MessageReceived(BMessage* msg) { switch (msg->what) { case B_MOUSE_WHEEL_CHANGED: { if (!fMixerControl->Connected()) return; // Even though the volume bar is horizontal, we use the more common // vertical mouse wheel change float deltaY = 0.0f; msg->FindFloat("be:wheel_delta_y", &deltaY); if (deltaY == 0.0f) return; int32 currentValue = Value(); int32 newValue = currentValue - int32(deltaY) * 3; if (newValue != currentValue) { SetValue(newValue); InvokeNotify(ModificationMessage(), B_CONTROL_MODIFIED); } break; } case B_MEDIA_NEW_PARAMETER_VALUE: if (IsTracking()) break; SetValue((int32)fMixerControl->Volume()); break; case B_SOME_APP_LAUNCHED: case B_SOME_APP_QUIT: { const char* signature; if (msg->FindString("be:signature", &signature) != B_OK) break; bool isMediaServer = !strcmp(signature, kMediaServerSignature); bool isAddOnServer = !strcmp(signature, kAddOnServerSignature); if (!isMediaServer && !isAddOnServer) break; if (isMediaServer) fMediaServerRunning = msg->what == B_SOME_APP_LAUNCHED; if (isAddOnServer) fAddOnServerRunning = msg->what == B_SOME_APP_LAUNCHED; if (!fMediaServerRunning && !fAddOnServerRunning) { // No media server around SetLabel(B_TRANSLATE("No media server running")); SetEnabled(false); } else if (fMediaServerRunning && fAddOnServerRunning) { // HACK! // quit our now invalid instance of the media roster // so that before new nodes are created, // we get a new roster BMediaRoster* roster = BMediaRoster::CurrentRoster(); if (roster != NULL) { roster->Lock(); roster->Quit(); } BMessage reconnect(kMsgReconnectVolume); BMessageRunner::StartSending(this, &reconnect, 1000000LL, 1); fConnectRetries = 3; } break; } case B_QUIT_REQUESTED: Window()->MessageReceived(msg); break; case kMsgReconnectVolume: _ConnectVolume(); if (!fMixerControl->Connected() && --fConnectRetries > 1) { BMessage reconnect(kMsgReconnectVolume); BMessageRunner::StartSending(this, &reconnect, 6000000LL / fConnectRetries, 1); } break; default: return BView::MessageReceived(msg); } }
void VolumeControl::MessageReceived(BMessage* msg) { switch (msg->what) { case B_MOUSE_WHEEL_CHANGED: { if (!fMixerControl->Connected()) return; // Even though the volume bar is horizontal, we use the more common // vertical mouse wheel change float deltaY = 0.0f; msg->FindFloat("be:wheel_delta_y", &deltaY); if (deltaY == 0.0f) return; int32 currentValue = Value(); int32 newValue = currentValue - int32(deltaY) * 3; if (newValue != currentValue) { SetValue(newValue); InvokeNotify(ModificationMessage(), B_CONTROL_MODIFIED); } break; } case B_MEDIA_NEW_PARAMETER_VALUE: if (IsTracking()) break; SetValue((int32)fMixerControl->Volume()); break; case B_MEDIA_SERVER_STARTED: { BMessage reconnect(kMsgReconnectVolume); BMessageRunner::StartSending(this, &reconnect, 1000000LL, 1); fConnectRetries = 3; break; } case B_MEDIA_SERVER_QUIT: { // No media server around SetLabel(B_TRANSLATE("No media server running")); SetEnabled(false); break; } case B_QUIT_REQUESTED: Window()->MessageReceived(msg); break; case kMsgReconnectVolume: _ConnectVolume(); if (!fMixerControl->Connected() && --fConnectRetries > 1) { BMessage reconnect(kMsgReconnectVolume); BMessageRunner::StartSending(this, &reconnect, 6000000LL / fConnectRetries, 1); } break; default: return BView::MessageReceived(msg); } }