24 G_DEFINE_TYPE(FlDisplayMonitor, fl_display_monitor, G_TYPE_OBJECT)
28 g_autoptr(FlEngine) engine = FL_ENGINE(g_weak_ref_get(&self->engine));
29 if (engine ==
nullptr) {
33 int n_monitors = gdk_display_get_n_monitors(self->display);
34 g_autofree FlutterEngineDisplay* displays =
35 g_new0(FlutterEngineDisplay, n_monitors);
36 for (
int i = 0;
i < n_monitors;
i++) {
37 FlutterEngineDisplay* display = &displays[
i];
39 GdkMonitor* monitor = gdk_display_get_monitor(self->display,
i);
40 FlutterEngineDisplayId display_id = GPOINTER_TO_INT(
41 g_hash_table_lookup(self->display_ids_by_monitor, monitor));
42 if (display_id == 0) {
43 display_id =
self->next_display_id;
44 g_hash_table_insert(self->display_ids_by_monitor, g_object_ref(monitor),
45 GINT_TO_POINTER(display_id));
46 self->next_display_id++;
49 GdkRectangle geometry;
50 gdk_monitor_get_geometry(monitor, &geometry);
52 display->struct_size =
sizeof(FlutterEngineDisplay);
53 display->display_id = display_id;
54 display->single_display =
false;
55 display->refresh_rate = gdk_monitor_get_refresh_rate(monitor) / 1000.0;
56 display->width = geometry.width;
57 display->height = geometry.height;
58 display->device_pixel_ratio = gdk_monitor_get_scale_factor(monitor);
69 g_hash_table_remove(self->display_ids_by_monitor, monitor);
74 FlDisplayMonitor*
self = FL_DISPLAY_MONITOR(
object);
76 g_weak_ref_clear(&self->engine);
77 g_clear_object(&self->display);
78 g_clear_pointer(&self->display_ids_by_monitor, g_hash_table_unref);
80 G_OBJECT_CLASS(fl_display_monitor_parent_class)->dispose(
object);
84 GObjectClass* object_class = G_OBJECT_CLASS(klass);
89 self->display_ids_by_monitor = g_hash_table_new_full(
90 g_direct_hash, g_direct_equal, g_object_unref,
nullptr);
91 self->next_display_id = 1;
95 GdkDisplay* display) {
96 FlDisplayMonitor*
self =
97 FL_DISPLAY_MONITOR(g_object_new(fl_display_monitor_get_type(),
nullptr));
98 g_weak_ref_init(&self->engine, engine);
99 self->display = GDK_DISPLAY(g_object_ref(display));
104 g_return_if_fail(FL_IS_DISPLAY_MONITOR(
self));
106 g_signal_connect_object(self->display,
"monitor-added",
109 g_signal_connect_object(self->display,
"monitor-removed",
116 GdkMonitor* monitor) {
117 g_return_val_if_fail(FL_IS_DISPLAY_MONITOR(
self), 0);
118 return GPOINTER_TO_INT(
119 g_hash_table_lookup(self->display_ids_by_monitor, monitor));