Bug 76034

Summary: Notes appear at random positions upon startup
Product: [Unmaintained] knotes Reporter: Axel Boldt <axelboldt>
Component: generalAssignee: Michael Brade <brade>
Status: RESOLVED FIXED    
Severity: normal    
Priority: NOR    
Version: unspecified   
Target Milestone: ---   
Platform: Debian testing   
OS: Linux   
Latest Commit: Version Fixed In:
Sentry Crash Report:

Description Axel Boldt 2004-02-24 16:42:00 UTC
Version:           2.3 (using KDE KDE 3.1.5)
Installed from:    Debian testing/unstable Packages
OS:          Linux

Upon starting KDE, the knotes application starts automatically, but the notes appear at random locations. Sometimes two notes are placed exactly on top of each other, sometimes one is not shown at all, sometimes one appears at the left side of the screen and the other at the right. It does not seem possible to specify a fixed location for the notes windows.
Comment 1 Michael Zimmermann 2004-03-05 16:45:24 UTC
Using KDE 3.2 I still do see these symptoms. 

As far as I can see the information in the files is correct, but knotes upon startup uses the size + position information of one note for this and the next note.

Note: It seems as if this only happens upon kde login. If I do start knotes manually all is fine.
Comment 2 Michael Brade 2004-03-23 15:18:25 UTC
CVS commit by brade: 

Very Cool! Thanks to Lubos for his function that removes sm from the client
leader KNotes is not managed anymore by KWin (again) and is now thus able to
restore its notes properly on login with manually saved sessions.

CCMAIL: 77783-done@bugs.kde.org, 76034-done@bugs.kde.org, 65744-done@bugs.kde.org


  M +1 -8      knote.cpp   1.108
  M +2 -1      knotesapp.cpp   1.80
  M +37 -1     main.cpp   1.25


--- kdepim/knotes/knote.cpp  #1.107:1.108
@@ -62,6 +62,4 @@
 #include <fixx11h.h>
 
-extern Atom qt_sm_client_id;
-
 using namespace KCal;
 
@@ -73,10 +71,5 @@ KNote::KNote( KXMLGUIBuilder* builder, Q
     m_config( 0 ), m_journal( j )
 {
-    // to disable kwin's session management (ie. saving positions of windows) we need to
-    // remove the session id from all note windows
-    XChangeProperty( x11Display(), winId(), qt_sm_client_id, XA_STRING, 8,
-        PropModeReplace, 0, 0 );
-
-    actionCollection()->setWidget( this );
+    //actionCollection()->setWidget( this );
 
     // if there is no title yet, use the start date if valid

--- kdepim/knotes/knotesapp.cpp  #1.79:1.80
@@ -415,5 +415,6 @@ void KNotesApp::showNote( KNote* note ) 
 void KNotesApp::createNote( KCal::Journal *journal )
 {
-    KNote *newNote = new KNote( this, domDocument(), journal );
+    KNote *newNote = new KNote( this, domDocument(), journal, 
+                                0, journal->uid().utf8() );
     m_noteList.insert( newNote->noteId(), newNote );
 

--- kdepim/knotes/main.cpp  #1.24:1.25
@@ -23,4 +23,8 @@
 #include <kaboutdata.h>
 #include <klocale.h>
+#include <kxerrorhandler.h>
+
+#include <X11/Xlib.h>
+#include <X11/Xatom.h>
 
 #include "knotesapp.h"
@@ -29,4 +33,35 @@
 
 
+void remove_sm_from_client_leader()
+{
+    Atom type;
+    int format, status;
+    unsigned long nitems = 0;
+    unsigned long extra = 0;
+    unsigned char *data = 0;
+
+    Atom atoms[ 2 ];
+    char *atom_names[ 2 ] = { "WM_CLIENT_LEADER", "SM_CLIENT_ID" };
+
+    XInternAtoms( qt_xdisplay(), atom_names, 2, False, atoms );
+
+    QWidget w;
+    KXErrorHandler handler; // ignore X errors
+    status = XGetWindowProperty( qt_xdisplay(), w.winId(), atoms[ 0 ], 0, 10000,
+                                 FALSE, XA_WINDOW, &type, &format,
+                                 &nitems, &extra, &data );
+
+    if (status  == Success && !handler.error( false )) 
+    {
+        if (data && nitems > 0)
+        {
+            Window leader = *((Window*) data);
+            XDeleteProperty( qt_xdisplay(), leader, atoms[ 1 ] );
+        }
+        XFree(data);
+    }
+}
+
+
 Application::Application()
     : KUniqueApplication(), mMainWindow( 0 )
@@ -87,4 +121,6 @@ int main( int argc, char* argv[] )
     app.connect( &app, SIGNAL( lastWindowClosed() ), &app, SLOT( quit() ) );
 
+    remove_sm_from_client_leader();
+
     int rval = app.exec();
 


Comment 3 elbows 2004-03-28 01:58:43 UTC
I am also seeing this bug in 3.2.1, although the exact symptoms differ slightly from the original report.

When I login and my session is restored, KNotes gives all notes the same size and location. If I quit and restart knotes manually, it restores positions properly.
Comment 4 Michael Brade 2004-03-28 19:13:55 UTC
Yes, and this is fixed as well :)