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.

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

Reply via email to