25#include <glibmm/i18n.h>
26#include <glibmm/main.h>
27#include <glibmm/regex.h>
28#include <gdk/gdkkeysyms.h>
29#include <gdkmm/clipboard.h>
30#include <gtkmm/settings.h>
31#include <gtkmm/window.h>
75 Gtk::Settings::get_default()->get_property(
"gtk-cursor-blink-time",
blink_time);
83 cursor->set_stroke(0x000000ff);
84 cursor->set_visible(
false);
95 frame->set_stroke(0x0000ff7f);
96 frame->set_visible(
false);
106 imc = gtk_im_multicontext_new();
116 gtk_im_context_set_use_preedit(
imc, FALSE);
117 gtk_im_context_set_client_widget(
imc, canvas->Gtk::Widget::gobj());
120 focus_in_conn = canvas->connectFocusIn([
this] { gtk_im_context_focus_in(
imc); });
121 focus_out_conn = canvas->connectFocusOut([
this] { gtk_im_context_focus_out(
imc); });
122 g_signal_connect(G_OBJECT(
imc),
"commit", Util::make_g_callback<&TextTool::_commit>,
this);
124 if (canvas->has_focus()) {
125 gtk_im_context_focus_in(
imc);
132 if (is<SPFlowtext>(
item) || is<SPText>(
item)) {
152 if (prefs->getBool(
"/tools/text/selcue")) {
155 if (prefs->getBool(
"/tools/text/gradientdrag")) {
168 g_object_unref(G_OBJECT(
imc));
193 if (event.button != 1) {
196 auto const n_press = event.num_press % 3;
202 if (is<SPText>(item_ungrouped) || is<SPFlowtext>(item_ungrouped)) {
280 auto text_item = cast<SPItem>(
currentLayer()->appendChildRepr(rtext));
287 text_item->updateRepr();
288 text_item->doWriteTransform(text_item->transform,
nullptr,
true);
300 assert(!
uni.empty());
303 std::stringstream ss;
304 ss << std::hex <<
uni;
308 if (!g_unichar_isprint(
static_cast<gunichar>(uv))
309 && !(g_unichar_validate(
static_cast<gunichar>(uv)) && g_unichar_type(
static_cast<gunichar>(uv)) == G_UNICODE_PRIVATE_USE))
320 auto const len = g_unichar_to_utf8(uv, u);
333 std::stringstream ss;
334 ss << std::hex << ehex;
336 if (!g_unichar_isprint(
static_cast<gunichar>(uv))) {
339 auto const len = g_unichar_to_utf8(uv, utf8);
350 if (utf8[1] ==
'\0') {
352 case '<': strcpy(utf8,
"<");
break;
353 case '>': strcpy(utf8,
">");
break;
354 case '&': strcpy(utf8,
"&");
break;
359 _(
"Unicode (<b>Enter</b> to finish): %s: %s"),
uni.c_str(), utf8);
376 tolerance = prefs->getIntLimited(
"/options/dragtolerance/value", 0, 0, 100);
382 if (event.button != 1 || event.num_press != 1) {
427 auto const diff = p -
p0;
454 if (!layout->isStartOfWord(new_end)) {
455 new_end.prevStartOfWord();
457 }
else if (!layout->isEndOfWord(new_end)) {
458 new_end.nextEndOfWord();
463 new_end.thisStartOfLine();
465 new_end.thisEndOfLine();
480 if (is<SPText>(item_ungrouped) || is<SPFlowtext>(item_ungrouped)) {
482 if (layout->inputTruncated()) {
487 auto const ibbox = item_ungrouped->desktopVisualBounds();
495 if (is<SPText>(item_ungrouped)) {
498 _(
"<b>Click</b> to edit the text, <b>drag</b> to select part of the text."));
502 _(
"<b>Click</b> to edit the flowed text, <b>drag</b> to select part of the text."));
514 if (event.button != 1) {
541 auto const cursor_size =
Geom::Point(0, y_dir * cursor_height);
542 cursor->set_coords(p1, p1 - cursor_size);
546 GdkRectangle im_cursor;
551 im_cursor.x = std::floor(im_rect.
left());
552 im_cursor.y = std::floor(im_rect.
top());
553 im_cursor.width = std::floor(im_rect.
width());
554 im_cursor.height = std::floor(im_rect.
height());
555 gtk_im_context_set_cursor_location(
imc, &im_cursor);
562 if (std::abs(p1.y() -
p0.
y()) > cursor_height) {
565 if (prefs->getBool(
"/tools/text/use_svg2",
true)) {
590 if (group0_keyval == GDK_KEY_KP_Add || group0_keyval == GDK_KEY_KP_Subtract) {
591 if (!(event.
modifiers & GDK_CONTROL_MASK)) {
602 && (group0_keyval == GDK_KEY_U || group0_keyval == GDK_KEY_u);
605 if (
unimode || !
imc || preedit_activation || !gtk_im_context_filter_key(
imc,
true,
surface,
const_cast<GdkDevice*
>(event.
device->gobj()), event.time, event.keycode, (GdkModifierType)event.
modifiers, event.group)) {
616 switch (group0_keyval) {
618 case GDK_KEY_KP_Space: {
628 case GDK_KEY_BackSpace: {
638 case GDK_KEY_KP_Enter: {
649 case GDK_KEY_Escape: {
652 gtk_im_context_reset(
imc);
658 case GDK_KEY_Shift_L:
659 case GDK_KEY_Shift_R:
663 auto const xdigit = gdk_keyval_to_unicode(group0_keyval);
664 if (xdigit <= 255 && g_ascii_isxdigit(xdigit)) {
665 uni.push_back(xdigit);
666 if (
uni.length() == 8) {
692 bool cursor_moved =
false;
697 screenlines =
static_cast<int>(std::floor(d.
height() / spacing)) - 1;
698 screenlines = std::max(screenlines, 1);
702 switch (group0_keyval) {
739 gtk_im_context_reset(
imc);
750 const auto weight =
static_cast<int>(style->font_weight.computed);
802 case GDK_KEY_KP_Enter: {
808 auto text_element = cast<SPText>(
text);
809 if (text_element && (text_element->has_shape_inside() || text_element->has_inline_size())) {
826 case GDK_KEY_BackSpace:
829 bool noSelection =
false;
869 case GDK_KEY_KP_Delete:
871 bool noSelection =
false;
907 case GDK_KEY_KP_Left:
933 case GDK_KEY_KP_Right:
985 case GDK_KEY_KP_Down:
1004 cursor_moved =
true;
1011 case GDK_KEY_KP_Home:
1018 cursor_moved =
true;
1024 case GDK_KEY_KP_End:
1031 cursor_moved =
true;
1036 case GDK_KEY_Page_Down:
1037 case GDK_KEY_KP_Page_Down:
1040 cursor_moved =
true;
1045 case GDK_KEY_Page_Up:
1046 case GDK_KEY_KP_Page_Up:
1049 cursor_moved =
true;
1054 case GDK_KEY_Escape:
1065 case GDK_KEY_bracketleft:
1086 case GDK_KEY_bracketright:
1133 case GDK_KEY_greater:
1134 case GDK_KEY_period:
1178 if ((group0_keyval == GDK_KEY_Up ||
1179 group0_keyval == GDK_KEY_Down ||
1180 group0_keyval == GDK_KEY_KP_Up ||
1181 group0_keyval == GDK_KEY_KP_Down )
1185 }
else if (group0_keyval == GDK_KEY_Escape) {
1191 }
else if ((group0_keyval == GDK_KEY_x || group0_keyval == GDK_KEY_X) &&
mod_alt_only(event)) {
1199 if (!
unimode &&
imc && gtk_im_context_filter_key(
imc,
false,
surface,
const_cast<GdkDevice*
>(event.
device->gobj()), event.time, event.keycode, (GdkModifierType)event.
modifiers, event.group)) {
1217 if (!clip_text.empty()) {
1219 bool is_svg2 =
false;
1220 auto const textitem = cast<SPText>(
text);
1222 is_svg2 = textitem->has_shape_inside() ;
1223 textitem->hide_shape_inside();
1226 auto const flowtext = cast<SPFlowtext>(
text);
1228 flowtext->fix_overflow_flowregion(
false);
1237 auto txt = clip_text;
1239 for (
auto itr = txt.begin(); itr != txt.end(); ) {
1240 auto const paste_string_uchar = *itr;
1245 if (paste_string_uchar >= 0x00000020 ||
1246 paste_string_uchar == 0x00000009 ||
1247 paste_string_uchar == 0x0000000A ||
1248 paste_string_uchar == 0x0000000D)
1252 itr = txt.erase(itr);
1262 Glib::ustring::size_type begin = 0;
1264 auto const end = txt.find(
'\n', begin);
1266 if (
end == Glib::ustring::npos || is_svg2) {
1268 if (begin != txt.length()) {
1280 textitem->show_shape_inside();
1283 flowtext->fix_overflow_flowregion(
true);
1356 g_assert(selection);
1365 if (is<SPText>(
item) || is<SPFlowtext>(
item)) {
1405 if (
auto sptext = cast<SPText>(
text)) {
1406 sptext->rebuildLayout();
1407 sptext->updateRepr();
1437 if (begin_it == end_it) {
1443 std::vector<SPItem*> styles_list;
1446 layout->getSourceOfCharacter(it, &pos_obj);
1454 if (is<SPString>(pos_obj)) {
1455 pos_obj = pos_obj->
parent;
1457 styles_list.emplace_back(cast_unsafe<SPItem>(pos_obj));
1459 std::reverse(styles_list.begin(), styles_list.end());
1484 cursor->set_stroke(0x000000ff);
1485 cursor->set_visible(
true);
1498 if (scroll_to_see) {
1503 if (
auto sptext = cast<SPText>(
text)) {
1508 }
else if (
auto spflowtext = cast<SPFlowtext>(
text)) {
1527 cursor->set_coords(d0, d1);
1532 GdkRectangle im_cursor = { 0, 0, 1, 1 };
1537 im_cursor.x = std::floor(im_rect.
left());
1538 im_cursor.y = std::floor(im_rect.
top());
1539 im_cursor.width = std::floor(im_rect.
width());
1540 im_cursor.height = std::floor(im_rect.
height());
1541 gtk_im_context_set_cursor_location(
imc, &im_cursor);
1545 int const nChars = layout->iteratorToCharIndex(layout->end());
1546 char const *edit_message = ngettext(
"Type or edit text (%d character%s); <b>Enter</b> to start new line.",
"Type or edit text (%d characters%s); <b>Enter</b> to start new line.", nChars);
1547 char const *edit_message_flowed = ngettext(
"Type or edit flowed text (%d character%s); <b>Enter</b> to start new paragraph.",
"Type or edit flowed text (%d characters%s); <b>Enter</b> to start new paragraph.", nChars);
1548 bool truncated = layout->inputTruncated();
1549 char const *trunc = truncated ? _(
" [truncated]") :
"";
1552 frame->set_stroke(0xff0000ff);
1554 frame->set_stroke(0x0000ff7f);
1557 std::vector<SPItem const *> shapes;
1558 std::unique_ptr<Shape> exclusion_shape;
1559 double padding = 0.0;
1562 if (
auto spflowtext = cast<SPFlowtext>(
text)) {
1563 auto frame = spflowtext->get_frame(
nullptr);
1564 shapes.emplace_back(
frame);
1568 }
else if (
auto sptext = cast<SPText>(
text)) {
1571 shapes.push_back(href->getObject());
1579 exclusion_shape = sptext->getExclusionShape();
1584 if (
auto textpath = cast<SPTextPath>(&
child)) {
1593 for (
auto shape_item : shapes) {
1594 if (
auto shape = cast<SPShape>(shape_item)) {
1595 if (shape->curve()) {
1596 curve.append(shape->curve()->transformed(shape->transform));
1601 if (!
curve.is_empty()) {
1602 bool has_padding = std::abs(padding) > 1e-12;
1604 if (has_padding || exclusion_shape) {
1611 auto uncross = std::make_unique<Shape>();
1629 padded.
Fill(&sh, 0);
1633 auto copy = std::make_unique<Shape>();
1639 if (exclusion_shape && exclusion_shape->hasEdges()) {
1640 auto copy = std::make_unique<Shape>();
1645 uncross->ConvertToForme(&temp);
1655 frame->set_visible(
true);
1657 frame->set_visible(
false);
1662 cursor->set_visible(
false);
1663 frame->set_visible(
false);
1679 for (
int i = 0; i + 3 < quads.size(); i += 4) {
1680 auto quad = make_canvasitem<CanvasItemQuad>(
_desktop->
getCanvasControls(), quads[i], quads[i+1], quads[i+2], quads[i+3]);
1681 quad->set_fill(0x00777777);
1682 quad->set_visible(
true);
1700 cursor->set_stroke(0x000000ff);
1703 cursor->set_stroke(0xffffffff);
1706 cursor->set_visible(
true);
1768 if (other_text != tool.
textItem()) {
TODO: insert short description here.
TODO: insert short description here.
Callback converter for interfacing with C APIs.
Cairo::RefPtr< Cairo::ImageSurface > surface
Affine inverse() const
Compute the inverse matrix.
bool contains(CRect const &r) const
Check whether the rectangle includes all points in the given rectangle.
C top() const
Return top coordinate of the rectangle (+Y is downwards).
C left() const
Return leftmost coordinate of the rectangle (+X is to the right).
C height() const
Get the vertical extent of the rectangle.
C width() const
Get the horizontal extent of the rectangle.
Axis-aligned rectangle that can be empty.
Rect bounds() const
Axis-aligned bounding box.
Point corner(unsigned i) const
Two-dimensional point that doubles as a vector.
constexpr Coord y() const noexcept
constexpr Coord x() const noexcept
Axis aligned, non-empty rectangle.
static void done(SPDocument *document, Glib::ustring const &event_description, Glib::ustring const &undo_icon, unsigned int object_modified_tag=0)
static void maybeDone(SPDocument *document, const gchar *keyconst, Glib::ustring const &event_description, Glib::ustring const &undo_icon, unsigned int object_modified_tag=0)
void set(MessageType type, char const *message)
pushes a message on the stack, replacing our old message
void setF(MessageType type, char const *format,...) G_GNUC_PRINTF(3
pushes a message on the stack using prinf-style formatting, and replacing our old message
void clear()
removes our current message from the stack
MessageId flash(MessageType type, char const *message)
Temporarily pushes a message onto the stack.
void clear()
Unselects all selected objects.
SPItem * singleItem()
Returns a single selected item.
static Preferences * get()
Access the singleton Preferences object.
static Rubberband * get(SPDesktop *desktop)
void move(Geom::Point const &p)
The set of selected SPObjects for a given document and layer model.
void set(XML::Node *repr)
Set the selection to an XML node's SPObject.
sigc::connection connectModifiedFirst(sigc::slot< void(Selection *, unsigned)> slot)
Similar to connectModified, but will be run first.
sigc::connection connectChangedFirst(sigc::slot< void(Selection *)> slot)
Similar to connectChanged, but will be run first.
Class to store data for points which are snap candidates, either as a source or as a target.
Holds a position within the glyph output of Layout.
bool cursorLeftWithControl()
bool nextCursorPosition()
bool cursorDownWithControl()
bool cursorRightWithControl()
bool prevCursorPosition()
bool cursorUpWithControl()
void set_item(SPItem *item)
void unset_item(bool keep_knotholder=false)
bool has_knotholder() const
std::unique_ptr< KnotHolder > knotholder
int _styleQueried(SPStyle *style, int property)
Text::Layout::iterator text_sel_end
sigc::scoped_connection focus_in_conn
CanvasItemPtr< CanvasItemRect > indicator
TextTool(SPDesktop *desktop)
SPItem * textItem() const
sigc::scoped_connection sel_modified_connection
void placeCursor(SPObject *text, Text::Layout::iterator where)
CanvasItemPtr< CanvasItemBpath > frame
sigc::scoped_connection focus_out_conn
void _selectionChanged(Selection *selection)
sigc::scoped_connection sel_changed_connection
sigc::scoped_connection blink_conn
std::vector< CanvasItemPtr< CanvasItemQuad > > text_selection_quads
CanvasItemPtr< CanvasItemCurve > cursor
void _updateCursor(bool scroll_to_see=true)
bool deleteSelection()
Deletes the currently selected characters.
void _updateTextSelection()
bool root_handler(CanvasEvent const &event) override
CanvasItemPtr< CanvasItemBpath > padding_frame
void _validateCursorIterators()
bool _styleSet(SPCSSAttr const *css)
sigc::scoped_connection style_query_connection
void _insertUnichar()
Insert the character indicated by uni to replace the current selection, and reset uni to empty string...
bool pasteInline(Glib::ustring const clip_text)
Attempts to paste system clipboard into the currently edited text, returns true on success.
Text::Layout::iterator text_sel_start
void _selectionModified(Selection *selection, unsigned flags)
void _commit(GtkIMContext *imc, char *string)
sigc::scoped_connection style_set_connection
bool item_handler(SPItem *item, CanvasEvent const &event) override
Handles item specific events.
void placeCursorAt(SPObject *text, Geom::Point const &p)
Interface for refcounted XML nodes.
virtual void addChild(Node *child, Node *after)=0
Insert another node as a child of this node.
void setAttribute(Util::const_char_ptr key, Util::const_char_ptr value)
Change an attribute of this node.
bool setAttributeSvgDouble(Util::const_char_ptr key, double val)
For attributes where an exponent is allowed.
Path and its polyline approximation.
void ConvertWithBackData(double threshhold, bool relative=false)
Creates a polyline approximation of the path.
void Fill(Shape *dest, int pathID=-1, bool justAdd=false, bool closeIfNeeded=true, bool invert=false)
Fills the shape with the polyline approximation stored in this object.
void LoadPathVector(Geom::PathVector const &pv, Geom::Affine const &tr, bool doTransformation)
Load a lib2geom Geom::PathVector in this path object.
Geom::PathVector MakePathVector() const
Create a lib2geom Geom::PathVector from this Path object.
void Outline(Path *dest, double width, JoinType join, ButtType butt, double miter)
Wrapper around a Geom::PathVector object.
To do: update description of desktop.
Inkscape::UI::Widget::Canvas * getCanvas() const
Geom::Point current_center() const
Geom::Parallelogram get_display_area() const
Return canvas viewbox in desktop coordinates.
Inkscape::CanvasItemGroup * getCanvasControls() const
SPDocument * getDocument() const
void emit_text_cursor_moved(Inkscape::UI::Tools::TextTool *tool)
void setToolboxFocusTo(char const *label)
InkscapeWindow const * getInkscapeWindow() const
Inkscape::MessageStack * messageStack() const
sigc::connection connectQueryStyle(F &&slot)
Geom::Affine const & dt2doc() const
Geom::Affine const & d2w() const
Transformation from desktop to window coordinates.
SPItem * getItemAtPoint(Geom::Point const &p, bool into_groups, SPItem *upto=nullptr) const
SPNamedView * getNamedView() const
Inkscape::Selection * getSelection() const
Inkscape::UI::Tools::ToolBase * getTool() const
sigc::connection connectSetStyle(F &&slot)
bool scroll_to_point(Geom::Point const &s_dt, double autoscrollspeed=0)
Scroll screen so as to keep point 'p' visible in window.
Geom::Affine const & w2d() const
Transformation from window to desktop coordinates (zoom/rotate).
Inkscape::XML::Document * getReprDoc()
Our Inkscape::XML::Document.
Base class for visual SVG elements.
Geom::Affine i2dt_affine() const
Returns the transformation from item to desktop coords.
Geom::Affine i2doc_affine() const
Returns the accumulated transformation of the item and all its ancestors, including root's viewport.
Inkscape::Util::Unit const * display_units
SPObject is an abstract base class of all of the document nodes at the SVG document level.
SPStyle * style
Represents the style properties, whether from presentation attributes, the style attribute,...
T< SPAttr::SHAPE_PADDING, SPILength > shape_padding
T< SPAttr::SHAPE_INSIDE, SPIShapes > shape_inside
SVG2 Text Wrapping.
T< SPAttr::SHAPE_SUBTRACT, SPIShapes > shape_subtract
A class to store/manipulate directed graphs.
int ConvertToShape(Shape *a, FillRule directed=fill_nonZero, bool invert=false)
Using a given fill rule, find all intersections in the shape given, create a new intersection free sh...
void setup(SPDesktop const *desktop, bool snapindicator=true, SPObject const *item_to_ignore=nullptr, std::vector< Inkscape::SnapCandidatePoint > *unselected_nodes=nullptr)
Convenience shortcut when there is only one item to ignore.
std::shared_ptr< Css const > css
double sp_desktop_get_font_size_tool(SPDesktop *desktop)
Returns the font size (in SVG pixels) of the text tool style (if text tool uses its own style) or des...
int sp_desktop_query_style_from_list(const std::vector< SPItem * > &list, SPStyle *style, int property)
Query the given list of objects for the given property, write the result to style,...
void sp_desktop_apply_style_tool(SPDesktop *desktop, Inkscape::XML::Node *repr, Glib::ustring const &tool_path, bool with_text)
Apply the desktop's current style or the tool style to repr.
Editable view implementation.
TODO: insert short description here.
Macro for icon names used in Inkscape.
Inkscape - An SVG editor.
Interface for locally managing a current status message.
Raw stack of active status messages.
SBasis L2(D2< SBasis > const &a, unsigned k)
static R & release(R &r)
Decrements the reference count of a anchored object.
bool mod_alt(unsigned modifiers)
void inspect_event(E &&event, Fs... funcs)
Perform pattern-matching on a CanvasEvent.
@ SNAPSOURCE_OTHER_HANDLE
bool mod_ctrl_only(unsigned modifiers)
bool mod_ctrl(unsigned modifiers)
bool mod_shift(unsigned modifiers)
bool mod_alt_only(unsigned modifiers)
void dump_event(CanvasEvent const &event, char const *prefix, bool merge=true)
Print an event to stdout.
constexpr bool DEBUG_EVENTS
Whether event debug printing is enabled.
bool have_viable_layer(SPDesktop *desktop, MessageContext *message)
Check to see if the current layer is both unhidden and unlocked.
void uncross(std::list< Point > &loop)
SPCSSAttr * sp_repr_css_attr_new()
Creates an empty SPCSSAttr (a class for manipulating CSS style properties).
void sp_repr_css_attr_unref(SPCSSAttr *css)
Unreferences an SPCSSAttr (will be garbage collected if no references remain).
void sp_repr_css_set_property(SPCSSAttr *css, gchar const *name, gchar const *value)
Set a style property to a new value (e.g.
SPCSSAttr * take_style_from_item(SPObject *object)
Inkscape::ShapeEditor This is a container class which contains a knotholder for shapes.
SPCSSAttr - interface for CSS Attributes.
SPItem * create_flowtext_with_internal_frame(SPDesktop *desktop, Geom::Point p0, Geom::Point p1)
TODO: insert short description here.
SPItem * create_text_with_rectangle(SPDesktop *desktop, Geom::Point p0, Geom::Point p1)
TODO: insert short description here.
SPItem * sp_textpath_get_path_item(SPTextPath const *tp)
Abstract base class for events.
unsigned modifiers
The modifiers mask immediately before the event.
std::shared_ptr< Gdk::Device const > device
The device that sourced the event. May be null.
Movement of the mouse pointer.
Interface for XML documents.
virtual Node * createTextNode(char const *content)=0
virtual Node * createElement(char const *name)=0
@ SP_CSS_FONT_STYLE_NORMAL
@ SP_CSS_FONT_WEIGHT_NORMAL
SPStyle - a style object for SPItem objects.
Inkscape::Text::Layout::iterator sp_te_insert_line(SPItem *item, Inkscape::Text::Layout::iterator &position)
inserts a new line break at the given position in a text or flowtext object.
SPObject const * sp_te_object_at_position(SPItem const *text, Inkscape::Text::Layout::iterator const &position)
Inkscape::Text::Layout::iterator sp_te_get_position_by_coords(SPItem const *item, Geom::Point const &i_p)
void sp_te_adjust_rotation(SPItem *text, Inkscape::Text::Layout::iterator const &start, Inkscape::Text::Layout::iterator const &end, SPDesktop *, gdouble degrees)
void sp_te_adjust_rotation_screen(SPItem *text, Inkscape::Text::Layout::iterator const &start, Inkscape::Text::Layout::iterator const &end, SPDesktop *desktop, gdouble pixels)
void sp_te_adjust_tspan_letterspacing_screen(SPItem *text, Inkscape::Text::Layout::iterator const &start, Inkscape::Text::Layout::iterator const &end, SPDesktop *desktop, gdouble by)
SPStyle const * sp_te_style_at_position(SPItem const *text, Inkscape::Text::Layout::iterator const &position)
double sp_te_get_average_linespacing(SPItem *text)
void sp_te_get_cursor_coords(SPItem const *item, Inkscape::Text::Layout::iterator const &position, Geom::Point &p0, Geom::Point &p1)
std::vector< Geom::Point > sp_te_create_selection_quads(SPItem const *item, Inkscape::Text::Layout::iterator const &start, Inkscape::Text::Layout::iterator const &end, Geom::Affine const &transform)
void sp_te_adjust_linespacing_screen(SPItem *text, Inkscape::Text::Layout::iterator const &, Inkscape::Text::Layout::iterator const &, SPDesktop *desktop, gdouble by)
Glib::ustring sp_te_get_string_multiline(SPItem const *text)
Gets a text-only representation of the given text or flowroot object, replacing line break elements w...
Inkscape::Text::Layout const * te_get_layout(SPItem const *item)
bool sp_te_delete(SPItem *item, Inkscape::Text::Layout::iterator const &start, Inkscape::Text::Layout::iterator const &end, iterator_pair &iter_pair)
void sp_te_apply_style(SPItem *text, Inkscape::Text::Layout::iterator const &start, Inkscape::Text::Layout::iterator const &end, SPCSSAttr const *css)
Applies the given CSS fragment to the characters of the given text or flowtext object between start a...
void sp_te_adjust_kerning_screen(SPItem *item, Inkscape::Text::Layout::iterator const &start, Inkscape::Text::Layout::iterator const &end, SPDesktop *desktop, Geom::Point by)
Inkscape::Text::Layout::iterator sp_te_replace(SPItem *item, Inkscape::Text::Layout::iterator const &start, Inkscape::Text::Layout::iterator const &end, gchar const *utf8)
Inkscape::Text::Layout::iterator sp_te_insert(SPItem *item, Inkscape::Text::Layout::iterator const &position, gchar const *utf8)
Inserts the given text into a text or flowroot object.
std::pair< Inkscape::Text::Layout::iterator, Inkscape::Text::Layout::iterator > iterator_pair
_GtkIMContext GtkIMContext