Compare commits
2 commits
progress-l
...
debian
| Author | SHA1 | Date | |
|---|---|---|---|
|
08b5fabea4 |
|||
|
f5d9586c8f |
48 changed files with 1079 additions and 405 deletions
34
NEWS
34
NEWS
|
|
@ -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]
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
71
debian/changelog
vendored
71
debian/changelog
vendored
|
|
@ -1,3 +1,74 @@
|
|||
mutter (48.7-0+deb13u1) trixie; urgency=medium
|
||||
|
||||
* Team upload
|
||||
* New upstream stable release 48.6
|
||||
- Fix drag-and-drop actions not working reliably in some X11 clients
|
||||
(mutter#4288 upstream)
|
||||
- Fix delayed frame presentation with the commit-timing-v1 Wayland
|
||||
extension (mutter#4258 upstream)
|
||||
- Avoid a crash if a GNOME Shell extension tries to delete the same
|
||||
window more than once (mutter#4319 upstream)
|
||||
- Avoid a crash in the Wayland session if a non-GNOME desktop
|
||||
environment previously set the cursor size in GSettings to zero;
|
||||
recover by resetting it to the default, 24px (mutter#3933 upstream)
|
||||
- Fix crashes if a GNOME Shell extension uses certain Cogl pipeline
|
||||
APIs (mutter#4352 upstream)
|
||||
- Save the intended size for tiled windows when saving session state
|
||||
(mutter!4697 upstream)
|
||||
- Avoid potential crashes when saving the state of a window with no
|
||||
valid toplevel state (mutter!4697 upstream)
|
||||
- Remove dead code detected by static analysis (mutter!4697 upstream)
|
||||
* New upstream stable release 48.7
|
||||
- For fullscreen Wayland windows, if the window has a size limit
|
||||
smaller than the screen, add black borders around the limited size
|
||||
and log a warning
|
||||
(mutter!4587 upstream)
|
||||
- Avoid a crash when activating a notification that has no app info
|
||||
(mutter!4705 upstream)
|
||||
- Avoid a potential crash when checking whether a client owns a window
|
||||
that is disappearing
|
||||
(mutter!4643 upstream)
|
||||
- Test suite enhancements
|
||||
|
||||
[ Simon McVittie ]
|
||||
* d/libmutter-test-16.symbols:
|
||||
Update for new ABI added by the test suite enhancements
|
||||
(nothing in Debian outside the mutter source package is likely to
|
||||
use this, except possibly a future version of gnome-shell)
|
||||
* Revert "d/gbp/conf, d/control: Switch packaging branch for forky"
|
||||
* Add a mention of #1121170 to the previous changelog entry
|
||||
|
||||
-- Simon McVittie <smcv@debian.org> Tue, 09 Dec 2025 11:38:47 +0000
|
||||
|
||||
mutter (48.5-1) unstable; urgency=medium
|
||||
|
||||
* Team upload
|
||||
* New upstream stable release
|
||||
- Fix X11 drag-and-drop with a graphics tablet stylus, which would
|
||||
previously freeze the application
|
||||
(mutter#3914 upstream)
|
||||
- Fix a file descriptor leak that would cause a crash after a long
|
||||
screencast
|
||||
(mutter#4251 upstream, Closes: #1121170)
|
||||
- Fix crash with an assertion failure when screencasting from an
|
||||
Apple aarch64 system
|
||||
(mutter#4224 upstream)
|
||||
- Fix detection of the "Privacy Screen" feature on hardware that
|
||||
supports it
|
||||
(mutter#4259 upstream)
|
||||
- Update the EIS viewport used for input capture when a virtual monitor
|
||||
stream is resized
|
||||
(mutter!4622 upstream)
|
||||
- Fix a crash when combining the screen time limit's greyscale effect,
|
||||
the screen magnifier and the screenshot tool
|
||||
(mutter#8634 upstream)
|
||||
- Fix a crash when unplugging a docking station with two monitors
|
||||
(mutter#4262 upstream)
|
||||
- Translation update: th
|
||||
* d/gbp/conf, d/control: Switch packaging branch for forky
|
||||
|
||||
-- Simon McVittie <smcv@debian.org> Thu, 18 Sep 2025 10:16:31 +0100
|
||||
|
||||
mutter (48.4-2) unstable; urgency=medium
|
||||
|
||||
* Team upload
|
||||
|
|
|
|||
2
debian/libmutter-test-16.symbols
vendored
2
debian/libmutter-test-16.symbols
vendored
|
|
@ -61,6 +61,7 @@ libmutter-test-16.so libmutter-test-16 #MINVER#
|
|||
meta_test_shell_disable_animations@Base 47.4
|
||||
meta_test_shell_get_type@Base 44.3-4~
|
||||
meta_test_shell_set_background_color@Base 47.4
|
||||
meta_wait_for_effects@Base 48.7
|
||||
meta_wait_for_monitors_changed@Base 46~beta
|
||||
meta_wait_for_orientation@Base 42~beta
|
||||
meta_wait_for_paint@Base 42~beta
|
||||
|
|
@ -70,3 +71,4 @@ libmutter-test-16.so libmutter-test-16 #MINVER#
|
|||
meta_wait_for_window_cursor@Base 47.4
|
||||
meta_wait_for_window_shown@Base 47.4
|
||||
meta_wait_test_process@Base 47.4
|
||||
meta_wait_wayland_window_reconfigure@Base 48.7
|
||||
|
|
|
|||
|
|
@ -38,10 +38,10 @@ index ed54c05..7948223 100644
|
|||
|
||||
/* stage */
|
||||
diff --git a/clutter/clutter/clutter-stage.c b/clutter/clutter/clutter-stage.c
|
||||
index 074f5fe..5623567 100644
|
||||
index 483d05b..81e2d02 100644
|
||||
--- a/clutter/clutter/clutter-stage.c
|
||||
+++ b/clutter/clutter/clutter-stage.c
|
||||
@@ -3586,10 +3586,15 @@ clutter_stage_pick_and_update_device (ClutterStage *stage,
|
||||
@@ -3588,10 +3588,15 @@ clutter_stage_pick_and_update_device (ClutterStage *stage,
|
||||
ClutterActor *new_actor = NULL;
|
||||
MtkRegion *clear_area = NULL;
|
||||
ClutterSeat *seat;
|
||||
|
|
@ -58,7 +58,7 @@ index 074f5fe..5623567 100644
|
|||
device != clutter_seat_get_pointer (seat) ||
|
||||
clutter_seat_is_unfocus_inhibited (seat))
|
||||
{
|
||||
@@ -4677,6 +4682,9 @@ clutter_stage_update_device_for_event (ClutterStage *stage,
|
||||
@@ -4679,6 +4684,9 @@ clutter_stage_update_device_for_event (ClutterStage *stage,
|
||||
|
||||
flags = CLUTTER_DEVICE_UPDATE_EMIT_CROSSING;
|
||||
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
project('mutter', 'c',
|
||||
version: '48.4',
|
||||
version: '48.7',
|
||||
meson_version: '>= 1.3.0',
|
||||
license: 'GPL-2.0-or-later',
|
||||
)
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -545,8 +545,6 @@ meta_screen_cast_area_stream_src_record_to_framebuffer (MetaScreenCastStreamSrc
|
|||
area, scale,
|
||||
paint_flags);
|
||||
|
||||
cogl_framebuffer_flush (framebuffer);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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 */
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
|
|
@ -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 |
|
|
@ -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], "=>"))
|
||||
{
|
||||
|
|
|
|||
46
src/tests/wayland-test-clients/fixed-size-client.c
Normal file
46
src/tests/wayland-test-clients/fixed-size-client.c
Normal 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;
|
||||
}
|
||||
|
|
@ -121,6 +121,9 @@ wayland_test_clients = [
|
|||
wayland_cursor_dep,
|
||||
],
|
||||
},
|
||||
{
|
||||
'name': 'fixed-size-client',
|
||||
},
|
||||
]
|
||||
|
||||
test_client_executables = {}
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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))
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
|
|
@ -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 */
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue