Blob Blame History Raw
/*********************************************************/
/*  ptycon: a pty-console bridge                         */
/*  Copyright (C) 2016--2017  SysDeer Technologies, LLC  */
/*  Released under GPLv2 and GPLv3; see COPYING.PTYCON.  */
/*********************************************************/

#include <psxtypes/psxtypes.h>
#include <ntcon/ntcon.h>
#include <ntapi/ntapi.h>
#include <gdi/gdi.h>

#include <ptycon/ptycon.h>
#include "ptycon_driver_impl.h"

static int ptyc_dbg_input_record(void * hout, nt_input_record * rec)
{
	char *		ch;
	uintptr_t	buffer[512/sizeof(uintptr_t)];
	uint32_t	nwritten;

	ntapi->tt_aligned_block_memset(
		buffer,0,sizeof(buffer));

	ch = (char *)buffer;

	switch (rec->event_type) {
		case NT_KEY_EVENT:
			ntapi->snprintf(ch,sizeof(buffer),
					"key event. "
					"key down: %d; "
					"repeat count: %d; "
					"virtual key code: 0x%04x; "
					"virtual scan code: 0x%04x; "
					"unicode char: 0x%04x; "
					"control key: 0x%04x.\n",
					rec->key_event.key_down,
					rec->key_event.repeat_count,
					rec->key_event.virtual_key_code,
					rec->key_event.virtual_scan_code,
					rec->key_event.unicode_char,
					rec->key_event.control_key_state);
			break;

		case NT_MOUSE_EVENT:
			ntapi->snprintf(ch,sizeof(buffer),
					"mouse event. "
					"pos.x: %d; "
					"pos.y: %d; "
					"button state: 0x%04x; "
					"ctrl key state: 0x%04x; "
					"event flags: 0x%04x.\n",
					rec->mouse_event.mouse_position.x,
					rec->mouse_event.mouse_position.y,
					rec->mouse_event.button_state,
					rec->mouse_event.control_key_state,
					rec->mouse_event.event_flags);
			break;

		case NT_WINDOW_BUFFER_SIZE_EVENT:
			ntapi->snprintf(ch,sizeof(buffer),
					"window event. "
					"size.x: %d; "
					"size.y: %d.\n",
					rec->window_event.size.x,
					rec->window_event.size.y);

			break;

		case NT_MENU_EVENT:
			ntapi->snprintf(ch,sizeof(buffer),
					"menu event. "
					"command id: %d.\n",
					rec->menu_event.command_id);
			break;

		case NT_FOCUS_EVENT:
			ntapi->snprintf(ch,sizeof(buffer),
					"focus event. "
					"set focus: %d.\n",
					rec->focus_event.set_focus);
			break;

		default:
			return NT_STATUS_INTERNAL_ERROR;
	}

	return ntcon->write_console_ansi(
		hout,ch,
		(uint32_t)ntapi->tt_string_null_offset_multibyte(ch),
		&nwritten,0);
}


int __stdcall ptyc_dbg_event(struct ptyc_driver_ctx_impl * ictx)
{
	nt_input_record	conevt[64];
	uint32_t	nread;
	unsigned	i;

	do {
		if (!(ntcon->read_console_input_utf16(
				ictx->tctx.hin,
				conevt,64,
				&nread)))
			return -1;

		for (i=0; i<nread; i++)
			if (!(ptyc_dbg_input_record(
					ictx->tctx.hout,
					&conevt[i])))
				return -2;
	} while (1);

	return -3;
}