Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found
Select Git revision

Target

Select target project
  • chunyiwu22/mutter
  • biebl/mutter
  • XavCC/mutter
  • mwei/mutter
  • jak/mutter
  • nteodosio/mutter
  • tchavadar/mutter
  • aleasto/mutter
  • redeast_cn/mutter
  • zeha/mutter
  • jbicha/mutter
  • ubuntu-desktop-helper/mutter
  • jardon/mutter
  • zoopgoop/mutter
  • zsien/mutter
  • ycheng-guest/mutter
  • khfeng/mutter
  • andrunko-guest/mutter
  • gnome-team/mutter
  • 3v1n0/mutter
  • vanvugt/mutter
  • azzar1-guest/mutter
  • vicamo-guest/mutter
  • arnaudr/mutter
  • laney/mutter
25 results
Select Git revision
Show changes
Commits on Source (23)
Showing
with 593 additions and 425 deletions
40.4
====
* Don't require a newly attached buffer to apply state [Christian, Jonas; !1795]
* Fix upside-down Xshape surface with EGLstream [Robert; !1937]
* Misc. bug fixes and cleanups [Jonas; !1942, !1912]
Contributors:
Robert Mader, Christian Rauch, Jonas Ådahl
Translators:
Marek Černocký [cs]
40.3
====
* Fix area screencasts when window is unredirected [Michel; #1707]
* Fix mapping tablet to monitor [Christoph; #1712]
* Fixed crash [Jonas; !1910]
* Misc. bug fixes [Jonas, Carlos; !1911, !1920]
Contributors:
Jonas Ådahl, Michel Dänzer, Carlos Garnacho, Christoph Trassl
Translators:
Dušan Kazik [sk], Chao-Hsiung Liao [zh_TW]
40.2.1
======
* Fixed crash [Jonas; !1895]
......
......@@ -1551,29 +1551,29 @@ clutter_layer_node_new (const graphene_matrix_t *projection,
float height,
guint8 opacity)
{
ClutterLayerNode *res;
ClutterLayerNode *lnode;
CoglContext *context;
CoglTexture2D *tex_2d;
CoglTexture *texture;
CoglColor color;
CoglOffscreen *offscreen;
g_autoptr (CoglOffscreen) offscreen = NULL;
g_autoptr (GError) error = NULL;
res = _clutter_paint_node_create (CLUTTER_TYPE_LAYER_NODE);
lnode = _clutter_paint_node_create (CLUTTER_TYPE_LAYER_NODE);
res->needs_fbo_setup = TRUE;
res->projection = *projection;
res->viewport = *viewport;
res->fbo_width = width;
res->fbo_height = height;
res->opacity = opacity;
lnode->needs_fbo_setup = TRUE;
lnode->projection = *projection;
lnode->viewport = *viewport;
lnode->fbo_width = width;
lnode->fbo_height = height;
lnode->opacity = opacity;
/* the texture backing the FBO */
context = clutter_backend_get_cogl_context (clutter_get_default_backend ());
tex_2d = cogl_texture_2d_new_with_size (context,
MAX (res->fbo_width, 1),
MAX (res->fbo_height, 1));
MAX (lnode->fbo_width, 1),
MAX (lnode->fbo_height, 1));
texture = COGL_TEXTURE (tex_2d);
cogl_texture_set_premultiplied (texture, TRUE);
......@@ -1582,11 +1582,11 @@ clutter_layer_node_new (const graphene_matrix_t *projection,
{
g_warning ("Unable to create an allocate paint node offscreen: %s",
error->message);
g_object_unref (offscreen);
goto out;
cogl_object_unref (texture);
return NULL;
}
res->offscreen = COGL_FRAMEBUFFER (offscreen);
lnode->offscreen = COGL_FRAMEBUFFER (g_steal_pointer (&offscreen));
cogl_color_init_from_4ub (&color, opacity, opacity, opacity, opacity);
......@@ -1594,17 +1594,16 @@ clutter_layer_node_new (const graphene_matrix_t *projection,
* interpolation filters because the texture is always
* going to be painted at a 1:1 texel:pixel ratio
*/
res->pipeline = cogl_pipeline_copy (default_texture_pipeline);
cogl_pipeline_set_layer_filters (res->pipeline, 0,
lnode->pipeline = cogl_pipeline_copy (default_texture_pipeline);
cogl_pipeline_set_layer_filters (lnode->pipeline, 0,
COGL_PIPELINE_FILTER_NEAREST,
COGL_PIPELINE_FILTER_NEAREST);
cogl_pipeline_set_layer_texture (res->pipeline, 0, texture);
cogl_pipeline_set_color (res->pipeline, &color);
cogl_pipeline_set_layer_texture (lnode->pipeline, 0, texture);
cogl_pipeline_set_color (lnode->pipeline, &color);
out:
cogl_object_unref (texture);
return (ClutterPaintNode *) res;
return (ClutterPaintNode *) lnode;
}
/**
......
project('mutter', 'c',
version: '40.2.1',
version: '40.4',
meson_version: '>= 0.51.0',
license: 'GPLv2+'
)
......
......@@ -10,10 +10,10 @@
#
msgid ""
msgstr ""
"Project-Id-Version: mutter\n"
"Project-Id-Version: mutter gnome-40\n"
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/mutter/issues\n"
"POT-Creation-Date: 2021-03-12 15:44+0000\n"
"PO-Revision-Date: 2021-03-13 11:52+0100\n"
"POT-Creation-Date: 2021-07-29 13:30+0000\n"
"PO-Revision-Date: 2021-08-08 20:31+0200\n"
"Last-Translator: Marek Černocký <marek@manet.cz>\n"
"Language-Team: čeština <gnome-cs-list@gnome.org>\n"
"Language: cs\n"
......@@ -56,110 +56,126 @@ msgstr "Přesunout okno o jednu pracovní plochu doleva"
msgid "Move window one workspace to the right"
msgstr "Přesunout okno o jednu pracovní plochu doprava"
#: data/50-mutter-navigation.xml:30
#: data/50-mutter-navigation.xml:31
msgid "Move window one workspace up"
msgstr "Přesunout okno o jednu pracovní plochu výš"
#: data/50-mutter-navigation.xml:35
msgid "Move window one workspace down"
msgstr "Přesunout okno o jednu pracovní plochu níž"
#: data/50-mutter-navigation.xml:38
msgid "Move window one monitor to the left"
msgstr "Přesunout okno o jeden monitor doleva"
#: data/50-mutter-navigation.xml:33
#: data/50-mutter-navigation.xml:41
msgid "Move window one monitor to the right"
msgstr "Přesunout okno o jeden monitor doprava"
#: data/50-mutter-navigation.xml:36
#: data/50-mutter-navigation.xml:44
msgid "Move window one monitor up"
msgstr "Přesunout okno o jeden monitor nahoru"
#: data/50-mutter-navigation.xml:39
#: data/50-mutter-navigation.xml:47
msgid "Move window one monitor down"
msgstr "Přesunout okno o jeden monitor dolů"
#: data/50-mutter-navigation.xml:43
#: data/50-mutter-navigation.xml:51
msgid "Switch applications"
msgstr "Přepnout do jiné aplikace"
#: data/50-mutter-navigation.xml:48
#: data/50-mutter-navigation.xml:56
msgid "Switch to previous application"
msgstr "Přepnout do předchozí aplikaci"
#: data/50-mutter-navigation.xml:52
#: data/50-mutter-navigation.xml:60
msgid "Switch windows"
msgstr "Přepnout do jiného okna"
#: data/50-mutter-navigation.xml:57
#: data/50-mutter-navigation.xml:65
msgid "Switch to previous window"
msgstr "Přepnout do minulého okna"
#: data/50-mutter-navigation.xml:61
#: data/50-mutter-navigation.xml:69
msgid "Switch windows of an application"
msgstr "Přepnout do jiného okna aplikace"
#: data/50-mutter-navigation.xml:66
#: data/50-mutter-navigation.xml:74
msgid "Switch to previous window of an application"
msgstr "Přepnout do předchozího okna aplikace"
#: data/50-mutter-navigation.xml:70
#: data/50-mutter-navigation.xml:78
msgid "Switch system controls"
msgstr "Přepnout na systémový ovládací prvek"
#: data/50-mutter-navigation.xml:75
#: data/50-mutter-navigation.xml:83
msgid "Switch to previous system control"
msgstr "Přepnout na minulý systémový ovládací prvek"
#: data/50-mutter-navigation.xml:79
#: data/50-mutter-navigation.xml:87
msgid "Switch windows directly"
msgstr "Přepnout přímo do okna"
#: data/50-mutter-navigation.xml:84
#: data/50-mutter-navigation.xml:92
msgid "Switch directly to previous window"
msgstr "Přepnout přímo do předchozího okna"
#: data/50-mutter-navigation.xml:88
#: data/50-mutter-navigation.xml:96
msgid "Switch windows of an app directly"
msgstr "Přepnout přímo do jiného okna aplikace"
#: data/50-mutter-navigation.xml:93
#: data/50-mutter-navigation.xml:101
msgid "Switch directly to previous window of an app"
msgstr "Přepnout přímo do předchozího okna aplikace"
#: data/50-mutter-navigation.xml:97
#: data/50-mutter-navigation.xml:105
msgid "Switch system controls directly"
msgstr "Přepnout přímo na systémový ovládací prvek"
#: data/50-mutter-navigation.xml:102
#: data/50-mutter-navigation.xml:110
msgid "Switch directly to previous system control"
msgstr "Přepnout přímo na předchozí systémový ovládací prvek"
#: data/50-mutter-navigation.xml:105
#: data/50-mutter-navigation.xml:113
msgid "Hide all normal windows"
msgstr "Skrýt všechna běžná okna"
#: data/50-mutter-navigation.xml:108
#: data/50-mutter-navigation.xml:116
msgid "Switch to workspace 1"
msgstr "Přepnout na pracovní plochu 1"
#: data/50-mutter-navigation.xml:111
#: data/50-mutter-navigation.xml:119
msgid "Switch to workspace 2"
msgstr "Přepnout na pracovní plochu 2"
#: data/50-mutter-navigation.xml:114
#: data/50-mutter-navigation.xml:122
msgid "Switch to workspace 3"
msgstr "Přepnout na pracovní plochu 3"
#: data/50-mutter-navigation.xml:117
#: data/50-mutter-navigation.xml:125
msgid "Switch to workspace 4"
msgstr "Přepnout na pracovní plochu 4"
#: data/50-mutter-navigation.xml:120
#: data/50-mutter-navigation.xml:128
msgid "Switch to last workspace"
msgstr "Přepnout na poslední pracovní plochu"
#: data/50-mutter-navigation.xml:123
#: data/50-mutter-navigation.xml:131
msgid "Move to workspace on the left"
msgstr "Přepnout na pracovní plochu vlevo"
#: data/50-mutter-navigation.xml:126
#: data/50-mutter-navigation.xml:134
msgid "Move to workspace on the right"
msgstr "Přepnout na pracovní plochu vpravo"
#: data/50-mutter-navigation.xml:138
msgid "Move to workspace above"
msgstr "Přepnout na pracovní plochu nad"
#: data/50-mutter-navigation.xml:142
msgid "Move to workspace below"
msgstr "Přepnout na pracovní plochu pod"
#: data/50-mutter-system.xml:6 data/50-mutter-wayland.xml:6
msgid "System"
msgstr "Systém"
......@@ -710,7 +726,7 @@ msgstr "_Počkat"
#. TRANSLATORS: This string refers to a button that switches between
#. * different modes.
#.
#: src/core/meta-pad-action-mapper.c:780
#: src/core/meta-pad-action-mapper.c:782
#, c-format
msgid "Mode Switch (Group %d)"
msgstr "Přepínač režimu (skupina %d)"
......@@ -718,11 +734,11 @@ msgstr "Přepínač režimu (skupina %d)"
#. TRANSLATORS: This string refers to an action, cycles drawing tablets'
#. * mapping through the available outputs.
#.
#: src/core/meta-pad-action-mapper.c:803
#: src/core/meta-pad-action-mapper.c:805
msgid "Switch monitor"
msgstr "Přepnout monitor"
#: src/core/meta-pad-action-mapper.c:805
#: src/core/meta-pad-action-mapper.c:807
msgid "Show on-screen help"
msgstr "Zobrazit nápovědu na obrazovce"
......
This diff is collapsed.
This diff is collapsed.
......@@ -116,6 +116,9 @@ enum
static guint signals[N_SIGNALS] = { 0, };
static void mapper_output_info_remove_input (MetaMapperOutputInfo *output,
MetaMapperInputInfo *input);
static void mapper_recalculate_input (MetaInputMapper *mapper,
MetaMapperInputInfo *input);
......@@ -166,6 +169,9 @@ settings_output_changed_cb (GSettings *settings,
const char *key,
MetaMapperInputInfo *info)
{
if (info->output != NULL)
mapper_output_info_remove_input (info->output, info);
mapper_recalculate_input (info->mapper, info);
}
......@@ -492,10 +498,6 @@ guess_candidates (MetaInputMapper *mapper,
{
flags = libwacom_get_integration_flags (wacom_device);
if ((flags & (WACOM_DEVICE_INTEGRATED_SYSTEM |
WACOM_DEVICE_INTEGRATED_DISPLAY)) == 0)
return;
integrated = (flags & (WACOM_DEVICE_INTEGRATED_SYSTEM |
WACOM_DEVICE_INTEGRATED_DISPLAY)) != 0;
builtin = (flags & WACOM_DEVICE_INTEGRATED_SYSTEM) != 0;
......
......@@ -231,6 +231,25 @@ maybe_record_frame_on_idle (gpointer user_data)
return G_SOURCE_REMOVE;
}
static void
before_stage_painted (MetaStage *stage,
ClutterStageView *view,
ClutterPaintContext *paint_context,
gpointer user_data)
{
MetaScreenCastAreaStreamSrc *area_src =
META_SCREEN_CAST_AREA_STREAM_SRC (user_data);
MetaScreenCastStreamSrc *src = META_SCREEN_CAST_STREAM_SRC (area_src);
if (area_src->maybe_record_idle_id)
return;
if (!clutter_stage_view_peek_scanout (view))
return;
area_src->maybe_record_idle_id = g_idle_add (maybe_record_frame_on_idle, src);
}
static void
stage_painted (MetaStage *stage,
ClutterStageView *view,
......@@ -267,8 +286,7 @@ stage_painted (MetaStage *stage,
}
static void
add_view_painted_watches (MetaScreenCastAreaStreamSrc *area_src,
MetaStageWatchPhase watch_phase)
add_view_painted_watches (MetaScreenCastAreaStreamSrc *area_src)
{
MetaScreenCastStreamSrc *src = META_SCREEN_CAST_STREAM_SRC (area_src);
MetaScreenCastStream *stream = meta_screen_cast_stream_src_get_stream (src);
......@@ -296,7 +314,15 @@ add_view_painted_watches (MetaScreenCastAreaStreamSrc *area_src,
watch = meta_stage_watch_view (meta_stage,
CLUTTER_STAGE_VIEW (view),
watch_phase,
META_STAGE_WATCH_BEFORE_PAINT,
before_stage_painted,
area_src);
area_src->watches = g_list_prepend (area_src->watches, watch);
watch = meta_stage_watch_view (meta_stage,
CLUTTER_STAGE_VIEW (view),
META_STAGE_WATCH_AFTER_ACTOR_PAINT,
stage_painted,
area_src);
......@@ -316,8 +342,7 @@ on_monitors_changed (MetaMonitorManager *monitor_manager,
meta_stage_remove_watch (stage, l->data);
g_clear_pointer (&area_src->watches, g_list_free);
add_view_painted_watches (area_src,
META_STAGE_WATCH_AFTER_ACTOR_PAINT);
add_view_painted_watches (area_src);
}
static void
......@@ -349,14 +374,12 @@ meta_screen_cast_area_stream_src_enable (MetaScreenCastStreamSrc *src)
meta_cursor_tracker_track_position (cursor_tracker);
G_GNUC_FALLTHROUGH;
case META_SCREEN_CAST_CURSOR_MODE_HIDDEN:
add_view_painted_watches (area_src,
META_STAGE_WATCH_AFTER_ACTOR_PAINT);
add_view_painted_watches (area_src);
break;
case META_SCREEN_CAST_CURSOR_MODE_EMBEDDED:
inhibit_hw_cursor (area_src);
meta_cursor_tracker_track_position (cursor_tracker);
add_view_painted_watches (area_src,
META_STAGE_WATCH_AFTER_ACTOR_PAINT);
add_view_painted_watches (area_src);
break;
}
......
......@@ -161,7 +161,7 @@ meta_input_device_native_get_group_n_modes (ClutterInputDevice *device,
{
MetaInputDeviceNative *device_native = META_INPUT_DEVICE_NATIVE (device);
if (!device_native->modes || group < device_native->modes->len)
if (!device_native->modes || group >= device_native->modes->len)
return -1;
return g_array_index (device_native->modes, int, group);
......
......@@ -849,7 +849,8 @@ process_power_save (MetaKmsImplDevice *impl_device,
static MetaKmsFeedback *
meta_kms_impl_device_atomic_process_update (MetaKmsImplDevice *impl_device,
MetaKmsUpdate *update)
MetaKmsUpdate *update,
MetaKmsUpdateFlag flags)
{
GError *error = NULL;
GList *failed_planes = NULL;
......@@ -973,14 +974,17 @@ commit:
err:
meta_topic (META_DEBUG_KMS, "[atomic] KMS update failed: %s", error->message);
process_entries (impl_device,
update,
req,
blob_ids,
meta_kms_update_get_page_flip_listeners (update),
error,
discard_page_flip_listener,
NULL);
if (!(flags & META_KMS_UPDATE_FLAG_PRESERVE_ON_ERROR))
{
process_entries (impl_device,
update,
req,
blob_ids,
meta_kms_update_get_page_flip_listeners (update),
error,
discard_page_flip_listener,
NULL);
}
release_blob_ids (impl_device, blob_ids);
......
......@@ -1085,6 +1085,7 @@ static gboolean
maybe_dispatch_page_flips (MetaKmsImplDevice *impl_device,
MetaKmsUpdate *update,
GList **failed_planes,
MetaKmsUpdateFlag flags,
GError **error)
{
g_autoptr (GList) page_flip_datas = NULL;
......@@ -1122,7 +1123,8 @@ maybe_dispatch_page_flips (MetaKmsImplDevice *impl_device,
*failed_planes = g_list_prepend (*failed_planes, plane_feedback);
}
meta_kms_page_flip_data_discard_in_impl (page_flip_data, *error);
if (!(flags & META_KMS_UPDATE_FLAG_PRESERVE_ON_ERROR))
meta_kms_page_flip_data_discard_in_impl (page_flip_data, *error);
goto err;
}
......@@ -1131,11 +1133,14 @@ maybe_dispatch_page_flips (MetaKmsImplDevice *impl_device,
return TRUE;
err:
for (l = page_flip_datas; l; l = l->next)
if (!(flags & META_KMS_UPDATE_FLAG_PRESERVE_ON_ERROR))
{
MetaKmsPageFlipData *page_flip_data = l->data;
for (l = page_flip_datas; l; l = l->next)
{
MetaKmsPageFlipData *page_flip_data = l->data;
meta_kms_page_flip_data_discard_in_impl (page_flip_data, *error);
meta_kms_page_flip_data_discard_in_impl (page_flip_data, *error);
}
}
g_list_free (page_flip_datas);
......@@ -1375,7 +1380,8 @@ meta_kms_impl_device_simple_setup_drm_event_context (MetaKmsImplDevice *impl_dev
static MetaKmsFeedback *
meta_kms_impl_device_simple_process_update (MetaKmsImplDevice *impl_device,
MetaKmsUpdate *update)
MetaKmsUpdate *update,
MetaKmsUpdateFlag flags)
{
GError *error = NULL;
GList *failed_planes = NULL;
......@@ -1415,7 +1421,8 @@ meta_kms_impl_device_simple_process_update (MetaKmsImplDevice *impl_device,
if (!process_plane_assignments (impl_device, update, &failed_planes, &error))
goto err;
if (!maybe_dispatch_page_flips (impl_device, update, &failed_planes, &error))
if (!maybe_dispatch_page_flips (impl_device, update, &failed_planes, flags,
&error))
goto err;
out:
......@@ -1496,7 +1503,7 @@ meta_kms_impl_device_simple_prepare_shutdown (MetaKmsImplDevice *impl_device)
g_list_foreach (impl_device_simple->posted_page_flip_datas,
(GFunc) meta_kms_page_flip_data_discard_in_impl,
impl_device);
NULL);
g_clear_list (&impl_device_simple->posted_page_flip_datas, NULL);
}
......
......@@ -651,11 +651,12 @@ meta_kms_impl_device_leak_fd (MetaKmsImplDevice *impl_device)
MetaKmsFeedback *
meta_kms_impl_device_process_update (MetaKmsImplDevice *impl_device,
MetaKmsUpdate *update)
MetaKmsUpdate *update,
MetaKmsUpdateFlag flags)
{
MetaKmsImplDeviceClass *klass = META_KMS_IMPL_DEVICE_GET_CLASS (impl_device);
return klass->process_update (impl_device, update);
return klass->process_update (impl_device, update, flags);
}
void
......
......@@ -29,6 +29,7 @@
#include "backends/native/meta-kms-page-flip-private.h"
#include "backends/native/meta-kms-types.h"
#include "backends/native/meta-kms-update.h"
#include "backends/native/meta-kms.h"
typedef struct _MetaKmsDeviceCaps
{
......@@ -64,7 +65,8 @@ struct _MetaKmsImplDeviceClass
void (* setup_drm_event_context) (MetaKmsImplDevice *impl_device,
drmEventContext *drm_event_context);
MetaKmsFeedback * (* process_update) (MetaKmsImplDevice *impl_device,
MetaKmsUpdate *update);
MetaKmsUpdate *update,
MetaKmsUpdateFlag flags);
void (* handle_page_flip_callback) (MetaKmsImplDevice *impl_device,
MetaKmsPageFlipData *page_flip_data);
void (* discard_pending_page_flips) (MetaKmsImplDevice *impl_device);
......@@ -132,7 +134,8 @@ void meta_kms_impl_device_reload_prop_values (MetaKmsImplDevice *impl_device,
...);
MetaKmsFeedback * meta_kms_impl_device_process_update (MetaKmsImplDevice *impl_device,
MetaKmsUpdate *update);
MetaKmsUpdate *update,
MetaKmsUpdateFlag flags);
void meta_kms_impl_device_handle_page_flip_callback (MetaKmsImplDevice *impl_device,
MetaKmsPageFlipData *page_flip_data);
......
......@@ -78,8 +78,9 @@ meta_kms_impl_remove_impl_device (MetaKmsImpl *impl,
}
MetaKmsFeedback *
meta_kms_impl_process_update (MetaKmsImpl *impl,
MetaKmsUpdate *update)
meta_kms_impl_process_update (MetaKmsImpl *impl,
MetaKmsUpdate *update,
MetaKmsUpdateFlag flags)
{
MetaKmsImplPrivate *priv = meta_kms_impl_get_instance_private (impl);
MetaKmsDevice *device;
......@@ -90,7 +91,7 @@ meta_kms_impl_process_update (MetaKmsImpl *impl,
device = meta_kms_update_get_device (update);
impl_device = meta_kms_device_get_impl_device (device);
return meta_kms_impl_device_process_update (impl_device, update);
return meta_kms_impl_device_process_update (impl_device, update, flags);
}
void
......
......@@ -31,8 +31,9 @@ G_DECLARE_FINAL_TYPE (MetaKmsImpl, meta_kms_impl,
MetaKms * meta_kms_impl_get_kms (MetaKmsImpl *impl);
MetaKmsFeedback * meta_kms_impl_process_update (MetaKmsImpl *impl,
MetaKmsUpdate *update);
MetaKmsFeedback * meta_kms_impl_process_update (MetaKmsImpl *impl,
MetaKmsUpdate *update,
MetaKmsUpdateFlag flags);
void meta_kms_impl_add_impl_device (MetaKmsImpl *impl,
MetaKmsImplDevice *impl_device);
......
......@@ -255,9 +255,6 @@ meta_kms_page_flip_data_discard (MetaKms *kms,
{
MetaKmsPageFlipClosure *closure = l->data;
if (closure->flags & META_KMS_PAGE_FLIP_LISTENER_FLAG_NO_DISCARD)
continue;
closure->vtable->discarded (page_flip_data->crtc,
closure->user_data,
page_flip_data->error);
......
......@@ -126,6 +126,8 @@ GList * meta_kms_update_get_mode_sets (MetaKmsUpdate *update);
GList * meta_kms_update_get_page_flip_listeners (MetaKmsUpdate *update);
void meta_kms_update_drop_defunct_page_flip_listeners (MetaKmsUpdate *update);
GList * meta_kms_update_get_connector_updates (MetaKmsUpdate *update);
GList * meta_kms_update_get_crtc_gammas (MetaKmsUpdate *update);
......
......@@ -417,6 +417,28 @@ meta_kms_update_add_page_flip_listener (MetaKmsUpdate *upd
listener);
}
void
meta_kms_update_drop_defunct_page_flip_listeners (MetaKmsUpdate *update)
{
GList *l;
l = update->page_flip_listeners;
while (l)
{
MetaKmsPageFlipListener *listener = l->data;
GList *l_next = l->next;
if (listener->flags & META_KMS_PAGE_FLIP_LISTENER_FLAG_DROP_ON_ERROR)
{
meta_kms_page_flip_listener_free (listener);
update->page_flip_listeners =
g_list_delete_link (update->page_flip_listeners, l);
}
l = l_next;
}
}
void
meta_kms_update_set_custom_page_flip (MetaKmsUpdate *update,
MetaKmsCustomPageFlipFunc func,
......
......@@ -46,7 +46,7 @@ typedef enum _MetaKmsAssignPlaneFlag
enum _MetaKmsPageFlipListenerFlag
{
META_KMS_PAGE_FLIP_LISTENER_FLAG_NONE = 0,
META_KMS_PAGE_FLIP_LISTENER_FLAG_NO_DISCARD = 1 << 0,
META_KMS_PAGE_FLIP_LISTENER_FLAG_DROP_ON_ERROR = 1 << 0,
};
struct _MetaKmsPageFlipListenerVtable
......
......@@ -239,15 +239,22 @@ meta_kms_take_pending_update (MetaKms *kms,
return NULL;
}
typedef struct
{
MetaKmsUpdate *update;
MetaKmsUpdateFlag flags;
} PostUpdateData;
static gpointer
meta_kms_process_update_in_impl (MetaKmsImpl *impl,
gpointer user_data,
GError **error)
{
PostUpdateData *data = user_data;
MetaKmsUpdate *update = data->update;
MetaKmsFeedback *feedback;
MetaKmsUpdate *update = user_data;
feedback = meta_kms_impl_process_update (impl, update);
feedback = meta_kms_impl_process_update (impl, data->update, data->flags);
meta_kms_device_predict_states_in_impl (meta_kms_update_get_device (update),
update);
......@@ -260,6 +267,7 @@ meta_kms_post_pending_update_sync (MetaKms *kms,
MetaKmsUpdateFlag flags)
{
MetaKmsUpdate *update;
PostUpdateData data;
MetaKmsFeedback *feedback;
GList *result_listeners;
GList *l;
......@@ -273,9 +281,13 @@ meta_kms_post_pending_update_sync (MetaKms *kms,
meta_kms_update_lock (update);
data = (PostUpdateData) {
.update = update,
.flags = flags,
};
feedback = meta_kms_run_impl_task_sync (kms,
meta_kms_process_update_in_impl,
update,
&data,
NULL);
result_listeners = meta_kms_update_take_result_listeners (update);
......@@ -294,6 +306,8 @@ meta_kms_post_pending_update_sync (MetaKms *kms,
meta_kms_update_drop_plane_assignment (update, plane);
}
meta_kms_update_drop_defunct_page_flip_listeners (update);
meta_kms_add_pending_update (kms, update);
}
else
......