From c33e3c15fb542a972e1ac803fe7f579c0108573a Mon Sep 17 00:00:00 2001
From: Eric Wasylishen <[EMAIL REDACTED]>
Date: Mon, 7 Jun 2021 18:24:57 -0600
Subject: [PATCH] testwm2: draw various debug logging into the window itself
Renderer output size, window position/size, display bounds, etc.
Uses new SDLTest_CommonDrawWindowInfo function in test_common.
---
include/SDL_test_common.h | 8 ++
src/test/SDL_test_common.c | 275 +++++++++++++++++++++++++++++++++++++
test/testwm2.c | 5 +
3 files changed, 288 insertions(+)
diff --git a/include/SDL_test_common.h b/include/SDL_test_common.h
index 6e4344fdfe..8a92c05cb3 100644
--- a/include/SDL_test_common.h
+++ b/include/SDL_test_common.h
@@ -206,6 +206,14 @@ void SDLTest_CommonEvent(SDLTest_CommonState * state, SDL_Event * event, int *do
*/
void SDLTest_CommonQuit(SDLTest_CommonState * state);
+/**
+ * \brief Draws various window information (position, size, etc.) to the renderer.
+ *
+ * \param renderer The renderer to draw to.
+ * \param window The window whose information should be displayed.
+ *
+ */
+void SDLTest_CommonDrawWindowInfo(SDL_Renderer * renderer, SDL_Window * window);
/* Ends C function definitions when using C++ */
#ifdef __cplusplus
diff --git a/src/test/SDL_test_common.c b/src/test/SDL_test_common.c
index 0b5bc0e62d..9ff04c5208 100644
--- a/src/test/SDL_test_common.c
+++ b/src/test/SDL_test_common.c
@@ -629,6 +629,170 @@ SDLTest_CommonDefaultArgs(SDLTest_CommonState *state, const int argc, char **arg
return SDL_TRUE;
}
+static void
+SDLTest_PrintDisplayOrientation(char* text, size_t maxlen, SDL_DisplayOrientation orientation)
+{
+ switch (orientation) {
+ case SDL_ORIENTATION_UNKNOWN:
+ SDL_snprintfcat(text, maxlen, "UNKNOWN");
+ break;
+ case SDL_ORIENTATION_LANDSCAPE:
+ SDL_snprintfcat(text, maxlen, "LANDSCAPE");
+ break;
+ case SDL_ORIENTATION_LANDSCAPE_FLIPPED:
+ SDL_snprintfcat(text, maxlen, "LANDSCAPE_FLIPPED");
+ break;
+ case SDL_ORIENTATION_PORTRAIT:
+ SDL_snprintfcat(text, maxlen, "PORTRAIT");
+ break;
+ case SDL_ORIENTATION_PORTRAIT_FLIPPED:
+ SDL_snprintfcat(text, maxlen, "PORTRAIT_FLIPPED");
+ break;
+ default:
+ SDL_snprintfcat(text, maxlen, "0x%8.8x", orientation);
+ break;
+ }
+}
+
+static void
+SDLTest_PrintWindowFlag(char* text, size_t maxlen, Uint32 flag)
+{
+ switch (flag) {
+ case SDL_WINDOW_FULLSCREEN:
+ SDL_snprintfcat(text, maxlen, "FULLSCREEN");
+ break;
+ case SDL_WINDOW_OPENGL:
+ SDL_snprintfcat(text, maxlen, "OPENGL");
+ break;
+ case SDL_WINDOW_SHOWN:
+ SDL_snprintfcat(text, maxlen, "SHOWN");
+ break;
+ case SDL_WINDOW_HIDDEN:
+ SDL_snprintfcat(text, maxlen, "HIDDEN");
+ break;
+ case SDL_WINDOW_BORDERLESS:
+ SDL_snprintfcat(text, maxlen, "BORDERLESS");
+ break;
+ case SDL_WINDOW_RESIZABLE:
+ SDL_snprintfcat(text, maxlen, "RESIZABLE");
+ break;
+ case SDL_WINDOW_MINIMIZED:
+ SDL_snprintfcat(text, maxlen, "MINIMIZED");
+ break;
+ case SDL_WINDOW_MAXIMIZED:
+ SDL_snprintfcat(text, maxlen, "MAXIMIZED");
+ break;
+ case SDL_WINDOW_MOUSE_GRABBED:
+ SDL_snprintfcat(text, maxlen, "MOUSE_GRABBED");
+ break;
+ case SDL_WINDOW_INPUT_FOCUS:
+ SDL_snprintfcat(text, maxlen, "INPUT_FOCUS");
+ break;
+ case SDL_WINDOW_MOUSE_FOCUS:
+ SDL_snprintfcat(text, maxlen, "MOUSE_FOCUS");
+ break;
+ case SDL_WINDOW_FULLSCREEN_DESKTOP:
+ SDL_snprintfcat(text, maxlen, "FULLSCREEN_DESKTOP");
+ break;
+ case SDL_WINDOW_FOREIGN:
+ SDL_snprintfcat(text, maxlen, "FOREIGN");
+ break;
+ case SDL_WINDOW_ALLOW_HIGHDPI:
+ SDL_snprintfcat(text, maxlen, "ALLOW_HIGHDPI");
+ break;
+ case SDL_WINDOW_MOUSE_CAPTURE:
+ SDL_snprintfcat(text, maxlen, "MOUSE_CAPTURE");
+ break;
+ case SDL_WINDOW_ALWAYS_ON_TOP:
+ SDL_snprintfcat(text, maxlen, "ALWAYS_ON_TOP");
+ break;
+ case SDL_WINDOW_SKIP_TASKBAR:
+ SDL_snprintfcat(text, maxlen, "SKIP_TASKBAR");
+ break;
+ case SDL_WINDOW_UTILITY:
+ SDL_snprintfcat(text, maxlen, "UTILITY");
+ break;
+ case SDL_WINDOW_TOOLTIP:
+ SDL_snprintfcat(text, maxlen, "TOOLTIP");
+ break;
+ case SDL_WINDOW_POPUP_MENU:
+ SDL_snprintfcat(text, maxlen, "POPUP_MENU");
+ break;
+ case SDL_WINDOW_KEYBOARD_GRABBED:
+ SDL_snprintfcat(text, maxlen, "KEYBOARD_GRABBED");
+ break;
+ case SDL_WINDOW_VULKAN:
+ SDL_snprintfcat(text, maxlen, "VULKAN");
+ break;
+ case SDL_WINDOW_METAL:
+ SDL_snprintfcat(text, maxlen, "METAL");
+ break;
+ default:
+ SDL_snprintfcat(text, maxlen, "0x%8.8x", flag);
+ break;
+ }
+}
+
+static void
+SDLTest_PrintWindowFlags(char* text, size_t maxlen, Uint32 flags)
+{
+ const Uint32 window_flags[] = {
+ SDL_WINDOW_FULLSCREEN,
+ SDL_WINDOW_OPENGL,
+ SDL_WINDOW_SHOWN,
+ SDL_WINDOW_HIDDEN,
+ SDL_WINDOW_BORDERLESS,
+ SDL_WINDOW_RESIZABLE,
+ SDL_WINDOW_MINIMIZED,
+ SDL_WINDOW_MAXIMIZED,
+ SDL_WINDOW_MOUSE_GRABBED,
+ SDL_WINDOW_INPUT_FOCUS,
+ SDL_WINDOW_MOUSE_FOCUS,
+ SDL_WINDOW_FULLSCREEN_DESKTOP,
+ SDL_WINDOW_FOREIGN,
+ SDL_WINDOW_ALLOW_HIGHDPI,
+ SDL_WINDOW_MOUSE_CAPTURE,
+ SDL_WINDOW_ALWAYS_ON_TOP,
+ SDL_WINDOW_SKIP_TASKBAR,
+ SDL_WINDOW_UTILITY,
+ SDL_WINDOW_TOOLTIP,
+ SDL_WINDOW_POPUP_MENU,
+ SDL_WINDOW_KEYBOARD_GRABBED,
+ SDL_WINDOW_VULKAN,
+ SDL_WINDOW_METAL
+ };
+
+ int i;
+ int count = 0;
+ for (i = 0; i < (sizeof(window_flags) / sizeof(window_flags[0])); ++i) {
+ const Uint32 flag = window_flags[i];
+ if ((flags & flag) == flag) {
+ if (count > 0) {
+ SDL_snprintfcat(text, maxlen, " | ");
+ }
+ SDLTest_PrintWindowFlag(text, maxlen, flag);
+ ++count;
+ }
+ }
+}
+
+static void
+SDLTest_PrintButtonMask(char* text, size_t maxlen, Uint32 flags)
+{
+ int i;
+ int count = 0;
+ for (i = 1; i <= 32; ++i) {
+ const Uint32 flag = SDL_BUTTON(i);
+ if ((flags & flag) == flag) {
+ if (count > 0) {
+ SDL_snprintfcat(text, maxlen, " | ");
+ }
+ SDL_snprintfcat(text, maxlen, "SDL_BUTTON(%d)", i);
+ ++count;
+ }
+ }
+}
+
static void
SDLTest_PrintRendererFlag(char *text, size_t maxlen, Uint32 flag)
{
@@ -1990,4 +2154,115 @@ SDLTest_CommonQuit(SDLTest_CommonState * state)
SDLTest_LogAllocations();
}
+void
+SDLTest_CommonDrawWindowInfo(SDL_Renderer * renderer, SDL_Window * window)
+{
+ char text[1024];
+ int textY = 0;
+ const int lineHeight = 10;
+ int x, y, w, h;
+ SDL_Rect rect;
+ SDL_DisplayMode mode;
+ float ddpi, hdpi, vdpi;
+ Uint32 flags;
+ const int windowDisplayIndex = SDL_GetWindowDisplayIndex(window);
+
+ /* Renderer */
+
+ if (0 == SDL_GetRendererOutputSize(renderer, &w, &h)) {
+ SDL_snprintf(text, sizeof(text), "SDL_GetRendererOutputSize: %dx%d", w, h);
+ SDLTest_DrawString(renderer, 0, textY, text);
+ textY += lineHeight;
+ }
+
+ SDL_RenderGetViewport(renderer, &rect);
+ SDL_snprintf(text, sizeof(text), "SDL_RenderGetViewport: %d,%d, %dx%d",
+ rect.x, rect.y, rect.w, rect.h);
+ SDLTest_DrawString(renderer, 0, textY, text);
+ textY += lineHeight;
+
+ /* Window */
+
+ SDLTest_DrawString(renderer, 0, textY, "----");
+ textY += lineHeight;
+
+ SDL_GetWindowPosition(window, &x, &y);
+ SDL_snprintf(text, sizeof(text), "SDL_GetWindowPosition: %d,%d", x, y);
+ SDLTest_DrawString(renderer, 0, textY, text);
+ textY += lineHeight;
+
+ SDL_GetWindowSize(window, &w, &h);
+ SDL_snprintf(text, sizeof(text), "SDL_GetWindowSize: %dx%d", w, h);
+ SDLTest_DrawString(renderer, 0, textY, text);
+ textY += lineHeight;
+
+ SDL_snprintf(text, sizeof(text), "SDL_GetWindowFlags: ");
+ SDLTest_PrintWindowFlags(text, sizeof(text), SDL_GetWindowFlags(window));
+ SDLTest_DrawString(renderer, 0, textY, text);
+ textY += lineHeight;
+
+ /* Display */
+
+ SDLTest_DrawString(renderer, 0, textY, "----");
+ textY += lineHeight;
+
+ SDL_snprintf(text, sizeof(text), "SDL_GetWindowDisplayIndex: %d", windowDisplayIndex);
+ SDLTest_DrawString(renderer, 0, textY, text);
+ textY += lineHeight;
+
+ SDL_snprintf(text, sizeof(text), "SDL_GetDisplayName: %s", SDL_GetDisplayName(windowDisplayIndex));
+ SDLTest_DrawString(renderer, 0, textY, text);
+ textY += lineHeight;
+
+ if (0 == SDL_GetDisplayBounds(windowDisplayIndex, &rect)) {
+ SDL_snprintf(text, sizeof(text), "SDL_GetDisplayBounds: %d,%d, %dx%d",
+ rect.x, rect.y, rect.w, rect.h);
+ SDLTest_DrawString(renderer, 0, textY, text);
+ textY += lineHeight;
+ }
+
+ if (0 == SDL_GetCurrentDisplayMode(windowDisplayIndex, &mode)) {
+ SDL_snprintf(text, sizeof(text), "SDL_GetCurrentDisplayMode: %dx%d@%d",
+ mode.w, mode.h, mode.refresh_rate);
+ SDLTest_DrawString(renderer, 0, textY, text);
+ textY += lineHeight;
+ }
+
+ if (0 == SDL_GetDesktopDisplayMode(windowDisplayIndex, &mode)) {
+ SDL_snprintf(text, sizeof(text), "SDL_GetDesktopDisplayMode: %dx%d@%d",
+ mode.w, mode.h, mode.refresh_rate);
+ SDLTest_DrawString(renderer, 0, textY, text);
+ textY += lineHeight;
+ }
+
+ if (0 == SDL_GetDisplayDPI(windowDisplayIndex, &ddpi, &hdpi, &vdpi)) {
+ SDL_snprintf(text, sizeof(text), "SDL_GetDisplayDPI: ddpi: %f, hdpi: %f, vdpi: %f",
+ ddpi, hdpi, vdpi);
+ SDLTest_DrawString(renderer, 0, textY, text);
+ textY += lineHeight;
+ }
+
+ SDL_snprintf(text, sizeof(text), "SDL_GetDisplayOrientation: ");
+ SDLTest_PrintDisplayOrientation(text, sizeof(text), SDL_GetDisplayOrientation(windowDisplayIndex));
+ SDLTest_DrawString(renderer, 0, textY, text);
+ textY += lineHeight;
+
+ /* Mouse */
+
+ SDLTest_DrawString(renderer, 0, textY, "----");
+ textY += lineHeight;
+
+ flags = SDL_GetMouseState(&x, &y);
+ SDL_snprintf(text, sizeof(text), "SDL_GetMouseState: %d,%d ", x, y);
+ SDLTest_PrintButtonMask(text, sizeof(text), flags);
+ SDLTest_DrawString(renderer, 0, textY, text);
+ textY += lineHeight;
+
+ flags = SDL_GetGlobalMouseState(&x, &y);
+ SDL_snprintf(text, sizeof(text), "SDL_GetGlobalMouseState: %d,%d ", x, y);
+ SDLTest_PrintButtonMask(text, sizeof(text), flags);
+ SDLTest_DrawString(renderer, 0, textY, text);
+ textY += lineHeight;
+}
+
/* vi: set ts=4 sw=4 expandtab: */
diff --git a/test/testwm2.c b/test/testwm2.c
index d849283580..1dc66350d7 100644
--- a/test/testwm2.c
+++ b/test/testwm2.c
@@ -105,7 +105,12 @@ loop()
for (i = 0; i < state->num_windows; ++i) {
SDL_Renderer *renderer = state->renderers[i];
if (renderer != NULL) {
+ SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255);
SDL_RenderClear(renderer);
+
+ SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255);
+ SDLTest_CommonDrawWindowInfo(renderer, state->windows[i]);
+
SDL_RenderPresent(renderer);
}
}