/*
 * Copyright 2008, Haiku, Inc. All rights reserved.
 * Distributed under the terms of the MIT License.
 */
#ifndef _INPUTSERVERDEVICE_H
#define _INPUTSERVERDEVICE_H


#include <Input.h>
#include <SupportDefs.h>


// Register your actual devices using this one - you can subclass
// this to suit your needs
struct input_device_ref {
	char*				name;
	input_device_type	type;	// see Input.h
	void*				cookie;
};

// BInputServerDevice::Control() codes
enum {
	// B_KEYBOARD_DEVICE notifications
	B_KEY_MAP_CHANGED		= 1,
	B_KEY_LOCKS_CHANGED,
	B_KEY_REPEAT_DELAY_CHANGED,
	B_KEY_REPEAT_RATE_CHANGED,

	// B_POINTING_DEVICE notifications
	B_MOUSE_TYPE_CHANGED,
	B_MOUSE_MAP_CHANGED,
	B_MOUSE_SPEED_CHANGED,
	B_CLICK_SPEED_CHANGED,
	B_MOUSE_ACCELERATION_CHANGED,
};

namespace BPrivate {
	class DeviceAddOn;
}

class BInputServerDevice {
public:
						BInputServerDevice();
	virtual				~BInputServerDevice();

	virtual status_t	InitCheck();
	virtual status_t	SystemShuttingDown();

	virtual status_t	Start(const char* device, void* cookie);
	virtual	status_t	Stop(const char* device, void* cookie);
	virtual status_t	Control(const char* device, void* cookie, uint32 code,
							BMessage* message);

			status_t	RegisterDevices(input_device_ref** devices);
			status_t	UnregisterDevices(input_device_ref** devices);

			status_t	EnqueueMessage(BMessage* message);

			status_t	StartMonitoringDevice(const char* device);
			status_t	StopMonitoringDevice(const char* device);
			status_t	AddDevices(const char* path);

private:
	virtual void		_ReservedInputServerDevice1();
	virtual void		_ReservedInputServerDevice2();
	virtual void		_ReservedInputServerDevice3();
	virtual void		_ReservedInputServerDevice4();

	BPrivate::DeviceAddOn* fOwner;
	uint32				_reserved[4];
};

#endif	// _INPUTSERVERDEVICE_H