src/gui/kernel/qdesktopwidget_mac.mm
changeset 0 1918ee327afb
child 3 41300fa6a67c
equal deleted inserted replaced
-1:000000000000 0:1918ee327afb
       
     1 /****************************************************************************
       
     2 **
       
     3 ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
       
     4 ** All rights reserved.
       
     5 ** Contact: Nokia Corporation (qt-info@nokia.com)
       
     6 **
       
     7 ** This file is part of the QtGui module of the Qt Toolkit.
       
     8 **
       
     9 ** $QT_BEGIN_LICENSE:LGPL$
       
    10 ** No Commercial Usage
       
    11 ** This file contains pre-release code and may not be distributed.
       
    12 ** You may use this file in accordance with the terms and conditions
       
    13 ** contained in the Technology Preview License Agreement accompanying
       
    14 ** this package.
       
    15 **
       
    16 ** GNU Lesser General Public License Usage
       
    17 ** Alternatively, this file may be used under the terms of the GNU Lesser
       
    18 ** General Public License version 2.1 as published by the Free Software
       
    19 ** Foundation and appearing in the file LICENSE.LGPL included in the
       
    20 ** packaging of this file.  Please review the following information to
       
    21 ** ensure the GNU Lesser General Public License version 2.1 requirements
       
    22 ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
       
    23 **
       
    24 ** In addition, as a special exception, Nokia gives you certain additional
       
    25 ** rights.  These rights are described in the Nokia Qt LGPL Exception
       
    26 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
       
    27 **
       
    28 ** If you have questions regarding the use of this file, please contact
       
    29 ** Nokia at qt-info@nokia.com.
       
    30 **
       
    31 **
       
    32 **
       
    33 **
       
    34 **
       
    35 **
       
    36 **
       
    37 **
       
    38 ** $QT_END_LICENSE$
       
    39 **
       
    40 ****************************************************************************/
       
    41 
       
    42 /****************************************************************************
       
    43 **
       
    44 ** Copyright (c) 2007-2008, Apple, Inc.
       
    45 **
       
    46 ** All rights reserved.
       
    47 **
       
    48 ** Redistribution and use in source and binary forms, with or without
       
    49 ** modification, are permitted provided that the following conditions are met:
       
    50 **
       
    51 **   * Redistributions of source code must retain the above copyright notice,
       
    52 **     this list of conditions and the following disclaimer.
       
    53 **
       
    54 **   * Redistributions in binary form must reproduce the above copyright notice,
       
    55 **     this list of conditions and the following disclaimer in the documentation
       
    56 **     and/or other materials provided with the distribution.
       
    57 **
       
    58 **   * Neither the name of Apple, Inc. nor the names of its contributors
       
    59 **     may be used to endorse or promote products derived from this software
       
    60 **     without specific prior written permission.
       
    61 **
       
    62 ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
       
    63 ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
       
    64 ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
       
    65 ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
       
    66 ** CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
       
    67 ** EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
       
    68 ** PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
       
    69 ** PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
       
    70 ** LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
       
    71 ** NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
       
    72 ** SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
       
    73 **
       
    74 ****************************************************************************/
       
    75 
       
    76 #import <Cocoa/Cocoa.h>
       
    77 
       
    78 #include "qapplication.h"
       
    79 #include "qdesktopwidget.h"
       
    80 #include <private/qt_mac_p.h>
       
    81 #include "qwidget_p.h"
       
    82 #include <private/qt_cocoa_helpers_mac_p.h>
       
    83 #include <private/qdesktopwidget_mac_p.h>
       
    84 
       
    85 QT_BEGIN_NAMESPACE
       
    86 
       
    87 QT_USE_NAMESPACE
       
    88 
       
    89 /*****************************************************************************
       
    90   Externals
       
    91  *****************************************************************************/
       
    92 
       
    93 /*****************************************************************************
       
    94   QDesktopWidget member functions
       
    95  *****************************************************************************/
       
    96 
       
    97 Q_GLOBAL_STATIC(QDesktopWidgetImplementation, qdesktopWidgetImplementation)
       
    98 
       
    99 QDesktopWidgetImplementation::QDesktopWidgetImplementation()
       
   100     : appScreen(0)
       
   101 {
       
   102     onResize();
       
   103 }
       
   104 
       
   105 QDesktopWidgetImplementation::~QDesktopWidgetImplementation()
       
   106 {
       
   107 }
       
   108 
       
   109 QDesktopWidgetImplementation *QDesktopWidgetImplementation::instance()
       
   110 {
       
   111     return qdesktopWidgetImplementation();
       
   112 }
       
   113 
       
   114 QRect QDesktopWidgetImplementation::availableRect(int screenIndex) const
       
   115 {
       
   116     if (screenIndex < 0 || screenIndex >= screenCount)
       
   117         screenIndex = appScreen;
       
   118 
       
   119 	return availableRects[screenIndex].toRect(); 
       
   120 }
       
   121 
       
   122 QRect QDesktopWidgetImplementation::screenRect(int screenIndex) const
       
   123 {
       
   124     if (screenIndex < 0 || screenIndex >= screenCount)
       
   125         screenIndex = appScreen;
       
   126 
       
   127     return screenRects[screenIndex].toRect();
       
   128 }
       
   129 
       
   130 void QDesktopWidgetImplementation::onResize()
       
   131 {
       
   132     QMacCocoaAutoReleasePool pool; 
       
   133     NSArray *displays = [NSScreen screens]; 
       
   134     screenCount = [displays count]; 
       
   135  
       
   136     screenRects.clear(); 
       
   137     availableRects.clear(); 
       
   138     NSRect primaryRect = [[displays objectAtIndex:0] frame]; 
       
   139     for (int i = 0; i<screenCount; i++) { 
       
   140         NSRect r = [[displays objectAtIndex:i] frame]; 
       
   141         const int flippedY = - r.origin.y +            // account for position offset and 
       
   142               primaryRect.size.height - r.size.height; // height difference. 
       
   143         screenRects.append(QRectF(r.origin.x, flippedY, 
       
   144             r.size.width, r.size.height)); 
       
   145         r = [[displays objectAtIndex:i] visibleFrame]; 
       
   146         availableRects.append(QRectF(r.origin.x, flippedY, 
       
   147                 r.size.width, r.size.height)); 
       
   148     } 
       
   149 }
       
   150 
       
   151 
       
   152 
       
   153 QDesktopWidget::QDesktopWidget()
       
   154     : QWidget(0, Qt::Desktop)
       
   155 {
       
   156     setObjectName(QLatin1String("desktop"));
       
   157     setAttribute(Qt::WA_WState_Visible);
       
   158 }
       
   159 
       
   160 QDesktopWidget::~QDesktopWidget()
       
   161 {
       
   162 }
       
   163 
       
   164 bool QDesktopWidget::isVirtualDesktop() const
       
   165 {
       
   166     return true;
       
   167 }
       
   168 
       
   169 int QDesktopWidget::primaryScreen() const
       
   170 {
       
   171     return qdesktopWidgetImplementation()->appScreen;
       
   172 }
       
   173 
       
   174 int QDesktopWidget::numScreens() const
       
   175 {
       
   176     return qdesktopWidgetImplementation()->screenCount;
       
   177 }
       
   178 
       
   179 QWidget *QDesktopWidget::screen(int)
       
   180 {
       
   181     return this;
       
   182 }
       
   183 
       
   184 const QRect QDesktopWidget::availableGeometry(int screen) const
       
   185 {
       
   186     return qdesktopWidgetImplementation()->availableRect(screen);
       
   187 }
       
   188 
       
   189 const QRect QDesktopWidget::screenGeometry(int screen) const
       
   190 {
       
   191     return qdesktopWidgetImplementation()->screenRect(screen);
       
   192 }
       
   193 
       
   194 int QDesktopWidget::screenNumber(const QWidget *widget) const
       
   195 {
       
   196     QDesktopWidgetImplementation *d = qdesktopWidgetImplementation();
       
   197     if (!widget)
       
   198         return d->appScreen;
       
   199     QRect frame = widget->frameGeometry();
       
   200     if (!widget->isWindow())
       
   201         frame.moveTopLeft(widget->mapToGlobal(QPoint(0,0)));
       
   202     int maxSize = -1, maxScreen = -1;
       
   203     for (int i = 0; i < d->screenCount; ++i) {
       
   204         QRect rr = d->screenRect(i);
       
   205         QRect sect = rr.intersected(frame);
       
   206         int size = sect.width() * sect.height();
       
   207         if (size > maxSize && sect.width() > 0 && sect.height() > 0) {
       
   208             maxSize = size;
       
   209             maxScreen = i;
       
   210         }
       
   211     }
       
   212     return maxScreen;
       
   213 }
       
   214 
       
   215 int QDesktopWidget::screenNumber(const QPoint &point) const
       
   216 {
       
   217     QDesktopWidgetImplementation *d = qdesktopWidgetImplementation();
       
   218     int closestScreen = -1;
       
   219     int shortestDistance = INT_MAX;
       
   220     for (int i = 0; i < d->screenCount; ++i) {
       
   221         QRect rr = d->screenRect(i);
       
   222         int thisDistance = QWidgetPrivate::pointToRect(point, rr);
       
   223         if (thisDistance < shortestDistance) {
       
   224             shortestDistance = thisDistance;
       
   225             closestScreen = i;
       
   226         }
       
   227     }
       
   228     return closestScreen;
       
   229 }
       
   230 
       
   231 void QDesktopWidget::resizeEvent(QResizeEvent *)
       
   232 {
       
   233     QDesktopWidgetImplementation *d = qdesktopWidgetImplementation();
       
   234 
       
   235     const int oldScreenCount = d->screenCount;
       
   236     const QVector<QRectF> oldRects(d->screenRects);
       
   237     const QVector<QRectF> oldWorks(d->availableRects);
       
   238 
       
   239     d->onResize();
       
   240 
       
   241     for (int i = 0; i < qMin(oldScreenCount, d->screenCount); ++i) {
       
   242         if (oldRects.at(i) != d->screenRects.at(i))
       
   243             emit resized(i);
       
   244     }
       
   245     for (int i = 0; i < qMin(oldScreenCount, d->screenCount); ++i) {
       
   246         if (oldWorks.at(i) != d->availableRects.at(i))
       
   247             emit workAreaResized(i);
       
   248     }
       
   249 
       
   250     if (oldScreenCount != d->screenCount)
       
   251         emit screenCountChanged(d->screenCount);
       
   252 }
       
   253 
       
   254 QT_END_NAMESPACE