X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Ftext-context.cpp;h=e969ffbfc74529a5158948c6a3fbf3cf5e452e49;hb=9778e170b43ef3ab1416d84092061ff7d29325e3;hp=9645887941f03889edf64ee5187a477040d74d24;hpb=e1c04043fc65d6a82f330792f86a140b3ed324ad;p=inkscape.git
diff --git a/src/text-context.cpp b/src/text-context.cpp
index 964588794..e969ffbfc 100644
--- a/src/text-context.cpp
+++ b/src/text-context.cpp
@@ -48,6 +48,7 @@
#include "rubberband.h"
#include "sp-metrics.h"
#include "context-fns.h"
+#include "verbs.h"
#include "text-editing.h"
@@ -289,6 +290,10 @@ sp_text_context_finish(SPEventContext *ec)
{
SPTextContext *tc = SP_TEXT_CONTEXT(ec);
+ if (ec->desktop) {
+ sp_signal_disconnect_by_data(sp_desktop_canvas(ec->desktop), tc);
+ }
+
ec->enableGrDrag(false);
tc->style_set_connection.disconnect();
@@ -329,10 +334,6 @@ sp_text_context_finish(SPEventContext *ec)
gtk_object_destroy(*it);
}
tc->text_selection_quads.clear();
-
- if (ec->desktop) {
- sp_signal_disconnect_by_data(sp_desktop_canvas(ec->desktop), tc);
- }
}
@@ -498,7 +499,8 @@ sp_text_context_setup_text(SPTextContext *tc)
Inkscape::GC::release(rtext);
text_item->transform = SP_ITEM(ec->desktop->currentRoot())->getRelativeTransform(ec->desktop->currentLayer());
text_item->updateRepr();
- sp_document_done(sp_desktop_document(ec->desktop));
+ sp_document_done(sp_desktop_document(ec->desktop), SP_VERB_CONTEXT_TEXT,
+ _("Create text"));
}
/**
@@ -536,7 +538,8 @@ insert_uni_char(SPTextContext *const tc)
tc->text_sel_start = tc->text_sel_end = sp_te_replace(tc->text, tc->text_sel_start, tc->text_sel_end, u);
sp_text_context_update_cursor(tc);
sp_text_context_update_text_selection(tc);
- sp_document_done(sp_desktop_document(tc->desktop));
+ sp_document_done(sp_desktop_document(tc->desktop), SP_VERB_DIALOG_TRANSFORM,
+ _("Insert Unicode character"));
}
}
@@ -571,9 +574,9 @@ show_curr_uni_char(SPTextContext *const tc)
}
}
tc->defaultMessageContext()->setF(Inkscape::NORMAL_MESSAGE,
- _("Unicode: %s: %s"), tc->uni, utf8);
+ _("Unicode (Enter to finish): %s: %s"), tc->uni, utf8);
} else {
- tc->defaultMessageContext()->set(Inkscape::NORMAL_MESSAGE, _("Unicode: "));
+ tc->defaultMessageContext()->set(Inkscape::NORMAL_MESSAGE, _("Unicode (Enter to finish): "));
}
}
@@ -694,7 +697,8 @@ sp_text_context_root_handler(SPEventContext *const ec, GdkEvent *const event)
SPItem *ft = create_flowtext_with_internal_frame (desktop, tc->p0, p1);
sp_desktop_selection(desktop)->set(ft);
ec->desktop->messageStack()->flash(Inkscape::NORMAL_MESSAGE, _("Flowed text is created."));
- sp_document_done(sp_desktop_document(desktop));
+ sp_document_done(sp_desktop_document(desktop), SP_VERB_CONTEXT_TEXT,
+ _("Create flowed text"));
} else {
ec->desktop->messageStack()->flash(Inkscape::ERROR_MESSAGE, _("The frame is too small for the current font size. Flowed text not created."));
}
@@ -805,6 +809,13 @@ sp_text_context_root_handler(SPEventContext *const ec, GdkEvent *const event)
/* Neither unimode nor IM consumed key; process text tool shortcuts */
switch (group0_keyval) {
+ case GDK_x:
+ case GDK_X:
+ if (MOD__ALT_ONLY) {
+ desktop->setToolboxFocusTo ("altx-text");
+ return TRUE;
+ }
+ break;
case GDK_space:
if (MOD__CTRL_ONLY) {
/* No-break space */
@@ -816,20 +827,21 @@ sp_text_context_root_handler(SPEventContext *const ec, GdkEvent *const event)
sp_text_context_update_cursor(tc);
sp_text_context_update_text_selection(tc);
ec->desktop->messageStack()->flash(Inkscape::NORMAL_MESSAGE, _("No-break space"));
- sp_document_done(sp_desktop_document(ec->desktop));
+ sp_document_done(sp_desktop_document(ec->desktop), SP_VERB_CONTEXT_TEXT,
+ _("Insert no-break space"));
return TRUE;
}
break;
case GDK_U:
case GDK_u:
- if (MOD__CTRL_ONLY) {
+ if (MOD__CTRL_ONLY || (MOD__CTRL && MOD__SHIFT)) {
if (tc->unimode) {
tc->unimode = false;
ec->defaultMessageContext()->clear();
} else {
tc->unimode = true;
tc->unipos = 0;
- ec->defaultMessageContext()->set(Inkscape::NORMAL_MESSAGE, _("Unicode: "));
+ ec->defaultMessageContext()->set(Inkscape::NORMAL_MESSAGE, _("Unicode (Enter to finish): "));
}
if (tc->imc) {
gtk_im_context_reset(tc->imc);
@@ -852,7 +864,8 @@ sp_text_context_root_handler(SPEventContext *const ec, GdkEvent *const event)
sp_repr_css_set_property(css, "font-weight", "normal");
sp_te_apply_style(tc->text, tc->text_sel_start, tc->text_sel_end, css);
sp_repr_css_attr_unref(css);
- sp_document_done(sp_desktop_document(ec->desktop));
+ sp_document_done(sp_desktop_document(ec->desktop), SP_VERB_CONTEXT_TEXT,
+ _("Make bold"));
sp_text_context_update_cursor(tc);
sp_text_context_update_text_selection(tc);
return TRUE;
@@ -869,7 +882,8 @@ sp_text_context_root_handler(SPEventContext *const ec, GdkEvent *const event)
sp_repr_css_set_property(css, "font-style", "normal");
sp_te_apply_style(tc->text, tc->text_sel_start, tc->text_sel_end, css);
sp_repr_css_attr_unref(css);
- sp_document_done(sp_desktop_document(ec->desktop));
+ sp_document_done(sp_desktop_document(ec->desktop), SP_VERB_CONTEXT_TEXT,
+ _("Make italic"));
sp_text_context_update_cursor(tc);
sp_text_context_update_text_selection(tc);
return TRUE;
@@ -900,7 +914,8 @@ sp_text_context_root_handler(SPEventContext *const ec, GdkEvent *const event)
tc->text_sel_start = tc->text_sel_end = sp_te_insert_line(tc->text, tc->text_sel_start);
sp_text_context_update_cursor(tc);
sp_text_context_update_text_selection(tc);
- sp_document_done(sp_desktop_document(ec->desktop));
+ sp_document_done(sp_desktop_document(ec->desktop), SP_VERB_CONTEXT_TEXT,
+ _("New line"));
return TRUE;
case GDK_BackSpace:
if (tc->text) { // if nascent_object, do nothing, but return TRUE; same for all other delete and move keys
@@ -909,7 +924,8 @@ sp_text_context_root_handler(SPEventContext *const ec, GdkEvent *const event)
tc->text_sel_start = tc->text_sel_end = sp_te_delete(tc->text, tc->text_sel_start, tc->text_sel_end);
sp_text_context_update_cursor(tc);
sp_text_context_update_text_selection(tc);
- sp_document_done(sp_desktop_document(ec->desktop));
+ sp_document_done(sp_desktop_document(ec->desktop), SP_VERB_CONTEXT_TEXT,
+ _("Backspace"));
}
return TRUE;
case GDK_Delete:
@@ -920,7 +936,8 @@ sp_text_context_root_handler(SPEventContext *const ec, GdkEvent *const event)
tc->text_sel_start = tc->text_sel_end = sp_te_delete(tc->text, tc->text_sel_start, tc->text_sel_end);
sp_text_context_update_cursor(tc);
sp_text_context_update_text_selection(tc);
- sp_document_done(sp_desktop_document(ec->desktop));
+ sp_document_done(sp_desktop_document(ec->desktop), SP_VERB_CONTEXT_TEXT,
+ _("Delete"));
}
return TRUE;
case GDK_Left:
@@ -934,7 +951,8 @@ sp_text_context_root_handler(SPEventContext *const ec, GdkEvent *const event)
sp_te_adjust_kerning_screen(tc->text, tc->text_sel_start, tc->text_sel_end, ec->desktop, NR::Point(-1, 0));
sp_text_context_update_cursor(tc);
sp_text_context_update_text_selection(tc);
- sp_document_maybe_done(sp_desktop_document(ec->desktop), "kern:left");
+ sp_document_maybe_done(sp_desktop_document(ec->desktop), "kern:left", SP_VERB_CONTEXT_TEXT,
+ _("Kern to the left"));
} else {
cursor_movement_operator = MOD__CTRL ? &Inkscape::Text::Layout::iterator::cursorLeftWithControl
: &Inkscape::Text::Layout::iterator::cursorLeft;
@@ -953,7 +971,8 @@ sp_text_context_root_handler(SPEventContext *const ec, GdkEvent *const event)
sp_te_adjust_kerning_screen(tc->text, tc->text_sel_start, tc->text_sel_end, ec->desktop, NR::Point(1, 0));
sp_text_context_update_cursor(tc);
sp_text_context_update_text_selection(tc);
- sp_document_maybe_done(sp_desktop_document(ec->desktop), "kern:right");
+ sp_document_maybe_done(sp_desktop_document(ec->desktop), "kern:right", SP_VERB_CONTEXT_TEXT,
+ _("Kern to the right"));
} else {
cursor_movement_operator = MOD__CTRL ? &Inkscape::Text::Layout::iterator::cursorRightWithControl
: &Inkscape::Text::Layout::iterator::cursorRight;
@@ -972,7 +991,9 @@ sp_text_context_root_handler(SPEventContext *const ec, GdkEvent *const event)
sp_te_adjust_kerning_screen(tc->text, tc->text_sel_start, tc->text_sel_end, ec->desktop, NR::Point(0, -1));
sp_text_context_update_cursor(tc);
sp_text_context_update_text_selection(tc);
- sp_document_maybe_done(sp_desktop_document(ec->desktop), "kern:up");
+ sp_document_maybe_done(sp_desktop_document(ec->desktop), "kern:up", SP_VERB_CONTEXT_TEXT,
+ _("Kern up"));
+
} else {
cursor_movement_operator = MOD__CTRL ? &Inkscape::Text::Layout::iterator::cursorUpWithControl
: &Inkscape::Text::Layout::iterator::cursorUp;
@@ -991,7 +1012,9 @@ sp_text_context_root_handler(SPEventContext *const ec, GdkEvent *const event)
sp_te_adjust_kerning_screen(tc->text, tc->text_sel_start, tc->text_sel_end, ec->desktop, NR::Point(0, 1));
sp_text_context_update_cursor(tc);
sp_text_context_update_text_selection(tc);
- sp_document_maybe_done(sp_desktop_document(ec->desktop), "kern:down");
+ sp_document_maybe_done(sp_desktop_document(ec->desktop), "kern:down", SP_VERB_CONTEXT_TEXT,
+ _("Kern down"));
+
} else {
cursor_movement_operator = MOD__CTRL ? &Inkscape::Text::Layout::iterator::cursorDownWithControl
: &Inkscape::Text::Layout::iterator::cursorDown;
@@ -1045,7 +1068,8 @@ sp_text_context_root_handler(SPEventContext *const ec, GdkEvent *const event)
} else {
sp_te_adjust_rotation(tc->text, tc->text_sel_start, tc->text_sel_end, ec->desktop, -90);
}
- sp_document_maybe_done(sp_desktop_document(ec->desktop), "textrot:ccw");
+ sp_document_maybe_done(sp_desktop_document(ec->desktop), "textrot:ccw", SP_VERB_CONTEXT_TEXT,
+ _("Rotate counterclockwise"));
sp_text_context_update_cursor(tc);
sp_text_context_update_text_selection(tc);
return TRUE;
@@ -1065,7 +1089,8 @@ sp_text_context_root_handler(SPEventContext *const ec, GdkEvent *const event)
} else {
sp_te_adjust_rotation(tc->text, tc->text_sel_start, tc->text_sel_end, ec->desktop, 90);
}
- sp_document_maybe_done(sp_desktop_document(ec->desktop), "textrot:cw");
+ sp_document_maybe_done(sp_desktop_document(ec->desktop), "textrot:cw", SP_VERB_CONTEXT_TEXT,
+ _("Rotate clockwise"));
sp_text_context_update_cursor(tc);
sp_text_context_update_text_selection(tc);
return TRUE;
@@ -1081,13 +1106,17 @@ sp_text_context_root_handler(SPEventContext *const ec, GdkEvent *const event)
sp_te_adjust_linespacing_screen(tc->text, tc->text_sel_start, tc->text_sel_end, ec->desktop, -10);
else
sp_te_adjust_linespacing_screen(tc->text, tc->text_sel_start, tc->text_sel_end, ec->desktop, -1);
- sp_document_maybe_done(sp_desktop_document(ec->desktop), "linespacing:dec");
+ sp_document_maybe_done(sp_desktop_document(ec->desktop), "linespacing:dec", SP_VERB_CONTEXT_TEXT,
+ _("Contract line spacing"));
+
} else {
if (MOD__SHIFT)
sp_te_adjust_tspan_letterspacing_screen(tc->text, tc->text_sel_start, tc->text_sel_end, ec->desktop, -10);
else
sp_te_adjust_tspan_letterspacing_screen(tc->text, tc->text_sel_start, tc->text_sel_end, ec->desktop, -1);
- sp_document_maybe_done(sp_desktop_document(ec->desktop), "letterspacing:dec");
+ sp_document_maybe_done(sp_desktop_document(ec->desktop), "letterspacing:dec", SP_VERB_CONTEXT_TEXT,
+ _("Contract letter spacing"));
+
}
sp_text_context_update_cursor(tc);
sp_text_context_update_text_selection(tc);
@@ -1104,13 +1133,17 @@ sp_text_context_root_handler(SPEventContext *const ec, GdkEvent *const event)
sp_te_adjust_linespacing_screen(tc->text, tc->text_sel_start, tc->text_sel_end, ec->desktop, 10);
else
sp_te_adjust_linespacing_screen(tc->text, tc->text_sel_start, tc->text_sel_end, ec->desktop, 1);
- sp_document_maybe_done(sp_desktop_document(ec->desktop), "linespacing:inc");
+ sp_document_maybe_done(sp_desktop_document(ec->desktop), "linespacing:inc", SP_VERB_CONTEXT_TEXT,
+ _("Expand line spacing"));
+
} else {
if (MOD__SHIFT)
sp_te_adjust_tspan_letterspacing_screen(tc->text, tc->text_sel_start, tc->text_sel_end, ec->desktop, 10);
else
sp_te_adjust_tspan_letterspacing_screen(tc->text, tc->text_sel_start, tc->text_sel_end, ec->desktop, 1);
- sp_document_maybe_done(sp_desktop_document(ec->desktop), "letterspacing:inc");
+ sp_document_maybe_done(sp_desktop_document(ec->desktop), "letterspacing:inc", SP_VERB_CONTEXT_TEXT,
+ _("Expand letter spacing"));
+
}
sp_text_context_update_cursor(tc);
sp_text_context_update_text_selection(tc);
@@ -1212,7 +1245,8 @@ sp_text_paste_inline(SPEventContext *ec)
tc->text_sel_start = tc->text_sel_end = sp_te_insert_line(tc->text, tc->text_sel_start);
begin = end + 1;
}
- sp_document_done(sp_desktop_document(ec->desktop));
+ sp_document_done(sp_desktop_document(ec->desktop), SP_VERB_CONTEXT_TEXT,
+ _("Paste text"));
return true;
}
@@ -1325,7 +1359,8 @@ sp_text_context_style_set(SPCSSAttr const *css, SPTextContext *tc)
return false; // will get picked up by the parent and applied to the whole text object
sp_te_apply_style(tc->text, tc->text_sel_start, tc->text_sel_end, css);
- sp_document_done(sp_desktop_document(tc->desktop));
+ sp_document_done(sp_desktop_document(tc->desktop), SP_VERB_CONTEXT_TEXT,
+ _("Set text style"));
sp_text_context_update_cursor(tc);
sp_text_context_update_text_selection(tc);
@@ -1389,6 +1424,10 @@ sp_text_context_update_cursor(SPTextContext *tc, bool scroll_to_see)
{
GdkRectangle im_cursor = { 0, 0, 1, 1 };
+ // due to interruptible display, tc may already be destroyed during a display update before
+ // the cursor update (can't do both atomically, alas)
+ if (!tc->desktop) return;
+
if (tc->text) {
NR::Point p0, p1;
sp_te_get_cursor_coords(tc->text, tc->text_sel_end, p0, p1);
@@ -1442,6 +1481,10 @@ sp_text_context_update_cursor(SPTextContext *tc, bool scroll_to_see)
static void sp_text_context_update_text_selection(SPTextContext *tc)
{
+ // due to interruptible display, tc may already be destroyed during a display update before
+ // the selection update (can't do both atomically, alas)
+ if (!tc->desktop) return;
+
for (std::vector::iterator it = tc->text_selection_quads.begin() ; it != tc->text_selection_quads.end() ; it++) {
sp_canvas_item_hide(*it);
gtk_object_destroy(*it);
@@ -1523,7 +1566,8 @@ sptc_commit(GtkIMContext *imc, gchar *string, SPTextContext *tc)
sp_text_context_update_cursor(tc);
sp_text_context_update_text_selection(tc);
- sp_document_done(SP_OBJECT_DOCUMENT(tc->text));
+ sp_document_done(SP_OBJECT_DOCUMENT(tc->text), SP_VERB_CONTEXT_TEXT,
+ _("Type text"));
}