[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-bugs-dist
Subject:    Bug#4320: PATCH: kword dies when double-clicking outside a frame
From:       Wolfgang Oertl <wolfgang.oertl () gmx ! at>
Date:       2000-05-31 14:20:09
[Download RAW message or body]

Package: kword
Version: 0.1 (KDE 1.90 Beta >= 20000517)
Severity: grave

Problem description
-------------------

- start kword with an empty document
- mode "Edit Frames" (second icon on the "tools_toolbar")
- now double-click somewhere outside all frames --> SEGV.


Relevant code from koffice/kword/kword_page.cc:

void KWPage::vmdEditFrame( int mx, int my )
{
    int frameset = doc->getFrameSet( mx, my );
    if ( doc->getFrameSet( frameset )->getFrameType() == FT_PART ) {
        KWPartFrameSet *fs = dynamic_cast<KWPartFrameSet*>( doc->getFrameSet( fr

This function is called by void KWPage::viewportMouseDoubleClickEvent
(QMouseEvent*).  If the call to doc->getFrameSet(mx,my) returns -1 (as can be
seen on the debug messages to stdout), the next call to
doc->getFrameSet(frameset) returns NULL...

Fix: check return value of getFrameset(int,int), and maybe others.

Patch - tested and works (on my system at least :-)
Linux/i386 2.3.99-pre8
glibc-2.1
XFree86 3.3.6
gcc 2.95.2

Apply in kde src dir with "patch -p0".

HTH,
Wolfgang Oertl


--- koffice/kword/kword_page.cc	Fri May 12 00:43:41 2000
+++ /usr/src/kde1/koffice/kword/kword_page.cc	Wed May 31 16:07:09 2000
@@ -1256,13 +1256,23 @@
 void KWPage::vmdEditFrame( int mx, int my )
 {
     int frameset = doc->getFrameSet( mx, my );
-    if ( doc->getFrameSet( frameset )->getFrameType() == FT_PART ) {
-	KWPartFrameSet *fs = dynamic_cast<KWPartFrameSet*>( doc->getFrameSet( frameset ) );
+    if( frameset == -1 )
+	    return;
+
+    KWFrameSet *fset = doc->getFrameSet( frameset );
+    if( !fset )
+	    return;
+
+    switch( fset->getFrameType() ) {
+    case FT_PART: {
+	KWPartFrameSet *fs = dynamic_cast<KWPartFrameSet*>( fset );
 	fs->activate( gui->getView() );
 	editNum = frameset;
-    } else if ( doc->getFrameSet( frameset )->getFrameType() == FT_FORMULA ) {
+	break;
+    }
+    case FT_FORMULA: {
 	gui->getView()->showFormulaToolbar( TRUE );
-	KWFormulaFrameSet *fs = dynamic_cast<KWFormulaFrameSet*>( doc->getFrameSet( frameset ) );
+	KWFormulaFrameSet *fs = dynamic_cast<KWFormulaFrameSet*>( fset );
 	fs->activate( this );
 	editNum = frameset;
 	KWFormat *f = fs->getFormat();
@@ -1270,6 +1280,10 @@
 	//formatChanged( *f, FALSE );
 	gui->getView()->setFormat( *f, TRUE, FALSE );
 	delete f;
+	break;
+    }
+    default:	/* not handled: FT_BASE FT_TEXT FT_PICTURE */
+    break;
     }
 }
 

[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic