1
0
Fork 0

Compare commits

...

1 commit

Author SHA1 Message Date
190cbb1b2b
Adding upstream version 48.7.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
2025-12-21 10:20:42 +01:00

34
NEWS
View file

@ -1,3 +1,37 @@
48.7
====
* Still constrain fullscreen wayland windows with size limits [Jonas Å.; !4587]
* Fixed crashes [Jonas, Marco; !4643, !4705]
Contributors:
Marco Trevisan, Jonas Ådahl
48.6
====
* Fix DND actions not working reliably in some X11 clients [Jonas; #4288]
* Fix presentation timings with commit-timing-v1 [Mario; !4645]
* Fixed crashes [Sebastian, Milan; !4682, !4592]
* Misc. bug fixes and cleanups [Carlos, Raihan; !4697, !4688]
Contributors:
Raihan Ahamed, Milan Crha, Carlos Garnacho, Sebastian Keller, Mario Kleiner,
Jonas Ådahl
48.5
====
* Fix DND from X11 clients using tablet stylus [Carlos; !4526]
* Fix fd leak during screencasting [Georges; !4577]
* Fix reading and updating the privacy screen property [Marco; !4603]
* Update viewport after virtual monitor size changes [Jonas; !4622]
* Fixed crashes [Michel, Jonas, Sebastian; !4547, !4654, !4638]
Contributors:
Georges Basile Stavracas Neto, Michel Dänzer, Carlos Garnacho,
Marco Trevisan (Treviño), Sebastian Wick, Jonas Ådahl
Translators:
Aefgh Threenine [th]
48.4
====
* Unlink outputs from unused connectors in update_outputs [Michel; !4474]

View file

@ -1193,17 +1193,17 @@ clutter_frame_clock_schedule_update (ClutterFrameClock *frame_clock)
CLUTTER_FRAME_CLOCK_STATE_SCHEDULED);
return;
case CLUTTER_FRAME_CLOCK_STATE_IDLE:
case CLUTTER_FRAME_CLOCK_STATE_SCHEDULED_LATER:
clutter_frame_clock_set_state (frame_clock,
CLUTTER_FRAME_CLOCK_STATE_SCHEDULED);
break;
case CLUTTER_FRAME_CLOCK_STATE_SCHEDULED:
case CLUTTER_FRAME_CLOCK_STATE_SCHEDULED_NOW:
case CLUTTER_FRAME_CLOCK_STATE_SCHEDULED_LATER:
case CLUTTER_FRAME_CLOCK_STATE_DISPATCHED_ONE_AND_SCHEDULED:
case CLUTTER_FRAME_CLOCK_STATE_DISPATCHED_ONE_AND_SCHEDULED_NOW:
case CLUTTER_FRAME_CLOCK_STATE_DISPATCHED_ONE_AND_SCHEDULED_LATER:
return;
case CLUTTER_FRAME_CLOCK_STATE_DISPATCHED_ONE:
case CLUTTER_FRAME_CLOCK_STATE_DISPATCHED_ONE_AND_SCHEDULED_LATER:
if (want_triple_buffering (frame_clock))
{
clutter_frame_clock_set_state (frame_clock,
@ -1321,7 +1321,7 @@ clutter_frame_clock_schedule_update_later (ClutterFrameClock *frame_clock,
frame_clock->refresh_interval_us;
extrapolated_presentation_time_us =
next_presentation_time_us + frame_clock->refresh_interval_us * cycles;
max_update_time_estimate_us = next_presentation_time_us - next_frame_deadline_us;
max_update_time_estimate_us = next_presentation_time_us - next_update_time_us;
ready_time_us = extrapolated_presentation_time_us - max_update_time_estimate_us;
break;
case CLUTTER_FRAME_CLOCK_MODE_VARIABLE:

View file

@ -2745,6 +2745,8 @@ clutter_stage_paint_to_framebuffer (ClutterStage *stage,
cogl_framebuffer_pop_matrix (framebuffer);
clutter_paint_context_destroy (paint_context);
cogl_framebuffer_flush (framebuffer);
}
/**

View file

@ -515,7 +515,7 @@ cogl_pipeline_set_uniform_1i (CoglPipeline *pipeline,
* @uniform_location: The uniform's location identifier
* @n_components: The number of components in the corresponding uniform's type
* @count: The number of values to set
* @value: Pointer to the new values to set
* @value: (array): The array of float to set @uniform
*
* Sets new values for the uniform at @uniform_location. If this
* pipeline has a user program attached and is later used as a source
@ -543,7 +543,7 @@ cogl_pipeline_set_uniform_float (CoglPipeline *pipeline,
* @uniform_location: The uniform's location identifier
* @n_components: The number of components in the corresponding uniform's type
* @count: The number of values to set
* @value: Pointer to the new values to set
* @value: (array): The array of int to set @uniform
*
* Sets new values for the uniform at @uniform_location. If this
* pipeline has a user program attached and is later used as a source
@ -572,7 +572,7 @@ cogl_pipeline_set_uniform_int (CoglPipeline *pipeline,
* @dimensions: The size of the matrix
* @count: The number of values to set
* @transpose: Whether to transpose the matrix
* @value: Pointer to the new values to set
* @value: (array): The array of float to set @uniform
*
* Sets new values for the uniform at @uniform_location. If this
* pipeline has a user program attached and is later used as a source

View file

@ -1,5 +1,5 @@
project('mutter', 'c',
version: '48.4',
version: '48.7',
meson_version: '>= 1.3.0',
license: 'GPL-2.0-or-later',
)

757
po/th.po

File diff suppressed because it is too large Load diff

View file

@ -1129,9 +1129,12 @@ ensure_privacy_screen_settings (MetaMonitorManager *manager)
{
MetaSettings *settings = meta_backend_get_settings (manager->backend);
gboolean privacy_screen_enabled;
gboolean any_changed;
GList *l;
privacy_screen_enabled = meta_settings_is_privacy_screen_enabled (settings);
any_changed = FALSE;
for (l = manager->monitors; l; l = l->next)
{
MetaMonitor *monitor = l->data;
@ -1146,11 +1149,13 @@ ensure_privacy_screen_settings (MetaMonitorManager *manager)
g_warning ("Failed to set privacy screen setting on monitor %s: %s",
meta_monitor_get_display_name (monitor), error->message);
return FALSE;
continue;
}
any_changed = TRUE;
}
return TRUE;
return any_changed;
}
static MetaPrivacyScreenState

View file

@ -69,7 +69,6 @@ typedef struct _MetaOutputPrivate
int backlight;
MetaPrivacyScreenState privacy_screen_state;
gboolean is_privacy_screen_enabled;
MetaColorMode color_mode;
@ -480,7 +479,7 @@ meta_output_is_privacy_screen_enabled (MetaOutput *output)
{
MetaOutputPrivate *priv = meta_output_get_instance_private (output);
return priv->privacy_screen_state;
return priv->is_privacy_screen_enabled;
}
gboolean
@ -491,7 +490,7 @@ meta_output_set_privacy_screen_enabled (MetaOutput *output,
MetaOutputPrivate *priv = meta_output_get_instance_private (output);
MetaPrivacyScreenState state;
state = priv->privacy_screen_state;
state = meta_output_get_privacy_screen_state (output);
if (state == META_PRIVACY_SCREEN_UNAVAILABLE)
{
@ -508,7 +507,7 @@ meta_output_set_privacy_screen_enabled (MetaOutput *output,
return FALSE;
}
if (priv->is_privacy_screen_enabled == enabled)
if ((state == META_PRIVACY_SCREEN_ENABLED) == enabled)
return TRUE;
priv->is_privacy_screen_enabled = enabled;

View file

@ -545,8 +545,6 @@ meta_screen_cast_area_stream_src_record_to_framebuffer (MetaScreenCastStreamSrc
area, scale,
paint_flags);
cogl_framebuffer_flush (framebuffer);
return TRUE;
}

View file

@ -659,6 +659,7 @@ meta_screen_cast_monitor_stream_src_record_to_framebuffer (MetaScreenCastStreamS
framebuffer,
x, y,
&local_error);
cogl_framebuffer_flush (framebuffer);
}
}
break;
@ -675,6 +676,7 @@ meta_screen_cast_monitor_stream_src_record_to_framebuffer (MetaScreenCastStreamS
cogl_framebuffer_get_width (view_framebuffer),
cogl_framebuffer_get_height (view_framebuffer),
&local_error);
cogl_framebuffer_flush (framebuffer);
}
break;
@ -714,8 +716,6 @@ stage_paint:
paint_flags);
}
cogl_framebuffer_flush (framebuffer);
return TRUE;
}

View file

@ -723,7 +723,7 @@ maybe_set_sync_points (MetaScreenCastStreamSrc *src,
ClutterBackend *clutter_backend = meta_backend_get_clutter_backend (backend);
CoglContext *cogl_context =
clutter_backend_get_cogl_context (clutter_backend);
int sync_fd;
g_autofd int sync_fd = -1;
g_autoptr (GError) local_error = NULL;
sync_timeline = spa_buffer_find_meta_data (spa_buffer,
@ -1447,6 +1447,46 @@ add_video_damage_meta_param (GPtrArray *params)
g_ptr_array_add (params, g_steal_pointer (&pod));
}
static gboolean
explicit_sync_supported (MetaScreenCastStreamSrc *src)
{
uint64_t supported = 0;
#ifdef HAVE_NATIVE_BACKEND
MetaScreenCastStream *stream = meta_screen_cast_stream_src_get_stream (src);
MetaScreenCastSession *session =
meta_screen_cast_stream_get_session (stream);
MetaScreenCast *screen_cast =
meta_screen_cast_session_get_screen_cast (session);
MetaBackend *backend = meta_screen_cast_get_backend (screen_cast);
ClutterBackend *clutter_backend = meta_backend_get_clutter_backend (backend);
CoglContext *cogl_context =
clutter_backend_get_cogl_context (clutter_backend);
CoglRenderer *cogl_renderer;
CoglRendererEGL *cogl_renderer_egl;
MetaRendererNativeGpuData *renderer_gpu_data;
MetaRenderDevice *render_device;
MetaDeviceFile *device_file;
int drm_fd;
if (!cogl_context_has_feature (cogl_context, COGL_FEATURE_ID_SYNC_FD))
return FALSE;
cogl_renderer = cogl_context_get_renderer (cogl_context);
cogl_renderer_egl = cogl_renderer->winsys;
renderer_gpu_data = cogl_renderer_egl->platform;
render_device = renderer_gpu_data->render_device;
device_file = meta_render_device_get_device_file (render_device);
if (!device_file)
return FALSE;
drm_fd = meta_device_file_get_fd (device_file);
if (drmGetCap (drm_fd, DRM_CAP_SYNCOBJ_TIMELINE, &supported) != 0)
return FALSE;
#endif /* HAVE_NATIVE_BACKEND */
return supported != 0;
}
static void
on_stream_param_changed (void *data,
uint32_t id,
@ -1602,14 +1642,26 @@ on_stream_param_changed (void *data,
SPA_PARAM_META_size, SPA_POD_Int (sizeof (struct spa_meta_header)));
g_ptr_array_add (params, g_steal_pointer (&pod));
/* we support Explicit sync */
spa_pod_dynamic_builder_init (&pod_builder, NULL, 0, 1024);
pod = spa_pod_builder_add_object (
&pod_builder.b,
SPA_TYPE_OBJECT_ParamMeta, SPA_PARAM_Meta,
SPA_PARAM_META_type, SPA_POD_Id (SPA_META_SyncTimeline),
SPA_PARAM_META_size, SPA_POD_Int (sizeof (struct spa_meta_sync_timeline)));
g_ptr_array_add (params, g_steal_pointer (&pod));
if (explicit_sync_supported (src))
{
spa_pod_dynamic_builder_init (&pod_builder, NULL, 0, 1024);
pod = spa_pod_builder_add_object (
&pod_builder.b,
SPA_TYPE_OBJECT_ParamMeta, SPA_PARAM_Meta,
SPA_PARAM_META_type, SPA_POD_Id (SPA_META_SyncTimeline),
SPA_PARAM_META_size, SPA_POD_Int (sizeof (struct spa_meta_sync_timeline)));
g_ptr_array_add (params, g_steal_pointer (&pod));
meta_topic (META_DEBUG_SCREEN_CAST,
"Advertising explicit sync support for pw_stream %u",
pw_stream_get_node_id (priv->pipewire_stream));
}
else
{
meta_topic (META_DEBUG_SCREEN_CAST,
"Not advertising explicit sync support for pw_stream %u",
pw_stream_get_node_id (priv->pipewire_stream));
}
add_video_damage_meta_param (params);

View file

@ -277,7 +277,10 @@ meta_screen_cast_virtual_stream_src_enable (MetaScreenCastStreamSrc *src)
setup_cursor_handling (virtual_src);
meta_screen_cast_stream_notify_is_configured (stream);
if (!meta_screen_cast_stream_is_configured (stream))
meta_screen_cast_stream_notify_is_configured (stream);
else
meta_eis_viewport_notify_changed (META_EIS_VIEWPORT (stream));
virtual_src->monitors_changed_handler_id =
g_signal_connect (monitor_manager, "monitors-changed-internal",

View file

@ -840,6 +840,14 @@ scale_and_transform_cursor_sprite_cpu (MetaCursorRendererNative *cursor_renderer
if (!src_texture)
return NULL;
if (dst_width < 1 || dst_height < 1)
{
g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
"Invalid size for cursor texture %d x %d",
dst_width, dst_height);
return NULL;
}
dst_texture = cogl_texture_2d_new_with_format (cogl_context,
dst_width,
dst_height,

View file

@ -85,6 +85,8 @@ struct _MetaInputDeviceNative
double output_ratio; /* w:h */
MetaInputDeviceMapping mapping_mode;
ClutterModifierType button_state;
/* Pointer position */
float pointer_x;
float pointer_y;

View file

@ -65,10 +65,10 @@ typedef enum _MetaKmsConnectorUnderscan
typedef enum _MetaKmsConnectorPrivacyScreen
{
META_KMS_CONNECTOR_PRIVACY_SCREEN_ENABLED = 0,
META_KMS_CONNECTOR_PRIVACY_SCREEN_DISABLED,
META_KMS_CONNECTOR_PRIVACY_SCREEN_ENABLED_LOCKED,
META_KMS_CONNECTOR_PRIVACY_SCREEN_DISABLED = 0,
META_KMS_CONNECTOR_PRIVACY_SCREEN_ENABLED,
META_KMS_CONNECTOR_PRIVACY_SCREEN_DISABLED_LOCKED,
META_KMS_CONNECTOR_PRIVACY_SCREEN_ENABLED_LOCKED,
META_KMS_CONNECTOR_PRIVACY_SCREEN_N_PROPS,
META_KMS_CONNECTOR_PRIVACY_SCREEN_UNKNOWN,
} MetaKmsConnectorPrivacyScreen;

View file

@ -785,11 +785,13 @@ meta_seat_impl_notify_relative_motion_in_impl (MetaSeatImpl *seat_impl,
{
meta_input_device_native_get_coords_in_impl (device_native,
&cur_x, &cur_y);
modifiers = device_native->button_state;
}
else
{
meta_input_device_native_get_coords_in_impl (META_INPUT_DEVICE_NATIVE (seat_impl->core_pointer),
&cur_x, &cur_y);
modifiers = seat_impl->button_state;
}
meta_seat_impl_filter_relative_motion (seat_impl,
@ -805,9 +807,7 @@ meta_seat_impl_notify_relative_motion_in_impl (MetaSeatImpl *seat_impl,
cur_y + dy,
&x, &y);
modifiers =
xkb_state_serialize_mods (seat_impl->xkb, XKB_STATE_MODS_EFFECTIVE) |
seat_impl->button_state;
modifiers |= xkb_state_serialize_mods (seat_impl->xkb, XKB_STATE_MODS_EFFECTIVE);
dx_constrained = x - cur_x;
dy_constrained = y - cur_y;
@ -852,9 +852,12 @@ meta_seat_impl_notify_absolute_motion_in_impl (MetaSeatImpl *seat_impl,
update_device_coords_in_impl (seat_impl, input_device,
GRAPHENE_POINT_INIT (x, y));
modifiers =
xkb_state_serialize_mods (seat_impl->xkb, XKB_STATE_MODS_EFFECTIVE) |
seat_impl->button_state;
if (clutter_input_device_get_device_type (input_device) == CLUTTER_TABLET_DEVICE)
modifiers = device_native->button_state;
else
modifiers = seat_impl->button_state;
modifiers |= xkb_state_serialize_mods (seat_impl->xkb, XKB_STATE_MODS_EFFECTIVE);
g_signal_emit (seat_impl, signals[POINTER_POSITION_CHANGED_IN_IMPL], 0,
&GRAPHENE_POINT_INIT (seat_impl->pointer_x,
@ -884,7 +887,7 @@ meta_seat_impl_notify_button_in_impl (MetaSeatImpl *seat_impl,
{
MetaInputDeviceNative *device_native = META_INPUT_DEVICE_NATIVE (input_device);
ClutterEvent *event = NULL;
ClutterModifierType modifiers;
ClutterModifierType modifiers, *button_state;
int button_nr = 0;
float x, y;
static int maskmap[8] =
@ -953,13 +956,18 @@ meta_seat_impl_notify_button_in_impl (MetaSeatImpl *seat_impl,
}
}
if (clutter_input_device_get_device_type (input_device) == CLUTTER_TABLET_DEVICE)
button_state = &device_native->button_state;
else
button_state = &seat_impl->button_state;
if (button_nr > 0 && button_nr < G_N_ELEMENTS (maskmap))
{
/* Update the modifiers */
if (state)
seat_impl->button_state |= maskmap[button_nr - 1];
*button_state |= maskmap[button_nr - 1];
else
seat_impl->button_state &= ~maskmap[button_nr - 1];
*button_state &= ~maskmap[button_nr - 1];
}
if (clutter_input_device_get_device_type (input_device) == CLUTTER_TABLET_DEVICE)
@ -974,7 +982,7 @@ meta_seat_impl_notify_button_in_impl (MetaSeatImpl *seat_impl,
modifiers =
xkb_state_serialize_mods (seat_impl->xkb, XKB_STATE_MODS_EFFECTIVE) |
seat_impl->button_state;
*button_state;
event =
clutter_event_button_new (state ?
@ -1012,6 +1020,8 @@ notify_scroll (ClutterInputDevice *input_device,
ClutterScrollFinishFlags flags,
gboolean emulated)
{
MetaInputDeviceNative *device_native =
META_INPUT_DEVICE_NATIVE (input_device);
MetaSeatImpl *seat_impl;
ClutterEvent *event = NULL;
ClutterModifierType modifiers;
@ -1028,9 +1038,12 @@ notify_scroll (ClutterInputDevice *input_device,
x = seat_impl->pointer_x;
y = seat_impl->pointer_y;
modifiers =
xkb_state_serialize_mods (seat_impl->xkb, XKB_STATE_MODS_EFFECTIVE) |
seat_impl->button_state;
if (clutter_input_device_get_device_type (input_device) == CLUTTER_TABLET_DEVICE)
modifiers = device_native->button_state;
else
modifiers = seat_impl->button_state;
modifiers |= xkb_state_serialize_mods (seat_impl->xkb, XKB_STATE_MODS_EFFECTIVE);
event =
clutter_event_scroll_smooth_new (emulated ?
@ -1056,6 +1069,8 @@ notify_discrete_scroll (ClutterInputDevice *input_device,
ClutterScrollSource scroll_source,
gboolean emulated)
{
MetaInputDeviceNative *device_native =
META_INPUT_DEVICE_NATIVE (input_device);
MetaSeatImpl *seat_impl;
ClutterEvent *event = NULL;
ClutterModifierType modifiers;
@ -1068,9 +1083,12 @@ notify_discrete_scroll (ClutterInputDevice *input_device,
x = seat_impl->pointer_x;
y = seat_impl->pointer_y;
modifiers =
xkb_state_serialize_mods (seat_impl->xkb, XKB_STATE_MODS_EFFECTIVE) |
seat_impl->button_state;
if (clutter_input_device_get_device_type (input_device) == CLUTTER_TABLET_DEVICE)
modifiers = device_native->button_state;
else
modifiers = seat_impl->button_state;
modifiers |= xkb_state_serialize_mods (seat_impl->xkb, XKB_STATE_MODS_EFFECTIVE);
event =
clutter_event_scroll_discrete_new (emulated ?
@ -1259,9 +1277,7 @@ meta_seat_impl_notify_touch_event_in_impl (MetaSeatImpl *seat_impl,
/* "NULL" sequences are special cased in clutter */
sequence = GINT_TO_POINTER (MAX (1, slot + 1));
modifiers =
xkb_state_serialize_mods (seat_impl->xkb, XKB_STATE_MODS_EFFECTIVE) |
seat_impl->button_state;
modifiers = xkb_state_serialize_mods (seat_impl->xkb, XKB_STATE_MODS_EFFECTIVE);
if (evtype == CLUTTER_TOUCH_BEGIN ||
evtype == CLUTTER_TOUCH_UPDATE)
@ -3412,11 +3428,13 @@ meta_seat_impl_query_state (MetaSeatImpl *seat_impl,
coords->y = device_native->pointer_y;
}
if (clutter_input_device_get_device_type (device) == CLUTTER_TABLET_DEVICE)
mods = device_native->button_state;
else
mods = seat_impl->button_state;
if (seat_impl->xkb)
{
mods = meta_xkb_translate_modifiers (seat_impl->xkb,
seat_impl->button_state);
}
mods = meta_xkb_translate_modifiers (seat_impl->xkb, mods);
retval = TRUE;
}

View file

@ -1352,8 +1352,8 @@ constrain_fullscreen (MetaWindow *window,
ConstraintPriority priority,
gboolean check_only)
{
MtkRectangle min_size, max_size, monitor;
gboolean too_big, too_small, constraint_already_satisfied;
MtkRectangle monitor;
gboolean constraint_already_satisfied;
if (priority > PRIORITY_FULLSCREEN)
return TRUE;
@ -1364,11 +1364,19 @@ constrain_fullscreen (MetaWindow *window,
monitor = info->entire_monitor;
get_size_limits (window, &min_size, &max_size);
too_big = !mtk_rectangle_could_fit_rect (&monitor, &min_size);
too_small = !mtk_rectangle_could_fit_rect (&max_size, &monitor);
if (too_big || too_small)
return TRUE;
#ifdef HAVE_X11_CLIENT
if (window->client_type == META_WINDOW_CLIENT_TYPE_X11)
{
MtkRectangle min_size, max_size;
gboolean too_big, too_small;
get_size_limits (window, &min_size, &max_size);
too_big = !mtk_rectangle_could_fit_rect (&monitor, &min_size);
too_small = !mtk_rectangle_could_fit_rect (&max_size, &monitor);
if (too_big || too_small)
return TRUE;
}
#endif /* HAVE_X11_CLIENT */
/* Determine whether constraint is already satisfied; exit if it is */
constraint_already_satisfied =
@ -1478,6 +1486,12 @@ constrain_size_limits (MetaWindow *window,
if (info->action_type == ACTION_MOVE)
return TRUE;
#ifdef HAVE_WAYLAND
if (window->client_type == META_WINDOW_CLIENT_TYPE_WAYLAND &&
meta_window_is_fullscreen (window))
return TRUE;
#endif
/* Determine whether constraint is already satisfied; exit if it is */
get_size_limits (window, &min_size, &max_size);
/* We ignore max-size limits for maximized windows; see #327543 */

View file

@ -116,6 +116,8 @@ void
meta_window_delete (MetaWindow *window,
guint32 timestamp)
{
g_return_if_fail (!window->unmanaging);
META_WINDOW_GET_CLASS (window)->delete (window, timestamp);
meta_window_check_alive (window, timestamp);

View file

@ -176,7 +176,7 @@ meta_launch_context_get_startup_notify_id (GAppLaunchContext *launch_context,
"display", context->display,
"id", startup_id,
"application-id", application_id,
"name", g_app_info_get_name (info),
"name", info ? g_app_info_get_name (info) : NULL,
"workspace", workspace_idx,
"timestamp", (uint64_t) context->timestamp,
NULL);

View file

@ -1206,6 +1206,11 @@ meta_prefs_get_cursor_theme (void)
int
meta_prefs_get_cursor_size (void)
{
if (cursor_size <= 0)
{
g_warning_once ("Invalid cursor size (%d) in settings, resetting to 24", cursor_size);
cursor_size = 24;
}
return cursor_size;
}

View file

@ -426,7 +426,7 @@ meta_ref_test_verify (MetaRefTestAdaptor adaptor,
g_critical ("Pixel difference exceeds limits "
"(min: [%d, %d, %d, %d], "
"max: [%d, %d, %d, %d])\n"
"See %s, %s, and %s for details.",
"See %s %s %s for details.",
diff_stat.ch[0].min_diff,
diff_stat.ch[1].min_diff,
diff_stat.ch[2].min_diff,

View file

@ -31,10 +31,12 @@
#include "backends/native/meta-backend-native.h"
#include "backends/native/meta-input-thread.h"
#include "backends/native/meta-seat-native.h"
#include "compositor/meta-window-actor-private.h"
#include "core/display-private.h"
#include "core/window-private.h"
#include "meta-test/meta-context-test.h"
#include "wayland/meta-wayland.h"
#include "wayland/meta-window-wayland.h"
#include "wayland/meta-xwayland.h"
#include "x11/meta-x11-display-private.h"
@ -1157,3 +1159,33 @@ meta_wait_for_window_cursor (MetaContext *context)
while (!meta_cursor_tracker_has_window_cursor (cursor_tracker))
g_main_context_iteration (NULL, TRUE);
}
void
meta_wait_for_effects (MetaWindow *window)
{
MetaWindowActor *window_actor;
window_actor = meta_window_actor_from_window (window);
g_object_add_weak_pointer (G_OBJECT (window_actor),
(gpointer *) &window_actor);
while (window_actor && meta_window_actor_effect_in_progress (window_actor))
g_main_context_iteration (NULL, TRUE);
if (window_actor)
{
g_object_remove_weak_pointer (G_OBJECT (window_actor),
(gpointer *) &window_actor);
}
}
void
meta_wait_wayland_window_reconfigure (MetaWindow *window)
{
MetaWindowWayland *wl_window = META_WINDOW_WAYLAND (window);
uint32_t serial;
g_assert_true (meta_window_wayland_get_pending_serial (wl_window, &serial));
while (meta_window_wayland_peek_configuration (wl_window, serial))
g_main_context_iteration (NULL, TRUE);
}

View file

@ -152,3 +152,9 @@ void meta_wait_test_process (GSubprocess *subprocess);
META_EXPORT
void meta_wait_for_window_cursor (MetaContext *context);
META_EXPORT
void meta_wait_for_effects (MetaWindow *window);
META_EXPORT
void meta_wait_wayland_window_reconfigure (MetaWindow *window);

View file

@ -476,3 +476,16 @@ meta_wayland_test_driver_wait_for_sync_point (MetaWaylandTestDriver *test_driver
g_main_context_iteration (NULL, TRUE);
g_signal_handler_disconnect (test_driver, handler_id);
}
void
meta_wayland_test_driver_terminate (MetaWaylandTestDriver *test_driver)
{
GList *l;
for (l = test_driver->resources; l; l = l->next)
{
struct wl_resource *resource = l->data;
test_driver_send_terminate (resource);
}
}

View file

@ -39,3 +39,5 @@ void meta_wayland_test_driver_set_property_int (MetaWaylandTestDriver *test_driv
void meta_wayland_test_driver_wait_for_sync_point (MetaWaylandTestDriver *test_driver,
unsigned int sync_point);
void meta_wayland_test_driver_terminate (MetaWaylandTestDriver *test_driver);

View file

@ -30,6 +30,8 @@ MetaWaylandTestClient * meta_wayland_test_client_new_with_args (MetaContext *con
void meta_wayland_test_client_finish (MetaWaylandTestClient *wayland_test_client);
void meta_wayland_test_client_terminate (MetaWaylandTestClient *wayland_test_client);
MetaWindow * meta_find_client_window (MetaContext *context,
const char *title);

View file

@ -42,6 +42,8 @@
<arg name="direction" type="uint" enum="direction"/>
</request>
<event name="terminate"/>
<event name="sync_event">
<arg name="sequence" type="uint"/>
</event>

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

View file

@ -2064,7 +2064,6 @@ test_case_do (TestCase *test,
MetaTestClient *client;
const char *window_id;
MetaWindow *window;
MetaWindowActor *window_actor;
if (argc != 2)
BAD_COMMAND("usage: %s <client-id>/<window-id>", argv[0]);
@ -2076,16 +2075,7 @@ test_case_do (TestCase *test,
if (!window)
return FALSE;
window_actor = meta_window_actor_from_window (window);
g_object_add_weak_pointer (G_OBJECT (window_actor),
(gpointer *) &window_actor);
while (window_actor && meta_window_actor_effect_in_progress (window_actor))
g_main_context_iteration (NULL, TRUE);
if (window_actor)
{
g_object_remove_weak_pointer (G_OBJECT (window_actor),
(gpointer *) &window_actor);
}
meta_wait_for_effects (window);
}
else if (argc > 2 && g_str_equal (argv[1], "=>"))
{

View file

@ -0,0 +1,46 @@
/*
* Copyright (C) 2025 Red Hat
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, see <http://www.gnu.org/licenses/>.
*/
#include "config.h"
#include <glib.h>
#include "wayland-test-client-utils.h"
int
main (int argc,
char **argv)
{
g_autoptr (WaylandDisplay) display = NULL;
g_autoptr (WaylandSurface) surface = NULL;
int width, height;
width = atoi (argv[1]);
height = atoi (argv[2]);
display = wayland_display_new (WAYLAND_DISPLAY_CAPABILITY_TEST_DRIVER);
surface = wayland_surface_new (display,
"fixed-size-client",
width, height, 0xff00ffff);
wayland_surface_fixate_size (surface);
wl_surface_commit (surface->wl_surface);
while (TRUE)
wayland_display_dispatch (display);
return EXIT_SUCCESS;
}

View file

@ -121,6 +121,9 @@ wayland_test_clients = [
wayland_cursor_dep,
],
},
{
'name': 'fixed-size-client',
},
]
test_client_executables = {}

View file

@ -314,6 +314,13 @@ static const struct wl_seat_listener wl_seat_listener = {
handle_wl_seat_name,
};
static void
test_driver_handle_terminate (void *user_data,
struct test_driver *test_driver)
{
exit (EXIT_SUCCESS);
}
static void
test_driver_handle_sync_event (void *user_data,
struct test_driver *test_driver,
@ -351,6 +358,7 @@ test_driver_handle_property_int (void *user_data,
}
static const struct test_driver_listener test_driver_listener = {
test_driver_handle_terminate,
test_driver_handle_sync_event,
test_driver_handle_property,
test_driver_handle_property_int,
@ -663,15 +671,23 @@ handle_xdg_toplevel_configure (void *data,
WaylandSurface *surface = data;
uint32_t *p;
if (width == 0)
surface->width = surface->default_width;
if (surface->fixed_size)
{
surface->width = surface->default_width;
surface->height = surface->default_height;
}
else
surface->width = width;
{
if (width == 0)
surface->width = surface->default_width;
else
surface->width = width;
if (height == 0)
surface->height = surface->default_height;
else
surface->height = height;
if (height == 0)
surface->height = surface->default_height;
else
surface->height = height;
}
g_assert_null (surface->pending_state);
surface->pending_state = g_hash_table_new (NULL, NULL);
@ -888,6 +904,18 @@ wayland_surface_set_opaque (WaylandSurface *surface)
surface->is_opaque = TRUE;
}
void
wayland_surface_fixate_size (WaylandSurface *surface)
{
surface->fixed_size = TRUE;
xdg_toplevel_set_min_size (surface->xdg_toplevel,
surface->default_width,
surface->default_height);
xdg_toplevel_set_max_size (surface->xdg_toplevel,
surface->default_width,
surface->default_height);
}
const char *
lookup_property_string (WaylandDisplay *display,
const char *name)

View file

@ -90,6 +90,7 @@ typedef struct _WaylandSurface
int default_height;
int width;
int height;
gboolean fixed_size;
uint32_t color;
gboolean is_opaque;
@ -129,6 +130,8 @@ gboolean wayland_surface_has_state (WaylandSurface *surface,
void wayland_surface_set_opaque (WaylandSurface *surface);
void wayland_surface_fixate_size (WaylandSurface *surface);
void draw_surface (WaylandDisplay *display,
struct wl_surface *surface,
int width,

View file

@ -32,6 +32,7 @@
#include "meta/meta-workspace-manager.h"
#include "tests/meta-test-utils.h"
#include "tests/meta-monitor-test-utils.h"
#include "tests/meta-ref-test.h"
#include "tests/meta-wayland-test-driver.h"
#include "tests/meta-wayland-test-utils.h"
#include "wayland/meta-wayland-client-private.h"
@ -1469,6 +1470,88 @@ toplevel_suspended (void)
g_signal_handler_disconnect (test_driver, sync_point_id);
}
static void
toplevel_fixed_size_fullscreen (void)
{
MetaBackend *backend = meta_context_get_backend (test_context);
MetaCursorTracker *cursor_tracker = meta_backend_get_cursor_tracker (backend);
MetaRenderer *renderer = meta_backend_get_renderer (backend);
MetaWaylandTestClient *wayland_test_client;
GSettings *settings;
GList *views;
ClutterStageView *view;
MetaWindow *window;
meta_cursor_tracker_set_pointer_visible (cursor_tracker, FALSE);
settings = g_settings_new ("org.gnome.mutter");
g_assert_true (g_settings_set_boolean (settings, "center-new-windows", FALSE));
views = meta_renderer_get_views (renderer);
g_assert_cmpint (g_list_length (views), ==, 1);
view = CLUTTER_STAGE_VIEW (views->data);
wayland_test_client =
meta_wayland_test_client_new_with_args (test_context,
"fixed-size-client",
"100", "100",
NULL);
while (!(window = find_client_window ("fixed-size-client")))
g_main_context_iteration (NULL, TRUE);
while (meta_window_is_hidden (window))
g_main_context_iteration (NULL, TRUE);
meta_wait_for_effects (window);
meta_ref_test_verify_view (view,
g_test_get_path (), 0,
meta_ref_test_determine_ref_test_flag ());
meta_window_make_fullscreen (window);
meta_wait_wayland_window_reconfigure (window);
meta_wait_for_effects (window);
meta_ref_test_verify_view (view,
g_test_get_path (), 1,
meta_ref_test_determine_ref_test_flag ());
meta_wayland_test_driver_terminate (test_driver);
meta_wayland_test_client_finish (wayland_test_client);
meta_cursor_tracker_set_pointer_visible (cursor_tracker, TRUE);
}
static void
toplevel_fixed_size_fullscreen_exceeds (void)
{
MetaWaylandTestClient *wayland_test_client;
MetaWindow *window;
wayland_test_client =
meta_wayland_test_client_new_with_args (test_context,
"fixed-size-client",
"1000", "1000",
NULL);
while (!(window = find_client_window ("fixed-size-client")))
g_main_context_iteration (NULL, TRUE);
while (meta_window_is_hidden (window))
g_main_context_iteration (NULL, TRUE);
meta_wait_for_effects (window);
g_test_expect_message ("libmutter", G_LOG_LEVEL_WARNING,
"Window * (fixed-size-client) (wl_surface#*) "
"size 1000x1000 exceeds allowed maximum size 640x480");
meta_window_make_fullscreen (window);
meta_wait_wayland_window_reconfigure (window);
meta_wait_for_effects (window);
meta_wayland_test_driver_terminate (test_driver);
meta_wayland_test_client_finish (wayland_test_client);
g_test_assert_expected_messages ();
}
static void
on_before_tests (void)
{
@ -1572,6 +1655,10 @@ init_tests (void)
toplevel_suspended);
g_test_add_func ("/wayland/cursor/shape",
cursor_shape);
g_test_add_func ("/wayland/toplevel/fixed-size-fullscreen",
toplevel_fixed_size_fullscreen);
g_test_add_func ("/wayland/toplevel/fixed-size-fullscreen-exceeds",
toplevel_fixed_size_fullscreen_exceeds);
}
int
@ -1591,6 +1678,9 @@ main (int argc,
META_CONTEXT_TEST_FLAG_NO_X11);
#endif
g_assert_true (meta_context_configure (context, &argc, &argv, NULL));
meta_context_test_set_background_color (META_CONTEXT_TEST (context),
COGL_COLOR_INIT (255, 255, 255, 255));
test_context = context;

View file

@ -20,7 +20,7 @@
/**
* MetaWaylandClient:
*
*
* A class that allows to launch a trusted client and detect if an specific
* Wayland window belongs to it.
*/
@ -423,6 +423,7 @@ meta_wayland_client_owns_window (MetaWaylandClient *client,
g_return_val_if_fail (meta_is_wayland_compositor (), FALSE);
g_return_val_if_fail (client->subprocess.subprocess != NULL, FALSE);
g_return_val_if_fail (client->subprocess.process_running, FALSE);
g_return_val_if_fail (!window->unmanaging, FALSE);
surface = meta_window_get_wayland_surface (window);
if (surface == NULL || surface->resource == NULL)

View file

@ -44,7 +44,7 @@ struct _MetaWaylandColorManager
/* struct wl_resource */
GList *resources;
/* Key: MetaMonitor
/* Key: MetaWaylandOutput
* Value: MetaWaylandColorManagementOutput
*/
GHashTable *outputs;
@ -764,9 +764,7 @@ meta_wayland_color_management_output_new (MetaWaylandColorManager *color_manager
G_CALLBACK (on_output_destroyed),
cm_output);
g_hash_table_insert (color_manager->outputs,
meta_wayland_output_get_monitor (output),
cm_output);
g_hash_table_insert (color_manager->outputs, output, cm_output);
return cm_output;
}
@ -788,8 +786,7 @@ meta_wayland_color_management_output_free (MetaWaylandColorManagementOutput *cm_
g_clear_signal_handler (&cm_output->output_destroyed_handler_id,
cm_output->output);
g_hash_table_remove (cm_output->color_manager->outputs,
meta_wayland_output_get_monitor (cm_output->output));
g_hash_table_remove (cm_output->color_manager->outputs, cm_output->output);
free (cm_output);
}
@ -800,8 +797,7 @@ ensure_color_management_output (MetaWaylandColorManager *color_manager,
{
MetaWaylandColorManagementOutput *cm_output;
cm_output = g_hash_table_lookup (color_manager->outputs,
meta_wayland_output_get_monitor (output));
cm_output = g_hash_table_lookup (color_manager->outputs, output);
if (cm_output)
return cm_output;
@ -1523,7 +1519,10 @@ update_output_color_state (MetaWaylandColorManager *color_manager,
MetaWaylandColorManagementSurface *cm_surface;
MetaWaylandOutput *wayland_output;
cm_output = g_hash_table_lookup (color_manager->outputs, monitor);
wayland_output = g_hash_table_lookup (color_manager->compositor->outputs,
meta_monitor_get_spec (monitor));
cm_output = g_hash_table_lookup (color_manager->outputs, wayland_output);
if (cm_output)
{
@ -1537,9 +1536,6 @@ update_output_color_state (MetaWaylandColorManager *color_manager,
}
}
wayland_output = g_hash_table_lookup (color_manager->compositor->outputs,
meta_monitor_get_spec (monitor));
g_hash_table_iter_init (&iter_surfaces, color_manager->surfaces);
while (g_hash_table_iter_next (&iter_surfaces, NULL, (gpointer *)&cm_surface))
{

View file

@ -527,11 +527,12 @@ delayed_destroy_outputs (gpointer data)
g_hash_table_destroy (data);
}
static GHashTable *
static void
meta_wayland_compositor_update_outputs (MetaWaylandCompositor *compositor,
MetaMonitorManager *monitor_manager)
{
GHashTable *new_table;
g_autoptr (GHashTable) new_table = NULL;
g_autoptr (GHashTable) old_table = NULL;
GList *monitors, *l;
monitors = meta_monitor_manager_get_monitors (monitor_manager);
@ -539,6 +540,7 @@ meta_wayland_compositor_update_outputs (MetaWaylandCompositor *compositor,
(GEqualFunc) meta_monitor_spec_equals,
(GDestroyNotify) meta_monitor_spec_free,
g_object_unref);
old_table = g_steal_pointer (&compositor->outputs);
for (l = monitors; l; l = l->next)
{
@ -550,8 +552,8 @@ meta_wayland_compositor_update_outputs (MetaWaylandCompositor *compositor,
if (!meta_monitor_is_active (monitor))
continue;
if (!compositor->outputs ||
!g_hash_table_steal_extended (compositor->outputs, lookup_monitor_spec,
if (!old_table ||
!g_hash_table_steal_extended (old_table, lookup_monitor_spec,
(gpointer *) &monitor_spec,
(gpointer *) &wayland_output))
{
@ -565,20 +567,21 @@ meta_wayland_compositor_update_outputs (MetaWaylandCompositor *compositor,
g_steal_pointer (&wayland_output));
}
if (compositor->outputs)
{
g_hash_table_foreach (compositor->outputs, make_output_inert, NULL);
g_timeout_add_seconds_once (10, delayed_destroy_outputs, compositor->outputs);
}
compositor->outputs = g_steal_pointer (&new_table);
return new_table;
if (old_table)
{
g_hash_table_foreach (old_table, make_output_inert, NULL);
g_timeout_add_seconds_once (10, delayed_destroy_outputs,
g_steal_pointer (&old_table));
}
}
static void
on_monitors_changed (MetaMonitorManager *monitors,
MetaWaylandCompositor *compositor)
{
compositor->outputs = meta_wayland_compositor_update_outputs (compositor, monitors);
meta_wayland_compositor_update_outputs (compositor, monitors);
}
static void
@ -801,8 +804,7 @@ meta_wayland_outputs_init (MetaWaylandCompositor *compositor)
g_signal_connect (monitor_manager, "monitors-changed",
G_CALLBACK (on_monitors_changed), compositor);
compositor->outputs =
meta_wayland_compositor_update_outputs (compositor, monitor_manager);
meta_wayland_compositor_update_outputs (compositor, monitor_manager);
wl_global_create (compositor->wayland_display,
&zxdg_output_manager_v1_interface,

View file

@ -292,7 +292,7 @@ meta_wayland_xdg_session_state_parse (MetaSessionState *session_state,
tiled_rect = gvdb_table_get_value (toplevel, "tiled-rect");
if (tiled_rect && g_variant_is_of_type (tiled_rect, G_VARIANT_TYPE ("(iiii)")))
{
variant_to_rect (floating_rect, &toplevel_state->tiled.rect);
variant_to_rect (tiled_rect, &toplevel_state->tiled.rect);
}
is_minimized = gvdb_table_get_value (toplevel, "is-minimized");
@ -397,6 +397,8 @@ meta_wayland_xdg_session_state_restore_window (MetaSessionState *state,
toplevel_state = g_hash_table_lookup (xdg_session_state->toplevels, name);
if (!toplevel_state)
return FALSE;
if (toplevel_state->window_state == WINDOW_STATE_NONE)
return FALSE;
switch (toplevel_state->window_state)
{
@ -438,6 +440,7 @@ meta_wayland_xdg_session_state_restore_window (MetaSessionState *state,
switch (toplevel_state->window_state)
{
case WINDOW_STATE_NONE:
break;
case WINDOW_STATE_FLOATING:
break;
case WINDOW_STATE_TILED_LEFT:

View file

@ -1255,6 +1255,24 @@ meta_window_wayland_finish_move_resize (MetaWindow *window,
acked_configuration = acquire_acked_configuration (wl_window, pending,
&is_client_resize);
if (acked_configuration &&
acked_configuration->has_size &&
acked_configuration->is_fullscreen &&
(new_geom.width > acked_configuration->width ||
new_geom.height > acked_configuration->height))
{
g_warning ("Window %s (wl_surface#%u) size %dx%d exceeds "
"allowed maximum size %dx%d",
window->desc,
surface->resource
? wl_resource_get_id (surface->resource)
: 0,
new_geom.width / geometry_scale,
new_geom.height / geometry_scale,
acked_configuration->width / geometry_scale,
acked_configuration->height / geometry_scale);
}
window_drag = meta_compositor_get_current_window_drag (display->compositor);
/* x/y are ignored when we're doing interactive resizing */

View file

@ -863,6 +863,10 @@ drag_xgrab_get_focus_surface (MetaWaylandEventHandler *handler,
drag_device = meta_wayland_drag_grab_get_device (drag_grab, &drag_sequence);
if (clutter_input_device_get_device_type (device) ==
CLUTTER_KEYBOARD_DEVICE)
return meta_wayland_drag_grab_get_origin (drag_grab);
if (drag_sequence != sequence ||
drag_device != device)
return NULL;
@ -896,9 +900,12 @@ drag_xgrab_motion (MetaWaylandEventHandler *handler,
MetaWaylandSeat *seat = meta_wayland_drag_grab_get_seat (drag_grab);
MetaWaylandCompositor *compositor = meta_wayland_seat_get_compositor (seat);
MetaXWaylandDnd *dnd = compositor->xwayland_manager.dnd;
ClutterInputDevice *device;
device = meta_wayland_drag_grab_get_device (drag_grab, NULL);
if (clutter_event_type (event) != CLUTTER_MOTION ||
clutter_event_get_device_tool (event))
device != clutter_event_get_device (event))
return CLUTTER_EVENT_STOP;
repick_drop_surface (compositor, drag_grab, event);
@ -917,9 +924,12 @@ drag_xgrab_release (MetaWaylandEventHandler *handler,
MetaWaylandSeat *seat = meta_wayland_drag_grab_get_seat (drag_grab);
MetaWaylandCompositor *compositor = meta_wayland_seat_get_compositor (seat);
MetaWaylandDataSource *data_source;
ClutterInputDevice *device;
device = meta_wayland_drag_grab_get_device (drag_grab, NULL);
if (clutter_event_type (event) != CLUTTER_BUTTON_RELEASE ||
clutter_event_get_device_tool (event))
device != clutter_event_get_device (event))
return CLUTTER_EVENT_STOP;
data_source = compositor->seat->data_device.dnd_data_source;
@ -1122,14 +1132,14 @@ find_dnd_candidate_device (ClutterStage *stage,
clutter_seat_query_state (clutter_input_device_get_seat (device),
device, sequence, &pos, &modifiers);
if (!sequence)
{
if ((modifiers &
(CLUTTER_BUTTON1_MASK | CLUTTER_BUTTON2_MASK |
CLUTTER_BUTTON3_MASK | CLUTTER_BUTTON4_MASK |
CLUTTER_BUTTON5_MASK)) == 0)
return TRUE;
}
if (sequence)
return TRUE;
if ((modifiers &
(CLUTTER_BUTTON1_MASK | CLUTTER_BUTTON2_MASK |
CLUTTER_BUTTON3_MASK | CLUTTER_BUTTON4_MASK |
CLUTTER_BUTTON5_MASK)) == 0)
return TRUE;
focus = meta_wayland_seat_get_current_surface (candidate->seat,
device, sequence);

View file

@ -1078,7 +1078,7 @@ convert_property (MetaX11Display *x11_display,
(unsigned char *)icccm_version, 2);
else
{
mtk_x11_error_trap_pop_with_return (x11_display->xdisplay);
mtk_x11_error_trap_pop (x11_display->xdisplay);
return FALSE;
}
@ -1146,7 +1146,7 @@ process_selection_request (MetaX11Display *x11_display,
x11_display->atom_ATOM_PAIR,
&type, &format, &num, &rest, &data) != Success)
{
mtk_x11_error_trap_pop_with_return (x11_display->xdisplay);
mtk_x11_error_trap_pop (x11_display->xdisplay);
return;
}

View file

@ -368,10 +368,14 @@ meta_x11_startup_notification_launch (MetaX11Display *x11_display,
screen = meta_x11_display_get_screen_number (x11_display);
sn_launcher = sn_launcher_context_new (x11_sn->sn_display, screen);
sn_launcher_context_set_name (sn_launcher, g_app_info_get_name (app_info));
sn_launcher_context_set_workspace (sn_launcher, workspace);
sn_launcher_context_set_binary_name (sn_launcher,
g_app_info_get_executable (app_info));
if (app_info)
{
sn_launcher_context_set_name (sn_launcher, g_app_info_get_name (app_info));
sn_launcher_context_set_binary_name (sn_launcher,
g_app_info_get_executable (app_info));
}
if (G_IS_DESKTOP_APP_INFO (app_info))
{
@ -407,7 +411,7 @@ meta_x11_startup_notification_launch (MetaX11Display *x11_display,
sn_launcher_context_initiate (sn_launcher,
g_get_prgname (),
g_app_info_get_name (app_info),
app_info ? g_app_info_get_name (app_info) : "",
timestamp);
startup_id = g_strdup (sn_launcher_context_get_startup_id (sn_launcher));

View file

@ -110,7 +110,7 @@ meta_sync_counter_create_sync_alarm (MetaSyncCounter *sync_counter)
sync_counter->sync_request_counter,
&init))
{
mtk_x11_error_trap_pop_with_return (x11_display->xdisplay);
mtk_x11_error_trap_pop (x11_display->xdisplay);
sync_counter->sync_request_counter = None;
return;
}

View file

@ -653,21 +653,10 @@ init_x11_bell (MetaX11Display *x11_display)
}
else
{
unsigned int mask = XkbBellNotifyMask;
gboolean visual_bell_auto_reset = FALSE;
/* TRUE if and when non-broken version is available */
XkbSelectEvents (x11_display->xdisplay,
XkbUseCoreKbd,
XkbBellNotifyMask,
XkbBellNotifyMask);
if (visual_bell_auto_reset)
{
XkbSetAutoResetControls (x11_display->xdisplay,
XkbAudibleBellMask,
&mask,
&mask);
}
}
/* We are playing sounds using libcanberra support, we handle the