I've also implemented the patch for the qt3 frontend.
Now Qt3 and Qt4 are an par on Linux and Windows.
Diff against current svn.

Thanks. I have not read what Abdel says about the patch. Here is mine:

-       if (posx != -1 && posy != -1)
-               view.move(QPoint(posx, posy));
+       view.init();

+       if (width != -1 && height != -1 && posx != -1 && posy != -1) {
+               view.initNormalGeometry(QRect(posx, posy, width, height));
+               view.resize(width, height);
+               view.move(posx, posy);
+               if (maximize)
+               {
+                       view.show();
+                       view.setWindowState(Qt::WindowMaximized);
+               }
+       }
+
        view.show();
-       view.init();

The logic is that width and height should work without valid posx, and
poxy. (saveGeometry controls that).

Also, why not move if(maximize) out of the scope? (view.show() called
twice). Something like:
view.show()
if max:
 setWindowState.

+void QtView::initNormalGeometry(const QRect & g)
+{
+       normalGeometry_ = g;
+       maxWidth=QApplication::desktop()->width()-20;
+}

+QRect QtView::qtViewGeometry() const
+{
+       QRect rec;
+       // setX/Y changes the size!
+       rec.setX(frameGeometry().x());
+       rec.setY(frameGeometry().y());
+       rec.setWidth(geometry().width());
+       rec.setHeight(geometry().height());
+       return rec;
+}
+
+void QtView::resizeEvent(QResizeEvent *)
+{
+       if (width() > maxWidth) {
+               maxWidth = width();
+               return;
+       }
+       if (frameGeometry().x() > 0)
+               normalGeometry_ = qtViewGeometry();
+
+       std::cout<<maxWidth-normalGeometry_.width()<<", resizeEvent 
:"<<normalGeometry_.x()<<"\n";
+}
+
+void QtView::moveEvent(QMoveEvent *)
+{
+       if (width() < maxWidth && frameGeometry().x() > 0)
+               normalGeometry_ = qtViewGeometry();
+       std::cout<<maxWidth-normalGeometry_.width()<<", moveEvent 
:"<<normalGeometry_.x()<<"\n";
+}
+
 void QtView::closeEvent(QCloseEvent *)
 {
+       QRect geometry;
+       std::cout<<"maxWidth:"<<maxWidth<<"\n";
+       std::cout<<"normalGeometry_: "<<normalGeometry_.width()<<"\n";
+       if (QWidget::geometry().width() < maxWidth)
+               geometry = qtViewGeometry();
+       else
+               geometry = normalGeometry_;
+
+       std::cout<<"closeEvent : "<<geometry.width()<<"   "<<geometry.x() 
<<"\n\n";
+
        Session & session = LyX::ref().session();
        session.saveSessionInfo("WindowIsMaximized", (isMaximized() ? "yes" : 
"no"));
        // save windows size and position
-       session.saveSessionInfo("WindowWidth", convert<string>(width()));
-       session.saveSessionInfo("WindowHeight", convert<string>(height()));
+       session.saveSessionInfo("WindowWidth", 
convert<string>(geometry.width()));
+       session.saveSessionInfo("WindowHeight", 
convert<string>(geometry.height()));
        if (lyxrc.geometry_xysaved) {
-               session.saveSessionInfo("WindowPosX", convert<string>(x()));
-               session.saveSessionInfo("WindowPosY", convert<string>(y()));
+               session.saveSessionInfo("WindowPosX", 
convert<string>(geometry.x()));
+               session.saveSessionInfo("WindowPosY", 
convert<string>(geometry.y()));
        }
        // trigger LFUN_LYX_QUIT instead of quit directly
        // since LFUN_LYX_QUIT may have more cleanup stuff
@@ -179,6 +222,8 @@
 {
        setCaption(qt_("LyX"));
        QMainWindow::show();
+       if (width()<maxWidth)
+               normalGeometry_ = qtViewGeometry();
 }


If I remember correctly, you said that geometry can only be correctly
traced in events like resize so you have to handle them. This makes
the code really long for this simple task. Is not there a way/hack to
do that in the close event, such as a hack in triggering resize? wide
guess though.

+       if (width != -1 && height != -1 && posx != -1 && posy != -1) {

The same logic problem.

I will test the patch later.

Cheers,
Bo

Reply via email to