key kOwner;
integer iPrevState;
float TRANSPARENT = 0.0;
float TYPING_CHECK_PERIOD = .2;
integer IS_NOT_TYPING = 0;
integer IS_NOT_HELD = -1;
integer IS_TYPING = AGENT_TYPING;
integer gotPermission = FALSE;
key typingAnim = "c541c47f-e0c0-058b-ad1a-d6ae3a4584d9";
string newTypingAnimation = "animhere"; //replace me with your anim
initialize()
{
kOwner = llGetOwner();
llOwnerSay("Sitter's keyboard responder initializing..."

;
llSetTimerEvent(TYPING_CHECK_PERIOD);
iPrevState = IS_NOT_TYPING;
llRequestPermissions(llGetOwner(),PERMISSION_TRIGGER_ANIMATION);
}
default
{
state_entry()
{
if(llGetOwner() != kOwner)
{
initialize();
}
}
on_rez(integer total_number)
{
if(llGetOwner() != kOwner)
{
initialize();
}
}
run_time_permissions(integer _parm) {
if( _parm == (PERMISSION_TRIGGER_ANIMATION) ) {
gotPermission = TRUE;
}
}
timer()
{
integer iAttached = llGetAttached();
if(iAttached == 0)
{
if(iPrevState != IS_NOT_HELD)
{
llMessageLinked(LINK_SET, -1, "SHOWKEYBOARD", NULL_KEY);
iPrevState = IS_NOT_HELD;
}
return;
}
integer iTypingState = llGetAgentInfo(kOwner) & AGENT_TYPING;
if (iPrevState != iTypingState)
{
iPrevState = iTypingState;
if (iTypingState == 0) {
if (llListFindList(llGetAnimationList(kOwner), [newTypingAnimation])) {
llStopAnimation(newTypingAnimation);
}
} else {
if (llListFindList(llGetAnimationList(kOwner), [newTypingAnimation])) {
llStartAnimation(newTypingAnimation);
}}}}}