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

List:       kde-core-devel
Subject:    [PATCH] Kicker freeze
From:       Ralf Hoelzer <ralf () well ! com>
Date:       2003-07-04 9:57:25
[Download RAW message or body]

Kicker freezes for several seconds if you clear the clipboard history. At least on
my system with the current qt-copy. Looks like it happens because Klipper tries to
access an empty clipboard at several points. I have attached a patch that fixes it
for me. But somebody with a better understanding of this should have a look at it.
Maybe this is a Qt bug?

I also removed 3 lines that are never called:

-   config->sync();
-        kapp->quit();
-        break;


regards,

Ralf

Here's a backtrace of one of the points where it freezes:

#0  0x4139710e in select () from /lib/i686/libc.so.6
#1  0x40f9695c in __JCR_LIST__ () from /space/build/kde32/qt-copy/lib/libqt-mt.so.3
#2  0x40a50e3d in qt_xclb_wait_for_event(_XDisplay*, unsigned long, int, _XEvent*, \
int) (dpy=0x8053e60, win=25165851, type=31,  event=0xbfffecd0, timeout=5000) at \
kernel/qclipboard_x11.cpp:472 #3  0x40a538bc in \
QClipboardWatcher::getDataInFormat(unsigned long) const (this=0x805ace8, fmtatom=336) \
at kernel/qclipboard_x11.cpp:1374 #4  0x40a52fc5 in QClipboardWatcher::format(int) \
const (this=0x805ace8, n=0) at kernel/qclipboard_x11.cpp:1242 #5  0x40ac49ee in \
QTextDrag::decode(QMimeSource const*, QString&, QCString&) (e=0x805ace8, \
str=@0xbfffeef0, subtype=@0xbfffeea0)  at kernel/qdragobject.cpp:855
#6  0x40abedd4 in QClipboard::text(QCString&, QClipboard::Mode) const \
(this=0x80a4e50, subtype=@0xbfffeea0, mode=Selection)  at kernel/qclipboard.cpp:197
#7  0x40abee73 in QClipboard::text(QClipboard::Mode) const (this=0x80a4e50, \
mode=Selection) at kernel/qclipboard.cpp:230 #8  0x40abeed6 in QClipboard::text() \
const (this=0x80a4e50) at kernel/qclipboard.cpp:244 #9  0x40029dc2 in \
KlipperWidget::clipboardSignalArrived(bool) (this=0x80ca020, selectionMode=240) at \
toplevel.cpp:644 #10 0x4002a95a in KlipperWidget::qt_invoke(int, QUObject*) \
(this=0x80ca020, _id=58, _o=0xbfffeff0) at toplevel.moc:137 #11 0x4002ab33 in \
Klipper::qt_invoke(int, QUObject*) (this=0x80ca020, _id=58, _o=0xbfffeff0) at \
toplevel.moc:215 #12 0x40b18654 in QObject::activate_signal(QConnectionList*, \
QUObject*) (this=0x80a4e50, clist=0x80989d0, o=0xbfffeff0)  at \
kernel/qobject.cpp:2357 #13 0x40b183a6 in QObject::activate_signal(int) \
(this=0x80a4e50, signal=2) at kernel/qobject.cpp:2302 #14 0x40e55ada in \
QClipboard::selectionChanged() (this=0x80a4e50) at \
.moc/debug-shared-mt/moc_qclipboard.cpp:88 #15 0x40a5245b in \
QClipboard::event(QEvent*) (this=0x80a4e50, e=0xbffff3a0) at \
kernel/qclipboard_x11.cpp:969 #16 0x40ab6489 in \
QApplication::internalNotify(QObject*, QEvent*) (this=0xbffff620, receiver=0x80a4e50, \
e=0xbffff3a0)  at kernel/qapplication.cpp:2578
#17 0x40ab5946 in QApplication::notify(QObject*, QEvent*) (this=0xbffff620, \
receiver=0x80a4e50, e=0xbffff3a0) at kernel/qapplication.cpp:2302 #18 0x4064e02e in \
KApplication::notify(QObject*, QEvent*) (this=0xbffff620, receiver=0x80a4e50, \
event=0xbffff3a0) at kapplication.cpp:460 #19 0x40a4e5bd in \
QApplication::sendSpontaneousEvent(QObject*, QEvent*) (receiver=0x80a4e50, \
event=0xbffff3a0) at kernel/qapplication.h:493 #20 0x40a46645 in \
QApplication::x11ProcessEvent(_XEvent*) (this=0xbffff620, event=0xbffff510) at \
kernel/qapplication_x11.cpp:3770 #21 0x40a5f5b6 in \
QEventLoop::processEvents(unsigned) (this=0x8095d28, flags=4) at \
kernel/qeventloop_x11.cpp:192 #22 0x40acbc6c in QEventLoop::enterLoop() \
(this=0x8095d28) at kernel/qeventloop.cpp:198 #23 0x40acbb86 in QEventLoop::exec() \
(this=0x8095d28) at kernel/qeventloop.cpp:145 #24 0x40ab6605 in QApplication::exec() \
(this=0xbffff620) at kernel/qapplication.cpp:2701 #25 0x40025860 in kdemain (argc=2, \
argv=0xbffff7d4) at main.cpp:62 #26 0x08048657 in main (argc=2, argv=0xbffff7d4) at \
klipper.la.cpp:2 #27 0x412e8082 in __libc_start_main () from /lib/i686/libc.so.6


["kicker.diff" (text/x-diff)]

Index: toplevel.cpp
===================================================================
RCS file: /home/kde/kdebase/klipper/toplevel.cpp,v
retrieving revision 1.128
diff -u -p -r1.128 toplevel.cpp
--- toplevel.cpp	25 Jun 2003 12:31:57 -0000	1.128
+++ toplevel.cpp	4 Jul 2003 09:49:13 -0000
@@ -190,9 +190,6 @@ void KlipperWidget::clickedMenu(int id)
             config->writeEntry("AutoStart", false);
         }else  // cancel chosen don't quit
 	    break;
-	config->sync();
-        kapp->quit();
-        break;
     }
 //    case URLGRAB_ITEM: // handled with an extra slot
 //	break;
@@ -560,7 +557,8 @@ QString KlipperWidget::clipboardContents
 {
     clip->setSelectionMode( true );
 
-    QString contents = clip->text();
+    QString contents = "";
+    if(!bClipEmpty) contents = clip->text();
 
     if ( contents == m_lastSelection )
     {
@@ -641,10 +639,13 @@ void KlipperWidget::clipboardSignalArriv
 //     qDebug("*** clipboardSignalArrived: %i", selectionMode);
 
     clip->setSelectionMode( selectionMode );
-    QString text = clip->text();
-//     qDebug("-> text is: %s", text.latin1());
 
-    checkClipData( text, selectionMode );
+    if(!bClipEmpty) 
+    {
+      QString text = clip->text();
+//     qDebug("-> text is: %s", text.latin1());
+      checkClipData( text, selectionMode );
+    }
     m_checkTimer->start(1000);
 }
 
@@ -661,7 +662,6 @@ void KlipperWidget::checkClipData( const
     }
 
 
-    bool clipEmpty = (clip->data()->format() == 0L);
 //     qDebug("checkClipData(%i): %s, empty: %i (lastClip: %s, lastSel: %s)", \
selectionMode, text.latin1(), clipEmpty, m_lastClipboard.latin1(), \
m_lastSelection.latin1() );  
 //     const char *format;
@@ -677,7 +677,7 @@ void KlipperWidget::checkClipData( const
 
     if ( text != lastClipRef ) {
         // keep old clipboard after someone set it to null
-        if ( clipEmpty && bNoNullClipboard )
+        if ( bClipEmpty && bNoNullClipboard )
             setClipboard( lastClipRef, selectionMode );
         else
             lastClipRef = text;



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

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