Implement very basic grab pointer
This is definitely not correct with child windows but works with single window apps (minecraft)
This commit is contained in:
@@ -28,6 +28,8 @@ CARD16 g_keymask { 0 };
|
|||||||
CARD16 g_butmask { 0 };
|
CARD16 g_butmask { 0 };
|
||||||
WINDOW g_focus_window { None };
|
WINDOW g_focus_window { None };
|
||||||
|
|
||||||
|
static WINDOW s_pointer_grab_wid = None;
|
||||||
|
|
||||||
static const char* s_opcode_to_name[] {
|
static const char* s_opcode_to_name[] {
|
||||||
[0] = "none",
|
[0] = "none",
|
||||||
[X_CreateWindow] = "X_CreateWindow",
|
[X_CreateWindow] = "X_CreateWindow",
|
||||||
@@ -1852,13 +1854,37 @@ BAN::ErrorOr<void> handle_packet(Client& client_info, BAN::ConstByteSpan packet)
|
|||||||
dprintln(" cursor: {}", request.cursor);
|
dprintln(" cursor: {}", request.cursor);
|
||||||
dprintln(" time: {}", request.time);
|
dprintln(" time: {}", request.time);
|
||||||
|
|
||||||
xGrabPointerReply reply {
|
auto& window = TRY_REF(get_window(client_info, request.grabWindow, X_GrabPointer));
|
||||||
.type = X_Reply,
|
|
||||||
.status = Success,
|
if (s_pointer_grab_wid != None && !g_objects.contains(s_pointer_grab_wid))
|
||||||
.sequenceNumber = client_info.sequence,
|
s_pointer_grab_wid = None;
|
||||||
.length = 0,
|
|
||||||
};
|
if (s_pointer_grab_wid == None)
|
||||||
TRY(encode(client_info.output_buffer, reply));
|
{
|
||||||
|
xGrabPointerReply reply {
|
||||||
|
.type = X_Reply,
|
||||||
|
.status = Success,
|
||||||
|
.sequenceNumber = client_info.sequence,
|
||||||
|
.length = 0,
|
||||||
|
};
|
||||||
|
TRY(encode(client_info.output_buffer, reply));
|
||||||
|
|
||||||
|
if (g_platform_ops.set_pointer_grab)
|
||||||
|
if (auto* platform_window = get_platform_window(window))
|
||||||
|
g_platform_ops.set_pointer_grab(platform_window, true);
|
||||||
|
|
||||||
|
s_pointer_grab_wid = request.grabWindow;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
xGrabPointerReply reply {
|
||||||
|
.type = X_Reply,
|
||||||
|
.status = AlreadyGrabbed,
|
||||||
|
.sequenceNumber = client_info.sequence,
|
||||||
|
.length = 0,
|
||||||
|
};
|
||||||
|
TRY(encode(client_info.output_buffer, reply));
|
||||||
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -1869,6 +1895,16 @@ BAN::ErrorOr<void> handle_packet(Client& client_info, BAN::ConstByteSpan packet)
|
|||||||
dprintln("UngrabPointer");
|
dprintln("UngrabPointer");
|
||||||
dprintln(" time: {}", time);
|
dprintln(" time: {}", time);
|
||||||
|
|
||||||
|
if (s_pointer_grab_wid == None)
|
||||||
|
break;
|
||||||
|
|
||||||
|
auto it = g_objects.find(s_pointer_grab_wid);
|
||||||
|
if (it != g_objects.end() && g_platform_ops.set_pointer_grab)
|
||||||
|
if (auto* platform_window = get_platform_window(it->value->object.get<Object::Window>()))
|
||||||
|
g_platform_ops.set_pointer_grab(platform_window, false);
|
||||||
|
|
||||||
|
s_pointer_grab_wid = None;
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case X_GrabKeyboard:
|
case X_GrabKeyboard:
|
||||||
|
|||||||
@@ -63,6 +63,8 @@ struct PlatformOps
|
|||||||
void (*warp_pointer)(int32_t x, int32_t y, bool relative);
|
void (*warp_pointer)(int32_t x, int32_t y, bool relative);
|
||||||
/* Get global position of the pointer */
|
/* Get global position of the pointer */
|
||||||
void (*query_pointer)(int32_t* x, int32_t* y);
|
void (*query_pointer)(int32_t* x, int32_t* y);
|
||||||
|
/* Grab pointer events on window */
|
||||||
|
void (*set_pointer_grab)(PlatformWindow*, bool grabbed);
|
||||||
/* Create a system cursor */
|
/* Create a system cursor */
|
||||||
BAN::ErrorOr<BAN::UniqPtr<PlatformCursor>> (*create_system_cursor)(SystemCursorType);
|
BAN::ErrorOr<BAN::UniqPtr<PlatformCursor>> (*create_system_cursor)(SystemCursorType);
|
||||||
/* Create cursor from custom bitmap */
|
/* Create cursor from custom bitmap */
|
||||||
|
|||||||
@@ -356,6 +356,12 @@ static void sdl3_query_pointer(int32_t* x, int32_t* y)
|
|||||||
*y = cy;
|
*y = cy;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void sdl3_set_pointer_grab(PlatformWindow* window, bool grabbed)
|
||||||
|
{
|
||||||
|
auto& sdl_window = *static_cast<SDLWindow*>(window);
|
||||||
|
SDL_SetWindowMouseGrab(sdl_window.window, grabbed);
|
||||||
|
}
|
||||||
|
|
||||||
static BAN::ErrorOr<BAN::UniqPtr<PlatformCursor>> sdl3_create_system_cursor(SystemCursorType type)
|
static BAN::ErrorOr<BAN::UniqPtr<PlatformCursor>> sdl3_create_system_cursor(SystemCursorType type)
|
||||||
{
|
{
|
||||||
static constexpr SDL_SystemCursor cursor_type_map[] {
|
static constexpr SDL_SystemCursor cursor_type_map[] {
|
||||||
@@ -437,6 +443,7 @@ PlatformOps g_platform_ops = {
|
|||||||
.request_fullscreen = sdl3_request_fullscreen,
|
.request_fullscreen = sdl3_request_fullscreen,
|
||||||
.warp_pointer = sdl3_warp_pointer,
|
.warp_pointer = sdl3_warp_pointer,
|
||||||
.query_pointer = sdl3_query_pointer,
|
.query_pointer = sdl3_query_pointer,
|
||||||
|
.set_pointer_grab = sdl3_set_pointer_grab,
|
||||||
.create_system_cursor = sdl3_create_system_cursor,
|
.create_system_cursor = sdl3_create_system_cursor,
|
||||||
.create_bitmap_cursor = sdl3_create_bitmap_cursor,
|
.create_bitmap_cursor = sdl3_create_bitmap_cursor,
|
||||||
.set_cursor = sdl3_set_cursor,
|
.set_cursor = sdl3_set_cursor,
|
||||||
|
|||||||
@@ -160,6 +160,12 @@ static void bananos_query_pointer(int32_t* x, int32_t* y)
|
|||||||
(void)y;
|
(void)y;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void bananos_set_pointer_grab(PlatformWindow* window, bool grabbed)
|
||||||
|
{
|
||||||
|
(void)window;
|
||||||
|
(void)grabbed;
|
||||||
|
}
|
||||||
|
|
||||||
static BAN::ErrorOr<BAN::UniqPtr<PlatformCursor>> bananos_create_system_cursor(SystemCursorType type)
|
static BAN::ErrorOr<BAN::UniqPtr<PlatformCursor>> bananos_create_system_cursor(SystemCursorType type)
|
||||||
{
|
{
|
||||||
(void)type;
|
(void)type;
|
||||||
@@ -205,6 +211,7 @@ PlatformOps g_platform_ops = {
|
|||||||
.request_fullscreen = bananos_request_fullscreen,
|
.request_fullscreen = bananos_request_fullscreen,
|
||||||
.warp_pointer = bananos_warp_pointer,
|
.warp_pointer = bananos_warp_pointer,
|
||||||
.query_pointer = nullptr, /* bananos_query_pointer */
|
.query_pointer = nullptr, /* bananos_query_pointer */
|
||||||
|
.set_pointer_grab = bananos_set_pointer_grab,
|
||||||
.create_system_cursor = bananos_create_system_cursor,
|
.create_system_cursor = bananos_create_system_cursor,
|
||||||
.create_bitmap_cursor = bananos_create_bitmap_cursor,
|
.create_bitmap_cursor = bananos_create_bitmap_cursor,
|
||||||
.set_cursor = bananos_set_cursor,
|
.set_cursor = bananos_set_cursor,
|
||||||
|
|||||||
Reference in New Issue
Block a user