Commit graph

291 commits

Author SHA1 Message Date
Martin Flöser
0372fdaf92 Move WindowRules from Client to AbstractClient
Summary:
So far window rule specific functionality was only implemented in Client
and in ShellClient there was only a dummy implementation. This change
moves the client_rules member variable from Client to AbstractClient.
Areas which would not compile anymore are adjusted.

This is a first step to get window rule support for Wayland windows.

Reviewers: #kwin, #plasma

Subscribers: plasma-devel, kwin

Tags: #kwin

Differential Revision: https://phabricator.kde.org/D8090
2017-10-07 07:42:41 +02:00
Luboš Luňák
750843061c fix showing of window on inactive activities during session save
This is what 7ce380497f tried to do (and got reverted by my previous commit).
The approach is basically the same, just temporarily fake that the window
is on all activities, thus it will be temporarily shown for the session
interact, but this time there seem to be no broken side-effects (and if there
are, they'll be at least limited to activities and not break virtual desktops).
Also, 'needsSessionInteract' was a misnomer - it certainly wasn't set for all
windows that needed session interaction. Just call it what it really is.

Differential Revision: https://phabricator.kde.org/D5614
2017-05-09 18:56:16 +02:00
Luboš Luňák
f4de9618f8 revert the hackish overriding of Client::desktop() for session saving
The member variable is not what determines which desktop a window is on,
it's more like caching the state. Therefore trying to fake a new value
eventually leads to inconsistencies, e.g. having KWrite open with unsaved
changes on inactive desktop results in the window ending up on all desktops
after session save (both successful and cancelled).
This pretty much reverts the whole 7ce380497f that introduced this and also
a0a976885c that tried to fix some of the problems resulting from it.
The original problem of session saving of windows of inactive activities still
remains, to be fixed by another commit.

Differential Revision: https://phabricator.kde.org/D5613
2017-05-09 18:55:18 +02:00
Kai Uwe Broulik
93938d60b8 Restore global menu support
This brings back global menu support in KWin.
The DBusMenu infrastructure is different that we just read the DBus service name and
menu object path from the windows rather than passing around window IDs on DBus which
won't work on Wayland.

Differential Revision: https://phabricator.kde.org/D3089
2017-01-11 10:21:03 +01:00
Martin Gräßlin
b7bd5f9a09 Add support for desktopFileName provided by NETWinInfo
Summary:
KWindowSystem provides a KDE specific property for the desktop file
name. This allows KWin to take the icon from the desktop file. The
advantage from the desktop file is that KWin normally gets higher
resolution icons than provided through the xproperty based icons used
previously. If the desktop file does not provide an icon name, KWin
falls back to the previous implementation.

As on Wayland the icon is taken from the desktop file name already the
code for X11 and Wayland is merged in AbstractClient. Also to the
PlasmaWindowInterface the appId is taken from the new desktop file
instead of the resourceName. Due to that for Xwayland windows where KWin
knows the desktop file name it can be passed to PlasmaWindowInterface.
This allows e.g. the task manager to better map the windows to
applications and provide better icons. Also it means that icons do not
need to be passed as bitmap data to the clients.

Test Plan:
Verified that icon is taking from desktop file if provided and
from X property if not provided and that Wayland windows still have icon.

Reviewers: #kwin, #plasma_on_wayland, hein

Subscribers: plasma-devel, kwin

Tags: #plasma_on_wayland, #kwin

Differential Revision: https://phabricator.kde.org/D3177
2016-10-31 13:19:46 +01:00
Martin Gräßlin
7bca270f97 Force windows of type desktop to be opaque
Summary:
Plasmashell's desktop windows are RGBA which forces the compositor to
perform blending and render the background. That is absolutely pointless
as there is no window behind the desktop window it could blend to. All it
does is destroying KWin's more optimized code path and forcing additional
rendering which will never be visible (including shader push/pop).

With this change KWin forces desktop windows (both X11 and Wayland) to
be considered as opaque by setting the depth to 24. Thus blending is
disabled and the background is not rendered.

Test Plan:
Verified with apitrace that KWin goes in the opaque rendering
path for desktop windows.

Reviewers: #kwin, #plasma

Subscribers: kwin

Tags: #kwin

Differential Revision: https://phabricator.kde.org/D2382
2016-08-10 15:10:22 +02:00
Thomas Lübking
8ad51527a8 Merge branch 'Plasma/5.4' 2015-10-23 09:38:50 +02:00
Thomas Lübking
7339e9639f Improve virtual desktop selection for transients
a) When a group-transient is modal, it still needs to be
   on the current or all virtual desktops if *any* of the
   blocked clients is

BUG: 354090
FIXED-IN: 5.5

b) ignore demanded virtual desktop for transients. Notably modal transients
   should appear where their parent is, and not drag that around. All others
   also better show up above their parent and not a distant virtual desktop

REVIEW: 125758
2015-10-23 09:37:27 +02:00
Martin Gräßlin
9ef42ae3c7 Move blocking geometry updates functionality to AbstractClient 2015-10-14 08:36:29 +02:00
Thomas Lübking
f3cfbacb1e do not grab server during manage
REVIEW: 125474
2015-10-05 23:41:45 +02:00
Thomas Lübking
ace742d143 initialize pseudo_max with desired maximization
the pseudo maximization sanitizes huge windows and
was/is the way kdelibs KMainWindow indicates maximization

It must however build up on the hinted maximization
and not MaximizeRestore, or it may falsely destroy
the maximization hint from the client (which now works
in KF5 ;-)

BUG: 352185
REVIEW: 125037
FIXED-IN: 5.5
2015-09-29 23:02:41 +02:00
Martin Gräßlin
305699be8e Move modal from Client to AbstractClient 2015-09-16 13:54:47 +02:00
Martin Gräßlin
1d242d9daf Move mainClients() and allMainClients from Client to AbstractClient
AbstractClient::mainClients is virtual and overriden in Client,
allMainClients has only a common implementation in AbstractClient.

In activation.cpp we still need one case where a temporary ClientList
needs to be constructed. Once transients are fully migrated that should
be removable again.
2015-09-16 13:54:47 +02:00
Martin Gräßlin
a1a89d3d1e Disable Activities support on Wayland
This is a temporary workaround for bug 349992 which causes freezes
during startup as kwin and kamd dead lock each other on DBus.

To workaround we don't call Activities::create and check in every
usage of Activities::self() whether the pointer is valid.

As a result kwin_wayland now starts pretty fast.

CCBUG: 349992
2015-07-07 11:48:42 +02:00
Thomas Lübking
7b842ccc81 checkOffscreenPosition on restored session geoms
BUG: 336193
FIXED-IN: 5.4
REVIEW: 124122
2015-06-18 22:41:26 +02:00
Martin Gräßlin
1d9769af1f Move skipTaskbar from Client to AbstractClient
At the same time the functionality for the "original_skip_taskbar" is
splitted out. This removes the weird API with two boolean arguments to
the set method. Instead there is a dedicated method for the orignal
skip taskbar state which delegates to regular skipTaksbar.
2015-06-06 22:11:10 +02:00
Martin Gräßlin
11a3eac070 Move skipPager from Client to AbstractClient 2015-06-06 22:11:10 +02:00
Thomas Lübking
75bd798ad9 Merge branch 'Plasma/5.3' 2015-05-19 22:52:52 +02:00
Thomas Lübking
43e3b7db28 Show Desktop: break state with activation (only)
... not them becoming visible.
Latter doesn't work for most cases (unminimizing)
for obvious reasons (they're not minimized) and
when a new window is mapped, the focus stealing
prevention seems a good filter
(if it's not good enough to gain the focus,
it's not good enough to break the state either)

REVIEW: 123783
CCBUG: 346837
CCBUG: 346933
CCBUG: 347212
2015-05-19 22:07:58 +02:00
Martin Gräßlin
0dda7b3f94 Drop Client::m_frameWrapper workaround for reparenting deco
No longer used, so we can just drop it.

Thanks to QtWayland for emitting a warning, which made me find this
useless code.
2015-05-18 08:01:33 +02:00
Martin Gräßlin
254887155c Implement virtual desktop handling in AbstractClient 2015-05-08 12:43:47 +02:00
Thomas Lübking
cbfcd3b096 implement showingDesktop by raising desktop window
This is an alternative approach suggested by the
NETWM spec.
The advantage is, that windows are not minimized
at all what apparently lead to some confusion
about the nature of the mode (which was abused
to tidy up) and a secret config key to allow for
that unrelated behavior.
Instead the ShowDesktopIsMinimizeAll key is removed
and replaced by a dedicated script + shortcut.

Bonus: less code to remember "minimized" windows =)
2015-04-07 23:59:17 +02:00
Thomas Lübking
d94f3c8577 remove secret showDesktopIsMinimizeAll feature
REVIEW: 122679
2015-04-07 23:59:16 +02:00
Mika Allan Rauhala
3389c7569f Adapt to KDecoration API changes
Adapt to API changes introduced by b62e8888cd39301e00ad98dfe791fa66676408fb.
It adds DecoratedClient::color(group, role) for getting colors that are
not included in QPalette. Breeze used to read these colors from
kdeglobals, breaking per window color schemes. KWin now handles reading
these colors along with QPalette loading with DecorationPalette.

REVIEW: 122883
2015-03-31 15:26:55 +02:00
Martin Gräßlin
d66a804bbb Drop not needed includes of QX11Info 2015-03-17 09:44:53 +01:00
Martin Gräßlin
dfa89cc050 Port reading Motif hints to XCB
A wrapper class for MotifHints is added to xcbutils. This class manages
the information about the read Motif hints, so that Client doesn't need
to have a copy of the read states.

The class is designed in a way that during Client::manage we get rid of
another roundtrip.

REVIEW: 122378
2015-02-06 13:43:57 +01:00
Martin Gräßlin
2076e458d3 Use Xcb::GeometryHints instead of XGetWMNormalHints
Xcb::GeometryHints is a convenient wrapper around the size hints
as described in ICCCM combined with the sanity checks so far applied
by KWin after reading the property.

Instead of accessing the members of the property structure, we are
now using the convenience methods.

During ::manage no further actions are triggered when reading the
size hints. Only when they are read later on the previous checks
are applied. During ::manage they can be ignored as it had a dedicated
isManaged check.

The method ::resizeWithCheck got a new argument of type xcb_gravity_t
which defaults to 0. This is needed from ::configureRequest which so
far temporarily changed the xSizeHints structure. By passing as an
argument this is no longer needed.

REVIEW: 122185
2015-01-27 12:48:03 +01:00
Martin Gräßlin
cef84cd8a5 Use NETWinInfo::opaqueRegion
REVIEW: 122199
2015-01-26 11:47:40 +01:00
Martin Gräßlin
7e4307b263 Use new KWindowSystem::icon overload taking a NETWinInfo*
Removes roundtrips to the X-server when reading the icons.

Requires kwindowsystem.git as of 6f941a5 (version 5.7).

CCBUG: 329979
2015-01-21 10:19:35 +01:00
Martin Gräßlin
14659a9907 Split Client::checkActivities into two parts
REVIEW: 122087
CCBUG: 329979
2015-01-21 09:25:18 +01:00
Martin Gräßlin
5abccbec7d Split Client::readTransient into two parts 2015-01-21 09:25:15 +01:00
Martin Gräßlin
584bdbce71 Split Client::updateFirstInTabBox into two parts 2015-01-21 09:25:15 +01:00
Martin Gräßlin
327dd406e6 Split Client::updateColorScheme into two parts 2015-01-21 09:25:15 +01:00
Martin Gräßlin
a55c7ba0d5 Split Client::updateShowOnScreenEdge into two parts 2015-01-21 09:25:15 +01:00
Martin Gräßlin
24688f8dae Split Client::detectGtkFrameExtents into two parts 2015-01-21 09:25:14 +01:00
Martin Gräßlin
770c723c61 Split Toplevel::getSkipCloseAnimation into two parts 2015-01-21 09:25:14 +01:00
Martin Gräßlin
b27d3d20e7 Split Toplevel::getWmClientLeader in two parts
First part (fetch) just creates the Xcb::Property while the
second part (read) reads the property. This allows to better
schedule the commands in Client::manage to reduce the number of
roundtrips. This reduces the time spent for fetching the client
leader property by about half a millisecond on my system.
2015-01-21 09:25:14 +01:00
Martin Gräßlin
f643b71902 Use NET::WM2InitialMappingState instead of XWMHints
One roundtrip to X Server during Client::manage removed.

REVIEW: 122068
2015-01-15 13:22:02 +01:00
Martin Gräßlin
3d9a035312 Move MaximizeMode from KDecorationDefines to utils.h
Unfortunately it cannot be a enum defined in Client as client.h
depends on rules.h and with it in Client rules.h would depend on
client.h.
2014-12-02 13:49:08 +01:00
Martin Gräßlin
c2e53b9a2f Merge branch 'kdecorations2'
Conflicts:
	effects.cpp
	paintredirector.cpp
2014-12-02 08:38:10 +01:00
Martin Gräßlin
0f7a990316 Use Protocol support in NETWinInfo instead of fetching them ourselves
Client does no longer need to track the protocols as this is also
provided by NETWinInfo as of version 5.3.

REVIEW: 120255
2014-11-24 10:37:18 +01:00
Martin Gräßlin
e32da9d9e0 Merge branch 'master' into kdecorations2
Conflicts:
	CMakeLists.txt
	paintredirector.cpp
	scene_opengl.h
	scene_qpainter.h
	scene_xrender.h
2014-10-20 16:04:52 +02:00
Martin Gräßlin
9fae34f86f Remove Client::getWMHints in favor of functionality in NETWinInfo
We are only using the UrgencyHint, InputHint and GroupLeader from
WMHints. Those are provided by NETWinInfo, so we can use the
functionality provided by NETWinInfo instead of calling XGetWMHints.

REVIEW: 120162
2014-09-15 16:29:47 +02:00
Martin Gräßlin
0030eb7f84 Initial import of support for new KDecoration2 based decorations
NOTE: this is not working completely yet, lots of code is still ifdefed
other parts are still broken.

The main difference for the new decoration API is that it is neither
QWidget nor QWindow based. It's just a QObject which processes input
events and has a paint method to render the decoration. This means all
the workarounds for the QWidget interception are removed. Also the paint
redirector is removed. Instead each compositor has now its own renderer
which can be optimized for the specific case. E.g. the OpenGL compositor
renders to a scratch image which gets copied into the combined texture,
the XRender compositor copies into the XPixmaps.

Input events are also changed. The events are composed into QMouseEvents
and passed through the decoration, which might accept them. If they are
not accpted we assume that it's a press on the decoration area allowing
us to resize/move the window. Input events are not completely working
yet, e.g. wheel events are not yet processed and double click on deco
is not yet working.

Overall KDecoration2 is way more stateful and KWin core needs more
adjustments for it. E.g. borders are allowed to be disabled at any time.
2014-07-25 14:02:26 +02:00
Thomas Lübking
75a298a4fb allow FS mapping of geometry restricted windows
and copy isSpecialWindow() check as rulebook input
to setFullscreen()

Client::isFullScreenable() checks:
* fullscreen rule
* fullscreen_hack (-> for normal windows)
* geometry restrictions
* special window

Client::manage() for fullscreeining checks:
* fullscreen rule (with correct "initial" parameter)
* fullscreen_hack

-> this breaks the fullscreen rule for geometry restricted windows
and causes inconsistent behavior between client requests at runtime
(which do not test ::isFullScreenable()) and on mapping.

Otoh, the specialWindow() protection should apply generally - those
kind of windows should not be fullscreened since the user can not
exit this state via kwin for them - and there's hardly a good reason
for them to be fullscreen, esp. not to enter that state at runtime

REVIEW: 118442
CCBUG: 335617

Cherry-picked from kde-workspace
43229afee9fac4303e3d280ea63f96f034b3ffb5
2014-07-10 13:36:50 +02:00
Martin Gräßlin
f0e1e3187e Add a script to enforce window decorations for GTK windows
This is going to be a controversal change. It enforces KWin decorations
on all client side decorated windows from GTK+. Unfortunately we are
caught between a rock and a hard place. Keeping the status quo means
having broken windows and a more or less broken window manager due to
GTK+ including the shadow in the windows. This is no solution.
Enforcing server side decorations visually breaks the windows. This is
also no solution. So why do it?

It's our task to provide the best possible user experience and KWin is
a window manager which has always done great efforts to fix misbehaving
windows. One can think of the focus stealing prevention, the window rules
and lately the scripts. The best possible window management experience is
our aim. This means we cannot leave the users with the broken windows
from GTK.

The issues we noticed were reported to GTK+ about 2 months ago and we are
working on improving the situation. Unfortunately several issues are not
yet addressed and others will only be addressed in the next GTK+ release.
We are working on improving the NETWM spec (see [1]) to ensure that the
client side decorated windows are not in a broken state. This means the
enforcment is a temporary solution and will be re-evaluated with the next
GTK release. I would prefer to not have to do such a change, if some of
the bugs were fixed or GTK+ would not use client-side-decos on wms not
yet supporting those all of this would be a no issue.

For a complete list of the problems caused by GTK's decos see bug [2] and
the linked bug reports from there.

The change is done in a least inversive way in KWin. We just check for
the property _GTK_FRAME_EXTENTS and create a Q_PROPERTY in Client for it.
If we add support for the frame extents in future we would also need
this. So it's not a change just for enforcing the decoration.

The actual enforcing is done through a KWin script so users can still
disable it.

REVIEW: 119062

[1] https://mail.gnome.org/archives/wm-spec-list/2014-June/msg00002.html
[2] https://bugzilla.gnome.org/show_bug.cgi?id=729721
2014-07-03 16:03:22 +02:00
Thomas Lübking
d6ea601005 keep oversized windows in fullscreen area
huge windows are not contrained to their initial screen
(the user might want to move them to the other instead),
but we must not let them drop out of the fullscreen area
either

CCBUG: 335043

Forward port of d7c2434a9e144dd2e7f1519d78b333e7d4d3bfc7 from kde-workspace
2014-06-04 16:30:29 +02:00
Martin Gräßlin
8543033d59 Reparent decoration window by using a QWindow wrapper for the frame
Qt doesn't like that we reparent the decoration using low level xcb
calls. So let's use a QWindow wrapper for the frame and let Qt do
the reparenting itself.

BUG: 334768
REVIEW: 118159
2014-06-03 09:22:18 +02:00
Martin Gräßlin
75f80e88ed Port Client::manage away from XGetWindowAttributes
Replaced by Xcb::WindowAttributes and Xcb::WindowGeometry. Also arguments
of Client::embedClient are adjusted to take the required values directly.
2014-05-05 08:09:10 +02:00
Martin Gräßlin
b039a07f4d Toplevel::vis becomes Toplevel::m_visual and is xcb_visualid_t
Only usage of the ::vis was the visualid, so have this as the member
instead of the XVisual*.
2014-05-05 08:09:10 +02:00