Peter Kümmel wrote:
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.

Hello Peter,

Thanks for the updated patch and sorry for the inconvenience that my merging activity has caused to you.

Please find my comments below. Don't take them personally please and feel free to contradict me if you think I'm wrong.


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
===================================================================

-       boost::shared_ptr<QtView> view_ptr(new QtView(width, height));
+       boost::shared_ptr<QtView> view_ptr(new QtView);

Note that in my next cleanup round I will move the QtView creation from lyx_gui to GuiImplementation.

        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();

So you don't need LyXView::init() anymore or is it done elsewhere?

// 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()));

I think there might be a problem there. BufferView needs the size of the WorkArea but width() and height() will give you the size of the window, including menubar and toolbars. But I guess this is OK now because a resize event will happen just afterward and readjust the BufferView to the proper WorkArea size. So I guess that passing 100x100 or whatever will produce the same effect.

menubar_.reset(new QLMenubar(this, menubackend));
        getToolbars().init();
@@ -157,17 +155,62 @@
        return qApp->activeWindow() == this;
 }
+void QtView::initNormalGeometry(const QRect & g)

+void QtView::resetGeometry(const QRect & g)

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

+QRect QtView::getGeometry() 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();

This is just for updating x and y position isn't it? Why do we need that by the way? Because you want to save this in the session info as well. I guess it make sense on Windows but won't this clash with Window manager that do this under X11?


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);

I don't like the #ifndef at all. Why do we need them? Why only for qt4?


        }
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

Same here. IMO if these methods are really necessary define them in any case. The #ifdef code in GuiView.C should then be encapsulated in some helper functions somewhere that will set the geometry of QWidget depending on the platform. Please understand that I've worked hard to avoid special cases in general code and I don't want them to come back. X11/Mac/WIn specific code should go in helper functions.


+
 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 getGeometry() const;

+
+       ///
+       QRect normalGeometry_;
+#endif


remove the #ifndef please.


 };
} // 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()));


My comments to qt3 version are also valid here.


        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

Please remove.

+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;
+

I have read somewhere that QApplication already understand this option. How would this interact with your code here?


                // 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