Changeset View
Changeset View
Standalone View
Standalone View
geometry.cpp
Show First 20 Lines • Show All 1940 Lines • ▼ Show 20 Line(s) | 1935 | { | |||
---|---|---|---|---|---|
1941 | // the geometry is used only for client_size, since that one is not used when | 1941 | // the geometry is used only for client_size, since that one is not used when | ||
1942 | // shading. Then the frame geometry is adjusted for the shaded geometry. | 1942 | // shading. Then the frame geometry is adjusted for the shaded geometry. | ||
1943 | // This gets more complicated in the case the code does only something like | 1943 | // This gets more complicated in the case the code does only something like | ||
1944 | // setGeometry( geometry()) - geometry() will return the shaded frame geometry. | 1944 | // setGeometry( geometry()) - geometry() will return the shaded frame geometry. | ||
1945 | // Such code is wrong and should be changed to handle the case when the window is shaded, | 1945 | // Such code is wrong and should be changed to handle the case when the window is shaded, | ||
1946 | // for example using X11Client::clientSize() | 1946 | // for example using X11Client::clientSize() | ||
1947 | 1947 | | |||
1948 | QRect frameGeometry(x, y, w, h); | 1948 | QRect frameGeometry(x, y, w, h); | ||
1949 | QRect bufferGeometry; | 1949 | QRect serverGeometry; | ||
1950 | 1950 | | |||
1951 | if (shade_geometry_change) | 1951 | if (shade_geometry_change) | ||
1952 | ; // nothing | 1952 | ; // nothing | ||
1953 | else if (isShade()) { | 1953 | else if (isShade()) { | ||
1954 | if (frameGeometry.height() == borderTop() + borderBottom()) { | 1954 | if (frameGeometry.height() == borderTop() + borderBottom()) { | ||
1955 | qCDebug(KWIN_CORE) << "Shaded geometry passed for size:"; | 1955 | qCDebug(KWIN_CORE) << "Shaded geometry passed for size:"; | ||
1956 | } else { | 1956 | } else { | ||
1957 | m_clientGeometry = frameRectToClientRect(frameGeometry); | 1957 | m_clientGeometry = frameRectToClientRect(frameGeometry); | ||
1958 | frameGeometry.setHeight(borderTop() + borderBottom()); | 1958 | frameGeometry.setHeight(borderTop() + borderBottom()); | ||
1959 | } | 1959 | } | ||
1960 | } else { | 1960 | } else { | ||
1961 | m_clientGeometry = frameRectToClientRect(frameGeometry); | 1961 | m_clientGeometry = frameRectToClientRect(frameGeometry); | ||
1962 | } | 1962 | } | ||
1963 | if (isDecorated()) { | 1963 | if (isDecorated()) { | ||
1964 | bufferGeometry = frameGeometry; | 1964 | serverGeometry = frameGeometry; | ||
1965 | } else { | 1965 | } else { | ||
1966 | bufferGeometry = m_clientGeometry; | 1966 | serverGeometry = m_clientGeometry; | ||
1967 | } | 1967 | } | ||
1968 | geom = frameGeometry; | ||||
1968 | if (!areGeometryUpdatesBlocked() && frameGeometry != rules()->checkGeometry(frameGeometry)) { | 1969 | if (!areGeometryUpdatesBlocked() && frameGeometry != rules()->checkGeometry(frameGeometry)) { | ||
1969 | qCDebug(KWIN_CORE) << "forced geometry fail:" << frameGeometry << ":" << rules()->checkGeometry(frameGeometry); | 1970 | qCDebug(KWIN_CORE) << "forced geometry fail:" << frameGeometry << ":" << rules()->checkGeometry(frameGeometry); | ||
1970 | } | 1971 | } | ||
1971 | if (!canUpdateGeometry(frameGeometry, bufferGeometry, force)) { | 1972 | if (force == NormalGeometrySet && m_serverGeometry == serverGeometry && pendingGeometryUpdate() == PendingGeometryNone) { | ||
1972 | return; | 1973 | return; | ||
1973 | } | 1974 | } | ||
1974 | m_bufferGeometry = bufferGeometry; | 1975 | m_serverGeometry = serverGeometry; | ||
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(); | ||
davidedmundson: can you talk me through this change? | |||||
We need to reconfigure the frame window if its size gets changed. Previously, the buffer geometry and the geometry of the frame window were the same thing. Now, they are not. I'll update this patch to make geometry handling less confusing. zzag: We need to reconfigure the frame window if its size gets changed. Previously, the buffer… | |||||
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() != 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 | } | ||
2031 | 2003 | | |||
2032 | void X11Client::plainResize(int w, int h, ForceGeometry_t force) | 2004 | void X11Client::plainResize(int w, int h, ForceGeometry_t force) | ||
2033 | { | 2005 | { | ||
2034 | QSize frameSize(w, h); | 2006 | QSize frameSize(w, h); | ||
2035 | QSize bufferSize; | 2007 | QSize serverSize; | ||
2036 | 2008 | | |||
2037 | // this code is also duplicated in X11Client::setGeometry(), and it's also commented there | 2009 | // this code is also duplicated in X11Client::setGeometry(), and it's also commented there | ||
2038 | if (shade_geometry_change) | 2010 | if (shade_geometry_change) | ||
2039 | ; // nothing | 2011 | ; // nothing | ||
2040 | else if (isShade()) { | 2012 | else if (isShade()) { | ||
2041 | if (frameSize.height() == borderTop() + borderBottom()) { | 2013 | if (frameSize.height() == borderTop() + borderBottom()) { | ||
2042 | qCDebug(KWIN_CORE) << "Shaded geometry passed for size:"; | 2014 | qCDebug(KWIN_CORE) << "Shaded geometry passed for size:"; | ||
2043 | } else { | 2015 | } else { | ||
2044 | m_clientGeometry.setSize(frameSizeToClientSize(frameSize)); | 2016 | m_clientGeometry.setSize(frameSizeToClientSize(frameSize)); | ||
2045 | frameSize.setHeight(borderTop() + borderBottom()); | 2017 | frameSize.setHeight(borderTop() + borderBottom()); | ||
2046 | } | 2018 | } | ||
2047 | } else { | 2019 | } else { | ||
2048 | m_clientGeometry.setSize(frameSizeToClientSize(frameSize)); | 2020 | m_clientGeometry.setSize(frameSizeToClientSize(frameSize)); | ||
2049 | } | 2021 | } | ||
2050 | if (isDecorated()) { | 2022 | if (isDecorated()) { | ||
2051 | bufferSize = frameSize; | 2023 | serverSize = frameSize; | ||
2052 | } else { | 2024 | } else { | ||
2053 | bufferSize = m_clientGeometry.size(); | 2025 | serverSize = 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_serverGeometry.size() == serverSize) { | ||
2061 | return; | 2034 | return; | ||
2062 | } | 2035 | } | ||
2063 | m_bufferGeometry.setSize(bufferSize); | 2036 | m_serverGeometry.setSize(serverSize); | ||
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() != 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 | const QRect previousServerGeometry = m_frame.geometry(); | ||||
2063 | const bool resized = (previousServerGeometry.size() != m_serverGeometry.size() || pendingGeometryUpdate() == PendingGeometryForced); | ||||
2064 | if (resized) { | ||||
2065 | resizeDecoration(); | ||||
2066 | m_frame.setGeometry(m_serverGeometry); | ||||
2067 | if (!isShade()) { | ||||
2068 | QSize cs = clientSize(); | ||||
2069 | m_wrapper.setGeometry(QRect(clientPos(), cs)); | ||||
2070 | if (!isResize() || syncRequest.counter == XCB_NONE) | ||||
2071 | m_client.setGeometry(0, 0, cs.width(), cs.height()); | ||||
2072 | // SELI - won't this be too expensive? | ||||
2073 | // THOMAS - yes, but gtk+ clients will not resize without ... | ||||
2074 | sendSyntheticConfigureNotify(); | ||||
2075 | } | ||||
2076 | updateShape(); | ||||
2077 | } else { | ||||
2078 | if (isMoveResize()) { | ||||
2079 | if (compositing()) // Defer the X update until we leave this mode | ||||
2080 | needsXWindowMove = true; | ||||
2081 | else | ||||
2082 | m_frame.move(m_serverGeometry.topLeft()); // sendSyntheticConfigureNotify() on finish shall be sufficient | ||||
2083 | } else { | ||||
2084 | m_frame.move(m_serverGeometry.topLeft()); | ||||
2085 | sendSyntheticConfigureNotify(); | ||||
2086 | } | ||||
2087 | | ||||
2088 | // Unconditionally move the input window: it won't affect rendering | ||||
2089 | m_decoInputExtent.move(pos() + inputPos()); | ||||
2090 | } | ||||
2091 | } | ||||
2092 | | ||||
2097 | /** | 2093 | /** | ||
2098 | * Reimplemented to inform the client about the new window position. | 2094 | * Reimplemented to inform the client about the new window position. | ||
2099 | */ | 2095 | */ | ||
2100 | void AbstractClient::move(int x, int y, ForceGeometry_t force) | 2096 | void AbstractClient::move(int x, int y, ForceGeometry_t force) | ||
2101 | { | 2097 | { | ||
2102 | // resuming geometry updates is handled only in setGeometry() | 2098 | // resuming geometry updates is handled only in setGeometry() | ||
2103 | Q_ASSERT(pendingGeometryUpdate() == PendingGeometryNone || areGeometryUpdatesBlocked()); | 2099 | Q_ASSERT(pendingGeometryUpdate() == PendingGeometryNone || areGeometryUpdatesBlocked()); | ||
2104 | QPoint p(x, y); | 2100 | QPoint p(x, y); | ||
▲ Show 20 Lines • Show All 563 Lines • ▼ Show 20 Line(s) | 2663 | // FRAME update(); | |||
2668 | 2664 | | |||
2669 | emit clientFinishUserMovedResized(this); | 2665 | emit clientFinishUserMovedResized(this); | ||
2670 | } | 2666 | } | ||
2671 | 2667 | | |||
2672 | void X11Client::leaveMoveResize() | 2668 | void X11Client::leaveMoveResize() | ||
2673 | { | 2669 | { | ||
2674 | if (needsXWindowMove) { | 2670 | if (needsXWindowMove) { | ||
2675 | // Do the deferred move | 2671 | // Do the deferred move | ||
2676 | m_frame.move(m_bufferGeometry.topLeft()); | 2672 | m_frame.move(m_serverGeometry.topLeft()); | ||
2677 | needsXWindowMove = false; | 2673 | needsXWindowMove = false; | ||
2678 | } | 2674 | } | ||
2679 | if (!isResize()) | 2675 | if (!isResize()) | ||
2680 | sendSyntheticConfigureNotify(); // tell the client about it's new final position | 2676 | sendSyntheticConfigureNotify(); // tell the client about it's new final position | ||
2681 | if (geometryTip) { | 2677 | if (geometryTip) { | ||
2682 | geometryTip->hide(); | 2678 | geometryTip->hide(); | ||
2683 | delete geometryTip; | 2679 | delete geometryTip; | ||
2684 | geometryTip = nullptr; | 2680 | geometryTip = nullptr; | ||
▲ Show 20 Lines • Show All 727 Lines • Show Last 20 Lines |
can you talk me through this change?