Compare commits

...

50 Commits

Author SHA1 Message Date
2012eab842 Bump version to 3.23.1
Update NEWS.
2016-10-30 22:24:13 +01:00
9ecb488437 Update zh_CN translation 2016-10-30 02:20:44 +08:00
4295fdb892 wayland: do not explicitly focus xdg_popup
The keyboard focus semantics for non-grabbing xdg_shell v6 popups is
pretty undefined.

Same applies for subsurfaces, but in practice, subsurfaces never receive
keyboard focus, so it makes sense to do the same for non-grabbing
popups.

https://bugzilla.gnome.org/show_bug.cgi?id=773210
2016-10-27 17:21:21 +02:00
998d921d41 window: Do not unfocus on new window
mutter would remove focus from a toplevel when showing one of its
transient window which is not on top and not focused.

When using xdg_popup without grab as allowed in xdg_shell v6, the popup
wouldn't be focused, and if an intermediate event occurs before the
popup is shown, it's not placed on top either, which could randomly
trigger a loss of focus in the corresponding toplevel window.

Remove that special case, it doesn't make much sense to globally unset
focus when mapping a new window.

https://bugzilla.gnome.org/show_bug.cgi?id=773210
2016-10-27 17:21:21 +02:00
d491063110 native: don't call steal_pointer prematurely
commit e2bfaf0751 does this:

g_hash_table_insert (cards,
                     g_udev_device_get_name (parent_device),
                     g_steal_pointer (&parent_device));

The problem is the g_steal_pointer call may happen before the
g_udev_device_get_name call leading to a crash.

This commit does the get_name call on an earlier line

https://bugzilla.gnome.org/show_bug.cgi?id=771442
2016-10-19 15:23:37 -04:00
e2bfaf0751 native: fail on systems with connectors spread across multiple gpus
We don't support using more than one GPU for output yet, so we should fail
if we encounter that situation, so GDM will fall back to X.

https://bugzilla.gnome.org/show_bug.cgi?id=771442
2016-10-19 13:08:19 -04:00
f1e1a5ff06 native: shore up matching of card device
Right now we accept any character device that matches the glob card*.

That's fine, but we can be a little more specific by checking that
the devtype is what we expect.

This commit does that.

https://bugzilla.gnome.org/show_bug.cgi?id=771442
2016-10-19 11:21:32 -04:00
ef2000053a native: only match drm subsystem devices
Despite g_udev_client_new taking a list of subsystems, it doesn't
implicitly filter results to those subsystems.

This commit explicitly adds a subsystem match to make sure sound cards
don't end up in the resulting list of video cards.

https://bugzilla.gnome.org/show_bug.cgi?id=771442
2016-10-19 10:14:13 -04:00
8a7876ded5 wayland: Don't cancel the pointer grab on compositor grabs
We shouldn't cancel the pointer grab when there is a compositor grab,
since that'd break things like drag-n-drop via the overview and
alt-tabs.

The original reason for cancelling the pointer grab on compositor grabs
was to avoid a re-entry when a compositor grab was activated while
there was an active pointer constraint grab. The re-entry would happen
when the compositor grab cleared the pointer focus. Clearing the focus
would trigger the pointer constraint to be deactivated, which would end
its grab. Ending the grab would reset the grab to the default one, which
could focus the same surface again, triggering the constraint to
re-enable before it finished disabling.

This is now avoided because the default grab handler is now aware of
compositor grabs, and won't override the cleared pointer focus until
the compositor grab ends.

https://bugzilla.gnome.org/show_bug.cgi?id=772914
2016-10-19 15:45:33 +08:00
b50da46f43 wayland/pointer: Don't set focus while during compositor grab
Teach the default grab about compositor grabs (i.e.
display->event_route) so that it can avoid setting a pointer focus when
after the compositor grab actively unset the pointer focus.

https://bugzilla.gnome.org/show_bug.cgi?id=772914
2016-10-19 15:45:33 +08:00
8b0e9706ca constraints: Use ConstraintInfo window size when placing
The frame rect will at this point not be set for Wayland popups, since
the popup is placed and constrained before the actual buffer will be
attached. To still be able to calculate a proper monitor to be used for
constraining, use the ConstraintInfo::current dimensions instead, since
they will have the expected size. This should not cause any issues with
present paths since when a window is otherwise placed, it usually
doesn't change monitor calculation result.

This fixes opening a popup menu that would be positioned on the left
edge of a not-left-most monitor, for example a 'File' menu on a window
maximized on a second monitor.

https://bugzilla.gnome.org/show_bug.cgi?id=773141
2016-10-19 15:14:23 +08:00
1d4a5a7520 MetaOnscreenNative: fix mirror mode with stage views
Using the view's MetaMonitorInfo to find all the crtcs which should be
configured to display a given onscreen doesn't work unfortunately. The
association runs only the other way around, i.e. we need to go through
each crtc and find the ones corresponding to our monitor info.

https://bugzilla.gnome.org/show_bug.cgi?id=773115
2016-10-18 14:11:10 +02:00
8290e1f09a MetaRendererNative: don't call drmModeGetResources()
There's no need to call this and we were leaking the returned memory.

https://bugzilla.gnome.org/show_bug.cgi?id=773116
2016-10-18 14:10:58 +02:00
89672fad04 MetaMonitorManageKms: plug a GArray leak
https://bugzilla.gnome.org/show_bug.cgi?id=773116
2016-10-18 14:10:55 +02:00
1cb9cfe11d Updated Dutch translation Master 3.24 2016-10-17 18:26:41 +02:00
280e297afe MetaIdleMonitorNative: initialize last event timestamp
If this isn't initialized and an idle watch gets instanced before
meta_idle_monitor_native_reset_idletime() gets called, that idle watch
would get triggered as soon as we hit the main loop.

This was causing gnome-session to go into idle mode at session start
thus making gnome-shell lock the screen.

In the past this bug was being masked by either logind emiting
session active signals or a stray input event making it through at
startup.

https://bugzilla.gnome.org/show_bug.cgi?id=772839
2016-10-17 13:47:20 +02:00
fc8de3d0c8 clutter/stage: Fix framebuffer capture origin offset (again)
Commit 5fbb479301 was wrong too. What we
really want to do here is getting view relative coordinates given the
view's and the rectangle's global coordinates so we need to subtract
the view's origin from the rectangle's.

https://bugzilla.gnome.org/show_bug.cgi?id=771502
2016-10-17 13:47:20 +02:00
3e2555667f MetaWaylandDataSourcePrimary: use the correct parent GType
https://bugzilla.gnome.org/show_bug.cgi?id=771019
2016-10-17 13:47:20 +02:00
1ecadb6e57 Updated Norwegian bokmål translation. 2016-10-15 17:12:17 +02:00
2abee91dbc wayland: Cancel touches on meta_wayland_touch_disable()
When disabling the device/capability, we can't rely on cancelled events
being emitted timely, because the capability will be already disabled by
then, all touches must be cancelled immediately then.

https://bugzilla.gnome.org/show_bug.cgi?id=772929
2016-10-14 18:22:42 +02:00
68645df3a3 wayland/xdg-shell: Scale positioner coordinates
When the monitor is scaled (i.e. HiDPI scaling) the placement coordinates
ere still in unscaled xdg_surface window geometry coordinate space when
used to place the window. Fix this by scaling the coordinates by the
monitor scale of the parent toplevel window before using them.

https://bugzilla.gnome.org/show_bug.cgi?id=771841
2016-10-13 13:57:54 +08:00
d2f79afc1a wayland/xdg-shell: update popup window monitor early
As meta_window_place_with_placement_rule will trigger a configure event
being sent ensure that the popup is placed on the correct monitor first
to ensure the right scale factor is applied.

Signed-off-by: Sjoerd Simons <sjoerd.simons@collabora.co.uk>

https://bugzilla.gnome.org/show_bug.cgi?id=771841
2016-10-13 13:57:54 +08:00
8a6fa726d3 wayland/xdg-popup: Force monitor of the top-level
Directly set the monitor of the toplevel window for the popup to avoid
the change not being applied due to later constraints calculation.

Signed-off-by: Sjoerd Simons <sjoerd.simons@collabora.co.uk>

https://bugzilla.gnome.org/show_bug.cgi?id=771841
2016-10-13 13:57:54 +08:00
a3d7ae6214 wayland/xdg-shell: Scale configure relative popup coordinate
The parent local popup coordinate needs to be scaled according to the
monitor scale it is assigned.

https://bugzilla.gnome.org/show_bug.cgi?id=771841
2016-10-13 13:57:54 +08:00
c0c132a320 wayland/xdg-popup: Always use monitor of toplevel
Always use the monitor of the toplevel surface's window, so that the
popup menu and the parent will always have the same scale. This fixes
the dimensions sent in the xdg_popup configure event.

https://bugzilla.gnome.org/show_bug.cgi?id=771841
2016-10-13 13:57:54 +08:00
0dfb5d3ef7 wayland/touch: Use surface relative coordinate helper
Use the global to surface local coordinate converter helper, as that
will currently convert coordinates for Xwayland client more correctly.

https://bugzilla.gnome.org/show_bug.cgi?id=768039
2016-10-13 13:57:54 +08:00
6480a7ee4a wayland/pointer-constraints: Don't include window frame in region
When Xwayland confines, the surface dimensions will include the server
side window manager decorations. We don't want the decorations to be
included in the constraint region so intersect the calculated input
region with the parts of the buffer rect that is not part of the window
frame.

https://bugzilla.gnome.org/show_bug.cgi?id=771859
2016-10-13 12:59:41 +08:00
6cc8450f8e wayland/pointer-constraints: Unify requirements for enablement
Put the conditions for enabling a pointer constraint in a helper
function, and use that in both maybe_enable() and maybe_remove(). The
constraint region checking is still only done in maybe_enable()
however.

This changes the conditions for maybe disabling the constraint on focus
change and other trigger points, namely it makes constraints by Xwayland
not disable when they shouldn't due to the constraining window being an
override-redirect window.

https://bugzilla.gnome.org/show_bug.cgi?id=771859
2016-10-13 12:59:41 +08:00
7ae4b28bda wayland/pointer-constraints: Disable or remove when grab is cancelled
When the grab is cancelled, for example because of an Alt-tab, VT
switch etc, disable or remove (depending on the constraint type) the
constraint. This avoids a re-entry issue when the focus is returned and
the focus listener tries to re-enable a disabled constraint.

https://bugzilla.gnome.org/show_bug.cgi?id=771859
2016-10-13 12:59:41 +08:00
bb8e6afae6 Fix typo in Thai translation 2016-10-13 11:22:35 +07:00
d7f61e48ac wayland: apply size hints after placing the window
Otherwise the window will be shown initially in the wrong position then
moved quickly as soon as it's made visible, which is confusing.

https://bugzilla.gnome.org/show_bug.cgi?id=772729
2016-10-12 10:16:13 +02:00
9de6de5802 MetaWaylandPopup: Dismiss popup when grab is cancelled
Dismiss the popup when the grab is cancelled, so that if the grab is
ended for whatever reason (such as VT switching or the last pointer
being disconnected), it doesn't try to end the grab when it isn't
active.

This fixes a crash when VT switching back and forth while a popup grab
is active.

https://bugzilla.gnome.org/show_bug.cgi?id=771858
2016-10-12 10:08:59 +08:00
6e7057426e wayland/pointer: Add way to cancel current grab
Previously a grab could suddenly end without the grabber knowing
anything about it. Some grabs assume they won't suddenly end without
notice, and can use then new 'cancel' vfunc to be notified.

Currently a grab is cancelled when a new one is started (i.e. in
meta_wayland_pointer_grab_start()), when a non-popup compositor wide
event route is initiated, and when the seat looses the pointer
capability.

https://bugzilla.gnome.org/show_bug.cgi?id=771858
2016-10-12 10:08:59 +08:00
5306d36522 wayland/touch: Use helper for getting the next event serial
https://bugzilla.gnome.org/show_bug.cgi?id=771646
2016-10-11 22:51:54 +08:00
7990182f56 wayland/pointer: Use grab helper that doesn't focus when disabling
Instead of using meta_wayland_pointer_end_grab() which focuses the new
grab, add a new helper mean to be used to reset the grab state without
changing the pointer focus. When using this function, the call site is
supposed to explicitly manage focus.

https://bugzilla.gnome.org/show_bug.cgi?id=771646
2016-10-11 22:51:54 +08:00
93a6be08a5 wayland/pointer: Naming and coding style fixes
Some very long lines that stood out were shortened, and an old naming
convention from weston was removed.

https://bugzilla.gnome.org/show_bug.cgi?id=771646
2016-10-11 22:51:54 +08:00
d5d5084151 wayland/pointer: Check pointer presence at set focus call site
Make the caller of focus setting check whether there is a pointer to
update the focus state of. It makes it more obvious what to expect, as
the call would be a no-op in when no pointer is present.

Grabbing is still allowed without the presence of a pointer because it
is used by popups even on touch-only systems.

https://bugzilla.gnome.org/show_bug.cgi?id=771646
2016-10-11 22:51:54 +08:00
d3cff9a962 wayland/pointer: Use helper for getting the next event serial
Use the MetaWaylandInputDevice helper for serial retrieval.

https://bugzilla.gnome.org/show_bug.cgi?id=771646
2016-10-11 22:51:54 +08:00
133bbdfefa wayland/keyboard: Check keyboard presence at set focus call site
Make the caller of focus setting and grab starting check whether there
is a keyboard to update the focus state or start grabbing. It makes it
more obvious what to expect, as the call would be a no-op in when no
keyboard is present.

https://bugzilla.gnome.org/show_bug.cgi?id=771646
2016-10-11 22:51:54 +08:00
a8c3470cf2 wayland/seat: Use seat capability checking helper
https://bugzilla.gnome.org/show_bug.cgi?id=771646
2016-10-11 22:51:54 +08:00
578e527869 wayland/keyboard: Cleanup resource list management
Initialize on init(), unlink and reinitialize the list headers on
disable() so that any delayed resource destruction doesn't affect future
state.

https://bugzilla.gnome.org/show_bug.cgi?id=771646
2016-10-11 22:51:54 +08:00
312f215fc3 wayland/keyboard: Cleanup grab state managing
Initialize on init() and just end grab on disable().

https://bugzilla.gnome.org/show_bug.cgi?id=771646
2016-10-11 22:51:54 +08:00
d639c28e3b wayland/keyboard: Cleanup xkb state managing
Initialize and cleanup properly in a _init()/_destroy() function pair.

https://bugzilla.gnome.org/show_bug.cgi?id=771646
2016-10-11 22:51:54 +08:00
c3f7259cbb wayland/keyboard: Initialize static state in GObject init func
https://bugzilla.gnome.org/show_bug.cgi?id=771646
2016-10-11 22:51:54 +08:00
56e8f98c13 wayland/keyboard: Naming and coding style fixes
Some very long lines that stood out were shortened, and an old naming
convention from weston was removed.

https://bugzilla.gnome.org/show_bug.cgi?id=771646
2016-10-11 22:51:54 +08:00
c2217373df wayland/keyboard: Scope variable correctly
https://bugzilla.gnome.org/show_bug.cgi?id=771646
2016-10-11 22:51:54 +08:00
4a3781d7db wayland/keyboard: Stop using temporary wl_list 'l'
The variable name 'l' usually refers to a GList iterator, but here it's
just a short hand for a specific list. Stop using this shorthand, since
it just makes it harder to read what list is used.

https://bugzilla.gnome.org/show_bug.cgi?id=771646
2016-10-11 22:51:53 +08:00
911a838c3a wayland/keyboard: Simplify getting the serial serial
Use the MetaWaylandInputDevice helper for getting the next event serial
number.

https://bugzilla.gnome.org/show_bug.cgi?id=771646
2016-10-11 22:51:53 +08:00
c6106f90d4 wayland/input-device: Add next serial helper
Add a helper function for getting the next input device serial number.
Will be used by keyboard, pointer and touch devices.

https://bugzilla.gnome.org/show_bug.cgi?id=771646
2016-10-11 22:51:50 +08:00
ed52e17886 delete: Swap wait/force-quit actions
The order doesn't only affect the visual layout, but also which action
cancels the dialog (and therefore responds to Escape). It is completely
surprising that this triggers a destructive action like force-quit, so
swap the actions to wait when the dialog is cancelled.

https://bugzilla.gnome.org/show_bug.cgi?id=737109
2016-10-11 00:54:25 +02:00
26 changed files with 1360 additions and 1403 deletions

21
NEWS
View File

@ -1,3 +1,24 @@
3.23.1
======
* Fix handling of Escape shortcut in force-quit dialog [Landry; #737109]
* Improve pointer constraints support [Jonas; #771859]
* Really fix framebuffer capture origin offset [Rui; #771502]
* Fix session going into idle mode immediately on startup [Rui; #772839]
* Fix mirror mode with stage views [Rui; #773115]
* Fall back to X with connectors spread across multiple GPUs [Ray; #771442]
* Fix various crashes on wayland [Jonas, Carlos; #771646, #771858, #772929]
* Fix various placement issues on wayland [Olivier, Jonas, Sjoerd; #772729,
#768039, #771841, #771841, #773141]
* Misc. bug fixes [Rui, Jonas, Olivier; #771019, #773116, #772914, #773210]
Contributors:
Jonas Ådahl, Olivier Fourdan, Carlos Garnacho, Rui Matos, Landry MINOZA,
Sjoerd Simons, Ray Strode
Translations:
Theppitak Karoonboonyanan [th], Kjartan Maraas [nb], Hannie Dumoleyn [nl],
liushuyu [zh_CN]
3.22.1
======
* Fix feedback loop between StClipboard and X11 bridge [Carlos; #760745]

View File

@ -4712,8 +4712,8 @@ capture_view (ClutterStage *stage,
clutter_stage_view_get_layout (view, &view_layout);
cogl_framebuffer_read_pixels_into_bitmap (framebuffer,
view_layout.x + rect->x,
view_layout.y + rect->y,
rect->x - view_layout.x,
rect->y - view_layout.y,
COGL_READ_PIXELS_COLOR_BUFFER,
bitmap);

View File

@ -1,7 +1,7 @@
AC_PREREQ(2.62)
m4_define([mutter_major_version], [3])
m4_define([mutter_minor_version], [22])
m4_define([mutter_minor_version], [23])
m4_define([mutter_micro_version], [1])
m4_define([mutter_version],

850
po/nb.po
View File

@ -1,13 +1,13 @@
# Norwegian bokmål translation of mutter.
# Copyright © 2002-2004 Free Software Foundation, Inc.
# Kjartan Maraas <kmaraas@gnome.org>, 2002-2015.
# Kjartan Maraas <kmaraas@gnome.org>, 2002-2016.
#
msgid ""
msgstr ""
"Project-Id-Version: mutter 3.15.x\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-03-19 21:23+0100\n"
"PO-Revision-Date: 2015-03-19 21:24+0100\n"
"Project-Id-Version: mutter 3.23.x\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=mutter&keywords=I18N+L10N&component=general\n"
"POT-Creation-Date: 2016-10-15 17:12+0200\n"
"PO-Revision-Date: 2016-10-15 17:12+0200\n"
"Last-Translator: Kjartan Maraas <kmaraas@gnome.org>\n"
"Language-Team: Norwegian bokmål <i18n-no@lister.ping.uio.no>\n"
"Language: nb\n"
@ -15,469 +15,47 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
#: ../data/50-mutter-navigation.xml.in.h:1
msgid "Navigation"
msgstr "Navigering"
#: ../data/50-mutter-navigation.xml.in.h:2
msgid "Move window to workspace 1"
msgstr "Flytt vindu til arbeidsområde 1"
#: ../data/50-mutter-navigation.xml.in.h:3
msgid "Move window to workspace 2"
msgstr "Flytt vindu til arbeidsområde 2"
#: ../data/50-mutter-navigation.xml.in.h:4
msgid "Move window to workspace 3"
msgstr "Flytt vindu til arbeidsområde 3"
#: ../data/50-mutter-navigation.xml.in.h:5
msgid "Move window to workspace 4"
msgstr "Flytt vindu til arbeidsområde 4"
#: ../data/50-mutter-navigation.xml.in.h:6
msgid "Move window to last workspace"
msgstr "Flytt vindu til siste arbeidsområde"
#: ../data/50-mutter-navigation.xml.in.h:7
msgid "Move window one workspace to the left"
msgstr "Flytt vindu ett arbeidsområde til venstre"
#: ../data/50-mutter-navigation.xml.in.h:8
msgid "Move window one workspace to the right"
msgstr "Flytt vindu ett arbeidsområde til høyre"
#: ../data/50-mutter-navigation.xml.in.h:9
msgid "Move window one workspace up"
msgstr "Flytt vindu ett arbeidsområde opp"
#: ../data/50-mutter-navigation.xml.in.h:10
msgid "Move window one workspace down"
msgstr "Flytt vindu ett arbeidsområde ned"
#: ../data/50-mutter-navigation.xml.in.h:11
msgid "Move window one monitor to the left"
msgstr "Flytt vindu en skjerm til venstre"
#: ../data/50-mutter-navigation.xml.in.h:12
msgid "Move window one monitor to the right"
msgstr "Flytt vindu en skjerm til høyre"
#: ../data/50-mutter-navigation.xml.in.h:13
msgid "Move window one monitor up"
msgstr "Flytt vindu en skjerm opp"
#: ../data/50-mutter-navigation.xml.in.h:14
msgid "Move window one monitor down"
msgstr "Flytt vindu en skjerm ned"
#: ../data/50-mutter-navigation.xml.in.h:15
msgid "Switch applications"
msgstr "Bytt programmer"
#: ../data/50-mutter-navigation.xml.in.h:16
msgid "Switch to previous application"
msgstr "Bytt til forrige program"
#: ../data/50-mutter-navigation.xml.in.h:17
msgid "Switch windows"
msgstr "Bytt vinduer"
#: ../data/50-mutter-navigation.xml.in.h:18
msgid "Switch to previous window"
msgstr "Bytt forrige vindu"
#: ../data/50-mutter-navigation.xml.in.h:19
msgid "Switch windows of an application"
msgstr "Bytt mellom et programs vinduer"
#: ../data/50-mutter-navigation.xml.in.h:20
msgid "Switch to previous window of an application"
msgstr "Bytt til forrige vindu i et program"
#: ../data/50-mutter-navigation.xml.in.h:21
msgid "Switch system controls"
msgstr "Bytt systemkontroller"
#: ../data/50-mutter-navigation.xml.in.h:22
msgid "Switch to previous system control"
msgstr "Bytt til forrige systemkontroll"
#: ../data/50-mutter-navigation.xml.in.h:23
msgid "Switch windows directly"
msgstr "Bytt vinduer direkte"
#: ../data/50-mutter-navigation.xml.in.h:24
msgid "Switch directly to previous window"
msgstr "Bytt direkte til forrige vindu"
#: ../data/50-mutter-navigation.xml.in.h:25
msgid "Switch windows of an app directly"
msgstr "Bytt mellom et programs vinduer direkte"
#: ../data/50-mutter-navigation.xml.in.h:26
msgid "Switch directly to previous window of an app"
msgstr "Bytt direkte til forrive vindu i et program"
#: ../data/50-mutter-navigation.xml.in.h:27
msgid "Switch system controls directly"
msgstr "Bytt systemkontroller direkte"
#: ../data/50-mutter-navigation.xml.in.h:28
msgid "Switch directly to previous system control"
msgstr "Bytt direkte til forrige systemkontroll"
#: ../data/50-mutter-navigation.xml.in.h:29
msgid "Hide all normal windows"
msgstr "Skjul alle normale vinduer"
#: ../data/50-mutter-navigation.xml.in.h:30
msgid "Switch to workspace 1"
msgstr "Bytt til arbeidsområde 1"
#: ../data/50-mutter-navigation.xml.in.h:31
msgid "Switch to workspace 2"
msgstr "Bytt til arbeidsområde 2"
#: ../data/50-mutter-navigation.xml.in.h:32
msgid "Switch to workspace 3"
msgstr "Bytt til arbeidsområde 3"
#: ../data/50-mutter-navigation.xml.in.h:33
msgid "Switch to workspace 4"
msgstr "Bytt til arbeidsområde 4"
#: ../data/50-mutter-navigation.xml.in.h:34
msgid "Switch to last workspace"
msgstr "Bytt til siste arbeidsområde"
#: ../data/50-mutter-navigation.xml.in.h:35
msgid "Move to workspace left"
msgstr "Flytt til arbeidsområdet til venstre"
#: ../data/50-mutter-navigation.xml.in.h:36
msgid "Move to workspace right"
msgstr "Flytt til arbeidsområdet til høyre"
#: ../data/50-mutter-navigation.xml.in.h:37
msgid "Move to workspace above"
msgstr "Flytt til arbeidsområdet over"
#: ../data/50-mutter-navigation.xml.in.h:38
msgid "Move to workspace below"
msgstr "Flytt til arbeidsområdet under"
#: ../data/50-mutter-system.xml.in.h:1
msgid "System"
msgstr "System"
#: ../data/50-mutter-system.xml.in.h:2
msgid "Show the run command prompt"
msgstr "Vis kommandolinje"
#: ../data/50-mutter-system.xml.in.h:3
msgid "Show the activities overview"
msgstr "Vis oversikt over aktiviteter"
#: ../data/50-mutter-windows.xml.in.h:1
msgid "Windows"
msgstr "Vinduer"
#: ../data/50-mutter-windows.xml.in.h:2
msgid "Activate the window menu"
msgstr "Aktiver vindumenyen"
#: ../data/50-mutter-windows.xml.in.h:3
msgid "Toggle fullscreen mode"
msgstr "Slå av/på fullskjermmodus"
#: ../data/50-mutter-windows.xml.in.h:4
msgid "Toggle maximization state"
msgstr "Endre tilstand for maksimering"
#: ../data/50-mutter-windows.xml.in.h:5
msgid "Maximize window"
msgstr "Maksimer vindu"
#: ../data/50-mutter-windows.xml.in.h:6
msgid "Restore window"
msgstr "Gjenopprett vindu"
#: ../data/50-mutter-windows.xml.in.h:7
msgid "Toggle shaded state"
msgstr "Endre tilstand for skyggelegging"
#: ../data/50-mutter-windows.xml.in.h:8
msgid "Close window"
msgstr "Lukk vindu"
#: ../data/50-mutter-windows.xml.in.h:9
msgid "Hide window"
msgstr "Skjul vindu"
#: ../data/50-mutter-windows.xml.in.h:10
msgid "Move window"
msgstr "Flytt vindu"
#: ../data/50-mutter-windows.xml.in.h:11
msgid "Resize window"
msgstr "Endre størrelse på vindu"
#: ../data/50-mutter-windows.xml.in.h:12
msgid "Toggle window on all workspaces or one"
msgstr "Slå av/på om vinduet skal vises på alle arbeidsområder eller bare ett"
#: ../data/50-mutter-windows.xml.in.h:13
msgid "Raise window if covered, otherwise lower it"
msgstr "Hev vindu hvis skjult av et annet vindu, senk det ellers"
#: ../data/50-mutter-windows.xml.in.h:14
msgid "Raise window above other windows"
msgstr "Hev vinduet over andre vinduer"
#: ../data/50-mutter-windows.xml.in.h:15
msgid "Lower window below other windows"
msgstr "Senk vinduet under andre vinduer"
#: ../data/50-mutter-windows.xml.in.h:16
msgid "Maximize window vertically"
msgstr "Maksimer vinduet vertikalt"
#: ../data/50-mutter-windows.xml.in.h:17
msgid "Maximize window horizontally"
msgstr "Maksimer vinduet horisontalt"
#: ../data/50-mutter-windows.xml.in.h:18
msgid "View split on left"
msgstr "Visning delt til venstre"
#: ../data/50-mutter-windows.xml.in.h:19
msgid "View split on right"
msgstr "Visning delt til høyre"
#: ../data/mutter.desktop.in.h:1
msgid "Mutter"
msgstr "Mutter"
#: ../data/org.gnome.mutter.gschema.xml.in.h:1
msgid "Modifier to use for extended window management operations"
msgstr "Endringstast som skal brukes for utvidede vindushåndteringsoperasjoner"
#: ../data/org.gnome.mutter.gschema.xml.in.h:2
msgid ""
"This key will initiate the \"overlay\", which is a combination window "
"overview and application launching system. The default is intended to be the "
"\"Windows key\" on PC hardware. It's expected that this binding either the "
"default or set to the empty string."
msgstr ""
"Denne tasten vil initiere «overlay», som er en kombinasjon av vindusoversikt "
"og et system for å starte programmer. Forvalget er ment å være «Windows-"
"tasten» på PC-maskinvare. Det forventes at denne bindingen er satt til "
"forvalg eller en tom streng."
#: ../data/org.gnome.mutter.gschema.xml.in.h:3
msgid "Attach modal dialogs"
msgstr "Fest modale dialoger"
#: ../data/org.gnome.mutter.gschema.xml.in.h:4
msgid ""
"When true, instead of having independent titlebars, modal dialogs appear "
"attached to the titlebar of the parent window and are moved together with "
"the parent window."
msgstr ""
"Hvis denne er satt til sann vil modale dialoger vises festet til "
"tittellinjen på opphavsvinduet og flyttes sammen med dette i stedet for å ha "
"individuelle tittellinjer."
#: ../data/org.gnome.mutter.gschema.xml.in.h:5
msgid "Enable edge tiling when dropping windows on screen edges"
msgstr "Slå på kantflising ved slipp av vinduer på skjermkantene"
#: ../data/org.gnome.mutter.gschema.xml.in.h:6
msgid ""
"If enabled, dropping windows on vertical screen edges maximizes them "
"vertically and resizes them horizontally to cover half of the available "
"area. Dropping windows on the top screen edge maximizes them completely."
msgstr ""
"Maksimerer vinduer vertikalt og endrer størrelse horisontalt slik at de "
"dekker halve det tilgjengeligeområdet hvis de slippes på vertikale "
"skjermkanter. Hvis vindu slippes på øverste kant av skjermen maksimeres de "
"fullstendig."
#: ../data/org.gnome.mutter.gschema.xml.in.h:7
msgid "Workspaces are managed dynamically"
msgstr "Arbeidsområder håndteres dynamisk"
#: ../data/org.gnome.mutter.gschema.xml.in.h:8
msgid ""
"Determines whether workspaces are managed dynamically or whether there's a "
"static number of workspaces (determined by the num-workspaces key in org."
"gnome.desktop.wm.preferences)."
msgstr ""
"Bestemmer om arbeidsområder skal håndteres dynamisk eller om det er et fast "
"antall arbeidsområder (bestemt av num-workspaces nøkkelen i org.gnome."
"desktop.wm.preferences)."
#: ../data/org.gnome.mutter.gschema.xml.in.h:9
msgid "Workspaces only on primary"
msgstr "Arbeidsområder kun på primær skjerm"
#: ../data/org.gnome.mutter.gschema.xml.in.h:10
msgid ""
"Determines whether workspace switching should happen for windows on all "
"monitors or only for windows on the primary monitor."
msgstr ""
"Bestemmer om bytting mellom arbeidsområder skal skje for vinduer på alle "
"skjermer eller kun på primær skjerm."
#: ../data/org.gnome.mutter.gschema.xml.in.h:11
msgid "No tab popup"
msgstr "Ingen tabulatordialog"
#: ../data/org.gnome.mutter.gschema.xml.in.h:12
msgid ""
"Determines whether the use of popup and highlight frame should be disabled "
"for window cycling."
msgstr ""
"Bestemmer om bruk av dialog og uthevingsramme skal slås av for bytting "
"mellom vinduer."
#: ../data/org.gnome.mutter.gschema.xml.in.h:13
msgid "Delay focus changes until the pointer stops moving"
msgstr "Utsett fokusendringer til pekeren slutter å bevege seg"
#: ../data/org.gnome.mutter.gschema.xml.in.h:14
msgid ""
"If set to true, and the focus mode is either \"sloppy\" or \"mouse\" then "
"the focus will not be changed immediately when entering a window, but only "
"after the pointer stops moving."
msgstr ""
"Hvis denne settes til «true» og fokusmodus er enten «sloppy» eller «mouse» "
"så vil fokus ikke endres med en gang markøren kommer inn i et vindu, men i "
"stedet når markørens bevegelse stopper."
#: ../data/org.gnome.mutter.gschema.xml.in.h:15
msgid "Draggable border width"
msgstr "Bredde på drakant"
#: ../data/org.gnome.mutter.gschema.xml.in.h:16
msgid ""
"The amount of total draggable borders. If the theme's visible borders are "
"not enough, invisible borders will be added to meet this value."
msgstr ""
"Total mengde med drakant. Hvis temas synlige kanter ikke er nok vil usynlige "
"kanter legges til for å imøtekomme denne verdien."
#: ../data/org.gnome.mutter.gschema.xml.in.h:17
msgid "Auto maximize nearly monitor sized windows"
msgstr "Maksimer vinduer automatisk hvis de er nesten like store som skjermen"
#: ../data/org.gnome.mutter.gschema.xml.in.h:18
msgid ""
"If enabled, new windows that are initially the size of the monitor "
"automatically get maximized."
msgstr ""
"Nye vinduer som i utgangspunktet er samme størrelse som skjermen vil "
"automatisk bli maksimert hvis denne slås på."
#: ../data/org.gnome.mutter.gschema.xml.in.h:19
msgid "Place new windows in the center"
msgstr "Plasser nye vinduer i senter"
#: ../data/org.gnome.mutter.gschema.xml.in.h:20
msgid ""
"When true, the new windows will always be put in the center of the active "
"screen of the monitor."
msgstr ""
"Når denne er «true» vil mye vinduer alltid plasseres midt på aktivt område "
"på skjermen."
#: ../data/org.gnome.mutter.gschema.xml.in.h:21
msgid "Select window from tab popup"
msgstr "Fjern vindu fra tabulatordialog"
#: ../data/org.gnome.mutter.gschema.xml.in.h:22
msgid "Cancel tab popup"
msgstr "Avbryt tabulatordialog"
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:1
msgid "Switch to VT 1"
msgstr "Bytt til VT 1"
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:2
msgid "Switch to VT 2"
msgstr "Bytt til VT 2"
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:3
msgid "Switch to VT 3"
msgstr "Bytt til VT 3"
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:4
msgid "Switch to VT 4"
msgstr "Bytt til VT 4"
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:5
msgid "Switch to VT 5"
msgstr "Bytt til VT 5"
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:6
msgid "Switch to VT 6"
msgstr "Bytt til VT 6"
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:7
msgid "Switch to VT 7"
msgstr "Bytt til VT 7"
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:8
msgid "Switch to VT 8"
msgstr "Bytt til VT 8"
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:9
msgid "Switch to VT 9"
msgstr "Bytt til VT 9"
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:10
msgid "Switch to VT 10"
msgstr "Bytt til VT 10"
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:11
msgid "Switch to VT 11"
msgstr "Bytt til VT 11"
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:12
msgid "Switch to VT 12"
msgstr "Bytt til VT 12"
#: ../src/backends/meta-monitor-manager.c:364
#. TRANSLATORS: This string refers to an action, cycles drawing tablets'
#. * mapping through the available outputs.
#.
#: ../src/backends/meta-input-settings.c:1847
msgid "Switch monitor"
msgstr "Bytt skjerm"
#: ../src/backends/meta-input-settings.c:1849
msgid "Show on-screen help"
msgstr "Vis hjelp på skjermen"
#: ../src/backends/meta-monitor-manager.c:514
msgid "Built-in display"
msgstr "Innebygget skjerm"
#: ../src/backends/meta-monitor-manager.c:391
#: ../src/backends/meta-monitor-manager.c:537
msgid "Unknown"
msgstr "Ukjent"
#: ../src/backends/meta-monitor-manager.c:393
#: ../src/backends/meta-monitor-manager.c:539
msgid "Unknown Display"
msgstr "Ukjent skjerm"
#. TRANSLATORS: this is a monitor vendor name, followed by a
#. * size in inches, like 'Dell 15"'
#.
#: ../src/backends/meta-monitor-manager.c:401
#: ../src/backends/meta-monitor-manager.c:547
#, c-format
msgid "%s %s"
msgstr "%s %s"
#. This probably means that a non-WM compositor like xcompmgr is running;
#. * we have no way to get it to exit
#: ../src/compositor/compositor.c:456
#: ../src/compositor/compositor.c:463
#, c-format
msgid ""
"Another compositing manager is already running on screen %i on display \"%s"
"\"."
msgstr "En annen compositing manager kjører skjerm %i på display «%s»."
#: ../src/core/bell.c:185
#: ../src/core/bell.c:194
msgid "Bell event"
msgstr "Klokkehendelse"
@ -498,48 +76,52 @@ msgstr ""
"Du kan velge å vente en kort stund for å se om det fortsetter eller tvinge "
"programmet til å avslutte helt."
#: ../src/core/delete.c:141
msgid "_Wait"
msgstr "_Vent"
#: ../src/core/delete.c:141
msgid "_Force Quit"
msgstr "_Tvungen nedstenging"
#: ../src/core/display.c:562
#: ../src/core/delete.c:141
msgid "_Wait"
msgstr "_Vent"
#: ../src/core/display.c:590
#, c-format
msgid "Failed to open X Window System display '%s'\n"
msgstr "Feil under åpning av X Window System skjerm «%s»\n"
#: ../src/core/main.c:176
#: ../src/core/main.c:182
msgid "Disable connection to session manager"
msgstr "Deaktiver tilkobling til sesjonshåndtereren"
#: ../src/core/main.c:182
#: ../src/core/main.c:188
msgid "Replace the running window manager"
msgstr "Erstatt kjørende vindushåndterer"
#: ../src/core/main.c:188
#: ../src/core/main.c:194
msgid "Specify session management ID"
msgstr "Oppgi sesjonshåndterings-ID"
#: ../src/core/main.c:193
#: ../src/core/main.c:199
msgid "X Display to use"
msgstr "X-skjerm som skal brukes"
#: ../src/core/main.c:199
#: ../src/core/main.c:205
msgid "Initialize session from savefile"
msgstr "Initier sesjonen fra en lagret fil"
#: ../src/core/main.c:205
#: ../src/core/main.c:211
msgid "Make X calls synchronous"
msgstr "Gjør X-kall synkrone"
#: ../src/core/main.c:212
#: ../src/core/main.c:218
msgid "Run as a wayland compositor"
msgstr "Kjør som en wayland-kompositør"
#: ../src/core/main.c:220
#: ../src/core/main.c:224
msgid "Run as a nested compositor"
msgstr "Kjør som en nøstet kompositør"
#: ../src/core/main.c:232
msgid "Run as a full display server, rather than nested"
msgstr "Kjør som en full skjermtjener, heller enn nøstet"
@ -565,27 +147,34 @@ msgstr "Skriv versjonsnummer"
msgid "Mutter plugin to use"
msgstr "Mutter-tillegg som skal brukes"
#: ../src/core/prefs.c:2004
#: ../src/core/prefs.c:1997
#, c-format
msgid "Workspace %d"
msgstr "Arbeidsområde %d"
#: ../src/core/screen.c:525
#: ../src/core/screen.c:521
#, c-format
msgid ""
"Display \"%s\" already has a window manager; try using the --replace option "
"to replace the current window manager."
msgstr "Skjerm «%s» har allerede en vindushåndterer; prøv å bruke flagget --replace for å erstatte aktiv vindushåndterer."
msgstr ""
"Skjerm «%s» har allerede en vindushåndterer; prøv å bruke flagget --replace "
"for å erstatte aktiv vindushåndterer."
#: ../src/core/screen.c:607
#: ../src/core/screen.c:606
#, c-format
msgid "Screen %d on display '%s' is invalid\n"
msgstr "Skjerm %d på display «%s» er ugyldig\n"
#: ../src/core/util.c:118
#: ../src/core/util.c:120
msgid "Mutter was compiled without support for verbose mode\n"
msgstr "Mutter er kompilert uten støtte for «verbose» modus\n"
#: ../src/wayland/meta-wayland-tablet-pad.c:595
#, c-format
msgid "Mode Switch: Mode %d"
msgstr "Modusbytte: Modus %d"
#: ../src/x11/session.c:1815
msgid ""
"These windows do not support &quot;save current setup&quot; and will have to "
@ -594,11 +183,346 @@ msgstr ""
"Disse vinduene støtter ikke &quot;lagre aktiv konfigurasjon&quot;og vil "
"måtte startes på nytt manuelt neste gang du logger inn."
#: ../src/x11/window-props.c:549
#: ../src/x11/window-props.c:548
#, c-format
msgid "%s (on %s)"
msgstr "%s (på %s)"
#~ msgid "Move window to workspace 1"
#~ msgstr "Flytt vindu til arbeidsområde 1"
#~ msgid "Move window to workspace 2"
#~ msgstr "Flytt vindu til arbeidsområde 2"
#~ msgid "Move window to workspace 3"
#~ msgstr "Flytt vindu til arbeidsområde 3"
#~ msgid "Move window to workspace 4"
#~ msgstr "Flytt vindu til arbeidsområde 4"
#~ msgid "Move window to last workspace"
#~ msgstr "Flytt vindu til siste arbeidsområde"
#~ msgid "Move window one workspace to the left"
#~ msgstr "Flytt vindu ett arbeidsområde til venstre"
#~ msgid "Move window one workspace to the right"
#~ msgstr "Flytt vindu ett arbeidsområde til høyre"
#~ msgid "Move window one workspace up"
#~ msgstr "Flytt vindu ett arbeidsområde opp"
#~ msgid "Move window one workspace down"
#~ msgstr "Flytt vindu ett arbeidsområde ned"
#~ msgid "Move window one monitor to the left"
#~ msgstr "Flytt vindu en skjerm til venstre"
#~ msgid "Move window one monitor to the right"
#~ msgstr "Flytt vindu en skjerm til høyre"
#~ msgid "Move window one monitor up"
#~ msgstr "Flytt vindu en skjerm opp"
#~ msgid "Move window one monitor down"
#~ msgstr "Flytt vindu en skjerm ned"
#~ msgid "Switch applications"
#~ msgstr "Bytt programmer"
#~ msgid "Switch to previous application"
#~ msgstr "Bytt til forrige program"
#~ msgid "Switch windows"
#~ msgstr "Bytt vinduer"
#~ msgid "Switch to previous window"
#~ msgstr "Bytt forrige vindu"
#~ msgid "Switch windows of an application"
#~ msgstr "Bytt mellom et programs vinduer"
#~ msgid "Switch to previous window of an application"
#~ msgstr "Bytt til forrige vindu i et program"
#~ msgid "Switch to previous system control"
#~ msgstr "Bytt til forrige systemkontroll"
#~ msgid "Switch windows directly"
#~ msgstr "Bytt vinduer direkte"
#~ msgid "Switch directly to previous window"
#~ msgstr "Bytt direkte til forrige vindu"
#~ msgid "Switch windows of an app directly"
#~ msgstr "Bytt mellom et programs vinduer direkte"
#~ msgid "Switch directly to previous window of an app"
#~ msgstr "Bytt direkte til forrive vindu i et program"
#~ msgid "Switch system controls directly"
#~ msgstr "Bytt systemkontroller direkte"
#~ msgid "Switch directly to previous system control"
#~ msgstr "Bytt direkte til forrige systemkontroll"
#~ msgid "Hide all normal windows"
#~ msgstr "Skjul alle normale vinduer"
#~ msgid "Switch to workspace 1"
#~ msgstr "Bytt til arbeidsområde 1"
#~ msgid "Switch to workspace 2"
#~ msgstr "Bytt til arbeidsområde 2"
#~ msgid "Switch to workspace 3"
#~ msgstr "Bytt til arbeidsområde 3"
#~ msgid "Switch to workspace 4"
#~ msgstr "Bytt til arbeidsområde 4"
#~ msgid "Switch to last workspace"
#~ msgstr "Bytt til siste arbeidsområde"
#~ msgid "Move to workspace left"
#~ msgstr "Flytt til arbeidsområdet til venstre"
#~ msgid "Move to workspace right"
#~ msgstr "Flytt til arbeidsområdet til høyre"
#~ msgid "Move to workspace above"
#~ msgstr "Flytt til arbeidsområdet over"
#~ msgid "Move to workspace below"
#~ msgstr "Flytt til arbeidsområdet under"
#~ msgid "System"
#~ msgstr "System"
#~ msgid "Show the run command prompt"
#~ msgstr "Vis kommandolinje"
#~ msgid "Show the activities overview"
#~ msgstr "Vis oversikt over aktiviteter"
#~ msgid "Windows"
#~ msgstr "Vinduer"
#~ msgid "Activate the window menu"
#~ msgstr "Aktiver vindumenyen"
#~ msgid "Toggle fullscreen mode"
#~ msgstr "Slå av/på fullskjermmodus"
#~ msgid "Toggle maximization state"
#~ msgstr "Endre tilstand for maksimering"
#~ msgid "Maximize window"
#~ msgstr "Maksimer vindu"
#~ msgid "Restore window"
#~ msgstr "Gjenopprett vindu"
#~ msgid "Toggle shaded state"
#~ msgstr "Endre tilstand for skyggelegging"
#~ msgid "Close window"
#~ msgstr "Lukk vindu"
#~ msgid "Hide window"
#~ msgstr "Skjul vindu"
#~ msgid "Move window"
#~ msgstr "Flytt vindu"
#~ msgid "Resize window"
#~ msgstr "Endre størrelse på vindu"
#~ msgid "Toggle window on all workspaces or one"
#~ msgstr ""
#~ "Slå av/på om vinduet skal vises på alle arbeidsområder eller bare ett"
#~ msgid "Raise window if covered, otherwise lower it"
#~ msgstr "Hev vindu hvis skjult av et annet vindu, senk det ellers"
#~ msgid "Raise window above other windows"
#~ msgstr "Hev vinduet over andre vinduer"
#~ msgid "Lower window below other windows"
#~ msgstr "Senk vinduet under andre vinduer"
#~ msgid "Maximize window vertically"
#~ msgstr "Maksimer vinduet vertikalt"
#~ msgid "Maximize window horizontally"
#~ msgstr "Maksimer vinduet horisontalt"
#~ msgid "View split on left"
#~ msgstr "Visning delt til venstre"
#~ msgid "View split on right"
#~ msgstr "Visning delt til høyre"
#~ msgid "Mutter"
#~ msgstr "Mutter"
#~ msgid "Modifier to use for extended window management operations"
#~ msgstr ""
#~ "Endringstast som skal brukes for utvidede vindushåndteringsoperasjoner"
#~ msgid ""
#~ "This key will initiate the \"overlay\", which is a combination window "
#~ "overview and application launching system. The default is intended to be "
#~ "the \"Windows key\" on PC hardware. It's expected that this binding "
#~ "either the default or set to the empty string."
#~ msgstr ""
#~ "Denne tasten vil initiere «overlay», som er en kombinasjon av "
#~ "vindusoversikt og et system for å starte programmer. Forvalget er ment å "
#~ "være «Windows-tasten» på PC-maskinvare. Det forventes at denne bindingen "
#~ "er satt til forvalg eller en tom streng."
#~ msgid "Attach modal dialogs"
#~ msgstr "Fest modale dialoger"
#~ msgid ""
#~ "When true, instead of having independent titlebars, modal dialogs appear "
#~ "attached to the titlebar of the parent window and are moved together with "
#~ "the parent window."
#~ msgstr ""
#~ "Hvis denne er satt til sann vil modale dialoger vises festet til "
#~ "tittellinjen på opphavsvinduet og flyttes sammen med dette i stedet for å "
#~ "ha individuelle tittellinjer."
#~ msgid "Enable edge tiling when dropping windows on screen edges"
#~ msgstr "Slå på kantflising ved slipp av vinduer på skjermkantene"
#~ msgid ""
#~ "If enabled, dropping windows on vertical screen edges maximizes them "
#~ "vertically and resizes them horizontally to cover half of the available "
#~ "area. Dropping windows on the top screen edge maximizes them completely."
#~ msgstr ""
#~ "Maksimerer vinduer vertikalt og endrer størrelse horisontalt slik at de "
#~ "dekker halve det tilgjengeligeområdet hvis de slippes på vertikale "
#~ "skjermkanter. Hvis vindu slippes på øverste kant av skjermen maksimeres "
#~ "de fullstendig."
#~ msgid "Workspaces are managed dynamically"
#~ msgstr "Arbeidsområder håndteres dynamisk"
#~ msgid ""
#~ "Determines whether workspaces are managed dynamically or whether there's "
#~ "a static number of workspaces (determined by the num-workspaces key in "
#~ "org.gnome.desktop.wm.preferences)."
#~ msgstr ""
#~ "Bestemmer om arbeidsområder skal håndteres dynamisk eller om det er et "
#~ "fast antall arbeidsområder (bestemt av num-workspaces nøkkelen i org."
#~ "gnome.desktop.wm.preferences)."
#~ msgid "Workspaces only on primary"
#~ msgstr "Arbeidsområder kun på primær skjerm"
#~ msgid ""
#~ "Determines whether workspace switching should happen for windows on all "
#~ "monitors or only for windows on the primary monitor."
#~ msgstr ""
#~ "Bestemmer om bytting mellom arbeidsområder skal skje for vinduer på alle "
#~ "skjermer eller kun på primær skjerm."
#~ msgid "No tab popup"
#~ msgstr "Ingen tabulatordialog"
#~ msgid ""
#~ "Determines whether the use of popup and highlight frame should be "
#~ "disabled for window cycling."
#~ msgstr ""
#~ "Bestemmer om bruk av dialog og uthevingsramme skal slås av for bytting "
#~ "mellom vinduer."
#~ msgid "Delay focus changes until the pointer stops moving"
#~ msgstr "Utsett fokusendringer til pekeren slutter å bevege seg"
#~ msgid ""
#~ "If set to true, and the focus mode is either \"sloppy\" or \"mouse\" then "
#~ "the focus will not be changed immediately when entering a window, but "
#~ "only after the pointer stops moving."
#~ msgstr ""
#~ "Hvis denne settes til «true» og fokusmodus er enten «sloppy» eller "
#~ "«mouse» så vil fokus ikke endres med en gang markøren kommer inn i et "
#~ "vindu, men i stedet når markørens bevegelse stopper."
#~ msgid "Draggable border width"
#~ msgstr "Bredde på drakant"
#~ msgid ""
#~ "The amount of total draggable borders. If the theme's visible borders are "
#~ "not enough, invisible borders will be added to meet this value."
#~ msgstr ""
#~ "Total mengde med drakant. Hvis temas synlige kanter ikke er nok vil "
#~ "usynlige kanter legges til for å imøtekomme denne verdien."
#~ msgid "Auto maximize nearly monitor sized windows"
#~ msgstr ""
#~ "Maksimer vinduer automatisk hvis de er nesten like store som skjermen"
#~ msgid ""
#~ "If enabled, new windows that are initially the size of the monitor "
#~ "automatically get maximized."
#~ msgstr ""
#~ "Nye vinduer som i utgangspunktet er samme størrelse som skjermen vil "
#~ "automatisk bli maksimert hvis denne slås på."
#~ msgid "Place new windows in the center"
#~ msgstr "Plasser nye vinduer i senter"
#~ msgid ""
#~ "When true, the new windows will always be put in the center of the active "
#~ "screen of the monitor."
#~ msgstr ""
#~ "Når denne er «true» vil mye vinduer alltid plasseres midt på aktivt "
#~ "område på skjermen."
#~ msgid "Select window from tab popup"
#~ msgstr "Fjern vindu fra tabulatordialog"
#~ msgid "Cancel tab popup"
#~ msgstr "Avbryt tabulatordialog"
#~ msgid "Switch to VT 1"
#~ msgstr "Bytt til VT 1"
#~ msgid "Switch to VT 2"
#~ msgstr "Bytt til VT 2"
#~ msgid "Switch to VT 3"
#~ msgstr "Bytt til VT 3"
#~ msgid "Switch to VT 4"
#~ msgstr "Bytt til VT 4"
#~ msgid "Switch to VT 5"
#~ msgstr "Bytt til VT 5"
#~ msgid "Switch to VT 6"
#~ msgstr "Bytt til VT 6"
#~ msgid "Switch to VT 7"
#~ msgstr "Bytt til VT 7"
#~ msgid "Switch to VT 8"
#~ msgstr "Bytt til VT 8"
#~ msgid "Switch to VT 9"
#~ msgstr "Bytt til VT 9"
#~ msgid "Switch to VT 10"
#~ msgstr "Bytt til VT 10"
#~ msgid "Switch to VT 11"
#~ msgstr "Bytt til VT 11"
#~ msgid "Switch to VT 12"
#~ msgstr "Bytt til VT 12"
#~ msgid ""
#~ "Blend format is \"blend/bg_color/fg_color/alpha\", \"%s\" does not fit "
#~ "the format"

View File

@ -4,13 +4,14 @@
# Reinout van Schouwen <reinouts@gnome.org>, 20032007, 2013, 2016 (nalezen).
# Michiel Sikkes <michiels@gnome.org>, 2005.
# Wouter Bolsterlee <wbolster@gnome.org>, 20062012.
# Hannie Dumoleyn <hannie@ubuntu-nl.org>, 2016.
msgid ""
msgstr ""
"Project-Id-Version: mutter\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2016-03-23 22:41+0100\n"
"PO-Revision-Date: 2015-06-20 14:14+0100\n"
"Last-Translator: Nathan Follens <nthn@unseen.is>\n"
"PO-Revision-Date: 2016-10-17 18:24+0200\n"
"Last-Translator: Hannie Dumoleyn <hannie@ubuntu-nl.org>\n"
"Language-Team: Dutch <vertaling@vrijschrift.org>\n"
"Language: nl\n"
"MIME-Version: 1.0\n"
@ -18,7 +19,7 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Project-Style: gnome\n"
"X-Generator: Poedit 1.8.1\n"
"X-Generator: Lokalize 1.5\n"
#: ../data/50-mutter-navigation.xml.in.h:1
msgid "Navigation"
@ -42,7 +43,7 @@ msgstr "Venster verplaatsen naar werkblad 4"
#: ../data/50-mutter-navigation.xml.in.h:6
msgid "Move window to last workspace"
msgstr "Venster verplaatsen naar laatst gebruikte werkblad"
msgstr "Venster verplaatsen naar laatste werkblad"
#: ../data/50-mutter-navigation.xml.in.h:7
msgid "Move window one workspace to the left"
@ -154,7 +155,7 @@ msgstr "Schakelen naar werkblad 4"
#: ../data/50-mutter-navigation.xml.in.h:34
msgid "Switch to last workspace"
msgstr "Schakelen naar laatst gebruikte werkblad"
msgstr "Overschakelen naar laatste werkblad"
#: ../data/50-mutter-navigation.xml.in.h:35
msgid "Move to workspace left"

View File

@ -1,11 +1,11 @@
# Thai translation for mutter.
# Copyright (C) 2003-2015 Free Software Foundation, Inc.
# Copyright (C) 2003-2016 Free Software Foundation, Inc.
# This file is distributed under the same license as the mutter package.
#
# Phakhinee Thangnithirat <sc442535@angsila.compsci.buu.ac.th>, 2003
# Chanchai Junlouchai <taz@opentle.org>, 2003
# Paisa Seeluangsawat <paisa@users.sf.net>, 2004.
# Theppitak Karoonboonyanan <theppitak@gmail.com>, 2004-2012.
# Theppitak Karoonboonyanan <theppitak@gmail.com>, 2004-2012, 2016.
# Akom Chotiphantawanon <knight2000@gmail.com>, 2015.
#
msgid ""
@ -14,8 +14,8 @@ msgstr ""
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?"
"product=mutter&keywords=I18N+L10N&component=general\n"
"POT-Creation-Date: 2015-07-18 22:50+0000\n"
"PO-Revision-Date: 2015-08-01 17:29+0700\n"
"Last-Translator: Akom Chotiphantawanon <knight2000@gmail.com>\n"
"PO-Revision-Date: 2016-10-13 11:22+0700\n"
"Last-Translator: Theppitak Karoonboonyanan <theppitak@gmail.com>\n"
"Language-Team: Thai <thai-l10n@googlegroups.com>\n"
"Language: th\n"
"MIME-Version: 1.0\n"
@ -170,7 +170,7 @@ msgstr "ย้ายไปพื้นที่ทำงานขวา"
#: ../data/50-mutter-navigation.xml.in.h:37
msgid "Move to workspace above"
msgstr "ย้ายไปพื้นที่ทำงานซ้าย"
msgstr "ย้ายไปพื้นที่ทำงานบน"
#: ../data/50-mutter-navigation.xml.in.h:38
msgid "Move to workspace below"

File diff suppressed because it is too large Load Diff

View File

@ -162,6 +162,7 @@ meta_idle_monitor_native_init (MetaIdleMonitorNative *monitor_native)
MetaIdleMonitor *monitor = META_IDLE_MONITOR (monitor_native);
monitor->watches = g_hash_table_new_full (NULL, NULL, NULL, free_watch);
monitor_native->last_event_time = g_get_monotonic_time ();
}
void

View File

@ -47,6 +47,8 @@
#include "meta-idle-monitor-native.h"
#include "meta-renderer-native.h"
#define DRM_CARD_UDEV_DEVICE_TYPE "drm_minor"
G_DEFINE_AUTOPTR_CLEANUP_FUNC(GUdevDevice, g_object_unref)
G_DEFINE_AUTOPTR_CLEANUP_FUNC(GUdevClient, g_object_unref)
G_DEFINE_AUTOPTR_CLEANUP_FUNC(GUdevEnumerator, g_object_unref)
@ -282,6 +284,55 @@ on_active_changed (Login1Session *session,
sync_active (self);
}
static guint
count_devices_with_connectors (const gchar *seat_name,
GList *devices)
{
g_autoptr (GHashTable) cards = NULL;
GList *tmp;
cards = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, g_object_unref);
for (tmp = devices; tmp != NULL; tmp = tmp->next)
{
GUdevDevice *device = tmp->data;
g_autoptr (GUdevDevice) parent_device = NULL;
const gchar *parent_device_type = NULL;
const gchar *parent_device_name = NULL;
const gchar *card_seat;
/* filter out the real card devices, we only care about the connectors */
if (g_udev_device_get_device_type (device) != G_UDEV_DEVICE_TYPE_NONE)
continue;
/* only connectors have a modes attribute */
if (!g_udev_device_has_sysfs_attr (device, "modes"))
continue;
parent_device = g_udev_device_get_parent (device);
if (g_udev_device_get_device_type (parent_device) == G_UDEV_DEVICE_TYPE_CHAR)
parent_device_type = g_udev_device_get_property (parent_device, "DEVTYPE");
if (g_strcmp0 (parent_device_type, DRM_CARD_UDEV_DEVICE_TYPE) != 0)
continue;
card_seat = g_udev_device_get_property (parent_device, "ID_SEAT");
if (!card_seat)
card_seat = "seat0";
if (g_strcmp0 (seat_name, card_seat) != 0)
continue;
parent_device_name = g_udev_device_get_name (parent_device);
g_hash_table_insert (cards,
(gpointer) parent_device_name ,
g_steal_pointer (&parent_device));
}
return g_hash_table_size (cards);
}
static gchar *
get_primary_gpu_path (const gchar *seat_name)
{
@ -295,22 +346,46 @@ get_primary_gpu_path (const gchar *seat_name)
g_udev_enumerator_add_match_name (enumerator, "card*");
g_udev_enumerator_add_match_tag (enumerator, "seat");
/* We need to explicitly match the subsystem for now.
* https://bugzilla.gnome.org/show_bug.cgi?id=773224
*/
g_udev_enumerator_add_match_subsystem (enumerator, "drm");
devices = g_udev_enumerator_execute (enumerator);
if (!devices)
goto out;
/* For now, fail on systems where some of the connectors
* are connected to secondary gpus.
*
* https://bugzilla.gnome.org/show_bug.cgi?id=771442
*/
if (g_getenv ("MUTTER_ALLOW_HYBRID_GPUS") == NULL)
{
guint num_devices;
num_devices = count_devices_with_connectors (seat_name, devices);
if (num_devices != 1)
goto out;
}
for (tmp = devices; tmp != NULL; tmp = tmp->next)
{
g_autoptr (GUdevDevice) platform_device = NULL;
g_autoptr (GUdevDevice) pci_device = NULL;
GUdevDevice *dev = tmp->data;
gint boot_vga;
const gchar *device_type;
const gchar *device_seat;
/* filter out devices that are not character device, like card0-VGA-1 */
if (g_udev_device_get_device_type (dev) != G_UDEV_DEVICE_TYPE_CHAR)
continue;
device_type = g_udev_device_get_property (dev, "DEVTYPE");
if (g_strcmp0 (device_type, DRM_CARD_UDEV_DEVICE_TYPE) != 0)
continue;
device_seat = g_udev_device_get_property (dev, "ID_SEAT");
if (!device_seat)
{
@ -350,9 +425,9 @@ get_primary_gpu_path (const gchar *seat_name)
}
}
out:
g_list_free_full (devices, g_object_unref);
out:
return path;
}

View File

@ -1531,31 +1531,19 @@ get_crtc_connectors (MetaMonitorManager *manager,
uint32_t **connectors,
unsigned int *n_connectors)
{
GArray *connectors_array = NULL;
unsigned int i;
GArray *connectors_array = g_array_new (FALSE, FALSE, sizeof (uint32_t));
for (i = 0; i < manager->n_outputs; i++)
{
MetaOutput *output = &manager->outputs[i];
if (output->crtc == crtc)
{
if (!connectors_array)
connectors_array = g_array_new (FALSE, FALSE, sizeof (uint32_t));
g_array_append_val (connectors_array, output->winsys_id);
}
g_array_append_val (connectors_array, output->winsys_id);
}
if (connectors_array)
{
*connectors = (uint32_t *) connectors_array->data;
*n_connectors = connectors_array->len;
}
else
{
*connectors = NULL;
*n_connectors = 0;
}
*n_connectors = connectors_array->len;
*connectors = (uint32_t *) g_array_free (connectors_array, FALSE);
}
void

View File

@ -466,16 +466,19 @@ meta_onscreen_native_set_crtc_modes (MetaOnscreenNative *onscreen_native)
monitor_info = meta_renderer_view_get_monitor_info (view);
if (monitor_info)
{
int i;
unsigned int i;
for (i = 0; i < monitor_info->n_outputs; i++)
for (i = 0; i < monitor_manager->n_crtcs; i++)
{
MetaOutput *output = monitor_info->outputs[i];
int x = output->crtc->rect.x - monitor_info->rect.x;
int y = output->crtc->rect.y - monitor_info->rect.y;
MetaCRTC *crtc = &monitor_manager->crtcs[i];
int x = crtc->rect.x - monitor_info->rect.x;
int y = crtc->rect.y - monitor_info->rect.y;
if (crtc->logical_monitor != monitor_info)
continue;
meta_monitor_manager_kms_apply_crtc_mode (monitor_manager_kms,
output->crtc,
crtc,
x, y,
next_fb_id);
}
@ -530,16 +533,19 @@ meta_onscreen_native_flip_crtcs (CoglOnscreen *onscreen)
monitor_info = meta_renderer_view_get_monitor_info (view);
if (monitor_info)
{
int i;
unsigned int i;
for (i = 0; i < monitor_info->n_outputs; i++)
for (i = 0; i < monitor_manager->n_crtcs; i++)
{
MetaOutput *output = monitor_info->outputs[i];
int x = output->crtc->rect.x - monitor_info->rect.x;
int y = output->crtc->rect.y - monitor_info->rect.y;
MetaCRTC *crtc = &monitor_manager->crtcs[i];
int x = crtc->rect.x - monitor_info->rect.x;
int y = crtc->rect.y - monitor_info->rect.y;
if (crtc->logical_monitor != monitor_info)
continue;
meta_onscreen_native_flip_crtc (onscreen_native, flip_closure,
output->crtc, x, y,
crtc, x, y,
&fb_in_use);
}
}
@ -1235,7 +1241,6 @@ meta_renderer_native_initable_init (GInitable *initable,
GError **error)
{
MetaRendererNative *renderer_native = META_RENDERER_NATIVE (initable);
drmModeRes *resources;
renderer_native->gbm = gbm_create_device (renderer_native->kms_fd);
if (!renderer_native->gbm)
@ -1243,25 +1248,10 @@ meta_renderer_native_initable_init (GInitable *initable,
g_set_error (error, G_IO_ERROR,
G_IO_ERROR_FAILED,
"Failed to create gbm device");
goto err;
}
resources = drmModeGetResources (renderer_native->kms_fd);
if (!resources)
{
g_set_error (error, G_IO_ERROR,
G_IO_ERROR_FAILED,
"drmModeGetResources failed");
goto err_resources;
return FALSE;
}
return TRUE;
err_resources:
g_clear_pointer (&renderer_native->gbm, gbm_device_destroy);
err:
return FALSE;
}
static void

View File

@ -465,7 +465,12 @@ place_window_if_needed(MetaWindow *window,
MetaWorkspace *cur_workspace;
const MetaMonitorInfo *monitor_info;
meta_window_get_frame_rect (window, &placed_rect);
placed_rect = (MetaRectangle) {
.x = window->rect.x,
.y = window->rect.y,
.width = info->current.width,
.height = info->current.height
};
orig_rect = info->orig;

View File

@ -44,8 +44,8 @@ dialog_exited (GPid pid, int status, gpointer user_data)
window->dialog_pid = -1;
/* exit status of 1 means the user pressed "Force Quit" */
if (WIFEXITED (status) && WEXITSTATUS (status) == 1)
/* exit status of 0 means the user pressed "Force Quit" */
if (WIFEXITED (status) && WEXITSTATUS (status) == 0)
meta_window_kill (window);
}
@ -138,7 +138,7 @@ show_delete_dialog (MetaWindow *window,
meta_show_dialog ("--question",
window_content, NULL,
window->screen->screen_name,
_("_Wait"), _("_Force Quit"),
_("_Force Quit"), _("_Wait"),
"face-sad-symbolic", window->xwindow,
NULL, NULL);

View File

@ -2267,27 +2267,7 @@ meta_window_show (MetaWindow *window)
( (!place_on_top_on_map && !takes_focus_on_map) ||
window_would_be_covered (window) )
) {
if (meta_window_is_ancestor_of_transient (focus_window, window))
{
guint32 timestamp;
timestamp = meta_display_get_current_time_roundtrip (window->display);
/* This happens for error dialogs or alerts; these need to remain on
* top, but it would be confusing to have its ancestor remain
* focused.
*/
meta_topic (META_DEBUG_STARTUP,
"The focus window %s is an ancestor of the newly mapped "
"window %s which isn't being focused. Unfocusing the "
"ancestor.\n",
focus_window->desc, window->desc);
meta_display_focus_the_no_focus_window (window->display,
window->screen,
timestamp);
}
else
if (!meta_window_is_ancestor_of_transient (focus_window, window))
{
needs_stacking_adjustment = TRUE;
if (!window->placed)

View File

@ -89,7 +89,7 @@ G_DEFINE_TYPE_WITH_PRIVATE (MetaWaylandDataSource, meta_wayland_data_source,
G_DEFINE_TYPE (MetaWaylandDataSourceWayland, meta_wayland_data_source_wayland,
META_TYPE_WAYLAND_DATA_SOURCE);
G_DEFINE_TYPE (MetaWaylandDataSourcePrimary, meta_wayland_data_source_primary,
META_TYPE_WAYLAND_DATA_SOURCE);
META_TYPE_WAYLAND_DATA_SOURCE_WAYLAND);
static MetaWaylandDataSource *
meta_wayland_data_source_wayland_new (struct wl_resource *resource);
@ -1195,9 +1195,12 @@ data_device_start_drag (struct wl_client *client,
&drag_grab_interface,
surface, drag_source, icon_surface);
meta_wayland_keyboard_set_focus (seat->keyboard, NULL);
meta_wayland_keyboard_start_grab (seat->keyboard,
&seat->data_device.current_grab->keyboard_grab);
if (meta_wayland_seat_has_keyboard (seat))
{
meta_wayland_keyboard_set_focus (seat->keyboard, NULL);
meta_wayland_keyboard_start_grab (seat->keyboard,
&seat->data_device.current_grab->keyboard_grab);
}
}
static void

View File

@ -26,6 +26,10 @@
#include "wayland/meta-wayland-input-device.h"
#include <wayland-server.h>
#include "wayland/meta-wayland-seat.h"
enum
{
PROP_0,
@ -51,6 +55,14 @@ meta_wayland_input_device_get_seat (MetaWaylandInputDevice *input_device)
return priv->seat;
}
uint32_t
meta_wayland_input_device_next_serial (MetaWaylandInputDevice *input_device)
{
MetaWaylandSeat *seat = meta_wayland_input_device_get_seat (input_device);
return wl_display_next_serial (seat->wl_display);
}
static void
meta_wayland_input_device_set_property (GObject *object,
guint prop_id,

View File

@ -26,6 +26,7 @@
#define META_WAYLAND_INPUT_DEVICE_H
#include <glib-object.h>
#include <stdint.h>
#include "wayland/meta-wayland-types.h"
@ -42,4 +43,6 @@ struct _MetaWaylandInputDeviceClass
MetaWaylandSeat * meta_wayland_input_device_get_seat (MetaWaylandInputDevice *input_device);
uint32_t meta_wayland_input_device_next_serial (MetaWaylandInputDevice *input_device);
#endif /* META_WAYLAND_INPUT_DEVICE_H */

View File

@ -252,7 +252,8 @@ on_keymap_layout_group_changed (MetaBackend *backend,
static void
keyboard_handle_focus_surface_destroy (struct wl_listener *listener, void *data)
{
MetaWaylandKeyboard *keyboard = wl_container_of (listener, keyboard, focus_surface_listener);
MetaWaylandKeyboard *keyboard = wl_container_of (listener, keyboard,
focus_surface_listener);
meta_wayland_keyboard_set_focus (keyboard, NULL);
}
@ -264,17 +265,16 @@ meta_wayland_keyboard_broadcast_key (MetaWaylandKeyboard *keyboard,
uint32_t state)
{
struct wl_resource *resource;
struct wl_list *l;
l = &keyboard->focus_resource_list;
if (!wl_list_empty (l))
if (!wl_list_empty (&keyboard->focus_resource_list))
{
struct wl_client *client = wl_resource_get_client (keyboard->focus_surface->resource);
struct wl_display *display = wl_client_get_display (client);
MetaWaylandInputDevice *input_device =
META_WAYLAND_INPUT_DEVICE (keyboard);
keyboard->key_serial = wl_display_next_serial (display);
keyboard->key_serial =
meta_wayland_input_device_next_serial (input_device);
wl_resource_for_each (resource, l)
wl_resource_for_each (resource, &keyboard->focus_resource_list)
{
wl_keyboard_send_key (resource, keyboard->key_serial, time, key, state);
}
@ -349,19 +349,16 @@ static void
meta_wayland_keyboard_broadcast_modifiers (MetaWaylandKeyboard *keyboard)
{
struct wl_resource *resource;
struct wl_list *l;
l = &keyboard->focus_resource_list;
if (!wl_list_empty (l))
if (!wl_list_empty (&keyboard->focus_resource_list))
{
MetaWaylandInputDevice *input_device =
META_WAYLAND_INPUT_DEVICE (keyboard);
MetaWaylandSeat *seat = meta_wayland_input_device_get_seat (input_device);
uint32_t serial;
serial = wl_display_next_serial (seat->wl_display);
serial = meta_wayland_input_device_next_serial (input_device);
wl_resource_for_each (resource, l)
wl_resource_for_each (resource, &keyboard->focus_resource_list)
keyboard_send_modifiers (keyboard, resource, serial);
}
}
@ -611,17 +608,6 @@ meta_wayland_keyboard_enable (MetaWaylandKeyboard *keyboard)
MetaBackend *backend = meta_get_backend ();
GSettingsSchema *schema;
wl_list_init (&keyboard->resource_list);
wl_list_init (&keyboard->focus_resource_list);
keyboard->focus_surface_listener.notify = keyboard_handle_focus_surface_destroy;
keyboard->xkb_info.keymap_fd = -1;
keyboard->default_grab.interface = &default_keyboard_grab_interface;
keyboard->default_grab.keyboard = keyboard;
keyboard->grab = &keyboard->default_grab;
keyboard->settings = g_settings_new ("org.gnome.desktop.peripherals.keyboard");
g_signal_connect (keyboard->settings, "changed",
G_CALLBACK (settings_changed), keyboard);
@ -647,6 +633,12 @@ meta_wayland_keyboard_enable (MetaWaylandKeyboard *keyboard)
maybe_restore_numlock_state (keyboard);
}
static void
meta_wayland_xkb_info_init (MetaWaylandXkbInfo *xkb_info)
{
xkb_info->keymap_fd = -1;
}
static void
meta_wayland_xkb_info_destroy (MetaWaylandXkbInfo *xkb_info)
{
@ -659,7 +651,10 @@ meta_wayland_xkb_info_destroy (MetaWaylandXkbInfo *xkb_info)
xkb_info->keymap_area = NULL;
}
if (xkb_info->keymap_fd >= 0)
close (xkb_info->keymap_fd);
{
close (xkb_info->keymap_fd);
xkb_info->keymap_fd = -1;
}
}
void
@ -670,10 +665,14 @@ meta_wayland_keyboard_disable (MetaWaylandKeyboard *keyboard)
g_signal_handlers_disconnect_by_func (backend, on_keymap_changed, keyboard);
g_signal_handlers_disconnect_by_func (backend, on_keymap_layout_group_changed, keyboard);
meta_wayland_keyboard_end_grab (keyboard);
meta_wayland_keyboard_set_focus (keyboard, NULL);
meta_wayland_xkb_info_destroy (&keyboard->xkb_info);
/* XXX: What about keyboard->resource_list? */
wl_list_remove (&keyboard->resource_list);
wl_list_init (&keyboard->resource_list);
wl_list_remove (&keyboard->focus_resource_list);
wl_list_init (&keyboard->focus_resource_list);
g_clear_object (&keyboard->settings);
if (keyboard->gsd_settings)
@ -826,32 +825,27 @@ meta_wayland_keyboard_set_focus (MetaWaylandKeyboard *keyboard,
MetaWaylandSurface *surface)
{
MetaWaylandInputDevice *input_device = META_WAYLAND_INPUT_DEVICE (keyboard);
MetaWaylandSeat *seat = meta_wayland_input_device_get_seat (input_device);
if (!meta_wayland_seat_has_keyboard (seat))
return;
if (keyboard->focus_surface == surface)
return;
if (keyboard->focus_surface != NULL)
{
struct wl_resource *resource;
struct wl_list *l;
l = &keyboard->focus_resource_list;
if (!wl_list_empty (l))
if (!wl_list_empty (&keyboard->focus_resource_list))
{
struct wl_client *client = wl_resource_get_client (keyboard->focus_surface->resource);
struct wl_display *display = wl_client_get_display (client);
uint32_t serial = wl_display_next_serial (display);
struct wl_resource *resource;
uint32_t serial;
wl_resource_for_each (resource, l)
serial = meta_wayland_input_device_next_serial (input_device);
wl_resource_for_each (resource, &keyboard->focus_resource_list)
{
wl_keyboard_send_leave (resource, serial, keyboard->focus_surface->resource);
wl_keyboard_send_leave (resource, serial,
keyboard->focus_surface->resource);
}
move_resources (&keyboard->resource_list, &keyboard->focus_resource_list);
move_resources (&keyboard->resource_list,
&keyboard->focus_resource_list);
}
wl_list_remove (&keyboard->focus_surface_listener.link);
@ -860,24 +854,25 @@ meta_wayland_keyboard_set_focus (MetaWaylandKeyboard *keyboard,
if (surface != NULL)
{
struct wl_resource *resource;
struct wl_list *l;
struct wl_resource *focus_surface_resource;
keyboard->focus_surface = surface;
wl_resource_add_destroy_listener (keyboard->focus_surface->resource, &keyboard->focus_surface_listener);
focus_surface_resource = keyboard->focus_surface->resource;
wl_resource_add_destroy_listener (focus_surface_resource,
&keyboard->focus_surface_listener);
move_resources_for_client (&keyboard->focus_resource_list,
&keyboard->resource_list,
wl_resource_get_client (keyboard->focus_surface->resource));
wl_resource_get_client (focus_surface_resource));
l = &keyboard->focus_resource_list;
if (!wl_list_empty (l))
if (!wl_list_empty (&keyboard->focus_resource_list))
{
struct wl_client *client = wl_resource_get_client (keyboard->focus_surface->resource);
struct wl_display *display = wl_client_get_display (client);
keyboard->focus_serial = wl_display_next_serial (display);
struct wl_resource *resource;
wl_resource_for_each (resource, l)
keyboard->focus_serial =
meta_wayland_input_device_next_serial (input_device);
wl_resource_for_each (resource, &keyboard->focus_resource_list)
{
broadcast_focus (keyboard, resource);
}
@ -911,26 +906,31 @@ meta_wayland_keyboard_create_new_resource (MetaWaylandKeyboard *keyboard,
struct wl_resource *seat_resource,
uint32_t id)
{
struct wl_resource *cr;
struct wl_resource *resource;
cr = wl_resource_create (client, &wl_keyboard_interface, wl_resource_get_version (seat_resource), id);
wl_resource_set_implementation (cr, &keyboard_interface, keyboard, unbind_resource);
resource = wl_resource_create (client, &wl_keyboard_interface,
wl_resource_get_version (seat_resource), id);
wl_resource_set_implementation (resource, &keyboard_interface,
keyboard, unbind_resource);
wl_keyboard_send_keymap (cr,
wl_keyboard_send_keymap (resource,
WL_KEYBOARD_KEYMAP_FORMAT_XKB_V1,
keyboard->xkb_info.keymap_fd,
keyboard->xkb_info.keymap_size);
notify_key_repeat_for_resource (keyboard, cr);
notify_key_repeat_for_resource (keyboard, resource);
if (keyboard->focus_surface && wl_resource_get_client (keyboard->focus_surface->resource) == client)
if (keyboard->focus_surface &&
wl_resource_get_client (keyboard->focus_surface->resource) == client)
{
wl_list_insert (&keyboard->focus_resource_list, wl_resource_get_link (cr));
broadcast_focus (keyboard, cr);
wl_list_insert (&keyboard->focus_resource_list,
wl_resource_get_link (resource));
broadcast_focus (keyboard, resource);
}
else
{
wl_list_insert (&keyboard->resource_list, wl_resource_get_link (cr));
wl_list_insert (&keyboard->resource_list,
wl_resource_get_link (resource));
}
}
@ -959,6 +959,17 @@ meta_wayland_keyboard_end_grab (MetaWaylandKeyboard *keyboard)
static void
meta_wayland_keyboard_init (MetaWaylandKeyboard *keyboard)
{
wl_list_init (&keyboard->resource_list);
wl_list_init (&keyboard->focus_resource_list);
meta_wayland_xkb_info_init (&keyboard->xkb_info);
keyboard->default_grab.interface = &default_keyboard_grab_interface;
keyboard->default_grab.keyboard = keyboard;
keyboard->grab = &keyboard->default_grab;
keyboard->focus_surface_listener.notify =
keyboard_handle_focus_surface_destroy;
}
static void

View File

@ -41,6 +41,7 @@
#include "backends/meta-backend-private.h"
#include "backends/native/meta-backend-native.h"
#include "backends/meta-pointer-constraint.h"
#include "core/frame.h"
#include "pointer-constraints-unstable-v1-server-protocol.h"
@ -447,17 +448,10 @@ is_within_constraint_region (MetaWaylandPointerConstraint *constraint,
return is_within;
}
static void
meta_wayland_pointer_constraint_maybe_enable (MetaWaylandPointerConstraint *constraint)
static gboolean
should_constraint_be_enabled (MetaWaylandPointerConstraint *constraint)
{
MetaWindow *window;
wl_fixed_t sx, sy;
if (constraint->is_enabled)
return;
if (constraint->seat->pointer->focus_surface != constraint->surface)
return;
window = constraint->surface->window;
if (!window)
@ -467,11 +461,14 @@ meta_wayland_pointer_constraint_maybe_enable (MetaWaylandPointerConstraint *cons
* associate the X11 Window with the wl_surface.
*/
g_warn_if_fail (meta_xwayland_is_xwayland_surface (constraint->surface));
return;
return FALSE;
}
if (window->unmanaging)
return;
return FALSE;
if (constraint->seat->pointer->focus_surface != constraint->surface)
return FALSE;
if (meta_xwayland_is_xwayland_surface (constraint->surface))
{
@ -493,14 +490,30 @@ meta_wayland_pointer_constraint_maybe_enable (MetaWaylandPointerConstraint *cons
if (display->focus_window &&
display->focus_window->client_type != META_WINDOW_CLIENT_TYPE_X11)
return;
return FALSE;
}
else
{
MetaWindow *window = constraint->surface->window;
if (!meta_window_appears_focused (window))
return;
return FALSE;
}
return TRUE;
}
static void
meta_wayland_pointer_constraint_maybe_enable (MetaWaylandPointerConstraint *constraint)
{
wl_fixed_t sx, sy;
if (constraint->is_enabled)
return;
if (!should_constraint_be_enabled (constraint))
return;
meta_wayland_pointer_get_relative_coordinates (constraint->seat->pointer,
constraint->surface,
&sx, &sy);
@ -519,26 +532,9 @@ meta_wayland_pointer_constraint_remove (MetaWaylandPointerConstraint *constraint
meta_wayland_pointer_constraint_destroy (constraint);
}
void
meta_wayland_pointer_constraint_maybe_remove_for_seat (MetaWaylandSeat *seat,
MetaWindow *window)
static void
meta_wayland_pointer_constraint_deactivate (MetaWaylandPointerConstraint *constraint)
{
MetaWaylandPointer *pointer = seat->pointer;
MetaWaylandPointerConstraint *constraint;
if ((pointer->grab->interface != &confined_pointer_grab_interface &&
pointer->grab->interface != &locked_pointer_grab_interface))
return;
constraint = wl_container_of (pointer->grab, constraint, grab);
if (constraint->surface != window->surface)
return;
if (meta_window_appears_focused (window) &&
pointer->focus_surface == window->surface)
return;
switch (constraint->lifetime)
{
case ZWP_POINTER_CONSTRAINTS_V1_LIFETIME_ONESHOT:
@ -554,6 +550,25 @@ meta_wayland_pointer_constraint_maybe_remove_for_seat (MetaWaylandSeat *seat,
}
}
void
meta_wayland_pointer_constraint_maybe_remove_for_seat (MetaWaylandSeat *seat,
MetaWindow *window)
{
MetaWaylandPointer *pointer = seat->pointer;
MetaWaylandPointerConstraint *constraint;
if ((pointer->grab->interface != &confined_pointer_grab_interface &&
pointer->grab->interface != &locked_pointer_grab_interface))
return;
constraint = wl_container_of (pointer->grab, constraint, grab);
if (should_constraint_be_enabled (constraint))
return;
meta_wayland_pointer_constraint_deactivate (constraint);
}
static void
meta_wayland_pointer_constraint_maybe_enable_for_window (MetaWindow *window)
{
@ -589,11 +604,32 @@ cairo_region_t *
meta_wayland_pointer_constraint_calculate_effective_region (MetaWaylandPointerConstraint *constraint)
{
cairo_region_t *region;
MetaWindow *window;
region = meta_wayland_surface_calculate_input_region (constraint->surface);
if (constraint->region)
cairo_region_intersect (region, constraint->region);
window = constraint->surface->window;
if (window && window->frame)
{
MetaFrame *frame = window->frame;
int actual_width, actual_height;
g_assert (meta_xwayland_is_xwayland_surface (constraint->surface));
actual_width = window->buffer_rect.width - (frame->child_x +
frame->right_width);
actual_height = window->buffer_rect.height - (frame->child_y +
frame->bottom_height);
cairo_region_intersect_rectangle (region, &(cairo_rectangle_int_t) {
.x = frame->child_x,
.y = frame->child_y,
.width = actual_width,
.height = actual_height
});
}
return region;
}
@ -938,10 +974,20 @@ locked_pointer_grab_pointer_button (MetaWaylandPointerGrab *grab,
meta_wayland_pointer_send_button (grab->pointer, event);
}
static void
locked_pointer_grab_pointer_cancel (MetaWaylandPointerGrab *grab)
{
MetaWaylandPointerConstraint *constraint =
wl_container_of (grab, constraint, grab);
meta_wayland_pointer_constraint_deactivate (constraint);
}
static const MetaWaylandPointerGrabInterface locked_pointer_grab_interface = {
locked_pointer_grab_pointer_focus,
locked_pointer_grab_pointer_motion,
locked_pointer_grab_pointer_button,
locked_pointer_grab_pointer_cancel,
};
static void
@ -999,10 +1045,20 @@ confined_pointer_grab_pointer_button (MetaWaylandPointerGrab *grab,
meta_wayland_pointer_send_button (grab->pointer, event);
}
static void
confined_pointer_grab_pointer_cancel (MetaWaylandPointerGrab *grab)
{
MetaWaylandPointerConstraint *constraint =
wl_container_of (grab, constraint, grab);
meta_wayland_pointer_constraint_deactivate (constraint);
}
static const MetaWaylandPointerGrabInterface confined_pointer_grab_interface = {
confined_pointer_grab_pointer_focus,
confined_pointer_grab_pointer_motion,
confined_pointer_grab_pointer_button,
confined_pointer_grab_pointer_cancel,
};
static void

View File

@ -86,6 +86,12 @@ static guint signals[LAST_SIGNAL];
G_DEFINE_TYPE (MetaWaylandPointer, meta_wayland_pointer,
META_TYPE_WAYLAND_INPUT_DEVICE)
static void
meta_wayland_pointer_reset_grab (MetaWaylandPointer *pointer);
static void
meta_wayland_pointer_cancel_grab (MetaWaylandPointer *pointer);
static MetaWaylandPointerClient *
meta_wayland_pointer_client_new (void)
{
@ -358,8 +364,8 @@ meta_wayland_pointer_send_button (MetaWaylandPointer *pointer,
if (pointer->focus_client &&
!wl_list_empty (&pointer->focus_client->pointer_resources))
{
struct wl_client *client = wl_resource_get_client (pointer->focus_surface->resource);
struct wl_display *display = wl_client_get_display (client);
MetaWaylandInputDevice *input_device =
META_WAYLAND_INPUT_DEVICE (pointer);
uint32_t time;
uint32_t button;
uint32_t serial;
@ -395,7 +401,7 @@ meta_wayland_pointer_send_button (MetaWaylandPointer *pointer,
}
time = clutter_event_get_time (event);
serial = wl_display_next_serial (display);
serial = meta_wayland_input_device_next_serial (input_device);
wl_resource_for_each (resource, &pointer->focus_client->pointer_resources)
{
@ -416,11 +422,27 @@ default_grab_focus (MetaWaylandPointerGrab *grab,
MetaWaylandSurface *surface)
{
MetaWaylandPointer *pointer = grab->pointer;
MetaWaylandSeat *seat = meta_wayland_pointer_get_seat (pointer);
MetaDisplay *display = meta_get_display ();
if (pointer->button_count > 0)
return;
meta_wayland_pointer_set_focus (pointer, surface);
switch (display->event_route)
{
case META_EVENT_ROUTE_WINDOW_OP:
case META_EVENT_ROUTE_COMPOSITOR_GRAB:
case META_EVENT_ROUTE_FRAME_BUTTON:
return;
break;
case META_EVENT_ROUTE_NORMAL:
case META_EVENT_ROUTE_WAYLAND_POPUP:
break;
}
if (meta_wayland_seat_has_pointer (seat))
meta_wayland_pointer_set_focus (pointer, surface);
}
static void
@ -493,7 +515,8 @@ meta_wayland_pointer_disable (MetaWaylandPointer *pointer)
pointer->cursor_surface_destroy_id);
}
meta_wayland_pointer_end_grab (pointer);
meta_wayland_pointer_cancel_grab (pointer);
meta_wayland_pointer_reset_grab (pointer);
meta_wayland_pointer_set_focus (pointer, NULL);
g_clear_pointer (&pointer->pointer_clients, g_hash_table_unref);
@ -534,7 +557,8 @@ repick_for_event (MetaWaylandPointer *pointer,
actor = clutter_input_device_get_pointer_actor (pointer->device);
if (META_IS_SURFACE_ACTOR_WAYLAND (actor))
pointer->current = meta_surface_actor_wayland_get_surface (META_SURFACE_ACTOR_WAYLAND (actor));
pointer->current =
meta_surface_actor_wayland_get_surface (META_SURFACE_ACTOR_WAYLAND (actor));
else
pointer->current = NULL;
@ -793,22 +817,16 @@ void
meta_wayland_pointer_set_focus (MetaWaylandPointer *pointer,
MetaWaylandSurface *surface)
{
MetaWaylandSeat *seat = meta_wayland_pointer_get_seat (pointer);
if (!meta_wayland_seat_has_pointer (seat))
return;
MetaWaylandInputDevice *input_device = META_WAYLAND_INPUT_DEVICE (pointer);
if (pointer->focus_surface == surface)
return;
if (pointer->focus_surface != NULL)
{
struct wl_client *client =
wl_resource_get_client (pointer->focus_surface->resource);
struct wl_display *display = wl_client_get_display (client);
uint32_t serial;
serial = wl_display_next_serial (display);
serial = meta_wayland_input_device_next_serial (input_device);
if (pointer->focus_client)
{
@ -825,11 +843,11 @@ meta_wayland_pointer_set_focus (MetaWaylandPointer *pointer,
if (surface != NULL)
{
struct wl_client *client = wl_resource_get_client (surface->resource);
struct wl_display *display = wl_client_get_display (client);
ClutterPoint pos;
pointer->focus_surface = surface;
wl_resource_add_destroy_listener (pointer->focus_surface->resource, &pointer->focus_surface_listener);
wl_resource_add_destroy_listener (pointer->focus_surface->resource,
&pointer->focus_surface_listener);
clutter_input_device_get_coords (pointer->device, NULL, &pos);
@ -843,7 +861,8 @@ meta_wayland_pointer_set_focus (MetaWaylandPointer *pointer,
meta_wayland_pointer_get_pointer_client (pointer, client);
if (pointer->focus_client)
{
pointer->focus_serial = wl_display_next_serial (display);
pointer->focus_serial =
meta_wayland_input_device_next_serial (input_device);
meta_wayland_pointer_broadcast_enter (pointer,
pointer->focus_serial,
pointer->focus_surface);
@ -861,6 +880,8 @@ meta_wayland_pointer_start_grab (MetaWaylandPointer *pointer,
{
const MetaWaylandPointerGrabInterface *interface;
meta_wayland_pointer_cancel_grab (pointer);
pointer->grab = grab;
interface = pointer->grab->interface;
grab->pointer = pointer;
@ -868,6 +889,12 @@ meta_wayland_pointer_start_grab (MetaWaylandPointer *pointer,
interface->focus (pointer->grab, pointer->current);
}
static void
meta_wayland_pointer_reset_grab (MetaWaylandPointer *pointer)
{
pointer->grab = &pointer->default_grab;
}
void
meta_wayland_pointer_end_grab (MetaWaylandPointer *pointer)
{
@ -880,6 +907,13 @@ meta_wayland_pointer_end_grab (MetaWaylandPointer *pointer)
meta_wayland_pointer_update_cursor_surface (pointer);
}
static void
meta_wayland_pointer_cancel_grab (MetaWaylandPointer *pointer)
{
if (pointer->grab->interface->cancel)
pointer->grab->interface->cancel (pointer->grab);
}
void
meta_wayland_pointer_end_popup_grab (MetaWaylandPointer *pointer)
{
@ -1059,24 +1093,25 @@ meta_wayland_pointer_create_new_resource (MetaWaylandPointer *pointer,
struct wl_resource *seat_resource,
uint32_t id)
{
struct wl_resource *cr;
struct wl_resource *resource;
MetaWaylandPointerClient *pointer_client;
cr = wl_resource_create (client, &wl_pointer_interface, wl_resource_get_version (seat_resource), id);
wl_resource_set_implementation (cr, &pointer_interface, pointer,
resource = wl_resource_create (client, &wl_pointer_interface,
wl_resource_get_version (seat_resource), id);
wl_resource_set_implementation (resource, &pointer_interface, pointer,
meta_wayland_pointer_unbind_pointer_client_resource);
pointer_client = meta_wayland_pointer_ensure_pointer_client (pointer, client);
wl_list_insert (&pointer_client->pointer_resources,
wl_resource_get_link (cr));
wl_resource_get_link (resource));
if (pointer->focus_client == pointer_client)
{
meta_wayland_pointer_send_enter (pointer, cr,
meta_wayland_pointer_send_enter (pointer, resource,
pointer->focus_serial,
pointer->focus_surface);
meta_wayland_pointer_send_frame (pointer, cr);
meta_wayland_pointer_send_frame (pointer, resource);
}
}
@ -1127,30 +1162,31 @@ relative_pointer_manager_destroy (struct wl_client *client,
static void
relative_pointer_manager_get_relative_pointer (struct wl_client *client,
struct wl_resource *resource,
struct wl_resource *manager_resource,
uint32_t id,
struct wl_resource *pointer_resource)
{
MetaWaylandPointer *pointer = wl_resource_get_user_data (pointer_resource);
struct wl_resource *cr;
struct wl_resource *resource;
MetaWaylandPointerClient *pointer_client;
cr = wl_resource_create (client, &zwp_relative_pointer_v1_interface,
wl_resource_get_version (resource), id);
if (cr == NULL)
resource = wl_resource_create (client, &zwp_relative_pointer_v1_interface,
wl_resource_get_version (manager_resource),
id);
if (!resource)
{
wl_client_post_no_memory (client);
return;
}
wl_resource_set_implementation (cr, &relative_pointer_interface,
wl_resource_set_implementation (resource, &relative_pointer_interface,
pointer,
meta_wayland_pointer_unbind_pointer_client_resource);
pointer_client = meta_wayland_pointer_ensure_pointer_client (pointer, client);
wl_list_insert (&pointer_client->relative_pointer_resources,
wl_resource_get_link (cr));
wl_resource_get_link (resource));
}
static const struct zwp_relative_pointer_manager_v1_interface relative_pointer_manager = {

View File

@ -46,6 +46,7 @@ struct _MetaWaylandPointerGrabInterface
const ClutterEvent *event);
void (*button) (MetaWaylandPointerGrab *grab,
const ClutterEvent *event);
void (*cancel) (MetaWaylandPointerGrab *grab);
};
struct _MetaWaylandPointerGrab

View File

@ -101,6 +101,16 @@ popup_grab_focus (MetaWaylandPointerGrab *grab,
MetaWaylandSurface *surface)
{
MetaWaylandPopupGrab *popup_grab = (MetaWaylandPopupGrab*)grab;
MetaWaylandSeat *seat = meta_wayland_pointer_get_seat (grab->pointer);
/*
* We rely on having a pointer grab even when the seat doesn't have
* the pointer capability. In this case, we shouldn't update any pointer focus
* since there is no such thing when the seat doesn't have the pointer
* capability.
*/
if (!meta_wayland_seat_has_pointer (seat))
return;
/* Popup grabs are in owner-events mode (ie, events for the same client
are reported as normal) */
@ -131,10 +141,17 @@ popup_grab_button (MetaWaylandPointerGrab *grab,
meta_wayland_pointer_end_popup_grab (grab->pointer);
}
static void
popup_grab_cancel (MetaWaylandPointerGrab *grab)
{
meta_wayland_pointer_end_popup_grab (grab->pointer);
}
static MetaWaylandPointerGrabInterface popup_grab_interface = {
popup_grab_focus,
popup_grab_motion,
popup_grab_button
popup_grab_button,
popup_grab_cancel
};
MetaWaylandPopupGrab *
@ -249,12 +266,12 @@ meta_wayland_popup_dismiss (MetaWaylandPopup *popup)
{
MetaWaylandSurface *top_popup_surface;
MetaWaylandSeat *seat;
MetaWaylandKeyboard *keyboard;
top_popup_surface = meta_wayland_popup_grab_get_top_popup (popup_grab);
seat = meta_wayland_pointer_get_seat (popup_grab->generic.pointer);
keyboard = seat->keyboard;
meta_wayland_keyboard_set_focus (keyboard, top_popup_surface);
if (meta_wayland_seat_has_keyboard (seat))
meta_wayland_keyboard_set_focus (seat->keyboard, top_popup_surface);
}
}
@ -272,7 +289,6 @@ meta_wayland_popup_create (MetaWaylandPopupSurface *popup_surface,
meta_wayland_popup_surface_get_surface (popup_surface);
MetaWaylandPopup *popup;
MetaWaylandSeat *seat;
MetaWaylandKeyboard *keyboard;
/* Don't allow creating popups if the grab has a different client. */
if (grab->grab_client != wl_resource_get_client (surface->resource))
@ -285,8 +301,8 @@ meta_wayland_popup_create (MetaWaylandPopupSurface *popup_surface,
wl_list_insert (&grab->all_popups, &popup->link);
seat = meta_wayland_pointer_get_seat (grab->generic.pointer);
keyboard = seat->keyboard;
meta_wayland_keyboard_set_focus (keyboard, surface);
if (meta_wayland_seat_has_keyboard (seat))
meta_wayland_keyboard_set_focus (seat->keyboard, surface);
return popup;
}

View File

@ -45,7 +45,7 @@ seat_get_pointer (struct wl_client *client,
MetaWaylandSeat *seat = wl_resource_get_user_data (resource);
MetaWaylandPointer *pointer = seat->pointer;
if ((seat->capabilities & WL_SEAT_CAPABILITY_POINTER) != 0)
if (meta_wayland_seat_has_pointer (seat))
meta_wayland_pointer_create_new_resource (pointer, client, resource, id);
}
@ -57,7 +57,7 @@ seat_get_keyboard (struct wl_client *client,
MetaWaylandSeat *seat = wl_resource_get_user_data (resource);
MetaWaylandKeyboard *keyboard = seat->keyboard;
if ((seat->capabilities & WL_SEAT_CAPABILITY_KEYBOARD) != 0)
if (meta_wayland_seat_has_keyboard (seat))
meta_wayland_keyboard_create_new_resource (keyboard, client, resource, id);
}
@ -69,7 +69,7 @@ seat_get_touch (struct wl_client *client,
MetaWaylandSeat *seat = wl_resource_get_user_data (resource);
MetaWaylandTouch *touch = seat->touch;
if ((seat->capabilities & WL_SEAT_CAPABILITY_TOUCH) != 0)
if (meta_wayland_seat_has_touch (seat))
meta_wayland_touch_create_new_resource (touch, client, resource, id);
}
@ -319,20 +319,20 @@ meta_wayland_seat_update (MetaWaylandSeat *seat,
case CLUTTER_BUTTON_PRESS:
case CLUTTER_BUTTON_RELEASE:
case CLUTTER_SCROLL:
if (seat->capabilities & WL_SEAT_CAPABILITY_POINTER)
if (meta_wayland_seat_has_pointer (seat))
meta_wayland_pointer_update (seat->pointer, event);
break;
case CLUTTER_KEY_PRESS:
case CLUTTER_KEY_RELEASE:
if (seat->capabilities & WL_SEAT_CAPABILITY_KEYBOARD)
if (meta_wayland_seat_has_keyboard (seat))
meta_wayland_keyboard_update (seat->keyboard, (const ClutterKeyEvent *) event);
break;
case CLUTTER_TOUCH_BEGIN:
case CLUTTER_TOUCH_UPDATE:
case CLUTTER_TOUCH_END:
if (seat->capabilities & WL_SEAT_CAPABILITY_TOUCH)
if (meta_wayland_seat_has_touch (seat))
meta_wayland_touch_update (seat->touch, event);
break;
@ -356,18 +356,18 @@ meta_wayland_seat_handle_event (MetaWaylandSeat *seat,
case CLUTTER_SCROLL:
case CLUTTER_TOUCHPAD_SWIPE:
case CLUTTER_TOUCHPAD_PINCH:
if (seat->capabilities & WL_SEAT_CAPABILITY_POINTER)
if (meta_wayland_seat_has_pointer (seat))
return meta_wayland_pointer_handle_event (seat->pointer, event);
case CLUTTER_KEY_PRESS:
case CLUTTER_KEY_RELEASE:
if (seat->capabilities & WL_SEAT_CAPABILITY_KEYBOARD)
if (meta_wayland_seat_has_keyboard (seat))
return meta_wayland_keyboard_handle_event (seat->keyboard,
(const ClutterKeyEvent *) event);
case CLUTTER_TOUCH_BEGIN:
case CLUTTER_TOUCH_UPDATE:
case CLUTTER_TOUCH_END:
if (seat->capabilities & WL_SEAT_CAPABILITY_TOUCH)
if (meta_wayland_seat_has_touch (seat))
return meta_wayland_touch_handle_event (seat->touch, event);
default:
@ -380,7 +380,7 @@ meta_wayland_seat_handle_event (MetaWaylandSeat *seat,
void
meta_wayland_seat_repick (MetaWaylandSeat *seat)
{
if ((seat->capabilities & WL_SEAT_CAPABILITY_POINTER) == 0)
if (!meta_wayland_seat_has_pointer (seat))
return;
meta_wayland_pointer_repick (seat->pointer);
@ -393,7 +393,7 @@ meta_wayland_seat_set_input_focus (MetaWaylandSeat *seat,
MetaWaylandTabletSeat *tablet_seat;
MetaWaylandCompositor *compositor = meta_wayland_compositor_get_default ();
if ((seat->capabilities & WL_SEAT_CAPABILITY_KEYBOARD) != 0)
if (meta_wayland_seat_has_keyboard (seat))
{
meta_wayland_keyboard_set_focus (seat->keyboard, surface);
meta_wayland_data_device_set_keyboard_focus (&seat->data_device);
@ -414,7 +414,7 @@ meta_wayland_seat_get_grab_info (MetaWaylandSeat *seat,
ClutterEventSequence *sequence = NULL;
gboolean can_grab_surface = FALSE;
if ((seat->capabilities & WL_SEAT_CAPABILITY_TOUCH) != 0)
if (meta_wayland_seat_has_touch (seat))
sequence = meta_wayland_touch_find_grab_sequence (seat->touch,
surface,
serial);
@ -425,7 +425,7 @@ meta_wayland_seat_get_grab_info (MetaWaylandSeat *seat,
}
else
{
if ((seat->capabilities & WL_SEAT_CAPABILITY_POINTER) != 0 &&
if (meta_wayland_seat_has_pointer (seat) &&
(!require_pressed || seat->pointer->button_count > 0))
can_grab_surface = meta_wayland_pointer_can_grab_surface (seat->pointer,
surface,

View File

@ -202,18 +202,11 @@ touch_get_relative_coordinates (MetaWaylandTouch *touch,
clutter_event_get_coords (event, &event_x, &event_y);
if (surface->surface_actor)
{
clutter_actor_transform_stage_point (CLUTTER_ACTOR (surface->surface_actor),
event_x, event_y,
&event_x, &event_y);
}
*x = event_x / surface->scale;
*y = event_y / surface->scale;
return meta_wayland_surface_get_relative_coordinates (surface,
event_x, event_y,
x, y);
}
void
meta_wayland_touch_update (MetaWaylandTouch *touch,
const ClutterEvent *event)
@ -249,11 +242,10 @@ meta_wayland_touch_update (MetaWaylandTouch *touch,
if (event->type == CLUTTER_TOUCH_BEGIN ||
event->type == CLUTTER_TOUCH_END)
{
MetaWaylandSurface *surface = touch_info->touch_surface->surface;
struct wl_client *client = wl_resource_get_client (surface->resource);
struct wl_display *display = wl_client_get_display (client);
MetaWaylandInputDevice *input_device = META_WAYLAND_INPUT_DEVICE (touch);
touch_info->slot_serial = wl_display_get_serial (display);
touch_info->slot_serial =
meta_wayland_input_device_next_serial (input_device);
}
touch_get_relative_coordinates (touch, touch_info->touch_surface->surface,
@ -549,6 +541,8 @@ meta_wayland_touch_disable (MetaWaylandTouch *touch)
clutter_evdev_remove_filter (evdev_filter_func, touch);
#endif
meta_wayland_touch_cancel (touch);
g_clear_pointer (&touch->touch_surfaces, (GDestroyNotify) g_hash_table_unref);
g_clear_pointer (&touch->touches, (GDestroyNotify) g_hash_table_unref);
}

View File

@ -109,6 +109,11 @@ struct _MetaWaylandXdgPopup
struct {
MetaWaylandSurface *parent_surface;
/*
* The coordinates/dimensions in the placement rule are in logical pixel
* coordinate space, i.e. not scaled given what monitor the popup is on.
*/
MetaPlacementRule placement_rule;
MetaWaylandSeat *grab_seat;
@ -617,6 +622,12 @@ xdg_toplevel_role_commit (MetaWaylandSurfaceRole *surface_role,
return;
}
window_geometry = meta_wayland_xdg_surface_get_window_geometry (xdg_surface);
meta_window_wayland_move_resize (window,
&xdg_surface_priv->acked_configure_serial,
window_geometry,
pending->dx, pending->dy);
/* When we get to this point, we ought to have valid size hints */
if (pending->has_new_min_size || pending->has_new_max_size)
{
@ -639,11 +650,6 @@ xdg_toplevel_role_commit (MetaWaylandSurfaceRole *surface_role,
}
}
window_geometry = meta_wayland_xdg_surface_get_window_geometry (xdg_surface);
meta_window_wayland_move_resize (window,
&xdg_surface_priv->acked_configure_serial,
window_geometry,
pending->dx, pending->dy);
xdg_surface_priv->acked_configure_serial.set = FALSE;
}
@ -757,6 +763,22 @@ meta_wayland_xdg_toplevel_class_init (MetaWaylandXdgToplevelClass *klass)
xdg_toplevel_role_shell_client_destroyed;
}
static void
scale_placement_rule (MetaPlacementRule *placement_rule,
MetaWaylandSurface *surface)
{
int monitor_scale = surface->window->monitor->scale;
placement_rule->anchor_rect.x *= monitor_scale;
placement_rule->anchor_rect.y *= monitor_scale;
placement_rule->anchor_rect.width *= monitor_scale;
placement_rule->anchor_rect.height *= monitor_scale;
placement_rule->offset_x *= monitor_scale;
placement_rule->offset_y *= monitor_scale;
placement_rule->width *= monitor_scale;
placement_rule->height *= monitor_scale;
}
static void
finish_popup_setup (MetaWaylandXdgPopup *xdg_popup)
{
@ -764,14 +786,13 @@ finish_popup_setup (MetaWaylandXdgPopup *xdg_popup)
MetaWaylandSurface *surface =
meta_wayland_surface_role_get_surface (surface_role);
MetaWaylandSurface *parent_surface;
MetaPlacementRule placement_rule;
MetaPlacementRule scaled_placement_rule;
MetaWaylandSeat *seat;
uint32_t serial;
MetaDisplay *display = meta_get_display ();
MetaWindow *window;
parent_surface = xdg_popup->setup.parent_surface;
placement_rule = xdg_popup->setup.placement_rule;
seat = xdg_popup->setup.grab_seat;
serial = xdg_popup->setup.grab_serial;
@ -793,8 +814,12 @@ finish_popup_setup (MetaWaylandXdgPopup *xdg_popup)
&xdg_popup->parent_destroy_listener);
window = meta_window_wayland_new (display, surface);
meta_window_place_with_placement_rule (window, &placement_rule);
meta_wayland_surface_set_window (surface, window);
meta_window_update_monitor (window, FALSE);
scaled_placement_rule = xdg_popup->setup.placement_rule;
scale_placement_rule (&scaled_placement_rule, surface);
meta_window_place_with_placement_rule (window, &scaled_placement_rule);
if (seat)
{
@ -873,6 +898,7 @@ xdg_popup_role_configure (MetaWaylandSurfaceRoleShellSurface *shell_surface_role
MetaWaylandXdgPopup *xdg_popup = META_WAYLAND_XDG_POPUP (shell_surface_role);
MetaWaylandXdgSurface *xdg_surface = META_WAYLAND_XDG_SURFACE (xdg_popup);
MetaWindow *parent_window = xdg_popup->parent_surface->window;
int monitor_scale;
int x, y;
/* If the parent surface was destroyed, its window will be destroyed
@ -886,8 +912,9 @@ xdg_popup_role_configure (MetaWaylandSurfaceRoleShellSurface *shell_surface_role
if (!parent_window)
return;
x = new_x - parent_window->rect.x;
y = new_y - parent_window->rect.y;
monitor_scale = meta_window_wayland_get_main_monitor_scale (parent_window);
x = (new_x - parent_window->rect.x) / monitor_scale;
y = (new_y - parent_window->rect.y) / monitor_scale;
zxdg_popup_v6_send_configure (xdg_popup->resource,
x, y, new_width, new_height);
meta_wayland_xdg_surface_send_configure (xdg_surface);
@ -1463,6 +1490,7 @@ xdg_surface_constructor_get_toplevel (struct wl_client *client,
window = meta_window_wayland_new (meta_get_display (), surface);
meta_wayland_surface_set_window (surface, window);
meta_window_update_monitor (window, FALSE);
}
static void

View File

@ -117,6 +117,20 @@ static void
meta_window_wayland_focus (MetaWindow *window,
guint32 timestamp)
{
MetaWaylandSurface *surface = window->surface;
MetaWaylandSurfaceRoleShellSurface *shell_surface_role =
META_WAYLAND_SURFACE_ROLE_SHELL_SURFACE (surface->role);
/* The keyboard focus semantics for non-grabbing zxdg_shell_v6 popups
* is pretty undefined. Same applies for subsurfaces, but in practice,
* subsurfaces never receive keyboard focus, so it makes sense to
* do the same for non-grabbing popups.
*
* See https://bugzilla.gnome.org/show_bug.cgi?id=771694#c24
*/
if (META_IS_WAYLAND_XDG_POPUP (shell_surface_role))
return;
meta_display_set_input_focus_window (window->display,
window,
FALSE,
@ -334,18 +348,29 @@ scale_rect_size (MetaRectangle *rect,
static void
meta_window_wayland_update_main_monitor (MetaWindow *window)
{
MetaWindow *toplevel_window;
const MetaMonitorInfo *from;
const MetaMonitorInfo *to;
const MetaMonitorInfo *scaled_new;
float scale;
MetaRectangle rect;
from = window->monitor;
/* If the window is not a toplevel window (i.e. it's a popup window) just use
* the monitor of the toplevel. */
toplevel_window = meta_wayland_surface_get_toplevel_window (window->surface);
if (toplevel_window != window)
{
window->monitor = toplevel_window->monitor;
return;
}
/* Require both the current and the new monitor would be the new main monitor,
* even given the resulting scale the window would end up having. This is
* needed to avoid jumping back and forth between the new and the old, since
* changing main monitor may cause the window to be resized so that it no
* longer have that same new main monitor. */
from = window->monitor;
to = meta_screen_calculate_monitor_for_window (window->screen, window);
if (from == to)