Changeset View
Changeset View
Standalone View
Standalone View
geometry.cpp
Show First 20 Lines • Show All 1962 Lines • ▼ Show 20 Line(s) | 1935 | { | |||
---|---|---|---|---|---|
1963 | if (isDecorated()) { | 1963 | if (isDecorated()) { | ||
1964 | bufferGeometry = frameGeometry; | 1964 | bufferGeometry = frameGeometry; | ||
1965 | } else { | 1965 | } else { | ||
1966 | bufferGeometry = m_clientGeometry; | 1966 | bufferGeometry = m_clientGeometry; | ||
1967 | } | 1967 | } | ||
1968 | if (!areGeometryUpdatesBlocked() && frameGeometry != rules()->checkGeometry(frameGeometry)) { | 1968 | if (!areGeometryUpdatesBlocked() && frameGeometry != rules()->checkGeometry(frameGeometry)) { | ||
1969 | qCDebug(KWIN_CORE) << "forced geometry fail:" << frameGeometry << ":" << rules()->checkGeometry(frameGeometry); | 1969 | qCDebug(KWIN_CORE) << "forced geometry fail:" << frameGeometry << ":" << rules()->checkGeometry(frameGeometry); | ||
1970 | } | 1970 | } | ||
1971 | if (!canUpdateGeometry(frameGeometry, bufferGeometry, force)) { | 1971 | geom = frameGeometry; | ||
1972 | if (force == NormalGeometrySet && m_bufferGeometry == bufferGeometry && pendingGeometryUpdate() == PendingGeometryNone) { | ||||
1972 | return; | 1973 | return; | ||
1973 | } | 1974 | } | ||
1974 | m_bufferGeometry = bufferGeometry; | 1975 | m_bufferGeometry = bufferGeometry; | ||
1975 | geom = frameGeometry; | | |||
1976 | if (areGeometryUpdatesBlocked()) { | 1976 | if (areGeometryUpdatesBlocked()) { | ||
1977 | if (pendingGeometryUpdate() == PendingGeometryForced) | 1977 | if (pendingGeometryUpdate() == PendingGeometryForced) | ||
1978 | {} // maximum, nothing needed | 1978 | {} // maximum, nothing needed | ||
1979 | else if (force == ForceGeometrySet) | 1979 | else if (force == ForceGeometrySet) | ||
1980 | setPendingGeometryUpdate(PendingGeometryForced); | 1980 | setPendingGeometryUpdate(PendingGeometryForced); | ||
1981 | else | 1981 | else | ||
1982 | setPendingGeometryUpdate(PendingGeometryNormal); | 1982 | setPendingGeometryUpdate(PendingGeometryNormal); | ||
1983 | return; | 1983 | return; | ||
1984 | } | 1984 | } | ||
1985 | const QRect oldBufferGeometry = bufferGeometryBeforeUpdateBlocking(); | 1985 | updateServerGeometry(); | ||
1986 | bool resized = (oldBufferGeometry.size() != m_bufferGeometry.size() || pendingGeometryUpdate() == PendingGeometryForced); | | |||
1987 | if (resized) { | | |||
1988 | resizeDecoration(); | | |||
1989 | m_frame.setGeometry(m_bufferGeometry); | | |||
1990 | if (!isShade()) { | | |||
1991 | QSize cs = clientSize(); | | |||
1992 | m_wrapper.setGeometry(QRect(clientPos(), cs)); | | |||
1993 | if (!isResize() || syncRequest.counter == XCB_NONE) | | |||
1994 | m_client.setGeometry(0, 0, cs.width(), cs.height()); | | |||
1995 | // SELI - won't this be too expensive? | | |||
1996 | // THOMAS - yes, but gtk+ clients will not resize without ... | | |||
1997 | sendSyntheticConfigureNotify(); | | |||
1998 | } | | |||
1999 | updateShape(); | | |||
2000 | } else { | | |||
2001 | if (isMoveResize()) { | | |||
2002 | if (compositing()) // Defer the X update until we leave this mode | | |||
2003 | needsXWindowMove = true; | | |||
2004 | else | | |||
2005 | m_frame.move(m_bufferGeometry.topLeft()); // sendSyntheticConfigureNotify() on finish shall be sufficient | | |||
2006 | } else { | | |||
2007 | m_frame.move(m_bufferGeometry.topLeft()); | | |||
2008 | sendSyntheticConfigureNotify(); | | |||
2009 | } | | |||
2010 | | ||||
2011 | // Unconditionally move the input window: it won't affect rendering | | |||
2012 | m_decoInputExtent.move(QPoint(x, y) + inputPos()); | | |||
2013 | } | | |||
2014 | updateWindowRules(Rules::Position|Rules::Size); | 1986 | updateWindowRules(Rules::Position|Rules::Size); | ||
2015 | 1987 | | |||
2016 | // keep track of old maximize mode | 1988 | // keep track of old maximize mode | ||
2017 | // to detect changes | 1989 | // to detect changes | ||
2018 | screens()->setCurrent(this); | 1990 | screens()->setCurrent(this); | ||
2019 | workspace()->updateStackingOrder(); | 1991 | workspace()->updateStackingOrder(); | ||
2020 | 1992 | | |||
2021 | // Need to regenerate decoration pixmaps when the buffer size is changed. | 1993 | // Need to regenerate decoration pixmaps when the buffer size is changed. | ||
2022 | if (oldBufferGeometry.size() != m_bufferGeometry.size()) { | 1994 | if (bufferGeometryBeforeUpdateBlocking().size() != m_bufferGeometry.size()) { | ||
2023 | discardWindowPixmap(); | 1995 | discardWindowPixmap(); | ||
2024 | } | 1996 | } | ||
2025 | emit geometryShapeChanged(this, frameGeometryBeforeUpdateBlocking()); | 1997 | emit geometryShapeChanged(this, frameGeometryBeforeUpdateBlocking()); | ||
2026 | addRepaintDuringGeometryUpdates(); | 1998 | addRepaintDuringGeometryUpdates(); | ||
2027 | updateGeometryBeforeUpdateBlocking(); | 1999 | updateGeometryBeforeUpdateBlocking(); | ||
2028 | // TODO: this signal is emitted too often | 2000 | // TODO: this signal is emitted too often | ||
2029 | emit geometryChanged(); | 2001 | emit geometryChanged(); | ||
2030 | } | 2002 | } | ||
Show All 19 Lines | 2005 | { | |||
2050 | if (isDecorated()) { | 2022 | if (isDecorated()) { | ||
2051 | bufferSize = frameSize; | 2023 | bufferSize = frameSize; | ||
2052 | } else { | 2024 | } else { | ||
2053 | bufferSize = m_clientGeometry.size(); | 2025 | bufferSize = m_clientGeometry.size(); | ||
2054 | } | 2026 | } | ||
2055 | if (!areGeometryUpdatesBlocked() && frameSize != rules()->checkSize(frameSize)) { | 2027 | if (!areGeometryUpdatesBlocked() && frameSize != rules()->checkSize(frameSize)) { | ||
2056 | qCDebug(KWIN_CORE) << "forced size fail:" << frameSize << ":" << rules()->checkSize(frameSize); | 2028 | qCDebug(KWIN_CORE) << "forced size fail:" << frameSize << ":" << rules()->checkSize(frameSize); | ||
2057 | } | 2029 | } | ||
2030 | geom.setSize(frameSize); | ||||
2058 | // resuming geometry updates is handled only in setGeometry() | 2031 | // resuming geometry updates is handled only in setGeometry() | ||
2059 | Q_ASSERT(pendingGeometryUpdate() == PendingGeometryNone || areGeometryUpdatesBlocked()); | 2032 | Q_ASSERT(pendingGeometryUpdate() == PendingGeometryNone || areGeometryUpdatesBlocked()); | ||
2060 | if (!canUpdateSize(frameSize, bufferSize, force)) { | 2033 | if (force == NormalGeometrySet && m_bufferGeometry.size() == bufferSize) { | ||
2061 | return; | 2034 | return; | ||
2062 | } | 2035 | } | ||
2063 | m_bufferGeometry.setSize(bufferSize); | 2036 | m_bufferGeometry.setSize(bufferSize); | ||
2064 | geom.setSize(frameSize); | | |||
2065 | if (areGeometryUpdatesBlocked()) { | 2037 | if (areGeometryUpdatesBlocked()) { | ||
2066 | if (pendingGeometryUpdate() == PendingGeometryForced) | 2038 | if (pendingGeometryUpdate() == PendingGeometryForced) | ||
2067 | {} // maximum, nothing needed | 2039 | {} // maximum, nothing needed | ||
2068 | else if (force == ForceGeometrySet) | 2040 | else if (force == ForceGeometrySet) | ||
2069 | setPendingGeometryUpdate(PendingGeometryForced); | 2041 | setPendingGeometryUpdate(PendingGeometryForced); | ||
2070 | else | 2042 | else | ||
2071 | setPendingGeometryUpdate(PendingGeometryNormal); | 2043 | setPendingGeometryUpdate(PendingGeometryNormal); | ||
2072 | return; | 2044 | return; | ||
2073 | } | 2045 | } | ||
2074 | resizeDecoration(); | 2046 | updateServerGeometry(); | ||
2075 | m_frame.resize(m_bufferGeometry.size()); | | |||
2076 | if (!isShade()) { | | |||
2077 | QSize cs = clientSize(); | | |||
2078 | m_wrapper.setGeometry(QRect(clientPos(), cs)); | | |||
2079 | m_client.setGeometry(0, 0, cs.width(), cs.height()); | | |||
2080 | } | | |||
2081 | updateShape(); | | |||
2082 | | ||||
2083 | sendSyntheticConfigureNotify(); | | |||
2084 | updateWindowRules(Rules::Position|Rules::Size); | 2047 | updateWindowRules(Rules::Position|Rules::Size); | ||
2085 | screens()->setCurrent(this); | 2048 | screens()->setCurrent(this); | ||
2086 | workspace()->updateStackingOrder(); | 2049 | workspace()->updateStackingOrder(); | ||
2087 | if (bufferGeometryBeforeUpdateBlocking().size() != m_bufferGeometry.size()) { | 2050 | if (bufferGeometryBeforeUpdateBlocking().size() != m_bufferGeometry.size()) { | ||
2088 | discardWindowPixmap(); | 2051 | discardWindowPixmap(); | ||
2089 | } | 2052 | } | ||
2090 | emit geometryShapeChanged(this, frameGeometryBeforeUpdateBlocking()); | 2053 | emit geometryShapeChanged(this, frameGeometryBeforeUpdateBlocking()); | ||
2091 | addRepaintDuringGeometryUpdates(); | 2054 | addRepaintDuringGeometryUpdates(); | ||
2092 | updateGeometryBeforeUpdateBlocking(); | 2055 | updateGeometryBeforeUpdateBlocking(); | ||
2093 | // TODO: this signal is emitted too often | 2056 | // TODO: this signal is emitted too often | ||
2094 | emit geometryChanged(); | 2057 | emit geometryChanged(); | ||
2095 | } | 2058 | } | ||
2096 | 2059 | | |||
2060 | void X11Client::updateServerGeometry() | ||||
2061 | { | ||||
2062 | if (m_frame.geometry().size() != m_bufferGeometry.size() || pendingGeometryUpdate() == PendingGeometryForced) { | ||||
2063 | resizeDecoration(); | ||||
2064 | m_frame.setGeometry(m_bufferGeometry); | ||||
2065 | if (!isShade()) { | ||||
2066 | QSize cs = clientSize(); | ||||
2067 | m_wrapper.setGeometry(QRect(clientPos(), cs)); | ||||
2068 | if (!isResize() || syncRequest.counter == XCB_NONE) { | ||||
2069 | m_client.setGeometry(0, 0, cs.width(), cs.height()); | ||||
2070 | } | ||||
2071 | // SELI - won't this be too expensive? | ||||
2072 | // THOMAS - yes, but gtk+ clients will not resize without ... | ||||
2073 | sendSyntheticConfigureNotify(); | ||||
2074 | } | ||||
2075 | updateShape(); | ||||
2076 | } else { | ||||
2077 | if (isMoveResize()) { | ||||
2078 | if (compositing()) { // Defer the X update until we leave this mode | ||||
2079 | needsXWindowMove = true; | ||||
2080 | } else { | ||||
2081 | m_frame.move(m_bufferGeometry.topLeft()); // sendSyntheticConfigureNotify() on finish shall be sufficient | ||||
2082 | } | ||||
2083 | } else { | ||||
2084 | m_frame.move(m_bufferGeometry.topLeft()); | ||||
2085 | sendSyntheticConfigureNotify(); | ||||
2086 | } | ||||
2087 | // Unconditionally move the input window: it won't affect rendering | ||||
2088 | m_decoInputExtent.move(pos() + inputPos()); | ||||
2089 | } | ||||
2090 | } | ||||
2091 | | ||||
2097 | /** | 2092 | /** | ||
2098 | * Reimplemented to inform the client about the new window position. | 2093 | * Reimplemented to inform the client about the new window position. | ||
2099 | */ | 2094 | */ | ||
2100 | void AbstractClient::move(int x, int y, ForceGeometry_t force) | 2095 | void AbstractClient::move(int x, int y, ForceGeometry_t force) | ||
2101 | { | 2096 | { | ||
2102 | // resuming geometry updates is handled only in setGeometry() | 2097 | // resuming geometry updates is handled only in setGeometry() | ||
2103 | Q_ASSERT(pendingGeometryUpdate() == PendingGeometryNone || areGeometryUpdatesBlocked()); | 2098 | Q_ASSERT(pendingGeometryUpdate() == PendingGeometryNone || areGeometryUpdatesBlocked()); | ||
2104 | QPoint p(x, y); | 2099 | QPoint p(x, y); | ||
▲ Show 20 Lines • Show All 1307 Lines • Show Last 20 Lines |