Code

Fixed rendering glitch in bicubic scaler
[inkscape.git] / src / text-context.cpp
index f3f974c6f96356b8ecdb1b981dae53240b8ad621..0410ab3b4679a7eb830505b5d8924fc7cb562ede 100644 (file)
@@ -912,30 +912,51 @@ sp_text_context_root_handler(SPEventContext *const ec, GdkEvent *const event)
 
                             case GDK_Return:
                             case GDK_KP_Enter:
+                            {
                                 if (!tc->text) { // printable key; create text if none (i.e. if nascent_object)
                                     sp_text_context_setup_text(tc);
                                     tc->nascent_object = 0; // we don't need it anymore, having created a real <text>
                                 }
-                                tc->text_sel_start = tc->text_sel_end 
-                                                   = sp_te_delete(tc->text, tc->text_sel_start, tc->text_sel_end, SP_TE_DELETE_OTHER);
+                                
+                                iterator_pair enter_pair;
+                                bool success = sp_te_delete(tc->text, tc->text_sel_start, tc->text_sel_end, enter_pair);
+                                tc->text_sel_start = tc->text_sel_end = enter_pair.first;
                                 
                                 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_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
-                                       sp_te_deletion_type deleteType = SP_TE_DELETE_OTHER;
-                                       
-                                    if (tc->text_sel_start == tc->text_sel_end) {
+                                    
+                                    bool noSelection = false;
+                                    
+                                       if (tc->text_sel_start == tc->text_sel_end) {
                                         tc->text_sel_start.prevCursorPosition();
-                                        deleteType = SP_TE_DELETE_SINGLE_BACKSPACE;
+                                        noSelection = true;
                                     }
+                                       
+                                       iterator_pair bspace_pair;
+                                       bool success = sp_te_delete(tc->text, tc->text_sel_start, tc->text_sel_end, bspace_pair);
                                     
-                                    tc->text_sel_start = tc->text_sel_end 
-                                                       = sp_te_delete(tc->text, tc->text_sel_start, tc->text_sel_end, deleteType);
+                                    if (noSelection) {
+                                        if (success) {
+                                            tc->text_sel_start = tc->text_sel_end = bspace_pair.first;
+                                        } else { // nothing deleted
+                                            tc->text_sel_start = tc->text_sel_end = bspace_pair.second;
+                                        }
+                                    } else {
+                                        if (success) {
+                                            tc->text_sel_start = tc->text_sel_end = bspace_pair.first;
+                                        } else { // nothing deleted
+                                            tc->text_sel_start = bspace_pair.first;
+                                            tc->text_sel_end = bspace_pair.second;
+                                        }
+                                    }
                                     
                                     sp_text_context_update_cursor(tc);
                                     sp_text_context_update_text_selection(tc);
@@ -946,15 +967,27 @@ sp_text_context_root_handler(SPEventContext *const ec, GdkEvent *const event)
                             case GDK_Delete:
                             case GDK_KP_Delete:
                                 if (tc->text) {
-                                       sp_te_deletion_type deleteType = SP_TE_DELETE_OTHER;
-                                       
+                                    bool noSelection = false;
+                                    
                                     if (tc->text_sel_start == tc->text_sel_end) {
                                         tc->text_sel_end.nextCursorPosition();
-                                        deleteType = SP_TE_SINGLE_DELETE;
+                                        noSelection = true;
+                                    }
+                                    
+                                    iterator_pair del_pair;
+                                    bool success = sp_te_delete(tc->text, tc->text_sel_start, tc->text_sel_end, del_pair);
+                                    
+                                    if (noSelection) {
+                                        tc->text_sel_start = tc->text_sel_end = del_pair.first;
+                                    } else {
+                                        if (success) {
+                                            tc->text_sel_start = tc->text_sel_end = del_pair.first;
+                                        } else { // nothing deleted
+                                            tc->text_sel_start = del_pair.first;
+                                            tc->text_sel_end = del_pair.second;
+                                        }
                                     }
                                     
-                                    tc->text_sel_start = tc->text_sel_end 
-                                                       = sp_te_delete(tc->text, tc->text_sel_start, tc->text_sel_end, deleteType);
                                     
                                     sp_text_context_update_cursor(tc);
                                     sp_text_context_update_text_selection(tc);
@@ -1307,9 +1340,21 @@ bool sp_text_delete_selection(SPEventContext *ec)
 
     if (tc->text_sel_start == tc->text_sel_end)
         return false;
-    tc->text_sel_start = tc->text_sel_end = sp_te_delete(tc->text, tc->text_sel_start, tc->text_sel_end, SP_TE_DELETE_OTHER);
+    
+    iterator_pair pair;
+    bool success = sp_te_delete(tc->text, tc->text_sel_start, tc->text_sel_end, pair);
+    
+    
+    if (success) {
+        tc->text_sel_start = tc->text_sel_end = pair.first;
+    } else { // nothing deleted
+        tc->text_sel_start = pair.first;
+        tc->text_sel_end = pair.second;
+    }
+    
     sp_text_context_update_cursor(tc);
     sp_text_context_update_text_selection(tc);
+    
     return true;
 }