const QRect QDesktopWidget::availableGeometry(int screen) const { Q_D(const QDesktopWidget); if (qt_desktopwidget_workarea_dirty) { // the workareas are dirty, invalidate them for (int i = 0; i < d->screenCount; ++i) d->workareas[i] = QRect(); qt_desktopwidget_workarea_dirty = false; } if (screen < 0 || screen >= d->screenCount) screen = d->defaultScreen; if (d->workareas[screen].isValid()) return d->workareas[screen]; if (X11->isSupportedByWM(ATOM(_NET_WORKAREA))) { int x11Screen = isVirtualDesktop() ? DefaultScreen(X11->display) : screen; Atom ret; int format, e; unsigned char *data = 0; unsigned long nitems, after; e = XGetWindowProperty(X11->display, QX11Info::appRootWindow(x11Screen), ATOM(_NET_WORKAREA), 0, 4, False, XA_CARDINAL, &ret, &format, &nitems, &after, &data); QRect workArea; if (e == Success && ret == XA_CARDINAL && format == 32 && nitems == 4) { long *workarea = (long *) data; workArea = QRect(workarea[0], workarea[1], workarea[2], workarea[3]); } else { workArea = screenGeometry(screen); } if (isVirtualDesktop()) { // intersect the workarea (which spawns all Xinerama screens) with the rect for the // requested screen workArea &= screenGeometry(screen); } d->workareas[screen] = workArea; if (data) XFree(data); } else { d->workareas[screen] = screenGeometry(screen); } return d->workareas[screen]; }
const QRect QDesktopWidget::availableGeometry(int screen) const { Q_D(const QDesktopWidget); if (qt_desktopwidget_workarea_dirty) { // the workareas are dirty, invalidate them for (int i = 0; i < d->screenCount; ++i) d->workareas[i] = QRect(); qt_desktopwidget_workarea_dirty = false; } if (screen < 0 || screen >= d->screenCount) screen = d->defaultScreen; if (d->workareas[screen].isValid()) return d->workareas[screen]; if ((d->screenCount == 1 || !isVirtualDesktop()) && X11->isSupportedByWM(ATOM(_NET_WORKAREA))) { Atom ret; int format, e; unsigned char *data = 0; unsigned long nitems, after; e = XGetWindowProperty(X11->display, QX11Info::appRootWindow(screen), ATOM(_NET_WORKAREA), 0, 4, False, XA_CARDINAL, &ret, &format, &nitems, &after, &data); if (e == Success && ret == XA_CARDINAL && format == 32 && nitems == 4) { long *workarea = (long *) data; d->workareas[screen].setRect(workarea[0], workarea[1], workarea[2], workarea[3]); } else { d->workareas[screen] = screenGeometry(screen); } if (data) XFree(data); } else { d->workareas[screen] = screenGeometry(screen); } return d->workareas[screen]; }
int QDesktopWidget::qt_metacall(QMetaObject::Call _c, int _id, void **_a) { _id = QWidget::qt_metacall(_c, _id, _a); if (_id < 0) return _id; if (_c == QMetaObject::InvokeMetaMethod) { switch (_id) { case 0: resized((*reinterpret_cast< int(*)>(_a[1]))); break; case 1: workAreaResized((*reinterpret_cast< int(*)>(_a[1]))); break; case 2: screenCountChanged((*reinterpret_cast< int(*)>(_a[1]))); break; default: ; } _id -= 3; } #ifndef QT_NO_PROPERTIES else if (_c == QMetaObject::ReadProperty) { void *_v = _a[0]; switch (_id) { case 0: *reinterpret_cast< bool*>(_v) = isVirtualDesktop(); break; case 1: *reinterpret_cast< int*>(_v) = screenCount(); break; case 2: *reinterpret_cast< int*>(_v) = primaryScreen(); break; } _id -= 3; } else if (_c == QMetaObject::WriteProperty) { _id -= 3; } else if (_c == QMetaObject::ResetProperty) { _id -= 3; } else if (_c == QMetaObject::QueryPropertyDesignable) { _id -= 3; } else if (_c == QMetaObject::QueryPropertyScriptable) { _id -= 3; } else if (_c == QMetaObject::QueryPropertyStored) { _id -= 3; } else if (_c == QMetaObject::QueryPropertyEditable) { _id -= 3; } else if (_c == QMetaObject::QueryPropertyUser) { _id -= 3; } #endif // QT_NO_PROPERTIES return _id; }