1 /+
2 +            Copyright 2022 – 2024 Aya Partridge
3 +          Copyright 2018 - 2022 Michael D. Parker
4 + Distributed under the Boost Software License, Version 1.0.
5 +     (See accompanying file LICENSE_1_0.txt or copy at
6 +           http://www.boost.org/LICENSE_1_0.txt)
7 +/
8 module sdl.mouse;
9 
10 import bindbc.sdl.config;
11 import bindbc.sdl.codegen;
12 
13 import sdl.stdinc: SDL_bool;
14 import sdl.surface: SDL_Surface;
15 import sdl.video;
16 
17 struct SDL_Cursor;
18 
19 alias SDL_SystemCursor = uint;
20 enum: SDL_SystemCursor{
21 	SDL_SYSTEM_CURSOR_ARROW        = 0,
22 	SDL_SYSTEM_CURSOR_IBEAM        = 1,
23 	SDL_SYSTEM_CURSOR_WAIT         = 2,
24 	SDL_SYSTEM_CURSOR_CROSSHAIR    = 3,
25 	SDL_SYSTEM_CURSOR_WAITARROW    = 4,
26 	SDL_SYSTEM_CURSOR_SIZENWSE     = 5,
27 	SDL_SYSTEM_CURSOR_SIZENESW     = 6,
28 	SDL_SYSTEM_CURSOR_SIZEWE       = 7,
29 	SDL_SYSTEM_CURSOR_SIZENS       = 8,
30 	SDL_SYSTEM_CURSOR_SIZEALL      = 9,
31 	SDL_SYSTEM_CURSOR_NO           = 10,
32 	SDL_SYSTEM_CURSOR_HAND         = 11,
33 	SDL_NUM_SYSTEM_CURSORS         = 12,
34 }
35 
36 static if(sdlSupport >= SDLSupport.v2_0_4){
37 	alias SDL_MouseWheelDirection = uint;
38 	enum: SDL_MouseWheelDirection{
39 		SDL_MOUSEWHEEL_NORMAL   = 0,
40 		SDL_MOUSEWHEEL_FLIPPED  = 1,
41 	}
42 }
43 
44 pragma(inline, true) nothrow @nogc pure @safe{
45 	uint SDL_BUTTON(ubyte x){ return 1 << (x-1); }
46 }
47 deprecated("Please use the non-template version instead"){
48 	enum SDL_BUTTON(ubyte x) = 1 << (x-1);
49 }
50 enum: ubyte{
51 	SDL_BUTTON_LEFT      = 1,
52 	SDL_BUTTON_MIDDLE    = 2,
53 	SDL_BUTTON_RIGHT     = 3,
54 	SDL_BUTTON_X1        = 4,
55 	SDL_BUTTON_X2        = 5,
56 	SDL_BUTTON_LMASK     = SDL_BUTTON(SDL_BUTTON_LEFT),
57 	SDL_BUTTON_MMASK     = SDL_BUTTON(SDL_BUTTON_MIDDLE),
58 	SDL_BUTTON_RMASK     = SDL_BUTTON(SDL_BUTTON_RIGHT),
59 	SDL_BUTTON_X1MASK    = SDL_BUTTON(SDL_BUTTON_X1),
60 	SDL_BUTTON_X2MASK    = SDL_BUTTON(SDL_BUTTON_X2),
61 }
62 
63 mixin(joinFnBinds((){
64 	FnBind[] ret = [
65 		{q{SDL_Window*}, q{SDL_GetMouseFocus}, q{}},
66 		{q{uint}, q{SDL_GetMouseState}, q{int* x, int* y}},
67 		{q{uint}, q{SDL_GetRelativeMouseState}, q{int* x, int* y}},
68 		{q{void}, q{SDL_WarpMouseInWindow}, q{SDL_Window* window, int x, int y}},
69 		{q{int}, q{SDL_SetRelativeMouseMode}, q{SDL_bool enabled}},
70 		{q{SDL_bool}, q{SDL_GetRelativeMouseMode}, q{}},
71 		{q{SDL_Cursor*}, q{SDL_CreateCursor}, q{const(ubyte)* data, const(ubyte)* mask, int w, int h, int hotX, int hotY}},
72 		{q{SDL_Cursor*}, q{SDL_CreateColorCursor}, q{SDL_Surface* surface, int hotX, int hotY}},
73 		{q{SDL_Cursor*}, q{SDL_CreateSystemCursor}, q{SDL_SystemCursor id}},
74 		{q{void}, q{SDL_SetCursor}, q{SDL_Cursor* cursor}},
75 		{q{SDL_Cursor*}, q{SDL_GetCursor}, q{}},
76 		{q{SDL_Cursor*}, q{SDL_GetDefaultCursor}, q{}},
77 		{q{void}, q{SDL_FreeCursor}, q{SDL_Cursor* cursor}},
78 		{q{int}, q{SDL_ShowCursor}, q{int toggle}},
79 	];
80 	if(sdlSupport >= SDLSupport.v2_0_4){
81 		FnBind[] add = [
82 			{q{int}, q{SDL_CaptureMouse}, q{SDL_bool enabled}},
83 			{q{uint}, q{SDL_GetGlobalMouseState}, q{int* x, int* y}},
84 			{q{void}, q{SDL_WarpMouseGlobal}, q{int x, int y}},
85 		];
86 		ret ~= add;
87 	}
88 	return ret;
89 }()));
90 
91 alias SDL_CreateColourCursor = SDL_CreateColorCursor;