//	Darkstar Engine  (c) UnderWorld Interactive Studio (all coding by Svarog    2007)
//
//      Данный файл является частью Darkstar Engine. Любое использование кода файла
//      без согласия компании, является нарушением закона об авторском праве (в слу-
//      чае если не оговорено обратное).
//
//      Имя файла: keyboard.hpp
//      Краткое описание: стандартная клавиатура
//

#ifndef DSE_INPUT_KEYBOARD_HPP
#define DSE_INPUT_KEYBOARD_HPP

#include <Darkstar/common.hpp>
#include <Darkstar/Kernel/Misc/singleton.hpp>
#include <Darkstar/Input/keyboardConstants.hpp>

namespace input
{
	class Keyboard : public ker::SingletonHolder<Keyboard>
	{
	private:
		LPDIRECTINPUTDEVICE8 keyboard;
		bool is_immediate;
		unsigned int buffer_data_size;

		char data_immediate[256];
		shared_array<DIDEVICEOBJECTDATA> data_buffered;

		DWORD cur_valid_num_buf;

		bool _tryToReacquire();
	public:
		Keyboard();
		~Keyboard();

		void setImmediateMode();
		void setBufferedMode(const unsigned int buf_data_size);
		bool getIsImmediateMode() const;
		unsigned int getBufferDataSize() const;

		bool init(HWND hwnd);

		bool updateBuffer();
		bool updateImmediateData();

		bool getIsKeyDownBuffered(const unsigned char key_code) const;
		bool getIsKeyReleaseBuffered(const unsigned char key_code) const;

		bool getIsKeyDownImmediate(const unsigned char key_code) const;
		bool getIsKeyReleaseImmediate(const unsigned char key_code) const;
	};
};

#endif