summaryrefslogtreecommitdiffstats
path: root/src/gui/kernel/qwidget_s60.cpp
Commit message (Collapse)AuthorAgeFilesLines
* Ensure that window rectangle is updated when CBA visibility changesGareth Stockwell2010-07-281-10/+5
| | | | | | | | | | | | | | | | | | | | | | In S60, there are two pieces of screen furniture, changes in whose visibility or size can affect the size of the Qt application window. These are the status pane, at the top of the screen, and the CBA at the bottom. QSymbianControl listens for changes in status pane visibility and size by implementing MEikStatusPaneObserver. Notifications received via this interface trigger a call to QSymbianControl::handleClientAreaChange() which resizes the control. There is no corresponding interface through which to receive notifications of changes in CBA visibility. This patch introduces a utility function for setting the visibility of both the status pane and CBA, which ensures that the control's rectangle is updated when either one changes. Task-number: QTBUG-5320 Reviewed-by: Jason Barron
* Clear Qt::WA_OutsideWSRange when making window fullscreenGareth Stockwell2010-07-281-0/+2
| | | | | Task-number: QTBUG-10269 Reviewed-by: Jason Barron
* Avkon removal configured with -no-s60mread2010-07-011-0/+3
| | | | | | | | | | | | | | | | Avkon dependencies can be configured out with the -no-s60 configure flag, conversely Qt on Symbian will use Avkon if -s60 is configured. These changes are intended to keep or introduce binary compatibility between the s60 and no-s60 configurations. To do this, it has been necessary to introduce stub equivalents of the CAknAppUi related classes into the no-s60 configuration, and override all Avkon framework virtual functions in the QS60Main... classes. Other than that, these changes are mostly just correcting the use of the Q_WS_S60 flag so that it only refers to Avkon dependencies. Reviewed-by: Sami Merila
* Merge branch '4.6-s60' into 4.7-s60axis2010-06-241-3/+0
|\ | | | | | | | | | | | | | | Conflicts: src/3rdparty/phonon/qt7/mediaobject.mm src/3rdparty/webkit/VERSION src/3rdparty/webkit/WebCore/ChangeLog src/plugins/phonon/mmf/mmf.pro
| * Allow TLW translucency on Symbian without Qt::FramelessWindowHintGareth Stockwell2010-06-231-3/+0
| | | | | | | | | | | | This flag is Windows-specific, and should not be required on other platforms. Reviewed-by: Jason Barron
* | Fixed an on-exit crash for apps using GL.Trond Kjernåsen2010-06-111-0/+1
|/ | | | | | | | | | | | If a QGLWidget is left on the heap when the QApplication destructor is called, it will leave the QGLWidget in a broken state. The widget itself is released and set to a non-created state, which the associated QGLContext doesn't get notified about. With this patch the QGLWidget knows when QWidget::destroy() is called and can act acordingly. Task-number: QT-3498, QTBUG-10995 Reviewed-by: Paul
* Enable visibility change events on all Symbian native windowsGareth Stockwell2010-06-021-0/+1
| | | | | | | | Previously, these events were enabled only on top-level widgets. This patch enables them also for native child widgets. Task-number: QTBUG-8697 Reviewed-by: Jason Barron
* Added reference counting to QWidgetBackingStoreGareth Stockwell2010-06-021-3/+1
| | | | | | | | | | | | | | | | | | | On Symbian, the top-level widget's backing store must be destroyed when it is no longer required, in order to conserve memory. The criteria for destroying the backing store is when neither the TLW nor any of its native descendents (which share the backing store) are visible. In order to implement this requirement, a count must be kept of the number of native widgets which are using the TLW's backing store. This patch provides the mechanism for maintaining this count, and for destroying the backing store when the count is decremented to zero. No calls to either the increment nor decrement functions are made, however, by this code included in this patch; this code will be added to only the Symbian backend by a subsequent patch. Task-number: QTBUG-8697 Reviewed-by: Bjørn Erik Nilsen Reviewed-by: Jason Barron
* Always construct s60 screen furniture even if not used.Janne Koskinen2010-05-311-4/+1
| | | | | | | | Not creating screen furniture in full screen caused regression when swapping into idle screen and back on Nokia 5800. Task-number: QTBUG-10985 Reviewed-by: Jason Barron
* Don't crash when applications set Qt::WA_TranslucentBackground.Jason Barron2010-05-121-1/+3
| | | | | | | | | | | | | | | After replacing some code with a function call to s60UpdateIsOpaque() we introduced a crash for widgets that set Qt::WA_TranslucentBackground. The reason for the crash was that the Qt::WA_WState_Created attribute was being set before calling this function, but *not* before setWinId() was being called. This meant that s60UpdateIsOpaque() assumed that the window was created (and the handle added to the widget map), but this was not actually the case. The fix here is to move the call to s60UpdateIsOpaque() after the call to setWinId() such that those assumptions are true. Reviewed-by: Jani Hautakangas
* Removed fullscreen responsiveness of softkeysMiikka Heikkinen2010-04-281-9/+0
| | | | | | | | | | | | | The CEikCba class casting is not binary compatible between at least S60 3.2 and 5.0 platforms, even though it is source compatible. The removed code was causing stack corruption on emulator when binaries were built on S60 3.2 SDK and run on S60 5.0 SDK. Another solution for this feature needs to be found. Task-number: QTBUG-10199 Reviewed-by: Shane Kearns Reviewed-by: Janne Anttila
* Fix window transparency on Symbian.Jason Barron2010-04-211-10/+1
| | | | | | | | | | | | | In the create_sys() function where native handles are created, we were only looking at the "isOpaque" flag to determine if a window should be translucent or not. This is not the correct thing to do because transparency should only be granted if the application explicitly sets the Qt::WA_TranslucentBackground flag. The fix is to defer the transparency decision to s60UpdateIsOpaque() which does the right thing. Reviewed-by: Jani Hautakangas
* Tweak the 'normalGeometry' of the widget before setting it.Jason Barron2010-04-211-2/+11
| | | | | | | | | | | If a widget is initially shown as maximized or fullscreen then the normal geometry is calculated before the status pane has been created. When returning to the "Normal" window state the geometry needs to be tweaked to compensate the fact that there is a status present now. This should only happen if the application has not been given an explicit position. Reviewed-by: Janne Anttila
* Use QDesktopWidget as a status pane observer on Symbian.Jason Barron2010-04-211-0/+5
| | | | | | | | | | | | | | | | | Now that the S60 screen furniture construction is delayed, we need to manually set the status pane observer to get notifications about changes in the size of the status pane. Using the AppUi would have been the obvious choice here, but sadly CAknAppUi (base class for QS60MainAppUi) uses private inheritance when implementing the MEikStatusPaneObserver interface. To work around this problem we make QSymbianControl implement the interface and use the instance of this class that is associated with QDesktopWidget to recevive the notifications and then call the function in the AppUi to maintain the same behavior. Reviewed-by: Janne Anttila Reviewed-by: mread
* Delay creation of S60 screen furniture.Jason Barron2010-04-211-0/+36
| | | | | | | | | | | | | | Previously the S60 screen furniture (Status Pane and CBA) was being constructed when QApplication was constructed. This meant that if you never created a widget, you would still get those app panes which is not what we want. This patch avoids constructing these panes in QApplication, and manually creates them later when the first window is shown in a state where they would be needed. Reviewed-by: Janne Anttila Reviewed-by: mread
* Don't use setGeometry() in setWindowState() on Symbian.Jason Barron2010-04-211-5/+7
| | | | | | | | | | setGeometry() has the side effect that it internally sets both the WA_Moved and WA_Resized attributes and these attributes should only be used when the application has explicitly set a size or position. When a widget is resized due to being maximized or fullscreened then we should resize the native window handle instead of calling setGeometry. Reviewed-by: Janne Anttila
* Modify setWindowState() on Symbian to create the native window earlier.Jason Barron2010-04-211-2/+3
| | | | | | | | The native window is used quite early in this function so as soon as we determine that this does in fact require a native window, we should create it immediately. Reviewed-by: Janne Anttila
* Fixed 'fullsreen with softkeys' mode not to expand under softkey area.Janne Anttila2010-03-231-3/+5
| | | | | | | | | | | availableGeometry returns incorrect area after cba is made invisible, it seems that this happens because CAknToolbar is not made invisible. Fixed the problem by reverting back to SetExtentToWholeScreen usage when the widget is really fullscreen, i.e. Qt::WindowSoftkeysVisibleHint is not set. Task-number: QTBUG-9038 Reviewed-by: Miikka Heikkinen
* HotFix for fluidlauncher default size caused by 6d44dadd.Janne Anttila2010-03-121-2/+19
| | | | | | | | | | | | | It seems that in Symbian we cannot restore Qt::WA_Moved and Qt::WA_Resized attributes in setWindowState method to the same ones what the attributes were when method was called. Thus we currently make sure that Qt::WA_Moved and Qt::WA_Resized attributes are not touched when normal window state is applied. There is a new task QTBUG-8977 to sort out when those attributes should be set and when not. Reviewed-By: Sami Merila
* Fixed dialog resize not to move the dialog for Symbian.Janne Anttila2010-03-101-1/+6
| | | | | | | | | | | | | | | | QDialog::resize() also moved the dialog in Symbian. This occured since adjustPosition was called as an result of resize and that method did not check if dialog position was explicitly set. In addition it was found that in Symbian WA_Resized and WA_Moved attributes were basically set for almost all top-level widgets by system. This was also fixed and a new auto test was introduced to verify these attributes in all platforms. Windows platform also suffers from bug in this area, and a separate task QTBUG-5897 for it was created Task-number: QTBUG-5897 Reviewed-by: Sami Merila
* Fix for QTBUG-6659 Parent window accepts pointer events wronglyJani Hautakangas2010-03-051-2/+4
| | | | | | | | | Parent window accepted pointer events even though the child was modal. That was because closing popup didn't restore pointer grab for modal window. Task-number: QTBUG-6659 Reviewed-by: axis
* Added fullscreen support to softkeys in Symbian.Janne Anttila2010-03-011-9/+26
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This commit enables the following two features: 1. Developer can make softkeys visible in fullscreen widget by setting the Qt::WindowSoftkeysVisibleHint window flag. This flag implememts intermediate mode for maximized and fullscreen modes. In maximized mode both statuspane and softkeys are visible, in fullscreen mode with WindowSoftkeysVisibleHint flag, only the softkeys are visible and in normal fullscreen mode both statuspane and softkeys are invisible. This feature was requested by QTBUG-5171. 2. Developer can make softkeys to respond to the key events even the softkeys are invisible. This means that when widget with Qt::WindowSoftkeysRespondHint window flag is shown in fullsreen, the softkey HW key events are routed to invisible softkeys and softkeys trigger the action associated to pressed softkey button. If the flag is not set, the key event will be passed to application/focused widget normally and softkey actions are not triggered. This feature was requested in QTBUG-4564. Both new flags are by default off. In addition, the softkey example is updated to demonstrate the new window flags. The commit also contains some code style fixes applied by my editor automatically to changed files. Task-number: QTBUG-5171 Task-number: QTBUG-4564 Reviewed-by: Jason Barron
* Fixed defect in handling of expose events for SymbianGareth Stockwell2010-02-091-1/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | Commit bc82db did not correctly handle native child widgets. Consider the case when we have a top-level widget A with a native child widget B. When QSymbianControl::Draw() is called on the control corresponding to B, the following occurs: 1. The inExpose flag is set in B's QWExtra structure. 2. The call to syncBackingStore() results in a call to QWidgetBackingStore::flush(), passing default parameters. 3. Because no target widget was passed to flush(), this function selects the top-level widget (A) as the target for the flush operation, passing A as the first argument of QS60WindowSurface::flush(). 4. QS60WindowSurface::flush() checks the inExpose flag from A's QWExtra structure, finds it to be false, and proceeds to call DrawNow() on A's control. Because QSymbianControl::Draw() uses the default graphics context, this context is shared between controls. This means that the DrawNow() call in step 4 causes a WSERV-10 panic (Activate() called on an already-active) graphics context. This patch moves the inExpose flag from B's QWExtra into A's QTLWExtra, with the result that the call to DrawNow() in step 4 is suppressed. Task-number: QTBUG-7960 Reviewed-by: axis
* Whitespace/tab fixes.Jani Hautakangas2010-02-051-1/+1
| | | | Reviewed-by: Trust me
* s60 application loses normalGeometry when returning from fullscreenSamuel Nevala2010-02-051-78/+30
| | | | | | | | | | | | | | | | | | | | | | | Problem description: normalGeomerty lost during showFullScreen 1. Reported problen was due on void QSymbianControl::PositionChanged() over write top->normaGeometry on every position change. As fix top->normalGeometry is moved to new rect:s top left only when widget windowState == 0. 2. Also made some new qwidget auto tests. Refactored s60 side setWindowState to be more readable. Minimized window state now hides window decoration. QApplication & QWidget autotest run on emulator and tested on s60 5.0 hw using attached application. http://bugreports.qt.nokia.com/browse/QTBUG-6231 Task-number:QTBUG-6231 Merge-request: 2256 Reviewed-by: Jani Hautakangas <ext-jani.hautakangas@nokia.com>
* Flush the WSERV command buffer after deleting a surface.Jason Barron2010-02-041-0/+4
| | | | | | | | | | | | | | For graphics systems that use EGL surfaces in the backing store destroying the surface does not guarantee that the memory is immediately freed because this command does not cause a flush. This implies that a manual flush is instead needed. We do this in 2 places; the first is when the surface is destroyed due to a visibility changed. The second case is just after the window has been destroyed. At this point the backing store has already been deleted so the deletion of both the surface and window can happen atomically in WSERV. Task-number: QT-2506 Reviewed-by: Iain
* Enable surface transparency support on Symbian^4.Jason Barron2010-01-141-0/+8
| | | | | | | | | On Symbian^4 systems where the window supports surface transparency, we use this for the Qt::WA_TranslucentBackground flag instead of the previous method. Task-number: QT-2026 Reviewed-by: Iain
* Improve the behavior of expose events on Symbian.Jason Barron2010-01-141-0/+1
| | | | | | | | | | | | | | | | | | | | | | | | Previously when an expose was received from WSERV, we simply called BitBlt (for raster) or called flush on the window surface (for anything else). This behavior differs from other platforms which call syncBackingStore(). This difference means that we flush the backing store without actually updating the content first. This works for most cases because if there actually was new content, it would be updated when the widget's UpdateRequest event was handled. The problem arises when the backing store does not have the correct content. This can happen if the backing store was deleted, but only partially restored (see Task below). Another problem is with the OpenVG graphics system which assumes that beginPaint() is called before endPaint() is order to initialize the context and the surface size. The fix is to call syncBackingStore() like the other platforms, but introduce a bit field to prevent infinite recursion in the painting pipeline. Task-number: QTBUG-4921 Reviewed-by: axis Reviewed-by: Gareth Stockwell
* Prevent a crash when creating an inputContext from the QApplication dtor.Simon Hausmann2010-01-121-1/+1
| | | | | | | | | Complete the fix in f72165460d27860cabd51691f4d935fd74b50f80 by applying the same fix to Symbian and QWS. Task-number: QTBUG-7105 Reviewed-by: Alexis Reviewed-by: Jason McDonald
* Update copyright year to 2010Jason McDonald2010-01-061-1/+1
| | | | Reviewed-by: Trust Me
* Symbian control invokes slots before and after native draw opsGareth Stockwell2009-11-261-0/+1
| | | | | | | | | | | | | | | | | Direct Screen Access (DSA) allows a client to request notification from the window server when drawing is performed by other threads, into a specified region of the screen. This allows DSA rendering - for example video - to be suspended when notifications are drawn, preventing the video content from overwriting the notification. If the drawing originates from the same thread as that which holds the DSA session, DSA must be suspended while drawing takes place. This change allows a widget to request notification when native drawing is about to be performed by QSymbianControl::Draw. Task-number: QTBUG-5467 Reviewed-by: Jason Barron
* Allow Symbian widget implementations to select native paint modeGareth Stockwell2009-11-261-1/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | On the Symbian platform, the Qt raster paint engine targets an off-screen buffer owned by the Font & Bitmap server (FBSERV). When an area of the screen needs to be refreshed, the window server (WSERV) asks the control environment (CONE) to redraw the control(s) intersecting that screen region. Each Qt native widget has an associated Symbian control, whose Draw function blits the required region of the backing store via WSERV. Use cases involving Direct Screen Access (DSA) may require this behaviour to be modified, to either of the following: - Disable: the Draw function does nothing. In this case, the output of paint events, rendered to the backing store, is not blitted to the screen. This mode was introduced by change 8f445e13. - Zero fill: the Draw function fills all pixels within the redraw region with zeroes. This change allows the widget implementation to select either of these alternative modes by setting a flag in its QWExtra structure. Note that these alternative modes are only suitable for native widgets, because they act on a per-control rather than per-widget basis. Task-number: QTBUG-5467 Reviewed-by: Jason Barron
* Removed window activation hack, unified and fixed title&icon setting.Janne Anttila2009-11-231-18/+0
| | | | | | | | | | | | | | | | | | | | | | | | The window activation hack is not needed anynmore since AppUi()->RemoveFromStack() ensures the next visible window will get the keyboard focus. Hack removal also required change to window title setting logic. Since window title (and icon) are associated to top-level windows, the logical place to set them is the same place where active window is changed i.e. QApplication::setActiveWindow is called. At the same time also window icon setting from show_sys was move to focusChanged to make icon/title setting more consistent. When changing orientation or switching to different statuspane mode we receive KInternalStatusPaneChange events for each window in QSymbianControl::HandleResourceChange. When receiving such event we only need to reset the icon for focused/visible window. If we don't handle it like this, it might happen that invisible widget added to control stack resets the global icon/title. Task-number: QTBUG-5780 Reviewed-by: Axis
* Merge branch '4.6' of git@scm.dev.nokia.troll.no:qt/qt-s60-public into ↵axis2009-11-131-7/+9
|\ | | | | | | 4.6-staging2
| * Fixed maximized dialogs losing maximized status on orientation switchMiikka Heikkinen2009-11-131-7/+9
| | | | | | | | | | | | | | | | | | | | | | | | If maximized dialog had minimum size that didn't fully fit to the screen, it lost its maximized status when orientation was switched, because of the logic that assumed that if a window is resized, it must no longer be maximized. Skipped this assumption for cases where resize occurs because enforcement of the minimum size of the window. Task-number: QTBUG-4671 Reviewed-by: Janne Anttila Reviewed-by: Sami Merila
* | Merge commit upstream/4.6 into oslo-staging-2/4.6Olivier Goffart2009-11-131-1/+1
|\ \ | |/ |/|
| * Fix typo in license headerAlessandro Portale2009-11-121-1/+1
| | | | | | | | | | | | The word 'module' was missing. Reviewed-By: TrustMe
* | Fix for assertion failure in in QWidget::grabMouse for Symbian.Janne Anttila2009-11-111-2/+2
| | | | | | | | | | | | | | | | | | | | | | | | Docs say: "Note that only visible widgets can grab mouse input. If isVisible() returns false for a widget, that widget cannot call grabMouse()." qwidget_x11.cpp uses the similar condition in grabMouse as symbian after this commit. Task-number: QTBUG-5658 Reviewed-by: Jason Barron
* | Add edit menu support for phones with a 'pencil' key.Jason Barron2009-11-111-0/+1
|/ | | | | | | | | | | | | | | | | The native FEP handles the 'pencil' key on some platforms by opening an edit menu on the screen that contains things like 'Insert Symbol' and 'Writing Language' for text input widgets. This was previously not working in the Qt input method implementation because in order for the FEP system to open the menu, it must be able to access the menu bar (CBA). This is done my using the object provider mechanism (MOP) and an implementation of the MopNext() function was missing. Adding this and also setting the AppUi as the MOP parent for top level widgets allowed the FEP framework to find it's way to the menubar and thus open a menu. Task-number: QTBUG-5606 Reviewed-by: axis <qt-info@nokia.com> Reviewed-by: mread <qt-info@nokia.com>
* Merge branch '4.6' into mmfphononGareth Stockwell2009-11-031-68/+4
|\
| * Switched setWindowIcon_sys to use QPixmpa::toSymbianCFbsBitmap in S60.Janne Anttila2009-10-271-68/+4
| | | | | | | | | | | | | | | | | | | | | | There were TODOs in code to remove the temporary solution for creating native CFbsBitmap out of QPixmap. Now when QPixmpa has native backed and it provides toSymbianCFbsBitmap, it it preferred to use toSymbianCFbsBitmap since in best case it can only duplicate the bitmap handle instead of copying the data. Task-number: QTBUG-4948 Reviewed-by: Jani Hautakangas
* | When creating a Symbian WId for a visible widget, make the controlGareth Stockwell2009-10-231-1/+3
|/ | | | | | | | | | | | visible after activating the window. This change was required in order to be able to run the test case for the below task; however, it is more generally required. Without it, the contents of the descendents of this widget will not be visible, until they are explicitly hidden and then re-shown. Task-number: QTBUG-4787 Reviewed-by: axis
* Lowering toplevel widget puts app to background.Miikka Heikkinen2009-10-221-2/+7
| | | | | | | Since raising toplevel widget nowdays brings the whole app to top, logically lowering toplevel widget should put the app to background. Reviewed-by: axis
* Fixed QWidget::raise in SymbianMiikka Heikkinen2009-10-191-1/+6
| | | | | | | | If toplevel window is raised, the whole application is now raised to foreground. Task-number: QT-2162 Reviewed-by: axis
* Merge commit 'origin/4.6' into mmfphononFrans Englich2009-10-151-1/+6
|\ | | | | | | | | | | Conflicts: src/corelib/kernel/qcoreevent.cpp src/corelib/kernel/qcoreevent.h
| * Remove incorrect optimisation in S60 widget / control stack syncShane Kearns2009-10-081-3/+8
| | | | | | | | | | | | | | | | | | | | | | Incorrect optimisation - for popup windows, Qt's focus is moved before hide_sys is called, resulting in the popup window keeping its elevated position in the CONE control stack. This can result in keyboard focus being in an invisible widget in some conditions - e.g. QTBUG-4733 Task-number: QTBUG-4733 Reviewed-by: axis
* | When reparenting native widget, delayed deletion of Symbian controlGareth Stockwell2009-10-151-1/+12
| | | | | | | | | | | | | | | | | | | | | | until control returns to the event loop. This is necessary because reparenting can be triggered from the context of a control's event handler. If reparenting causes that control to be deleted, a crash can result. Task-number: QTBUG-4664 Reviewed-by: axis
* | Modified reparenting to correctly deal with native child widgetsGareth Stockwell2009-10-091-22/+47
|/ | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Both reparenting and modification of window flags are done by calling QWidget::setParent. If either the parent changes, or a non-top-level widget becomes top-level (as a result of OR-ing Qt::Window into its window flags), a new native window ID is created for the widget. The Symbian implementation of setParent_sys had a flaw which manifested itself in the following situation: 1. We start with a native widget X, and its child Y, which is also native. There exist parent-child relationships between the associated CCoeControl instances, and the native windows (represented by RWindow handles). 2. X gets a new native window created as a result of a call to setParent. 3. QWidgetPrivate::reparentChildren calls SetParent on Y's control, to re-establish the parent-child relationship. The problem is that the window owned by Y's control now has no parent, so if we try to re-size the widget, the window server panics the client thread (WSERV-52). Because Symbian does not allow existing windows to be re-parented, and nor does it allow a window-owning control to re-create a new window, the only way to provide Y's window with a parent is to destroy the control and create a new one, passing in X's new window to the CCoeControl::CreateWindowL function. The changes made are as follows: a) QWidgetPrivate::reparentChildren is therefore modified to call create_sys, with destroyOldWindow set to true. b) QWidgetPrivate::create_sys is modified to take account of the value of this flag in all cases. (Previously it only did so if a new WId was passed in by the caller). c) The call to setWinId is delayed until the control and window are fully initialized. This is to allow us to emit a new event, WinIdChanged, from setWinId, in order to inform the widget that its winId has changed. d) QWidgetPrivate::activateSymbianWindow is modified in order to support this change of call ordering. Note that QWidgetPrivate::create_sys requires some re-factoring in order to remove the redundancy between the top-level and child widget cases. Task-number: QTBUG-4664 Reviewed-by: axis
* Merge commit 'qt/4.6' into mmfphononFrans Englich2009-10-021-47/+24
|\ | | | | | | | | Conflicts: src/gui/kernel/qwidget_s60.cpp
| * Revert "Fix for Symbian window activation/focus problem."Jani Hautakangas2009-10-011-59/+0
| | | | | | | | This reverts commit fafd16474aee5bbf47ee37e1ba739f3b3ceb9c33.