vkcube: Implement key events in Windows
authorPetr Kraus <petr_kraus@email.cz>
Wed, 23 Jan 2019 17:45:04 +0000 (18:45 +0100)
committerTony Barbour <tony@lunarg.com>
Thu, 14 Feb 2019 19:02:54 +0000 (12:02 -0700)
cube/cube.c
cube/cube.cpp

index 09723c8..b702b28 100644 (file)
@@ -2397,7 +2397,7 @@ static void demo_run(struct demo *demo) {
 
     demo_draw(demo);
     demo->curFrame++;
-    if (demo->frameCount != INT_MAX && demo->curFrame == demo->frameCount) {
+    if (demo->frameCount != INT32_MAX && demo->curFrame == demo->frameCount) {
         PostQuitMessage(validation_error);
     }
 }
@@ -2431,6 +2431,22 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
                 demo_resize(&demo);
             }
             break;
+        case WM_KEYDOWN:
+            switch (wParam) {
+                case VK_ESCAPE:
+                    PostQuitMessage(validation_error);
+                    break;
+                case VK_LEFT:
+                    demo.spin_angle -= demo.spin_increment;
+                    break;
+                case VK_RIGHT:
+                    demo.spin_angle += demo.spin_increment;
+                    break;
+                case VK_SPACE:
+                    demo.pause = !demo.pause;
+                    break;
+            }
+            return 0;
         default:
             break;
     }
@@ -3808,6 +3824,15 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR pCmdLine,
 
     // main message loop
     while (!done) {
+        if (demo.pause) {
+            const BOOL succ = WaitMessage();
+
+            if (!succ) {
+                struct demo *tmp = &demo;
+                struct demo *demo = tmp;
+                ERR_EXIT("WaitMessage() failed on paused demo", "event loop error");
+            }
+        }
         PeekMessage(&msg, NULL, 0, 0, PM_REMOVE);
         if (msg.message == WM_QUIT)  // check for a quit message
         {
index 5b90fd2..a6ac4ff 100644 (file)
@@ -2400,7 +2400,7 @@ void Demo::run() {
     draw();
     curFrame++;
 
-    if (frameCount != INT_MAX && curFrame == frameCount) {
+    if (frameCount != UINT32_MAX && curFrame == frameCount) {
         PostQuitMessage(validation_error);
     }
 }
@@ -2837,7 +2837,7 @@ void Demo::run_display() {
         draw();
         curFrame++;
 
-        if (frameCount != INT32_MAX && curFrame == frameCount) {
+        if (frameCount != UINT32_MAX && curFrame == frameCount) {
             quit = true;
         }
     }
@@ -2874,6 +2874,22 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
                 demo.resize();
             }
             break;
+        case WM_KEYDOWN:
+            switch (wParam) {
+                case VK_ESCAPE:
+                    PostQuitMessage(validation_error);
+                    break;
+                case VK_LEFT:
+                    demo.spin_angle -= demo.spin_increment;
+                    break;
+                case VK_RIGHT:
+                    demo.spin_angle += demo.spin_increment;
+                    break;
+                case VK_SPACE:
+                    demo.pause = !demo.pause;
+                    break;
+            }
+            return 0;
         default:
             break;
     }
@@ -2944,6 +2960,15 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR pCmdLine,
 
     // main message loop
     while (!done) {
+        if (demo.pause) {
+            const BOOL succ = WaitMessage();
+
+            if (!succ) {
+                const auto &suppress_popups = demo.suppress_popups;
+                ERR_EXIT("WaitMessage() failed on paused demo", "event loop error");
+            }
+        }
+
         PeekMessage(&msg, nullptr, 0, 0, PM_REMOVE);
         if (msg.message == WM_QUIT)  // check for a quit message
         {