Compare commits

..

41 Commits

Author SHA1 Message Date
Florian Müllner
335764e815 Bump version to 3.21.91
Update NEWS.
2016-08-30 00:58:08 +02:00
Florian Müllner
89f6fdce5d events: Only pass key events to Wayland if focus is on the stage
Even without a compositor grab, key events may still be expected to
be processed by the compositor and not applications, for instance
when using ctrl-alt-tab to keynav in the top bar. On X11, focus is
moved to the stage window in that case, so that events are processed
before they are dispatched by the window manager. On wayland, we need
to handle this case ourselves, so make sure to not pass key events to
wayland in that case, and move the key focus back to the stage when
appropriate.

https://bugzilla.gnome.org/show_bug.cgi?id=758167
2016-08-30 00:20:31 +02:00
Sjoerd Simons
7d9af9585d Use _NO_CONTEXT when creating images for EGL_WAYLAND_BUFFER_WL
The WL_bind_wayland_display spec says that EGL images should be created
using EGL_WAYLAND_BUFFER_WL as the target and a NULL context. Mesa
seems to be lenient and accept any context, however some other stacks
aren't so forgiving and fail if anything apart from EGL_NO_CONTEXT is
used.

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

https://bugzilla.gnome.org/show_bug.cgi?id=769731
2016-08-29 16:31:36 +02:00
Rui Matos
c8f24721c5 monitor-manager-kms: Use the output naming logic used by the X server
Switch to the output naming logic used by the X server's modesetting
driver which, in particular, uses drmModeConnector's connector_type_id
instead of connector_id.

The kernel generates new connector_id's every time there are changes
which means we can't identify the same monitor on the same connector
after an hardware hotplug. Switching to connector_type_id fixes this.

https://bugzilla.gnome.org/show_bug.cgi?id=770338
2016-08-29 15:53:00 +02:00
Rui Matos
7ba803934c monitor-manager-kms: Use the same connector type names as the X server
Switch to the connector type names used by the X server's modesetting
driver which, in particular, fixes DVI-A being labeled DVID.

https://bugzilla.gnome.org/show_bug.cgi?id=770338
2016-08-29 15:52:59 +02:00
Мирослав Николић
5a1ce1b5a2 Updated Serbian translation 2016-08-28 11:13:33 +02:00
Olivier Fourdan
1f570d542e wayland: Survive an unsupported buffer size
If cogl fails to create a texture from the client's given buffer,
mutter would raise a fatal error and terminate.

As a result, a broken client might kill gnome-shell/mutter and take the
entire Wayland session with it.

Instead of raising a fatal error in this case, log the cogl error
message and send the client an OOM error, so mutter/gnome-shell can
survive an unsupported buffer size.

https://bugzilla.gnome.org/show_bug.cgi?id=770387
2016-08-26 11:16:07 +02:00
Jonas Ådahl
658d97d00e window: Don't unmanage transient_for when attached
For some reason, when a modal dialog was made an attaching
transient-for, if the window wasn't "constructing", it would be
unmanaged and rely on some side effect to be recreated. This side
effect is not triggered for Wayland clients, thus if one happen to set
a surface as "modal" via gtk_surface.set_modal before
xdg_toplevel.set_parent, it'd be unmanaged and never show up.

Instead, simply just set the tranciency anyway for Wayland clients.
This makes GTK+ clients that set_modal() before set_transient_for()
work.

https://bugzilla.gnome.org/show_bug.cgi?id=770324
2016-08-26 09:59:55 +08:00
Jonas Ådahl
8942e98e1d Revert "window: Make meta_window_has_pointer() per protocol implemented"
Windows from Xwayland still needs to use the Wayland path, but is
represented an MetaWindowX11, thus the abstraction introduced in
"window: Make meta_window_has_pointer() per protocol implemented"
is wrong. Lets turn back time, and reconsider how this can be
abstracted more correctly in the future.

This reverts commit 9fb891d216.
2016-08-26 06:51:19 +08:00
Jonas Ådahl
b6e13c459a wayland/subsurface: Call commit of surface-actor-role on commit
Rely on the actor surface role's commit function for queuing frame
callbacks. This also makes the surface actor state synchronization work
again, which was broken by 'wayland: Sync surface actor state in actor
role commit handler'.

https://bugzilla.gnome.org/show_bug.cgi?id=770131
2016-08-25 12:19:40 +08:00
Jonas Ådahl
43151edece wayland/actor-surface-role: Check for toplevel window
Don't check whether the surface of the role has a window, but whether
the corresponding toplevel surface has a window. This is necessary to
make subsurfaces not always early out.

https://bugzilla.gnome.org/show_bug.cgi?id=770131
2016-08-25 12:19:40 +08:00
Jonas Ådahl
b3f27de710 wayland/subsurface: Return NULL as toplevel if parent has no role
There is nothing stopping a subsurface from commiting its state before
its parents role has been assigned. Thus, we need to handle
meta_wayland_surface_get_toplevel() returning NULL for subsurfaces even
on commit.
2016-08-25 12:19:40 +08:00
Jonas Ådahl
4cf14c41ef wayland: Use correct GObject parent in subsurface role object
The parent of MetaWaylandSurfaceRoleSubsurface is
MetaWaylandSurfaceRoleActorSurface thus use that as the GObject parent.

https://bugzilla.gnome.org/show_bug.cgi?id=770131
2016-08-25 12:19:40 +08:00
Jonas Ådahl
dc03b3aa47 xdg-shell: Don't early out of role commit before calling parent impl
Make sure to always call the parent role commit vfunc, so that they can
handle updating their state properly.

This means other places need to handle the situation where
surface->window is NULL on commit. This may for example happen when the
parent of a modal dialog is unmapped or NULL is attached to a
wl_shell_surface.

https://bugzilla.gnome.org/show_bug.cgi?id=769936
2016-08-25 12:19:40 +08:00
Jonas Ådahl
ef3e036b45 wayland/xdg-shell: Port to unstable v6
Port the xdg_shell implementation to use the unstable v6 protocol. This
includes:

 - making xdg_surface a generic base interface for xdg_shell surface
   roles
 - create a xdg_toplevel role replacing the old xdg_surface
 - change the xdg_opup role to be based on xdg_surface
 - make xdg_popup not grab by default
 - add support for xdg_positioner

https://bugzilla.gnome.org/show_bug.cgi?id=769936
2016-08-25 12:19:40 +08:00
Jonas Ådahl
24c3844246 wayland/xdg-shell: Make keyboard focus follow grabbing popup
This is the explicitly intended keyboard focus symantics of xdg-shell
unstable v6. The semantics are undefined in unstable v5.

https://bugzilla.gnome.org/show_bug.cgi?id=769936
2016-08-25 12:19:40 +08:00
Jonas Ådahl
f21df37190 wayland: Let shell surface role sync generic window state
Instead of having each final role do the same call, lets just make the
common role object deal with synchronizing window buffer size.

https://bugzilla.gnome.org/show_bug.cgi?id=769936
2016-08-25 12:19:40 +08:00
Jonas Ådahl
a5efa30f6c wayland: Call assigned() surface role vfunc when re-assigned
This will later be used by xdg-shell to ensure no buffer is attached on
assignment.

https://bugzilla.gnome.org/show_bug.cgi?id=769936
2016-08-25 12:19:40 +08:00
Jonas Ådahl
817911d9d3 wayland: Keep track of configured position
Besides the configured dimension, also keep track of the configured
position. This will later be used by popup position feedback.

https://bugzilla.gnome.org/show_bug.cgi?id=769936
2016-08-25 12:19:40 +08:00
Jonas Ådahl
a8d86b4876 wayland: Make gtk_shell handle our private window states
Instead of using the "allocated" state ranges of xdg_shell, lets just
use our own gtk_shell by adding a state enum and a configure event.

https://bugzilla.gnome.org/show_bug.cgi?id=769936
2016-08-25 12:19:40 +08:00
Jonas Ådahl
cfb3d10e1b MetaWaylandSurface: Add 'configure' signal
Emit a 'configure' signal before configuring the role. This will enable
extensions to send its own configure events before the role is
configured.

https://bugzilla.gnome.org/show_bug.cgi?id=769936
2016-08-25 12:19:40 +08:00
Jonas Ådahl
3a75e55cd8 wayland: Move gtk_surface fields out of MetaWaylandSurface
Let the gtk_shell extension unit handle its own state.

https://bugzilla.gnome.org/show_bug.cgi?id=769936
2016-08-25 12:19:40 +08:00
Jonas Ådahl
335cd8e74c MetaWaylandSurface: Move 'destroying' field
It is not related to the gtk_surface extension, so move it to other
generic fields.

https://bugzilla.gnome.org/show_bug.cgi?id=769936
2016-08-25 12:19:40 +08:00
Jonas Ådahl
c73d3d9d83 wayland: Move out gtk_shell from meta-wayland-surface.c
https://bugzilla.gnome.org/show_bug.cgi?id=769936
2016-08-25 12:19:40 +08:00
Jonas Ådahl
8833991201 core: Add support for custom window placement rules
Add support for assigning a window a custom window placement rule used
for calculating the initial window position as well as defining how a
window is constrained.

The custom rule is a declarative rule which defines a set of parameters
which the placing algorithm and constrain algorithm uses for
calculating the position of a window. It is meant to be used to
implement positioning of menus and other popup windows created via
Wayland.

A custom placement rule replaces any other placement or constraint
rule.

https://bugzilla.gnome.org/show_bug.cgi?id=769936
2016-08-25 12:19:40 +08:00
Jonas Ådahl
9fb891d216 window: Make meta_window_has_pointer() per protocol implemented
https://bugzilla.gnome.org/show_bug.cgi?id=769936
2016-08-25 12:19:40 +08:00
Jonas Ådahl
3b3f40a1aa MetaWaylandSurface: Allow passing parameters when assigning role
Allow passing parameters (only GObject parameters supported for now) so
that role assignment can affect the paremeters set during construction.

If a role was already assigned when assigning, the passed parameters
are set using g_object_set_valist().

https://bugzilla.gnome.org/show_bug.cgi?id=769936
2016-08-25 12:19:40 +08:00
Jonas Ådahl
2114f2eb9f MetaWaylandSurfaceRole: Set the surface instance on construction
Set the MetaWaylandSurface instance pointer on construction so that all
surface role relevant parameters are initialized when constructed.

https://bugzilla.gnome.org/show_bug.cgi?id=769936
2016-08-25 12:19:40 +08:00
Jonas Ådahl
3ee16a2abb src/Makefile.am: Pass protocol file to wayland-scanner as an argument
Instead of piping the protocol file content to wayland-scanner, pass
the file name as an argument. This enables a new enough wayland-scanner
to print more meaningful error messages.

https://bugzilla.gnome.org/show_bug.cgi?id=769936
2016-08-25 12:19:40 +08:00
Carlos Garnacho
9fb4783957 backends/native: Expose all transform modes in CRTCs
We can only honor this properly in the MUTTER_STAGE_VIEWS=1 case. When using
the legacy view, software implemented transforms are only exposed if there is
only one output, as we can only transform the entire stage there.

https://bugzilla.gnome.org/show_bug.cgi?id=745079
2016-08-24 02:38:06 +02:00
Carlos Garnacho
9e641f623f backends/native: Set offscreen on the transformed MetaRendererViews
The texture is only created if the view is transformed at the software level,
otherwise the texture is NULL, and rendering happens on the onscreen.

https://bugzilla.gnome.org/show_bug.cgi?id=745079
2016-08-24 02:38:06 +02:00
Carlos Garnacho
8065ff5a37 backends/native: Refactor onscreen creation into separate function
And use the right size, regarless of view transform.

https://bugzilla.gnome.org/show_bug.cgi?id=745079
2016-08-24 02:38:05 +02:00
Carlos Garnacho
6ce918661c backends/native: Use framebuffer size on swap_buffers implementation
Instead of ClutterStageView layout, which may be affected by transformations.

https://bugzilla.gnome.org/show_bug.cgi?id=745079
2016-08-24 02:38:05 +02:00
Carlos Garnacho
a72bd1bd29 backends/native: Set transform on MetaRendererViews
Only do this if mutter uses the multiple stage views feature. This
is uneffective at the moment because no back texture is set yet.

https://bugzilla.gnome.org/show_bug.cgi?id=745079
2016-08-24 02:38:05 +02:00
Carlos Garnacho
89854f9244 backends: Add MetaStageView::transform property
This property updates the ClutterStageView pipeline, so the texture is applied
with the corresponding transform.

https://bugzilla.gnome.org/show_bug.cgi?id=745079
2016-08-24 02:38:05 +02:00
Carlos Garnacho
a6e15e841b clutter/cogl: Transform swap buffers regions into onscreen coordinates
Those are given in view coordinates, so we must transform into onscreen
coordinates in order to perform swap_buffers on the right damage regions.

https://bugzilla.gnome.org/show_bug.cgi?id=745079
2016-08-24 02:38:05 +02:00
Carlos Garnacho
61e9c5c357 clutter/cogl: Hook up ClutterStageView render-to-texture
"Blit" the result on the framebuffer after each view is painted.
This of course only applies if there is an offscreen buffer to
perform any blitting. Otherwise the onscreen framebuffer is rendered
to directly and this step is not necessary.

https://bugzilla.gnome.org/show_bug.cgi?id=745079
2016-08-24 02:38:05 +02:00
Carlos Garnacho
54dc10f890 clutter: Add infrastructure to render ClutterStageViews to offscreen
The offscreen is given through the ::back-buffer property, the ClutterStageView
will set up the the CoglPipeline used to render it back to the "onscreen"
framebuffer.

The pipeline can be altered through the setup_pipeline() vfunc, so ClutterStageView
implementations can alter the default behavior of blitting from offscreen to
onscreen with no transformations.

All getters of "the framebuffer" that were expecting to get an onscreen have
been updated to call the right clutter_stage_view_get_onscreen() function.

https://bugzilla.gnome.org/show_bug.cgi?id=745079
2016-08-24 02:36:45 +02:00
Carlos Garnacho
7baa1d8a8d backends/native: Refactor g_object_set() call
Makes sense to update ::layout inside meta_renderer_native_set_legacy_view_size().

https://bugzilla.gnome.org/show_bug.cgi?id=745079
2016-08-24 02:11:37 +02:00
Carlos Garnacho
4b4eb3a039 backends/native: Remove unneeded call
The call to _cogl_framebuffer_winsys_update_size() results in no-op here,
as the framebuffer has already the right size when rebuilding the views.

https://bugzilla.gnome.org/show_bug.cgi?id=745079
2016-08-24 02:11:37 +02:00
Carlos Garnacho
92c03e8625 backends/native: Split hw supported CRTC rotation modes
Those will need a separate treatment from the modes that we eventually
support through "software", so split those into a separate enum so we
can can do the right thing when applying the configuration.

Also, add a helper function that returns the transform that the software
fallbacks should perform, which should be "normal" if the rotation is
already handled via hw.

The function applying the configuration has been modified to always set
a HW rotation mode (even if normal), when we come to support SW rotation
modes, we'll be relying on a normal transformation, so it will be
necessary to have mixed HW/SW managed transforms.

https://bugzilla.gnome.org/show_bug.cgi?id=745079
2016-08-24 02:09:32 +02:00
31 changed files with 2954 additions and 1370 deletions

19
NEWS
View File

@@ -1,3 +1,22 @@
3.21.91
=======
* Add support for xdg-foreign protocol [Jonas; #769786]
* Support monitor rotation on wayland [Carlos; #745079]
* Port xdg-shell implementation to unstable v6 [Jonas; #769936]
* Handle unsupported buffer sizes more gracefully [Olivier; #770387]
* Use the same output naming logic as the X server on wayland [Rui; #770338]
* Fix replies in gnome-shell's chat notifications on wayland [Florian; #758167]
* Misc. bug fixes and cleanups [Bastien, Sjoerd, Jonas; #769276, #769636,
#770131, #770324, #769731]
Contributors:
Jonas Ådahl, Olivier Fourdan, Carlos Garnacho, Rui Matos, Florian Müllner,
Bastien Nocera, Sjoerd Simons
Translations:
Piotr Drąg [pl], Mario Blättermann [de], Andika Triwidada [id],
Enrico Nicoletto [pt_BR], Мирослав Николић [sr, sr@latin]
3.21.90
=======
* Consider XDG_SESSION_TYPE when determining session type [Jouke; #759388]

View File

@@ -676,12 +676,6 @@ clutter_stage_do_paint_view (ClutterStage *stage,
_clutter_stage_paint_volume_stack_free_all (stage);
_clutter_stage_update_active_framebuffer (stage, framebuffer);
clutter_actor_paint (CLUTTER_ACTOR (stage));
if (clutter_stage_view_get_onscreen (view) !=
clutter_stage_view_get_framebuffer (view))
{
clutter_stage_view_blit_offscreen (view, clip);
}
}
/* This provides a common point of entry for painting the scenegraph

View File

@@ -420,6 +420,12 @@ paint_stage (ClutterStageCogl *stage_cogl,
_clutter_stage_maybe_setup_viewport (stage, view);
_clutter_stage_paint_view (stage, view, clip);
if (clutter_stage_view_get_onscreen (view) !=
clutter_stage_view_get_framebuffer (view))
{
clutter_stage_view_blit_offscreen (view, clip);
}
}
static void

View File

@@ -1028,6 +1028,13 @@ _cogl_egl_create_image (CoglContext *ctx,
if (target == EGL_NATIVE_PIXMAP_KHR)
egl_ctx = EGL_NO_CONTEXT;
else
#endif
#if COGL_HAS_WAYLAND_EGL_SERVER_SUPPORT
/* The WL_bind_wayland_display spec states that EGL_NO_CONTEXT is to be used
* in conjunction with the EGL_WAYLAND_BUFFER_WL target */
if (target == EGL_WAYLAND_BUFFER_WL)
egl_ctx = EGL_NO_CONTEXT;
else
#endif
egl_ctx = egl_display->egl_context;

View File

@@ -2,7 +2,7 @@ AC_PREREQ(2.62)
m4_define([mutter_major_version], [3])
m4_define([mutter_minor_version], [21])
m4_define([mutter_micro_version], [90])
m4_define([mutter_micro_version], [91])
m4_define([mutter_version],
[mutter_major_version.mutter_minor_version.mutter_micro_version])
@@ -272,7 +272,7 @@ AS_IF([test "$have_wayland" = "yes"], [
AC_SUBST([WAYLAND_SCANNER])
AC_DEFINE([HAVE_WAYLAND],[1],[Define if you want to enable Wayland support])
PKG_CHECK_MODULES(WAYLAND_PROTOCOLS, [wayland-protocols >= 1.6],
PKG_CHECK_MODULES(WAYLAND_PROTOCOLS, [wayland-protocols >= 1.7],
[ac_wayland_protocols_pkgdatadir=`$PKG_CONFIG --variable=pkgdatadir wayland-protocols`])
AC_SUBST(WAYLAND_PROTOCOLS_DATADIR, $ac_wayland_protocols_pkgdatadir)
])

572
po/sr.po
View File

@@ -1,8 +1,7 @@
# Serbian translation of mutter.
# Courtesy of Prevod.org team (http://prevod.org/) -- 2003—2016.
# This file is distributed under the same license as the mutter package.
#
# Translators:
# Translators:
# Горан Ракић <grakic@devbase.net>
# Данило Шеган <danilo@prevod.org>, 2005.
# Милош Поповић <gpopac@gmail.com>, 2010.
@@ -12,10 +11,10 @@ msgstr ""
"Project-Id-Version: mutter\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=mutter&"
"keywords=I18N+L10N&component=general\n"
"POT-Creation-Date: 2016-03-09 01:41+0000\n"
"PO-Revision-Date: 2016-03-09 09:52+0200\n"
"POT-Creation-Date: 2016-08-19 21:04+0000\n"
"PO-Revision-Date: 2016-08-28 11:11+0200\n"
"Last-Translator: Мирослав Николић <miroslavnikolic@rocketmail.com>\n"
"Language-Team: Serbian <(nothing)>\n"
"Language-Team: српски <gnome-sr@googlegroups.org>\n"
"Language: sr\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -24,255 +23,15 @@ msgstr ""
"n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
"X-Project-Style: gnome\n"
#: ../data/50-mutter-navigation.xml.in.h:1
msgid "Navigation"
msgstr "Навигација"
#: ../data/50-mutter-navigation.xml.in.h:2
msgid "Move window to workspace 1"
msgstr "Премешта прозор на радни простор број 1"
#: ../data/50-mutter-navigation.xml.in.h:3
msgid "Move window to workspace 2"
msgstr "Премешта прозор на радни простор број 2"
#: ../data/50-mutter-navigation.xml.in.h:4
msgid "Move window to workspace 3"
msgstr "Премешта прозор на радни простор број 3"
#: ../data/50-mutter-navigation.xml.in.h:5
msgid "Move window to workspace 4"
msgstr "Премешта прозор на радни простор број 4"
#: ../data/50-mutter-navigation.xml.in.h:6
msgid "Move window to last workspace"
msgstr "Премешта прозор на последњи радни простор"
#: ../data/50-mutter-navigation.xml.in.h:7
msgid "Move window one workspace to the left"
msgstr "Премешта прозор један радни простор на лево"
#: ../data/50-mutter-navigation.xml.in.h:8
msgid "Move window one workspace to the right"
msgstr "Премешта прозор један радни простор на десно"
#: ../data/50-mutter-navigation.xml.in.h:9
msgid "Move window one workspace up"
msgstr "Премешта прозор један радни простор на горе"
#: ../data/50-mutter-navigation.xml.in.h:10
msgid "Move window one workspace down"
msgstr "Премешта прозор један радни простор на доле"
#: ../data/50-mutter-navigation.xml.in.h:11
msgid "Move window one monitor to the left"
msgstr "Премешта прозор један монитор на лево"
#: ../data/50-mutter-navigation.xml.in.h:12
msgid "Move window one monitor to the right"
msgstr "Премешта прозор један монитор на десно"
#: ../data/50-mutter-navigation.xml.in.h:13
msgid "Move window one monitor up"
msgstr "Премешта прозор један монитор на горе"
#: ../data/50-mutter-navigation.xml.in.h:14
msgid "Move window one monitor down"
msgstr "Премешта прозор један монитор на доле"
#: ../data/50-mutter-navigation.xml.in.h:15
msgid "Switch applications"
msgstr "Пребацује програме"
#: ../data/50-mutter-navigation.xml.in.h:16
msgid "Switch to previous application"
msgstr "Пребацује на претходни програм"
#: ../data/50-mutter-navigation.xml.in.h:17
msgid "Switch windows"
msgstr "Пребацује прозоре"
#: ../data/50-mutter-navigation.xml.in.h:18
msgid "Switch to previous window"
msgstr "Пребацује на претходни прозор"
#: ../data/50-mutter-navigation.xml.in.h:19
msgid "Switch windows of an application"
msgstr "Пребацује прозоре програма"
#: ../data/50-mutter-navigation.xml.in.h:20
msgid "Switch to previous window of an application"
msgstr "Пребацује на претходни прозор програма"
#: ../data/50-mutter-navigation.xml.in.h:21
msgid "Switch system controls"
msgstr "Пребацује контроле система"
#: ../data/50-mutter-navigation.xml.in.h:22
msgid "Switch to previous system control"
msgstr "Пребацује на претходну контролу система"
#: ../data/50-mutter-navigation.xml.in.h:23
msgid "Switch windows directly"
msgstr "Пребацује прозоре директно"
#: ../data/50-mutter-navigation.xml.in.h:24
msgid "Switch directly to previous window"
msgstr "Пребацује непосредно на претходни прозор"
#: ../data/50-mutter-navigation.xml.in.h:25
msgid "Switch windows of an app directly"
msgstr "Пребацује прозоре програма директно"
#: ../data/50-mutter-navigation.xml.in.h:26
msgid "Switch directly to previous window of an app"
msgstr "Пребацује непосредно на претходни прозор програма"
#: ../data/50-mutter-navigation.xml.in.h:27
msgid "Switch system controls directly"
msgstr "Пребацује контроле система директно"
#: ../data/50-mutter-navigation.xml.in.h:28
msgid "Switch directly to previous system control"
msgstr "Пребацује непосредно на претходну контролу система"
#: ../data/50-mutter-navigation.xml.in.h:29
msgid "Hide all normal windows"
msgstr "Скрива све обичне прозоре"
#: ../data/50-mutter-navigation.xml.in.h:30
msgid "Switch to workspace 1"
msgstr "Пребацује се на радни простор 1"
#: ../data/50-mutter-navigation.xml.in.h:31
msgid "Switch to workspace 2"
msgstr "Пребацује се на радни простор 2"
#: ../data/50-mutter-navigation.xml.in.h:32
msgid "Switch to workspace 3"
msgstr "Пребацује се на радни простор 3"
#: ../data/50-mutter-navigation.xml.in.h:33
msgid "Switch to workspace 4"
msgstr "Пребацује се на радни простор 4"
#: ../data/50-mutter-navigation.xml.in.h:34
msgid "Switch to last workspace"
msgstr "Пребацује се на последњи радни простор"
#: ../data/50-mutter-navigation.xml.in.h:35
msgid "Move to workspace left"
msgstr "Премешта на радни простор лево"
#: ../data/50-mutter-navigation.xml.in.h:36
msgid "Move to workspace right"
msgstr "Премешта на радни простор десно"
#: ../data/50-mutter-navigation.xml.in.h:37
msgid "Move to workspace above"
msgstr "Премешта на радни простор изнад"
#: ../data/50-mutter-navigation.xml.in.h:38
msgid "Move to workspace below"
msgstr "Премешта на радни простор испод"
#: ../data/50-mutter-system.xml.in.h:1
msgid "System"
msgstr "Систем"
#: ../data/50-mutter-system.xml.in.h:2
msgid "Show the run command prompt"
msgstr "Приказује промпт за покретање наредбе"
#: ../data/50-mutter-system.xml.in.h:3
msgid "Show the activities overview"
msgstr "Приказује преглед активности"
#: ../data/50-mutter-windows.xml.in.h:1
msgid "Windows"
msgstr "Прозори"
#: ../data/50-mutter-windows.xml.in.h:2
msgid "Activate the window menu"
msgstr "Активира мени прозора"
#: ../data/50-mutter-windows.xml.in.h:3
msgid "Toggle fullscreen mode"
msgstr "Искључује/укључује приказ преко целог екрана"
#: ../data/50-mutter-windows.xml.in.h:4
msgid "Toggle maximization state"
msgstr "Искључује/укључује стање увећања"
#: ../data/50-mutter-windows.xml.in.h:5
msgid "Maximize window"
msgstr "Увећава прозор"
#: ../data/50-mutter-windows.xml.in.h:6
msgid "Restore window"
msgstr "Враћа величину прозора"
#: ../data/50-mutter-windows.xml.in.h:7
msgid "Toggle shaded state"
msgstr "Искључује/укључује стање засенчености"
#: ../data/50-mutter-windows.xml.in.h:8
msgid "Close window"
msgstr "Затвара прозор"
#: ../data/50-mutter-windows.xml.in.h:9
msgid "Hide window"
msgstr "Скрива прозор"
#: ../data/50-mutter-windows.xml.in.h:10
msgid "Move window"
msgstr "Премешта прозор"
#: ../data/50-mutter-windows.xml.in.h:11
msgid "Resize window"
msgstr "Мења величину прозора"
#: ../data/50-mutter-windows.xml.in.h:12
msgid "Toggle window on all workspaces or one"
msgstr "Приказује прозор на свим радним просторима или само на једном"
#: ../data/50-mutter-windows.xml.in.h:13
msgid "Raise window if covered, otherwise lower it"
msgstr "Издиже прозор уколико га други прозор заклања, у противном га спушта"
#: ../data/50-mutter-windows.xml.in.h:14
msgid "Raise window above other windows"
msgstr "Издиже прозор изнад осталих прозора"
#: ../data/50-mutter-windows.xml.in.h:15
msgid "Lower window below other windows"
msgstr "Спушта прозор испод осталих прозора"
#: ../data/50-mutter-windows.xml.in.h:16
msgid "Maximize window vertically"
msgstr "Увећава прозор вертикално"
#: ../data/50-mutter-windows.xml.in.h:17
msgid "Maximize window horizontally"
msgstr "Увећава прозор хоризонтално"
#: ../data/50-mutter-windows.xml.in.h:18
msgid "View split on left"
msgstr "Прикажите поделу на лево"
#: ../data/50-mutter-windows.xml.in.h:19
msgid "View split on right"
msgstr "Прикажите поделу на десно"
#: ../data/mutter.desktop.in.h:1
#: data/mutter.desktop.in:4
msgid "Mutter"
msgstr "Матер"
#: ../data/org.gnome.mutter.gschema.xml.in.h:1
#: data/org.gnome.mutter.gschema.xml.in:7
msgid "Modifier to use for extended window management operations"
msgstr "Тастер који се користи за проширене радње управника прозорима"
#: ../data/org.gnome.mutter.gschema.xml.in.h:2
#: data/org.gnome.mutter.gschema.xml.in:8
msgid ""
"This key will initiate the \"overlay\", which is a combination window "
"overview and application launching system. The default is intended to be the "
@@ -284,11 +43,11 @@ msgstr ""
"за компоненте рачунара. Очекује се да ово везује или подразумевани или низ "
"празних знакова."
#: ../data/org.gnome.mutter.gschema.xml.in.h:3
#: data/org.gnome.mutter.gschema.xml.in:20
msgid "Attach modal dialogs"
msgstr "Прилагање модалних прозорчића"
#: ../data/org.gnome.mutter.gschema.xml.in.h:4
#: data/org.gnome.mutter.gschema.xml.in:21
msgid ""
"When true, instead of having independent titlebars, modal dialogs appear "
"attached to the titlebar of the parent window and are moved together with "
@@ -298,12 +57,12 @@ msgstr ""
"појављују приложени на траку алата матичног прозора и бивају премештани "
"заједно са матичним прозором."
#: ../data/org.gnome.mutter.gschema.xml.in.h:5
#: data/org.gnome.mutter.gschema.xml.in:30
msgid "Enable edge tiling when dropping windows on screen edges"
msgstr ""
"Укључује поплочавање ивице приликом отпуштања прозора на ивицама екрана"
#: ../data/org.gnome.mutter.gschema.xml.in.h:6
#: data/org.gnome.mutter.gschema.xml.in:31
msgid ""
"If enabled, dropping windows on vertical screen edges maximizes them "
"vertically and resizes them horizontally to cover half of the available "
@@ -313,11 +72,11 @@ msgstr ""
"усправно и мења им величину водоравно да прекрију половину доступне области. "
"Отпуштање прозора на горњој ивици екрана увећава их у потпуности."
#: ../data/org.gnome.mutter.gschema.xml.in.h:7
#: data/org.gnome.mutter.gschema.xml.in:40
msgid "Workspaces are managed dynamically"
msgstr "Радним просторима се управља динамички"
#: ../data/org.gnome.mutter.gschema.xml.in.h:8
#: data/org.gnome.mutter.gschema.xml.in:41
msgid ""
"Determines whether workspaces are managed dynamically or whether there's a "
"static number of workspaces (determined by the num-workspaces key in org."
@@ -327,11 +86,11 @@ msgstr ""
"стални број радних простора (одређен бројем радних простора у „org.gnome."
"desktop.wm.preferences“)."
#: ../data/org.gnome.mutter.gschema.xml.in.h:9
#: data/org.gnome.mutter.gschema.xml.in:50
msgid "Workspaces only on primary"
msgstr "Радни простори само на примарне"
#: ../data/org.gnome.mutter.gschema.xml.in.h:10
#: data/org.gnome.mutter.gschema.xml.in:51
msgid ""
"Determines whether workspace switching should happen for windows on all "
"monitors or only for windows on the primary monitor."
@@ -339,11 +98,11 @@ msgstr ""
"Одређује да ли пребацивање радног простора треба да се деси за прозоре на "
"свим мониторима или само за прозоре на главном монитору."
#: ../data/org.gnome.mutter.gschema.xml.in.h:11
#: data/org.gnome.mutter.gschema.xml.in:59
msgid "No tab popup"
msgstr "Без искакања језичка"
#: ../data/org.gnome.mutter.gschema.xml.in.h:12
#: data/org.gnome.mutter.gschema.xml.in:60
msgid ""
"Determines whether the use of popup and highlight frame should be disabled "
"for window cycling."
@@ -351,11 +110,11 @@ msgstr ""
"Одређује да ли ће употреба оквира искакања и истицања бити приказана за "
"кретање по прозорима."
#: ../data/org.gnome.mutter.gschema.xml.in.h:13
#: data/org.gnome.mutter.gschema.xml.in:68
msgid "Delay focus changes until the pointer stops moving"
msgstr "Застој првог плана се мења док се показивач не заустави"
#: ../data/org.gnome.mutter.gschema.xml.in.h:14
#: data/org.gnome.mutter.gschema.xml.in:69
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 "
@@ -365,11 +124,11 @@ msgstr ""
"план неће бити мењан одмах по уласку у прозор, већ само након што показивач "
"престане да се помера."
#: ../data/org.gnome.mutter.gschema.xml.in.h:15
#: data/org.gnome.mutter.gschema.xml.in:79
msgid "Draggable border width"
msgstr "Ширина ивице за превлачење"
#: ../data/org.gnome.mutter.gschema.xml.in.h:16
#: data/org.gnome.mutter.gschema.xml.in:80
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."
@@ -377,11 +136,11 @@ msgstr ""
"Износ укупне ивице за превлачење. Ако видљиве ивице теме нису довољне, биће "
"додате невидљиве ивице за достизање ове вредности."
#: ../data/org.gnome.mutter.gschema.xml.in.h:17
#: data/org.gnome.mutter.gschema.xml.in:89
msgid "Auto maximize nearly monitor sized windows"
msgstr "Сам увећава повећане прозоре најближег монитора"
#: ../data/org.gnome.mutter.gschema.xml.in.h:18
#: data/org.gnome.mutter.gschema.xml.in:90
msgid ""
"If enabled, new windows that are initially the size of the monitor "
"automatically get maximized."
@@ -389,11 +148,11 @@ msgstr ""
"Ако је укључено, нови прозори који су почетно величине монитора самостално "
"бивају увећани."
#: ../data/org.gnome.mutter.gschema.xml.in.h:19
#: data/org.gnome.mutter.gschema.xml.in:98
msgid "Place new windows in the center"
msgstr "Нови прозор у средиште"
#: ../data/org.gnome.mutter.gschema.xml.in.h:20
#: data/org.gnome.mutter.gschema.xml.in:99
msgid ""
"When true, the new windows will always be put in the center of the active "
"screen of the monitor."
@@ -401,85 +160,94 @@ msgstr ""
"Ако је изабрано, нови прозори ће увек бити постављени на средину радног "
"екрана монитора."
#: ../data/org.gnome.mutter.gschema.xml.in.h:21
#: data/org.gnome.mutter.gschema.xml.in:120
msgid "Select window from tab popup"
msgstr "Бира прозор из језичка искакања"
#: ../data/org.gnome.mutter.gschema.xml.in.h:22
#: data/org.gnome.mutter.gschema.xml.in:125
msgid "Cancel tab popup"
msgstr "Отказивање језичка искакања"
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:1
#: data/org.gnome.mutter.wayland.gschema.xml.in:6
msgid "Switch to VT 1"
msgstr "Прелазак на ВТ 1"
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:2
#: data/org.gnome.mutter.wayland.gschema.xml.in:10
msgid "Switch to VT 2"
msgstr "Прелазак на ВТ 2"
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:3
#: data/org.gnome.mutter.wayland.gschema.xml.in:14
msgid "Switch to VT 3"
msgstr "Прелазак на ВТ 3"
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:4
#: data/org.gnome.mutter.wayland.gschema.xml.in:18
msgid "Switch to VT 4"
msgstr "Прелазак на ВТ 4"
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:5
#: data/org.gnome.mutter.wayland.gschema.xml.in:22
msgid "Switch to VT 5"
msgstr "Прелазак на ВТ 5"
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:6
#: data/org.gnome.mutter.wayland.gschema.xml.in:26
msgid "Switch to VT 6"
msgstr "Прелазак на ВТ 6"
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:7
#: data/org.gnome.mutter.wayland.gschema.xml.in:30
msgid "Switch to VT 7"
msgstr "Прелазак на ВТ 7"
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:8
#: data/org.gnome.mutter.wayland.gschema.xml.in:34
msgid "Switch to VT 8"
msgstr "Прелазак на ВТ 8"
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:9
#: data/org.gnome.mutter.wayland.gschema.xml.in:38
msgid "Switch to VT 9"
msgstr "Прелазак на ВТ 9"
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:10
#: data/org.gnome.mutter.wayland.gschema.xml.in:42
msgid "Switch to VT 10"
msgstr "Прелазак на ВТ 10"
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:11
#: data/org.gnome.mutter.wayland.gschema.xml.in:46
msgid "Switch to VT 11"
msgstr "Прелазак на ВТ 11"
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:12
#: data/org.gnome.mutter.wayland.gschema.xml.in:50
msgid "Switch to VT 12"
msgstr "Прелазак на ВТ 12"
#: ../src/backends/meta-monitor-manager.c:518
#: src/backends/meta-input-settings.c:1707
#| msgid "Switch system controls"
msgid "Switch monitor"
msgstr "Промени монитор"
#: src/backends/meta-input-settings.c:1709
msgid "Show on-screen help"
msgstr "Прикажи помоћ на екрану"
#: src/backends/meta-monitor-manager.c:514
msgid "Built-in display"
msgstr "Уграђени дисплеј"
#: ../src/backends/meta-monitor-manager.c:544
#: src/backends/meta-monitor-manager.c:537
msgid "Unknown"
msgstr "Непознато"
#: ../src/backends/meta-monitor-manager.c:546
#: src/backends/meta-monitor-manager.c:539
msgid "Unknown Display"
msgstr "Непознат дисплеј"
#. TRANSLATORS: this is a monitor vendor name, followed by a
#. * size in inches, like 'Dell 15"'
#.
#: ../src/backends/meta-monitor-manager.c:554
#: 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"
@@ -487,20 +255,20 @@ msgid ""
msgstr ""
"Неки други композитни управник је већ покренут на приказу %i еркана „%s“."
#: ../src/core/bell.c:185
#: src/core/bell.c:194
msgid "Bell event"
msgstr "Звонца"
#: ../src/core/delete.c:127
#: src/core/delete.c:127
#, c-format
msgid "“%s” is not responding."
msgstr "„%s“ не даје одзив."
#: ../src/core/delete.c:129
#: src/core/delete.c:129
msgid "Application is not responding."
msgstr "Програм не даје одзив."
#: ../src/core/delete.c:134
#: src/core/delete.c:134
msgid ""
"You may choose to wait a short while for it to continue or force the "
"application to quit entirely."
@@ -508,57 +276,56 @@ msgstr ""
"Можете мало сачекати док се програм не сабере или приморати програм да "
"комплетно прекине са радом."
#: ../src/core/delete.c:141
#: src/core/delete.c:141
msgid "_Wait"
msgstr "_Сачекај"
#: ../src/core/delete.c:141
#: src/core/delete.c:141
msgid "_Force Quit"
msgstr "_Приморај излаз"
#: ../src/core/display.c:555
#: src/core/display.c:590
#, c-format
msgid "Failed to open X Window System display '%s'\n"
msgstr "Нисам успео да отворим екран „%s“ Икс система прозора\n"
#: ../src/core/main.c:181
#: src/core/main.c:182
msgid "Disable connection to session manager"
msgstr "Искључује везу са управником сесије"
#: ../src/core/main.c:187
#: src/core/main.c:188
msgid "Replace the running window manager"
msgstr "Мења текућег управника прозорима"
#: ../src/core/main.c:193
#: src/core/main.c:194
msgid "Specify session management ID"
msgstr "Наводи ИБ управника сесије"
#: ../src/core/main.c:198
#: src/core/main.c:199
msgid "X Display to use"
msgstr "Икс екран који ће бити коришћен"
#: ../src/core/main.c:204
#: src/core/main.c:205
msgid "Initialize session from savefile"
msgstr "Покреће сесију из датотеке чувања"
#: ../src/core/main.c:210
#: src/core/main.c:211
msgid "Make X calls synchronous"
msgstr "Чини Икс позиве усклађеним"
#: ../src/core/main.c:217
#: src/core/main.c:218
msgid "Run as a wayland compositor"
msgstr "Ради као вајландов саставник"
#: ../src/core/main.c:223
#| msgid "Run as a wayland compositor"
#: src/core/main.c:224
msgid "Run as a nested compositor"
msgstr "Ради као угнеждени саставник"
#: ../src/core/main.c:231
#: src/core/main.c:232
msgid "Run as a full display server, rather than nested"
msgstr "Ради као пуни сервер приказа, уместо као угнеждени"
#: ../src/core/mutter.c:39
#: src/core/mutter.c:39
#, c-format
msgid ""
"mutter %s\n"
@@ -573,20 +340,20 @@ msgstr ""
"НЕ постоји никаква гаранција; чак ни гаранција о ТРЖИШНОЈ ВРЕДНОСТИ или "
"ПРИЛАГОЂЕНОСТИ ОДРЕЂЕНОЈ НАМЕНИ.\n"
#: ../src/core/mutter.c:53
#: src/core/mutter.c:53
msgid "Print version"
msgstr "Исписује издање"
#: ../src/core/mutter.c:59
#: src/core/mutter.c:59
msgid "Mutter plugin to use"
msgstr "Прикључци Матера за коришћење"
#: ../src/core/prefs.c:1997
#: src/core/prefs.c:1997
#, c-format
msgid "Workspace %d"
msgstr "%d. радни простор"
#: ../src/core/screen.c:521
#: src/core/screen.c:521
#, c-format
msgid ""
"Display \"%s\" already has a window manager; try using the --replace option "
@@ -595,16 +362,21 @@ msgstr ""
"Приказ „%s“ већ има управника прозора; пробајте да користите опцију „--"
"replace“ да замените тренутног управника прозора."
#: ../src/core/screen.c:603
#: src/core/screen.c:606
#, c-format
msgid "Screen %d on display '%s' is invalid\n"
msgstr "Приказ „%d“ на екрану „%s“ није исправан\n"
#: ../src/core/util.c:121
#: src/core/util.c:120
msgid "Mutter was compiled without support for verbose mode\n"
msgstr "Матер је преведен без подршке за опширан режим\n"
#: ../src/x11/session.c:1815
#: src/wayland/meta-wayland-tablet-pad.c:595
#, c-format
msgid "Mode Switch: Mode %d"
msgstr "Режим прекидача: Режим %d"
#: src/x11/session.c:1815
msgid ""
"These windows do not support &quot;save current setup&quot; and will have to "
"be restarted manually next time you log in."
@@ -612,11 +384,189 @@ msgstr ""
"Ови прозори не подржавају могућност „сачувај тренутна подешавања“ па ћете "
"морати ручно да их поново покренете када се следећи пут пријавите."
#: ../src/x11/window-props.c:549
#: src/x11/window-props.c:548
#, c-format
msgid "%s (on %s)"
msgstr "%s (на %s)"
#~ msgid "Navigation"
#~ msgstr "Навигација"
#~ msgid "Move window to workspace 1"
#~ msgstr "Премешта прозор на радни простор број 1"
#~ msgid "Move window to workspace 2"
#~ msgstr "Премешта прозор на радни простор број 2"
#~ msgid "Move window to workspace 3"
#~ msgstr "Премешта прозор на радни простор број 3"
#~ msgid "Move window to workspace 4"
#~ msgstr "Премешта прозор на радни простор број 4"
#~ msgid "Move window to last workspace"
#~ msgstr "Премешта прозор на последњи радни простор"
#~ msgid "Move window one workspace to the left"
#~ msgstr "Премешта прозор један радни простор на лево"
#~ msgid "Move window one workspace to the right"
#~ msgstr "Премешта прозор један радни простор на десно"
#~ msgid "Move window one workspace up"
#~ msgstr "Премешта прозор један радни простор на горе"
#~ msgid "Move window one workspace down"
#~ msgstr "Премешта прозор један радни простор на доле"
#~ msgid "Move window one monitor to the left"
#~ msgstr "Премешта прозор један монитор на лево"
#~ msgid "Move window one monitor to the right"
#~ msgstr "Премешта прозор један монитор на десно"
#~ msgid "Move window one monitor up"
#~ msgstr "Премешта прозор један монитор на горе"
#~ msgid "Move window one monitor down"
#~ msgstr "Премешта прозор један монитор на доле"
#~ msgid "Switch applications"
#~ msgstr "Пребацује програме"
#~ msgid "Switch to previous application"
#~ msgstr "Пребацује на претходни програм"
#~ msgid "Switch windows"
#~ msgstr "Пребацује прозоре"
#~ msgid "Switch to previous window"
#~ msgstr "Пребацује на претходни прозор"
#~ msgid "Switch windows of an application"
#~ msgstr "Пребацује прозоре програма"
#~ msgid "Switch to previous window of an application"
#~ msgstr "Пребацује на претходни прозор програма"
#~ msgid "Switch to previous system control"
#~ msgstr "Пребацује на претходну контролу система"
#~ msgid "Switch windows directly"
#~ msgstr "Пребацује прозоре директно"
#~ msgid "Switch directly to previous window"
#~ msgstr "Пребацује непосредно на претходни прозор"
#~ msgid "Switch windows of an app directly"
#~ msgstr "Пребацује прозоре програма директно"
#~ msgid "Switch directly to previous window of an app"
#~ msgstr "Пребацује непосредно на претходни прозор програма"
#~ msgid "Switch system controls directly"
#~ msgstr "Пребацује контроле система директно"
#~ msgid "Switch directly to previous system control"
#~ msgstr "Пребацује непосредно на претходну контролу система"
#~ msgid "Hide all normal windows"
#~ msgstr "Скрива све обичне прозоре"
#~ msgid "Switch to workspace 1"
#~ msgstr "Пребацује се на радни простор 1"
#~ msgid "Switch to workspace 2"
#~ msgstr "Пребацује се на радни простор 2"
#~ msgid "Switch to workspace 3"
#~ msgstr "Пребацује се на радни простор 3"
#~ msgid "Switch to workspace 4"
#~ msgstr "Пребацује се на радни простор 4"
#~ msgid "Switch to last workspace"
#~ msgstr "Пребацује се на последњи радни простор"
#~ msgid "Move to workspace left"
#~ msgstr "Премешта на радни простор лево"
#~ msgid "Move to workspace right"
#~ msgstr "Премешта на радни простор десно"
#~ msgid "Move to workspace above"
#~ msgstr "Премешта на радни простор изнад"
#~ msgid "Move to workspace below"
#~ msgstr "Премешта на радни простор испод"
#~ msgid "System"
#~ msgstr "Систем"
#~ msgid "Show the run command prompt"
#~ msgstr "Приказује промпт за покретање наредбе"
#~ msgid "Show the activities overview"
#~ msgstr "Приказује преглед активности"
#~ msgid "Windows"
#~ msgstr "Прозори"
#~ msgid "Activate the window menu"
#~ msgstr "Активира мени прозора"
#~ msgid "Toggle fullscreen mode"
#~ msgstr "Искључује/укључује приказ преко целог екрана"
#~ msgid "Toggle maximization state"
#~ msgstr "Искључује/укључује стање увећања"
#~ msgid "Maximize window"
#~ msgstr "Увећава прозор"
#~ msgid "Restore window"
#~ msgstr "Враћа величину прозора"
#~ msgid "Toggle shaded state"
#~ msgstr "Искључује/укључује стање засенчености"
#~ msgid "Close window"
#~ msgstr "Затвара прозор"
#~ msgid "Hide window"
#~ msgstr "Скрива прозор"
#~ msgid "Move window"
#~ msgstr "Премешта прозор"
#~ msgid "Resize window"
#~ msgstr "Мења величину прозора"
#~ msgid "Toggle window on all workspaces or one"
#~ msgstr "Приказује прозор на свим радним просторима или само на једном"
#~ msgid "Raise window if covered, otherwise lower it"
#~ msgstr ""
#~ "Издиже прозор уколико га други прозор заклања, у противном га спушта"
#~ msgid "Raise window above other windows"
#~ msgstr "Издиже прозор изнад осталих прозора"
#~ msgid "Lower window below other windows"
#~ msgstr "Спушта прозор испод осталих прозора"
#~ msgid "Maximize window vertically"
#~ msgstr "Увећава прозор вертикално"
#~ msgid "Maximize window horizontally"
#~ msgstr "Увећава прозор хоризонтално"
#~ msgid "View split on left"
#~ msgstr "Прикажите поделу на лево"
#~ msgid "View split on right"
#~ msgstr "Прикажите поделу на десно"
#~ msgid "Failed to scan themes directory: %s\n"
#~ msgstr "Нисам успео да прочитам директоријум тема: %s\n"

View File

@@ -1,8 +1,7 @@
# Serbian translation of mutter.
# Courtesy of Prevod.org team (http://prevod.org/) -- 2003—2016.
# This file is distributed under the same license as the mutter package.
#
# Translators:
# Translators:
# Goran Rakić <grakic@devbase.net>
# Danilo Šegan <danilo@prevod.org>, 2005.
# Miloš Popović <gpopac@gmail.com>, 2010.
@@ -12,11 +11,11 @@ msgstr ""
"Project-Id-Version: mutter\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=mutter&"
"keywords=I18N+L10N&component=general\n"
"POT-Creation-Date: 2016-03-09 01:41+0000\n"
"PO-Revision-Date: 2016-03-09 09:52+0200\n"
"POT-Creation-Date: 2016-08-19 21:04+0000\n"
"PO-Revision-Date: 2016-08-28 11:11+0200\n"
"Last-Translator: Miroslav Nikolić <miroslavnikolic@rocketmail.com>\n"
"Language-Team: Serbian <(nothing)>\n"
"Language: sr@latin\n"
"Language-Team: srpski <gnome-sr@googlegroups.org>\n"
"Language: sr\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
@@ -24,255 +23,15 @@ msgstr ""
"n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
"X-Project-Style: gnome\n"
#: ../data/50-mutter-navigation.xml.in.h:1
msgid "Navigation"
msgstr "Navigacija"
#: ../data/50-mutter-navigation.xml.in.h:2
msgid "Move window to workspace 1"
msgstr "Premešta prozor na radni prostor broj 1"
#: ../data/50-mutter-navigation.xml.in.h:3
msgid "Move window to workspace 2"
msgstr "Premešta prozor na radni prostor broj 2"
#: ../data/50-mutter-navigation.xml.in.h:4
msgid "Move window to workspace 3"
msgstr "Premešta prozor na radni prostor broj 3"
#: ../data/50-mutter-navigation.xml.in.h:5
msgid "Move window to workspace 4"
msgstr "Premešta prozor na radni prostor broj 4"
#: ../data/50-mutter-navigation.xml.in.h:6
msgid "Move window to last workspace"
msgstr "Premešta prozor na poslednji radni prostor"
#: ../data/50-mutter-navigation.xml.in.h:7
msgid "Move window one workspace to the left"
msgstr "Premešta prozor jedan radni prostor na levo"
#: ../data/50-mutter-navigation.xml.in.h:8
msgid "Move window one workspace to the right"
msgstr "Premešta prozor jedan radni prostor na desno"
#: ../data/50-mutter-navigation.xml.in.h:9
msgid "Move window one workspace up"
msgstr "Premešta prozor jedan radni prostor na gore"
#: ../data/50-mutter-navigation.xml.in.h:10
msgid "Move window one workspace down"
msgstr "Premešta prozor jedan radni prostor na dole"
#: ../data/50-mutter-navigation.xml.in.h:11
msgid "Move window one monitor to the left"
msgstr "Premešta prozor jedan monitor na levo"
#: ../data/50-mutter-navigation.xml.in.h:12
msgid "Move window one monitor to the right"
msgstr "Premešta prozor jedan monitor na desno"
#: ../data/50-mutter-navigation.xml.in.h:13
msgid "Move window one monitor up"
msgstr "Premešta prozor jedan monitor na gore"
#: ../data/50-mutter-navigation.xml.in.h:14
msgid "Move window one monitor down"
msgstr "Premešta prozor jedan monitor na dole"
#: ../data/50-mutter-navigation.xml.in.h:15
msgid "Switch applications"
msgstr "Prebacuje programe"
#: ../data/50-mutter-navigation.xml.in.h:16
msgid "Switch to previous application"
msgstr "Prebacuje na prethodni program"
#: ../data/50-mutter-navigation.xml.in.h:17
msgid "Switch windows"
msgstr "Prebacuje prozore"
#: ../data/50-mutter-navigation.xml.in.h:18
msgid "Switch to previous window"
msgstr "Prebacuje na prethodni prozor"
#: ../data/50-mutter-navigation.xml.in.h:19
msgid "Switch windows of an application"
msgstr "Prebacuje prozore programa"
#: ../data/50-mutter-navigation.xml.in.h:20
msgid "Switch to previous window of an application"
msgstr "Prebacuje na prethodni prozor programa"
#: ../data/50-mutter-navigation.xml.in.h:21
msgid "Switch system controls"
msgstr "Prebacuje kontrole sistema"
#: ../data/50-mutter-navigation.xml.in.h:22
msgid "Switch to previous system control"
msgstr "Prebacuje na prethodnu kontrolu sistema"
#: ../data/50-mutter-navigation.xml.in.h:23
msgid "Switch windows directly"
msgstr "Prebacuje prozore direktno"
#: ../data/50-mutter-navigation.xml.in.h:24
msgid "Switch directly to previous window"
msgstr "Prebacuje neposredno na prethodni prozor"
#: ../data/50-mutter-navigation.xml.in.h:25
msgid "Switch windows of an app directly"
msgstr "Prebacuje prozore programa direktno"
#: ../data/50-mutter-navigation.xml.in.h:26
msgid "Switch directly to previous window of an app"
msgstr "Prebacuje neposredno na prethodni prozor programa"
#: ../data/50-mutter-navigation.xml.in.h:27
msgid "Switch system controls directly"
msgstr "Prebacuje kontrole sistema direktno"
#: ../data/50-mutter-navigation.xml.in.h:28
msgid "Switch directly to previous system control"
msgstr "Prebacuje neposredno na prethodnu kontrolu sistema"
#: ../data/50-mutter-navigation.xml.in.h:29
msgid "Hide all normal windows"
msgstr "Skriva sve obične prozore"
#: ../data/50-mutter-navigation.xml.in.h:30
msgid "Switch to workspace 1"
msgstr "Prebacuje se na radni prostor 1"
#: ../data/50-mutter-navigation.xml.in.h:31
msgid "Switch to workspace 2"
msgstr "Prebacuje se na radni prostor 2"
#: ../data/50-mutter-navigation.xml.in.h:32
msgid "Switch to workspace 3"
msgstr "Prebacuje se na radni prostor 3"
#: ../data/50-mutter-navigation.xml.in.h:33
msgid "Switch to workspace 4"
msgstr "Prebacuje se na radni prostor 4"
#: ../data/50-mutter-navigation.xml.in.h:34
msgid "Switch to last workspace"
msgstr "Prebacuje se na poslednji radni prostor"
#: ../data/50-mutter-navigation.xml.in.h:35
msgid "Move to workspace left"
msgstr "Premešta na radni prostor levo"
#: ../data/50-mutter-navigation.xml.in.h:36
msgid "Move to workspace right"
msgstr "Premešta na radni prostor desno"
#: ../data/50-mutter-navigation.xml.in.h:37
msgid "Move to workspace above"
msgstr "Premešta na radni prostor iznad"
#: ../data/50-mutter-navigation.xml.in.h:38
msgid "Move to workspace below"
msgstr "Premešta na radni prostor ispod"
#: ../data/50-mutter-system.xml.in.h:1
msgid "System"
msgstr "Sistem"
#: ../data/50-mutter-system.xml.in.h:2
msgid "Show the run command prompt"
msgstr "Prikazuje prompt za pokretanje naredbe"
#: ../data/50-mutter-system.xml.in.h:3
msgid "Show the activities overview"
msgstr "Prikazuje pregled aktivnosti"
#: ../data/50-mutter-windows.xml.in.h:1
msgid "Windows"
msgstr "Prozori"
#: ../data/50-mutter-windows.xml.in.h:2
msgid "Activate the window menu"
msgstr "Aktivira meni prozora"
#: ../data/50-mutter-windows.xml.in.h:3
msgid "Toggle fullscreen mode"
msgstr "Isključuje/uključuje prikaz preko celog ekrana"
#: ../data/50-mutter-windows.xml.in.h:4
msgid "Toggle maximization state"
msgstr "Isključuje/uključuje stanje uvećanja"
#: ../data/50-mutter-windows.xml.in.h:5
msgid "Maximize window"
msgstr "Uvećava prozor"
#: ../data/50-mutter-windows.xml.in.h:6
msgid "Restore window"
msgstr "Vraća veličinu prozora"
#: ../data/50-mutter-windows.xml.in.h:7
msgid "Toggle shaded state"
msgstr "Isključuje/uključuje stanje zasenčenosti"
#: ../data/50-mutter-windows.xml.in.h:8
msgid "Close window"
msgstr "Zatvara prozor"
#: ../data/50-mutter-windows.xml.in.h:9
msgid "Hide window"
msgstr "Skriva prozor"
#: ../data/50-mutter-windows.xml.in.h:10
msgid "Move window"
msgstr "Premešta prozor"
#: ../data/50-mutter-windows.xml.in.h:11
msgid "Resize window"
msgstr "Menja veličinu prozora"
#: ../data/50-mutter-windows.xml.in.h:12
msgid "Toggle window on all workspaces or one"
msgstr "Prikazuje prozor na svim radnim prostorima ili samo na jednom"
#: ../data/50-mutter-windows.xml.in.h:13
msgid "Raise window if covered, otherwise lower it"
msgstr "Izdiže prozor ukoliko ga drugi prozor zaklanja, u protivnom ga spušta"
#: ../data/50-mutter-windows.xml.in.h:14
msgid "Raise window above other windows"
msgstr "Izdiže prozor iznad ostalih prozora"
#: ../data/50-mutter-windows.xml.in.h:15
msgid "Lower window below other windows"
msgstr "Spušta prozor ispod ostalih prozora"
#: ../data/50-mutter-windows.xml.in.h:16
msgid "Maximize window vertically"
msgstr "Uvećava prozor vertikalno"
#: ../data/50-mutter-windows.xml.in.h:17
msgid "Maximize window horizontally"
msgstr "Uvećava prozor horizontalno"
#: ../data/50-mutter-windows.xml.in.h:18
msgid "View split on left"
msgstr "Prikažite podelu na levo"
#: ../data/50-mutter-windows.xml.in.h:19
msgid "View split on right"
msgstr "Prikažite podelu na desno"
#: ../data/mutter.desktop.in.h:1
#: data/mutter.desktop.in:4
msgid "Mutter"
msgstr "Mater"
#: ../data/org.gnome.mutter.gschema.xml.in.h:1
#: data/org.gnome.mutter.gschema.xml.in:7
msgid "Modifier to use for extended window management operations"
msgstr "Taster koji se koristi za proširene radnje upravnika prozorima"
#: ../data/org.gnome.mutter.gschema.xml.in.h:2
#: data/org.gnome.mutter.gschema.xml.in:8
msgid ""
"This key will initiate the \"overlay\", which is a combination window "
"overview and application launching system. The default is intended to be the "
@@ -284,11 +43,11 @@ msgstr ""
"za komponente računara. Očekuje se da ovo vezuje ili podrazumevani ili niz "
"praznih znakova."
#: ../data/org.gnome.mutter.gschema.xml.in.h:3
#: data/org.gnome.mutter.gschema.xml.in:20
msgid "Attach modal dialogs"
msgstr "Prilaganje modalnih prozorčića"
#: ../data/org.gnome.mutter.gschema.xml.in.h:4
#: data/org.gnome.mutter.gschema.xml.in:21
msgid ""
"When true, instead of having independent titlebars, modal dialogs appear "
"attached to the titlebar of the parent window and are moved together with "
@@ -298,12 +57,12 @@ msgstr ""
"pojavljuju priloženi na traku alata matičnog prozora i bivaju premeštani "
"zajedno sa matičnim prozorom."
#: ../data/org.gnome.mutter.gschema.xml.in.h:5
#: data/org.gnome.mutter.gschema.xml.in:30
msgid "Enable edge tiling when dropping windows on screen edges"
msgstr ""
"Uključuje popločavanje ivice prilikom otpuštanja prozora na ivicama ekrana"
#: ../data/org.gnome.mutter.gschema.xml.in.h:6
#: data/org.gnome.mutter.gschema.xml.in:31
msgid ""
"If enabled, dropping windows on vertical screen edges maximizes them "
"vertically and resizes them horizontally to cover half of the available "
@@ -313,11 +72,11 @@ msgstr ""
"uspravno i menja im veličinu vodoravno da prekriju polovinu dostupne oblasti. "
"Otpuštanje prozora na gornjoj ivici ekrana uvećava ih u potpunosti."
#: ../data/org.gnome.mutter.gschema.xml.in.h:7
#: data/org.gnome.mutter.gschema.xml.in:40
msgid "Workspaces are managed dynamically"
msgstr "Radnim prostorima se upravlja dinamički"
#: ../data/org.gnome.mutter.gschema.xml.in.h:8
#: data/org.gnome.mutter.gschema.xml.in:41
msgid ""
"Determines whether workspaces are managed dynamically or whether there's a "
"static number of workspaces (determined by the num-workspaces key in org."
@@ -327,11 +86,11 @@ msgstr ""
"stalni broj radnih prostora (određen brojem radnih prostora u „org.gnome."
"desktop.wm.preferences“)."
#: ../data/org.gnome.mutter.gschema.xml.in.h:9
#: data/org.gnome.mutter.gschema.xml.in:50
msgid "Workspaces only on primary"
msgstr "Radni prostori samo na primarne"
#: ../data/org.gnome.mutter.gschema.xml.in.h:10
#: data/org.gnome.mutter.gschema.xml.in:51
msgid ""
"Determines whether workspace switching should happen for windows on all "
"monitors or only for windows on the primary monitor."
@@ -339,11 +98,11 @@ msgstr ""
"Određuje da li prebacivanje radnog prostora treba da se desi za prozore na "
"svim monitorima ili samo za prozore na glavnom monitoru."
#: ../data/org.gnome.mutter.gschema.xml.in.h:11
#: data/org.gnome.mutter.gschema.xml.in:59
msgid "No tab popup"
msgstr "Bez iskakanja jezička"
#: ../data/org.gnome.mutter.gschema.xml.in.h:12
#: data/org.gnome.mutter.gschema.xml.in:60
msgid ""
"Determines whether the use of popup and highlight frame should be disabled "
"for window cycling."
@@ -351,11 +110,11 @@ msgstr ""
"Određuje da li će upotreba okvira iskakanja i isticanja biti prikazana za "
"kretanje po prozorima."
#: ../data/org.gnome.mutter.gschema.xml.in.h:13
#: data/org.gnome.mutter.gschema.xml.in:68
msgid "Delay focus changes until the pointer stops moving"
msgstr "Zastoj prvog plana se menja dok se pokazivač ne zaustavi"
#: ../data/org.gnome.mutter.gschema.xml.in.h:14
#: data/org.gnome.mutter.gschema.xml.in:69
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 "
@@ -365,11 +124,11 @@ msgstr ""
"plan neće biti menjan odmah po ulasku u prozor, već samo nakon što pokazivač "
"prestane da se pomera."
#: ../data/org.gnome.mutter.gschema.xml.in.h:15
#: data/org.gnome.mutter.gschema.xml.in:79
msgid "Draggable border width"
msgstr "Širina ivice za prevlačenje"
#: ../data/org.gnome.mutter.gschema.xml.in.h:16
#: data/org.gnome.mutter.gschema.xml.in:80
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."
@@ -377,11 +136,11 @@ msgstr ""
"Iznos ukupne ivice za prevlačenje. Ako vidljive ivice teme nisu dovoljne, biće "
"dodate nevidljive ivice za dostizanje ove vrednosti."
#: ../data/org.gnome.mutter.gschema.xml.in.h:17
#: data/org.gnome.mutter.gschema.xml.in:89
msgid "Auto maximize nearly monitor sized windows"
msgstr "Sam uvećava povećane prozore najbližeg monitora"
#: ../data/org.gnome.mutter.gschema.xml.in.h:18
#: data/org.gnome.mutter.gschema.xml.in:90
msgid ""
"If enabled, new windows that are initially the size of the monitor "
"automatically get maximized."
@@ -389,11 +148,11 @@ msgstr ""
"Ako je uključeno, novi prozori koji su početno veličine monitora samostalno "
"bivaju uvećani."
#: ../data/org.gnome.mutter.gschema.xml.in.h:19
#: data/org.gnome.mutter.gschema.xml.in:98
msgid "Place new windows in the center"
msgstr "Novi prozor u središte"
#: ../data/org.gnome.mutter.gschema.xml.in.h:20
#: data/org.gnome.mutter.gschema.xml.in:99
msgid ""
"When true, the new windows will always be put in the center of the active "
"screen of the monitor."
@@ -401,85 +160,94 @@ msgstr ""
"Ako je izabrano, novi prozori će uvek biti postavljeni na sredinu radnog "
"ekrana monitora."
#: ../data/org.gnome.mutter.gschema.xml.in.h:21
#: data/org.gnome.mutter.gschema.xml.in:120
msgid "Select window from tab popup"
msgstr "Bira prozor iz jezička iskakanja"
#: ../data/org.gnome.mutter.gschema.xml.in.h:22
#: data/org.gnome.mutter.gschema.xml.in:125
msgid "Cancel tab popup"
msgstr "Otkazivanje jezička iskakanja"
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:1
#: data/org.gnome.mutter.wayland.gschema.xml.in:6
msgid "Switch to VT 1"
msgstr "Prelazak na VT 1"
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:2
#: data/org.gnome.mutter.wayland.gschema.xml.in:10
msgid "Switch to VT 2"
msgstr "Prelazak na VT 2"
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:3
#: data/org.gnome.mutter.wayland.gschema.xml.in:14
msgid "Switch to VT 3"
msgstr "Prelazak na VT 3"
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:4
#: data/org.gnome.mutter.wayland.gschema.xml.in:18
msgid "Switch to VT 4"
msgstr "Prelazak na VT 4"
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:5
#: data/org.gnome.mutter.wayland.gschema.xml.in:22
msgid "Switch to VT 5"
msgstr "Prelazak na VT 5"
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:6
#: data/org.gnome.mutter.wayland.gschema.xml.in:26
msgid "Switch to VT 6"
msgstr "Prelazak na VT 6"
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:7
#: data/org.gnome.mutter.wayland.gschema.xml.in:30
msgid "Switch to VT 7"
msgstr "Prelazak na VT 7"
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:8
#: data/org.gnome.mutter.wayland.gschema.xml.in:34
msgid "Switch to VT 8"
msgstr "Prelazak na VT 8"
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:9
#: data/org.gnome.mutter.wayland.gschema.xml.in:38
msgid "Switch to VT 9"
msgstr "Prelazak na VT 9"
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:10
#: data/org.gnome.mutter.wayland.gschema.xml.in:42
msgid "Switch to VT 10"
msgstr "Prelazak na VT 10"
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:11
#: data/org.gnome.mutter.wayland.gschema.xml.in:46
msgid "Switch to VT 11"
msgstr "Prelazak na VT 11"
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:12
#: data/org.gnome.mutter.wayland.gschema.xml.in:50
msgid "Switch to VT 12"
msgstr "Prelazak na VT 12"
#: ../src/backends/meta-monitor-manager.c:518
#: src/backends/meta-input-settings.c:1707
#| msgid "Switch system controls"
msgid "Switch monitor"
msgstr "Promeni monitor"
#: src/backends/meta-input-settings.c:1709
msgid "Show on-screen help"
msgstr "Prikaži pomoć na ekranu"
#: src/backends/meta-monitor-manager.c:514
msgid "Built-in display"
msgstr "Ugrađeni displej"
#: ../src/backends/meta-monitor-manager.c:544
#: src/backends/meta-monitor-manager.c:537
msgid "Unknown"
msgstr "Nepoznato"
#: ../src/backends/meta-monitor-manager.c:546
#: src/backends/meta-monitor-manager.c:539
msgid "Unknown Display"
msgstr "Nepoznat displej"
#. TRANSLATORS: this is a monitor vendor name, followed by a
#. * size in inches, like 'Dell 15"'
#.
#: ../src/backends/meta-monitor-manager.c:554
#: 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"
@@ -487,20 +255,20 @@ msgid ""
msgstr ""
"Neki drugi kompozitni upravnik je već pokrenut na prikazu %i erkana „%s“."
#: ../src/core/bell.c:185
#: src/core/bell.c:194
msgid "Bell event"
msgstr "Zvonca"
#: ../src/core/delete.c:127
#: src/core/delete.c:127
#, c-format
msgid "“%s” is not responding."
msgstr "„%s“ ne daje odziv."
#: ../src/core/delete.c:129
#: src/core/delete.c:129
msgid "Application is not responding."
msgstr "Program ne daje odziv."
#: ../src/core/delete.c:134
#: src/core/delete.c:134
msgid ""
"You may choose to wait a short while for it to continue or force the "
"application to quit entirely."
@@ -508,57 +276,56 @@ msgstr ""
"Možete malo sačekati dok se program ne sabere ili primorati program da "
"kompletno prekine sa radom."
#: ../src/core/delete.c:141
#: src/core/delete.c:141
msgid "_Wait"
msgstr "_Sačekaj"
#: ../src/core/delete.c:141
#: src/core/delete.c:141
msgid "_Force Quit"
msgstr "_Primoraj izlaz"
#: ../src/core/display.c:555
#: src/core/display.c:590
#, c-format
msgid "Failed to open X Window System display '%s'\n"
msgstr "Nisam uspeo da otvorim ekran „%s“ Iks sistema prozora\n"
#: ../src/core/main.c:181
#: src/core/main.c:182
msgid "Disable connection to session manager"
msgstr "Isključuje vezu sa upravnikom sesije"
#: ../src/core/main.c:187
#: src/core/main.c:188
msgid "Replace the running window manager"
msgstr "Menja tekućeg upravnika prozorima"
#: ../src/core/main.c:193
#: src/core/main.c:194
msgid "Specify session management ID"
msgstr "Navodi IB upravnika sesije"
#: ../src/core/main.c:198
#: src/core/main.c:199
msgid "X Display to use"
msgstr "Iks ekran koji će biti korišćen"
#: ../src/core/main.c:204
#: src/core/main.c:205
msgid "Initialize session from savefile"
msgstr "Pokreće sesiju iz datoteke čuvanja"
#: ../src/core/main.c:210
#: src/core/main.c:211
msgid "Make X calls synchronous"
msgstr "Čini Iks pozive usklađenim"
#: ../src/core/main.c:217
#: src/core/main.c:218
msgid "Run as a wayland compositor"
msgstr "Radi kao vajlandov sastavnik"
#: ../src/core/main.c:223
#| msgid "Run as a wayland compositor"
#: src/core/main.c:224
msgid "Run as a nested compositor"
msgstr "Radi kao ugneždeni sastavnik"
#: ../src/core/main.c:231
#: src/core/main.c:232
msgid "Run as a full display server, rather than nested"
msgstr "Radi kao puni server prikaza, umesto kao ugneždeni"
#: ../src/core/mutter.c:39
#: src/core/mutter.c:39
#, c-format
msgid ""
"mutter %s\n"
@@ -573,20 +340,20 @@ msgstr ""
"NE postoji nikakva garancija; čak ni garancija o TRŽIŠNOJ VREDNOSTI ili "
"PRILAGOĐENOSTI ODREĐENOJ NAMENI.\n"
#: ../src/core/mutter.c:53
#: src/core/mutter.c:53
msgid "Print version"
msgstr "Ispisuje izdanje"
#: ../src/core/mutter.c:59
#: src/core/mutter.c:59
msgid "Mutter plugin to use"
msgstr "Priključci Matera za korišćenje"
#: ../src/core/prefs.c:1997
#: src/core/prefs.c:1997
#, c-format
msgid "Workspace %d"
msgstr "%d. radni prostor"
#: ../src/core/screen.c:521
#: src/core/screen.c:521
#, c-format
msgid ""
"Display \"%s\" already has a window manager; try using the --replace option "
@@ -595,16 +362,21 @@ msgstr ""
"Prikaz „%s“ već ima upravnika prozora; probajte da koristite opciju „--"
"replace“ da zamenite trenutnog upravnika prozora."
#: ../src/core/screen.c:603
#: src/core/screen.c:606
#, c-format
msgid "Screen %d on display '%s' is invalid\n"
msgstr "Prikaz „%d“ na ekranu „%s“ nije ispravan\n"
#: ../src/core/util.c:121
#: src/core/util.c:120
msgid "Mutter was compiled without support for verbose mode\n"
msgstr "Mater je preveden bez podrške za opširan režim\n"
#: ../src/x11/session.c:1815
#: src/wayland/meta-wayland-tablet-pad.c:595
#, c-format
msgid "Mode Switch: Mode %d"
msgstr "Režim prekidača: Režim %d"
#: src/x11/session.c:1815
msgid ""
"These windows do not support &quot;save current setup&quot; and will have to "
"be restarted manually next time you log in."
@@ -612,11 +384,189 @@ msgstr ""
"Ovi prozori ne podržavaju mogućnost „sačuvaj trenutna podešavanja“ pa ćete "
"morati ručno da ih ponovo pokrenete kada se sledeći put prijavite."
#: ../src/x11/window-props.c:549
#: src/x11/window-props.c:548
#, c-format
msgid "%s (on %s)"
msgstr "%s (na %s)"
#~ msgid "Navigation"
#~ msgstr "Navigacija"
#~ msgid "Move window to workspace 1"
#~ msgstr "Premešta prozor na radni prostor broj 1"
#~ msgid "Move window to workspace 2"
#~ msgstr "Premešta prozor na radni prostor broj 2"
#~ msgid "Move window to workspace 3"
#~ msgstr "Premešta prozor na radni prostor broj 3"
#~ msgid "Move window to workspace 4"
#~ msgstr "Premešta prozor na radni prostor broj 4"
#~ msgid "Move window to last workspace"
#~ msgstr "Premešta prozor na poslednji radni prostor"
#~ msgid "Move window one workspace to the left"
#~ msgstr "Premešta prozor jedan radni prostor na levo"
#~ msgid "Move window one workspace to the right"
#~ msgstr "Premešta prozor jedan radni prostor na desno"
#~ msgid "Move window one workspace up"
#~ msgstr "Premešta prozor jedan radni prostor na gore"
#~ msgid "Move window one workspace down"
#~ msgstr "Premešta prozor jedan radni prostor na dole"
#~ msgid "Move window one monitor to the left"
#~ msgstr "Premešta prozor jedan monitor na levo"
#~ msgid "Move window one monitor to the right"
#~ msgstr "Premešta prozor jedan monitor na desno"
#~ msgid "Move window one monitor up"
#~ msgstr "Premešta prozor jedan monitor na gore"
#~ msgid "Move window one monitor down"
#~ msgstr "Premešta prozor jedan monitor na dole"
#~ msgid "Switch applications"
#~ msgstr "Prebacuje programe"
#~ msgid "Switch to previous application"
#~ msgstr "Prebacuje na prethodni program"
#~ msgid "Switch windows"
#~ msgstr "Prebacuje prozore"
#~ msgid "Switch to previous window"
#~ msgstr "Prebacuje na prethodni prozor"
#~ msgid "Switch windows of an application"
#~ msgstr "Prebacuje prozore programa"
#~ msgid "Switch to previous window of an application"
#~ msgstr "Prebacuje na prethodni prozor programa"
#~ msgid "Switch to previous system control"
#~ msgstr "Prebacuje na prethodnu kontrolu sistema"
#~ msgid "Switch windows directly"
#~ msgstr "Prebacuje prozore direktno"
#~ msgid "Switch directly to previous window"
#~ msgstr "Prebacuje neposredno na prethodni prozor"
#~ msgid "Switch windows of an app directly"
#~ msgstr "Prebacuje prozore programa direktno"
#~ msgid "Switch directly to previous window of an app"
#~ msgstr "Prebacuje neposredno na prethodni prozor programa"
#~ msgid "Switch system controls directly"
#~ msgstr "Prebacuje kontrole sistema direktno"
#~ msgid "Switch directly to previous system control"
#~ msgstr "Prebacuje neposredno na prethodnu kontrolu sistema"
#~ msgid "Hide all normal windows"
#~ msgstr "Skriva sve obične prozore"
#~ msgid "Switch to workspace 1"
#~ msgstr "Prebacuje se na radni prostor 1"
#~ msgid "Switch to workspace 2"
#~ msgstr "Prebacuje se na radni prostor 2"
#~ msgid "Switch to workspace 3"
#~ msgstr "Prebacuje se na radni prostor 3"
#~ msgid "Switch to workspace 4"
#~ msgstr "Prebacuje se na radni prostor 4"
#~ msgid "Switch to last workspace"
#~ msgstr "Prebacuje se na poslednji radni prostor"
#~ msgid "Move to workspace left"
#~ msgstr "Premešta na radni prostor levo"
#~ msgid "Move to workspace right"
#~ msgstr "Premešta na radni prostor desno"
#~ msgid "Move to workspace above"
#~ msgstr "Premešta na radni prostor iznad"
#~ msgid "Move to workspace below"
#~ msgstr "Premešta na radni prostor ispod"
#~ msgid "System"
#~ msgstr "Sistem"
#~ msgid "Show the run command prompt"
#~ msgstr "Prikazuje prompt za pokretanje naredbe"
#~ msgid "Show the activities overview"
#~ msgstr "Prikazuje pregled aktivnosti"
#~ msgid "Windows"
#~ msgstr "Prozori"
#~ msgid "Activate the window menu"
#~ msgstr "Aktivira meni prozora"
#~ msgid "Toggle fullscreen mode"
#~ msgstr "Isključuje/uključuje prikaz preko celog ekrana"
#~ msgid "Toggle maximization state"
#~ msgstr "Isključuje/uključuje stanje uvećanja"
#~ msgid "Maximize window"
#~ msgstr "Uvećava prozor"
#~ msgid "Restore window"
#~ msgstr "Vraća veličinu prozora"
#~ msgid "Toggle shaded state"
#~ msgstr "Isključuje/uključuje stanje zasenčenosti"
#~ msgid "Close window"
#~ msgstr "Zatvara prozor"
#~ msgid "Hide window"
#~ msgstr "Skriva prozor"
#~ msgid "Move window"
#~ msgstr "Premešta prozor"
#~ msgid "Resize window"
#~ msgstr "Menja veličinu prozora"
#~ msgid "Toggle window on all workspaces or one"
#~ msgstr "Prikazuje prozor na svim radnim prostorima ili samo na jednom"
#~ msgid "Raise window if covered, otherwise lower it"
#~ msgstr ""
#~ "Izdiže prozor ukoliko ga drugi prozor zaklanja, u protivnom ga spušta"
#~ msgid "Raise window above other windows"
#~ msgstr "Izdiže prozor iznad ostalih prozora"
#~ msgid "Lower window below other windows"
#~ msgstr "Spušta prozor ispod ostalih prozora"
#~ msgid "Maximize window vertically"
#~ msgstr "Uvećava prozor vertikalno"
#~ msgid "Maximize window horizontally"
#~ msgstr "Uvećava prozor horizontalno"
#~ msgid "View split on left"
#~ msgstr "Prikažite podelu na levo"
#~ msgid "View split on right"
#~ msgstr "Prikažite podelu na desno"
#~ msgid "Failed to scan themes directory: %s\n"
#~ msgstr "Nisam uspeo da pročitam direktorijum tema: %s\n"

View File

@@ -61,8 +61,8 @@ mutter_built_sources += \
gtk-shell-server-protocol.h \
gtk-primary-selection-protocol.c \
gtk-primary-selection-server-protocol.h \
xdg-shell-unstable-v5-protocol.c \
xdg-shell-unstable-v5-server-protocol.h \
xdg-shell-unstable-v6-protocol.c \
xdg-shell-unstable-v6-server-protocol.h \
relative-pointer-unstable-v1-protocol.c \
relative-pointer-unstable-v1-server-protocol.h \
pointer-constraints-unstable-v1-protocol.c \
@@ -347,6 +347,8 @@ libmutter_la_SOURCES += \
wayland/meta-wayland-xdg-shell.h \
wayland/meta-wayland-wl-shell.c \
wayland/meta-wayland-wl-shell.h \
wayland/meta-wayland-gtk-shell.c \
wayland/meta-wayland-gtk-shell.h \
$(NULL)
endif
@@ -574,10 +576,10 @@ $(shell echo $1 | sed 's/\([a-z\-]\+\)-[a-z]\+-v[0-9]\+/\1/')
endef
%-protocol.c : $(WAYLAND_PROTOCOLS_DATADIR)/$$(call protostability,$$*)/$$(call protoname,$$*)/$$*.xml
$(AM_V_GEN)$(WAYLAND_SCANNER) code < $< > $@
$(AM_V_GEN)$(WAYLAND_SCANNER) code $< $@
%-server-protocol.h : $(WAYLAND_PROTOCOLS_DATADIR)/$$(call protostability,$$*)/$$(call protoname,$$*)/$$*.xml
$(AM_V_GEN)$(WAYLAND_SCANNER) server-header < $< > $@
$(AM_V_GEN)$(WAYLAND_SCANNER) server-header $< $@
%-protocol.c : $(srcdir)/wayland/protocol/%.xml
$(AM_V_GEN)$(WAYLAND_SCANNER) code < $< > $@
$(AM_V_GEN)$(WAYLAND_SCANNER) code $< $@
%-server-protocol.h : $(srcdir)/wayland/protocol/%.xml
$(AM_V_GEN)$(WAYLAND_SCANNER) server-header < $< > $@
$(AM_V_GEN)$(WAYLAND_SCANNER) server-header $< $@

View File

@@ -137,18 +137,33 @@ static char *
make_output_name (drmModeConnector *connector)
{
static const char * const connector_type_names[] = {
"unknown", "VGA", "DVII", "DVID", "DVID", "Composite",
"SVIDEO", "LVDS", "Component", "9PinDIN", "DisplayPort",
"HDMIA", "HDMIB", "TV", "eDP", "Virtual", "DSI"
"None",
"VGA",
"DVI-I",
"DVI-D",
"DVI-A",
"Composite",
"SVIDEO",
"LVDS",
"Component",
"DIN",
"DP",
"HDMI",
"HDMI-B",
"TV",
"eDP",
"Virtual",
"DSI",
};
const char *connector_type_name;
if (connector->connector_type < G_N_ELEMENTS (connector_type_names))
connector_type_name = connector_type_names[connector->connector_type];
return g_strdup_printf ("%s-%d",
connector_type_names[connector->connector_type],
connector->connector_type_id);
else
connector_type_name = "unknown";
return g_strdup_printf ("%s%d", connector_type_name, connector->connector_id);
return g_strdup_printf ("Unknown%d-%d",
connector->connector_type,
connector->connector_type_id);
}
static void

View File

@@ -102,6 +102,7 @@ typedef enum
PRIORITY_SIZE_HINTS_LIMITS = 3,
PRIORITY_TITLEBAR_VISIBLE = 4,
PRIORITY_PARTIALLY_VISIBLE_ON_WORKAREA = 4,
PRIORITY_CUSTOM_RULE = 4,
PRIORITY_MAXIMUM = 4 /* Dummy value used for loop end = max(all priorities) */
} ConstraintPriority;
@@ -144,6 +145,10 @@ static gboolean do_screen_and_monitor_relative_constraints (MetaWindow *wind
GList *region_spanning_rectangles,
ConstraintInfo *info,
gboolean check_only);
static gboolean constrain_custom_rule (MetaWindow *window,
ConstraintInfo *info,
ConstraintPriority priority,
gboolean check_only);
static gboolean constrain_modal_dialog (MetaWindow *window,
ConstraintInfo *info,
ConstraintPriority priority,
@@ -211,6 +216,7 @@ typedef struct {
} Constraint;
static const Constraint all_constraints[] = {
{constrain_custom_rule, "constrain_custom_rule"},
{constrain_modal_dialog, "constrain_modal_dialog"},
{constrain_maximization, "constrain_maximization"},
{constrain_tiling, "constrain_tiling"},
@@ -641,6 +647,222 @@ get_size_limits (MetaWindow *window,
meta_window_client_rect_to_frame_rect (window, max_size, max_size);
}
static void
placement_rule_flip_horizontally (MetaPlacementRule *placement_rule)
{
if (placement_rule->anchor & META_PLACEMENT_ANCHOR_LEFT)
{
placement_rule->anchor &= ~META_PLACEMENT_ANCHOR_LEFT;
placement_rule->anchor |= META_PLACEMENT_ANCHOR_RIGHT;
}
else if (placement_rule->anchor & META_PLACEMENT_ANCHOR_RIGHT)
{
placement_rule->anchor &= ~META_PLACEMENT_ANCHOR_RIGHT;
placement_rule->anchor |= META_PLACEMENT_ANCHOR_LEFT;
}
if (placement_rule->gravity & META_PLACEMENT_GRAVITY_LEFT)
{
placement_rule->gravity &= ~META_PLACEMENT_GRAVITY_LEFT;
placement_rule->gravity |= META_PLACEMENT_GRAVITY_RIGHT;
}
else if (placement_rule->gravity & META_PLACEMENT_GRAVITY_RIGHT)
{
placement_rule->gravity &= ~META_PLACEMENT_GRAVITY_RIGHT;
placement_rule->gravity |= META_PLACEMENT_GRAVITY_LEFT;
}
}
static void
placement_rule_flip_vertically (MetaPlacementRule *placement_rule)
{
if (placement_rule->anchor & META_PLACEMENT_ANCHOR_TOP)
{
placement_rule->anchor &= ~META_PLACEMENT_ANCHOR_TOP;
placement_rule->anchor |= META_PLACEMENT_ANCHOR_BOTTOM;
}
else if (placement_rule->anchor & META_PLACEMENT_ANCHOR_BOTTOM)
{
placement_rule->anchor &= ~META_PLACEMENT_ANCHOR_BOTTOM;
placement_rule->anchor |= META_PLACEMENT_ANCHOR_TOP;
}
if (placement_rule->gravity & META_PLACEMENT_GRAVITY_TOP)
{
placement_rule->gravity &= ~META_PLACEMENT_GRAVITY_TOP;
placement_rule->gravity |= META_PLACEMENT_GRAVITY_BOTTOM;
}
else if (placement_rule->gravity & META_PLACEMENT_GRAVITY_BOTTOM)
{
placement_rule->gravity &= ~META_PLACEMENT_GRAVITY_BOTTOM;
placement_rule->gravity |= META_PLACEMENT_GRAVITY_TOP;
}
}
static void
try_flip_window_position (MetaWindow *window,
ConstraintInfo *info,
MetaPlacementRule *placement_rule,
MetaPlacementConstraintAdjustment constraint_adjustment,
MetaRectangle *rect,
MetaRectangle *intersection)
{
MetaPlacementRule flipped_rule = *placement_rule;;
MetaRectangle flipped_rect;
MetaRectangle flipped_intersection;
switch (constraint_adjustment)
{
case META_PLACEMENT_CONSTRAINT_ADJUSTMENT_FLIP_X:
placement_rule_flip_horizontally (&flipped_rule);
break;
case META_PLACEMENT_CONSTRAINT_ADJUSTMENT_FLIP_Y:
placement_rule_flip_vertically (&flipped_rule);
break;
default:
g_assert_not_reached ();
}
flipped_rect = info->current;
meta_window_process_placement (window, &flipped_rule,
&flipped_rect.x, &flipped_rect.y);
meta_rectangle_intersect (&flipped_rect, &info->work_area_monitor,
&flipped_intersection);
if ((constraint_adjustment == META_PLACEMENT_CONSTRAINT_ADJUSTMENT_FLIP_X &&
flipped_intersection.width == flipped_rect.width) ||
(constraint_adjustment == META_PLACEMENT_CONSTRAINT_ADJUSTMENT_FLIP_Y &&
flipped_intersection.height == flipped_rect.height))
{
*placement_rule = flipped_rule;
*rect = flipped_rect;
*intersection = flipped_intersection;
}
}
static gboolean
is_custom_rule_satisfied (ConstraintInfo *info,
MetaPlacementRule *placement_rule,
MetaRectangle *intersection)
{
uint32_t x_constrain_actions, y_constrain_actions;
x_constrain_actions = (META_PLACEMENT_CONSTRAINT_ADJUSTMENT_SLIDE_X |
META_PLACEMENT_CONSTRAINT_ADJUSTMENT_FLIP_X);
y_constrain_actions = (META_PLACEMENT_CONSTRAINT_ADJUSTMENT_SLIDE_Y |
META_PLACEMENT_CONSTRAINT_ADJUSTMENT_FLIP_Y);
if ((placement_rule->constraint_adjustment & x_constrain_actions &&
info->current.width != intersection->width) ||
(placement_rule->constraint_adjustment & y_constrain_actions &&
info->current.height != intersection->height))
return FALSE;
else
return TRUE;
}
static gboolean
constrain_custom_rule (MetaWindow *window,
ConstraintInfo *info,
ConstraintPriority priority,
gboolean check_only)
{
MetaPlacementRule *placement_rule;
MetaRectangle intersection;
gboolean constraint_satisfied;
MetaPlacementRule current_rule;
if (priority > PRIORITY_CUSTOM_RULE)
return TRUE;
placement_rule = meta_window_get_placement_rule (window);
if (!placement_rule)
return TRUE;
if (!meta_rectangle_could_fit_rect (&info->work_area_monitor,
&info->current))
return TRUE;
meta_rectangle_intersect (&info->current, &info->work_area_monitor,
&intersection);
constraint_satisfied = is_custom_rule_satisfied (info,
placement_rule,
&intersection);
if (constraint_satisfied || check_only)
return constraint_satisfied;
current_rule = *placement_rule;
if (info->current.width != intersection.width &&
(current_rule.constraint_adjustment &
META_PLACEMENT_CONSTRAINT_ADJUSTMENT_FLIP_X))
{
try_flip_window_position (window, info, &current_rule,
META_PLACEMENT_CONSTRAINT_ADJUSTMENT_FLIP_X,
&info->current, &intersection);
}
if (info->current.height != intersection.height &&
(current_rule.constraint_adjustment &
META_PLACEMENT_CONSTRAINT_ADJUSTMENT_FLIP_Y))
{
try_flip_window_position (window, info, &current_rule,
META_PLACEMENT_CONSTRAINT_ADJUSTMENT_FLIP_Y,
&info->current, &intersection);
}
meta_rectangle_intersect (&info->current, &info->work_area_monitor,
&intersection);
constraint_satisfied = is_custom_rule_satisfied (info,
placement_rule,
&intersection);
if (constraint_satisfied)
return TRUE;
if (current_rule.constraint_adjustment &
META_PLACEMENT_CONSTRAINT_ADJUSTMENT_SLIDE_X)
{
if (info->current.x != intersection.x)
info->current.x = intersection.x;
else if (info->current.width != intersection.width)
info->current.x -= info->current.width - intersection.width;
}
if (current_rule.constraint_adjustment &
META_PLACEMENT_CONSTRAINT_ADJUSTMENT_SLIDE_Y)
{
if (info->current.y != intersection.y)
info->current.y = intersection.y;
else if (info->current.height != intersection.height)
info->current.y -= info->current.height - intersection.height;
}
meta_rectangle_intersect (&info->current, &info->work_area_monitor,
&intersection);
constraint_satisfied = is_custom_rule_satisfied (info,
placement_rule,
&intersection);
if (constraint_satisfied)
return TRUE;
if (current_rule.constraint_adjustment &
META_PLACEMENT_CONSTRAINT_ADJUSTMENT_RESIZE_X)
{
info->current.x = intersection.x;
info->current.width = intersection.width;
}
if (current_rule.constraint_adjustment &
META_PLACEMENT_CONSTRAINT_ADJUSTMENT_RESIZE_Y)
{
info->current.y = intersection.y;
info->current.height = intersection.height;
}
return TRUE;
}
static gboolean
constrain_modal_dialog (MetaWindow *window,
ConstraintInfo *info,
@@ -652,7 +874,8 @@ constrain_modal_dialog (MetaWindow *window,
MetaRectangle child_rect, parent_rect;
gboolean constraint_already_satisfied;
if (!meta_window_is_attached_dialog (window))
if (!meta_window_is_attached_dialog (window) ||
meta_window_get_placement_rule (window))
return TRUE;
/* We want to center the dialog on the parent, including the decorations
@@ -1230,7 +1453,8 @@ constrain_to_single_monitor (MetaWindow *window,
window->screen->n_monitor_infos == 1 ||
!window->require_on_single_monitor ||
!window->frame ||
info->is_user_action)
info->is_user_action ||
meta_window_get_placement_rule (window))
return TRUE;
/* Have a helper function handle the constraint for us */
@@ -1257,7 +1481,8 @@ constrain_fully_onscreen (MetaWindow *window,
window->type == META_WINDOW_DOCK ||
window->fullscreen ||
!window->require_fully_onscreen ||
info->is_user_action)
info->is_user_action ||
meta_window_get_placement_rule (window))
return TRUE;
/* Have a helper function handle the constraint for us */
@@ -1296,7 +1521,8 @@ constrain_titlebar_visible (MetaWindow *window,
window->type == META_WINDOW_DOCK ||
window->fullscreen ||
!window->require_titlebar_visible ||
unconstrained_user_action)
unconstrained_user_action ||
meta_window_get_placement_rule (window))
return TRUE;
/* Determine how much offscreen things are allowed. We first need to
@@ -1373,7 +1599,8 @@ constrain_partially_onscreen (MetaWindow *window,
* "onscreen" by their own strut).
*/
if (window->type == META_WINDOW_DESKTOP ||
window->type == META_WINDOW_DOCK)
window->type == META_WINDOW_DOCK ||
meta_window_get_placement_rule (window))
return TRUE;
/* Determine how much offscreen things are allowed. We first need to

View File

@@ -47,6 +47,18 @@
(e)->type == CLUTTER_TOUCH_END || \
(e)->type == CLUTTER_TOUCH_CANCEL)
#define IS_KEY_EVENT(e) ((e)->type == CLUTTER_KEY_PRESS || \
(e)->type == CLUTTER_KEY_RELEASE)
static gboolean
stage_has_key_focus (void)
{
MetaBackend *backend = meta_get_backend ();
ClutterActor *stage = meta_backend_get_stage (backend);
return clutter_stage_get_key_focus (CLUTTER_STAGE (stage)) == stage;
}
static MetaWindow *
get_window_for_event (MetaDisplay *display,
const ClutterEvent *event)
@@ -58,14 +70,8 @@ get_window_for_event (MetaDisplay *display,
ClutterActor *source;
/* Always use the key focused window for key events. */
switch (event->type)
{
case CLUTTER_KEY_PRESS:
case CLUTTER_KEY_RELEASE:
return display->focus_window;
default:
break;
}
if (IS_KEY_EVENT (event))
return stage_has_key_focus () ? display->focus_window : NULL;
source = clutter_event_get_source (event);
if (META_IS_SURFACE_ACTOR (source))
@@ -299,6 +305,18 @@ meta_display_handle_event (MetaDisplay *display,
goto out;
}
/* Do not pass keyboard events to Wayland if key focus is not on the
* stage in normal mode (e.g. during keynav in the panel)
*/
if (display->event_route == META_EVENT_ROUTE_NORMAL)
{
if (IS_KEY_EVENT (event) && !stage_has_key_focus ())
{
bypass_wayland = TRUE;
goto out;
}
}
if (display->current_pad_osd)
{
bypass_wayland = TRUE;

View File

@@ -598,6 +598,61 @@ find_first_fit (MetaWindow *window,
return retval;
}
void
meta_window_process_placement (MetaWindow *window,
MetaPlacementRule *placement_rule,
int *x,
int *y)
{
MetaWindow *parent = meta_window_get_transient_for (window);
MetaRectangle parent_rect;
MetaRectangle anchor_rect;
int window_width, window_height;
window_width = placement_rule->width;
window_height = placement_rule->height;
meta_window_get_frame_rect (parent, &parent_rect);
anchor_rect = (MetaRectangle) {
.x = parent_rect.x + placement_rule->anchor_rect.x,
.y = parent_rect.y + placement_rule->anchor_rect.y,
.width = placement_rule->anchor_rect.width,
.height = placement_rule->anchor_rect.height,
};
/* Place at anchor point. */
if (placement_rule->anchor & META_PLACEMENT_ANCHOR_LEFT)
*x = anchor_rect.x;
else if (placement_rule->anchor & META_PLACEMENT_ANCHOR_RIGHT)
*x = anchor_rect.x + anchor_rect.width;
else
*x = anchor_rect.x + (anchor_rect.width / 2);
if (placement_rule->anchor & META_PLACEMENT_ANCHOR_TOP)
*y = anchor_rect.y;
else if (placement_rule->anchor & META_PLACEMENT_ANCHOR_BOTTOM)
*y = anchor_rect.y + anchor_rect.height;
else
*y = anchor_rect.y + (anchor_rect.height / 2);
/* Shift according to gravity. */
if (placement_rule->gravity & META_PLACEMENT_GRAVITY_LEFT)
*x -= window_width;
else if (placement_rule->gravity & META_PLACEMENT_GRAVITY_RIGHT)
*x = *x;
else
*x -= window_width / 2;
if (placement_rule->gravity & META_PLACEMENT_GRAVITY_TOP)
*y -= window_height;
else if (placement_rule->gravity & META_PLACEMENT_GRAVITY_BOTTOM)
*y = *y;
else
*y -= window_height / 2;
/* Offset according to offset. */
*x += placement_rule->offset_x;
*y += placement_rule->offset_y;
}
void
meta_window_place (MetaWindow *window,
int x,
@@ -610,6 +665,16 @@ meta_window_place (MetaWindow *window,
meta_topic (META_DEBUG_PLACEMENT, "Placing window %s\n", window->desc);
/* If the window has a custom placement rule, always run only that. */
if (window->placement_rule)
{
meta_window_process_placement (window,
window->placement_rule,
&x, &y);
goto done;
}
switch (window->type)
{
/* Run placement algorithm on these. */

View File

@@ -25,6 +25,11 @@
#include "window-private.h"
#include "frame.h"
void meta_window_process_placement (MetaWindow *window,
MetaPlacementRule *placement_rule,
int *x,
int *y);
void meta_window_place (MetaWindow *window,
int x,
int y,

View File

@@ -88,6 +88,47 @@ typedef enum
META_MOVE_RESIZE_RESULT_FRAME_SHAPE_CHANGED = 1 << 2,
} MetaMoveResizeResultFlags;
typedef enum
{
META_PLACEMENT_GRAVITY_NONE = 0,
META_PLACEMENT_GRAVITY_TOP = 1 << 0,
META_PLACEMENT_GRAVITY_BOTTOM = 1 << 1,
META_PLACEMENT_GRAVITY_LEFT = 1 << 2,
META_PLACEMENT_GRAVITY_RIGHT = 1 << 3,
} MetaPlacementGravity;
typedef enum
{
META_PLACEMENT_ANCHOR_NONE = 0,
META_PLACEMENT_ANCHOR_TOP = 1 << 0,
META_PLACEMENT_ANCHOR_BOTTOM = 1 << 1,
META_PLACEMENT_ANCHOR_LEFT = 1 << 2,
META_PLACEMENT_ANCHOR_RIGHT = 1 << 3,
} MetaPlacementAnchor;
typedef enum
{
META_PLACEMENT_CONSTRAINT_ADJUSTMENT_NONE = 0,
META_PLACEMENT_CONSTRAINT_ADJUSTMENT_SLIDE_X = 1 << 0,
META_PLACEMENT_CONSTRAINT_ADJUSTMENT_SLIDE_Y = 1 << 1,
META_PLACEMENT_CONSTRAINT_ADJUSTMENT_FLIP_X = 1 << 2,
META_PLACEMENT_CONSTRAINT_ADJUSTMENT_FLIP_Y = 1 << 3,
META_PLACEMENT_CONSTRAINT_ADJUSTMENT_RESIZE_X = 1 << 4,
META_PLACEMENT_CONSTRAINT_ADJUSTMENT_RESIZE_Y = 1 << 5,
} MetaPlacementConstraintAdjustment;
typedef struct _MetaPlacementRule
{
MetaRectangle anchor_rect;
MetaPlacementGravity gravity;
MetaPlacementAnchor anchor;
MetaPlacementConstraintAdjustment constraint_adjustment;
int offset_x;
int offset_y;
int width;
int height;
} MetaPlacementRule;
struct _MetaWindow
{
GObject parent_instance;
@@ -448,6 +489,8 @@ struct _MetaWindow
/* Bypass compositor hints */
guint bypass_compositor;
MetaPlacementRule *placement_rule;
};
struct _MetaWindowClass
@@ -697,4 +740,8 @@ gboolean meta_window_has_pointer (MetaWindow *window);
void meta_window_emit_size_changed (MetaWindow *window);
MetaPlacementRule *meta_window_get_placement_rule (MetaWindow *window);
void meta_window_force_placement (MetaWindow *window);
#endif

View File

@@ -84,8 +84,6 @@ static void set_net_wm_state (MetaWindow *window);
static void meta_window_set_above (MetaWindow *window,
gboolean new_value);
static void meta_window_force_placement (MetaWindow *window);
static void meta_window_show (MetaWindow *window);
static void meta_window_hide (MetaWindow *window);
@@ -296,6 +294,7 @@ meta_window_finalize (GObject *object)
g_free (window->gtk_window_object_path);
g_free (window->gtk_app_menu_object_path);
g_free (window->gtk_menubar_object_path);
g_free (window->placement_rule);
G_OBJECT_CLASS (meta_window_parent_class)->finalize (object);
}
@@ -2168,7 +2167,7 @@ window_would_be_covered (const MetaWindow *newbie)
return FALSE; /* none found */
}
static void
void
meta_window_force_placement (MetaWindow *window)
{
if (window->placed)
@@ -4301,6 +4300,13 @@ meta_window_focus (MetaWindow *window,
META_WINDOW_GET_CLASS (window)->focus (window, timestamp);
if (window->display->event_route == META_EVENT_ROUTE_NORMAL)
{
MetaBackend *backend = meta_get_backend ();
ClutterStage *stage = CLUTTER_STAGE (meta_backend_get_stage (backend));
clutter_stage_set_key_focus (stage, NULL);
}
if (window->wm_state_demands_attention)
meta_window_unset_demands_attention(window);
@@ -7416,23 +7422,26 @@ meta_window_set_transient_for (MetaWindow *window,
/* may now be a dialog */
if (window->client_type == META_WINDOW_CLIENT_TYPE_X11)
meta_window_x11_recalc_window_type (window);
if (!window->constructing)
{
/* If the window attaches, detaches, or changes attached
* parents, we need to destroy the MetaWindow and let a new one
* be created (which happens as a side effect of
* meta_window_unmanage()). The condition below is correct
* because we know window->transient_for has changed.
*/
if (window->attached || meta_window_should_attach_to_parent (window))
{
guint32 timestamp;
meta_window_x11_recalc_window_type (window);
timestamp = meta_display_get_current_time_roundtrip (window->display);
meta_window_unmanage (window, timestamp);
return;
if (!window->constructing)
{
/* If the window attaches, detaches, or changes attached
* parents, we need to destroy the MetaWindow and let a new one
* be created (which happens as a side effect of
* meta_window_unmanage()). The condition below is correct
* because we know window->transient_for has changed.
*/
if (window->attached || meta_window_should_attach_to_parent (window))
{
guint32 timestamp;
timestamp =
meta_display_get_current_time_roundtrip (window->display);
meta_window_unmanage (window, timestamp);
return;
}
}
}
@@ -7925,3 +7934,9 @@ meta_window_emit_size_changed (MetaWindow *window)
{
g_signal_emit (window, window_signals[SIZE_CHANGED], 0);
}
MetaPlacementRule *
meta_window_get_placement_rule (MetaWindow *window)
{
return window->placement_rule;
}

View File

@@ -106,8 +106,10 @@ meta_wayland_buffer_ensure_texture (MetaWaylandBuffer *buffer)
if (!texture)
{
meta_warning ("Could not import pending buffer, ignoring commit: %s\n",
catch_error->message);
cogl_error_free (catch_error);
meta_fatal ("Could not import pending buffer, ignoring commit\n");
goto out;
}
buffer->texture = texture;

View File

@@ -1174,7 +1174,8 @@ data_device_start_drag (struct wl_client *client,
if (icon_resource &&
!meta_wayland_surface_assign_role (icon_surface,
META_TYPE_WAYLAND_SURFACE_ROLE_DND))
META_TYPE_WAYLAND_SURFACE_ROLE_DND,
NULL))
{
wl_resource_post_error (resource, WL_DATA_DEVICE_ERROR_ROLE,
"wl_surface@%d already has a different role",

View File

@@ -0,0 +1,289 @@
/*
* Wayland Support
*
* Copyright (C) 2012,2013 Intel Corporation
* 2013-2016 Red Hat, Inc.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
* 02111-1307, USA.
*/
#include "config.h"
#include "wayland/meta-wayland-gtk-shell.h"
#include "core/bell.h"
#include "core/window-private.h"
#include "wayland/meta-wayland-private.h"
#include "wayland/meta-wayland-surface.h"
#include "wayland/meta-wayland-versions.h"
#include "wayland/meta-window-wayland.h"
#include "gtk-shell-server-protocol.h"
static GQuark quark_gtk_surface_data = 0;
typedef struct _MetaWaylandGtkSurface
{
struct wl_resource *resource;
MetaWaylandSurface *surface;
gboolean is_modal;
gulong configure_handler_id;
} MetaWaylandGtkSurface;
static void
gtk_surface_destructor (struct wl_resource *resource)
{
MetaWaylandGtkSurface *gtk_surface = wl_resource_get_user_data (resource);
if (gtk_surface->surface)
{
g_object_steal_qdata (G_OBJECT (gtk_surface->surface),
quark_gtk_surface_data);
g_signal_handler_disconnect (gtk_surface->surface,
gtk_surface->configure_handler_id);
}
g_free (gtk_surface);
}
static void
gtk_surface_set_dbus_properties (struct wl_client *client,
struct wl_resource *resource,
const char *application_id,
const char *app_menu_path,
const char *menubar_path,
const char *window_object_path,
const char *application_object_path,
const char *unique_bus_name)
{
MetaWaylandGtkSurface *gtk_surface = wl_resource_get_user_data (resource);
MetaWaylandSurface *surface = gtk_surface->surface;
/* Broken client, let it die instead of us */
if (!surface->window)
{
meta_warning ("meta-wayland-surface: set_dbus_properties called with invalid window!\n");
return;
}
meta_window_set_gtk_dbus_properties (surface->window,
application_id,
unique_bus_name,
app_menu_path,
menubar_path,
application_object_path,
window_object_path);
}
static void
gtk_surface_set_modal (struct wl_client *client,
struct wl_resource *resource)
{
MetaWaylandGtkSurface *gtk_surface = wl_resource_get_user_data (resource);
MetaWaylandSurface *surface = gtk_surface->surface;
if (gtk_surface->is_modal)
return;
gtk_surface->is_modal = TRUE;
meta_window_set_type (surface->window, META_WINDOW_MODAL_DIALOG);
}
static void
gtk_surface_unset_modal (struct wl_client *client,
struct wl_resource *resource)
{
MetaWaylandGtkSurface *gtk_surface = wl_resource_get_user_data (resource);
MetaWaylandSurface *surface = gtk_surface->surface;
if (!gtk_surface->is_modal)
return;
gtk_surface->is_modal = FALSE;
meta_window_set_type (surface->window, META_WINDOW_NORMAL);
}
static void
gtk_surface_present (struct wl_client *client,
struct wl_resource *resource,
uint32_t timestamp)
{
MetaWaylandGtkSurface *gtk_surface = wl_resource_get_user_data (resource);
MetaWaylandSurface *surface = gtk_surface->surface;
MetaWindow *window = surface->window;
if (!window)
return;
meta_window_activate_full (window, timestamp,
META_CLIENT_TYPE_APPLICATION, NULL);
}
static const struct gtk_surface1_interface meta_wayland_gtk_surface_interface = {
gtk_surface_set_dbus_properties,
gtk_surface_set_modal,
gtk_surface_unset_modal,
gtk_surface_present,
};
static void
gtk_surface_surface_destroyed (MetaWaylandGtkSurface *gtk_surface)
{
wl_resource_set_implementation (gtk_surface->resource,
NULL, NULL, NULL);
gtk_surface->surface = NULL;
}
static void
fill_states (struct wl_array *states,
MetaWindow *window)
{
uint32_t *s;
if (window->tile_mode == META_TILE_LEFT ||
window->tile_mode == META_TILE_RIGHT)
{
s = wl_array_add (states, sizeof *s);
*s = GTK_SURFACE1_STATE_TILED;
}
}
static void
on_configure (MetaWaylandSurface *surface,
MetaWaylandGtkSurface *gtk_surface)
{
struct wl_array states;
wl_array_init (&states);
fill_states (&states, surface->window);
gtk_surface1_send_configure (gtk_surface->resource, &states);
wl_array_release (&states);
}
static void
gtk_shell_get_gtk_surface (struct wl_client *client,
struct wl_resource *resource,
guint32 id,
struct wl_resource *surface_resource)
{
MetaWaylandSurface *surface = wl_resource_get_user_data (surface_resource);
MetaWaylandGtkSurface *gtk_surface;
gtk_surface = g_object_get_qdata (G_OBJECT (surface), quark_gtk_surface_data);
if (gtk_surface)
{
wl_resource_post_error (surface_resource,
WL_DISPLAY_ERROR_INVALID_OBJECT,
"gtk_shell::get_gtk_surface already requested");
return;
}
gtk_surface = g_new0 (MetaWaylandGtkSurface, 1);
gtk_surface->surface = surface;
gtk_surface->resource = wl_resource_create (client,
&gtk_surface1_interface,
wl_resource_get_version (resource),
id);
wl_resource_set_implementation (gtk_surface->resource,
&meta_wayland_gtk_surface_interface,
gtk_surface, gtk_surface_destructor);
gtk_surface->configure_handler_id = g_signal_connect (surface,
"configure",
G_CALLBACK (on_configure),
gtk_surface);
g_object_set_qdata_full (G_OBJECT (surface),
quark_gtk_surface_data,
gtk_surface,
(GDestroyNotify) gtk_surface_surface_destroyed);
}
static void
gtk_shell_set_startup_id (struct wl_client *client,
struct wl_resource *resource,
const char *startup_id)
{
MetaDisplay *display;
display = meta_get_display ();
meta_startup_notification_remove_sequence (display->startup_notification,
startup_id);
}
static void
gtk_shell_system_bell (struct wl_client *client,
struct wl_resource *resource,
struct wl_resource *gtk_surface_resource)
{
MetaDisplay *display = meta_get_display ();
if (gtk_surface_resource)
{
MetaWaylandGtkSurface *gtk_surface =
wl_resource_get_user_data (gtk_surface_resource);
MetaWaylandSurface *surface = gtk_surface->surface;
if (!surface->window)
return;
meta_bell_notify (display, surface->window);
}
else
{
meta_bell_notify (display, NULL);
}
}
static const struct gtk_shell1_interface meta_wayland_gtk_shell_interface = {
gtk_shell_get_gtk_surface,
gtk_shell_set_startup_id,
gtk_shell_system_bell,
};
static void
bind_gtk_shell (struct wl_client *client,
void *data,
guint32 version,
guint32 id)
{
struct wl_resource *resource;
uint32_t capabilities = 0;
resource = wl_resource_create (client, &gtk_shell1_interface, version, id);
wl_resource_set_implementation (resource, &meta_wayland_gtk_shell_interface,
data, NULL);
if (!meta_prefs_get_show_fallback_app_menu ())
capabilities = GTK_SHELL1_CAPABILITY_GLOBAL_APP_MENU;
gtk_shell1_send_capabilities (resource, capabilities);
}
void
meta_wayland_gtk_shell_init (MetaWaylandCompositor *compositor)
{
quark_gtk_surface_data =
g_quark_from_static_string ("-meta-wayland-gtk-shell-surface-data");
if (wl_global_create (compositor->wayland_display,
&gtk_shell1_interface,
META_GTK_SHELL1_VERSION,
compositor, bind_gtk_shell) == NULL)
g_error ("Failed to register a global gtk-shell object");
}

View File

@@ -0,0 +1,27 @@
/*
* Copyright (C) 2016 Red Hat, Inc.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
* 02111-1307, USA.
*/
#ifndef META_WAYLAND_GTK_SHELL_H
#define META_WAYLAND_GTK_SHELL_H
#include "wayland/meta-wayland.h"
void meta_wayland_gtk_shell_init (MetaWaylandCompositor *compositor);
#endif /* META_WAYLAND_GTK_SHELL_H */

View File

@@ -1005,7 +1005,8 @@ pointer_set_cursor (struct wl_client *client,
if (surface &&
!meta_wayland_surface_assign_role (surface,
META_TYPE_WAYLAND_SURFACE_ROLE_CURSOR))
META_TYPE_WAYLAND_SURFACE_ROLE_CURSOR,
NULL))
{
wl_resource_post_error (resource, WL_POINTER_ERROR_ROLE,
"wl_surface@%d already has a different role",

View File

@@ -242,7 +242,20 @@ meta_wayland_popup_dismiss (MetaWaylandPopup *popup)
meta_wayland_popup_destroy (popup);
if (wl_list_empty (&popup_grab->all_popups))
meta_wayland_pointer_end_popup_grab (popup_grab->generic.pointer);
{
meta_wayland_pointer_end_popup_grab (popup_grab->generic.pointer);
}
else
{
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);
}
}
MetaWaylandSurface *
@@ -258,6 +271,8 @@ meta_wayland_popup_create (MetaWaylandPopupSurface *popup_surface,
MetaWaylandSurface *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))
@@ -269,5 +284,9 @@ 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);
return popup;
}

View File

@@ -29,8 +29,8 @@
#include <clutter/wayland/clutter-wayland-surface.h>
#include <cogl/cogl-wayland-server.h>
#include <gobject/gvaluecollector.h>
#include <wayland-server.h>
#include "gtk-shell-server-protocol.h"
#include "meta-wayland-private.h"
#include "meta-xwayland-private.h"
@@ -43,12 +43,12 @@
#include "meta-wayland-outputs.h"
#include "meta-wayland-xdg-shell.h"
#include "meta-wayland-wl-shell.h"
#include "meta-wayland-gtk-shell.h"
#include "meta-cursor-tracker-private.h"
#include "display-private.h"
#include "window-private.h"
#include "meta-window-wayland.h"
#include "bell.h"
#include "compositor/region-utils.h"
@@ -62,6 +62,13 @@ enum {
PENDING_STATE_SIGNAL_LAST_SIGNAL
};
enum
{
SURFACE_ROLE_PROP_0,
SURFACE_ROLE_PROP_SURFACE,
};
static guint pending_state_signals[PENDING_STATE_SIGNAL_LAST_SIGNAL];
typedef struct _MetaWaylandSurfaceRolePrivate
@@ -102,7 +109,7 @@ G_DEFINE_TYPE (MetaWaylandPendingState,
struct _MetaWaylandSurfaceRoleSubsurface
{
MetaWaylandSurfaceRole parent;
MetaWaylandSurfaceRoleActorSurface parent;
};
G_DEFINE_TYPE (MetaWaylandSurfaceRoleSubsurface,
@@ -121,6 +128,7 @@ G_DEFINE_TYPE (MetaWaylandSurfaceRoleDND,
enum {
SURFACE_DESTROY,
SURFACE_UNMAPPED,
SURFACE_CONFIGURE,
N_SURFACE_SIGNALS
};
@@ -146,6 +154,8 @@ meta_wayland_surface_role_get_toplevel (MetaWaylandSurfaceRole *surface_role);
static void
meta_wayland_surface_role_shell_surface_configure (MetaWaylandSurfaceRoleShellSurface *shell_surface_role,
int new_x,
int new_y,
int new_width,
int new_height,
MetaWaylandSerial *sent_serial);
@@ -161,18 +171,92 @@ static void
meta_wayland_surface_role_shell_surface_managed (MetaWaylandSurfaceRoleShellSurface *shell_surface_role,
MetaWindow *window);
static void
unset_param_value (GParameter *param)
{
g_value_unset (&param->value);
}
static GArray *
role_assignment_valist_to_params (GType role_type,
const char *first_property_name,
va_list var_args)
{
GObjectClass *object_class;
const char *property_name = first_property_name;
GArray *params;
object_class = g_type_class_ref (role_type);
params = g_array_new (FALSE, FALSE, sizeof (GParameter));
g_array_set_clear_func (params, (GDestroyNotify) unset_param_value);
while (property_name)
{
GParameter param = {
.name = property_name,
.value = G_VALUE_INIT
};
GParamSpec *pspec;
GType ptype;
gchar *error = NULL;
pspec = g_object_class_find_property (object_class,
property_name);
g_assert (pspec);
ptype = G_PARAM_SPEC_VALUE_TYPE (pspec);
G_VALUE_COLLECT_INIT (&param.value, ptype, var_args, 0, &error);
g_assert (!error);
g_array_append_val (params, param);
property_name = va_arg (var_args, const char *);
}
g_type_class_unref (object_class);
return params;
}
gboolean
meta_wayland_surface_assign_role (MetaWaylandSurface *surface,
GType role_type)
GType role_type,
const char *first_property_name,
...)
{
va_list var_args;
if (!surface->role)
{
MetaWaylandSurfaceRolePrivate *role_priv;
if (first_property_name)
{
GArray *params;
GParameter param;
surface->role = g_object_new (role_type, NULL);
role_priv =
meta_wayland_surface_role_get_instance_private (surface->role);
role_priv->surface = surface;
va_start (var_args, first_property_name);
params = role_assignment_valist_to_params (role_type,
first_property_name,
var_args);
va_end (var_args);
param = (GParameter) {
.name = "surface",
.value = G_VALUE_INIT
};
g_value_init (&param.value, META_TYPE_WAYLAND_SURFACE);
g_value_set_object (&param.value, surface);
g_array_append_val (params, param);
surface->role = g_object_newv (role_type, params->len,
(GParameter *) params->data);
g_array_unref (params);
}
else
{
surface->role = g_object_new (role_type, "surface", surface, NULL);
}
meta_wayland_surface_role_assigned (surface->role);
@@ -191,6 +275,13 @@ meta_wayland_surface_assign_role (MetaWaylandSurface *surface,
}
else
{
va_start (var_args, first_property_name);
g_object_set_valist (G_OBJECT (surface->role),
first_property_name, var_args);
va_end (var_args);
meta_wayland_surface_role_assigned (surface->role);
return TRUE;
}
}
@@ -362,22 +453,6 @@ queue_surface_actor_frame_callbacks (MetaWaylandSurface *surface,
wl_list_init (&pending->frame_callback_list);
}
void
meta_wayland_surface_apply_window_state (MetaWaylandSurface *surface,
MetaWaylandPendingState *pending)
{
MetaSurfaceActorWayland *actor =
META_SURFACE_ACTOR_WAYLAND (surface->surface_actor);
MetaWindow *window = surface->window;
MetaWaylandBuffer *buffer = surface->buffer_ref.buffer;
CoglTexture *texture = buffer->texture;
double scale;
scale = meta_surface_actor_wayland_get_scale (actor);
window->buffer_rect.width = cogl_texture_get_width (texture) * scale;
window->buffer_rect.height = cogl_texture_get_height (texture) * scale;
}
static void
pending_buffer_resource_destroyed (MetaWaylandBuffer *buffer,
MetaWaylandPendingState *pending)
@@ -499,12 +574,15 @@ static void
subsurface_role_commit (MetaWaylandSurfaceRole *surface_role,
MetaWaylandPendingState *pending)
{
MetaWaylandSurfaceRoleClass *surface_role_class;
MetaWaylandSurface *surface =
meta_wayland_surface_role_get_surface (surface_role);
MetaSurfaceActorWayland *surface_actor =
META_SURFACE_ACTOR_WAYLAND (surface->surface_actor);
queue_surface_actor_frame_callbacks (surface, pending);
surface_role_class =
META_WAYLAND_SURFACE_ROLE_CLASS (meta_wayland_surface_role_subsurface_parent_class);
surface_role_class->commit (surface_role, pending);
if (surface->buffer_ref.buffer != NULL)
clutter_actor_show (CLUTTER_ACTOR (surface_actor));
@@ -519,7 +597,10 @@ subsurface_role_get_toplevel (MetaWaylandSurfaceRole *surface_role)
meta_wayland_surface_role_get_surface (surface_role);
MetaWaylandSurface *parent = surface->sub.parent;
return meta_wayland_surface_role_get_toplevel (parent->role);
if (parent->role)
return meta_wayland_surface_role_get_toplevel (parent->role);
else
return NULL;
}
/* A non-subsurface is always desynchronized.
@@ -654,6 +735,14 @@ apply_pending_state (MetaWaylandSurface *surface,
CoglTexture *texture;
texture = meta_wayland_buffer_ensure_texture (pending->buffer);
if (!texture)
{
wl_resource_post_error (surface->resource, WL_DISPLAY_ERROR_NO_MEMORY,
"Failed to create a texture for surface %i",
wl_resource_get_id (surface->resource));
goto cleanup;
}
meta_surface_actor_wayland_set_texture (surface_actor_wayland,
texture);
}
@@ -723,6 +812,7 @@ apply_pending_state (MetaWaylandSurface *surface,
}
}
cleanup:
/* If we have a buffer that we are not using, decrease the use count so it may
* be released if no-one else has a use-reference to it.
*/
@@ -1158,8 +1248,6 @@ wl_surface_destructor (struct wl_resource *resource)
if (surface->wl_subsurface)
wl_resource_destroy (surface->wl_subsurface);
if (surface->gtk_surface)
wl_resource_destroy (surface->gtk_surface);
g_object_unref (surface);
@@ -1231,172 +1319,6 @@ meta_wayland_surface_begin_grab_op (MetaWaylandSurface *surface,
x, y);
}
static void
gtk_surface_destructor (struct wl_resource *resource)
{
MetaWaylandSurface *surface = wl_resource_get_user_data (resource);
surface->gtk_surface = NULL;
}
static void
gtk_surface_set_dbus_properties (struct wl_client *client,
struct wl_resource *resource,
const char *application_id,
const char *app_menu_path,
const char *menubar_path,
const char *window_object_path,
const char *application_object_path,
const char *unique_bus_name)
{
MetaWaylandSurface *surface = wl_resource_get_user_data (resource);
/* Broken client, let it die instead of us */
if (!surface->window)
{
meta_warning ("meta-wayland-surface: set_dbus_properties called with invalid window!\n");
return;
}
meta_window_set_gtk_dbus_properties (surface->window,
application_id,
unique_bus_name,
app_menu_path,
menubar_path,
application_object_path,
window_object_path);
}
static void
gtk_surface_set_modal (struct wl_client *client,
struct wl_resource *resource)
{
MetaWaylandSurface *surface = wl_resource_get_user_data (resource);
if (surface->is_modal)
return;
surface->is_modal = TRUE;
meta_window_set_type (surface->window, META_WINDOW_MODAL_DIALOG);
}
static void
gtk_surface_unset_modal (struct wl_client *client,
struct wl_resource *resource)
{
MetaWaylandSurface *surface = wl_resource_get_user_data (resource);
if (!surface->is_modal)
return;
surface->is_modal = FALSE;
meta_window_set_type (surface->window, META_WINDOW_NORMAL);
}
static void
gtk_surface_present (struct wl_client *client,
struct wl_resource *resource,
uint32_t timestamp)
{
MetaWaylandSurface *surface = wl_resource_get_user_data (resource);
MetaWindow *window = surface->window;
if (!window)
return;
meta_window_activate_full (window, timestamp,
META_CLIENT_TYPE_APPLICATION, NULL);
}
static const struct gtk_surface1_interface meta_wayland_gtk_surface_interface = {
gtk_surface_set_dbus_properties,
gtk_surface_set_modal,
gtk_surface_unset_modal,
gtk_surface_present,
};
static void
gtk_shell_get_gtk_surface (struct wl_client *client,
struct wl_resource *resource,
guint32 id,
struct wl_resource *surface_resource)
{
MetaWaylandSurface *surface = wl_resource_get_user_data (surface_resource);
if (surface->gtk_surface != NULL)
{
wl_resource_post_error (surface_resource,
WL_DISPLAY_ERROR_INVALID_OBJECT,
"gtk_shell::get_gtk_surface already requested");
return;
}
surface->gtk_surface = wl_resource_create (client,
&gtk_surface1_interface,
wl_resource_get_version (resource),
id);
wl_resource_set_implementation (surface->gtk_surface, &meta_wayland_gtk_surface_interface, surface, gtk_surface_destructor);
}
static void
gtk_shell_set_startup_id (struct wl_client *client,
struct wl_resource *resource,
const char *startup_id)
{
MetaDisplay *display;
display = meta_get_display ();
meta_startup_notification_remove_sequence (display->startup_notification,
startup_id);
}
static void
gtk_shell_system_bell (struct wl_client *client,
struct wl_resource *resource,
struct wl_resource *gtk_surface_resource)
{
MetaDisplay *display = meta_get_display ();
if (gtk_surface_resource)
{
MetaWaylandSurface *surface =
wl_resource_get_user_data (gtk_surface_resource);
if (!surface->window)
return;
meta_bell_notify (display, surface->window);
}
else
{
meta_bell_notify (display, NULL);
}
}
static const struct gtk_shell1_interface meta_wayland_gtk_shell_interface = {
gtk_shell_get_gtk_surface,
gtk_shell_set_startup_id,
gtk_shell_system_bell,
};
static void
bind_gtk_shell (struct wl_client *client,
void *data,
guint32 version,
guint32 id)
{
struct wl_resource *resource;
uint32_t capabilities = 0;
resource = wl_resource_create (client, &gtk_shell1_interface, version, id);
wl_resource_set_implementation (resource, &meta_wayland_gtk_shell_interface, data, NULL);
if (!meta_prefs_get_show_fallback_app_menu ())
capabilities = GTK_SHELL1_CAPABILITY_GLOBAL_APP_MENU;
gtk_shell1_send_capabilities (resource, capabilities);
}
static void
unparent_actor (MetaWaylandSurface *surface)
{
@@ -1597,7 +1519,8 @@ wl_subcompositor_get_subsurface (struct wl_client *client,
}
if (!meta_wayland_surface_assign_role (surface,
META_TYPE_WAYLAND_SURFACE_ROLE_SUBSURFACE))
META_TYPE_WAYLAND_SURFACE_ROLE_SUBSURFACE,
NULL))
{
/* FIXME: There is no subcompositor "role" error yet, so lets just use something
* similar until there is.
@@ -1646,12 +1569,7 @@ meta_wayland_shell_init (MetaWaylandCompositor *compositor)
{
meta_wayland_xdg_shell_init (compositor);
meta_wayland_wl_shell_init (compositor);
if (wl_global_create (compositor->wayland_display,
&gtk_shell1_interface,
META_GTK_SHELL1_VERSION,
compositor, bind_gtk_shell) == NULL)
g_error ("Failed to register a global gtk-shell object");
meta_wayland_gtk_shell_init (compositor);
if (wl_global_create (compositor->wayland_display,
&wl_subcompositor_interface,
@@ -1662,6 +1580,8 @@ meta_wayland_shell_init (MetaWaylandCompositor *compositor)
void
meta_wayland_surface_configure_notify (MetaWaylandSurface *surface,
int new_x,
int new_y,
int new_width,
int new_height,
MetaWaylandSerial *sent_serial)
@@ -1669,7 +1589,10 @@ meta_wayland_surface_configure_notify (MetaWaylandSurface *surface,
MetaWaylandSurfaceRoleShellSurface *shell_surface_role =
META_WAYLAND_SURFACE_ROLE_SHELL_SURFACE (surface->role);
g_signal_emit (surface, surface_signals[SURFACE_CONFIGURE], 0);
meta_wayland_surface_role_shell_surface_configure (shell_surface_role,
new_x, new_y,
new_width, new_height,
sent_serial);
}
@@ -1869,6 +1792,56 @@ meta_wayland_surface_class_init (MetaWaylandSurfaceClass *klass)
0, NULL, NULL,
g_cclosure_marshal_VOID__VOID,
G_TYPE_NONE, 0);
surface_signals[SURFACE_CONFIGURE] =
g_signal_new ("configure",
G_TYPE_FROM_CLASS (object_class),
G_SIGNAL_RUN_LAST,
0, NULL, NULL,
g_cclosure_marshal_VOID__VOID,
G_TYPE_NONE, 0);
}
static void
meta_wayland_surface_role_set_property (GObject *object,
guint prop_id,
const GValue *value,
GParamSpec *pspec)
{
MetaWaylandSurfaceRole *surface_role = META_WAYLAND_SURFACE_ROLE (object);
MetaWaylandSurfaceRolePrivate *priv =
meta_wayland_surface_role_get_instance_private (surface_role);
switch (prop_id)
{
case SURFACE_ROLE_PROP_SURFACE:
priv->surface = g_value_get_object (value);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
}
}
static void
meta_wayland_surface_role_get_property (GObject *object,
guint prop_id,
GValue *value,
GParamSpec *pspec)
{
MetaWaylandSurfaceRole *surface_role = META_WAYLAND_SURFACE_ROLE (object);
MetaWaylandSurfaceRolePrivate *priv =
meta_wayland_surface_role_get_instance_private (surface_role);
switch (prop_id)
{
case SURFACE_ROLE_PROP_SURFACE:
g_value_set_object (value, priv->surface);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
}
}
static void
@@ -1879,6 +1852,20 @@ meta_wayland_surface_role_init (MetaWaylandSurfaceRole *role)
static void
meta_wayland_surface_role_class_init (MetaWaylandSurfaceRoleClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (klass);
object_class->set_property = meta_wayland_surface_role_set_property;
object_class->get_property = meta_wayland_surface_role_get_property;
g_object_class_install_property (object_class,
SURFACE_ROLE_PROP_SURFACE,
g_param_spec_object ("surface",
"MetaWaylandSurface",
"The MetaWaylandSurface instance",
META_TYPE_WAYLAND_SURFACE,
G_PARAM_READWRITE |
G_PARAM_CONSTRUCT_ONLY |
G_PARAM_STATIC_STRINGS));
}
static void
@@ -1942,6 +1929,8 @@ meta_wayland_surface_role_get_surface (MetaWaylandSurfaceRole *role)
static void
meta_wayland_surface_role_shell_surface_configure (MetaWaylandSurfaceRoleShellSurface *shell_surface_role,
int new_x,
int new_y,
int new_width,
int new_height,
MetaWaylandSerial *sent_serial)
@@ -1950,6 +1939,8 @@ meta_wayland_surface_role_shell_surface_configure (MetaWaylandSurfaceRoleShellSu
META_WAYLAND_SURFACE_ROLE_SHELL_SURFACE_GET_CLASS (shell_surface_role);
shell_surface_role_class->configure (shell_surface_role,
new_x,
new_y,
new_width,
new_height,
sent_serial);
@@ -2020,11 +2011,16 @@ actor_surface_commit (MetaWaylandSurfaceRole *surface_role,
{
MetaWaylandSurface *surface =
meta_wayland_surface_role_get_surface (surface_role);
MetaWaylandSurface *toplevel_surface;
queue_surface_actor_frame_callbacks (surface, pending);
toplevel_surface = meta_wayland_surface_get_toplevel (surface);
if (!toplevel_surface || !toplevel_surface->window)
return;
meta_surface_actor_wayland_sync_state (
META_SURFACE_ACTOR_WAYLAND (surface->surface_actor));
queue_surface_actor_frame_callbacks (surface, pending);
}
static void
@@ -2043,6 +2039,39 @@ meta_wayland_surface_role_actor_surface_class_init (MetaWaylandSurfaceRoleActorS
surface_role_class->is_on_output = actor_surface_is_on_output;
}
static void
shell_surface_role_surface_commit (MetaWaylandSurfaceRole *surface_role,
MetaWaylandPendingState *pending)
{
MetaWaylandSurface *surface =
meta_wayland_surface_role_get_surface (surface_role);
MetaWaylandSurfaceRoleClass *surface_role_class;
MetaWindow *window;
MetaWaylandBuffer *buffer;
CoglTexture *texture;
MetaSurfaceActorWayland *actor;
double scale;
surface_role_class =
META_WAYLAND_SURFACE_ROLE_CLASS (meta_wayland_surface_role_shell_surface_parent_class);
surface_role_class->commit (surface_role, pending);
buffer = surface->buffer_ref.buffer;
if (!buffer)
return;
window = surface->window;
if (!window)
return;
actor = META_SURFACE_ACTOR_WAYLAND (surface->surface_actor);
scale = meta_surface_actor_wayland_get_scale (actor);
texture = buffer->texture;
window->buffer_rect.width = cogl_texture_get_width (texture) * scale;
window->buffer_rect.height = cogl_texture_get_height (texture) * scale;
}
static void
meta_wayland_surface_role_shell_surface_init (MetaWaylandSurfaceRoleShellSurface *role)
{
@@ -2051,6 +2080,10 @@ meta_wayland_surface_role_shell_surface_init (MetaWaylandSurfaceRoleShellSurface
static void
meta_wayland_surface_role_shell_surface_class_init (MetaWaylandSurfaceRoleShellSurfaceClass *klass)
{
MetaWaylandSurfaceRoleClass *surface_role_class =
META_WAYLAND_SURFACE_ROLE_CLASS (klass);
surface_role_class->commit = shell_surface_role_surface_commit;
}
static void

View File

@@ -92,6 +92,8 @@ struct _MetaWaylandSurfaceRoleShellSurfaceClass
MetaWaylandSurfaceRoleActorSurfaceClass parent_class;
void (*configure) (MetaWaylandSurfaceRoleShellSurface *shell_surface_role,
int new_x,
int new_y,
int new_width,
int new_height,
MetaWaylandSerial *sent_serial);
@@ -174,6 +176,7 @@ struct _MetaWaylandSurface
int32_t offset_x, offset_y;
GList *subsurfaces;
GHashTable *outputs_to_destroy_notify_id;
gboolean destroying;
/* Buffer reference state. */
struct {
@@ -202,13 +205,8 @@ struct _MetaWaylandSurface
MetaWaylandPendingState *pending;
/* Extension resources. */
struct wl_resource *gtk_surface;
struct wl_resource *wl_subsurface;
/* gtk_surface stuff */
gboolean is_modal;
gboolean destroying;
/* wl_subsurface stuff. */
struct {
MetaWaylandSurface *parent;
@@ -243,7 +241,9 @@ MetaWaylandSurface *meta_wayland_surface_create (MetaWaylandCompositor *composit
guint32 id);
gboolean meta_wayland_surface_assign_role (MetaWaylandSurface *surface,
GType role_type);
GType role_type,
const char *first_property_name,
...);
MetaWaylandBuffer *meta_wayland_surface_get_buffer (MetaWaylandSurface *surface);
@@ -255,6 +255,8 @@ void meta_wayland_surface_set_window (MetaWaylandSurface *surface
MetaWindow *window);
void meta_wayland_surface_configure_notify (MetaWaylandSurface *surface,
int new_x,
int new_y,
int width,
int height,
MetaWaylandSerial *sent_serial);
@@ -299,9 +301,6 @@ MetaWaylandSurface * meta_wayland_surface_role_get_surface (MetaWaylandSurfaceRo
cairo_region_t * meta_wayland_surface_calculate_input_region (MetaWaylandSurface *surface);
void meta_wayland_surface_apply_window_state (MetaWaylandSurface *surface,
MetaWaylandPendingState *pending);
void meta_wayland_surface_calculate_window_geometry (MetaWaylandSurface *surface,
MetaRectangle *total_geometry,
float parent_x,

View File

@@ -443,7 +443,8 @@ tool_set_cursor (struct wl_client *client,
if (surface &&
!meta_wayland_surface_assign_role (surface,
META_TYPE_WAYLAND_SURFACE_ROLE_TABLET_CURSOR))
META_TYPE_WAYLAND_SURFACE_ROLE_TABLET_CURSOR,
NULL))
{
wl_resource_post_error (resource, WL_POINTER_ERROR_ROLE,
"wl_surface@%d already has a different role",

View File

@@ -518,7 +518,8 @@ wl_shell_get_shell_surface (struct wl_client *client,
}
if (!meta_wayland_surface_assign_role (surface,
META_TYPE_WAYLAND_WL_SHELL_SURFACE))
META_TYPE_WAYLAND_WL_SHELL_SURFACE,
NULL))
{
wl_resource_post_error (resource, WL_SHELL_ERROR_ROLE,
"wl_surface@%d already has a different role",
@@ -594,7 +595,6 @@ wl_shell_surface_role_commit (MetaWaylandSurfaceRole *surface_role,
if (!pending->newly_attached)
return;
meta_wayland_surface_apply_window_state (surface, pending);
meta_wayland_surface_calculate_window_geometry (surface, &geom, 0, 0);
meta_window_wayland_move_resize (window,
NULL,
@@ -616,6 +616,8 @@ wl_shell_surface_role_get_toplevel (MetaWaylandSurfaceRole *surface_role)
static void
wl_shell_surface_role_configure (MetaWaylandSurfaceRoleShellSurface *shell_surface_role,
int new_x,
int new_y,
int new_width,
int new_height,
MetaWaylandSerial *sent_serial)

File diff suppressed because it is too large Load Diff

View File

@@ -23,16 +23,29 @@
#include "wayland/meta-wayland-surface.h"
#define META_TYPE_WAYLAND_XDG_SURFACE (meta_wayland_xdg_surface_get_type ())
G_DECLARE_FINAL_TYPE (MetaWaylandXdgSurface,
meta_wayland_xdg_surface,
META, WAYLAND_XDG_SURFACE,
MetaWaylandSurfaceRoleShellSurface);
G_DECLARE_DERIVABLE_TYPE (MetaWaylandXdgSurface,
meta_wayland_xdg_surface,
META, WAYLAND_XDG_SURFACE,
MetaWaylandSurfaceRoleShellSurface);
struct _MetaWaylandXdgSurfaceClass
{
MetaWaylandSurfaceRoleShellSurfaceClass parent_class;
void (*shell_client_destroyed) (MetaWaylandXdgSurface *xdg_surface);
};
#define META_TYPE_WAYLAND_XDG_TOPLEVEL (meta_wayland_xdg_toplevel_get_type ())
G_DECLARE_FINAL_TYPE (MetaWaylandXdgToplevel,
meta_wayland_xdg_toplevel,
META, WAYLAND_XDG_TOPLEVEL,
MetaWaylandXdgSurface);
#define META_TYPE_WAYLAND_XDG_POPUP (meta_wayland_xdg_popup_get_type ())
G_DECLARE_FINAL_TYPE (MetaWaylandXdgPopup,
meta_wayland_xdg_popup,
META, WAYLAND_XDG_POPUP,
MetaWaylandSurfaceRoleShellSurface);
MetaWaylandXdgSurface);
void meta_wayland_xdg_shell_init (MetaWaylandCompositor *compositor);

View File

@@ -46,6 +46,8 @@ struct _MetaWindowWayland
int pending_move_x;
int pending_move_y;
int last_sent_x;
int last_sent_y;
int last_sent_width;
int last_sent_height;
};
@@ -149,6 +151,8 @@ surface_state_changed (MetaWindow *window)
return;
meta_wayland_surface_configure_notify (window->surface,
wl_window->last_sent_x,
wl_window->last_sent_y,
wl_window->last_sent_width,
wl_window->last_sent_height,
&wl_window->pending_configure_serial);
@@ -184,6 +188,8 @@ meta_window_wayland_move_resize_internal (MetaWindow *window,
{
MetaWindowWayland *wl_window = META_WINDOW_WAYLAND (window);
gboolean can_move_now;
int configured_x;
int configured_y;
int configured_width;
int configured_height;
int monitor_scale;
@@ -194,6 +200,9 @@ meta_window_wayland_move_resize_internal (MetaWindow *window,
if (window->unmanaging)
return;
configured_x = constrained_rect.x;
configured_y = constrained_rect.y;
/* The scale the window is drawn in might change depending on what monitor it
* is mainly on. Scale the configured rectangle to be in logical pixel
* coordinate space so that we can have a scale independent size to pass
@@ -256,6 +265,8 @@ meta_window_wayland_move_resize_internal (MetaWindow *window,
return;
meta_wayland_surface_configure_notify (window->surface,
configured_x,
configured_y,
configured_width,
configured_height,
&wl_window->pending_configure_serial);
@@ -271,6 +282,8 @@ meta_window_wayland_move_resize_internal (MetaWindow *window,
}
}
wl_window->last_sent_x = configured_x;
wl_window->last_sent_y = configured_y;
wl_window->last_sent_width = configured_width;
wl_window->last_sent_height = configured_height;
@@ -624,3 +637,16 @@ meta_window_wayland_place_relative_to (MetaWindow *window,
other->buffer_rect.y + (y * monitor_scale));
window->placed = TRUE;
}
void
meta_window_place_with_placement_rule (MetaWindow *window,
MetaPlacementRule *placement_rule)
{
g_clear_pointer (&window->placement_rule, g_free);
window->placement_rule = g_new0 (MetaPlacementRule, 1);
*window->placement_rule = *placement_rule;
window->unconstrained_rect.width = placement_rule->width;
window->unconstrained_rect.height = placement_rule->height;
meta_window_force_placement (window);
}

View File

@@ -25,6 +25,7 @@
#ifndef META_WINDOW_WAYLAND_H
#define META_WINDOW_WAYLAND_H
#include "core/window-private.h"
#include <meta/window.h>
#include "wayland/meta-wayland-types.h"
@@ -57,4 +58,7 @@ void meta_window_wayland_place_relative_to (MetaWindow *window,
int x,
int y);
void meta_window_place_with_placement_rule (MetaWindow *window,
MetaPlacementRule *placement_rule);
#endif

View File

@@ -56,7 +56,8 @@ associate_window_with_surface (MetaWindow *window,
MetaDisplay *display = window->display;
if (!meta_wayland_surface_assign_role (surface,
META_TYPE_WAYLAND_SURFACE_ROLE_XWAYLAND))
META_TYPE_WAYLAND_SURFACE_ROLE_XWAYLAND,
NULL))
{
wl_resource_post_error (surface->resource,
WL_DISPLAY_ERROR_INVALID_OBJECT,

View File

@@ -46,6 +46,16 @@
<request name="present">
<arg name="time" type="uint"/>
</request>
<!-- Version 2 additions -->
<enum name="state">
<entry name="tiled" value="1"/>
</enum>
<event name="configure">
<arg name="states" type="array"/>
</event>
</interface>
</protocol>