Merge branch 'blender-v3.6-release'
This commit is contained in:
@@ -94,6 +94,9 @@ void txt_sel_clear(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);
|
||||
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)
|
||||
ATTR_NONNULL(1, 2);
|
||||
void txt_split_curline(struct Text *text);
|
||||
|
||||
@@ -1051,7 +1051,8 @@ static int paste_text_exec(bContext *C, wmOperator *op)
|
||||
int len;
|
||||
} 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) {
|
||||
return OPERATOR_CANCELLED;
|
||||
|
||||
@@ -2435,19 +2435,21 @@ static void ui_apply_but(
|
||||
/** \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 */
|
||||
int length;
|
||||
char *text = WM_clipboard_text_get_firstline(false, &length);
|
||||
char *text = WM_clipboard_text_get_firstline(false, ensure_utf8, &length);
|
||||
|
||||
if (text) {
|
||||
*buf_paste = text;
|
||||
*buf_len = length;
|
||||
*r_buf_paste = text;
|
||||
*r_buf_len = length;
|
||||
}
|
||||
else {
|
||||
*buf_paste = static_cast<char *>(MEM_callocN(sizeof(char), __func__));
|
||||
*buf_len = 0;
|
||||
*r_buf_paste = static_cast<char *>(MEM_callocN(sizeof(char), __func__));
|
||||
*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;
|
||||
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);
|
||||
|
||||
@@ -3310,13 +3312,9 @@ static bool ui_textedit_copypaste(uiBut *but, uiHandleButtonData *data, const in
|
||||
if (mode == UI_TEXTEDIT_PASTE) {
|
||||
/* extract the first line from the clipboard */
|
||||
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 (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);
|
||||
|
||||
changed = true;
|
||||
@@ -3508,9 +3506,12 @@ static void ui_textedit_end(bContext *C, uiBut *but, uiHandleButtonData *data)
|
||||
if (but) {
|
||||
if (UI_but_is_utf8(but)) {
|
||||
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) {
|
||||
/* 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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1064,7 +1064,7 @@ static int console_paste_exec(bContext *C, wmOperator *op)
|
||||
ConsoleLine *ci = console_history_verify(C);
|
||||
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;
|
||||
|
||||
if (buf_str == NULL) {
|
||||
|
||||
@@ -923,7 +923,8 @@ static int text_paste_exec(bContext *C, wmOperator *op)
|
||||
char *buf;
|
||||
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) {
|
||||
return OPERATOR_CANCELLED;
|
||||
|
||||
@@ -506,7 +506,7 @@ bool handleNumInput(bContext *C, NumInput *n, const wmEvent *event)
|
||||
if (event->modifier & KM_CTRL) {
|
||||
/* extract the first line from the clipboard */
|
||||
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) {
|
||||
const bool success = editstr_insert_at_cursor(n, pbuf, pbuf_len);
|
||||
|
||||
@@ -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))
|
||||
{
|
||||
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);
|
||||
if (text != NULL) {
|
||||
MEM_freeN(text);
|
||||
|
||||
@@ -1624,14 +1624,15 @@ void WM_job_main_thread_lock_release(struct wmJob *job);
|
||||
|
||||
/**
|
||||
* Return text from the clipboard.
|
||||
*
|
||||
* \note Caller needs to check for valid utf8 if this is a requirement.
|
||||
* \param selection: Use the "primary" clipboard, see: #WM_CAPABILITY_PRIMARY_CLIPBOARD.
|
||||
* \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.
|
||||
*/
|
||||
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);
|
||||
|
||||
/**
|
||||
|
||||
@@ -1983,7 +1983,10 @@ void WM_event_remove_timer_notifier(wmWindowManager *wm, wmWindow *win, wmTimer
|
||||
/** \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) {
|
||||
*r_len = 0;
|
||||
@@ -1996,8 +1999,18 @@ static char *wm_clipboard_text_get_ex(bool selection, int *r_len, bool firstline
|
||||
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 */
|
||||
char *newbuf = MEM_mallocN(strlen(buf) + 1, __func__);
|
||||
char *newbuf = MEM_mallocN(buf_len + 1, __func__);
|
||||
char *p2 = newbuf;
|
||||
|
||||
if (firstline) {
|
||||
@@ -2028,14 +2041,14 @@ static char *wm_clipboard_text_get_ex(bool selection, int *r_len, bool firstline
|
||||
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)
|
||||
|
||||
Reference in New Issue
Block a user