test-runner: Add support for add_strut command

It allows to add struts to the ones we already have, as per this we can
re-implement `set_strut` as `clear_strut` + `add_strut`.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3701>
This commit is contained in:
Marco Trevisan (Treviño) 2023-05-16 14:35:42 +02:00 committed by Marge Bot
parent ea7357f48a
commit 0bc873419d

View File

@ -31,6 +31,8 @@
#include "meta-test/meta-context-test.h" #include "meta-test/meta-context-test.h"
#include "meta/util.h" #include "meta/util.h"
#include "meta/window.h" #include "meta/window.h"
#include "core/meta-workspace-manager-private.h"
#include "core/workspace-private.h"
#include "tests/meta-test-utils.h" #include "tests/meta-test-utils.h"
#include "wayland/meta-wayland.h" #include "wayland/meta-wayland.h"
#include "wayland/meta-window-wayland.h" #include "wayland/meta-window-wayland.h"
@ -49,6 +51,26 @@ typedef struct {
GHashTable *cloned_windows; GHashTable *cloned_windows;
} TestCase; } TestCase;
static void
set_true_cb (gboolean *value)
{
*value = TRUE;
}
static void
wait_for_signal_emission (gpointer instance,
const char *signal_name)
{
gulong handler_id;
gboolean changed = FALSE;
handler_id = g_signal_connect_swapped (instance, signal_name,
G_CALLBACK (set_true_cb), &changed);
while (!changed)
g_main_context_iteration (NULL, TRUE);
g_signal_handler_disconnect (instance, handler_id);
}
static gboolean static gboolean
test_case_alarm_filter (MetaX11Display *x11_display, test_case_alarm_filter (MetaX11Display *x11_display,
XSyncAlarmNotifyEvent *event, XSyncAlarmNotifyEvent *event,
@ -593,6 +615,92 @@ str_to_bool (const char *str,
return FALSE; return FALSE;
} }
static gboolean
str_to_side (const char *str,
MetaSide *out_side)
{
if (g_str_equal (str, "left"))
{
*out_side = META_SIDE_LEFT;
return TRUE;
}
if (g_str_equal (str, "right"))
{
*out_side = META_SIDE_RIGHT;
return TRUE;
}
if (g_str_equal (str, "top"))
{
*out_side = META_SIDE_TOP;
return TRUE;
}
if (g_str_equal (str, "bottom"))
{
*out_side = META_SIDE_BOTTOM;
return TRUE;
}
return FALSE;
}
static gboolean
test_case_add_strut (TestCase *test,
int x,
int y,
int width,
int height,
MetaSide side,
GError **error)
{
MetaDisplay *display = meta_context_get_display (test->context);
MetaWorkspaceManager *workspace_manager =
meta_display_get_workspace_manager (display);
MtkRectangle rect = { x, y, width, height };
MetaStrut strut = { rect, side };
GList *workspaces =
meta_workspace_manager_get_workspaces (workspace_manager);
GList *l;
for (l = workspaces; l; l = l->next)
{
MetaWorkspace *workspace = l->data;
g_autoptr (GSList) struts_list = NULL;
g_autoslist (MetaStrut) struts = NULL;
struts_list = meta_workspace_get_builtin_struts (workspace);
struts = g_slist_append (g_steal_pointer (&struts_list),
g_memdup2 (&strut, sizeof (MetaStrut)));
meta_workspace_set_builtin_struts (workspace, struts);
}
wait_for_signal_emission (display, "workareas-changed");
return TRUE;
}
static gboolean
test_case_clear_struts (TestCase *test,
GError **error)
{
MetaDisplay *display = meta_context_get_display (test->context);
MetaWorkspaceManager *workspace_manager =
meta_display_get_workspace_manager (display);
GList *workspaces =
meta_workspace_manager_get_workspaces (workspace_manager);
GList *l;
for (l = workspaces; l; l = l->next)
{
MetaWorkspace *workspace = l->data;
meta_workspace_set_builtin_struts (workspace, NULL);
}
return TRUE;
}
static gboolean static gboolean
test_case_do (TestCase *test, test_case_do (TestCase *test,
const char *filename, const char *filename,
@ -1059,7 +1167,8 @@ test_case_do (TestCase *test,
if (!test_case_sleep (test, (uint32_t) interval_ms, error)) if (!test_case_sleep (test, (uint32_t) interval_ms, error))
return FALSE; return FALSE;
} }
else if (strcmp (argv[0], "set_strut") == 0) else if (g_str_equal (argv[0], "add_strut") ||
g_str_equal (argv[0], "set_strut"))
{ {
if (argc < 6 || argc > 7) if (argc < 6 || argc > 7)
{ {
@ -1074,6 +1183,12 @@ test_case_do (TestCase *test,
if (!logical_monitor) if (!logical_monitor)
return FALSE; return FALSE;
if (g_str_equal (argv[0], "set_strut"))
{
if (!test_case_clear_struts (test, error))
return FALSE;
}
MtkRectangle monitor_layout = MtkRectangle monitor_layout =
meta_logical_monitor_get_layout (logical_monitor); meta_logical_monitor_get_layout (logical_monitor);
@ -1083,52 +1198,19 @@ test_case_do (TestCase *test,
int height = parse_monitor_size (&monitor_layout, argv[4]); int height = parse_monitor_size (&monitor_layout, argv[4]);
MetaSide side; MetaSide side;
if (strcmp (argv[5], "left") == 0) if (!str_to_side (argv[5], &side))
side = META_SIDE_LEFT; BAD_COMMAND ("Invalid side: %s", argv[5]);
else if (strcmp (argv[5], "right") == 0)
side = META_SIDE_RIGHT; if (!test_case_add_strut (test, x, y, width, height, side, error))
else if (strcmp (argv[5], "top") == 0)
side = META_SIDE_TOP;
else if (strcmp (argv[5], "bottom") == 0)
side = META_SIDE_BOTTOM;
else
return FALSE; return FALSE;
MetaDisplay *display = meta_context_get_display (test->context);
MetaWorkspaceManager *workspace_manager =
meta_display_get_workspace_manager (display);
MtkRectangle rect = { x, y, width, height };
MetaStrut strut = { rect, side };
GSList *struts = g_slist_append (NULL, &strut);
GList *workspaces =
meta_workspace_manager_get_workspaces (workspace_manager);
GList *l;
for (l = workspaces; l; l = l->next)
{
MetaWorkspace *workspace = l->data;
meta_workspace_set_builtin_struts (workspace, struts);
}
g_slist_free (struts);
} }
else if (strcmp (argv[0], "clear_struts") == 0) else if (strcmp (argv[0], "clear_struts") == 0)
{ {
if (argc != 1) if (argc != 1)
BAD_COMMAND("usage: %s", argv[0]); BAD_COMMAND("usage: %s", argv[0]);
MetaDisplay *display = meta_context_get_display (test->context); if (!test_case_clear_struts (test, error))
MetaWorkspaceManager *workspace_manager = return FALSE;
meta_display_get_workspace_manager (display);
GList *workspaces =
meta_workspace_manager_get_workspaces (workspace_manager);
GList *l;
for (l = workspaces; l; l = l->next)
{
MetaWorkspace *workspace = l->data;
meta_workspace_set_builtin_struts (workspace, NULL);
}
} }
else if (strcmp (argv[0], "assert_stacking") == 0) else if (strcmp (argv[0], "assert_stacking") == 0)
{ {