From 50983eac06cfa0d3e4c75d54a178f25e81b5db7d Mon Sep 17 00:00:00 2001 From: Arnav Bhatt Date: Thu, 20 Jun 2024 02:31:25 +0530 Subject: [PATCH] add clipboard support Signed-off-by: Arnav Bhatt --- Makefile | 2 +- src/video/kolibri/SDL_kolibriclipboard.c | 60 ++++++++++++++++++++++++ src/video/kolibri/SDL_kolibriclipboard.h | 11 +++++ src/video/kolibri/SDL_kolibrivideo.c | 6 +++ 4 files changed, 78 insertions(+), 1 deletion(-) create mode 100644 src/video/kolibri/SDL_kolibriclipboard.c create mode 100644 src/video/kolibri/SDL_kolibriclipboard.h diff --git a/Makefile b/Makefile index af1ccf9..6d335ea 100755 --- a/Makefile +++ b/Makefile @@ -82,7 +82,7 @@ video_OBJS = src/video/SDL_blit_0.o src/video/SDL_blit_1.o src/video/SDL_blit_A. src/video/yuv2rgb/yuv_rgb_sse.o src/video/yuv2rgb/yuv_rgb_std.o \ src/video/kolibri/SDL_kolibrievents.o src/video/kolibri/SDL_kolibriframebuffer.o \ src/video/kolibri/SDL_kolibrivideo.o src/video/kolibri/SDL_kolibriwindow.o \ - src/video/kolibri/SDL_kolibrimouse.o + src/video/kolibri/SDL_kolibrimouse.o src/video/kolibri/SDL_kolibriclipboard.o curr_OBJS = src/SDL_assert.o src/SDL_dataqueue.o src/SDL_error.o src/SDL_guid.o \ src/SDL_hints.o src/SDL_list.o src/SDL_log.o src/SDL_utils.o src/SDL.o diff --git a/src/video/kolibri/SDL_kolibriclipboard.c b/src/video/kolibri/SDL_kolibriclipboard.c new file mode 100644 index 0000000..f4b338f --- /dev/null +++ b/src/video/kolibri/SDL_kolibriclipboard.c @@ -0,0 +1,60 @@ + +#include "../../SDL_internal.h" + +#ifdef SDL_VIDEO_DRIVER_KOLIBRI + +#include + +#define string_length(x) SDL_strlen(x) + 1 + +#include "../SDL_sysvideo.h" + +char *KOLIBRI_GetClipboardText(_THIS) +{ + int clip_num = _ksys_clip_num(); + char *clip_buf, *result; + + if (clip_num > 0) { + clip_buf = _ksys_clip_get(clip_num - 1); + if ((int)*clip_buf > 0 && (int)*(clip_buf + 4) == KSYS_CLIP_TEXT && ((int)*(clip_buf + 8) == KSYS_CLIP_CP866)) { + char *clip_text = clip_buf + 12; + + result = SDL_calloc((int)*clip_buf, sizeof(char)); + SDL_strlcpy(result, clip_text, (int)*clip_buf); + _ksys_free(clip_buf); + } + } + if (!result) + result = SDL_strdup(""); + + return result; +} + +int KOLIBRI_SetClipboardText(_THIS, const char *text) +{ + char *temp_buffer = SDL_calloc(string_length(text) + 12, sizeof(char)); + + *temp_buffer = string_length(text); + *(temp_buffer + 4) = KSYS_CLIP_TEXT; + *(temp_buffer + 8) = KSYS_CLIP_CP866; + + SDL_strlcpy(temp_buffer + 12, text, string_length(text)); + _ksys_clip_set(string_length(text) + 12, temp_buffer); + SDL_free(temp_buffer); + + return 0; +} + +SDL_bool KOLIBRI_HasClipboardText(_THIS) +{ + SDL_bool result = SDL_FALSE; + char *text = KOLIBRI_GetClipboardText(_this); + if (text) { + result = text[0] != '\0' ? SDL_TRUE : SDL_FALSE; + SDL_free(text); + } + + return result; +} + +#endif diff --git a/src/video/kolibri/SDL_kolibriclipboard.h b/src/video/kolibri/SDL_kolibriclipboard.h new file mode 100644 index 0000000..82834e0 --- /dev/null +++ b/src/video/kolibri/SDL_kolibriclipboard.h @@ -0,0 +1,11 @@ + +#include "../../SDL_internal.h" + +#ifndef SDL_kolibriclipboard_h_ +#define SDL_kolibriclipboard_h_ + +extern char *KOLIBRI_GetClipboardText(_THIS); +extern int KOLIBRI_SetClipboardText(_THIS, const char *text); +extern SDL_bool KOLIBRI_HasClipboardText(_THIS); + +#endif diff --git a/src/video/kolibri/SDL_kolibrivideo.c b/src/video/kolibri/SDL_kolibrivideo.c index 751abc4..c4d2415 100644 --- a/src/video/kolibri/SDL_kolibrivideo.c +++ b/src/video/kolibri/SDL_kolibrivideo.c @@ -10,6 +10,7 @@ #include "../SDL_sysvideo.h" #include "SDL_video.h" +#include "SDL_kolibriclipboard.h" #include "SDL_kolibrievents.h" #include "SDL_kolibriframebuffer.h" #include "SDL_kolibrimouse.h" @@ -95,6 +96,11 @@ static SDL_VideoDevice *KOLIBRI_CreateDevice(void) device->SetWindowTitle = KOLIBRI_SetWindowTitle; device->DestroyWindow = KOLIBRI_DestroyWindow; + /* Clipboard */ + device->HasClipboardText = KOLIBRI_HasClipboardText; + device->GetClipboardText = KOLIBRI_GetClipboardText; + device->SetClipboardText = KOLIBRI_SetClipboardText; + /* KolibriOS specific data */ device->driverdata = data;