Compare commits
21 Commits
wip/carlos
...
3.28.1
Author | SHA1 | Date | |
---|---|---|---|
![]() |
34644b2133 | ||
![]() |
7da4e8cf14 | ||
![]() |
23c3f8bb18 | ||
![]() |
60866e0f85 | ||
![]() |
45c02645f3 | ||
![]() |
e515e37a7e | ||
![]() |
957f4ec69d | ||
![]() |
a98eb107be | ||
![]() |
1851fa2bd0 | ||
![]() |
de7d7bbf3d | ||
![]() |
7ac551cd05 | ||
![]() |
8696a79477 | ||
![]() |
b2f9de98d0 | ||
![]() |
2da2489da5 | ||
![]() |
31779404f0 | ||
![]() |
b096c0ac33 | ||
![]() |
44a7f74dcd | ||
![]() |
3832c6b607 | ||
![]() |
14b7e79d3c | ||
![]() |
e99b0b9368 | ||
![]() |
de294f34bb |
20
NEWS
20
NEWS
@@ -1,3 +1,23 @@
|
|||||||
|
3.28.1
|
||||||
|
======
|
||||||
|
* Fix various input-method regressions [Carlos; #65, #74, #66]
|
||||||
|
* Fix wayland build on FreeBSD [Ting-Wei; #792280, #792717]
|
||||||
|
* Fix swapped colors in screenshots (again) [Carlos; #72]
|
||||||
|
* Allow building with elogind [Rasmus; !46]
|
||||||
|
* Consider display rotation for cursor [Olivier; #85]
|
||||||
|
* Fall back to non-modifier GBM surfaces [Daniel; #84]
|
||||||
|
* Disable KMS modifiers by default [Jonas; #81]
|
||||||
|
* Misc bug fixes [handsome-feng; !45]
|
||||||
|
|
||||||
|
Contributors:
|
||||||
|
Jonas Ådahl, Olivier Fourdan, Carlos Garnacho, handsome-feng, Yussuf Khalil,
|
||||||
|
Ting-Wei Lan, Aleksandr Mezin, Alberts Muktupāvels,
|
||||||
|
Georges Basile Stavracas Neto, Benjamin Otte, Daniel Stone, Rasmus Thomsen,
|
||||||
|
Marco Trevisan (Treviño), Daniel van Vugt
|
||||||
|
|
||||||
|
Translators:
|
||||||
|
Emin Tufan Çetin [tr], Dušan Kazik [sk], Matej Urbančič [sl]
|
||||||
|
|
||||||
3.28.0
|
3.28.0
|
||||||
======
|
======
|
||||||
* Fix xdg-foreign regression [Carlos; #63]
|
* Fix xdg-foreign regression [Carlos; #63]
|
||||||
|
@@ -2830,6 +2830,10 @@ clutter_text_key_focus_in (ClutterActor *actor)
|
|||||||
if (method && priv->editable)
|
if (method && priv->editable)
|
||||||
{
|
{
|
||||||
clutter_input_method_focus_in (method, priv->input_focus);
|
clutter_input_method_focus_in (method, priv->input_focus);
|
||||||
|
clutter_input_focus_set_content_purpose (priv->input_focus,
|
||||||
|
priv->input_purpose);
|
||||||
|
clutter_input_focus_set_content_hints (priv->input_focus,
|
||||||
|
priv->input_hints);
|
||||||
update_cursor_location (CLUTTER_TEXT (actor));
|
update_cursor_location (CLUTTER_TEXT (actor));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -4511,6 +4515,27 @@ buffer_deleted_text (ClutterTextBuffer *buffer,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
clutter_text_queue_redraw_or_relayout (ClutterText *self)
|
||||||
|
{
|
||||||
|
ClutterActor *actor = CLUTTER_ACTOR (self);
|
||||||
|
gfloat preferred_width;
|
||||||
|
gfloat preferred_height;
|
||||||
|
|
||||||
|
clutter_text_dirty_cache (self);
|
||||||
|
|
||||||
|
/* we're using our private implementations here to avoid the caching done by ClutterActor */
|
||||||
|
clutter_text_get_preferred_width (actor, -1, NULL, &preferred_width);
|
||||||
|
clutter_text_get_preferred_height (actor, preferred_width, NULL, &preferred_height);
|
||||||
|
|
||||||
|
if (clutter_actor_has_allocation (actor) &&
|
||||||
|
(fabsf (preferred_width - clutter_actor_get_width (actor)) > 0.001 ||
|
||||||
|
fabsf (preferred_height - clutter_actor_get_height (actor)) > 0.001))
|
||||||
|
clutter_actor_queue_relayout (actor);
|
||||||
|
else
|
||||||
|
clutter_text_queue_redraw (actor);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
buffer_notify_text (ClutterTextBuffer *buffer,
|
buffer_notify_text (ClutterTextBuffer *buffer,
|
||||||
GParamSpec *spec,
|
GParamSpec *spec,
|
||||||
@@ -4518,9 +4543,7 @@ buffer_notify_text (ClutterTextBuffer *buffer,
|
|||||||
{
|
{
|
||||||
g_object_freeze_notify (G_OBJECT (self));
|
g_object_freeze_notify (G_OBJECT (self));
|
||||||
|
|
||||||
clutter_text_dirty_cache (self);
|
clutter_text_queue_redraw_or_relayout (self);
|
||||||
|
|
||||||
clutter_actor_queue_relayout (CLUTTER_ACTOR (self));
|
|
||||||
|
|
||||||
g_signal_emit (self, text_signals[TEXT_CHANGED], 0);
|
g_signal_emit (self, text_signals[TEXT_CHANGED], 0);
|
||||||
g_object_notify_by_pspec (G_OBJECT (self), obj_props[PROP_TEXT]);
|
g_object_notify_by_pspec (G_OBJECT (self), obj_props[PROP_TEXT]);
|
||||||
@@ -4872,8 +4895,7 @@ clutter_text_set_cursor_visible (ClutterText *self,
|
|||||||
{
|
{
|
||||||
priv->cursor_visible = cursor_visible;
|
priv->cursor_visible = cursor_visible;
|
||||||
|
|
||||||
clutter_text_dirty_cache (self);
|
clutter_text_queue_redraw_or_relayout (self);
|
||||||
clutter_actor_queue_relayout (CLUTTER_ACTOR (self));
|
|
||||||
|
|
||||||
g_object_notify_by_pspec (G_OBJECT (self), obj_props[PROP_CURSOR_VISIBLE]);
|
g_object_notify_by_pspec (G_OBJECT (self), obj_props[PROP_CURSOR_VISIBLE]);
|
||||||
}
|
}
|
||||||
@@ -5774,9 +5796,7 @@ clutter_text_set_line_alignment (ClutterText *self,
|
|||||||
{
|
{
|
||||||
priv->alignment = alignment;
|
priv->alignment = alignment;
|
||||||
|
|
||||||
clutter_text_dirty_cache (self);
|
clutter_text_queue_redraw_or_relayout (self);
|
||||||
|
|
||||||
clutter_actor_queue_relayout (CLUTTER_ACTOR (self));
|
|
||||||
|
|
||||||
g_object_notify_by_pspec (G_OBJECT (self), obj_props[PROP_LINE_ALIGNMENT]);
|
g_object_notify_by_pspec (G_OBJECT (self), obj_props[PROP_LINE_ALIGNMENT]);
|
||||||
}
|
}
|
||||||
@@ -5831,9 +5851,7 @@ clutter_text_set_use_markup (ClutterText *self,
|
|||||||
if (setting)
|
if (setting)
|
||||||
clutter_text_set_markup_internal (self, text);
|
clutter_text_set_markup_internal (self, text);
|
||||||
|
|
||||||
clutter_text_dirty_cache (self);
|
clutter_text_queue_redraw_or_relayout (self);
|
||||||
|
|
||||||
clutter_actor_queue_relayout (CLUTTER_ACTOR (self));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -5880,9 +5898,7 @@ clutter_text_set_justify (ClutterText *self,
|
|||||||
{
|
{
|
||||||
priv->justify = justify;
|
priv->justify = justify;
|
||||||
|
|
||||||
clutter_text_dirty_cache (self);
|
clutter_text_queue_redraw_or_relayout (self);
|
||||||
|
|
||||||
clutter_actor_queue_relayout (CLUTTER_ACTOR (self));
|
|
||||||
|
|
||||||
g_object_notify_by_pspec (G_OBJECT (self), obj_props[PROP_JUSTIFY]);
|
g_object_notify_by_pspec (G_OBJECT (self), obj_props[PROP_JUSTIFY]);
|
||||||
}
|
}
|
||||||
@@ -6449,8 +6465,7 @@ clutter_text_set_preedit_string (ClutterText *self,
|
|||||||
priv->preedit_set = TRUE;
|
priv->preedit_set = TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
clutter_text_dirty_cache (self);
|
clutter_text_queue_redraw_or_relayout (self);
|
||||||
clutter_actor_queue_relayout (CLUTTER_ACTOR (self));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -6512,6 +6527,8 @@ clutter_text_set_input_hints (ClutterText *self,
|
|||||||
g_return_if_fail (CLUTTER_IS_TEXT (self));
|
g_return_if_fail (CLUTTER_IS_TEXT (self));
|
||||||
|
|
||||||
self->priv->input_hints = hints;
|
self->priv->input_hints = hints;
|
||||||
|
|
||||||
|
if (clutter_input_focus_is_focused (self->priv->input_focus))
|
||||||
clutter_input_focus_set_content_hints (self->priv->input_focus, hints);
|
clutter_input_focus_set_content_hints (self->priv->input_focus, hints);
|
||||||
g_object_notify_by_pspec (G_OBJECT (self), obj_props[PROP_INPUT_HINTS]);
|
g_object_notify_by_pspec (G_OBJECT (self), obj_props[PROP_INPUT_HINTS]);
|
||||||
}
|
}
|
||||||
@@ -6531,6 +6548,8 @@ clutter_text_set_input_purpose (ClutterText *self,
|
|||||||
g_return_if_fail (CLUTTER_IS_TEXT (self));
|
g_return_if_fail (CLUTTER_IS_TEXT (self));
|
||||||
|
|
||||||
self->priv->input_purpose = purpose;
|
self->priv->input_purpose = purpose;
|
||||||
|
|
||||||
|
if (clutter_input_focus_is_focused (self->priv->input_focus))
|
||||||
clutter_input_focus_set_content_purpose (self->priv->input_focus, purpose);
|
clutter_input_focus_set_content_purpose (self->priv->input_focus, purpose);
|
||||||
g_object_notify_by_pspec (G_OBJECT (self), obj_props[PROP_INPUT_PURPOSE]);
|
g_object_notify_by_pspec (G_OBJECT (self), obj_props[PROP_INPUT_PURPOSE]);
|
||||||
}
|
}
|
||||||
|
@@ -1412,22 +1412,12 @@ _cogl_framebuffer_gl_read_pixels_into_bitmap (CoglFramebuffer *framebuffer,
|
|||||||
if (!cogl_is_offscreen (framebuffer))
|
if (!cogl_is_offscreen (framebuffer))
|
||||||
y = framebuffer_height - y - height;
|
y = framebuffer_height - y - height;
|
||||||
|
|
||||||
required_format = ctx->driver_vtable->pixel_format_to_gl (ctx,
|
required_format = ctx->driver_vtable->pixel_format_to_gl_with_target (ctx,
|
||||||
|
framebuffer->internal_format,
|
||||||
format,
|
format,
|
||||||
&gl_intformat,
|
&gl_intformat,
|
||||||
&gl_format,
|
&gl_format,
|
||||||
&gl_type);
|
&gl_type);
|
||||||
#if HAVE_COGL_GL
|
|
||||||
/* As we are reading pixels, we want to consider the bitmap according to
|
|
||||||
* its real pixel format, not the swizzled channels we pretend face to the
|
|
||||||
* pipeline.
|
|
||||||
*/
|
|
||||||
if ((ctx->driver == COGL_DRIVER_GL || ctx->driver == COGL_DRIVER_GL3) &&
|
|
||||||
(format == COGL_PIXEL_FORMAT_BGRA_8888 ||
|
|
||||||
format == COGL_PIXEL_FORMAT_BGRA_8888_PRE) &&
|
|
||||||
_cogl_has_private_feature (ctx, COGL_PRIVATE_FEATURE_TEXTURE_SWIZZLE))
|
|
||||||
gl_format = GL_BGRA;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* NB: All offscreen rendering is done upside down so there is no need
|
/* NB: All offscreen rendering is done upside down so there is no need
|
||||||
* to flip in this case... */
|
* to flip in this case... */
|
||||||
|
19
configure.ac
19
configure.ac
@@ -2,7 +2,7 @@ AC_PREREQ(2.62)
|
|||||||
|
|
||||||
m4_define([mutter_major_version], [3])
|
m4_define([mutter_major_version], [3])
|
||||||
m4_define([mutter_minor_version], [28])
|
m4_define([mutter_minor_version], [28])
|
||||||
m4_define([mutter_micro_version], [0])
|
m4_define([mutter_micro_version], [1])
|
||||||
|
|
||||||
m4_define([mutter_version],
|
m4_define([mutter_version],
|
||||||
[mutter_major_version.mutter_minor_version.mutter_micro_version])
|
[mutter_major_version.mutter_minor_version.mutter_micro_version])
|
||||||
@@ -262,7 +262,22 @@ AC_SUBST(XWAYLAND_PATH)
|
|||||||
|
|
||||||
PKG_CHECK_MODULES(MUTTER, $MUTTER_PC_MODULES)
|
PKG_CHECK_MODULES(MUTTER, $MUTTER_PC_MODULES)
|
||||||
|
|
||||||
MUTTER_NATIVE_BACKEND_MODULES="libdrm >= 2.4.83 libsystemd libinput >= 1.4 gudev-1.0 gbm >= 17.1"
|
PKG_CHECK_MODULES(ELOGIND, [libelogind], [have_elogind=yes], [have_elogind=no])
|
||||||
|
|
||||||
|
if test x$have_elogind = xyes; then
|
||||||
|
logind_provider="libelogind"
|
||||||
|
fi
|
||||||
|
|
||||||
|
PKG_CHECK_MODULES(SYSTEMD, [libsystemd], [have_systemd=yes], [have_systemd=no])
|
||||||
|
|
||||||
|
if test x$have_systemd = xyes; then
|
||||||
|
logind_provider="libsystemd"
|
||||||
|
fi
|
||||||
|
|
||||||
|
AS_IF([test -z "$logind_provider"],
|
||||||
|
AC_MSG_ERROR([Could not find either systemd or elogind as logind provider])])
|
||||||
|
|
||||||
|
MUTTER_NATIVE_BACKEND_MODULES="libdrm $logind_provider libinput >= 1.4 gudev-1.0 gbm >= 10.3"
|
||||||
|
|
||||||
AC_ARG_ENABLE(native-backend,
|
AC_ARG_ENABLE(native-backend,
|
||||||
AS_HELP_STRING([--disable-native-backend], [disable mutter native (KMS) backend]),,
|
AS_HELP_STRING([--disable-native-backend], [disable mutter native (KMS) backend]),,
|
||||||
|
23
po/sl.po
23
po/sl.po
@@ -10,8 +10,8 @@ msgid ""
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: mutter master\n"
|
"Project-Id-Version: mutter master\n"
|
||||||
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/mutter/issues\n"
|
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/mutter/issues\n"
|
||||||
"POT-Creation-Date: 2018-03-05 19:32+0000\n"
|
"POT-Creation-Date: 2018-04-03 20:43+0000\n"
|
||||||
"PO-Revision-Date: 2018-03-06 22:02+0100\n"
|
"PO-Revision-Date: 2018-04-09 20:28+0200\n"
|
||||||
"Last-Translator: Matej Urbančič <mateju@svn.gnome.org>\n"
|
"Last-Translator: Matej Urbančič <mateju@svn.gnome.org>\n"
|
||||||
"Language-Team: Slovenian GNOME Translation Team <gnome-si@googlegroups.com>\n"
|
"Language-Team: Slovenian GNOME Translation Team <gnome-si@googlegroups.com>\n"
|
||||||
"Language: sl_SI\n"
|
"Language: sl_SI\n"
|
||||||
@@ -21,7 +21,7 @@ msgstr ""
|
|||||||
"Plural-Forms: nplurals=4; plural=(n%100==1 ? 1 : n%100==2 ? 2 : n%100==3 || n"
|
"Plural-Forms: nplurals=4; plural=(n%100==1 ? 1 : n%100==2 ? 2 : n%100==3 || n"
|
||||||
"%100==4 ? 3 : 0);\n"
|
"%100==4 ? 3 : 0);\n"
|
||||||
"X-Poedit-SourceCharset: utf-8\n"
|
"X-Poedit-SourceCharset: utf-8\n"
|
||||||
"X-Generator: Poedit 2.0.4\n"
|
"X-Generator: Poedit 2.0.6\n"
|
||||||
|
|
||||||
#: data/50-mutter-navigation.xml:6
|
#: data/50-mutter-navigation.xml:6
|
||||||
msgid "Navigation"
|
msgid "Navigation"
|
||||||
@@ -481,7 +481,7 @@ msgstr "Ponovno omogoči tipkovne bližnjice"
|
|||||||
|
|
||||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:64
|
#: data/org.gnome.mutter.wayland.gschema.xml.in:64
|
||||||
msgid "Allow grabs with Xwayland"
|
msgid "Allow grabs with Xwayland"
|
||||||
msgstr ""
|
msgstr "Dovoli zajemanje z XWayland"
|
||||||
|
|
||||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:65
|
#: data/org.gnome.mutter.wayland.gschema.xml.in:65
|
||||||
msgid ""
|
msgid ""
|
||||||
@@ -491,10 +491,14 @@ msgid ""
|
|||||||
"window or be among the applications white-listed in key “xwayland-grab-"
|
"window or be among the applications white-listed in key “xwayland-grab-"
|
||||||
"access-rules”."
|
"access-rules”."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"Upošteva zajeme s tipkovnico, ki jih sprožijo programi X11, zagnani v okolju "
|
||||||
|
"Xwayland. Če naj se programski zajem upošteva, mora odjemalec ali poslati "
|
||||||
|
"specifično sporočilo X11 na korensko okno ali pa mora biti zaveden na "
|
||||||
|
"seznamu programov v ključu »xwayland-garb-access-rules«."
|
||||||
|
|
||||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:77
|
#: data/org.gnome.mutter.wayland.gschema.xml.in:77
|
||||||
msgid "Xwayland applications allowed to issue keyboard grabs"
|
msgid "Xwayland applications allowed to issue keyboard grabs"
|
||||||
msgstr ""
|
msgstr "Program XWayland ima dovoljenje za zajemanje s tipkovnico"
|
||||||
|
|
||||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:78
|
#: data/org.gnome.mutter.wayland.gschema.xml.in:78
|
||||||
msgid ""
|
msgid ""
|
||||||
@@ -509,6 +513,15 @@ msgid ""
|
|||||||
"using the specific keyboard shortcut defined by the keybinding key “restore-"
|
"using the specific keyboard shortcut defined by the keybinding key “restore-"
|
||||||
"shortcuts”."
|
"shortcuts”."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"Seznam imen ali razredov virov oken X11, ki lahko sprožijo zajeme v okolju "
|
||||||
|
"Xwayland. Ime oziroma razred vira podanega okna X11 je mogoče pridobiti z "
|
||||||
|
"ukazom »xprop WM_CLASS«. Uporaba pomožnih znakov » * « in » ? « je podprta. "
|
||||||
|
"Vrednosti, ki se začnejo z znakom » ! « so uvrščeni na črni seznam. Ta "
|
||||||
|
"seznam je obravnavan prednostno pred belim seznamom in prekliče zajeme na "
|
||||||
|
"seznamu sistema. Privzeti seznam vključuje ključ: "
|
||||||
|
"»@XWAYLAND_GRAB_DEFAULT_ACCESS_RULES@« Uporabniki lahko prekinejo obstoječi "
|
||||||
|
"zajem z uporabo posebne tipkovne bližnjice, določene s tipkovnim ključem "
|
||||||
|
"»restore-shortcuts«."
|
||||||
|
|
||||||
#. TRANSLATORS: This string refers to a button that switches between
|
#. TRANSLATORS: This string refers to a button that switches between
|
||||||
#. * different modes.
|
#. * different modes.
|
||||||
|
@@ -1088,7 +1088,7 @@ meta_input_settings_changed_cb (GSettings *settings,
|
|||||||
update_device_natural_scroll (input_settings, NULL);
|
update_device_natural_scroll (input_settings, NULL);
|
||||||
else if (strcmp (key, "tap-to-click") == 0)
|
else if (strcmp (key, "tap-to-click") == 0)
|
||||||
update_touchpad_tap_enabled (input_settings, NULL);
|
update_touchpad_tap_enabled (input_settings, NULL);
|
||||||
else if (strcmp (key, "tap-and_drag") == 0)
|
else if (strcmp (key, "tap-and-drag") == 0)
|
||||||
update_touchpad_tap_and_drag_enabled (input_settings, NULL);
|
update_touchpad_tap_and_drag_enabled (input_settings, NULL);
|
||||||
else if (strcmp(key, "disable-while-typing") == 0)
|
else if (strcmp(key, "disable-while-typing") == 0)
|
||||||
update_touchpad_disable_while_typing (input_settings, NULL);
|
update_touchpad_disable_while_typing (input_settings, NULL);
|
||||||
|
@@ -1032,7 +1032,7 @@ meta_monitor_manager_handle_get_resources (MetaDBusDisplayConfig *skeleton,
|
|||||||
NULL /* properties */);
|
NULL /* properties */);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (l = combined_outputs; l; l = l->next)
|
for (l = combined_outputs, i = 0; l; l = l->next, i++)
|
||||||
{
|
{
|
||||||
MetaOutput *output = l->data;
|
MetaOutput *output = l->data;
|
||||||
GVariantBuilder crtcs, modes, clones, properties;
|
GVariantBuilder crtcs, modes, clones, properties;
|
||||||
|
@@ -360,7 +360,7 @@ create_pipewire_stream (MetaScreenCastStreamSrc *src,
|
|||||||
PW_DIRECTION_OUTPUT,
|
PW_DIRECTION_OUTPUT,
|
||||||
NULL,
|
NULL,
|
||||||
PW_STREAM_FLAG_NONE,
|
PW_STREAM_FLAG_NONE,
|
||||||
params, G_N_ELEMENTS (¶ms)) != 0)
|
params, G_N_ELEMENTS (params)) != 0)
|
||||||
{
|
{
|
||||||
g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
|
g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
|
||||||
"Could not connect");
|
"Could not connect");
|
||||||
|
@@ -33,6 +33,7 @@ typedef enum _MetaExperimentalFeature
|
|||||||
META_EXPERIMENTAL_FEATURE_SCALE_MONITOR_FRAMEBUFFER = (1 << 0),
|
META_EXPERIMENTAL_FEATURE_SCALE_MONITOR_FRAMEBUFFER = (1 << 0),
|
||||||
META_EXPERIMENTAL_FEATURE_SCREEN_CAST = (1 << 1),
|
META_EXPERIMENTAL_FEATURE_SCREEN_CAST = (1 << 1),
|
||||||
META_EXPERIMENTAL_FEATURE_REMOTE_DESKTOP = (1 << 2),
|
META_EXPERIMENTAL_FEATURE_REMOTE_DESKTOP = (1 << 2),
|
||||||
|
META_EXPERIMENTAL_FEATURE_KMS_MODIFIERS = (1 << 3),
|
||||||
} MetaExperimentalFeature;
|
} MetaExperimentalFeature;
|
||||||
|
|
||||||
#define META_TYPE_SETTINGS (meta_settings_get_type ())
|
#define META_TYPE_SETTINGS (meta_settings_get_type ())
|
||||||
|
@@ -267,6 +267,8 @@ experimental_features_handler (GVariant *features_variant,
|
|||||||
features |= META_EXPERIMENTAL_FEATURE_SCREEN_CAST;
|
features |= META_EXPERIMENTAL_FEATURE_SCREEN_CAST;
|
||||||
else if (g_str_equal (feature, "remote-desktop"))
|
else if (g_str_equal (feature, "remote-desktop"))
|
||||||
features |= META_EXPERIMENTAL_FEATURE_REMOTE_DESKTOP;
|
features |= META_EXPERIMENTAL_FEATURE_REMOTE_DESKTOP;
|
||||||
|
else if (g_str_equal (feature, "kms-modifiers"))
|
||||||
|
features |= META_EXPERIMENTAL_FEATURE_KMS_MODIFIERS;
|
||||||
else
|
else
|
||||||
g_info ("Unknown experimental feature '%s'\n", feature);
|
g_info ("Unknown experimental feature '%s'\n", feature);
|
||||||
}
|
}
|
||||||
|
@@ -291,9 +291,11 @@ update_monitor_crtc_cursor (MetaMonitor *monitor,
|
|||||||
data->in_cursor_renderer_native;
|
data->in_cursor_renderer_native;
|
||||||
MetaCursorRendererNativePrivate *priv =
|
MetaCursorRendererNativePrivate *priv =
|
||||||
meta_cursor_renderer_native_get_instance_private (cursor_renderer_native);
|
meta_cursor_renderer_native_get_instance_private (cursor_renderer_native);
|
||||||
|
MetaMonitorTransform transform;
|
||||||
ClutterRect scaled_crtc_rect;
|
ClutterRect scaled_crtc_rect;
|
||||||
float scale;
|
float scale;
|
||||||
int crtc_x, crtc_y;
|
int crtc_x, crtc_y;
|
||||||
|
int crtc_width, crtc_height;
|
||||||
|
|
||||||
if (meta_is_stage_views_scaled ())
|
if (meta_is_stage_views_scaled ())
|
||||||
scale = meta_logical_monitor_get_scale (data->in_logical_monitor);
|
scale = meta_logical_monitor_get_scale (data->in_logical_monitor);
|
||||||
@@ -305,14 +307,26 @@ update_monitor_crtc_cursor (MetaMonitor *monitor,
|
|||||||
META_MONITOR_TRANSFORM_NORMAL,
|
META_MONITOR_TRANSFORM_NORMAL,
|
||||||
&crtc_x, &crtc_y);
|
&crtc_x, &crtc_y);
|
||||||
|
|
||||||
|
transform = meta_logical_monitor_get_transform (data->in_logical_monitor);
|
||||||
|
if (meta_monitor_transform_is_rotated (transform))
|
||||||
|
{
|
||||||
|
crtc_width = monitor_crtc_mode->crtc_mode->height;
|
||||||
|
crtc_height = monitor_crtc_mode->crtc_mode->width;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
crtc_width = monitor_crtc_mode->crtc_mode->width;
|
||||||
|
crtc_height = monitor_crtc_mode->crtc_mode->height;
|
||||||
|
}
|
||||||
|
|
||||||
scaled_crtc_rect = (ClutterRect) {
|
scaled_crtc_rect = (ClutterRect) {
|
||||||
.origin = {
|
.origin = {
|
||||||
.x = crtc_x / scale,
|
.x = crtc_x / scale,
|
||||||
.y = crtc_y / scale
|
.y = crtc_y / scale
|
||||||
},
|
},
|
||||||
.size = {
|
.size = {
|
||||||
.width = monitor_crtc_mode->crtc_mode->width / scale,
|
.width = crtc_width / scale,
|
||||||
.height = monitor_crtc_mode->crtc_mode->height / scale
|
.height = crtc_height / scale
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@@ -64,6 +64,7 @@ struct _MetaGpuKms
|
|||||||
gboolean page_flips_not_supported;
|
gboolean page_flips_not_supported;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
G_DEFINE_QUARK (MetaGpuKmsError, meta_gpu_kms_error)
|
||||||
G_DEFINE_TYPE (MetaGpuKms, meta_gpu_kms, META_TYPE_GPU)
|
G_DEFINE_TYPE (MetaGpuKms, meta_gpu_kms, META_TYPE_GPU)
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
@@ -751,6 +752,8 @@ meta_gpu_kms_read_current (MetaGpu *gpu,
|
|||||||
are freed by the platform-independent layer. */
|
are freed by the platform-independent layer. */
|
||||||
free_resources (gpu_kms);
|
free_resources (gpu_kms);
|
||||||
|
|
||||||
|
g_assert (resources.resources->count_connectors > 0);
|
||||||
|
|
||||||
init_connectors (gpu_kms, resources.resources);
|
init_connectors (gpu_kms, resources.resources);
|
||||||
init_modes (gpu_kms, resources.resources);
|
init_modes (gpu_kms, resources.resources);
|
||||||
init_crtcs (gpu_kms, &resources);
|
init_crtcs (gpu_kms, &resources);
|
||||||
@@ -774,11 +777,39 @@ meta_gpu_kms_new (MetaMonitorManagerKms *monitor_manager_kms,
|
|||||||
GSource *source;
|
GSource *source;
|
||||||
MetaKmsSource *kms_source;
|
MetaKmsSource *kms_source;
|
||||||
MetaGpuKms *gpu_kms;
|
MetaGpuKms *gpu_kms;
|
||||||
|
drmModeRes *drm_resources;
|
||||||
|
guint n_connectors;
|
||||||
int kms_fd;
|
int kms_fd;
|
||||||
|
|
||||||
kms_fd = meta_launcher_open_restricted (launcher, kms_file_path, error);
|
kms_fd = meta_launcher_open_restricted (launcher, kms_file_path, error);
|
||||||
if (kms_fd == -1)
|
if (kms_fd == -1)
|
||||||
return FALSE;
|
return NULL;
|
||||||
|
|
||||||
|
/* Some GPUs might have no connectors, for example dedicated GPUs on PRIME (hybrid) laptops.
|
||||||
|
* These GPUs cannot render anything on separate screens, and they are aggressively switched
|
||||||
|
* off by the kernel.
|
||||||
|
*
|
||||||
|
* If we add these PRIME GPUs to the GPU list anyway, Mutter keeps awakening the secondary GPU,
|
||||||
|
* and doing this causes a considerable stuttering. These GPUs are usually put to sleep again
|
||||||
|
* after ~2s without a workload.
|
||||||
|
*
|
||||||
|
* For now, to avoid this situation, only create the MetaGpuKms when the GPU has any connectors.
|
||||||
|
*/
|
||||||
|
drm_resources = drmModeGetResources (kms_fd);
|
||||||
|
|
||||||
|
n_connectors = drm_resources->count_connectors;
|
||||||
|
|
||||||
|
drmModeFreeResources (drm_resources);
|
||||||
|
|
||||||
|
if (n_connectors == 0)
|
||||||
|
{
|
||||||
|
g_set_error (error,
|
||||||
|
META_GPU_KMS_ERROR,
|
||||||
|
META_GPU_KMS_ERROR_NO_CONNECTORS,
|
||||||
|
"No connectors available in this GPU. This is probably a dedicated GPU in a hybrid setup.");
|
||||||
|
meta_launcher_close_restricted (launcher, kms_fd);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
gpu_kms = g_object_new (META_TYPE_GPU_KMS,
|
gpu_kms = g_object_new (META_TYPE_GPU_KMS,
|
||||||
"monitor-manager", monitor_manager_kms,
|
"monitor-manager", monitor_manager_kms,
|
||||||
|
@@ -29,6 +29,14 @@
|
|||||||
#include "backends/meta-gpu.h"
|
#include "backends/meta-gpu.h"
|
||||||
#include "backends/native/meta-monitor-manager-kms.h"
|
#include "backends/native/meta-monitor-manager-kms.h"
|
||||||
|
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
META_GPU_KMS_ERROR_NO_CONNECTORS,
|
||||||
|
} MetaGpuKmsError;
|
||||||
|
|
||||||
|
#define META_GPU_KMS_ERROR (meta_gpu_kms_error_quark ())
|
||||||
|
GQuark meta_gpu_kms_error_quark (void);
|
||||||
|
|
||||||
#define META_TYPE_GPU_KMS (meta_gpu_kms_get_type ())
|
#define META_TYPE_GPU_KMS (meta_gpu_kms_get_type ())
|
||||||
G_DECLARE_FINAL_TYPE (MetaGpuKms, meta_gpu_kms, META, GPU_KMS, MetaGpu)
|
G_DECLARE_FINAL_TYPE (MetaGpuKms, meta_gpu_kms, META, GPU_KMS, MetaGpu)
|
||||||
|
|
||||||
|
@@ -674,16 +674,19 @@ meta_monitor_manager_kms_initable_init (GInitable *initable,
|
|||||||
gpu_paths = get_gpu_paths (manager_kms, GPU_TYPE_SECONDARY, primary_gpu_path);
|
gpu_paths = get_gpu_paths (manager_kms, GPU_TYPE_SECONDARY, primary_gpu_path);
|
||||||
for (l = gpu_paths; l; l = l->next)
|
for (l = gpu_paths; l; l = l->next)
|
||||||
{
|
{
|
||||||
GError *secondary_error = NULL;
|
g_autoptr (GError) secondary_error = NULL;
|
||||||
char *gpu_path = l->data;
|
char *gpu_path = l->data;
|
||||||
MetaGpuKms *gpu_kms;
|
MetaGpuKms *gpu_kms;
|
||||||
|
|
||||||
gpu_kms = meta_gpu_kms_new (manager_kms, gpu_path, &secondary_error);
|
gpu_kms = meta_gpu_kms_new (manager_kms, gpu_path, &secondary_error);
|
||||||
if (!gpu_kms)
|
if (!gpu_kms)
|
||||||
{
|
{
|
||||||
g_warning ("Failed to open secondary gpu '%s': %s",
|
if (g_error_matches (secondary_error, META_GPU_KMS_ERROR, META_GPU_KMS_ERROR_NO_CONNECTORS))
|
||||||
gpu_path, secondary_error->message);
|
g_message ("Ignoring GPU %s due to the lack of connectors", gpu_path);
|
||||||
g_error_free (secondary_error);
|
else
|
||||||
|
g_warning ("Failed to open secondary gpu '%s': %s", gpu_path, secondary_error->message);
|
||||||
|
|
||||||
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
meta_monitor_manager_add_gpu (META_MONITOR_MANAGER (manager_kms),
|
meta_monitor_manager_add_gpu (META_MONITOR_MANAGER (manager_kms),
|
||||||
|
@@ -193,6 +193,8 @@ struct _MetaRendererNative
|
|||||||
MetaMonitorManagerKms *monitor_manager_kms;
|
MetaMonitorManagerKms *monitor_manager_kms;
|
||||||
MetaGles3 *gles3;
|
MetaGles3 *gles3;
|
||||||
|
|
||||||
|
gboolean use_modifiers;
|
||||||
|
|
||||||
GHashTable *gpu_datas;
|
GHashTable *gpu_datas;
|
||||||
|
|
||||||
CoglClosure *swap_notify_idle;
|
CoglClosure *swap_notify_idle;
|
||||||
@@ -1586,6 +1588,7 @@ gbm_get_next_fb_id (MetaGpuKms *gpu_kms,
|
|||||||
struct gbm_bo **out_next_bo,
|
struct gbm_bo **out_next_bo,
|
||||||
uint32_t *out_next_fb_id)
|
uint32_t *out_next_fb_id)
|
||||||
{
|
{
|
||||||
|
MetaRendererNative *renderer_native = meta_renderer_native_from_gpu (gpu_kms);
|
||||||
struct gbm_bo *next_bo;
|
struct gbm_bo *next_bo;
|
||||||
uint32_t next_fb_id;
|
uint32_t next_fb_id;
|
||||||
int kms_fd;
|
int kms_fd;
|
||||||
@@ -1608,7 +1611,8 @@ gbm_get_next_fb_id (MetaGpuKms *gpu_kms,
|
|||||||
|
|
||||||
kms_fd = meta_gpu_kms_get_fd (gpu_kms);
|
kms_fd = meta_gpu_kms_get_fd (gpu_kms);
|
||||||
|
|
||||||
if (modifiers[0] != DRM_FORMAT_MOD_INVALID)
|
if (renderer_native->use_modifiers &&
|
||||||
|
modifiers[0] != DRM_FORMAT_MOD_INVALID)
|
||||||
{
|
{
|
||||||
if (drmModeAddFB2WithModifiers (kms_fd,
|
if (drmModeAddFB2WithModifiers (kms_fd,
|
||||||
gbm_bo_get_width (next_bo),
|
gbm_bo_get_width (next_bo),
|
||||||
@@ -1854,18 +1858,18 @@ meta_onscreen_native_swap_buffers_with_damage (CoglOnscreen *onscreen,
|
|||||||
frame_info = g_queue_peek_tail (&onscreen->pending_frame_infos);
|
frame_info = g_queue_peek_tail (&onscreen->pending_frame_infos);
|
||||||
frame_info->global_frame_counter = renderer_native->frame_counter;
|
frame_info->global_frame_counter = renderer_native->frame_counter;
|
||||||
|
|
||||||
/*
|
|
||||||
* Wait for the flip callback before continuing, as we might have started the
|
|
||||||
* animation earlier due to the animation being driven by some other monitor.
|
|
||||||
*/
|
|
||||||
wait_for_pending_flips (onscreen);
|
|
||||||
|
|
||||||
update_secondary_gpu_state_pre_swap_buffers (onscreen);
|
update_secondary_gpu_state_pre_swap_buffers (onscreen);
|
||||||
|
|
||||||
parent_vtable->onscreen_swap_buffers_with_damage (onscreen,
|
parent_vtable->onscreen_swap_buffers_with_damage (onscreen,
|
||||||
rectangles,
|
rectangles,
|
||||||
n_rectangles);
|
n_rectangles);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Wait for the flip callback before continuing, as we might have started the
|
||||||
|
* animation earlier due to the animation being driven by some other monitor.
|
||||||
|
*/
|
||||||
|
wait_for_pending_flips (onscreen);
|
||||||
|
|
||||||
renderer_gpu_data = meta_renderer_native_get_gpu_data (renderer_native,
|
renderer_gpu_data = meta_renderer_native_get_gpu_data (renderer_native,
|
||||||
render_gpu);
|
render_gpu);
|
||||||
switch (renderer_gpu_data->mode)
|
switch (renderer_gpu_data->mode)
|
||||||
@@ -1996,7 +2000,7 @@ meta_renderer_native_create_surface_gbm (CoglOnscreen *onscreen,
|
|||||||
CoglRenderer *cogl_renderer = cogl_display->renderer;
|
CoglRenderer *cogl_renderer = cogl_display->renderer;
|
||||||
CoglRendererEGL *cogl_renderer_egl = cogl_renderer->winsys;
|
CoglRendererEGL *cogl_renderer_egl = cogl_renderer->winsys;
|
||||||
MetaRendererNativeGpuData *renderer_gpu_data = cogl_renderer_egl->platform;
|
MetaRendererNativeGpuData *renderer_gpu_data = cogl_renderer_egl->platform;
|
||||||
struct gbm_surface *new_gbm_surface;
|
struct gbm_surface *new_gbm_surface = NULL;
|
||||||
EGLNativeWindowType egl_native_window;
|
EGLNativeWindowType egl_native_window;
|
||||||
EGLSurface new_egl_surface;
|
EGLSurface new_egl_surface;
|
||||||
uint32_t format = GBM_FORMAT_XRGB8888;
|
uint32_t format = GBM_FORMAT_XRGB8888;
|
||||||
@@ -2006,7 +2010,10 @@ meta_renderer_native_create_surface_gbm (CoglOnscreen *onscreen,
|
|||||||
meta_renderer_native_get_gpu_data (renderer_native,
|
meta_renderer_native_get_gpu_data (renderer_native,
|
||||||
onscreen_native->render_gpu);
|
onscreen_native->render_gpu);
|
||||||
|
|
||||||
|
if (renderer_native->use_modifiers)
|
||||||
modifiers = get_supported_modifiers (onscreen, format);
|
modifiers = get_supported_modifiers (onscreen, format);
|
||||||
|
else
|
||||||
|
modifiers = NULL;
|
||||||
|
|
||||||
if (modifiers)
|
if (modifiers)
|
||||||
{
|
{
|
||||||
@@ -2017,7 +2024,8 @@ meta_renderer_native_create_surface_gbm (CoglOnscreen *onscreen,
|
|||||||
modifiers->len);
|
modifiers->len);
|
||||||
g_array_free (modifiers, TRUE);
|
g_array_free (modifiers, TRUE);
|
||||||
}
|
}
|
||||||
else
|
|
||||||
|
if (!new_gbm_surface)
|
||||||
{
|
{
|
||||||
uint32_t flags = GBM_BO_USE_SCANOUT | GBM_BO_USE_RENDERING;
|
uint32_t flags = GBM_BO_USE_SCANOUT | GBM_BO_USE_RENDERING;
|
||||||
|
|
||||||
@@ -3389,6 +3397,22 @@ meta_renderer_native_finalize (GObject *object)
|
|||||||
G_OBJECT_CLASS (meta_renderer_native_parent_class)->finalize (object);
|
G_OBJECT_CLASS (meta_renderer_native_parent_class)->finalize (object);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
meta_renderer_native_constructed (GObject *object)
|
||||||
|
{
|
||||||
|
MetaRendererNative *renderer_native = META_RENDERER_NATIVE (object);
|
||||||
|
MetaMonitorManager *monitor_manager =
|
||||||
|
META_MONITOR_MANAGER (renderer_native->monitor_manager_kms);
|
||||||
|
MetaBackend *backend = meta_monitor_manager_get_backend (monitor_manager);
|
||||||
|
MetaSettings *settings = meta_backend_get_settings (backend);
|
||||||
|
|
||||||
|
if (meta_settings_is_experimental_feature_enabled (
|
||||||
|
settings, META_EXPERIMENTAL_FEATURE_KMS_MODIFIERS))
|
||||||
|
renderer_native->use_modifiers = TRUE;
|
||||||
|
|
||||||
|
G_OBJECT_CLASS (meta_renderer_native_parent_class)->constructed (object);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
meta_renderer_native_init (MetaRendererNative *renderer_native)
|
meta_renderer_native_init (MetaRendererNative *renderer_native)
|
||||||
{
|
{
|
||||||
@@ -3407,6 +3431,7 @@ meta_renderer_native_class_init (MetaRendererNativeClass *klass)
|
|||||||
object_class->get_property = meta_renderer_native_get_property;
|
object_class->get_property = meta_renderer_native_get_property;
|
||||||
object_class->set_property = meta_renderer_native_set_property;
|
object_class->set_property = meta_renderer_native_set_property;
|
||||||
object_class->finalize = meta_renderer_native_finalize;
|
object_class->finalize = meta_renderer_native_finalize;
|
||||||
|
object_class->constructed = meta_renderer_native_constructed;
|
||||||
|
|
||||||
renderer_class->create_cogl_renderer = meta_renderer_native_create_cogl_renderer;
|
renderer_class->create_cogl_renderer = meta_renderer_native_create_cogl_renderer;
|
||||||
renderer_class->create_view = meta_renderer_native_create_view;
|
renderer_class->create_view = meta_renderer_native_create_view;
|
||||||
|
@@ -5268,7 +5268,7 @@ static cairo_surface_t *
|
|||||||
load_default_window_icon (int size)
|
load_default_window_icon (int size)
|
||||||
{
|
{
|
||||||
GtkIconTheme *theme = gtk_icon_theme_get_default ();
|
GtkIconTheme *theme = gtk_icon_theme_get_default ();
|
||||||
GdkPixbuf *pixbuf;
|
g_autoptr (GdkPixbuf) pixbuf = NULL;
|
||||||
const char *icon_name;
|
const char *icon_name;
|
||||||
|
|
||||||
if (gtk_icon_theme_has_icon (theme, META_DEFAULT_ICON_NAME))
|
if (gtk_icon_theme_has_icon (theme, META_DEFAULT_ICON_NAME))
|
||||||
|
@@ -580,7 +580,7 @@ meta_frame_layout_calc_geometry (MetaFrameLayout *layout,
|
|||||||
x = rect->visible.x - layout->button_margin.left * scale;
|
x = rect->visible.x - layout->button_margin.left * scale;
|
||||||
|
|
||||||
if (i > 0)
|
if (i > 0)
|
||||||
x -= layout->titlebar_spacing;
|
x -= layout->titlebar_spacing * scale;
|
||||||
|
|
||||||
--i;
|
--i;
|
||||||
}
|
}
|
||||||
@@ -712,6 +712,8 @@ get_class_from_button_type (MetaButtonType type)
|
|||||||
return "maximize";
|
return "maximize";
|
||||||
case META_BUTTON_TYPE_MINIMIZE:
|
case META_BUTTON_TYPE_MINIMIZE:
|
||||||
return "minimize";
|
return "minimize";
|
||||||
|
case META_BUTTON_TYPE_APPMENU:
|
||||||
|
return "appmenu";
|
||||||
default:
|
default:
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
@@ -392,6 +392,7 @@ pending_state_init (MetaWaylandPendingState *state)
|
|||||||
{
|
{
|
||||||
state->newly_attached = FALSE;
|
state->newly_attached = FALSE;
|
||||||
state->buffer = NULL;
|
state->buffer = NULL;
|
||||||
|
state->buffer_destroy_handler_id = 0;
|
||||||
state->dx = 0;
|
state->dx = 0;
|
||||||
state->dy = 0;
|
state->dy = 0;
|
||||||
state->scale = 0;
|
state->scale = 0;
|
||||||
@@ -421,8 +422,11 @@ pending_state_destroy (MetaWaylandPendingState *state)
|
|||||||
g_clear_pointer (&state->opaque_region, cairo_region_destroy);
|
g_clear_pointer (&state->opaque_region, cairo_region_destroy);
|
||||||
|
|
||||||
if (state->buffer)
|
if (state->buffer)
|
||||||
|
{
|
||||||
g_signal_handler_disconnect (state->buffer,
|
g_signal_handler_disconnect (state->buffer,
|
||||||
state->buffer_destroy_handler_id);
|
state->buffer_destroy_handler_id);
|
||||||
|
state->buffer_destroy_handler_id = 0;
|
||||||
|
}
|
||||||
wl_list_for_each_safe (cb, next, &state->frame_callback_list, link)
|
wl_list_for_each_safe (cb, next, &state->frame_callback_list, link)
|
||||||
wl_resource_destroy (cb->resource);
|
wl_resource_destroy (cb->resource);
|
||||||
}
|
}
|
||||||
@@ -435,36 +439,85 @@ pending_state_reset (MetaWaylandPendingState *state)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
move_pending_state (MetaWaylandPendingState *from,
|
merge_pending_state (MetaWaylandPendingState *from,
|
||||||
MetaWaylandPendingState *to)
|
MetaWaylandPendingState *to)
|
||||||
{
|
{
|
||||||
if (from->buffer)
|
if (from->newly_attached)
|
||||||
g_signal_handler_disconnect (from->buffer, from->buffer_destroy_handler_id);
|
{
|
||||||
|
if (to->buffer)
|
||||||
|
{
|
||||||
|
g_signal_handler_disconnect (to->buffer,
|
||||||
|
to->buffer_destroy_handler_id);
|
||||||
|
to->buffer_destroy_handler_id = 0;
|
||||||
|
}
|
||||||
|
|
||||||
to->newly_attached = from->newly_attached;
|
if (from->buffer)
|
||||||
|
{
|
||||||
|
g_signal_handler_disconnect (from->buffer,
|
||||||
|
from->buffer_destroy_handler_id);
|
||||||
|
from->buffer_destroy_handler_id = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
to->newly_attached = TRUE;
|
||||||
to->buffer = from->buffer;
|
to->buffer = from->buffer;
|
||||||
to->dx = from->dx;
|
to->dx = from->dx;
|
||||||
to->dy = from->dy;
|
to->dy = from->dy;
|
||||||
to->scale = from->scale;
|
}
|
||||||
to->surface_damage = from->surface_damage;
|
|
||||||
to->buffer_damage = from->buffer_damage;
|
|
||||||
to->input_region = from->input_region;
|
|
||||||
to->input_region_set = from->input_region_set;
|
|
||||||
to->opaque_region = from->opaque_region;
|
|
||||||
to->opaque_region_set = from->opaque_region_set;
|
|
||||||
to->new_geometry = from->new_geometry;
|
|
||||||
to->has_new_geometry = from->has_new_geometry;
|
|
||||||
to->has_new_min_size = from->has_new_min_size;
|
|
||||||
to->new_min_width = from->new_min_width;
|
|
||||||
to->new_min_height = from->new_min_height;
|
|
||||||
to->has_new_max_size = from->has_new_max_size;
|
|
||||||
to->new_max_width = from->new_max_width;
|
|
||||||
to->new_max_height = from->new_max_height;
|
|
||||||
|
|
||||||
wl_list_init (&to->frame_callback_list);
|
wl_list_init (&to->frame_callback_list);
|
||||||
wl_list_insert_list (&to->frame_callback_list, &from->frame_callback_list);
|
wl_list_insert_list (&to->frame_callback_list, &from->frame_callback_list);
|
||||||
|
|
||||||
if (to->buffer)
|
cairo_region_union (to->surface_damage, from->surface_damage);
|
||||||
|
cairo_region_union (to->buffer_damage, from->buffer_damage);
|
||||||
|
cairo_region_destroy (from->surface_damage);
|
||||||
|
cairo_region_destroy (from->buffer_damage);
|
||||||
|
|
||||||
|
if (from->input_region_set)
|
||||||
|
{
|
||||||
|
if (to->input_region)
|
||||||
|
cairo_region_union (to->input_region, from->input_region);
|
||||||
|
else
|
||||||
|
to->input_region = cairo_region_reference (from->input_region);
|
||||||
|
|
||||||
|
to->input_region_set = TRUE;
|
||||||
|
cairo_region_destroy (from->input_region);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (from->opaque_region_set)
|
||||||
|
{
|
||||||
|
if (to->opaque_region)
|
||||||
|
cairo_region_union (to->opaque_region, from->opaque_region);
|
||||||
|
else
|
||||||
|
to->opaque_region = cairo_region_reference (from->opaque_region);
|
||||||
|
|
||||||
|
to->opaque_region_set = TRUE;
|
||||||
|
cairo_region_destroy (from->opaque_region);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (from->has_new_geometry)
|
||||||
|
{
|
||||||
|
to->new_geometry = from->new_geometry;
|
||||||
|
to->has_new_geometry = TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (from->has_new_min_size)
|
||||||
|
{
|
||||||
|
to->new_min_width = from->new_min_width;
|
||||||
|
to->new_min_height = from->new_min_height;
|
||||||
|
to->has_new_min_size = TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (from->has_new_max_size)
|
||||||
|
{
|
||||||
|
to->new_max_width = from->new_max_width;
|
||||||
|
to->new_max_height = from->new_max_height;
|
||||||
|
to->has_new_max_size = TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (from->scale > 0)
|
||||||
|
to->scale = from->scale;
|
||||||
|
|
||||||
|
if (to->buffer && to->buffer_destroy_handler_id == 0)
|
||||||
{
|
{
|
||||||
to->buffer_destroy_handler_id =
|
to->buffer_destroy_handler_id =
|
||||||
g_signal_connect (to->buffer, "resource-destroyed",
|
g_signal_connect (to->buffer, "resource-destroyed",
|
||||||
@@ -712,7 +765,7 @@ meta_wayland_surface_commit (MetaWaylandSurface *surface)
|
|||||||
* surface is in effective desynchronized mode.
|
* surface is in effective desynchronized mode.
|
||||||
*/
|
*/
|
||||||
if (meta_wayland_surface_is_effectively_synchronized (surface))
|
if (meta_wayland_surface_is_effectively_synchronized (surface))
|
||||||
move_pending_state (surface->pending, surface->sub.pending);
|
merge_pending_state (surface->pending, surface->sub.pending);
|
||||||
else
|
else
|
||||||
meta_wayland_surface_apply_pending_state (surface, surface->pending);
|
meta_wayland_surface_apply_pending_state (surface, surface->pending);
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user