diff options
-rw-r--r-- | mcompositor/main.cpp | 9 | ||||
-rw-r--r-- | src/mcompositemanager.cpp | 144 | ||||
-rw-r--r-- | src/mcompositemanager_p.h | 5 | ||||
-rw-r--r-- | src/mcompositescene.cpp | 22 | ||||
-rw-r--r-- | src/mcompositescene.h | 10 |
5 files changed, 51 insertions, 139 deletions
diff --git a/mcompositor/main.cpp b/mcompositor/main.cpp index d8837b4..adfd636 100644 --- a/mcompositor/main.cpp +++ b/mcompositor/main.cpp @@ -44,7 +44,6 @@ int main(int argc, char *argv[]) view.setWindowFlags(Qt::X11BypassWindowManagerHint); view.setAttribute(Qt::WA_NoSystemBackground); #if QT_VERSION >= 0x040600 - view.move(-2, -2); view.setViewportUpdateMode(QGraphicsView::NoViewportUpdate); view.setOptimizationFlags(QGraphicsView::IndirectPainting); #endif @@ -53,10 +52,10 @@ int main(int argc, char *argv[]) view.setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); view.setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); view.setSizePolicy(QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed)); - view.setMinimumSize(QApplication::desktop()->width() + 2, - QApplication::desktop()->height() + 2); - view.setMaximumSize(QApplication::desktop()->width() + 2, - QApplication::desktop()->height() + 2); + view.setMinimumSize(QApplication::desktop()->width(), + QApplication::desktop()->height()); + view.setMaximumSize(QApplication::desktop()->width(), + QApplication::desktop()->height()); QGLFormat fmt; fmt.setSamples(0); diff --git a/src/mcompositemanager.cpp b/src/mcompositemanager.cpp index 8d5e28a..6ab50b5 100644 --- a/src/mcompositemanager.cpp +++ b/src/mcompositemanager.cpp @@ -353,61 +353,6 @@ Atom MCompAtoms::getAtom(Window w, Atoms atomtype) return 0; } -class MapRequesterPrivate: public QObject -{ - Q_OBJECT -public: - static MapRequesterPrivate* instance(QObject* parent = 0) - { - if (!d) - d = new MapRequesterPrivate(parent); - return d; - } - - void requestMap(MWindowPropertyCache *window) - { - if (!((MCompositeManager *) qApp)->isCompositing() - // if something is already queueing, add to the queue, otherwise - // the mapping order goes wrong - || !map_requests.isEmpty()) - map_requests.push_back(window); - else { - // create the damage object before mapping to get 'em all - if (!mcmp->device_state->displayOff()) - window->damageTracking(true); - window->setBeingMapped(true); // don't disable compositing - XMapWindow(QX11Info::display(), window->winId()); - } - } - -public slots: - void grantMapRequests() - { - while (!map_requests.isEmpty()) { - // first come first served - MWindowPropertyCache *w = map_requests.takeFirst(); - // create the damage object before mapping to get 'em all - if (!mcmp->device_state->displayOff()) - w->damageTracking(true); - w->setBeingMapped(true); // don't disable compositing - XMapWindow(QX11Info::display(), w->winId()); - } - } - -private: - QList<MWindowPropertyCache*> map_requests; - explicit MapRequesterPrivate(QObject* parent = 0) - :QObject(parent) - { - mcmp = dynamic_cast<MCompositeManagerPrivate*>(parent); - } - - static MapRequesterPrivate *d; - MCompositeManagerPrivate *mcmp; -}; - -MapRequesterPrivate* MapRequesterPrivate::d = 0; - static Window transient_for(Window window) { Window transient_for = 0; @@ -744,7 +689,6 @@ MCompositeManagerPrivate::MCompositeManagerPrivate(QObject *p) watch = new MCompositeScene(this); atom = MCompAtoms::instance(); - MapRequesterPrivate::instance(this); device_state = new MDeviceState(this); connect(device_state, SIGNAL(displayStateChange(bool)), @@ -753,8 +697,6 @@ MCompositeManagerPrivate::MCompositeManagerPrivate(QObject *p) this, SLOT(callOngoing(bool))); stacking_timer.setSingleShot(true); connect(&stacking_timer, SIGNAL(timeout()), this, SLOT(stackingTimeout())); - connect(this, SIGNAL(compositingEnabled()), MapRequesterPrivate::instance(this), - SLOT(grantMapRequests())); connect(this, SIGNAL(currentAppChanged(Window)), this, SLOT(setupButtonWindows(Window))); } @@ -778,20 +720,6 @@ Window MCompositeManagerPrivate::parentWindow(Window child) return p; } -void MCompositeManagerPrivate::disableInput() -{ - watch->setupOverlay(xoverlay, QRect(0, 0, 0, 0), true); - watch->setupOverlay(localwin, QRect(0, 0, 0, 0), true); -} - -void MCompositeManagerPrivate::enableInput() -{ - watch->setupOverlay(xoverlay, QRect(0, 0, 0, 0)); - watch->setupOverlay(localwin, QRect(0, 0, 0, 0)); - - emit inputEnabled(); -} - static void setup_key_grabs() { Display* dpy = QX11Info::display(); @@ -850,7 +778,6 @@ void MCompositeManagerPrivate::prepare() overlay_mapped = false; // make sure we try to map it in startup XReparentWindow(QX11Info::display(), localwin, xoverlay, 0, 0); localwin_parent = xoverlay; - enableInput(); XDamageQueryExtension(QX11Info::display(), &damage_event, &damage_error); @@ -1164,8 +1091,7 @@ bool MCompositeManagerPrivate::possiblyUnredirectTopmostWindow() } } if (compositing) { - scene()->views()[0]->setUpdatesEnabled(false); - XUnmapWindow(QX11Info::display(), xoverlay); + showOverlayWindow(false); compositing = false; } ret = true; @@ -1535,7 +1461,7 @@ void MCompositeManagerPrivate::mapRequestEvent(XMapRequestEvent *e) } #ifdef WINDOW_DEBUG - overhead_measure.start(); + if (debug_mode) overhead_measure.start(); #endif const QList<Atom> &states = pc->netWmState(); @@ -1551,8 +1477,6 @@ void MCompositeManagerPrivate::mapRequestEvent(XMapRequestEvent *e) setWindowState(e->window, NormalState); if (needDecoration(e->window, pc)) { if (MDecoratorFrame::instance()->decoratorItem()) { - enableCompositing(); - MapRequesterPrivate::instance()->requestMap(pc); // initially visualize decorator item so selective compositing // checks won't disable compositing MDecoratorFrame::instance()->decoratorItem()->setVisible(true); @@ -1604,12 +1528,15 @@ void MCompositeManagerPrivate::mapRequestEvent(XMapRequestEvent *e) XSync(QX11Info::display(), False); #else - MapRequesterPrivate::instance()->requestMap(pc); qWarning("%s: mdecorator hasn't started yet", __func__); #endif } - } else - MapRequesterPrivate::instance()->requestMap(pc); + } + // create the damage object before mapping to get 'em all + if (!device_state->displayOff()) + pc->damageTracking(true); + pc->setBeingMapped(true); // don't disable compositing + XMapWindow(QX11Info::display(), e->window); } /* recursion is needed to handle transients that are transient for other @@ -2140,8 +2067,7 @@ void MCompositeManagerPrivate::mapEvent(XMapEvent *e) Window win = e->window; if (win == xoverlay) { - overlay_mapped = true; - enableRedirection(); + showOverlayWindow(true); return; } if (win == localwin || win == localwin_parent || win == close_button_win @@ -2993,7 +2919,7 @@ void MCompositeManagerPrivate::redirectWindows() // in main() causes it even if we don't map it explicitly) XEvent xevent; XIfEvent(QX11Info::display(), &xevent, map_predicate, (XPointer)xoverlay); - XUnmapWindow(QX11Info::display(), xoverlay); + showOverlayWindow(false); if (!possiblyUnredirectTopmostWindow()) enableCompositing(true); } @@ -3176,8 +3102,6 @@ MCompositeWindow *MCompositeManagerPrivate::bindWindow(Window window) } else if (pc->windowType() == MCompAtoms::DESKTOP) { // just in case startup sequence changes stack[DESKTOP_LAYER] = window; - connect(this, SIGNAL(inputEnabled()), item, - SLOT(setUnBlurred())); dirtyStacking(false); return item; } @@ -3203,7 +3127,6 @@ void MCompositeManagerPrivate::addItem(MCompositeWindow *item) watch->addItem(item); updateWinList(); setWindowDebugProperties(item->window()); - connect(item, SIGNAL(acceptingInput()), SLOT(enableInput())); if (atom->windowType(item->window()) == MCompAtoms::DESKTOP) { connect(item, SIGNAL(desktopActivated(MCompositeWindow *)), @@ -3282,17 +3205,46 @@ void MCompositeManagerPrivate::enableCompositing(bool forced) return; if (!overlay_mapped) - mapOverlayWindow(); + showOverlayWindow(true); else enableRedirection(); } -void MCompositeManagerPrivate::mapOverlayWindow() +void MCompositeManagerPrivate::showOverlayWindow(bool show) { - // Freeze painting of framebuffer as of this point - scene()->views()[0]->setUpdatesEnabled(false); - XMoveWindow(QX11Info::display(), localwin, -2, -2); - XMapWindow(QX11Info::display(), xoverlay); + static bool first_call = true; + static XRectangle empty = {0, 0, 0, 0}, + fs = {0, 0, + ScreenOfDisplay(QX11Info::display(), + DefaultScreen(QX11Info::display()))->width, + ScreenOfDisplay(QX11Info::display(), + DefaultScreen(QX11Info::display()))->height}; + if (!show && (overlay_mapped || first_call)) { + scene()->views()[0]->setUpdatesEnabled(false); + XShapeCombineRectangles(QX11Info::display(), xoverlay, + ShapeBounding, 0, 0, &empty, 1, + ShapeSet, Unsorted); + XShapeCombineRectangles(QX11Info::display(), localwin, + ShapeBounding, 0, 0, &empty, 1, + ShapeSet, Unsorted); + overlay_mapped = false; + } else if (show && (!overlay_mapped || first_call)) { + XShapeCombineRectangles(QX11Info::display(), xoverlay, + ShapeBounding, 0, 0, &fs, 1, + ShapeSet, Unsorted); + XShapeCombineRectangles(QX11Info::display(), localwin, + ShapeBounding, 0, 0, &fs, 1, + ShapeSet, Unsorted); + XserverRegion r = XFixesCreateRegion(QX11Info::display(), &empty, 1); + XFixesSetWindowShapeRegion(QX11Info::display(), xoverlay, + ShapeInput, 0, 0, r); + XFixesSetWindowShapeRegion(QX11Info::display(), localwin, + ShapeInput, 0, 0, r); + XFixesDestroyRegion(QX11Info::display(), r); + overlay_mapped = true; + enableRedirection(); + } + first_call = false; } void MCompositeManagerPrivate::enableRedirection() @@ -3304,7 +3256,6 @@ void MCompositeManagerPrivate::enableRedirection() ((MTexturePixmapItem *)tp)->enableRedirectedRendering(); setWindowDebugProperties(it.key()); } - XFlush(QX11Info::display()); compositing = true; // no delay: application does not need to redraw when maximizing it scene()->views()[0]->setUpdatesEnabled(true); @@ -3332,8 +3283,6 @@ void MCompositeManagerPrivate::disableCompositing(ForcingLevel forced) return; } - scene()->views()[0]->setUpdatesEnabled(false); - for (QHash<Window, MCompositeWindow *>::iterator it = windows.begin(); it != windows.end(); ++it) { MCompositeWindow *tp = it.value(); @@ -3344,8 +3293,7 @@ void MCompositeManagerPrivate::disableCompositing(ForcingLevel forced) setWindowDebugProperties(it.key()); } - XUnmapWindow(QX11Info::display(), xoverlay); - XFlush(QX11Info::display()); + showOverlayWindow(false); if (MDecoratorFrame::instance()->decoratorItem()) MDecoratorFrame::instance()->lower(); diff --git a/src/mcompositemanager_p.h b/src/mcompositemanager_p.h index c45f2b6..bf4f48a 100644 --- a/src/mcompositemanager_p.h +++ b/src/mcompositemanager_p.h @@ -94,7 +94,7 @@ public: void installX11EventFilter(long xevent, MCompositeManagerExtension* extension); void redirectWindows(); - void mapOverlayWindow(); + void showOverlayWindow(bool show); void enableRedirection(); void setExposeDesktop(bool exposed); void checkStacking(bool force_visibility_check, @@ -166,15 +166,12 @@ public: void pingTopmost(); signals: - void inputEnabled(); void compositingEnabled(); void currentAppChanged(Window w); public slots: void gotHungWindow(MCompositeWindow *window); - void enableInput(); - void disableInput(); void enableCompositing(bool forced = false); void disableCompositing(ForcingLevel forced = NO_FORCED); void showLaunchIndicator(int timeout); diff --git a/src/mcompositescene.cpp b/src/mcompositescene.cpp index 239e991..949da1a 100644 --- a/src/mcompositescene.cpp +++ b/src/mcompositescene.cpp @@ -74,28 +74,6 @@ void MCompositeScene::prepareRoot() XSetErrorHandler(error_handler); } - -void MCompositeScene::setupOverlay(Window window, const QRect &geom, - bool restoreInput) -{ - Display *dpy = QX11Info::display(); - XRectangle rect; - - rect.x = geom.x(); - rect.y = geom.y(); - rect.width = geom.width(); - rect.height = geom.height(); - XserverRegion region = XFixesCreateRegion(dpy, &rect, 1); - - XFixesSetWindowShapeRegion(dpy, window, ShapeBounding, 0, 0, 0); - if (!restoreInput) - XFixesSetWindowShapeRegion(dpy, window, ShapeInput, 0, 0, region); - else - XFixesSetWindowShapeRegion(dpy, window, ShapeInput, 0, 0, 0); - - XFixesDestroyRegion(dpy, region); -} - void MCompositeScene::drawItems(QPainter *painter, int numItems, QGraphicsItem *items[], const QStyleOptionGraphicsItem options[], QWidget *widget) { QRegion visible(sceneRect().toRect()); diff --git a/src/mcompositescene.h b/src/mcompositescene.h index 572cb90..d5382ad 100644 --- a/src/mcompositescene.h +++ b/src/mcompositescene.h @@ -52,16 +52,6 @@ public: */ void prepareRoot(); - /*! - * Creates an event "hole" within the Window win so that events generated - * by win can pass through down to the Window below it. - * - * \param win Window id of the Window you intend to generate a pass-through - * area - * \param geom Geometry of the area within win used as a pass-through area - */ - void setupOverlay(Window win, const QRect &geom, - bool restoreInput = false); protected: void drawItems(QPainter *painter, int numItems, QGraphicsItem *items[], const QStyleOptionGraphicsItem options[], QWidget *widget); |