#include "IviewDeviceGrabber.h"
#include "IviewControl.h"
#include "IviewMonitor.h"
#include "unistd.h"

#define dprintf if (debug) fprintf

IviewDeviceGrabber::IviewDeviceGrabber(IviewDevice device,
				       IviewControl *control,
				       IviewMonitor *monitor,
				       pid_t ownerPid)
{
  _state = Unknown;
  _device = device;
  _control = control;
  _monitor = monitor;

  if (ownerPid != 0)
    _ownerPid = ownerPid;
  else
  {
#  ifdef UNIX
    _ownerPid = getpid();
#  else
    _ownerPid = taskIdSelf();
#endif

  }
}


IviewDeviceGrabber::~IviewDeviceGrabber()
{
}


void IviewDeviceGrabber::getIviewDeviceState()
{
  int controlId;
  pid_t pid;
  MBool debug = FALSE;

  State newState;
  
  MBool used = _monitor->hasControl(_device,
				    _control->axisMask(), 
				    &controlId,
				    &pid);
  
  if (used) 
  {
    if (pid == _ownerPid && controlId == _control->id())
    {
      newState = Used;
    }
    else
    {
      if (pid != _ownerPid)
      {
        // Different process - show as ExternallyUsed
        newState = ExternallyUsed;
      }
      else
      {
        // Same process - show as Unused
	newState = Unused;
      }
    }
  }
  else
    newState = Unused;
  

  if (_state != newState)
  {
    displayIviewDeviceState(newState);
    _state = newState;
  }
}




