-
-
Notifications
You must be signed in to change notification settings - Fork 2.3k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[rcore] Clipboard Image Support #4459
Conversation
@evertonse This is an amazing addition! Thanks for working on it! About the best way to address this addition, it should be addressed by every supported rcore backend platform in a different way:
Please, let me know your thoughts! |
@evertonse I'll look into this for RGFW ASAP 👍 |
…hen TARGET_PLATFORM is PLATFORM_DESKTOP_GFLW
…hen TARGET_PLATFORM is PLATFORM_DESKTOP_GFLW
UpdateI've worked on the desktop platforms much in the way it was suggested. TLDRCreated an SDL3 layer to enable SDLTo support clipboard images on the SDL platform, we need SDL3. I have successfully ported the functionality as far as I could test, allowing Untitled.video.-.Made.with.Clipchamp.1.mp4Another benefit of adding SDL3 support is that some raylib functions that were previously unsupported on that platform are now available, such as With SDL3, we now check for additional MIME types. I noticed that on Wayland Ubuntu, the clipboard saves images as PNG, so we now check for the following MIME types:
CompilationAlso I have modified the After building and installing SDL3 on make PLATFORM=PLATFORM_DESKTOP_SDL \
SDL_INCLUDE_PATH=/usr/local/include/SDL3/ \
SDL_LIBRARY_PATH=/usr/local/lib SDL_LIBRARIES=-lSDL3
export LD_LIBRARY_PATH=/usr/local/lib # libSDL3.so is located here On MinGW, I used the following command to compile on Windows. make PLATFORM=PLATFORM_DESKTOP_SDL \
SDL_INCLUDE_PATH="$HOME/.local/include/SDL3/" EXTRA_INCLUDE_PATHS="-I$HOME/.local/include/" \
SDL_LIBRARY_PATH=$HOME/.local/lib SDL_LIBRARIES=-lSDL3 We need to be aware that when compiling raylib with SDL3 on Windows, there is currently a chance of getting corrupted bitmaps from the clipboard in SDL3 version 3.1.6. I've opened a PR about this issue, and it has been added as a milestone for SDL 3.2. It might be important to say that compiling SDL3 statically with raylib create's name colision now, because of these Matrix functions. It's still possible do compile statically if we use RGFW & GLFWI followed your advice and created a header-only library in FinallyIf this approach is proper, I can continue working on the Quick example to test it#include "raylib.h"
int main(int argc, char *argv[])
{
InitWindow(800, 450, "[core] raylib clipboard image");
SetTraceLogLevel(LOG_TRACE);
SetTargetFPS(60);
Image img = {0};
Texture tex = {0};
while(!WindowShouldClose())
{
if (IsKeyDown(KEY_LEFT_CONTROL) && IsKeyPressed(KEY_V))
{
img = GetClipboardImage();
tex = LoadTextureFromImage(img);
if(!IsTextureValid(tex))
{
TraceLog(LOG_WARNING, "Could not get clipboard image");
}
}
BeginDrawing();
ClearBackground(RAYWHITE);
if (IsTextureValid(tex))
{
DrawTexture(tex, 0, 10 + 21, WHITE);
}
DrawText("Print Screen and Crtl+V", 10, 10, 21, BLACK);
EndDrawing();
}
} |
@evertonse Thank you very much for all the work put into this improvement! It's a quite big PR containing many improvements; probably SDL3 support should be moved to a separate PR, but still, it looks clean and organized so it would be ok. @ColleagueRiley could probably take a look to the
Sure, that would be fantastic. Please, let me know if you plan any further work on this PR or I can merge it. |
…n index as in SDL2
@raysan5 It's all good now, you can merge it. |
@evertonse thanks for this great improvement!!! |
This breaks building on Windows when |
@Not-Nik I can't reproduce, what configuration do you mean? |
System is
and the error I get reads
|
We can turn that #error into #warning and make it compile (file Basically means one of these are not defined in the CUSTOMIZED build: |
The issue was more that I didn't enable |
And they are, on For now I just made it into a warning in this PR |
* [rcore] add 'GetClipboardImage' for windows * [rcore] GetClipboardImage removed some unneeded defines * [rcore] PLATFORM_SDL: create a compatility layer for SDL3 * external: add win32_clipboard.h header only lib * [rcore] using win32_clipboard on platforms rlfw and rgfw * [rcore] fix warnings in SDL3 compatibility layer * Makefile: Allow specifying SDL_LIBRARIES to link, this helps with SDL3 * Makefile: examples makefile now compile others/rlgl_standalone only when TARGET_PLATFORM is PLATFORM_DESKTOP_GFLW * Makefile: examples makefile now compile others/rlgl_standalone only when TARGET_PLATFORM is PLATFORM_DESKTOP_GFLW * [rcore]: PLATFORM_SDL: improve clipboard data retrieval * external: remove unused function from win32_clipboard.h * Makefile: allow for extra flags necessary when compiling for SDL3 * [rcore]: fix string typo * [rcore]: Properly handle NULL dpi passing. As is allowed in SDL2 * external: fix arch finding on win32_clipboard.h to allow compilation on msvc cmake CI * [rcore]: PLATFORM_SDL: Treat monitor as an ID in SDL3 as opposed to an index as in SDL2 * [rcore]: typo
[rcore] Clipboard Image
Overview
I've implemented a small start for Clipboard Image functionality for raylib. The implementation is only for desktop Windows OS and it's only
GetClipboardImage
. I want to implementSetClipboardImage
, but I need to know a few things first regarding whether my approach is proper for the project.2024-11-01.15-47-40.mp4
You'll see I created
rcore_clipboard_win32
that implements this from scracth using winapi.We can question "Why not use already implemented clipboard functions from platform abstractions such as GLFW, SDL, and RGFW and adpated to our needs?" Because they either did not implement it, or it is only available on the bleeding edge (SDL3).
From what I've seen, SDL has clipboard image support but only since SDL 3.1.3 SDL_clipboard.h from SDL3. In that case, I check for the major and minor version and implement using SDL functions; otherwise, it just returns
NULL
(I could add a warning or implement usingrcore_clipboard_win32
). Also, SDL3 has a migration section, so I'm not even sure that the current raylib SDL platform is suited for SDL3. Just to double-check, there's noSDL_GetClipboardData
in SDL2 SDL_clipboard.h from SDL2.RGFW only supports clipboard Unicode text from what I could see: RGFW.h - Line 643.
GLFW is still in the process of implementing clipboard image functionality: GLFW Pull Request #2385.
How it is structured
In this PR, works like this: if we detect that the platform is either GLFW or RGFW and we're on Windows, then we include
rcore_clipboard_win32.c
. The filercore_clipboard_win32.c
went the route of definingwindgi.h
structs that are needed, taking care of any name collisions.Takeaway
What I'm thinking is that when clipboard image manipulation becomes a stable feature for GLFW, we can easily add it to
rcore_desktop_glfw
. But for platforms that don't support it (such as SDL2, RGFW, and current GLFW) we could have "utils" platform functions such asGetClipboardImage
(next would beSetClipboardImage
) implemented seperatly such as in this PR.Concerns
Another thing to add is that now it couples
rcore
andrtexture
by theImage
struct and theLoadImageFromMemory
function. Furthermore, it is required to haveSUPPORT_FILEFORMAT_BMP
enabled.Finally, the whole implementation is behind the flag
SUPPORT_CLIPBOARD_IMAGE
, which in this branch I've enabled by default inconfig.h
.I've added
core_clipboard_image
example to make it easy to check it out (it doesn't have to be permanent, also it hasn't updated its related files besides the examplesMakefile
)This is kind of a draft. Sorry for the wall of text, I just tought it was important to share this to aid your decision and allow further development.
Update comment