]> git.lyx.org Git - features.git/commitdiff
fix: qt3/qt4 save/restore of the window geometry and maximize status
authorPeter Kümmel <syntheticpp@gmx.net>
Wed, 21 Jun 2006 10:30:32 +0000 (10:30 +0000)
committerPeter Kümmel <syntheticpp@gmx.net>
Wed, 21 Jun 2006 10:30:32 +0000 (10:30 +0000)
git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@14166 a592a061-630c-0410-9148-cb99ea01b6c8

src/frontends/qt3/QtView.C
src/frontends/qt3/QtView.h
src/frontends/qt3/lyx_gui.C
src/frontends/qt4/GuiView.C
src/frontends/qt4/GuiView.h
src/frontends/qt4/lyx_gui.C
src/lyx_main.C
src/lyx_main.h

index 1e1bab55405fcf7cae79cf32ab98d36a577edb6d..ca7953d52e278bf5471498c1ef7c460adcf6cc9e 100644 (file)
@@ -37,6 +37,8 @@
 #include <qpixmap.h>
 #include <qstatusbar.h>
 
+#include <algorithm>
+
 using std::string;
 
 FontLoader fontloader;
@@ -55,14 +57,12 @@ int const statusbar_timer_value = 3000;
 
 
 
-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 +157,49 @@ bool QtView::hasFocus() const
        return qApp->activeWindow() == this;
 }
 
+void QtView::initFloatingGeometry(QRect const & g)
+{
+       floatingGeometry_ = g;
+       maxWidth = QApplication::desktop()->width() - 20;
+}
+
+void QtView::updateFloatingGeometry()
+{
+       if (width() < maxWidth && frameGeometry().x() > 0)
+       {
+               // setX/Y changes the size!
+               floatingGeometry_.setX(x());
+               floatingGeometry_.setY(y());
+               floatingGeometry_.setWidth(width());
+               floatingGeometry_.setHeight(height());
+       }
+}
+
+void QtView::resizeEvent(QResizeEvent *)
+{
+       maxWidth = std::max(width(), maxWidth);
+               
+       updateFloatingGeometry();                       
+}
+
+void QtView::moveEvent(QMoveEvent *)
+{
+       updateFloatingGeometry();       
+}
 
 void QtView::closeEvent(QCloseEvent *)
 {
+       updateFloatingGeometry();       
+       QRect geometry = floatingGeometry_;
+
        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 +211,7 @@ void QtView::show()
 {
        setCaption(qt_("LyX"));
        QMainWindow::show();
+       updateFloatingGeometry();
 }
 
 
index 29cf568f5d796c51400d30e9e28598240b318290..75286f8d068fe7ba4eef6c9b3caed683ce1896dd 100644 (file)
@@ -38,8 +38,8 @@ class QCommandBuffer;
 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 @@ public:
        //
        lyx::frontend::Gui & gui() { return frontend_; }
 
+       ///
+       void initFloatingGeometry(QRect const &);
+
 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 @@ private:
        
        ///
        GuiImplementation frontend_;
+
+       ///
+       void updateFloatingGeometry();
+       ///
+       QRect floatingGeometry_;
+       ///
+       int maxWidth;
 };
 
 } // namespace frontend
index f58f5cf564bfb695829f5144d640959be7efe09f..7336f7f616a3fcbaceeccec8055039c8f8cf5597 100644 (file)
@@ -222,22 +222,29 @@ void parse_lyxrc()
 
 
 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.show();
        view.init();
 
+       if (width != -1 && height != -1) { 
+               view.initFloatingGeometry(QRect(posx, posy, width, height));
+               view.resize(width, height);
+               if (posx != -1 && posy != -1)
+                       view.move(posx, posy);
+               view.show();
+               if (maximize)
+                       view.setWindowState(Qt::WindowMaximized);
+       } else
+               view.show();
+
        // FIXME: some code below needs moving
 
        lyxserver = new LyXServer(&view.getLyXFunc(), lyxrc.lyxpipes);
index 013526306d0bb904150b4f83acf5732f7f1572fc..840c406b101e669444b2e71b0c7186021c377907 100644 (file)
@@ -45,8 +45,6 @@
 #include <QToolBar>
 #include <QCloseEvent>
 #include <QAction>
-//#include <QMenu>
-//#include <QMenuBar>
 
 #include "support/lstrings.h"
 
@@ -70,7 +68,7 @@ int const statusbar_timer_value = 3000;
 } // namespace anon
 
 
-GuiView::GuiView(unsigned int width, unsigned int height)
+GuiView::GuiView()
        : QMainWindow(), LyXView(), commandbuffer_(0), frontend_(*this)
 {
        mainWidget_ = this;
@@ -78,7 +76,8 @@ GuiView::GuiView(unsigned int width, unsigned int height)
 //     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,12 +175,45 @@ bool GuiView::hasFocus() const
        return qApp->activeWindow() == this;
 }
 
+void  GuiView::updateFloatingGeometry() 
+{
+       if (!isMaximized()) {
+               // setX/Y changes the size!
+               floatingGeometry_.setX(x()); 
+               floatingGeometry_.setY(y()); 
+               floatingGeometry_.setWidth(width()); 
+               floatingGeometry_.setHeight(height());
+       }
+}
+
+void GuiView::resizeEvent(QResizeEvent *)
+{
+       updateFloatingGeometry();
+}
+
+void GuiView::moveEvent(QMoveEvent *)
+{
+       updateFloatingGeometry();
+}
+
 
 void GuiView::closeEvent(QCloseEvent *)
 {
+       // FIXME: 
+       // change the ifdef to 'geometry = normalGeometry();' only
+       // when Trolltech has fixed the broken normalGeometry on X11.
+       // Then also the moveEvent, resizeEvent, and the
+       // code for floatingGeometry_ can be removed;
+       // adjust lyx_gui::start
+#ifdef Q_OS_WIN32
        QRect geometry = normalGeometry();
-       Session & session = LyX::ref().session();
+#else
+       updateFloatingGeometry();
+       QRect geometry = floatingGeometry_;     
+#endif
+       
        // save windows size and position
+       Session & session = LyX::ref().session();
        session.saveSessionInfo("WindowWidth", convert<string>(geometry.width()));
        session.saveSessionInfo("WindowHeight", convert<string>(geometry.height()));
        session.saveSessionInfo("WindowIsMaximized", (isMaximized() ? "yes" : "no"));
@@ -199,6 +231,7 @@ void GuiView::show()
 {
        QMainWindow::setWindowTitle(qt_("LyX"));
        QMainWindow::show();
+       updateFloatingGeometry();
 }
 
 
index 66a7d5a9f75d5eb543498292264be667350202a4..f77fbc7989bfbd4c3c5ce8c46508e403bc028fdd 100644 (file)
@@ -48,8 +48,8 @@ QWidget* mainWindow();
 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,13 @@ public slots:
 protected:
        /// make sure we quit cleanly
        virtual void closeEvent(QCloseEvent * e);
+
+       ///
+       virtual void resizeEvent(QResizeEvent * e);
+
+       ///
+       virtual void moveEvent(QMoveEvent * e);
+
 private:
        /// focus the command buffer widget
        void focus_command_widget();
@@ -112,6 +119,11 @@ private:
        static QMainWindow* mainWidget_;
 
        GuiImplementation frontend_;
+
+       ///
+       void updateFloatingGeometry();
+       ///
+       QRect floatingGeometry_;
 };
 
 } // namespace frontend
index ed9116e3b400dc6dd91a623b59b43fc1177fe6cd..e1d8ce12ed80a06b7e54129b790431fb4e8266a3 100644 (file)
@@ -194,15 +194,31 @@ void start(string const & batch, vector<string> const & files,
        // 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) {         
-               view.setGeometry(posx, posy, width, height);
+
+       // only true when the -geometry option was NOT used
+       if (width != -1 && height != -1)
+       {
+               if (posx != -1 && posy != -1)
+               {
+#ifdef Q_OS_WIN32
+                       // FIXME: use only setGeoemtry when Trolltech has
+                       // fixed the qt4/X11 bug
+                       view.setGeometry(posx, posy,width, height);
+#else
+                       view.resize(width, height);
+                       view.move(posx, posy);
+#endif
+               } else {
+                       view.resize(width, height);
+               }
+
                if (maximize)
                        view.setWindowState(Qt::WindowMaximized);
        }
index 7443434b3bcef817388ff7e309a9f8953b12b92a..226bbb998f86dbd77a5b0a3860e6cb4b17b0cb5a 100644 (file)
@@ -170,7 +170,7 @@ LyX const & LyX::cref()
 
 
 LyX::LyX()
-       : first_start(false)
+       : first_start(false), geometryOption_(false)
 {}
 
 
@@ -335,7 +335,14 @@ void LyX::exec2(int & argc, char * argv[])
                        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 @@ bool LyX::easyParse(int & argc, char * argv[])
                std::map<string, cmd_helper>::const_iterator it
                        = cmdmap.find(argv[i]);
 
+               // check for X11 -geometry option
+               if (lyx::support::compare(argv[i], "-geometry") == 0)
+                       geometryOption_ = true;
+
                // don't complain if not found - may be parsed later
                if (it == cmdmap.end())
                        continue;
index 15bb2ef63629304c35d3d0656416b1a117fc3fb9..550619784aa5ed4f3d7564f6659533e9601e7372 100644 (file)
@@ -107,6 +107,10 @@ private:
        ///
        typedef std::list<boost::shared_ptr<LyXView> > ViewList;
        ViewList views_;
+
+       /// 
+       bool geometryOption_;
+
 };
 
 #endif // LYX_MAIN_H