View Issue Details
ID | Project | Category | View Status | Date Submitted | Last Update |
---|---|---|---|---|---|
0006166 | Scribus | Story Editor / Text Frames | public | 2007-08-29 08:54 | 2007-12-26 17:02 |
Reporter | Jeryde | Assigned To | jghali | ||
Priority | normal | Severity | crash | Reproducibility | always |
Status | closed | Resolution | fixed | ||
Platform | i386 | OS | Windows XP | OS Version | SP2 |
Product Version | 1.3.3.9cvs | ||||
Target Version | 1.3.5 | Fixed in Version | 1.3.3.10svn | ||
Summary | 0006166: Scribus Crashes when Copy-Delete (Shift + Delete) | ||||
Description | Scribus crashes when you mark a text and the Shift-Del to copy-delete the selected content. | ||||
Steps To Reproduce | 1. start scribus 2. create a new document 3. create a text frame 4. open the story editor and put some text in 5. select the text 6. then Shift-Del (to copy the text and delete it from the story editor) Scribus crashes with "Exception Access Violation" | ||||
Additional Information | Information Program received signal SIGABRT, Aborted. [Switching to Thread -1227319600 (LWP 16655)] 0xb7f6a410 in ?? () (gdb) bt 0 0xb7f6a410 in ?? () 0000001 0xbf813f48 in ?? () 0000002 0x00000006 in ?? () 0000003 0xb6f94801 in abort () from /lib/libc.so.6 0000004 0xb6f8c7bb in __assert_fail () from /lib/libc.so.6 0000005 0x08a3ba80 in StoryText::removeChars (this=0x9435ad4, pos=0, len=19086) at /home/christoph/scribus135/trunk/Scribus/scribus/text/storytext.cpp:286 0000006 0x08900a74 in SEditor::deleteSel (this=0x9435ac0) at /home/christoph/scribus135/trunk/Scribus/scribus/story.cpp:739 0000007 0x08909b59 in SEditor::keyPressEvent (this=0x9435ac0, k=0xbf8146e4) at /home/christoph/scribus135/trunk/Scribus/scribus/story.cpp:359 0000008 0xb7997ce8 in QWidget::event () from /usr/lib/libQtGui.so.4 0000009 0xb7c4fd33 in QFrame::event () from /usr/lib/libQtGui.so.4 0000010 0xb7ccf071 in QAbstractScrollArea::event () from /usr/lib/libQtGui.so.4 0000011 0xb7cbb0df in QTextEdit::event () from /usr/lib/libQtGui.so.4 0000012 0xb7952e10 in QApplicationPrivate::notify_helper () from /usr/lib/libQtGui.so.4 0000013 0xb7959a32 in QApplication::notify () from /usr/lib/libQtGui.so.4 0000014 0xb74be6cb in QCoreApplication::notifyInternal () from /usr/lib/libQtCore.so.4 0000015 0xb799fd8e in qt_sendSpontaneousEvent () from /usr/lib/libQtGui.so.4 0000016 0xb79c6d9f in QKeyMapper::sendKeyEvent () from /usr/lib/libQtGui.so.4 0000017 0xb79c8a12 in QKeyMapperPrivate::translateKeyEvent () ---Type <return> to continue, or q <return> to quit--- from /usr/lib/libQtGui.so.4 0000018 0xb79a7599 in QApplication::x11ProcessEvent () from /usr/lib/libQtGui.so.4 0000019 0xb79c9c35 in QEventDispatcherX11::processEvents () from /usr/lib/libQtGui.so.4 0000020 0xb74bdc08 in QEventLoop::processEvents () from /usr/lib/libQtCore.so.4 0000021 0xb74bdd1c in QEventLoop::exec () from /usr/lib/libQtCore.so.4 0000022 0xb74c0398 in QCoreApplication::exec () from /usr/lib/libQtCore.so.4 0000023 0xb7952527 in QApplication::exec () from /usr/lib/libQtGui.so.4 0000024 0x084aecc2 in mainApp (argc=1, argv=0xbf814e64) at /home/christoph/scribus135/trunk/Scribus/scribus/main_nix.cpp:76 0000025 0x084aed26 in main (argc=Cannot access memory at address 0x410f ) at /home/christoph/scribus135/trunk/Scribus/scribus/main_nix.cpp:52 | ||||
Tags | No tags attached. | ||||
Patch | |||||
2007-10-20 18:25
|
6166_patch.patch (7,549 bytes)
Index: scribus/story.cpp =================================================================== --- scribus/story.cpp (revision 10914) +++ scribus/story.cpp (working copy) @@ -234,31 +234,31 @@ { case Key_Delete: moveCursor(QTextEdit::MoveWordForward, true); - deleteSel(); + //deleteSel(); //called via removeSelectedText() by QTextEdit::keyPressEvent() break; case Key_Backspace: moveCursor(QTextEdit::MoveWordBackward, true); - deleteSel(); + //deleteSel(); //called via removeSelectedText() by QTextEdit::keyPressEvent() break; case Key_K: moveCursor(QTextEdit::MoveLineEnd, true); - deleteSel(); + //deleteSel(); //called via removeSelectedText() by QTextEdit::keyPressEvent() break; case Key_D: moveCursor(QTextEdit::MoveForward, true); - deleteSel(); + //deleteSel(); //called via removeSelectedText() by QTextEdit::keyPressEvent() break; case Key_H: moveCursor(QTextEdit::MoveBackward, true); - deleteSel(); + //deleteSel(); //called via removeSelectedText() by QTextEdit::keyPressEvent() break; case Key_X: - cut(); - return; + //cut(); //called by QTextEdit::keyPressEvent() + //return; break; case Key_V: - paste(); - return; + //paste(); //called by QTextEdit::keyPressEvent() + //return; break; case Key_Y: case Key_Z: @@ -266,7 +266,7 @@ return; break; case Key_C: - copyStyledText(); + //copyStyledText(); //called via copy() by QTextEdit::keyPressEvent() break; } break; @@ -330,76 +330,7 @@ return; break; case Key_Delete: - if (!hasSelectedText()) - { - ChList *chars = StyledText.at(p); - if (i < static_cast<int>(chars->count())) - chars->remove(i); - else - { - if (p < static_cast<int>(StyledText.count()-1)) - { - struct PtiSmall *hg; - ChList *chars2 = StyledText.at(p+1); - int a = static_cast<int>(chars2->count()); - if (a > 0) - { - int ca; - if (chars->count() > 0) - ca = chars->at(0)->cab; - else - ca = currentParaStyle; - for (int s = 0; s < a; ++s) - { - hg = chars2->take(0); - hg->cab = ca; - chars->append(hg); - } - } - StyledText.remove(p+1); - ParagStyles.remove(ParagStyles.at(p+1)); - } - } - } - else - deleteSel(); - break; case Key_Backspace: - if (!hasSelectedText()) - { - if (p >= static_cast<int>(StyledText.count())) - break; - ChList *chars = StyledText.at(p); - if (i > 0) - chars->remove(i-1); - else - { - if (p > 0) - { - struct PtiSmall *hg; - ChList *chars2 = StyledText.at(p-1); - int a = static_cast<int>(chars->count()); - if (a > 0) - { - int ca; - if (chars2->count() > 0) - ca = chars2->at(0)->cab; - else - ca = chars->at(0)->cab; - for (int s = 0; s < a; ++s) - { - hg = chars->take(0); - hg->cab = ca; - chars2->append(hg); - } - } - StyledText.remove(p); - ParagStyles.remove(ParagStyles.at(p)); - } - } - } - else - deleteSel(); break; case Key_Return: case Key_Enter: @@ -419,15 +350,15 @@ } else { - ChList *chars2 = StyledText.at(p); - int a = static_cast<int>(chars2->count()); - for (int s = i; s < a; ++s) - { - chars->append(chars2->take(i)); + ChList *chars2 = StyledText.at(p); + int a = static_cast<int>(chars2->count()); + for (int s = i; s < a; ++s) + { + chars->append(chars2->take(i)); + } + StyledText.insert(p+1, chars); + ParagStyles.insert(ParagStyles.at(p+1), currentParaStyle); } - StyledText.insert(p+1, chars); - ParagStyles.insert(ParagStyles.at(p+1), currentParaStyle); - } } else { @@ -1542,7 +1473,7 @@ emit SideBarUp(false); if (hasSelectedText()) { - deleteSel(); + //deleteSel(); removeSelectedText(); } emit SideBarUp(true); @@ -1595,6 +1526,102 @@ emit SideBarUpdate(); } +void SEditor::doKeyboardAction(KeyboardAction action) +{ + if (action == ActionBackspace) + styledTextApplyActionBackspace(); + else if (action == ActionDelete) + styledTextApplyActionDelete(); + else if (action == ActionWordBackspace || action == ActionWordDelete) + return; + QTextEdit::doKeyboardAction(action); +} + +void SEditor::styledTextApplyActionBackspace() +{ + int parIndex, charIndex; + getCursorPosition(&parIndex, &charIndex); + if (!hasSelectedText()) + { + if (parIndex >= static_cast<int>(StyledText.count())) + return; + ChList *chars = StyledText.at(parIndex); + if (charIndex > 0) + chars->remove(charIndex-1); + else + { + if (parIndex > 0) + { + struct PtiSmall *hg; + ChList *chars2 = StyledText.at(parIndex-1); + int a = static_cast<int>(chars->count()); + if (a > 0) + { + int ca; + if (chars2->count() > 0) + ca = chars2->at(0)->cab; + else + ca = chars->at(0)->cab; + for (int s = 0; s < a; ++s) + { + hg = chars->take(0); + hg->cab = ca; + chars2->append(hg); + } + } + StyledText.remove(parIndex); + ParagStyles.remove(ParagStyles.at(parIndex)); + } + } + } +} + +void SEditor::styledTextApplyActionDelete() +{ + int parIndex, charIndex; + getCursorPosition(&parIndex, &charIndex); + if (!hasSelectedText()) + { + ChList *chars = StyledText.at(parIndex); + if (charIndex < static_cast<int>(chars->count())) + chars->remove(charIndex); + else + { + if (parIndex < static_cast<int>(StyledText.count()-1)) + { + struct PtiSmall *hg; + ChList *chars2 = StyledText.at(parIndex+1); + int a = static_cast<int>(chars2->count()); + if (a > 0) + { + int ca; + if (chars->count() > 0) + ca = chars->at(0)->cab; + else + ca = currentParaStyle; + for (int s = 0; s < a; ++s) + { + hg = chars2->take(0); + hg->cab = ca; + chars->append(hg); + } + } + StyledText.remove(parIndex+1); + ParagStyles.remove(ParagStyles.at(parIndex+1)); + } + } + } +} + +void SEditor::removeSelectedText (int selNum) +{ + if (selNum == 0 && hasSelectedText()) + { + deleteSel(); + QTextEdit::removeSelectedText(selNum); + } +} + QPopupMenu* SEditor::createPopupMenu(const QPoint & pos) { QPopupMenu *p = QTextEdit::createPopupMenu(pos); @@ -3174,7 +3201,7 @@ EditorBar->setRepaint(false); if (Editor->hasSelectedText()) { - Editor->deleteSel(); + //Editor->deleteSel(); Editor->removeSelectedText(); } EditorBar->setRepaint(true); Index: scribus/story.h =================================================================== --- scribus/story.h (revision 10914) +++ scribus/story.h (working copy) @@ -152,10 +152,15 @@ QPopupMenu* createPopupMenu(const QPoint & pos); StoryEditor* parentStoryEditor; + void styledTextApplyActionBackspace(); + void styledTextApplyActionDelete(); + public slots: - void cut(); - void copy(); - void paste(); + virtual void cut(); + virtual void copy(); + virtual void paste(); + virtual void doKeyboardAction(KeyboardAction action); + virtual void removeSelectedText(int selNum = 0); void ClipChange(); void SelClipChange(); |
|
Crash fixed in 1.3.3.10svn. |
|
Works ok too in 1.3.5svn after fix for 0006184 |
|
Tested, fixed. Thanks. |
Date Modified | Username | Field | Change |
---|---|---|---|
2007-08-29 08:54 | Jeryde | New Issue | |
2007-08-29 11:11 | jghali | Status | new => confirmed |
2007-09-30 09:21 | cbradney | Relationship added | related to 0006310 |
2007-09-30 10:33 | jghali | Summary | Scribus Crashes when Copy-Delete => Scribus Crashes when Copy-Delete (Shift + Delete) |
2007-09-30 10:36 | jghali | Relationship replaced | has duplicate 0006310 |
2007-09-30 10:36 | jghali | Relationship added | has duplicate 0006311 |
2007-09-30 10:37 | jghali | Relationship added | child of 0005693 |
2007-09-30 10:39 | jghali | Additional Information Updated | |
2007-10-20 18:25 | jghali | File Added: 6166_patch.patch | |
2007-10-20 20:31 | jghali | Note Added: 0017717 | |
2007-10-20 21:24 | jghali | Status | confirmed => resolved |
2007-10-20 21:24 | jghali | Fixed in Version | => 1.3.3.10cvs |
2007-10-20 21:24 | jghali | Resolution | open => fixed |
2007-10-20 21:24 | jghali | Assigned To | => jghali |
2007-10-20 21:24 | jghali | Note Added: 0017718 | |
2007-10-20 23:15 | christoph_s | Status | resolved => closed |
2007-10-20 23:15 | christoph_s | Note Added: 0017719 | |
2007-12-20 22:52 | cbradney | Target Version | => 1.3.5svn |
2007-12-26 17:02 | cbradney | Target Version | 1.3.5svn => 1.3.5 |
2015-09-17 20:08 | Kunda | Category | Story Editor / Text Frames => Story Ed/Txt Frames |
2015-09-17 20:12 | Kunda | Category | Story Ed/Txt Frames => Story Editor / Text Frames |