summaryrefslogtreecommitdiff
path: root/Editor
diff options
context:
space:
mode:
Diffstat (limited to 'Editor')
-rw-r--r--Editor/EditorMain.cpp45
-rw-r--r--Editor/GUI/EditorWindows.cpp170
-rw-r--r--Editor/GUI/EditorWindows.h32
-rw-r--r--Editor/GUI/WinUtils.cpp43
-rw-r--r--Editor/GUI/WinUtils.h17
-rw-r--r--Editor/main.cpp43
-rw-r--r--Editor/wog.c746
-rw-r--r--Editor/wog.h219
8 files changed, 305 insertions, 1010 deletions
diff --git a/Editor/EditorMain.cpp b/Editor/EditorMain.cpp
new file mode 100644
index 0000000..d45d08b
--- /dev/null
+++ b/Editor/EditorMain.cpp
@@ -0,0 +1,45 @@
+#include <windows.h>
+#include <vector>
+#include "GUI/EditorWindows.h"
+
+static int MainMessageLoop()
+{
+ BOOL returnValue;
+ MSG msg, lastMsg;
+ msg.message = WM_NULL;
+ std::vector<MSG> messages;
+ PeekMessage(&msg, NULL, 0U, 0U, PM_NOREMOVE);
+ bool isQuitSignaled = msg.message == WM_QUIT;
+
+ while (!isQuitSignaled)
+ {
+ MSG msg;
+ while (PeekMessage(&msg, NULL, 0U, 0U, PM_REMOVE) != 0)
+ {
+ TranslateMessage(&msg);
+ DispatchMessage(&msg);
+
+ if (msg.message == WM_QUIT)
+ isQuitSignaled = true;
+
+ }
+
+ }
+
+ return (INT)msg.wParam;
+}
+
+int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR szCmdLine, int sw)
+{
+ RegisterWindowClasses();
+
+ ContainnerWindow* wnd = new ContainnerWindow();
+
+ Vector2f min = Vector2f(100, 100);
+ Vector2f max = Vector2f(700, 700);
+ wnd->Init(Rectf(400, 400, 500, 500), ContainnerWindow::kShowMainWindow, min, max);
+
+ MainMessageLoop();
+
+ return 0;
+}
diff --git a/Editor/GUI/EditorWindows.cpp b/Editor/GUI/EditorWindows.cpp
index e69de29..00c573a 100644
--- a/Editor/GUI/EditorWindows.cpp
+++ b/Editor/GUI/EditorWindows.cpp
@@ -0,0 +1,170 @@
+#include "EditorWindows.h"
+#include "WinUtils.h"
+
+static const wchar_t* kContainerWindowClassName = L"GameLabContainerWndClass";
+static const wchar_t* kPopupWindowClassName = L"GameLabPopupWndClass";
+static const wchar_t* kViewportClassName = L"GameLabViewportWndClass";
+static const char* kIsMainWindowMaximized = "IsMainWindowMaximized";
+
+static ATOM s_ContainerWindowClassAtom;
+static ATOM s_PopupWindowClassAtom;
+static ATOM s_GUIViewClassAtom;
+
+void RegisterWindowClasses()
+{
+ s_ContainerWindowClassAtom = winutils::RegisterWindowClass(kContainerWindowClassName, ContainnerWindow::ContainerWndProc, CS_HREDRAW | CS_VREDRAW);
+ s_PopupWindowClassAtom = winutils::RegisterWindowClass(kPopupWindowClassName, ContainnerWindow::ContainerWndProc, CS_HREDRAW | CS_VREDRAW | CS_DROPSHADOW);//CS_HREDRAW宽度(水平)变化时重绘、CS_VREDRAW高度(垂直)变化时重绘
+ s_GUIViewClassAtom = winutils::RegisterWindowClass(kViewportClassName, GUIView::GUIViewWndProc, CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS);
+}
+
+LRESULT CALLBACK ContainnerWindow::ContainerWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
+{
+ long flag = DefWindowProcW(hWnd, message, wParam, lParam);
+ return flag;
+}
+
+ContainnerWindow::ContainnerWindow()
+{
+}
+
+
+ContainnerWindow::~ContainnerWindow()
+{
+
+}
+
+void ContainnerWindow::Init(Rectf pixelRect, int showMode, const Vector2f& minSize, const Vector2f& maxSize)
+{
+ // Aux windows are mac only. on windows they look just like normal utility windows.
+ if (showMode == kShowAuxWindow)
+ showMode = kShowUtility;
+
+ m_ShowMode = static_cast<ShowMode>(showMode);
+ m_IsClosing = false;
+ m_InMenuLoop = false;
+ m_CloseFromScriptDontShutdown = false;
+
+ bool shouldMaximize = false;
+ if (showMode == kShowMainWindow)
+ {
+ //shouldMaximize = s_IsMainWindowMaximized = EditorPrefs::GetBool(kIsMainWindowMaximized, false);
+ //GetRestoredMainWindowDimensions();
+ }
+
+ RECT rect = { 120, 120, 220, 220 };
+ m_InternalRect.x = m_InternalRect.y = m_InternalRect.width = m_InternalRect.height = 0.0f;
+
+ DWORD windowStyle = 0;
+ DWORD extendedStyle = 0;
+ LPCWSTR windowClass = kContainerWindowClassName;
+
+ switch (showMode) {
+ // 容纳GUIPanel的非主窗口
+ case kShowNormalWindow:
+ windowStyle = WS_POPUP | WS_CLIPCHILDREN | WS_THICKFRAME;
+ extendedStyle = WS_EX_TOOLWINDOW;
+ break;
+ // 主窗口,含菜单
+ case kShowMainWindow:
+ windowStyle = WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME | WS_CLIPCHILDREN | WS_MAXIMIZEBOX | WS_MINIMIZEBOX;
+ extendedStyle = 0;
+ break;
+ case kShowPopupMenu:
+ windowStyle = WS_POPUP | WS_CLIPCHILDREN;
+ extendedStyle = WS_EX_TOOLWINDOW;
+ windowClass = kPopupWindowClassName;
+ break;
+ case kShowNoShadow:
+ windowStyle = WS_POPUP | WS_CLIPCHILDREN;
+ extendedStyle = WS_EX_TOOLWINDOW;
+ break;
+ case kShowUtility:
+ windowStyle = WS_POPUP | WS_CAPTION | WS_THICKFRAME | WS_SYSMENU;
+ extendedStyle = WS_EX_WINDOWEDGE | WS_EX_TOOLWINDOW;
+ break;
+ default:
+ // ErrorString("Unknown container show mode");
+ break;
+ }
+
+ HWND parentWindow = NULL;
+ if (showMode == kShowMainWindow)
+ {
+ parentWindow = NULL;
+ }
+ else
+ {
+ // parentWindow = GetMainEditorWindow();
+ }
+
+ bool notSizeable = (minSize == maxSize) && (minSize != Vector2f::zero);
+ if (notSizeable)
+ windowStyle &= ~(WS_THICKFRAME);
+
+ AdjustWindowRectEx(&rect, windowStyle, showMode == kShowMainWindow, extendedStyle);
+ int extraX = rect.right - rect.left - 200;
+ int extraY = rect.bottom - rect.top - 200;
+
+ m_MinSize.x = minSize.x + extraX;
+ m_MinSize.y = minSize.y + extraY;
+ m_MaxSize.x = maxSize.x + extraX;
+ m_MaxSize.y = maxSize.y + extraY;
+
+
+ //if (showMode == kShowUtility)
+ // s_ZUtilityWindows.push_back(m_ContainerListNode);
+ // Create window
+ m_Window = CreateWindowExW(
+ extendedStyle,
+ windowClass,
+ L"",
+ windowStyle,
+ rect.left,
+ rect.top,
+ rect.right - rect.left,
+ rect.bottom - rect.top,
+ parentWindow,
+ NULL,
+ winutils::GetInstanceHandle(),
+ NULL
+ );
+ SetWindowLongPtr(m_Window, GWLP_USERDATA, (LONG_PTR)this);
+ //UpdateMaxMaximizedRect();
+
+ if (pixelRect.width > 10 || pixelRect.height > 10)
+ {
+ //SetRect(pixelRect);
+ if (shouldMaximize)
+ SetWindowLong(m_Window, GWL_STYLE, windowStyle | WS_MAXIMIZE);
+ }
+
+
+ if (showMode == kShowMainWindow)
+ {
+ //SetMainEditorWindow(m_Window);
+ //HMENU menu = GetMainMenuHandle();
+ //if (menu)
+ // SetMenu(m_Window, menu);
+ //GetApplication().UpdateMainWindowTitle();
+ //GetApplication().UpdateDocumentEdited();
+ }
+ ShowWindow(m_Window, SW_SHOW);
+
+ //s_ContainerWindows.insert(this);
+
+ //ShowInTaskbarIfNoMainWindow(m_Window);
+
+}
+
+//------------------------------------------------------------------------------------------------------------------
+
+LRESULT CALLBACK GUIView::GUIViewWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
+{
+ long flag = DefWindowProcW(hWnd, message, wParam, lParam);
+ return flag;
+}
+
+void GUIView::DoPaint()
+{
+
+} \ No newline at end of file
diff --git a/Editor/GUI/EditorWindows.h b/Editor/GUI/EditorWindows.h
index 90e71a4..a78e163 100644
--- a/Editor/GUI/EditorWindows.h
+++ b/Editor/GUI/EditorWindows.h
@@ -2,23 +2,51 @@
#define EDITOR_WINDOW_H
#include <windows.h>
+#include "Runtime/Math/Rect.h"
+
+void RegisterWindowClasses();
// 一个containner window中有多个viewport
class ContainnerWindow
{
public:
+ enum ShowMode {
+ kShowNormalWindow = 0, // normal window with max/min/close buttons
+ kShowPopupMenu = 1, // popup menu - no title bar
+ kShowUtility = 2, // tool window - floats in the app, and hides when the app deactivates
+ kShowNoShadow = 3, // no shadow/decorations
+ kShowMainWindow = 4, // main Unity window. On Mac does not have close button; on Windows has menu bar etc.
+ kShowAuxWindow = 5, // Popup windows like the color picker, gradient editor, etc. Drawn with black background on Mac
+ };
+
+ ContainnerWindow();
+ ~ContainnerWindow();
+
+ static LRESULT CALLBACK ContainerWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
+
+ void Init(Rectf size, int showMode, const Vector2f& minSize, const Vector2f& maxSize);
private:
HWND m_Window;
POINT m_Size;
+ ShowMode m_ShowMode; // 窗口类型
+ bool m_IsClosing;
+ bool m_InMenuLoop;
+ bool m_CloseFromScriptDontShutdown;
+ Rectf m_InternalRect;
+ POINT m_MinSize;
+ POINT m_MaxSize;
};
-// 窗口内的单个viewport
-class Viewport
+// 窗口内的单个子窗口,是事件相应、绘制、布局的单元
+class GUIView
{
public:
+ static LRESULT CALLBACK GUIViewWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
+
+ void DoPaint();
private:
HWND m_View;
diff --git a/Editor/GUI/WinUtils.cpp b/Editor/GUI/WinUtils.cpp
new file mode 100644
index 0000000..e7b2d5b
--- /dev/null
+++ b/Editor/GUI/WinUtils.cpp
@@ -0,0 +1,43 @@
+#include "winutils.h"
+
+namespace winutils
+{
+
+ static HINSTANCE gInstanceHandle = NULL;
+
+ HINSTANCE GetInstanceHandle()
+ {
+ return gInstanceHandle;
+ }
+
+ ATOM RegisterWindowClass(const wchar_t* className, WNDPROC windowProc, unsigned int style)
+ {
+#if DEBUG_WIN_UTILS
+ printf_console("Debug winutils: register class %s\n", className);
+#endif
+
+ WNDCLASSEXW wcex;
+ memset(&wcex, 0, sizeof(wcex));
+ wcex.cbSize = sizeof(wcex);
+ wcex.style = style;
+ wcex.lpfnWndProc = windowProc;
+ wcex.cbClsExtra = 0;
+ wcex.cbWndExtra = 0;
+ wcex.hInstance = winutils::GetInstanceHandle();
+ //wcex.hIcon = LoadIcon(wcex.hInstance, (LPCTSTR)IDI_APP_ICON);
+ wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
+ wcex.hbrBackground = NULL;
+ wcex.lpszMenuName = NULL;
+ wcex.lpszClassName = className;
+ ATOM classAtom = RegisterClassExW(&wcex);
+ //if (!classAtom)
+ // printf("Failed to register window class %s: %s\n", className, WIN_LAST_ERROR_TEXT);
+ return classAtom;
+ }
+
+ void UnregisterWindowClass(const wchar_t* className)
+ {
+
+ }
+
+}
diff --git a/Editor/GUI/WinUtils.h b/Editor/GUI/WinUtils.h
new file mode 100644
index 0000000..9257d77
--- /dev/null
+++ b/Editor/GUI/WinUtils.h
@@ -0,0 +1,17 @@
+#ifndef WINUTILS_H
+#define WINUTILS_H
+
+#include <windows.h>
+
+namespace winutils
+{
+ HINSTANCE GetInstanceHandle();
+
+ // 注册windows窗口类
+ ATOM RegisterWindowClass(const wchar_t* className, WNDPROC windowProc, unsigned int style);
+ void UnregisterWindowClass(const wchar_t* className);
+
+
+}
+
+#endif \ No newline at end of file
diff --git a/Editor/main.cpp b/Editor/main.cpp
deleted file mode 100644
index 58e5f04..0000000
--- a/Editor/main.cpp
+++ /dev/null
@@ -1,43 +0,0 @@
-extern "C" {
-#include "wog.h"
-}
-
-#include <glad/glad.h>
-#include <windows.h>
-
-wog_Window * wnd ;
-
-void* proc(const char *name) {
- return wglGetProcAddress(name);
-}
-
-int main(int argc, char* argv[]) {
- wnd = wog_createWindow("GameLab" , 800, 600, 500, 500, 0);
- wog_show(wnd);
-
- wog_GLContext* ctx = wog_createGLContext(wnd);
- wog_makeCurrent(wnd, ctx);
-
- //gladLoadGLLoader(proc);
- int load = gladLoadGL();
-
-// wog_makeCurrent(wnd, ctx);
-
- while (true) {
- wog_Event e;
- while (wog_pollEvent(wnd, &e)) {
- if (e.type == WOG_ECLOSE)
- goto quit;
- }
- //glViewport(0, 0, 500, 500);
- glClearColor(0.16, 0.16, 0.16, 1);
- glClear(GL_COLOR_BUFFER_BIT);
- glFlush();
-
- wog_swapBuffers(wnd);
- }
-
-quit:
-
- return 0;
-}
diff --git a/Editor/wog.c b/Editor/wog.c
deleted file mode 100644
index 6cfbf64..0000000
--- a/Editor/wog.c
+++ /dev/null
@@ -1,746 +0,0 @@
-/**
-* Copyright (c) 2015~2017 chai(neonum)
-*
-* This library is free software; you can redistribute it and/or modify it
-* under the terms of the MIT license. See LICENSE for details.
-*/
-
-#include "wog.h"
-#include <windows.h>
-#include <malloc.h>
-#include <stdio.h>
-#include <memory.h>
-#include <assert.h>
-
-#if WOG_API == WOG_GL
-#include <gl/GL.h>
-#include <gl/GLU.h>
-#endif
-
-
-#if WOG_API == WOG_GL
-/**
-* We need opengl32.lib and glu32.lib for using opengl functions on
-* windows platform.
-*/
-#pragma comment( lib, "opengl32.lib" )
-//#pragma comment( lib, "glu32.lib" )
-#endif
-
-#define WINDOW_CLASS "WOG_WND"
-
-#define heap_alloc(T, C) (T*)malloc(sizeof(T)*(C))
-#define stack_alloc(T, C) (T*)alloca(sizeof(T)*(C))
-#define zero_mem(I, L) memset(I, 0, L)
-
-#define max(a, b) (a < b ? b : a)
-#define min(a, b) (a < b ? a : b)
-#define clamp(x, minv, maxv) (max(minv, min(x, maxv)))
-
-static HINSTANCE g_hinstance = NULL;
-
-typedef struct wog_Window
-{
- HWND hwnd; // Window handler
- HINSTANCE hInstance;
- HDC hdc; // Device Context
- HDC mdc; // Memory Device Contexts
-#if WOG_API == WOG_GDI
- wog_Surface* surface; // render buffer
-#endif
- int mouse_capture; // mouse capture count
-}wog_Window;
-
-#if WOG_API == WOG_GL
-typedef struct wog_GLContext
-{
- HGLRC hrc; // Rendering Context
-}wog_GLContext;
-#endif
-
-// A mouse capture count is used
-void wog_setMouseCapture(wog_Window* wnd)
-{
- if (wnd->mouse_capture <= 0)
- {
- SetCapture(wnd->hwnd);
- wnd->mouse_capture = 0;
- }
- ++wnd->mouse_capture;
-}
-
-void wog_releaseMouseCapture(wog_Window* wnd)
-{
- --wnd->mouse_capture;
- if (wnd->mouse_capture <= 0)
- ReleaseCapture();
-}
-
-void wog_handleEvent(wog_Window* window, MSG* msg, wog_Event* e)
-{
- UINT uMsg;
- WPARAM wParam;
- LPARAM lParam;
- uMsg = msg->message;
- wParam = msg->wParam;
- lParam = msg->lParam;
- HWND hWnd = window->hwnd;
-
- switch (uMsg)
- {
- case WM_SYSCOMMAND:
- {
- switch (wParam)
- {
- case SC_SCREENSAVE:
- case SC_MONITORPOWER:
- return ;
- }
- break;
- }
- return ;
-
- case WM_CLOSE:
- {
- zero_mem(e, sizeof(wog_Event));
- e->type = WOG_ECLOSE;
- return ;
- }
-
- case WM_KEYDOWN:
- case WM_SYSKEYDOWN:
- if ((wParam >= 0) && (wParam <= 255))
- {
- zero_mem(e, sizeof(wog_Event));
- e->type = WOG_EKEYDOWN;
- e->key = wParam;
-
- return ;
- }
- break;
-
- case WM_KEYUP:
- case WM_SYSKEYUP:
- if ((wParam >= 0) && (wParam <= 255))
- {
- zero_mem(e, sizeof(wog_Event));
- e->type = WOG_EKEYUP;
- e->key = wParam;
-
- return ;
- }
- break;
-
- case WM_MOUSEMOVE:
- {
- zero_mem(e, sizeof(wog_Event));
- e->type = WOG_EMOUSEMOTION;
- wog_getMouse(window, &e->pos.x, &e->pos.y);
- return ;
- }
-
- case WM_MOUSEWHEEL: // mousewheel scroll
- {
- int zDelta = GET_WHEEL_DELTA_WPARAM(wParam);
- zero_mem(e, sizeof(wog_Event));
- e->type = WOG_EMOUSEWHEEL;
- e->wheel = zDelta > 0 ? 1 : -1;
- return ;
- }
-
- case WM_LBUTTONDOWN:
- {
- zero_mem(e, sizeof(wog_Event));
- e->type = WOG_EMOUSEBUTTONDOWN;
- e->button = WOG_MOUSE_LBUTTON;
- wog_getMouse(window, &e->pos.x, &e->pos.y);
- wog_setMouseCapture(window);
- return ;
- }
-
- case WM_RBUTTONDOWN:
- {
- zero_mem(e, sizeof(wog_Event));
- e->type = WOG_EMOUSEBUTTONDOWN;
- e->button = WOG_MOUSE_RBUTTON;
- wog_getMouse(window, &e->pos.x, &e->pos.y);
- wog_setMouseCapture(window);
- return ;
- }
-
- case WM_MBUTTONDOWN:
- {
- zero_mem(e, sizeof(wog_Event));
- e->type = WOG_EMOUSEBUTTONDOWN;
- e->button = WOG_MOUSE_MIDDLE;
- wog_getMouse(window, &e->pos.x, &e->pos.y);
- wog_setMouseCapture(window);
- return ;
- }
-
- case WM_LBUTTONUP:
- {
- zero_mem(e, sizeof(wog_Event));
- e->type = WOG_EMOUSEBUTTONUP;
- e->button = WOG_MOUSE_LBUTTON;
- wog_getMouse(window, &e->pos.x, &e->pos.y);
- wog_releaseMouseCapture(window);
- return ;
- }
-
- case WM_RBUTTONUP:
- {
- zero_mem(e, sizeof(wog_Event));
- e->type = WOG_EMOUSEBUTTONUP;
- e->button = WOG_MOUSE_RBUTTON;
- wog_getMouse(window, &e->pos.x, &e->pos.y);
- wog_releaseMouseCapture(window);
- return ;
- }
-
- case WM_MBUTTONUP:
- {
- zero_mem(e, sizeof(wog_Event));
- e->type = WOG_EMOUSEBUTTONUP;
- e->button = WOG_MOUSE_MIDDLE;
- wog_getMouse(window, &e->pos.x, &e->pos.y);
- wog_releaseMouseCapture(window);
- return ;
- }
-
- case WM_PAINT:
-
- UpdateWindow(window->hwnd);
-
- return 0;
-
- break;
-
- default:
- e->type = WOG_EUNKNOWN;
- break;
- }
- DefWindowProc(hWnd, uMsg, wParam, lParam);
- return ;
-}
-
-
-int wog_pollEvent(wog_Window* wnd, wog_Event* e)
-{
- MSG msg;
- if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
- {
- if (msg.message == WM_QUIT) return 0;
- TranslateMessage(&msg);
- wog_handleEvent(wnd, &msg, e);
- return 1;
- }
- return 0;
-}
-
-
-// on size changed callback;
-static wog_Callback onSizeChanged = 0;
-static wog_Callback onQuit = 0;
-
-
-static LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
-{
- // Get The Window Context
- wog_Window* window = (wog_Window*)(GetWindowLong(hWnd, GWL_USERDATA));
-
- // call callback functions
-#define call(callback)\
- if (callback) \
- callback(window)
-
- switch (uMsg)
- {
- case WM_CREATE:
- {
- CREATESTRUCT* creation = (CREATESTRUCT*)(lParam); // Store Window Structure Pointer
- window = (wog_Window*)(creation->lpCreateParams); // Get wog_Window
- SetWindowLong(hWnd, GWL_USERDATA, (LONG)(window)); // Save it
- }
- return 0;
-
- case WM_CLOSE: // Post WM_CLOSE to message queue.
- PostMessage(hWnd, WM_CLOSE, wParam, lParam);
- return 0;
-
- case WM_SIZE:
- call(onSizeChanged);
- return 0;
-
- case WM_QUIT:
- call(onQuit);
- return 0;
-
- }
-
- return DefWindowProc(hWnd, uMsg, wParam, lParam);
-#undef call
-}
-
-
-void wog_registerResizeCallback(wog_Callback cal)
-{
- onSizeChanged = cal;
-}
-
-
-void wog_registerQuitCallback(wog_Callback cal)
-{
- onQuit = cal;
-}
-
-#if WOG_API == WOG_GDI
-wog_Surface* wog_getsurface(wog_Window* wnd) {
- return wnd->surface;
-}
-#endif
-
-static int registerWindowClass()
-{
- // Register A Window Class
- WNDCLASSEX windowClass; // Window Class
- zero_mem(&windowClass, sizeof(WNDCLASSEX)); // Make Sure Memory Is Cleared
-
- windowClass.cbSize = sizeof(WNDCLASSEX); // Size Of The windowClass Structure
- windowClass.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC; // Redraws The Window For Any Movement / Resizing
- windowClass.lpfnWndProc = (WNDPROC)(WindowProc); // WindowProc Handles Messages
- windowClass.hInstance = g_hinstance; // Set The Instance
- windowClass.hbrBackground = (HBRUSH)(COLOR_APPWORKSPACE); // Class Background Brush Color
- windowClass.hCursor = LoadCursor(NULL, IDC_ARROW); // Load The Arrow Pointer
- windowClass.lpszClassName = WINDOW_CLASS; // Sets The Applications Classname
- //windowClass.hIcon = (HICON)LoadIcon(g_hinstance, "icon.ico");
-
- if (RegisterClassEx(&windowClass) == 0) // Did Registering The Class Fail?
- {
- // NOTE: Failure, Should Never Happen
- MessageBox(HWND_DESKTOP, "RegisterClassEx Failed!", "Error", MB_OK | MB_ICONEXCLAMATION);
- return FALSE; // Return False (Failure)
- }
- return TRUE;
-}
-
-/*
- * for memory device context, see
- * https://docs.microsoft.com/en-us/windows/desktop/gdi/memory-device-contexts
- * also
- * SDL_windowsframebuffer.c WIN_CreateWindowFramebuffer
- */
-static void create_surface(wog_Window* wnd, int width, int height) {
- BITMAPINFOHEADER bi_header;
- HDC memory_dc;
- HBITMAP dib_bitmap;
- HBITMAP old_bitmap;
- unsigned char *buffer; // color buffer
- wog_Surface *surface;
-
- memory_dc = CreateCompatibleDC(wnd->hdc); /*memory device contexts*/
-
- memset(&bi_header, 0, sizeof(BITMAPINFOHEADER));
- bi_header.biSize = sizeof(BITMAPINFOHEADER);
- bi_header.biWidth = width;
- bi_header.biHeight = -height; /* top-down */
- bi_header.biPlanes = 1;
- bi_header.biBitCount = 32;
- bi_header.biCompression = BI_RGB;
- /*create bitmap*/
- dib_bitmap = CreateDIBSection(memory_dc, (BITMAPINFO*)&bi_header, DIB_RGB_COLORS, (void**)&buffer, NULL, 0);
- assert(dib_bitmap != NULL);
- old_bitmap = (HBITMAP)SelectObject(memory_dc, dib_bitmap);
- DeleteObject(old_bitmap);
-
- surface = (wog_Surface*)malloc(sizeof(wog_Surface));
- surface->width = width;
- surface->height = height;
- surface->channels = 4;
- surface->buffer = buffer;
-
-#if WOG_API == WOG_GDI
- wnd->surface = surface;
-#endif
- wnd->mdc = memory_dc;
-}
-
-
-wog_Window* wog_createWindow(const char* title, int width, int height, int x, int y, uint32 flags)
-{
- int client_w = width, client_h = height;
-
- if (g_hinstance == NULL)
- {
- g_hinstance = GetModuleHandle(NULL);
- }
-
- if (! registerWindowClass())
- {
- printf("Register window class failed.\n");
- return 0;
- }
-
- wog_Window* wnd = heap_alloc(wog_Window, 1);
- zero_mem(wnd, sizeof(wog_Window));
-
- DWORD windowStyle = 0; // Define Our Window Style
- windowStyle |= WS_POPUP;
- windowStyle |= WS_OVERLAPPED;
- windowStyle |= WS_CAPTION;
- windowStyle |= WS_SYSMENU;
- windowStyle |= WS_MINIMIZEBOX;
- windowStyle |= WS_MAXIMIZEBOX;
- //windowStyle |= WS_VISIBLE;
-#define hasbit(fs, f) ((fs & f) == f)
- /*if (hasbit(flags, WOG_RESIZABLE)) */windowStyle |= WS_SIZEBOX;
- if (hasbit(flags, WOG_DISABLE)) windowStyle |= WS_DISABLED;
-
- DWORD windowExtendedStyle = WS_EX_APPWINDOW; // Define The Window's Extended Style
- RECT windowRect = { 0, 0, width, height };
- AdjustWindowRectEx(&windowRect, windowStyle, 0, windowExtendedStyle);
- width = windowRect.right - windowRect.left;
- height = windowRect.bottom - windowRect.top;
- wnd->hwnd = CreateWindowEx(
- windowExtendedStyle,
- WINDOW_CLASS,
- title,
- windowStyle,
- x, y,
- width, height,
- HWND_DESKTOP,
- 0,
- GetModuleHandle(NULL),
- wnd
- );
-
- wnd->hInstance = g_hinstance;
-
- if (wnd->hwnd == 0)
- return 0;
-
- if (hasbit(flags, WOG_HIDDEN)) wog_hide(wnd);
-
- // init device context
- wnd->hdc = GetDC(wnd->hwnd);
- if (wnd->hdc== 0)
- {
- DestroyWindow(wnd->hwnd);
- wnd->hwnd = 0;
- return 0;
- }
-
- wnd->mouse_capture = 0;
-
-#if WOG_API == WOG_GDI
- create_surface(wnd, client_w, client_h);
-#endif
-
-#if WOG_API == WOG_GL
- PIXELFORMATDESCRIPTOR pfd = // pfd Tells Windows How We Want Things To Be
- {
- sizeof(PIXELFORMATDESCRIPTOR), // Size Of This Pixel Format Descriptor
- 1, // Version Number
- PFD_DRAW_TO_WINDOW | // Format Must Support Window
- PFD_SUPPORT_OPENGL | // Format Must Support OpenGL
- PFD_DOUBLEBUFFER, // Must Support Double Buffering
- PFD_TYPE_RGBA, // Request An RGBA Format
- 32, // Select Our Color Depth
- 0, 0, 0, 0, 0, 0, // Color Bits Ignored
- 0, // No Alpha Buffer
- 0, // Shift Bit Ignored
- 0, // No Accumulation Buffer
- 0, 0, 0, 0, // Accumulation Bits Ignored
- 16, // 16Bit Z-Buffer (Depth Buffer)
- 0, // No Stencil Buffer
- 0, // No Auxiliary Buffer
- PFD_MAIN_PLANE, // Main Drawing Layer
- 0, // Reserved
- 0, 0, 0 // Layer Masks Ignored
- };
- // set pixel format
- unsigned int pixelformat;
- pixelformat = ChoosePixelFormat(wnd->hdc, &pfd);
- if (pixelformat == 0)
- {
- wog_destroyWindow(wnd);
- return 0;
- }
-
- // set pixel format
- if (SetPixelFormat(wnd->hdc, pixelformat, &pfd) == 0 )
- {
- wog_destroyWindow(wnd);
- return 0;
- }
-#endif
-
- return wnd;
-}
-
-#if WOG_API == WOG_GL
-wog_GLContext* wog_createGLContext(wog_Window* wnd)
-{
- wog_GLContext* cxt = heap_alloc(wog_GLContext, 1);
- zero_mem(cxt, sizeof(wog_GLContext));
- cxt->hrc = wglCreateContext(wnd->hdc); // create opengl context base on device context
- if (cxt->hrc == 0)
- {
- free(cxt);
- return 0;
- }
- return cxt;
-}
-#endif
-
-#if WOG_API == WOG_GL
-int wog_makeCurrent(wog_Window* wnd, wog_GLContext* cxt)
-{
- if (wnd && cxt)
- {
- if (wglMakeCurrent(wnd->hdc, cxt->hrc) == 0)
- {
- return 0;
- }
- return 1;
- }
-
- return 0;
-}
-#endif
-
-#if WOG_API == WOG_GL
-void wog_destroyGLContext(wog_GLContext* cxt)
-{
- if (cxt && cxt->hrc)
- {
- wglDeleteContext(cxt->hrc);
- free(cxt);
- }
-}
-#endif
-
-#if WOG_API == WOG_GDI
-void wog_updateSurface(wog_Window* wnd) {
- if(wnd->surface == NULL) return ;
- int width = wnd->surface->width, height = wnd->surface->height;
- BitBlt(wnd->hdc, 0, 0, wnd->surface, height, wnd->mdc, 0, 0, SRCCOPY);
-}
-#endif
-
-void wog_destroyWindow(wog_Window* wnd)
-{
- if (wnd)
- {
- ReleaseDC(wnd->hwnd, wnd->hdc);
- DestroyWindow(wnd->hwnd);
- free(wnd);
- }
-}
-
-
-static void UnEscapeQuotes(char *arg)
-{
- char *last = NULL;
-
- while (*arg) {
- if (*arg == '"' && *last == '\\') {
- char *c_curr = arg;
- char *c_last = last;
-
- while (*c_curr) {
- *c_last = *c_curr;
- c_last = c_curr;
- c_curr++;
- }
- *c_last = '\0';
- }
- last = arg;
- arg++;
- }
-}
-
-
-/* Parse a command line buffer into arguments */
-static int ParseCommandLine(char *cmdline, char **argv)
-{
- char *bufp;
- char *lastp = NULL;
- int argc, last_argc;
-
- argc = last_argc = 0;
- for (bufp = cmdline; *bufp; ) {
- /* Skip leading whitespace */
- while (isspace(*bufp)) {
- ++bufp;
- }
- /* Skip over argument */
- if (*bufp == '"') {
- ++bufp;
- if (*bufp) {
- if (argv) {
- argv[argc] = bufp;
- }
- ++argc;
- }
- /* Skip over word */
- while (*bufp && (*bufp != '"' || (lastp && *lastp == '\\'))) {
- lastp = bufp;
- ++bufp;
- }
- }
- else {
- if (*bufp) {
- if (argv) {
- argv[argc] = bufp;
- }
- ++argc;
- }
- /* Skip over word */
- while (*bufp && !isspace(*bufp)) {
- ++bufp;
- }
- }
- if (*bufp) {
- if (argv) {
- *bufp = '\0';
- }
- ++bufp;
- }
-
- /* Strip out \ from \" sequences */
- if (argv && last_argc != argc) {
- UnEscapeQuotes(argv[last_argc]);
- }
- last_argc = argc;
- }
- if (argv) {
- argv[argc] = NULL;
- }
- return(argc);
-}
-
-
-#ifdef main
-#undef main
-#endif
-
-
-#if defined(_MSC_VER) && !defined(_WIN32_WCE)
-/* The VC++ compiler needs main defined */
-#define console_main main
-#endif
-
-extern int wog_main(int argc, char* argv[]);
-
-/**
-* Entry of console application.
-*/
-int console_main(int argc, char* argv[])
-{
- int status = wog_main(argc, argv);
- return status;
-}
-
-
-/**
-* Entry of windows application.
-*/
-int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR szCmdLine, int sw)
-{
- g_hinstance = hInst;
-
- char* temp = GetCommandLine();
- int len = strlen(temp) + 1;
- char* cmd = stack_alloc(char, len);
- strcpy(cmd, temp);
- cmd[len - 1] = '\0';
-
- int argc = 0;
- char** argv = 0;
- argc = ParseCommandLine(cmd, 0);
- ParseCommandLine(cmd, 0);
- argv = stack_alloc(char*, argc + 1);
- ParseCommandLine(cmd, argv);
-
- int status = console_main(argc, argv);
-
- return status;
-}
-
-
-void wog_swapBuffers(wog_Window* wnd)
-{
- if (wnd)
- {
- SwapBuffers(wnd->hdc);
- }
-}
-
-
-void wog_getMouse(wog_Window* wnd, int *x, int *y)
-{
- POINT p;
- GetCursorPos(&p);
- ScreenToClient(wnd->hwnd, &p);
- int w, h;
- wog_getwindowsize(wnd, &w, &h);
- //*x = clamp(p.x, 0, w);
- //*y = clamp(p.y, 0, h);
- *x = p.x;
- *y = p.y;
-}
-
-
-void wog_getwindowsize(wog_Window* wnd, int* width, int* height)
-{
- RECT r;
- GetClientRect(wnd->hwnd, &r);
- *width = r.right;
- *height = r.bottom;
-}
-
-
-void wog_show(wog_Window* wnd)
-{
- ShowWindow(wnd->hwnd, SW_SHOW);
-}
-
-
-void wog_hide(wog_Window* wnd)
-{
- ShowWindow(wnd->hwnd, SW_HIDE);
-}
-
-
-void wog_sleep(int ms)
-{
- Sleep(ms);
-}
-
-int wog_tick()
-{
- return GetTickCount();
-}
-
-
-void wog_setcursor(wog_Window* wnd, unsigned int cursor)
-{
- SetCursor(LoadCursor(NULL, cursor));
-}
-
-//void wog_setcursorImage(wog_Window* wnd, const char* path)
-//{
-// SetCursor(LoadImageA(NULL, path, IMAGE_ICON, 0, 0, LR_DEFAULTCOLOR | LR_CREATEDIBSECTION | LR_LOADFROMFILE));
-// printf("wog_setcursorImage\n");
-//}
-
-void wog_setcursorImage(wog_Window* wnd, Wog_Cursor icon)
-{
- SetCursor(icon);
-}
-
-HINSTANCE wog_get_instance()
-{
- return g_hinstance;
-}
diff --git a/Editor/wog.h b/Editor/wog.h
deleted file mode 100644
index f5661db..0000000
--- a/Editor/wog.h
+++ /dev/null
@@ -1,219 +0,0 @@
-/*
-* Copyright (c) 2015~2020 chai
-*/
-
-#ifndef _WOG_H
-#define _WOG_H
-#include <Windows.h> // for virtual key value
-
-#define WOG_GL 1
-#define WOG_GDI 2
-
-#define WOG_API WOG_GL
-
-typedef unsigned int uint32;
-typedef unsigned short uint16;
-
-enum // event type
-{
- WOG_EUNKNOWN = 0, // unknown event
-
- WOG_EKEYDOWN, // key pressed
- WOG_EKEYUP, // key released
-
- WOG_EMOUSEMOTION, // mouse motion
- WOG_EMOUSEWHEEL, // mouse wheel scrolling
- WOG_EMOUSEBUTTONDOWN, // mosue button down
- WOG_EMOUSEBUTTONUP, // mosue button down
-
- WOG_ECLOSE, // close window
-};
-
-enum // mouse button event, e.button value
-{
- WOG_MOUSE_LBUTTON, // left mouse button
- WOG_MOUSE_RBUTTON, // right mouse button
- WOG_MOUSE_MIDDLE, // middle button
-};
-
-typedef struct wog_Event
-{
- int type;
- //union // event value
- //{
- int key; // for key, simply use windows virtual key value
- // see https://msdn.microsoft.com/en-us/library/windows/desktop/dd375731(v=vs.85).aspx
- struct // for mouse motion
- {
- int x, y; // mouse position
- }pos;
- int wheel; // 1 indicate scroll up and -1 indicate scrool down
- int button; // mouse button
- //};
-}wog_Event;
-
-//* VK_0 - VK_9 are the same as ASCII '0' - '9' (0x30 - 0x39)
- //* 0x40 : unassigned
- //* VK_A - VK_Z are the same as ASCII 'A' - 'Z' (0x41 - 0x5A)
-
-//定义数据字符0~9
-#define VK_0 0x30
-#define VK_1 0x31
-#define VK_2 0x32
-#define VK_3 0x33
-#define VK_4 0x34
-#define VK_5 0x35
-#define VK_6 0x36
-#define VK_7 0x37
-#define VK_8 0x38
-#define VK_9 0x39
-
-//定义数据字符A~Z
-#define VK_A 0x41
-#define VK_B 0x42
-#define VK_C 0x43
-#define VK_D 0x44
-#define VK_E 0x45
-#define VK_F 0x46
-#define VK_G 0x47
-#define VK_H 0x48
-#define VK_I 0x49
-#define VK_J 0x4A
-#define VK_K 0x4B
-#define VK_L 0x4C
-#define VK_M 0x4D
-#define VK_N 0x4E
-#define VK_O 0x4F
-#define VK_P 0x50
-#define VK_Q 0x51
-#define VK_R 0x52
-#define VK_S 0x53
-#define VK_T 0x54
-#define VK_U 0x55
-#define VK_V 0x56
-#define VK_W 0x57
-#define VK_X 0x58
-#define VK_Y 0x59
-#define VK_Z 0x5A
-
-//定义数据字符a~z
-#define VK_a 0x61
-#define VK_b 0x62
-#define VK_c 0x63
-#define VK_d 0x64
-#define VK_e 0x65
-#define VK_f 0x66
-#define VK_g 0x67
-#define VK_h 0x68
-#define VK_i 0x69
-#define VK_j 0x6A
-#define VK_k 0x6B
-#define VK_l 0x6C
-#define VK_m 0x6D
-#define VK_n 0x6E
-#define VK_o 0x6F
-#define VK_p 0x70
-#define VK_q 0x71
-#define VK_r 0x72
-#define VK_s 0x73
-#define VK_t 0x74
-#define VK_u 0x75
-#define VK_v 0x76
-#define VK_w 0x77
-#define VK_x 0x78
-#define VK_y 0x79
-#define VK_z 0x7A
-
-typedef struct {
- int width, height, channels;
- unsigned char* buffer;
-} wog_Surface;
-
-/**
-* Entry of user program which defined in user project. You need provide
-* this function's defination.
-*/
-#define main wog_main
-extern int wog_main(int argc, char* argv[]);
-
-typedef struct wog_Window wog_Window;
-
-#if WOG_API == WOG_GL
-/**
-* Struct that hold opengl context generated by wglCreateContext() which
-* defined in opengl32.lib
-*/
-typedef struct wog_GLContext wog_GLContext;
-#endif
-
-enum // window style flag
-{
- WOG_HIDDEN = 4,
- WOG_RESIZABLE = 8,
- WOG_DISABLE = 16,
-};
-
-/**
-* Create window with given configures.
-* flag would be:
-* WOG_HIDDEN
-* WOG_RESIZABLE
-* WOG_DISABLE
-* or just 0;
-*/
-wog_Window* wog_createWindow(const char* title, int width, int height, int x, int y, uint32 flags);
-
-#if WOG_API == WOG_GL
-wog_GLContext* wog_createGLContext(wog_Window* wnd);
-
-int wog_makeCurrent(wog_Window* wnd, wog_GLContext* cxt);
-
-void wog_destroyGLContext(wog_GLContext* cxt);
-#endif
-
-void wog_destroyWindow(wog_Window* wnd);
-
-#if WOG_API == WOG_GL
-void wog_swapBuffers(wog_Window* wnd);
-#endif
-
-#if WOG_API == WOG_GDI
-void wog_updateSurface(wog_Window* wnd);
-#endif
-
-int wog_pollEvent(wog_Window* wnd, wog_Event* e);
-
-void wog_getMouse(wog_Window* wnd, int *x, int *y);
-
-// get current ticks
-int wog_tick();
-
-void wog_sleep(int ms);
-
-void wog_getwindowsize(wog_Window* wnd, int* width, int* height);
-
-void wog_show(wog_Window* wnd);
-
-void wog_hide(wog_Window* wnd);
-
-typedef void(*wog_Callback)(wog_Window* wnd) ;
-
-/**
-* Register callback functions.
-*/
-void wog_registerResizeCallback(wog_Callback cal);
-void wog_registerQuitCallback(wog_Callback cal);
-
-wog_Surface* wog_getsurface(wog_Window* wnd);
-
-void wog_setcursor(wog_Window* wnd, unsigned int cursor);
-//void wog_setcursorImage(wog_Window* wnd, const char* path);
-typedef HANDLE Wog_Cursor;
-void wog_setcursorImage(wog_Window* wnd, Wog_Cursor icon);
-
-void wog_setMouseCapture(wog_Window* wnd);
-void wog_releaseMouseCapture(wog_Window* wnd);
-
-HINSTANCE wog_get_instance();
-
-#endif \ No newline at end of file