haiku/src/servers/mail/LEDAnimation.cpp

92 lines
1.4 KiB
C++

#include "LEDAnimation.h"
#include <InterfaceDefs.h>
#include <stdio.h>
#define SNOOZE_TIME 150000
LEDAnimation::LEDAnimation()
:
fThread(-1),
fRunning(false),
fOrigModifiers(::modifiers())
{
}
LEDAnimation::~LEDAnimation()
{
Stop();
}
void
LEDAnimation::Start()
{
// don't do anything if the thread is already running
if (fThread >= 0)
return;
fOrigModifiers = ::modifiers();
::set_keyboard_locks(0);
fRunning = true;
fThread = ::spawn_thread(AnimationThread,"LED thread",B_NORMAL_PRIORITY,this);
::resume_thread(fThread);
}
void
LEDAnimation::Stop()
{
// don't do anything if the thread doesn't run
if (fThread < 0)
return;
fRunning = false;
status_t result;
::wait_for_thread(fThread,&result);
::set_keyboard_locks(fOrigModifiers);
}
int32
LEDAnimation::AnimationThread(void* data)
{
LEDAnimation *anim = (LEDAnimation*)data;
while (anim->fRunning) {
LED(B_NUM_LOCK,true);
LED(B_NUM_LOCK,false);
LED(B_CAPS_LOCK,true);
LED(B_CAPS_LOCK,false);
LED(B_SCROLL_LOCK,true);
LED(B_SCROLL_LOCK,false);
LED(B_CAPS_LOCK,true);
LED(B_CAPS_LOCK,false);
}
anim->fThread = -1;
return 0;
}
void
LEDAnimation::LED(uint32 mod,bool on)
{
uint32 current_modifiers = ::modifiers();
if (on)
current_modifiers |= mod;
else
current_modifiers &= ~mod;
::set_keyboard_locks(current_modifiers);
if (on)
::snooze(SNOOZE_TIME);
}