diff --git a/pd/nw/pdgui.js b/pd/nw/pdgui.js index f1c3ced7e0a76312dc0611481365c85de2137f65..d172ee900234dc5778b1ac7590106589c139a152 100644 --- a/pd/nw/pdgui.js +++ b/pd/nw/pdgui.js @@ -5735,15 +5735,25 @@ var skin = exports.skin = (function () { }; }()); -function select_text(cid, elem) { +function select_text(cid, elem, sel_start, sel_end) { var range, win = patchwin[cid].window; if (win.document.selection) { range = win.document.body.createTextRange(); range.moveToElementText(elem); + var len = elem.textContent.length, + ms = Math.max(Math.min(sel_start, len), 0), + me = Math.max(Math.min(sel_end, len), ms); + if(sel_start != -1) range.moveStart("character", ms); + if(sel_end != -1) range.moveEnd("character", me-len); range.select(); } else if (win.getSelection) { range = win.document.createRange(); range.selectNodeContents(elem); + var len = elem.textContent.length, + ms = Math.max(Math.min(sel_start, len), 0), + me = Math.max(Math.min(sel_end, len), ms); + if(sel_start != -1) range.setStart(elem.firstChild, ms); + if(sel_end != -1) range.setEnd(elem.firstChild, me); win.getSelection().removeAllRanges(); win.getSelection().addRange(range); } @@ -5832,7 +5842,7 @@ function shove_svg_background_data_into_css(w) { } function gui_textarea(cid, tag, type, x, y, width_spec, height_spec, text, - font_size, is_gop, state) { + font_size, is_gop, state, sel_start, sel_end) { var range, svg_view, p, gobj = get_gobj(cid, tag), zoom; gui(cid).get_nw_window(function(nw_win) { @@ -5909,7 +5919,7 @@ function gui_textarea(cid, tag, type, x, y, width_spec, height_spec, text, // append to doc body patchwin[cid].window.document.body.appendChild(p); p.focus(); - select_text(cid, p); + select_text(cid, p, sel_start, sel_end); if (state === 1) { patchwin[cid].window.canvas_events.text(); } else { diff --git a/pd/src/g_rtext.c b/pd/src/g_rtext.c index 8fcef1f34fae8c91a4e1a309d22b339c2ddd8fb4..87a2e463545a018a8dddfaa8b7bac39e9790a6b4 100644 --- a/pd/src/g_rtext.c +++ b/pd/src/g_rtext.c @@ -560,7 +560,8 @@ void rtext_select(t_rtext *x, int state) void rtext_activate(t_rtext *x, int state) { //fprintf(stderr,"rtext_activate state=%d\n", state); - int w = 0, h = 0, widthspec, heightspec, indx, isgop; + int w = 0, h = 0, widthspec, heightspec, indx, isgop, + selstart = -1, selend = -1; char *tmpbuf; t_glist *glist = x->x_glist; t_canvas *canvas = glist_getcanvas(glist); @@ -617,6 +618,13 @@ void rtext_activate(t_rtext *x, int state) isgop = 0; } + if(state & (0b1 << 31)) /* arbitray selection */ + { + selstart = (state >> 16) & 0x7FFF; + selend = state & 0xFFFF; + state = 1; // set to editing state + } + /* we need to get scroll to make sure we've got the correct bbox for the svg */ canvas_getscroll(glist_getcanvas(canvas)); @@ -627,7 +635,7 @@ void rtext_activate(t_rtext *x, int state) sprintf(tmpbuf, "%.*s", x->x_bufsize, x->x_buf); /* in case x_bufsize is 0... */ tmpbuf[x->x_bufsize] = '\0'; - gui_vmess("gui_textarea", "xssiiiisiii", + gui_vmess("gui_textarea", "xssiiiisiiiii", canvas, x->x_tag, (pd_class((t_pd *)x->x_text) == message_class ? "msg" : "obj"), @@ -638,7 +646,10 @@ void rtext_activate(t_rtext *x, int state) tmpbuf, sys_hostfontsize(glist_getfont(glist)), isgop, - state); + state, + selstart, + selend + ); freebytes(tmpbuf, x->x_bufsize + 1); }