From a6172e2543e71f5cd48af58e41249ec61bd2b9fe Mon Sep 17 00:00:00 2001
From: deuce <>
Date: Mon, 31 May 2004 23:52:58 +0000
Subject: [PATCH] Win32 Mouse support... right button isn't working though.

---
 src/uifc/keys.h   |   2 +
 src/uifc/uifc32.c | 111 ++++++++++++++++++++++++++++++++++++++--------
 2 files changed, 94 insertions(+), 19 deletions(-)

diff --git a/src/uifc/keys.h b/src/uifc/keys.h
index 7957d630ad..2face42c88 100644
--- a/src/uifc/keys.h
+++ b/src/uifc/keys.h
@@ -16,3 +16,5 @@
 				   * backspace keypress and the backspace
 				   * char
 				   */
+
+#define KEY_MOUSE	0xff02
\ No newline at end of file
diff --git a/src/uifc/uifc32.c b/src/uifc/uifc32.c
index 6f6b19141c..ca303171d1 100644
--- a/src/uifc/uifc32.c
+++ b/src/uifc/uifc32.c
@@ -113,6 +113,14 @@ struct uifc_mouse_event {
 	int	button;
 };
 
+/* Mouse support */
+#ifdef _WIN32
+int	uifc_last_button_press=0;
+struct uifc_mouse_event	last_mouse_click;
+#define kbhit()	console_hit()
+int	console_hit(void);
+#endif
+
 static void reset_dynamic(void) {
 	last_menu_cur=NULL;
 	last_menu_bar=NULL;
@@ -137,6 +145,34 @@ int kbwait(void) {
 
 #ifdef _WIN32
 
+int console_hit(void)
+{
+	INPUT_RECORD input;
+	DWORD num=0;
+
+	while(1) {
+		if(!PeekConsoleInput(GetStdHandle(STD_INPUT_HANDLE), &input, 1, &num)
+			|| !num)
+			break;
+		if(input.EventType==KEY_EVENT && input.Event.KeyEvent.bKeyDown)
+			return(1);
+		if(input.EventType==MOUSE_EVENT) {
+			if(!input.Event.MouseEvent.dwEventFlags
+				&& (!input.Event.MouseEvent.dwButtonState
+					|| input.Event.MouseEvent.dwButtonState==FROM_LEFT_1ST_BUTTON_PRESSED
+					|| input.Event.MouseEvent.dwButtonState==RIGHTMOST_BUTTON_PRESSED))
+				return(1);
+			else
+				uifc_last_button_press=0;
+		}
+		if(ReadConsoleInput(GetStdHandle(STD_INPUT_HANDLE), &input, 1, &num)
+			&& num) {
+			continue;
+		}
+	}
+	return(0);
+}
+
 int inkey()
 {
 	char str[128];
@@ -145,30 +181,61 @@ int inkey()
 
 	while(1) {
 		if(!ReadConsoleInput(GetStdHandle(STD_INPUT_HANDLE), &input, 1, &num)
-			|| !num || input.EventType!=KEY_EVENT)
+			|| !num || (input.EventType!=KEY_EVENT && input.EventType!=MOUSE_EVENT))
 			continue;
 
-		if(!input.Event.KeyEvent.bKeyDown)
-			continue;
+		switch(input.EventType) {
+			case KEY_EVENT:
+				if(!input.Event.KeyEvent.bKeyDown)
+					continue;
 #if 0
-		sprintf(str,"keydown=%d\n",input.Event.KeyEvent.bKeyDown);
-		OutputDebugString(str);
-		sprintf(str,"repeat=%d\n",input.Event.KeyEvent.wRepeatCount);
-		OutputDebugString(str);
-		sprintf(str,"keycode=%x\n",input.Event.KeyEvent.wVirtualKeyCode);
-		OutputDebugString(str);
-		sprintf(str,"scancode=%x\n",input.Event.KeyEvent.wVirtualScanCode);
-		OutputDebugString(str);
-		sprintf(str,"ascii=%d\n",input.Event.KeyEvent.uChar.AsciiChar);
-		OutputDebugString(str);
-		sprintf(str,"dwControlKeyState=%lx\n",input.Event.KeyEvent.dwControlKeyState);
-		OutputDebugString(str);
+				sprintf(str,"keydown=%d\n",input.Event.KeyEvent.bKeyDown);
+				OutputDebugString(str);
+				sprintf(str,"repeat=%d\n",input.Event.KeyEvent.wRepeatCount);
+				OutputDebugString(str);
+				sprintf(str,"keycode=%x\n",input.Event.KeyEvent.wVirtualKeyCode);
+				OutputDebugString(str);
+				sprintf(str,"scancode=%x\n",input.Event.KeyEvent.wVirtualScanCode);
+				OutputDebugString(str);
+				sprintf(str,"ascii=%d\n",input.Event.KeyEvent.uChar.AsciiChar);
+				OutputDebugString(str);
+				sprintf(str,"dwControlKeyState=%lx\n",input.Event.KeyEvent.dwControlKeyState);
+				OutputDebugString(str);
 #endif
 
-		if(input.Event.KeyEvent.uChar.AsciiChar)
-			return(input.Event.KeyEvent.uChar.AsciiChar);
+				if(input.Event.KeyEvent.uChar.AsciiChar)
+					return(input.Event.KeyEvent.uChar.AsciiChar);
 
-		return(input.Event.KeyEvent.wVirtualScanCode<<8);
+				return(input.Event.KeyEvent.wVirtualScanCode<<8);
+				break;
+			case MOUSE_EVENT:
+				if(input.Event.MouseEvent.dwEventFlags!=0) {
+					uifc_last_button_press=0;
+					continue;
+				}
+				if(input.Event.MouseEvent.dwButtonState==0) {
+					if(uifc_last_button_press) {
+						last_mouse_click.x=input.Event.MouseEvent.dwMousePosition.X;
+						last_mouse_click.y=input.Event.MouseEvent.dwMousePosition.Y;
+						last_mouse_click.button=uifc_last_button_press;
+						uifc_last_button_press=0;
+						return(KEY_MOUSE);
+					}
+				}
+				else {
+					uifc_last_button_press=0;
+					switch(input.Event.MouseEvent.dwButtonState) {
+						case FROM_LEFT_1ST_BUTTON_PRESSED:
+							uifc_last_button_press=1;
+							break;
+						case RIGHTMOST_BUTTON_PRESSED:
+							uifc_last_button_press=2;
+							break;
+						default:
+							uifc_last_button_press=0;
+					}
+				}
+		}
 	}
 
 	return(0);
@@ -262,6 +329,7 @@ int uifcini32(uifcapi_t* uifcapi)
 
     gettextinfo(&txtinfo);
 #ifdef _WIN32
+	api->mode|=UIFC_MOUSE;
     /* unsupported mode? */
     if(txtinfo.screenheight<MIN_LINES
 /*        || txtinfo.screenheight>MAX_LINES */
@@ -271,7 +339,9 @@ int uifcini32(uifcapi_t* uifcapi)
     }
 
 	if(GetConsoleMode(GetStdHandle(STD_INPUT_HANDLE), &conmode))
-		SetConsoleMode(GetStdHandle(STD_INPUT_HANDLE), conmode&=~ENABLE_PROCESSED_INPUT);
+		conmode&=~ENABLE_PROCESSED_INPUT;
+		conmode|=ENABLE_MOUSE_INPUT;
+		SetConsoleMode(GetStdHandle(STD_INPUT_HANDLE), conmode);
 #endif
 
     api->scrn_len=txtinfo.screenheight;
@@ -367,6 +437,9 @@ static int uifc_getmouse(struct uifc_mouse_event *mevent)
 	mevent->y=0;
 	mevent->button=0;
 	if(api->mode&UIFC_MOUSE) {
+		#ifdef _WIN32
+			memcpy(mevent,&last_mouse_click,sizeof(last_mouse_click));
+		#endif
 		#ifdef NCURSES_VERSION_MAJOR
 			MEVENT	mevnt;
 
-- 
GitLab