/*
  Copyright (C) 1997-2022 Sam Lantinga <slouken@libsdl.org>

  This software is provided 'as-is', without any express or implied
  warranty.  In no event will the authors be held liable for any damages
  arising from the use of this software.

  Permission is granted to anyone to use this software for any purpose,
  including commercial applications, and to alter it and redistribute it
  freely.
*/

#include "testnative.h"

#ifdef TEST_NATIVE_OS2

#define WIN_CLIENT_CLASS    "SDL Test"

static void *CreateWindowNative(int w, int h);
static void DestroyWindowNative(void *window);

NativeWindowFactory OS2WindowFactory = {
    "DIVE",
    CreateWindowNative,
    DestroyWindowNative
};

static void *CreateWindowNative(int w, int h)
{
    HWND    hwnd, hwndFrame;
    ULONG   ulFrameFlags = FCF_TASKLIST | FCF_DLGBORDER | FCF_TITLEBAR |
                           FCF_SYSMENU  | FCF_SHELLPOSITION |
                           FCF_SIZEBORDER | FCF_MINBUTTON | FCF_MAXBUTTON;

    WinRegisterClass(0, WIN_CLIENT_CLASS, WinDefWindowProc,
                     CS_SIZEREDRAW | CS_MOVENOTIFY,
                     sizeof(ULONG)); /* We should have minimum 4 bytes. */

    hwndFrame = WinCreateStdWindow(HWND_DESKTOP, 0, &ulFrameFlags,
                                   WIN_CLIENT_CLASS, "SDL Test", 0, 0, 1, &hwnd);
    if (hwndFrame == NULLHANDLE) {
        return NULL;
    }

    WinSetWindowPos(hwndFrame, HWND_TOP, 0, 0, w, h,
                    SWP_ZORDER | SWP_ACTIVATE | SWP_SIZE | SWP_SHOW);

    return (void *)hwndFrame;   /* We may return client or frame window
                                   handle for SDL_CreateWindowFrom(). */
}

static void DestroyWindowNative(void *window)
{
    WinDestroyWindow((HWND) window);
}

#endif /* TEST_NATIVE_OS2 */
