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