I've fixed the save/restore and -geometry problem for Qt4.
Therefore I have to remember lyx if there was the geometry option,
and I have to emulate the QWidget::normalGeometry() function.
I've tested it with Linux and Windows.
Index: frontends/qt4/lyx_gui.C
===================================================================
--- frontends/qt4/lyx_gui.C (Revision 14125)
+++ frontends/qt4/lyx_gui.C (Arbeitskopie)
@@ -233,19 +233,26 @@
// 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();
view.init();
-
- if (posx != -1 && posy != -1) {
- view.setGeometry(posx, posy, width, height);
- if (maximize)
- view.setWindowState(Qt::WindowMaximized);
- }
+ if (!LyX::geometryOption())
+ if (posx != -1 && posy != -1) {
+#ifdef Q_OS_WIN32
+ view.setGeometry(posx, posy, width, height);
+#else
+ // X11: use frameGeometry position
+ view.setGeometry(0, 0, width, height);
+ view.move(posx, posy);
+#endif
+ if (maximize)
+ view.setWindowState(Qt::WindowMaximized);
+ }
+
view.show();
// FIXME: some code below needs moving
Index: frontends/qt4/QtView.C
===================================================================
--- frontends/qt4/QtView.C (Revision 14125)
+++ frontends/qt4/QtView.C (Arbeitskopie)
@@ -70,7 +70,7 @@
} // namespace anon
-QtView::QtView(unsigned int width, unsigned int height)
+QtView::QtView()
: QMainWindow(), LyXView(), commandbuffer_(0)
{
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,12 +177,44 @@
return qApp->activeWindow() == this;
}
+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(!isMaximized())
+ showGeometry_ = qtViewGeometry();
+}
+
+void QtView::moveEvent(QMoveEvent *)
+{
+ if(!isMaximized())
+ showGeometry_ = qtViewGeometry();
+}
+
void QtView::closeEvent(QCloseEvent *)
{
- QRect geometry = normalGeometry();
+ QRect geometry;
+#ifdef Q_OS_WIN32
+ geometry = normalGeometry();
+#else
+ if (isMaximized())
+ geometry = showGeometry_;
+ else
+ geometry = qtViewGeometry();
+
+#endif
+
+ // save windows size and position
Session & session = LyX::ref().session();
- // save windows size and position
session.saveSessionInfo("WindowWidth",
convert<string>(geometry.width()));
session.saveSessionInfo("WindowHeight",
convert<string>(geometry.height()));
session.saveSessionInfo("WindowIsMaximized", (isMaximized() ? "yes" :
"no"));
@@ -199,6 +232,8 @@
{
QMainWindow::setWindowTitle(qt_("LyX"));
QMainWindow::show();
+ if(!isMaximized())
+ showGeometry_ = qtViewGeometry();
}
Index: frontends/qt4/QtView.h
===================================================================
--- frontends/qt4/QtView.h (Revision 14125)
+++ frontends/qt4/QtView.h (Arbeitskopie)
@@ -46,8 +46,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();
@@ -84,6 +84,13 @@
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();
@@ -105,6 +112,13 @@
///
static QMainWindow* mainWidget_;
+
+ ///
+ QRect qtViewGeometry() const;
+
+ ///
+ QRect showGeometry_;
+
};
} // namespace frontend
Index: lyx_main.C
===================================================================
--- lyx_main.C (Revision 14125)
+++ lyx_main.C (Arbeitskopie)
@@ -973,6 +973,14 @@
} // namespace anon
+bool LyX::geometryOption()
+{
+ return geometryOption_;
+}
+
+bool LyX::geometryOption_ = false;
+
+
bool LyX::easyParse(int & argc, char * argv[])
{
std::map<string, cmd_helper> cmdmap;
@@ -995,6 +1003,11 @@
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: lyx_main.h
===================================================================
--- lyx_main.h (Revision 14125)
+++ lyx_main.h (Arbeitskopie)
@@ -65,6 +65,9 @@
*/
Buffer const * const updateInset(InsetBase const *) const;
+ /// returns true when '-geometry' was used in the command line
+ static bool geometryOption();
+
private:
static boost::scoped_ptr<LyX> singleton_;
@@ -107,6 +110,11 @@
///
typedef std::list<boost::shared_ptr<LyXView> > ViewList;
ViewList views_;
+
+ ///
+ static bool geometryOption_;
+
+
};
#endif // LYX_MAIN_H