On Mon, Aug 25, 2014 at 06:54:05PM +0200, Enrico Forestieri wrote: > commit 565260126eb106ab00049285627417e73736bb96 > Author: Enrico Forestieri <for...@lyx.org> > Date: Mon Aug 25 18:35:15 2014 +0200 > > Fix the -geometry command line argument for Windows. > > The command line argument -geometry WIDTHxHEIGHT±XOFF±YOFF > specifies a preferred size and location for the main window. > Currently, this is semi-broken on Windows. Indeed, only > specifying WIDTH and HEIGHT places the main window such that > the left and top borders are invisible such that the window cannot > be moved. Moreover, the XOFF and YOFF parts (when present) are > used to specify the distance of the window from the left and top > or right and bottom edges of the screen, when using '+' or '-', > respectively. However, -geometry 800x600-20-20, instead of placing > the window such that its bottom and right edges are at a distance > of 20 pixels from the corresponding screen edges, places the > window such that its left and top borders are out of the screen. > This is corrected by this commit, which also addresses the fact > that Qt5 does not define Q_WS_WIN anymore.
Richard, may I apply this to the stable branch? (Minus the Qt5 part, of course) > diff --git a/src/frontends/qt4/GuiApplication.cpp > b/src/frontends/qt4/GuiApplication.cpp > index 56cbd60..64c645d 100644 > --- a/src/frontends/qt4/GuiApplication.cpp > +++ b/src/frontends/qt4/GuiApplication.cpp > @@ -87,6 +87,7 @@ > #include <QByteArray> > #include <QClipboard> > #include <QDateTime> > +#include <QDesktopWidget> > #include <QDir> > #include <QEvent> > #include <QEventLoop> > @@ -2193,16 +2194,40 @@ void GuiApplication::createView(QString const & > geometry_arg, bool autoShow, > } > > if (!geometry_arg.isEmpty()) { > -#ifdef Q_WS_WIN > +#if defined(Q_OS_WIN) || defined(Q_CYGWIN_WIN) > int x, y; > int w, h; > - QRegExp re( "[=]*(?:([0-9]+)[xX]([0-9]+)){0,1}[ > ]*(?:([+-][0-9]*)([+-][0-9]*)){0,1}" ); > + QChar sx, sy; > + QRegExp re( "[=]*(?:([0-9]+)[xX]([0-9]+)){0,1}[ > ]*(?:([+-][0-9]*)){0,1}(?:([+-][0-9]*)){0,1}" ); > re.indexIn(geometry_arg); > w = re.cap(1).toInt(); > h = re.cap(2).toInt(); > x = re.cap(3).toInt(); > y = re.cap(4).toInt(); > + sx = re.cap(3).isEmpty() ? '+' : re.cap(3).at(0); > + sy = re.cap(4).isEmpty() ? '+' : re.cap(4).at(0); > + // Set initial geometry such that we can get the frame size. > view->setGeometry(x, y, w, h); > + int framewidth = view->geometry().x() - view->x(); > + int titleheight = view->geometry().y() - view->y(); > + // Negative displacements must be interpreted as distances > + // from the right or bottom screen borders. > + if (sx == '-' || sy == '-') { > + QRect rec = QApplication::desktop()->screenGeometry(); > + if (sx == '-') > + x += rec.width() - w - framewidth; > + if (sy == '-') > + y += rec.height() - h - titleheight; > + view->setGeometry(x, y, w, h); > + } > + // Make sure that the left and top frame borders are visible. > + if (view->x() < 0 || view->y() < 0) { > + if (view->x() < 0) > + x = framewidth; > + if (view->y() < 0) > + y = titleheight; > + view->setGeometry(x, y, w, h); > + } > #endif > } > view->setFocus(); -- Enrico