Bug 65744 - notes change size and position after restart
Summary: notes change size and position after restart
Status: RESOLVED FIXED
Alias: None
Product: knotes
Classification: Applications
Component: general (show other bugs)
Version: unspecified
Platform: openSUSE Linux
: NOR normal
Target Milestone: ---
Assignee: Michael Brade
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2003-10-09 14:08 UTC by Hans-Rudi Denzler
Modified: 2004-03-23 15:18 UTC (History)
0 users

See Also:
Latest Commit:
Version Fixed In:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Hans-Rudi Denzler 2003-10-09 14:08:27 UTC
Version:           2.3 (using KDE 3.1.4)
Installed from:    SuSE
Compiler:          gcc version 3.3 20030226 (prerelease) (SuSE Linux)
OS:          Linux (i686) release 2.4.20-4GB

After restart the position and size of some notes on desktop is not according to data in e.g.
`/home/hrd/.kde/share/apps/knotes/notes/KNote 1`.

KNote 1 and KNote 2 with different height, width, position are both positioned according to data in Knote 2.

Updating to kdepim3-3.1.4-16 from kdepim3-3.1.1-13 (SuSE 8.2 prof.):
ftp://ftp.suse.com/pub/suse/i386/supplementary/KDE/update_for_8.2/applications
Comment 1 Ryan Stutsman 2004-01-10 23:31:56 UTC
This seems to be corrected in the CVS version.  I can replicate it in 3.1.4, but it seems fine in CVS from 2003-01-10.
Comment 2 Michael Brade 2004-03-23 15:18:26 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();