SDL: examples: Added misc/02-clipboard

From 17d77f5fbda2674c98da8fed0e8992b1b6dbd22c Mon Sep 17 00:00:00 2001
From: "Ryan C. Gordon" <[EMAIL REDACTED]>
Date: Wed, 24 Sep 2025 14:41:05 -0400
Subject: [PATCH] examples: Added misc/02-clipboard

---
 examples/CMakeLists.txt                     |   1 +
 examples/misc/02-clipboard/README.txt       |   6 +
 examples/misc/02-clipboard/clipboard.c      | 235 ++++++++++++++++++++
 examples/misc/02-clipboard/onmouseover.webp | Bin 0 -> 67272 bytes
 examples/misc/02-clipboard/thumbnail.png    | Bin 0 -> 1392 bytes
 5 files changed, 242 insertions(+)
 create mode 100644 examples/misc/02-clipboard/README.txt
 create mode 100644 examples/misc/02-clipboard/clipboard.c
 create mode 100644 examples/misc/02-clipboard/onmouseover.webp
 create mode 100644 examples/misc/02-clipboard/thumbnail.png

diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt
index 22826a178832d..6e1f1c5d0edce 100644
--- a/examples/CMakeLists.txt
+++ b/examples/CMakeLists.txt
@@ -155,6 +155,7 @@ add_sdl_example_executable(camera-read-and-draw SOURCES camera/01-read-and-draw/
 add_sdl_example_executable(pen-drawing-lines SOURCES pen/01-drawing-lines/drawing-lines.c)
 add_sdl_example_executable(asyncio-load-bitmaps SOURCES asyncio/01-load-bitmaps/load-bitmaps.c DATAFILES ${CMAKE_CURRENT_SOURCE_DIR}/../test/sample.bmp ${CMAKE_CURRENT_SOURCE_DIR}/../test/gamepad_front.bmp ${CMAKE_CURRENT_SOURCE_DIR}/../test/speaker.bmp ${CMAKE_CURRENT_SOURCE_DIR}/../test/icon2x.bmp)
 add_sdl_example_executable(misc-power SOURCES misc/01-power/power.c)
+add_sdl_example_executable(misc-clipboard SOURCES misc/02-clipboard/clipboard.c)
 add_sdl_example_executable(demo-snake SOURCES demo/01-snake/snake.c)
 add_sdl_example_executable(demo-woodeneye-008 SOURCES demo/02-woodeneye-008/woodeneye-008.c)
 add_sdl_example_executable(demo-infinite-monkeys SOURCES demo/03-infinite-monkeys/infinite-monkeys.c)
diff --git a/examples/misc/02-clipboard/README.txt b/examples/misc/02-clipboard/README.txt
new file mode 100644
index 0000000000000..b2721996f53c8
--- /dev/null
+++ b/examples/misc/02-clipboard/README.txt
@@ -0,0 +1,6 @@
+This example code lets the user copy and paste with the system clipboard.
+
+This only handles text, but SDL supports other data types, too.
+
+Note that only Chrome-based browsers support this API currently. This uses a
+new Javascript API, so hopefully this will be available everywhere soon!
diff --git a/examples/misc/02-clipboard/clipboard.c b/examples/misc/02-clipboard/clipboard.c
new file mode 100644
index 0000000000000..afe8b133fdc64
--- /dev/null
+++ b/examples/misc/02-clipboard/clipboard.c
@@ -0,0 +1,235 @@
+/*
+ * This example code lets the user copy and paste with the system clipboard.
+ *
+ * This only handles text, but SDL supports other data types, too.
+ *
+ * This code is public domain. Feel free to use it for any purpose!
+ */
+
+#define SDL_MAIN_USE_CALLBACKS 1  /* use the callbacks instead of main() */
+#include <SDL3/SDL.h>
+#include <SDL3/SDL_main.h>
+
+#include "../../save-rendering-to-bitmaps.h"
+
+/* We will use this renderer to draw into this window every frame. */
+static SDL_Window *window = NULL;
+static SDL_Renderer *renderer = NULL;
+static const char *copybuttonstr = "Click here to copy!";
+static const char *pastebuttonstr = "Click here to paste!";
+static SDL_FRect currenttimerect;
+static SDL_FRect copybuttonrect;
+static SDL_FRect pastetextrect;
+static SDL_FRect pastebuttonrect;
+static bool copy_pressed = false;
+static bool paste_pressed = false;
+static char current_time[64];
+static char *pasted_str = NULL;
+
+static void CalculateCurrentTimeString(void)
+{
+    SDL_Time ticks = 0;
+    SDL_DateTime dt;
+    if (!SDL_GetCurrentTime(&ticks) || !SDL_TimeToDateTime(ticks, &dt, true)) {
+        SDL_snprintf(current_time, sizeof (current_time), "(Don't know the current time, sorry.)");
+    } else {
+        static const char *month[12] = { "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December" };
+        static const char *day[7] = { "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" };
+        SDL_snprintf(current_time, sizeof (current_time), "%s, %s %d, %d   %02d:%02d:%02d", day[dt.day_of_week], month[dt.month-1], dt.day, dt.year, dt.hour, dt.minute, dt.second);
+    }
+}
+
+/* This function runs once at startup. */
+SDL_AppResult SDL_AppInit(void **appstate, int argc, char *argv[])
+{
+    SDL_SetAppMetadata("Example Misc Clipboard", "1.0", "com.example.misc-clipboard");
+
+    if (!SDL_Init(SDL_INIT_VIDEO)) {
+        SDL_Log("Couldn't initialize SDL: %s", SDL_GetError());
+        return SDL_APP_FAILURE;
+    }
+
+    if (!SDL_CreateWindowAndRenderer("examples/misc/clipboard", 640, 480, 0, &window, &renderer)) {
+        SDL_Log("Couldn't create window/renderer: %s", SDL_GetError());
+        return SDL_APP_FAILURE;
+    }
+
+    CalculateCurrentTimeString();
+
+    /* set up the locations where we'll draw stuff. */
+    currenttimerect.x = 30;
+    currenttimerect.y = 10;
+    currenttimerect.w = 390;
+    currenttimerect.h = SDL_DEBUG_TEXT_FONT_CHARACTER_SIZE + 10;
+
+    copybuttonrect.x = currenttimerect.x + currenttimerect.w + 30;
+    copybuttonrect.y = currenttimerect.y;
+    copybuttonrect.w = (SDL_DEBUG_TEXT_FONT_CHARACTER_SIZE * SDL_strlen(copybuttonstr)) + 10;
+    copybuttonrect.h = currenttimerect.h;
+
+    pastetextrect.x = 10;
+    pastetextrect.y = currenttimerect.y + currenttimerect.h + 10;
+    pastetextrect.w = 620;
+    pastetextrect.h = ((480 - pastetextrect.y) - copybuttonrect.h) - 20;
+
+    pastebuttonrect.w = (SDL_DEBUG_TEXT_FONT_CHARACTER_SIZE * SDL_strlen(pastebuttonstr)) + 10;
+    pastebuttonrect.x = (640 - pastebuttonrect.w) / 2.0f;
+    pastebuttonrect.y = pastetextrect.y + pastetextrect.h + 10;
+    pastebuttonrect.h = copybuttonrect.h;
+
+    return SDL_APP_CONTINUE;  /* carry on with the program! */
+}
+
+/* This function runs when a new event (mouse input, keypresses, etc) occurs. */
+SDL_AppResult SDL_AppEvent(void *appstate, SDL_Event *event)
+{
+    if (event->type == SDL_EVENT_QUIT) {
+        return SDL_APP_SUCCESS;  /* end the program, reporting success to the OS. */
+    } else if (event->type == SDL_EVENT_MOUSE_BUTTON_DOWN) {
+        if (event->button.button == SDL_BUTTON_LEFT) {
+            const SDL_FPoint p = { event->button.x, event->button.y };
+            copy_pressed = SDL_PointInRectFloat(&p, &copybuttonrect);
+            paste_pressed = SDL_PointInRectFloat(&p, &pastebuttonrect);
+        }
+    } else if (event->type == SDL_EVENT_MOUSE_BUTTON_UP) {
+        if (event->button.button == SDL_BUTTON_LEFT) {
+            const SDL_FPoint p = { event->button.x, event->button.y };
+            if (copy_pressed && SDL_PointInRectFloat(&p, &copybuttonrect)) {
+                SDL_SetClipboardText(current_time);
+            } else if (paste_pressed && SDL_PointInRectFloat(&p, &pastebuttonrect)) {
+                SDL_free(pasted_str);
+                pasted_str = SDL_GetClipboardText();
+            }
+            copy_pressed = paste_pressed = false;
+        }
+    }
+
+    return SDL_APP_CONTINUE;  /* carry on with the program! */
+}
+
+static void RenderPastedText(void)
+{
+    char *str = pasted_str;
+    if (str) {
+        float x = pastetextrect.x + 5;
+        float y = pastetextrect.y + 5;
+        const float w = pastetextrect.w - 10;
+        const float h = pastetextrect.h;
+        const size_t max_chars_per_line = (size_t) (w / SDL_DEBUG_TEXT_FONT_CHARACTER_SIZE);
+        char *newline;
+        size_t slen;
+        char ch;
+
+        /* this doesn't wordwrap, or deal with Unicode....this is just a simple example app! */
+        while ((newline = SDL_strchr(str, '\n')) != NULL) {
+            const bool ignore_cr = ((newline > str) && (newline[-1] == '\r'));
+
+            if (ignore_cr) {
+                newline[-1] = '\0';
+            }
+            *newline = '\0';
+
+            slen = SDL_strlen(str);  /* length to end of line. */
+            slen = SDL_min(slen, max_chars_per_line);
+            ch = str[slen];
+            str[slen] = '\0';
+            SDL_RenderDebugText(renderer, x, y, str);
+            str[slen] = ch;
+
+            if (ignore_cr) {
+                newline[-1] = '\r';
+            }
+            *newline = '\n';
+
+            str = newline + 1;
+            y += (SDL_DEBUG_TEXT_FONT_CHARACTER_SIZE + 2);
+            if ((h - y) < SDL_DEBUG_TEXT_FONT_CHARACTER_SIZE) {
+                break;  // no space for another line, stop here.
+            }
+        }
+
+        /* last text after newline, if there's room. */
+        if ((h - y) >= SDL_DEBUG_TEXT_FONT_CHARACTER_SIZE) {
+            slen = SDL_strlen(str);  /* length to end of line. */
+            slen = SDL_min(slen, max_chars_per_line);
+            ch = str[slen];
+            str[slen] = '\0';
+            SDL_RenderDebugText(renderer, x, y, str);
+            str[slen] = ch;
+        }
+    }
+}
+
+/* This function runs once per frame, and is the heart of the program. */
+SDL_AppResult SDL_AppIterate(void *appstate)
+{
+    float x, y;
+
+    CalculateCurrentTimeString();
+
+    SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255);  /* black */
+    SDL_RenderClear(renderer);
+
+    /* draw a frame around the current time. */
+    SDL_SetRenderDrawColor(renderer, 0, 0, 255, 255);
+    SDL_RenderFillRect(renderer, &currenttimerect);
+    SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255);
+    SDL_RenderRect(renderer, &currenttimerect);
+
+    /* draw the current time inside the frame. */
+    x = currenttimerect.x + ((currenttimerect.w - (SDL_DEBUG_TEXT_FONT_CHARACTER_SIZE * SDL_strlen(current_time))) / 2.0f);
+    y = currenttimerect.y + 5;
+    SDL_SetRenderDrawColor(renderer, 255, 255, 0, 255);
+    SDL_RenderDebugText(renderer, x, y, current_time);
+
+    /* draw a frame for the "copy the current time to the clipboard" button. */
+    if (copy_pressed) {
+        SDL_SetRenderDrawColor(renderer, 0, 255, 0, 255);
+    } else {
+        SDL_SetRenderDrawColor(renderer, 255, 0, 0, 255);
+    }
+    SDL_RenderFillRect(renderer, &copybuttonrect);
+    SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255);
+    SDL_RenderRect(renderer, &copybuttonrect);
+
+    /* draw the "copy this text" button string. */
+    SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255);
+    SDL_RenderDebugText(renderer, copybuttonrect.x + 5, copybuttonrect.y + 5, copybuttonstr);
+
+    /* draw a frame for the pasted text area. */
+    SDL_SetRenderDrawColor(renderer, 0, 53, 25, 255);
+    SDL_RenderFillRect(renderer, &pastetextrect);
+    SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255);
+    SDL_RenderRect(renderer, &pastetextrect);
+
+    /* draw pasted text. */
+    SDL_SetRenderDrawColor(renderer, 0, 219, 107, 255);
+    RenderPastedText();
+
+    /* draw a frame for the "paste from the clipboard" button. */
+    if (paste_pressed) {
+        SDL_SetRenderDrawColor(renderer, 0, 255, 0, 255);
+    } else {
+        SDL_SetRenderDrawColor(renderer, 255, 0, 0, 255);
+    }
+    SDL_RenderFillRect(renderer, &pastebuttonrect);
+    SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255);
+    SDL_RenderRect(renderer, &pastebuttonrect);
+
+    /* draw the "paste some text" button string. */
+    SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255);
+    SDL_RenderDebugText(renderer, pastebuttonrect.x + 5, pastebuttonrect.y + 5, pastebuttonstr);
+
+    /* put the new rendering on the screen. */
+    SDL_RenderPresent(renderer);
+
+    return SDL_APP_CONTINUE;  /* carry on with the program! */
+}
+
+/* This function runs once at shutdown. */
+void SDL_AppQuit(void *appstate, SDL_AppResult result)
+{
+    SDL_free(pasted_str);
+    /* SDL will clean up the window/renderer for us. */
+}
+
diff --git a/examples/misc/02-clipboard/onmouseover.webp b/examples/misc/02-clipboard/onmouseover.webp
new file mode 100644
index 0000000000000000000000000000000000000000..73476b475b41adfbf0f19baae157ddec8acf592b
GIT binary patch
literal 67272
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%0Dil56vWfHK4DKM8dRP6`~i~lPWZU2
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%0AYIXCq6|J0Tc+62-#DI`T%{{a0rHf1$
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

(Patch may be truncated, please check the link at the top of this post.)