void QNitpickerPlatformWindow::_handle_input(unsigned int)
{
	for (int i = 0, num_ev = _input_session.flush(); i < num_ev; i++) {

		Input::Event *ev = &_ev_buf[i];

		bool const is_key_event = ev->type() == Input::Event::PRESS ||
					              ev->type() == Input::Event::RELEASE;

		bool const is_mouse_button_event =
			is_key_event && (ev->code() == Input::BTN_LEFT ||
					         ev->code() == Input::BTN_MIDDLE ||
					         ev->code() == Input::BTN_RIGHT);

		if (ev->type() == Input::Event::MOTION ||
			ev->type() == Input::Event::WHEEL ||
			is_mouse_button_event) {

			_process_mouse_event(ev);

		} else if (is_key_event && (ev->code() < 128)) {

			_process_key_event(ev);

		}
	}
}
void QNitpickerPlatformWindow::handle_events()
{
	/* handle resize events */

	if (_signal_receiver.pending()) {

		_signal_receiver.wait_for_signal();

		Framebuffer::Mode mode(_nitpicker_session.mode());

		if ((mode.width() != _current_mode.width()) ||
	    	(mode.height() != _current_mode.height()) ||
	    	(mode.format() != _current_mode.format())) {

			QRect geo(geometry());
			geo.setWidth(mode.width());
			geo.setHeight(mode.height());

			QWindowSystemInterface::handleGeometryChange(window(), geo);

			setGeometry(geo);
		}
	}

	/* handle input events */

	if (_input_session.is_pending()) {
		for (int i = 0, num_ev = _input_session.flush(); i < num_ev; i++) {

			Input::Event *ev = &_ev_buf[i];

			bool const is_key_event = ev->type() == Input::Event::PRESS ||
					                  ev->type() == Input::Event::RELEASE;

			bool const is_mouse_button_event =
				is_key_event && (ev->code() == Input::BTN_LEFT ||
					             ev->code() == Input::BTN_MIDDLE ||
					             ev->code() == Input::BTN_RIGHT);

			if (ev->type() == Input::Event::MOTION ||
				ev->type() == Input::Event::WHEEL ||
				is_mouse_button_event) {

				_process_mouse_event(ev);

			} else if (is_key_event && (ev->code() < 128)) {

				_process_key_event(ev);

			}
		}

	}

}
void QNitpickerPlatformWindow::_process_key_event(Input::Event const &ev)
{
	const bool pressed = (ev.type() == Input::Event::PRESS);
	const int keycode = ev.code();

	if (pressed) {
		_last_keycode = keycode;
		_key_repeat_timer->start(KEY_REPEAT_DELAY_MS);
	} else
		_key_repeat_timer->stop();

	_keyboard_handler.processKeycode(keycode, pressed, false);
}
void QNitpickerInputHandler::readInputData()
{
//	qDebug() << "QNitpickerInputHandler::readInputData()";

	int i, num_ev;

	if (input->is_pending()) {
		for (i = 0, num_ev = input->flush(); i < num_ev; i++) {

			Input::Event *ev = &ev_buf[i];

			bool const is_key_event = ev->type() == Input::Event::PRESS
			                       || ev->type() == Input::Event::RELEASE;

			bool const is_mouse_button_event =
				is_key_event && (ev->code() == Input::BTN_LEFT
				              || ev->code() == Input::BTN_MIDDLE
				              || ev->code() == Input::BTN_RIGHT);

			if (ev->type() == Input::Event::MOTION
			 || ev->type() == Input::Event::WHEEL
			 || is_mouse_button_event) {

#ifndef QT_NO_QWS_MOUSE_NITPICKER
				mouse->processMouseEvent(ev);
#endif

			} else if (is_key_event && (ev->code() < 128)) {

#ifndef QT_NO_QWS_KEYBOARD_NITPICKER
				keyboard->processKeyEvent(ev);
#endif
			}
		}

	}

//	qDebug() << "QNitpickerInputHandler::readInputData() finished";
}
void QNitpickerPlatformWindow::_process_mouse_event(Input::Event const &ev)
{
	QPoint global_position(ev.ax(), ev.ay());
	QPoint local_position(global_position.x() - geometry().x(),
			              global_position.y() - geometry().y());

	switch (ev.type()) {

		case Input::Event::PRESS:

			/* make this window the focused window */
			requestActivateWindow();

			switch (ev.code()) {
				case Input::BTN_LEFT:
					_mouse_button_state |= Qt::LeftButton;
					break;
				case Input::BTN_RIGHT:
					_mouse_button_state |= Qt::RightButton;
					break;
				case Input::BTN_MIDDLE:
					_mouse_button_state |= Qt::MidButton;
					break;
				case Input::BTN_SIDE:
					_mouse_button_state |= Qt::XButton1;
					break;
				case Input::BTN_EXTRA:
					_mouse_button_state |= Qt::XButton2;
					break;
			}
			break;

		case Input::Event::RELEASE:

			switch (ev.code()) {
				case Input::BTN_LEFT:
					_mouse_button_state &= ~Qt::LeftButton;
					break;
				case Input::BTN_RIGHT:
					_mouse_button_state &= ~Qt::RightButton;
					break;
				case Input::BTN_MIDDLE:
					_mouse_button_state &= ~Qt::MidButton;
					break;
				case Input::BTN_SIDE:
					_mouse_button_state &= ~Qt::XButton1;
					break;
				case Input::BTN_EXTRA:
					_mouse_button_state &= ~Qt::XButton2;
					break;
			}
			break;

		case Input::Event::WHEEL:

			QWindowSystemInterface::handleWheelEvent(window(),
					                                 local_position,
					                                 local_position,
					                                 ev.ry() * 120,
					                                 Qt::Vertical);
			return;

		default:
			break;
	}

	QWindowSystemInterface::handleMouseEvent(window(),
			                                 local_position,
			                                 global_position,
			                                 _mouse_button_state);
}