summaryrefslogtreecommitdiffstats
path: root/src/plugins
Commit message (Collapse)AuthorAgeFilesLines
...
* Add better support for keymap update handlingGatis Paeglis2014-03-275-190/+136
| | | | | | | | | | | | | | | | | | | | | | | | | | | Use the new X11 support API xkb_x11_* released in libxkbcommon version 0.4.0. From the commit message where this API was introduced: "These are function to create an xkb_keymap directly from XKB requests to the X server. This opens up the possibility for X clients to use xcb + xcb-xkb + xkbcommon as a proper replacement for Xlib + xkbfile for keyboard support. Why not just use the RMLVO that the server puts in the _XKB_RULES_NAMES property? This does not account for custom keymaps, on-the-fly keymap modifications, remote clients, etc., so is not a proper solution in practice. Also, some servers don't even set it. Now, the client just needs to recreate the keymap in response to a change in the server's keymap (as Xlib clients do with XRefreshKeyboardMapping() and friends)." This patch moves XKEYBOARD presence decision from compile time to runtime for a proper remote X client support. Task-number: QTBUG-31527 Task-number: QTBUG-32760 Change-Id: I4d402668cda2126ef180b27022154f96b1874b1d Reviewed-by: Uli Schlachter <psychon@znc.in> Reviewed-by: Lars Knoll <lars.knoll@digia.com>
* Android: registerTouchDevice at startupBogDan Vatra2014-03-271-0/+33
| | | | | | | | | | I'd like to keep registerTouchDevice from androidjniinput.cpp, touchEnd as a backup for buggy Android devices that are not setting Configurations.touchscreen field correctly. Task-number: QTBUG-36007 Change-Id: Ib8f107474baa278b2d82d9ca14913512dfff01c2 Reviewed-by: Shawn Rutledge <shawn.rutledge@digia.com>
* Don't create screen surface if there are no raster windows.BogDan Vatra2014-03-273-3/+15
| | | | | | Change-Id: Idaf5df814bb087707654d7ad7046ba8799f99c0a Reviewed-by: Sean Harmer <sean.harmer@kdab.com> Reviewed-by: BogDan Vatra <bogdan@kde.org>
* Disable non-fullscreen windows for WinRTMaurice Kalinowski2014-03-271-0/+2
| | | | | | | | | | The integration seems to have been missing this flag. Hence we tried to open new windows in non-fullscreen mode causing lots of issues. For instance this resolves QCombobox popup problems. Task-number: QTBUG-37593 Change-Id: I3d3e3699dff91dcb95613893c2a5bdefc90131b7 Reviewed-by: Andrew Knight <andrew.knight@digia.com>
* Android: use fbo read back workaround with specific GPUs.Yoann Lopes2014-03-274-4/+22
| | | | | | | | | | | | | Namely, the Mali 400 and the Adreno 200. We used to enable this workaround only for the Samsung Galaxy Tab 3, which has a Mali 400. The same problem was confirmed with the Samsung Galaxy Note N7000 (Mali 400) and the ZTE Blade (Adreno 200). Task-number: QTBUG-33951 Task-number: QTBUG-34984 Change-Id: Ic624962986f718285b98ab4ca48e22f9aa110753 Reviewed-by: Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@digia.com> Reviewed-by: Shawn Rutledge <shawn.rutledge@digia.com>
* QNX: Fix geometry changed event for non FS windowsFabian Bumberger2014-03-271-4/+4
| | | | | | | | For non full screen windows the geometry change event was not sent. Change-Id: I982621d87fe248bbe13640dd3e17b31fb9f30120 Reviewed-by: Bernd Weimer <bweimer@blackberry.com> Reviewed-by: Sergio Ahumada <sahumada@blackberry.com>
* QNX: Retrieve name of the displayFabian Bumberger2014-03-272-0/+8
| | | | | | | | Task-number: QTBUG-34545 Change-Id: I51d36c7352351b0770a1a076bdcc738677d7fcb6 Reviewed-by: Bernd Weimer <bweimer@blackberry.com> Reviewed-by: Sergio Ahumada <sahumada@blackberry.com>
* Accessibility Mac: Fix handling of top level widgetFrederik Gladhorn2014-03-272-41/+30
| | | | | | | | | | | | | | | | | | This simplifies how we handle QNSView for accessibility purposes. Instead of trying to half-merge the top level widget (window->accessibleRoot) into the view, just have the view always return it as child. This makes the accessibility implementation for QNSView simpler and makes applications that show a top level widget such as a button possible. (We would return accessibility ignored for the button before). As a side effect finding the active focus and hit-testing should be more reliable as well. Task-number: QTBUG-37794 Change-Id: Ib52037f88da8887a0bdc77204b0f3daddfe7709d Reviewed-by: Morten Johan Sørvig <morten.sorvig@digia.com> Reviewed-by: Jan Arve Sæther <jan-arve.saether@digia.com>
* OSX: a window can be de-maximized by resizingShawn Rutledge2014-03-273-0/+17
| | | | | | | | After that, QWidget::isMaximized() should return false. Task-number: QTBUG-37703 Change-Id: Ic8b0de63ab007066cd277f511dfaa969404ff069 Reviewed-by: Gabriel de Dietrich <gabriel.dedietrich@digia.com>
* WinRT: Use registerFontFamily to reduce font registration overheadAndrew Knight2014-03-272-152/+182
| | | | | | | | Adopt to the new lazy font loading strategy in order to reduce memory and startup time associated with populating the entire font database. Change-Id: I0134cc123f73cb8485fe85c4a6b8e3b3a3a2cab0 Reviewed-by: Oliver Wolff <oliver.wolff@digia.com>
* REG: Fix window repaint geometryBogDan Vatra2014-03-261-2/+2
| | | | | | | Task-number: QTBUG-37530 Change-Id: I642c8ef8cf7de50e4a84d8356693b82f8674cece Reviewed-by: Paul Olav Tvete <paul.tvete@digia.com>
* Android: Fix font mergingEskil Abrahamsen Blomfeldt2014-03-252-4/+17
| | | | | | | | | | | | | Our fallback fonts would contain a minimal list of hardcoded fallback fonts, which is neither sufficient for displaying all text, nor portable to different vendors which can supply different font sets. [ChangeLog][Android] Fixed font merging problem which caused e.g. missing glyphs for Arabic numerals. Task-number: QTBUG-37738 Change-Id: Ic971343a1cd5610c79a81f6f6152c637937b5626 Reviewed-by: Konstantin Ritt <ritt.ks@gmail.com>
* Fix regression in minimized state handlingLaszlo Agocs2014-03-251-5/+5
| | | | | | | | | | | | WM_STATE and _NET_WM_STATE are not the same. c6e271da6d1d972ad73a97871baafe57578a69a9 introduces a severe regression in this respect, making applications on xcb not to follow window state changes properly. Task-number: QTBUG-37695 Change-Id: Ia058bc11d5aa988eab513939c9f755c2f77512ee Reviewed-by: Martin Klapetek <mklapetek@kde.org> Reviewed-by: Shawn Rutledge <shawn.rutledge@digia.com>
* Fix up warnings in linuxfbLaszlo Agocs2014-03-251-7/+9
| | | | | | | | | | | Remove the warning about the graphics mode switch. In some environments it just pollutes the output since it will always fail. Change the errno-based warnings to qErrnoWarning. Change-Id: Ib7a7bfe64eda29996db288e52d369dcfad76c096 Reviewed-by: Friedemann Kleint <Friedemann.Kleint@digia.com> Reviewed-by: Jørgen Lind <jorgen.lind@digia.com>
* eglfs: Add a way to force 24/32 bit configsLaszlo Agocs2014-03-251-1/+10
| | | | | | | | | | | Some embedded devices do not play nicely with 16-bit (565) EGL configurations, resulting in ugly banding in Quick apps. Add a QT_QPA_EGLFS_FORCE888 environment variable that can be set on systems where it is known that only 24 or 32 bit configs provide acceptable results. Change-Id: I7b8d7b9a2cd40b51a844d0795b7156b735e18ebb Reviewed-by: Jørgen Lind <jorgen.lind@digia.com>
* eglfs: Avoid double surfaceFormatFor() callsLaszlo Agocs2014-03-251-2/+2
| | | | | | | | | The hooks' surfaceFormatFor() function is called twice on the format when creating platform contexts, once from the integration and once from the constructor. This is potentially dangerous. Do it only once. Change-Id: I58eadce01b8f2183abe116f88b1ee9f2b47c003d Reviewed-by: Jørgen Lind <jorgen.lind@digia.com>
* Update evdevtouch readmeLaszlo Agocs2014-03-251-8/+5
| | | | | | | | Removed/updated some out of date information. Change-Id: Iec2105f15c83f04dafbed15a9600e3de0e03f0de Reviewed-by: Jørgen Lind <jorgen.lind@digia.com> Reviewed-by: Shawn Rutledge <shawn.rutledge@digia.com>
* OSX: make reported window state consistent with realityShawn Rutledge2014-03-253-5/+30
| | | | | | | | | | | | | You can't always get what you want: if you exit from fullscreen mode via showNormal, it might actually be maximized; or if you exit via showMaximized, it might actually be normal, if that's the mode the NSWindow remembers. We can't set the state, we can only toggle it. But now at least it's predictable, so that if you call showNormal or showMaximized twice, you will definitely get back to that state. Task-number: QTBUG-35166 Change-Id: I7422960a64f624920566c25763f5c3b03a684fb5 Reviewed-by: Gabriel de Dietrich <gabriel.dedietrich@digia.com>
* WinPhone: Install DejaVu ttf fonts into QtOliver Wolff2014-03-251-0/+9
| | | | | | | | | As these fonts are deployed as part of the package for WinPhone projects by default they have to be installed in order to be available in the packages. Change-Id: Iaaca7b7db0525f06d3e1716d5a337550ffb1dea9 Reviewed-by: Andrew Knight <andrew.knight@digia.com>
* QNX: Fix sending of expose eventsFabian Bumberger2014-03-231-1/+2
| | | | | | | | | When the window geometry is changed an expose event should only be sent if the window is visible. Change-Id: I540ea7e7e07d896495547f3f8bf81738fad3ddee Reviewed-by: Bernd Weimer <bweimer@blackberry.com> Reviewed-by: Sergio Ahumada <sahumada@blackberry.com>
* QPA: Fix QPlatformTheme::Palette enum value spellingGabriel de Dietrich2014-03-211-1/+1
| | | | | | | | | We keep the old value for source compatibility, but it should probably be removed at some point as the QPA API is semi-public only. Change-Id: I06e4c9ca1d8bb878411ad79ef409d60ce2d29f4a Reviewed-by: Friedemann Kleint <Friedemann.Kleint@digia.com>
* Mac theming: Remove obsolete private color conversion functionsGabriel de Dietrich2014-03-211-2/+0
| | | | | Change-Id: I165eea19c8e50f981a9fa48c14f0d63c40951747 Reviewed-by: Jens Bache-Wiig <jens.bache-wiig@digia.com>
* Mac theming: Set background brush for menu paletteGabriel de Dietrich2014-03-211-0/+2
| | | | | | | | We also remove overriding the background when polishing the palette in QMacStyle. This is a leftover from pre-10.5 styling. Change-Id: Icaa6d9c864ab01783d83cc02192981136c417d24 Reviewed-by: Jens Bache-Wiig <jens.bache-wiig@digia.com>
* iOS: send a Qt::Key_Return when the user hits done/enterRichard Moe Gustavsen2014-03-211-2/+11
| | | | | | | | | | We need to send key events when the user hits enter, otherwise there is no way to know when the user has 'confirmed' the text he wrote. This is on par with how it's done for the Android port. Change-Id: I585d4198de24b0d251e5e0dd2956ce81b6483f82 Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@digia.com>
* iOS: implement 'close keyboard' gestureRichard Moe Gustavsen2014-03-211-3/+27
| | | | | | | | | | | | | | | | | | | | | | Before this patch there were no way for the user to hide the keyboard on iPhone for multi-line edit fields unless the app had a separate button added for it. And even that would be problematic since we scroll the screen (and perhaps the button) to track the cursor. This patch implements a gesture that resembles the 'hide keyboard' gesture that UIScrollView implements on iOS 7. Note that if you start the gesture inside the edit field, you will start selecting text as well. This will also cause the cursor to move and the screen to scroll. After some testing and failing, it seems like we need to live with such artifacts until we do get around to do the only sensible thing; fix up how we do text selection on touch platforms. Working around it becomes just to messy. Change-Id: I1c0d9c88ff1f5430587a49591f165b9708e5dc60 Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@digia.com>
* REG: Android: Fix freeze when accessing assetsEskil Abrahamsen Blomfeldt2014-03-211-1/+0
| | | | | | | | | | | Change 287fa94fe2f93e2857a4c15f69435c4ea14de82e created a freeze in the assets file engine because it will try locking the mutex twice. Since prepopulateCache() is only called from create(), we don't need to lock it recursively. Task-number: QTBUG-37661 Change-Id: I00d0fed132a86c1be5603484eb6ee05454da9ef0 Reviewed-by: BogDan Vatra <bogdan@kde.org>
* Cocoa: Fix geometry for embedded QWindows.Morten Johan Sørvig2014-03-202-0/+17
| | | | | | | | | | | | | | | | Report for correct geometry for QMacNativeWidget and other QWindows that are embedded in a NSView hierarchy. This also makes mapFrom/ToGlobal work. The implementation is different than for the other cases: Add a QCoocaWindow::geometry() overload and query the geometry there, instead of using a geometry change notification which sets the geometry on the QWindow. Task-number: QTBUG-36322 Change-Id: Iab5f0c96b89610c8a4b4a7de49887b0683d551dd Reviewed-by: Gabriel de Dietrich <gabriel.dedietrich@digia.com>
* Set unified toolbar height accurately.Morten Johan Sørvig2014-03-204-4/+77
| | | | | | | | | | | | | | | Add registerContentBorderArea() to the Cocoa native interface which allows registering multiple "unified toolbar" areas for each window. Use this function in QToolBarLayout::setGeometry() to register the area for each TopToolBarArea toolbar. Task-number: QTBUG-36700 Change-Id: I52efcc5662556bb94f25f504be3710d0491f79b9 Reviewed-by: Jake Petroules <jake.petroules@petroules.com> Reviewed-by: Gabriel de Dietrich <gabriel.dedietrich@digia.com> Reviewed-by: Denis Dzyubenko <denis@ddenis.info>
* Cocoa: Follow-up m_sendUpAsRightButton for DnDMorten Johan Sørvig2014-03-201-2/+2
| | | | | | | | | | | Clear and test for the correct button according to the m_sendUpAsRightButton flag. (Fixes the warning mentioned QTBUG-35804) Task-number: QTBUG-35804 Change-Id: I5d724d1cfa66b88b8f54e228bd7fb73a04a9f4c9 Reviewed-by: Gabriel de Dietrich <gabriel.dedietrich@digia.com>
* Cococa: Make QMacNativeWidget work again.Morten Johan Sørvig2014-03-201-1/+3
| | | | | | | | | | | | The NSWindow releasing code in recreateWindow() has regressed to not handle the m_contentViewIsToBeEmbedded case. Release the NSWindow directly instead of calling recreateWindow() Change-Id: Ibc6d10faf4c6dae42e02c400b16f28a1d28eb192 Reviewed-by: Gabriel de Dietrich <gabriel.dedietrich@digia.com>
* Cocoa: call SetFrontProcess on raise()Morten Johan Sørvig2014-03-201-0/+3
| | | | | | | | | | This will raise the window in front of windows from other processes as well. Following Qt 4, only do this for top-level windows. Task-number: QTBUG-29087 Change-Id: Iae1b9c2928a627501112f97728198ed6dd614b2d Reviewed-by: Gabriel de Dietrich <gabriel.dedietrich@digia.com>
* Accessibility Mac: Implement most TextEdit functionsFrederik Gladhorn2014-03-201-21/+68
| | | | | | | | | With this patch reading QTextEdit line by line works with VoiceOver. Task-number: QTBUG-37204 Change-Id: Id9d7c4294254aaa8fe51ee8b612bfbb43348b777 Reviewed-by: Morten Johan Sørvig <morten.sorvig@digia.com>
* Accessibility Mac: Implement setting focusFrederik Gladhorn2014-03-201-2/+8
| | | | | | | | [ChangeLog][QtGui][Accessibility] Allow assistive apps such as VoiceOver to set the focus on widgets and controls. Change-Id: I657bf7d827c5e5293cfd628dbb6b8f0592a84f24 Reviewed-by: Morten Johan Sørvig <morten.sorvig@digia.com>
* Accessibility: Improve QTextEditFrederik Gladhorn2014-03-201-1/+5
| | | | | | | | | | | | | EditableTextInterface was implemented but not reported to the accessibility bridges. Newlines in QTextEdit when using QCursor::selectedText are returned as unicode paragraphs, replace them by newlines. [ChangeLog][QtWidgets][Accessibility] Fixed QTextEdit not reporting newlines to accessibility frameworks and add editable text interface. Change-Id: Iac21e70f5468a16f8abf242ae148290dbab3f8e4 Reviewed-by: Jan Arve Sæther <jan-arve.saether@digia.com>
* Accessibility Mac: Fix TextEditFrederik Gladhorn2014-03-201-0/+94
| | | | | | | | | [ChangeLog][QtGui][Accessibility] Implemented text attributes to enable VoiceOver to read QTextEdit and QPlainTextEdit. Task-number: QTBUG-37204 Change-Id: Ie2fa8086a1bcf4907ac59850dc5c6c08b5f0b7f2 Reviewed-by: Morten Johan Sørvig <morten.sorvig@digia.com>
* Android: Re-enable threaded renderingEskil Abrahamsen Blomfeldt2014-03-201-1/+2
| | | | | | | | | | | | | | | In Qt 5.2.x, the platform plugin inherited from the EGLFS platform plugin, so calling the super class implementation of hasCapability() would return true for ThreadedOpenGL. Since this link was removed in Qt 5.3, we would return false for all devices, giving us a large performance regression. Task-number: QTBUG-37586 Change-Id: I27758649ee9c0921902787b93be943751c839eb8 Reviewed-by: Paul Olav Tvete <paul.tvete@digia.com> Reviewed-by: BogDan Vatra <bogdan@kde.org> Reviewed-by: Alessandro Portale <alessandro.portale@digia.com> Reviewed-by: Gunnar Sletta <gunnar.sletta@jollamobile.com>
* Cocoa: Set surface resolution for all GL surfacesMorten Johan Sørvig2014-03-201-1/+1
| | | | | Change-Id: Ic54ad954a157ff777312361b7816b1752afbf75f Reviewed-by: Paul Olav Tvete <paul.tvete@digia.com>
* Cocoa: Close windows with QWSI::handleCloseEvent()Morten Johan Sørvig2014-03-201-1/+2
| | | | | | | | Calling QWindow::close() directly bypasses some of the window close logic in the QWindow subclasses. Change-Id: I208db5600e6a756e25e207eaaf55dcfad255f406 Reviewed-by: Paul Olav Tvete <paul.tvete@digia.com>
* Cocoa: Enable QQuickWidget on Mac OS X.Morten Johan Sørvig2014-03-204-1/+8
| | | | | Change-Id: I0635bf0bfcd49c20987a81c6f8895fc3343fbd20 Reviewed-by: Paul Olav Tvete <paul.tvete@digia.com>
* QOpenGLContext: Use color depth information from QSurfaceFormatKurt Pattyn2014-03-191-1/+6
| | | | | | | | | | | When a new QOpenGLContext is requested, the color depth information is now also taken into account on OS X and WGL. Task-number: QTBUG-37411 Change-Id: I69d04989a20de3ace041b009fbbdc03fa02cfdf8 Reviewed-by: Laszlo Agocs <laszlo.agocs@digia.com> Reviewed-by: Morten Johan Sørvig <morten.sorvig@digia.com> Reviewed-by: Friedemann Kleint <Friedemann.Kleint@digia.com>
* Workaround for misbehaving [UIScreen screens] in iOS 7.1Eduard Veleba2014-03-191-1/+3
| | | | | | | | | | | | On iOS 7.1 [UIScreen screens] sometimes returns empty NSArray which is against documentation and causes immediate application crash. This workaround uses [UIScreen mainScreen] in case [UIScreen screens] returns empty NSArray. Task-number: QTBUG-37601 Change-Id: I9b341b9ca788b5fc81804489d2e0a3af84207168 Reviewed-by: Tor Arne Vestbø <tor.arne.vestbo@digia.com>
* Update bundled libxkbcommon version to 0.4.0Gatis Paeglis2014-03-195-53/+5
| | | | | | | | | | | | | This release comes with important bug fixes. Also we can now remove the workaround code which was needed for libxkbcommon 0.2.0. Task-number: QTBUG-31712 Task-number: QTBUG-33732 Task-number: QTBUG-34056 Change-Id: I57caf7f803b9a01a15541a5ad82e464de3b8abbb Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@digia.com> Reviewed-by: Lars Knoll <lars.knoll@digia.com>
* QNX: Remove sending synchronous window system eventsFabian Bumberger2014-03-191-6/+0
| | | | | | | | | This makes some OpenGL autotests fail. Apparently we are sending a expose event before the window is properly exposed. Change-Id: I1710ec51605088ce594fc4676214db2d822d1cc5 Reviewed-by: Kevin Krammer <kevin.krammer@kdab.com> Reviewed-by: Rafael Roquetto <rafael.roquetto@kdab.com>
* Accessibility Mac: fix role for linksFrederik Gladhorn2014-03-191-1/+1
| | | | | Change-Id: Ied4dd0bf112f36065da4063857898ca4bd0eb77b Reviewed-by: Morten Johan Sørvig <morten.sorvig@digia.com>
* WinRT: Fix QDesktopServices::openUrl() for local filesAndrew Knight2014-03-181-2/+1
| | | | | | | | | | The passed-in URL is expected to be a file-scheme URL to be converted to a QString using toLocalFile(), not a relative path to be prepended with the application directory. Change-Id: I647f351c99f0df66ef017936585f044292c16aff Reviewed-by: Maurice Kalinowski <maurice.kalinowski@digia.com> Reviewed-by: Oliver Wolff <oliver.wolff@digia.com>
* WinRT: Load system fonts using DirectWriteAndrew Knight2014-03-183-1/+337
| | | | | | | | | | | | | | System-installed TrueType fonts can be read into memory and loaded into the FreeType font engine. This allows the application to be packaged without fonts, but does not work on Windows Phone where DirectWrite is not supported. Every single-file TrueType font is registered with the font database, and then loaded into memory at the point that the font is actually used. Task-number: QTBUG-37230 Change-Id: I804116e37a874cd146a0653ba4cc018f8b1cd6a4 Reviewed-by: Oliver Wolff <oliver.wolff@digia.com>
* X11: defaultDragDistance depends on screen resolutionShawn Rutledge2014-03-181-1/+14
| | | | | | | | | | | The usual default is 10 pixels, but on a screen with resolution exceeding 100 DPI, it will be a proportionally larger number. The reason is that such precise finger and mouse movements are more difficult on higher-resolution screens. Change-Id: I6e66299e12e6cac5c4e032251b32a34940970372 Reviewed-by: Jørgen Lind <jorgen.lind@digia.com> Reviewed-by: Laszlo Agocs <laszlo.agocs@digia.com>
* Android input method improvementsPaul Olav Tvete2014-03-183-34/+76
| | | | | | | | | | | | | | Use the new inputmethod query API. and get rid of the hack where we would move the cursor back and forwards to make sure that the Android software keyboard noticed that the cursor had moved. The android plugin now uses absolute positions instead of position within the paragraph for all cursor handling (provided that the control supports the new API). Task-number: QTBUG-37511 Change-Id: I03463dbbcb4acbfa41e2eab06889d021d50da01f Reviewed-by: Eskil Abrahamsen Blomfeldt <eskil.abrahamsen-blomfeldt@digia.com>
* Fix build on older MinGW versionsKonstantin Ritt2014-03-171-0/+4
| | | | | | | | | > In constructor 'QWindowsPrintDevice::QWindowsPrintDevice(const QString&)': > src\plugins\printsupport\windows\qwindowsprintdevice.cpp:105:86: > error: 'DC_COLLATE' was not declared in this scope Change-Id: Ifb64c323765ae4b6abb80c32d4ba2bc3fbffa245 Reviewed-by: John Layt <jlayt@kde.org>
* Windows: Allow for custom input context plugins.Friedemann Kleint2014-03-172-2/+12
| | | | | | | | Task-number: QTBUG-37556 Change-Id: I9719138e1b09026f0971f8d3eeae525fc8951c0d Reviewed-by: Joerg Bornemann <joerg.bornemann@digia.com> Reviewed-by: Jonathan Liu <net147@gmail.com>