Compare commits

...

103 Commits

Author SHA1 Message Date
Vitaliy Filippov ff541bd02b ICC Color Correction effect 2021-02-12 13:59:21 +03:00
Jonathan Riddell cf9e966ddf Update version number for 5.20.5
GIT_SILENT
2021-01-05 11:34:33 +00:00
l10n daemon script 60d3dca8e4 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"
2020-12-21 10:13:29 +01:00
Vlad Zahorodnii e891537d15 scene: Fix window pixmap traversal order
Since the last child window pixmap is the top-most one, it needs to be
pushed on the stack first. This may fix KMail rendering issues.


(cherry picked from commit 3b1c143881)
2020-12-20 16:52:06 +00:00
l10n daemon script 0176ddb515 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"
2020-12-17 10:06:51 +01:00
Aleix Pol 28e1421c1e screencasting: fix build
Properly specify a null format.

CCMAIL: jgrulich@redhat.com
2020-12-11 11:58:13 +01:00
Jan Grulich baa3a4c791 Screencast: support BGRx format for backwards compatibility with WebRTC 2020-12-11 11:58:01 +01:00
l10n daemon script 9ef98d9306 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"
2020-12-11 09:56:01 +01:00
l10n daemon script 6ec5b35dc3 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"
2020-12-09 10:16:46 +01:00
Jonathan Riddell a9624fc0ca Update version number for 5.20.4
GIT_SILENT
2020-12-01 11:04:40 +00:00
Aleix Pol 10e1b6fd9d xwl: No need to delete the source immediately
Prefer replacing then deleting the selection to the other way around.
This way less events need to be reported and the clipboard manager
doesn't get confused.

(cherry picked from commit 4150c1f047)
2020-11-28 15:34:16 -07:00
Aleix Pol 7bfb9add96 xwl: No need to create createX11Source twice consecutively
(cherry picked from commit 0549c14588)
2020-11-28 15:34:08 -07:00
Aleix Pol 99b29195b4 xwl: Do not refresh the x11 Clipboard while fetching
At the moment there was a race condition when putting something into the
keyboard from XWayland apps. The clipboard manager would announce a new
thing before we'd submitted it all resulting in a broken state.

This change detects when it's fetching and will only refresh the source
after everything has been sent.

BUG: 424754
CCBUG: 412350
(cherry picked from commit d335070b80)
2020-11-28 15:33:51 -07:00
Aleix Pol 9854f40333 xwl: Include errors and warnings
(cherry picked from commit 439dcc4b1f)
2020-11-28 15:32:27 -07:00
Aleix Pol a3f5d43100 screencating: query for dmabuf availability before we start streaming
As things are right now, we can only do 32bit textures for dmabuf (see
gbm_bo_format in gbm.h). This means that we were lying to our receivers
when we had 24bit textures by then giving a 32bit texture instead.

This changes it so we request a dummy texture before starting and if we
are offered one we assume they're available and offer a 32bits stream
directly (i.e. BGRA).


(cherry picked from commit cea2781318)
2020-11-27 15:57:39 +00:00
Vlad Zahorodnii 038aa9d8d7 wayland: Fix clipped thumbnails of client-side decorated apps
The buffer offset for client-side decorated windows is not 0, this plus
mixing the frame position and the client size may result in clipped
thumbnails of client-side decorated applications, such as gedit, etc.

BUG: 428595


(cherry picked from commit e298caaa7a)
2020-11-27 15:35:52 +00:00
Michał Ziąbkowski 6acab64718 Fixed Toggle Night Color global shortcut, which used i18n in object name, leading to erratic behavior e.g. when system locale or translations changed.
BUG: 428024


(cherry picked from commit b186f86786)
2020-11-24 18:27:31 +00:00
Xaver Hugl 4361892c25 Set setMoveResize(true) after stopping fullscreen and quick tiling
BUG: 427848


(cherry picked from commit 459aa66d8e)
2020-11-24 18:18:47 +00:00
Aleix Pol 233df87c2c screencasting: don't crash if the cursor is too big for our buffer
Make sure we stay within our bounds.
Also initialise the background to transparent so there's no data from
past renders.


(cherry picked from commit 07c994fb82)
2020-11-23 13:45:09 +00:00
xinbo wang 2a4fb12f8f fix: magiclamp effect wrong direction.
if the dock is on the top,and the dock is not close together with screen edge.
for example,the dock is 10 pixels taller then sceen edge,the "position" will be "Bottom".
Autually,the dock is on the top of screen.


(cherry picked from commit 44b2a3f872)
2020-11-19 15:22:16 +00:00
Ismael Asensio 922dc0050b kcm/decorations: Fix border size updating for thumbnails
The property was only being updated on changes, but reset back
to `Normal` on KCM loading or after clicking Apply.


(cherry picked from commit 871611e9ec)
2020-11-16 17:24:12 +00:00
Jonathan Riddell b9de46059b Update version number for 5.20.3
GIT_SILENT
2020-11-10 19:18:18 +00:00
l10n daemon script 13c59686c6 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"
2020-11-10 09:39:41 +01:00
Aleix Pol 0b5cbe4016 Restore empty filename check
Otherwise we could end up matching with a weird ".../.desktop" entry.

BUG: 427979


(cherry picked from commit a92ce693ec)
2020-11-07 03:19:13 +00:00
Aleix Pol 191bef73ac drm: Make sure the screens are turned on when we come from suspend
Listen to logind for resume notification and turn the outputs on when it
happens, much like we do when pressing a key.

This way laptops come back on when the lid opens.

BUG: 428424


(cherry picked from commit 69eb8789ba)
2020-11-03 18:36:05 +00:00
Vlad Zahorodnii 405a0360fb Move some connects from Scene::addToplevel() to Window constructor
(cherry picked from commit 1694b24fa6)
2020-11-03 17:01:23 +02:00
Vlad Zahorodnii 575cc46a8a scene: Stop monitoring changes for unmapped surfaces
Once the main surface has been unmapped, we are no longer interested in
any changes that indicate that the window quads cache should be discarded

This also fixes a bug where the scene holds a subsurface monitor object
even after the associated window has been destroyed.

(cherry picked from commit 47ea0c98b1)
2020-11-03 17:01:01 +02:00
Bhushan Shah 7b4925f761 effects/screenshot: fix the screenshot on GLES
We want to multiply the width/height by scale weather or not we are
using GLES or not, otherwise this will only provide part of screen when
used with e.g fullscreen screenshot.


(cherry picked from commit 5e6c81eea0)
2020-11-03 09:29:21 +00:00
Lewis Lakerink 00570eb741 [scene] Fix segfault in KWin::WindowPixmap::shape (BUG: 426567)
(cherry picked from commit 00ce98b7a2)
2020-11-03 07:43:48 +00:00
Ismael Asensio 7465dcc9de kwinrules: Limit hightlight scrolling duration
By default, the rules list moves to the hightlighted item
(the one being edited) with a constant velocity. This can
be too slow when the list contains hundreds of items.

By setting `highlightMoveDuration` we set a maximum limit
for this animation.

BUG: 428139

(cherry picked from commit cfeca03e48)
2020-11-02 16:04:15 +01:00
l10n daemon script 2ce464a15a 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"
2020-10-31 09:42:02 +01:00
Vlad Zahorodnii 3d40db866c Transform a pending repaint into a workspace repaint before destroying Deleted
The sliding popups effect schedules a repaint and then unreferences the
deleted window. The problem with doing so is that the scheduled repaint
will be effectively discarded because the Deleted will be destroyed once
we are back in the event loop.

This issue is most noticeable on Wayland. Not sure why. If you close
Kickoff, you may see its flickering ghost in background.

If it happens that a Deleted has a pending repaint, transform it into a
workspace repaint to avoid discarding any scheduled repaints.


(cherry picked from commit 2715cbc86c)
2020-10-29 11:54:10 +00:00
Jonathan Riddell 022cc8a661 Update version number for 5.20.2
GIT_SILENT
2020-10-27 11:47:00 +00:00
Vlad Zahorodnii ea82e10a59 Provide cursor geometry in device-independent pixels
QImage::size() returns the size of the cursor image in the native
pixels. We cannot use it as the cursor size.

(cherry picked from commit 170a0b6395)
2020-10-27 08:29:15 +02:00
Vlad Zahorodnii 44dcb6d0a5 platform/drm: Fix clipped HiDPI hardware cursors
If an output is rotated, we will compute a transform matrix for the
cursor plane to rotate its contents.

In order to compute that matrix we need the rect of the cursor in the
device-independent pixels, the scale factor and the output transform.

The problem is that we provide a rect of the cursor in the native
pixels. This may result in the cursor being partially or fully clipped.

CCBUG: 424589
(cherry picked from commit c8eeefbd7d)
2020-10-27 08:29:00 +02:00
Vlad Zahorodnii ff4a0d9713 Clip software cursors
If you play some video and the software cursor doesn't hover it, then
the shadow cast by the cursor will be getting darker and darker with
every frame.

The main reason for that is that kwin paints the software cursor even
if the rect behind it hasn't been damaged or repainted.

(cherry picked from commit 4a0128cac1)
2020-10-27 08:28:47 +02:00
Vlad Zahorodnii 838d7e7a14 Mark the cursor as rendered after performing compositing
If a cursor animation is driven purely by frame callbacks and kwin
uses hardware cursors, the cpu usage may spike to 100%.

This change addresses that issue by sending frame callbacks after a
compositing cycle has been performed.

(cherry picked from commit 9b09f0399f)
2020-10-27 08:27:39 +02:00
Ismael Asensio 9ae4021ef4 [kwinrules] Allow negative numbers in position
This was limited by the range of the edition spinbox, not by the
rules mechanism which already allowed it.

BUG: 428083


(cherry picked from commit 3d80665c0a)
2020-10-27 02:09:00 +00:00
Vlad Zahorodnii 6577a35ec9 screencast: Handle the case where pipewire is not installed
If pipewire is not installed, pw_loop_new() may return a nullptr.

BUG: 427949


(cherry picked from commit 4b12afced9)
2020-10-26 11:44:04 +00:00
Vlad Zahorodnii 9d2b27aebb scenes/opengl: Properly render cursors with hidpi
GLTexture::width() and GLTexture::height() return the size of the cursor
texture in native pixels, but we need a size in device independent pixels.

CCBUG: 424589


(cherry picked from commit 6b940c1280)
2020-10-25 08:58:33 +00:00
Vlad Zahorodnii f123990930 wayland: Fix drag-and-drop cursors with hidpi
QImage::rect() returns a rect in the native pixels, however we need a
rect that is in the device independent pixels.

CCBUG: 424589


(cherry picked from commit 64b7cc3cf3)
2020-10-25 08:58:00 +00:00
Vlad Zahorodnii f6c4cc6b8d platforms/drm: Use a heuristic to determine if EGLDevice backend can be used
Currently, in order to use the EGLStreams backend, you need to set a
kernel parameter and an environment variable. If you set only the kernel
parameter, performance-wise, kwin will be unusable.

This change makes using the EGLStreams backend easier by making the env
var optional. If you omit KWIN_DRM_USE_EGL_STREAMS=1, kwin will check the
driver name to determine whether the EGLStreams can be enabled.
2020-10-23 10:33:57 +03:00
Méven Car 853ce5bcb8 ScreenshotEffect: don't expect authorization for interactive screenshots 2020-10-22 12:35:40 +02:00
Vlad Zahorodnii 445d1496e4 Introduce persistent global share context
On Wayland, internal windows that use OpenGL are rendered into fbos,
which are later handed over to kwin. In order to achieve that, our QPA
creates OpenGL contexts that share resources with the scene's context.

The problems start when compositing has been restarted. If user changes
any compositing settings, the underlying render backend will be
reinitialized and with it, the scene's context will be destroyed. Thus,
we no longer can accept framebuffer objects from internal windows.

This change addresses the framebuffer object sharing problem by adding
a so called global share context. It persists throughout the lifetime of
kwin. It can never be made current. The scene context and all contexts
created in our QPA share resources with it.

Therefore we can destroy the scene OpenGL context without affecting
OpenGL contexts owned by internal windows, e.g. the outline visual or
tabbox.

It's worth noting that Qt provides a way to create a global share
context. But for our purposes it's not suitable since the share
context must be known when QGuiApplication attempts to instantiate a
QOpenGLContext object. At that moment, the backend is not initialized
and thus the EGLDisplay is not available yet.

BUG: 415798
(cherry picked from commit 292335beac)
2020-10-20 12:21:31 +00:00
Vlad Zahorodnii 062e0441a5 Fix a potential SIGSEGV
Compositor::self()->scene() may return nullptr while compositing is
being restarted.

(cherry picked from commit da12d3804f)
2020-10-20 12:21:31 +00:00
Vlad Zahorodnii 3dcc4ebd37 qpa: Create a pbuffer for internal windows
If the surfaceless context extension is unsupported by the underlying
platform, the QPA will use the EGLSurface of the first output to make
OpenGL contexts current.

If an internal window attempts to make an OpenGL context current while
compositing is being restarted, for example it's typically the case with
the composited outline visual, QPA will either try to make the context
current with a no longer valid EGLSurface for the first output or will
crash during the call to Platform::supportsSurfacelessContext(). The
latter needs more explanation. After the compositingToggled() signal has
been emitted, there is no scene and supportsSurfacelessContext() doesn't
handle this case.

In either case, we could return EGL_NO_SURFACE if compositing is being
restarted, but if the underlying platform doesn't support the surfaceless
context extension, then the composited outline will not be able to
delete used textures, framebuffer objects, etc.

This change addresses that problem by making sure that every platform
window has a pbuffer allocated in case the surfaceless context extension
is unsupported.

(cherry picked from commit cc8cb8db9d)
2020-10-20 12:21:31 +00:00
Vlad Zahorodnii 259dedfc99 core: Use less confusing name for Platform::supportsQpaContext()
Platform::supportsQpaContext() indicates if the EGL display supports
surfaceless contexts, so reflect that in the method name.

(cherry picked from commit 29fbe27ffc)
2020-10-20 12:21:31 +00:00
Vlad Zahorodnii 7d327d0b8f qpa: Merge OpenGL platform context classes
This makes our QPlatformOpenGLContext private subclass simpler.

As a slightly unrelated change, this patch also fixes a bug where our
platform opengl context may return a wrong surface format if surfaceless
contexts are unsupported.

(cherry picked from commit 9b89a3d967)
2020-10-20 12:21:31 +00:00
Vlad Zahorodnii 77a6d2c6fa scene: Reduce the call cost of Platform::supportsQpaContext()
Every time Platform::supportsQpaContext() is called, we go through the
list of supported extensions and perform a string comparison op. This is
not really cheap.

(cherry picked from commit b7bd8472f2)
2020-10-20 12:21:31 +00:00
Jonathan Riddell 8edf25c1ab Update version number for 5.20.1
GIT_SILENT
2020-10-20 12:32:05 +01:00
Lewis Lakerink ae6e7feef0 Fix pipewire stream double free
(cherry picked from commit 16cb4286b1)
2020-10-20 08:11:54 +00:00
Fabian Vogt 6addcab364 Detect softpipe and llvmpipe on Mesa 20.2+
It seems like the vendor string changed from "VMware Inc." to "Mesa/X.org".
2020-10-19 16:56:25 +02:00
Vlad Zahorodnii e9b751d2c1 wayland: Introduce logicalToNativeMatrix() helper
The new helper function computes the projection matrix from the logical
coordinate space to the display coordinate space.
2020-10-16 20:06:57 +03:00
Vlad Zahorodnii 642be48bd2 platforms/drm: Fix software flip output transforms
Currently, flip output transformations in the software fallback code
path are equivalent to normal rotate output transformations.

This change implements flip output transformations according to the
wl_output spec.
2020-10-16 20:06:45 +03:00
Vlad Zahorodnii 1fd9ae618a platforms/drm: Compute correct cursor transform matrix
Currently, when the DRM platform uses cursor planes, the cursor on
a rotated output may be cropped because the math behind the current
cursor transform matrix is off.

In order to fix the cropping issue, this change replaces the current
cursor transform matrix with the core part of the surface-to-buffer
matrix, which was written against the wl_output spec.

BUG: 427605
CCBUG: 427060
2020-10-16 20:06:28 +03:00
Vlad Zahorodnii 76a33c90fb wayland: Fix Qt clients not being maximized initially
Currently, Qt clients send two maximize requests separated by the
initial commit. From spec's perspective, this is totally fine, the
client should receive two configure events with "maximized" state.

But because changeMaximize() in XdgToplevelClient and setMaximized()
operate on two different maximize modes, the second maximize request
will trick kwin into thinking that the client should be restored.


(cherry picked from commit a195223a8d)
2020-10-15 11:35:56 +00:00
Vlad Zahorodnii 0109bdbba9 xwayland: Avoid creating a tree query on crash
If Xwayland has crashed, the Workspace will block stacking order updates
and start destroying all X11 clients.

Once stacking order updates are unblocked, the Workspace will mark the X
stacking order as dirty and create a new Xcb::Tree object.

We don't want to create that Xcb::Tree object because accessing it
after the XCB connection has been shut down will lead to a crash.

BUG: 427688
FIXED-IN: 5.20.1


(cherry picked from commit 2093820aba)
2020-10-14 16:18:19 +00:00
Vlad Zahorodnii 83ed25031c wayland: Block geometry updates while placing popups
Placement::placeTransient() checks the frame geometry right after
setting it. That is a problem because geometry updates for
XdgPopupClient are made in async fashion. We need to block geometry
updates in order to ensure that window placement code sees correct
geometry.


(cherry picked from commit f369a3557c)
2020-10-13 18:04:27 +00:00
Nicolas Fella e35a5a7e1d Fix KWIN_EFFECT_FACTORY macros
The macros don't work because of the mismatching capitalization.

(cherry picked from commit 968b57fe2f)
2020-10-12 22:29:48 +02:00
l10n daemon script c3e1b1daa8 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"
2020-10-12 09:43:16 +02:00
l10n daemon script f5ee562fd5 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"
2020-10-11 09:42:33 +02:00
l10n daemon script 74411356bb 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"
2020-10-10 09:49:13 +02:00
Vlad Zahorodnii 5df72c6613 Safely remove all internal clients and override-redirect windows
When we destroy all internal clients and override-redirect windows, we
assume that corresponding lists will be implicitly detached.

However, in some cases, that might be not the case. For example, if the
list is not shared, neither begin() nor end() will detach. Therefore, it
is possible to hit invalidated iterators if the list is modified inside
the loop.

This change prevents hitting invalidated iterators by making explicit
list copies.

CCBUG: 427373


(cherry picked from commit 08263b534d)
2020-10-09 16:35:45 +00:00
Vlad Zahorodnii bba28ff9e8 Rename the variable where override-redirect windows are stored
Prepend m_ to unmanaged so no one has to come up with original names if
they want to iterate over a shadow copy of it.


(cherry picked from commit a5b811dadb)
2020-10-09 16:35:19 +00:00
l10n daemon script a5ec0bbdc9 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"
2020-10-09 10:21:35 +02:00
Jonathan Riddell 895acfc93e Update version number for 5.20.0
GIT_SILENT
2020-10-08 15:52:53 +01:00
Vlad Zahorodnii e200caf011 wayland: Fix initialization of dmabuf textures
Commit e459c8bf54 added a sanity check to
prevent recomputing the texture matrix if the y-inverted hint hasn't been
changed, which is totally reasonable!

However, code that initializes dmabuf textures implicitly assumes that
calling setYInverted() always results in updating the matrix. But it may
be not the case if the passed value matches current isYInverted().

This change adds missing calls to force updating the texture matrix.

Note that we don't need to check the buffer size every time the dmabuf
image has been modified externally because the window pixmap is going to
be re-created if the dimensions of the attached buffer have changed.

I've seen some reports on the internet about Firefox displaying garbage
instead of videos. 99% that bug is caused by this issue. But it seems
like Firefox no longer displays corrupted videos on my machine, so it's
hard to tell.


(cherry picked from commit f247e35c6d)
2020-10-07 11:44:32 +00:00
l10n daemon script 593ed60d72 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"
2020-10-06 09:24:38 +02:00
l10n daemon script 115489bcf8 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"
2020-10-05 10:04:35 +02:00
l10n daemon script 49c7d9b70a 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"
2020-10-04 09:47:59 +02:00
Vlad Zahorodnii dac3c29da6 3rdparty: Synchronize xcursor.{c,h}
(cherry picked from commit bf4c67678f)
2020-10-01 11:08:25 +00:00
Albert Astals Cid 1dfbac7348 Fix kwin_rules_dialog not showing translated strings
BUGS: 427172


(cherry picked from commit 743b06d3a1)
2020-10-01 10:34:55 +00:00
Vlad Zahorodnii ec70d35426 scripting: Fix initialization of WorkspaceWrapper
Workspace::clientList() only returns X11 clients, while allClientList()
returns all managed clients (both X11 and Wayland).

(cherry picked from commit 1e9bd43368)
2020-10-01 13:24:00 +03:00
Vlad Zahorodnii 3a50ce01f8 scripting: Make ClientFilterModel work for Wayland windows
(cherry picked from commit 1251b2cbb3)
2020-10-01 10:21:56 +00:00
Vlad Zahorodnii e249d08765 scripting: Properly initialize clients model for Wayland windows
In some cases, a ClientLevel model may not contain all Wayland windows
because of missing if (waylandServer()) {} code path in init() method.


(cherry picked from commit faf6b8e049)
2020-10-01 10:21:33 +00:00
Aleix Pol ba2aab2f04 scene: prefer calling mapToGlobal just once
It's the same top mapToGlobal()+operator& than the other way around and
we get to skip 1 call.
This path is the most common so we better save it.

(cherry picked from commit f558115def)
2020-09-29 17:34:21 +03:00
Vlad Zahorodnii 6e56d5741d Place internal osd windows according to placement policies
Currently, internal on screen display windows have the bypass window
manager hint set. If that hint is set, the osds must place themselves,
but they don't do it.

As far as I know, there is no any reason why internal OSDs have that
flag set.

By removing the Qt::BypassWindowManagerHint flag, we let kwin core
know that it's okay to place internal OSD windows.

BUG: 400675


(cherry picked from commit 4559d30399)
2020-09-29 14:10:01 +00:00
Vlad Zahorodnii 491930c49b Properly test internal window flags
Qt::Popup is a mask, so we cannot use the `&` operator to test the window
type. We need to use QFlags::testFlag() for that purpose instead.


(cherry picked from commit 70700b868a)
2020-09-29 14:09:33 +00:00
Vlad Zahorodnii ef65a34017 Use better window placement heuristics for internal clients
Currently, we do some sort of window placement only for decorated
internal windows, which feels hacky.

With this change, all internal clients will go through the window
placement code, unless it's a popup or the BypassWindowManagerHint
flag is set.

If the BypassWindowManagerHint flag is set, the window must have
valid position.

CCBUG: 400675


(cherry picked from commit bc34736534)
2020-09-29 14:08:59 +00:00
Vlad Zahorodnii 02490c2086 screencast: Replace EGLFence with a glFinish()
The way EGLFence is used is equivalent to calling glFinish().

CCBUG: 425869


(cherry picked from commit 6546ac2cae)
2020-09-29 13:58:09 +00:00
Vlad Zahorodnii dfa08f2259 Allow calling setFrameGeometry() while the client is being resized
Currently, if some script attempts to resize a window while it's being
interactively resized, the corresponding change won't be propagated to
the X server.

The main reason for that is that we don't want to configure the frame
window, the wrapper window, and the client window twice. However, since
Xcb::Window keeps track of the last configured geometry, we can adjust
X11Client::updateServerGeometry() so it only configures windows that
have mismatching geometry.

By doing so, the setFrameGeometry() function can be called by scripts
even when the associated X11 window is being interactively resized.

Note that this bug doesn't affect Wayland windows.

BUG: 426988


(cherry picked from commit 6f153552da)
2020-09-29 13:56:56 +00:00
Vlad Zahorodnii f53d90a9f9 Fix ghost shadows left by context menus
If the shadow is destroyed immediately before the window is destroyed,
we need to schedule a workspace repaint in order to prevent showing a
"ghost" shadow.

BUG: 425294


(cherry picked from commit ddb24eaf0a)
2020-09-29 13:55:14 +00:00
Vlad Zahorodnii e056406951 Schedule workspace repaint for destroyed clients
We need to schedule a workspace repaint in case no effect is going to
animate the window.

The workspace repaint is issued before creating a Deleted because the
latter takes the owner of the effect window, which means that after an
instance of Deleted has been created, visibleRect() returns the frame
geometry.

CCBUG: 425294


(cherry picked from commit 12e59f9af8)
2020-09-29 13:54:36 +00:00
Vlad Zahorodnii c5880833d9 x11: Make removal of X11 event filters safe
If an X11 event filter has been activated and it unregisters another X11
event filter, then the window manager may crash because the foreach macro
in Workspace::workspaceEvent() makes a copy of m_genericEventFilters or
m_eventFilters and we can call the event() method for an already defunct
filter.

With this change, X11 event filters can be safely removed and installed
at any particular moment.

BUG: 423319


(cherry picked from commit a433fb08a3)
2020-09-29 08:27:16 +00:00
l10n daemon script c8c0c57c0c 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"
2020-09-29 09:36:49 +02:00
l10n daemon script f4b9ecb897 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"
2020-09-28 09:59:55 +02:00
l10n daemon script 5e4c52c9a9 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"
2020-09-26 09:21:28 +02:00
Vlad Zahorodnii 6b91b07059 Enable shadow protocol support for all Wayland clients
The main motivation for this change is to enable support for our
proprietary shadow protocol in LayerShellV1Client.

Previously we couldn't move code that handles shadows in WaylandClient
because WaylandClient::bufferGeometry() was a pure virtual method.


(cherry picked from commit f24f2bd509)
2020-09-25 07:33:18 +00:00
Vlad Zahorodnii 5b46e01c45 screencast: Ensure that there is current OpenGL context when recording a window
We need an OpenGL context otherwise we may hit an assert in libepoxy.

BUG: 425869


(cherry picked from commit 989e0987d7)
2020-09-24 13:00:09 +00:00
Vlad Zahorodnii 895ec1ad12 Expose KWIN_XWL logging category to kdebugsettings
(cherry picked from commit 80554a3e12)
2020-09-24 12:30:09 +00:00
David Edmundson 23b85e2b85 Revert "[effects/slidingpopups] Start the animation on only windowAdded or windowClosed"
This reverts commit 9d4c8fda09.

Unlike other effects this wasn't using hide/show as a hack for not
having a created/destroyed signal but because the window is internally
hidden when it's in auto-hide mode despite being still mapped.

BUG: 426686


(cherry picked from commit 095cdcd374)
2020-09-24 11:16:57 +00:00
Vlad Zahorodnii 98882a0962 Fix invalidation of cached x stacking order in wayland only mode
Currently, if kwin/wayland runs without xwayland, the order in which
windows are painted doesn't actually reflect the true stacking order.

If the stacking order has been changed, we need to invalidate the
cached x stacking order. But it's done only when RootInfo is present.

If Xwayland doesn't run, RootInfo is not available and thus window
raising is completely broken.

With this change, the x stacking order will be invalidated every time
some window has been raised, no matter what mode kwin operates in.


(cherry picked from commit 75cad57cd9)
2020-09-24 09:49:01 +00:00
Andreas Haratzis 60fd537684 Fix for PlasmaSurfaceTest broken in a3b50500
TestPanelWindowsCanCover now needs to wait for the event queue to process the hover event.


(cherry picked from commit 6f53f62741)
2020-09-24 09:35:56 +00:00
Andreas Haratzis 7a4df745f6 Fix for potential use-after-free introduced in a3b50500
If showOnScreenEdge is called, immediately followed by the client's destruction, it's possible that the next event queue process will call raiseClient with a destroyed client.
We avoid this by using singleShot that is lifetime-aware.


(cherry picked from commit 1dbe3708f5)
2020-09-24 09:35:26 +00:00
l10n daemon script 23c031ce54 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"
2020-09-24 10:04:18 +02:00
l10n daemon script 48a69e77f8 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"
2020-09-22 09:55:45 +02:00
l10n daemon script 9fc1f82700 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"
2020-09-21 09:44:18 +02:00
Vlad Zahorodnii e9eb8c725d effects/flipswitch: Port away from deprecated QTimeline curve shape prop
QTimeline::CurveShape has been deprecated in Qt 5.15.


(cherry picked from commit 5f7d23fd07)
2020-09-21 06:19:00 +00:00
Vlad Zahorodnii 6046a67396 effects/cubeslide: Port away from deprecated QTimeline curve shape prop
QTimeline::CurveShape has been deprecated in Qt 5.15.


(cherry picked from commit 99dd5d94c5)
2020-09-21 06:18:32 +00:00
Vlad Zahorodnii 1630ce053a effects/desktopgrid: Port away from deprecated QTimeline curve shape prop
QTimeline::CurveShape has been deprecated in Qt 5.15.


(cherry picked from commit 3d0042e05b)
2020-09-21 06:17:59 +00:00
l10n daemon script fc5a553eb0 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"
2020-09-19 09:45:44 +02:00
Andreas Haratzis a3b50500fc Fix use-after-free when the user hovers over an auto-hide plasma panel in wayland...
Edge::handle calls showOnScreenEdge, which (on wayland) eventually calls internalShow, which eventually calls ScreenEdges::reserve, which destroys the same edge.
When showScreenOnEdge returns, 'this' has been freed.
Using a singleshot timer allows Edge::handle to return before the Edge is destroyed.


(cherry picked from commit 71dfd60284)
2020-09-18 16:03:08 +00:00
Vlad Zahorodnii 965b20abb8 libkwineffects: Bump API version
The API version must be bumped because a new virtual method in the
EffectWindow class had been introduced that breaks BC.


(cherry picked from commit 79c667ea67)
2020-09-18 11:01:25 +00:00
171 changed files with 1820 additions and 691 deletions

9
3rdparty/xcursor.c vendored
View File

@ -285,10 +285,11 @@ _XcursorReadUInt (XcursorFile *file, XcursorUInt *u)
if ((*file->read) (file, bytes, 4) != 4)
return XcursorFalse;
*u = ((bytes[0] << 0) |
(bytes[1] << 8) |
(bytes[2] << 16) |
(bytes[3] << 24));
*u = ((XcursorUInt)(bytes[0]) << 0) |
((XcursorUInt)(bytes[1]) << 8) |
((XcursorUInt)(bytes[2]) << 16) |
((XcursorUInt)(bytes[3]) << 24);
return XcursorTrue;
}

4
3rdparty/xcursor.h vendored
View File

@ -30,8 +30,10 @@
extern "C" {
#endif
#include <stdint.h>
typedef int XcursorBool;
typedef unsigned int XcursorUInt;
typedef uint32_t XcursorUInt;
typedef XcursorUInt XcursorDim;
typedef XcursorUInt XcursorPixel;

View File

@ -1,7 +1,7 @@
cmake_minimum_required(VERSION 3.1 FATAL_ERROR)
project(KWin)
set(PROJECT_VERSION "5.19.90")
set(PROJECT_VERSION "5.20.5")
set(PROJECT_VERSION_MAJOR 5)
set(QT_MIN_VERSION "5.15.0")

View File

@ -236,6 +236,7 @@ void AbstractClient::markAsZombie()
{
Q_ASSERT(!m_zombie);
m_zombie = true;
addWorkspaceRepaint(visibleRect());
}
Layer AbstractClient::layer() const
@ -877,7 +878,7 @@ void AbstractClient::maximize(MaximizeMode m)
void AbstractClient::setMaximize(bool vertically, bool horizontally)
{
// changeMaximize() flips the state, so change from set->flip
const MaximizeMode oldMode = maximizeMode();
const MaximizeMode oldMode = requestedMaximizeMode();
changeMaximize(
oldMode & MaximizeHorizontal ? !horizontally : horizontally,
oldMode & MaximizeVertical ? !vertically : vertically,
@ -2615,6 +2616,10 @@ void AbstractClient::setDesktopFileName(QByteArray name)
QString AbstractClient::iconFromDesktopFile() const
{
if (m_desktopFileName.isEmpty()) {
return {};
}
const QString desktopFileName = QString::fromUtf8(m_desktopFileName);
QString desktopFilePath;

View File

@ -311,45 +311,46 @@ AbstractWaylandOutput::Transform AbstractWaylandOutput::transform() const
return static_cast<Transform>(m_waylandOutputDevice->transform());
}
// TODO: Do we need to handle the flipped cases differently?
int transformToRotation(AbstractWaylandOutput::Transform transform)
QMatrix4x4 AbstractWaylandOutput::logicalToNativeMatrix(const QRect &rect, qreal scale, Transform transform)
{
switch (transform) {
case AbstractWaylandOutput::Transform::Normal:
case AbstractWaylandOutput::Transform::Flipped:
return 0;
case AbstractWaylandOutput::Transform::Rotated90:
case AbstractWaylandOutput::Transform::Flipped90:
return 90;
case AbstractWaylandOutput::Transform::Rotated180:
case AbstractWaylandOutput::Transform::Flipped180:
return 180;
case AbstractWaylandOutput::Transform::Rotated270:
case AbstractWaylandOutput::Transform::Flipped270:
return 270;
}
Q_UNREACHABLE();
return 0;
}
int AbstractWaylandOutput::rotation() const
{
return transformToRotation(transform());
}
QMatrix4x4 AbstractWaylandOutput::transformation() const
{
const QSize outputSize = modeSize();
const QSize logicalSize = pixelSize();
QMatrix4x4 matrix;
matrix.translate(outputSize.width()/2, outputSize.height()/2);
matrix.rotate(rotation(), 0, 0, 1);
matrix.translate(-logicalSize.width()/2, -logicalSize.height()/2);
matrix.scale(scale());
matrix.scale(scale);
switch (transform) {
case Transform::Normal:
case Transform::Flipped:
break;
case Transform::Rotated90:
case Transform::Flipped90:
matrix.translate(0, rect.width());
matrix.rotate(-90, 0, 0, 1);
break;
case Transform::Rotated180:
case Transform::Flipped180:
matrix.translate(rect.width(), rect.height());
matrix.rotate(-180, 0, 0, 1);
break;
case Transform::Rotated270:
case Transform::Flipped270:
matrix.translate(rect.height(), 0);
matrix.rotate(-270, 0, 0, 1);
break;
}
switch (transform) {
case Transform::Flipped:
case Transform::Flipped90:
case Transform::Flipped180:
case Transform::Flipped270:
matrix.translate(rect.width(), 0);
matrix.scale(-1, 1);
break;
default:
break;
}
matrix.translate(-rect.x(), -rect.y());
const QPoint topLeft = -globalPos();
matrix.translate(-topLeft.x(), -topLeft.y());
return matrix;
}

View File

@ -112,17 +112,10 @@ public:
QString description() const;
/**
* The current rotation of the output
*
* @return rotation in degrees
*/
int rotation() const;
/**
* Returns a matrix that can translate into the display's coordinates system
*/
QMatrix4x4 transformation() const;
static QMatrix4x4 logicalToNativeMatrix(const QRect &rect, qreal scale, Transform transform);
Q_SIGNALS:
void modeChanged();

View File

@ -370,6 +370,7 @@ void PlasmaSurfaceTest::testPanelWindowsCanCover()
// trigger screenedge
QFETCH(QPoint, triggerPoint);
KWin::Cursors::self()->mouse()->setPos(triggerPoint);
QVERIFY(stackingOrderChangedSpy.wait());
QCOMPARE(stackingOrderChangedSpy.count(), 1);
stackingOrder = workspace()->stackingOrder();
QCOMPARE(stackingOrder.count(), 2);

View File

@ -100,6 +100,7 @@ private Q_SLOTS:
void testXdgWindowGeometryMaximize();
void testPointerInputTransform();
void testReentrantSetFrameGeometry();
void testDoubleMaximize();
};
void TestXdgShellClient::initTestCase()
@ -1558,5 +1559,38 @@ void TestXdgShellClient::testReentrantSetFrameGeometry()
QVERIFY(Test::waitForWindowDestroyed(client));
}
void TestXdgShellClient::testDoubleMaximize()
{
// This test verifies that the case where a client issues two set_maximized() requests
// separated by the initial commit is handled properly.
// Create the test surface.
QScopedPointer<Surface> surface(Test::createSurface());
QScopedPointer<XdgShellSurface> shellSurface(Test::createXdgShellStableSurface(surface.data(), nullptr, Test::CreationSetup::CreateOnly));
shellSurface->setMaximized(true);
surface->commit(Surface::CommitFlag::None);
// Wait for the compositor to respond with a configure event.
QSignalSpy configureRequestedSpy(shellSurface.data(), &XdgShellSurface::configureRequested);
QVERIFY(configureRequestedSpy.wait());
QCOMPARE(configureRequestedSpy.count(), 1);
QSize size = configureRequestedSpy.last().at(0).value<QSize>();
QCOMPARE(size, QSize(1280, 1024));
XdgShellSurface::States states = configureRequestedSpy.last().at(1).value<XdgShellSurface::States>();
QVERIFY(states.testFlag(XdgShellSurface::State::Maximized));
// Send another set_maximized() request, but do not attach any buffer yet.
shellSurface->setMaximized(true);
surface->commit(Surface::CommitFlag::None);
// The compositor must respond with another configure event even if the state hasn't changed.
QVERIFY(configureRequestedSpy.wait());
QCOMPARE(configureRequestedSpy.count(), 2);
size = configureRequestedSpy.last().at(0).value<QSize>();
QCOMPARE(size, QSize(1280, 1024));
states = configureRequestedSpy.last().at(1).value<XdgShellSurface::States>();
QVERIFY(states.testFlag(XdgShellSurface::State::Maximized));
}
WAYLANDTEST_MAIN(TestXdgShellClient)
#include "xdgshellclient_test.moc"

View File

@ -5,8 +5,10 @@
*/
#include "kwin_wayland_test.h"
#include "composite.h"
#include "main.h"
#include "platform.h"
#include "scene.h"
#include "screens.h"
#include "unmanaged.h"
#include "wayland_server.h"
@ -124,6 +126,11 @@ void XwaylandServerCrashTest::testCrash()
QCOMPARE(kwinApp()->x11DefaultScreen(), nullptr);
QCOMPARE(kwinApp()->x11RootWindow(), XCB_WINDOW_NONE);
QCOMPARE(kwinApp()->x11ScreenNumber(), -1);
// Render a frame to ensure that the compositor doesn't crash.
Compositor::self()->addRepaintFull();
QSignalSpy frameRenderedSpy(Compositor::self()->scene(), &Scene::frameRendered);
QVERIFY(frameRenderedSpy.wait());
}
} // namespace KWin

View File

@ -5,8 +5,10 @@
*/
#include "kwin_wayland_test.h"
#include "composite.h"
#include "main.h"
#include "platform.h"
#include "scene.h"
#include "screens.h"
#include "wayland_server.h"
#include "workspace.h"
@ -103,6 +105,11 @@ void XwaylandServerRestartTest::testRestart()
QCOMPARE(client->windowId(), window);
QVERIFY(client->isDecorated());
// Render a frame to ensure that the compositor doesn't crash.
Compositor::self()->addRepaintFull();
QSignalSpy frameRenderedSpy(Compositor::self()->scene(), &Scene::frameRendered);
QVERIFY(frameRenderedSpy.wait());
// Destroy the test window.
xcb_destroy_window(c.data(), window);
xcb_flush(c.data());

View File

@ -0,0 +1,22 @@
[Driver]
Vendor=Mesa/X.org
Renderer=llvmpipe (LLVM 10.0.1, 256 bits)
Version=3.1 Mesa 20.2.1
ShadingLanguageVersion=1.40
[Settings]
LooseBinding=true
GLSL=true
TextureNPOT=true
Mesa=true
Gallium=true
SoftwareEmulation=true
GLVersion=3,1
GLSLVersion=1,40
MesaVersion=20,2,1
GalliumVersion=0,4
DriverVersion=20,2,1
Driver=12
ChipClass=99999
Compositor=9

View File

@ -224,9 +224,17 @@ qint64 Manager::scheduledTransitionDuration() const
void Manager::initShortcuts()
{
// legacy shortcut with localized key (to avoid breaking existing config)
if (i18n("Toggle Night Color") != QStringLiteral("Toggle Night Color")) {
QAction toggleActionLegacy;
toggleActionLegacy.setProperty("componentName", QStringLiteral(KWIN_NAME));
toggleActionLegacy.setObjectName(i18n("Toggle Night Color"));
KGlobalAccel::self()->removeAllShortcuts(&toggleActionLegacy);
}
QAction *toggleAction = new QAction(this);
toggleAction->setProperty("componentName", QStringLiteral(KWIN_NAME));
toggleAction->setObjectName(i18n("Toggle Night Color"));
toggleAction->setObjectName(QStringLiteral("Toggle Night Color"));
toggleAction->setText(i18n("Toggle Night Color"));
KGlobalAccel::setGlobalShortcut(toggleAction, QList<QKeySequence>());
input()->registerShortcut(QKeySequence(), toggleAction, this, &Manager::toggle);

View File

@ -705,6 +705,9 @@ void Compositor::performCompositing()
surface->frameRendered(currentTime);
}
}
if (!kwinApp()->platform()->isCursorHidden()) {
Cursors::self()->currentCursor()->markAsRendered();
}
}
// Stop here to ensure *we* cause the next repaint schedule - not some effect

View File

@ -145,7 +145,12 @@ void Cursor::slotKGlobalSettingsNotifyChange(int type, int arg)
QRect Cursor::geometry() const
{
return QRect(m_pos - hotspot(), image().size());
return rect().translated(m_pos - hotspot());
}
QRect Cursor::rect() const
{
return QRect(QPoint(0, 0), image().size() / image().devicePixelRatio());
}
QPoint Cursor::pos()

View File

@ -163,6 +163,7 @@ public:
QImage image() const { return m_image; }
QPoint hotspot() const { return m_hotspot; }
QRect geometry() const;
QRect rect() const;
void updateCursor(const QImage &image, const QPoint &hotspot);
void markAsRendered() {

View File

@ -22,3 +22,4 @@ kwin_scene_xrender KWin XRender based compositor scene plugin DEFAULT_SEVERITY [
kwin_scene_qpainter KWin QPainter based compositor scene plugin DEFAULT_SEVERITY [CRITICAL] IDENTIFIER [KWIN_QPAINTER]
kwin_scene_opengl KWin OpenGL based compositor scene plugins DEFAULT_SEVERITY [CRITICAL] IDENTIFIER [KWIN_OPENGL]
kwin_screencast KWin Screen Cast Service DEFAULT_SEVERITY [WARNING] IDENTIFIER [KWIN_SCREENCAST]
kwin_xwl KWin Xwayland Server DEFAULT_SEVERITY [WARNING] IDENTIFIER [KWIN_XWL]

View File

@ -47,6 +47,11 @@ Deleted::Deleted()
Deleted::~Deleted()
{
const QRegion dirty = repaints();
if (!dirty.isEmpty()) {
addWorkspaceRepaint(dirty);
}
if (delete_refcount != 0)
qCCritical(KWIN_CORE) << "Deleted client has non-zero reference count (" << delete_refcount << ")";
Q_ASSERT(delete_refcount == 0);

View File

@ -73,6 +73,11 @@ macro(KWIN4_ADD_EFFECT name)
install(TARGETS kwin4_effect_${name} ${INSTALL_TARGETS_DEFAULT_ARGS})
endmacro()
# For ICC (FIXME remove if building separately)
find_package(PkgConfig)
pkg_check_modules(LCMS2 REQUIRED lcms2)
set_package_properties(LCMS2 PROPERTIES TYPE REQUIRED PURPOSE "Required for ICC color correction.")
# Install the KWin/Effect service type
install(FILES kwineffect.desktop DESTINATION ${SERVICETYPES_INSTALL_DIR})
@ -92,6 +97,7 @@ set(kwin4_effect_builtins_sources
effect_builtins.cpp
flipswitch/flipswitch.cpp
glide/glide.cpp
icc/icc.cpp
invert/invert.cpp
logging.cpp
lookingglass/lookingglass.cpp
@ -133,6 +139,7 @@ kconfig_add_kcfg_files(kwin4_effect_builtins_sources
fallapart/fallapartconfig.kcfgc
flipswitch/flipswitchconfig.kcfgc
glide/glideconfig.kcfgc
icc/iccconfig.kcfgc
lookingglass/lookingglassconfig.kcfgc
magiclamp/magiclampconfig.kcfgc
magnifier/magnifierconfig.kcfgc
@ -205,6 +212,7 @@ add_subdirectory(cube)
add_subdirectory(cubeslide)
add_subdirectory(flipswitch)
add_subdirectory(glide)
add_subdirectory(icc)
add_subdirectory(invert)
add_subdirectory(lookingglass)
add_subdirectory(magnifier)
@ -221,3 +229,8 @@ add_subdirectory(wobblywindows)
# Add the builtins plugin
kwin4_add_effect(builtins ${kwin4_effect_builtins_sources})
# FIXME For ICC, remove if building separately
target_link_libraries(kwin4_effect_builtins PUBLIC ${LCMS2_LIBRARIES})
target_include_directories(kwin4_effect_builtins PUBLIC ${LCMS2_INCLUDE_DIRS})
target_compile_options(kwin4_effect_builtins PUBLIC ${LCMS2_CFLAGS_OTHER})

View File

@ -57,7 +57,7 @@ void CubeSlideEffect::reconfigure(ReconfigureFlags)
CubeSlideConfig::self()->read();
// TODO: rename rotationDuration to duration
rotationDuration = animationTime(CubeSlideConfig::rotationDuration() != 0 ? CubeSlideConfig::rotationDuration() : 500);
timeLine.setCurveShape(QTimeLine::EaseInOutCurve);
timeLine.setEasingCurve(QEasingCurve::InOutSine);
timeLine.setDuration(rotationDuration);
dontSlidePanels = CubeSlideConfig::dontSlidePanels();
dontSlideStickyWindows = CubeSlideConfig::dontSlideStickyWindows();
@ -367,9 +367,9 @@ void CubeSlideEffect::postPaintScreen()
}
timeLine.setCurrentTime(0);
if (slideRotations.count() == 1)
timeLine.setCurveShape(QTimeLine::EaseOutCurve);
timeLine.setEasingCurve(QEasingCurve::OutSine);
else
timeLine.setCurveShape(QTimeLine::LinearCurve);
timeLine.setEasingCurve(QEasingCurve::Linear);
if (slideRotations.empty()) {
for (EffectWindow* w : staticWindows) {
w->setData(WindowForceBlurRole, QVariant());
@ -500,9 +500,9 @@ void CubeSlideEffect::startAnimation() {
}
}
if (slideRotations.count() == 1) {
timeLine.setCurveShape(QTimeLine::EaseInOutCurve);
timeLine.setEasingCurve(QEasingCurve::InOutSine);
} else {
timeLine.setCurveShape(QTimeLine::EaseInCurve);
timeLine.setEasingCurve(QEasingCurve::InSine);
}
effects->setActiveFullScreenEffect(this);
timeLine.setCurrentTime(0);

View File

@ -108,7 +108,7 @@ void DesktopGridEffect::reconfigure(ReconfigureFlags)
// TODO: rename zoomDuration to duration
zoomDuration = animationTime(DesktopGridConfig::zoomDuration() != 0 ? DesktopGridConfig::zoomDuration() : 300);
timeline.setCurveShape(QTimeLine::EaseInOutCurve);
timeline.setEasingCurve(QEasingCurve::InOutSine);
timeline.setDuration(zoomDuration);
border = DesktopGridConfig::borderWidth();
@ -1046,7 +1046,7 @@ void DesktopGridEffect::setup()
hoverTimeline.clear();
for (int i = 0; i < effects->numberOfDesktops(); i++) {
QTimeLine *newTimeline = new QTimeLine(zoomDuration, this);
newTimeline->setCurveShape(QTimeLine::EaseInOutCurve);
newTimeline->setEasingCurve(QEasingCurve::InOutSine);
hoverTimeline.append(newTimeline);
}
hoverTimeline[effects->currentDesktop() - 1]->setCurrentTime(hoverTimeline[effects->currentDesktop() - 1]->duration());
@ -1282,7 +1282,7 @@ void DesktopGridEffect::desktopsAdded(int old)
for (int i = old; i <= effects->numberOfDesktops(); i++) {
// add a timeline for the new desktop
QTimeLine *newTimeline = new QTimeLine(zoomDuration, this);
newTimeline->setCurveShape(QTimeLine::EaseInOutCurve);
newTimeline->setEasingCurve(QEasingCurve::InOutSine);
hoverTimeline.append(newTimeline);
}

View File

@ -38,6 +38,7 @@
#include "cubeslide/cubeslide.h"
#include "flipswitch/flipswitch.h"
#include "glide/glide.h"
#include "icc/icc.h"
#include "invert/invert.h"
#include "lookingglass/lookingglass.h"
#include "magnifier/magnifier.h"
@ -265,6 +266,21 @@ EFFECT_FALLBACK
nullptr,
nullptr
#endif
EFFECT_FALLBACK
}, {
QStringLiteral("icc"),
i18ndc("kwin_effects", "Name of a KWin Effect", "ICC Color Correction"),
i18ndc("kwin_effects", "Comment describing the KWin Effect", "Applies full ICC color correction to the whole display"),
QStringLiteral("Appearance"),
QString(),
QUrl(),
false,
false,
#ifdef EFFECT_BUILTINS
&createHelper<ICCEffect>,
&ICCEffect::supported,
nullptr
#endif
EFFECT_FALLBACK
}, {
QStringLiteral("invert"),

View File

@ -35,6 +35,7 @@ enum class BuiltInEffect
FlipSwitch,
Glide,
HighlightWindow,
ICC,
Invert,
Kscreen,
LookingGlass,

View File

@ -16,8 +16,10 @@ Name[ko]=화면 위의 눈
Name[lt]=Akis ekrane
Name[nl]=Oog op scherm
Name[nn]=Auge på skjerm
Name[pl]=Oko na ekranie
Name[pt]=Olho no Ecrã
Name[pt_BR]=Olho na tela
Name[ro]=Ochi pe ecran
Name[ru]=Втягивание окон в центр экрана
Name[sk]=Oko na obrazovke
Name[sl]=Oko na zaslonu
@ -43,8 +45,10 @@ Comment[ko]=창을 바탕 화면으로 흡수
Comment[lt]=Įtraukti langus į darbalaukį
Comment[nl]=Zuig vensters in het bureaublad
Comment[nn]=Sug vindauge inn i skrivebordet
Comment[pl]=Zasysa okna na pulpicie
Comment[pt]=Aspira as janelas para o ecrã
Comment[pt_BR]=Suga as janelas para a área de trabalho
Comment[ro]=Suge ferestrele în birou
Comment[ru]=Втягивание окон в центр рабочего стола
Comment[sk]=Nasať okná na plochu
Comment[sl]=Prisesa okna na namizje

View File

@ -54,7 +54,7 @@ Name[pa]=ਫਿੱਕਾ
Name[pl]=Zanikanie/wyłanianie
Name[pt]=Desvanecer
Name[pt_BR]=Desvanecer
Name[ro]=Decolorare
Name[ro]=Estompare
Name[ru]=Растворение
Name[se]=Rievdat šearratvuođa
Name[si]=විවර්ණ
@ -127,7 +127,7 @@ Comment[pa]=ਜਦੋਂ ਵਿੰਡੋਜ਼ ਨੂੰ ਵੇਖਾਉਣਾ
Comment[pl]=Okna gładko wyłaniają się przy otwieraniu i zanikają przy zamykaniu
Comment[pt]=Fazer com que as janelas apareçam/desapareçam suavemente quando aparecem ou ficam escondidas
Comment[pt_BR]=Faz as janelas aparecerem/desaparecerem suavemente quando são exibidas ou ocultadas
Comment[ro]=Face ferestrele să se (de)coloreze când sunt afișate sau ascunse
Comment[ro]=Face ferestrele să se (de)coloreze când sunt arătate sau ascunse
Comment[ru]=Закрывающиеся окна будут становиться всё более прозрачными, а потом совсем исчезать
Comment[si]=පෙන්වන හා සඟවන විට කවුළු විවර්‍ණය කිරීම හා නොකිරීම සිදු කරන්න
Comment[sk]=Okná sa plynule objavia/zmiznú pri ich zobrazení alebo skrytí

View File

@ -112,7 +112,7 @@ Comment[pa]=ਜਦੋਂ ਵੁਰਚੁਅਲ ਡੈਸਕਟਾਪ ਵਿੱ
Comment[pl]=Przenika pulpity wirtualne przy ich przełączaniu
Comment[pt]=Desvanece entre os ecrãs virtuais, ao circular entre eles
Comment[pt_BR]=Desaparece entre as áreas de trabalho virtuais, ao alternar entre elas
Comment[ro]=Estompare între birourile virtuale la comutarea între ele
Comment[ro]=Estompare între birourile virtuale la schimbarea între ele
Comment[ru]=Постепенная смена изображения при переключении на другой рабочий стол
Comment[si]=අතත්‍ය වැඩතල අතර මාරුවීමේදී ඒවා අතර විවර්ණය කරන්න
Comment[sk]=Efekt zoslabenia pri prepínaní virtuálnych plôch

View File

@ -24,6 +24,7 @@ Name[nn]=Inn- og uttoning av sprettoppvindauge
Name[pl]=Zanikanie okien wysuwnych
Name[pt]=Mensagens Desvanecentes
Name[pt_BR]=Desvanecer mensagens
Name[ro]=Indicii estompate
Name[ru]=Растворяющиеся всплывающие окна
Name[sk]=Miznúce vyskakovacie okná
Name[sl]=Prehajajoča pojavna okna
@ -58,6 +59,7 @@ Comment[nn]=Ton sprettoppvindauge gradvis inn og ut når dei vert viste eller g
Comment[pl]=Okna wysuwne gładko wyłaniają się przy otwieraniu i zanikają przy zamykaniu
Comment[pt]=Fazer com que as janelas apareçam/desapareçam suavemente quando aparecem ou ficam escondidas
Comment[pt_BR]=Faz as mensagens aparecerem/desaparecerem suavemente quando são exibidas ou ocultadas
Comment[ro]=Face indiciile să se (de)coloreze când sunt arătate sau ascunse
Comment[ru]=Всплывающие окна при закрытии будут становиться всё более прозрачными, а потом совсем исчезать
Comment[sk]=Okná sa plynule objavia/zmiznú pri ich zobrazení alebo skrytí
Comment[sl]=Okna se pojavijo in izginejo postopoma, kadar se pokažejo ali skrijejo

View File

@ -28,7 +28,7 @@ namespace KWin
FlipSwitchEffect::FlipSwitchEffect()
: m_selectedWindow(nullptr)
, m_currentAnimationShape(QTimeLine::EaseInOutCurve)
, m_currentAnimationEasingCurve(QEasingCurve::InOutSine)
, m_active(false)
, m_start(false)
, m_stop(false)
@ -307,11 +307,11 @@ void FlipSwitchEffect::postPaintScreen()
m_animation = true;
m_timeLine.setCurrentTime(0);
if (m_scheduledDirections.count() == 1) {
m_currentAnimationShape = QTimeLine::EaseOutCurve;
m_timeLine.setCurveShape(m_currentAnimationShape);
m_currentAnimationEasingCurve = QEasingCurve::OutSine;
m_timeLine.setEasingCurve(m_currentAnimationEasingCurve);
} else {
m_currentAnimationShape = QTimeLine::LinearCurve;
m_timeLine.setCurveShape(m_currentAnimationShape);
m_currentAnimationEasingCurve = QEasingCurve::Linear;
m_timeLine.setEasingCurve(m_currentAnimationEasingCurve);
}
}
effects->addRepaintFull();
@ -334,13 +334,13 @@ void FlipSwitchEffect::postPaintScreen()
} else {
if (m_scheduledDirections.count() == 1) {
if (m_stop)
m_currentAnimationShape = QTimeLine::LinearCurve;
m_currentAnimationEasingCurve = QEasingCurve::Linear;
else
m_currentAnimationShape = QTimeLine::EaseOutCurve;
m_currentAnimationEasingCurve = QEasingCurve::OutSine;
} else {
m_currentAnimationShape = QTimeLine::LinearCurve;
m_currentAnimationEasingCurve = QEasingCurve::Linear;
}
m_timeLine.setCurveShape(m_currentAnimationShape);
m_timeLine.setEasingCurve(m_currentAnimationEasingCurve);
}
}
if (m_start || m_stop || m_animation)
@ -515,7 +515,7 @@ void FlipSwitchEffect::setActive(bool activate, FlipSwitchMode mode)
effects->setActiveFullScreenEffect(this);
m_active = true;
m_start = true;
m_startStopTimeLine.setCurveShape(QTimeLine::EaseInOutCurve);
m_startStopTimeLine.setEasingCurve(QEasingCurve::InOutSine);
m_activeScreen = effects->activeScreen();
m_screenArea = effects->clientArea(ScreenArea, m_activeScreen, effects->currentDesktop());
@ -623,16 +623,16 @@ void FlipSwitchEffect::setActive(bool activate, FlipSwitchMode mode)
}
m_stop = true;
if (m_animation) {
m_startStopTimeLine.setCurveShape(QTimeLine::EaseOutCurve);
m_startStopTimeLine.setEasingCurve(QEasingCurve::OutSine);
if (m_scheduledDirections.count() == 1) {
if (m_currentAnimationShape == QTimeLine::EaseInOutCurve)
m_currentAnimationShape = QTimeLine::EaseInCurve;
else if (m_currentAnimationShape == QTimeLine::EaseOutCurve)
m_currentAnimationShape = QTimeLine::LinearCurve;
m_timeLine.setCurveShape(m_currentAnimationShape);
if (m_currentAnimationEasingCurve == QEasingCurve::InOutSine)
m_currentAnimationEasingCurve = QEasingCurve::InSine;
else if (m_currentAnimationEasingCurve == QEasingCurve::OutSine)
m_currentAnimationEasingCurve = QEasingCurve::Linear;
m_timeLine.setEasingCurve(m_currentAnimationEasingCurve);
}
} else
m_startStopTimeLine.setCurveShape(QTimeLine::EaseInOutCurve);
m_startStopTimeLine.setEasingCurve(QEasingCurve::InOutSine);
effects->stopMouseInterception(this);
if (m_hasKeyboardGrab) {
effects->ungrabKeyboard();
@ -703,15 +703,15 @@ void FlipSwitchEffect::scheduleAnimation(const SwitchingDirection& direction, in
{
if (m_start) {
// start is still active so change the shape to have a nice transition
m_startStopTimeLine.setCurveShape(QTimeLine::EaseInCurve);
m_startStopTimeLine.setEasingCurve(QEasingCurve::InSine);
}
if (!m_animation && !m_start) {
m_animation = true;
m_scheduledDirections.enqueue(direction);
distance--;
// reset shape just to make sure
m_currentAnimationShape = QTimeLine::EaseInOutCurve;
m_timeLine.setCurveShape(m_currentAnimationShape);
m_currentAnimationEasingCurve = QEasingCurve::InOutSine;
m_timeLine.setEasingCurve(m_currentAnimationEasingCurve);
}
for (int i = 0; i < distance; i++) {
if (m_scheduledDirections.count() > 1 && m_scheduledDirections.last() != direction)
@ -725,20 +725,20 @@ void FlipSwitchEffect::scheduleAnimation(const SwitchingDirection& direction, in
}
}
if (m_scheduledDirections.count() > 1) {
QTimeLine::CurveShape newShape = QTimeLine::EaseInOutCurve;
switch(m_currentAnimationShape) {
case QTimeLine::EaseInOutCurve:
newShape = QTimeLine::EaseInCurve;
QEasingCurve curve;
switch (m_currentAnimationEasingCurve.type()) {
case QEasingCurve::InOutSine:
curve = QEasingCurve::InSine;
break;
case QTimeLine::EaseOutCurve:
newShape = QTimeLine::LinearCurve;
case QEasingCurve::OutSine:
curve = QEasingCurve::Linear;
break;
default:
newShape = m_currentAnimationShape;
curve = m_currentAnimationEasingCurve;
}
if (newShape != m_currentAnimationShape) {
m_currentAnimationShape = newShape;
m_timeLine.setCurveShape(m_currentAnimationShape);
if (m_currentAnimationEasingCurve != curve) {
m_currentAnimationEasingCurve = curve;
m_timeLine.setEasingCurve(curve);
}
}
}

View File

@ -111,7 +111,7 @@ private:
EffectWindow* m_selectedWindow;
QTimeLine m_timeLine;
QTimeLine m_startStopTimeLine;
QTimeLine::CurveShape m_currentAnimationShape;
QEasingCurve m_currentAnimationEasingCurve;
QRect m_screenArea;
int m_activeScreen;
bool m_active;

View File

@ -54,7 +54,7 @@ Name[pa]=ਫਲਿੱਪ ਸਵਿੱਚ
Name[pl]=Przełączanie przebierane
Name[pt]=Mudança em Pilha
Name[pt_BR]=Mudança em pilha
Name[ro]=Comutare cu întoarcere
Name[ro]=Schimbare cu întoarcere
Name[ru]=Перелистывание
Name[si]=උඩට ගැනීම් මාරුව
Name[sk]=Prepínať v kartotéke

View File

@ -25,6 +25,7 @@ Name[nn]=Fjern fargemetting på ikkje-responsive program
Name[pl]=Odbarwienie nieodpowiadających aplikacji
Name[pt]=Reduzir a Saturação das Aplicações Bloqueadas
Name[pt_BR]=Reduzir saturação de aplicativos que não respondem
Name[ro]=Desaturează aplicațiile ce nu răspund
Name[ru]=Обесцвечивание зависших приложений
Name[sk]=Desaturovať neodpovedajúce aplikácie
Name[sl]=Zmanjšaj nasičenost neodzivnih programov
@ -65,6 +66,7 @@ Comment[nn]=Fjern fargemetting på vindauge på program som ikkje lenger reagere
Comment[pl]=Odbarwia okna nieodpowiadających (zawieszonych) aplikacji
Comment[pt]=Reduzir a saturação das janelas das aplicações sem resposta (bloqueadas)
Comment[pt_BR]=Reduzir saturação de janelas de aplicativos que não respondem (travados)
Comment[ro]=Desaturează ferestrele aplicațiilor ce nu răspund (înghețate)
Comment[ru]=Обесцвечивание окон приложений, не отвечающих на запросы
Comment[sk]=Desaturovať okná neodpovedajúcich aplikácií
Comment[sl]=Zmanjšaj nasičenost oken neodzivnih (zamrznjenih) programov

View File

@ -1,11 +1,21 @@
[Desktop Entry]
Comment=Animation for a window going to and leaving full screen mode
Comment[ca]=Animació per a una finestra que entra o abandona el mode de pantalla completa
Comment[en_GB]=Animation for a window going to and leaving full screen mode
Comment[es]=Animación para una ventana que entra en el modo de pantalla completa o sale de él
Comment[et]=Täisekraanirežiimi mineva või sealt väljuva akna animatsioon
Comment[eu]=Pantaila-osoko modutik/modura aldatzen den leiho baten animazioa
Comment[fi]=Animointi ikkunalle, joka siirtyy tai poistuu koko näytön tilasta
Comment[fr]=Animation pour une fenêtre basculant vers ou sortant du mode « Plein écran »
Comment[ia]=Animation per un fenestra va a e abandona modo de schermo plen
Comment[it]=Animazione per una finestra che entra e esce dalla modalità a schermo intero
Comment[ko]=창이 전체 화면 모드로 진입하거나 벗어날 때 사용할 애니메이션
Comment[nl]=Animatie voor een venster dat gaat naar volledig scherm en deze verlaat
Comment[nn]=Animasjon for vindauge som går til eller frå fullskjermsmodus
Comment[pl]=Animacja dla okna wchodzącego i wychodzącego z trybu pełnego ekranu
Comment[pt]=Animação para uma janela que vai entrar/sair do modo de ecrã completo
Comment[pt_BR]=Animação para uma janela indo e saindo do modo de tela cheia
Comment[ro]=Animație pentru o fereastră ce intră sau iese din regim de ecran complet
Comment[sk]=Animácia pre okno smerujúce do a opúšťajúce režim celej obrazovky
Comment[sl]=Animacija za razpenjanje ali zapuščanje čez zaslon razpetega okna
Comment[sv]=Animering för ett fönster till och från fullskärmsläge
@ -14,12 +24,23 @@ Comment[x-test]=xxAnimation for a window going to and leaving full screen modexx
Icon=preferences-system-windows-effect-fullscreen
Name=Full Screen
Name[ca]=Pantalla completa
Name[cs]=Celá obrazovka
Name[de]=Vollbild
Name[en_GB]=Full Screen
Name[es]=Pantalla completa
Name[et]=Täisekraan
Name[eu]=Pantaila-betea
Name[fi]=Koko näyttö
Name[fr]=Plein écran
Name[ia]=Schermo plen
Name[it]=Schermo intero
Name[ko]=전체 화면
Name[nl]=Volledig scherm
Name[nn]=Fullskjerm
Name[pl]=Pełny ekran
Name[pt]=Ecrã Completo
Name[pt_BR]=Tela inteira
Name[ro]=Ecran complet
Name[sk]=Celá obrazovka
Name[sl]=Celotni zaslon
Name[sv]=Fullskärm

View File

@ -0,0 +1,37 @@
#######################################
# Effect
#######################################
# Config
set(kwin_icc_config_SRCS icc_config.cpp)
ki18n_wrap_ui(kwin_icc_config_SRCS icc_config.ui)
qt5_add_dbus_interface(kwin_icc_config_SRCS ${kwin_effects_dbus_xml} kwineffects_interface)
kconfig_add_kcfg_files(kwin_icc_config_SRCS iccconfig.kcfgc)
add_library(kwin_icc_config MODULE ${kwin_icc_config_SRCS})
## Build separate plugin
#find_package(PkgConfig)
#pkg_check_modules(LCMS2 REQUIRED lcms2)
#set_package_properties(LCMS2 PROPERTIES TYPE REQUIRED PURPOSE "Required for ICC color correction.")
#
#kwin4_add_effect(icc icc.cpp)
#target_link_libraries(kwin4_effect_icc PUBLIC ${LCMS2_LIBRARIES})
#target_include_directories(kwin4_effect_icc PUBLIC ${LCMS2_INCLUDE_DIRS})
#target_compile_options(kwin4_effect_icc PUBLIC ${LCMS2_CFLAGS_OTHER})
target_link_libraries(kwin_icc_config
KF5::ConfigWidgets
KF5::I18n
KF5::Service
KF5::XmlGui
)
kcoreaddons_desktop_to_json(kwin_icc_config icc_config.desktop SERVICE_TYPES kcmodule.desktop)
install(
TARGETS
kwin_icc_config
DESTINATION
${PLUGIN_INSTALL_DIR}/kwin/effects/configs
)

View File

@ -0,0 +1,26 @@
uniform sampler2D sampler;
varying vec2 texcoord0;
uniform sampler3D clut;
uniform vec4 modulation;
uniform float saturation;
void main()
{
vec4 tex = texture2D(sampler, texcoord0);
if (saturation != 1.0) {
vec3 desaturated = tex.rgb * vec3( 0.30, 0.59, 0.11 );
desaturated = vec3( dot( desaturated, tex.rgb ));
tex.rgb = tex.rgb * vec3( saturation ) + desaturated * vec3( 1.0 - saturation );
}
tex.rgb = texture3D(clut, tex.rgb).rgb;
tex *= modulation;
tex.rgb *= tex.a;
gl_FragColor = tex;
}

View File

@ -0,0 +1,29 @@
#version 140
uniform sampler2D sampler;
in vec2 texcoord0;
uniform sampler3D clut;
out vec4 fragColor;
uniform vec4 modulation;
uniform float saturation;
void main()
{
vec4 tex = texture(sampler, texcoord0);
if (saturation != 1.0) {
vec3 desaturated = tex.rgb * vec3( 0.30, 0.59, 0.11 );
desaturated = vec3( dot( desaturated, tex.rgb ));
tex.rgb = tex.rgb * vec3( saturation ) + desaturated * vec3( 1.0 - saturation );
}
tex.rgb = texture(clut, tex.rgb).rgb;
tex *= modulation;
tex.rgb *= tex.a;
fragColor = tex;
}

242
effects/icc/icc.cpp Normal file
View File

@ -0,0 +1,242 @@
/********************************************************************
KWin - the KDE window manager
This file is part of the KDE project.
Copyright (C) 2019 Vitaliy Filippov <vitalif@yourcmc.ru>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*********************************************************************/
#include "icc.h"
#include "iccconfig.h"
#include "kwinglplatform.h"
#include "lcms2.h"
#include <QAction>
#include <QFile>
#include <KGlobalAccel>
#include <KLocalizedString>
#include <QStandardPaths>
static const int LUT_POINTS = 64;
namespace KWin
{
ICCEffect::ICCEffect()
: m_valid(false),
m_shader(NULL),
m_texture(0),
m_clut(NULL)
{
initConfig<ICCConfig>();
reconfigure(ReconfigureAll);
}
ICCEffect::~ICCEffect()
{
if (m_shader)
delete m_shader;
if (m_clut)
delete[] m_clut;
if (m_texture != 0)
glDeleteTextures(1, &m_texture);
}
bool ICCEffect::supported()
{
return effects->compositingType() == OpenGL2Compositing;
}
void ICCEffect::reconfigure(ReconfigureFlags flags)
{
Q_UNUSED(flags)
ICCConfig::self()->read();
m_sourceICC = ICCConfig::self()->sourceICC().trimmed();
m_targetICC = ICCConfig::self()->targetICC().trimmed();
loadData();
effects->addRepaintFull();
}
bool ICCEffect::loadData()
{
m_valid = false;
if (m_shader)
delete m_shader;
if (m_clut)
delete[] m_clut;
if (m_texture != 0)
glDeleteTextures(1, &m_texture);
m_shader = ShaderManager::instance()->generateShaderFromResources(ShaderTrait::MapTexture, QString(), QStringLiteral("icc.frag"));
if (!m_shader->isValid())
{
qCCritical(KWINEFFECTS) << "The shader failed to load!";
return false;
}
ShaderManager::instance()->pushShader(m_shader);
m_shader->setUniform("clut", 3); // GL_TEXTURE3
ShaderManager::instance()->popShader();
m_clut = makeCLUT(m_sourceICC.trimmed().isEmpty() ? NULL : m_sourceICC.toLocal8Bit().data(), m_targetICC.toLocal8Bit().data());
if (m_clut)
{
m_texture = setupCCTexture(m_clut);
if (m_texture)
{
m_valid = true;
return true;
}
}
return false;
}
uint8_t *ICCEffect::makeCLUT(const char* source_icc, const char* target_icc)
{
uint8_t *clut = NULL, *clut_source = NULL;
cmsHPROFILE source, target;
cmsHTRANSFORM transform;
source = source_icc ? cmsOpenProfileFromFile(source_icc, "r") : cmsCreate_sRGBProfile();
if (!source)
goto free_nothing;
target = cmsOpenProfileFromFile(target_icc, "r");
if (!target)
goto free_source;
transform = cmsCreateTransform(
source, TYPE_RGB_8, target, TYPE_RGB_8,
INTENT_RELATIVE_COLORIMETRIC, cmsFLAGS_BLACKPOINTCOMPENSATION
);
if (!transform)
goto free_target;
clut_source = new uint8_t[LUT_POINTS*LUT_POINTS*LUT_POINTS*3];
if (!clut_source)
goto free_transform;
for (int b = 0, addr = 0; b < LUT_POINTS; b++)
{
for (int g = 0; g < LUT_POINTS; g++)
{
for (int r = 0; r < LUT_POINTS; r++, addr += 3)
{
clut_source[addr] = 255*r/(LUT_POINTS-1);
clut_source[addr+1] = 255*g/(LUT_POINTS-1);
clut_source[addr+2] = 255*b/(LUT_POINTS-1);
}
}
}
clut = new uint8_t[LUT_POINTS*LUT_POINTS*LUT_POINTS*3];
if (!clut)
goto free_clut_source;
cmsDoTransform(transform, clut_source, clut, LUT_POINTS*LUT_POINTS*LUT_POINTS);
/*for (int b = 0, addr = 0; b < LUT_POINTS; b++)
{
for (int g = 0; g < LUT_POINTS; g++)
{
for (int r = 0; r < LUT_POINTS; r++, addr += 3)
{
printf("cLUT %02x%02x%02x -> %02x%02x%02x\n", 255*r/(LUT_POINTS-1), 255*g/(LUT_POINTS-1), 255*b/(LUT_POINTS-1), clut[addr], clut[addr+1], clut[addr+2]);
}
}
}*/
free_clut_source:
delete[] clut_source;
free_transform:
cmsDeleteTransform(transform);
free_target:
cmsCloseProfile(target);
free_source:
cmsCloseProfile(source);
free_nothing:
return clut;
}
GLuint ICCEffect::setupCCTexture(uint8_t *clut)
{
GLenum err = glGetError();
GLuint texture;
glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_3D, texture);
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexImage3D(GL_TEXTURE_3D, 0, GL_RGB8,
LUT_POINTS, LUT_POINTS, LUT_POINTS,
0, GL_RGB, GL_UNSIGNED_BYTE, clut);
if ((err = glGetError()) != GL_NO_ERROR)
{
glDeleteTextures(1, &texture);
return 0;
}
return texture;
}
void ICCEffect::drawWindow(EffectWindow* w, int mask, const QRegion &region, WindowPaintData& data)
{
if (m_valid)
{
glActiveTexture(GL_TEXTURE3);
glBindTexture(GL_TEXTURE_3D, m_texture);
glActiveTexture(GL_TEXTURE0);
ShaderManager *shaderManager = ShaderManager::instance();
shaderManager->pushShader(m_shader);
data.shader = m_shader;
}
effects->drawWindow(w, mask, region, data);
if (m_valid)
{
ShaderManager::instance()->popShader();
}
}
void ICCEffect::paintEffectFrame(KWin::EffectFrame* frame, const QRegion &region, double opacity, double frameOpacity)
{
if (m_valid)
{
glActiveTexture(GL_TEXTURE3);
glBindTexture(GL_TEXTURE_3D, m_texture);
glActiveTexture(GL_TEXTURE0);
frame->setShader(m_shader);
ShaderBinder binder(m_shader);
effects->paintEffectFrame(frame, region, opacity, frameOpacity);
}
else
{
effects->paintEffectFrame(frame, region, opacity, frameOpacity);
}
}
bool ICCEffect::isActive() const
{
return m_valid;
}
} // namespace

78
effects/icc/icc.h Normal file
View File

@ -0,0 +1,78 @@
/********************************************************************
KWin - the KDE window manager
This file is part of the KDE project.
Copyright (C) 2019 Vitaliy Filippov <vitalif@yourcmc.ru>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*********************************************************************/
#ifndef KWIN_ICC_H
#define KWIN_ICC_H
#include <kwineffects.h>
#include "kwinglutils.h"
namespace KWin
{
class GLShader;
/**
* Applies cLUT (32x32x32 RGB LUT)-based color correction to the whole desktop
* cLUT is generated from a pair of ICC profiles using LCMS2
*/
class ICCEffect
: public Effect
{
Q_OBJECT
public:
ICCEffect();
~ICCEffect();
void reconfigure(ReconfigureFlags flags) override;
void drawWindow(EffectWindow* w, int mask, const QRegion &region, WindowPaintData& data) override;
void paintEffectFrame(KWin::EffectFrame* frame, const QRegion &region, double opacity, double frameOpacity) override;
bool isActive() const override;
int requestedEffectChainPosition() const override;
static bool supported();
public Q_SLOTS:
protected:
bool loadData();
private:
bool m_inited;
bool m_valid;
QString m_sourceICC;
QString m_targetICC;
GLShader* m_shader;
GLuint m_texture;
uint8_t *m_clut;
uint8_t *makeCLUT(const char* source_icc, const char* target_icc);
GLuint setupCCTexture(uint8_t *clut);
};
inline int ICCEffect::requestedEffectChainPosition() const
{
return 98;
}
} // namespace
#endif

15
effects/icc/icc.kcfg Normal file
View File

@ -0,0 +1,15 @@
<?xml version="1.0" encoding="UTF-8"?>
<kcfg xmlns="http://www.kde.org/standards/kcfg/1.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.kde.org/standards/kcfg/1.0
http://www.kde.org/standards/kcfg/1.0/kcfg.xsd" >
<kcfgfile arg="true"/>
<group name="Effect-ICC">
<entry name="SourceICC" type="String">
<default></default>
</entry>
<entry name="TargetICC" type="String">
<default></default>
</entry>
</group>
</kcfg>

View File

@ -0,0 +1,82 @@
/********************************************************************
KWin - the KDE window manager
This file is part of the KDE project.
Copyright (C) 2019 Vitaliy Filippov <vitalif@yourcmc.ru>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*********************************************************************/
#include "icc_config.h"
#include <kwineffects_interface.h>
#include "iccconfig.h"
#include <config-kwin.h>
#include <QAction>
#include <KLocalizedString>
#include <KActionCollection>
#include <KAboutData>
#include <KPluginFactory>
#include <QVBoxLayout>
K_PLUGIN_FACTORY_WITH_JSON(ICCEffectConfigFactory,
"icc_config.json",
registerPlugin<KWin::ICCEffectConfig>();)
namespace KWin
{
ICCEffectConfig::ICCEffectConfig(QWidget* parent, const QVariantList& args) :
KCModule(KAboutData::pluginData(QStringLiteral("icc")), parent, args)
{
ui.setupUi(this);
ICCConfig::instance(KWIN_CONFIG);
addConfig(ICCConfig::self(), this);
load();
}
ICCEffectConfig::~ICCEffectConfig()
{
// Undo unsaved changes
}
void ICCEffectConfig::load()
{
KCModule::load();
emit changed(false);
}
void ICCEffectConfig::save()
{
KCModule::save();
emit changed(false);
OrgKdeKwinEffectsInterface interface(QStringLiteral("org.kde.KWin"),
QStringLiteral("/Effects"),
QDBusConnection::sessionBus());
interface.reconfigureEffect(QStringLiteral("icc"));
}
void ICCEffectConfig::defaults()
{
emit changed(true);
}
} // namespace
#include "icc_config.moc"

View File

@ -0,0 +1,9 @@
[Desktop Entry]
Type=Service
X-KDE-ServiceTypes=KCModule
X-KDE-Library=kwin_icc_config
X-KDE-ParentComponents=icc
Name=ICC color correction
Name[ru]=ICC цветокоррекция

48
effects/icc/icc_config.h Normal file
View File

@ -0,0 +1,48 @@
/********************************************************************
KWin - the KDE window manager
This file is part of the KDE project.
Copyright (C) 2019 Vitaliy Filippov <vitalif@yourcmc.ru>
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*********************************************************************/
#ifndef KWIN_ICC_CONFIG_H
#define KWIN_ICC_CONFIG_H
#include <kcmodule.h>
#include "ui_icc_config.h"
namespace KWin
{
class ICCEffectConfig : public KCModule
{
Q_OBJECT
public:
explicit ICCEffectConfig(QWidget* parent = 0, const QVariantList& args = QVariantList());
~ICCEffectConfig();
public Q_SLOTS:
virtual void save();
virtual void load();
virtual void defaults();
private:
::Ui::ICCEffectConfig ui;
};
} // namespace
#endif

59
effects/icc/icc_config.ui Normal file
View File

@ -0,0 +1,59 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>ICCEffectConfig</class>
<widget class="QWidget" name="ICCEffectConfig">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>642</width>
<height>107</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<layout class="QFormLayout" name="iccForm">
<property name="labelAlignment">
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
</property>
<item row="0" column="0">
<widget class="QLabel" name="sourceICCProfileLabel">
<property name="text">
<string>Source ICC profile file:</string>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QLineEdit" name="kcfg_SourceICC">
<property name="text">
<string/>
</property>
<property name="placeholderText">
<string>leave empty to use sRGB (default color space)</string>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="targetICCProfileLabel">
<property name="text">
<string>Target ICC profile file:</string>
</property>
<property name="alignment">
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QLineEdit" name="kcfg_TargetICC">
<property name="placeholderText">
<string>select your display's ICC profile here</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
<resources/>
<connections/>
</ui>

View File

@ -0,0 +1,5 @@
File=icc.kcfg
ClassName=ICCConfig
NameSpace=KWin
Singleton=true
Mutators=true

View File

@ -26,6 +26,7 @@ Name[nn]=Logg ut
Name[pl]=Wylogowywanie
Name[pt]=Encerrar
Name[pt_BR]=Encerrar sessão
Name[ro]=Ieșire din sistem
Name[ru]=Завершение работы
Name[sk]=Odhlásiť sa
Name[sl]=Odjava
@ -61,6 +62,7 @@ Comment[nn]=Ton ut til utloggingsbiletet
Comment[pl]=Płynne zanikanie do ekranu wylogowywania
Comment[pt]=Desvanecer suavemente para o ecrã de encerramento
Comment[pt_BR]=Suaviza o desaparecimento para a tela de encerramento da sessão
Comment[ro]=Estompează lin spre ecranul de ieșire
Comment[ru]=Плавное появление экрана завершения работы
Comment[sk]=Plynule zobrazí plochu pri odhlásení
Comment[sl]=Postopoma okno zbledi v zaslon za odjavo

View File

@ -59,7 +59,7 @@ Name[pa]=ਸ਼ੀਸ਼ਾ ਵੇਖਣਾ
Name[pl]=Lupa
Name[pt]=Aparência de Vidro
Name[pt_BR]=Espelho
Name[ro]=Binoclu
Name[ro]=Lentilă
Name[ru]=Линза
Name[se]=Stuoridanláse
Name[si]=වීදුරු ලෙස පෙනෙන

View File

@ -140,13 +140,13 @@ void MagicLampEffect::paintWindow(EffectWindow* w, int mask, QRegion region, Win
QRect panelScreen = effects->clientArea(ScreenArea, panel);
if (panel->width() >= panel->height()) {
// horizontal panel
if (panel->y() == panelScreen.y())
if (panel->y() <= panelScreen.height()/2)
position = Top;
else
position = Bottom;
} else {
// vertical panel
if (panel->x() == panelScreen.x())
if (panel->x() <= panelScreen.width()/2)
position = Left;
else
position = Right;

View File

@ -64,6 +64,7 @@ Name[nn]=Formendring for sprettoppvindauge
Name[pl]=Zmiennokształtne elementy pomocnicze
Name[pt]=Mensagens com mudança de forma
Name[pt_BR]=Mensagens com mudança de forma
Name[ro]=Indicii în schimbare
Name[ru]=Анимация преобразования всплывающих окон
Name[sk]=Vysúvať vyskakovacie okná
Name[sl]=Prehajajoča pojavna okna

View File

@ -25,6 +25,7 @@ Name[nn]=Skalering
Name[pl]=Skalowanie
Name[pt]=Escala
Name[pt_BR]=Escala
Name[ro]=Scalare
Name[ru]=Масштабирование
Name[sk]=Škálovať
Name[sl]=Merilo
@ -58,6 +59,7 @@ Comment[nn]=Skaler vindauge jamt inn og ut når dei vert viste eller gøymde
Comment[pl]=Okna gładko pomniejszają się przy otwieraniu i powiększają przy zamykaniu
Comment[pt]=Fazer com que as janelas apareçam/desapareçam suavemente quando aparecem ou ficam escondidas
Comment[pt_BR]=Faz com que as janelas aumentem ou reduzam o seu tamanho de forma suave ao serem exibidas ou ocultadas
Comment[ro]=Face ferestrele să se scaleze lin când sunt arătate sau ascunse
Comment[ru]=Плавное увеличение или уменьшение окон при их появлении и скрытии
Comment[sk]=Okná sa plynule objavia/zmiznú pri ich zobrazení alebo skrytí
Comment[sl]=Okna se pojavijo in izginejo postopoma kadar se prikažejo ali skrijejo

View File

@ -506,9 +506,14 @@ bool ScreenShotEffect::checkCall() const
QString ScreenShotEffect::interactive(int mask)
{
if (!checkCall()) {
if (!calledFromDBus()) {
return QString();
}
if (isTakingScreenshot()) {
sendErrorReply(s_errorAlreadyTaking, s_errorAlreadyTakingMsg);
return QString();
}
m_type = (ScreenShotType) mask;
m_windowMode = WindowMode::File;
m_replyMessage = message();
@ -532,9 +537,14 @@ QString ScreenShotEffect::interactive(int mask)
void ScreenShotEffect::interactive(QDBusUnixFileDescriptor fd, int mask)
{
if (!checkCall()) {
if (!calledFromDBus()) {
return;
}
if (isTakingScreenshot()) {
sendErrorReply(s_errorAlreadyTaking, s_errorAlreadyTakingMsg);
return;
}
m_fd = dup(fd.fileDescriptor());
if (m_fd == -1) {
sendErrorReply(s_errorFd, s_errorFdMsg);
@ -684,15 +694,12 @@ QImage ScreenShotEffect::blitScreenshot(const QRect &geometry, const qreal scale
QImage img;
if (effects->isOpenGLCompositing())
{
int width = geometry.width();
int height = geometry.height();
const QSize nativeSize = geometry.size() * scale;
if (GLRenderTarget::blitSupported() && !GLPlatform::instance()->isGLES()) {
width = static_cast<int>(width * scale);
height = static_cast<int>(height * scale);
img = QImage(width, height, QImage::Format_ARGB32);
GLTexture tex(GL_RGBA8, width, height);
img = QImage(nativeSize.width(), nativeSize.height(), QImage::Format_ARGB32);
GLTexture tex(GL_RGBA8, nativeSize.width(), nativeSize.height());
GLRenderTarget target(tex);
target.blitFromFramebuffer(geometry);
// copy content from framebuffer into image
@ -700,10 +707,10 @@ QImage ScreenShotEffect::blitScreenshot(const QRect &geometry, const qreal scale
glGetTexImage(GL_TEXTURE_2D, 0, GL_RGBA, GL_UNSIGNED_BYTE, static_cast<GLvoid*>(img.bits()));
tex.unbind();
} else {
img = QImage(width, height, QImage::Format_ARGB32);
glReadPixels(0, 0, width, height, GL_RGBA, GL_UNSIGNED_BYTE, (GLvoid*)img.bits());
img = QImage(nativeSize.width(), nativeSize.height(), QImage::Format_ARGB32);
glReadPixels(0, 0, nativeSize.width(), nativeSize.height(), GL_RGBA, GL_UNSIGNED_BYTE, (GLvoid*)img.bits());
}
ScreenShotEffect::convertFromGLImage(img, width, height);
ScreenShotEffect::convertFromGLImage(img, nativeSize.width(), nativeSize.height());
}
#ifdef KWIN_HAVE_XRENDER_COMPOSITING

View File

@ -22,6 +22,7 @@ Name[nn]=Avslutt økt
Name[pl]=Opuszczenie sesji
Name[pt]=Saída da Sessão
Name[pt_BR]=Saída da sessão
Name[ro]=Părăsirea sesiunii
Name[ru]=Завершение сеанса
Name[sk]=Ukončenie sedenia
Name[sl]=Zapri sejo
@ -51,6 +52,7 @@ Comment[nn]=Hald skrivebordsbakgrunnen i live heilt til utlogginga er fullført
Comment[pl]=Utrzymuj tło pulpitu podczas wylogowania, aż do końca
Comment[pt]=Manter o fundo do ecrã activo durante a saída da sessão até ao fim
Comment[pt_BR]=Mantém ativo o fundo da área de trabalho até o fim do fechamento da sessão
Comment[ro]=Păstrează viu fundalul biroului în timpul ieșirii din sesiune până la capăt
Comment[ru]=Сохранение фона рабочего стола до окончания завершения сеанса
Comment[sk]=Ponechať pozadie plochy aktívne počas odhlásenia do skončenia
Comment[sl]=Pusti ozadje namizja živo ob odjavi do konca

View File

@ -6,6 +6,7 @@
<file alias="cylinder.vert">cube/data/1.10/cylinder.vert</file>
<file alias="sphere.vert">cube/data/1.10/sphere.vert</file>
<file alias="invert.frag">invert/data/1.10/invert.frag</file>
<file alias="icc.frag">icc/data/1.10/icc.frag</file>
<file alias="lookingglass.frag">lookingglass/data/1.10/lookingglass.frag</file>
<file alias="blinking-startup-fragment.glsl">startupfeedback/data/1.10/blinking-startup-fragment.glsl</file>
</qresource>
@ -16,6 +17,7 @@
<file alias="cylinder.vert">cube/data/1.40/cylinder.vert</file>
<file alias="sphere.vert">cube/data/1.40/sphere.vert</file>
<file alias="invert.frag">invert/data/1.40/invert.frag</file>
<file alias="icc.frag">icc/data/1.40/icc.frag</file>
<file alias="lookingglass.frag">lookingglass/data/1.40/lookingglass.frag</file>
<file alias="blinking-startup-fragment.glsl">startupfeedback/data/1.40/blinking-startup-fragment.glsl</file>
</qresource>

View File

@ -62,7 +62,7 @@ Name[pa]=FPS ਵੇਖੋ
Name[pl]=Pokaż ilość klatek na sekundę
Name[pt]=Mostrar as IPS
Name[pt_BR]=Mostrar FPS
Name[ro]=Afișează CPS
Name[ro]=Arată CPS
Name[ru]=График производительности
Name[se]=Čájet rámmaid sekunddas
Name[si]=FPS පෙන්වන්න

View File

@ -56,7 +56,7 @@ Name[pa]=ਪੇਂਟ ਵੇਖੋ
Name[pl]=Pokaż rysowane
Name[pt]=Mostrar a Pintura
Name[pt_BR]=Mostrar pintura
Name[ro]=Afișează desenele
Name[ro]=Arată vopseaua
Name[ru]=Подсвечивать отрисовку
Name[se]=Čájet málema
Name[si]=ඇඳීම් පෙන්වන්න

View File

@ -41,6 +41,8 @@ SlidingPopupsEffect::SlidingPopupsEffect()
connect(effects, &EffectsHandler::windowClosed, this, &SlidingPopupsEffect::slideOut);
connect(effects, &EffectsHandler::windowDeleted, this, &SlidingPopupsEffect::slotWindowDeleted);
connect(effects, &EffectsHandler::propertyNotify, this, &SlidingPopupsEffect::slotPropertyNotify);
connect(effects, &EffectsHandler::windowShown, this, &SlidingPopupsEffect::slideIn);
connect(effects, &EffectsHandler::windowHidden, this, &SlidingPopupsEffect::slideOut);
connect(effects, &EffectsHandler::xcbConnectionChanged, this,
[this] {
m_atom = effects->announceSupportProperty(QByteArrayLiteral("_KDE_SLIDE"), this);

View File

@ -22,6 +22,7 @@ Comment[nn]=Skvis vindauge når dei vert minimerte
Comment[pl]=Ściąga okna przy ich minimalizacji
Comment[pt]=Esmagar as janelas quando são minimizadas
Comment[pt_BR]=Achatar as janelas quando são minimizadas
Comment[ro]=Strivește ferestrele când sunt minimizate
Comment[ru]=Сжатие окна при сворачивании
Comment[sk]=Deformuje okná pri ich minimalizovaní
Comment[sl]=Zmečkaj okna, ko jih strneš
@ -54,6 +55,7 @@ Name[nn]=Skvis
Name[pl]=Ściąganie
Name[pt]=Esmagar
Name[pt_BR]=Achatar
Name[ro]=Strivire
Name[ru]=Сжатие
Name[sk]=Rozpučiť
Name[sl]=Zmečkaj

View File

@ -43,7 +43,7 @@ Name[ja]=サムネイルをわきに表示
Name[kk]=Нобайды шеттеу
Name[km]=រូបភាព​តូចនៅ​ខាង
Name[kn]=ಸೂಚ್ಯಚಿತ್ರ ಬದಿಯಲ್ಲಿ
Name[ko]=미리 보기 그림
Name[ko]=옆쪽에 축소판
Name[lt]=Miniatiūra šone
Name[lv]=Sīktēli malā
Name[mai]=लघुछवि बाजू मे

View File

@ -59,8 +59,10 @@ Comment[ko]=창을 화면 꼭짓점으로 이동
Comment[lt]=Perkelti langus į kampus
Comment[nl]=Verplaats vensters in de hoeken van het scherm
Comment[nn]=Flytt vindauge til skjermhjørne
Comment[pl]=Rozsuwa okna w narożniki ekranu
Comment[pt]=Mover as janelas para os cantos do ecrã
Comment[pt_BR]=Move as janelas para os cantos da tela
Comment[ro]=Mută ferestrele în colțurile ecranului
Comment[ru]=Перемещение окон в углы экрана
Comment[sk]=Presunúť okná do rohov obrazovky
Comment[sl]=Pomakne okna v kote zaslona

View File

@ -67,7 +67,7 @@ Name[pa]=ਜ਼ੂਮ
Name[pl]=Powiększanie
Name[pt]=Ampliação
Name[pt_BR]=Zoom
Name[ro]=Scalare
Name[ro]=Apropiere
Name[ru]=Масштаб
Name[se]=Stuorrudit
Name[si]=විශාලණය

View File

@ -165,18 +165,34 @@ QVector<QByteArray> s_xcbEerrors({
void Workspace::registerEventFilter(X11EventFilter *filter)
{
if (filter->isGenericEvent())
m_genericEventFilters.append(filter);
else
m_eventFilters.append(filter);
if (filter->isGenericEvent()) {
m_genericEventFilters.append(new X11EventFilterContainer(filter));
} else {
m_eventFilters.append(new X11EventFilterContainer(filter));
}
}
static X11EventFilterContainer *takeEventFilter(X11EventFilter *eventFilter,
QList<QPointer<X11EventFilterContainer>> &list)
{
for (int i = 0; i < list.count(); ++i) {
X11EventFilterContainer *container = list.at(i);
if (container->filter() == eventFilter) {
return list.takeAt(i);
}
}
return nullptr;
}
void Workspace::unregisterEventFilter(X11EventFilter *filter)
{
if (filter->isGenericEvent())
m_genericEventFilters.removeOne(filter);
else
m_eventFilters.removeOne(filter);
X11EventFilterContainer *container = nullptr;
if (filter->isGenericEvent()) {
container = takeEventFilter(filter, m_genericEventFilters);
} else {
container = takeEventFilter(filter, m_eventFilters);
}
delete container;
}
@ -219,13 +235,29 @@ bool Workspace::workspaceEvent(xcb_generic_event_t *e)
if (eventType == XCB_GE_GENERIC) {
xcb_ge_generic_event_t *ge = reinterpret_cast<xcb_ge_generic_event_t *>(e);
foreach (X11EventFilter *filter, m_genericEventFilters) {
// We need to make a shadow copy of the event filter list because an activated event
// filter may mutate it by removing or installing another event filter.
const auto eventFilters = m_genericEventFilters;
for (X11EventFilterContainer *container : eventFilters) {
if (!container) {
continue;
}
X11EventFilter *filter = container->filter();
if (filter->extension() == ge->extension && filter->genericEventTypes().contains(ge->event_type) && filter->event(e)) {
return true;
}
}
} else {
foreach (X11EventFilter *filter, m_eventFilters) {
// We need to make a shadow copy of the event filter list because an activated event
// filter may mutate it by removing or installing another event filter.
const auto eventFilters = m_eventFilters;
for (X11EventFilterContainer *container : eventFilters) {
if (!container) {
continue;
}
X11EventFilter *filter = container->filter();
if (filter->eventTypes().contains(eventType) && filter->event(e)) {
return true;
}

View File

@ -32,7 +32,6 @@ InputPanelV1Client::InputPanelV1Client(InputPanelSurfaceV1Interface *panelSurfac
setSkipTaskbar(true);
setPositionSyncMode(SyncMode::Sync);
setSizeSyncMode(SyncMode::Sync);
setupCompositing();
connect(surface(), &SurfaceInterface::aboutToBeDestroyed, this, &InputPanelV1Client::destroyClient);
connect(surface(), &SurfaceInterface::sizeChanged, this, &InputPanelV1Client::reposition);

View File

@ -211,6 +211,11 @@ bool InternalClient::isResizable() const
return true;
}
bool InternalClient::isPlaceable() const
{
return !m_internalWindowFlags.testFlag(Qt::BypassWindowManagerHint) && !m_internalWindowFlags.testFlag(Qt::Popup);
}
bool InternalClient::noBorder() const
{
return m_userNoBorder || m_internalWindowFlags.testFlag(Qt::FramelessWindowHint) || m_internalWindowFlags.testFlag(Qt::Popup);

View File

@ -45,6 +45,7 @@ public:
bool isMovable() const override;
bool isMovableAcrossScreens() const override;
bool isResizable() const override;
bool isPlaceable() const override;
bool noBorder() const override;
bool userCanSetNoBorder() const override;
bool wantsInput() const override;

View File

@ -90,6 +90,7 @@ Comment[pa]=ਡੈਸਕਟਾਪ ਪਰਭਾਵ ਲਈ ਕੰਪੋਜੀਟ
Comment[pl]=Ustawienia kompozytora dla efektów pulpitu
Comment[pt]=Configuração do Compositor para os Efeitos do Ecrã
Comment[pt_BR]=Definições do Compositor para os efeitos da área de trabalho
Comment[ro]=Configurări compozitor pentru efecte de birou
Comment[ru]=Настройка движка эффектов рабочего стола
Comment[sk]=Nastavenia kompozítora pre efekty plochy
Comment[sl]=Nastavitve upravljalnika skladnje za učinke namizja
@ -123,8 +124,10 @@ X-KDE-Keywords[ko]=kwin,window,manager,compositing,effect,3D effects,2D effects,
X-KDE-Keywords[lt]=kwin,langas,langai,tvarkytuvė,tvarkytuve,komponavimas,kompozicionavimas,efektas,efektai,3D efektai,2D efektai,trimačiai efektai,trimaciai efektai,dvimačiai efektai,dvimaciai efektai,OpenGL,XRender,vaizdo nustatymai,vaizdo nuostatos,video nustatymai,video nuostatos,grafiniai efektai,grafikos efektai,darbalaukio efektai,darbastalio efektai
X-KDE-Keywords[nl]=kwin,window,manager,beheerder,compositing,effecten,3D-effecten,2D-effecten,OpenGL,XRender,video-instellingen,grafische effecten,bureaubladeffecten
X-KDE-Keywords[nn]=kwin,vindauge,vindaugshandsamar,samansetjing,effekt,3D-effektar,2D-effektar,OpenGL,XRender,videoinnstillingar,grafiske effektar,skrivebordseffektar
X-KDE-Keywords[pl]=kwin,okno,menadżer,menedżer,zarządca,kompozytor,efekt,efekt 3D,efekt 2D,OpenGL,XRender,ustawienia wideo,efekty graficzne,efekty pulpitu
X-KDE-Keywords[pt]=kwin,janela,gestor,composição,efeito,efeitos 3D,efeitos 2D,OpenGL,XRender,configuração do vídeo,efeitos gráficos,efeitos do ecrã
X-KDE-Keywords[pt_BR]=kwin,janela,gerenciador,composição,efeito,efeitos 3D,efeitos 2D,OpenGL,XRender,configurações de vídeo,efeitos gráficos,efeitos da área de trabalho
X-KDE-Keywords[ro]=kwin,fereastră,gestionar,compoziționare,efect,efecte 3D,OpenGL,XRender,configurări video,efecte grafice,efecte de birou
X-KDE-Keywords[ru]=kwin,window,manager,compositing,effect,3D effects,2D effects,OpenGL,XRender,video settings,graphical effects,desktop effects,композитинг,композитный диспетчер окон,эффекты рабочего стола,графические эффекты,рендеринг,параметры видео,настройка видео
X-KDE-Keywords[sk]=kwin,okno,správca,kompozícia,efekt,3D efekty,2D efekty,OpenGL,XRender,nastavenia videa,grafické efekty,efekty plochy
X-KDE-Keywords[sl]=kwin,okna,upravljalnik,skladnja,učinek,3D učinki,2D učinki,OpenGL,XRender,nastavitve videa,video,grafični učinki,hitrost animacije,učinki namizja

View File

@ -25,7 +25,7 @@ Name[da]=Vinduesdekorationer
Name[de]=Fensterdekoration
Name[el]=Διακοσμήσεις παραθύρου
Name[en_GB]=Window Decorations
Name[es]=Decoración de ventanas
Name[es]=Decoraciones de las ventanas
Name[et]=Akna dekoratsioonid
Name[eu]=Leiho-apaindurak
Name[fi]=Ikkunakehykset
@ -98,6 +98,7 @@ Comment[nn]=Set opp tittellinjer og vindaugsrammer
Comment[pl]=Ustawienia pasków tytułów i obramowań okien
Comment[pt]=Configurar as barras de título e contornos das janelas
Comment[pt_BR]=Configure as barras de títulos e bordas da janela
Comment[ro]=Configurează barele de titlu și contururile ferestrelor
Comment[ru]=Настройка заголовка и границ окон
Comment[sk]=Nastaviť záhlavia a okraje okna
Comment[sl]=Nastavi naslovne vrstice in robove oken
@ -139,6 +140,7 @@ X-KDE-Keywords[nn]=kwin,vindauge,handsamar,ramme,kantlinje,stil,tema,lås,utform
X-KDE-Keywords[pl]=kwin,okno,menadżer,obramowanie,styl,motyw,wygląd,odczucie,układ,przycisk, uchwyt,krawędź,kwm,dekoracja
X-KDE-Keywords[pt]=kwin,gestor,janela,contorno,estilo,tema,aparência,comportamento,disposição,botão,pega,extremo,kwm,decoração
X-KDE-Keywords[pt_BR]=kwin,gerenciador,janela,borda,estilo,tema,aparência,comportamento,layout,botão,canto,extremo,kwm,decoração
X-KDE-Keywords[ro]=kwin,fereastră,gestionar,contur,stil,tematică,aspect,comportament,aranjament,mâner,muchie,margine,kwm,decorație
X-KDE-Keywords[ru]=kwin,window,manager,border,style,theme,look,feel,layout,button,handle,edge,kwm,decoration,окно,диспетчер,граница,стиль,тема,внешний вид,оформление,разметка,шаблон,кнопка,управление,край
X-KDE-Keywords[sk]=kwin,okno,správca,rám,štýl,téma,vzhľad,cítenie,rozloženie,tlačidlo,spracovanie,okraj,kwm,dekorácia
X-KDE-Keywords[sl]=kwin,okna,okenski upravljalnik,upravljalnik oken,rob,obroba,slog,tema,videz,obnašanje,občutek,razpored,gumbi,ročica,okraski,kwm

View File

@ -43,6 +43,9 @@ KCM.GridView {
KDecoration.Settings {
id: settingsItem
bridge: bridgeItem.bridge
Component.onCompleted: {
settingsItem.borderSizesIndex = kcm.borderSize
}
}
KDecoration.Decoration {
id: inactivePreview

View File

@ -27,7 +27,7 @@ Name[da]=Vinduesdekorationer
Name[de]=Fensterdekoration
Name[el]=Διακοσμήσεις παραθύρου
Name[en_GB]=Window Decorations
Name[es]=Decoración de ventanas
Name[es]=Decoraciones de las ventanas
Name[et]=Akna dekoratsioonid
Name[eu]=Leiho-apaindurak
Name[fi]=Ikkunakehykset
@ -99,6 +99,7 @@ Comment[nn]=Set opp tittellinjer og vindaugsrammer
Comment[pl]=Ustawienia pasków tytułów i obramowań okien
Comment[pt]=Configurar as barras de título e contornos das janelas
Comment[pt_BR]=Configure as barras de títulos e bordas da janela
Comment[ro]=Configurează barele de titlu și contururile ferestrelor
Comment[ru]=Настройка заголовка и границ окон
Comment[sk]=Nastaviť záhlavia a okraje okna
Comment[sl]=Nastavi naslovne vrstice in robove oken

View File

@ -11,7 +11,7 @@ Name[da]=Vinduesdekorationer
Name[de]=Fensterdekoration
Name[el]=Διακοσμήσεις παραθύρου
Name[en_GB]=Window Decorations
Name[es]=Decoración de ventanas
Name[es]=Decoraciones de las ventanas
Name[et]=Akna dekoratsioonid
Name[eu]=Leiho-apaindurak
Name[fi]=Ikkunakehykset

View File

@ -98,6 +98,7 @@ Comment[nn]=Set opp navigering, nummer og vising av virtuelle skrivebord
Comment[pl]=Ustawienia poruszania się, liczby oraz układu wirtualnych klawiatur
Comment[pt]=Configura a navegação, número e disposição dos ecrãs virtuais
Comment[pt_BR]=Configura a navegação, quantidade e layout das áreas de trabalho virtuais
Comment[ro]=Configurează navigarea, numărul și aranjamentul birourilor virtuale
Comment[ru]=Число, расположение и способ переключения рабочих столов
Comment[sk]=Nastaviť navigáciu, počet a rozloženie virtuálnych plôch
Comment[sl]=Nastavi krmarjenje, število in razporeditev navideznih namizij
@ -109,7 +110,7 @@ Comment[zh_TW]=設定虛擬桌面的導覽、數字與佈局
X-KDE-Keywords=desktop,desktops,number,virtual desktop,multiple desktops,pager,pager widget,pager applet,pager settings
X-KDE-Keywords[az]=iş masası,iş masaları,sayı,nömrəsi,virtual iş masası,bir neçə iş masası,səhifə,səhifələmə vidjeti,səhifələmə əlavəsi,səhifələmə ayarları
X-KDE-Keywords[bs]=pozadina,pozadine,broj,virtuelna pozadina,višestruka pozadina,pejdžer,dodatak pejdžeru,aplet pejdžer,pejdžer postavke
X-KDE-Keywords[ca]=escriptori,escriptoris,nombre,escriptori virtual,múltiples escriptoris,paginador,estri paginador,miniaplicació de paginació,arranjament del paginador
X-KDE-Keywords[ca]=escriptori,escriptoris,nombre,escriptori virtual,múltiples escriptoris,paginador,giny paginador,miniaplicació de paginació,arranjament del paginador
X-KDE-Keywords[ca@valencia]=escriptori,escriptoris,nombre,escriptori virtual,escriptoris múltiples,paginador,estri paginador,miniaplicació de paginació,arranjament de paginador
X-KDE-Keywords[da]=skrivebord,skriveborde,desktop,desktops,virtuelt skrivebord,flere skriveborde,spaces,pager,skrivebordsvælger,pager widget,pager applet
X-KDE-Keywords[de]=Arbeitsfläche,Arbeitsflächen,Desktop,Anzahl,Virtuelle Arbeitsfläche,Mehrere Arbeitsflächen,Arbeitsflächenumschalter,Arbeitsflächenumschalter-Bedienelement,Arbeitsflächenumschalter-Miniprogramm,Arbeitsflächenumschalter-Einstellungen
@ -137,6 +138,7 @@ X-KDE-Keywords[pa]=ਡੈਸਕਟਾਪ,ਗਿਣਤੀ,ਨੰਬਰ,ਅੰਕ,
X-KDE-Keywords[pl]=pulpit,pulpity,liczba,pulpity wirtualne,wiele pulpitów
X-KDE-Keywords[pt]=ecrã,ecrãs,número,ecrã virtual,múltiplos ecrãs,paginador,elemento paginador,'applet' do paginador,configuração do paginador
X-KDE-Keywords[pt_BR]=área de trabalho,áreas de trabalho,desktop,desktops,número,área de trabalho virtual,múltiplas áreas de trabalho,paginador,elemento paginador,miniaplicativo do paginador,configurações do paginador
X-KDE-Keywords[ro]=birou,birouri,număr,birou virtual,birouri multiple,paginator,control paginator,miniaplicație paginator,configurare paginator,paginare
X-KDE-Keywords[ru]=desktop,desktops,number,virtual desktop,multiple desktops,pager,pager widget,pager applet,pager settings,рабочий стол,рабочие столы,число,виртуальный рабочий стол,несколько рабочих столов,переключатель,переключение,виджет переключения,аплет переключения,параметры переключения,настройки переключения
X-KDE-Keywords[sk]=plocha,plochy,číslo,virtuálna plocha,viac plôch,pager,widget pagera,applet pagera,nastavenia pagera
X-KDE-Keywords[sl]=namizje,namizja,število namizij,navidezna namizja,več namizij,pozivnik

View File

@ -85,6 +85,7 @@ Comment[nn]=Set opp navigering, nummer og vising av virtuelle skrivebord
Comment[pl]=Ustawienia poruszania się, liczby oraz układu wirtualnych klawiatur
Comment[pt]=Configura a navegação, número e disposição dos ecrãs virtuais
Comment[pt_BR]=Configura a navegação, quantidade e layout das áreas de trabalho virtuais
Comment[ro]=Configurează navigarea, numărul și aranjamentul birourilor virtuale
Comment[ru]=Число, расположение и способ переключения рабочих столов
Comment[sk]=Nastaviť navigáciu, počet a rozloženie virtuálnych plôch
Comment[sl]=Nastavi krmarjenje, število in razporeditev navideznih namizij

View File

@ -85,6 +85,7 @@ Comment[nn]=Samansetjarinnstillingar for skrivebordseffektar
Comment[pl]=Ustawienia kompozytora dla efektów pulpitu
Comment[pt]=Configuração do compositor para os efeitos do ecrã
Comment[pt_BR]=Defina as configurações do compositor para os efeitos da área de trabalho
Comment[ro]=Configurează opțiunile compozitorului pentru efecte de birou
Comment[ru]=Настройка движка эффектов рабочего стола
Comment[sk]=Nastavenia kompozítora pre efekty plochy
Comment[sl]=Nastavitve upravljalnika skladnje za učinke namizja
@ -94,7 +95,7 @@ Comment[x-test]=xxConfigure compositor settings for desktop effectsxx
Comment[zh_CN]=配置桌面特效混成器设置
Comment[zh_TW]=設定桌面特效的合成器設定
X-KDE-Keywords=kwin,window,manager,effect,3D effects,2D effects,graphical effects,desktop effects,animations,various animations,window management effects,window switching effect,desktop switching effect,animations,desktop animations,drivers,driver settings,rendering,render,invert effect,looking glass effect,magnifier effect,snap helper effect,track mouse effect,zoom effect,blur effect,fade effect,fade desktop effect,fall apart effect,glide effect,highlight window effect,login effect,logout effect,magic lamp effect,minimize animation effect,mouse mark effect,scale effect,screenshot effect,sheet effect,slide effect,sliding popups effect,thumbnail aside effect,translucency,translucency effect,transparency,window geometry effect,wobbly windows effect,startup feedback effect,dialog parent effect,dim inactive effect,dim screen effect,slide back effect,eye candy,candy,show FPS effect,show paint effect,cover switch effect,desktop cube effect,desktop cube animation effect,desktop grid effect,flip switch effect,present windows effect,resize window effect,background contrast effect
X-KDE-Keywords=kwin,window,manager,effect,3D effects,2D effects,graphical effects,desktop effects,animations,various animations,window management effects,window switching effect,desktop switching effect,animations,desktop animations,drivers,driver settings,rendering,render,icc effect,invert effect,looking glass effect,magnifier effect,snap helper effect,track mouse effect,zoom effect,blur effect,fade effect,fade desktop effect,fall apart effect,glide effect,highlight window effect,login effect,logout effect,magic lamp effect,minimize animation effect,mouse mark effect,scale effect,screenshot effect,sheet effect,slide effect,sliding popups effect,thumbnail aside effect,translucency,translucency effect,transparency,window geometry effect,wobbly windows effect,startup feedback effect,dialog parent effect,dim inactive effect,dim screen effect,slide back effect,eye candy,candy,show FPS effect,show paint effect,cover switch effect,desktop cube effect,desktop cube animation effect,desktop grid effect,flip switch effect,present windows effect,resize window effect,background contrast effect
X-KDE-Keywords[az]=kwin, pəncərə,menecer,effekt,3D effektlər,2D effektlər,qrafik effektlər,iş masası effektləri,animasiyalar,dəyişkən animasiyalar,pəncərə effektləri idarəsi,pəncərə dəyişdirmə effektləri,iş masası dəyişdirmə effektləri,animasiyalar,iş masası animasiyaları,sürücülər,sürücü ayarları,təsvirin işlənməsi,əks effektlər,linza effekti,lupa effekti,qopma effekti,siçanı izləmə effekti,miqyaslama effekti,yayğınlaşma effekti,solma effekti,iş masasının solması effekti,səpələnmə effekti,süzülmə effekti,vurğulama effekti,pəncərə işıqlandırma effekti,giriş effekti,çıxış effekti,sehirli lampa,animasiyalı yığılma,siçanı işarələmək,tor,ekran şəkli,vərəq,sürüşdürmə,sürüşən pəncərələr,yan miniatürləri,şəffaflıq,pəncərə həndəsəsi,titrək pəncərə,dialoq pəncərəsi,tutqunlaşma,pəncərə tutqunlaşması,ekran tutqunlaşması,geriyə sürüşmə,saniyədə kadrlar,ekranda şəkil çəkmə,örtmə,iş masası kubu animasiyası,kitab vərəqləri,pəncərə təqdimatı,pəncərə ölçüsünün dəyişdirilməsi,arxa fon kontrastı
X-KDE-Keywords[ca]=kwin,finestra,gestor,efecte,efectes 3D,efectes 2D,efectes gràfics,efectes d'escriptori,animacions,animacions diverses,efectes en la gestió de les finestres,efecte en el canvi de finestra,efecte en el canvi d'escriptori,animacions,animacions a l'escriptori,controladors,configuració dels controladors,renderització,render,efecte d'inversió,efecte d'aspecte de vidre,efecte de lupa,efecte ajudant del desplaçament,efecte de seguiment del ratolí,efecte de zoom,efecte de difuminat,efecte d'esvaïment,efecte d'esvaïment de l'escriptori,efecte de trencament,efecte de lliscament,efecte de ressaltat de la finestra,efecte en l'inici de la sessió,efecte en sortir de la sessió,efecte de làmpada màgica,efecte d'animació de la minimització,efecte de marca del ratolí,efecte d'apropament,efecte de captura de la pantalla,efecte de full,efecte de diapositiva,efecte de missatges emergents lliscants,efecte de miniatures laterals,translucidesa,efecte de translucidesa,transparència,efecte de geometria de la finestra,efecte de finestres sacsejades,efecte de confirmació d'engegada,efecte de diàleg principal,efecte d'enfosquiment en estar inactiu,efecte d'enfosquiment de la pantalla,efecte de diapositiva prèvia,decoració,efecte per a mostrar els FPS,efecte de mostrar el pintat,efecte de canvi de coberta,efecte de cub de l'escriptori,efecte d'animació del cub de l'escriptori,efecte de quadrícula de l'escriptori,efecte de canvi en roda,efecte de presentació de les finestres,efecte de redimensionat de la finestra,efecte de contrast del fons
X-KDE-Keywords[ca@valencia]=kwin,finestra,gestor,efecte,efectes 3D,efectes 2D,efectes gràfics,efectes d'escriptori,animacions,animacions diverses,efectes en la gestió de les finestres,efecte en el canvi de finestra,efecte en el canvi d'escriptori,animacions,animacions en l'escriptori,controladors,configuració dels controladors,renderització,render,efecte d'inversió,efecte d'aspecte de vidre,efecte de lupa,efecte ajudant del desplaçament,efecte de seguiment del ratolí,efecte de zoom,efecte de difuminat,efecte de fosa,efecte de fosa de l'escriptori,efecte de trencament,efecte de lliscament,efecte de ressaltat de la finestra,efecte en l'inici de la sessió,efecte en eixir de la sessió,efecte de làmpada màgica,efecte d'animació de la minimització,efecte de marca del ratolí,efecte d'apropament,efecte de captura de pantalla,efecte de full,efecte de diapositiva,efecte de missatges emergents lliscants,efecte de miniatures laterals,translucidesa,efecte de translucidesa,transparència,efecte de geometria de la finestra,efecte de finestres sacsejades,efecte de retroacció d'inici,efecte de diàleg principal,efecte d'enfosquiment en estar inactiu,efecte d'enfosquiment de la pantalla,efecte de diapositiva prèvia,decoració,efecte per a mostrar els FPS,efecte per a mostrar les zones pintades,efecte de canvi de coberta,efecte de cub de l'escriptori,efecte d'animació del cub de l'escriptori,efecte de graella de l'escriptori,efecte de canvi en roda,efecte de presentació de les finestres,efecte de redimensionat de la finestra,efecte de contrast del fons
@ -108,6 +109,7 @@ X-KDE-Keywords[fi]=kwin,ikkuna,hallinta,tehoste,3D-tehosteet,2D-tehosteet,graafi
X-KDE-Keywords[fr]=kwin, fenêtre, gestionnaire, effet, effets 3D, effets 2D, effets graphiques, effets de bureau, animations, animations variés, effets de gestion des fenêtres, effets de changement de fenêtre, effets de changement de bureau, animations, animation du bureau, pilotes, paramètres du pilote, rendu, rendre, effet d'inversion, effet de verre, effet de loupe, effet d'aide au positionnement, effet de repérage de la souris, effet de zoom, effet de flou, effet de fondu, effet de fondu du bureau, effet d'effondrement, effet de glissement, effet de mise en valeur de la fenêtre, effet de connexion, effet de déconnexion, effet de lampe magique, effet de minimisation de l'application, effet de marque de la souris, effet de gradation, effet de capture d'écran, effet de feuille, effet de glisse, effet d'annotations glissantes, effet vignettes sur le coté, translucidité, effet de translucidité, transparence, effet de géométrie de la fenêtre, effet de fenêtre en gélatine, effet du témoin de démarrage, effet de dialogue parent, effet d'obscurcissement de fenêtre inactive, effet d'obscurcissement du bureau, effet de glissement en arrière, confort visuel, beauté, effet d'affichage du FPS, effet d'affichage des zones peintes, effet de défilement circulaire, effet de bureaux en cube, effet d'animation de cube de bureaux, effet de bureaux en grille, effet d'empilement en perspective, effet de présentation des fenêtres, effet de redimensionnement des fenêtres, effet de contraste du bureau
X-KDE-Keywords[gl]=kwin,window,xanela,manager,xestor,effect,efecto,3D effects,efectos 3D,2D effects,efectos 2D,configuración de vídeo,graphical effects,efectos gráficos,efectos visuais,desktop effects,efectos de escritorio,animations,animacións,various animations,animacións diversas,varias animacións,animacións variadas,window management effects,efectos de xestión de xanelas,window switching effect,efecto de cambio de xanela,desktop switching effect,efecto de cambio de escritorio,animations,animacións,desktop animations,animacións de escritorio,animacións dos escritorios,animacións do escritorio,drivers,controlador,controladores,driver settings,configuración dos controladores,configuración do controlador,rendering,renderización,renderizado,renderizamento,render,renderizar,invert effect,inverter un efecto,inverter efecto,reverter un efecto,reverter efecto,looking glass effect,efecto de lupa,efecto lupa,magnifier effect,snap helper effect,track mouse effect,efecto de seguir o rato,efecto de seguimento do rato,zoom effect,efecto de ampliación,blur effect,efecto borroso,fade effect,efecto de esvaer,fade desktop effect,efecto de esvaer o escritorio,fall apart effect,efecto de destrución,glide effect,efecto de brillo,highlight window effect,efecto de realzar a xanela,efecto de resaltar a xanela,efecto de salientar a xanela,efecto de salientar a xanela,login effect,efecto de acceder,logout effect,efecto de saír,magic lamp effect,efecto de lámpada máxica,minimize animation effect,efecto de minimizar,mouse mark effect,efecto de marca co rato,scale in effect,efecto de achegar,efecto de cambia de escala,screenshot effect,efecto de captura,sheet effect,efecto de folla,slide effect,efecto de dispositiva,sliding popups effect,thumbnail aside effect,translucency,transparencia,translucidez,translucency effect,efecto de translucidez,efecto de transparencia,transparency,transparencia,window geometry effect,efecto de xeometría da xanela,efecto de xeometría das xanelas,wobbly windows effect,efecto de xanelas a tremer,startup feedback effect,dialog parent effect,efecto do pai do diálogo,dim inactive effect,dim screen effect,efecto de escurecer,slide back effect,eye candy,candy,show FPS effect,efecto de mostrar os FPS,show paint effect,cover switch effect,desktop cube effect,efecto de cubo de escritorio,efecto do cubo de escritorio,efecto de cubo do escritorio,desktop cube animation effect,desktop grid effect,efecto de grade de escritorios,efecto de grade de escritorios,flip switch effect,efecto de interruptor,efecto de contorno,present windows effect,resize window effect,efecto de cambio de tamaño das xanelas,efecto de contraste de fondo
X-KDE-Keywords[hu]=kwin,ablak,kezelő,hatás,3D hatás,2D hatás,grafikai hatások,asztali hatások,animációk,különféle animációk,ablakkezelő hatások,ablakváltó hatások,asztalváltó hatások,animációk,asztali animációk,meghajtók,meghajtó beállítások,leképezés,renderelés,fordított hatás,tükörhatás,nagyító hatás,elkapás segítő hatás,egérkövetés hatás,nagyítás hatás,elmosás,elhalványulás hatás,asztal elhalványulása hatás,széteső hatás,csúszás hatás,ablak kiemelése hatás,belépés hatás,kilépés hatás,varázslámpa hatás,minimalizálás animáció hatás,egérjelölés hatás,méretezés hatás,képernyőkép hatás,munkalap hatás,dia hatás,csúszó felugrók hatás,,bélyegképek félre hatás, áttetszőség,áttetszőség hatás,átlátszóság,ablak geometria hatás,ingó ablak hatás,indulási visszajelzés hatás,párbeszédablak szülő hatás,dim inaktív hatás,dim kijelző hatás,dia vissza hatás,látványelem,édesség,FPS megjelenítése hatás,festék megjelenése hatás,eltakarás váltás hatás,asztal kocka hatás,asztal kockaanimáció hatás,asztal rács hatás,tükrözésváltás hatás,jelenlegi ablakok hatás,ablak átméretezése hatás,háttérkontraszt hatás
X-KDE-Keywords[ia]=kwin,window,manager,effect,3D effects,2D effects,graphical effects,desktop effects,animations,various animations,window management effects,window switching effect,desktop switching effect,animations,desktop animations,drivers,driver settings,rendering,render,invert effect,looking glass effect,magnifier effect,snap helper effect,track mouse effect,zoom effect,blur effect,fade effect,fade desktop effect,fall apart effect,glide effect,highlight window effect,login effect,logout effect,magic lamp effect,minimize animation effect,mouse mark effect,scale effect,screenshot effect,sheet effect,slide effect,sliding popups effect,thumbnail aside effect,translucency,translucency effect,transparency,window geometry effect,wobbly windows effect,startup feedback effect,dialog parent effect,dim inactive effect,dim screen effect,slide back effect,eye candy,candy,show FPS effect,show paint effect,cover switch effect,desktop cube effect,desktop cube animation effect,desktop grid effect,flip switch effect,present windows effect,resize window effect,background contrast effect
X-KDE-Keywords[id]=kwin,window,pengelola,efek,efek 3D,efek 2D,efek grafik,efek desktop,animasi,beragam animasi,efek pengelola window,efek beralih window,efek beralih desktop,animasi,animasi desktop,driver,pengaturan driver,rendering,render,efek kebalikan,efek seperti gelas,efek kaca pembesar,efek penunjang jepret,efek lacak mouse,efek pembesaran,efek buram,efek lesap,efek desktop lesap,efek hancur,efek petak,efek window sorot,efek login,efek logout,efek lampu ajaib,efek animasi minimalkan,efek tanda mouse,efek skala,efek cuplikan layar,efek lembar,efek geser,efek sembul geser,efek gambar-mini disamping,translusensi,efek translusensi,transparan,efek geometri window,efek window goyang,efek feedback pemulaian,efek induk dialog,efek layar suram,efek geser mundur,eye candy,candy,efek tampilkan FPS,efek tampilkan lukisan,efek alih kotak,efek alih sampul,efek kubus desktop,efek animasi kubus desktop,efek kisi desktop,efek alih lipat,efek window hadir,efek ubah ukuran window,efek kontras latarbelakang
X-KDE-Keywords[it]=kwin,finestra,gestore,effetto,effetti 3D,effetti 2D,effetti grafici,effetti del desktop,animazioni,animazioni varie, effetti del gestore delle finestre,effetto dello scambiafinestre,effetto dello scambiatore di desktop,animazioni,animazioni del desktop,driver,impostazioni driver,rendering,render,effetto invertito,effetto vetro,effetto lente,effetto snap helper,effetto traccia mouse,effetto ingrandimento, effetto sfocatura,effetto dissolvenza,effetto dissolvenza desktop,effetto caduta,effetto planatura,effetto evidenziazione finestra,effetto schermata di accesso, effetto disconnessione,effetto lampada magica,effetto animazione di minimizzazione,effetto marcatura mouse, effetto scalatura,effetto schermata,effetto foglio,effetto diapositiva,effetto scivolamento,effetto miniature nella barra delle applicazioni,effetto miniatura su un lato,translucenza,effetto translucenza, trasparenza,effetto geometria finestra,effetto finestre tremolanti,effetto segnale di avvio,effetto finestra madre,effetto oscura finestra inattiva,effetto oscura schermo,effetto scivola all'indietro,gradevole,effetto gradevole,effetto mostra FPS,effetto ridisegno,effetto scambio cubi,effetto scambio copertina,effetto cubi del desktop,effetto animazione cubi del desktop,effetto griglia desktop,effetto scambiatore con inversione,effetto riquadro,effetto finestra presente,effetto ridimensionamento finestra,effetto contrasto dello sfondo
X-KDE-Keywords[ko]=kwin,window,manager,effect,3D effects,2D effects,graphical effects,desktop effects,animations,various animations,window management effects,window switching effect,desktop switching effect,animations,desktop animations,drivers,driver settings,rendering,render,invert effect,looking glass effect,magnifier effect,snap helper effect,track mouse effect,zoom effect,blur effect,dashboard effect,explosion effect,fade effect,fade desktop effect,fall apart effect,glide effect,highlight window effect,login effect,logout effect,magic lamp effect,minimize animation effect,mouse mark effect,scale in effect,screenshot effect,sheet effect,slide effect,sliding popups effect,taskbar thumbnails effect,thumbnail aside effect,translucency,translucency effect,transparency,window geometry effect,wobbly windows effect,startup feedback effect,dialog parent effect,dim inactive effect,dim screen effect,slide back effect,eye candy,candy,show FPS effect,show paint effect,box switch effect,cover switch effect,desktop cube effect,desktop cube animation effect,desktop grid effect,flip switch effect,outline effect,present windows effect,resize window effect,창,관리자,효과,3D 효과,2D 효과,그래픽 효과,데스크톱 효과,애니메이션,창 관리자,창 관리자 효과,데스크톱 전환,데스크톱 전환 효과,드라이버,드라이버 설정,렌더링,렌더링 설정,애니메이션 속도,투명 유리 효과,확대 축소 효과,흐림 효과,대시보드 효과,페이드 효과,로그인 효과,창 강조 효과,글라이드 효과,로그아웃 효과,램프 효과,시트 효과,최소화 효과,최대화 효과,팝업 효과

View File

@ -27,6 +27,7 @@ Name[pa]=ਵਿੰਡੋ ਮੈਨੇਜਰ ਪਰਭਾਵ
Name[pl]=Efekty zarządzania oknami
Name[pt]=Efeitos do Gestor de Janelas
Name[pt_BR]=Efeitos do gerenciador de janelas
Name[ro]=Efectele gestionarului de ferestre
Name[ru]=Эффекты диспетчера окон KWin
Name[sk]=Efekty správcu okien
Name[sl]=Učinki upravljalnika oken

View File

@ -32,6 +32,7 @@ Name[nn]=Handlingar for vindauge
Name[pl]=Zachowanie okien
Name[pt]=Acções das Janelas
Name[pt_BR]=Ações da janela
Name[ro]=Acțiuni fereastră
Name[ru]=Действия с окнами
Name[sk]=Akcie okna
Name[sl]=Dejavnosti oken
@ -64,6 +65,7 @@ Comment[nn]=Set opp musehandlingar for vindauge og tittellinjer
Comment[pl]=Ustawienia działań myszy dla okien i pasków tytułu
Comment[pt]=Configurar as acções do rato para as janelas e barras do título
Comment[pt_BR]=Configura as ações do mouse para as janelas e barras de títulos
Comment[ro]=Configurează acțiunile mausului pentru ferestre și bare de titlu
Comment[ru]=Настройка действий для окон и их заголовков
Comment[sk]=Nastavenie akcií myši pre okná a záhlavia
Comment[sl]=Nastavi aktivnosti miške za okna in naslovne vrstice
@ -104,6 +106,7 @@ X-KDE-Keywords[nn]=rull,fald saman,fald ut,samanfalding,maksimer,minimer,senk,ha
X-KDE-Keywords[pl]=zwiń,maksymalizuj,minimalizuj,obniż,operacje na menu,pasek tytułu,zmień rozmiar
X-KDE-Keywords[pt]=enrolar,maximizar,minimizar,baixar,menu de operações,barra de título,dimensionar
X-KDE-Keywords[pt_BR]=enrolar,maximizar,minimizar,baixar,menu de operações,barra de título,redimensionar
X-KDE-Keywords[ro]=strânge,maximizează,minimizează,coboară,meniu operații,bară de titlu,redimensionează
X-KDE-Keywords[ru]=shade,maximise,maximize,minimize,minimise,lower,operations menu,titlebar,resize,свернуть,распахнуть,убрать вниз,меню операций,меню действий,заголовок окна,заголовок,изменить размер
X-KDE-Keywords[sk]=tieň,maximalizácia,maximalizovanie,minimalizácia,minimalizovanie,nižší,ponuka operácií,záhlavie,zmeniť veľkosť
X-KDE-Keywords[sl]=zvij,povečaj,razpni,pomanjšaj,skrči,dvigni,spusti,naslovna vrstica,spremeni velikost,okenski meni,meni okna

View File

@ -31,6 +31,7 @@ Name[nn]=Avansert vindaugsåtferd
Name[pl]=Zaawansowane zachowania okien
Name[pt]=Comportamento Avançado das Janelas
Name[pt_BR]=Comportamento avançado das janelas
Name[ro]=Comportament avansat al ferestrelor
Name[ru]=Расширенное поведение окон
Name[sk]=Pokročilé správanie okien
Name[sl]=Napredno obnašanje oken
@ -63,6 +64,7 @@ Comment[nn]=Set opp avanserte vindaugshandsamarinnstillingar
Comment[pl]=Zaawansowane ustawienia zarządzania oknami
Comment[pt]=Configurar as funcionalidades de gestão de janelas avançadas
Comment[pt_BR]=Configure as opções avançadas de gerenciamento de janelas
Comment[ro]=Configurează opțiuni avansate de gestiune a ferestrelor
Comment[ru]=Настройка дополнительных возможностей управления окнами
Comment[sk]=Nastaviť pokročilé možnosti správy okien
Comment[sl]=Nastavi napredne zmožnosti upravljanja oken
@ -84,6 +86,7 @@ X-KDE-Keywords[eu]=zabaldu,zabaltzea,bildu,biltzea,gainetik pasatzea,ertz aktibo
X-KDE-Keywords[fi]=rullauksen avaus,rullauksen avaaminen,rullaus,rullaaminen,kehys,leijunta,aktiiviset reunat,asettelu,välilehdet,ikkunavälilehdet,ikkunoiden ryhmittely,ikkunoiden asettelu,sijoittaminen,sijoittelu,ikkunoiden sijoittaminen,ikkunoiden sijoittelu,ikkunoiden lisäasetukset
X-KDE-Keywords[fr]=non ombré, dé-nuancé, nuancé, ombré, bordure, survol, bords actifs, mosaïque, onglets, changement d'onglet, fenêtre, changement de fenêtres, regroupement de fenêtres, mosaïque de fenêtres, placement de fenêtres, positionnement de fenêtre, comportement avancé des fenêtres
X-KDE-Keywords[gl]=dessombrar,dessombramento,sombra,bordo,beira,pasar,bordos activos,beiras activas,xanela,separadores,agrupar xanelas, situación das xanelas,colocación,colocación das xanelas,comportamento avanzado das xanelas
X-KDE-Keywords[ia]=unshade,unshading,shade,shading,border,hover,active borders,tiling,tabs,tabbing,window,window tabbing,window grouping,window tiling,placement,window placement,placement of windows,window advanced behavior
X-KDE-Keywords[id]=tak berbayang,tak bayang,berbayang,batas,melayang,bingkai aktif,pengubinan,tab,pengetaban,window,pengetaban window,pengelompokan window,pengubinan window,penempatan,penempatan window,penempatan si window,perilaku tingkat-lanjut window
X-KDE-Keywords[it]=arrotola,srotola,ombra,ombreggiatura,bordo,sovrapponi,bordi attivi,affiancamento,schede,navigazione a schede,finestre,finestre a schede,raggruppamento finestre,affiancamento finestre,posizionamento,posizionamento finestre,posizionamento delle finestre,comportamento avanzato delle finestre
X-KDE-Keywords[ko]=unshade,unshading,shade,shading,border,hover,active borders,tiling,tabs,tabbing,window,window tabbing,window grouping,window tiling,placement,window placement,placement of windows,window advanced behavior,그림자,경계선,호버,지나다니기,타일,탭,창 탭,창 그룹,창 타일,창 위치,말아 올리기,풀어 내리기,배치,창

View File

@ -30,11 +30,13 @@ Name[nn]=Fokus­åtferd for vindauge
Name[pl]=Zachowanie uaktywnienia okien
Name[pt]=Comportamento do Foco da Janela
Name[pt_BR]=Comportamento do foco da janela
Name[ro]=Comportament focalizare ferestre
Name[ru]=Фокус окон
Name[sk]=Správanie zamerania okien
Name[sl]=Obnašanje oken pri osredotočanju
Name[sv]=Fönsterfokusbeteende
Name[uk]=Параметри фокусування вікон
Name[vi]=Ứng xử nhắm của cửa sổ
Name[x-test]=xxWindow Focus Behaviorxx
Name[zh_CN]=窗口焦点行为
Name[zh_TW]=視窗焦點行為
@ -61,11 +63,13 @@ Comment[nn]=Set opp praksisen for vindaugsaktivering
Comment[pl]=Ustawienia uaktywniania okien
Comment[pt]=Configurar a política de activação da janela
Comment[pt_BR]=Configure a política de ativação de janela
Comment[ro]=Configurează politica de activare a ferestrelor
Comment[ru]=Настройка активации окон
Comment[sk]=Nastavenie spôsobu aktivácie okien
Comment[sl]=Nastavi politiko aktiviranja okna
Comment[sv]=Anpassa policy för fönsteraktivering
Comment[uk]=Налаштовування правил активації вікон
Comment[vi]=Cấu hình chính sách kích hoạt cửa sổ
Comment[x-test]=xxConfigure window activation policyxx
Comment[zh_CN]=配置窗口激活策略
Comment[zh_TW]=設定視窗啟用策略
@ -82,6 +86,7 @@ X-KDE-Keywords[eu]=fokua,automatikoki igo,igo,egin klik igotzeko,teklatu,CDE,alt
X-KDE-Keywords[fi]=kohdistus,sijoitus,automaattinen nosto,automaattinen nostaminen,nosta,nosta napsauttamalla,näppäimistö,alt-sarkain,kaikki työpöydät,kohdistus seuraa hiirtä,kohdistuksen esto,kohdistuksen varastaminen,kohdistustapa,ikkunoiden kohdistuksen toiminta,ikkunoiden näyttötoiminta
X-KDE-Keywords[fr]=focus, agrandissement automatique, agrandissement, clic d'agrandissement, clavier, CDE, alt-tab, tous les bureaux, focus suivi par la souris, prise de focus, politique de focus, comportement du focus des fenêtres, comportement des fenêtres
X-KDE-Keywords[gl]=foco,erguer automaticamente,erguer,erguer ao premer,teclado,CDE,alt-tab,todo o escritorio,foco que segue o rato,prevención do foco,roubar o foco,política de foco,comportamento de foco de xanela,comportamento de pantalla de xanela
X-KDE-Keywords[ia]=focus,auto raise,raise,click raise,keyboard,CDE,alt-tab,all desktop,focus follows mouse,focus prevention,focus stealing,focus policy,window focus behavior,window screen behavior
X-KDE-Keywords[id]=fokus,auto naik,naikkan,klik naikkan,keyboard,papan ketik,CDE,alt-tab,semua desktop,fokus mengikuti mouse,pencegahan fokus,pencurian fokus,kebijakan fokus,perilaku fokus window,perilaku layar window
X-KDE-Keywords[it]=fuoco,avanzamento automatico,avanzamento,avanzamento con clic,tastiera,CDE,alt-tab,tutti i desktop,il fuoco segue il mouse,impedisci il fuoco,mantieni il fuoco,regole fuoco,comportamento fuoco finestra, comportamento schermo finestra
X-KDE-Keywords[ko]=focus,auto raise,raise,click raise,keyboard,CDE,alt-tab,all desktop,focus follows mouse,focus prevention,focus stealing,focus policy,window focus behavior,window screen behavior,초점,키보드,모든 데스크톱,초점,초점 훔치기,초점 훔치기 방지,초점 정책,창 초점 행동,창 화면 행동
@ -96,6 +101,7 @@ X-KDE-Keywords[sk]=zameranie,umiestnenie,automatické zdvihnutie,zdvihnutie,klik
X-KDE-Keywords[sl]=fokus,žarišče,postavitev,postavljanje,samodejni dvig,samodejno dvigovanje,dvig,dvigovanje,dvig na klik,tipkovnica,cde,celotno namizje,fokus sledi miški,žarišče sledi miški,preprečevanje fokusa,preprečevanje žarišča,kraja fokusa,kraja žarišča,pravila osredotočanja,pravila za osredotočanje,obnašanje pri osredotočanju oken,obnašanje pri postavljanju oken v žarišče,obnašanje oken
X-KDE-Keywords[sv]=fokus,fönsterbeteende,animering,höj,höj automatiskt,höj med klick,CDE,alt-tab,alla skrivbord,fokus följer musen,förhindra fokus,stjäla fokus,fokusprincip,fönsterfokusbeteende,fönsterskärmbeteende
X-KDE-Keywords[uk]=focus,auto raise,raise,click raise,keyboard,CDE,alt-tab,all desktop,focus follows mouse,focus prevention,focus stealing,focus policy,window focus behavior,window screen behavior,фокус,фокусування,автопідняття,підняття,клацання,клавіатура,альт-таб,всі стільниці,фокус за мишею,запобігання,перехід фокуса,правила фокусування,поведінка вікон
X-KDE-Keywords[vi]=focus,auto raise,raise,click raise,keyboard,CDE,alt-tab,all desktop,focus follows mouse,focus prevention,focus stealing,focus policy,window focus behavior,window screen behavior,nhắm,nâng tự động,nâng,bấm nâng,bàn phím,tất cả bàn làm việc,nhắm đi theo chuột,ngăn chặn nhắm,lấy nhắm,chính sách nhắm,ứng xử nhắm của cửa sổ,ứng xử màn hình cửa sổ
X-KDE-Keywords[x-test]=xxfocusxx,xxauto raisexx,xxraisexx,xxclick raisexx,xxkeyboardxx,xxCDExx,xxalt-tabxx,xxall desktopxx,xxfocus follows mousexx,xxfocus preventionxx,xxfocus stealingxx,xxfocus policyxx,xxwindow focus behaviorxx,xxwindow screen behaviorxx
X-KDE-Keywords[zh_CN]=focus,auto raise,raise,click raise,keyboard,CDE,alt-tab,all desktop,focus follows mouse,focus prevention,focus stealing,focus policy,window focus behavior,window screen behavior,焦点,聚焦,自动升起,升起,点击升起,键盘,全部桌面,焦点跟随鼠标,偷取焦点,焦点策略,窗口焦点行为,窗口屏幕行为
X-KDE-Keywords[zh_TW]=focus,auto raise,raise,click raise,keyboard,CDE,alt-tab,all desktop,focus follows mouse,focus prevention,focus stealing,focus policy,window focus behavior,window screen behavior

View File

@ -31,6 +31,7 @@ Name[nn]=Vidaugs­flytting
Name[pl]=Przesuwanie okien
Name[pt]=Movimentação das Janelas
Name[pt_BR]=Movimento da janela
Name[ro]=Mutare ferestre
Name[ru]=Перемещение окон
Name[sk]=Presuny okien
Name[sl]=Premikanje oken
@ -62,6 +63,7 @@ Comment[nn]=Set opp vindaugsflytting
Comment[pl]=Ustawienia opcji przesuwania okien
Comment[pt]=Configurar as opções de movimentação das janelas
Comment[pt_BR]=Configure as opções de movimento da janela
Comment[ro]=Configurează opțiuni de mutare a ferestrelor
Comment[ru]=Настройка поведения при перемещении окон
Comment[sk]=Nastavenie spôsobu presunu okien
Comment[sl]=Nastavi možnosti premikanja okna
@ -101,6 +103,7 @@ X-KDE-Keywords[nn]=flytting,smart,kaskade,maksimering,gripesone,gripa,kant
X-KDE-Keywords[pl]=przesuwanie,elegancki,kaskada,maksymalizuj,obszar przyciągania,przyciągaj,obramowanie
X-KDE-Keywords[pt]=movimento,inteligente,cascata,maximizar,ajuste à zona,ajuste,contorno
X-KDE-Keywords[pt_BR]=movimento,movimentação,inteligente,cascata,maximizar,ajuste à área,ajuste,borda
X-KDE-Keywords[ro]=mutare,inteligent,cascadă,maximizează,minimizează,zonă magnetică,magnet,contur
X-KDE-Keywords[ru]=moving,smart,cascade,maximize,maximise,snap zone,snap,border,перемещение,каскад,распахнуть,свернуть,захват,привязка,граница
X-KDE-Keywords[sk]=presun,smart,kaskáda,maximalizácia,miinmalizácia,oblasť prichytenia,prichytenie,rám
X-KDE-Keywords[sl]=premikanje,pametno premikanje,kaskada,povečaj,razpni,območje pripenjanja,pripenjanje,rob,robovi,obroba,obrobe

View File

@ -74,7 +74,7 @@ Name[pa]=ਵਿੰਡੋ ਰਵੱਈਆ
Name[pl]=Zachowania okien
Name[pt]=Comportamento das Janelas
Name[pt_BR]=Comportamento das janelas
Name[ro]=Comportament fereastră
Name[ro]=Comportament ferestre
Name[ru]=Поведение окон
Name[se]=Láseláhtten
Name[si]=කවුළු හැසිරීම
@ -123,6 +123,7 @@ Comment[nn]=Set opp utsjånad og åtferd for vindauge
Comment[pl]=Ustawienia działań i zachowań okien
Comment[pt]=Configurar as acções e comportamento das janelas
Comment[pt_BR]=Configure as ações e comportamento das janelas
Comment[ro]=Configurează acțiunile și comportamentul ferestrelor
Comment[ru]=Настройка поведения окон
Comment[sk]=Nastaviť akcie a správanie okien
Comment[sl]=Nastavi dejanja in obnašanje oken
@ -160,6 +161,7 @@ X-KDE-Keywords[nn]=fokus,plassering,vindaugsåtferd,vindaugshandlingar,animering
X-KDE-Keywords[pl]=uaktywnienie,umieszczenie,zachowanie okna,działania okien,animacja,wzniesienie,auto-wzniesienie, okna,ramka,pasek tytułu,podwójne kliknięcie
X-KDE-Keywords[pt]=foco,colocação,comportamento da janela,acções das janelas,animação,elevar,elevar automaticamente,janelas,contorno,barra de título,duplo-click
X-KDE-Keywords[pt_BR]=foco,colocação,comportamento da janela,ações da janela,animação,elevar,elevar automaticamente,janelas,contorno,barra de título,clique duplo
X-KDE-Keywords[ro]=focalizare,amplasare,comportament ferestre,acțiuni ferestre,animație,ridică,ridicare automată,ferestre,cadru,bară de titlu,dublu clic
X-KDE-Keywords[ru]=focus,placement,window behavior,window actions,animation,raise,auto raise,windows,frame,titlebar,doubleclick,фокус,местоположение,поведение окон,анимация,увеличение,автоувеличение,окна,рамка,заголовок,двойной щелчок,действия над окнами
X-KDE-Keywords[sk]=zameranie,umiestnenie,správanie okien,animácia,zdvihnúť,automaticky zdvihnúť,okná,rám,záhlavie,dvojklik
X-KDE-Keywords[sl]=fokus,žarišče,postavitev,postavljanje,obnašanje oken,dejanja oken,animacija,dvig,samodejni dvig,okna,okvir,naslovna vrstica,dvojni klik,dvoklik
@ -170,6 +172,7 @@ X-KDE-Keywords[sr@latin]=focus,placement,window behavior,window actions,animatio
X-KDE-Keywords[sv]=fokus,placering,fönsterbeteende,animering,höj,höj automatiskt,fönster,ram,namnlist,dubbelklick
X-KDE-Keywords[tr]=odak,yerleşim,pencere davranışı,pencere eylemleri,canlandırma,yükselt,otomatik yükselt,pencereler,çerçeve,başlık çubuğu,çift tıklama
X-KDE-Keywords[uk]=focus,placement,window behavior,window actions,animation,raise,auto raise,windows,frame,titlebar,doubleclick,фокус,розташування,місце,вікно,поведінка,поведінка вікон,дії,реакція,дії з вікнами,реакція вікон,анімація,підняти,підняття,автоматична,автоматично,рамка,заголовок,смужка заголовка,клацання,подвійне
X-KDE-Keywords[vi]=focus,placement,window behavior,window actions,animation,raise,auto raise,windows,frame,titlebar,doubleclick,nhắm,xếp chỗ,ứng xử của cửa sổ,hành động của cửa sổ,hiệu ứng động,nâng,nâng tự động,cửa sổ,khung,thanh tiêu đề,bấm đúp
X-KDE-Keywords[x-test]=xxfocusxx,xxplacementxx,xxwindow behaviorxx,xxwindow actionsxx,xxanimationxx,xxraisexx,xxauto raisexx,xxwindowsxx,xxframexx,xxtitlebarxx,xxdoubleclickxx
X-KDE-Keywords[zh_CN]=focus,placement,window behavior,window actions,animation,raise,auto raise,windows,frame,titlebar,doubleclick,焦点,位置,窗口行为,窗口动作,动画,升起,自动升起,窗口,边框,标题栏,双击
X-KDE-Keywords[zh_TW]=focus,placement,window behavior,window actions,animation,raise,auto raise,windows,frame,titlebar,doubleclick

View File

@ -56,7 +56,7 @@ Name[pa]=ਵਿੰਡੋ ਨਿਯਮ
Name[pl]=Zasady okien
Name[pt]=Regras das Janelas
Name[pt_BR]=Regras das janelas
Name[ro]=Reguli fereastră
Name[ro]=Reguli ferestre
Name[ru]=Особые параметры окон
Name[si]=කවුළු නීති
Name[sk]=Pravidlá okien
@ -107,6 +107,7 @@ Comment[pa]=ਵੱਖ-ਵੱਖ ਵਿੰਡੋ ਰਵੱਈਆ
Comment[pl]=Wyjątkowe okna
Comment[pt]=Comportamento das Janelas Individuais
Comment[pt_BR]=Comportamento das janelas individuais
Comment[ro]=Comportament al ferestrelor individuale
Comment[ru]=Особые параметры конкретных окон
Comment[sk]=Individuálne správanie okien
Comment[sl]=Obnašanje posameznih oken
@ -152,6 +153,7 @@ X-KDE-Keywords[nn]=storleik,plassering,tilstand,vindaugsåtferd,vindauge,einskil
X-KDE-Keywords[pl]=rozmiar,pozycja,stan,zachowanie okna,okna,specyficzne,obejścia,zapamiętaj,reguły
X-KDE-Keywords[pt]=tamanho,posição,estado,comportamento da janela,janelas,específico,alternativas,recordar,regras
X-KDE-Keywords[pt_BR]=tamanho,posição,estado,comportamento da janela,janelas,específico,alternativas,lembrar,regras
X-KDE-Keywords[ro]=dimensiune,poziție,stare,comportament ferestre,ferestre,specific,ține minte,reguli
X-KDE-Keywords[ru]=size,position,state,window behavior,windows,specific,workarounds,remember,rules,размер,позиция,состояние,поведение окон,окна,специальный,специальные возможности,запомнить,правила
X-KDE-Keywords[sk]=veľkosť,poloha,stav,správanie okien,okná,špecifický,workaroundy,pamätať,pravidlá
X-KDE-Keywords[sl]=velikost,položaj,stanje,obnašanje oken,okna,določeno,popravki,pomnjenje,pravila

View File

@ -190,6 +190,9 @@ static void edit(const QVariantMap &data, bool whole_app)
int main(int argc, char* argv[])
{
QApplication app(argc, argv);
KLocalizedString::setApplicationDomain("kcm_kwinrules");
app.setAttribute(Qt::AA_UseHighDpiPixmaps, true);
app.setApplicationDisplayName(i18n("KWin"));
app.setApplicationName("kwin_rules_dialog");

View File

@ -48,6 +48,8 @@ ScrollViewKCM {
sourceComponent: ruleBookDelegate
}
highlightMoveDuration: Kirigami.Units.longDuration
displaced: Transition {
NumberAnimation { properties: "y"; duration: Kirigami.Units.longDuration }
}

View File

@ -142,8 +142,9 @@ Loader {
id: coordItem
spacing: Kirigami.Units.smallSpacing
readonly property var coord: (controlType == RuleItem.Size) ? Qt.size(coordX.value, coordY.value)
: Qt.point(coordX.value, coordY.value)
readonly property bool isSize: controlType == RuleItem.Size
readonly property var coord: (isSize) ? Qt.size(coordX.value, coordY.value)
: Qt.point(coordX.value, coordY.value)
onCoordChanged: valueEditor.valueEdited(coord)
QQC2.SpinBox {
@ -151,9 +152,9 @@ Loader {
editable: true
Layout.preferredWidth: 50 // 50%
Layout.fillWidth: true
from: 0
from: (isSize) ? 0 : -32767
to: 32767
value: (controlType == RuleItem.Size) ? ruleValue.width : ruleValue.x
value: (isSize) ? ruleValue.width : ruleValue.x
}
QQC2.Label {
id: coordSeparator
@ -164,11 +165,11 @@ Loader {
QQC2.SpinBox {
id: coordY
editable: true
from: 0
to: 32767
from: coordX.from
to: coordX.to
Layout.preferredWidth: 50 // 50%
Layout.fillWidth: true
value: (controlType == RuleItem.Size) ? ruleValue.height : ruleValue.y
value: (isSize) ? ruleValue.height : ruleValue.y
}
}
}

View File

@ -59,7 +59,7 @@ Name[pa]=ਵਿੰਡੋ ਨਿਯਮ
Name[pl]=Zasady okien
Name[pt]=Regras das Janelas
Name[pt_BR]=Regras das janelas
Name[ro]=Reguli fereastră
Name[ro]=Reguli ferestre
Name[ru]=Особые параметры окон
Name[si]=කවුළු නීති
Name[sk]=Pravidlá okien
@ -109,6 +109,7 @@ Comment[pa]=ਵੱਖ-ਵੱਖ ਵਿੰਡੋ ਰਵੱਈਆ
Comment[pl]=Wyjątkowe okna
Comment[pt]=Comportamento das Janelas Individuais
Comment[pt_BR]=Comportamento das janelas individuais
Comment[ro]=Comportament al ferestrelor individuale
Comment[ru]=Особые параметры конкретных окон
Comment[sk]=Individuálne správanie okien
Comment[sl]=Obnašanje posameznih oken

View File

@ -208,8 +208,10 @@ QVariant RuleItem::typedValue(const QVariant &value) const
}
return typesMask;
}
case Point:
return value.toPoint();
case Point: {
const QPoint point = value.toPoint();
return (point == invalidPoint) ? QPoint(0, 0) : point;
}
case Size:
return value.toSize();
case String:

View File

@ -61,7 +61,7 @@ Name[pa]=ਸਕਰੀਨ ਬਾਹੀਆਂ
Name[pl]=Krawędzie ekranu
Name[pt]=Extremos do Ecrã
Name[pt_BR]=Contornos da tela
Name[ro]=Muchiile ecranului
Name[ro]=Marginile ecranului
Name[ru]=Края экрана
Name[si]=තිර මුළු
Name[sk]=Okraje obrazovky
@ -104,6 +104,7 @@ Comment[nn]=Set opp aktive skjermhjørne og skjermkantar
Comment[pl]=Ustawienia czułych narożników i krawędzi ekranu
Comment[pt]=Configurar os cantos e extremos do ecrã activo
Comment[pt_BR]=Configura os cantos e bordas da tela ativa
Comment[ro]=Configurează colțurile și marginile active ale ecranului
Comment[ru]=Настройка действий для краёв и углов экрана
Comment[sk]=Nastavenie aktívnych okrajov obrazovky a hrán
Comment[sl]=Nastavi dejavne kote in robove okna

View File

@ -39,6 +39,7 @@ Name[pa]=ਟੱਚ ਸਕਰੀਨ
Name[pl]=Ekran dotykowy
Name[pt]=Ecrã Táctil
Name[pt_BR]=Touch Screen
Name[ro]=Ecran tactil
Name[ru]=Сенсорный экран
Name[sk]=Dotyková obrazovka
Name[sl]=Zaslon na dotik
@ -75,6 +76,7 @@ Comment[nn]=Set opp fingerrørsler på trykkskjerm
Comment[pl]=Ustawienia gestów na ekranie dotykowym
Comment[pt]=Configurar os gestos para deslizar o ecrã táctil
Comment[pt_BR]=Configura os gestos na tela sensível ao toque
Comment[ro]=Configurează gesturi de tragere pe ecran tactil
Comment[ru]=Действия при проведении по сенсорному экрану
Comment[sk]=Nastaviť ťahacie gestá dotykovej obrazovky
Comment[sl]=Nastavi kretnje vlečenja za zaslon na dotik
@ -99,6 +101,7 @@ X-KDE-Keywords[fi]=kwin,ikkuna,hallinta,tehoste,kulma,laita,reuna,toiminto,vaihd
X-KDE-Keywords[fr]=kwin, fenêtre, gestionnaire, effet, bord, bordure, action, bascule, bureau, bords du bureau, bords de l'écran, côté de l'écran, comportement de l'écran, écran tactile
X-KDE-Keywords[gl]=kwin,window,xanela,manager,xestor,effect,efecto,edge,beira,bordo,contorno,esquina,border,action,acción,switch,cambiar,conmutar,trocar,desktop,escritorio,desktop edges,screen edges,pantalla,side of screen,screen behavior,comportamento,touch screen,táctil
X-KDE-Keywords[hu]=kwin,ablak,kezelő,effektus,szél,szegély,művelet,váltás,asztal,asztalszél,képernyőszél,képernyőoldal,képernyő működése,érintőképernyő
X-KDE-Keywords[ia]=kwin,window,manager,effect,edge,border,action,switch,desktop,desktop edges,screen edges,side of screen,screen behavior,touch screen
X-KDE-Keywords[id]=kwin,window,pengelola,efek,tepi,bingkai,aksi,alih,desktop,tepian desktop,tepian layar,sisi layar,perilaku layar,layar sentuh
X-KDE-Keywords[it]=kwin,finestra,gestore,effetto,angolo,bordo,azione,scambiatore,desktop,bordi desktop,bordi schermo,lato dello schermo,comportamento schermo,schermo a sfioramento
X-KDE-Keywords[ko]=kwin,window,manager,effect,edge,border,action,switch,desktop,desktop edges,screen edges,side of screen,screen behavior,touch screen,창,관리자,효과,경계,경계선,동작,액션,데스크톱,화면 경계,경계,터치,터치 스크린,터치스크린,바탕 화면
@ -108,6 +111,7 @@ X-KDE-Keywords[nn]=kwin,vindauge,handsamar,effekt,kant,ramme,handling,byte,skriv
X-KDE-Keywords[pl]=kwin,okno,menadżer,efekt,krawędź,obramowanie,działanie,przełącz,pulpit,krawędzie pulpitu,krawędzie ekranu,strona ekranu,zachowanie ekranu,ekran dotykowy
X-KDE-Keywords[pt]=kwin,janela,gestor,efeito,extremo,contorno,acção,mudar,ecrã,extremos do ecrã no kwin,extremos do ecrã,maximizar as janelas,janelas lado-a-lado,lado do ecrã,comportamento do ecrã,ecrã táctil
X-KDE-Keywords[pt_BR]=kwin,janela,gerenciador,efeito,canto,contorno,borda,ação,mudar,área de trabalho,cantos da área de trabalho, desktop,lado da tela,comportamento da tela,touch screen
X-KDE-Keywords[ro]=kwin,fereastră,gestionar,efect,margine,muchie,latură,acțiune,schimbă,birou,marginile biroului,marginile ecranului,marginea ecranului,comportament ecran,ecran tactil
X-KDE-Keywords[ru]=kwin,window,manager,effect,corner,edge,border,action,switch,desktop,kwin screen edges,desktop edges,screen edges,maximize windows,tile windows,side of screen,screen behavior,switch desktop,virtual desktop,screen corners,окно,окон,диспетчер,эффект,край,граница,действие,переключить,рабочий стол,края экрана kwin,края экрана,края рабочего стола,распахнуть окна,мозаика окон,край экрана,поведение экрана,переключить рабочий стол,виртуальный рабочий стол,углы рабочего стола,углы экрана,тачскрин,сенсорный экран,touch screen
X-KDE-Keywords[sk]=Kwin, okná, manažér, efekt, okraj, hranice, akcie, prepínač, desktop, okraje plochy,Okraje obrazovky, bočná strana obrazovky, správanie obrazovky, dotyková obrazovka
X-KDE-Keywords[sl]=kwin,okno,upravljalnik oken,upravljanje oken,učinki,rob,obroba,dejanje,preklopi,preklapljanje,robovi namizja,robovi zaslona,rob zaslona,obnašanje zaslona,zaslon na dotik

View File

@ -158,7 +158,7 @@ Comment[sr@latin]=Upravljajte KWinovih skriptama
Comment[sv]=Hantera Kwin-skript
Comment[tr]=KWin betiklerini yönet
Comment[uk]=Керування скриптами KWin
Comment[vi]=Quản lý tập lệnh KWin
Comment[vi]=Quản lí tập lệnh KWin
Comment[x-test]=xxManage KWin scriptsxx
Comment[zh_CN]=管理 KWin 脚本
Comment[zh_TW]=管理 KWin 文稿

View File

@ -26,6 +26,7 @@ Name[pa]=ਵਿੰਡੋ ਮੈਨੇਜਰ ਸਕ੍ਰਿਪਟਾਂ
Name[pl]=Skrypty zarządzania oknami
Name[pt]=Programas do Gestor de Janelas
Name[pt_BR]=Scripts do gerenciador de janelas
Name[ro]=Scripturi pentru gestionar de ferestre
Name[ru]=Сценарии для диспетчера окон KWin
Name[sk]=Skripty správcu okien
Name[sl]=Skripti upravljalnika oken

View File

@ -27,6 +27,7 @@ Name[pa]=ਵਿੰਡੋ ਮੈਨੇਜਰ ਸਵਿੱਚਰ ਲੇਆਉਟ
Name[pl]=Układ przełączania zarządzana oknami
Name[pt]=Disposições da Mudança de Janelas do KWin
Name[pt_BR]=Layouts de mudança do gerenciador de janelas
Name[ro]=Aranjamente de schimbare pentru gestionar de ferestre
Name[ru]=Оформления переключателя окон для KWin
Name[sk]=Prepínanie rozložení správcu okien
Name[sl]=Razporedi preklapljanja upravljalnika oken

View File

@ -102,6 +102,7 @@ Comment[pa]=ਵਿੰਡੋਆਂ 'ਚ ਏਧਰ ਓਧਰ ਜਾਓ
Comment[pl]=Przełączanie pomiędzy oknami
Comment[pt]=Navegação pelas Janelas
Comment[pt_BR]=Navegação pelas janelas
Comment[ro]=Navigare printre ferestre
Comment[ru]=Настройка переключателя окон
Comment[sk]=Navigácia cez okná
Comment[sl]=Krmarjenje med okni
@ -146,6 +147,7 @@ X-KDE-Keywords[nn]=vindauge,vindauge,byte,vindaugsbytar,byte,vindaugsbytar,altta
X-KDE-Keywords[pl]=okno,okna,przełączanie,przełączanie okien,alttab,alt-tab,alt+tab,alt tab
X-KDE-Keywords[pt]=janela,janelas,selector,selector de janelas,mudar,mudança de janela,alttab,alt-tab,alt+tab,alt tab
X-KDE-Keywords[pt_BR]=janela,janelas,seletor,seletor de janelas,mudar,mudança de janela,alttab,alt-tab,alt+tab,alt tab
X-KDE-Keywords[ro]=fereastră,ferestre,comutator,comutator ferestre,schimbare,schimbare ferestre,alttab,alt-tab,alt+tab,alt tab
X-KDE-Keywords[ru]=window,windows,switcher,window switcher,switching,window switching,alttab,alt-tab,alt+tab,alt tab,окно,окна,переключатель,переключатель окон,переключение,переключение окон
X-KDE-Keywords[sk]=okno,okná,prepínač,prepínanie okien,prepínanie,prepínač okien,alttab,alt-tab,alt+tab,alt tab
X-KDE-Keywords[sl]=okno,okna,preklapljanje,preklapljanje med okni,alttab,alt-tab,alt+tab,alt tab

View File

@ -58,7 +58,7 @@ Comment[th]=ตัวจัดการหน้าต่าง KWin
Comment[tr]=KWin Pencere Yöneticisi
Comment[ug]=KWin كۆزنەك باشقۇرغۇچ
Comment[uk]=Керування вікнами KWin
Comment[vi]=Trình quản lý cửa sổ KWin
Comment[vi]=Trình quản lí cửa sổ KWin
Comment[wa]=Manaedjeu des fniesses KWin
Comment[x-test]=xxKWin Window Managerxx
Comment[zh_CN]=KWin 窗口管理器
@ -292,12 +292,21 @@ Action=Popup
Name=Xwayland Crash
Name[az]=Xwayland Qəzası
Name[ca]=Fallada de l'Xwayland
Name[en_GB]=Xwayland Crash
Name[es]=Fallo de Xwayland
Name[et]=Xwaylandi krahh
Name[eu]=Xwayland kraskatzea
Name[fi]=XWayland kaatui
Name[fr]=Plantage « Xwayland »
Name[ia]=Xwayland Crash
Name[it]=Chiusura inattesa di Xwayland
Name[ko]=Xwayland 충돌
Name[nl]=Xwayland-crash
Name[nn]=Xwayland-krasj
Name[pl]=Usterka Xwayland
Name[pt]=Estoiro do Xwayland
Name[pt_BR]=Falha no Xwayland
Name[ro]=Prăbușire Xwayland
Name[sk]=Pád Xwayland-u
Name[sl]=Sesutje Xwayland
Name[sv]=Krasch av Xwayland
@ -307,12 +316,21 @@ Comment=Xwayland has crashed
Comment[az]=Xwayland qəzaya uğradı
Comment[ca]=L'Xwayland ha fallat
Comment[cs]=Xwayland spadnul
Comment[en_GB]=Xwayland has crashed
Comment[es]=Xwayland ha fallado
Comment[et]=Xwayland lõpetas krahhiga
Comment[eu]=Xwayland kraskatu egin da
Comment[fi]=XWayland on kaatunut
Comment[fr]=Plantage de « Xwayland »
Comment[ia]=Xwayland ha fracassate
Comment[it]=Xwayland è stato terminato in modo inatteso
Comment[ko]=Xwayland가 충돌함
Comment[nl]=Xwayland is gecrasht
Comment[nn]=Xwayland krasja
Comment[pl]=Xwayland napotkał usterkę
Comment[pt]=O Xwayland estoirou
Comment[pt_BR]=O Xwayland falhou
Comment[ro]=Xwayland s-a prăbușit
Comment[sk]=Xwayland spadol
Comment[sl]=Xwayland se je sesul
Comment[sv]=Xwayland har kraschat

View File

@ -113,6 +113,7 @@ void Workspace::updateStackingOrder(bool propagate_new_clients)
stacking_order = new_stacking_order;
if (changed || propagate_new_clients) {
propagateClients(propagate_new_clients);
markXStackingOrderAsDirty();
emit stackingOrderChanged();
if (m_compositor) {
m_compositor->addRepaintFull();
@ -217,10 +218,6 @@ void Workspace::propagateClients(bool propagate_new_clients)
}
rootInfo()->setClientListStacking(cl, pos);
delete [] cl;
// Make the cached stacking order invalid here, in case we need the new stacking order before we get
// the matching event, due to X being asynchronous.
markXStackingOrderAsDirty();
}
/**
@ -732,11 +729,11 @@ void Workspace::updateXStackingOrder()
if (tree && !tree->isNull()) {
xcb_window_t *windows = tree->children();
const auto count = tree->data()->children_len;
int foundUnmanagedCount = unmanaged.count();
int foundUnmanagedCount = m_unmanaged.count();
for (unsigned int i = 0;
i < count;
++i) {
for (auto it = unmanaged.constBegin(); it != unmanaged.constEnd(); ++it) {
for (auto it = m_unmanaged.constBegin(); it != m_unmanaged.constEnd(); ++it) {
Unmanaged *u = *it;
if (u->window() == windows[i]) {
x_stacking.append(u);

View File

@ -50,7 +50,6 @@ LayerShellV1Client::LayerShellV1Client(LayerSurfaceV1Interface *shellSurface,
setSkipTaskbar(true);
setSizeSyncMode(SyncMode::Async);
setPositionSyncMode(SyncMode::Sync);
setupCompositing();
connect(shellSurface, &LayerSurfaceV1Interface::aboutToBeDestroyed,
this, &LayerShellV1Client::destroyClient);

View File

@ -175,7 +175,7 @@ X-KDE-Library=kwin4_effect_cooleffect
#define KWIN_EFFECT_API_MAKE_VERSION( major, minor ) (( major ) << 8 | ( minor ))
#define KWIN_EFFECT_API_VERSION_MAJOR 0
#define KWIN_EFFECT_API_VERSION_MINOR 230
#define KWIN_EFFECT_API_VERSION_MINOR 231
#define KWIN_EFFECT_API_VERSION KWIN_EFFECT_API_MAKE_VERSION( \
KWIN_EFFECT_API_VERSION_MAJOR, KWIN_EFFECT_API_VERSION_MINOR )
@ -755,10 +755,10 @@ public:
#define KWIN_EFFECT_FACTORY_ENABLED( factoryName, className, jsonFile, enabled ) \
KWIN_EFFECT_FACTORY_SUPPORTED_ENABLED( factoryName, className, jsonFile, return true;, enabled )
#define KWIN_EFFECT_FACTORY_SUPPORTED( factoryName, classname, jsonFile, supported ) \
#define KWIN_EFFECT_FACTORY_SUPPORTED( factoryName, className, jsonFile, supported ) \
KWIN_EFFECT_FACTORY_SUPPORTED_ENABLED( factoryName, className, jsonFile, supported, return true; )
#define KWIN_EFFECT_FACTORY( factoryName, classname, jsonFile ) \
#define KWIN_EFFECT_FACTORY( factoryName, className, jsonFile ) \
KWIN_EFFECT_FACTORY_SUPPORTED_ENABLED( factoryName, className, jsonFile, return true;, return true; )

View File

@ -894,12 +894,12 @@ void GLPlatform::detect(OpenGLPlatformInterface platformInterface)
}
// softpipe
else if (m_vendor == "VMware, Inc." && m_chipset == "softpipe" ) {
else if (m_chipset == "softpipe") {
m_driver = Driver_Softpipe;
}
// llvmpipe
else if (m_vendor == "VMware, Inc." && m_chipset == "llvmpipe") {
else if (m_chipset == "llvmpipe") {
m_driver = Driver_Llvmpipe;
}

View File

@ -221,6 +221,13 @@ void LogindIntegration::logindServiceRegistered()
emit connectedChanged();
}
);
m_bus.connect(m_sessionControllerService,
m_sessionPath,
m_sessionControllerManagerInterface,
QStringLiteral("PrepareForSleep"),
this,
SIGNAL(prepareForSleep(bool)));
}
void LogindIntegration::connectSessionPropertiesChanged()

View File

@ -54,6 +54,7 @@ Q_SIGNALS:
void hasSessionControlChanged(bool);
void sessionActiveChanged(bool);
void virtualTerminalChanged(int);
void prepareForSleep(bool prepare);
private Q_SLOTS:
void getSessionActive();

11
main.h
View File

@ -158,6 +158,13 @@ public:
return m_defaultScreen;
}
/**
* Returns @c true if we're in the middle of destroying the X11 connection.
*/
bool isClosingX11Connection() const {
return m_isClosingX11Connection;
}
#ifdef KWIN_BUILD_ACTIVITIES
bool usesKActivities() const {
return m_useKActivities;
@ -233,6 +240,9 @@ protected:
void setTerminating() {
m_terminating = true;
}
void setClosingX11Connection(bool set) {
m_isClosingX11Connection = set;
}
protected:
static int crashes;
@ -255,6 +265,7 @@ private:
#endif
Platform *m_platform = nullptr;
bool m_terminating = false;
bool m_isClosingX11Connection = false;
};
inline static Application *kwinApp()

View File

@ -197,6 +197,7 @@ void Platform::setSoftWareCursor(bool set)
disconnect(Cursors::self(), &Cursors::positionChanged, this, &Platform::triggerCursorRepaint);
disconnect(Cursors::self(), &Cursors::currentCursorChanged, this, &Platform::triggerCursorRepaint);
}
triggerCursorRepaint();
}
void Platform::triggerCursorRepaint()
@ -413,10 +414,14 @@ void Platform::warpPointer(const QPointF &globalPos)
Q_UNUSED(globalPos)
}
bool Platform::supportsQpaContext() const
bool Platform::supportsSurfacelessContext() const
{
if (Compositor *c = Compositor::self()) {
return c->scene()->openGLPlatformInterfaceExtensions().contains(QByteArrayLiteral("EGL_KHR_surfaceless_context"));
Compositor *compositor = Compositor::self();
if (Q_UNLIKELY(!compositor)) {
return false;
}
if (Scene *scene = compositor->scene()) {
return scene->supportsSurfacelessContext();
}
return false;
}
@ -563,4 +568,14 @@ QString Platform::supportInformation() const
return QStringLiteral("Name: %1\n").arg(metaObject()->className());
}
EGLContext Platform::sceneEglGlobalShareContext() const
{
return m_globalShareContext;
}
void Platform::setSceneEglGlobalShareContext(EGLContext context)
{
m_globalShareContext = context;
}
}

View File

@ -100,7 +100,7 @@ public:
* Whether our Compositing EGL display allows a surface less context
* so that a sharing context could be created.
*/
virtual bool supportsQpaContext() const;
bool supportsSurfacelessContext() const;
/**
* The EGLDisplay used by the compositing scene.
*/
@ -118,6 +118,19 @@ public:
void setSceneEglContext(EGLContext context) {
m_context = context;
}
/**
* Returns the compositor-wide shared EGL context. This function may return EGL_NO_CONTEXT
* if the underlying rendering backend does not use EGL.
*
* Note that the returned context should never be made current. Instead, create a context
* that shares with this one and make the new context current.
*/
EGLContext sceneEglGlobalShareContext() const;
/**
* Sets the global share context to @a context. This function is intended to be called only
* by rendering backends.
*/
void setSceneEglGlobalShareContext(EGLContext context);
/**
* The first (in case of multiple) EGLSurface used by the compositing scene.
*/
@ -544,6 +557,7 @@ private:
EGLDisplay m_eglDisplay;
EGLConfig m_eglConfig = nullptr;
EGLContext m_context = EGL_NO_CONTEXT;
EGLContext m_globalShareContext = EGL_NO_CONTEXT;
EGLSurface m_surface = EGL_NO_SURFACE;
int m_hideCursorCounter = 0;
ColorCorrect::Manager *m_colorCorrect = nullptr;

View File

@ -40,11 +40,61 @@ eglBindWaylandDisplayWL_func eglBindWaylandDisplayWL = nullptr;
eglUnbindWaylandDisplayWL_func eglUnbindWaylandDisplayWL = nullptr;
eglQueryWaylandBufferWL_func eglQueryWaylandBufferWL = nullptr;
static EGLContext s_globalShareContext = EGL_NO_CONTEXT;
static bool isOpenGLES_helper()
{
if (qstrcmp(qgetenv("KWIN_COMPOSE"), "O2ES") == 0) {
return true;
}
return QOpenGLContext::openGLModuleType() == QOpenGLContext::LibGLES;
}
static bool ensureGlobalShareContext()
{
const EGLDisplay eglDisplay = kwinApp()->platform()->sceneEglDisplay();
const EGLConfig eglConfig = kwinApp()->platform()->sceneEglConfig();
if (s_globalShareContext != EGL_NO_CONTEXT) {
return true;
}
std::vector<int> attribs;
if (isOpenGLES_helper()) {
EglOpenGLESContextAttributeBuilder builder;
builder.setVersion(2);
attribs = builder.build();
} else {
EglContextAttributeBuilder builder;
attribs = builder.build();
}
s_globalShareContext = eglCreateContext(eglDisplay, eglConfig, EGL_NO_CONTEXT, attribs.data());
if (s_globalShareContext == EGL_NO_CONTEXT) {
qCWarning(KWIN_OPENGL, "Failed to create global share context: 0x%x", eglGetError());
}
kwinApp()->platform()->setSceneEglGlobalShareContext(s_globalShareContext);
return s_globalShareContext != EGL_NO_CONTEXT;
}
static void destroyGlobalShareContext()
{
const EGLDisplay eglDisplay = kwinApp()->platform()->sceneEglDisplay();
if (eglDisplay == EGL_NO_DISPLAY || s_globalShareContext == EGL_NO_CONTEXT) {
return;
}
eglDestroyContext(eglDisplay, s_globalShareContext);
s_globalShareContext = EGL_NO_CONTEXT;
kwinApp()->platform()->setSceneEglGlobalShareContext(EGL_NO_CONTEXT);
}
AbstractEglBackend::AbstractEglBackend()
: QObject(nullptr)
, OpenGLBackend()
{
connect(Compositor::self(), &Compositor::aboutToDestroy, this, &AbstractEglBackend::unbindWaylandDisplay);
connect(Compositor::self(), &Compositor::aboutToDestroy, this, &AbstractEglBackend::teardown);
}
AbstractEglBackend::~AbstractEglBackend()
@ -52,11 +102,12 @@ AbstractEglBackend::~AbstractEglBackend()
delete m_dmaBuf;
}
void AbstractEglBackend::unbindWaylandDisplay()
void AbstractEglBackend::teardown()
{
if (eglUnbindWaylandDisplayWL && m_display != EGL_NO_DISPLAY) {
eglUnbindWaylandDisplayWL(m_display, *(WaylandServer::self()->display()));
}
destroyGlobalShareContext();
}
void AbstractEglBackend::cleanup()
@ -103,6 +154,7 @@ bool AbstractEglBackend::initEglAPI()
qCDebug(KWIN_OPENGL) << "EGL version: " << major << "." << minor;
const QByteArray eglExtensions = eglQueryString(m_display, EGL_EXTENSIONS);
setExtensions(eglExtensions.split(' '));
setSupportsSurfacelessContext(hasExtension(QByteArrayLiteral("EGL_KHR_surfaceless_context")));
return true;
}
@ -198,14 +250,15 @@ void AbstractEglBackend::doneCurrent()
bool AbstractEglBackend::isOpenGLES() const
{
if (qstrcmp(qgetenv("KWIN_COMPOSE"), "O2ES") == 0) {
return true;
}
return QOpenGLContext::openGLModuleType() == QOpenGLContext::LibGLES;
return isOpenGLES_helper();
}
bool AbstractEglBackend::createContext()
{
if (!ensureGlobalShareContext()) {
return false;
}
const bool haveRobustness = hasExtension(QByteArrayLiteral("EGL_EXT_create_context_robustness"));
const bool haveCreateContext = hasExtension(QByteArrayLiteral("EGL_KHR_create_context"));
const bool haveContextPriority = hasExtension(QByteArrayLiteral("EGL_IMG_context_priority"));
@ -276,7 +329,7 @@ bool AbstractEglBackend::createContext()
EGLContext ctx = EGL_NO_CONTEXT;
for (auto it = candidates.begin(); it != candidates.end(); it++) {
const auto attribs = (*it)->build();
ctx = eglCreateContext(m_display, config(), EGL_NO_CONTEXT, attribs.data());
ctx = eglCreateContext(m_display, config(), s_globalShareContext, attribs.data());
if (ctx != EGL_NO_CONTEXT) {
qCDebug(KWIN_OPENGL) << "Created EGL context with attributes:" << (*it).get();
break;
@ -392,11 +445,7 @@ void AbstractEglTexture::updateTexture(WindowPixmap *pixmap)
m_image = EGL_NO_IMAGE_KHR; // The wl_buffer has ownership of the image
// The origin in a dmabuf-buffer is at the upper-left corner, so the meaning
// of Y-inverted is the inverse of OpenGL.
const bool yInverted = !(dmabuf->flags() & KWaylandServer::LinuxDmabufUnstableV1Interface::YInverted);
if (m_size != dmabuf->size() || yInverted != q->isYInverted()) {
m_size = dmabuf->size();
q->setYInverted(yInverted);
}
q->setYInverted(!(dmabuf->flags() & KWaylandServer::LinuxDmabufUnstableV1Interface::YInverted));
if (s) {
s->resetTrackedDamage();
}
@ -552,6 +601,7 @@ bool AbstractEglTexture::loadDmabufTexture(const QPointer< KWaylandServer::Buffe
m_size = dmabuf->size();
q->setYInverted(!(dmabuf->flags() & KWaylandServer::LinuxDmabufUnstableV1Interface::YInverted));
updateMatrix();
return true;
}

View File

@ -69,7 +69,7 @@ protected:
bool createContext();
private:
void unbindWaylandDisplay();
void teardown();
EGLDisplay m_display = EGL_NO_DISPLAY;
EGLSurface m_surface = EGL_NO_SURFACE;

View File

@ -166,11 +166,9 @@ public:
return m_haveSwapBuffersWithDamage;
}
/**
* @returns whether the context is surfaceless
*/
bool isSurfaceLessContext() const {
return m_surfaceLessContext;
bool supportsSurfacelessContext() const
{
return m_haveSurfacelessContext;
}
/**
@ -267,6 +265,11 @@ protected:
m_haveSwapBuffersWithDamage = value;
}
void setSupportsSurfacelessContext(bool value)
{
m_haveSurfacelessContext = value;
}
/**
* @return const QRegion& Damage of previously rendered frame
*/
@ -285,13 +288,6 @@ protected:
m_renderTimer.start();
}
/**
* @param set whether the context is surface less
*/
void setSurfaceLessContext(bool set) {
m_surfaceLessContext = set;
}
/**
* Sets the platform-specific @p extensions.
*
@ -323,6 +319,10 @@ private:
*/
bool m_havePartialUpdate;
bool m_haveSwapBuffersWithDamage = false;
/**
* @brief Whether the backend supports EGL_KHR_surfaceless_context.
*/
bool m_haveSurfacelessContext = false;
/**
* @brief Whether the initialization failed, of course default to @c false.
*/
@ -339,7 +339,6 @@ private:
* @brief Timer to measure how long a frame renders.
*/
QElapsedTimer m_renderTimer;
bool m_surfaceLessContext = false;
QList<QByteArray> m_extensions;
};

Some files were not shown because too many files have changed in this diff Show More