Skip to content
Commits on Source (11)
43.5
====
* Fix recording windows on non-active workspaces [Robert; !2789]
* Fixed crashes [Colin, Sebastian, Jonas; !2917, !2955, !2969]
* Misc. bug fixes and cleanups [Ivan; !2928]
Contributors:
Jonas Ådahl, Sebastian Keller, Colin Kinloch, Robert Mader, Ivan Molodetskikh
Translators:
Nart Tlisha [ab]
43.4
====
* Do not overwrite previously set offsets on attach [Matthias; !2843]
......
......@@ -11972,20 +11972,21 @@ clutter_actor_run_actions (ClutterActor *self,
ClutterEventPhase phase)
{
ClutterActorPrivate *priv;
const GList *actions, *l;
const GList *l;
gboolean retval = CLUTTER_EVENT_PROPAGATE;
 
priv = self->priv;
if (!priv->actions)
return CLUTTER_EVENT_PROPAGATE;
 
actions = _clutter_meta_group_peek_metas (priv->actions);
for (l = actions; l; l = l->next)
l = _clutter_meta_group_peek_metas (priv->actions);
while (l)
{
ClutterAction *action = l->data;
ClutterEventPhase action_phase;
 
l = l->next;
action_phase = clutter_action_get_phase (action);
 
if (action_phase == phase)
......
project('mutter', 'c',
version: '43.4',
version: '43.5',
meson_version: '>= 0.55.0',
license: 'GPLv2+'
)
......@@ -207,6 +207,7 @@ endif
if have_wayland
wayland_server_dep = dependency('wayland-server', version: wayland_server_req)
wayland_client_dep = dependency('wayland-client', version: wayland_server_req)
wayland_cursor_dep = dependency('wayland-cursor')
wayland_protocols_dep = dependency('wayland-protocols',
version: wayland_protocols_req)
wayland_egl_dep = dependency('wayland-egl')
......
msgid ""
msgstr ""
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/mutter/issues\n"
"POT-Creation-Date: 2022-11-17 09:51+0000\n"
"POT-Creation-Date: 2023-03-20 13:53+0000\n"
"Last-Translator: Нанба Наала <naala-nanba@rambler.ru>\n"
"Language-Team: Abkhazian <daniel.abzakh@gmail.com>\n"
"Language: ab\n"
......@@ -9,27 +9,26 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-DamnedLies-Scope: partial\n"
#: data/50-mutter-navigation.xml:6
msgid "Navigation"
msgstr ""
msgstr "Ахырхарҭарбара"
#: data/50-mutter-navigation.xml:9
msgid "Move window to workspace 1"
msgstr ""
msgstr "Аҧенџьыр аусуратә ҭыҧ 1 ахь аиагара"
#: data/50-mutter-navigation.xml:12
msgid "Move window to workspace 2"
msgstr ""
msgstr "Аҧенџьыр аусуратә ҭыҧ 2 ахь аиагара"
#: data/50-mutter-navigation.xml:15
msgid "Move window to workspace 3"
msgstr ""
msgstr "Аҧенџьыр аусуратә ҭыҧ 3 ахь аиагара"
#: data/50-mutter-navigation.xml:18
msgid "Move window to workspace 4"
msgstr ""
msgstr "Аҧенџьыр аусуратә ҭыҧ 4 ахь аиагара"
#: data/50-mutter-navigation.xml:21
msgid "Move window to last workspace"
......@@ -133,15 +132,15 @@ msgstr ""
#: data/50-mutter-navigation.xml:119
msgid "Switch to workspace 2"
msgstr ""
msgstr "2 аусуратә ҭыҧ ахь аиагара"
#: data/50-mutter-navigation.xml:122
msgid "Switch to workspace 3"
msgstr ""
msgstr "3 аусуратә ҭыҧ ахь аиагара"
#: data/50-mutter-navigation.xml:125
msgid "Switch to workspace 4"
msgstr ""
msgstr "4 аусуратә ҭыҧ ахь аиагара"
#: data/50-mutter-navigation.xml:128
msgid "Switch to last workspace"
......@@ -165,7 +164,7 @@ msgstr ""
#: data/50-mutter-system.xml:6 data/50-mutter-wayland.xml:6
msgid "System"
msgstr ""
msgstr "Асистема"
#: data/50-mutter-system.xml:8
msgid "Show the run command prompt"
......@@ -631,11 +630,11 @@ msgstr ""
#.
#: src/core/meta-pad-action-mapper.c:871
msgid "Switch monitor"
msgstr ""
msgstr "Амонитор аиагара"
#: src/core/meta-pad-action-mapper.c:873
msgid "Show on-screen help"
msgstr ""
msgstr "Аекрантә еилыркаа арбара"
#. Translators: this string will appear in Sysprof
#: src/core/meta-profiler.c:80 src/core/meta-profiler.c:217
......@@ -659,7 +658,7 @@ msgstr "Аусуратә ҵакыра %d"
msgid "Mutter was compiled without support for verbose mode"
msgstr "Mutter акомпилиациа азун арежим verbose ацхыраарада"
#: src/core/workspace.c:536
#: src/core/workspace.c:542
msgid "Workspace switched"
msgstr ""
......@@ -668,23 +667,23 @@ msgstr ""
msgid "Mode Switch: Mode %d"
msgstr ""
#: src/x11/meta-x11-display.c:657
#: src/x11/meta-x11-display.c:659
#, c-format
msgid ""
"Display “%s” already has a window manager; try using the --replace option to "
"replace the current window manager."
msgstr ""
#: src/x11/meta-x11-display.c:1048
#: src/x11/meta-x11-display.c:1050
msgid "Failed to initialize GDK"
msgstr ""
#: src/x11/meta-x11-display.c:1074
#: src/x11/meta-x11-display.c:1076
#, c-format
msgid "Failed to open X Window System display “%s”"
msgstr ""
#: src/x11/meta-x11-display.c:1187
#: src/x11/meta-x11-display.c:1189
#, c-format
msgid "Screen %d on display “%s” is invalid"
msgstr ""
......@@ -698,3 +697,4127 @@ msgstr ""
#, c-format
msgid "%s (on %s)"
msgstr ""
#, fuzzy
......@@ -135,6 +135,7 @@ META_EXPORT_TEST
MetaCursorTracker * meta_backend_get_cursor_tracker (MetaBackend *backend);
MetaCursorRenderer * meta_backend_get_cursor_renderer_for_device (MetaBackend *backend,
ClutterInputDevice *device);
META_EXPORT_TEST
MetaCursorRenderer * meta_backend_get_cursor_renderer (MetaBackend *backend);
META_EXPORT_TEST
MetaRenderer * meta_backend_get_renderer (MetaBackend *backend);
......
......@@ -29,6 +29,7 @@
#include "backends/meta-backend-types.h"
#include "backends/meta-cursor.h"
#include "core/util-private.h"
#define META_TYPE_HW_CURSOR_INHIBITOR (meta_hw_cursor_inhibitor_get_type ())
G_DECLARE_INTERFACE (MetaHwCursorInhibitor, meta_hw_cursor_inhibitor,
......@@ -64,6 +65,7 @@ void meta_cursor_renderer_set_cursor (MetaCursorRenderer *renderer,
void meta_cursor_renderer_update_position (MetaCursorRenderer *renderer);
void meta_cursor_renderer_force_update (MetaCursorRenderer *renderer);
META_EXPORT_TEST
MetaCursorSprite * meta_cursor_renderer_get_cursor (MetaCursorRenderer *renderer);
graphene_rect_t meta_cursor_renderer_calculate_rect (MetaCursorRenderer *renderer,
......
......@@ -262,6 +262,7 @@ meta_cursor_tracker_dispose (GObject *object)
g_clear_object (&priv->effective_cursor);
g_clear_object (&priv->displayed_cursor);
g_clear_object (&priv->window_cursor);
g_clear_object (&priv->root_cursor);
G_OBJECT_CLASS (meta_cursor_tracker_parent_class)->dispose (object);
......
......@@ -197,6 +197,16 @@ meta_screen_cast_window_stream_finalize (GObject *object)
{
MetaScreenCastWindowStream *window_stream =
META_SCREEN_CAST_WINDOW_STREAM (object);
MetaWindowActor *window_actor;
window_actor = meta_window_actor_from_window (window_stream->window);
if (window_actor)
{
MetaScreenCastWindow *screen_cast_window;
screen_cast_window = META_SCREEN_CAST_WINDOW (window_actor);
meta_screen_cast_window_dec_usage (screen_cast_window);
}
g_clear_signal_handler (&window_stream->window_unmanaged_handler_id,
window_stream->window);
......@@ -212,6 +222,8 @@ meta_screen_cast_window_stream_initable_init (GInitable *initable,
MetaScreenCastWindowStream *window_stream =
META_SCREEN_CAST_WINDOW_STREAM (initable);
MetaWindow *window = window_stream->window;
MetaScreenCastWindow *screen_cast_window =
META_SCREEN_CAST_WINDOW (meta_window_actor_from_window (window));
MetaLogicalMonitor *logical_monitor;
int scale;
......@@ -242,6 +254,8 @@ meta_screen_cast_window_stream_initable_init (GInitable *initable,
window_stream->stream_width = logical_monitor->rect.width * scale;
window_stream->stream_height = logical_monitor->rect.height * scale;
meta_screen_cast_window_inc_usage (screen_cast_window);
return initable_parent_iface->init (initable, cancellable, error);
}
......
......@@ -99,3 +99,15 @@ meta_screen_cast_window_has_damage (MetaScreenCastWindow *screen_cast_window)
return iface->has_damage (screen_cast_window);
}
void
meta_screen_cast_window_inc_usage (MetaScreenCastWindow *screen_cast_window)
{
META_SCREEN_CAST_WINDOW_GET_IFACE (screen_cast_window)->inc_usage (screen_cast_window);
}
void
meta_screen_cast_window_dec_usage (MetaScreenCastWindow *screen_cast_window)
{
META_SCREEN_CAST_WINDOW_GET_IFACE (screen_cast_window)->dec_usage (screen_cast_window);
}
......@@ -62,6 +62,9 @@ struct _MetaScreenCastWindowInterface
CoglFramebuffer *framebuffer);
gboolean (*has_damage) (MetaScreenCastWindow *screen_cast_window);
void (*inc_usage) (MetaScreenCastWindow *screen_cast_window);
void (*dec_usage) (MetaScreenCastWindow *screen_cast_window);
};
void meta_screen_cast_window_get_buffer_bounds (MetaScreenCastWindow *screen_cast_window,
......@@ -90,6 +93,9 @@ gboolean meta_screen_cast_window_blit_to_framebuffer (MetaScreenCastWindow *scre
gboolean meta_screen_cast_window_has_damage (MetaScreenCastWindow *screen_cast_window);
void meta_screen_cast_window_inc_usage (MetaScreenCastWindow *screen_cast_window);
void meta_screen_cast_window_dec_usage (MetaScreenCastWindow *screen_cast_window);
G_END_DECLS
#endif /* META_SCREEN_CAST_WINDOW_H */
......@@ -30,7 +30,9 @@
#include "backends/meta-backend-private.h"
#include "backends/meta-logical-monitor.h"
#include "backends/meta-screen-cast-window.h"
#include "compositor/meta-shaped-texture-private.h"
#include "compositor/meta-window-actor-private.h"
#include "compositor/region-utils.h"
#include "wayland/meta-wayland-buffer.h"
#include "wayland/meta-wayland-private.h"
......@@ -74,15 +76,19 @@ meta_surface_actor_wayland_is_view_primary (MetaSurfaceActor *actor,
ClutterStageView *current_primary_view = NULL;
float highest_refresh_rate = 0.f;
float biggest_unobscurred_fraction = 0.f;
MetaWindowActor *window_actor;
gboolean is_streaming = FALSE;
GList *l;
if (!clutter_actor_is_effectively_on_stage_view (CLUTTER_ACTOR (actor),
stage_view))
return FALSE;
window_actor = meta_window_actor_from_actor (CLUTTER_ACTOR (actor));
if (window_actor)
is_streaming = meta_window_actor_is_streaming (window_actor);
if (clutter_actor_has_mapped_clones (CLUTTER_ACTOR (actor)))
if (clutter_actor_has_mapped_clones (CLUTTER_ACTOR (actor)) || is_streaming)
{
ClutterStage *stage;
ClutterStageView *fallback_view = NULL;
float fallback_refresh_rate = 0.0;
stage = CLUTTER_STAGE (clutter_actor_get_stage (CLUTTER_ACTOR (actor)));
for (l = clutter_stage_peek_stage_views (stage); l; l = l->next)
......@@ -90,28 +96,42 @@ meta_surface_actor_wayland_is_view_primary (MetaSurfaceActor *actor,
ClutterStageView *view = l->data;
float refresh_rate;
if (!clutter_actor_is_effectively_on_stage_view (CLUTTER_ACTOR (actor),
view))
continue;
refresh_rate = clutter_stage_view_get_refresh_rate (view);
if (refresh_rate > highest_refresh_rate)
if (clutter_actor_is_effectively_on_stage_view (CLUTTER_ACTOR (actor),
view))
{
current_primary_view = view;
highest_refresh_rate = refresh_rate;
if (refresh_rate > highest_refresh_rate)
{
current_primary_view = view;
highest_refresh_rate = refresh_rate;
}
}
else
{
if (refresh_rate > fallback_refresh_rate)
{
fallback_view = view;
fallback_refresh_rate = refresh_rate;
}
}
}
return current_primary_view == stage_view;
if (current_primary_view)
return current_primary_view == stage_view;
else if (is_streaming)
return fallback_view == stage_view;
}
l = clutter_actor_peek_stage_views (CLUTTER_ACTOR (actor));
g_return_val_if_fail (l, FALSE);
if (!l)
return FALSE;
if (!l->next)
{
g_return_val_if_fail (l->data == stage_view, FALSE);
return !meta_surface_actor_is_obscured (actor);
return !meta_surface_actor_is_obscured_on_stage_view (actor,
stage_view,
NULL);
}
for (; l; l = l->next)
......
......@@ -101,6 +101,8 @@ void meta_window_actor_set_geometry_scale (MetaWindowActor *window_actor,
int meta_window_actor_get_geometry_scale (MetaWindowActor *window_actor);
gboolean meta_window_actor_is_streaming (MetaWindowActor *window_actor);
void meta_window_actor_notify_damaged (MetaWindowActor *window_actor);
gboolean meta_window_actor_is_frozen (MetaWindowActor *self);
......
......@@ -70,6 +70,7 @@ typedef struct _MetaWindowActorPrivate
gint destroy_in_progress;
guint freeze_count;
guint screen_cast_usage_count;
guint visible : 1;
guint disposed : 1;
......@@ -1392,6 +1393,26 @@ meta_window_actor_has_damage (MetaScreenCastWindow *screen_cast_window)
return clutter_actor_has_damage (CLUTTER_ACTOR (screen_cast_window));
}
static void
meta_window_actor_inc_screen_cast_usage (MetaScreenCastWindow *screen_cast_window)
{
MetaWindowActor *window_actor = META_WINDOW_ACTOR (screen_cast_window);
MetaWindowActorPrivate *priv =
meta_window_actor_get_instance_private (window_actor);
priv->screen_cast_usage_count++;
}
static void
meta_window_actor_dec_screen_cast_usage (MetaScreenCastWindow *screen_cast_window)
{
MetaWindowActor *window_actor = META_WINDOW_ACTOR (screen_cast_window);
MetaWindowActorPrivate *priv =
meta_window_actor_get_instance_private (window_actor);
priv->screen_cast_usage_count--;
}
static void
screen_cast_window_iface_init (MetaScreenCastWindowInterface *iface)
{
......@@ -1401,6 +1422,17 @@ screen_cast_window_iface_init (MetaScreenCastWindowInterface *iface)
iface->capture_into = meta_window_actor_capture_into;
iface->blit_to_framebuffer = meta_window_actor_blit_to_framebuffer;
iface->has_damage = meta_window_actor_has_damage;
iface->inc_usage = meta_window_actor_inc_screen_cast_usage;
iface->dec_usage = meta_window_actor_dec_screen_cast_usage;
}
gboolean
meta_window_actor_is_streaming (MetaWindowActor *window_actor)
{
MetaWindowActorPrivate *priv =
meta_window_actor_get_instance_private (window_actor);
return priv->screen_cast_usage_count > 0;
}
MetaWindowActor *
......
......@@ -888,8 +888,6 @@ void meta_window_show_close_dialog (MetaWindow *window);
void meta_window_hide_close_dialog (MetaWindow *window);
void meta_window_ensure_close_dialog_timeout (MetaWindow *window);
gboolean meta_window_has_pointer (MetaWindow *window);
void meta_window_emit_size_changed (MetaWindow *window);
MetaPlacementRule *meta_window_get_placement_rule (MetaWindow *window);
......
......@@ -453,4 +453,7 @@ uint64_t meta_window_get_id (MetaWindow *window);
META_EXPORT
MetaWindowClientType meta_window_get_client_type (MetaWindow *window);
META_EXPORT
gboolean meta_window_has_pointer (MetaWindow *window);
#endif
......@@ -365,6 +365,14 @@ if have_native_tests
],
'variants': kms_test_variants,
},
{
'name': 'kms-cursor-hotplug',
'suite': 'backends/native',
'sources': [
'native-kms-cursor-hotplug.c',
wayland_test_utils,
],
},
]
privileged_test_cases += kms_test_cases
......
<monitors version="2">
<configuration>
<logicalmonitor>
<x>0</x>
<y>0</y>
<primary>yes</primary>
<monitor>
<monitorspec>
<connector>Meta-0</connector>
<vendor>MetaTestVendor</vendor>
<product>MetaVirtualMonitor</product>
<serial>0x1234</serial>
</monitorspec>
<mode>
<width>100</width>
<height>100</height>
<rate>60</rate>
</mode>
</monitor>
</logicalmonitor>
<disabled>
<monitorspec>
<connector>Virtual-1</connector>
<vendor>unknown</vendor>
<product>unknown</product>
<serial>unknown</serial>
</monitorspec>
</disabled>
</configuration>
</monitors>
<monitors version="2">
<configuration>
<logicalmonitor>
<x>0</x>
<y>0</y>
<primary>yes</primary>
<monitor>
<monitorspec>
<connector>Virtual-1</connector>
<vendor>unknown</vendor>
<product>unknown</product>
<serial>unknown</serial>
</monitorspec>
<mode>
<width>1024</width>
<height>768</height>
<rate>60.003841</rate>
</mode>
</monitor>
</logicalmonitor>
<logicalmonitor>
<x>1024</x>
<y>0</y>
<primary>no</primary>
<monitor>
<monitorspec>
<connector>Meta-0</connector>
<vendor>MetaTestVendor</vendor>
<product>MetaVirtualMonitor</product>
<serial>0x1234</serial>
</monitorspec>
<mode>
<width>100</width>
<height>100</height>
<rate>60</rate>
</mode>
</monitor>
</logicalmonitor>
</configuration>
</monitors>
/*
* Copyright (C) 2022 Red Hat Inc.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
* 02111-1307, USA.
*
*/
#include "config.h"
#include "backends/meta-monitor-config-manager.h"
#include "backends/meta-virtual-monitor.h"
#include "core/window-private.h"
#include "meta-test/meta-context-test.h"
#include "meta/meta-backend.h"
#include "meta/meta-cursor-tracker.h"
#include "tests/meta-test-utils.h"
#include "tests/meta-wayland-test-driver.h"
#include "tests/meta-wayland-test-utils.h"
#include "tests/native-screen-cast.h"
#include "tests/native-virtual-monitor.h"
#include "wayland/meta-cursor-sprite-wayland.h"
#include "wayland/meta-wayland-private.h"
#include "wayland/meta-wayland-seat.h"
static MetaContext *test_context;
static void
meta_test_cursor_hotplug (void)
{
MetaBackend *backend = meta_context_get_backend (test_context);
MetaMonitorManager *monitor_manager =
meta_backend_get_monitor_manager (backend);
MetaCursorRenderer *cursor_renderer = meta_backend_get_cursor_renderer (backend);
MetaWaylandCompositor *wayland_compositor =
meta_context_get_wayland_compositor (test_context);
MetaWaylandSeat *wayland_seat = wayland_compositor->seat;
g_autoptr (MetaWaylandTestDriver) test_driver = NULL;
MetaCursorSprite *cursor_sprite;
g_autoptr (MetaVirtualMonitorInfo) monitor_info = NULL;
MetaVirtualMonitor *virtual_monitor;
ClutterSeat *seat;
g_autoptr (ClutterVirtualInputDevice) virtual_pointer = NULL;
MetaWaylandTestClient *test_client;
MetaWindow *window;
GError *error = NULL;
test_driver = meta_wayland_test_driver_new (wayland_compositor);
seat = meta_backend_get_default_seat (backend);
virtual_pointer = clutter_seat_create_virtual_device (seat,
CLUTTER_POINTER_DEVICE);
meta_set_custom_monitor_config_full (backend, "kms-cursor-hotplug-off.xml",
META_MONITORS_CONFIG_FLAG_NONE);
monitor_info = meta_virtual_monitor_info_new (100, 100, 60.0,
"MetaTestVendor",
"MetaVirtualMonitor",
"0x1234");
virtual_monitor = meta_monitor_manager_create_virtual_monitor (monitor_manager,
monitor_info,
&error);
if (!virtual_monitor)
g_error ("Failed to create virtual monitor: %s", error->message);
meta_monitor_manager_reload (monitor_manager);
clutter_virtual_input_device_notify_absolute_motion (virtual_pointer,
g_get_monotonic_time (),
50, 50);
test_client = meta_wayland_test_client_new ("kms-cursor-hotplug-helper");
if (!test_client)
g_error ("Failed to launch test client: %s", error->message);
while (TRUE)
{
window = meta_find_window_from_title (test_context,
"kms-cursor-hotplug-helper");
if (window && window->visible_to_compositor)
break;
g_main_context_iteration (NULL, TRUE);
}
meta_window_move_frame (window, FALSE, 0, 0);
meta_wait_for_paint (test_context);
cursor_renderer = meta_backend_get_cursor_renderer (backend);
while (TRUE)
{
cursor_sprite = meta_cursor_renderer_get_cursor (cursor_renderer);
if (cursor_sprite)
break;
g_main_context_iteration (NULL, TRUE);
}
g_assert_true (META_IS_CURSOR_SPRITE_WAYLAND (cursor_sprite));
/*
* This tests a particular series of events:
*
* 1) Unplug the mouse
* 2) Client attaches a new cursor buffer
* 3) Client destroys cursor surface
* 4) Monitor hotplug
*
* This would cause a NULL pointer deference when getting the buffer from the
* cursor surface when trying to realize the hardware cursor buffer on the
* hotplugged monitor.
*/
g_clear_object (&virtual_pointer);
while (!(wayland_seat->capabilities & WL_SEAT_CAPABILITY_POINTER))
g_main_context_iteration (NULL, TRUE);
meta_wayland_test_driver_emit_sync_event (test_driver, 0);
meta_wayland_test_driver_wait_for_sync_point (test_driver, 0);
meta_set_custom_monitor_config_full (backend, "kms-cursor-hotplug-on.xml",
META_MONITORS_CONFIG_FLAG_NONE);
meta_monitor_manager_reload (monitor_manager);
meta_wait_for_paint (test_context);
meta_wayland_test_driver_emit_sync_event (test_driver, 1);
meta_wayland_test_client_finish (test_client);
}
static void
init_tests (void)
{
g_test_add_func ("/wayland/cursor-hotplug",
meta_test_cursor_hotplug);
}
int
main (int argc,
char **argv)
{
g_autoptr (MetaContext) context = NULL;
context = meta_create_test_context (META_CONTEXT_TEST_TYPE_VKMS,
META_CONTEXT_TEST_FLAG_NO_X11 |
META_CONTEXT_TEST_FLAG_TEST_CLIENT);
g_assert (meta_context_configure (context, &argc, &argv, NULL));
test_context = context;
init_tests ();
return meta_context_test_run_tests (META_CONTEXT_TEST (context),
META_TEST_RUN_FLAG_NONE);
}
This diff is collapsed.