cscg22-gearboy

CSCG 2022 Challenge 'Gearboy'
git clone https://git.sinitax.com/sinitax/cscg22-gearboy
Log | Files | Refs | sfeed.txt

SDL_winrtmouse.cpp (5215B)


      1/*
      2  Simple DirectMedia Layer
      3  Copyright (C) 1997-2014 Sam Lantinga <slouken@libsdl.org>
      4
      5  This software is provided 'as-is', without any express or implied
      6  warranty.  In no event will the authors be held liable for any damages
      7  arising from the use of this software.
      8
      9  Permission is granted to anyone to use this software for any purpose,
     10  including commercial applications, and to alter it and redistribute it
     11  freely, subject to the following restrictions:
     12
     13  1. The origin of this software must not be misrepresented; you must not
     14     claim that you wrote the original software. If you use this software
     15     in a product, an acknowledgment in the product documentation would be
     16     appreciated but is not required.
     17  2. Altered source versions must be plainly marked as such, and must not be
     18     misrepresented as being the original software.
     19  3. This notice may not be removed or altered from any source distribution.
     20*/
     21#include "../../SDL_internal.h"
     22
     23#if SDL_VIDEO_DRIVER_WINRT
     24
     25/*
     26 * Windows includes:
     27 */
     28#include <Windows.h>
     29using namespace Windows::UI::Core;
     30using Windows::UI::Core::CoreCursor;
     31
     32/*
     33 * SDL includes:
     34 */
     35extern "C" {
     36#include "SDL_assert.h"
     37#include "../../events/SDL_mouse_c.h"
     38#include "../../events/SDL_touch_c.h"
     39#include "../SDL_sysvideo.h"
     40#include "SDL_events.h"
     41#include "SDL_log.h"
     42}
     43
     44#include "../../core/winrt/SDL_winrtapp_direct3d.h"
     45#include "SDL_winrtvideo_cpp.h"
     46#include "SDL_winrtmouse_c.h"
     47
     48
     49extern "C" SDL_bool WINRT_UsingRelativeMouseMode = SDL_FALSE;
     50
     51
     52static SDL_Cursor *
     53WINRT_CreateSystemCursor(SDL_SystemCursor id)
     54{
     55    SDL_Cursor *cursor;
     56    CoreCursorType cursorType = CoreCursorType::Arrow;
     57
     58    switch(id)
     59    {
     60    default:
     61        SDL_assert(0);
     62        return NULL;
     63    case SDL_SYSTEM_CURSOR_ARROW:     cursorType = CoreCursorType::Arrow; break;
     64    case SDL_SYSTEM_CURSOR_IBEAM:     cursorType = CoreCursorType::IBeam; break;
     65    case SDL_SYSTEM_CURSOR_WAIT:      cursorType = CoreCursorType::Wait; break;
     66    case SDL_SYSTEM_CURSOR_CROSSHAIR: cursorType = CoreCursorType::Cross; break;
     67    case SDL_SYSTEM_CURSOR_WAITARROW: cursorType = CoreCursorType::Wait; break;
     68    case SDL_SYSTEM_CURSOR_SIZENWSE:  cursorType = CoreCursorType::SizeNorthwestSoutheast; break;
     69    case SDL_SYSTEM_CURSOR_SIZENESW:  cursorType = CoreCursorType::SizeNortheastSouthwest; break;
     70    case SDL_SYSTEM_CURSOR_SIZEWE:    cursorType = CoreCursorType::SizeWestEast; break;
     71    case SDL_SYSTEM_CURSOR_SIZENS:    cursorType = CoreCursorType::SizeNorthSouth; break;
     72    case SDL_SYSTEM_CURSOR_SIZEALL:   cursorType = CoreCursorType::SizeAll; break;
     73    case SDL_SYSTEM_CURSOR_NO:        cursorType = CoreCursorType::UniversalNo; break;
     74    case SDL_SYSTEM_CURSOR_HAND:      cursorType = CoreCursorType::Hand; break;
     75    }
     76
     77    cursor = (SDL_Cursor *) SDL_calloc(1, sizeof(*cursor));
     78    if (cursor) {
     79        /* Create a pointer to a COM reference to a cursor.  The extra
     80           pointer is used (on top of the COM reference) to allow the cursor
     81           to be referenced by the SDL_cursor's driverdata field, which is
     82           a void pointer.
     83        */
     84        CoreCursor ^* theCursor = new CoreCursor^(nullptr);
     85        *theCursor = ref new CoreCursor(cursorType, 0);
     86        cursor->driverdata = (void *) theCursor;
     87    } else {
     88        SDL_OutOfMemory();
     89    }
     90
     91    return cursor;
     92}
     93
     94static SDL_Cursor *
     95WINRT_CreateDefaultCursor()
     96{
     97    return WINRT_CreateSystemCursor(SDL_SYSTEM_CURSOR_ARROW);
     98}
     99
    100static void
    101WINRT_FreeCursor(SDL_Cursor * cursor)
    102{
    103    if (cursor->driverdata) {
    104        CoreCursor ^* theCursor = (CoreCursor ^*) cursor->driverdata;
    105        *theCursor = nullptr;       // Release the COM reference to the CoreCursor
    106        delete theCursor;           // Delete the pointer to the COM reference
    107    }
    108    SDL_free(cursor);
    109}
    110
    111static int
    112WINRT_ShowCursor(SDL_Cursor * cursor)
    113{
    114    // TODO, WinRT, XAML: make WINRT_ShowCursor work when XAML support is enabled.
    115    if ( ! CoreWindow::GetForCurrentThread()) {
    116        return 0;
    117    }
    118
    119    if (cursor) {
    120        CoreCursor ^* theCursor = (CoreCursor ^*) cursor->driverdata;
    121        CoreWindow::GetForCurrentThread()->PointerCursor = *theCursor;
    122    } else {
    123        CoreWindow::GetForCurrentThread()->PointerCursor = nullptr;
    124    }
    125    return 0;
    126}
    127
    128static int
    129WINRT_SetRelativeMouseMode(SDL_bool enabled)
    130{
    131    WINRT_UsingRelativeMouseMode = enabled;
    132    return 0;
    133}
    134
    135void
    136WINRT_InitMouse(_THIS)
    137{
    138    SDL_Mouse *mouse = SDL_GetMouse();
    139
    140    /* DLudwig, Dec 3, 2012: WinRT does not currently provide APIs for
    141       the following features, AFAIK:
    142        - custom cursors  (multiple system cursors are, however, available)
    143        - programmatically moveable cursors
    144    */
    145
    146#if WINAPI_FAMILY != WINAPI_FAMILY_PHONE_APP
    147    //mouse->CreateCursor = WINRT_CreateCursor;
    148    mouse->CreateSystemCursor = WINRT_CreateSystemCursor;
    149    mouse->ShowCursor = WINRT_ShowCursor;
    150    mouse->FreeCursor = WINRT_FreeCursor;
    151    //mouse->WarpMouse = WINRT_WarpMouse;
    152    mouse->SetRelativeMouseMode = WINRT_SetRelativeMouseMode;
    153
    154    SDL_SetDefaultCursor(WINRT_CreateDefaultCursor());
    155#endif
    156}
    157
    158void
    159WINRT_QuitMouse(_THIS)
    160{
    161}
    162
    163#endif /* SDL_VIDEO_DRIVER_WINRT */
    164
    165/* vi: set ts=4 sw=4 expandtab: */