Bo Peng wrote:
>> But when you prefer the (-1,-1) solution I'll change it.
> 
> Since (-1, -1) will save a significant amount of coding, I prefer this.
> 
> Bo

Here the patch with above changes.

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.

Peter

Index: src/frontends/qt3/lyx_gui.C
===================================================================
--- src/frontends/qt3/lyx_gui.C (revision 14157)
+++ src/frontends/qt3/lyx_gui.C (working copy)
@@ -222,21 +222,30 @@
 
 
 void start(string const & batch, vector<string> const & files,
-          unsigned int width, unsigned int height, int posx, int posy, bool)
+          unsigned int width, unsigned int height, int posx, int posy, bool 
maximize)
 {
        // this can't be done before because it needs the Languages object
        initEncodings();
 
-       boost::shared_ptr<QtView> view_ptr(new QtView(width, height));
+       boost::shared_ptr<QtView> view_ptr(new QtView);
        LyX::ref().addLyXView(view_ptr);
 
        QtView & view = *view_ptr.get();
 
-       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();
 
        // FIXME: some code below needs moving
 
Index: src/frontends/qt3/QtView.C
===================================================================
--- src/frontends/qt3/QtView.C  (revision 14157)
+++ src/frontends/qt3/QtView.C  (working copy)

@@ -55,14 +55,12 @@
 
 
 
-QtView::QtView(unsigned int width, unsigned int height)
+QtView::QtView()
        : QMainWindow(), LyXView(), commandbuffer_(0), frontend_(*this)
 {
-       resize(width, height);
-
        qApp->setMainWidget(this);
 
-       bufferview_.reset(new BufferView(this, width, height));
+       bufferview_.reset(new BufferView(this, width(), height()));
 
        menubar_.reset(new QLMenubar(this, menubackend));
        getToolbars().init();
@@ -157,17 +155,62 @@
        return qApp->activeWindow() == this;
 }
 
+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();
 }
 
 
Index: src/frontends/qt3/QtView.h
===================================================================
--- src/frontends/qt3/QtView.h  (revision 14157)
+++ src/frontends/qt3/QtView.h  (working copy)
@@ -38,8 +38,8 @@
 class QtView : public QMainWindow, public LyXView {
        Q_OBJECT
 public:
-       /// create a main window of the given dimensions
-       QtView(unsigned int w, unsigned int h);
+       /// create a main window
+       QtView();
 
        ~QtView();
 
@@ -67,9 +67,19 @@
        //
        lyx::frontend::Gui & gui() { return frontend_; }
 
+       ///
+       void initNormalGeometry(const QRect &);
+
 public slots:
        /// idle timeout
        void update_view_state_qt();
+
+       ///
+       virtual void resizeEvent(QResizeEvent * e);
+
+       ///
+       virtual void moveEvent(QMoveEvent * e);
+
 protected:
        /// make sure we quit cleanly
        virtual void closeEvent(QCloseEvent * e);
@@ -94,6 +104,13 @@
        
        ///
        GuiImplementation frontend_;
+
+       ///
+       QRect qtViewGeometry() const;
+       ///
+       QRect normalGeometry_;
+       ///
+       int maxWidth;
 };
 
 } // namespace frontend
Index: src/frontends/qt4/lyx_gui.C
===================================================================
--- src/frontends/qt4/lyx_gui.C (revision 14157)
+++ src/frontends/qt4/lyx_gui.C (working copy)
@@ -194,15 +194,22 @@
        // this can't be done before because it needs the Languages object
        initEncodings();
 
-       boost::shared_ptr<GuiView> view_ptr(new GuiView(width, height));
+       boost::shared_ptr<GuiView> view_ptr(new GuiView);
+
        LyX::ref().addLyXView(view_ptr);
 
        GuiView & view = *view_ptr.get();
 
        view.init();
-               
-       if (posx != -1 && posy != -1) {         
+
+       if (width != -1 && height != -1 && posx != -1 && posy != -1) { 
+#ifndef Q_OS_WIN32
+               // X11: use frameGeometry position
+               view.setGeometry(0, 0, width, height);
+               view.move(posx, posy);
+#else
                view.setGeometry(posx, posy, width, height);
+#endif
                if (maximize)
                        view.setWindowState(Qt::WindowMaximized);
        }
Index: src/frontends/qt4/GuiView.h
===================================================================
--- src/frontends/qt4/GuiView.h (revision 14157)
+++ src/frontends/qt4/GuiView.h (working copy)
@@ -48,8 +48,8 @@
 class GuiView : public QMainWindow, public LyXView {
        Q_OBJECT
 public:
-       /// create a main window of the given dimensions
-       GuiView(unsigned int w, unsigned int h);
+       /// create a main window
+       GuiView();
 
        ~GuiView();
 
@@ -89,6 +89,15 @@
 protected:
        /// make sure we quit cleanly
        virtual void closeEvent(QCloseEvent * e);
+
+#ifndef Q_OS_WIN32
+       ///
+       virtual void resizeEvent(QResizeEvent * e);
+
+       ///
+       virtual void moveEvent(QMoveEvent * e);
+#endif
+
 private:
        /// focus the command buffer widget
        void focus_command_widget();
@@ -112,6 +121,14 @@
        static QMainWindow* mainWidget_;
 
        GuiImplementation frontend_;
+
+#ifndef Q_OS_WIN32
+       ///
+       QRect qtViewGeometry() const;
+
+       ///
+       QRect normalGeometry_;
+#endif
 };
 
 } // namespace frontend
Index: src/frontends/qt4/GuiView.C
===================================================================
--- src/frontends/qt4/GuiView.C (revision 14157)
+++ src/frontends/qt4/GuiView.C (working copy)
@@ -70,7 +70,7 @@
 } // namespace anon
 
 
-GuiView::GuiView(unsigned int width, unsigned int height)
+GuiView::GuiView()
        : QMainWindow(), LyXView(), commandbuffer_(0), frontend_(*this)
 {
        mainWidget_ = this;
@@ -78,7 +78,8 @@
 //     setToolButtonStyle(Qt::ToolButtonIconOnly);
 //     setIconSize(QSize(12,12));
 
-       bufferview_.reset(new BufferView(this, width, height));
+       // -geometry could set the width and hight
+       bufferview_.reset(new BufferView(this, geometry().width(), 
geometry().height()));
 
        menubar_.reset(new QLMenubar(this, menubackend));
        connect(menuBar(), SIGNAL(triggered(QAction *)), this, 
SLOT(updateMenu(QAction *)));
@@ -176,10 +177,44 @@
        return qApp->activeWindow() == this;
 }
 
+#ifndef Q_OS_WIN32
 
+QRect GuiView::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 GuiView::resizeEvent(QResizeEvent *)
+{
+       if (!isMaximized())
+               normalGeometry_ = qtViewGeometry();
+}
+
+void GuiView::moveEvent(QMoveEvent *)
+{
+       if (!isMaximized())
+               normalGeometry_ = qtViewGeometry();
+}
+#endif
+
 void GuiView::closeEvent(QCloseEvent *)
 {
+#ifndef Q_OS_WIN32
+       QRect geometry;
+       if (isMaximized()) 
+               geometry = normalGeometry_;     
+       else
+               geometry = qtViewGeometry();
+#else
        QRect geometry = normalGeometry();
+#endif
+
        Session & session = LyX::ref().session();
        // save windows size and position
        session.saveSessionInfo("WindowWidth", 
convert<string>(geometry.width()));
@@ -199,6 +234,10 @@
 {
        QMainWindow::setWindowTitle(qt_("LyX"));
        QMainWindow::show();
+#ifndef Q_OS_WIN32
+       if (!isMaximized())
+               normalGeometry_ = qtViewGeometry();
+#endif
 }
 
 
Index: src/lyx_main.C
===================================================================
--- src/lyx_main.C      (revision 14157)
+++ src/lyx_main.C      (working copy)
@@ -170,7 +170,7 @@
 
 
 LyX::LyX()
-       : first_start(false)
+       : first_start(false), geometryOption_(false)
 {}
 
 
@@ -335,7 +335,14 @@
                        if (!val.empty())
                                posy = convert<int>(val);
                }
+
+               if (geometryOption_) {
+                       width = -1;
+                       height = -1;
+               }
+
                lyx_gui::start(batch_command, files, width, height, posx, posy, 
maximize);
+
        } else {
                // Something went wrong above
                quitLyX(false);
@@ -995,6 +1002,10 @@
                std::map<string, cmd_helper>::const_iterator it
                        = cmdmap.find(argv[i]);
 
+               // check for X11 -geometry option
+               if (argv[i] == string("-geometry"))
+                       geometryOption_ = true;
+
                // don't complain if not found - may be parsed later
                if (it == cmdmap.end())
                        continue;
Index: src/lyx_main.h
===================================================================
--- src/lyx_main.h      (revision 14157)
+++ src/lyx_main.h      (working copy)
@@ -107,6 +107,10 @@
        ///
        typedef std::list<boost::shared_ptr<LyXView> > ViewList;
        ViewList views_;
+
+       /// 
+       bool geometryOption_;
+
 };
 
 #endif // LYX_MAIN_H

Reply via email to