From 3b540119d96b47d7f489b36276acce259fb8b518 Mon Sep 17 00:00:00 2001
From: John Hodge <tpg@mutabah.net>
Date: Sat, 22 Oct 2011 17:46:24 +0800
Subject: [PATCH] Usermode/axwin2 - Added full mouse/cursor support (no input
 yet though :)

---
 Usermode/Applications/axwin2_src/Makefile     |  6 ++--
 Usermode/Applications/axwin2_src/WM/common.h  |  1 +
 Usermode/Applications/axwin2_src/WM/input.c   | 15 +++++---
 .../axwin2_src/WM/resources/cursor.h          | 34 +++++++++++++++++++
 Usermode/Applications/axwin2_src/WM/video.c   | 20 ++++++++++-
 5 files changed, 68 insertions(+), 8 deletions(-)
 create mode 100644 Usermode/Applications/axwin2_src/WM/resources/cursor.h

diff --git a/Usermode/Applications/axwin2_src/Makefile b/Usermode/Applications/axwin2_src/Makefile
index 1174798c..89f15842 100644
--- a/Usermode/Applications/axwin2_src/Makefile
+++ b/Usermode/Applications/axwin2_src/Makefile
@@ -5,9 +5,9 @@ DIRS = WM Shell_src
 SUBMAKE = $(MAKE) --no-print-directory
 
 all:
-	@$(foreach DIR,$(DIRS), echo --- $(NAME)/$(DIR); $(SUBMAKE) -C $(DIR) $@ ;)
+	@$(foreach DIR,$(DIRS), echo --- $(NAME)/$(DIR) && $(SUBMAKE) -C $(DIR) $@ &&) true
 install:
-	@$(foreach DIR,$(DIRS), echo --- $(NAME)/$(DIR); $(SUBMAKE) -C $(DIR) $@ ;)
+	@$(foreach DIR,$(DIRS), echo --- $(NAME)/$(DIR) && $(SUBMAKE) -C $(DIR) $@ &&) true
 
 clean:
-	@$(foreach DIR,$(DIRS), $(SUBMAKE) -C $(DIR) $@ ;)
+	@$(foreach DIR,$(DIRS), $(SUBMAKE) -C $(DIR) $@ &&) true
diff --git a/Usermode/Applications/axwin2_src/WM/common.h b/Usermode/Applications/axwin2_src/WM/common.h
index 2d92cb58..b00d6971 100644
--- a/Usermode/Applications/axwin2_src/WM/common.h
+++ b/Usermode/Applications/axwin2_src/WM/common.h
@@ -92,6 +92,7 @@ extern tApplication	*AxWin_GetClient(tIPC_Type *Method, void *Ident);
 extern tElement	*AxWin_CreateAppWindow(tApplication *App, const char *Name);
 // --- Video ---
 extern void	Video_Setup(void);
+extern void	Video_SetCursorPos(short X, short Y);
 extern void	Video_Update(void);
 extern void	Video_FillRect(short X, short Y, short W, short H, uint32_t Color);
 extern void	Video_DrawRect(short X, short Y, short W, short H, uint32_t Color);
diff --git a/Usermode/Applications/axwin2_src/WM/input.c b/Usermode/Applications/axwin2_src/WM/input.c
index 08cefc72..93869328 100644
--- a/Usermode/Applications/axwin2_src/WM/input.c
+++ b/Usermode/Applications/axwin2_src/WM/input.c
@@ -5,6 +5,9 @@
 #include "common.h"
 #include <acess/sys.h>
 
+#define JOY_IOCTL_GETSETAXISLIMIT	6
+#define JOY_IOCTL_GETSETAXISPOSITION	7
+
 // === CODE ===
 int Input_Init(void)
 {
@@ -18,11 +21,15 @@ int Input_Init(void)
 	// Set mouse limits
 	num_value.Num = 0;
 	num_value.Value = giScreenWidth;
-	ioctl(giMouseFD, 6, &num_value);
+	ioctl(giMouseFD, JOY_IOCTL_GETSETAXISLIMIT, &num_value);
+	num_value.Value = giScreenWidth/2;
+	ioctl(giMouseFD, JOY_IOCTL_GETSETAXISPOSITION, &num_value);
 
 	num_value.Num = 1;
 	num_value.Value = giScreenHeight;
-	ioctl(giMouseFD, 6, &num_value);
+	ioctl(giMouseFD, JOY_IOCTL_GETSETAXISLIMIT, &num_value);
+	num_value.Value = giScreenHeight/2;
+	ioctl(giMouseFD, JOY_IOCTL_GETSETAXISPOSITION, &num_value);
 
 	return 0;
 }
@@ -78,7 +85,7 @@ void Input_HandleSelect(fd_set *set)
 //			mouseinfo.Axies[0].CurValue
 //			);
 		// Handle movement
-//		Video_SetCursorPos( mouseinfo.Axies[0], mouseinfo.Axies[1] );
-		_SysDebug("Cursor to %i,%i", mouseinfo.Axies[0].CursorPos, mouseinfo.Axies[1].CursorPos);
+		Video_SetCursorPos( mouseinfo.Axies[0].CursorPos, mouseinfo.Axies[1].CursorPos );
+//		_SysDebug("Cursor to %i,%i", mouseinfo.Axies[0].CursorPos, mouseinfo.Axies[1].CursorPos);
 	}
 }
diff --git a/Usermode/Applications/axwin2_src/WM/resources/cursor.h b/Usermode/Applications/axwin2_src/WM/resources/cursor.h
new file mode 100644
index 00000000..58b47e80
--- /dev/null
+++ b/Usermode/Applications/axwin2_src/WM/resources/cursor.h
@@ -0,0 +1,34 @@
+/*
+ */
+#ifndef _RESORUCE_CURSOR_H
+#define _RESORUCE_CURSOR_H
+
+#include <stdint.h>
+
+static struct {
+	uint16_t	W, H, OfsX, OfsY;
+	uint32_t	Data[];
+} cCursorBitmap = {
+	8, 16, 0, 0,
+	{
+		0xFF000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+		0xFF000000, 0xFF000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+		0xFF000000, 0xFFFFFFFF, 0xFF000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+		0xFF000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFF000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
+		0xFF000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFF000000, 0x00000000, 0x00000000, 0x00000000,
+		0xFF000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFF000000, 0x00000000, 0x00000000,
+		0xFF000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFF000000, 0x00000000,
+		0xFF000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFF888888, 0xFF000000, 0xFF000000, 0xFF000000,
+		0xFF000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFF000000, 0x00000000, 0x00000000,
+		0xFF000000, 0xFFFFFFFF, 0xFF000000, 0xFF000000, 0xFFFFFFFF, 0xFF000000, 0x00000000, 0x00000000,
+		0xFF000000, 0xFF000000, 0x00000000, 0xFF000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFF000000, 0x00000000,
+		0xFF000000, 0x00000000, 0x00000000, 0x00000000, 0xFF000000, 0xFFFFFFFF, 0xFF000000, 0x00000000,
+		0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFF000000, 0xFFFFFFFF, 0xFFFFFFFF, 0xFF000000,
+		0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFF000000, 0xFFFFFFFF, 0xFF000000,
+		0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xFF000000, 0x00000000,
+		0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000
+	}
+};
+
+#endif
+
diff --git a/Usermode/Applications/axwin2_src/WM/video.c b/Usermode/Applications/axwin2_src/WM/video.c
index b57b8c7f..4121fbeb 100644
--- a/Usermode/Applications/axwin2_src/WM/video.c
+++ b/Usermode/Applications/axwin2_src/WM/video.c
@@ -6,9 +6,11 @@
 #include <acess/sys.h>
 #include <acess/devices/terminal.h>
 #include <image.h>
+#include "resources/cursor.h"
 
 // === PROTOTYPES ===
 void	Video_Setup(void);
+void	Video_SetCursorPos(short X, short Y);
 void	Video_Update(void);
 void	Video_FillRect(short X, short Y, short W, short H, uint32_t Color);
 void	Video_DrawRect(short X, short Y, short W, short H, uint32_t Color);
@@ -54,12 +56,17 @@ void Video_Setup(void)
 	tmpInt = TERM_MODE_FB;
 	ioctl( giTerminalFD, TERM_IOCTL_MODETYPE, &tmpInt );
 	
-	// Force VT8 to be shown
+	// Force VT to be shown
 	ioctl( giTerminalFD, TERM_IOCTL_FORCESHOW, NULL );
 	
 	// Create local framebuffer (back buffer)
 	gpScreenBuffer = malloc( giScreenWidth*giScreenHeight*4 );
 	memset32( gpScreenBuffer, 0x8888FF, giScreenWidth*giScreenHeight );
+
+	// Set cursor position and bitmap
+	ioctl(giTerminalFD, TERM_IOCTL_SETCURSORBITMAP, &cCursorBitmap);
+	Video_SetCursorPos( giScreenWidth/2, giScreenHeight/2 );
+
 	Video_Update();
 }
 
@@ -70,6 +77,17 @@ void Video_Update(void)
 	write(giTerminalFD, gpScreenBuffer, giScreenWidth*giScreenHeight*4);
 }
 
+void Video_SetCursorPos(short X, short Y)
+{
+	struct {
+		uint16_t	x;
+		uint16_t	y;
+	} pos;
+	pos.x = giVideo_CursorX = X;
+	pos.y = giVideo_CursorY = Y;
+	ioctl(giTerminalFD, TERM_IOCTL_GETSETCURSOR, &pos);
+}
+
 void Video_FillRect(short X, short Y, short W, short H, uint32_t Color)
 {
 	uint32_t	*buf = gpScreenBuffer + Y*giScreenWidth + X;
-- 
GitLab