Commit graph

123 commits

Author SHA1 Message Date
Martin Gräßlin
b36b242f12 Port Unmanaged::track to XCB
Uses Xcb::WindowAttributes and Xcb::WindowGeometry instead of XLib
variant. In addition it uses the XServerGrabber to ensure that the
xserver grab is removed in all code paths.

A new macro is added to utils.h to make the grabbing of XServer in
current context more obvious.
2014-05-05 08:09:10 +02:00
Martin Gräßlin
b45eeae352 [Xcb::Wrapper] Introduce a Property and StringProperty Wrapper subclass
The Xcb::Property can wrap the xcb_get_property call and provides
convenient access methods to read the value of the reply with checks
applied. For this it provides a templated ::value method for reading a
single value or reading an array. There's also a ::toBool and
::toByteArray which performs the conversion directly with default values
for the type and format checks.

Xcb::TransientFor is changed to be derived from Property instead of
Wrapper directly, so that the reading of the property value can be
shared.

Xcb::StringProperty is a convenient wrapper derived from Property to
handle the reading of a string property providing a cast to QByteArray
operator. This replaces the ::getStringProperty from utils. Though the
separator functionality from ::getStringProperty is not provided as that
is only used in one function and handled there.

All the custom usages of xcb_get_property or getStringProperty are
replaced to use this new wrapper. That simplifies the code and ensures
that all properties are read in the same way.

REVIEW: 117574
2014-04-17 07:41:33 +02:00
Martin Gräßlin
a9c69519cd [kwin] Use alias template for ScopedCPointer
Supported in gcc since 4.7 and in clang since 3.0.

REVIEW: 116917
2014-03-26 10:50:30 +01:00
Martin Gräßlin
9075b5e2d6 [kwin] Remove cursorPos() from utils.h
Only delegated to Cursor::pos() anyway, so let's just use that directly.
Fixes the annoyances of having to mock it in the unit tests which include
utils.cpp.

REVIEW: 116900
2014-03-25 15:25:40 +01:00
Martin Gräßlin
bc0a9cb53a [kwin] Use std::find_if and lambda functions for Workspace::findClient
Instead of passing the macro based Predicate to findClient it now
expects a function which can be passed to std::find_if.

Existing code like:
xcb_window_t window; // our test window
Client *c = findClient(WindowMatchPredicated(window));

becomes:
Client *c = findClient([window](const Client *c) {
    return c->window() == window;
});

The advantage is that it is way more flexible and has the logic what
to check for directly with the code and not hidden in the macro
definition.

In addition there is a simplified overload for the very common case of
matching a window id against one of Client's windows. This overloaded
method takes a Predicate and the window id.

Above example becomes:
Client *c = findClient(Predicate::WindowMatch, w);

Existing code is migrated to use the simplified method taking
MatchPredicate and window id. The very few cases where a more complex
condition is tested the lambda function is used. As these are very
local tests only used in one function it's not worthwhile to add further
overloads to the findClient method in Workspace.

With this change all the Predicate macro definitions are removed from
utils.h as they are now completely unused.

REVIEW: 116916
2014-03-25 15:17:11 +01:00
Martin Gräßlin
12a4923959 [kwin] Use std::find_if and lambda functions for Workspace::findUnmanaged
Instead of passing the macro based Predicate to findUnmanaged it now
expects a function which can be passed to std::find_if.

Existing code like:
xcb_window_t window; // our test window
Unmanaged *u = findUnmanaged(WindowMatchPredicated(window));

becomes:
Unmanaged *u = findUnmanaged([window](const Unmanaged *u) {
    return u->window() == window;
});

In addition an overload is added which takes the window id to cover
the common case to search for an Unmanaged by its ID. The above example
becomes:
Unmanaged *u = findUnmanaged(window);

The advantage is that it is way more flexible and has the logic what
to check for directly with the code and not hidden in the macro
definition.
2014-03-25 15:17:10 +01:00
Martin Gräßlin
970e8765f0 [kwin] Remove support for _NET_WM_TAKE_ACTIVITY protocol
As can be seen in [1] the patches to KWin were in CVS HEAD before the
protocol got standardized and it never got any adoption. It's neither in
the NETWM spec, nor implemented in Qt4 nor in Qt5. KWin did not even add
the protocol to the NET::Supported property.

Thus it doesn't make much sense to keep a protocol which nobody speaks.

Still the code around the protocol is kept and also the names are kept.
Only difference is that Client::takeActivity got removed and the code
moved to the only calling place in Workspace. Motivated by that change
the enum defined in utils.h is moved into Workspace, it's turned into
a proper QFlags class and used as a type in the method argument instead
of a generic long.

[1] https://mail.gnome.org/archives/wm-spec-list/2004-April/msg00013.html

REVIEW: 116922
2014-03-25 15:03:21 +01:00
Martin Gräßlin
46cb75c33f [kwin] Drop timestampDiff and timestampCompare from utils.h
They just delegate to same method from NET:: and those were used already
quite a lot in KWin already as classes inherit from NET and thus get it
directly.

REVIEW: 116918
2014-03-21 08:08:49 +01:00
Martin Gräßlin
d6b346df92 [kwin] Remove TemporaryAssign from utils.h
Only used in geometry.cpp for MaximizationState and that's no
longer needed.

REVIEW: 116902
2014-03-20 07:05:41 +01:00
Martin Gräßlin
1bc624f9f7 [kwin] Move Client specific code from utils.h to client.(h|cpp)
* Motif to client.cpp
* ClientWinMask to client.cpp
* ForceGeometry_t to Client

REVIEW: 116901
2014-03-19 18:54:00 +01:00
Martin Gräßlin
ca6f3e329d [kwin] Fix includes of NETWM
Used kde4support variant.
2014-03-18 14:32:53 +01:00
Martin Gräßlin
3346e04769 [kwin] Remove config-X11.h includes
None of the defines is used.
2014-03-18 10:00:49 +01:00
Aleix Pol
c72e519d9c Remove KDE/ prefix in include directories
It's unneeded and deprecated since KF5.
2014-03-17 16:24:10 +01:00
Martin Gräßlin
fdee4ea8c8 Adjust kde-workspace to introduction of flags in NET classes 2014-02-05 17:40:19 +01:00
Martin Gräßlin
1576c55cd2 [kwin] Add better support for Notification windows
KWin starts to support the Notification window type and has an own
layer for all notification windows. They are kept above the above
layer but do not go over active fullscreen windows.

REVIEW: 115298
2014-01-28 07:40:34 +01:00
Martin Gräßlin
40588e05ea Clean up the includes in kwin/options.(h/cpp)
Used to include quite a bit no longer needed. In order to get rid of
the utils.h inclusion one enum is moved to options (where it actually
belongs to).
2013-09-09 06:03:35 +02:00
Martin Gräßlin
37334f400a Drop no longer needed XLib includes from KWin 2013-08-20 10:29:20 +02:00
Martin Gräßlin
64e464afe5 Use xcb_window_t in Motif::readFlags
Actual method is not ported to XCB yet.

REVIEW: 110269
2013-05-13 09:33:29 +02:00
Martin Gräßlin
dfec59c60e Port getStringProperty to XCB 2013-05-13 08:48:19 +02:00
Martin Gräßlin
cefaa756e7 Port ClientWinMask to XCB
Enum values are nicer than defines.
2013-05-13 08:48:19 +02:00
Martin Gräßlin
5018c35313 Port timestampCompare/Diff to xcb
basically: s/Time/xcb_timestamp_t/g
2013-05-13 08:48:19 +02:00
Martin Gräßlin
7e9d7f3959 Port (un)grabXKeyboard to XCB 2013-05-13 08:48:19 +02:00
Martin Gräßlin
ce9ce6f94c Remove unused typedefs in utils.h
There is no Const(Toplevel|Unmanaged|Deleted|Group)List used anywhere.
For ConstToplevelList there was a debug helper which was also unused.

REVIEW: 110196
2013-05-02 09:21:02 +02:00
Martin Gräßlin
1276eb044f Move KWinSelectionOwner to main.(h|cpp)
KWinSelectionOwner is only used in KWin::Application which means that
utils is the wrong place for it.

REVIEW: 110245
2013-05-01 19:15:19 +02:00
Martin Gräßlin
89c2fd5598 Remove YesIKnowWhatImDoing from internal API
No need to have Allowed everywhere.

REVIEW: 110197
2013-04-26 12:29:42 +02:00
Martin Gräßlin
4a28d000cf Move ShortcutDialog to useractions
It's only used from useractions.cpp which means that it's not the best
fit in utils. We can see the problems with it given that it was in an
ifdef and it included quite some headers into everything.

REVIEW: 110189
2013-04-26 08:53:13 +02:00
Martin Gräßlin
22ecba3b7d Cleanup of includes in utils.h
* removed unneeded includes
* reordered
* camel case

REVIEW: 110188
2013-04-26 08:50:24 +02:00
Martin Gräßlin
03656a2abe Remove ShapeInput define from utils.h
It's nowhere used inside KWin.

REVIEW: 110190
2013-04-26 08:39:01 +02:00
Martin Gräßlin
ee537050dd Remove extern initing from utils.h
It's only used in main.cpp where the static variable is defined.

REVIEW: 110191
2013-04-26 08:38:00 +02:00
Martin Gräßlin
544b772e42 Use non obsoleted ctor for KXMessages 2013-03-07 13:59:16 +01:00
Martin Gräßlin
4f536c7f3d Extend ScopedCPointer from QScopedPointer with QScopedPointerPodDeleter
REVIEW: 108242
2013-01-25 08:56:33 +01:00
Martin Gräßlin
5cd223f051 Improved resolving whether a window is on local machine
Most windows use the hostname in WM_CLIENT_MACHINE, but there are windows
using the FQDN (for example libreoffice). So instead of "foo" it is
"foo.local.net" or similar. The logic so far has been unable to properly
determine whether windows with FQDN are on the local system.

In order to solve this problem the handling is split out into an own
class which stores the information of hostname and whether it is a local
machine. This is to not query multiple times. To determine whether the
Client is on the local system getaddrinfo is used for the own hostname
and the FQDN provided in WM_CLIENT_MACHINE. If one of the queried
names matches, we know that it is on the local machine. The old logic to
compare the hostname is still used and getaddrinfo is only a fallback in
case hostname does not match.

The problem with getaddrinfo is, that it accesses the network and by that
could block. To circumvent this problem the calls are moved into threads
by using QtConcurrent::run.

Obviously this brings disadvantages. When trying to resolve whether a
Client is on the local machine and a FQDN is used, the information is
initially wrong. The new ClientMachine class emits a signal when the
information that the system is local becomes available, but for some
things this is just too late:
* window rules are already gathered
* Session Management has already taken place

In both cases this is an acceptable loss. For window rules it just needs
a proper matching of the machine in case of localhost (remote hosts are
not affected). And the case of session management is very academic as it
is unlikely that a restoring session contains remote windows.

BUG: 308391
FIXED-IN: 4.11
REVIEW: 108235
2013-01-21 16:00:49 +01:00
Martin Gräßlin
533d57da60 Mark most ctors as explicit as reported by Krazy2 checker 2013-01-02 18:35:46 +01:00
Martin Gräßlin
e96ff7a31a Introduce an XServerGrabber helper class
Performs grabXServer in ctor and ungrabXServer in dtor. Useful to ensure
that each grab is matched by an ungrab.
2012-12-20 16:30:39 +01:00
Fredrik Höglund
36f05628f8 kwin: Add a ScopedCPointer class
This class is functionally the same as QScopedPointer, but uses
free() instead of delete.
2012-11-07 22:13:12 +01:00
Martin Gräßlin
2d954a6bf3 Make the Scene owned by the Compositor
The Scene has always been created and destroyed inside what is
now the split out compositor. Which means it is actually owned
by the Compositor. The static pointer has never been needed
inside KWin core. Access to the Scene is not required for the
Window Manager. The only real usage is in the EffectsHandlerImpl
and in utils.h to provide a convenient way to figure out whether
compositing is currently active (scene != NULL).

The EffectsHandlerImpl gets also created by the Compositor after
the Scene is created and gets deleted just before the Scene gets
deleted. This allows to inject the Scene into the EffectsHandlerImpl
to resolve the static access in this class.

The convenient way to access the compositing() in utils.h had
to go. To provide the same feature the Compositor provides a
hasScene() access which has the same behavior as the old method.
In order to keep the code changes small in Workspace and Toplevel
a new method compositing() is defined which properly resolves
the state. A disadvantage is that this can no longer be inlined
and consists of several method calls and pointer checks.
2012-08-26 20:43:57 +02:00
Martin Gräßlin
f8fd648a61 Move Client::layer() to Toplevel
This allows to copy the layer to the deleted window in order to
keep the deleted window in the same layer.

Additionally a new layer is added for unmanaged windows.
2012-04-20 08:36:23 +02:00
Martin Gräßlin
711fd0b876 Drop include for config-workspace.h
None of the definitions is used anywhere in kwin.
REVIEW: 104081
2012-02-26 17:23:19 +01:00
Martin Gräßlin
0c47ca5e97 Remove defines for X extensions
The following dependencies have become mandatory build deps:
* XRandR
* XRender
* XFixes
* XDamage
* XComposite
2011-08-13 16:46:43 +02:00
Martin Gräßlin
0a7e48f7aa KWin uses kdelibs coding style. 2011-01-31 20:07:03 +01:00
Thomas Lübking
e8b01efe44 improve keyboard navigation of the window shortcut dialog, add a conflict warning
kkeysequencewidget only needs the pushbutton as focusproxy
BUG: 182873
BUG: 251297

svn path=/trunk/KDE/kdebase/workspace/; revision=1195365
2010-11-10 22:28:15 +00:00
Lucas Murray
8a8428e41c Less Krazy warnings please.
svn path=/trunk/KDE/kdebase/workspace/; revision=1042572
2009-10-30 06:51:59 +00:00
Lucas Murray
743e058af5 Detect when _MOTIF_WM_HINTS gains or loses the no border hint.
Patch by Daniel Erat.
BUG: 201523

svn path=/trunk/KDE/kdebase/workspace/; revision=1030932
2009-10-03 14:32:24 +00:00
Lucas Murray
ca901dae30 Improved window movement around struts. Windows can be moved anywhere
where the titlebar is still clickable even if it is outside the normal
work area. When struts are added or removed only move the windows that
cover the same area, leave all others untouched. If a strut is removed
on a xinerama screen that is not on the edge of the full desktop area
prevent the windows from being moved offscreen. Prevent struts/panels
from interfering with the movement of windows on other xinerama screens.
BUG: 74559
BUG: 90833
BUG: 160068

svn path=/trunk/KDE/kdebase/workspace/; revision=927466
2009-02-17 15:50:00 +00:00
Luboš Luňák
7249ca2cfb Do self-check immediatelly during compositing setup only when it's not KWin startup
at the same time (in other words, only when activating compositing using the kcm).
Currently selfcheck causes bad flicker (due to X mapping the overlay window
for too long?) which looks bad during KDE startup. With this patch, KDE startup
is without any flicker.


svn path=/trunk/KDE/kdebase/workspace/; revision=923842
2009-02-09 14:51:11 +00:00
Michael Jansen
d6df278f49 Use the new session shortcut feature for kwins "Window Shorcut" feature.
@Lubos: Please have a look at commit 863096 too. I accidently commited a
part of this part there. Please have a look at the todo "Add the window
title" and possibly implement it. That would look much nicer in the global
shortcuts kcm.

Btw. There are two shortcuts dialogs in kwin. I haven't change the other
one (kwinrules) because it look it works better with KKeySequenceWidget
doing the message box.

CCMAIL:l.lunak@kde.org

svn path=/trunk/KDE/kdebase/workspace/; revision=863292
2008-09-21 18:03:59 +00:00
Luboš Luňák
63b01aff5d Rework handling of mapping and unmapping windows, in particular:
- the NormalState/IconicState things in ICCCM need to match exactly
  the real mapping state, so ensure that, no matter how superfluous that is
- extend the option for having live window previews either for all
  windows or for only all shown windows (default)
FEATURE: 163385


svn path=/trunk/KDE/kdebase/workspace/; revision=845772
2008-08-12 11:02:58 +00:00
Luboš Luňák
01d9d88580 Add a dbus call to query which color settings the current decoration
supports, to be used by kcmcolors.


svn path=/trunk/KDE/kdebase/workspace/; revision=788598
2008-03-21 22:17:10 +00:00
Luboš Luňák
bb433ac40e No longer include config*.h files in installed headers.
Also slightly redo the #define's for effects, now it's:
- #ifdef KWIN_HAVE_COMPOSITING to check whether there's any compositing support at all
- #ifdef KWIN_HAVE_OPENGL_COMPOSITING to check for OpenGL-based compositing
- #ifdef KWIN_HAVE_XRENDER_COMPOSITING the same for XRender
CCMAIL: kwin@kde.org


svn path=/trunk/KDE/kdebase/workspace/; revision=749628
2007-12-17 14:14:53 +00:00
Luboš Luňák
3b2b091c34 Make a clear distinction between types we support only for compositing
and types that are actually supported when managing windows.


svn path=/trunk/KDE/kdebase/workspace/; revision=746036
2007-12-07 15:53:43 +00:00