Flutter Engine Uber Docs
Docs for the entire Flutter Engine repo.
 
Loading...
Searching...
No Matches
fl_window_monitor.cc
Go to the documentation of this file.
1// Copyright 2013 The Flutter Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include <gtk/gtk.h>
6
9
12
13 // Window being monitored.
14 GtkWindow* window;
15
16 // Isolate to call callbacks with.
18
19 // Callbacks.
20 void (*on_configure)(void);
21 void (*on_state_changed)(void);
22 void (*on_is_active_notify)(void);
23 void (*on_title_notify)(void);
24 void (*on_moved_to_rect)(int, int, int, int);
25 void (*on_close)(void);
26 void (*on_destroy)(void);
27};
28
29G_DEFINE_TYPE(FlWindowMonitor, fl_window_monitor, G_TYPE_OBJECT)
30
31static gboolean configure_event_cb(FlWindowMonitor* self,
32 GdkEventConfigure* event) {
33 flutter::IsolateScope scope(self->isolate);
34 self->on_configure();
35
36 return FALSE;
37}
38
39static gboolean window_state_event_cb(FlWindowMonitor* self,
40 GdkEventWindowState* event) {
41 flutter::IsolateScope scope(self->isolate);
42 self->on_state_changed();
43
44 return FALSE;
45}
46
47static void is_active_notify_cb(FlWindowMonitor* self) {
48 flutter::IsolateScope scope(self->isolate);
49 self->on_is_active_notify();
50}
51
52static void title_notify_cb(FlWindowMonitor* self) {
53 flutter::IsolateScope scope(self->isolate);
54 self->on_title_notify();
55}
56
57static void moved_to_rect_cb(FlWindowMonitor* self,
58 GdkRectangle* flipped_rect,
59 GdkRectangle* final_rect,
60 gboolean flipped_x,
61 gboolean flipped_y) {
62 // According to the documentation, the final_rect can be null
63 // if the backend can't obtain it.
64 // Reference: https://docs.gtk.org/gdk3/signal.Window.moved-to-rect.html
65 if (final_rect == nullptr) {
66 return;
67 }
68
69 flutter::IsolateScope scope(self->isolate);
70 self->on_moved_to_rect(final_rect->x, final_rect->y, final_rect->width,
71 final_rect->height);
72}
73
74static gboolean delete_event_cb(FlWindowMonitor* self, GdkEvent* event) {
75 flutter::IsolateScope scope(self->isolate);
76 self->on_close();
77
78 // Stop default behaviour of destroying the window.
79 return TRUE;
80}
81
82static void destroy_cb(FlWindowMonitor* self) {
83 flutter::IsolateScope scope(self->isolate);
84 self->on_destroy();
85}
86
87static void fl_window_monitor_dispose(GObject* object) {
88 FlWindowMonitor* self = FL_WINDOW_MONITOR(object);
89
90 g_clear_object(&self->window);
91
92 G_OBJECT_CLASS(fl_window_monitor_parent_class)->dispose(object);
93}
94
95static void fl_window_monitor_class_init(FlWindowMonitorClass* klass) {
96 G_OBJECT_CLASS(klass)->dispose = fl_window_monitor_dispose;
97}
98
99static void fl_window_monitor_init(FlWindowMonitor* self) {}
100
101G_MODULE_EXPORT FlWindowMonitor* fl_window_monitor_new(
102 GtkWindow* window,
103 void (*on_configure)(void),
104 void (*on_state_changed)(void),
105 void (*on_is_active_notify)(void),
106 void (*on_title_notify)(void),
107 void (*on_moved_to_rect)(int, int, int, int),
108 void (*on_close)(void),
109 void (*on_destroy)(void)) {
110 FlWindowMonitor* self =
111 FL_WINDOW_MONITOR(g_object_new(fl_window_monitor_get_type(), nullptr));
112
113 self->window = GTK_WINDOW(g_object_ref(window));
114 self->isolate = flutter::Isolate::Current();
115 self->on_configure = on_configure;
116 self->on_state_changed = on_state_changed;
117 self->on_is_active_notify = on_is_active_notify;
118 self->on_title_notify = on_title_notify;
119 self->on_moved_to_rect = on_moved_to_rect;
120 self->on_close = on_close;
121 self->on_destroy = on_destroy;
122 g_signal_connect_object(window, "configure-event",
123 G_CALLBACK(configure_event_cb), self,
124 G_CONNECT_SWAPPED);
125 g_signal_connect_object(window, "window-state-event",
126 G_CALLBACK(window_state_event_cb), self,
127 G_CONNECT_SWAPPED);
128 g_signal_connect_object(window, "notify::is-active",
129 G_CALLBACK(is_active_notify_cb), self,
130 G_CONNECT_SWAPPED);
131 g_signal_connect_object(window, "notify::title", G_CALLBACK(title_notify_cb),
132 self, G_CONNECT_SWAPPED);
133 g_signal_connect_object(gtk_widget_get_window(GTK_WIDGET(window)),
134 "moved-to-rect", G_CALLBACK(moved_to_rect_cb), self,
135 G_CONNECT_SWAPPED);
136 g_signal_connect_object(window, "delete-event", G_CALLBACK(delete_event_cb),
137 self, G_CONNECT_SWAPPED);
138 g_signal_connect_object(window, "destroy", G_CALLBACK(destroy_cb), self,
139 G_CONNECT_SWAPPED);
140
141 return self;
142}
static Isolate Current()
GLFWwindow * window
Definition main.cc:60
G_DEFINE_TYPE(FlBasicMessageChannelResponseHandle, fl_basic_message_channel_response_handle, G_TYPE_OBJECT) static void fl_basic_message_channel_response_handle_dispose(GObject *object)
static void destroy_cb(FlWindowMonitor *self)
static void is_active_notify_cb(FlWindowMonitor *self)
static void fl_window_monitor_dispose(GObject *object)
static void fl_window_monitor_class_init(FlWindowMonitorClass *klass)
static void title_notify_cb(FlWindowMonitor *self)
static void moved_to_rect_cb(FlWindowMonitor *self, GdkRectangle *flipped_rect, GdkRectangle *final_rect, gboolean flipped_x, gboolean flipped_y)
static gboolean configure_event_cb(FlWindowMonitor *self, GdkEventConfigure *event)
static gboolean window_state_event_cb(FlWindowMonitor *self, GdkEventWindowState *event)
G_MODULE_EXPORT FlWindowMonitor * fl_window_monitor_new(GtkWindow *window, void(*on_configure)(void), void(*on_state_changed)(void), void(*on_is_active_notify)(void), void(*on_title_notify)(void), void(*on_moved_to_rect)(int, int, int, int), void(*on_close)(void), void(*on_destroy)(void))
static void fl_window_monitor_init(FlWindowMonitor *self)
static gboolean delete_event_cb(FlWindowMonitor *self, GdkEvent *event)
GdkWindow * gtk_widget_get_window(GtkWidget *widget)
Definition mock_gtk.cc:309
void(* on_title_notify)(void)
void(* on_state_changed)(void)
void(* on_is_active_notify)(void)
flutter::Isolate isolate
void(* on_configure)(void)
void(* on_destroy)(void)
void(* on_close)(void)
void(* on_moved_to_rect)(int, int, int, int)