Commit graph

14858 commits

Author SHA1 Message Date
Martin Gräßlin
e5fe3137b8 Fix the ignore struts multi-screen handling
Summary:
The checks in Client::adjustedClientArea were a little bit too
agressive, excluding also valid setups.

This change addresses the regression by keeping the actual intended
improvements in place.

The check in Client::adjustedClientArea is now only done for the
special case of desktopArea == area. This ensures that a strut excluding
a complete screen won't affect the overall workarea.

In addition new checks are introduced in Workspace::updateClientArea.
When calculating the new sareas a check is performed whether the
intersection with the adjustedClientArea would result in the sarea
becoming empty (thus a screen being completely removed). If that's the
case the geometry is ignored to not exclude a complete screen.

Interestingly I should have noticed that something with the logic is
odd. As the test case had two commented geometries which we now get.

BUG: 363804

Reviewers: #plasma, apol, lbeltrame

Subscribers: plasma-devel

Tags: #plasma

Differential Revision: https://phabricator.kde.org/D1744
2016-06-15 14:48:13 +02:00
Martin Gräßlin
7818a1fa9c Set internal ClientConnection to null after destroying it
Bshah hit a strange crash which I can only explain by the variable
not being set to null after destroying.
2016-06-14 16:42:52 +02:00
Martin Gräßlin
f5b83d18b8 [platforms/drm] Apply new global position on DrmOutput for a changeset
Summary:
When we get a configuration request, we also need to update the global
position on the DrmOutput, otherwise Wayland will know about the new
position, but KWin internally does not.

In addition we also need to trigger the changed signal on KWin::Screens,
so that internally code can react on the change.

With this change configuring layout of connected screens in KScreen
does work also in KWin.

Reviewers: #kwin, #plasma_on_wayland, sebas

Subscribers: plasma-devel, kwin

Tags: #plasma_on_wayland, #kwin

Differential Revision: https://phabricator.kde.org/D1858
2016-06-14 13:42:25 +02:00
Martin Gräßlin
2b196bfa29 Move the loadTexture for X11 pixmap functionality to the EglOnXBackend
Summary:
To use eglCreateImageKhr for an X11 pixmap we need an EGLDisplay created
for the same XDisplay as the X11 pixmap. This means if we created an
EGLDisplay for a GBM device, we are not allowed to load a texture from
the X11 pixmap and can result in a crash in the driver.

Similar in the nested X11 setup the EGLDisplay is created for the
rendering window, but the X11 pixmaps are from the Xwayland server KWin
started. They don't belong to the same windowing system.

This change addresses this problem by moving the loading of X11 pixmaps
from AbstractEglTexture to EglTexture of the EglOnX11Backend. Thus for
any usage on a non X11 platform we cannot hit the code path any more.
In addition the nested X11 platform can indicate that it doesn't support
it and thus also doesn't go through the code path.

Test Plan: Tested standalone and nested X11 platform

Reviewers: #kwin, #plasma_on_wayland

Subscribers: plasma-devel, kwin

Tags: #plasma_on_wayland, #kwin

Differential Revision: https://phabricator.kde.org/D1857
2016-06-14 09:10:09 +02:00
Martin Gräßlin
96ce7bd2ad Properly call Toplevel::setSurface for wl_surface_id X11 client message event
Summary:
For an X11 window through Xwayland KWin gets a client message with the
Surface id. KWin has two code paths for handling that:
* Wayland Surface is created after the X11 event
* Wayland Surface is created before the X11 event

In the first code path in WaylandServer KWin called Toplevel::setSurface,
the other code path just updated the m_surface without calling into
setSurface. This means the connects for the Surface were not set up,
resulting in the worst case in accessing deleted memory after the Surface
was destroyed.

This change now ensures that setSurface is called from both code paths.
That should fix the potential crash and could also be a fix to the
problem that sometimes X windows seem to not be damaged correctly.

Reviewers: #kwin, #plasma_on_wayland

Subscribers: plasma-devel, kwin

Tags: #plasma_on_wayland, #kwin

Differential Revision: https://phabricator.kde.org/D1820
2016-06-14 07:41:20 +02:00
Martin Gräßlin
ba4e42d139 Update window geometry when creating the decoration in ShellClient
Summary:
When managing a new decorated ShellClient we observed that the window
gets placed with a wrong geometry and on next damage event expands into
a strutted area.

The main reason for this behavior is that the window geometry did not
get updated when creating the decoration. With this change the geometry
gets updated, so that the placement is performed on the correct geometry.

The change itself does not yet cover all conditions. E.g. a maximized
windows which will get decorations will be incorrectly sized. This
requires further changes.

Reviewers: #kwin, #plasma_on_wayland

Subscribers: plasma-devel, kwin

Tags: #plasma_on_wayland, #kwin

Differential Revision: https://phabricator.kde.org/D1812
2016-06-14 07:40:46 +02:00
Martin Gräßlin
39e7b26243 Introduce a RequestGeometryBlocker in ShellClient
Summary:
The idea is to not send multiple resize requests to a client when we
know that we might have multiple geometry changes. E.g. when going
from maximized to restored the borders change and trigger a resize in
addition to the resize from switching to restored.

The implementation is inspired by the GeometryUpdateBlocker.

Reviewers: #kwin, #plasma_on_wayland

Subscribers: plasma-devel, kwin

Tags: #plasma_on_wayland, #kwin

Differential Revision: https://phabricator.kde.org/D1808
2016-06-14 07:40:14 +02:00
Martin Gräßlin
53a3740082 Request the resize of ShellSurface after Decoration updated the borders when maximizing
Summary:
This ensures that we don't send a size request with the borders still
added.

Test Plan:
Verified that a maximized window is properly sized and
doesn't have empty borders

Reviewers: #kwin, #plasma_on_wayland

Subscribers: plasma-devel, kwin

Tags: #plasma_on_wayland, #kwin

Differential Revision: https://phabricator.kde.org/D1807
2016-06-14 07:39:37 +02:00
Martin Gräßlin
c7828eab8f Ensure that WaylandServer::shellClientAdded only gets emitted once
Summary:
When a shell client got mapped, unmapped and mapped again we emitted
the shellClientAdded signal in WaylandServer again. This resulted in
e.g. Workspace, EffectsHandler, etc. to start managing the window again.
This can be a reason for problems we see with such windows like the
Plasma panel dialog when opened the second time.

Test Plan:
Needs extensive testing on real world system as that changes
behavior now.

Reviewers: #kwin, #plasma_on_wayland

Differential Revision: https://phabricator.kde.org/D1784
2016-06-14 07:36:33 +02:00
Martin Gräßlin
1b40feca3a SceneXRender::Window uses a static XRenderPicture which it didn't clean up
Summary:
Using a static XRenderPicture results in a crash on exit as for cleanup
the already destroyed xcb_connection_t* is required.

This change ensures that the static XRenderPicture gets destroyed in the
static cleanup handler for SceneXRender::Window.

CCBUG: 363251

Reviewers: #plasma

Subscribers: plasma-devel

Tags: #plasma

Differential Revision: https://phabricator.kde.org/D1733
2016-06-13 15:29:35 +02:00
Martin Gräßlin
d49fba5d30 [libkwinxrenderutils] Clean up static blend picture before going down
Summary:
The method xRenderBlendPicture created a static XRenderPicture on
first usage. To cleanup a XRenderPicture an xcb_connection_t* is needed.
As it's static the cleanup happens on exit handler and at that time Qt
already destroyed the xcb_connection_t*. With a certain chance this will
crash.

To expose the problem a Q_ASSERT(qApp) is added in the destructor of
XRenderPicture. Using xrenderBlendPicture() will hit this assert on
application exit. This is demonstrated by the added auto test.

The actual fix to the problem is moving the static variable out of
the method and introduce a global cleanup method just like the init
method. This is now called from Workspace dtor, so before application
goes down.

CCBUG: 363251

Reviewers: #plasma

Subscribers: plasma-devel

Tags: #plasma

Differential Revision: https://phabricator.kde.org/D1731
2016-06-13 15:29:07 +02:00
Martin Gräßlin
2343a90aa5 UpdateClientArea from ShellClient::doSetGeometry if the ShellClient has a strut
Summary:
This ensures that resizing a panel updates the client area. On X11 there
is an event when the struts change, but on Wayland the struts are implied
from window type (panel) and the panel behavior, so we need to trigger it
manually.

Reviewers: #kwin, #plasma_on_wayland

Subscribers: plasma-devel, kwin

Tags: #plasma_on_wayland, #kwin

Differential Revision: https://phabricator.kde.org/D1811
2016-06-10 12:56:33 +02:00
Martin Gräßlin
58db477796 Fix the strut handling for wayland clients
Summary:
The implementation was broken as it transformed the QRects into QRegions,
subtracted the geometries and took the bounding rect again. In several
setups this could result in the strut getting ignored.

This change improves the calculation of the struts by creating a QMargin
which describes the area which needs to be subtracted from a screen rect.
The QMargin is only adjusted for the edge the window borders. We can
assume that a window with a strut needs to border a screen on Wayland.

With this change we are also able to support panels between screens.
On Wayland a panel placed on the right of a left screen affects the
maximization area of the left screen, but does not affect the overall
workarea.

CCBUG: 167852

Reviewers: #plasma_on_wayland, #kwin

Subscribers: plasma-devel, kwin

Tags: #plasma_on_wayland, #kwin

Differential Revision: https://phabricator.kde.org/D1803
2016-06-10 12:36:15 +02:00
David Fort
935f8875fe [drm] correctly initialize the second cursor
Summary: There were a trivial copy'n paste error.

Reviewers: graesslin

Reviewed By: graesslin

Subscribers: graesslin, kwin

Tags: #kwin

Differential Revision: https://phabricator.kde.org/D1806
2016-06-09 17:00:07 +02:00
Martin Gräßlin
04c3998571 Emit the maximizedChanged and friends signals in ShellClient like in Client
This is an update to c95ddb7102 and
implements the emit of maximized changed in deocration like on Client.

Overall the code looks like it should be merge better together with
Client.

Reviewed-By: kbroulik
2016-06-09 14:37:32 +02:00
Martin Gräßlin
c95ddb7102 Pass the maximized signal to DecoratedClient
Summary:
From the famous category: "How could that code ever have worked".

Maximized state changes were never passed to window decorations. For
X11 windows the decoration updated the state nevertheless, for Wayland
windows the state did not get updated, thus a maximized window had
borders and was shown with a not maximized button.

Reviewers: #kwin, #plasma_on_wayland

Subscribers: plasma-devel, kwin

Tags: #plasma_on_wayland, #kwin

Differential Revision: https://phabricator.kde.org/D1805
2016-06-09 13:35:38 +02:00
Martin Gräßlin
bf2241e78e Require Frameworks 5.23 2016-06-08 14:05:21 +02:00
Martin Gräßlin
2cc47004c3 Fix calculation of the shadow size in the OpenGL compositor
Summary:
This change addresses the problem of the incorrectly rendered shadows
when opening a window (e.g. Kickoff) a second time. In case of e.g.
Kickoff not all elements are set, thus e.g. left might be 0, but right
has a value. So for calculating the height the maximum of the values
must be used.

Test Plan: Opened Kickoff and systray a few times

Reviewers: #kwin, #plasma_on_wayland

Subscribers: plasma-devel, kwin

Tags: #plasma_on_wayland, #kwin

Differential Revision: https://phabricator.kde.org/D1792
2016-06-07 15:56:26 +02:00
Martin Gräßlin
d16d77f7fe Verify that the Shadow has a valid size before trying to create it
Summary:
The problem of the badly rendered shadows in case of opening kickoff
twice on Wayland is related to this. In that situation both the
width and height are 0. The rendering to the image fails and creating
the texture fails. This causes the flickering we see during rendering.

This change now discards such a shadow with an invalid size. This is
not fixing the actual problem of the shadow, but rather the symptom.

Nevertheless it's an important change as it makes it at least not
look fully broken.

Reviewers: #kwin, #plasma_on_wayland

Differential Revision: https://phabricator.kde.org/D1790
2016-06-07 14:25:55 +02:00
Martin Gräßlin
c65c9728d1 [autotest/wayland] Add a test case for maximize windows
The added test exposes the problem that a shell surface might request
being maximized and then provide an incorrectly sized buffer. In this
case the ShellClient is incorrectly considered as maximized.

I don't have a good idea how to address this yet, but still publish
the test case exposing the problem.
2016-06-07 10:27:02 +02:00
Martin Gräßlin
9d0360b3ef [autotests] Skip PlasmaWindowTest::testLockScreenNoPlasmaWindow on build.kde.org
Needs to start kscreenlocker_greet which needs EGL which we don't have.
2016-06-07 10:03:12 +02:00
Martin Gräßlin
0388ed02a6 Call destroyWindowManagementInterface from ShellClient::destroyClient
Summary:
So far destroyWindowManagementInterface was only called when the
ShellClient got unmapped. But it's possible (although not recommended)
to just destroy the Surface without prior unmapping. In that case the
PlasmaWindow got leaked.

This change addresses this problem by always calling
destroyWindowManagementInterface from ShellClient::destroyClient.

Reviewers: #plasma

Subscribers: plasma-devel

Tags: #plasma

Differential Revision: https://phabricator.kde.org/D1762
2016-06-06 08:37:53 +02:00
Martin Gräßlin
210d57bb45 Set ShellClient on all desktop depending on Plasma Surface role
Summary:
If a PlasmaShellSurface is a Desktop, a Panel or an OSD it implies
that the window is on all desktop. So let's set it like that.

Test Plan: Auto test added and also confirmed by manual testing

Reviewers: #plasma

Subscribers: plasma-devel

Tags: #plasma

Differential Revision: https://phabricator.kde.org/D1747
2016-06-06 08:36:11 +02:00
Martin Gräßlin
76de85b449 Don't setup PlasmaWindowManagement integration for lock screen windows
Summary:
We don't want external processes to know anything about the lock screen
windows. Especially we don't want them to be able to request close on
them.

Thus better never show thus windows to them.

Reviewers: #plasma

Subscribers: plasma-devel

Tags: #plasma

Differential Revision: https://phabricator.kde.org/D1760
2016-06-03 16:22:52 +02:00
Martin Gräßlin
5d396add12 Restrict when to expose a ShellClient to PlasmaWindowManagement
Summary:
For some windows we don't want to create a PlasmaWindow. Not all
ShellClients are something the outside world should see. This change
introduces the first restrictions:
* KWin internal windows are hidden
* transients not accepting focus are hidden

The latter case doesn't work though if the Surface is mapped prior
to creating the shell surface. In such a situation it's racy as KWin
handles the create surface request before we get the setTransient
request. This is difficult to handle as we do want to react quickly.

Reviewers: #plasma

Subscribers: plasma-devel

Tags: #plasma

Differential Revision: https://phabricator.kde.org/D1759
2016-06-03 16:22:52 +02:00
Bhavisha Dhruve
6cae5f7ab9 Integrated FakeInput touch events into InputRedirection.
Summary: KWin counterpart for touch event support in Fakeinput interface.

Reviewers: #plasma, graesslin

Reviewed By: #plasma, graesslin

Subscribers: plasma-devel

Tags: #plasma

Differential Revision: https://phabricator.kde.org/D1758
2016-06-03 19:52:22 +05:30
Martin Gräßlin
67b869218f [autotest/wayland] Force kscreenlocker_greet to QMLSCENE_DEVICE softwarecontext
OpenGL/EGL doesn't work on build.kde.org. Because of that the
kscreenlocker_greet aborts on startup and we cannot really test whether
it works on build.kde.org. E.g. we never actually see the window.

This change just makes sure that QMLSCENE_DEVICE=softwarecontext is
passed to the greeter in the LockScreenTest. Hopefully that fixes it
on build.kde.org.
2016-06-03 14:18:45 +02:00
Martin Gräßlin
4034795893 [autotests/wayland] Add a test case for PlasmaWindow
The new added test case verifies a few cases in which a PlasmaWindow
should or should not be created or destroyed.

Some cases are clearly wrong and are marked with expect_fail.
2016-06-03 09:28:46 +02:00
Martin Gräßlin
9b187f8a3b [libinput] Properly handle threaded Device creation
Summary:
Device is created from Connection::processEvents which is run in the
main gui thread, while Connection itself is in a different thread. Thus
passing *this* as parent is wrong.

This change removes the parent, moves the created Device into the
Connection thread and also deletes properly by using deleteLater.

Reviewers: #plasma

Subscribers: plasma-devel

Tags: #plasma

Differential Revision: https://phabricator.kde.org/D1746
2016-06-02 16:24:31 +02:00
Martin Gräßlin
c04f193532 [libinput] A not valid LibInput::Context should return -1 as filedescriptor
0 is a valid filedescriptor after all.

Autotest extended to cover this case.
2016-06-02 16:23:23 +02:00
Martin Gräßlin
2d9ff54e68 [autotest/libinput] Add a basic test for Context
This test mocks part of KWin::Udev, udev and libinput. The test itself
is still rather limited and only verifies whether libinput is valid or
not and that assignSeat works. Most of the interaction is not yet tested,
though to a large degree doesn't make sense and should be rather tested
in the context of LibInput::Connection.
2016-06-02 15:55:34 +02:00
Martin Gräßlin
5344bf1619 [plugins/qpa] Handle case that qtvirtualkeyboard plugin is not available more gracefully
We didn't check whether creating the QPlatfromInputContext worked and
accessed the m_inputContext unconditionally which obviously crashed.

Now the connects related to QInputMethods are not setup if we failed
to create the QPlatfromInputContext.

Reviewed-By: bshah
2016-06-02 15:25:31 +02:00
Martin Gräßlin
13adf9609f Fix broken build
Sorry, forgot to adjust the enum naming to latest round of changes
in KWayland.
2016-06-02 11:54:14 +02:00
Martin Gräßlin
f26f2fe181 Integrate QtVirtualKeyboard into KWin/Wayland
Summary:
The idea is to have KWin provide a virtual keyboard. To support this
KWin uses the QT_IM_MODULE qtvirtualkeyboard and makes sure that the
QPA plugin loads it.

KWin has a new class VirtualKeyboard which acts as the focus object and
the "proxy" for input methods. The QPA plugin ensures that this is the
focusObject, so that all input method related events are sent to this
class. From there it will be possible to delegate to other applications
through the Wayland interfaces.

Reviewers: #plasma

Subscribers: plasma-devel

Tags: #plasma

Differential Revision: https://phabricator.kde.org/D1638
2016-06-02 11:26:53 +02:00
Martin Gräßlin
fdb04e6f75 [autotests] Correct the expected values from 1a23ab7cf0 2016-06-02 10:07:47 +02:00
Martin Gräßlin
1a23ab7cf0 [autotest] Add test case exposing problem of bug 363804
The test case sets up apol's screen setup and the panel as described
in the attachements in bug 363804. As the test shows the panel's strut
is incorrectly ignored.

CCBUG: 363804
2016-06-02 09:29:53 +02:00
Martin Gräßlin
d0a6aa0836 [platforms/virtual] Support setting random screen geometries
A signal is added to the VirtualBackend to change all screen geometries.
This can be used from auto tests to change the screens. But it's not yet
correctly reflected in other areas. E.g. not forwarded to Wayland Output,
etc.
2016-06-02 09:28:02 +02:00
Martin Gräßlin
81b81f43df Merge branch 'Plasma/5.6' 2016-06-02 08:54:02 +02:00
Martin Gräßlin
ee785db147 [autotests/wayland] Try to make PointerInputTest::testMouseActionActiveWindow more robust
It's currently failing on build.kde.org. I'm not able to reproduce the
failure localy so I can only interpret the failure. The failure looks
like a window is still present in the next executed test case thus
breaking the positioning.

This change ensures that the window is properly gone before going into
the next test case.
2016-06-02 08:41:00 +02:00
Martin Gräßlin
54d770d5ca Destroy decoration when DecorationBridge is destroyed
When KWin goes down the DecorationBridge might be destroyed before the
last AbstractClient is destroyed. Thus we should destroy the Decoration
when the DecorationBridge gets destroyed.
2016-06-02 08:13:57 +02:00
Martin Gräßlin
65d707d24c [decorations] Don't recreate Renderer once the Compositor is destroyed
If we get a compositingToggled because the Compositor is going down we
don't need to recreate the Renderer as KWin as a whole is going down.

Thus we disconnect the compositingToggled connection when the Compositor
is about to be destroyed.
2016-06-02 08:11:57 +02:00
Martin Gräßlin
dc8c33e856 Destroy ShellClient when the SurfaceInterface gets destroyed
KWayland was changed: the ShellSurfaceInterface does no longer get
destroyed when the parent SurfaceInterface gets destroyed. For the
wl_shell_surface there is no dtor request in the interface so the
resource sticks around and also the ShellClient is kept.

This change ensures that the ShellClient also gets destroyed when
the Surface is destroyed. This should fix some broken tests.

Cherry-picked from master to fix failing tests on build.kde.org.
2016-06-02 07:53:48 +02:00
Anthony Fieroni
c3cd8df795 Be sure isCurrentTab returns true
REVIEW: 127985

Signed-off-by: Anthony Fieroni <bvbfan@abv.bg>
2016-06-01 20:46:35 +03:00
l10n daemon script
0990566c63 SVN_SILENT made messages (.desktop file) - always resolve ours
In case of conflict in i18n, keep the version of the branch "ours"
To resolve a particular conflict, "git checkout --ours path/to/file.desktop"
2016-05-31 11:06:54 +00:00
Martin Gräßlin
4548ba403b [autotest/libinput] Verify that Event::create can handle a null argument 2016-05-31 10:15:44 +02:00
Martin Gräßlin
1e564989c9 [autotest/libinput] Add a mocked test for Libinput::TouchEvent 2016-05-31 10:14:28 +02:00
Martin Gräßlin
8851bb8daa [autotest/libinput] Add a mocked test for Libinput::PointerEvent 2016-05-31 09:23:48 +02:00
Martin Gräßlin
4b3e8425a3 [autotests/libinput] Add include_directories for libinput
Libinput header is needed by the tests.
2016-05-30 18:03:42 +02:00
Martin Gräßlin
ac227e57c7 [autotest/libinput] Add a mocked test for Libinput::KeyEvent
This new test includes everything used in events.cpp to the mocked
functionality of libinput. Only key event is implemented so far, the
referenced pointer and touch functions are mocked with default values.

The test verifies that a KeyEvent gets created and the key press/release
works as expected.
2016-05-30 17:46:53 +02:00
Martin Gräßlin
2e4db5c2b8 [autotests/libinput] Add test case for Device::setEnabled and isEnabled 2016-05-30 16:04:06 +02:00