summaryrefslogtreecommitdiffstats
path: root/src
Commit message (Collapse)AuthorAgeFilesLines
* Client: Cleanup mouse state after dragJohan Klokkhammer Helsing2016-11-102-0/+12
| | | | | | | | | | | | Fixes an issue where dragging with the mouse would cause the next touch event to not generate a synthesized mouse press event. The touchDrag test can now be run directly after the mouseDrag test without failing. Task-number: QTBUG-56187 Change-Id: I53cc5f90fc8d8672936b23f54a017687d41c31fc Reviewed-by: Paul Olav Tvete <paul.tvete@qt.io>
* Client: Fix touch getting stuck after drag-and-dropJohan Klokkhammer Helsing2016-11-093-1/+19
| | | | | | | | | wl_touch.up is not sent by compositors when dragging, so release all touch points when the drag ends. Task-number: QTBUG-56187 Change-Id: I1c3d03c72e75a551355c50bb5d82433f5e2e35f0 Reviewed-by: Paul Olav Tvete <paul.tvete@qt.io>
* Don't create new xdg surfaces in updateTransientParentJohan Klokkhammer Helsing2016-11-091-1/+3
| | | | | Change-Id: I1644a75269fec40644f02eeb275d9e6b98995c0e Reviewed-by: Paul Olav Tvete <paul.tvete@qt.io>
* Fix build when some features are disabledPaul Olav Tvete2016-11-0720-13/+69
| | | | | | | | | | Make QtWaylandClient compile when Qt is configured with: -no-opengl -no-accessibility -D QT_NO_CLIPBOARD -D QT_NO_DRAGANDDROP -D QT_NO_SESSIONMANAGER Task-number: QTBUG-56192 Change-Id: Idc6aae6b36a35515109a27bed31a22e3e909ef27 Reviewed-by: Giulio Camuffo <giulio.camuffo@kdab.com>
* Client: Call parent requestUpdate after changing subsurface positionJohan Klokkhammer Helsing2016-10-261-0/+3
| | | | | | | | | | Calling setPosition on a child window would not send the appropriate commit request after the wl_subsurface.set_position request. Task-number: QTBUG-52118 Change-Id: I792016ce7e0a5a2efd3a32a98727b43ee0275b0e Reviewed-by: Paul Olav Tvete <paul.tvete@qt.io> Reviewed-by: Giulio Camuffo <giulio.camuffo@kdab.com>
* Client: Remove windows from keyboard focus list when destroyedJohan Klokkhammer Helsing2016-10-243-1/+10
| | | | | | | | | | | | | This fixes the undefined behavior in tst_WaylandClient::touchDrag and mouseDrag Note: The test still fails if run twice in a row, but it appears to be deterministic. Task-number: QTBUG-56187 Change-Id: Ib45d82224f004d1324f2ce4d6b7df05ee36c04f5 Reviewed-by: Paul Olav Tvete <paul.tvete@qt.io> (cherry picked from commit 0049240a2b7d8691f09224e1542919ddbbb0d864) Reviewed-by: Johan Helsing <johan.helsing@qt.io>
* Don't return a null QMimeData from the clipboardGiulio Camuffo2016-10-172-3/+5
| | | | | | | | | | The documentation for QClipboard::mimeData() doesn't say that the returned value can be null, and some clients just dereference that without checking. So instead return an empty QMimeData. Change-Id: Ieec3140af4e7f33cde98ed96fd96b2674d0d0f9f Reviewed-by: Pier Luigi Fiorini <pierluigi.fiorini@hawaiios.org> Reviewed-by: Johan Helsing <johan.helsing@qt.io>
* Fix build with QT_NO_ACCESSIBILITYSamuli Piippo2016-09-162-2/+6
| | | | | | | | The accessibility() function is ifdef'd in the base class, which makes build fail when Q_DECL_OVERRIDE is used here. Change-Id: Ic3d800ccf32b39f5bc8d3f94d222bc0d34457057 Reviewed-by: Paul Olav Tvete <paul.tvete@qt.io>
* Remove or add window decorations when toggling fullscreenJohan Klokkhammer Helsing2016-09-051-0/+1
| | | | | | Task-number: QTBUG-55343 Change-Id: I38e94a70585ba93d40de22698fda80530cf2156d Reviewed-by: Paul Olav Tvete <paul.tvete@qt.io>
* Merge remote-tracking branch 'qt/5.6.2' into 5.6Paul Olav Tvete2016-08-263-7/+17
|\ | | | | | | Change-Id: Ie6ec1ae90396619214cf1f29ae9595c5f1915e10
| * Client: Fix keyboard focus logic and crashJohan Klokkhammer Helsing2016-08-263-7/+17
| | | | | | | | | | | | | | | | | | | | The previous solution did not check for nullptr before dereferencing, which caused a crash. Furthermore, it checked the new ShellSurface's shellManagesActiveState before deciding whether to unfocus the old one. Task-number: QTBUG-55526 Change-Id: I410b6200a5b7b86806f70970730045a4a25f21db Reviewed-by: Paul Olav Tvete <paul.tvete@qt.io>
* | Pass TRANSIENT_INACTIVE flag for windows with WA_ShowWithoutActivatingMartin Gräßlin2016-08-261-1/+9
|/ | | | | | | | | | | When setting a transient window also evaluate the state of the window attribute WA_ShowWithoutActivating. If that flag is set the transient should get the inactive flag as well. Task-number: QTBUG-55403 Change-Id: I757e5527e78f730a440e26abb52e84c9b2bb2f3a Reviewed-by: Johan Helsing <johan.helsing@qt.io> Reviewed-by: Giulio Camuffo <giulio.camuffo@kdab.com>
* Fix crash on client exitWieland Hagen2016-08-181-4/+13
| | | | | | | | | | This is a backported fix from the 5.7 branch. Original patches: 93ca929fb9caf347150 and d6fe7b6165859e17f03 Change-Id: Iaec5acb314d3bbc199e962a5dc27a70f0d2df655 Reviewed-by: Giulio Camuffo <giulio.camuffo@kdab.com> Reviewed-by: Paul Olav Tvete <paul.tvete@qt.io>
* Client: Fix popup position for xdg shellJohan Klokkhammer Helsing2016-08-106-1/+163
| | | | | | | | | | | | | Popups used xdg_surface instead of xdg_popup. It's not possible to set a position for an xdg_surface, because it's supposed to be a top level window (in xdg shell v5). Consequently, popups were treated as top level windows and positioned randomly on Weston. Using xdg_popup instead solves the problem. Task-number: QTBUG-55063 Change-Id: I223348677ef8a1ef1eee6a4c389276a6c802bcb5 Reviewed-by: Giulio Camuffo <giulio.camuffo@kdab.com>
* Make wl_shell and xdg_shell use the QWaylandShellIntegration interfaceJohan Klokkhammer Helsing2016-08-0913-40/+337
| | | | | | | | This simplifies the code in QWaylandDisplay and hopefully makes it easier to implement a prioritized shell selection mechanism later. Change-Id: I2bb3a13f8acedb60a6606cb3a8b5b228095eadf9 Reviewed-by: Giulio Camuffo <giulio.camuffo@kdab.com>
* Client: Refactor window active stateJohan Klokkhammer Helsing2016-08-084-8/+4
| | | | | | | | Let shell surface implementations decide if they manage activated state. Moves the logic out of QWaylandDisplay. Change-Id: I75c86df68a1a93f9b1d2bf378b6603215d0b0128 Reviewed-by: Paul Olav Tvete <paul.tvete@qt.io>
* Fix crash when dragging with touch without first having pointer focusJohan Klokkhammer Helsing2016-08-021-0/+3
| | | | | | | | Also add drag-and-drop tests for both touch and mouse. Task-number: QTBUG-54756 Change-Id: Ibfff48b1f2377022a8624e28e9f638076187ddca Reviewed-by: Paul Olav Tvete <paul.tvete@qt.io>
* Remove logging of drag-and-drop dataJohan Klokkhammer Helsing2016-08-011-4/+0
| | | | | Change-Id: Ic66faf02f7d4eb82aa898a2858a0271a007460a0 Reviewed-by: Pier Luigi Fiorini <pierluigi.fiorini@hawaiios.org>
* Fix high-DPI scaling of window decorations for shared memory buffersJohan Klokkhammer Helsing2016-07-111-10/+18
| | | | | Change-Id: I6833ab86ffdb4e37dad5108baddb7a54cfb5e9fa Reviewed-by: Giulio Camuffo <giulio.camuffo@kdab.com>
* Use xdg_shell configure events to determine active windowJohan Klokkhammer Helsing2016-07-046-36/+100
| | | | | | | | | | | | | | | | | | | | | | According to the xdg_shell protocol, the compositor is allowed to set multiple active windows. Qt's model, however, allows only a single active window. In order to map between the models, a list of the compositor's active windows is kept in QWaylandDisplay in the order they were activated. Hence, the front of this list will always be the most recently activated window, and it will be mapped as Qt's active window. Previously keyboard focus was used to determine the active window, this method has been disabled for xdg_shell. Functionality for delaying the call to QWindowSystemInterface::handleWindowActivated has been moved from QWaylandInputDevice::Keyboard to QWaylandDisplay so the implementations can share the workaround. Task-number: QTBUG-53702 Change-Id: I878151f9c52ed09a8d6571c6208920436c3ca8fc Reviewed-by: Giulio Camuffo <giulio.camuffo@kdab.com>
* Remove unused method QWaylandDisplay::lastKeyboardFocusInputDeviceJohan Klokkhammer Helsing2016-06-293-16/+0
| | | | | Change-Id: Iee19b36ae2032112e0097dc6eb2e4592697c2a1c Reviewed-by: Pier Luigi Fiorini <pierluigi.fiorini@hawaiios.org>
* Add missing Q_DECL_OVERRIDEs to client classes.Johan Klokkhammer Helsing2016-06-2724-101/+101
| | | | | | Change-Id: I10e550a25ce498bbeedc242ac73059cc6fdcef30 Reviewed-by: Pier Luigi Fiorini <pierluigi.fiorini@hawaiios.org> Reviewed-by: Giulio Camuffo <giulio.camuffo@kdab.com>
* Only resize when the cursor is actually on the window frameJohan Klokkhammer Helsing2016-06-201-4/+4
| | | | | | | | | The previous code seems to have been written under the impression that QWindow::width() included frame margins, causing the resizing areas of the window decoration to be too large. Change-Id: Ia13f12afd88a4017d01853798226455b84290d01 Reviewed-by: Giulio Camuffo <giulio.camuffo@kdab.com>
* Client: Fix incorrect size when maximizing using xdg_shellJohan Klokkhammer Helsing2016-06-162-14/+11
| | | | | | | | | | | | | | | | | | | | | | When maximizing xdg_shell clients, the clients would call QPlatformWindow::setGeometry() with frame margins included, resulting in a window that was bigger than what was requested by the compositor. The reason for this, was that QWaylandXdgSurface would subtract the frame margins from the width and height only when the resizing state was set, not when the maximized state was set. Later, margins were added again before QWaylandWindow::configure was called. This resulted in margins being subtracted and then added back for the resizing state, while for the maximized state margins were only added and never subtracted. This behavior has now been simplified so only size including window frame is tracked. This is what we receive in the XdgSurface::configure event anyway, and also what QWaylandWindow::configure expects. Change-Id: I0629e7e79a5367fa872743c6d025bfab8a4f2866 Reviewed-by: Giulio Camuffo <giulio.camuffo@kdab.com>
* Set device pixel ratio for window decorations on scaled windowsJohan Klokkhammer Helsing2016-06-091-1/+4
| | | | | Change-Id: I40d96362131124effd9405cdad4e3dea79e6ebe3 Reviewed-by: Pier Luigi Fiorini <pierluigi.fiorini@gmail.com>
* Fix content positioning relative to decoration on scaled outputsJohan Klokkhammer Helsing2016-06-081-1/+1
| | | | | | | | | Only the width and height were scaled previously, causing an incorrect offset from the lower left corner, resulting in a small transparent gap to form between the decoration and the content on the right and top. Change-Id: I0b253c05c9b260d9ff3a6ab5f8aea42370561959 Reviewed-by: Pier Luigi Fiorini <pierluigi.fiorini@gmail.com>
* client: Always accept the DnD data offerGiulio Camuffo2016-06-031-18/+16
| | | | | | | | | | | Weston stopped sending the wl_data_device.drop event if the data offer was not accepted, which was the case when it was coming from the same client that was receiving the offer. So now always accept the offer even if we will bypass the offer when retrieving the data. Change-Id: If825f4dbc962a7812e379f36a42ceabe3eb3096f Reviewed-by: Johan Helsing <johan.helsing@qt.io> Reviewed-by: Paul Olav Tvete <paul.tvete@theqtcompany.com>
* Fix checking the Qt::BypassWindowManagerHint flagGiulio Camuffo2016-04-211-1/+1
| | | | | | | Change-Id: I24ca4854aa6756f4cea4f4f5a471ffd9bf33c620 Reviewed-by: Johan Helsing <johan.helsing@qt.io> Reviewed-by: Erik Larsson <erik@ortogonal.com> Reviewed-by: Laszlo Agocs <laszlo.agocs@theqtcompany.com>
* Destroy the subsurface protocol objectsGiulio Camuffo2016-04-191-0/+1
| | | | | | | | | This fixes a protocol error the compositor would send when a window changes its parent, because we were creating a new subsurface without destroying the old one. Change-Id: I0855d0582153e0aff37be508d9fb43d22c9ad0b5 Reviewed-by: Pier Luigi Fiorini <pierluigi.fiorini@gmail.com>
* Client: Don't create shell surfaces for QShapedPixmapWindowJohan Klokkhammer Helsing2016-03-312-3/+24
| | | | | | | | | | | | | | | QShapedPixmapWindow is used as a drag-and-drop icon. This caused two roles (wl_data_device-icon and wl_shell_surface) to be assigned to the same surface, resulting in a protocol error. This bug hasn't been encountered before because QShapedPixmapWindow sets X11BypassWindowManagerHint, which was previously used to determine whether to create a shell surface or not. Task-number: QTBUG-52052 Change-Id: I1d79f3ec8ad08e0be1551c39df6232876dc2ac2e Reviewed-by: Giulio Camuffo <giulio.camuffo@kdab.com> Reviewed-by: Erik Larsson <erik@ortogonal.com>
* Remove attached() definition from header.Erik Larsson2016-03-291-1/+0
| | | | | | | | | The implementation of attached() method was removed in commit 'Fix SHM drawing logic' (19260d9846861212881e374229798b3863d1a78d) but the definition in the header file was not. Change-Id: Ib850bc7101a661882078be95011d75660f621622 Reviewed-by: Giulio Camuffo <giulio.camuffo@kdab.com>
* Make public headers compile with -Wzero-as-null-pointer-constantMarc Mutz2016-03-224-5/+5
| | | | | | | | | | | | ... or equivalent. QtBase 5.6 headers already compile that way, so let the other modules follow suit. Change-Id: Iddf561087189ece6dd34b42605842dfafdbd8b4e Task-number: QTBUG-45291 Reviewed-by: Johan Helsing <johan.helsing@theqtcompany.com> Reviewed-by: Pier Luigi Fiorini <pierluigi.fiorini@gmail.com>
* Merge remote-tracking branch 'origin/5.6.0' into 5.6Frederik Gladhorn2016-03-171-0/+2
|\ | | | | | | Change-Id: If2caca2463ef6815d2cc9a8f05ccd78c867c95d2
| * Fix failure to build from sources: missing #includev5.6.0Thiago Macieira2016-03-031-0/+2
| | | | | | | | | | | | | | qwaylandinputdeviceintegration_p.h:64:85: error: ‘uint32_t’ has not been declared Change-Id: Ic747cc2ab45e4dc6bb70ffff143843d1ed4a341b Reviewed-by: Lars Knoll <lars.knoll@theqtcompany.com>
* | Add support for bitmap cursorsMartin Gräßlin2016-03-177-11/+70
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | So far QtWayland did not support custom bitmap/pixmap QCursors. This change adds support for them by creating a QWaylandShmBuffer and copying the pixmap data into that buffer. The internal API to set cursors images is changed to not only rely on wl_cursor_image, but also allow to just set the buffer with a specific size and a hot spot. The created WaylandShmBuffer is passed around as a shared pointer, so that it can be automatically cleaned up once the cursor image is no longer used on any seat. Task-number: QTBUG-51604 Change-Id: I1f1ee87f03186c3d564468d3e8ea2a3141d7e2fb Reviewed-by: Giulio Camuffo <giulio.camuffo@kdab.com> Reviewed-by: Johan Helsing <johan.helsing@theqtcompany.com>
* | Fix client xdg_surface not handling all states from configure eventJohan Klokkhammer Helsing2016-03-151-6/+4
| | | | | | | | | | | | | | The code used sizeof(state) when it should have been sizeof(*state). Change-Id: Id1714a5e90e6c58850023424726de26719a69046 Reviewed-by: Paul Olav Tvete <paul.tvete@theqtcompany.com>
* | Fix SHM drawing logicGiulio Camuffo2016-03-0711-111/+162
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The old logic didn't care to listen for wl_buffer.release events so it always drew in the same buffer, potentially resulting in tearing if the compositor was scanning out the buffer at the same time. Instead properly cycle between a few buffers and don't reuse the same one until the release event was received. The old code also used to throttle the redraws, unless the buffer was changing, that is unless the window was getting resized. This is now lost, and no throttling is ever done. Doing it properly, by waiting for the frame callback before committing the new buffer shows very noticeable lags with many applications when resizing, because they paint many times per resize event, so they fall behind the cursor. A proper fix will be to implement the support for requestUpdate(), and using it in the applications. Change-Id: I02732c34769a5c75a6ad68c095bae916e4b274d3 Reviewed-by: Robin Burchell <robin.burchell@viroteck.net>
* | Fix crash when pinging a surface with an invalid resource.Andrew den Exter2016-02-261-0/+4
| | | | | | | | | | | | | | | | | | | | | | Check the surface hasn't been deleted before initiating the ping so that an invalid resource isn't dereferenced when printing a warning after the operation inevitably fails. Change-Id: I18c82de280d5a7a5339e3179c2bba49800626bb6 Reviewed-by: Johan Helsing <johan.helsing@theqtcompany.com> Reviewed-by: Giulio Camuffo <giulio.camuffo@kdab.com> Reviewed-by: Pier Luigi Fiorini <pierluigi.fiorini@gmail.com>
* | don't over-expose private dependenciesOswald Buddenhagen2016-02-251-4/+4
| | | | | | | | | | Change-Id: If46406b4129b464e8ccfa0b4cf6ff2989402ca74 Reviewed-by: Paul Olav Tvete <paul.tvete@theqtcompany.com>
* | consistently put {qt,qml}_{module,plugin} at the end of project filesOswald Buddenhagen2016-02-2520-68/+53
| | | | | | | | | | | | | | | | this fixes static builds by ensuring that all dependencies are exported. Task-number: QTBUG-51071 Change-Id: Ie9e89fa47696244e8ee478ed1a019765c835533e Reviewed-by: Paul Olav Tvete <paul.tvete@theqtcompany.com>
* | Fix crash for destroyed surface on touch eventElvis Lee2016-02-251-0/+5
| | | | | | | | | | | | Change-Id: Ia3dd8627c1b96a88d308dc7fa85d936f809c7856 Reviewed-by: Elvis Lee <kwangwoong.lee@lge.com> Reviewed-by: Paul Olav Tvete <paul.tvete@theqtcompany.com>
* | Fix freeze when using BypassWindowManagerHintJohan Klokkhammer Helsing2016-02-121-1/+2
|/ | | | | | | | | | | | | | | | | Shell surfaces are now created for windows with BypassWindowManager set, unless the environment variable QT_WAYLAND_USE_BYPASSWINDOWMANAGERHINT is also set. This means that in case you need a window to not create a wayland shell_surface (perhaps because you do not want to use wl_shell or xdg_shell), you can set the environment variable and get the same behavior as before. Meaning the surfaces of windows with the flag set will not be assigned a role. Task-number: QTBUG-49272 Change-Id: Idf969540497d6b4e54395b97472d99d2e068be93 Reviewed-by: Giulio Camuffo <giuliocamuffo@gmail.com> Reviewed-by: Pier Luigi Fiorini <pierluigi.fiorini@gmail.com>
* Don't create wl_surface for desktop widgetsv5.6.0-rc1Paul Olav Tvete2016-01-111-2/+2
| | | | | Change-Id: I3ebcb49a4acf230b9515c0317aab2307dcb9270b Reviewed-by: Pier Luigi Fiorini <pierluigi.fiorini@gmail.com>
* Fix the control keyPaul Olav Tvete2016-01-111-0/+7
| | | | | | | | | | Let Ctrl+A cause a key event with text Ctrl+A (0x01), like we do on the other platforms. Previously we would use 'A', which would confuse some applications. Task-number: QTBUG-50398 Change-Id: Ie3def4bd9c96e538b2572b88fae029d347e08814 Reviewed-by: Pier Luigi Fiorini <pierluigi.fiorini@gmail.com>
* Revert "Don't invalidate textures when the scene graph is stopped."v5.6.0-beta1Andrew den Exter2015-12-131-0/+5
| | | | | | | | | | | | This was too aggressive, if there is a queued buffer the current one needs to be invalidated or the compositor will hold references to both buffers while the scene graph is stopped which will block clients in eglSwapBuffers. This reverts commit 438063af85d0999f9dead6f04a3285edb175e24c. Change-Id: I3247cfc94e12322fcccc07b5dd64146b055ab431 Reviewed-by: Giulio Camuffo <giuliocamuffo@gmail.com>
* Get rid of the egl config test and use what qtbase providesLaszlo Agocs2015-11-1112-23/+36
| | | | | | | | | | | | | | | contains(QT_CONFIG, egl) and CONFIG += egl is the only sane way to test for and pull in EGL headers and libs. This is particularly important when trying to be robust and guard against half-broken sysroots on embedded where a naive PKGCONFIG += egl breaks. Also add an EGL_WAYLAND_BUFFER_WL define to keep wayland-egl compiling. We are not testing for that in any config tests may cause a failure in sysroots that have parts of Mesa thrown in but pick ip an older EGL header from the vendor's driver. Change-Id: I7b7e6a7a91e78dbda5b6954ad08761298c538efc Reviewed-by: Giulio Camuffo <giulio.camuffo@jollamobile.com>
* RPi: Resolve all BRCM functions dynamicallyLaszlo Agocs2015-11-115-8/+6
| | | | | | | | | | | | Directly calling eglCreateGlobalImageBRCM and friends is not ideal due to the messy RPi distro setups: shipping Mesa (sw rasterizer only) in standard locations may cause picking up those EGL/GLES libs instead of the Broadcom ones from /opt/vc when building Qt. While this is something that should be fixed in the sysroot (since it is a problem at runtime anyway), let's make life easier by resolving via eglGetProcAddress, which is the right approach in any case. Change-Id: I73f7698b638691d97743a6f819bc7c8ee6ebd245 Reviewed-by: Giulio Camuffo <giulio.camuffo@jollamobile.com>
* Fix compiler warnings.Friedemann Kleint2015-11-052-1/+2
| | | | | | | | qwaylandinputcontext.cpp:57:16: warning: unused parameter 'sym' [-Wunused-parameter] qwaylanddatadevice.cpp:173:135: warning: 'dragData' may be used uninitialized in this function [-Wmaybe-uninitialized] Change-Id: Id654360fd9b7fdb572565ad39b664af3355b5e79 Reviewed-by: Giulio Camuffo <giulio.camuffo@jollamobile.com>
* client: Remove the event threadGiulio Camuffo2015-11-036-232/+29
| | | | | | | | | | | | | | | | | If the compositor sends events to us while the main thread is blocked the socket notifier in the events thread would keep sending out the activated() signal, but no events would actually be read until the main thread starts to run again. That causes the event thread to keep queueing new events, and so allocating memory, potentially forever. This patch fixes the issue in maybe a bit radical way, that is by removing the event thread. The socket notifier now runs in the main thread so it will block if the events are not being read. Nowadays there is no real reason to keep the event thread around, as every thread that needs to receive wayland events can dispatch them on its own, we don't need a central dispatcher thread anymore. Change-Id: Ib7885e4b038b82719d78d193f465618a72cbe6af Reviewed-by: Pier Luigi Fiorini <pierluigi.fiorini@gmail.com>
* CMake: Create CMake files for WaylandClientKevin Funk2015-11-021-1/+0
| | | | | | | | | Also add unit tests Change-Id: I66de887607f73b318884e4a35f18510b90cf0315 Task-number: QTBUG-47357 Reviewed-by: Jan Arne Petersen <jan.petersen@kdab.com> Reviewed-by: Giulio Camuffo <giulio.camuffo@jollamobile.com>