https://git.reactos.org/?p=reactos.git;a=commitdiff;h=5c9fdcb1de7faa49c2af3…
commit 5c9fdcb1de7faa49c2af341631217baa7b9fe552
Author: Doug Lyons <douglyons(a)douglyons.com>
AuthorDate: Thu Dec 2 12:55:39 2021 -0600
Commit: GitHub <noreply(a)github.com>
CommitDate: Thu Dec 2 19:55:39 2021 +0100
[3DTEXT] Fix 3dtext.scr using near 100% CPU (#4125)
CORE-17866, CORE-8217
---
base/applications/screensavers/3dtext/3dtext.c | 16 ++++++++++++++++
1 file changed, 16 insertions(+)
diff --git a/base/applications/screensavers/3dtext/3dtext.c
b/base/applications/screensavers/3dtext/3dtext.c
index c1f908ca37a..b46fcce6905 100644
--- a/base/applications/screensavers/3dtext/3dtext.c
+++ b/base/applications/screensavers/3dtext/3dtext.c
@@ -41,6 +41,9 @@ GLfloat extentY = 0.0f;
HINSTANCE hInstance;
BOOL fullscreen = FALSE;
+UINT uTimerID; // SetTimer Actual ID
+#define APP_TIMER 1 // Graphics Update Timer ID
+#define APP_TIMER_INTERVAL (USER_TIMER_MINIMUM * 5) // Graphics Update Interval
// Build Our Bitmap Font
GLvoid BuildFont(GLvoid)
@@ -338,12 +341,18 @@ ScreenSaverProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM
lParam)
// Initialize The GL Screen Using Screen Info
InitGL(Screen.right, Screen.bottom);
+
+ // Create Graphics update timer
+ uTimerID = SetTimer(hWnd, APP_TIMER, APP_TIMER_INTERVAL, NULL);
break;
case WM_DESTROY:
// Disable Fullscreen Mode
ChangeDisplaySettings(NULL, 0);
+ // Delete the Update Timer
+ KillTimer(hWnd, uTimerID);
+
// Deletes The Font Display List
KillFont();
@@ -360,6 +369,8 @@ ScreenSaverProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM
lParam)
case WM_PAINT:
DrawGLScene();
SwapBuffers(hDC);
+ // Mark this window as updated, so the OS won't ask us to update it
again.
+ ValidateRect(hWnd, NULL);
break;
case WM_SIZE: // Resizing The Screen
@@ -367,6 +378,11 @@ ScreenSaverProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM
lParam)
ReSizeGLScene(LOWORD(lParam), HIWORD(lParam));
break;
+ case WM_TIMER:
+ // Used to update graphic based on timer udpate interval
+ InvalidateRect(hWnd, NULL, TRUE);
+ break;
+
default:
// Pass Windows Messages to the default screensaver window procedure
return DefScreenSaverProc(hWnd, message, wParam, lParam);