Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- const int paOsWindowEvent_GainFocus = 1;
- const int paOsWindowEvent_LoseFocus = 2;
- const int paOsWindowEvent_Close = 3;
- const int paOsWindowEvent_Minimize = 4;
- const int paOsWindowEvent_Maximize = 5;
- const int paOsWindowEvent_KeyDown = 6;
- const int paOsWindowEvent_KeyRepeat = 7;
- const int paOsWindowEvent_KeyUp = 8;
- const int paOsWindowEvent_Char = 9;
- const int paOsWindowEvent_MousePos = 10;
- const int paOsWindowEvent_MouseDown = 11;
- const int paOsWindowEvent_MouseUp = 12;
- const int paOsWindowEvent_MouseWheel = 13;
- const int paOsWindowMode_Windowed = 0;
- const int paOsWindowMode_BorderlessWindowed = 1;
- const int paOsWindowMode_Fullscreen = 2;
- HWND paWindow = 0;
- HDC paWindowDc = 0;
- HGLRC paWindowContext = 0;
- //gl extensions
- PROC wglCreateContextAttribsARB;
- PROC wglSwapIntervalEXT;
- void GetWglExtensions() {
- wglCreateContextAttribsARB = wglGetProcAddress("wglCreateContextAttribsARB");
- wglSwapIntervalEXT = wglGetProcAddress("wglSwapIntervalEXT");
- }
- //window events
- int (*paOsWindowEventCallback)(int,int,int);
- int paTranslateVirtualKey(WPARAM wParam, LPARAM lParam) {
- int extendedBit = lParam & (1 << 24);
- int scancode = (lParam >> 16) & 0xFF;
- if (extendedBit) {
- switch(wParam) {
- case VK_CONTROL: return VK_RCONTROL;
- case VK_MENU: return VK_RMENU;
- case VK_RETURN: return 95;
- }
- } else {
- switch((lParam >> 16) & 0xFF) {
- case 42: return VK_LSHIFT;
- case 54: return VK_RSHIFT;
- case 82: return VK_NUMPAD0;
- case 79: return VK_NUMPAD1;
- case 80: return VK_NUMPAD2;
- case 81: return VK_NUMPAD3;
- case 75: return VK_NUMPAD4;
- case 76: return VK_NUMPAD5;
- case 77: return VK_NUMPAD6;
- case 71: return VK_NUMPAD7;
- case 72: return VK_NUMPAD8;
- case 73: return VK_NUMPAD9;
- case 83: return VK_DECIMAL;
- }
- }
- switch(wParam) {
- case VK_CONTROL: return VK_LCONTROL;
- case VK_MENU: return VK_LMENU;
- }
- return wParam;
- }
- LRESULT CALLBACK paOsWindowCallback(HWND window, UINT message, WPARAM wParam, LPARAM lParam) {
- switch(message){
- case WM_SYSCOMMAND:
- if (wParam == SC_CLOSE) { paOsWindowEventCallback(paOsWindowEvent_Close,0,0); return 0; }
- return DefWindowProc(window,message,wParam,lParam);
- case WM_SETFOCUS:
- paOsWindowEventCallback(paOsWindowEvent_GainFocus,0,0);
- return 0;
- case WM_DESTROY:
- case WM_KILLFOCUS:
- paOsWindowEventCallback(paOsWindowEvent_LoseFocus,0,0);
- return 0;
- case WM_KEYDOWN:
- case WM_SYSKEYDOWN:
- if (lParam & (1 << 30)) {
- paOsWindowEventCallback(paOsWindowEvent_KeyRepeat,paTranslateVirtualKey(wParam,lParam),0);
- } else {
- paOsWindowEventCallback(paOsWindowEvent_KeyDown,paTranslateVirtualKey(wParam,lParam),0);
- }
- return 0;
- case WM_KEYUP:
- case WM_SYSKEYUP:
- paOsWindowEventCallback(paOsWindowEvent_KeyUp,paTranslateVirtualKey(wParam,lParam),0);
- return 0;
- case WM_CHAR:
- paOsWindowEventCallback(paOsWindowEvent_Char,wParam,0);
- return 0;
- case WM_MOUSEMOVE:
- paOsWindowEventCallback(paOsWindowEvent_MousePos,LOWORD(lParam),HIWORD(lParam));
- return 0;
- case WM_LBUTTONDOWN:
- case WM_RBUTTONDOWN:
- case WM_MBUTTONDOWN:
- case 0x020B:
- SetCapture(paWindow);
- switch(message) {
- case WM_LBUTTONDOWN: paOsWindowEventCallback(paOsWindowEvent_MouseDown,1,0); return 0;
- case WM_RBUTTONDOWN: paOsWindowEventCallback(paOsWindowEvent_MouseDown,2,0); return 0;
- case WM_MBUTTONDOWN: paOsWindowEventCallback(paOsWindowEvent_MouseDown,3,0); return 0;
- case 0x020B:
- if (wParam & 0x0020) { paOsWindowEventCallback(paOsWindowEvent_MouseDown,4,0); return 0; }
- if (wParam & 0x0040) { paOsWindowEventCallback(paOsWindowEvent_MouseDown,5,0); return 0; }
- return 1;
- }
- case WM_LBUTTONUP:
- case WM_RBUTTONUP:
- case WM_MBUTTONUP:
- case 0x020C:
- ReleaseCapture();
- switch(message) {
- case WM_LBUTTONUP: paOsWindowEventCallback(paOsWindowEvent_MouseUp,1,0); return 0;
- case WM_RBUTTONUP: paOsWindowEventCallback(paOsWindowEvent_MouseUp,2,0); return 0;
- case WM_MBUTTONUP: paOsWindowEventCallback(paOsWindowEvent_MouseUp,3,0); return 0;
- case 0x020C:
- if (wParam & 0x0020) { paOsWindowEventCallback(paOsWindowEvent_MouseUp,4,0); return 0; }
- if (wParam & 0x0040) { paOsWindowEventCallback(paOsWindowEvent_MouseUp,5,0); return 0; }
- return 1;
- }
- case WM_MOUSEWHEEL:
- paOsWindowEventCallback(paOsWindowEvent_MouseWheel,GET_WHEEL_DELTA_WPARAM(wParam)/120,0);
- return 0;
- default:
- return DefWindowProc(window,message,wParam,lParam);
- }
- }
- void paDispatchOsWindowEvents() {
- MSG message;
- while(PeekMessage(&message,0,0,0,PM_REMOVE)) {
- TranslateMessage(&message);
- DispatchMessage(&message);
- }
- }
- void paInitializeOsWindow() {
- if (paWindow) return 0;
- //create window class
- WNDCLASS windowClass = {0};
- windowClass.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
- windowClass.lpfnWndProc = paOsWindowCallback;
- windowClass.hInstance = GetModuleHandle(0);
- windowClass.lpszClassName = "PAWindowClass";
- windowClass.hCursor = (HCURSOR)LoadCursor(0,IDC_ARROW);
- RegisterClass(&windowClass);
- //create window
- HWND window = CreateWindowEx(0,windowClass.lpszClassName,"PA",WS_POPUP,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,0,0,GetModuleHandle(0),0);
- if (!window) return 0;
- //get device context
- HDC dc = GetDC(window);
- //build pixel format descriptor
- PIXELFORMATDESCRIPTOR pfd = {0};
- pfd.nSize = sizeof(PIXELFORMATDESCRIPTOR);
- pfd.nVersion = 1;
- pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;
- pfd.iPixelType = PFD_TYPE_RGBA;
- pfd.cColorBits = 1;
- pfd.cDepthBits = 1;
- pfd.cStencilBits = 1;
- //get pixel format
- int pf = ChoosePixelFormat(dc,&pfd);
- if (!pf) { DestroyWindow(window); return 0; }
- //set device context's pixel format and descriptor
- SetPixelFormat(dc,pf,&pfd);
- //create simple OpenGL context
- HGLRC context = wglCreateContext(dc);
- if (!context) { DestroyWindow(window); return 0; }
- wglMakeCurrent(dc,context);
- //get extensions
- GetWglExtensions();
- //delete context
- wglDeleteContext(context);
- //create upgraded OpenGL context
- context = wglCreateContextAttribsARB(dc,0,0);
- wglMakeCurrent(dc,context);
- //set global state
- paWindow = window;
- paWindowDc = dc;
- paWindowContext = context;
- return 1;
- }
- int paTerminateOsWindow() {
- if (!paWindow) return 0;
- //delete context
- wglDeleteContext(paWindowContext);
- //destroy window
- DestroyWindow(paWindow);
- //set state
- paWindow = 0;
- paWindowDc = 0;
- paWindowContext = 0;
- return 1;
- }
- int paSetOsWindowSettings(int mode, int x, int y, int width, int height) {
- if (!paWindow) return 0;
- //get style
- DWORD style,exStyle;
- if (mode == paOsWindowMode_Windowed) {
- style = WS_BORDER | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX | WS_VISIBLE;
- exStyle = 0;
- } else if (mode == paOsWindowMode_BorderlessWindowed) {
- style = WS_POPUP | WS_VISIBLE;
- exStyle = 0;
- } else if (mode == paOsWindowMode_Fullscreen) {
- style = WS_POPUP | WS_VISIBLE;
- exStyle = 0;
- }
- //adjust size
- RECT rect;
- rect.left = x;
- rect.top = y;
- rect.right = x+width;
- rect.bottom = y+height;
- AdjustWindowRectEx(&rect,style,0,exStyle);
- x = rect.left;
- y = rect.top;
- width = rect.right-rect.left;
- height = rect.bottom-rect.top;
- //set configuration
- SetWindowLongPtr(paWindow,GWL_STYLE,style);
- SetWindowLongPtr(paWindow,GWL_EXSTYLE,exStyle);
- //reposition (needs to be done after setting configuration)
- SetWindowPos(paWindow,HWND_BOTTOM,x,y,width,height,SWP_FRAMECHANGED);
- return 1;
- }
- int paMinimizeOsWindow() {
- if (!paWindow) return 0;
- ShowWindow(paWindow,SW_MINIMIZE);
- return 1;
- }
- int paRestoreOsWindow() {
- if (!paWindow) return 0;
- ShowWindow(paWindow,SW_RESTORE);
- return 1;
- }
- int paSetOsWindowSwapInterval(int interval) {
- if (!paWindow) return 0;
- wglSwapIntervalEXT(interval);
- return 1;
- }
- int paSwapOsWindow(int interval) {
- if (!paWindow) return 0;
- SwapBuffers(paWindowDc);
- return 1;
- }
Advertisement
Add Comment
Please, Sign In to add comment