1 /*
2  * Copyright (C) 2021 Red Hat Inc.
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License as
6  * published by the Free Software Foundation; either version 2 of the
7  * License, or (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful, but
10  * WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software
16  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
17  * 02111-1307, USA.
18  *
19  */
20 
21 #include "config.h"
22 
23 #include "tests/native-virtual-monitor.h"
24 
25 #include "backends/meta-backend-private.h"
26 #include "backends/meta-logical-monitor.h"
27 #include "backends/meta-monitor-config-manager.h"
28 #include "backends/meta-virtual-monitor.h"
29 #include "backends/native/meta-renderer-native.h"
30 #include "tests/meta-ref-test.h"
31 
32 static void
meta_test_virtual_monitor_create(void)33 meta_test_virtual_monitor_create (void)
34 {
35   MetaBackend *backend = meta_get_backend ();
36   MetaMonitorManager *monitor_manager = meta_backend_get_monitor_manager (backend);
37   MetaMonitorConfigManager *config_manager =
38     meta_monitor_manager_get_config_manager (monitor_manager);
39   MetaRenderer *renderer = meta_backend_get_renderer (backend);
40   MetaVirtualMonitor *virtual_monitor;
41   g_autoptr (MetaVirtualMonitorInfo) monitor_info = NULL;
42   GError *error = NULL;
43   GList *monitors;
44   MetaMonitor *monitor;
45   MetaMonitorsConfig *monitors_config;
46   GList *logical_monitors;
47   GList *logical_monitor_monitors;
48   GList *views;
49   int i;
50   ClutterActor *actor;
51 
52   g_assert_null (meta_monitor_config_manager_get_current (config_manager));
53   g_assert_null (meta_monitor_manager_get_logical_monitors (monitor_manager));
54   g_assert_null (meta_monitor_manager_get_monitors (monitor_manager));
55   g_assert_null (meta_renderer_get_views (renderer));
56 
57   monitor_info = meta_virtual_monitor_info_new (80, 60, 60.0,
58                                                 "MetaTestVendor",
59                                                 "MetaVirtualMonitor",
60                                                 "0x1234");
61   virtual_monitor = meta_monitor_manager_create_virtual_monitor (monitor_manager,
62                                                                  monitor_info,
63                                                                  &error);
64   if (!virtual_monitor)
65     g_error ("Failed to create virtual monitor: %s", error->message);
66 
67   meta_monitor_manager_reload (monitor_manager);
68 
69   monitors = meta_monitor_manager_get_monitors (monitor_manager);
70   g_assert_cmpint (g_list_length (monitors), ==, 1);
71   monitor = META_MONITOR (monitors->data);
72   g_assert_cmpstr (meta_monitor_get_vendor (monitor), ==, "MetaTestVendor");
73   g_assert_cmpstr (meta_monitor_get_product (monitor), ==, "MetaVirtualMonitor");
74   g_assert_cmpstr (meta_monitor_get_serial (monitor), ==, "0x1234");
75   g_assert (meta_monitor_get_main_output (monitor) ==
76             meta_virtual_monitor_get_output (virtual_monitor));
77 
78   monitors_config = meta_monitor_manager_ensure_configured (monitor_manager);
79   g_assert_nonnull (monitors_config);
80   g_assert_cmpint (g_list_length (monitors_config->logical_monitor_configs),
81                    ==,
82                    1);
83 
84   g_assert_cmpint (g_list_length (monitors_config->disabled_monitor_specs),
85                    ==,
86                    0);
87 
88   logical_monitors =
89     meta_monitor_manager_get_logical_monitors (monitor_manager);
90   g_assert_cmpint (g_list_length (logical_monitors), ==, 1);
91   logical_monitor_monitors =
92     meta_logical_monitor_get_monitors (logical_monitors->data);
93   g_assert_cmpint (g_list_length (logical_monitor_monitors), ==, 1);
94   g_assert (logical_monitor_monitors->data == monitor);
95 
96   views = meta_renderer_get_views (renderer);
97   g_assert_cmpint (g_list_length (views), ==, 1);
98 
99   for (i = 0; i < 5; i++)
100     {
101       meta_ref_test_verify_view (CLUTTER_STAGE_VIEW (views->data),
102                                  g_test_get_path (), 0,
103                                  meta_ref_test_determine_ref_test_flag ());
104     }
105 
106   actor = clutter_actor_new ();
107   clutter_actor_set_position (actor, 10, 10);
108   clutter_actor_set_size (actor, 40, 40);
109   clutter_actor_set_background_color (actor, CLUTTER_COLOR_LightSkyBlue);
110   clutter_actor_add_child (meta_backend_get_stage (backend), actor);
111 
112   for (i = 0; i < 5; i++)
113     {
114       meta_ref_test_verify_view (CLUTTER_STAGE_VIEW (views->data),
115                                  g_test_get_path (), 1,
116                                  meta_ref_test_determine_ref_test_flag ());
117     }
118 
119   g_object_unref (virtual_monitor);
120   meta_monitor_manager_reload (monitor_manager);
121 
122   g_assert_null (meta_monitor_manager_ensure_configured (monitor_manager));
123   g_assert_null (meta_monitor_manager_get_logical_monitors (monitor_manager));
124   g_assert_null (meta_monitor_manager_get_monitors (monitor_manager));
125   g_assert_null (meta_renderer_get_views (renderer));
126 
127   clutter_actor_destroy (actor);
128 }
129 
130 void
init_virtual_monitor_tests(void)131 init_virtual_monitor_tests (void)
132 {
133   g_test_add_func ("/backends/native/virtual-monitor/create",
134                    meta_test_virtual_monitor_create);
135 }
136