Merge branch 'blender-v3.6-release'

This commit is contained in:
2023-05-19 12:53:53 +10:00
9 changed files with 50 additions and 29 deletions

View File

@@ -94,6 +94,9 @@ void txt_sel_clear(struct Text *text);
void txt_sel_line(struct Text *text); void txt_sel_line(struct Text *text);
void txt_sel_set(struct Text *text, int startl, int startc, int endl, int endc); void txt_sel_set(struct Text *text, int startl, int startc, int endl, int endc);
char *txt_sel_to_buf(const struct Text *text, size_t *r_buf_strlen); char *txt_sel_to_buf(const struct Text *text, size_t *r_buf_strlen);
/**
* \param in_buffer: UTF8 encoded text, invalid UTF8 byte-sequences are handled gracefully.
*/
void txt_insert_buf(struct Text *text, const char *in_buffer, int in_buffer_len) void txt_insert_buf(struct Text *text, const char *in_buffer, int in_buffer_len)
ATTR_NONNULL(1, 2); ATTR_NONNULL(1, 2);
void txt_split_curline(struct Text *text); void txt_split_curline(struct Text *text);

View File

@@ -1051,7 +1051,8 @@ static int paste_text_exec(bContext *C, wmOperator *op)
int len; int len;
} clipboard_system = {NULL}, clipboard_vfont = {NULL}; } clipboard_system = {NULL}, clipboard_vfont = {NULL};
clipboard_system.buf = WM_clipboard_text_get(selection, &clipboard_system.len); /* No need for UTF8 validation as the conversion handles invalid sequences gracefully. */
clipboard_system.buf = WM_clipboard_text_get(selection, false, &clipboard_system.len);
if (clipboard_system.buf == NULL) { if (clipboard_system.buf == NULL) {
return OPERATOR_CANCELLED; return OPERATOR_CANCELLED;

View File

@@ -2435,19 +2435,21 @@ static void ui_apply_but(
/** \name Button Copy & Paste /** \name Button Copy & Paste
* \{ */ * \{ */
static void ui_but_get_pasted_text_from_clipboard(char **buf_paste, int *buf_len) static void ui_but_get_pasted_text_from_clipboard(const bool ensure_utf8,
char **r_buf_paste,
int *r_buf_len)
{ {
/* get only first line even if the clipboard contains multiple lines */ /* get only first line even if the clipboard contains multiple lines */
int length; int length;
char *text = WM_clipboard_text_get_firstline(false, &length); char *text = WM_clipboard_text_get_firstline(false, ensure_utf8, &length);
if (text) { if (text) {
*buf_paste = text; *r_buf_paste = text;
*buf_len = length; *r_buf_len = length;
} }
else { else {
*buf_paste = static_cast<char *>(MEM_callocN(sizeof(char), __func__)); *r_buf_paste = static_cast<char *>(MEM_callocN(sizeof(char), __func__));
*buf_len = 0; *r_buf_len = 0;
} }
} }
@@ -2831,7 +2833,7 @@ static void ui_but_paste(bContext *C, uiBut *but, uiHandleButtonData *data, cons
int buf_paste_len = 0; int buf_paste_len = 0;
char *buf_paste; char *buf_paste;
ui_but_get_pasted_text_from_clipboard(&buf_paste, &buf_paste_len); ui_but_get_pasted_text_from_clipboard(UI_but_is_utf8(but), &buf_paste, &buf_paste_len);
const bool has_required_data = !(but->poin == nullptr && but->rnapoin.data == nullptr); const bool has_required_data = !(but->poin == nullptr && but->rnapoin.data == nullptr);
@@ -3310,13 +3312,9 @@ static bool ui_textedit_copypaste(uiBut *but, uiHandleButtonData *data, const in
if (mode == UI_TEXTEDIT_PASTE) { if (mode == UI_TEXTEDIT_PASTE) {
/* extract the first line from the clipboard */ /* extract the first line from the clipboard */
int buf_len; int buf_len;
char *pbuf = WM_clipboard_text_get_firstline(false, &buf_len); char *pbuf = WM_clipboard_text_get_firstline(false, UI_but_is_utf8(but), &buf_len);
if (pbuf) { if (pbuf) {
if (UI_but_is_utf8(but)) {
buf_len -= BLI_str_utf8_invalid_strip(pbuf, size_t(buf_len));
}
ui_textedit_insert_buf(but, data, pbuf, buf_len); ui_textedit_insert_buf(but, data, pbuf, buf_len);
changed = true; changed = true;
@@ -3508,9 +3506,12 @@ static void ui_textedit_end(bContext *C, uiBut *but, uiHandleButtonData *data)
if (but) { if (but) {
if (UI_but_is_utf8(but)) { if (UI_but_is_utf8(but)) {
const int strip = BLI_str_utf8_invalid_strip(but->editstr, strlen(but->editstr)); const int strip = BLI_str_utf8_invalid_strip(but->editstr, strlen(but->editstr));
/* not a file?, strip non utf-8 chars */ /* Strip non-UTF8 characters unless buttons support this.
* This should never happen as all text input should be valid UTF8,
* there is a small chance existing data contains invalid sequences.
* This could check could be made into an assertion if `but->editstr`
* is valid UTF8 when #ui_textedit_begin assigns the string. */
if (strip) { if (strip) {
/* won't happen often so isn't that annoying to keep it here for a while */
printf("%s: invalid utf8 - stripped chars %d\n", __func__, strip); printf("%s: invalid utf8 - stripped chars %d\n", __func__, strip);
} }
} }

View File

@@ -1064,7 +1064,7 @@ static int console_paste_exec(bContext *C, wmOperator *op)
ConsoleLine *ci = console_history_verify(C); ConsoleLine *ci = console_history_verify(C);
int buf_len; int buf_len;
char *buf_str = WM_clipboard_text_get(selection, &buf_len); char *buf_str = WM_clipboard_text_get(selection, true, &buf_len);
char *buf_step, *buf_next; char *buf_step, *buf_next;
if (buf_str == NULL) { if (buf_str == NULL) {

View File

@@ -923,7 +923,8 @@ static int text_paste_exec(bContext *C, wmOperator *op)
char *buf; char *buf;
int buf_len; int buf_len;
buf = WM_clipboard_text_get(selection, &buf_len); /* No need for UTF8 validation as the conversion handles invalid sequences gracefully. */
buf = WM_clipboard_text_get(selection, false, &buf_len);
if (!buf) { if (!buf) {
return OPERATOR_CANCELLED; return OPERATOR_CANCELLED;

View File

@@ -506,7 +506,7 @@ bool handleNumInput(bContext *C, NumInput *n, const wmEvent *event)
if (event->modifier & KM_CTRL) { if (event->modifier & KM_CTRL) {
/* extract the first line from the clipboard */ /* extract the first line from the clipboard */
int pbuf_len; int pbuf_len;
char *pbuf = WM_clipboard_text_get_firstline(false, &pbuf_len); char *pbuf = WM_clipboard_text_get_firstline(false, true, &pbuf_len);
if (pbuf) { if (pbuf) {
const bool success = editstr_insert_at_cursor(n, pbuf, pbuf_len); const bool success = editstr_insert_at_cursor(n, pbuf, pbuf_len);

View File

@@ -111,7 +111,8 @@ PyDoc_STRVAR(pyrna_WindowManager_clipboard_doc, "Clipboard text storage.\n\n:typ
static PyObject *pyrna_WindowManager_clipboard_get(PyObject *UNUSED(self), void *UNUSED(flag)) static PyObject *pyrna_WindowManager_clipboard_get(PyObject *UNUSED(self), void *UNUSED(flag))
{ {
int text_len = 0; int text_len = 0;
char *text = WM_clipboard_text_get(false, &text_len); /* No need for UTF8 validation as #PyC_UnicodeFromBytesAndSize handles invalid byte sequences. */
char *text = WM_clipboard_text_get(false, false, &text_len);
PyObject *result = PyC_UnicodeFromBytesAndSize(text ? text : "", text_len); PyObject *result = PyC_UnicodeFromBytesAndSize(text ? text : "", text_len);
if (text != NULL) { if (text != NULL) {
MEM_freeN(text); MEM_freeN(text);

View File

@@ -1624,14 +1624,15 @@ void WM_job_main_thread_lock_release(struct wmJob *job);
/** /**
* Return text from the clipboard. * Return text from the clipboard.
* * \param selection: Use the "primary" clipboard, see: #WM_CAPABILITY_PRIMARY_CLIPBOARD.
* \note Caller needs to check for valid utf8 if this is a requirement. * \param ensure_utf8: Ensure the resulting string does not contain invalid UTF8 encoding.
*/ */
char *WM_clipboard_text_get(bool selection, int *r_len); char *WM_clipboard_text_get(bool selection, bool ensure_utf8, int *r_len);
/** /**
* Convenience function for pasting to areas of Blender which don't support newlines. * Convenience function for pasting to areas of Blender which don't support newlines.
*/ */
char *WM_clipboard_text_get_firstline(bool selection, int *r_len); char *WM_clipboard_text_get_firstline(bool selection, bool ensure_utf8, int *r_len);
void WM_clipboard_text_set(const char *buf, bool selection); void WM_clipboard_text_set(const char *buf, bool selection);
/** /**

View File

@@ -1983,7 +1983,10 @@ void WM_event_remove_timer_notifier(wmWindowManager *wm, wmWindow *win, wmTimer
/** \name Clipboard /** \name Clipboard
* \{ */ * \{ */
static char *wm_clipboard_text_get_ex(bool selection, int *r_len, bool firstline) static char *wm_clipboard_text_get_ex(bool selection,
int *r_len,
const bool ensure_utf8,
const bool firstline)
{ {
if (G.background) { if (G.background) {
*r_len = 0; *r_len = 0;
@@ -1996,8 +1999,18 @@ static char *wm_clipboard_text_get_ex(bool selection, int *r_len, bool firstline
return NULL; return NULL;
} }
int buf_len = strlen(buf);
if (ensure_utf8) {
/* TODO(@ideasman42): It would be good if unexpected byte sequences could be interpreted
* instead of stripped - so mixed in characters (typically Latin1) aren't ignored.
* Check on how Python bytes this, see: #PyC_UnicodeFromBytesAndSize,
* there are clever ways to handle this although they increase the size of the buffer. */
buf_len -= BLI_str_utf8_invalid_strip(buf, buf_len);
}
/* always convert from \r\n to \n */ /* always convert from \r\n to \n */
char *newbuf = MEM_mallocN(strlen(buf) + 1, __func__); char *newbuf = MEM_mallocN(buf_len + 1, __func__);
char *p2 = newbuf; char *p2 = newbuf;
if (firstline) { if (firstline) {
@@ -2028,14 +2041,14 @@ static char *wm_clipboard_text_get_ex(bool selection, int *r_len, bool firstline
return newbuf; return newbuf;
} }
char *WM_clipboard_text_get(bool selection, int *r_len) char *WM_clipboard_text_get(bool selection, bool ensure_utf8, int *r_len)
{ {
return wm_clipboard_text_get_ex(selection, r_len, false); return wm_clipboard_text_get_ex(selection, r_len, ensure_utf8, false);
} }
char *WM_clipboard_text_get_firstline(bool selection, int *r_len) char *WM_clipboard_text_get_firstline(bool selection, bool ensure_utf8, int *r_len)
{ {
return wm_clipboard_text_get_ex(selection, r_len, true); return wm_clipboard_text_get_ex(selection, r_len, ensure_utf8, true);
} }
void WM_clipboard_text_set(const char *buf, bool selection) void WM_clipboard_text_set(const char *buf, bool selection)