// === IMPORTS ===
extern void Video_SetCursorPos(short X, short Y);
-// TODO: Move out
+extern void WM_Input_MouseMoved(int OldX, int OldY, int NewX, int NewY);
+extern void WM_Input_MouseButton(int X, int Y, int Button, int Pressed);
const char *gsMouseDevice;
- int giTerminalFD;
- int giScreenWidth;
- int giScreenHeight;
+extern int giTerminalFD;
+extern int giScreenWidth;
+extern int giScreenHeight;
// === GLOBALS ===
int giMouseFD;
+ int giInput_MouseButtonState;
+ int giInput_MouseX, giInput_MouseY;
// === CODE ===
int Input_Init(void)
num_value.Num = 0; num_value.Value = giScreenWidth;
ioctl(giMouseFD, JOY_IOCTL_GETSETAXISLIMIT, &num_value);
num_value.Value = giScreenWidth/2;
+ giInput_MouseX = giScreenWidth/2;
ioctl(giMouseFD, JOY_IOCTL_GETSETAXISPOSITION, &num_value);
num_value.Num = 1; num_value.Value = giScreenHeight;
ioctl(giMouseFD, JOY_IOCTL_GETSETAXISLIMIT, &num_value);
num_value.Value = giScreenHeight/2;
+ giInput_MouseY = giScreenHeight/2;
ioctl(giMouseFD, JOY_IOCTL_GETSETAXISPOSITION, &num_value);
return 0;
if(FD_ISSET(giMouseFD, set))
{
+ int i;
struct sMouseInfo {
uint16_t NAxies;
uint16_t NButtons;
// Handle movement
Video_SetCursorPos( mouseinfo.Axies[0].CursorPos, mouseinfo.Axies[1].CursorPos );
-
- // TODO: Handle button presses
+ WM_Input_MouseMoved(
+ giInput_MouseX, giInput_MouseY,
+ mouseinfo.Axies[0].CursorPos, mouseinfo.Axies[1].CursorPos
+ );
+ giInput_MouseX = mouseinfo.Axies[0].CursorPos;
+ giInput_MouseY = mouseinfo.Axies[1].CursorPos;
+
+ for( i = 0; i < mouseinfo.NButtons; i ++ )
+ {
+ int bit = 1 << i;
+ int cur = mouseinfo.Buttons[i] > 128;
+
+ if( !!(giInput_MouseButtonState & bit) != cur )
+ {
+ WM_Input_MouseButton(giInput_MouseX, giInput_MouseY, i, cur);
+ // Flip button state
+ giInput_MouseButtonState ^= bit;
+ }
+ }
}
}
--- /dev/null
+/*
+ * Acess2 Window Manager v3
+ * - By John Hodge (thePowersGang)
+ *
+ * wm.c
+ * - Window manager core
+ */
+#include <common.h>
+#include <wm_internals.h>
+
+// === IMPORTS ===
+extern tWindow *gpWM_RootWindow;
+
+// === CODE ===
+tWindow *WM_int_GetWindowAtPos(int X, int Y)
+{
+ tWindow *win, *next_win, *ret;
+
+ next_win = gpWM_RootWindow;
+
+ while(next_win)
+ {
+ ret = next_win;
+ next_win = NULL;
+ for(win = ret->FirstChild; win; win = win->NextSibling)
+ {
+ if( !(win->Flags & WINFLAG_SHOW) ) continue ;
+ if( X < win->X || X >= win->X + win->W ) continue;
+ if( Y < win->Y || Y >= win->Y + win->H ) continue;
+ next_win = win; // Overwrite as we want the final rendered window
+ }
+ }
+
+ return ret;
+}
+
+void WM_Input_MouseMoved(int OldX, int OldY, int NewX, int NewY)
+{
+ // TODO: Mouse motion events
+ // TODO: Send mouseup to match mousedown if the cursor moves out of a window?
+}
+
+void WM_Input_MouseButton(int X, int Y, int ButtonIndex, int Pressed)
+{
+// tWindow *win = WM_int_GetWindowAtPos(X, Y);
+
+ // Send Press/Release message
+}
+